URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Submission: On December 03 via api from CZ

Summary

This website contacted 78 IPs in 9 countries across 63 domains to perform 267 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
16 178.19.72.10 29551 (HGCOMP-ASN)
1 46.253.113.178 29551 (HGCOMP-ASN)
1 151.101.14.217 54113 (FASTLY)
1 91.215.103.64 43407 (INFONLINE-AS)
3 188.40.16.106 24940 (HETZNER-AS)
4 178.19.70.100 29551 (HGCOMP-ASN)
15 2a00:1450:400... 15169 (GOOGLE)
1 2 161.156.66.178 36351 (SOFTLAYER)
2 2a03:2880:f11... 32934 (FACEBOOK)
12 2a00:1450:400... 15169 (GOOGLE)
3 13.224.199.29 16509 (AMAZON-02)
2 5 72.247.225.134 16625 (AKAMAI-AS)
1 9 104.109.82.87 20940 (AKAMAI-ASN1)
1 193.46.63.75 43407 (INFONLINE-AS)
1 2 91.215.103.65 43407 (INFONLINE-AS)
10 109.71.25.30 29551 (HGCOMP-ASN)
8 107.178.241.34 15169 (GOOGLE)
3 178.19.72.20 29551 (HGCOMP-ASN)
6 24 151.101.14.2 54113 (FASTLY)
1 13 172.217.16.162 15169 (GOOGLE)
1 143.204.101.73 16509 (AMAZON-02)
3 72.247.224.195 16625 (AKAMAI-AS)
1 1 2600:9000:20e... 16509 (AMAZON-02)
1 2600:9000:21f... 16509 (AMAZON-02)
3 46.253.113.181 29551 (HGCOMP-ASN)
1 18.195.39.206 16509 (AMAZON-02)
1 2600:9000:204... 16509 (AMAZON-02)
4 2606:4700:20:... 13335 (CLOUDFLAR...)
2 2a00:1450:400... 15169 (GOOGLE)
1 2 52.95.123.41 16509 (AMAZON-02)
1 178.19.65.130 29551 (HGCOMP-ASN)
1 2606:4700::68... 13335 (CLOUDFLAR...)
6 18.194.252.229 16509 (AMAZON-02)
1 3 34.95.120.147 15169 (GOOGLE)
3 69.173.144.140 26667 (RUBICONPR...)
2 4 185.33.223.206 29990 (ASN-APPNEXUS)
1 2a00:1450:400... 15169 (GOOGLE)
6 136.243.3.206 24940 (HETZNER-AS)
1 2600:9000:21f... 16509 (AMAZON-02)
1 5 23.5.97.37 16625 (AKAMAI-AS)
1 2a00:1450:400... 15169 (GOOGLE)
1 2001:4de0:ac1... 20446 (HIGHWINDS3)
2 151.101.113.194 54113 (FASTLY)
1 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
7 185.22.221.117 60955 (WAVECON)
3 62.168.44.125 5588 (GTSCE GTS...)
1 2 136.243.116.5 24940 (HETZNER-AS)
4 18.194.21.214 16509 (AMAZON-02)
1 136.243.36.209 24940 (HETZNER-AS)
5 144.76.237.196 24940 (HETZNER-AS)
4 2.18.232.7 16625 (AKAMAI-AS)
2 2a02:26f0:6c0... 20940 (AKAMAI-ASN1)
7 72.247.225.182 16625 (AKAMAI-AS)
1 2 199.166.0.24 7415 (ADSAFE-1)
9 151.101.14.49 54113 (FASTLY)
2 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 185.29.135.234 30419 (MEDIAMATH...)
1 1 151.101.12.166 54113 (FASTLY)
2 2 185.184.8.30 204995 (RTB-HOUSE...)
1 1 216.58.208.34 15169 (GOOGLE)
2 2 52.51.24.119 16509 (AMAZON-02)
1 1 52.36.182.29 16509 (AMAZON-02)
1 192.132.33.46 18568 (BIDTELLECT)
1 141.226.224.32 200478 (TABOOLA-AS)
3 3 3.121.253.254 16509 (AMAZON-02)
2 2 18.195.163.192 16509 (AMAZON-02)
2 199.166.0.32 7415 (ADSAFE-1)
6 151.101.114.2 54113 (FASTLY)
6 104.244.36.20 7415 (ADSAFE-1)
1 37.157.2.236 198622 (ADFORM)
1 54.194.33.101 16509 (AMAZON-02)
3 151.101.114.49 54113 (FASTLY)
1 2 89.163.159.101 24961 (MYLOC-AS)
1 62.168.44.118 5588 (GTSCE GTS...)
4 54.77.22.22 16509 (AMAZON-02)
1 35.186.238.175 15169 (GOOGLE)
2 52.219.72.195 16509 (AMAZON-02)
3 13.225.78.95 16509 (AMAZON-02)
1 2620:1ec:bdf::10 8068 (MICROSOFT...)
1 89.163.159.125 24961 (MYLOC-AS)
1 2600:9000:215... 16509 (AMAZON-02)
1 63.34.92.224 16509 (AMAZON-02)
1 108.128.71.27 16509 (AMAZON-02)
4 52.18.103.144 16509 (AMAZON-02)
3 144.76.115.236 24940 (HETZNER-AS)
2 72.247.225.17 16625 (AKAMAI-AS)
1 23.37.55.184 16625 (AKAMAI-AS)
267 78
Apex Domain
Subdomains
Transfer
43 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
512 KB
31 giga.de
www.giga.de
static.giga.de
videos.giga.de
ssl.1.damoh.giga.de
714 KB
17 doubleclick.net
googleads.g.doubleclick.net
securepubads.g.doubleclick.net
cm.g.doubleclick.net
119 KB
12 nativendo.de
d.nativendo.de
c.nativendo.de
t.nativendo.de
63 KB
12 google-analytics.com
www.google-analytics.com
19 KB
11 teads.tv
a.teads.tv
t.teads.tv
sync.teads.tv
187 KB
10 adsafeprotected.com
fw.adsafeprotected.com
static.adsafeprotected.com
dt.adsafeprotected.com
90 KB
10 yieldlove-ad-serving.net
prod-ingestion.tracking.v2.yieldlove-ad-serving.net
api.yieldlove-ad-serving.net
2 KB
10 m6r.eu
cdn.m6r.eu
tracking.m6r.eu
6 KB
8 stroeermediabrands.de
js.stroeermediabrands.de
gocp.stroeermediabrands.de
quiz.stroeermediabrands.de
quiz-media.stroeermediabrands.de
207 KB
7 oadts.com
media.oadts.com
123 KB
6 pubstack.io
boot.pubstack.io
acdn.prod.pubstack.io
intake.prod.pubstack.io
63 KB
6 de.com
s79.research.de.com
b47.s79.research.de.com
2 KB
6 meetrics.net
lb38.s400.meetrics.net
2 KB
6 adnxs.com
ib.adnxs.com
acdn.adnxs.com
5 KB
6 googlesyndication.com
pagead2.googlesyndication.com
tpc.googlesyndication.com
203 KB
5 scorecardresearch.com
sb.scorecardresearch.com
3 KB
5 rubiconproject.com
fastlane.rubiconproject.com
pixel.rubiconproject.com
eus.rubiconproject.com
5 KB
5 googletagservices.com
www.googletagservices.com
143 KB
5 amazon-adsystem.com
c.amazon-adsystem.com
aax-eu.amazon-adsystem.com
30 KB
4 xplosion.de
ups.xplosion.de
uss.xplosion.de
6 KB
4 ibillboard.com
video-adserver.ibillboard.com
tracker-adserver.ibillboard.com
bbcdn-bbnaut.ibillboard.com
3 KB
4 adscale.de
ih.adscale.de
js.adscale.de
7 KB
4 ioam.de
script.ioam.de
irqs.ioam.de
de.ioam.de
13 KB
3 svonm.com
hgc-cf-cache-1.svonm.com
60 KB
3 theadex.com
dmp.theadex.com
api.theadex.com
xpl.theadex.com
14 KB
3 bidswitch.net
x.bidswitch.net
1 KB
3 openx.net
yieldlove-d.openx.net
eu-u.openx.net
5 KB
3 googleapis.com
imasdk.googleapis.com
ajax.googleapis.com
216 KB
3 mxcdn.net
s400.mxcdn.net
s79.mxcdn.net
149 KB
3 giga-abs.de
go.giga-abs.de
2 KB
2 adrtx.net
cdn.adrtx.net
adstax-match.adrtx.net
848 B
2 amazonaws.com
s3.eu-central-1.amazonaws.com
1 KB
2 perf-serving.com
prod.perf-serving.com
1 KB
2 adsrvr.org
match.adsrvr.org
893 B
2 creativecdn.com
creativecdn.com
ams.creativecdn.com
748 B
2 mfadsrvr.com
rtb.mfadsrvr.com
1 KB
2 consensu.org
cmp.teads.mgr.consensu.org
2 smbad.de
smbad.de
2 KB
2 fastly.net
confiant-integrations.global.ssl.fastly.net
23 KB
2 agkn.com
js.agkn.com
d.agkn.com
3 KB
2 facebook.com
www.facebook.com
457 B
2 vgwort.de
ssl-econa.met.vgwort.de
733 B
1 emetriq.de
cdn.emetriq.de
2 KB
1 mookie1.com
de-gmtdmp.mookie1.com
581 B
1 adform.net
track.adform.net
448 B
1 giga-video.de
files.giga-video.de
35 KB
1 bttrack.com
bttrack.com
380 B
1 storygize.net
www.storygize.net
449 B
1 contextweb.com
bh.contextweb.com
689 B
1 mathtag.com
sync.mathtag.com
473 B
1 powerlinks.com
px.powerlinks.com
402 B
1 stroeerdigitalmedia.de
cdn.stroeerdigitalmedia.de
344 B
1 bootstrapcdn.com
maxcdn.bootstrapcdn.com
10 KB
1 cloudflare.com
cdnjs.cloudflare.com
2 KB
1 dkuim.de
dkuim.de
151 KB
1 dunkirkinception.com
www.dunkirkinception.com
381 B
1 userreport.com
nugmw.userreport.com
2 KB
1 nuggad.net
si.nuggad.net
602 B
1 yieldlove.com
cdn-a.yieldlove.com
88 KB
1 google.com
adservice.google.com
171 B
1 google.de
adservice.google.de
171 B
1 speedcurve.com
cdn.speedcurve.com
7 KB
267 63
Domain Requested by
17 trc.taboola.com 6 redirects cdn.taboola.com
www.giga.de
16 www.giga.de www.giga.de
13 securepubads.g.doubleclick.net 1 redirects js.stroeermediabrands.de
securepubads.g.doubleclick.net
www.giga.de
12 www.google-analytics.com www.giga.de
10 videos.giga.de www.giga.de
videos.giga.de
ajax.googleapis.com
text
9 tracking.m6r.eu 1 redirects www.giga.de
js.stroeermediabrands.de
tracking.m6r.eu
media.oadts.com
7 match.taboola.com www.giga.de
vidstat.taboola.com
7 media.oadts.com www.giga.de
media.oadts.com
7 cdn.taboola.com www.giga.de
cdn.taboola.com
fw.adsafeprotected.com
6 dt.adsafeprotected.com www.giga.de
6 vidstat.taboola.com cdn.taboola.com
vidstat.taboola.com
6 t.teads.tv www.giga.de
6 lb38.s400.meetrics.net www.giga.de
6 prod-ingestion.tracking.v2.yieldlove-ad-serving.net cdn-a.yieldlove.com
5 b47.s79.research.de.com www.giga.de
5 sb.scorecardresearch.com 1 redirects cdn.taboola.com
www.giga.de
5 www.googletagservices.com pagead2.googlesyndication.com
securepubads.g.doubleclick.net
5 pagead2.googlesyndication.com www.giga.de
pagead2.googlesyndication.com
4 intake.prod.pubstack.io www.giga.de
4 a.teads.tv www.giga.de
a.teads.tv
4 api.yieldlove-ad-serving.net cdn-a.yieldlove.com
4 t.nativendo.de c.nativendo.de
4 ib.adnxs.com 2 redirects cdn-a.yieldlove.com
4 c.nativendo.de d.nativendo.de
c.nativendo.de
www.giga.de
4 d.nativendo.de www.giga.de
c.nativendo.de
3 ssl.1.damoh.giga.de text
3 hgc-cf-cache-1.svonm.com videos.giga.de
text
3 convammp.taboola.com
3 x.bidswitch.net 3 redirects
3 fastlane.rubiconproject.com cdn-a.yieldlove.com
3 ih.adscale.de 1 redirects www.giga.de
js.adscale.de
3 quiz.stroeermediabrands.de www.giga.de
quiz.stroeermediabrands.de
3 go.giga-abs.de www.giga.de
3 googleads.g.doubleclick.net pagead2.googlesyndication.com
3 c.amazon-adsystem.com www.giga.de
c.amazon-adsystem.com
3 gocp.stroeermediabrands.de www.giga.de
gocp.stroeermediabrands.de
2 acdn.adnxs.com cdn-a.yieldlove.com
2 eu-u.openx.net 1 redirects cdn-a.yieldlove.com
2 uss.xplosion.de www.giga.de
2 s3.eu-central-1.amazonaws.com videos.giga.de
text
2 ups.xplosion.de js.stroeermediabrands.de
cdn.emetriq.de
2 static.adsafeprotected.com www.giga.de
2 prod.perf-serving.com 2 redirects
2 match.adsrvr.org 2 redirects
2 rtb.mfadsrvr.com 2 redirects
2 fw.adsafeprotected.com 1 redirects securepubads.g.doubleclick.net
2 cmp.teads.mgr.consensu.org a.teads.tv
2 smbad.de 1 redirects www.giga.de
2 s79.mxcdn.net securepubads.g.doubleclick.net
s79.mxcdn.net
2 video-adserver.ibillboard.com media.oadts.com
2 confiant-integrations.global.ssl.fastly.net cdn-a.yieldlove.com
confiant-integrations.global.ssl.fastly.net
2 aax-eu.amazon-adsystem.com 1 redirects c.amazon-adsystem.com
2 imasdk.googleapis.com videos.giga.de
2 de.ioam.de 1 redirects www.giga.de
2 www.facebook.com www.giga.de
2 ssl-econa.met.vgwort.de 1 redirects www.giga.de
2 static.giga.de www.giga.de
1 eus.rubiconproject.com cdn-a.yieldlove.com
1 adstax-match.adrtx.net cdn.adrtx.net
1 xpl.theadex.com 1 redirects
1 cdn.adrtx.net www.giga.de
1 cdn.emetriq.de ups.xplosion.de
1 api.theadex.com bbcdn-bbnaut.ibillboard.com
1 acdn.prod.pubstack.io boot.pubstack.io
1 de-gmtdmp.mookie1.com
1 bbcdn-bbnaut.ibillboard.com js.stroeermediabrands.de
1 dmp.theadex.com js.stroeermediabrands.de
1 js.adscale.de js.stroeermediabrands.de
1 boot.pubstack.io js.stroeermediabrands.de
1 track.adform.net js.stroeermediabrands.de
1 imprammp.taboola.com www.giga.de
1 files.giga-video.de a.teads.tv
1 sync.teads.tv a.teads.tv
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 ams.creativecdn.com 1 redirects
1 creativecdn.com 1 redirects
1 bh.contextweb.com 1 redirects
1 sync.mathtag.com 1 redirects
1 px.powerlinks.com 1 redirects
1 pixel.rubiconproject.com 1 redirects
1 15.taboola.com cdn.taboola.com
1 tracker-adserver.ibillboard.com www.giga.de
1 s79.research.de.com s79.mxcdn.net
1 cdn.stroeerdigitalmedia.de www.giga.de
1 quiz-media.stroeermediabrands.de www.giga.de
1 maxcdn.bootstrapcdn.com www.giga.de
1 tpc.googlesyndication.com securepubads.g.doubleclick.net
1 d.agkn.com js.agkn.com
1 ajax.googleapis.com www.giga.de
1 yieldlove-d.openx.net cdn-a.yieldlove.com
1 cdnjs.cloudflare.com www.giga.de
1 dkuim.de www.giga.de
1 js.agkn.com js.stroeermediabrands.de
1 www.dunkirkinception.com www.giga.de
1 nugmw.userreport.com www.giga.de
1 si.nuggad.net 1 redirects
1 s400.mxcdn.net js.stroeermediabrands.de
1 cdn-a.yieldlove.com js.stroeermediabrands.de
1 adservice.google.com pagead2.googlesyndication.com
1 adservice.google.de pagead2.googlesyndication.com
1 irqs.ioam.de script.ioam.de
1 cdn.m6r.eu 1 redirects
1 script.ioam.de www.giga.de
1 cdn.speedcurve.com www.giga.de
1 js.stroeermediabrands.de www.giga.de
267 108
Subject Issuer Validity Valid
*.giga.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-05-02
2 years crt.sh
*.stroeermediabrands.de
RapidSSL RSA CA 2018
2018-09-06 -
2020-12-05
2 years crt.sh
a3.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-11-13 -
2020-09-10
10 months crt.sh
*.ioam.de
COMODO RSA Organization Validation Secure Server CA
2017-12-22 -
2020-12-21
3 years crt.sh
*.g.doubleclick.net
GTS CA 1O1
2019-11-05 -
2020-01-28
3 months crt.sh
*.met.vgwort.de
Thawte RSA CA 2018
2018-05-22 -
2020-03-25
2 years crt.sh
*.facebook.com
DigiCert SHA2 High Assurance Server CA
2019-11-06 -
2020-02-04
3 months crt.sh
*.google-analytics.com
GTS CA 1O1
2019-11-05 -
2020-01-28
3 months crt.sh
c.amazon-adsystem.com
Amazon
2019-10-07 -
2020-09-29
a year crt.sh
cat.adscale.de
DigiCert SHA2 Secure Server CA
2019-07-29 -
2020-10-27
a year crt.sh
*.nativendo.de
Thawte TLS RSA CA G1
2019-04-30 -
2021-05-29
2 years crt.sh
*.google.com
GTS CA 1O1
2019-11-05 -
2020-01-28
3 months crt.sh
*.giga-abs.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-09-04
2 years crt.sh
f2.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-07-30 -
2020-07-25
a year crt.sh
cdn-a.yieldlove.com
Amazon
2019-10-02 -
2020-11-02
a year crt.sh
*.mxcdn.net
DigiCert SHA2 Secure Server CA
2019-11-04 -
2021-02-02
a year crt.sh
*.userreport.com
RapidSSL RSA CA 2018
2019-01-10 -
2021-03-10
2 years crt.sh
www.dunkirkinception.com
Amazon
2019-05-22 -
2020-06-22
a year crt.sh
*.agkn.com
RapidSSL RSA CA 2018
2018-06-21 -
2020-09-16
2 years crt.sh
sni.cloudflaressl.com
CloudFlare Inc ECC CA-2
2019-11-17 -
2020-10-09
a year crt.sh
*.googleapis.com
GTS CA 1O1
2019-11-05 -
2020-01-28
3 months crt.sh
aax-eu.amazon-adsystem.com
Amazon
2019-09-18 -
2020-08-26
a year crt.sh
*.dkuim.de
RapidSSL RSA CA 2018
2018-07-18 -
2020-05-03
2 years crt.sh
ssl412106.cloudflaressl.com
COMODO ECC Domain Validation Secure Server CA 2
2019-11-20 -
2020-05-28
6 months crt.sh
*.tracking.v2.yieldlove-ad-serving.net
Amazon
2019-11-25 -
2020-12-25
a year crt.sh
*.openx.net
GeoTrust RSA CA 2018
2018-01-04 -
2020-07-09
3 years crt.sh
*.rubiconproject.com
DigiCert SHA2 Secure Server CA
2019-01-10 -
2021-01-14
2 years crt.sh
*.adnxs.com
DigiCert ECC Secure Server CA
2019-01-23 -
2021-03-08
2 years crt.sh

COMODO RSA Domain Validation Secure Server CA
2016-12-08 -
2019-12-08
3 years crt.sh
*.scorecardresearch.com
COMODO RSA Organization Validation Secure Server CA
2018-11-28 -
2019-12-26
a year crt.sh
tpc.googlesyndication.com
GTS CA 1O1
2019-11-05 -
2020-01-28
3 months crt.sh
*.bootstrapcdn.com
Sectigo RSA Domain Validation Secure Server CA
2019-09-14 -
2020-10-13
a year crt.sh
*.freetls.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-01-02 -
2020-01-03
a year crt.sh
cdn.stroeerdigitalgroup.de
DigiCert ECC Secure Server CA
2018-12-04 -
2020-03-04
a year crt.sh
*.oadts.com
RapidSSL TLS RSA CA G1
2018-05-02 -
2020-06-30
2 years crt.sh
*.ibillboard.com
Thawte RSA CA 2018
2018-05-21 -
2020-06-21
2 years crt.sh
smbad.de
Let's Encrypt Authority X3
2019-11-23 -
2020-02-21
3 months crt.sh
yieldlove-ad-serving.net
Amazon
2019-11-19 -
2020-12-19
a year crt.sh
teads.tv
Let's Encrypt Authority X3
2019-10-30 -
2020-01-28
3 months crt.sh
teads.mgr.consensu.org
Let's Encrypt Authority X3
2019-09-23 -
2019-12-22
3 months crt.sh
*.adsafeprotected.com
COMODO RSA Domain Validation Secure Server CA
2018-08-20 -
2020-09-17
2 years crt.sh
g2.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2019-11-21 -
2020-11-12
a year 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
*.giga-video.de
RapidSSL RSA CA 2018
2019-11-15 -
2022-02-13
2 years crt.sh
track.adform.net
DigiCert SHA2 Secure Server CA
2019-09-16 -
2021-09-20
2 years crt.sh
*.prod.pubstack.io
Amazon
2019-09-18 -
2020-10-18
a year crt.sh
*.theadex.com
GeoTrust RSA CA 2018
2019-10-11 -
2021-10-10
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
*.s3.eu-central-1.amazonaws.com
DigiCert Baltimore CA-2 G2
2019-11-09 -
2020-12-10
a year crt.sh
hgc-cf-cache-1.svonm.com
Amazon
2019-08-19 -
2020-09-19
a year crt.sh
acdn.prod.pubstack.io
DigiCert SHA2 Secure Server CA
2019-11-28 -
2020-11-28
a year crt.sh
*.emetriq.de
RapidSSL TLS RSA CA G1
2018-01-08 -
2020-03-08
2 years crt.sh
*.adrtx.net
GeoTrust TLS RSA CA G1
2018-09-05 -
2020-11-03
2 years crt.sh
ssl.1.damoh.giga.de
Let's Encrypt Authority X3
2019-12-02 -
2020-03-01
3 months crt.sh
cdn.adnxs.com
GeoTrust RSA CA 2018
2019-04-23 -
2020-02-19
10 months crt.sh

This page contains 29 frames:

Primary Page: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Frame ID: C628F45139AE6FD6EF7C2E85491CC1D4
Requests: 185 HTTP requests in this frame

Frame: https://videos.giga.de/embed/78410589?autoplay=0
Frame ID: 34FB756828D93AADBD47DC0EBE45AE7F
Requests: 23 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/js/r20191114/r20190131/show_ads_impl_fy2019.js
Frame ID: F4AE4B701F49BDBF5677CAA8AB61FF2E
Requests: 1 HTTP requests in this frame

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

Frame: https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Film%20%26amp%3B%20Serien&checkcookies=true
Frame ID: A193DAD3554D57CD14088BFD5EA9E576
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&h=60&slotname=6296805359&adk=3471272371&adf=1459277723&w=468&lmt=1575377917&psa=0&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&flash=0&wgl=1&adsid=NT&dt=1575377917054&bpp=18&bdt=178&fdt=201&idt=202&shv=r20191114&cbv=r20190131&saldr=aa&abxe=1&correlator=7178911137210&frm=20&pv=2&ga_vid=2115578610.1575377917&ga_sid=1575377917&ga_hid=935930240&ga_fc=0&iag=0&icsg=12900237566&dssz=57&mdo=0&mso=0&u_tz=60&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=486&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199337%2C21065126&oid=3&pvsid=2134285338763390&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeE%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=1&uci=1.5zhucv5ko0qe&fsb=1&xpc=AeLv2T8S1U&p=https%3A//www.giga.de&dtd=219
Frame ID: 0A188A3853028CF7E83B69FBFB81C91B
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=1575377917&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504%2C9%3A134250504%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1575377917176&bpp=6&bdt=300&fdt=177&idt=177&shv=r20191114&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=7178911137210&frm=20&pv=1&ga_vid=2115578610.1575377917&ga_sid=1575377917&ga_hid=935930240&ga_fc=0&iag=0&icsg=825615204344&dssz=61&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199337%2C21065126&oid=3&pvsid=2134285338763390&rx=0&eae=2&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=1&uci=1.uid0w1jjev8t&fsb=1&dtd=182
Frame ID: 7FAE12B28FCFFC271678545F39F72E37
Requests: 1 HTTP requests in this frame

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

Frame: https://d.agkn.com/iframe/8613/?che=85042940&gdpr=1&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F%22%2C%22gdpr%22%3A%221%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
Frame ID: 7AB9599436E8C77BC1D7D490B40016EC
Requests: 1 HTTP requests in this frame

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

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuszRmLAmA6Ujn4E8A-mrJkaulxwViVl9O1aHervknTxlhGBlHH538q-E6fI55eDr24i1JhPEPBA1QNWnhLbj6B6In5cSdN14tmPzPOCoqYIgrI9CpYHbO6Oav0bw4NalaXL3gir3hQiYWNWrAdC_Ob1kU8ba9vAy8e-KgJuWftNpZJ8ouAZuQnxVunfOHgrKtIvimzRiUPX_TMiBlY206cD7A_ORpsYf1FpczQGWSsVJyv1qYuLFjVJoktr7AH1MQ_cYP-gu6Gg8RMWIvy&sig=Cg0ArKJSzHYzvN72HE5UEAE&urlfix=1&adurl=
Frame ID: 6EDBED688BA08E7AAB87227E22212350
Requests: 14 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuuRpgZUhbRp10Di1eNNkj2q5bHgIuagRvFNgcQ3q8hVQg402MJSUe0MymYlnSXWhGOv6MgS40ja7dFs4pePov2QUlatQG3mizDDsGPClmr6dP6CLssIDI-rg4RoRy-w7SvBZaOfZPFUQQ3DyuBSwo_DT9hImd7s7KWJaV_4C7HgTFqFvQ3AGnAOUUehQkwOFkprfmi3NfTBZ2pcEJ4Fhmu_iuwEL9G7iEFA0KopzuBpa89YWJOqkXHmHCL4jhY2pE49b8f_73faFTJg8auYBqmHbcpTFhw9DyabsQ&sig=Cg0ArKJSzBIR1JkAHVp-EAE&urlfix=1&adurl=
Frame ID: DFEDF97B68D654EDDD9DFC533B47916D
Requests: 5 HTTP requests in this frame

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

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

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsttu2IDYt_vvekPpEf1KMbB74aaCPJKiStPoG9TozIUKsB0Cq4hHnNfqFsUF9jpLWGFB7WIJzdiJNyfI7mWwyhvKlaEXinNzAUQXaiP29Y8eVLgYjSdoynOb47B7NJWXowpcg4bT0cmyj6er7mZNqF0GzrGQkFYYmyuVye3yxnbG5K2jkfzLOrIu-pJb6DN_f7Exo12Ao8dulH1w1g4sTugaxacRpDqTwPXhxTc-zMp5AwYzatyiWqJKL_bAROMSYjtqux85fHqBDbXrNdvksk9497agrqYOj4&sig=Cg0ArKJSzNhN5BBhw54qEAE&urlfix=1&adurl=
Frame ID: 2582664CD788A689A5059FB386F703BB
Requests: 6 HTTP requests in this frame

Frame: https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuU8fl7jci7-W3mGvp1sOOxgDgReoH5BF0Z5lT38p0kvx5f_mfYi0emf80R9K8OjcegRiOmxQj4HZ65zba1bwkFvTFox9h2orOy4mHQKER7589_3H1nMYDPoilptSSUQL7Zkgoz6pH6wXpE4UP_FgPClXMLFs3M8IPQ6aflqcEJ4jVBtqsyDSHML5XoOBmR66iKj5XqBZFQG7_qNJGnAt9QeUex5RBqAwzCPFSCriiYCiipLMHvufHJcmWiLjrzfbk_nNbpw2s6JCKg-Hqmz3LA9-RC7lhA1OI7j48&sig=Cg0ArKJSzEhSUDI_dZ2YEAE&urlfix=1&adurl=
Frame ID: 97C986BD3E09753CA8AC6ED81F23496D
Requests: 2 HTTP requests in this frame

Frame: https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=425890b5-9465-4f45-9dd9-c156420b72a1
Frame ID: A9B0CA9779AA30303CB8186AF3E0B26C
Requests: 14 HTTP requests in this frame

Frame: https://sync.teads.tv/iframe?pid=73584&userId=55f15498-ac1c-4c47-bef2-d3c09e1beb48&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&fromFormat=true&env=js-web&1575377918714
Frame ID: 65B4C8354A090C078089D6EBAB0F8074
Requests: 1 HTTP requests in this frame

Frame: https://static.adsafeprotected.com/sca.17.4.95.js
Frame ID: 13DD1ACFA87E84C21E162B9D27384297
Requests: 1 HTTP requests in this frame

Frame: https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=EE398D141783882171691868912&cicmp=1657475&cijs=1&dast=V7vtkCFgNxVvEREoPIQgRxVvEREoPIQgUAAAAGBvQHGcXiLIcjxmixG26Gw8litlkNl8PhaDOFEGO5TAa1QMIy-30HBeX09JhdBhnLZTKoBbKmyeV3QxqaTofPda_X_X53ndPnsItcfpXxdHn4xU7by3O6vBxuv-bw8jgdZs9f6Tm9NS_L02X3nC4vh9su-rvFLp_D7NabXJa30mx2-Rxmt9DpsrxVlpvDaDm9lUbLW-X5ywEAAADgAUCpsB_iBxAAIAIAAABAAgAAAIAioOLfQuACAAAAAAOgAOtHAwCKg-Fcd-vLbnS4Pi-7PwAAHgJAAAAGFEgABnCaSgAqcg5OAAAAAAAAAABY_v___2MA9IjPZAAylAZvDHoAHnwAHoQAAACyhrqfwfmANyXGiApWixgBAAAAQDK1eRxN6oTKogoAgCDdCuAKACDAbflaizNLd1DiLQwAAIBgbIEeFr_f7LBr_G6XAQAAAAAAAACY_Z_9owkRjbmlBbEU8Kr9AgIArP0CAgCwqRsAwFsAXNARtGIwWJ1BTDaj3WR2AAAAAHf_____eiCxmKw2ppVpNHFuTKbFYrRy-Ba-2crk2CyXm4Vje8S8ZpE-JdgAfSPCMvt9BwXl9PSYXQYZy2UyqAWypsnlN4gPGoblZBDMb8IWo9VkslkOZ8vFZDAcDUej_QncaIATNBwOFrvBYrdYDCeLyWiwHCxQIAYTnJDhaDNZjXar3WQ5nIxGs81kgxStWs1Gm8FwNZvMdrvVcDBcjkZI0ZrFbDJZzEbL3WawnIwGw8lwiDCym42cu9XErRtsNm7RxjdxCzfDwVrlMo0WrpnJs_BN3KLXx3Qa2VyO3ciLggFUexFcpBPN6fJ3uSxvzdvi1jl9DotYojlZpBPZZd9YTFYb08o0mjg3JtNiMVo5fAvfbGVybJbLzcKxr-xmI-duNXHrBpuNW7TxTdzCzXCwVrlMo4VrZvIsfBO36PUxnUY2l2M38jdWu9Vmt1sudvvGarfa7HbLxW7foTN8V5-zUXnTKjwmj_IZ-TZnToPCZbB4fxLTYtqdHTy_39GpUl00xobsm1CYDR6DQRFLBKeLdCJ6GU8XsUTytEgnqpHNY5p5PMPJaGZYGXczi8ljm3g8q9VyMlssLBaxRGm6SCd6lfF0efjFTtvLc7q8HG6_5vDyOB1mz1_pOb01L8vTZfecLi-H2y76u8Uun8Ps1ptclrfSbHb5HGa30OmyvFWWm8NoOb2VRstb5bmo_9gQo9FcN5srBsu5ZrBKAAAAAAAAAABLmDNvAgAAAHAayGIxmCyWCwAhxrp7h5Sf_tQdKFPc-DHEnC5_l8vy1rwtbp3T5zBz!&excid=22&tst=1&docw=0&cs=false
Frame ID: 6614294029CB23A4AE999671AEF4E423
Requests: 1 HTTP requests in this frame

Frame: https://match.taboola.com/sync?dast=V7vtkCFgNxVvEREoPIQgRxVvEREoPIQgUAAAAGBvQHGcXiLIcjxmixG26Gw8litlkNl8PhaDOFEGO5TAa1QMIy-30HBeX09JhdBhnLZTKoBbKmyeV3QxqaTofPda_X_X53ndPnsItcfpXxdHn4xU7by3O6vBxuv-bw8jgdZs9f6Tm9NS_L02X3nC4vh9su-rvFLp_D7NabXJa30mx2-Rxmt9DpsrxVlpvDaDm9lUbLW-X5ywEAAADgAUCpsB_iBxAAIAIAAABAAgAAAIAioOLfQuACAAAAAAOgAOtHAwCKg-Fcd-vLbnS4Pi-7PwAAHgJAAAAGFEgABnCaSgAqcg5OAAAAAAAAAABY_v___2MA9IjPZAAylAZvDHoAHnwAHoQAAACyhrqfwfmANyXGiApWixgBAAAAQDK1eRxN6oTKogoAgCDdCuAKACDAbflaizNLd1DiLQwAAIBgbIEeFr_f7LBr_G6XAQAAAAAAAACY_Z_9owkRjbmlBbEU8Kr9AgIArP0CAgCwqRsAwFsAXNARtGIwWJ1BTDaj3WR2AAAAAHf_____eiCxmKw2ppVpNHFuTKbFYrRy-Ba-2crk2CyXm4Vje8S8ZpE-JdgAfSPCMvt9BwXl9PSYXQYZy2UyqAWypsnlN4gPGoblZBDMb8IWo9VkslkOZ8vFZDAcDUej_QncaIATNBwOFrvBYrdYDCeLyWiwHCxQIAYTnJDhaDNZjXar3WQ5nIxGs81kgxStWs1Gm8FwNZvMdrvVcDBcjkZI0ZrFbDJZzEbL3WawnIwGw8lwiDCym42cu9XErRtsNm7RxjdxCzfDwVrlMo0WrpnJs_BN3KLXx3Qa2VyO3ciLggFUexFcpBPN6fJ3uSxvzdvi1jl9DotYojlZpBPZZd9YTFYb08o0mjg3JtNiMVo5fAvfbGVybJbLzcKxr-xmI-duNXHrBpuNW7TxTdzCzXCwVrlMo4VrZvIsfBO36PUxnUY2l2M38jdWu9Vmt1sudvvGarfa7HbLxW7foTN8V5-zUXnTKjwmj_IZ-TZnToPCZbB4fxLTYtqdHTy_39GpUl00xobsm1CYDR6DQRFLBKeLdCJ6GU8XsUTytEgnqpHNY5p5PMPJaGZYGXczi8ljm3g8q9VyMlssLBaxRGm6SCd6lfF0efjFTtvLc7q8HG6_5vDyOB1mz1_pOb01L8vTZfecLi-H2y76u8Uun8Ps1ptclrfSbHb5HGa30OmyvFWWm8NoOb2VRstb5bmo_9gQo9FcN5srBsu5ZrBKAAAAAAAAAABLmDNvAgAAAHAayGIxmCyWCwAhxrp7h5Sf_tQdKFPc-DHEnC5_l8vy1rwtbp3T5zBz!&excid=22&docw=0&cijs=1
Frame ID: 0B92BADC59318214F2E1A87278712CF1
Requests: 1 HTTP requests in this frame

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

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

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

Frame: data://truncated
Frame ID: 8F7661168172EEA2FBA1F68B488A6358
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: CB71F91C2A58429D3F3A0E26F9D9DD02
Requests: 1 HTTP requests in this frame

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

Frame: https://eus.rubiconproject.com/usync.html
Frame ID: A82278F98D58D99BB314ED202A724D18
Requests: 1 HTTP requests in this frame

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

Screenshot


Detected technologies

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

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

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

Page Statistics

267
Requests

99 %
HTTPS

19 %
IPv6

63
Domains

108
Subdomains

78
IPs

9
Countries

3294 kB
Transfer

9780 kB
Size

35
Cookies

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 13
  • https://ssl-econa.met.vgwort.de/na/828af7bc47ba49af9820d7735fbb8942 HTTP 302
  • https://ssl-econa.met.vgwort.de/blank.gif
Request Chain 18
  • https://cdn.m6r.eu/sync/api HTTP 302
  • https://tracking.m6r.eu/sync/api?checkcookies=true
Request Chain 20
  • https://de.ioam.de/tx.io?st=giga&cp=film_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=000e&i2=000e51aa00fcb3a495de65bfc&ep=1603947532&vr=415&id=sxnjyl&i3=000e51aa00fcb3a495de65bfc%3A1601557116932%3A1575377916932%3A.giga.de%3A1%3Agiga%3Afilm_content%3Anoevent%3A1575377916932&n1=3&dntt=0&lt=1575377916934&ev=&cs=a29um2&mo=1 HTTP 302
  • https://de.ioam.de/tx.io?st=giga&cp=film_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=000e&i2=000e51aa00fcb3a495de65bfc&ep=1603947532&vr=415&id=sxnjyl&i3=000e51aa00fcb3a495de65bfc%3A1601557116932%3A1575377916932%3A.giga.de%3A1%3Agiga%3Afilm_content%3Anoevent%3A1575377916932&n1=3&dntt=0&lt=1575377916934&ev=&cs=a29um2&mo=1&sr=71
Request Chain 33
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Film%20%26amp%3B%20Serien HTTP 302
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Film%20%26amp%3B%20Serien&checkcookies=true
Request Chain 40
  • https://si.nuggad.net/rc?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F HTTP 302
  • https://nugmw.userreport.com/rc-ap/9aa96ff2-99b7-4539-aafa-f3150345bcab/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F
Request Chain 61
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=3lift HTTP 302
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=3lift&dcc=t
Request Chain 72
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=c691c1b2ce4aa7b0c77ae005c6c76af2&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Dc691c1b2ce4aa7b0c77ae005c6c76af2%26userId%3Dadscale-user%3A__ADSCALE_USER_ID__ HTTP 307
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=c691c1b2ce4aa7b0c77ae005c6c76af2&userId=adscale-user:3712213cbba249619cfb11e8ca564c3e
Request Chain 108
  • https://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1575377917830&ns_c=UTF-8&cv=3.1e&c8=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&c7=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&c9= HTTP 302
  • https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1575377917830&ns_c=UTF-8&cv=3.1e&c8=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&c7=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&c9=
Request Chain 111
  • https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjst0B3cRUNHord6206w8tj5okc_gI07DLspo18AF5QpN5iqK1sH3_31dNhrU9wX2psWNiWs2anDfrcmKNH8oSVoz6G9_gkPhTZ1uFo6O5ALgJ7doAQz_UBAonYzDPdXQduR8FN-1I6hTR5oZobdXEqg65Ep94cKXtTu0EMBadvuNi4HNAJnVJ-PE_jGqytTEOIXc_t4r02nRIE_WjtR84_U4zsPSj7mUAOS_XeLjfWTUpGRpomLxiBNAsShgRYp9J95T-7HkRjXNTdiH&sig=Cg0ArKJSzHSHe5s32dHCEAE&urlfix=1&adurl=//cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif HTTP 302
  • https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
Request Chain 138
  • https://smbad.de/www/delivery/avw.php?zoneid=159&cb=576883113&n=a8157934 HTTP 302
  • https://smbad.de/www/images/124eca84abce0cccb0208c5ef285e6fd.gif
Request Chain 171
  • https://rtb.mfadsrvr.com/sync?ssp=taboola HTTP 302
  • https://rtb.mfadsrvr.com/ul_cb/sync?ssp=taboola HTTP 302
  • https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=425890b5-9465-4f45-9dd9-c156420b72a1
Request Chain 172
  • 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 173
  • 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=8DhYlCFOe_teV0DKzEsCkG6SBF4ngcCVVIQiyLt_SjM%3D
Request Chain 174
  • https://sync.mathtag.com/sync/img?mt_exid=92&redir=https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=[MM_UUID] HTTP 302
  • https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=04765de6-5148-4c00-b117-9502c00589e2 HTTP 302
  • https://match.taboola.com/sg/mediamath-ssp-network/1/rtb-h?taboola_hm=04765de6-5148-4c00-b117-9502c00589e2&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3D04765de6-5148-4c00-b117-9502c00589e2
Request Chain 175
  • https://bh.contextweb.com/bh/rtset?pid=562107&ev=1&rurl=https%3A%2F%2Ftrc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=%%VGUID%% HTTP 302
  • https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=felCkL7ucle0&ev=1&pid=562107
Request Chain 176
  • https://creativecdn.com/cm-notify?pi=taboola HTTP 302
  • https://ams.creativecdn.com/cm-notify?pi=taboola&tc=1 HTTP 302
  • https://trc.taboola.com/sg/rtbhouse-network/1/rtb-h/?taboola_hm=mpg5B0EdUDOrtGR05DwT&pi=taboola&tc=1
Request Chain 177
  • 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=3392558974024049024 HTTP 302
  • https://match.taboola.com/sg/appnexus-network/1/rtb-h?taboola_hm=3392558974024049024&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3D3392558974024049024
Request Chain 178
  • 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=CAESENCKJ0cP2rALSWOV6CMdERY&google_cver=1 HTTP 302
  • https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESENCKJ0cP2rALSWOV6CMdERY&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3DCAESENCKJ0cP2rALSWOV6CMdERY%26google_cver%3D1
Request Chain 179
  • 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=3392558974024049024
Request Chain 180
  • 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=b0ec581d-c21b-4cdd-bd3f-b5d1c616ae12 HTTP 302
  • https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=b0ec581d-c21b-4cdd-bd3f-b5d1c616ae12&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3Db0ec581d-c21b-4cdd-bd3f-b5d1c616ae12
Request Chain 181
  • https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d HTTP 302
  • https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=b341ede2-a00e-4913-b519-6f842f797030 HTTP 302
  • https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=b341ede2-a00e-4913-b519-6f842f797030&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3Db341ede2-a00e-4913-b519-6f842f797030
Request Chain 184
  • https://x.bidswitch.net/sync?ssp=taboola HTTP 302
  • https://x.bidswitch.net/ul_cb/sync?ssp=taboola HTTP 302
  • https://prod.perf-serving.com/sync?ssp=bidswitch&bidswitch_ssp_id=taboola HTTP 302
  • https://prod.perf-serving.com/ul_cb/sync?ssp=bidswitch&bidswitch_ssp_id=taboola HTTP 302
  • https://x.bidswitch.net/sync?dsp_id=366&expires=14&user_id=499c67ba-2a1c-413c-976f-c50d54ffa7cc&ssp=taboola&user_group=1 HTTP 302
  • https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=639863a6-76d1-419d-923a-482a0aa92574 HTTP 302
  • https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=639863a6-76d1-419d-923a-482a0aa92574&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3D639863a6-76d1-419d-923a-482a0aa92574
Request Chain 199
  • https://fw.adsafeprotected.com/rfw/www.googletagservices.com/346702/39754020/dcm/dcmads.js?adsafe_url=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&adsafe_type=abdfq&adsafe_jsinfo=,id:fb3f2068-5b00-a4e5-9683-b2be5d627beb,c:vK3Jp3,sl:inView,em:true,fr:true,mn:app26ami,pt:1-5-15,wc:0.0.1600.1200,ac:968.278.300.250,am:i,cc:968.278.300.250,piv:100,obst:0,th:0,reas:,br:u,abv:na,an:n,scm:forwrd1,fm:rJAVcpX+11|12|1311|1312|1313|14|15|161|1711|18|19|1a|1b|1c|1d|1e|1f|1g*.346702-39754020|1h|1i|1j|1k,idMap:1g*,pl:,rend:0,renddet:WINDOW,rmeas:0,es:0,sc:1,ha:1,gm:0,tt:rjss,thd:1,et:29,oid:9fc2d919-15cc-11ea-b9c4-00259086cc10,v:19.8.31,sp:0,wr:1600.1200,sr:1600.1200,ov:0 HTTP 302
  • https://static.adsafeprotected.com/skeleton.js
Request Chain 244
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFWSBFWsb-ES_CWSUkWsfABifABSfABSfABifABifABfrr&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=4211298130613448577
Request Chain 261
  • 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

267 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request /
www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
139 KB
55 KB
Document
General
Full URL
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
da290c3461cc9e7d0d7bce8bf68712cc34a5259f0c07849805b46ac27d4e9adc

Request headers

:method
GET
:authority
www.giga.de
:scheme
https
:path
/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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-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
sec-fetch-mode
navigate
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-User
?1

Response headers

status
200
server
nginx
content-type
text/html;charset=UTF-8
vary
Accept-Encoding
date
Tue, 03 Dec 2019 12:58:36 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/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Origin
https://www.giga.de

Response headers

date
Tue, 03 Dec 2019 12:58:36 GMT
last-modified
Tue, 03 Dec 2019 11:56:29 GMT
server
nginx
accept-language
bytes
etag
"5de64d6d-3c78"
access-control-allow-methods
GET
content-type
application/octet-stream
status
200
cache-control
max-age=31536000, s-maxage=10
access-control-allow-origin
*
content-length
15480
expires
Wed, 02 Dec 2020 12:58:36 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/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Origin
https://www.giga.de

Response headers

date
Tue, 03 Dec 2019 12:58:36 GMT
last-modified
Tue, 03 Dec 2019 11:56:29 GMT
server
nginx
accept-language
bytes
etag
"5de64d6d-3da8"
access-control-allow-methods
GET
content-type
application/octet-stream
status
200
cache-control
max-age=31536000, s-maxage=10
access-control-allow-origin
*
content-length
15784
expires
Wed, 02 Dec 2020 12:58:36 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/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Origin
https://www.giga.de

Response headers

date
Tue, 03 Dec 2019 12:58:36 GMT
last-modified
Tue, 03 Dec 2019 11:56:29 GMT
server
nginx
accept-language
bytes
etag
"5de64d6d-3e24"
access-control-allow-methods
GET
content-type
application/octet-stream
status
200
cache-control
max-age=31536000, s-maxage=10
access-control-allow-origin
*
content-length
15908
expires
Wed, 02 Dec 2020 12:58:36 GMT
metaTag.min.9ca6297f6e6a5371abc434e6eb433c07.js
js.stroeermediabrands.de/
242 KB
59 KB
Script
General
Full URL
https://js.stroeermediabrands.de/metaTag.min.9ca6297f6e6a5371abc434e6eb433c07.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
92bf1430101750b07257b8b4ea6e183ac4506d1e5bfa6812034f5f82a8792547

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:36 GMT
content-encoding
gzip
last-modified
Tue, 03 Dec 2019 10:27:14 GMT
server
nginx/1.14.1
vary
Accept-Encoding
content-type
application/javascript
status
200
cache-control
max-age=31536000, public immutable max-age=31536000
expires
Wed, 02 Dec 2020 12:58:36 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/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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
13999
x-cache
HIT
status
200
x-cache-hits
2192
content-length
6462
via
1.1 varnish
x-served-by
cache-fra19180-FRA
last-modified
Tue, 03 Dec 2019 09:05:17 GMT
server
Apache
x-timer
S1575377917.912021,VS0,VE0
date
Tue, 03 Dec 2019 12:58:36 GMT
vary
Accept-Encoding
content-type
application/javascript; charset=utf-8
access-control-allow-origin
*
cache-control
max-age=86400
accept-ranges
bytes
timing-allow-origin
*
expires
Wed, 04 Dec 2019 09:05:17 GMT
pre-298466378d.js
www.giga.de/static-local/dist/assets/js/
33 KB
11 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/pre-298466378d.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
6b29f06a3eb022974574b6b61557208e9806654a7302e66ab62222e61f2dc635

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 02 Dec 2019 13:25:47 GMT
content-encoding
gzip
x-original-content-length
33717
server
nginx
access-control-allow-origin
*
etag
W/"5de51081-83b5"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
status
200
cache-control
max-age=31536000
content-length
10551
expires
Tue, 01 Dec 2020 13:25:47 GMT
main-desktop-00600edd16.css
www.giga.de/static-local/dist/assets/css/
401 KB
53 KB
Stylesheet
General
Full URL
https://www.giga.de/static-local/dist/assets/css/main-desktop-00600edd16.css
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
f2627d56fad12cefb399d0578c9f3c4ad45eba9cd72cc173bc85c366a925a276

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 29 Nov 2019 09:44:46 GMT
content-encoding
gzip
x-original-content-length
410820
server
nginx
access-control-allow-origin
*
etag
W/"5de0e839-644c4"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/css
status
200
cache-control
max-age=31536000
content-length
53959
expires
Sat, 28 Nov 2020 09:44:46 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/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.103.64 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
script3.ioam.de
Software
nginx / BLACKBIRD-SRC v0.10 000e
Resource Hash
0adcf4e6fecc0e5cda60872684182fe5ec6b654641256a17d6fac92003f8e0a5

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:36 GMT
Content-Encoding
gzip
Last-Modified
Tue, 03 Dec 2019 12:58:36 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.10 000e
Vary
Accept-Encoding
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Cache-Control
private, max-age=7200, pre-check=7200
Transfer-Encoding
chunked
Connection
keep-alive
Content-Type
application/javascript
Expires
Tue, 03 Dec 2019 14:58:36 GMT
trackcp.js
gocp.stroeermediabrands.de/
28 KB
11 KB
Script
General
Full URL
https://gocp.stroeermediabrands.de/trackcp.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
8db3daba71f655f21d2c31ce0a75b09e27e339241b2acd3637580db9a9eb2120

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:36 GMT
Content-Encoding
gzip
Last-Modified
Tue, 03 Dec 2019 11:41:49 GMT
ETag
"5de649fd-6fa7"
Transfer-Encoding
chunked
Content-Type
application/javascript
Cache-Control
max-age=86400, max-age=31536000, public
X-Machine
hn87 gocp env
Accept-Ranges
bytes
Expires
Wed, 04 Dec 2019 12:58:36 GMT
martin-maciej-rcm40x40.jpg
static.giga.de/wp-content/uploads/2013/04/
1 KB
2 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2013/04/martin-maciej-rcm40x40.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
505b170e929bca71e7fec8a2bff588459b60e1e9bc99e6f68443d29b3cd73335
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 18 Nov 2019 14:40:49 GMT
x-content-type-options
nosniff
age
1289868
filer-source
006b20bf795e02b1f61b38f96553d06c747714f668d1b32549e4adaaaf107b9d
x-cache
HIT
status
200
accept-language
bytes
content-length
1215
x-xss-protection
1; mode=block
last-modified
Mon, 18 Nov 2019 14:40:49 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
Wed, 18 Dec 2019 14:40:49 GMT
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
103 KB
37 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
6f128586b7017fd051b211b07fa7ed4ef775c82ba9a715a05995b579737e79f6
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:36 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",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
37553
x-xss-protection
0
server
cafe
etag
14757686636207476153
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Tue, 03 Dec 2019 12:58:36 GMT
Stream-Hoster-rcm992x0.jpg
static.giga.de/wp-content/uploads/2018/03/
33 KB
34 KB
Image
General
Full URL
https://static.giga.de/wp-content/uploads/2018/03/Stream-Hoster-rcm992x0.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
72855c173e195a3e74f1f7e4587bb29f51a762fa9b9e0fbbf6d80e420957a8ca
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 08 Nov 2019 07:13:28 GMT
x-content-type-options
nosniff
age
2180708
filer-source
a476e5428aee04348e2de9a351e5aeb2d29217283c6acabe36d110096db5d65b
x-cache
HIT
status
200
accept-language
bytes
content-length
33948
x-xss-protection
1; mode=block
last-modified
Fri, 08 Nov 2019 07:13:28 GMT
server
nginx/1.10.3
filer-attr
W1s5OTIsMzQ4XSwic2h1dHRsZS12MiIsWyJGUkEtMSJdLFsiRlJCLTEiXV0=
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Sun, 08 Dec 2019 07:13:28 GMT
giga.svg
www.giga.de/static-local/dist/assets/images/logos/
11 KB
4 KB
Image
General
Full URL
https://www.giga.de/static-local/dist/assets/images/logos/giga.svg
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
dd28ac8237e60211a798ccc9ecacec2accc1fd02ee06f6264a3624606cd38831

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:36 GMT
content-encoding
gzip
last-modified
Tue, 03 Dec 2019 11:56:29 GMT
server
nginx
access-control-allow-origin
*
etag
W/"5de64d6d-2ad8"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
image/svg+xml
status
200
cache-control
max-age=31536000, s-maxage=10
expires
Wed, 02 Dec 2020 12:58:36 GMT
blank.gif
ssl-econa.met.vgwort.de/
Redirect Chain
  • https://ssl-econa.met.vgwort.de/na/828af7bc47ba49af9820d7735fbb8942
  • 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/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Access-Control-Allow-Origin
*
Date
Tue, 03 Dec 2019 12:58:36 GMT
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
s2.50.19
Connection
keep-alive
Content-Length
43
Content-Type
image/gif

Redirect headers

Date
Tue, 03 Dec 2019 12:58:36 GMT
Last-Modified
Tue, 03 Dec 2019 12:58:36 GMT
Server
s2.50.19
Location
/blank.gif
Transfer-Encoding
chunked
Content-Type
text/html
Access-Control-Allow-Origin
*
Cache-Control
max-age=0, no-cache, must-revalidate, proxy-revalidate
Connection
keep-alive
Expires
Tue, 22 Aug 2000 15:05:01 GMT
tr
www.facebook.com/
44 B
251 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/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f11c:8183:face:b00c:0:25de , Ireland, ASN32934 (FACEBOOK - Facebook, Inc., US),
Reverse DNS
Software
proxygen-bolt /
Resource Hash
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:36 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
alt-svc
h3-23=":443"; ma=3600
content-length
44
expires
Tue, 03 Dec 2019 12:58:36 GMT
tr
www.facebook.com/
44 B
206 B
Image
General
Full URL
https://www.facebook.com/tr?id=1773162896260346&ev=ViewContent
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f11c:8183:face:b00c:0:25de , Ireland, ASN32934 (FACEBOOK - Facebook, Inc., US),
Reverse DNS
Software
proxygen-bolt /
Resource Hash
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:36 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
alt-svc
h3-23=":443"; ma=3600
content-length
44
expires
Tue, 03 Dec 2019 12:58:36 GMT
analytics.js
www.google-analytics.com/
43 KB
17 KB
Script
General
Full URL
https://www.google-analytics.com/analytics.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-298466378d.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:808::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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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
1499
date
Tue, 03 Dec 2019 12:33:37 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",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
17803
expires
Tue, 03 Dec 2019 14:33:37 GMT
apstag.js
c.amazon-adsystem.com/aax2/
88 KB
26 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-298466378d.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.199.29 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-199-29.fra2.r.cloudfront.net
Software
Server /
Resource Hash
1412d7245072504d1975da264074e475485b5bab1edab58938a536542a4f3dd5

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 02 Dec 2019 17:32:54 GMT
content-encoding
gzip
server
Server
age
69942
etag
f95fda3d4fe6103808d969fc52fa66db
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
public, max-age=86400
x-amz-cf-pop
FRA2-C1
accept-ranges
bytes
x-amz-cf-id
b4lKRWfLTDkx2vn_E3fj2btQMN9gCl_NDBCrk1iRWhR_zItHCOYrIQ==
via
1.1 3b02f73dccc5077f1ad544a27a475ed6.cloudfront.net (CloudFront)
api
tracking.m6r.eu/sync/
Redirect Chain
  • https://cdn.m6r.eu/sync/api
  • https://tracking.m6r.eu/sync/api?checkcookies=true
1 KB
1 KB
Script
General
Full URL
https://tracking.m6r.eu/sync/api?checkcookies=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
HTTP/1.1
Security
TLS 1.3, , 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
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 GMT
Content-Encoding
gzip
Last-Modified
Mon, 25 Nov 2019 14:47:23 GMT
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Connection
keep-alive
Content-Type
application/javascript; charset=utf-8
Content-Length
654

Redirect headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:37 GMT
Server
nginx
Vary
Accept
Content-Type
text/plain; charset=utf-8
Location
https://tracking.m6r.eu/sync/api?checkcookies=true
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
72
Expires
Tue, 03 Dec 2019 12:58:37 GMT
identitystatus
irqs.ioam.de/
25 B
203 B
XHR
General
Full URL
https://irqs.ioam.de/identitystatus?offerIdentifier=giga&siteIdentifier=film_content&sampleType=in&pixelType=CP&isFadeoutFlash=true&isFadeoutFrame=true&isFadeoutForm=true&positionTop=10&positionLeft=100&zIndex=1100000&c=0.20377467485280265
Requested by
Host: script.ioam.de
URL: https://script.ioam.de/iam.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
193.46.63.75 Alfter, Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
irqs.ioam.de
Software
nginx /
Resource Hash
9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
Security Headers
Name Value
Strict-Transport-Security max-age=15768000

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Origin
https://www.giga.de

Response headers

date
Tue, 03 Dec 2019 12:58:36 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
tx.io
de.ioam.de/
Redirect Chain
  • https://de.ioam.de/tx.io?st=giga&cp=film_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=000e&i2=000e51aa00fcb3a495de65bfc&ep=1603947532&vr=415&id=sx...
  • https://de.ioam.de/tx.io?st=giga&cp=film_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=000e&i2=000e51aa00fcb3a495de65bfc&ep=1603947532&vr=415&id=sx...
0
694 B
Script
General
Full URL
https://de.ioam.de/tx.io?st=giga&cp=film_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=000e&i2=000e51aa00fcb3a495de65bfc&ep=1603947532&vr=415&id=sxnjyl&i3=000e51aa00fcb3a495de65bfc%3A1601557116932%3A1575377916932%3A.giga.de%3A1%3Agiga%3Afilm_content%3Anoevent%3A1575377916932&n1=3&dntt=0&lt=1575377916934&ev=&cs=a29um2&mo=1&sr=71
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
91.215.103.65 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
de3.ioam.de
Software
nginx / BLACKBIRD-RCV v1.05.0 0029
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:36 GMT
Server
nginx
X-Powered-By
BLACKBIRD-RCV v1.05.0 0029
Transfer-Encoding
chunked
Access-Control-Allow-Methods
GET, POST, OPTIONS
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Access-Control-Allow-Origin
*
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/x-javascript
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies

Redirect headers

Date
Tue, 03 Dec 2019 12:58:36 GMT
X-Powered-By
BLACKBIRD-RCV v1.05.0 0029
Transfer-Encoding
chunked
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Connection
keep-alive
Pragma
no-cache
Last-Modified
Tue, 03 Dec 2019 12:58:36 GMT
Server
nginx
Location
/tx.io?st=giga&cp=film_content&sv=i2&sc=yes&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.giga.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=000e&i2=000e51aa00fcb3a495de65bfc&ep=1603947532&vr=415&id=sxnjyl&i3=000e51aa00fcb3a495de65bfc%3A1601557116932%3A1575377916932%3A.giga.de%3A1%3Agiga%3Afilm_content%3Anoevent%3A1575377916932&n1=3&dntt=0&lt=1575377916934&ev=&cs=a29um2&mo=1&sr=71
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, must-revalidate
Access-Control-Allow-Credentials
true
Access-Control-Allow-Headers
DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Cookies
Expires
Mon, 03 Dec 2018 12:58:36 GMT
fontello.woff2
www.giga.de/static-local/dist/assets/fonts/fontello/
10 KB
10 KB
Font
General
Full URL
https://www.giga.de/static-local/dist/assets/fonts/fontello/fontello.woff2?53628368
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
1c3b2ef5bd8dd65a075f5e2e01b69421c16206237d55d600be9011b1cb29442f

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
Referer
https://www.giga.de/static-local/dist/assets/css/main-desktop-00600edd16.css
Origin
https://www.giga.de

Response headers

date
Tue, 03 Dec 2019 12:58:36 GMT
last-modified
Tue, 03 Dec 2019 11:56:29 GMT
server
nginx
accept-language
bytes
etag
"5de64d6d-265c"
access-control-allow-methods
GET
content-type
application/octet-stream
status
200
cache-control
max-age=31536000, s-maxage=10
access-control-allow-origin
*
content-length
9820
expires
Wed, 02 Dec 2020 12:58:36 GMT
lazyload-65c07b80e0.min.js
www.giga.de/static-local/dist/assets/js/vendor/lazyload/
5 KB
2 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/vendor/lazyload/lazyload-65c07b80e0.min.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
69e942532f5c4b64fd68a98c15a62eb5d6fd6cb864282fa9a0c11ead2cdc9268

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 29 May 2019 08:30:49 GMT
content-encoding
gzip
x-original-content-length
5207
server
nginx
access-control-allow-origin
*
etag
W/"5cee42b6-1457"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
status
200
cache-control
max-age=31536000
content-length
2015
expires
Thu, 28 May 2020 08:30:49 GMT
78410589
videos.giga.de/embed/ Frame 34FB
9 KB
3 KB
Document
General
Full URL
https://videos.giga.de/embed/78410589
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
37771301c81ae14de26883a0cb2b58f21e18dc944f036c5590e8b37231b396be

Request headers

:method
GET
:authority
videos.giga.de
:scheme
https
:path
/embed/78410589
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
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
sec-fetch-mode
nested-navigate
referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
accept-encoding
gzip, deflate, br
cookie
ioam2018=000e51aa00fcb3a495de65bfc:1601557116932:1575377916932:.giga.de:2:giga:film_content:noevent:1575377916932:90fpja
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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/

Response headers

status
200
server
nginx/1.14.1
date
Tue, 03 Dec 2019 12:58:37 GMT
content-type
text/html;charset=UTF-8
content-encoding
gzip
init
d.nativendo.de/cds/delivery/
991 B
919 B
Script
General
Full URL
https://d.nativendo.de/cds/delivery/init
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
d9a75729ca40f061dff3a36b6dae2a1cc1d9ebc5d6d2f83ec08a89a982178c3c

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Dec 2019 12:58:37 GMT
content-encoding
gzip
last-modified
Tue, 03 Dec 2019 12:58:37 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
517
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
collect
www.google-analytics.com/r/
35 B
104 B
Image
General
Full URL
https://www.google-analytics.com/r/collect?v=1&_v=j79&aip=1&a=935930240&t=pageview&_s=1&dl=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ul=en-us&de=UTF-8&dt=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&_u=4GBAAEAB~&jid=1986592640&gjid=586430150&cid=2115578610.1575377917&tid=UA-204785-4&_gid=166720197.1575377917&_r=1&cd1=Martin%20Maciej&cd5=2019-05-03T08%3A37%3A53%2B02%3A00&cg1=Themenspecials&cg2=4576302&cg3=03-2018&cd2=film&cd6=Artikelseite&cd8=website&cd3=2013197&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=&cd42=bob&z=388377977
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:808::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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Dec 2019 12:58:37 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
access-control-allow-origin
*
content-type
image/gif
status
200
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
35
expires
Fri, 01 Jan 1990 00:00:00 GMT
aps_csm.js
c.amazon-adsystem.com/bao-csm/aps-comm/
6 KB
3 KB
XHR
General
Full URL
https://c.amazon-adsystem.com/bao-csm/aps-comm/aps_csm.js
Requested by
Host: c.amazon-adsystem.com
URL: https://c.amazon-adsystem.com/aax2/apstag.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.224.199.29 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-199-29.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
06b99248a163333e36980a6cfb756f1a7de60fa49517162b87b1a44d5d48f844

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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Origin
https://www.giga.de

Response headers

date
Mon, 02 Dec 2019 13:46:40 GMT
content-encoding
gzip
vary
Origin
age
83528
x-cache
Hit from cloudfront
status
200
access-control-allow-origin
*
last-modified
Fri, 01 Nov 2019 13:46:13 GMT
server
AmazonS3
access-control-max-age
3000
access-control-allow-methods
GET
content-type
application/javascript
via
1.1 5a5b94c62ea85e0c0d78b169589b08b5.cloudfront.net (CloudFront)
cache-control
public, max-age=86400
x-amz-cf-pop
FRA2-C1
x-amz-cf-id
VCef59cClllUHWly_2l57guH4fx0iK57dN1InHWaLWncHhJbzLqYIw==
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:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
104
x-xss-protection
0
integrator.js
adservice.google.com/adsid/
109 B
171 B
Script
General
Full URL
https://adservice.google.com/adsid/integrator.js?domain=www.giga.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
content-type
application/javascript; charset=UTF-8
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
104
x-xss-protection
0
show_ads_impl_fy2019.js
pagead2.googlesyndication.com/pagead/js/r20191114/r20190131/
220 KB
83 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20191114/r20190131/show_ads_impl_fy2019.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:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
b198f6c8ffd50a477f7dea4911bcbeb614271d080084eb189c30716ef24af5db
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 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",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
84789
x-xss-protection
0
server
cafe
etag
6374670274128428363
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Tue, 03 Dec 2019 12:58:37 GMT
show_ads_impl_fy2019.js
pagead2.googlesyndication.com/pagead/js/r20191114/r20190131/ Frame F4AE
220 KB
83 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20191114/r20190131/show_ads_impl_fy2019.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:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
b198f6c8ffd50a477f7dea4911bcbeb614271d080084eb189c30716ef24af5db
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 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",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
84789
x-xss-protection
0
server
cafe
etag
6374670274128428363
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Tue, 03 Dec 2019 12:58:37 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20191114/r20190131/ Frame 5546
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20191114/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:814::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/r20191114/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
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
sec-fetch-mode
nested-navigate
referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/

Response headers

status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
vary
Accept-Encoding
date
Wed, 20 Nov 2019 11:45:53 GMT
expires
Wed, 04 Dec 2019 11:45:53 GMT
content-type
text/html; charset=UTF-8
etag
9688732929695215001
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
6504
x-xss-protection
0
cache-control
public, max-age=1209600
age
1127564
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
z.js
go.giga-abs.de/
1 KB
1 KB
Script
General
Full URL
https://go.giga-abs.de/z.js?0.6509450203912719
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 GMT
X-Content-Type-Options
nosniff
Last-Modified
Tue, 03 Dec 2019 12:58:37 GMT
Server
X/1.0
Content-Type
text/javascript
Cache-Control
max-age=86400, public
Connection
keep-alive
Content-Length
1040
Expires
Wed, 04 Dec 2019 12:58:24 GMT
Cookie set iframe
tracking.m6r.eu/pixel/ Frame A193
Redirect Chain
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Film%20%26amp%3B%20Serien
  • https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Film%20%26amp%3B%20Serien&checkcookies=true
0
0
Document
General
Full URL
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Film%20%26amp%3B%20Serien&checkcookies=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
HTTP/1.1
Security
TLS 1.3, , 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
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Accept-Encoding
gzip, deflate, br
Cookie
test=true; id=c691c1b2ce4aa7b0c77ae005c6c76af2
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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/

Response headers

Server
nginx
Content-Type
text/html; charset=utf-8
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Cache-Control
no-cache
Content-Encoding
gzip
Date
Tue, 03 Dec 2019 12:58:37 GMT
Content-Length
1531
Connection
keep-alive
Vary
Accept-Encoding
Set-Cookie
id=c691c1b2ce4aa7b0c77ae005c6c76af2; Max-Age=7776000; Domain=m6r.eu; Path=/; Expires=Mon, 02 Mar 2020 12:58:37 GMT

Redirect headers

Server
nginx
Content-Type
text/html; charset=utf-8
Content-Length
336
Location
https://tracking.m6r.eu/pixel/iframe?pixelId=f407193e-e112-43a2-a5e6-af92d82a6269&theme=GIGA%20Film%20%26amp%3B%20Serien&checkcookies=true
Date
Tue, 03 Dec 2019 12:58:37 GMT
Connection
keep-alive
Set-Cookie
test=true; Max-Age=3600; Domain=m6r.eu; Path=/; Expires=Tue, 03 Dec 2019 13:58:37 GMT
tfa.js
cdn.taboola.com/libtrc/unip/1092206/
42 KB
14 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/unip/1092206/tfa.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
466ad4346ce936aca54d8e30d30f4a3b6890280581344a35a2ec48cb787a2c40

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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
.Sr6cGswuM06H1SOMJ9QGDOSbAZP_tRX
content-encoding
gzip
age
46
x-cache
HIT
status
200
date
Tue, 03 Dec 2019 12:58:37 GMT
x-amz-replication-status
COMPLETED
content-length
13755
x-amz-id-2
CfdaX6u04X7wUDW7cNFH7pSkbKvt8sP701spY0B8dWk9eZaqDSRXA/ydhe5EJLKIDOYLlsNC2bU=
x-served-by
cache-fra19169-FRA
last-modified
Tue, 26 Nov 2019 13:03:31 GMT
server
AmazonS3
x-timer
S1575377917.105300,VS0,VE0
etag
"4a8fab3f8b10fbee9d4529b12cfe5be0"
vary
Accept-Encoding
x-amz-request-id
1F3D337CF5CDFE27
via
1.1 varnish
cache-control
private,max-age=14401
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
75
x-cache-hits
7
gpt.js
securepubads.g.doubleclick.net/tag/js/
51 KB
16 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/tag/js/gpt.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.9ca6297f6e6a5371abc434e6eb433c07.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
sffe /
Resource Hash
9d5718f13181da45241b915b1d7ae28f54f80f543bb8aab1904fe3efbcb2465e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"355 / 930 of 1000 / last-modified: 1575323226"
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=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
15723
x-xss-protection
0
expires
Tue, 03 Dec 2019 12:58:37 GMT
bid
c.amazon-adsystem.com/e/dtb/
101 B
487 B
XHR
General
Full URL
https://c.amazon-adsystem.com/e/dtb/bid?src=3301&u=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&pid=9R8g38aOSJXW7&cb=0&ws=1600x1200&v=7.44.02&t=1000&slots=%5B%7B%22sd%22%3A%220%22%2C%22s%22%3A%5B%22728x90%22%2C%22800x250%22%2C%22970x250%22%5D%2C%22sn%22%3A%22banner%22%7D%2C%7B%22sd%22%3A%221%22%2C%22s%22%3A%5B%22160x600%22%2C%22300x600%22%5D%2C%22sn%22%3A%22sky%22%7D%2C%7B%22sd%22%3A%222%22%2C%22s%22%3A%5B%22300x250%22%5D%2C%22sn%22%3A%22rectangle%22%7D%5D&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
13.224.199.29 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-224-199-29.fra2.r.cloudfront.net
Software
Server /
Resource Hash
f4fbbb7746d71d3ed2cf5ba8df40b1f906d988ee88e79c7c4086c40cf373f5c4

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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Origin
https://www.giga.de

Response headers

date
Tue, 03 Dec 2019 12:58:37 GMT
content-encoding
gzip
server
Server
x-amz-cf-pop
FRA2-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
114
via
1.1 3b02f73dccc5077f1ad544a27a475ed6.cloudfront.net (CloudFront)
x-amz-cf-id
QrndVBwxdricF5pHUea2u0OQvF9LzY4PUZH-AJgB4OCQcFDTwrp9fw==
yieldlove-bidder-stroeer.js
cdn-a.yieldlove.com/
286 KB
88 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.9ca6297f6e6a5371abc434e6eb433c07.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
143.204.101.73 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-143-204-101-73.fra50.r.cloudfront.net
Software
/ Express
Resource Hash
55ca5b82055e27d50f27e915973c0678b05b50485652feab993f890e0088db54

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 10:47:39 GMT
content-encoding
gzip
age
7851
x-powered-by
Express
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript; charset=utf-8
status
200
cache-control
public, max-age=10800
x-amz-cf-pop
FRA50-C1
access-control-allow-origin
*
x-amz-cf-id
RP9OwqpyUnROapyImj4iBrl83A3XPKDeLlDrEi3V9hywx57u4MwPOg==
via
1.1 d627b75d0c1aedd3691390ac8498d3b0.cloudfront.net (CloudFront)
mtrcs_679600.js
s400.mxcdn.net/bb-mx/serve/
126 KB
49 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.9ca6297f6e6a5371abc434e6eb433c07.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
72.247.224.195 , United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a72-247-224-195.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
b1719c56cbcf138e4ebd26dbe62e34b2f58760f0e77ec01eee6e18624c344926

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 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
49772
Expires
Tue, 03 Dec 2019 14:58:37 GMT
dmp
tracking.m6r.eu/sync/
97 B
599 B
XHR
General
Full URL
https://tracking.m6r.eu/sync/dmp
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.9ca6297f6e6a5371abc434e6eb433c07.js
Protocol
HTTP/1.1
Security
TLS 1.3, , 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
318aa9e4e0f088ebfd57d281213d8d9d53bf439c2bf5a3be03c8c96d208aeb80

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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Origin
https://www.giga.de

Response headers

Date
Tue, 03 Dec 2019 12:58:37 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
nuggad
nugmw.userreport.com/rc-ap/9aa96ff2-99b7-4539-aafa-f3150345bcab/si.nuggad.net/
Redirect Chain
  • https://si.nuggad.net/rc?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F
  • https://nugmw.userreport.com/rc-ap/9aa96ff2-99b7-4539-aafa-f3150345bcab/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspeci...
2 KB
2 KB
Script
General
Full URL
https://nugmw.userreport.com/rc-ap/9aa96ff2-99b7-4539-aafa-f3150345bcab/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:21f3:3a00:1f:a1b:34c0:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
nginx/1.14.1 /
Resource Hash
ed030d2e8119198ff49d389fd0f9c4a8547cfc60e8986dcc378b9f389c6f3c1c

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 GMT
via
1.1 6c9a2d99a25484f38efa27d58a726b2d.cloudfront.net (CloudFront)
server
nginx/1.14.1
x-amz-cf-pop
FRA2-C2
access-control-allow-methods
get, post, options
content-type
text/javascript
status
200
cache-control
s-maxage=0, max-age=0
access-control-allow-credentials
true
x-cache
Miss from cloudfront
access-control-allow-headers
accept
content-length
1790
x-amz-cf-id
3MV5Fspe6eQILxeGbhQQBiJ0bdxxDMeGjd4qsiSod7HX8Hf6KbLBTg==

Redirect headers

date
Tue, 03 Dec 2019 12:58:37 GMT
via
1.1 37c215a6cf8b04439db2f97a633421e6.cloudfront.net (CloudFront)
server
nginx/1.14.1
x-amz-cf-pop
FRA2-C1
location
https://nugmw.userreport.com/rc-ap/9aa96ff2-99b7-4539-aafa-f3150345bcab/si.nuggad.net/nuggad?nuggn=571289945&nuggsid=947908416&nuggtg=&nuggrid=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F
access-control-allow-methods
get, post, options
status
302
cache-control
s-maxage=0, max-age=0
access-control-allow-credentials
true
x-cache
Miss from cloudfront
access-control-allow-headers
accept
content-length
0
x-amz-cf-id
8blXlVWdP1kiA48QODphBHkRuW-c8SKuwr0r1NkmkaKew8a1Q0bEBw==
/
quiz.stroeermediabrands.de/pub/meta/
267 B
637 B
XHR
General
Full URL
https://quiz.stroeermediabrands.de/pub/meta/?q=013e2a26-c271-4820-86e9-6b7ba44cdfa1
Requested by
Host: www.giga.de
URL: https://www.giga.de/static-local/dist/assets/js/pre-298466378d.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
46.253.113.181 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
7de0e304007e1f691f02d07805cea3467c4cd7e4f88f25651c71d08771793a44

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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Origin
https://www.giga.de

Response headers

date
Tue, 03 Dec 2019 12:58:37 GMT
content-encoding
gzip
server
nginx
status
200
access-control-allow-methods
GET, POST, OPTIONS
content-type
application/json
access-control-allow-origin
*
access-control-expose-headers
Content-Length,Content-Range,Content-Type,Expires
access-control-allow-headers
DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range
expires
Tue, 03 Dec 2019 13:42:53 GMT
ad-loading.png
www.dunkirkinception.com/detect/
71 B
381 B
Image
General
Full URL
https://www.dunkirkinception.com/detect/ad-loading.png?p=ima-jes/
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.195.39.206 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-18-195-39-206.eu-central-1.compute.amazonaws.com
Software
/ TSAdServer
Resource Hash
790407d643dfe21ecd773a44007cde3980d7a5eabd829ad1f06c2738b72fd1a2

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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Origin
https://www.giga.de

Response headers

Date
Tue, 03 Dec 2019 12:58:37 GMT
ETag
W/"47-ZTbJFDBdJipLHHeF7Zqsus3A1Hc"
X-Powered-By
TSAdServer
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
71
tag.js
js.agkn.com/prod/v0/
3 KB
3 KB
Script
General
Full URL
https://js.agkn.com/prod/v0/tag.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.9ca6297f6e6a5371abc434e6eb433c07.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:2043:fc00:15:efbc:e300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
dc82de33871a9ed40a5379ed264dd0456d9bf58839286b913231648f527bc72b

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 02 Dec 2019 20:24:23 GMT
via
1.1 09f4ecc806a7e34780fd19a93b984724.cloudfront.net (CloudFront)
last-modified
Tue, 22 Oct 2019 20:22:52 GMT
server
AmazonS3
age
135914
etag
"f53f55cbab099be3a970b446a66c496a"
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
x-amz-cf-pop
FRA54
accept-ranges
bytes
content-length
3167
x-amz-cf-id
GxEBKIFHDblgxCSL6WaVwBBtqZ7SY6X4G1IMTOl8e8701QG4Y4w-qA==
config.json
gocp.stroeermediabrands.de/absconf/www.giga.de/
19 KB
19 KB
Fetch
General
Full URL
https://gocp.stroeermediabrands.de/absconf/www.giga.de/config.json?c=1575377917
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
b9ea552a4ee1c36700f2b82f6ceeb49a2ca8b8516f7ee11d0ec071ba3a8daf81

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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Origin
https://www.giga.de

Response headers

Access-Control-Allow-Origin
*
Date
Tue, 03 Dec 2019 12:58:37 GMT
Cache-Control
max-age=31536000, public
X-Machine
hn87 gocp env
Transfer-Encoding
chunked
Content-Type
application/json; charset=UTF-8
post-33dedcb970.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-33dedcb970.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
546390dabb77f8ffa37721249a74cd4ac7e117b65a2860d797821c14c16e3cab

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 14 Nov 2019 14:48:22 GMT
content-encoding
gzip
x-original-content-length
7105
server
nginx
access-control-allow-origin
*
etag
W/"5dcd68dc-1bc1"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
status
200
cache-control
max-age=31536000
content-length
2689
expires
Fri, 13 Nov 2020 14:48:22 GMT
giga-772cc0e021.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-772cc0e021.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
89b7e20cf73c5d61af4ae659c63f2eab235dd32a1dce673b5e6c3d47be59d6ef

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 05 Nov 2019 09:59:14 GMT
content-encoding
gzip
x-original-content-length
31296
server
nginx
access-control-allow-origin
*
etag
W/"5dc147a5-7a40"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
status
200
cache-control
max-age=31536000
content-length
11732
expires
Wed, 04 Nov 2020 09:59:14 GMT
smb-phone-plan-ef34ebe4f8.js
www.giga.de/static-local/dist/assets/js/vendor/@smb/phone-plan/
53 KB
18 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/vendor/@smb/phone-plan/smb-phone-plan-ef34ebe4f8.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
178.19.72.10 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
2b62326a6aafef471d4775604603e2404453f26c5c29d9f97f946227d23f4544

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 11 Sep 2019 09:34:34 GMT
content-encoding
gzip
x-original-content-length
54000
server
nginx
access-control-allow-origin
*
etag
W/"5d78bf3c-d2f0"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
status
200
cache-control
max-age=31536000
content-length
18237
expires
Thu, 10 Sep 2020 09:34:34 GMT
loader.js
c.nativendo.de/cdn/asset/js/
54 KB
17 KB
Script
General
Full URL
https://c.nativendo.de/cdn/asset/js/loader.js?v=1176
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::681a:4fb , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
af9e05e18a2be5ae5a15505e259ae486da5030111e991c9d1bc5060fcd938221

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 GMT
via
1.1 google
cf-cache-status
HIT
age
1203931
cf-polished
origSize=55238
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
53f5b68eff50cba4-VIE
expires
Wed, 18 Nov 2020 14:33:06 GMT
videojs-c972511a.min.js
videos.giga.de/dist/js/embed/bundle/ Frame 34FB
619 KB
206 KB
Script
General
Full URL
https://videos.giga.de/dist/js/embed/bundle/videojs-c972511a.min.js
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/78410589
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
4532f79dd4221b45bb4f0008abce433420eeb875e88a9ea119063b90adbb6cb5

Request headers

Referer
https://videos.giga.de/embed/78410589
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 GMT
content-encoding
gzip
last-modified
Wed, 20 Nov 2019 11:38:10 GMT
server
nginx/1.14.1
etag
W/"5dd525a2-9aae0"
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 34FB
273 KB
93 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/78410589
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:816::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
5fa6833aaa4245a425c0bf047e200f7be29f46246239529a6e4ac8085736671d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://videos.giga.de/embed/78410589
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 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",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
94888
x-xss-protection
0
expires
Tue, 03 Dec 2019 12:58:37 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 0A18
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&h=60&slotname=6296805359&adk=3471272371&adf=1459277723&w=468&lmt=1575377917&psa=0&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&flash=0&wgl=1&adsid=NT&dt=1575377917054&bpp=18&bdt=178&fdt=201&idt=202&shv=r20191114&cbv=r20190131&saldr=aa&abxe=1&correlator=7178911137210&frm=20&pv=2&ga_vid=2115578610.1575377917&ga_sid=1575377917&ga_hid=935930240&ga_fc=0&iag=0&icsg=12900237566&dssz=57&mdo=0&mso=0&u_tz=60&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=486&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199337%2C21065126&oid=3&pvsid=2134285338763390&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeE%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=1&uci=1.5zhucv5ko0qe&fsb=1&xpc=AeLv2T8S1U&p=https%3A//www.giga.de&dtd=219
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191114/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
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=6296805359&adk=3471272371&adf=1459277723&w=468&lmt=1575377917&psa=0&guci=1.2.0.0.2.2.0.0&format=468x60&url=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&flash=0&wgl=1&adsid=NT&dt=1575377917054&bpp=18&bdt=178&fdt=201&idt=202&shv=r20191114&cbv=r20190131&saldr=aa&abxe=1&correlator=7178911137210&frm=20&pv=2&ga_vid=2115578610.1575377917&ga_sid=1575377917&ga_hid=935930240&ga_fc=0&iag=0&icsg=12900237566&dssz=57&mdo=0&mso=0&u_tz=60&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=486&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199337%2C21065126&oid=3&pvsid=2134285338763390&rx=0&eae=0&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeE%7C&abl=CS&pfx=0&fu=16&bc=31&ifi=1&uci=1.5zhucv5ko0qe&fsb=1&xpc=AeLv2T8S1U&p=https%3A//www.giga.de&dtd=219
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
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
sec-fetch-mode
nested-navigate
referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
accept-encoding
gzip, deflate, br
cookie
IDE=AHWqTUkc78Tk1NTkwbgheKQqGYd44B7XO2MgH-xm8NOJfNu0IdnX-o_69YIMmvvw
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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/

Response headers

status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
content-type
text/html; charset=UTF-8
x-content-type-options
nosniff
content-encoding
br
date
Tue, 03 Dec 2019 12:58:37 GMT
server
cafe
content-length
22919
x-xss-protection
0
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
osd.js
www.googletagservices.com/activeview/js/current/
78 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd.js?cb=%2Fr20100101
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191114/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
0e946b0ee0337cf23c845f67a238e1fefd5f1e014fdbd8ea27870172fcedd40f
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1573858490126243"
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",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29338
x-xss-protection
0
expires
Tue, 03 Dec 2019 12:58:37 GMT
collect
www.google-analytics.com/
35 B
102 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=935930240&t=event&ni=1&_s=2&dl=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ul=en-us&de=UTF-8&dt=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Quiz%20Teaser%202017&ea=embed&el=013e2a26-c271-4820-86e9-6b7ba44cdfa1&_u=6GBAAEAB~&jid=&gjid=&cid=2115578610.1575377917&tid=UA-204785-4&_gid=166720197.1575377917&cd1=Martin%20Maciej&cd5=2019-05-03T08%3A37%3A53%2B02%3A00&cg1=Themenspecials&cg2=4576302&cg3=03-2018&cd2=film&cd6=Artikelseite&cd8=website&cd3=2013197&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=&cd42=bob&cd20=013e2a26-c271-4820-86e9-6b7ba44cdfa1&cd25=manuell&cd27=SurveyQuestion&cm53=1&z=1541257953
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:808::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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 19 Nov 2019 09:10:32 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1223285
content-type
image/gif
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
videojs-f50f7a8d.css
videos.giga.de/dist/css/ Frame 34FB
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/78410589
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

Referer
https://videos.giga.de/embed/78410589
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 GMT
content-encoding
gzip
last-modified
Wed, 20 Nov 2019 11:38:10 GMT
server
nginx/1.14.1
etag
W/"5dd525a2-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 34FB
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/78410589
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

Referer
https://videos.giga.de/embed/78410589
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 GMT
last-modified
Thu, 04 Jul 2019 08:23:54 GMT
server
nginx/1.14.1
etag
"5d1db79a-3f7"
content-type
image/svg+xml
status
200
cache-control
max-age=7776000
accept-ranges
bytes
content-length
1015
expires
Mon, 02 Mar 2020 12:58:37 GMT
kwiss-69d2e3a105.js
www.giga.de/static-local/dist/assets/js/components/
5 KB
2 KB
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/components/kwiss-69d2e3a105.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
8beb904f67cc6daaa4d6d22518152461f640b003b4accab3b705bb2cb92e8230

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 05 Nov 2019 09:59:14 GMT
content-encoding
gzip
x-original-content-length
4933
server
nginx
access-control-allow-origin
*
etag
W/"5dc147a5-1345"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
status
200
cache-control
max-age=31536000
content-length
2095
expires
Wed, 04 Nov 2020 09:59:14 GMT
article-rating-7143c629e5.js
www.giga.de/static-local/dist/assets/js/components/
306 B
534 B
Script
General
Full URL
https://www.giga.de/static-local/dist/assets/js/components/article-rating-7143c629e5.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Wed, 27 Mar 2019 23:22:29 GMT
content-encoding
gzip
x-original-content-length
306
server
nginx
accept-language
bytes
etag
"5c9a4313-132"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
status
200
cache-control
max-age=31536000
access-control-allow-origin
*
content-length
234
expires
Thu, 26 Mar 2020 23:22:28 GMT
container
tracking.m6r.eu/pixel/
3 KB
2 KB
Script
General
Full URL
https://tracking.m6r.eu/pixel/container?pixelId=89ceb345-90db-4a47-a654-84bb00b8ca2c&smb_sp=&smb_ch=film
Requested by
Host: tracking.m6r.eu
URL: https://tracking.m6r.eu/sync/api?checkcookies=true
Protocol
HTTP/1.1
Security
TLS 1.3, , 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
793a510499b087f0a49bfa613a33c9411fba84a96883014c0ed34c02c5cfba30

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
text/javascript; charset=utf-8
Content-Length
1393
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%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&__id=1575377917307&__it=-60&__ic=727391&__iq=d60947d71dc6b8363d958031bdb4812c&__ig=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:37 GMT
Last-Modified
Wed, 25 Nov 2009 12:56:32 GMT
Server
X/1.0
Content-Type
image/gif
Cache-Control
private, no-cache, no-store, proxy-revalidate, no-transform
Connection
keep-alive
Content-Length
35
Expires
Tue, 27 Nov 2012 12:56:32 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 7FAE
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-3939813287030084&output=html&adk=1812271804&adf=3025194257&lmt=1575377917&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504%2C9%3A134250504%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1575377917176&bpp=6&bdt=300&fdt=177&idt=177&shv=r20191114&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=7178911137210&frm=20&pv=1&ga_vid=2115578610.1575377917&ga_sid=1575377917&ga_hid=935930240&ga_fc=0&iag=0&icsg=825615204344&dssz=61&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199337%2C21065126&oid=3&pvsid=2134285338763390&rx=0&eae=2&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=1&uci=1.uid0w1jjev8t&fsb=1&dtd=182
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20191114/r20190131/show_ads_impl_fy2019.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
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=1575377917&plat=1%3A32776%2C2%3A16809992%2C8%3A134250504%2C9%3A134250504%2C16%3A8388608%2C30%3A1081344&guci=1.2.0.0.2.2.0.0&format=0x0&url=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ea=0&flash=0&pra=7&wgl=1&adsid=NT&dt=1575377917176&bpp=6&bdt=300&fdt=177&idt=177&shv=r20191114&cbv=r20190131&saldr=aa&abxe=1&prev_fmts=468x60&nras=1&correlator=7178911137210&frm=20&pv=1&ga_vid=2115578610.1575377917&ga_sid=1575377917&ga_hid=935930240&ga_fc=0&iag=0&icsg=825615204344&dssz=61&mdo=0&mso=0&u_tz=60&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=-12245933&ady=-12245933&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=20199337%2C21065126&oid=3&pvsid=2134285338763390&rx=0&eae=2&fc=896&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7Cs%7C&abl=NS&fu=16&bc=31&ifi=1&uci=1.uid0w1jjev8t&fsb=1&dtd=182
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
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
sec-fetch-mode
nested-navigate
referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
accept-encoding
gzip, deflate, br
cookie
IDE=AHWqTUkc78Tk1NTkwbgheKQqGYd44B7XO2MgH-xm8NOJfNu0IdnX-o_69YIMmvvw
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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/

Response headers

status
200
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
timing-allow-origin
*
content-type
text/html; charset=UTF-8
x-content-type-options
nosniff
date
Tue, 03 Dec 2019 12:58:37 GMT
server
cafe
content-length
0
x-xss-protection
0
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
Cookie set iu3
aax-eu.amazon-adsystem.com/s/ Frame 9DCE
Redirect Chain
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=3lift
  • https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=3lift&dcc=t
0
0
Document
General
Full URL
https://aax-eu.amazon-adsystem.com/s/iu3?cm3ppd=1&d=dtb-pub&csif=t&dl=3lift&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.95.123.41 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
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Accept-Encoding
gzip, deflate, br
Cookie
ad-id=AypmDGFGjUcSlAccZIwcgoE|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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/

Response headers

Server
Server
Date
Tue, 03 Dec 2019 12:58:37 GMT
Content-Type
text/html;charset=ISO-8859-1
Content-Length
183
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=AypmDGFGjUcSlAccZIwcgoE; Domain=.amazon-adsystem.com; Expires=Wed, 01-Jul-2020 12:58:37 GMT; Path=/; HttpOnly ad-privacy=0; Domain=.amazon-adsystem.com; Expires=Wed, 01-Jan-2025 12:58:37 GMT; Path=/; HttpOnly
Vary
Accept-Encoding,User-Agent
Content-Encoding
gzip

Redirect headers

Server
Server
Date
Tue, 03 Dec 2019 12:58:37 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=3lift&dcc=t
Set-Cookie
ad-id=AypmDGFGjUcSlAccZIwcgoE|t; Domain=.amazon-adsystem.com; Expires=Wed, 01-Jul-2020 12:58:37 GMT; Path=/; HttpOnly
Vary
User-Agent
loader.js
cdn.taboola.com/libtrc/stroeer-smb-giga/
117 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-33dedcb970.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
fec6f3ec568bf48390b82bd29ae53a4e8f3324fd5b5fd062ff807a0de553188a

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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
OA8rKlI47biIpn9IJzKIN.by.FV1UhwX
content-encoding
gzip
age
20
x-cache
HIT
status
200
date
Tue, 03 Dec 2019 12:58:37 GMT
content-length
22345
x-amz-id-2
AO7E+ZAWF77R/Fq8vwIELdzkpNO6bFp8ph2lt7h+6FSIYFGTSbA7tfxDOtxwH5dqfHKSi3b/Afo=
x-served-by
cache-fra19169-FRA
last-modified
Sat, 30 Nov 2019 16:27:50 GMT
server
AmazonS3
x-timer
S1575377917.410107,VS0,VE0
etag
"bcd69c948ec218c27e01f98042f40f51"
vary
Accept-Encoding
x-amz-request-id
80502DF1429B298A
via
1.1 varnish
cache-control
private,max-age=14401
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
28
x-cache-hits
3
collect
www.google-analytics.com/
35 B
97 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=935930240&t=event&ni=1&_s=3&dl=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ul=en-us&de=UTF-8&dt=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Amazon%20Prime%20Video%2030%20Tage%20kostenlos%20testen*&_u=6GBAAEAB~&jid=&gjid=&cid=2115578610.1575377917&tid=UA-204785-4&_gid=166720197.1575377917&cd1=Martin%20Maciej&cd5=2019-05-03T08%3A37%3A53%2B02%3A00&cg1=Themenspecials&cg2=4576302&cg3=03-2018&cd2=film&cd6=Artikelseite&cd8=website&cd3=2013197&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=&cd42=bob&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fs1n5l&cd41=Content%201&cd45=all&cm75=1&z=2018948080
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:808::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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 19 Nov 2019 09:10:32 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1223285
content-type
image/gif
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
97 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=935930240&t=event&ni=1&_s=4&dl=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ul=en-us&de=UTF-8&dt=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=aktuelle%20und%20beliebte%20Serien*&_u=6GBAAEAB~&jid=&gjid=&cid=2115578610.1575377917&tid=UA-204785-4&_gid=166720197.1575377917&cd1=Martin%20Maciej&cd5=2019-05-03T08%3A37%3A53%2B02%3A00&cg1=Themenspecials&cg2=4576302&cg3=03-2018&cd2=film&cd6=Artikelseite&cd8=website&cd3=2013197&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=&cd42=bob&cd39=Text-link&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fs1jyr&cd41=Content%202&cd45=all&cm75=1&z=454972869
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:808::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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 19 Nov 2019 09:10:32 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1223285
content-type
image/gif
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
97 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=935930240&t=event&ni=1&_s=5&dl=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ul=en-us&de=UTF-8&dt=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=aktuelle%20Kinofilme*&_u=6GBAAEAB~&jid=&gjid=&cid=2115578610.1575377917&tid=UA-204785-4&_gid=166720197.1575377917&cd1=Martin%20Maciej&cd5=2019-05-03T08%3A37%3A53%2B02%3A00&cg1=Themenspecials&cg2=4576302&cg3=03-2018&cd2=film&cd6=Artikelseite&cd8=website&cd3=2013197&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=&cd42=bob&cd39=Text-link&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fs1jyu&cd41=Content%203&cd45=all&cm75=1&z=296308767
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:808::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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 19 Nov 2019 09:10:32 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1223285
content-type
image/gif
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
97 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=935930240&t=event&ni=1&_s=6&dl=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ul=en-us&de=UTF-8&dt=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=neue%20Serien*&_u=6GBAAEAB~&jid=&gjid=&cid=2115578610.1575377917&tid=UA-204785-4&_gid=166720197.1575377917&cd1=Martin%20Maciej&cd5=2019-05-03T08%3A37%3A53%2B02%3A00&cg1=Themenspecials&cg2=4576302&cg3=03-2018&cd2=film&cd6=Artikelseite&cd8=website&cd3=2013197&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=&cd42=bob&cd39=Text-link&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fs1jyx&cd41=Content%204&cd45=all&cm75=1&z=1051218020
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:808::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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 19 Nov 2019 09:10:32 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1223285
content-type
image/gif
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
97 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=935930240&t=event&ni=1&_s=7&dl=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ul=en-us&de=UTF-8&dt=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=embed&el=Maxdome%20gratis%20testen*&_u=6GBAAEAB~&jid=&gjid=&cid=2115578610.1575377917&tid=UA-204785-4&_gid=166720197.1575377917&cd1=Martin%20Maciej&cd5=2019-05-03T08%3A37%3A53%2B02%3A00&cg1=Themenspecials&cg2=4576302&cg3=03-2018&cd2=film&cd6=Artikelseite&cd8=website&cd3=2013197&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=&cd42=bob&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2F14ix&cd41=Content%205&cd45=all&cm75=1&z=1427828207
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:808::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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 19 Nov 2019 09:10:32 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1223285
content-type
image/gif
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 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/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 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
kwissc.js
quiz.stroeermediabrands.de/static/client/
227 KB
80 KB
Script
General
Full URL
https://quiz.stroeermediabrands.de/static/client/kwissc.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
46.253.113.181 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
c872510d9beca2adca7dc000239c71c9d54c03f3fc805833a661de6a23a2e4ec

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
date
Tue, 03 Dec 2019 12:58:37 GMT
content-encoding
gzip
last-modified
Wed, 27 Nov 2019 11:44:39 GMT
server
nginx
etag
W/"5dde61a7-38de5"
content-type
application/javascript
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/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

date
Mon, 20 May 2019 10:19:09 GMT
content-encoding
gzip
x-original-content-length
17937
server
nginx
access-control-allow-origin
*
etag
W/"5ce27eb5-4611"
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
text/javascript
status
200
cache-control
max-age=31536000
content-length
6108
expires
Tue, 19 May 2020 10:19:09 GMT
doT.min.js
cdnjs.cloudflare.com/ajax/libs/dot/1.0.3/
3 KB
2 KB
Script
General
Full URL
https://cdnjs.cloudflare.com/ajax/libs/dot/1.0.3/doT.min.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700::6811:4104 , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
d032695018480726794e6e6eff112f7116a5122bb269d22dc77f3516604a1c1e
Security Headers
Name Value
Strict-Transport-Security max-age=15780000; includeSubDomains

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 GMT
content-encoding
br
cf-cache-status
HIT
age
18483386
cf-ray
53f5b68ffb16cb9c-VIE
status
200
strict-transport-security
max-age=15780000; includeSubDomains
alt-svc
h3-23=":443"; ma=86400
last-modified
Thu, 17 May 2018 09:19:30 GMT
server
cloudflare
etag
W/"5afd4922-d2e"
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept-Encoding
content-type
application/javascript; charset=utf-8
access-control-allow-origin
*
expires
Sun, 22 Nov 2020 12:58:37 GMT
cache-control
public, max-age=30672000
timing-allow-origin
*
served-in-seconds
0.024
adscaleSyncDone
tracking.m6r.eu/sync/
Redirect Chain
  • https://ih.adscale.de/adscale-ih/tpui?tpid=48&tpuid=c691c1b2ce4aa7b0c77ae005c6c76af2&cburl=https%3A%2F%2Ftracking.m6r.eu%2Fsync%2FadscaleSyncDone%3FuserBuyeruid%3Dc691c1b2ce4aa7b0c77ae005c6c76af2%2...
  • https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=c691c1b2ce4aa7b0c77ae005c6c76af2&userId=adscale-user:3712213cbba249619cfb11e8ca564c3e
44 B
528 B
Image
General
Full URL
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=c691c1b2ce4aa7b0c77ae005c6c76af2&userId=adscale-user:3712213cbba249619cfb11e8ca564c3e
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
44
Content-Type
image/gif

Redirect headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:37 GMT
Server
Apache-Coyote/1.1
P3P
CP=NOI PSA OUR
Location
https://tracking.m6r.eu/sync/adscaleSyncDone?userBuyeruid=c691c1b2ce4aa7b0c77ae005c6c76af2&userId=adscale-user:3712213cbba249619cfb11e8ca564c3e
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Length
0
Expires
Tue, 03 Dec 2019 12:58:37 GMT
pubads_impl_2019111801.js
securepubads.g.doubleclick.net/gpt/
159 KB
58 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111801.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/tag/js/gpt.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
sffe /
Resource Hash
03b07f320a1692a2d507465027fffaa6560d19d248c33bb6a5f2c97b75680c1d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 18 Nov 2019 14:07:04 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",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
59620
x-xss-protection
0
expires
Tue, 03 Dec 2019 12:58:37 GMT
session
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/session
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
18.194.252.229 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-18-194-252-229.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
Content-Type
text/plain

Response headers

date
Tue, 03 Dec 2019 12:58:37 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
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%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&jr=&ch=UTF-8&res=1600x1200x24&ifr=false&tz=-60&tws=1600x1200&be=1&bc=hb_pb_2.1.7&dddid=327e301d-e139-4e46-9215-e5b819ee4be8%2C9b67edc9-facf-4141-a792-aa52841bc134%2C09acc535-0d85-42be-a0bd-df1f1f3f627c&nocache=1575377917460&aus=300x250%7C300x600%2C160x600%2C200x600%2C120x600%2C301x601%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.167.2 /
Resource Hash
aba21d1efe464adb5078f827948c4976fe821709b0a2d9414b6790070eaee37c

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
Content-Type
text/plain

Response headers

pragma
no-cache
date
Tue, 03 Dec 2019 12:58:37 GMT
via
1.1 google
server
OXGW/16.167.2
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
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%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=327e301d-e139-4e46-9215-e5b819ee4be8&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.3693598221536869
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.140 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT - The Rubicon Project, Inc., US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
ec64597779d754515551af95d0f7f66ddc2aa9004eb5b401acb8d9725c261188

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:37 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=393
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%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=9b67edc9-facf-4141-a792-aa52841bc134&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.8976806582902426
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.140 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT - The Rubicon Project, Inc., US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
f624a1340df7bd5790c3cc8e9bef71e8e374ca2f165030e9c9f3c5b51548b7c3

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:37 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=398
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%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&tk_flint=pbjs_lite_v2.24.0&x_source.tid=09acc535-0d85-42be-a0bd-df1f1f3f627c&p_screen_res=1600x1200&rp_floor=0.01&rp_secure=1&slots=1&rand=0.6323356752412108
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.140 Frankfurt am Main, Germany, ASN26667 (RUBICONPROJECT - The Rubicon Project, Inc., US),
Reverse DNS
Software
RAS 2.4 /
Resource Hash
29bdf43229a6b2bba4790837d06a94f32c77a43595fb2268f116ee5d3ea4db39

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:37 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=429
Content-Length
241
Expires
Wed, 17 Sep 1975 21:32:10 GMT
prebid
ib.adnxs.com/ut/v3/
373 B
1 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.206 , Netherlands, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
301.bm-nginx-loadbalancer.mgmt.ams1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
0fb9b799443ee998432bc9cd5269cbf0761ee3d2eaa52680d879cd5d64b14f0a
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
Content-Type
text/plain

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:39 GMT
X-Proxy-Origin
144.76.109.30; 144.76.109.30; 301.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.223.56:80
AN-X-Request-Uuid
5957d2b8-9e8d-468f-b1f6-9a2d573d1837
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json; charset=utf-8
Content-Length
373
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
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.206 , Netherlands, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
301.bm-nginx-loadbalancer.mgmt.ams1.adnexus.net
Software
nginx/1.13.4 /
Resource Hash
2acf99a6973c3a8bb60d4f510fcdfad0317956eed7e40d9367f592901cbb96cb
Security Headers
Name Value
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
Content-Type
text/plain

Response headers

Date
Tue, 03 Dec 2019 12:58:39 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; 301.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.48:80
X-XSS-Protection
0
Pragma
no-cache
AN-X-Request-Uuid
92ac9145-0736-49df-894a-44f8faa9a7ba
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
bid
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/bid
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
18.194.252.229 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-18-194-252-229.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
Content-Type
text/plain

Response headers

date
Tue, 03 Dec 2019 12:58:37 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
auction
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/auction
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
18.194.252.229 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-18-194-252-229.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
Content-Type
text/plain

Response headers

date
Tue, 03 Dec 2019 12:58:37 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
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/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:81c::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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 20 Nov 2019 11:28:46 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
1128591
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
30306
x-xss-protection
0
last-modified
Fri, 24 Mar 2017 20:55:54 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
*
cache-control
public, max-age=31536000, stale-while-revalidate=2592000
accept-ranges
bytes
timing-allow-origin
*
expires
Thu, 19 Nov 2020 11:28:46 GMT
submit
lb38.s400.meetrics.net/bb-mx/
43 B
291 B
Image
General
Full URL
https://lb38.s400.meetrics.net/bb-mx/submit?/tpmJBPAAA/whFpBo0F0wFz6BvvA33F3uBnpFnhFukElvBl4F0yFhvBspF2lFz0FylFhtFvzEwlFjpFhsFzvBpzF0tBzlFypFluFz0FylFhtFu0EvtBslFnhFstBvkFlyFtpEssFlnFhsFtoEplFytBlyFmhFoyF0tBpoFytBlzFvBEfpyF+k2FoywAx5AtxAxtAy1AtxAx6Aw4At2A35A2wAwtAyuAxxA1uAytAkzB0zAlkFimFL2wFBLl1FC/2xFZCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FgjEw1FfxB2gAyhFtfF4BEOprFw6lCOqwFw6lClqwF23A52AwwALkmFBTkzFsFAAAAAAAZwSZCBPAAAAAAAAAOAAAAGAAAAAAAZwSZCBBRksFAQtjF9H2ETA
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.206 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h213.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:37 GMT
Server
nginx
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Length
43
Expires
Tue, 03 Dec 2019 12:58:36 GMT
data
lb38.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb38.s400.meetrics.net/data?/tpmJCQAAATkzFARksFAQtjF1uJNSA
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.206 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h213.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:37 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Tue, 03-Dec-19 12:58:36 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=1176
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1176
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:20::681a:4fb , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
8eb1b12b01dcfd0e7d7a431cb5daf50292db75a75516bed8758ba55a2c9de2f0

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 GMT
via
1.1 google
cf-cache-status
HIT
age
1203931
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
53f5b690dc08cba4-VIE
expires
Wed, 18 Nov 2020 14:33:06 GMT
nuggad
ih.adscale.de/
49 B
486 B
Image
General
Full URL
https://ih.adscale.de/nuggad?/nvars/d7=1&d10=1&d2=2&d4=1&d11=3&d8=2&d9=3&d12=2&d1=1&d3=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
72.247.225.134 , United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a72-247-225-134.deploy.static.akamaitechnologies.com
Software
Apache-Coyote/1.1 /
Resource Hash
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:37 GMT
Server
Apache-Coyote/1.1
P3P
CP=NOI PSA OUR
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Content-Type
image/gif
Content-Length
49
Expires
Tue, 03 Dec 2019 12:58:37 GMT
container
tracking.m6r.eu/pixel/
0
376 B
Script
General
Full URL
https://tracking.m6r.eu/pixel/container?pixelId=eaa843f7-840a-4a36-8fdd-3b79df0d4fa0&n127=1&n121=1&n116=0&n104=1&n15=1&n155=1&n106=0&n153=1&n11=1&n120=5&n53=1&n154=1&n125=1&n8=1&n2=2&n137=0&n101=1&n108=1&n54=0&n110=1&n87=1&n149=0&n76=1&n66=1&n60=1&n139=1&n160=0&n107=0&n117=4&n86=0&n147=4&n64=0&n119=6&n22=1&n18=1&n161=1&n126=1&n92=2&n57=1&n77=0&n83=1&n102=0&n105=1&n159=1&n20=1&n80=0&n12=1&n141=0&n157=0&n99=0&n128=1&n118=3&n85=0&n9=3&n23=1&n6=2&n63=0&n138=0&n140=0&n94=2&n111=0&n136=1&n79=1&n93=4&n90=1&n142=0&n7=3&n103=0&n158=0&n124=0&n75=0&n91=1&n46=1&n114=1&n69=0&n10=2&n3=1&n82=1&n84=0&n5=1&n48=1&n109=0&n122=1&n67=1&n115=1&n89=1&n123=2&n17=1&n78=0&n44=1&n81=1&n88=0&n39=1&n156=1&n148=0
Requested by
Host: tracking.m6r.eu
URL: https://tracking.m6r.eu/sync/api?checkcookies=true
Protocol
HTTP/1.1
Security
TLS 1.3, , 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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
P3P
CP="NOI CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
Content-Length
0
Content-Type
text/javascript; charset=utf-8
/
d.agkn.com/iframe/8613/ Frame 7AB9
0
0
Document
General
Full URL
https://d.agkn.com/iframe/8613/?che=85042940&gdpr=1&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F%22%2C%22gdpr%22%3A%221%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
Requested by
Host: js.agkn.com
URL: https://js.agkn.com/prod/v0/tag.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2600:9000:21f3:5a00:19:fc2c:a140:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
Apache-Coyote/1.1 /
Resource Hash

Request headers

:method
GET
:authority
d.agkn.com
:scheme
https
:path
/iframe/8613/?che=85042940&gdpr=1&gdpr_consent=&ref=&bpid=stroeer&c=%7B%22bpid%22%3A%22stroeer%22%2C%22loc%22%3A%22https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F%22%2C%22gdpr%22%3A%221%22%2C%22gdpr_consent%22%3A%22%22%2C%22ref%22%3A%22-1%22%2C%22cid%22%3A%22-1%22%2C%22sid%22%3A%22-1%22%2C%22gen%22%3A%22-1%22%2C%22age%22%3A%22-1%22%2C%22cat%22%3A%22-1%22%2C%22brd%22%3A%22-1%22%7D
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
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
sec-fetch-mode
nested-navigate
referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/

Response headers

status
200
content-type
text/html;charset=UTF-8
content-length
482
cache-control
no-cache, must-revalidate
date
Tue, 03 Dec 2019 12:58:37 GMT
expires
Sat, 01 Jan 2000 00:00:00 GMT
p3p
CP="NOI DSP COR CURa ADMa DEVa TAIa OUR BUS IND UNI COM NAV INT"
pragma
no-cache
server
Apache-Coyote/1.1
set-cookie
ab=0001%3AWa%2BQP%2FVarNd%2BYbQWDdVllqX06bCQQla%2F;Max-Age=31536000;domain=agkn.com;path=/ u=C|0AEAleRh9JXkYfQAAAAAAAg1RAQCADVIBAIA;Max-Age=31536000;domain=agkn.com;path=/
x-cache
Miss from cloudfront
via
1.1 217b7bc19321a4945b685521fa4f11ac.cloudfront.net (CloudFront)
x-amz-cf-pop
FRA2-C2
x-amz-cf-id
1U1WWok6Y73vRgKeTGR3U_ltJ3XmH-q0yhc4esTqrlAPtERQeixr9g==
collect
www.google-analytics.com/
35 B
97 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=935930240&t=event&ni=1&_s=8&dl=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ul=en-us&de=UTF-8&dt=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=visible&el=Amazon%20Prime%20Video%2030%20Tage%20kostenlos%20testen*&_u=6GBAAEAB~&jid=&gjid=&cid=2115578610.1575377917&tid=UA-204785-4&_gid=166720197.1575377917&cd1=Martin%20Maciej&cd5=2019-05-03T08%3A37%3A53%2B02%3A00&cg1=Themenspecials&cg2=4576302&cg3=03-2018&cd2=film&cd6=Artikelseite&cd8=website&cd3=2013197&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=&cd42=bob&cd39=Button&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fs1n5l&cd41=Content%201&cd45=all&cm76=1&z=1184510388
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:808::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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 19 Nov 2019 09:10:32 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1223285
content-type
image/gif
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
collect
www.google-analytics.com/
35 B
97 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=935930240&t=event&ni=1&_s=9&dl=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ul=en-us&de=UTF-8&dt=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Affiliate&ea=visible&el=aktuelle%20und%20beliebte%20Serien*&_u=6GBAAEAB~&jid=&gjid=&cid=2115578610.1575377917&tid=UA-204785-4&_gid=166720197.1575377917&cd1=Martin%20Maciej&cd5=2019-05-03T08%3A37%3A53%2B02%3A00&cg1=Themenspecials&cg2=4576302&cg3=03-2018&cd2=film&cd6=Artikelseite&cd8=website&cd3=2013197&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=&cd42=bob&cd39=Text-link&cd40=https%3A%2F%2Fwww.giga.de%2Fgo%2Fs1jyr&cd41=Content%202&cd45=all&cm76=1&z=1476570270
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:808::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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 19 Nov 2019 09:10:32 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1223285
content-type
image/gif
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
impl.20191130-2-RELEASE.js
cdn.taboola.com/libtrc/
419 KB
118 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/impl.20191130-2-RELEASE.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
f43c9a6473f8db88131adcf90e78eb36c06aaeb7c87cfa7127312a4db59b5985

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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
3GLCgfmm5lISfk7DJ3iG_YR9MHqHU_H0
content-encoding
gzip
age
30
x-cache
HIT
status
200
date
Tue, 03 Dec 2019 12:58:37 GMT
x-amz-replication-status
COMPLETED
content-length
120492
x-amz-id-2
2bxPTa1GpiLBhTZx383pORoHbAq0SbsrdtU19n5iBSahGiTduo4BI89vspEJwLn/7cKBydC1OGY=
x-served-by
cache-fra19169-FRA
last-modified
Sat, 30 Nov 2019 16:11:35 GMT
server
AmazonS3
x-timer
S1575377918.617319,VS0,VE0
etag
"1ece7cd420afa09725398d70cd9c4ac4"
vary
Accept-Encoding
x-amz-request-id
D0F452D698FCD36E
via
1.1 varnish
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
75
x-cache-hits
96
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.5.97.37 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-5-97-37.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
76c393f564f53c19e795307e622edc8657a603f7a816c2646385697286d11313

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 GMT
Content-Encoding
gzip
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
private, no-transform, max-age=86400
Connection
keep-alive
Content-Length
902
Expires
Wed, 04 Dec 2019 12:58:37 GMT
ads
securepubads.g.doubleclick.net/gampad/
13 KB
5 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2134285338763390&correlator=3060650938120698&output=ldjh&impl=fif&adsid=NT&vrg=2019111801&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191203&iu=4444%2Fgiga.de_sd%2Ffilm_artikel&sz=800x450%7C580x500%7C580x360%7C480x360%7C42x31&scp=as%3Dposterad%26adslot%3Dposterad%26pc%3D1%26af%3Dptad%2Cintxspt&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dfilm%26smb-platform%3D%26smb-content%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D18%26smb-hour%3D13%26yt%3D0%26adset%3Dbrsl%26mbrid%3Dc691c1b2ce4aa7b0c77ae005c6c76af2%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-1%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-1%252Cn155-1%252Cn106-0%252Cn153-1%252Cn11-1%252Cn120-5%252Cn53-1%252Cn154-1%252Cn125-1%252Cn8-1%252Cn2-2%252Cn137-0%252Cn101-1%252Cn108-1%252Cn54-0%252Cn110-1%252Cn87-1%252Cn149-0%252Cn76-1%252Cn66-1%252Cn60-1%252Cn139-1%252Cn160-0%252Cn107-0%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-6%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-1%252Cn92-2%252Cn57-1%252Cn77-0%252Cn83-1%252Cn102-0%252Cn105-1%252Cn159-1%252Cn20-1%252Cn80-0%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-0%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-3%252Cn23-1%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-1%252Cn79-1%252Cn93-4%252Cn90-1%252Cn142-0%252Cn7-3%252Cn103-0%252Cn158-0%252Cn124-0%252Cn75-0%252Cn91-1%252Cn46-1%252Cn114-1%252Cn69-0%252Cn10-2%252Cn3-1%252Cn82-1%252Cn84-0%252Cn5-1%252Cn48-1%252Cn109-0%252Cn122-1%252Cn67-1%252Cn115-1%252Cn89-1%252Cn123-2%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-0%26keywords%3D&cookie_enabled=1&bc=31&abxe=1&lmt=1575377917&dt=1575377917659&dlt=1575377916876&idt=763&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2789910476&uci=1&ifi=2&u_tz=60&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%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&dssz=72&icsg=64322502969376&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=625x0&msz=800x450&ga_vid=2115578610.1575377917&ga_sid=1575377917&ga_hid=935930240&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111801.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
47c51e501d2b66d6bab72a5e78746c270fc58b0d93fb56fc492afaffbe19cf88
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Origin
https://www.giga.de

Response headers

date
Tue, 03 Dec 2019 12:58:37 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",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
4768
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_2019111801.js
securepubads.g.doubleclick.net/gpt/
65 KB
25 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019111801.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111801.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
sffe /
Resource Hash
23f5a3eca6fec1f8380dd45a87da65ee9ab4c93d4602403dc26b18e2afeb201f
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Mon, 18 Nov 2019 14:07:04 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",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
25219
x-xss-protection
0
expires
Tue, 03 Dec 2019 12:58:37 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-36/html/
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-36/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111801.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:820::2001 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

ads
securepubads.g.doubleclick.net/gampad/
3 KB
2 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2134285338763390&correlator=3060650938120698&output=ldjh&impl=fif&adsid=NT&vrg=2019111801&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191203&iu=4444%2Fgiga.de_sd%2Ffilm_artikel&sz=1x1&ists=1&scp=as%3Dout_of_page%26adslot%3Dout_of_page%26pc%3D1%26af%3Dtickerad&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dfilm%26smb-platform%3D%26smb-content%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D18%26smb-hour%3D13%26yt%3D0%26adset%3Dbrsl%26mbrid%3Dc691c1b2ce4aa7b0c77ae005c6c76af2%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-1%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-1%252Cn155-1%252Cn106-0%252Cn153-1%252Cn11-1%252Cn120-5%252Cn53-1%252Cn154-1%252Cn125-1%252Cn8-1%252Cn2-2%252Cn137-0%252Cn101-1%252Cn108-1%252Cn54-0%252Cn110-1%252Cn87-1%252Cn149-0%252Cn76-1%252Cn66-1%252Cn60-1%252Cn139-1%252Cn160-0%252Cn107-0%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-6%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-1%252Cn92-2%252Cn57-1%252Cn77-0%252Cn83-1%252Cn102-0%252Cn105-1%252Cn159-1%252Cn20-1%252Cn80-0%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-0%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-3%252Cn23-1%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-1%252Cn79-1%252Cn93-4%252Cn90-1%252Cn142-0%252Cn7-3%252Cn103-0%252Cn158-0%252Cn124-0%252Cn75-0%252Cn91-1%252Cn46-1%252Cn114-1%252Cn69-0%252Cn10-2%252Cn3-1%252Cn82-1%252Cn84-0%252Cn5-1%252Cn48-1%252Cn109-0%252Cn122-1%252Cn67-1%252Cn115-1%252Cn89-1%252Cn123-2%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-0%26keywords%3D&cookie_enabled=1&bc=31&abxe=1&lmt=1575377917&dt=1575377917669&dlt=1575377916876&idt=763&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2872708988&uci=2&ifi=3&u_tz=60&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%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&dssz=73&icsg=64322502969376&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1585x0&msz=1x1&ga_vid=2115578610.1575377917&ga_sid=1575377917&ga_hid=935930240&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111801.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
f90124131fbd91439b9215f735fece7a698d64650f9e6ed3b7c7f315ae80e883
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Origin
https://www.giga.de

Response headers

date
Tue, 03 Dec 2019 12:58:37 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",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
1870
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
ads
securepubads.g.doubleclick.net/gampad/
13 KB
5 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2134285338763390&correlator=3060650938120698&output=ldjh&impl=fif&adsid=NT&vrg=2019111801&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191203&iu=4444%2Fgiga.de_sd%2Ffilm_artikel&sz=20x10%7C30x10%7C40x10%7C80x10%7C848x90%7C968x90%7C770x250%7C800x250%7C970x250%7C468x60%7C728x90%7C728x180%7C1000x150%7C31x31&scp=as%3Dbanner%26adslot%3Dbanner%26pc%3D1%26amznbid%3D2%26amzniid%3D%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A20918.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A20918.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A20918.scenario%253Adefault%26yieldlove_meta%3Dpid%253A20918.sb%253Af%26yieldlove_pid%3D20918%26yieldlove_hb_sucbid%3Dfalse%26hb_unit%3Dbanner%26af%3Df2x1%2Cf3x1%2Cf4x1%2Cf8x1%2Cwp%2Cfirepl%2Cbb%2Cfullb%2Cleadb%2Cdleadb%2Cvidwa%2Cbrabo%2Cfufrad%2Cfloor%2CvideoTakeover&eri=1&cust_params=tagm%3Dmt%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dfilm%26smb-platform%3D%26smb-content%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D18%26smb-hour%3D13%26yt%3D0%26adset%3Dbrsl%26mbrid%3Dc691c1b2ce4aa7b0c77ae005c6c76af2%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-1%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-1%252Cn155-1%252Cn106-0%252Cn153-1%252Cn11-1%252Cn120-5%252Cn53-1%252Cn154-1%252Cn125-1%252Cn8-1%252Cn2-2%252Cn137-0%252Cn101-1%252Cn108-1%252Cn54-0%252Cn110-1%252Cn87-1%252Cn149-0%252Cn76-1%252Cn66-1%252Cn60-1%252Cn139-1%252Cn160-0%252Cn107-0%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-6%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-1%252Cn92-2%252Cn57-1%252Cn77-0%252Cn83-1%252Cn102-0%252Cn105-1%252Cn159-1%252Cn20-1%252Cn80-0%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-0%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-3%252Cn23-1%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-1%252Cn79-1%252Cn93-4%252Cn90-1%252Cn142-0%252Cn7-3%252Cn103-0%252Cn158-0%252Cn124-0%252Cn75-0%252Cn91-1%252Cn46-1%252Cn114-1%252Cn69-0%252Cn10-2%252Cn3-1%252Cn82-1%252Cn84-0%252Cn5-1%252Cn48-1%252Cn109-0%252Cn122-1%252Cn67-1%252Cn115-1%252Cn89-1%252Cn123-2%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-0%26keywords%3D&cookie_enabled=1&bc=31&abxe=1&lmt=1575377917&dt=1575377917678&dlt=1575377916876&idt=763&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=3115525706&uci=3&ifi=4&u_tz=60&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%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&dssz=73&icsg=64322502969376&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x0&msz=20x10&ga_vid=2115578610.1575377917&ga_sid=1575377917&ga_hid=935930240&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111801.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
3ed46201cc86ee90919161ca890da9150ae66e57b74cd9d539cb896d3281dc1c
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Origin
https://www.giga.de

Response headers

date
Tue, 03 Dec 2019 12:58:38 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",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
5212
x-xss-protection
0
google-lineitem-id
5209200161
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138292660594
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/
9 KB
4 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=2134285338763390&correlator=3060650938120698&output=ldjh&impl=fif&adsid=NT&vrg=2019111801&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191203&iu=4444%2Fgiga.de_sd%2Ffilm_artikel&sz=10x40%7C10x30%7C10x20%7C500x600%7C120x600%7C160x600%7C200x600%7C300x600%7C770x200%7C33x31&scp=as%3Dsky%26adslot%3Dsky%26rfree%3D200-299%26pc%3D1%26amznbid%3D2%26amzniid%3D%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A19051.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A19051.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A19051.scenario%253Adefault%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%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dfilm%26smb-platform%3D%26smb-content%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D18%26smb-hour%3D13%26yt%3D0%26adset%3Dbrsl%26mbrid%3Dc691c1b2ce4aa7b0c77ae005c6c76af2%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-1%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-1%252Cn155-1%252Cn106-0%252Cn153-1%252Cn11-1%252Cn120-5%252Cn53-1%252Cn154-1%252Cn125-1%252Cn8-1%252Cn2-2%252Cn137-0%252Cn101-1%252Cn108-1%252Cn54-0%252Cn110-1%252Cn87-1%252Cn149-0%252Cn76-1%252Cn66-1%252Cn60-1%252Cn139-1%252Cn160-0%252Cn107-0%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-6%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-1%252Cn92-2%252Cn57-1%252Cn77-0%252Cn83-1%252Cn102-0%252Cn105-1%252Cn159-1%252Cn20-1%252Cn80-0%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-0%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-3%252Cn23-1%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-1%252Cn79-1%252Cn93-4%252Cn90-1%252Cn142-0%252Cn7-3%252Cn103-0%252Cn158-0%252Cn124-0%252Cn75-0%252Cn91-1%252Cn46-1%252Cn114-1%252Cn69-0%252Cn10-2%252Cn3-1%252Cn82-1%252Cn84-0%252Cn5-1%252Cn48-1%252Cn109-0%252Cn122-1%252Cn67-1%252Cn115-1%252Cn89-1%252Cn123-2%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-0%26keywords%3D&cookie_enabled=1&bc=31&abxe=1&lmt=1575377917&dt=1575377917683&dlt=1575377916876&idt=763&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=2586579414&uci=4&ifi=5&u_tz=60&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%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&dssz=73&icsg=64322502969376&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=0x0&msz=10x40&ga_vid=2115578610.1575377917&ga_sid=1575377917&ga_hid=935930240&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111801.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
12af38f7094522f639ce5c48e15ae2a09d215c4c64b4457f7ac5ac391f23da8b
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Origin
https://www.giga.de

Response headers

date
Tue, 03 Dec 2019 12:58:38 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",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
3701
x-xss-protection
0
google-lineitem-id
5209200161
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138292660726
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=2134285338763390&correlator=3060650938120698&output=ldjh&impl=fif&adsid=NT&vrg=2019111801&guci=1.2.0.0.2.2.0.0&plat=1%3A536903688%2C2%3A553680904%2C8%3A134250504&sc=1&sfv=1-0-36&ecs=20191203&iu=4444%2Fgiga.de_sd%2Ffilm_artikel&sz=10x20%7C10x10%7C300x250%7C34x31&scp=as%3Drectangle%26adslot%3Drectangle%26pc%3D1%26amznbid%3D2%26amzniid%3D%26amznp%3D2%26amznsz%3D0x0%26yieldlove_reload%3Dpid%253A9501.reload%253Afalse%26yieldlove_meta_reload%3Dpid%253A9501.reload%253Afalse%26yieldlove_reloads%3D0%26yieldlove_reload_count%3D0%26yieldlove_reloaded%3Dnever%26yieldlove_is_reloaded%3Dnever%26yieldlove_ab%3Ddefault%26yieldlove_meta_ab%3Dpid%253A9501.scenario%253Adefault%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%26browserapp%3Dchrome%26viewportWidth%3D1581-1680%26viewportHeight%3D1153-1200%26tagtype%3Dasync%26smb-source%3Ddirect%26smb-imp%3D1%26smb-channel%3Dfilm%26smb-platform%3D%26smb-content%3DThemenspecials%26smb-search%3Dfalse%26smb-social%3Dfalse%26smb-test%3D18%26smb-hour%3D13%26yt%3D0%26adset%3Dbrsl%26mbrid%3Dc691c1b2ce4aa7b0c77ae005c6c76af2%26mbrseg%3Dff6482ed%252Cb3838f1f%252C78315b65%26nuggad%3Dn127-1%252Cn121-1%252Cn116-0%252Cn104-1%252Cn15-1%252Cn155-1%252Cn106-0%252Cn153-1%252Cn11-1%252Cn120-5%252Cn53-1%252Cn154-1%252Cn125-1%252Cn8-1%252Cn2-2%252Cn137-0%252Cn101-1%252Cn108-1%252Cn54-0%252Cn110-1%252Cn87-1%252Cn149-0%252Cn76-1%252Cn66-1%252Cn60-1%252Cn139-1%252Cn160-0%252Cn107-0%252Cn117-4%252Cn86-0%252Cn147-4%252Cn64-0%252Cn119-6%252Cn22-1%252Cn18-1%252Cn161-1%252Cn126-1%252Cn92-2%252Cn57-1%252Cn77-0%252Cn83-1%252Cn102-0%252Cn105-1%252Cn159-1%252Cn20-1%252Cn80-0%252Cn12-1%252Cn141-0%252Cn157-0%252Cn99-0%252Cn128-1%252Cn118-3%252Cn85-0%252Cn9-3%252Cn23-1%252Cn6-2%252Cn63-0%252Cn138-0%252Cn140-0%252Cn94-2%252Cn111-0%252Cn136-1%252Cn79-1%252Cn93-4%252Cn90-1%252Cn142-0%252Cn7-3%252Cn103-0%252Cn158-0%252Cn124-0%252Cn75-0%252Cn91-1%252Cn46-1%252Cn114-1%252Cn69-0%252Cn10-2%252Cn3-1%252Cn82-1%252Cn84-0%252Cn5-1%252Cn48-1%252Cn109-0%252Cn122-1%252Cn67-1%252Cn115-1%252Cn89-1%252Cn123-2%252Cn17-1%252Cn78-0%252Cn44-1%252Cn81-1%252Cn88-0%252Cn39-1%252Cn156-1%252Cn148-0%26keywords%3D&cookie_enabled=1&bc=31&abxe=1&lmt=1575377917&dt=1575377917687&dlt=1575377916876&idt=763&frm=20&biw=1585&bih=1200&oid=3&adx=-12245933&ady=-12245933&adk=1946589169&uci=5&ifi=6&u_tz=60&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%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&dssz=73&icsg=64322502969376&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x0&msz=10x20&ga_vid=2115578610.1575377917&ga_sid=1575377917&ga_hid=935930240&fws=128&ohw=0
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_2019111801.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
aaf4e5c88ec1e577a13ba8c49f7c556b9b9139f66952624c5bef7159db8d2632
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Origin
https://www.giga.de

Response headers

date
Tue, 03 Dec 2019 12:58:38 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",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
3612
x-xss-protection
0
google-lineitem-id
5199031868
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138290833185
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
013e2a26-c271-4820-86e9-6b7ba44cdfa1
quiz.stroeermediabrands.de/pub/quizzes/
8 KB
2 KB
XHR
General
Full URL
https://quiz.stroeermediabrands.de/pub/quizzes/013e2a26-c271-4820-86e9-6b7ba44cdfa1
Requested by
Host: quiz.stroeermediabrands.de
URL: https://quiz.stroeermediabrands.de/static/client/kwissc.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
46.253.113.181 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx /
Resource Hash
c0d3b7161f73aec5b644854dbd8252ba88a438fd2c34e1dff48c7d47cf41cde9

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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Origin
https://www.giga.de

Response headers

date
Tue, 03 Dec 2019 12:58:37 GMT
content-encoding
gzip
server
nginx
status
200
access-control-allow-methods
GET, POST, OPTIONS
content-type
application/json
access-control-allow-origin
*
access-control-expose-headers
Content-Length,Content-Range,Content-Type,Expires
access-control-allow-headers
DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range
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/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2001:4de0:ac19::1:b:3a , Netherlands, ASN20446 (HIGHWINDS3 - Highwinds Network Group, Inc., US),
Reverse DNS
Software
/
Resource Hash
53964478a7c634e8dad34ecc303dd8048d00dce4993906de1bacf67f663486ef

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 GMT
content-encoding
gzip
last-modified
Wed, 12 Dec 2018 18:33:51 GMT
access-control-allow-origin
*
etag
"1544639631"
vary
Accept-Encoding
x-cache
HIT
content-type
text/javascript; charset=utf-8
status
200
cache-control
public, max-age=31536000
x-hello-human
Say hello back! @getBootstrapCDN on Twitter
accept-ranges
bytes
timing-allow-origin
*
content-length
9832
t.png
gocp.stroeermediabrands.de/
98 B
355 B
Image
General
Full URL
https://gocp.stroeermediabrands.de/t.png?title=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&canonicalUrl=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&url=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&contentPieceId=4576302&publishDate=2018-03-06T14%3A26%3A28%2B01%3A00&_=1575377917734.-96362983
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 GMT
Last-Modified
Tue, 03 Dec 2019 11:40:51 GMT
ETag
"5de649c3-62"
Content-Type
image/png
Cache-Control
max-age=31536000, public
X-Machine
hn86 gocp env
Accept-Ranges
bytes
Content-Length
98
pixel
tracking.m6r.eu/consent/
44 B
209 B
Image
General
Full URL
https://tracking.m6r.eu/consent/pixel?nocookie=true&nosync=true&consent=true
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
104.109.82.87 , Netherlands, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
a104-109-82-87.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 GMT
Cache-Control
no-cache
Server
nginx
Connection
keep-alive
Content-Length
44
Content-Type
image/gif
config.js
confiant-integrations.global.ssl.fastly.net/2DPge-WVhZFIVEVo0laRH9eF5JI/gpt_and_prebid/
44 KB
11 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.113.194 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
eabf1e513f3a3a42429be6d8e0bb8163ce61ac7ae2079f9aa656f58335b7489b

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 GMT
Content-Encoding
gzip
Age
1187
X-Cache
HIT
Connection
keep-alive
Content-Length
10787
x-amz-id-2
hh5qJIDNgo6Cb9Hlcg6aQ4PEg0+b3UpipbZJ8lxec/U4S7y8MiBc1z4Qdt4yTwqkpJLmx9PZzmk=
X-Served-By
cache-hhn4059-HHN
Last-Modified
Tue, 03 Dec 2019 12:34:30 GMT
Server
AmazonS3
X-Timer
S1575377918.804354,VS0,VE0
ETag
"2df2d039360ab322ef37cef2ff964d2a"
x-amz-request-id
D3A8EF18EF4C22C2
Via
1.1 varnish
Cache-Control
public, max-age=900, stale-while-revalidate=3600
Accept-Ranges
bytes
Content-Type
text/javascript
X-Cache-Hits
3361
97941c7483a90e80b26599c518_ciA2NTAgMzY1LjYyNQNkNzk0NzMwMDY5MQ==.jpg
quiz-media.stroeermediabrands.de/dd/37/e1/
34 KB
35 KB
Image
General
Full URL
https://quiz-media.stroeermediabrands.de/dd/37/e1/97941c7483a90e80b26599c518_ciA2NTAgMzY1LjYyNQNkNzk0NzMwMDY5MQ==.jpg
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
51ae405ef31ebea30c1fac7a7645a14a85f62095fdfc06c8c5ce4ea73caade0f
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 08 Nov 2019 07:09:30 GMT
x-content-type-options
nosniff
age
2180947
filer-source
eab2dd45581fd4944252eec07b89b1ba23efd1fe627275dcd346d712118f0559
x-cache
HIT
status
200
accept-language
bytes
content-length
35256
x-xss-protection
1; mode=block
last-modified
Fri, 08 Nov 2019 07:09:30 GMT
server
nginx/1.10.3
filer-attr
W1s1NDksMzY2XSwic3RpLXYzIixbIkZSQS0xIl0sWyJGUkItMSJdXQ==
content-type
image/jpeg
access-control-allow-origin
*
access-control-expose-headers
Content-Length
cache-control
public, max-age=2592000, no-transform
expires
Sun, 08 Dec 2019 07:09:30 GMT
78410589
videos.giga.de/embed/ Frame 34FB
9 KB
3 KB
Document
General
Full URL
https://videos.giga.de/embed/78410589?autoplay=0
Requested by
Host: ajax.googleapis.com
URL: https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.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
37771301c81ae14de26883a0cb2b58f21e18dc944f036c5590e8b37231b396be

Request headers

:method
GET
:authority
videos.giga.de
:scheme
https
:path
/embed/78410589?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
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
sec-fetch-mode
nested-navigate
referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
accept-encoding
gzip, deflate, br
cookie
ioam2018=000e51aa00fcb3a495de65bfc:1601557116932:1575377916932:.giga.de:2:giga:film_content:noevent:1575377916932:90fpja; _ga=GA1.2.2115578610.1575377917; _gid=GA1.2.166720197.1575377917; _gat_gt1=1
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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/

Response headers

status
200
server
nginx/1.14.1
date
Tue, 03 Dec 2019 12:58:37 GMT
content-type
text/html;charset=UTF-8
link
<https://videos.giga.de/embed/78410589>; rel="canonical"
content-encoding
gzip
b2
sb.scorecardresearch.com/
Redirect Chain
  • https://sb.scorecardresearch.com/b?c1=7&c2=13739933&c3=20121515121&ns__t=1575377917830&ns_c=UTF-8&cv=3.1e&c8=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E...
  • https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1575377917830&ns_c=UTF-8&cv=3.1e&c8=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%...
0
248 B
Image
General
Full URL
https://sb.scorecardresearch.com/b2?c1=7&c2=13739933&c3=20121515121&ns__t=1575377917830&ns_c=UTF-8&cv=3.1e&c8=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&c7=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&c9=
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.5.97.37 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-5-97-37.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:37 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=1575377917830&ns_c=UTF-8&cv=3.1e&c8=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&c7=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&c9=
Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:37 GMT
Cache-Control
private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Connection
keep-alive
Content-Length
0
Expires
Mon, 01 Jan 1990 00:00:00 GMT
json
trc.taboola.com/stroeer-smb-giga/trc/3/
17 KB
7 KB
Script
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/trc/3/json?tim=13%3A58%3A37.865&lti=deflated&data=%7B%22id%22%3A146%2C%22ii%22%3A%22%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%22%2C%22it%22%3A%22text%22%2C%22sd%22%3Anull%2C%22ui%22%3Anull%2C%22uifp%22%3Anull%2C%22vi%22%3A1575377917313%2C%22cv%22%3A%2220191130-2-RELEASE%22%2C%22uiv%22%3A%22default%22%2C%22u%22%3A%22https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%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%3A5275%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%3A4592.125%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.20191130-2-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
b8e39cd9d9fd668f0fa22bc541e8ba3aa8d58ad5e6c37aa81d671dc47ce280f3

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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-vcl-time-ms
619
date
Tue, 03 Dec 2019 12:58:38 GMT
content-encoding
gzip
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"
status
200
via
1.1 varnish
x-served-by
cache-fra19169-FRA
server
nginx
x-timer
S1575377918.869924,VS0,VE619
vary
Accept-Encoding
content-type
application/javascript; charset=utf-8
access-control-allow-origin
*
access-control-allow-credentials
true
accept-ranges
bytes
x-cache-hits
0
/
d.nativendo.de/cds/delivery/get/
3 KB
2 KB
Script
General
Full URL
https://d.nativendo.de/cds/delivery/get/?url=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1176
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
30fb61ad4bb1e361d27475f94e0984897b12089643c2dda1db5d360875e8d14e

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Dec 2019 12:58:37 GMT
content-encoding
gzip
last-modified
Tue, 03 Dec 2019 12:58:37 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
1122
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
defaultImage.gif
cdn.stroeerdigitalmedia.de/Ads/ Frame 496A
Redirect Chain
  • https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjst0B3cRUNHord6206w8tj5okc_gI07DLspo18AF5QpN5iqK1sH3_31dNhrU9wX2psWNiWs2anDfrcmKNH8oSVoz6G9_gkPhTZ1uFo6O5ALgJ7doAQz_UBAonYzDPdXQduR8FN-1I6hTR...
  • https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
49 B
344 B
Image
General
Full URL
https://cdn.stroeerdigitalmedia.de/Ads/defaultImage.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.3, , 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/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 GMT
last-modified
Wed, 29 Nov 2006 13:15:04 GMT
server
Apache
access-control-allow-origin
*
etag
"3260aadd174a1ebd50d0bd967c8fadea:1494950026"
access-control-max-age
86400
access-control-allow-methods
GET,HEAD
content-type
image/gif
status
200
cache-control
max-age=364771
access-control-allow-credentials
false
accept-ranges
bytes
access-control-allow-headers
*
content-length
49
expires
Sat, 07 Dec 2019 18:18:08 GMT

Redirect headers

date
Tue, 03 Dec 2019 12:58:37 GMT
x-content-type-options
nosniff
content-type
text/html; charset=UTF-8
server
cafe
access-control-allow-origin
*
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"
status
302
cache-control
private
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
wrap.js
confiant-integrations.global.ssl.fastly.net/prebid/201911261602/
30 KB
12 KB
Script
General
Full URL
https://confiant-integrations.global.ssl.fastly.net/prebid/201911261602/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.113.194 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
8db624e21c35d3f1626601a61acb544d8dc307f820c325f945d4a2b60cb2c2eb

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 GMT
Content-Encoding
gzip
Age
174
X-Cache
HIT
Connection
keep-alive
Content-Length
11494
x-amz-id-2
+MmXd7I2qh9ftuh+IUtpjMNBmQsaYsvYI7hRtqEvVua62F21vaKoDApOaArSMmvY1h8aNU5kYy0=
X-Served-By
cache-hhn4058-HHN
Last-Modified
Tue, 26 Nov 2019 21:02:28 GMT
Server
AmazonS3
X-Timer
S1575377918.899196,VS0,VE0
ETag
"2c466e3e28fad37f3a2d6af83dcf47bf"
x-amz-request-id
8136804A1BFAB3A6
Via
1.1 varnish
Cache-Control
public, max-age=31536000
Accept-Ranges
bytes
Content-Type
application/javascript; charset=utf-8
X-Cache-Hits
376
videojs-c972511a.min.js
videos.giga.de/dist/js/embed/bundle/ Frame 34FB
619 KB
206 KB
Script
General
Full URL
https://videos.giga.de/dist/js/embed/bundle/videojs-c972511a.min.js
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/embed/78410589?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
4532f79dd4221b45bb4f0008abce433420eeb875e88a9ea119063b90adbb6cb5

Request headers

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

Response headers

date
Tue, 03 Dec 2019 12:58:37 GMT
content-encoding
gzip
last-modified
Wed, 20 Nov 2019 11:38:10 GMT
server
nginx/1.14.1
etag
W/"5dd525a2-9aae0"
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 34FB
273 KB
93 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/78410589?autoplay=0
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:816::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
5fa6833aaa4245a425c0bf047e200f7be29f46246239529a6e4ac8085736671d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

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

Response headers

date
Tue, 03 Dec 2019 12:58:37 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",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
94888
x-xss-protection
0
expires
Tue, 03 Dec 2019 12:58:37 GMT
videojs-f50f7a8d.css
videos.giga.de/dist/css/ Frame 34FB
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/78410589?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

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

Response headers

date
Tue, 03 Dec 2019 12:58:37 GMT
content-encoding
gzip
last-modified
Wed, 20 Nov 2019 11:38:10 GMT
server
nginx/1.14.1
etag
W/"5dd525a2-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 34FB
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/78410589?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

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

Response headers

date
Tue, 03 Dec 2019 12:58:37 GMT
last-modified
Thu, 04 Jul 2019 08:23:54 GMT
server
nginx/1.14.1
etag
"5d1db79a-3f7"
content-type
image/svg+xml
status
200
cache-control
max-age=7776000
accept-ranges
bytes
content-length
1015
expires
Mon, 02 Mar 2020 12:58:37 GMT
0
d.nativendo.de/cds/delivery/render/559sgxds/2s8hs/6e134/9apkw/
3 KB
1 KB
Script
General
Full URL
https://d.nativendo.de/cds/delivery/render/559sgxds/2s8hs/6e134/9apkw/0
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1176
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
463ae7ce60933744e6d01d7b90bd3900f02bcd4f5ae97b91e3ba0cf1acf52a66

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Dec 2019 12:58:37 GMT
content-encoding
gzip
last-modified
Tue, 03 Dec 2019 12:58:37 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
1193
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
0
d.nativendo.de/cds/delivery/render/559sgxds/182yo/6e8e8/9bny8/
3 KB
1 KB
Script
General
Full URL
https://d.nativendo.de/cds/delivery/render/559sgxds/182yo/6e8e8/9bny8/0
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1176
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
c1f50d02c61b8c4117a0dca2f615697d34c74a1de958e3ef8cde8b663112d2ad

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Dec 2019 12:58:37 GMT
content-encoding
gzip
last-modified
Tue, 03 Dec 2019 12:58:37 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
1200
via
1.1 google
expires
Sat, 26 Jul 1997 05:00:00 GMT
7c3e7965-e114-4797-9bd0-b069ed4ffcf9.png
c.nativendo.de/cdn/asset/media/crt/56025/8/5/
15 KB
15 KB
Image
General
Full URL
https://c.nativendo.de/cdn/asset/media/crt/56025/8/5/7c3e7965-e114-4797-9bd0-b069ed4ffcf9.png?v=1575038365
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:20::681a:4fb , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
65edc2b88e65c2513f32a712868d68482ad33e098a8b449717d9e9553888c1cc

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 GMT
via
1.1 google
cf-cache-status
HIT
age
215455
cf-polished
origSize=15936, status=webp_bigger
status
200
alt-svc
clear
content-length
15254
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
53f5b69329a1cba4-VIE
expires
Sun, 29 Nov 2020 23:04:21 GMT
b635dcd8-9892-4bd9-bb61-ade64839d331.png
c.nativendo.de/cdn/asset/media/crt/55884/8/5/
24 KB
24 KB
Image
General
Full URL
https://c.nativendo.de/cdn/asset/media/crt/55884/8/5/b635dcd8-9892-4bd9-bb61-ade64839d331.png?v=1575034950
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2606:4700:20::681a:4fb , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
17d01f74488cbd29d651ec014ec2c25c9e4cf86f942090a2fbbb5e501faed76f

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:37 GMT
via
1.1 google
cf-cache-status
HIT
age
221405
cf-polished
origSize=26617, status=webp_bigger
status
200
alt-svc
clear
content-length
24746
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
53f5b69329b2cba4-VIE
expires
Sun, 29 Nov 2020 23:04:59 GMT
a63f5aaf-bba0-4469-8581-8b6e3b532918
t.nativendo.de/cds/tracking/event/
0
170 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/a63f5aaf-bba0-4469-8581-8b6e3b532918?noc=559sgxds&aid=182yo&cid=6e8e8&cti=9bny8&imp=6&t=ad%2Fview&ar=0&url=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ts=1575377918
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1176
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Dec 2019 12:58:37 GMT
via
1.1 google
last-modified
Tue, 03 Dec 2019 12:58:37 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
a63f5aaf-bba0-4469-8581-8b6e3b532918
t.nativendo.de/cds/tracking/event/
0
172 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/a63f5aaf-bba0-4469-8581-8b6e3b532918?noc=559sgxds&aid=2s8hs&cid=6e134&cti=9apkw&imp=2&t=ad%2Fview&ar=0&url=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ts=1575377918
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1176
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Dec 2019 12:58:37 GMT
via
1.1 google
last-modified
Tue, 03 Dec 2019 12:58:37 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 6EDB
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuszRmLAmA6Ujn4E8A-mrJkaulxwViVl9O1aHervknTxlhGBlHH538q-E6fI55eDr24i1JhPEPBA1QNWnhLbj6B6In5cSdN14tmPzPOCoqYIgrI9CpYHbO6Oav0bw4NalaXL3gir3hQiYWNWrAdC_Ob1kU8ba9vAy8e-KgJuWftNpZJ8ouAZuQnxVunfOHgrKtIvimzRiUPX_TMiBlY206cD7A_ORpsYf1FpczQGWSsVJyv1qYuLFjVJoktr7AH1MQ_cYP-gu6Gg8RMWIvy&sig=Cg0ArKJSzHYzvN72HE5UEAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Tue, 03 Dec 2019 12:58:37 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",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
video.php
media.oadts.com/www/delivery/ Frame 6EDB
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/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
5dbbdc8fcb6ffca57165278f6620f2587433608ff9b0fe88c646a8421b6f010d

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:38 GMT
Cache-Control
private, max-age=0, no-cache
Expires
Mon, 26 Jul 1997 05:00:00 GMT
Server
lighttpd/1.4.45
Content-Length
110291
Content-type
text/javascript; charset=UTF-8
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 6EDB
76 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019111801.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
e48c4975b293be404aa17aca3844095d270597494ffabe5316cad8c3e45d5004
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1573858490126243"
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",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29138
x-xss-protection
0
expires
Tue, 03 Dec 2019 12:58:38 GMT
le.php
media.oadts.com/www/delivery/ Frame 6EDB
43 B
400 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=9&cb=46552788528
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:38 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 6EDB
43 B
400 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=10&cb=98015656658
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:38 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 6EDB
43 B
400 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=11&cb=81735996760
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:38 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
avc.php
media.oadts.com/www/delivery/ Frame 6EDB
12 KB
13 KB
XHR
General
Full URL
https://media.oadts.com/www/delivery/avc.php?zoneid=5074&pw=100%25&ph=100%25&msgId=atg7303596753&startmuted=1&cb=0.2186145714754104&loc=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%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
c835e222d8b3ebd4420d7d7ae757cfd0f3627c11d5bebb9e703662e24a7615f9

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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Origin
https://www.giga.de

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:38 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
12555
Expires
Mon, 26 Jul 1997 05:00:00 GMT
le.php
media.oadts.com/www/delivery/ Frame 6EDB
43 B
400 B
Image
General
Full URL
https://media.oadts.com/www/delivery/le.php?zoneid=5074&bannerid=0&eventId=12&cb=83078523200
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:38 GMT
Server
lighttpd/1.4.45
P3P
CP="CUR ADM OUR NOR STA NID"
Cache-Control
private, max-age=0, no-cache
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT
getAd
video-adserver.ibillboard.com/ Frame 6EDB
1 KB
1 KB
XHR
General
Full URL
https://video-adserver.ibillboard.com/getAd?tagid=346a3f1b-2167-4e54-8af3-4a8d2910a189&bust=c7629f9fcd&ref=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F
Requested by
Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.168.44.125 Prague, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
host-125.billboard.cz
Software
ibillboard /
Resource Hash
300a8f36e78e494d1a1428c4695fe9a611ae7a5758a5c66eae4437d2f2af5767

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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Origin
https://www.giga.de

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:38 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
1043
Expires
Tue, 01 Jan 1991 00:00:00 GMT
le.php
media.oadts.com/www/delivery/ Frame 6EDB
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.1197444562747434&loc=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2Fhttps%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&dur=0
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:38 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
vast
tracking.m6r.eu/sync/ Frame 6EDB
500 B
936 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%3Dc7629f9fcd%26ref%3Dhttps%253A%252F%252Fwww.giga.de%252Fextra%252Flivestream%252Fspecials%252Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%252F%26ngresponse%3Dtrue%26nu%3D%24%24DMP_SEGMENTS_NUGGAD%24%24%26impid%3D476d9ac6-7fc0-4ecd-a029-b8cee0810fd3
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.3, , 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
7efa3776e9fae7550b1ce0fb32d1b75e018bd7566c10c68c2f6ffb693315b267

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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Origin
https://www.giga.de

Response headers

Date
Tue, 03 Dec 2019 12:58:38 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
500
getAd
video-adserver.ibillboard.com/ Frame 6EDB
48 B
590 B
XHR
General
Full URL
https://video-adserver.ibillboard.com/getAd?tagid=346a3f1b-2167-4e54-8af3-4a8d2910a189&bust=c7629f9fcd&ref=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ngresponse=true&nu=n4%3D2%26n3%3D1&impid=476d9ac6-7fc0-4ecd-a029-b8cee0810fd3
Requested by
Host: media.oadts.com
URL: https://media.oadts.com/www/delivery/video.php?dt=inline&mw=300&sm=1&tm=0&vp=1
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.168.44.125 Prague, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
host-125.billboard.cz
Software
ibillboard /
Resource Hash
c86b97039dee366847426e8ecac1d0dcdb158aea76b2d00a74eb479b05a2a5cb

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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Origin
https://www.giga.de

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:38 GMT
Server
ibillboard
Vary
*
Content-Type
text/xml
Access-Control-Allow-Origin
https://www.giga.de
Cache-Control
private, no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Length
48
Expires
Tue, 01 Jan 1991 00:00:00 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame DFED
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuuRpgZUhbRp10Di1eNNkj2q5bHgIuagRvFNgcQ3q8hVQg402MJSUe0MymYlnSXWhGOv6MgS40ja7dFs4pePov2QUlatQG3mizDDsGPClmr6dP6CLssIDI-rg4RoRy-w7SvBZaOfZPFUQQ3DyuBSwo_DT9hImd7s7KWJaV_4C7HgTFqFvQ3AGnAOUUehQkwOFkprfmi3NfTBZ2pcEJ4Fhmu_iuwEL9G7iEFA0KopzuBpa89YWJOqkXHmHCL4jhY2pE49b8f_73faFTJg8auYBqmHbcpTFhw9DyabsQ&sig=Cg0ArKJSzBIR1JkAHVp-EAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Tue, 03 Dec 2019 12:58:38 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",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
mtrcs_220434.js
s79.mxcdn.net/bb-mx/serve/ Frame DFED
129 KB
50 KB
Script
General
Full URL
https://s79.mxcdn.net/bb-mx/serve/mtrcs_220434.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019111801.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
72.247.224.195 , United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a72-247-224-195.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
c6b15940ada672bb9d1bf510d00597727670784d224cb95a06b09633646010e6

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:38 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
policyref="/w3c/p3p.xml", CP="NON DSP CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI COM NAV STA"
Cache-Control
public, max-age=1800
Connection
keep-alive
Content-Type
text/javascript
Content-Length
50653
Expires
Tue, 03 Dec 2019 13:28:38 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame DFED
76 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019111801.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
e48c4975b293be404aa17aca3844095d270597494ffabe5316cad8c3e45d5004
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1573858490126243"
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",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29138
x-xss-protection
0
expires
Tue, 03 Dec 2019 12:58:38 GMT
124eca84abce0cccb0208c5ef285e6fd.gif
smbad.de/www/images/ Frame DFED
Redirect Chain
  • https://smbad.de/www/delivery/avw.php?zoneid=159&cb=576883113&n=a8157934
  • https://smbad.de/www/images/124eca84abce0cccb0208c5ef285e6fd.gif
799 B
1 KB
Image
General
Full URL
https://smbad.de/www/images/124eca84abce0cccb0208c5ef285e6fd.gif
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
136.243.116.5 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.5.116.243.136.clients.your-server.de
Software
nginx/1.10.1 /
Resource Hash
86927cafa657ae14a28bdca63befb837251fc4ce67683aa19fdccf4d1bfeef3b

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:38 GMT
Last-Modified
Thu, 05 Oct 2017 15:06:50 GMT
Server
nginx/1.10.1
ETag
"59d64a8a-31f"
Content-Type
image/gif
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
799

Redirect headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:38 GMT
Server
nginx/1.10.1
Location
https://smbad.de/www/images/124eca84abce0cccb0208c5ef285e6fd.gif
X-Powered-By
PHP/5.5.38
Transfer-Encoding
chunked
P3P
CP="CUR ADM OUR NOR STA NID"
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, must-revalidate
Connection
keep-alive
Content-Type
text/html
Expires
0
5209200161
api.yieldlove-ad-serving.net/v1/bl/4444/
43 B
249 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/5209200161
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
18.194.21.214 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-18-194-21-214.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
09a1f9790511ecc67c9ae82c262542b5ad75ccbc22d59dd066919906c5a4ea8e

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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Origin
https://www.giga.de

Response headers

date
Tue, 03 Dec 2019 12:58:38 GMT
x-powered-by
Express
etag
W/"2b-FcGf5SzS+ZRj+fFax7p34GoAUrI"
x-key
/bl/4444/5209200161
status
200
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=604800
content-length
43
collect
www.google-analytics.com/
35 B
103 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=935930240&t=event&ni=1&_s=10&dl=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ul=en-us&de=UTF-8&dt=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=JWVideoPlayer&ea=PlayerAvailable&el=78410589%20--%20Filmstreams%20im%20Internet%3A%20Was%20ist%20legal%3F%20Was%20nicht%3F%5Bvideojs%2F7.6.6%5D%5BUser%20Click2Play%5D&_u=6GBAAEAB~&jid=&gjid=&cid=2115578610.1575377917&tid=UA-204785-4&_gid=166720197.1575377917&cd1=Martin%20Maciej&cd5=2019-05-03T08%3A37%3A53%2B02%3A00&cg1=Themenspecials&cg2=4576302&cg3=03-2018&cd2=film&cd6=Artikelseite&cd8=website&cd3=2013197&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=&cd42=bob&cd9=201804&cd11=78410589&cd12=SELF&cd13=69&cd14=false&cd19=User%20Click2Play&cd38=videojs%2F7.6.6&cd44=0&cm1=1&z=288683646
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:808::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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 19 Nov 2019 09:10:32 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1223286
content-type
image/gif
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 GMT
win
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/win
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
18.194.252.229 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-18-194-252-229.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
Content-Type
text/plain

Response headers

date
Tue, 03 Dec 2019 12:58:38 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
mtrcs_220434.js
s79.mxcdn.net/bb-mx/serve/
129 KB
50 KB
Script
General
Full URL
https://s79.mxcdn.net/bb-mx/serve/mtrcs_220434.js
Requested by
Host: s79.mxcdn.net
URL: https://s79.mxcdn.net/bb-mx/serve/mtrcs_220434.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
72.247.224.195 , United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a72-247-224-195.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
c6b15940ada672bb9d1bf510d00597727670784d224cb95a06b09633646010e6

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:38 GMT
Content-Encoding
gzip
Server
nginx
Vary
Accept-Encoding
P3P
policyref="/w3c/p3p.xml", CP="NON DSP CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI COM NAV STA"
Cache-Control
public, max-age=1800
Connection
keep-alive
Content-Type
text/javascript
Content-Length
50653
Expires
Tue, 03 Dec 2019 13:28:38 GMT
data
lb38.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb38.s400.meetrics.net/data?/tpmJDDMAAKktFLkqFFlqwF23A52AwwA/k0FEEmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BmpFstFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEmpFstFfhFy0FprFlsFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13A1zA33A5xA35A1yALlnFBUkzF2BPQGAAAAAAABuA0APBAAFAAuA0TA5iAPBAAAAA+TBBA5iAZAAAOA55A55A85B55A58E55A55AGAyxAzwAz4ArA5iAPqDAAAA+TBHA5iAPBAAAAATWBKA5iASksFPFjAAAAAAAAAAAAEAAAuA0AAAAAAAHAklFzrF0vFwBFEAmpFstFKAnpFnhFukElfFzkFDAx4ExBEMAxzA4yAx2Ay0A1zA3yAGAkpFylFj0FAAAAIAy4A23A51A31AKA00A4yAz4A4yA5yALAv1F0fFvmFfwFhnFlBFKA00A4yAz4A4yA5yAKA00A4yAz4A4yA5yAxAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGmFpsFtfFhyF0pFrlFslByGEv1F0fFvmFfwFhnFlBFdAAA+TBxYAAAAFAAAA5iAAAAANA4tB1uFruFv3FutBx4ExBEAAAAAAAAAAAAAAAAQtjFooFIUA
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.206 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h213.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:38 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Tue, 03-Dec-19 12:58:37 GMT
a63f5aaf-bba0-4469-8581-8b6e3b532918
t.nativendo.de/cds/tracking/event/
0
193 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/a63f5aaf-bba0-4469-8581-8b6e3b532918?aid=2s8hs&t=data%2Finventory&ar=0&url=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ts=1575377918
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1176
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Dec 2019 12:58:38 GMT
via
1.1 google
last-modified
Tue, 03 Dec 2019 12:58:38 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
a63f5aaf-bba0-4469-8581-8b6e3b532918
t.nativendo.de/cds/tracking/event/
0
170 B
Script
General
Full URL
https://t.nativendo.de/cds/tracking/event/a63f5aaf-bba0-4469-8581-8b6e3b532918?aid=182yo&t=data%2Finventory&ar=0&url=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ts=1575377918
Requested by
Host: c.nativendo.de
URL: https://c.nativendo.de/cdn/asset/js/loader.js?v=1176
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
107.178.241.34 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
34.241.178.107.bc.googleusercontent.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Dec 2019 12:58:38 GMT
via
1.1 google
last-modified
Tue, 03 Dec 2019 12:58:38 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
truncated
/ Frame DFED
218 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
e4e8c69010873988afa00cab5c1c1d7f51ad9c21ce37774fd0be40618ff38434

Request headers

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

Response headers

Content-Type
image/png
gettag
s79.research.de.com/bb-mxad/
0
294 B
Script
General
Full URL
https://s79.research.de.com/bb-mxad/gettag
Requested by
Host: s79.mxcdn.net
URL: https://s79.mxcdn.net/bb-mx/serve/mtrcs_220434.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.36.209 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h398.meetrics.de
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:38 GMT
Cache-control
private,must-revalidate
Server
nginx
Connection
keep-alive
P3P
policyref="/w3c/p3p.xml", CP="NON DSP CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR IND UNI COM NAV STA"
Content-Length
0
Content-Type
text/javascript
submit
b47.s79.research.de.com/bb-mx/
43 B
291 B
Image
General
Full URL
https://b47.s79.research.de.com/bb-mx/submit?//hojBwAAA/whFpBo0F0wFz6BvvA33F3uBnpFnhFukElvBl4F0yFhvBspF2lFz0FylFhtFvzEwlFjpFhsFzvBpzF0tBzlFypFluFz0FylFhtFu0EvtBslFnhFstBvkFlyFtpEssFlnFhsFtoEplFytBlyFmhFoyF0tBpoFytBlzFvBEfpyF+k2FoywAx5AtxAxtAy1AtwA56Az0AtyAywA0zA0tAyuAxxA1uAytAkzB0zAlkFimFLlnFB/k0FwBxgAwqFpkF9yAywA0zA0mAhkFj9B02AzzAxwAymAjwFpkF9yAz0Ax3A04A2mAzpF0lF9xA0wA15Az2AmwEshFjlF9yA14A42Ax2A24AmjEpkF95A3wA52Ay4A3mAzpF6lF9iEyhFukFivFvzF0lFymBjiF91A32A44AzxAxzAL2wFBLl1FC/2xFZCylFx1FlzF0mF1sFszFjyFllFugBm1FssFzjFylFluFluFhiFslFkgB3pFukFv3Ff3FliFrpF0yFlxF1lFz0FhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0FjhFujFlsFhuFptFh0FpvFumFyhFtlFg3EpuFkvF3fF3lFirFp0Fz0FvyFhnFlpFumFvgBjzFzfF3lFirFp0FgjEw1FfxB2gAyhFtfF4BETkzF7FAAAAAAAZwSpWBPAAAAAAAAAOAAAAGAAAAAAAZwSpWBBPBAAAAAAAABO8zASksF4BbAAAAAAAAAAAAEAAAO8zAAAAAAAIAyzA0xA30A42AJAy1A44A2xA22A4BEHAx0Aw1A5zA2BEMAiyFhuFkiFvvFz0FlyFIA53Aw5A2yA43AHA02AzzAxwAyBEQtjF4hECUA
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
144.76.237.196 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h371.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:38 GMT
Server
nginx
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Content-Length
43
Expires
Tue, 03 Dec 2019 12:58:37 GMT
SX8
tracker-adserver.ibillboard.com/error/impid/476d9ac6-7fc0-4ecd-a029-b8cee0810fd3/iid/d460aebc-2e03-4986-8771-92e60ecc80f8/asid/346a3f1b-2167-4e54-8af3-4a8d2910a189/tid/346a3f1b-2167-4e54-8af3-4a8d2... Frame 6EDB
0
272 B
Image
General
Full URL
https://tracker-adserver.ibillboard.com/error/impid/476d9ac6-7fc0-4ecd-a029-b8cee0810fd3/iid/d460aebc-2e03-4986-8771-92e60ecc80f8/asid/346a3f1b-2167-4e54-8af3-4a8d2910a189/tid/346a3f1b-2167-4e54-8af3-4a8d2910a189/adid/85a0d494-5864-4a1e-c578-9fc94f9efa60/sensitive/SX8?erc=303
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.168.44.125 Prague, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
host-125.billboard.cz
Software
ibillboard /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Access-Control-Allow-Origin
*, *
Date
Tue, 03 Dec 2019 12:58:39 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 6EDB
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/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.3, , 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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:38 GMT
content-encoding
gzip
access-control-allow-origin
*
vary
Accept-Encoding
content-type
application/javascript; charset=UTF-8
status
200
cache-control
private, must-revalidate, max-age=3600
access-control-allow-credentials
true
content-length
551
expires
Tue, 03 Dec 2019 13:58:38 GMT
teads-format.min.js
a.teads.tv/media/format/v3/
711 KB
185 KB
Script
General
Full URL
https://a.teads.tv/media/format/v3/teads-format.min.js
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/page/68592/tag
Protocol
H2
Security
TLS 1.3, , 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
a918398757d96e3ea56588bac74d195c9a3ecbf4314501c7ed51b19de2daf581

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:38 GMT
content-encoding
gzip
last-modified
Tue, 03 Dec 2019 09:42:22 GMT
x-amz-request-id
493580EB438C23E5
etag
"6fc38dbf7b74769bb2243e9ca5dbbc26"
vary
Accept-Encoding
content-type
text/javascript;charset=utf-8
status
200
cache-control
private, must-revalidate, max-age=600
x-bucket
c
accept-ranges
bytes
content-length
188776
x-amz-id-2
Vf3irImhlPUU5XnHr0AtwT5AsnmyRa0kCXpIKpk4NnjIT5CtUpnHAhP0FQ9ekuCJmhHlhjtZis0=
expires
Tue, 03 Dec 2019 13:08:38 GMT
index.html
cmp.teads.mgr.consensu.org/ Frame 3311
0
0
Document
General
Full URL
https://cmp.teads.mgr.consensu.org/index.html
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
2a02:26f0:6c00:292::2c92 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash

Request headers

Host
cmp.teads.mgr.consensu.org
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/

Response headers

x-amz-id-2
eP74N5mDf2mwuUwz6E0m831egGDvXvr6HEIydDhB20yVDuv4ZE6ina8YQaGiXGlfbz2w11Bw+zo=
x-amz-request-id
93A9209AF986CF84
Last-Modified
Fri, 14 Sep 2018 07:42:32 GMT
ETag
"e7d6c2974a38b7ff77a560e83789f66a"
Accept-Ranges
bytes
Content-Type
text/html
Content-Length
583
Server
AmazonS3
Cache-Control
max-age=300
Expires
Tue, 03 Dec 2019 13:03:38 GMT
Date
Tue, 03 Dec 2019 12:58:38 GMT
Connection
keep-alive
index.html
cmp.teads.mgr.consensu.org/ Frame FE88
0
0
Document
General
Full URL
https://cmp.teads.mgr.consensu.org/index.html
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_256_GCM
Server
2a02:26f0:6c00:292::2c92 , Ascension Island, ASN20940 (AKAMAI-ASN1, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash

Request headers

Host
cmp.teads.mgr.consensu.org
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/

Response headers

x-amz-id-2
eP74N5mDf2mwuUwz6E0m831egGDvXvr6HEIydDhB20yVDuv4ZE6ina8YQaGiXGlfbz2w11Bw+zo=
x-amz-request-id
93A9209AF986CF84
Last-Modified
Fri, 14 Sep 2018 07:42:32 GMT
ETag
"e7d6c2974a38b7ff77a560e83789f66a"
Accept-Ranges
bytes
Content-Type
text/html
Content-Length
583
Server
AmazonS3
Cache-Control
max-age=300
Expires
Tue, 03 Dec 2019 13:03:38 GMT
Date
Tue, 03 Dec 2019 12:58:38 GMT
Connection
keep-alive
p
sb.scorecardresearch.com/
43 B
309 B
Image
General
Full URL
https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1575377918501&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=58884284&cs_ucfr=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.5.97.37 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-5-97-37.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:38 GMT
Cache-Control
private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Expires
Mon, 01 Jan 1990 00:00:00 GMT
Connection
keep-alive
Content-Length
43
Content-Type
image/gif
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=placementCall&ts=1575377918498&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&fv=170
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
72.247.225.182 , United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a72-247-225-182.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Tue, 03 Dec 2019 12:58:38 GMT
cache-control
max-age=0, no-cache, no-store
content-type
image/gif
content-length
23
expires
Tue, 03 Dec 2019 12:58:38 GMT
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=slotAvailable&ts=1575377918499&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&slot=native&fv=170
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
72.247.225.182 , United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a72-247-225-182.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Tue, 03 Dec 2019 12:58:38 GMT
cache-control
max-age=0, no-cache, no-store
content-type
image/gif
content-length
23
expires
Tue, 03 Dec 2019 12:58:38 GMT
p
sb.scorecardresearch.com/
43 B
309 B
Image
General
Full URL
https://sb.scorecardresearch.com/p?c1=2&c2=17198971&ns_ap_sv=2.1511.10&ns_type=hidden&ns_st_it=a&ns_st_sv=4.0.0&ns_st_ad=1&ns_st_sq=1&ns_st_id=1575377918521&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=32345240&cs_ucfr=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
23.5.97.37 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-5-97-37.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:38 GMT
Cache-Control
private, no-cache, no-cache=Set-Cookie, no-store, proxy-revalidate
Expires
Mon, 01 Jan 1990 00:00:00 GMT
Connection
keep-alive
Content-Length
43
Content-Type
image/gif
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=placementCall&ts=1575377918519&pageId=68592&pid=76332&env=js-web&pfid=[pfid]&f=1&fv=170
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
72.247.225.182 , United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a72-247-225-182.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Tue, 03 Dec 2019 12:58:38 GMT
cache-control
max-age=0, no-cache, no-store
content-type
image/gif
content-length
23
expires
Tue, 03 Dec 2019 12:58:38 GMT
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=slotAvailable&ts=1575377918519&pageId=68592&pid=76332&env=js-web&pfid=[pfid]&f=1&slot=multislot&fv=170
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
72.247.225.182 , United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a72-247-225-182.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Tue, 03 Dec 2019 12:58:38 GMT
cache-control
max-age=0, no-cache, no-store
content-type
image/gif
content-length
23
expires
Tue, 03 Dec 2019 12:58:38 GMT
view
securepubads.g.doubleclick.net/pcs/ Frame 2582
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsttu2IDYt_vvekPpEf1KMbB74aaCPJKiStPoG9TozIUKsB0Cq4hHnNfqFsUF9jpLWGFB7WIJzdiJNyfI7mWwyhvKlaEXinNzAUQXaiP29Y8eVLgYjSdoynOb47B7NJWXowpcg4bT0cmyj6er7mZNqF0GzrGQkFYYmyuVye3yxnbG5K2jkfzLOrIu-pJb6DN_f7Exo12Ao8dulH1w1g4sTugaxacRpDqTwPXhxTc-zMp5AwYzatyiWqJKL_bAROMSYjtqux85fHqBDbXrNdvksk9497agrqYOj4&sig=Cg0ArKJSzNhN5BBhw54qEAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Tue, 03 Dec 2019 12:58:38 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",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
dcmads.js
fw.adsafeprotected.com/rjss/www.googletagservices.com/346702/39754020/dcm/ Frame 2582
199 KB
68 KB
Script
General
Full URL
https://fw.adsafeprotected.com/rjss/www.googletagservices.com/346702/39754020/dcm/dcmads.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019111801.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
199.166.0.24 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
anycast.fw.adsafeprotected.com
Software
nginx /
Resource Hash
aea12b3a674fe2f59d097b8d516e53bcf16116d940190a361514f67327f364a4

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:38 GMT
Content-Encoding
gzip
X-Server-Name
app26ami.ami.303net.pvt
Transfer-Encoding
chunked
Content-Type
application/javascript;charset=utf-8
Access-Control-Allow-Origin
fw.adsafeprotected.com
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
Connection
keep-alive
Server
nginx
Expires
Wed, 31 Dec 1969 23:59:59 GMT
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 2582
76 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019111801.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
e48c4975b293be404aa17aca3844095d270597494ffabe5316cad8c3e45d5004
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1573858490126243"
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",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29138
x-xss-protection
0
expires
Tue, 03 Dec 2019 12:58:38 GMT
5199031868
api.yieldlove-ad-serving.net/v1/bl/4444/
44 B
248 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/5199031868
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
18.194.21.214 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-18-194-21-214.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
b2a27a31e9d34704f0c2adae8a77ce35e0bc3c352a40a682d89783142780c2f7

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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Origin
https://www.giga.de

Response headers

date
Tue, 03 Dec 2019 12:58:38 GMT
x-powered-by
Express
etag
W/"2c-wDll0Jp0iexOSFL7+9AsyW9PVP8"
x-key
/bl/4444/5199031868
status
200
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=604800
content-length
44
view
securepubads.g.doubleclick.net/pcs/ Frame 97C9
0
0
Fetch
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsuU8fl7jci7-W3mGvp1sOOxgDgReoH5BF0Z5lT38p0kvx5f_mfYi0emf80R9K8OjcegRiOmxQj4HZ65zba1bwkFvTFox9h2orOy4mHQKER7589_3H1nMYDPoilptSSUQL7Zkgoz6pH6wXpE4UP_FgPClXMLFs3M8IPQ6aflqcEJ4jVBtqsyDSHML5XoOBmR66iKj5XqBZFQG7_qNJGnAt9QeUex5RBqAwzCPFSCriiYCiipLMHvufHJcmWiLjrzfbk_nNbpw2s6JCKg-Hqmz3LA9-RC7lhA1OI7j48&sig=Cg0ArKJSzEhSUDI_dZ2YEAE&urlfix=1&adurl=
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
172.217.16.162 , United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s11-in-f2.1e100.net
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

timing-allow-origin
*
date
Tue, 03 Dec 2019 12:58:38 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",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
osd_listener.js
www.googletagservices.com/activeview/js/current/ Frame 97C9
76 KB
29 KB
Script
General
Full URL
https://www.googletagservices.com/activeview/js/current/osd_listener.js?cache=r20110914
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_2019111801.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
e48c4975b293be404aa17aca3844095d270597494ffabe5316cad8c3e45d5004
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:38 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"1573858490126243"
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",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
29138
x-xss-protection
0
expires
Tue, 03 Dec 2019 12:58:38 GMT
5209200161
api.yieldlove-ad-serving.net/v1/bl/4444/
43 B
249 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/5209200161
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
18.194.21.214 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-18-194-21-214.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
09a1f9790511ecc67c9ae82c262542b5ad75ccbc22d59dd066919906c5a4ea8e

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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Origin
https://www.giga.de

Response headers

date
Tue, 03 Dec 2019 12:58:38 GMT
x-powered-by
Express
etag
W/"2b-FcGf5SzS+ZRj+fFax7p34GoAUrI"
x-key
/bl/4444/5209200161
status
200
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=604800
content-length
43
tb
15.taboola.com/
31 KB
31 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%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&encoded=1&uid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&variant=-100|123472&callback=TRC.videoTagCallbacks.videoCallback1&cb=1575377918593&tagid=&cntry=DE&platform=1&sesid=1125c4e44b9cd4114ea7a76ed13993a1&itemid=/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es&viewid=1575377917313&geolat=&geoing=&deviceifa=&appid=&sd=v2_1125c4e44b9cd4114ea7a76ed13993a1_276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d_1575377917_1575377917_CNawjgYQrMVBGIGr3d7sLSABKAEwODib4wlAgooQSJjEF1Cl7BBYAGAA&ri=5dfc4fc3824f0e87fbdc6bc3559261ab&appname=&cdb=&gdprApplies=&rid=&sii=8595394669299204402&oee=true&tpubid=1073836
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191130-2-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
705473781c1aec7f0f3374bb1d97006bd0bfd8a9c906f5204045aeab7c2a99e7

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Dec 2019 12:58:38 GMT
via
1.1 varnish
server
nginx
x-timer
S1575377919.615212,VS0,VE14
machineid
1451
x-served-by
cache-fra19121-FRA
x-cache
MISS
content-type
text/html;charset=ISO-8859-1
status
200
cache-control
no-cache,must-revalidate,no-store,max-age=0,s-maxage=0
x-cache-hits
0
accept-ranges
bytes
expires
Sat, 26 Jul 1997 05:00:00 GMT
feed-card-placeholder.20191130-2-RELEASE.es6.js
cdn.taboola.com/libtrc/
5 KB
2 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/feed-card-placeholder.20191130-2-RELEASE.es6.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
1eacd5fb7ff66fa8240af370a7d0a29967d704a26c8420925b08ecd8ad0263a6

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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
oekl_gUxQaw02Ojpr7O9qAgTCmwhs23w
content-encoding
gzip
age
120
x-cache
HIT
status
200
date
Tue, 03 Dec 2019 12:58:38 GMT
x-amz-replication-status
COMPLETED
content-length
1268
x-amz-id-2
ASXxqCbYxYfwhd+R86MCv338f1dh7ednh//0MdEC+anW3Xakb1e1KJzsCWCXWjj8VHnBkTdbb1o=
x-served-by
cache-fra19169-FRA
last-modified
Sat, 30 Nov 2019 16:11:53 GMT
server
AmazonS3
x-timer
S1575377919.602192,VS0,VE0
etag
"8e6b1e32491cfa3a9d4ae11644e782aa"
vary
Accept-Encoding
x-amz-request-id
D3FDDA6D76C1D84C
via
1.1 varnish
cache-control
private,max-age=14400
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
6
x-cache-hits
251
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.20191130-2-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
39b076e4bb4fab9b8a142499cf6155f8c128464974691a04de7e764f71b72618

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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
age
36
x-cache
HIT
status
200
date
Tue, 03 Dec 2019 12:58:38 GMT
x-amz-replication-status
COMPLETED
content-length
1758
x-amz-id-2
4T5xY5eOUOs2NtR6pMUfXIIFglsiFO2oRb8Gm4h33X77U7emn2KzBgzSqH/3Ftir7p+60QRZoWo=
x-served-by
cache-fra19169-FRA
access-control-allow-origin
*
last-modified
Wed, 07 Feb 2018 11:15:52 GMT
server
AmazonS3
x-timer
S1575377919.602582,VS0,VE0
etag
"b8b410e4b18d45aa2f3d9bc09cd335fb"
vary
Accept-Encoding
access-control-allow-methods
GET
x-amz-request-id
FF6E9FB5C507191D
via
1.1 varnish
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
image/svg+xml
access-control-allow-headers
*
abp
6
x-cache-hits
64
userx.20191130-2-RELEASE.es6.js
cdn.taboola.com/libtrc/
22 KB
8 KB
Script
General
Full URL
https://cdn.taboola.com/libtrc/userx.20191130-2-RELEASE.es6.js
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/stroeer-smb-giga/loader.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
161fa8a1e2b8212bad87b3f22f027acd38503428dc1c4e429fa14cb2cd42d992

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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
4uP8JLRA7aecNp2Di0BOgE7WvH.jJYKN
content-encoding
gzip
age
83
x-cache
HIT
status
200
date
Tue, 03 Dec 2019 12:58:38 GMT
x-amz-replication-status
COMPLETED
content-length
7711
x-amz-id-2
A8z/RAZAfO5ju3L/pNPcE5Of7ENw2cJVX6XYrEC+aDw5m/iyx4bLT6SAqRKTJm5GXlintpc6v5U=
x-served-by
cache-fra19169-FRA
last-modified
Sat, 30 Nov 2019 16:11:45 GMT
server
AmazonS3
x-timer
S1575377919.611530,VS0,VE0
etag
"37d382a0d62aeed105bcb2a0ad2f5fa1"
vary
Accept-Encoding
x-amz-request-id
17EE53482C1F1C05
via
1.1 varnish
cache-control
private,max-age=14400
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
abp
6
x-cache-hits
99
rtb-h
trc.taboola.com/sg/mediaforcebidder-network/1/ Frame A9B0
Redirect Chain
  • https://rtb.mfadsrvr.com/sync?ssp=taboola
  • https://rtb.mfadsrvr.com/ul_cb/sync?ssp=taboola
  • https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=425890b5-9465-4f45-9dd9-c156420b72a1
0
183 B
Image
General
Full URL
https://trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=425890b5-9465-4f45-9dd9-c156420b72a1
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
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

x-vcl-time-ms
11
date
Tue, 03 Dec 2019 12:58:38 GMT
via
1.1 varnish
server
nginx
x-timer
S1575377919.815383,VS0,VE11
x-served-by
cache-fra19169-FRA
x-cache
MISS
status
204
accept-ranges
bytes
x-cache-hits
0

Redirect headers

Location
//trc.taboola.com/sg/mediaforcebidder-network/1/rtb-h?taboola_hm=425890b5-9465-4f45-9dd9-c156420b72a1
Date
Tue, 03 Dec 2019 12:58:38 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 A9B0
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/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
/
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
6f9fd0201ed801884e5299d5aabca094
Expires
0
/
trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/ Frame A9B0
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=8DhYlCFOe_teV0DKzEsCkG6SBF4ngcCVVIQiyLt_SjM%3D
45 B
104 B
Image
General
Full URL
https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=8DhYlCFOe_teV0DKzEsCkG6SBF4ngcCVVIQiyLt_SjM%3D
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
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

x-vcl-time-ms
9
date
Tue, 03 Dec 2019 12:58:38 GMT
via
1.1 varnish
server
nginx
x-timer
S1575377919.713650,VS0,VE9
x-served-by
cache-fra19169-FRA
x-cache
MISS
status
200
accept-ranges
bytes
x-cache-hits
0

Redirect headers

Location
https://trc.taboola.com/sg/powerlinksdsp-network/1/rtb-h/?taboola_hm=8DhYlCFOe_teV0DKzEsCkG6SBF4ngcCVVIQiyLt_SjM%3D
Date
Tue, 03 Dec 2019 12:58:38 GMT
Server
nginx
Connection
close
Etag
"8DhYlCFOe_teV0DKzEsCkG6SBF4ngcCVVIQiyLt_SjM="
Content-Length
0
rtb-h
match.taboola.com/sg/mediamath-ssp-network/1/ Frame A9B0
Redirect Chain
  • https://sync.mathtag.com/sync/img?mt_exid=92&redir=https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=[MM_UUID]
  • https://trc.taboola.com/sg/mediamath-ssp-network/1/rtb-h/?taboola_hm=04765de6-5148-4c00-b117-9502c00589e2
  • https://match.taboola.com/sg/mediamath-ssp-network/1/rtb-h?taboola_hm=04765de6-5148-4c00-b117-9502c00589e2&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3D04765de6-5148-4c0...
0
52 B
Image
General
Full URL
https://match.taboola.com/sg/mediamath-ssp-network/1/rtb-h?taboola_hm=04765de6-5148-4c00-b117-9502c00589e2&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3D04765de6-5148-4c00-b117-9502c00589e2
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

date
Tue, 03 Dec 2019 12:58:38 GMT
via
1.1 varnish
server
nginx
x-timer
S1575377919.798072,VS0,VE9
x-served-by
cache-fra19121-FRA
x-cache
MISS
status
200
accept-ranges
bytes
content-length
0
x-cache-hits
0

Redirect headers

x-vcl-time-ms
9
date
Tue, 03 Dec 2019 12:58:38 GMT
via
1.1 varnish
server
nginx
x-timer
S1575377919.706890,VS0,VE9
location
https://match.taboola.com/sg/mediamath-ssp-network/1/rtb-h?taboola_hm=04765de6-5148-4c00-b117-9502c00589e2&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3D04765de6-5148-4c00-b117-9502c00589e2
x-cache
MISS
status
302
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-fra19169-FRA
/
trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/ Frame A9B0
Redirect Chain
  • https://bh.contextweb.com/bh/rtset?pid=562107&ev=1&rurl=https%3A%2F%2Ftrc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=%%VGUID%%
  • https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=felCkL7ucle0&ev=1&pid=562107
0
74 B
Image
General
Full URL
https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=felCkL7ucle0&ev=1&pid=562107
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
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

x-vcl-time-ms
9
date
Tue, 03 Dec 2019 12:58:38 GMT
via
1.1 varnish
server
nginx
x-timer
S1575377919.706254,VS0,VE9
x-served-by
cache-fra19169-FRA
x-cache
MISS
status
204
accept-ranges
bytes
x-cache-hits
0

Redirect headers

Date
Tue, 03 Dec 2019 12:58:38 GMT
Via
1.1 varnish
X-Cache
MISS
P3p
policyref="/bh/w3c/p3p.xml", CP="NOI DSP COR NID CURa DEVa PSAa OUR BUS COM NAV INT"
Connection
keep-alive
Content-Length
0
X-Served-By
cache-fra19147-FRA
Server
Jetty(9.4.7.v20170914)
Vary
Accept-Encoding
Content-Language
en
Location
https://trc.taboola.com/sg/pulsepointrtb-network/1/rtb-h/?taboola_hm=felCkL7ucle0&ev=1&pid=562107
Expires
-1
Cache-Control
private, max-age=0, no-cache, no-store
Accept-Ranges
bytes
Content-Type
text/plain; charset=utf-8
Cw-Server
bh-deployment-6bd9f6c695-cxjnk
X-Cache-Hits
0
/
trc.taboola.com/sg/rtbhouse-network/1/rtb-h/ Frame A9B0
Redirect Chain
  • https://creativecdn.com/cm-notify?pi=taboola
  • https://ams.creativecdn.com/cm-notify?pi=taboola&tc=1
  • https://trc.taboola.com/sg/rtbhouse-network/1/rtb-h/?taboola_hm=mpg5B0EdUDOrtGR05DwT&pi=taboola&tc=1
0
55 B
Image
General
Full URL
https://trc.taboola.com/sg/rtbhouse-network/1/rtb-h/?taboola_hm=mpg5B0EdUDOrtGR05DwT&pi=taboola&tc=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
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

x-vcl-time-ms
20
date
Tue, 03 Dec 2019 12:58:38 GMT
via
1.1 varnish
server
nginx
x-timer
S1575377919.797681,VS0,VE20
x-served-by
cache-fra19169-FRA
x-cache
MISS
status
204
accept-ranges
bytes
x-cache-hits
0

Redirect headers

status
302
pragma
no-cache
date
Tue, 03 Dec 2019 12:58:38 GMT, Tue, 03 Dec 2019 12:58:38 GMT
cache-control
no-cache, no-store, must-revalidate, private, max-age=0
content-length
0
location
https://trc.taboola.com/sg/rtbhouse-network/1/rtb-h/?taboola_hm=mpg5B0EdUDOrtGR05DwT&pi=taboola&tc=1
expires
Thu, 01 Jan 1970 00:00:00 GMT
rtb-h
match.taboola.com/sg/appnexus-network/1/ Frame A9B0
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=3392558974024049024
  • https://match.taboola.com/sg/appnexus-network/1/rtb-h?taboola_hm=3392558974024049024&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3D3392558974024049024
0
53 B
Image
General
Full URL
https://match.taboola.com/sg/appnexus-network/1/rtb-h?taboola_hm=3392558974024049024&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3D3392558974024049024
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

date
Tue, 03 Dec 2019 12:58:38 GMT
via
1.1 varnish
server
nginx
x-timer
S1575377919.798668,VS0,VE9
x-served-by
cache-fra19121-FRA
x-cache
MISS
status
200
accept-ranges
bytes
content-length
0
x-cache-hits
0

Redirect headers

x-vcl-time-ms
10
date
Tue, 03 Dec 2019 12:58:38 GMT
via
1.1 varnish
server
nginx
x-timer
S1575377919.706520,VS0,VE10
location
https://match.taboola.com/sg/appnexus-network/1/rtb-h?taboola_hm=3392558974024049024&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3D3392558974024049024
x-cache
MISS
status
302
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-fra19169-FRA
rtb-h
match.taboola.com/sg/google-network/1/ Frame A9B0
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=CAESENCKJ0cP2rALSWOV6CMdERY&google_cver=1
  • https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESENCKJ0cP2rALSWOV6CMdERY&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3DCAESENCKJ0cP2rALSWOV6CMdERY%26goo...
0
53 B
Image
General
Full URL
https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESENCKJ0cP2rALSWOV6CMdERY&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3DCAESENCKJ0cP2rALSWOV6CMdERY%26google_cver%3D1
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

date
Tue, 03 Dec 2019 12:58:38 GMT
via
1.1 varnish
server
nginx
x-timer
S1575377919.797618,VS0,VE9
x-served-by
cache-fra19121-FRA
x-cache
MISS
status
200
accept-ranges
bytes
content-length
0
x-cache-hits
0

Redirect headers

x-vcl-time-ms
9
date
Tue, 03 Dec 2019 12:58:38 GMT
via
1.1 varnish
server
nginx
x-timer
S1575377919.698274,VS0,VE9
location
https://match.taboola.com/sg/google-network/1/rtb-h?taboola_hm=CAESENCKJ0cP2rALSWOV6CMdERY&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3DCAESENCKJ0cP2rALSWOV6CMdERY%26google_cver%3D1
x-cache
MISS
status
302
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-fra19169-FRA
/
trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/ Frame A9B0
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=3392558974024049024
0
57 B
Image
General
Full URL
https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=3392558974024049024
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
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

x-vcl-time-ms
10
date
Tue, 03 Dec 2019 12:58:38 GMT
via
1.1 varnish
server
nginx
x-timer
S1575377919.709962,VS0,VE10
x-served-by
cache-fra19169-FRA
x-cache
MISS
status
204
accept-ranges
bytes
x-cache-hits
0

Redirect headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:40 GMT
AN-X-Request-Uuid
f09b6547-082b-4b03-94aa-3de7431dc66e
Content-Type
text/html; charset=utf-8
Server
nginx/1.13.4
Location
https://trc.taboola.com/sg/nca-appnexus-network/1/rtb-h/?taboola_hm=3392558974024049024
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
X-Proxy-Origin
144.76.109.30; 144.76.109.30; 301.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.223.55:80
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 A9B0
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=b0ec581d-c21b-4cdd-bd3f-b5d1c616ae12
  • https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=b0ec581d-c21b-4cdd-bd3f-b5d1c616ae12&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3Db0ec581d-c21b-4cdd...
0
53 B
Image
General
Full URL
https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=b0ec581d-c21b-4cdd-bd3f-b5d1c616ae12&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3Db0ec581d-c21b-4cdd-bd3f-b5d1c616ae12
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

date
Tue, 03 Dec 2019 12:58:38 GMT
via
1.1 varnish
server
nginx
x-timer
S1575377919.851465,VS0,VE9
x-served-by
cache-fra19121-FRA
x-cache
MISS
status
200
accept-ranges
bytes
content-length
0
x-cache-hits
0

Redirect headers

x-vcl-time-ms
12
date
Tue, 03 Dec 2019 12:58:38 GMT
via
1.1 varnish
server
nginx
x-timer
S1575377919.833676,VS0,VE12
location
https://match.taboola.com/sg/thetradedesk-network/1/rtb-h?taboola_hm=b0ec581d-c21b-4cdd-bd3f-b5d1c616ae12&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3Db0ec581d-c21b-4cdd-bd3f-b5d1c616ae12
x-cache
MISS
status
302
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-fra19169-FRA
rtb-h
match.taboola.com/sg/storygize-network/1/ Frame A9B0
Redirect Chain
  • https://www.storygize.net/ccm/4b560cdd-91f9-422b-adb7-e9dff26bc3ad?u=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d
  • https://trc.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=b341ede2-a00e-4913-b519-6f842f797030
  • https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=b341ede2-a00e-4913-b519-6f842f797030&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3Db341ede2-a00e-4913-b5...
0
53 B
Image
General
Full URL
https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=b341ede2-a00e-4913-b519-6f842f797030&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3Db341ede2-a00e-4913-b519-6f842f797030
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

date
Tue, 03 Dec 2019 12:58:39 GMT
via
1.1 varnish
server
nginx
x-timer
S1575377919.444686,VS0,VE9
x-served-by
cache-fra19121-FRA
x-cache
MISS
status
200
accept-ranges
bytes
content-length
0
x-cache-hits
0

Redirect headers

x-vcl-time-ms
12
date
Tue, 03 Dec 2019 12:58:39 GMT
via
1.1 varnish
server
nginx
x-timer
S1575377919.424466,VS0,VE12
location
https://match.taboola.com/sg/storygize-network/1/rtb-h?taboola_hm=b341ede2-a00e-4913-b519-6f842f797030&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3Db341ede2-a00e-4913-b519-6f842f797030
x-cache
MISS
status
302
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-fra19169-FRA
cookiesync
bttrack.com/pixel/ Frame A9B0
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/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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

User-Agent
Mozilla/5.0 (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
Track004-dc3
Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:37 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 A9B0
0
176 B
Image
General
Full URL
https://cds.taboola.com/?uid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&_r=6470194
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_ECDSA, AES_256_GCM
Server
141.226.224.32 , United States, ASN200478 (TABOOLA-AS, IL),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Date
Tue, 03 Dec 2019 12:58:38 GMT
cache-control
no-store
x-envoy-upstream-service-time
0
Server
nginx
Connection
close
Content-Length
0
rtb-h
match.taboola.com/sg/bidswitch-network/1/ Frame A9B0
Redirect Chain
  • https://x.bidswitch.net/sync?ssp=taboola
  • https://x.bidswitch.net/ul_cb/sync?ssp=taboola
  • https://prod.perf-serving.com/sync?ssp=bidswitch&bidswitch_ssp_id=taboola
  • https://prod.perf-serving.com/ul_cb/sync?ssp=bidswitch&bidswitch_ssp_id=taboola
  • https://x.bidswitch.net/sync?dsp_id=366&expires=14&user_id=499c67ba-2a1c-413c-976f-c50d54ffa7cc&ssp=taboola&user_group=1
  • https://trc.taboola.com/sg/bidswitch-network/1/rtb-h/?taboola_hm=639863a6-76d1-419d-923a-482a0aa92574
  • https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=639863a6-76d1-419d-923a-482a0aa92574&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3D639863a6-76d1-419d-92...
0
76 B
Image
General
Full URL
https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=639863a6-76d1-419d-923a-482a0aa92574&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3D639863a6-76d1-419d-923a-482a0aa92574
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

date
Tue, 03 Dec 2019 12:58:39 GMT
via
1.1 varnish
server
nginx
x-timer
S1575377919.022343,VS0,VE9
x-served-by
cache-fra19121-FRA
x-cache
MISS
status
200
accept-ranges
bytes
content-length
0
x-cache-hits
0

Redirect headers

x-vcl-time-ms
27
date
Tue, 03 Dec 2019 12:58:39 GMT
via
1.1 varnish
server
nginx
x-timer
S1575377919.989418,VS0,VE27
location
https://match.taboola.com/sg/bidswitch-network/1/rtb-h?taboola_hm=639863a6-76d1-419d-923a-482a0aa92574&tbid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d&query=taboola_hm%3D639863a6-76d1-419d-923a-482a0aa92574
x-cache
MISS
status
302
x-cache-hits
0
accept-ranges
bytes
content-length
0
x-served-by
cache-fra19169-FRA
collect
www.google-analytics.com/
35 B
98 B
Image
General
Full URL
https://www.google-analytics.com/collect?v=1&_v=j79&aip=1&a=935930240&t=event&ni=1&_s=11&dl=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&ul=en-us&de=UTF-8&dt=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&sd=24-bit&sr=1600x1200&vp=1585x1200&je=0&ec=Taboola&ea=embed&el=Below%20Article%20Feed%20-%20Video%20%7C%20Card%201&_u=6GBAAEAB~&jid=&gjid=&cid=2115578610.1575377917&tid=UA-204785-4&_gid=166720197.1575377917&cd1=Martin%20Maciej&cd5=2019-05-03T08%3A37%3A53%2B02%3A00&cg1=Themenspecials&cg2=4576302&cg3=03-2018&cd2=film&cd6=Artikelseite&cd8=website&cd3=2013197&cd15=website&cd17=not%20logged%20in&cd24=full&cd37=&cd42=bob&cm73=1&cm13=1&z=2009250268
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:808::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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 19 Nov 2019 09:10:32 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
age
1223286
content-type
image/gif
status
200
alt-svc
quic=":443"; ma=2592000; v="46,43",h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000
cache-control
no-cache, no-store, must-revalidate
access-control-allow-origin
*
content-length
35
expires
Mon, 01 Jan 1990 00:00:00 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%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&page=%7B%22id%22%3A68592%2C%22placements%22%3A%5B%7B%22id%22%3A73584%2C%22validity%22%3A%7B%22status%22%3Atrue%2C%22reasons%22%3A%5B%5D%7D%2C%22player%22%3A%7B%22width%22%3A625%2C%22height%22%3A352%7D%2C%22slotType%22%3A%22native%22%7D%5D%2C%22gdpr_iab%22%3A%7B%22status%22%3A22%2C%22consent%22%3A%22%22%2C%22reason%22%3A220%7D%7D&userId=55f15498-ac1c-4c47-bef2-d3c09e1beb48&formatVersion=2.22.61&env=js-web&netBw=9.3&ttfb=90
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
Protocol
H2
Security
TLS 1.3, , 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/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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

pragma
no-cache
date
Tue, 03 Dec 2019 12:58:38 GMT
content-encoding
gzip
status
200
vary
Accept-Encoding
content-type
application/json
access-control-allow-origin
https://www.giga.de
cache-control
max-age=0, no-cache, no-store
access-control-allow-credentials
true
content-length
129
expires
Tue, 03 Dec 2019 12:58:38 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%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&page=%7B%22id%22%3A68592%2C%22placements%22%3A%5B%7B%22id%22%3A76332%2C%22validity%22%3A%7B%22status%22%3Atrue%2C%22reasons%22%3A%5B%5D%7D%2C%22player%22%3A%7B%22width%22%3A625%2C%22height%22%3A352%7D%2C%22slotType%22%3A%22multislot%22%7D%5D%2C%22gdpr_iab%22%3A%7B%22status%22%3A22%2C%22consent%22%3A%22%22%2C%22reason%22%3A220%7D%7D&userId=55f15498-ac1c-4c47-bef2-d3c09e1beb48&formatVersion=2.22.61&env=js-web&netBw=9.3&ttfb=90
Requested by
Host: a.teads.tv
URL: https://a.teads.tv/media/format/v3/teads-format.min.js
Protocol
H2
Security
TLS 1.3, , 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/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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

pragma
no-cache
date
Tue, 03 Dec 2019 12:58:38 GMT
content-encoding
gzip
status
200
vary
Accept-Encoding
content-type
application/json
access-control-allow-origin
https://www.giga.de
cache-control
max-age=0, no-cache, no-store
access-control-allow-credentials
true
content-length
129
expires
Tue, 03 Dec 2019 12:58:38 GMT
win
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/win
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
18.194.252.229 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-18-194-252-229.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
Content-Type
text/plain

Response headers

date
Tue, 03 Dec 2019 12:58:38 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
win
prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/
0
239 B
XHR
General
Full URL
https://prod-ingestion.tracking.v2.yieldlove-ad-serving.net/v2/win
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
18.194.252.229 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-18-194-252-229.eu-central-1.compute.amazonaws.com
Software
ingestion-server /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
Content-Type
text/plain

Response headers

date
Tue, 03 Dec 2019 12:58:38 GMT
server
ingestion-server
status
200
access-control-allow-methods
POST,OPTIONS
access-control-allow-origin
*
access-control-allow-credentials
false
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
content-length
0
available
trc.taboola.com/stroeer-smb-giga/log/3/
0
385 B
XHR
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/log/3/available?tvi2=1381&route=AM%3AAM%3AV&lti=deflated
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191130-2-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
Content-Type
application/x-www-form-urlencoded

Response headers

x-vcl-time-ms
12
date
Tue, 03 Dec 2019 12:58:38 GMT
via
1.1 varnish
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"
status
204
x-served-by
cache-fra19169-FRA
pragma
no-cache
server
nginx
x-timer
S1575377919.685289,VS0,VE12
content-type
image/gif
access-control-allow-origin
https://www.giga.de
cache-control
no-cache
access-control-allow-credentials
true
accept-ranges
bytes
x-cache-hits
0
available
trc.taboola.com/stroeer-smb-giga/log/3/
0
62 B
XHR
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/log/3/available?tvi2=1381&route=AM%3AAM%3AV&lti=deflated
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191130-2-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
Content-Type
application/x-www-form-urlencoded

Response headers

x-vcl-time-ms
16
date
Tue, 03 Dec 2019 12:58:38 GMT
via
1.1 varnish
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"
status
204
x-served-by
cache-fra19169-FRA
pragma
no-cache
server
nginx
x-timer
S1575377919.687284,VS0,VE16
content-type
image/gif
access-control-allow-origin
https://www.giga.de
cache-control
no-cache
access-control-allow-credentials
true
accept-ranges
bytes
x-cache-hits
0
available
trc.taboola.com/stroeer-smb-giga/log/3/
0
74 B
XHR
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/log/3/available?tvi2=1381&route=AM%3AAM%3AV&lti=deflated
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191130-2-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
Content-Type
application/x-www-form-urlencoded

Response headers

x-vcl-time-ms
9
date
Tue, 03 Dec 2019 12:58:38 GMT
via
1.1 varnish
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"
status
204
x-served-by
cache-fra19169-FRA
pragma
no-cache
server
nginx
x-timer
S1575377919.690061,VS0,VE9
content-type
image/gif
access-control-allow-origin
https://www.giga.de
cache-control
no-cache
access-control-allow-credentials
true
accept-ranges
bytes
x-cache-hits
0
available
trc.taboola.com/stroeer-smb-giga/log/3/
0
62 B
XHR
General
Full URL
https://trc.taboola.com/stroeer-smb-giga/log/3/available?tvi2=1381&route=AM%3AAM%3AV&lti=deflated
Requested by
Host: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191130-2-RELEASE.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
Content-Type
application/x-www-form-urlencoded

Response headers

x-vcl-time-ms
14
date
Tue, 03 Dec 2019 12:58:38 GMT
via
1.1 varnish
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"
status
204
x-served-by
cache-fra19169-FRA
pragma
no-cache
server
nginx
x-timer
S1575377919.692053,VS0,VE14
content-type
image/gif
access-control-allow-origin
https://www.giga.de
cache-control
no-cache
access-control-allow-credentials
true
accept-ranges
bytes
x-cache-hits
0
iframe
sync.teads.tv/ Frame 65B4
0
0
Document
General
Full URL
https://sync.teads.tv/iframe?pid=73584&userId=55f15498-ac1c-4c47-bef2-d3c09e1beb48&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&fromFormat=true&env=js-web&1575377918714
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
72.247.225.182 , United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a72-247-225-182.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=55f15498-ac1c-4c47-bef2-d3c09e1beb48&gdprIab={%22status%22:22,%22consent%22:%22%22,%22reason%22:220}&fromFormat=true&env=js-web&1575377918714
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
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
sec-fetch-mode
nested-navigate
referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
accept-encoding
gzip, deflate, br
cookie
tt_viewer=c41806fd-8408-4530-a24e-2d9ccf4650f2
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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/

Response headers

status
200
content-type
text/html; charset=UTF-8
server
akka-http/10.1.5
content-length
1844
expires
Tue, 03 Dec 2019 12:58:38 GMT
cache-control
max-age=0, no-cache, no-store
pragma
no-cache
date
Tue, 03 Dec 2019 12:58:38 GMT
set-cookie
tt_exelate=; Expires=Wed, 04 Dec 2019 12:58:38 GMT; Domain=.teads.tv; SameSite=None tt_bluekai=; Expires=Wed, 04 Dec 2019 12:58:38 GMT; Domain=.teads.tv; SameSite=None tt_emetriq=; Expires=Wed, 04 Dec 2019 12:58:38 GMT; Domain=.teads.tv; SameSite=None tt_liveramp=; Expires=Wed, 04 Dec 2019 12:58:38 GMT; Domain=.teads.tv; SameSite=None tt_neustar=; Expires=Wed, 04 Dec 2019 12:58:38 GMT; Domain=.teads.tv; SameSite=None tt_salesforce=; Expires=Wed, 04 Dec 2019 12:58:38 GMT; Domain=.teads.tv; SameSite=None tt_dar=; Expires=Wed, 04 Dec 2019 12:58:38 GMT; Domain=.teads.tv; SameSite=None tt_skp=; Expires=Wed, 04 Dec 2019 12:58:38 GMT; Domain=.teads.tv; SameSite=None
c3059e26607a739c14c2ab64c8_ciA2NTADNGZjNTIwN2NjYmM=.jpg
files.giga-video.de/48/af/b6/ Frame 34FB
35 KB
35 KB
Image
General
Full URL
https://files.giga-video.de/48/af/b6/c3059e26607a739c14c2ab64c8_ciA2NTADNGZjNTIwN2NjYmM=.jpg
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
178.19.70.100 , Germany, ASN29551 (HGCOMP-ASN, DE),
Reverse DNS
Software
nginx/1.10.3 /
Resource Hash
6387a46bae805c27f405e88ef824bea4c91699296180acdd650eff057dcfc4c1
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Referer
https://videos.giga.de/embed/78410589?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
Fri, 08 Nov 2019 02:55:14 GMT
x-content-type-options
nosniff
age
2196204
filer-source
d7e27a1e3b205dfc7a2128a9f5f872205e50c085bb70c2521e52b4b15475a798
x-cache
HIT
status
200
accept-language
bytes
content-length
35333
x-xss-protection
1; mode=block
last-modified
Fri, 08 Nov 2019 02:55:14 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
Sun, 08 Dec 2019 02:55:14 GMT
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=adCall&ts=1575377918499&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&slot=native&gdpr_status=22&gdpr_consent=[gdpr_consent]&gdpr_reason=220&fv=170
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
72.247.225.182 , United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a72-247-225-182.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Tue, 03 Dec 2019 12:58:38 GMT
cache-control
max-age=0, no-cache, no-store
content-type
image/gif
content-length
23
expires
Tue, 03 Dec 2019 12:58:38 GMT
track
t.teads.tv/
23 B
157 B
Image
General
Full URL
https://t.teads.tv/track?action=noAd-ivt-doubleVerify&ts=1575377918500&pageId=68592&pid=73584&env=js-web&pfid=[pfid]&f=1&slot=native&fv=170
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
72.247.225.182 , United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a72-247-225-182.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
pragma
no-cache
date
Tue, 03 Dec 2019 12:58:38 GMT
cache-control
max-age=0, no-cache, no-store
content-type
image/gif
content-length
23
expires
Tue, 03 Dec 2019 12:58:38 GMT
f539211219b796ffbb49949997c764f0.png
cdn.taboola.com/libtrc/static/thumbnails/
254 B
729 B
Image
General
Full URL
https://cdn.taboola.com/libtrc/static/thumbnails/f539211219b796ffbb49949997c764f0.png
Requested by
Host: fw.adsafeprotected.com
URL: https://fw.adsafeprotected.com/rjss/www.googletagservices.com/346702/39754020/dcm/dcmads.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.2 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
f68019eb4b4e5933301d4ee75969e0cb94ed8333bf514630fa749eb9c3e483c9

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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
age
3963
x-cache
HIT
status
200
date
Tue, 03 Dec 2019 12:58:38 GMT
x-amz-replication-status
COMPLETED
content-length
254
x-amz-id-2
Vjnfq2okxpLEG/cBVxSfv3DOOCGN7KTpixt29L7DwUhoZL6eRlgDSODZqhfatrYL58q01gaLKf4=
x-served-by
cache-fra19169-FRA
last-modified
Wed, 24 Jun 2015 07:14:11 GMT
server
AmazonS3
x-amz-meta-s3cmd-attrs
uid:0/gname:root/uname:root/gid:0/mode:33188/mtime:1377415166/atime:1435052450/md5:dfa7b52c86e56bd67fa4002f6ed19854/ctime:1422381567
x-timer
S1575377919.823915,VS0,VE0
etag
"dfa7b52c86e56bd67fa4002f6ed19854"
x-amz-request-id
F6D91014AAA6CDC4
cache-control
private,max-age=31536000
accept-ranges
bytes
content-type
image/png
abp
6
x-cache-hits
7277
skeleton.js
static.adsafeprotected.com/ Frame 2582
Redirect Chain
  • https://fw.adsafeprotected.com/rfw/www.googletagservices.com/346702/39754020/dcm/dcmads.js?adsafe_url=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-ille...
  • https://static.adsafeprotected.com/skeleton.js
17 B
299 B
Script
General
Full URL
https://static.adsafeprotected.com/skeleton.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
199.166.0.32 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
anycast.static.adsafeprotected.com
Software
nginx /
Resource Hash
bdeed1e1c0751610c8f3dc2a5c78c93f841c366b36a7f7a54f5e6752c2656c05

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:38 GMT
Last-Modified
Thu, 19 Dec 2013 18:10:33 GMT
X-Server-Name
app41ami.ami.303net.pvt
ETag
"52b33699-11"
Content-Type
application/javascript
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
17
Server
nginx

Redirect headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:38 GMT
X-Server-Name
app65ami.ami.303net.pvt
P3P
CP="COM NAV INT STA NID OUR IND NOI"
Location
https://static.adsafeprotected.com/skeleton.js
Cache-Control
no-cache
Connection
keep-alive
Content-Length
0
Server
nginx
sca.17.4.95.js
static.adsafeprotected.com/ Frame 13DD
81 KB
20 KB
Script
General
Full URL
https://static.adsafeprotected.com/sca.17.4.95.js
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
199.166.0.32 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
anycast.static.adsafeprotected.com
Software
nginx /
Resource Hash
149c8d10677f2f6979fa28c078cf832f575ee53c397d791b739e7c4c687fe7bc

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:38 GMT
Content-Encoding
gzip
Last-Modified
Tue, 19 Jun 2018 17:20:43 GMT
X-Server-Name
app40ami.ami.303net.pvt
ETag
"5b293b6b-4fda"
Content-Type
application/javascript
Cache-Control
max-age=315360000
Connection
keep-alive
Content-Length
20442
Server
nginx
Expires
Thu, 31 Dec 2037 23:55:55 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: cdn.taboola.com
URL: https://cdn.taboola.com/libtrc/impl.20191130-2-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
10eba73b3641332bde05fa8d6223e7017ac5207673602247c35f358ea89e3092

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:38 GMT
via
1.1 c90147ea5199ff7ce77981c8da4247c4.cloudfront.net (CloudFront), 1.1 varnish
age
2328803
x-cache
Hit from cloudfront, HIT
status
200
x-amz-meta-mode
33188
x-cache-hits
1748623
content-encoding
gzip
content-length
1827
x-served-by
cache-hhn4061-HHN
last-modified
Wed, 06 Sep 2017 08:46:00 GMT
server
AmazonS3
x-timer
S1575377919.828375,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-amz-meta-mtime
1499351521
dt
dt.adsafeprotected.com/
43 B
301 B
Image
General
Full URL
https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=fb3f2068-5b00-a4e5-9683-b2be5d627beb&tv={c:vK3JpO,pingTime:-2,time:75,type:a,im:{sf:0,pom:1,prf:{mdA:4,mdZ:97,beA:183,beZ:184,mfA:186,cmA:187,inA:188,inZ:194,prA:194,prZ:203,si:211,poA:212,poZ:226,cmZ:226,mfZ:226,loA:248,loZ:250,ltA:257,ltZ:257}},sca:{dfp:{df:4,sz:300.250,dom:ins}},env:{gca:0},clog:[{piv:100,vs:i,r:,w:300,h:250,t:28}],es:0,sc:1,ha:1,gm:0,slTimes:{i:76,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:28,wc:0.0.1600.1200,ac:968.278.300.250,am:i,cc:968.278.300.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[67~100],as:[67~300.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:0,fm:rJAVcpX+11|12|1311|1312|1313|14|15|161|1711|18|19|1a|1b|1c|1d|1e|1f|1g*.346702-39754020|1h|1i|1j|1k,idMap:1g*,rend:0,renddet:WINDOW,rmeas:0,slid:[google_ads_iframe_4444/giga.de_sd/film_artikel_4,google_ads_iframe_4444/giga.de_sd/film_artikel_4__container__,sdgAdServerContainer-rectangle,rectangle-4],sinceFw:45,readyFired:true}&br=u
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.36.20 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
nyidt.adsafeprotected.com
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:39 GMT
X-Server-Name
dt34.303net.pvt
P3P
CP="COM NAV INT STA NID OUR IND NOI"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Server
nginx
st
imprammp.taboola.com/ Frame 6614
0
0
Document
General
Full URL
https://imprammp.taboola.com/st?cipid=8045671&ttype=0&cirid=EE398D141783882171691868912&cicmp=1657475&cijs=1&dast=V7vtkCFgNxVvEREoPIQgRxVvEREoPIQgUAAAAGBvQHGcXiLIcjxmixG26Gw8litlkNl8PhaDOFEGO5TAa1QMIy-30HBeX09JhdBhnLZTKoBbKmyeV3QxqaTofPda_X_X53ndPnsItcfpXxdHn4xU7by3O6vBxuv-bw8jgdZs9f6Tm9NS_L02X3nC4vh9su-rvFLp_D7NabXJa30mx2-Rxmt9DpsrxVlpvDaDm9lUbLW-X5ywEAAADgAUCpsB_iBxAAIAIAAABAAgAAAIAioOLfQuACAAAAAAOgAOtHAwCKg-Fcd-vLbnS4Pi-7PwAAHgJAAAAGFEgABnCaSgAqcg5OAAAAAAAAAABY_v___2MA9IjPZAAylAZvDHoAHnwAHoQAAACyhrqfwfmANyXGiApWixgBAAAAQDK1eRxN6oTKogoAgCDdCuAKACDAbflaizNLd1DiLQwAAIBgbIEeFr_f7LBr_G6XAQAAAAAAAACY_Z_9owkRjbmlBbEU8Kr9AgIArP0CAgCwqRsAwFsAXNARtGIwWJ1BTDaj3WR2AAAAAHf_____eiCxmKw2ppVpNHFuTKbFYrRy-Ba-2crk2CyXm4Vje8S8ZpE-JdgAfSPCMvt9BwXl9PSYXQYZy2UyqAWypsnlN4gPGoblZBDMb8IWo9VkslkOZ8vFZDAcDUej_QncaIATNBwOFrvBYrdYDCeLyWiwHCxQIAYTnJDhaDNZjXar3WQ5nIxGs81kgxStWs1Gm8FwNZvMdrvVcDBcjkZI0ZrFbDJZzEbL3WawnIwGw8lwiDCym42cu9XErRtsNm7RxjdxCzfDwVrlMo0WrpnJs_BN3KLXx3Qa2VyO3ciLggFUexFcpBPN6fJ3uSxvzdvi1jl9DotYojlZpBPZZd9YTFYb08o0mjg3JtNiMVo5fAvfbGVybJbLzcKxr-xmI-duNXHrBpuNW7TxTdzCzXCwVrlMo4VrZvIsfBO36PUxnUY2l2M38jdWu9Vmt1sudvvGarfa7HbLxW7foTN8V5-zUXnTKjwmj_IZ-TZnToPCZbB4fxLTYtqdHTy_39GpUl00xobsm1CYDR6DQRFLBKeLdCJ6GU8XsUTytEgnqpHNY5p5PMPJaGZYGXczi8ljm3g8q9VyMlssLBaxRGm6SCd6lfF0efjFTtvLc7q8HG6_5vDyOB1mz1_pOb01L8vTZfecLi-H2y76u8Uun8Ps1ptclrfSbHb5HGa30OmyvFWWm8NoOb2VRstb5bmo_9gQo9FcN5srBsu5ZrBKAAAAAAAAAABLmDNvAgAAAHAayGIxmCyWCwAhxrp7h5Sf_tQdKFPc-DHEnC5_l8vy1rwtbp3T5zBz!&excid=22&tst=1&docw=0&cs=false
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash

Request headers

:method
GET
:authority
imprammp.taboola.com
:scheme
https
:path
/st?cipid=8045671&ttype=0&cirid=EE398D141783882171691868912&cicmp=1657475&cijs=1&dast=V7vtkCFgNxVvEREoPIQgRxVvEREoPIQgUAAAAGBvQHGcXiLIcjxmixG26Gw8litlkNl8PhaDOFEGO5TAa1QMIy-30HBeX09JhdBhnLZTKoBbKmyeV3QxqaTofPda_X_X53ndPnsItcfpXxdHn4xU7by3O6vBxuv-bw8jgdZs9f6Tm9NS_L02X3nC4vh9su-rvFLp_D7NabXJa30mx2-Rxmt9DpsrxVlpvDaDm9lUbLW-X5ywEAAADgAUCpsB_iBxAAIAIAAABAAgAAAIAioOLfQuACAAAAAAOgAOtHAwCKg-Fcd-vLbnS4Pi-7PwAAHgJAAAAGFEgABnCaSgAqcg5OAAAAAAAAAABY_v___2MA9IjPZAAylAZvDHoAHnwAHoQAAACyhrqfwfmANyXGiApWixgBAAAAQDK1eRxN6oTKogoAgCDdCuAKACDAbflaizNLd1DiLQwAAIBgbIEeFr_f7LBr_G6XAQAAAAAAAACY_Z_9owkRjbmlBbEU8Kr9AgIArP0CAgCwqRsAwFsAXNARtGIwWJ1BTDaj3WR2AAAAAHf_____eiCxmKw2ppVpNHFuTKbFYrRy-Ba-2crk2CyXm4Vje8S8ZpE-JdgAfSPCMvt9BwXl9PSYXQYZy2UyqAWypsnlN4gPGoblZBDMb8IWo9VkslkOZ8vFZDAcDUej_QncaIATNBwOFrvBYrdYDCeLyWiwHCxQIAYTnJDhaDNZjXar3WQ5nIxGs81kgxStWs1Gm8FwNZvMdrvVcDBcjkZI0ZrFbDJZzEbL3WawnIwGw8lwiDCym42cu9XErRtsNm7RxjdxCzfDwVrlMo0WrpnJs_BN3KLXx3Qa2VyO3ciLggFUexFcpBPN6fJ3uSxvzdvi1jl9DotYojlZpBPZZd9YTFYb08o0mjg3JtNiMVo5fAvfbGVybJbLzcKxr-xmI-duNXHrBpuNW7TxTdzCzXCwVrlMo4VrZvIsfBO36PUxnUY2l2M38jdWu9Vmt1sudvvGarfa7HbLxW7foTN8V5-zUXnTKjwmj_IZ-TZnToPCZbB4fxLTYtqdHTy_39GpUl00xobsm1CYDR6DQRFLBKeLdCJ6GU8XsUTytEgnqpHNY5p5PMPJaGZYGXczi8ljm3g8q9VyMlssLBaxRGm6SCd6lfF0efjFTtvLc7q8HG6_5vDyOB1mz1_pOb01L8vTZfecLi-H2y76u8Uun8Ps1ptclrfSbHb5HGa30OmyvFWWm8NoOb2VRstb5bmo_9gQo9FcN5srBsu5ZrBKAAAAAAAAAABLmDNvAgAAAHAayGIxmCyWCwAhxrp7h5Sf_tQdKFPc-DHEnC5_l8vy1rwtbp3T5zBz!&excid=22&tst=1&docw=0&cs=false
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
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
sec-fetch-mode
nested-navigate
referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
accept-encoding
gzip, deflate, br
cookie
t_gid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d
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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/

Response headers

status
200
server
nginx
accept-ranges
bytes
date
Tue, 03 Dec 2019 12:58:38 GMT
via
1.1 varnish
x-served-by
cache-fra19121-FRA
x-cache
MISS
x-cache-hits
0
x-timer
S1575377919.846982,VS0,VE9
content-length
0
cmTagFEED_MANAGER.js
vidstat.taboola.com/vpaid/units/26_5_8/infra/
672 KB
149 KB
Script
General
Full URL
https://vidstat.taboola.com/vpaid/units/26_5_8/infra/cmTagFEED_MANAGER.js
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/14_12_0/creatives/creative_js.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
ec6e84a87ec3b3c62ff5cb631f7634018d3e0e01dd6233901eb55eff958f7a47

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:38 GMT
via
1.1 06d36e78e8dfd9468327f09115761a9e.cloudfront.net (CloudFront), 1.1 varnish
age
86765
x-cache
Miss from cloudfront, HIT
x-amz-meta-ctime
1575290382
status
200
x-amz-meta-mode
33188
x-cache-hits
13671
content-encoding
gzip
content-length
152623
x-served-by
cache-hhn4061-HHN
last-modified
Mon, 02 Dec 2019 12:39:44 GMT
server
AmazonS3
x-timer
S1575377919.851290,VS0,VE0
etag
"d628fa96a431e641b45f94ba53cfb2f8"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA2-C2
accept-ranges
bytes
content-type
application/javascript
x-amz-cf-id
xDKB98UAJbDySRfwBII1zC_1GKsjb-5Gqu6GXTgIVvNbYqYbbOLldw==
x-amz-meta-mtime
1575290348
cmOsUnit.css
vidstat.taboola.com/vpaid/units/26_5_8/assets/css/
34 KB
6 KB
Stylesheet
General
Full URL
https://vidstat.taboola.com/vpaid/units/26_5_8/assets/css/cmOsUnit.css
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/14_12_0/creatives/creative_js.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
512afe73bd2420dfbf82c396f889384236b495c657e21a5d184880f4be46f4aa

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:38 GMT
via
1.1 d9bf8acc1da383db4531789bbb03ac07.cloudfront.net (CloudFront), 1.1 varnish
age
86765
x-cache
Miss from cloudfront, HIT
x-amz-meta-ctime
1575290359
status
200
x-amz-meta-mode
33188
x-cache-hits
22026
content-encoding
gzip
content-length
6240
x-served-by
cache-hhn4061-HHN
last-modified
Mon, 02 Dec 2019 12:39:21 GMT
server
AmazonS3
x-timer
S1575377919.840330,VS0,VE0
etag
"147faec6191581545e4a17f1e5b11be2"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA2-C2
accept-ranges
bytes
content-type
text/css
x-amz-cf-id
7S-R-_QqJCWJ02EkRcrHd7MMOtxCSKGYTrbIZkcaHapHXUcE8Kxo2Q==
x-amz-meta-mtime
1575290346
truncated
/ Frame 2582
215 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
2c85d2c1402ee7b03f119d747a0081e9f5d6e9c3d0330c76a9214848855823de

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
lb38.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb38.s400.meetrics.net/data?/tpmJEmUAA/k0F/HmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BmpFstFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEmpFstFfhFy0FprFlsFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13A1zA33A5xA35A1yAmvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F9yA4yA25A21A1mAjwFpkF9kElzFr0FvwFmhEwhF91AywA5yAwwAx2AxmAjpFk9BxzA4yA5yA22Aw1A50AmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9mEpsFtmBhwFi9BihFuuFlyFmhEwjF91AywA5yAwwAx2AxmAhwFk9B1yAw5AywAwxA2xAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEmpFstFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A31Az3A35Ax4AzyAyBELlnFCUkzFzBPGCAAAAAAABhYBAPBAAFAAhYBThRjAPAAAlEA5BABhRjAZAAAOA55A55A85B55A58E55A55AEA12A21ArhRjAPiDAlEA5BAHhRjAPuEAAAAFrBKA5iASksF9EjAAAAAAAAAAAAEAAAhYBAAAAAAAHAklFzrF0vFwBFEAmpFstFKAnpFnhFukElfFzkFGA3yA44E5wAMAxzA4yA5yA22Aw1A50AGAkpFylFj0FAAAAIAy4Ay2A52A11AKA1yAw5AywAwxA2xAGAihFuuFlyFKA1yAw5AywAwxA2xAKA1yAw5AywAwxA2xAsAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGmFpsFtfFhyF0pFrlFslByGEihFuuFlyFdlEA5BAoPAAAAFAAAhRjAAAAALAT1FwlFyCFhuFulFyBFAAAAAAAAAAAAAAAAQtjFHqC9VA
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.206 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h213.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:38 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Tue, 03-Dec-19 12:58:37 GMT
data
b47.s79.research.de.com/
43 B
308 B
Image
General
Full URL
https://b47.s79.research.de.com/data?//hojChIAALktFBLkqFFlqwFyyAw0Az0ATkzFPPaIAAAAAAAzqW7ASksFeCd/EAmHAUHA8AAAAAAqW7AAAQAOPFfTFPVFSDFFfFx4Ax0AxxACACBFAAAAAAAAAAAAAAGAJGFSBFNFFdJPAWEAsEA6DAAAAAJI2AAAQAOPFfTFPVFSDFFfFxxA01A22ACANSFAAAAAAAAAAAAAAGAJGFSBFNFFQtjFhkpTSA
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
144.76.237.196 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h371.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:38 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Tue, 03-Dec-19 12:58:37 GMT
data
b47.s79.research.de.com/
43 B
308 B
Image
General
Full URL
https://b47.s79.research.de.com/data?//hojDiIAATkzFASksFNYd/EAmHAUHA8AAAAAAK1RAAAjPo0F0wFz6BvvAnvFvnFslFhkFzuBnuBkvF1iFslFjsFpjFruBulF0vBwhFnlFhkFvhEkzF/jEspFluF09BjhFtwE1iFtzA5zA54AxzAy4A3wAzwAw4A0mAv1F0wF10F9oE0tFsmBo9B2wAmzEsvF0uFhtFl9B2yA52A4wA1zA15AmhEkrF9zA03AxyA3yAz3AxmAhkFm9Bx0A15Ay3A33AyzAm3E90A24AmsEt0F9xA13A1zA33A5xA3mAwzFh9BwmAn1FjpF9xAuyAuwAuwAuyAuyAuwAuwAmmEvyFthF09B02A44E2wAm1EysF9oE00FwzFlzABlByGElyAG3F33FunEpnFhuBklFlyAGlF40FyhFlyAGsFp2FlzF0yFlhFtlByGEzwFljFphFszFlyAGpFz0FtzElyFplFuzF0yFlhFtuB0vFtsElnFhsFtvEklFytBpsFslFnhFstBopFlyFtlEymFhoFy0FtpEoyFtlEzlByGEmmEshFzoF9wAm3EnsF9xAmhEkzFpkF9OEUmBk0F9xA13A1zA33A5xA3wA10AmiEwwF9xA4mAikF09Bx3A4mAmkF09BywAxmApkF09BywAymAzoF29ByyBwxA5xAxxA0mAjiF29ByyBwxA5wAxzAxmAzhFskFy9BhhFmhEi4Fl9BxmAjvFyyFlsFh0FvyF93Ax3A45AxxAxzA3yAxwAmmEytF9yAwmAw2F9yAmnEhfF2pFk9ByxAx1A13A42AxwAuxA13A1zA33A5xA3mAnhFfzFpkF9xA13A1zA33A5xA3mAnhFfoFpkF95Az1A5zAwyA0wAmnEhfFmjF9wAmpEhnF9wAmpEjzFn9BxyA5wAwyAz3A12A2mAkzFz6F91A3mAtkFv9BwmAtzFv9BwmA1fF06F92AwmA1fFopFz9BymA1fFqhF2hF9wAm1EfoF9xAywAwmA1fF39Bx2AwwAm1EfhFo9BxyAwwAm1EfhF39Bx2AwwAm1EfjFk9By0Am1EfuFwsF1nF9wAm1EfuFtpFtlF9wAmhEk4F9zAx4AmhEk5F90A42AmiEp3F9xA14A1mAipFo9BxyAwwAmzEjyFf4F9wAmzEjyFf5F9wAmlEpkF9yAwxA55AzzA3lAyDEyxAw2A1xAy2AmvEpkF9zAmwE2zFpkF9yAxzA0yA41AzzA43A2zAz5AwmAy4F9wAmlEhlF9wAmmEj9B45A2mAiyFkpFt9BwlAyDEwlAyDEwlAyDEwlAyDEx2AwwAlyADwBlyADxB2wAwlAyDExyAwwAlyADxB2wAwlAyDExyAwwAm2EpzF9xAmyEz6F9lA3DEl3ADlFFlB3DEmhEisF9DETmBwmF49BwmAm1F9xA2mAijF9zAxmApmFp9BxmA1jFp9BxuA16Eo1Fj2F1rEvwBxlFmmEziF9xAm4EwjF9BElMF2yBU4BTxBVmBw9Bo0F0wFzlBzBEvvA33F3uBnpFnhFukElmBk0Fk9ByxA5BECACBFAAAAAAAAAAAAAAGAJGFSBFNFFQtjFWrTcYA
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
144.76.237.196 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h371.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:38 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Tue, 03-Dec-19 12:58:37 GMT
data
b47.s79.research.de.com/
43 B
308 B
Image
General
Full URL
https://b47.s79.research.de.com/data?//hojEiIAA/k0FwBxgAwqFpkF9yAywA0zA0mAhkFj9B02AzzAxwAymAjwFpkF9yAz0Ax3A04A2mAzpF0lF9xA0wA15Az2AmwEshFjlF9yA14A42Ax2A24AmjEpkF95A3wA52Ay4A3mAzpF6lF9iEyhFukFivFvzF0lFymBjiF91A32A44AzxAxzAlqwFyyAw0Az0ALkmFBTkzFARksFAQtjFj7RUSA
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
144.76.237.196 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h371.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:38 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Tue, 03-Dec-19 12:58:37 GMT
gen_204
pagead2.googlesyndication.com/pagead/
0
64 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/gen_204?id=gpt_pgbrk&pvsid=2134285338763390&vrg=2019111801&nw_id=4444&nslots=5&eid=425301913&pub_url=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&qid=CNmCsInEmeYCFVAI4AodcLIFXw&iu=4444%2Fgiga.de_sd%2Ffilm_artikel&e=512&ret=300x250&req=10x20%7C10x10%7C300x250%7C34x31&bm=0&efh=0&stk=0&ifi=6
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Dec 2019 12:58:39 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
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
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
0
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
/
track.adform.net/Serving/Cookie/
73 B
448 B
Script
General
Full URL
https://track.adform.net/Serving/Cookie/?adfaction=getjs;adfcookname=uid
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.9ca6297f6e6a5371abc434e6eb433c07.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
37.157.2.236 , Denmark, ASN198622 (ADFORM, DK),
Reverse DNS
Software
nginx /
Resource Hash
5d9e8cfd13ab9f3cb184ee716c93c4c007837b001ab17f762269a64b2d8958cc

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Dec 2019 12:58:39 GMT
content-encoding
gzip
server
nginx
access-control-allow-origin
*
vary
Accept-Encoding
p3p
CP="NOI DSP COR NID CURa ADMa DEVa TAIa PSAa PSDa OUR LEG NAV INT"
status
200
cache-control
no-cache, no-store, must-revalidate, no-transform
content-type
text/javascript; charset=utf-8
content-length
180
expires
-1
f9b17833-d68c-4e4d-b319-d6061d45aa9f
boot.pubstack.io/v1/tag/
1 KB
826 B
Script
General
Full URL
https://boot.pubstack.io/v1/tag/f9b17833-d68c-4e4d-b319-d6061d45aa9f
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.9ca6297f6e6a5371abc434e6eb433c07.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.194.33.101 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-194-33-101.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
e4053662ea4a6fc5287c4793a62aeeb34c6c906eb350bb9fd601809e01c68d10

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
date
Tue, 03 Dec 2019 12:58:39 GMT
cache-control
max-age=120
content-encoding
gzip
content-length
714
content-type
application/javascript
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: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/26_5_8/infra/cmTagFEED_MANAGER.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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:39 GMT
via
1.1 e0064d0a2437e206ed082e1fa1cdae61.cloudfront.net (CloudFront), 1.1 varnish
age
2328799
x-cache
Hit from cloudfront, HIT
status
200
content-encoding
gzip
content-length
7638
x-served-by
cache-hhn4061-HHN
last-modified
Sun, 14 Oct 2018 13:31:31 GMT
server
AmazonS3
x-timer
S1575377919.191843,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
1640452
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: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/26_5_8/infra/cmTagFEED_MANAGER.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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:39 GMT
via
1.1 cc77875ec7dfc885cffaa2ec6fa578f6.cloudfront.net (CloudFront), 1.1 varnish
vary
Accept-Encoding
age
2338716
x-cache
Hit from cloudfront, HIT
status
200
content-encoding
gzip
content-length
5174
x-served-by
cache-hhn4061-HHN
last-modified
Sun, 24 Feb 2019 08:54:20 GMT
server
AmazonS3
x-timer
S1575377919.192777,VS0,VE0
etag
"9eef55ccd492389cc88aa5285cade680"
access-control-max-age
3000
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
1547016
OvaMediaPlayer.js
vidstat.taboola.com/vpaid/vPlayer/player/v10.6.2/
524 KB
134 KB
Script
General
Full URL
https://vidstat.taboola.com/vpaid/vPlayer/player/v10.6.2/OvaMediaPlayer.js
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/26_5_8/infra/cmTagFEED_MANAGER.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
34551142e5075260bfd6c13302ed849d0137908467293e0ab35a58b4cd6dcb41

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:39 GMT
via
1.1 32c8da10203574baccb74b8f771a7ffb.cloudfront.net (CloudFront), 1.1 varnish
age
102319
x-cache
Miss from cloudfront, HIT
status
200
x-amz-meta-mode
33188
x-cache-hits
185795
content-encoding
gzip
content-length
136276
x-served-by
cache-hhn4061-HHN
last-modified
Mon, 02 Dec 2019 08:32:48 GMT
server
AmazonS3
x-timer
S1575377919.212291,VS0,VE0
etag
"ac894f9f67f3867e804b83db6d01ee78"
x-amz-meta-uid
0
vary
Accept-Encoding
x-amz-meta-gid
0
cache-control
public, max-age=2592000
x-amz-cf-pop
FRA50-C1
accept-ranges
bytes
content-type
application/javascript
x-amz-cf-id
OHnt4LFCf1QHebwo41J5jXnRgt1KS-uJM-0B9aVuHC0Ha-IflYQ3Aw==
x-amz-meta-mtime
1575275566
sync
match.taboola.com/ Frame 0B92
0
0
Document
General
Full URL
https://match.taboola.com/sync?dast=V7vtkCFgNxVvEREoPIQgRxVvEREoPIQgUAAAAGBvQHGcXiLIcjxmixG26Gw8litlkNl8PhaDOFEGO5TAa1QMIy-30HBeX09JhdBhnLZTKoBbKmyeV3QxqaTofPda_X_X53ndPnsItcfpXxdHn4xU7by3O6vBxuv-bw8jgdZs9f6Tm9NS_L02X3nC4vh9su-rvFLp_D7NabXJa30mx2-Rxmt9DpsrxVlpvDaDm9lUbLW-X5ywEAAADgAUCpsB_iBxAAIAIAAABAAgAAAIAioOLfQuACAAAAAAOgAOtHAwCKg-Fcd-vLbnS4Pi-7PwAAHgJAAAAGFEgABnCaSgAqcg5OAAAAAAAAAABY_v___2MA9IjPZAAylAZvDHoAHnwAHoQAAACyhrqfwfmANyXGiApWixgBAAAAQDK1eRxN6oTKogoAgCDdCuAKACDAbflaizNLd1DiLQwAAIBgbIEeFr_f7LBr_G6XAQAAAAAAAACY_Z_9owkRjbmlBbEU8Kr9AgIArP0CAgCwqRsAwFsAXNARtGIwWJ1BTDaj3WR2AAAAAHf_____eiCxmKw2ppVpNHFuTKbFYrRy-Ba-2crk2CyXm4Vje8S8ZpE-JdgAfSPCMvt9BwXl9PSYXQYZy2UyqAWypsnlN4gPGoblZBDMb8IWo9VkslkOZ8vFZDAcDUej_QncaIATNBwOFrvBYrdYDCeLyWiwHCxQIAYTnJDhaDNZjXar3WQ5nIxGs81kgxStWs1Gm8FwNZvMdrvVcDBcjkZI0ZrFbDJZzEbL3WawnIwGw8lwiDCym42cu9XErRtsNm7RxjdxCzfDwVrlMo0WrpnJs_BN3KLXx3Qa2VyO3ciLggFUexFcpBPN6fJ3uSxvzdvi1jl9DotYojlZpBPZZd9YTFYb08o0mjg3JtNiMVo5fAvfbGVybJbLzcKxr-xmI-duNXHrBpuNW7TxTdzCzXCwVrlMo4VrZvIsfBO36PUxnUY2l2M38jdWu9Vmt1sudvvGarfa7HbLxW7foTN8V5-zUXnTKjwmj_IZ-TZnToPCZbB4fxLTYtqdHTy_39GpUl00xobsm1CYDR6DQRFLBKeLdCJ6GU8XsUTytEgnqpHNY5p5PMPJaGZYGXczi8ljm3g8q9VyMlssLBaxRGm6SCd6lfF0efjFTtvLc7q8HG6_5vDyOB1mz1_pOb01L8vTZfecLi-H2y76u8Uun8Ps1ptclrfSbHb5HGa30OmyvFWWm8NoOb2VRstb5bmo_9gQo9FcN5srBsu5ZrBKAAAAAAAAAABLmDNvAgAAAHAayGIxmCyWCwAhxrp7h5Sf_tQdKFPc-DHEnC5_l8vy1rwtbp3T5zBz!&excid=22&docw=0&cijs=1
Requested by
Host: vidstat.taboola.com
URL: https://vidstat.taboola.com/vpaid/units/26_5_8/infra/cmTagFEED_MANAGER.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.14.49 Frankfurt am Main, Germany, ASN54113 (FASTLY - Fastly, US),
Reverse DNS
Software
nginx /
Resource Hash

Request headers

:method
GET
:authority
match.taboola.com
:scheme
https
:path
/sync?dast=V7vtkCFgNxVvEREoPIQgRxVvEREoPIQgUAAAAGBvQHGcXiLIcjxmixG26Gw8litlkNl8PhaDOFEGO5TAa1QMIy-30HBeX09JhdBhnLZTKoBbKmyeV3QxqaTofPda_X_X53ndPnsItcfpXxdHn4xU7by3O6vBxuv-bw8jgdZs9f6Tm9NS_L02X3nC4vh9su-rvFLp_D7NabXJa30mx2-Rxmt9DpsrxVlpvDaDm9lUbLW-X5ywEAAADgAUCpsB_iBxAAIAIAAABAAgAAAIAioOLfQuACAAAAAAOgAOtHAwCKg-Fcd-vLbnS4Pi-7PwAAHgJAAAAGFEgABnCaSgAqcg5OAAAAAAAAAABY_v___2MA9IjPZAAylAZvDHoAHnwAHoQAAACyhrqfwfmANyXGiApWixgBAAAAQDK1eRxN6oTKogoAgCDdCuAKACDAbflaizNLd1DiLQwAAIBgbIEeFr_f7LBr_G6XAQAAAAAAAACY_Z_9owkRjbmlBbEU8Kr9AgIArP0CAgCwqRsAwFsAXNARtGIwWJ1BTDaj3WR2AAAAAHf_____eiCxmKw2ppVpNHFuTKbFYrRy-Ba-2crk2CyXm4Vje8S8ZpE-JdgAfSPCMvt9BwXl9PSYXQYZy2UyqAWypsnlN4gPGoblZBDMb8IWo9VkslkOZ8vFZDAcDUej_QncaIATNBwOFrvBYrdYDCeLyWiwHCxQIAYTnJDhaDNZjXar3WQ5nIxGs81kgxStWs1Gm8FwNZvMdrvVcDBcjkZI0ZrFbDJZzEbL3WawnIwGw8lwiDCym42cu9XErRtsNm7RxjdxCzfDwVrlMo0WrpnJs_BN3KLXx3Qa2VyO3ciLggFUexFcpBPN6fJ3uSxvzdvi1jl9DotYojlZpBPZZd9YTFYb08o0mjg3JtNiMVo5fAvfbGVybJbLzcKxr-xmI-duNXHrBpuNW7TxTdzCzXCwVrlMo4VrZvIsfBO36PUxnUY2l2M38jdWu9Vmt1sudvvGarfa7HbLxW7foTN8V5-zUXnTKjwmj_IZ-TZnToPCZbB4fxLTYtqdHTy_39GpUl00xobsm1CYDR6DQRFLBKeLdCJ6GU8XsUTytEgnqpHNY5p5PMPJaGZYGXczi8ljm3g8q9VyMlssLBaxRGm6SCd6lfF0efjFTtvLc7q8HG6_5vDyOB1mz1_pOb01L8vTZfecLi-H2y76u8Uun8Ps1ptclrfSbHb5HGa30OmyvFWWm8NoOb2VRstb5bmo_9gQo9FcN5srBsu5ZrBKAAAAAAAAAABLmDNvAgAAAHAayGIxmCyWCwAhxrp7h5Sf_tQdKFPc-DHEnC5_l8vy1rwtbp3T5zBz!&excid=22&docw=0&cijs=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
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
sec-fetch-mode
nested-navigate
referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
accept-encoding
gzip, deflate, br
cookie
t_gid=276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d
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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/

Response headers

status
200
server
nginx
content-type
text/html;charset=ISO-8859-1
machineid
402
accept-ranges
bytes
date
Tue, 03 Dec 2019 12:58:39 GMT
via
1.1 varnish
x-served-by
cache-fra19121-FRA
x-cache
MISS
x-cache-hits
0
x-timer
S1575377919.226948,VS0,VE10
st
convammp.taboola.com/
0
147 B
Image
General
Full URL
https://convammp.taboola.com/st?cijs=convusmp&ttype=45&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7-vQCFgNxVvEREoPIQgRxVvEREoPIQgUAAAAGBvQHG8XiLIcjxmixG26Gw8lit5gtF8PZcLmYDCGjWJzlcMQYLXbDzXA4Wcw2q-FyOBxtphBiLJfJoBZIWGa_76CgnJ4es8sgY7lMBrVA1jS5_G5IQ9Pp8Lnu9brf765z-hx2kcuvMp4uD7_YaXt5TpeXw-3XHF4ep8Ps-Ss9p7fmZXm67J7T5eVw20V_t9jlc5jdepPL8laazS6fw-wWOl2Wt8pycxgtp7fSaHmrPH85AAAAADwAKBX2Q_wAAgBEAAAAAEgAAAAAUARU_FsIXAAAAABgABRg_WgAQHEwnOtufdmNDtfnZfcHAMBDAAgAwIACCcAATlMJQEXOwQkAAAAAAAAAAMv___9_DIAe8ZkMQIbSYA_Agw_AA1HBahEjAAAAAEimNo-jSZ1QWVQBABCkWwFcAQAEuC1fa3GGAQAAEIwt0MPi95sddo3f7TIAAAAAAAAAALP_s380IaIxt7QglgJetV9AAIC1X0AAADZ1AwB4C4ALOoJWDAarM4jJZrSbzA4AAADg7v___18PJBaT1ca0Mo0mzo3JtFiMVg7fwjdbmRyb5XKzcGyPmNcs0qcEG6BvRFhmv--goJyeHrPLIGO5TAa1QNY0ufwG8UHDsJwMgvlN2GK0mkw2y-FsuZgMhqPhaLQ_gRsNcIKGw8FiN1jsFovhZDEZDZaDBQrEYIITMhxtJqvRbrWbLIeT0Wi2mWyQolWr2WgzGK5mk9lutxoOhsvRCClas5hNJovZaLnbDJaT0WA4GQ4RRnazkXO3mrh1g83GLdr4Jm7hZjhYq1ym0cI1M3kWvolb9PqYTiOby7EbeVEwgGovgot0ojld_i6X5a15W9w6p89hEUs0J4t0IrvsG4vJamNamUYT58ZkWixGK4dv4ZutTI7NcrlZOPaV3Wzk3K0mbt1gs3GLNr6JW7gZDtYql2m0cM1MnoVv4ha9PqbTyOZy7Eb-xmq32ux2y8Vu31jtVpvdbrnY7Tt0hu_qczYqb1qFx-RRPiPf5sxpULgMFu9PYlpMu7OD5_c7OlWqi8bYkH0TCrPBYzAoYongdJFORC_j6SKWSJ4W6UQ1snlMM49nOBnNDCvjbmYxeWwTj2e1Wk5mi4XFIpYoTRfpRK8yni4Pv9hpe3lOl5fD7dccXh6nw-z5Kz2nt-ZlebrsntPl5XDbRX-32OVzmN16k8vyVprNLp_D7BY6XZa3ynJzGC2nt9Joeas8F_UfG2I0mutmc8VgOdcMVgkAAAAAAAAAYAlz5k0AAAAATgNZLAaTxXIBIMRYd--Q8tOfugNlihs_hpjT5e9yWd6at8Wtc_ocBg!&cmcv=&pix=31589837&cb=1575377919191&uv=2658&tms=1575377919191&abt=afc7_vD!des2_vA!expl_vB!pix100!pix100!pl53468-288_vB!u2658_vA!ufm_vA&ft=0&unm=FEED_MANAGER&debug=pn:!sqg:!torgn:1575377916767.337!ts:1575377919191&
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 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:39 GMT
via
1.1 varnish
server
nginx
x-timer
S1575377919.235805,VS0,VE8
x-served-by
cache-hhn4053-HHN
x-cache
MISS
status
200
accept-ranges
bytes
content-length
0
x-cache-hits
0
st
convammp.taboola.com/
0
53 B
Image
General
Full URL
https://convammp.taboola.com/st?cijs=convusmp&ttype=72&cisd=convusmp&cipid=8045671&crid=4883965&dast=V7-vQCFgNxVvEREoPIQgRxVvEREoPIQgUAAAAGBvQHG8XiLIcjxmixG26Gw8lit5gtF8PZcLmYDCGjWJzlcMQYLXbDzXA4Wcw2q-FyOBxtphBiLJfJoBZIWGa_76CgnJ4es8sgY7lMBrVA1jS5_G5IQ9Pp8Lnu9brf765z-hx2kcuvMp4uD7_YaXt5TpeXw-3XHF4ep8Ps-Ss9p7fmZXm67J7T5eVw20V_t9jlc5jdepPL8laazS6fw-wWOl2Wt8pycxgtp7fSaHmrPH85AAAAADwAKBX2Q_wAAgBEAAAAAEgAAAAAUARU_FsIXAAAAABgABRg_WgAQHEwnOtufdmNDtfnZfcHAMBDAAgAwIACCcAATlMJQEXOwQkAAAAAAAAAAMv___9_DIAe8ZkMQIbSYA_Agw_AA1HBahEjAAAAAEimNo-jSZ1QWVQBABCkWwFcAQAEuC1fa3GGAQAAEIwt0MPi95sddo3f7TIAAAAAAAAAALP_s380IaIxt7QglgJetV9AAIC1X0AAADZ1AwB4C4ALOoJWDAarM4jJZrSbzA4AAADg7v___18PJBaT1ca0Mo0mzo3JtFiMVg7fwjdbmRyb5XKzcGyPmNcs0qcEG6BvRFhmv--goJyeHrPLIGO5TAa1QNY0ufwG8UHDsJwMgvlN2GK0mkw2y-FsuZgMhqPhaLQ_gRsNcIKGw8FiN1jsFovhZDEZDZaDBQrEYIITMhxtJqvRbrWbLIeT0Wi2mWyQolWr2WgzGK5mk9lutxoOhsvRCClas5hNJovZaLnbDJaT0WA4GQ4RRnazkXO3mrh1g83GLdr4Jm7hZjhYq1ym0cI1M3kWvolb9PqYTiOby7EbeVEwgGovgot0ojld_i6X5a15W9w6p89hEUs0J4t0IrvsG4vJamNamUYT58ZkWixGK4dv4ZutTI7NcrlZOPaV3Wzk3K0mbt1gs3GLNr6JW7gZDtYql2m0cM1MnoVv4ha9PqbTyOZy7Eb-xmq32ux2y8Vu31jtVpvdbrnY7Tt0hu_qczYqb1qFx-RRPiPf5sxpULgMFu9PYlpMu7OD5_c7OlWqi8bYkH0TCrPBYzAoYongdJFORC_j6SKWSJ4W6UQ1snlMM49nOBnNDCvjbmYxeWwTj2e1Wk5mi4XFIpYoTRfpRK8yni4Pv9hpe3lOl5fD7dccXh6nw-z5Kz2nt-ZlebrsntPl5XDbRX-32OVzmN16k8vyVprNLp_D7BY6XZa3ynJzGC2nt9Joeas8F_UfG2I0mutmc8VgOdcMVgkAAAAAAAAAYAlz5k0AAAAATgNZLAaTxXIBIMRYd--Q8tOfugNlihs_hpjT5e9yWd6at8Wtc_ocBg!&cmcv=&pix=&cb=1575377919216&uv=2658&tms=1575377919216&abt=afc7_vD!des2_vA!expl_vB!pix100!pix100!pl53468-288_vB!u2658_vA!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 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:39 GMT
via
1.1 varnish
server
nginx
x-timer
S1575377919.235956,VS0,VE9
x-served-by
cache-hhn4053-HHN
x-cache
MISS
status
200
accept-ranges
bytes
content-length
0
x-cache-hits
0
ngx_pagespeed_beacon
www.giga.de/
0
73 B
XHR
General
Full URL
https://www.giga.de/ngx_pagespeed_beacon?url=http%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
Content-Type
application/x-www-form-urlencoded

Response headers

status
204
date
Tue, 03 Dec 2019 12:58:39 GMT
cache-control
max-age=0, no-cache
server
nginx
b7d2eb12-5c24-4148-9ee8-d96c134d82f1
https://www.giga.de/
1 KB
0
Media
General
Full URL
blob:https://www.giga.de/b7d2eb12-5c24-4148-9ee8-d96c134d82f1
Protocol
BLOB
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
60ddc774c7b5fd0c01d169321a444da403d60c0042f6bee01b0c96f6e1535fda

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
Range
bytes=0-
Accept-Encoding
identity;q=1, *;q=0

Response headers

Content-Range
bytes 0-1492/1493
Content-Length
1493
Content-Type
video/mp4
93856c50-7986-4e5c-9efa-192f40dc5399
https://www.giga.de/
1 KB
0
Media
General
Full URL
blob:https://www.giga.de/93856c50-7986-4e5c-9efa-192f40dc5399
Protocol
BLOB
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
60ddc774c7b5fd0c01d169321a444da403d60c0042f6bee01b0c96f6e1535fda

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
Range
bytes=0-
Accept-Encoding
identity;q=1, *;q=0

Response headers

Content-Range
bytes 0-1492/1493
Content-Length
1493
Content-Type
video/mp4
data
lb38.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb38.s400.meetrics.net/data?/tpmJFUaAA/k0FFMmvFytFh0FjvFklF94Et1EurFuvF3uFtxA4xBmhEk2F9yA42A35A13A1mAjwFpkF9kElzFr0FvwFmhEwhF90A04AyzA44Ay5AymAjpFk9BxzA4yAx2Ay0A1zA3yAmzEp6Fl9Bx4ExmAzpF0lF9nEpnFhuBklFfzFkmBwsFhjFl9BmpFstFmhEwiF9vE10FfvFmfFwhFnlFmhEwjF90A04AyzA44Ay5AymAhwFk9B00A4yAz4A4yA5yAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEmpFstFfhFy0FprFlsFlyAGvF10FfvFmfFwhFnlFmhEkjF9kEpyFljF0mBttFvkFl9BklFmhF1sF0mBjiF9xA13A1zA33A5xA35A1yAmvFytFh0FjvFklF9TE1wFlyFChFuuFlyFmhEk2F9yA4yA25A21A1mAjwFpkF9kElzFr0FvwFmhEwhF91AywA5yAwwAx2AxmAjpFk9BxzA4yA5yA22Aw1A50AmzEp6Fl9B3yA44E5wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9mEpsFtmBhwFi9BihFuuFlyFmhEwjF91AywA5yAwwAx2AxmAhwFk9B1yAw5AywAwxA2xAmhEwlF9lAyGE00A00AlyAGnFpnFhuBklFfzFklByGEmpFstFfhFy0FprFlsFlyAGiFhuFulFymBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A31Az3A35Ax4AzyAymEvyFthF0jFvkFl9BNlFkpF1tFSlFj0FhuFnsFlmBhkF29By4A01AwzA31AmjEwpFk9BklFzrF0vFwmBhwFh9B1xA55AwzAx4A24AmjEpkF9xAz4Ay5Aw4AzzAx4A1mAzpF6lF9zAwwA4yB1wAmzEp0Fl9BnpFnhFukElfFzkFmwEshFjlF9mEpsFtmBhwFi9BylFj0FhuFnsFlmBhwFj9B1xA55AwzAx4A24AmhEwkF91Ax5A5wAzxA42A4mAhwFl9BlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGmFpsFtfFhyF0pFrlFslByGEylFj0FhuFnsFlmBhkFj9BkpFylFj0FmtEtvFklF9kElmFh1Fs0FmjEi9Bx1A31Az3A35Ax4A43AwBELlnFDLl1FDUkzF2BPSAAAAAAAABrYyAPBAAFAArYyTbosAPAAAJPAWEABbosAZAAAOA55A55A85B55A58E55A55AGAywA2zA35ArbosAPqFAJPAWEAHbosAPDAAAZAwSAcAAAASksFSFjAAAAAAAAAAAAEAAArYyAAAAAAAHAklFzrF0vFwBFEAmpFstFKAnpFnhFukElfFzkFHAzwAw4Ey1AwBEMAxzA4yA5wA4zAzxA41AGAkpFylFj0FAAAAIAy4A01AwzA31AKA1xA55AwzAx4A24AJAylFj0FhuFnsFlBFKA1xA55AwzAx4A24AKA1xA55AwzAx4A24AvAlyAG0B00A0lAyGEnpFnhFukElfFzkFlyAGmFpsFtfFhyF0pFrlFslByGEylFj0FhuFnsFlBFdJPAWEAsEA6DAFAAAbosAAAAAPANlFkpF1tFSlFj0FhuFnsFlBFAAAAAAAAAAAAAAAAQtjFrsRAZA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.206 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h213.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:39 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Tue, 03-Dec-19 12:58:38 GMT
map.js
js.adscale.de/
21 KB
6 KB
Script
General
Full URL
https://js.adscale.de/map.js
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.9ca6297f6e6a5371abc434e6eb433c07.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
72.247.225.134 , United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a72-247-225-134.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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
9wmXmJRzbqUN1J_FE3OdLbfoYkoSRNk9
Content-Encoding
gzip
Last-Modified
Wed, 20 Nov 2019 21:27:04 GMT
Server
AmazonS3
x-amz-request-id
47310A135F00841C
ETag
"bebadcf744e89f1c759744a2a44d9f38"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=300
Date
Tue, 03 Dec 2019 12:58:39 GMT
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
5434
x-amz-id-2
7bPvSDG4P6oTWir80NRUHBhwXFdeU8b/ztY/oP0QTZ0YhTuXZ5DD2lRX/X9R27fBRPCCEvYfaSU=
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=36604146
Requested by
Host: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.9ca6297f6e6a5371abc434e6eb433c07.js
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
89.163.159.101 Cloppenburg, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
27fb6386870d840d410b95bcfc93a520f1ffa4f9534679ce876d322ac87ae5c8

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:39 GMT
content-encoding
gzip
last-modified
Tue, 12 Nov 2019 18:48:03 GMT
server
nginx
etag
W/"5dcafe63-9d2b"
content-type
application/javascript
status
200
cache-control
max-age=300
access-control-allow-credentials
true
expires
Tue, 03 Dec 2019 13:03:39 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: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.9ca6297f6e6a5371abc434e6eb433c07.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.168.44.118 Prague, Czech Republic, ASN5588 (GTSCE GTS Central Europe / Antel Germany, CZ),
Reverse DNS
cdn2.bbmedia.cz
Software
ibillboard /
Resource Hash
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:39 GMT
Content-Encoding
gzip
Last-Modified
Sun, 01 Oct 2017 19:12:02 GMT
Server
ibillboard
Vary
Accept-Encoding, Accept-Encoding
Content-Type
application/javascript
Cache-Control
max-age=604800
Transfer-Encoding
chunked
Connection
keep-alive
Expires
Mon, 09 Dec 2019 20:14:28 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: js.stroeermediabrands.de
URL: https://js.stroeermediabrands.de/metaTag.min.9ca6297f6e6a5371abc434e6eb433c07.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.77.22.22 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-77-22-22.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
63d85f730cd218fc87d0e3a95068f2fc4064c15506a2b73ac236479aa33fec8d

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
date
Tue, 03 Dec 2019 12:58:39 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
content-length
1687
content-type
text/javascript
learn
de-gmtdmp.mookie1.com/t/v2/
43 B
581 B
Image
General
Full URL
https://de-gmtdmp.mookie1.com/t/v2/learn?tagid=V2_343&src.rand=39546670&src.id=Stroeer
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
35.186.238.175 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
175.238.186.35.bc.googleusercontent.com
Software
Apache /
Resource Hash
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Dec 2019 12:58:39 GMT
via
1.1 google
server
Apache
p3p
CP="NON DSP COR NID CURa PSAa PSDa OUR STP UNI COM NAV STA LOC OTC",policyref="/w3c/p3p.xml"
status
200
cache-control
no-cache, no-store, must-revalidate
content-type
image/gif;charset=UTF-8
alt-svc
clear
content-length
43
x-application-context
application
expires
Thu, 01 Jan 1970 00:00:00 GMT
dt
dt.adsafeprotected.com/
43 B
301 B
Image
General
Full URL
https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=fb3f2068-5b00-a4e5-9683-b2be5d627beb&tv={c:vK3Jxv,pingTime:-10,time:552,type:s,mvn:ZnNjPTEyLHNkPTMsbm89Nyxhc3A9MQ--,fsc:17.4.95v220002022020220000022002222000022220202020222220222220002222022002222200002220222022222222222000220200000022220222220222222222222202222222222222222222222222222222222222200000022022020020000002002202022022022222222000000000020222202022022222000000020000000000000000000002220002220000022200222202220022200200222022202220022222220020222222000220000222202222202222000002002002222222222220022202200022002220222202,sd:MTcuNC45NXYxMjAwfHwxNjAwfHwxfHwxfHwyNHx8MTIwMHx8MHx8MHx8MXx8bGFuZHNjYXBlLXByaW1hcnl8fDI0fHw0LzN8fDQvM3x8MHx8MTYwMA--,no:MTcuNC45NXZNb3ppbGxhfHxOZXRzY2FwZXx8bnx8MTZ8fG58fDB8fG58fExpbnV4IHg4Nl82NHx8R2Vja298fDIwMDMwMTA3fHwtNjB8fE1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzE0XzUpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83NC4wLjM3MjkuMTY5IFNhZmFyaS81MzcuMzZ8fDF8fDF8fEdvb2dsZSBJbmMufHxu,asp:1575377919288||83dd147e17793e740136f2eb571f746b||675c74d5f114ba25a49fb0f4cb02f70f||5b812224f7f7b01e00197e6e05ff6f31||b1479fec96c34ee7f561eddbd23d7ee6||184ba19eeb0e03b625da239674eff0e7||61a4197de852fcf5d5571fe0646ded0d||a8c10898096c0503a0cdb642b54a64d3||1529428597}
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.36.20 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
nyidt.adsafeprotected.com
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:39 GMT
X-Server-Name
dt58.303net.pvt
P3P
CP="COM NAV INT STA NID OUR IND NOI"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Server
nginx
bb346c4a-2146-4364-aae2-e6625eb518a0
https://videos.giga.de/ Frame 34FB
31 B
0
Other
General
Full URL
blob:https://videos.giga.de/bb346c4a-2146-4364-aae2-e6625eb518a0
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-c972511a.min.js
Protocol
BLOB
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
7725538fe2f71147bffeba7452b434c826aef9009666cb4360c605d0b2a91d1d

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-Length
31
Content-Type
application/javascript
global_config.json
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/ Frame 34FB
53 B
703 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-c972511a.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.219.72.195 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

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

Response headers

Date
Tue, 03 Dec 2019 12:58:40 GMT
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-request-id
C1DAF9E5E5E8098C
Content-Length
53
x-amz-id-2
LzS28mRNmCuccFhNwZE4o2pm/fxVNZWP6nLD839u2xSMH25T7WpoPA51RI9HRIcf/nEhbTCBfW0=
Last-Modified
Tue, 03 Dec 2019 06:40:04 GMT
Server
AmazonS3
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
https://videos.giga.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Accept-Ranges
bytes
Expires
0
giga-ssl.json
videos.giga.de/homad/ Frame 34FB
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-c972511a.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

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

Response headers

date
Tue, 03 Dec 2019 12:58:39 GMT
content-encoding
gzip
last-modified
Thu, 04 Jul 2019 08:23:54 GMT
server
nginx/1.14.1
etag
W/"5d1db79a-109"
status
200
access-control-allow-methods
GET
content-type
application/json
access-control-allow-origin
*
cache-control
max-age=900
access-control-allow-headers
accept, content-type
expires
Tue, 03 Dec 2019 13:13:39 GMT
5199031868
api.yieldlove-ad-serving.net/v1/bl/4444/
44 B
248 B
XHR
General
Full URL
https://api.yieldlove-ad-serving.net/v1/bl/4444/5199031868
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
18.194.21.214 Frankfurt am Main, Germany, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-18-194-21-214.eu-central-1.compute.amazonaws.com
Software
/ Express
Resource Hash
b2a27a31e9d34704f0c2adae8a77ce35e0bc3c352a40a682d89783142780c2f7

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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Origin
https://www.giga.de

Response headers

date
Tue, 03 Dec 2019 12:58:39 GMT
x-powered-by
Express
etag
W/"2c-wDll0Jp0iexOSFL7+9AsyW9PVP8"
x-key
/bl/4444/5199031868
status
200
content-type
application/json; charset=utf-8
access-control-allow-origin
*
cache-control
public, max-age=604800
content-length
44
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=V7-vQCFgNxVvEREoPIQgRxVvEREoPIQgUAAAAGBvQHG8XiLIcjxmixG26Gw8lit5gtF8PZcLmYDCGjWJzlcMQYLXbDzXA4Wcw2q-FyOBxtphBiLJfJoBZIWGa_76CgnJ4es8sgY7lMBrVA1jS5_G5IQ9Pp8Lnu9brf765z-hx2kcuvMp4uD7_YaXt5TpeXw-3XHF4ep8Ps-Ss9p7fmZXm67J7T5eVw20V_t9jlc5jdepPL8laazS6fw-wWOl2Wt8pycxgtp7fSaHmrPH85AAAAADwAKBX2Q_wAAgBEAAAAAEgAAAAAUARU_FsIXAAAAABgABRg_WgAQHEwnOtufdmNDtfnZfcHAMBDAAgAwIACCcAATlMJQEXOwQkAAAAAAAAAAMv___9_DIAe8ZkMQIbSYA_Agw_AA1HBahEjAAAAAEimNo-jSZ1QWVQBABCkWwFcAQAEuC1fa3GGAQAAEIwt0MPi95sddo3f7TIAAAAAAAAAALP_s380IaIxt7QglgJetV9AAIC1X0AAADZ1AwB4C4ALOoJWDAarM4jJZrSbzA4AAADg7v___18PJBaT1ca0Mo0mzo3JtFiMVg7fwjdbmRyb5XKzcGyPmNcs0qcEG6BvRFhmv--goJyeHrPLIGO5TAa1QNY0ufwG8UHDsJwMgvlN2GK0mkw2y-FsuZgMhqPhaLQ_gRsNcIKGw8FiN1jsFovhZDEZDZaDBQrEYIITMhxtJqvRbrWbLIeT0Wi2mWyQolWr2WgzGK5mk9lutxoOhsvRCClas5hNJovZaLnbDJaT0WA4GQ4RRnazkXO3mrh1g83GLdr4Jm7hZjhYq1ym0cI1M3kWvolb9PqYTiOby7EbeVEwgGovgot0ojld_i6X5a15W9w6p89hEUs0J4t0IrvsG4vJamNamUYT58ZkWixGK4dv4ZutTI7NcrlZOPaV3Wzk3K0mbt1gs3GLNr6JW7gZDtYql2m0cM1MnoVv4ha9PqbTyOZy7Eb-xmq32ux2y8Vu31jtVpvdbrnY7Tt0hu_qczYqb1qFx-RRPiPf5sxpULgMFu9PYlpMu7OD5_c7OlWqi8bYkH0TCrPBYzAoYongdJFORC_j6SKWSJ4W6UQ1snlMM49nOBnNDCvjbmYxeWwTj2e1Wk5mi4XFIpYoTRfpRK8yni4Pv9hpe3lOl5fD7dccXh6nw-z5Kz2nt-ZlebrsntPl5XDbRX-32OVzmN16k8vyVprNLp_D7BY6XZa3ynJzGC2nt9Joeas8F_UfG2I0mutmc8VgOdcMVgkAAAAAAAAAYAlz5k0AAAAATgNZLAaTxXIBIMRYd--Q8tOfugNlihs_hpjT5e9yWd6at8Wtc_ocBg!&cmcv=&uv=2658&unm=FEED_MANAGER&cb=1575377919380&abt=afc7_vD!des2_vA!expl_vB!pix100!pix100!pl53468-288_vB!u2658_vA!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 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:39 GMT
via
1.1 varnish
server
nginx
x-timer
S1575377919.391380,VS0,VE8
x-served-by
cache-hhn4053-HHN
x-cache
MISS
status
200
accept-ranges
bytes
content-length
0
x-cache-hits
0
config.json
hgc-cf-cache-1.svonm.com/www.giga.de/ Frame 34FB
724 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-c972511a.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.225.78.95 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-225-78-95.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
b1ae253cba132ab2566227a6f5a59ea9a90cdffef6f6bf06c55a222ed3afef53

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
Referer
https://videos.giga.de/embed/78410589?autoplay=0
Origin
https://videos.giga.de

Response headers

Date
Tue, 03 Dec 2019 12:58:39 GMT
Via
1.1 91ba7c34719cd9c69e0357c149b94b90.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
X-Amz-Cf-Pop
FRA2-C2
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
724
Last-Modified
Mon, 18 Nov 2019 12:24:39 GMT
Server
AmazonS3
ETag
"bb9cc8757cf3880ea4d6e84944c9118b"
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
Pw_kPNmmmY0oCU69h9uf0DtkRutnToy4p8vqFoPmQDJpYrZmOrtfQg==
Expires
0
monitoring.js
acdn.prod.pubstack.io/
61 KB
62 KB
XHR
General
Full URL
https://acdn.prod.pubstack.io/monitoring.js
Requested by
Host: boot.pubstack.io
URL: https://boot.pubstack.io/v1/tag/f9b17833-d68c-4e4d-b319-d6061d45aa9f
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2620:1ec:bdf::10 , United States, ASN8068 (MICROSOFT-CORP-MSN-AS-BLOCK - Microsoft Corporation, US),
Reverse DNS
Software
Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0 /
Resource Hash
413364272994992257eb29f54a63fd828220d3217d8cf955e57f4edb3a4e3402

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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Origin
https://www.giga.de

Response headers

x-ms-blob-type
BlockBlob
date
Tue, 03 Dec 2019 12:58:39 GMT
x-azure-ref-originshield
0P0/mXQAAAABSWq+ZjQHqTZAaYy/kvCjhQU1TRURHRTA0MDkAMWQ5ZWE5NzctYWI2Ny00N2M3LTkzYTUtMzIzYzA3MDkwMTQy
content-md5
UMybFUfJ/8s/2SB+QLYBdA==
x-cache
TCP_HIT
status
200
content-length
62538
x-ms-lease-state
available
x-ms-lease-status
unlocked
last-modified
Mon, 02 Dec 2019 15:45:11 GMT
server
Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0
etag
"0x8D7773E9D7E7467"
x-azure-ref
0/1vmXQAAAADZe6L7pKJYQLe7h9im+OqSVklFRURHRTAyMTEAMWQ5ZWE5NzctYWI2Ny00N2M3LTkzYTUtMzIzYzA3MDkwMTQy
content-type
application/javascript
access-control-allow-origin
*
x-ms-request-id
1961146c-701e-00a4-26d0-a90c32000000
cache-control
public, max-age=3600
x-ms-version
2014-02-14
accept-ranges
bytes
Cookie set map
ih.adscale.de/ Frame F15D
0
0
Document
General
Full URL
https://ih.adscale.de/map?ssl=1&format=video
Requested by
Host: js.adscale.de
URL: https://js.adscale.de/map.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
72.247.225.134 , United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a72-247-225-134.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
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Accept-Encoding
gzip, deflate, br
Cookie
uu=3712213cbba249619cfb11e8ca564c3e; tu=4#588844478#48~c691c1b2ce4aa7b0c77ae005c6c76af2~437604~0~0; ng=2#989891582#26256298#0#d7~1&d10~1&d2~2&d4~1&d11~3&d8~2&d9~3&d12~2&d1~1&d3~1
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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/

Response headers

Server
Apache-Coyote/1.1
Content-Type
text/html;charset=ISO-8859-1
Vary
Accept-Encoding
Content-Encoding
gzip
Expires
Tue, 03 Dec 2019 12:58:39 GMT
Cache-Control
max-age=0, no-cache, no-store
Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:39 GMT
Content-Length
653
Connection
keep-alive
Set-Cookie
tu=4#1668899182#48~c691c1b2ce4aa7b0c77ae005c6c76af2~437604~0~0#101~~437604~437604~1#38~~437604~437604~1#72~~437604~437604~1#42~~437604~437604~1#75~~437604~437604~1#60~~437604~437604~1#108~~437604~437604~1#63~~437604~437604~1; Max-Age=2592000; Domain=ih.adscale.de; Path=/; Secure; SameSite=None
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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
date
Tue, 03 Dec 2019 12:58:39 GMT
content-length
56
content-type
text/plain; charset=utf-8
p.min.js
cdn.emetriq.de/adp/profiling/0.2.18/
5 KB
2 KB
Script
General
Full URL
https://cdn.emetriq.de/adp/profiling/0.2.18/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:2156:3a00:1c:8c89:a300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
71d6f1be201b12679e95174bb48c793084abf7813b767a4069b8ddbe4876c6ec

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 25 Sep 2019 11:24:11 GMT
content-encoding
gzip
last-modified
Wed, 25 Sep 2019 11:08:07 GMT
server
AmazonS3
age
5967269
vary
Accept-Encoding
x-cache
Hit from cloudfront
x-amz-version-id
fTNde0ZXM.BzDu33z6pL5eJgKGxahMla
status
200
cache-control
max-age=31536000, no-transform, public
x-amz-cf-pop
FRA50-C1
content-type
application/javascript; charset=utf-8
x-amz-cf-id
gOb7QecJEhuWeYdvKC90nhHrCii9B8iGglNqN48-Mc7xT5c9437QzA==
via
1.1 5317564e96c9dceb46123f6c5f149a03.cloudfront.net (CloudFront)
hd-main.js
hgc-cf-cache-1.svonm.com/ Frame 34FB
194 KB
57 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/hd-main.js?cache=IQBXIQgxXX
Requested by
Host: videos.giga.de
URL: https://videos.giga.de/dist/js/embed/bundle/videojs-c972511a.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.225.78.95 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-225-78-95.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
cf5f7097095ba3ad82d596ed9d919f9f5c9e8110c655e860ac16088c39df9aa6

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
Referer
https://videos.giga.de/embed/78410589?autoplay=0
Origin
https://videos.giga.de

Response headers

Date
Tue, 03 Dec 2019 12:58:39 GMT
Content-Encoding
gzip
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
X-Amz-Cf-Pop
FRA2-C2
Transfer-Encoding
chunked
X-Cache
Hit from cloudfront
Connection
keep-alive
Access-Control-Allow-Origin
https://videos.giga.de
Last-Modified
Tue, 03 Dec 2019 10:31:46 GMT
Server
AmazonS3
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/javascript
Via
1.1 91ba7c34719cd9c69e0357c149b94b90.cloudfront.net (CloudFront)
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
X-Amz-Cf-Id
HUAXPV6DC3UdUg0e1OmEMnd7Yoy8qzkER2xEbc9KV86XiQTpel1elQ==
data
ups.xplosion.de/
4 KB
3 KB
Script
General
Full URL
https://ups.xplosion.de/data?title=Serienstream.to%3A%20Kostenlos%20online%20Serien%20und%20Filme%20bei%20S.to%20sehen%20%E2%80%93%20ist%20das%20legal%3F&hostSiteUrl=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%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=-1&screen=1200x1600&mbr=c691c1b2ce4aa7b0c77ae005c6c76af2&event_id=page_view&_sid=69511&_ver=0.2.18&_seg=jsonp&_=962860830739
Requested by
Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.2.18/p.min.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.77.22.22 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-77-22-22.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
a52f6ae223268cd95cd086b2cb01396c1337d3ac5a0d06acefe0fba13fdad3a0

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 03 Dec 2019 12:58:39 GMT
content-encoding
gzip
access-control-allow-origin
*
vary
accept-encoding
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
status
200
cache-control
must-revalidate,no-cache,no-store
content-type
text/javascript
truncated
/ Frame 34FB
194 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
cf5f7097095ba3ad82d596ed9d919f9f5c9e8110c655e860ac16088c39df9aa6

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
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/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
63.34.92.224 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-63-34-92-224.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.9 /
Resource Hash
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (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, 20 Nov 2019 15:04:45 GMT
Content-Encoding
gzip
Last-Modified
Wed, 20 Nov 2019 14:54:15 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 FCC9
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSaFWSBFWsb-ES_CWSUkWsfABifABSfABSfABifABifABfrr&cb=https%3A%2F%2Fuss.xplosion.de%2Fusersync%3Fsid%3D65966%26fpid%3D%7B%7BUUID%7D%7D
  • https://uss.xplosion.de/usersync?sid=65966&fpid=4211298130613448577
42 B
659 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=65966&fpid=4211298130613448577
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.77.22.22 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-77-22-22.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
date
Tue, 03 Dec 2019 12:58:39 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
content-length
42
content-type
image/gif

Redirect headers

pragma
no-cache
date
Tue, 03 Dec 2019 12:58:39 GMT
server
nginx
location
https://uss.xplosion.de/usersync?sid=65966&fpid=4211298130613448577
p3p
CP="CAO PSAa PSDa IVAa IVDa OUR UNI COM NAV"
status
307
cache-control
no-store, no-cache, must-revalidate
access-control-allow-credentials
true
content-type
text/html; charset=utf-8
content-length
107
expires
0
activation
adstax-match.adrtx.net/ Frame 453A
0
0
Document
General
Full URL
https://adstax-match.adrtx.net/activation?receiverId=adaud
Requested by
Host: cdn.adrtx.net
URL: https://cdn.adrtx.net/adrtxtag.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
108.128.71.27 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-108-128-71-27.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.10 /
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
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/

Response headers

Cache-Control
no-cache, no-store, must-revalidate
Content-Type
text/html; charset=UTF-8
Date
Tue, 03 Dec 2019 12:58:39 GMT
P3P
CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"
Server
akka-http/10.1.10
X-Error-Reason
Missing UserId
Content-Length
39
Connection
keep-alive
error
intake.prod.pubstack.io/v1/intake/
0
178 B
XHR
General
Full URL
https://intake.prod.pubstack.io/v1/intake/error?sId=b090ce7b&c=1
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.18.103.144 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-18-103-144.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Access-Control-Request-Method
POST
Origin
https://www.giga.de
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Access-Control-Request-Headers
content-type

Response headers

status
204
date
Tue, 03 Dec 2019 12:58:39 GMT
access-control-allow-origin
*
access-control-allow-headers
Origin,Content-Length,Content-Type
access-control-max-age
43200
access-control-allow-methods
GET,POST,PUT,PATCH,DELETE,HEAD
auction
intake.prod.pubstack.io/v1/intake/
0
178 B
XHR
General
Full URL
https://intake.prod.pubstack.io/v1/intake/auction?sId=b090ce7b&c=3
Requested by
Host: www.giga.de
URL: https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.18.103.144 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-18-103-144.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Access-Control-Request-Method
POST
Origin
https://www.giga.de
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
Access-Control-Request-Headers
content-type

Response headers

status
204
date
Tue, 03 Dec 2019 12:58:39 GMT
access-control-allow-origin
*
access-control-allow-headers
Origin,Content-Length,Content-Type
access-control-max-age
43200
access-control-allow-methods
GET,POST,PUT,PATCH,DELETE,HEAD
dt
dt.adsafeprotected.com/
43 B
301 B
Image
General
Full URL
https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=fb3f2068-5b00-a4e5-9683-b2be5d627beb&tv={c:vK3JFP,pingTime:1,time:1068,type:p,clog:[{piv:100,vs:i,r:,w:300,h:250,t:28}],es:0,sc:1,ha:1,gm:0,slTimes:{i:1068,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:28,wc:0.0.1600.1200,ac:968.278.300.250,am:i,cc:968.278.300.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[1059~100],as:[1059~300.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:291,fm:rJAVcpX+11|12|1311|1312|1313|14|15|161|1711|18|19|1a|1b|1c|1d|1e|1f|1g*.346702-39754020|1h|1i|1j|1k,idMap:1g*,rend:0,renddet:WINDOW,rmeas:0}&br=u
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.36.20 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
nyidt.adsafeprotected.com
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:40 GMT
X-Server-Name
dt04.303net.pvt
P3P
CP="COM NAV INT STA NID OUR IND NOI"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Server
nginx
dt
dt.adsafeprotected.com/
43 B
301 B
Image
General
Full URL
https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=fb3f2068-5b00-a4e5-9683-b2be5d627beb&tv={c:vK3JFQ,pingTime:1,time:1069,type:c,clog:[{piv:100,vs:i,r:,w:300,h:250,t:28}],es:0,sc:1,ha:1,gm:0,slTimes:{i:1069,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:28,wc:0.0.1600.1200,ac:968.278.300.250,am:i,cc:968.278.300.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[1060~100],as:[1060~300.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:291,fm:rJAVcpX+11|12|1311|1312|1313|14|15|161|1711|18|19|1a|1b|1c|1d|1e|1f|1g*.346702-39754020|1h|1i|1j|1k,idMap:1g*,rend:0,renddet:WINDOW,rmeas:0,metricId:forwrd1,cmr:t}&br=u
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.36.20 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
nyidt.adsafeprotected.com
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:40 GMT
X-Server-Name
dt70.303net.pvt
P3P
CP="COM NAV INT STA NID OUR IND NOI"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Server
nginx
error
intake.prod.pubstack.io/v1/intake/
0
57 B
XHR
General
Full URL
https://intake.prod.pubstack.io/v1/intake/error?sId=b090ce7b&c=1
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.18.103.144 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-18-103-144.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
Content-Type
application/json

Response headers

status
204
access-control-allow-origin
*
date
Tue, 03 Dec 2019 12:58:39 GMT
auction
intake.prod.pubstack.io/v1/intake/
0
57 B
XHR
General
Full URL
https://intake.prod.pubstack.io/v1/intake/auction?sId=b090ce7b&c=3
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.18.103.144 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-18-103-144.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
Content-Type
application/json

Response headers

status
204
access-control-allow-origin
*
date
Tue, 03 Dec 2019 12:58:39 GMT
activeview
pagead2.googlesyndication.com/pcs/ Frame 2582
42 B
116 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjsu0nTy3MBRubzZrpYFGOC35jY1tgQ1MYxgkdUn_64l6mebWTzQ3HV9EkvT2JHjaLCChyU7Yf1ux03NAefMOH50ADustO8rHOVfGOmBzCjc&sig=Cg0ArKJSzEchIqCLYOp1EAE&adk=1946589169&tt=-1&bs=1585%2C1200&mtos=1036,1036,1036,1036,1036&tos=1036,0,0,0,0&p=278,968,528,1268&mcvt=1036&rs=0&ht=0&tfs=107&tls=1143&mc=1&lte=1&bas=0&bac=0&met=ie&avms=nio&exg=1&md=2&lm=2&rst=1575377918559&dlt&rpt=313&isd=0&msd=0&ext&imams=1&xdi=0&mxd=1&ps=1585%2C6897&ss=1600%2C1200&pt=-1&bin=4&deb=1-0-0-6-10-2-9-9-0-0-0&tvt=1143&is=300%2C250&iframe_loc=https%3A%2F%2Fwww.giga.de%2Fextra%2Flivestream%2Fspecials%2Fist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es%2F&r=v&id=osdim&vs=4&uc=10&upc=1&tgt=DIV&cl=1&cec=1&clc=1&cac=1&cd=0x0&itpl=19&v=20191115
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:814::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 03 Dec 2019 12:58:40 GMT
x-content-type-options
nosniff
content-type
image/gif
server
cafe
access-control-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
status
200
cache-control
no-cache, must-revalidate
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="46,43",quic=":443"; ma=2592000; v="46,43",h3-Q050="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043="googleads.g.doubleclick.net:443"; ma=2592000,h3-Q043=":443"; ma=2592000
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
usersync
uss.xplosion.de/
42 B
658 B
Image
General
Full URL
https://uss.xplosion.de/usersync?sid=69511&fpid=c691c1b2ce4aa7b0c77ae005c6c76af2
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.77.22.22 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-77-22-22.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

status
200
date
Tue, 03 Dec 2019 12:58:40 GMT
cache-control
must-revalidate,no-cache,no-store
access-control-allow-origin
*
p3p
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
content-length
42
content-type
image/gif
global_config.json
s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/ Frame 34FB
53 B
703 B
XHR
General
Full URL
https://s3.eu-central-1.amazonaws.com/homad-global-configs-eu-fra.schneevonmorgen.com/global_config.json?cache=1295745480
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGVlQmljaGFoTWlhTWVlR2g9ZWVCaWNoYWhNaWFNZWVHaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZmZ8fCh4LmZmPTApO3guZmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5mZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5IayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2IudmYoYyk7Yi5BbihtKTtiLnpuKGwpO2Iubm4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Jbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS51aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudWgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmlsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5pbHx8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuSGs9ITE7dGhpcy5HYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlptLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5naD17fTt0aGlzLnNmPSExfWMuY2o9YTthLnByb3RvdHlwZT17Wm46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt0aGlzLnNmfHwodGhpcy5zZj1lLlgoMTApKTtyZXR1cm4gdGhpcy5zZn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmdoW2JdJiYodGhpcy5naFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLlpuKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx6azpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sWm06ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuWW0oYi5kYXRhKX0sWW06ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxCZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5XZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMueWQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxXZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSx4azpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnRhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnRsKGIpKXJldHVybjsoYT10aGlzLkJnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx0bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTGc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHBtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFVnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxLbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHhmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuYWwoYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuS24oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sSms6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGFsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5KayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxEZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxwaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxMYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFRoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LGttOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scWQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLmFjPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0FpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEhpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LAphbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxGajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxoazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sc2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxVajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LERrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuQWkoKXx8Yi5IaSgpfHxiLmFtKCl8fGIuRmooKXx8Yi5oaygpfHxiLnNqKCl8fGIuVWooKX19O3JldHVybiBudWxsIT1iLkRrKCl9LHlsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sdGE6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxDYjpmdW5jdGlvbihiKXtiPXRoaXMudGEoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LE1sOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMudGEoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxkbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxSbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxRZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMua2koYSkrIjoiK3RoaXMua2koTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGtpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx1ZjpmdW5jdGlvbihiKXt0aGlzLkdiPWJ9LE5nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuR2I7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxhbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLk1sKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sU246ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmdjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5hbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLnZhKGIsITApO2I9bS52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS52YShmLCEwKTtmPW0udmEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFFkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS52YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uT2soKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnVkKGIpOiIifSx1ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG1nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy5wbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnFmJiZ3aW5kb3cuc2FuZGJveC5xZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLkxnKGIpKXJldHVybiB0aGlzLkxnKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS53ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy54ayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixlKTtlPWsudmEoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHlkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSx5bTpmdW5jdGlvbihiLGEsZCl7dGhpcy55ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx1aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMueW0oZi53ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCkluOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGNwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxGazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0saW06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuY2p8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLmJqPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuVG09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuTW09e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuWm89e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5rbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmJwPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuZ2c9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuWmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5kZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5oZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EucGs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuYmc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Gbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EubGw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS4kbz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS54Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLlprPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5tZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5mZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eucms9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5iZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnFrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5yaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLk9tPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuemQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS55Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuWW89e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuQm89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkNvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Bbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLk5tPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5ianx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLmZsfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxJbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdGQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnRkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudGQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudGQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG5oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5JbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnRkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmRqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5oaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLmhqfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuSWk9YX0pKGMpO3ZhciBLPWMuSWl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Ca3x8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Laj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTWI9MDt0aGlzLlRhPTE1MDt0aGlzLlNiPTA7dGhpcy5CbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGE/KHRoaXMuTWIrKyx0aGlzLlNiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5TYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHRuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWI+dGhpcy5UYT8hMDohMX0scGY6ZnVuY3Rpb24oKXt0aGlzLk1iPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxCbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sR2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudGgmJkwuWW4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxqbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLktqfHx0OyhmdW5jdGlvbihjKXtjLk1qPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5NYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRmI9IiI7dGhpcy5EZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKTW46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sRW46ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGEmJih0aGlzLk1iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVGc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sR2Q6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5YbCgpfHx0aGlzLnRrKCk7dGhpcy5HZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHRrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sWGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx3YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxTaDpmdW5jdGlvbihhKXt0aGlzLkZiPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmJ9LE9oOmZ1bmN0aW9uKCl7dGhpcy5GYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRmImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkRnfHwodGhpcy5EZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLk1qfHxxOyhmdW5jdGlvbihjKXtjLnppPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuV2Y9IjEiO3RoaXMuWGY9IjIiO3RoaXMubWs9IjMiO3RoaXMuJGM9MDt0aGlzLkZtPQozMDt0aGlzLlhiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5pZz10aGlzLm1pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMudmYoYSk7dGhpcy5DbihiKX0sZjpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLm1pfHwodGhpcy5taT0hMCxlLlhlKCkpfSxBaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGNtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmdjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5nYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV09MX0sZ206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZ2MoKSYmKHRoaXMud2YoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy56YSgpKXt0aGlzLmNtKCk7aWYoIXRoaXMuZ20oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMud2YoKTtyZXR1cm59dGhpcy53ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuZ2koKTt0aGlzLmlnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy56YSgpfHwodGhpcy5YYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGdpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5YYiYmMDx0aGlzLlhiLmxlbmd0aCYmKHRoaXMuWGI9ZS51bmlxdWUodGhpcy5YYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWGIuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLldmfSx3ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWGZ9LEpuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ta30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxhZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5XZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWGZ9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx2ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LENuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxHbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEJtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy56aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkJqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5Canx8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUGk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUGl8fG5hOyhmdW5jdGlvbihjKXtjLlFpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubmE/Yi5uYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlFpfHxvYTsoZnVuY3Rpb24oYyl7Yy5SaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5SaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLnRvfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5uaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuS2coKTt0aGlzLk1nKCk7dGhpcy5Zaz0hMX0sS2c6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxNZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5JZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSWQoYil9LmJpbmQodGhpcykpfSxJZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5uanx8cmE7KGZ1bmN0aW9uKGMpe2MubWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuaGU9ITE7dGhpcy5rZT0xO3RoaXMuYWQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuaGU9ITE7dGhpcy5rZT0xO3RoaXMuYWQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTtpZihhLmdldENvbmZpZylpZihiPWEuZ2V0Q29uZmlnKCksYi5hZHZlcnRpc2luZyl7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSlpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcyliLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5rZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMueWI9ITApO2Vsc2V7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSBpbnN0YW5jZW9mIEFycmF5KWZvcih2YXIgZz0wO2c8Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5sZW5ndGg7ZysrKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGVbZ10udGFnKXt0aGlzLnliPSEwO2JyZWFrfWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMueWI9ITApO2IuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMueWI9ITApfWIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy55Yj0hMCl9ZWxzZSB0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpO2Zvcih2YXIgZD0KImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGc9MDtnPGQubGVuZ3RoO2crKylhLm9uKGRbZ10sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtnXSYmKHRoaXMuaGU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtnXSYmdGhpcy5BaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLkZtJiYhdGhpcy56YSgpJiYodGhpcy55Yj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5nKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoZXZlbnQuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKTthLm9uKCJwbGF5bGlzdGl0ZW0iLApmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLllrPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5GYjtiJiYoYi5CZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmFkLmluZGV4T2YoYikmJnRoaXMuYWQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy53KCksdGhpcy5vYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMudygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLmFkLmxlbmd0aD49dGhpcy5rZSYmdGhpcy5nKCkpfSwKQm06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRGYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmhlfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuS2coKSxiLk1nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciBzYT1jLm1qfHxzYTsoZnVuY3Rpb24oYyl7Yy5vaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT0KdGhpcy5DbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2E9W107aWYoMTxiLmxlbmd0aClmb3IoZz0wO2c8Yi5sZW5ndGg7ZysrKWEucHVzaChiW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBhLnB1c2goandwbGF5ZXIoKS5pZCk7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpO3RoaXMuTChnKXx8dGhpcy5qbShnKXx8KHRoaXMuTihnKSxnPW5ldyBzYShnLHRoaXMuRyksZy5LKCksZy5mKCkpfX10aGlzLlAoKX19LEpwOmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LENsOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS56YihhLmFuY2hvcil9fSl9KShjKTt2YXIgdGE9Yy5vanx8dGEsdWE9bmV3IHRhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ibz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuYm98fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmNrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCks6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEpe3ZhciBiPWEuZWxfO2J8fChiPWEuZWwoKSk7Yj8odGhpcy5UKGIpLChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlcoYSk6dGhpcy5aKCkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYSl7dGhpcy5QZChhKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFiWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGEuYXV0b3BsYXk/YS5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sd2E6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHdhPWMuY2t8fHdhOyhmdW5jdGlvbihjKXtjLmJrPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMudWE9dGhpcy5LYz10aGlzLkJhPXRoaXMuZWQ9ITE7dGhpcy5KaD1lLkxiKDEwKTt0aGlzLklmPSEwO3RoaXMueGM9dGhpcy5raD0hMTt0aGlzLkttKGEuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy56aCgpLHRoaXMuS2soKSx0aGlzLnNiKCkpfSxLbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLAoiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGEuViwiOyIsdHlwZW9mIGEuViwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYS5WP2EuVi5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGEuVj90eXBlb2YgYS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYS5pbWEsIjsiLHR5cGVvZiBhLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGEuSCwiOyIsdHlwZW9mIGEuSCwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLmltYT9hLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuRWE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuRWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILkVhOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguRWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5pbWEmJmEuaW1hLkVhP2EuaW1hLkVhKCk6InVuZGVmaW5lZFgiLCI7IixhLmltYSYmYS5pbWEuRWE/dHlwZW9mIGEuaW1hLkVhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5mZToKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuZmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixhLkg/YS5ILmZlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguZmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILmdlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguZ2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubmE6InVuZGVmaW5lZFgiLCI7IixhLkg/CnR5cGVvZiBhLkgubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5xZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuSmgpfSxIYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5pbWEzJiYodGhpcy5pbWE9YS5pbWEzKTtpZihhLmltYSl7dGhpcy5pbWE9YS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmCih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LEljOmZ1bmN0aW9uKCl7aWYoIXRoaXMubmEpe3ZhciBhPXRoaXMuSGMoKTthJiYoYS5hZHNMb2FkZXImJih0aGlzLm5hPWEuYWRzTG9hZGVyKSxhLl9hZHNMb2FkZXImJih0aGlzLm5hPWEuX2Fkc0xvYWRlciksYS5nZXRBZHNMb2FkZXImJih0aGlzLm5hPWEuZ2V0QWRzTG9hZGVyKSxhLmNvbnRyb2xsZXImJmEuY29udHJvbGxlci5zZGtJbXBsJiZhLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm5hPWEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm5hfSxZZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LGhtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuamgpe3ZhciBhPQp0aGlzLkhjKCksYj10aGlzLmZtKCk7d2luZG93LmltYSYmYSYmKGEuX2Fkc0xvYWRlcnx8YS5hZHNMb2FkZXJ8fGIpJiYodGhpcy5qaD0hMCl9cmV0dXJuIHRoaXMuamh9LGZtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5lZCYmYS5hZHMmJihhLmFkcy5zdGF0ZXx8YS5hZHMuX3N0YXRlKSYmKHRoaXMuZWQ9ITApO3JldHVybiB0aGlzLmVkfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWMoKTtpZihhKXt2YXIgYj0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5rbigpfS5iaW5kKHRoaXMpKSwKYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5jYShiLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5iYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxrbjpmdW5jdGlvbigpe3RoaXMueGM9ITA7dmFyIGE9dGhpcy5ZZygpO2lmKGF8fHRoaXMuemEoKSl7dmFyIGI9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5jYShiKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oYil7dGhpcy5jYShiLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5iYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuU2EoKSYmKGQ9Ik1fIik7YS5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDsKaWYoZS5GKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYi5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIisKZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnljfHwodGhpcy5tKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5iYSgpLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LElwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5BZyYmYS5hZHMmJih0aGlzLkFnPWEuYWRzKTtyZXR1cm4gdGhpcy5BZ30sS2s6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7CnRoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLkFoKCl9LmJpbmQodGhpcykpfSxvZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksCjUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YSYmKChhPXRoaXMuWWcoKSkmJmEuZGVzdHJveT9hLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2QoKX0uYmluZCh0aGlzKSw1MCkpfSx6aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcoKSYmMDxhLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5obSgpKXt2YXIgYj10aGlzLkhjKCksZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLncoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5raD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8KKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5iYSgpKToodGhpcy5iYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMua2g9ITA7YS5pc1BsYXlpbmcoKSYmMTA8YS5jdXJyZW50VGltZSgpfHx0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56aCgpfS5iaW5kKHRoaXMpLDUwKX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYihnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sTGs6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpOwpyZXR1cm59fWVsc2UgdGhpcy5DYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGsoKX0uYmluZCh0aGlzKSwxMCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIGUueGU/ITE6dGhpcy51YX0sQ2E6ZnVuY3Rpb24oKXtpZih0aGlzLllsKCkpe3RoaXMudWE9ITA7aWYoZS5GKCJnaWdhLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKXRoaXMuSWY9ITEsZS50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsInNldCIsITApO3RoaXMuZyghMCl9ZWxzZSB0aGlzLnVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpfSxZbDpmdW5jdGlvbigpe2lmKDA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPQohMTtlLnlkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2E9IWUuZmIoYi5jYyl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXthPSExfSwhMCwhMCk7dmFyIGI9ZS55bCgpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGUueGU9LTEhPWIuaW5kZXhPZigiZmlyZWZveCIpfHwtMSE9Yi5pbmRleE9mKCJzYWZhcmkiKXx8YX1yZXR1cm4hMX0sYmE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCk/KHRoaXMudygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy56YSgpfHwoYXx8KHRoaXMuSWY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSWYsZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApUazpmdW5jdGlvbigpe3RoaXMuUnB8fCgxMDx0aGlzLkxvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuTG8rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5zbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UaygpfS5iaW5kKHRoaXMpLDUwKSkpfSxzbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Nbyl7dGhpcy5Nbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7CmEudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmJrfHx4YTsoZnVuY3Rpb24oYyl7Yy5kaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuWGgod2luZG93KTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyl0cnl7Yj1ifHx0aGlzLlhoKGFbZ10pfWNhdGNoKGQpe310aGlzLlAoKX19LFhoOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5TYj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5RYyl9fSl9KShjKTt2YXIgeWE9Yy5ka3x8eWEsemE9bmV3IHlhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Baj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEFhPWMuQWp8fEFhO25ldyBBYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuZ2Y9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTsKcmV0dXJufXRoaXMuVChiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2E/dGhpcy5XKGEpOnRoaXMuWigpfSxWbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkZiLGc9dGhpcy5oYSgpLGQ9IiI7YS5tZW1vJiYoZD1hLm1lbW8udmlkZW9pZCk7ZCYmYiYmYi5qYyYmKDA8PWcuaW5kZXhPZihkKXx8Yi5CZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuZ2Y9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKd2E6ZnVuY3Rpb24oKXt0aGlzLmdmKys7aWYoMTA8dGhpcy5nZilyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFBkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgphJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlUmJnRoaXMuVSgpfX0pfSkoYyk7dmFyIEJhPWMuSGp8fEJhOyhmdW5jdGlvbihjKXtjLkdqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQmUpaWYodGhpcy5IYnx8KHRoaXMuSGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5IYisrLDE1PHRoaXMuSGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZyghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPQohMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYihnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpOwp2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLm9sPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy5vbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlZtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwKMTAwKX0sZzpmdW5jdGlvbihhKXt0aGlzLkQoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Hanx8Q2E7KGZ1bmN0aW9uKGMpe2MuSWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5UYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmCihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyBCYShhW2JdKTtnLmphfHx0aGlzLkwoZyl8fCh0aGlzLk4oZyksKG5ldyBDYShnLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRGE9Yy5Janx8RGEsRWE9bmV3IERhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5UbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuVGx8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmpqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlVnKGEsImVsZW1lbnRJRCIpOwpzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLlhtPWEucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1hLndpZHRoO2cuc3R5bGUubWluV2lkdGg9YS53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5YbSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsCmIpfXRoaXMuVChnKTt0aGlzLlcoZyk7dGhpcy5yZD1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMucmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnJkKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sU2s6ZnVuY3Rpb24oKXtlLnBoKHRoaXMucmQpO2UuT2UodGhpcy5yZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNrKCl9LmJpbmQodGhpcyksNTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LFVlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5qanx8R2E7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuaWp8fEhhOyhmdW5jdGlvbihjKXtjLmtqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiYKbC5pbnJlYWQpe3ZhciBhPWwuaW5yZWFkLGI9ZS5VZyhhLCJlbGVtZW50SUQiKTtpZihlLnBoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTChhKSkpe3RoaXMuTihhKTsobmV3IEhhKGEsdGhpcy5HKSkuZigpO3JldHVybn10aGlzLlNiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBJYT1jLmtqfHxJYSxKYT1uZXcgSWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy53anx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPQoiR0VUIjt0aGlzLmRhdGE9e319Yy5laj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxEbjpmdW5jdGlvbihiKXt0aGlzLm1ldGhvZD1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LHVrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBBPWMuZWp8fEE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixnLGQsZil7dGhpcy5YYT1iO3RoaXMuUGc9dGhpcy51aT0hMTt0aGlzLkJoPWQ7dGhpcy5ZaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmCjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmMD09Yy5zdGF0dXMmJm0mJm0uUmUodGhpcy5YYS51cmwpJiZtLlZjKXt2YXIgZT1uZXcgQShiLnVybCk7ZS5EbigiUE9TVCIpO2Uuc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGEoZSxmdW5jdGlvbihiKXt2YXIgYT0hMTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChnKXthPSExfWEmJmEucGluZyYmInBvbmciPT1hLnBpbmcmJihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZmo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiKwpkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYVtkXSk7Yj1iLnN1YnN0cigxKX10aGlzLlBnJiYoYis9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0aGlzLmhiLnVybENhbGxlZD10aGlzLlhhLnVybDt0cnl7dGhpcy5ZaD90aGlzLmhiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITEpOnRoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMCksdGhpcy51aXx8KHRoaXMuaGIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGIubGVuZ3RoJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwKInJlcXVlc3RfZmFpbGVkIiwhMCk6bS5SZSh0aGlzLlhhLnVybCksdGhpcy5CaCYmdGhpcy5CaCgpfXJldHVybiB0aGlzLmhifX19KShjKTt2YXIgTGE9Yy5manx8TGE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkRhPXRoaXMuYmU9ITF9Yy5KaT1hO2EucHJvdG90eXBlPXtIbjpmdW5jdGlvbihiKXt0aGlzLmJlPWJ9LEduOmZ1bmN0aW9uKGIpe3RoaXMuRGE9Yn0scW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIiwicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIiwKdnA6IkFkU2tpcHBlZCIsd3A6IkFkU3RhcnRlZCIsbHA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixtcDoiQWRJbXByZXNzaW9uIixpcDoiQWRDcmVhdGl2ZVZpZXciLHBwOiJBZFZpZGVvTWlkcG9pbnQiLHFwOiJBZFBhdXNlZCIsc3A6IkFkVmlkZW9TdGFydCIsdHA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5iZSxhW2RdKX0scG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmFlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmFlKXRoaXMuRGEuYWUuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuRGEsdGhpcy5EYS5hZVthXSk7dGhpcy5EYSYmdGhpcy5EYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EYS5nZXRFcnJvcigpO2ImJmNvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsImdvdCBlcnJvciIsYil9LmJpbmQodGhpcyksMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5iZSYmdGhpcy5xbigpO3RoaXMuRGEmJnRoaXMucG4oKX19fSkoYyk7dmFyIE1hPWMuSml8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5IYT0hMTt0aGlzLiRiPSIiO3RoaXMuZmQ9dGhpcy5aYj10aGlzLmpiPW51bGw7dGhpcy5HZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMucGE9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm5mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk9iPSIiO3RoaXMuWmQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7CnRoaXMuWWQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLnZiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLldiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLlBiPSIiO3RoaXMuUWI9W107dGhpcy5SYj1bXTt0aGlzLlVjPVtdO3RoaXMub2M9IiI7dGhpcy5BYj0hMTt0aGlzLk9kPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuaWM9ITE7dGhpcy52Zz10aGlzLlVkPW51bGw7dGhpcy56Zj10aGlzLlZiPXRoaXMuRmc9dGhpcy5TZD10aGlzLlZjPXRoaXMuaGQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnZkPTA7dGhpcy5maD0hMTt0aGlzLmVoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5naj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy4kYixhZHRhZ21vZGlmaWVyOnRoaXMuamIsYWR0YWdtb2RpZmllckFkdjp0aGlzLlpiLGFkdGFncmVnZXg6dGhpcy5mZCxiaXRyYXRlOnRoaXMuT2EsanNwb3B1cHM6dGhpcy5UZSxzaWRlbG9hZHM6dGhpcy50YixkaXNhYmxldGVzdHM6dGhpcy5HZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLlNlLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnBhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5PYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuWmQsSE9NQURfQkxPQ0tFRDp0aGlzLllkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLldiLHRlc3RIaWRlOnRoaXMuUGIsdGVzdFRhZ3M6dGhpcy5RYix0ZXN0VGFnc0pTOnRoaXMuUmIsCnRlc3RUYWdzWEhSOnRoaXMuVWMsdGVzdDNQQ29va2llOnRoaXMub2MsdGhyb3R0bGU6dGhpcy5PZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLmljLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMudmcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5zYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuaGQsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuVmMsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuU2QsY29uZmlnRmFpbHVyZXM6dGhpcy5aYSxzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5yZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5WYixza2lwQWxsb3dlZDp0aGlzLnpmLHZtYXBzOnRoaXMuTmYsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LHluOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy4kYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLmpiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuWmI9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5mZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkdnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuU2U9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuSmM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5wYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5PYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9CmIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLlpkPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuWWQ9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMudmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5XYj1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuUGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5SYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMub2M9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLk9kPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLmljPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLnZnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuaGQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmCih0aGlzLlZjPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuU2Q9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLlphPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5yZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVmI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuemY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmCih0aGlzLk5mPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuemM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmllPWIuYWRGYWxsYmFja1VSTCl9LFZsOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYTtmb3IoYSBpbiB0aGlzLlphKSJib29sZWFuIj09dHlwZW9mIHRoaXMuWmFbYV0mJjE9PXRoaXMuWmFbYV0mJihiPSEwKTtyZXR1cm4gYn0sdGY6ZnVuY3Rpb24oYil7dGhpcy5aYVtiXT0hMH0sRGw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxNZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGI9ZS5GayhiKX0sdmE6ZnVuY3Rpb24oYixhLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy50YShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuJGJ8fHRoaXMuamJ8fAp0aGlzLlpifHx0aGlzLmZkKSYmKGg9dGhpcy5IbShoKSk7Yj1uZXcgQShlKTtiLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkZsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1oO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGgpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sUWU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSwKTGM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuZ2EmJnRoaXMuZ2EubGVuZ3RoJiYwPHRoaXMuZ2EubGVuZ3RoJiYoYT10aGlzLmdhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LFJlOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuUWUoYik7cmV0dXJuIGF9LEZsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwOwpyZXR1cm4ibm9uZSJ9LHdkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2FbdGhpcy5yZl19LFBjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy53ZCgpLGE9dGhpcy5UaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSx4aDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxHbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUudGEoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPApoLmxlbmd0aDtGKyspe3ZhciBrPWhbRl0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWZbbF09dGhpcy54aChmW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZiloLnB1c2gobCsiPSIrZltsXSk7Zj1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMueGgoZC5xdWVyeUtleVtjXSxjLGFbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxIbTpmdW5jdGlvbihiKXt0aGlzLiRiJiYoYis9dGhpcy4kYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5aYiYmKGI9dGhpcy5HbShiLHRoaXMuWmIpKTtyZXR1cm4gYn0sUms6ZnVuY3Rpb24oKXt0aGlzLnlhJiYKdGhpcy55YS5jbGllbnRBUElzJiZ0aGlzLk1rKHRoaXMueWEuY2xpZW50QVBJcyl9LE1rOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBNYTtiLnB1Ymxpc2hlckFQSSYmYS5IbihiLnB1Ymxpc2hlckFQSSk7Yi5wbGF5ZXImJmEuR24oYi5wbGF5ZXIpO2EuZigpfX0saTpmdW5jdGlvbihiLGEsZCxmLGMsZSl7bT10aGlzO3RoaXMuU2U9ITA7dGhpcy5KYz1iO3RoaXMucGE9YTt0aGlzLm5mPWQ7dGhpcy5VZD1mO3RoaXMuRGM9Yzt0aGlzLnlhPWV8fHt9O3RoaXMuUmsoKTt0aGlzLnhtKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnBhKXRoaXMudm0oKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMucGEpdHJ5e3RoaXMucGE9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnBhKXRyeXt0aGlzLnBhPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSwKcmI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGF9LHhtOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgQSh0aGlzLkpjK3RoaXMub2UoImdsb2JhbCIpKSx0aGlzLlNsLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnRmKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuQWMoKX0uYmluZCh0aGlzKSwhMCl9LHZtOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgQSh0aGlzLnBhK3RoaXMub2UoImNsaWVudCIsLTEhPXRoaXMucGEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy50ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoKIj8iKSsoImNhY2hlPSIrdGhpcy5MYigpKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1iJiYoZD0iIik7dGhpcy55YSYmdGhpcy55YS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGRhOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhkKXt0aGlzLmhkPSEwO3ZhciBhPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChnKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpOwpmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLkRjPSExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWWQpKTsKdGhpcy5UYigpO2UuRmMoay5UbSk7KGE9ZS5DYih0aGlzLndkKCkpKXx8KGE9ZS5DYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sU2w6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9aWYoIWEuZW5hYmxlZHx8IWEuZm9yY2VfZGlzYWJsZWQpdHJ5e2E9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGYpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucGF8fHRoaXMuT2J8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSwKdGhpcy5UYigpKX19LEFjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLnBhfWVsc2UgZD10aGlzLnBhO2lmKCEoZC5lbmFibGVkJiZkLnNlcnZlciYmZC5hbGlhcyYmZC5jb25maWcpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChjKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5mYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5nYT1kLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuZ2EubGVuZ3RoO2IrKyl0aGlzLmdhW2JdPXRoaXMuZ2FbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLkYoIndlYi5kZSIpfHxlLkYoImdteC5uZXQiKXx8ZS5GKCJnbXguYXQiKXx8ZS5GKCJnbXguY2giKXx8CmUuRigiMXVuZDEuZGUiKSkmJiF0aGlzLkxjKCkpZm9yKGI9MDtiPHRoaXMuZ2EubGVuZ3RoO2IrKyl0aGlzLmdhW2JdPXRoaXMuZ2FbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5PYj1kLmNvbmZpZ3x8IiI7dGhpcy5BYT1kLmFsaWFzfHxudWxsO3RoaXMuSmU9ZC5hZHBhdGh8fCIiO3RoaXMucmY9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuZ2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5PYiYmdGhpcy5BYSYmdGhpcy5nYS5sZW5ndGg/dGhpcy5NYyghMSk6KHRoaXMuSGE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy5UYigpKX0sTWM6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307aWYoYil7dmFyIGE9bmV3IEEodGhpcy5QYygpKSxkPXRoaXMudGEodGhpcy5PYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjsKYS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2EubWV0aG9kPSJQT1NUIn1lbHNlIGE9bmV3IEEodGhpcy5PYit0aGlzLm9lKCJjdXN0b21lciIpKTt0aGlzLklhKGEsdGhpcy5hby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy50ZigiY3VzdG9tZXIiKTtiP3RoaXMuVGo/dGhpcy5kYSgibm9TVk1Db25maWciKToodGhpcy5Uaj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuTWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGFvOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPWIucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtpZighdGhpcy5pYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuaWM9ITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpKXRyeXtkPQoobmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuVmM9dGhpcy5mYihkLnN0cmljdCk7dGhpcy5TZD10aGlzLmZiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkZnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy4kYT10aGlzLmZiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5mYihkLmVuYWJsZWQpO3RoaXMuUGI9ZC50ZXN0aGlkZXx8IiI7dGhpcy5SYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLlVjPWQudGVzdGFkdGFnc3hocnx8W107dGhpcy5vYz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy4kYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmpiPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLlpiPWQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5mZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5UZT0KZC5qc3BvcHVwc3x8ITE7dGhpcy50Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5WYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuVmI7dGhpcy56Zj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLmpkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5OZj1kLnZtYXBzfHwiIjt0aGlzLnpjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5PYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmllPWQuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLk9kPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMuaWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLmljPSEwLHRoaXMuTWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMucG8oKSYmKHRoaXMuUGJ8fHRoaXMuUmJ8fHRoaXMuUWJ8fHRoaXMuVWMpP3RoaXMubmY/KHRoaXMuSGE9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy50ZSgpLHRoaXMuVGIoKSk6CnRoaXMuZm8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5GZigpKX19LGZvOmZ1bmN0aW9uKCl7dGhpcy5lbygpO3RoaXMuaG8oKX0saG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksCkY9ZS5YKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihGLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2IoRikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwplLnpiKGIoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYil7fWlmKDMhPWQpe3ZhciBjPWUucWQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlNhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGEsITApO3JldHVybn10aGlzLmRhKCJjc3BfIithKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxGZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpO3RoaXMuVGIoKX0sTmQ6ZnVuY3Rpb24oYil7dGhpcy5zYz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuSGE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKGIpKSx0aGlzLlRiKCksdGhpcy50ZSgpKX0sZW86ZnVuY3Rpb24oKXtpZih0aGlzLlBiKXt2YXIgYj1lLnFkKCk7aWYoKGIuaXNDaHJvbWV8fGIuaXNGaXJlZm94KSYmdGhpcy5tbSgpKXRoaXMuTmQodGhpcy5XYiwibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXtiPSExO3RyeXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuUGIpO2Euc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5QYik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpOwpiPWR9Y2F0Y2goZil7fWI/dGhpcy5OZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5jaSgpfX1lbHNlIHRoaXMuY2koKX0sYmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoKSk7dGhpcy5rbyhmLDA8ZC5sZW5ndGg/Yi5iaW5kKHRoaXMpOnRoaXMuWmguYmluZCh0aGlzKSxhLmJpbmQodGhpcykpfWZ1bmN0aW9uIGEoKXt0aGlzLk5kKHRoaXMuV2IsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5RYj10aGlzLlVjKSYmdGhpcy5RYi5sZW5ndGgpe3ZhciBkPXRoaXMuUWIuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5aaCgpfSxrbzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwKITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSWEobmV3IEEoYiksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LGNpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYigpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkxiKCkpO3RoaXMubG8oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLmJpLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1mdW5jdGlvbiBhKCl7dGhpcy5OZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlJiJiZ0aGlzLlJiLmxlbmd0aCl7dmFyIGQ9dGhpcy5SYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLmJpKCl9LGxvOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwKITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihhLGQpe2Q9PWImJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWI7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sWmg6ZnVuY3Rpb24oKXtpZih0aGlzLm9jKXRyeXtlLnlkKHRoaXMub2MsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO3RoaXMuQWI9IXRoaXMuZmIoYi5jYyk7dGhpcy5GZigpfS5iaW5kKHRoaXMpLHRoaXMuJGguYmluZCh0aGlzKSwhMCl9Y2F0Y2goYil7dGhpcy4kaCgpfWVsc2UgdGhpcy5GZigpfSwKJGg6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKTt0aGlzLlRiKCk7dGhpcy50ZSgpfSxtbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChiKXtyZXR1cm4iZmFpbCJ9fSxUYjpmdW5jdGlvbigpe3ZhciBiPSIwIixhPSIwIjt0cnl7ZS5TYSgpJiYoYj0iMSIpfWNhdGNoKGQpe2I9Mn10aGlzLnNjJiYoYT0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYisiIithLCEwKTt0aGlzLm9jJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuQWIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlpkKSk7dGhpcy5VZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlVkJiZ0aGlzLlVkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkFifSl9LApRazpmdW5jdGlvbigpe2lmKHRoaXMuU2QmJnRoaXMuVmwoKSl7dmFyIGI9dGhpcy5EbCgpO2ImJmIuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYi5qb2luKCJfIiksITApfX0sZ2k6ZnVuY3Rpb24oYil7Ynx8KGI9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGIpdHJ5e2I9Yi50b1N0cmluZygpfWNhdGNoKGEpe2I9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9Yj1iLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITApfSxJYTpmdW5jdGlvbihiLGEsZCxmLGMsaCl7dGhpcy52ZHx8KHRoaXMudmQ9MCk7dGhpcy52ZCsrO3RoaXMudmQ+dGhpcy5laCYmIXRoaXMuZmgmJih0aGlzLmZoPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5laCwhMCkpO2I9bmV3IExhKGIsYSxkKTtmJiYoYi51aT0hMCk7YyYmZS5rbSgpJiYoYi5QZz0hMCk7aCYmKGIuWWg9ITApO3JldHVybiBiLmxvYWQoKX0sTms6ZnVuY3Rpb24oKXtlLlNhKCl8fAplLmFiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihiKXt2YXIgYT1udWxsLGQ9bnVsbCxmPSIiO3RyeXsoYT1iLnJlc3BvbnNlWE1MKXx8KGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYi5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLmRhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihiPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGJbMF0mJihiPWJbMF0pLGIpe2Y9YiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkxjKCl8fChiPXRoaXMudGEoZiksZj1iLnByb3RvY29sKyI6Ly8iK2IuaG9zdCk7dmFyIGU9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5kYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2UuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5kYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sY286ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuTmZ9LE9rOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKITApO3ZhciBiPXRoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2IuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYix0aGlzLkVvLmJpbmQodGhpcyksdGhpcy5Eby5iaW5kKHRoaXMpKX0sRW86ZnVuY3Rpb24oYil7dmFyIGE9bnVsbCxkPW51bGw7dHJ5eyhhPWIucmVzcG9uc2VYTUwpfHwoYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhiLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1kfHx0aGlzLm1sKCl9LERvOmZ1bmN0aW9uKCl7fSxtbDpmdW5jdGlvbigpe2UuRmMoay5sbCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5kYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sCnRlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMudGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy50Yi5sZW5ndGg7YisrKXt2YXIgYT10aGlzLnRiW2JdOyJyZXF1ZXN0Ij09YS50eXBlJiZlLmFiKGEudXJsLGEuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09YS50eXBlKXt2YXIgZD1uZXcgSDt3aW5kb3dbZC5mYSgpXT10aGlzO2UuYWIoYS51cmwsYS5hbGlhcyxudWxsLGZ1bmN0aW9uKGIpe2lmKGIucmVzcG9uc2VUZXh0KXRyeXtldmFsKGIucmVzcG9uc2VUZXh0KX1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0scG86ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5PZH0sTGI6ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYnx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sWDpmdW5jdGlvbihiKXtiPWJ8fDEwO2Zvcih2YXIgYT0KIiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9LHpiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGYsYyxlLGgsayxsPTA7bDxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQobCsrKSxmPWIuY2hhckNvZGVBdChsKyspLGM9Yi5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxoPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9oPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBhfSx0YTpmdW5jdGlvbihhKXt2YXIgZz0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxjPTE0O2MtLTspZFtnW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZ1sxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSxUaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBnKGEpe3ZhciBiPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9YT4+PjQqZCYxNSxiKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gYn1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixyPTI3MTczMzg3OCx0PTMyODUzNzc1MjAsbixxLHUsdix3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGM9MDtjPG4tMztjKz00KWU9YS5jaGFyQ29kZUF0KGMpPDwyNHxhLmNoYXJDb2RlQXQoYysxKTw8MTZ8YS5jaGFyQ29kZUF0KGMrMik8PDh8YS5jaGFyQ29kZUF0KGMrMykseC5wdXNoKGUpOwpzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihjPTA7MTY+YztjKyspaFtjXT14W2ErY107Zm9yKGM9MTY7Nzk+PWM7YysrKWhbY109ZChoW2MtM11eaFtjLThdXmhbYy0xNF1eaFtjLTE2XSwxKTtlPWs7bj1sO3E9bTt1PXI7dj10O2ZvcihjPTA7MTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8fm4mdSkrditoW2NdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8biZ1fHEmdSkrditoW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YraFtjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1O3Q9dCt2JjQyOTQ5NjcyOTV9cmV0dXJuKGcoaykrZyhsKStnKG0pK2cocikrZyh0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE5hPWMuZ2p8fE5hLG09bmV3IE5hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMuYXA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBPYT1jLmFwfHxPYTtuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZyxkKXt0aGlzLmE9YTthLmMuUj90aGlzLmJiPWEuYy5SKCk6dGhpcy5iYj0iIjthLmMubWgmJmEuYy5taCh7cGF1c2U6dGhpcy5CZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLlFoLmJpbmQodGhpcyksbXV0ZTp0aGlzLmFmLmJpbmQodGhpcyksdW5tdXRlOnRoaXMud28uYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYS5rYjt0aGlzLnBsYXllcj10aGlzLmEuYzt0aGlzLmVjPXRoaXMuZ2Q9ITE7dGhpcy5Daz0xRTM7dGhpcy5yYT1udWxsO3RoaXMuQj1nO3RoaXMuZ2I9e307dGhpcy52aWRlbz17fTt0aGlzLktkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLkdrPWUuWCgxMCk7CnRoaXMuQmY9MDt0aGlzLmRkPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuZGQ9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMuZGQ9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQWs9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5lZj10aGlzLkpkPSExO3RoaXMudmg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYj17fTt0aGlzLm5lPSExO3RoaXMuamk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5qYz0hMTt0aGlzLiRrPWUuWCgxMCk7dGhpcy5LYj1lLlgoMTApO3RoaXMuSWI9ZS5YKDEwKTt0aGlzLlVoPWUuWCgxMCk7dGhpcy5jb25mPXt9O3RoaXMuVmQ9CnRoaXMuVWI9dGhpcy52ZT10aGlzLm5kPXRoaXMuTGQ9dGhpcy51Yj10aGlzLnFjPXRoaXMuRGg9dGhpcy5zZD10aGlzLnFvPXRoaXMueGI9dGhpcy5KYj0hMTt0aGlzLnZjPVtdO3RoaXMubGM9e307dGhpcy5SbT0yMDA7dGhpcy5RZj10aGlzLldjPXRoaXMucmU9dGhpcy5QZj10aGlzLm1mPSExO3RoaXMuY2Y9e319Yy5haj1hO2EucHJvdG90eXBlPXt4bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGc9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoZz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBnfSxoaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5HYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLldhKCksITApO3RoaXMuVW4oKTtlLm8oay5yayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxXZTpmdW5jdGlvbihhLGcsZCxjKXt0aGlzLnhiPQpkO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkIuUyl0aGlzLkJmKyssZS5wYigibmV3U21hbGxBZElkIiksdGhpcy5CLlFrKCksYz1tLmdldENvbmZpZygpLGUueGUmJih0aGlzLkIueW4oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQi5IYSYmdGhpcy5CLmlzRW5hYmxlZD8odGhpcy5oaSgpLG5ldyBSKHRoaXMsYSx0aGlzLnZoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpnLGJpdHJhdGU6Yy5PYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQi5WYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpnPyh0aGlzLmhpKCksCm5ldyBSKHRoaXMsYSx0aGlzLnZoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5CLlZiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5PYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUGEoKTtlbHNle3ZhciBrPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2suV2UoYSxnLGQpfSw1MCl9fSxoZjpmdW5jdGlvbihhKXthLllhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuVmQ9dGhpcy5VYj10aGlzLnNkPSExO3RoaXMuYj1hO3RoaXMuTm4odGhpcy5iKTt0aGlzLmFoKGEpO3RoaXMudmM9dGhpcy5SZyhhKTt0aGlzLlZrKCl9LGFoOmZ1bmN0aW9uKGIpe2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mCmEmJih0aGlzLktkPXRoaXMuT2woYikpLHRoaXMuYWgoYi5wYXJlbnQpKX0sUmc6ZnVuY3Rpb24oYil7dmFyIGM9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoYz10aGlzLlJnKGIucGFyZW50KSksYy5wdXNoKHRoaXMueGwoYikpKTtyZXR1cm4gY30seGw6ZnVuY3Rpb24oYSl7dmFyIGM9IiIsZD1bXTtpZihhJiZhLkomJmEuSi5nZXRBdHRyaWJ1dGUpe2M9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKylkLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpjLGNyZWF0aXZlSUQ6ZH19LE9sOmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGQ9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5KKXtjPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpOwpmPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkouZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLkouZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLkouZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKGs9MDtrPGMubGVuZ3RoO2srKylkLnB1c2goYS5sYihjW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmh9fSxxYTpmdW5jdGlvbihhKXthLllhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGM9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJgooYz1hLmVycm9yLmRldGFpbC5jb2RlKSxhLnBkJiZhLnBkLmVycm9yJiZhLnBkLmVycm9yLmNvZGUmJihjPWEucGQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5ZYy5jb2RlOmM9PUQuY2UuY29kZT9lLm8oay5abyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpOihlLlhlKCksYz09RC5VZi5jb2RlJiZlLm8oay5MbSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKTtlLm8oay5rbCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVm4oKTt0aGlzLlVhKCJlbXB0eSIpO3RoaXMuQi5BYiYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkFiLCEwKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay5Gbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3LlZmLmNvZGU6ZS5vKGsuJG8sCnRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LmVlLmNvZGU6ZS5vKGsuYnAsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJ4bWxwYXJzZSIpO2JyZWFrO2Nhc2Ugdy4kZC5jb2RlOmUubyhrLk1tLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgibm9tZWRpYSIpO2JyZWFrO2Nhc2Ugdy5YZC5jb2RlOmUubyhrLkJvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdy5SZi5jb2RlOmUubyhrLkNvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuVWEoInVua25vd24iKX10aGlzLmZjKGEpO3RoaXMuUGEoKX0sZmM6ZnVuY3Rpb24oYSl7dmFyIGM9CjkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihjPWEuZXJyb3IuY29kZSw5MDE8YyYmKGM9OTAwKSk7Zm9yKGM9eyJbRVJST1JDT0RFXSI6Y307YS5NYS5sZW5ndGg7KXRyeXt2YXIgZD1hLk1hLnBvcCgpO3RoaXMuVmUoZC51cmwsZC50eXBlLGMpfWNhdGNoKGYpe319LE5uOmZ1bmN0aW9uKGEpe3RoaXMudmU9ITE7dGhpcy5nYj10aGlzLmEuSTt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLnhmKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dmFyIGM9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYz10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuZ2IuekluZGV4PWM7Yz10aGlzLmEuQTt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksZj0iIjtkJiZkLmVudnZhcnMmJihmPWQuZW52dmFycygpKTtmLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLmdldEVudmlyb25tZW50VmFyaWFibGVzJiYoZj1kLmdldEVudmlyb25tZW50VmFyaWFibGVzKCkpOwpmLnZpZGVvU2xvdCYmKGM9Zi52aWRlb1Nsb3QsdGhpcy5tZj0hMCl9Y2F0Y2goaCl7fWMuY3E9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGMuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihjLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZjLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLkFrJiZ0aGlzLnBsYXllci5DZSgpJiYoYy52b2x1bWU9dGhpcy5wbGF5ZXIuQ2UoKS8xMDApO2Zvcig7Yy5maXJzdENoaWxkOyljLnJlbW92ZUNoaWxkKGMuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPAphLk0ubGVuZ3RoO2QrKyljLmNhblBsYXlUeXBlKGEuTVtkXS50eXBlKSYmdGhpcy52ayhjLGEuTVtkXS51cmwrIiIsYS5NW2RdLnR5cGUpO3RoaXMubWYmJmMubG9hZCgpO2lmKHRoaXMuZGkoYykpe3RoaXMuVmgoInNldHVwIix0aGlzLldhKCkpO3RoaXMueWsoYyk7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT10aGlzLmdiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLm1mP3RoaXMudmlkZW89Yzp0aGlzLnZpZGVvPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyl9Y2F0Y2gobCl7dGhpcy52aWRlbz1jfX1lbHNlIHRoaXMuYi5XaygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/CmEuc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLmdiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChjKSx0aGlzLkxuKCkpOnRoaXMuYi5vcmlnaW4uSGcody4kZCl9LExuOmZ1bmN0aW9uKCl7dGhpcy5QZj0hMDt0aGlzLnViPXRoaXMucWM9ITE7dGhpcy5hLmMuc2EmJnRoaXMuYS5jLnNhKCkmJihlLm8oay55Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMudWI9ITApO2UudWUoKTt0aGlzLmImJnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4ubWEmJmUuemsodGhpcy5iLm9yaWdpbi5tYSk7dGhpcy5WaCgic2V0dXAiLHRoaXMuV2EoKSk7dmFyIGE9dGhpcy5hLkE7dGhpcy5hLkE9Qi5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5BLGEpO3RoaXMuYS5FaCgpO3RoaXMuYS55ZigpO2ZvcihhPQp0aGlzLmEuSTthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5hLnlmKCk7dGhpcy5nYj10aGlzLmEuSTt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLnhmKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dGhpcy5yYT10aGlzLmEuSTt0aGlzLm5pKCJ2cGFpZCIpO2lmKHRoaXMudWIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5OYigibXV0ZWQiLCJjb250ZW50Iik7ZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX10aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsCiJubyIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5hLkkuYXBwZW5kQ2hpbGQodGhpcy5DKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmUueGYodGhpcy5DLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5DLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLlJsKCksYz10aGlzLmIudS5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fApiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsCiJjb25maWciLGgpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLm1nKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5CKTt0aGlzLkMuc3JjPWE7ZS5wZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMud2EmJiF0aGlzLkxkJiZ0aGlzLmEuYy53YSgpJiZlLm8oay5CYywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEuaGMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMudmM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5ObyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLk9vKCksdGhpcy5hLmhjKCEwKSwhdGhpcy5VYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5VYj17ZWw6dGhpcy5DLApjYjpmdW5jdGlvbigpe3RoaXMuVmQ9ITA7ZS5vKGsucmksdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuUGUodGhpcy5VYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmhjKCEwKSx0aGlzLlNvKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5XbygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5WbygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlhvKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlRvKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPQphLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5kYyk7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLm8oay54Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkIuemN8fHRoaXMuV2MpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goYyl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuUm8oKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUubyhrLmxlLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuUG8oKTsKIkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5XYyYmKHRoaXMuUWY9ITEsdGhpcy5uYygpKSx0aGlzLlFvKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMudWI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLk5iKCJtdXRlZCIsInVzZXIiKSxlLm8oay56ZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKToodGhpcy51Yj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTmIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSGYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksZS5vKGsubGUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLAp0aGlzLnMoKSkpfX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5QYSgpfS5iaW5kKHRoaXMpKTtlLnBlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLmpnKGZ1bmN0aW9uKGEpe2UuaWEodGhpcy5DLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sUG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UubyhrLmplLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnFjPSEwfSxRbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UubyhrLmJkLHRoaXMuYi51LAp0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMucWM9ITF9LFNvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS5vKGsuZ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sUm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuZmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sT286ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5XaCgpO2UubyhrLmJnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlZhKCJzdGFydCIpO2UubyhrLmJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFVvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuc2Q9ITA7dGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpO2UubyhrLlpmLAp0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxWbzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5WYSgibWlkcG9pbnQiKTtlLm8oay5kZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxYbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIik7ZS5vKGsuaGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sVG86ZnVuY3Rpb24oKXt0aGlzLktmKCk7dGhpcy5WYSgiY29tcGxldGUiKX0sc2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5DJiZ0aGlzLkMucGFyZW50Tm9kZSYmdGhpcy5DLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5VYSgidnBhaWRzdG9wcGVkIik7dmFyIGM9dGhpcy5DLnBhcmVudE5vZGU7dGhpcy5DLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5DKTtjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyk7CmUudWUoKTt0aGlzLkM9ITE7dGhpcy5QYShhKX19LE5vOmZ1bmN0aW9uKGEpe3ZhciBjPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWMmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGM9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGMubWF0Y2goZCkpO3RoaXMuVWEoInZwYWlkZXJyb3IiKTtlLm8oay5Zbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuc2koITApfSx2azpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkhhJiZiLmlzRW5hYmxlZCYmIWIuTGMoKSl7dmFyIGM9Yi50YShhKTtyZXR1cm4gYy5wcm90b2NvbCsiOi8vIitjLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9ZChjLHRoaXMuQik7Zi5vbmVycm9yPXRoaXMuS28uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmQoYyx0aGlzLkIpKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LHlrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLm9pLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnBpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuS2YuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5MZi5iaW5kKHRoaXMpKX0sRmQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMub2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5NZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuS2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5MZi5iaW5kKHRoaXMpKX0sb2k6ZnVuY3Rpb24oYSl7dGhpcy5lY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVjfHx0aGlzLk1mKGEpfS5iaW5kKHRoaXMpLHRoaXMuQ2spKX0sTWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZ2QmJnRoaXMuZGkodGhpcy52aWRlbykmJiF0aGlzLkpiJiYhdGhpcy5lYyl7dGhpcy5nZD0hMDt0cnl7aWYoIWUuU2EoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuSmJ8fCh0aGlzLkpiPSEwLHRoaXMuRmQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5XYSgpLCEwKSx0aGlzLkIuRmd8fHRoaXMuQi5kYSgidmlkZW8tbm9vcCIpKTt0aGlzLlBhKCk7cmV0dXJufX1jYXRjaChjKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5XYSgpLCEwKX10aGlzLkhvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEueWYoKTt0aGlzLkdvKCk7dGhpcy5uaSgpO3RoaXMubmcoKTt0aGlzLmEuRWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuQ2YoKX19LENmOmZ1bmN0aW9uKCl7dGhpcy5uZHx8dGhpcy4kZigpfSwkZjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnZpZGVvLnBsYXkoKTtpZihjJiZjWyJjYXRjaCJdKWNbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLm5kfHwoYT90aGlzLlBhKCk6KHRoaXMuYWYoITApLHRoaXMuJGYoITApKSl9LmJpbmQodGhpcykpO2JhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5tYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5tYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5tYy5iaW5kKHRoaXMpKSk6ST1mdW5jdGlvbigpe3RoaXMubmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNmKCkpfS5iaW5kKHRoaXMpO3RoaXMuRWUoKS5TaCh0aGlzKX0sS2Y6ZnVuY3Rpb24oKXt0aGlzLkIuJGEmJiF0aGlzLkpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApLHRoaXMuVmEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS5vKGsucGssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlBhKCl9LHNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxkPSExLGY9MDtmPGEubGVuZ3RoO2YrKylkPWUuV2coYVtmXSksYy5wdXNoKGQpO2E9e2hhc2hlczpjfTthPWsuUmEoYSx0aGlzLnMoKSk7ZS5TbihhKX0sUGE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuV2QmJnRoaXMuc2sodGhpcy5iLldkKTsKaWYoIXRoaXMudmUpaWYodGhpcy52ZT0hMCx0aGlzLlZkfHwoZS5vKGsuT20sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmIud2J8fHRoaXMuYi50Yyl7ZS5wYigibmV3U21hbGxBZElkIik7dGhpcy5CZisrO3RoaXMuZWM9dGhpcy5nZD0hMTt0cnl7dGhpcy5GZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLmdiLnJlbW92ZUNoaWxkKHRoaXMucmEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMuSmQ9ITE7dHJ5e3RoaXMuYS5saSgpfWNhdGNoKGgpe310aGlzLkxkPSEwO3RoaXMuYS5JZSgpO3RoaXMuamM9ITE7dGhpcy5FZSgpLk9oKCk7dGhpcy5iLndiJiZ0aGlzLmIub3JpZ2luLmJmKCk7dGhpcy5iLnRjJiYoYT90aGlzLmIub3JpZ2luLnloKCk6dGhpcy53ZSgpKX1lbHNlIHRoaXMud2UoKX0sCktvOmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRmQodGhpcy52aWRlbyksdGhpcy5MZihhKSl9LExmOmZ1bmN0aW9uKGEpe3RoaXMuZWM9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5CLk5rKCk7dGhpcy5iLm9yaWdpbi5IZyh3LiRkKX0scGk6ZnVuY3Rpb24oKXtpZih0aGlzLnFvKXRoaXMuUGEoKTtlbHNle3RoaXMuamM9ITA7dGhpcy5hLmMud2EmJiF0aGlzLkxkJiZ0aGlzLmEuYy53YSgpJiZlLm8oay5CYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7CnRoaXMudW8oYSk7aWYoIXRoaXMuVWIpe3ZhciBjPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5VYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuVmQ9ITA7ZS5vKGsucmksdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpjLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2UuUGUodGhpcy5VYil9ZD0iIjt0aGlzLmIuQWYmJihjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVWgpKSYmKGQ9dGhpcy5iLkFmLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsCmQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5KZHx8KHRoaXMuSmQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuZmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLmIud2I/KHRoaXMuZWM9dGhpcy5nZD0hMSx0aGlzLkZkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnJhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSmQ9ITEsdGhpcy5hLmxpKCksdGhpcy5iLm9yaWdpbi5iZigpKTp0aGlzLlBhKCl9LmJpbmQodGhpcykpKSksYy5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLmRkLnJlcGxhY2UoIlt0aW1lXSIsZS5RZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLm5lPSEwOwp0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0saWk6ZnVuY3Rpb24oKXt0aGlzLkRofHwodGhpcy5EaD0hMCx0aGlzLnNkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sdW86ZnVuY3Rpb24oYSl7ZS5vKGsubGUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTthPT10aGlzLmppfHx0aGlzLkpifHwoMD09YSYmKHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkFiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuaWkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmlpKCl9LmJpbmQodGhpcykpLHRoaXMuSmJ8fAp0aGlzLldoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkIuJGEmJnRoaXMuVmEoInN0YXJ0IiksZS5vKGsuYmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSxlLm8oay5nZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi80KSYmKHRoaXMuQi4kYSYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuVmEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLnNkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS5vKGsuWmYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSwKZS5vKGsuZGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYi5kdXJhdGlvbi80KSYmKHRoaXMuQi4kYSYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuVmEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUubyhrLmhnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLHRoaXMuamk9YSl9LFZoOmZ1bmN0aW9uKGEsYyl7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGMsITApfSxVbjpmdW5jdGlvbigpe2UuUWQoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sV2g6ZnVuY3Rpb24oKXtlLlFkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFZuOmZ1bmN0aW9uKCl7ZS5RZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrCnRoaXMuV2EoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxVYTpmdW5jdGlvbihhKXtlLlFkKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFZhOmZ1bmN0aW9uKGEpeyh0aGlzLlBmfHx0aGlzLkIuJGEpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5XYSgpLCEwKX0sTmI6ZnVuY3Rpb24oYSxjKXt0aGlzLkIuJGEmJmUudHJhY2soInN0YXRzX2hkXyIrYSxjLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxjKXtpZighdGhpcy5KYil7dGhpcy5jZiYmdGhpcy5jZi50cmFjayYmdGhpcy5jZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmUueGUmJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPQohMH12YXIgZD1bXTt0cnl7ZD10aGlzLlBsKHRoaXMuYi5NYSxhKX1jYXRjaChmKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgaD1kLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmKHRoaXMucmU9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5LZC5pbXByZXNzaW9ucyYmZS5pbShoLnVybCx0aGlzLktkLmltcHJlc3Npb25zKT90aGlzLlZlKGgudXJsLGgudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLm8oay5xayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCkse2FkSWQ6dGhpcy5LZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5zKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuVmUoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWMpdHJ5e3RoaXMuYi5NYT10aGlzLmNsKHRoaXMuYi5NYSxhKX1jYXRjaChtKXt9fX0sV2E6ZnVuY3Rpb24oKXt2YXIgYT1lLlNhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLApjPSIiO3RoaXMuUGYmJihjPSJfdnBhaWQiKTt0aGlzLldjJiYoYz0iX3dlbGVjdCIpO3JldHVybiBhK2N9LFZlOmZ1bmN0aW9uKGEsYyxkLGYsZSl7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGM9dGhpcy5CLnZhKGEpLGQmJmMudWsoZCksZnx8KGY9dGhpcy5FZyksZXx8KGU9dGhpcy5FZyksdGhpcy53ayhhKSx0aGlzLkIuSWEoYyxmdW5jdGlvbigpe3RoaXMuTmgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5OaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sd2s6ZnVuY3Rpb24oYSl7dGhpcy5sY1thXT0ib3BlbiJ9LE5oOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09ImNsb3NlZCJ9LFZrOmZ1bmN0aW9uKCl7dGhpcy5sYz17fX0sWG46ZnVuY3Rpb24oKXt2YXIgYT0wLGM7Zm9yKGMgaW4gdGhpcy5sYyl0aGlzLmxjLmhhc093blByb3BlcnR5KGMpJiYib3BlbiI9PXRoaXMubGNbY10mJmErKztyZXR1cm4gYX0sUGw6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09CmN9KX0sY2w6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWN9KX0sSG86ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLklvLmJpbmQodGhpcykpfSxJbzpmdW5jdGlvbigpe2UuU2EoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMubmMoKTp0aGlzLmIuZGMmJihlLm8oay54Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkIuemN8fHRoaXMuV2MpYT0iX2JsYW5rIjt0cnl7dmFyIGM9d2luZG93Lm9wZW4oIiIsYSk7Yy5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2MuZG9jdW1lbnQubG9jYXRpb24uaHJlZj0KdGhpcy5iLmRjfWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYi5kYyxhKX19LmJpbmQodGhpcyksNTAwKSl9LEdvOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0KImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmRkLnJlcGxhY2UoIlt0aW1lXSIsZS5RZygwKSk7dmFyIGM9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5CLmpkJiYoYz10aGlzLkIuamQpO2MmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRGIuYmluZCh0aGlzKSwxRTMqYyk7dGhpcy5jYXB0aW9uPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSl9fSxEYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5CLmpkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxIZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5CLmpkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sbmk6ZnVuY3Rpb24oYSl7aWYoIWUuRGYodGhpcy5jb250cm9scykpe3ZhciBjPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy4kazt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5IZCgpfS5iaW5kKHRoaXMpKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5LYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmZpLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5laS5iaW5kKHRoaXMpKSxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmVpLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5IZCgpfS5iaW5kKHRoaXMpKTsKZi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkViKCk7dGhpcy5EYigpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihoLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGguc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixoLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuSWI7aC5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9oLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnNvLmJpbmQodGhpcykpOmguYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucm8uYmluZCh0aGlzKSk7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSGQoKX0uYmluZCh0aGlzKSk7CmguYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuVWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChmKTt0aGlzLmIuQWYmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChoKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuU2EoKXx8KHRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLkhkKCl9LmJpbmQodGhpcykpLHRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChkKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsCmMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIsYy5zdHlsZS5kaXNwbGF5PSJub25lIixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGQub25lcnJvcj1mdW5jdGlvbigpe3RoaXMueGEmJih0aGlzLnhhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksZC5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApjLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnhhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5hLmpnKGZ1bmN0aW9uKGEpe3RoaXMueGEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoZS5vKGsueWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLmFmKCkpO3RoaXMuRWIoKX19LEViOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sbmM6ZnVuY3Rpb24oKXsiaGlkZGVuIj09dGhpcy5jb250cm9scy5zdHlsZS52aXNpYmlsaXR5fHx0aGlzLnhhJiYiYmxvY2siPT10aGlzLnhhLnN0eWxlLmRpc3BsYXl8fHRoaXMuUWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGVpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5hLkEucGF1c2VkPwoodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5iZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5BLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLm8oay5qZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkViKCksdGhpcy5EYigpKSl9LGZpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5xYz8oZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJwbGF5IiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnFjPSExKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkViKCksdGhpcy5EYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMucWM9ITApfSxCZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYS5BLnBhdXNlZHx8KHRoaXMuYS5BLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLm8oay5qZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sUWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQS5wYXVzZWQmJih0aGlzLmEuQS5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsCiEwKSxlLm8oay5iZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0scm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKTt0aGlzLmEuQS5tdXRlZD8odGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5OYigidW5tdXRlZCIsInVzZXIiKSxlLm8oay5IZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKToodGhpcy5hLkEubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHNvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy51Yj8oZS5pYSh0aGlzLkMsCiJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJtdXRlIiksdGhpcy51Yj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxhZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMuYS5BLm11dGVkfHwodGhpcy5hLkEubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHdvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy5hLkEubXV0ZWQmJih0aGlzLmEuQS5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLAohMCksdGhpcy5OYigidW5tdXRlZCIsImNvbnRlbnQiKSxlLm8oay5IZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sbWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5tYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5tYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMpO3RoaXMubmR8fHRoaXMubmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNmKCkpfSx3ZTpmdW5jdGlvbigpe3RoaXMucm0oKSYmdGhpcy5xbSgpJiYodGhpcy5CLnNjfHwic3BpZWdlbC5kZSI9PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYicHJlcm9sbCI9PWUuR2ImJnRoaXMudm8oKXx8KHRoaXMubmQ9ITAsdGhpcy54YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy54YiksdGhpcy54Yj0hMSksdGhpcy56ZygpKX0scm06ZnVuY3Rpb24oKXt2YXIgYT0KZS5xZCgpO3JldHVybiB0aGlzLkIuVmImJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0scW06ZnVuY3Rpb24oKXt2YXIgYT0hMSxjPW0uZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciIT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcnx8dGhpcy5lZnx8KGE9ITAsYy5hZEZhbGxiYWNrVVJMfHwoYy5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3JldHVybihhfHwhdGhpcy5yZSYmYy5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuZWZ9LEVsOmZ1bmN0aW9uKCl7dmFyIGE9bS5nZXRDb25maWcoKS5hZEZhbGxiYWNrVVJMLGM9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthfHwic3ZtcHJldmlldyIhPWMuYW5jaG9yfHwoYT0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpO3JldHVybiBhfSx2bzpmdW5jdGlvbigpe20uZ2V0Q29uZmlnKCk7CnRoaXMuZWY9dGhpcy5XYz10aGlzLlFmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0Iix0aGlzLldhKCksITApO3RoaXMucmU9ITA7dmFyIGE9dGhpcy5FbCgpLGE9ZS5tZyhhLHRoaXMuQiwhMSx7b25seVVSTDohMH0pO2lmKCFhKXJldHVybiExO3RoaXMuV2UoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KTtyZXR1cm4hMH0semc6ZnVuY3Rpb24oYSl7dGhpcy5YbigpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemcoITApfS5iaW5kKHRoaXMpLHRoaXMuUm0pOih0aGlzLkxkPSEwLHRoaXMuYS5JZSgpLHRoaXMuYS51bigpLHRoaXMuamM9ITEsZS5vKGsuWmssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLkVlKCkuT2goKSl9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmEmJnRoaXMuYS5jJiYoYT10aGlzLmEuYyk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GYSgibWluVmlzIik7CmEmJihlLk9lKHRoaXMudmlkZW8sYSk/dGhpcy5RaCgpOnRoaXMuQmQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5kYyxhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi53Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnZjJiYwPHRoaXMudmMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnZjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LHM6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLkdrKyItIit0aGlzLkJmO3RoaXMuYiYmdGhpcy5iLlhnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPQp0aGlzLmIuWGcoKSk7cmV0dXJuIGF9LEVnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy5hanx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWE9Yy5DbXx8UWE7bmV3IFFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5sYT1udWxsO3RoaXMuVj1bXTt0aGlzLko9bnVsbDt0aGlzLnVjPXRoaXMud2M9ITE7dGhpcy5tYT0iIjt0aGlzLk9mPSExO3RoaXMuaGg9IiI7ZCYmZC5lbXB0eT90aGlzLkFtKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfQp2YXIgYj0wLGcsZD1bXTtjLmFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnFkKCksYjtiPWUudGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEEodGhpcy51cmwpOm0udmEobS5NZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0uYmluZCh0aGlzKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIGUuRigibWFydGhhc3Rld2FydC5jb20iKXx8ZS5GKCJmYW5kb20uY29tIil8fGUuRigiZ2lnYS5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImRlc2lyZWQuZGUiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxnKCkpe3ZhciBoPWUuQmcodGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbX0uYmluZCh0aGlzKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8aC5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIil9LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpJiYwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil9LmJpbmQodGhpcyksbD1mdW5jdGlvbigpe3JldHVybiAwPT09CmguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTtpZihkKCl8fGcoKXx8aygpfHwiYXBwc3BvdCI9PWMpbCgpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0uTWQoaCkpKyImdHlwZT1qcyIsYj1tLnZhKG0uTWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiLGUudHJhY2soInN0YXRzX2hkX2FkeCIsIiIsITApKTpiPW0udmEobS5NZChoKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJgooYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLklhKGIsdGhpcy56bS5iaW5kKHRoaXMpLHRoaXMud20uYmluZCh0aGlzKSl9LFNnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLmxhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5HYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuR2J8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkdifHx0aGlzLm9tKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxtLmNvKCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7CnZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2RbYl09Zy5maXJzdENoaWxkO2MucHVzaChnKX1jYXRjaChoKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LG9tOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sCmM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0sem06ZnVuY3Rpb24oYSl7dGhpcy5jbihhKTt0cnl7dGhpcy5sYT1hLnJlc3BvbnNlWE1MLHRoaXMubGF8fCh0aGlzLmxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuUWEody5lZSkpfXRoaXMuVj0KdGhpcy5TZygpO3RoaXMud2M9dGhpcy5FZigpO3RoaXMudWM9dGhpcy5haSgpO3RoaXMuaGg9YS51cmxDYWxsZWQ7aWYodGhpcy5WLmxlbmd0aCl0aGlzLk9jKCk7ZWxzZXt0aGlzLnFhKHRoaXMuUWEody5ZYyx7ZXJyb3I6dGhpcy5PZj9ELmNlOkQuVGZ9KSk7dHJ5e2UudHJhY2soInN0YXRzX2hkX210eXVybCIsZS5DYih0aGlzLm1hKSwhMCl9Y2F0Y2goYyl7fX19LEFtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuUWEody5lZSkpfXRoaXMuVj10aGlzLlNnKCk7dGhpcy53Yz10aGlzLkVmKCk7dGhpcy51Yz10aGlzLmFpKCk7dGhpcy5WLmxlbmd0aD90aGlzLk9jKCk6dGhpcy5xYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuT2Y/RC5jZTpELlRmfSkpfSx3bTpmdW5jdGlvbigpe3RoaXMucWEodGhpcy5RYSh3LlNmLHtkZXB0aDpifSkpfSwKT2M6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5WLnNoaWZ0KCk7dGhpcy5zbSgpP3RoaXMubW8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5iaCgpLGcse0FkU3lzdGVtOnRoaXMud2woKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5xYSh0aGlzLlFhKHcuVmYpKTooYj0wLHRoaXMuem8oKSYmdGhpcy5oZih0aGlzLmJsKCkpKX0sYmY6ZnVuY3Rpb24oKXt0aGlzLndjPyh0aGlzLndjPTE8dGhpcy5WLmxlbmd0aCx0aGlzLlYubGVuZ3RoJiZ0aGlzLk9jKCkpOnRoaXMucGFyZW50LmJmKCl9LHloOmZ1bmN0aW9uKCl7dGhpcy51Yz8odGhpcy51Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5PYygpKTp0aGlzLnBhcmVudC55aCgpfSx6bzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmpvKCk/dGhpcy5pbygpPyEwOigtMSE9dGhpcy5HYygpP3RoaXMucWEodGhpcy5RYSh3LlhkKSk6dGhpcy5xYSh0aGlzLlFhKHcuUmYpKSwhMSk6KHRoaXMucWEodGhpcy5RYSh3LlljLApELlVmKSksITEpfSxoZjpmdW5jdGlvbihhKXt0aGlzLm1hfHwodGhpcy5tYT0iIik7YS5XZHx8KGEuV2Q9W10pO2EuV2QucHVzaCh0aGlzLmhoKTthLk1hPWEuTWEuY29uY2F0KHRoaXMuWWUoKSk7YS53Yj1hLndiP2Eud2I6dGhpcy53YzthLnRjPWEudGM/YS50Yzp0aGlzLnVjO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLm1hLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5PZzt0aGlzLnBhcmVudC5oZihhKX0sYmw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgUmE7dGhpcy5tYXx8KHRoaXMubWE9IiIpO2EuZHVyYXRpb249dGhpcy5HYygpO2EuTT10aGlzLlpnKCk7YS5kYz10aGlzLnpsKCk7YS5rcT1bXTthLm9yaWdpbj10aGlzO2EudT10aGlzLnZsKCk7YS5BZj10aGlzLk5sKGEuZHVyYXRpb24pO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLm1hLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5PZztyZXR1cm4gYX0scWE6ZnVuY3Rpb24oYSl7dGhpcy5tYXx8Cih0aGlzLm1hPSIiKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5tYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuT2c7aWYoIXRoaXMuSiYmdGhpcy5sYSYmdGhpcy5sYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj10aGlzLmxhO3RyeXtpZih0aGlzLkomJnRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGM9ITE7KGM9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmYy5sZW5ndGgmJmUudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChkKXt9fXRoaXMuSiYmKGEuTWE9YS5lcnJvci5jb2RlIT13LlhkLmNvZGU/YS5NYS5jb25jYXQodGhpcy5BbCgpKTphLk1hLmNvbmNhdCh0aGlzLkpsKCkpKTt0aGlzLlYubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuZmMmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5mYyYmdGhpcy5wYXJlbnQuZmMoYSksYj0wLHRoaXMuT2MoKSk6Cih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucWEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5xYSYmdGhpcy5wYXJlbnQucWEoYSksYj0wKX0sZmM6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuZmMoYSl9LEhnOmZ1bmN0aW9uKGEsYil7dGhpcy5xYSh0aGlzLlFhKGEsYikpfSxRYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBTYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LG1vOmZ1bmN0aW9uKCl7cmV0dXJuIGI8Z30sam86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlpnKCkubGVuZ3RofSxpbzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuR2MoKX0sRWY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlYuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxhaTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuViYmMjw9dGhpcy5WLmxlbmd0aCYmCiF0aGlzLkVmKCkmJihhPSEwKTtyZXR1cm4gYX0sY246ZnVuY3Rpb24oYSl7dGhpcy5tYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLm1hPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMubWE9IlVOS05PV04ifXRyeXt0aGlzLk9mPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5iaCgpLmxlbmd0aH0sYmg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5EZSh0aGlzLkosIlZBU1RBZFRhZ1VSSSIpfSx3bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRlKHRoaXMuSiwiQWRTeXN0ZW0iKX0sWWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMub2goYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMubGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxvaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLm9oKGEucGFyZW50Tm9kZSk6ITF9LEpsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LEFsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx6bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxPYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksRXA6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMubGIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuT2F8fDFFMzt0cnl7dmFyIGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLApiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksYj1nLmNvbmNhdChlKX1jYXRjaChoKXt9cmV0dXJuIGJ9LHZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMudWQoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LEdjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMubGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sTmw6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5SbihkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LERlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5sYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sR2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGxiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMudWQoYSk6IiJ9LHVkOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLkdlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5ha3x8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmxqfHxUYTtuZXcgVGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLk1hPVtdO3RoaXMuTT1bXTt0aGlzLmRjPSIiO3RoaXMudT10aGlzLnRjPXRoaXMud2I9ITE7dGhpcy5LZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuTGU9IiJ9Yy5Kaj1hO2EucHJvdG90eXBlPXtXazpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk0ubGVuZ3RoO2MrKylpZigwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxIbDpmdW5jdGlvbigpe2lmKCF0aGlzLktlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ubGEpe3ZhciBhPXRoaXMub3JpZ2luLmxhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYz0iIixkPTA7ZDxhLmxlbmd0aDtkKyspKGM9YVtkXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1jLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLktlPWFbZF0pfXJldHVybiB0aGlzLktlfSxYZzpmdW5jdGlvbigpe2lmKHRoaXMuTGUpcmV0dXJuIHRoaXMuTGU7dmFyIGE9IiI7KGE9dGhpcy5IbCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuTGU9YX0sUmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk1bY107cmV0dXJuIGF9fX0pKGMpO3ZhciBSYT1jLkpqfHxSYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLkxpfHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHc9e2VlOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLExhOiJYTUxfUEFSU0VfRVJST1IifSxSZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTGE6IkRVUkFUSU9OX0VSUk9SIn0sWWM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLExhOiJFTVBUWV9WQVNUIn0sVmY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCkxhOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxTZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixMYToiTE9BRF9FUlJPUiJ9LCRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixMYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LAplcDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixMYToiTUVESUFGSUxFX0VSUk9SIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTGE6IkRVTU1ZX0FEIn19LEQ9e1RmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTGE6Ik5PX0FEUyJ9LFVmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixMYToiTk9fTUVESUFGSUxFUyJ9LGZwOnt0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLExhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sY2U6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTGE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlvPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIFZhPWMueW98fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5lcnJvcj1hO3RoaXMucGQ9Yzt0aGlzLk1hPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5PaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFNhPWMuT2l8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5OaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdhPWMuTml8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5QaD1hO3RoaXMudmlkZW89Yzt0aGlzLlRkPVtdO3RoaXMuTWg9W107dGhpcy5kZj1bXTt0aGlzLkpvPQoibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSygpfWMuZ3A9YTthLnByb3RvdHlwZT17SzpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5QaC5sZW5ndGg7YSsrKXt2YXIgYz10aGlzLlBoW2FdLGQ9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtoLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaCk7dmFyIGs9aC5jb250ZW50V2luZG93O2suWnA9CntyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLnJuLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmhuLmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1kO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5UZC5wdXNoKHtzcmM6ZCxmcmFtZTpoLFNtOmUsdmVuZG9yOmMuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTA7Yzx0aGlzLmRmLmxlbmd0aDtjKyspe3ZhciBkPXRoaXMuZGZbY107ZC50eXBlPT09YSYmZC5Jayh0aGlzLkJsKGEpKX19LApCbDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntpcTohMCxocTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntWcDoidmlkZW8iLGxxOiJqc0N1c3RvbSIsbXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxucToxLEZwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sClFsOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5UZC5sZW5ndGg7YysrKWlmKHRoaXMuVGRbY10udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5UZFtjXS5TbTtyZXR1cm4iIn0scm46ZnVuY3Rpb24oYSxjKXt0aGlzLk1oLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLlFsKGMpLHZlbmRvcjpjfSk7dGhpcy5UbigpfSxobjpmdW5jdGlvbihhLGMpeyJ2aWRlbyI9PT1hP3RoaXMuSm8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMua2coYSxjKX0uYmluZCh0aGlzKSk6dGhpcy5rZyhhLGMpfSxrZzpmdW5jdGlvbihhLGMpe3RoaXMuZGYucHVzaCh7dHlwZTphLElrOmMsZnE6ITF9KX0sVG46ZnVuY3Rpb24oKXt0aGlzLk1oLm1hcChmdW5jdGlvbihhKXthLmxtfHwoYS5ZcCh7YWRTZXNzaW9uSWQ6ZS5YKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5qcSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLAphLmxtPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy50bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPWMudG18fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5jb25mPWN8fHt9O3RoaXMuYz1hO3RoaXMua2I9YS5UZygpO3RoaXMuST1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkkuaWQ9ZS5YKDEwKTt0aGlzLkE9Qi5wb3AoKTt0aGlzLkF8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5OYT17fTt0aGlzLmxnPSExOwp0aGlzLmFjPVtdfWMuS2k9YTthLnByb3RvdHlwZT17dWw6ZnVuY3Rpb24oYSl7dmFyIGM9e30sZD0hMSxlPTAsYz0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihjPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD0iZml4ZWQiLGU9Yy5sZWZ0LGM9Yy50b3ApO2g9e3g6ZSx5OmN9O2gucG9zaXRpb249ZDtyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy51bChhKTtmb3IodmFyIGM9MCxkPTAsZT0hMSxoPXRoaXMuWmwoYSksaz17fTthOyljKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGQrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7aCYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCwKYys9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsZCs9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpjLHk6ZH07ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LCRuOmZ1bmN0aW9uKCl7dGhpcy5sZz0hMH0sbGk6ZnVuY3Rpb24oKXt0aGlzLkE9Qi5wb3AoKTt0aGlzLkF8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LEVoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7ZS5vKGsuQmMsdGhpcy5jLmwoKSl9LHVuOmZ1bmN0aW9uKCl7dGhpcy5sZ3x8Cih0aGlzLmMucGxheSgpLGUubyhrLm1kLHRoaXMuYy5sKCkpKX0seWY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSS5zdHlsZS56SW5kZXg9YTt0aGlzLkkuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5JLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkkuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkkuc3R5bGUuYm94U2l6aW5nPXRoaXMua2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuSS5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PXRoaXMua2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkEuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmtiKTsKdGhpcy5jLlJjJiZ0aGlzLmMuUmMoKT90aGlzLmMuVGcoKS5hcHBlbmRDaGlsZCh0aGlzLkkpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5JKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhjLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSxabDpmdW5jdGlvbihhKXtmb3IodmFyIGM9d2luZG93LmdldENvbXB1dGVkU3R5bGUsZD0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGMmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7ZD0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gZH0sc2w6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5nZXRQb3NpdGlvbihhKTtjLnBvc2l0aW9uP2MucG9zaXRpb249Yy5wb3NpdGlvbjpjLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yy53aWR0aD1hLm9mZnNldFdpZHRoO2MuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0OwpyZXR1cm4gY30saGM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5zbCh0aGlzLmtiKTtpZihjLnghPXRoaXMuTmEueHx8Yy55IT10aGlzLk5hLnl8fGMucG9zaXRpb24hPXRoaXMuTmEucG9zaXRpb258fGMud2lkdGghPXRoaXMuTmEud2lkdGh8fGMuaGVpZ2h0IT10aGlzLk5hLmhlaWdodHx8YSl7aWYoMDx0aGlzLk5hLndpZHRoJiYwPHRoaXMuTmEuaGVpZ2h0JiYwPT1jLndpZHRoJiYwPT1jLmhlaWdodCl7dGhpcy5JZSgpO3JldHVybn10aGlzLk5hPWM7dGhpcy5jLlJjKCk/KHRoaXMuSS5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSS5zdHlsZS50b3A9IjBweCIpOih0aGlzLkkuc3R5bGUubGVmdD1jLngrInB4Iix0aGlzLkkuc3R5bGUudG9wPWMueSsicHgiKTt0aGlzLkkuc3R5bGUud2lkdGg9Yy53aWR0aCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9Yy5oZWlnaHQrInB4Ijt0aGlzLkkuc3R5bGUucG9zaXRpb249Yy5wb3NpdGlvbjt0aGlzLkEuc3R5bGUud2lkdGg9Yy53aWR0aCsicHgiOwp0aGlzLkEuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuYWMubGVuZ3RoO2ErKyl0aGlzLmFjW2FdKHt3aWR0aDpjLndpZHRoLGhlaWdodDpjLmhlaWdodH0pfWUuRGYodGhpcy5JKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0samc6ZnVuY3Rpb24oYSl7dGhpcy5hY3x8KHRoaXMuYWM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmFjLnB1c2goYSl9LEllOmZ1bmN0aW9uKCl7dGhpcy5JJiZ0aGlzLkkucGFyZW50Tm9kZSYmdGhpcy5JLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSSk7dGhpcy5BJiZ0aGlzLkEucGF1c2UmJnRoaXMuQS5wYXVzZSgpfX19KShjKTtmb3IodmFyIFlhPWMuS2l8fFlhLEI9W10sWmE9MDsxMDA+WmE7WmErKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPQplLlgoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGJhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgJGE9Yy5UaXx8JGE7bmV3ICRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwKKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlQoYik7dGhpcy5HZChhKTt0aGlzLkNnKCl9LEdkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2EoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiYKYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsYz10aGlzLkdhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWMpYS5jb250YWluZXJJZD1jLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTt2YXIgYWI9Yy5Eanx8YWI7KGZ1bmN0aW9uKGMpe2MuQ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWNhKCk7dGhpcy5ZYj10aGlzLllifHwhMTt0aGlzLmNnPXRoaXMuZWc9CnRoaXMubGg9dGhpcy51YT10aGlzLkdmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucWwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLkdmPSEwO3RoaXMubGgmJnRoaXMudWcoKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5GYjthJiZhLmpjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMua2QoKTt0aGlzLmxoPSEwO3RoaXMudWcoKX0uYmluZCh0aGlzKSk7CnRoaXMucGcoKX0sdWc6ZnVuY3Rpb24oKXtpZighdGhpcy5ZYil7dGhpcy5rZCgpO2lmKCF0aGlzLkdmJiYhdGhpcy5rZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuR2YmJnRoaXMuY2cmJiF0aGlzLmVnJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApfX0sa2Q6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LCRnOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGIubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1iLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YSlyZXR1cm4gZC5pbnN0YW5jZX19LHBnOmZ1bmN0aW9uKCl7aWYodGhpcy5rZCgpKXt2YXIgYT0KdGhpcy4kZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLmVnPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMuY2c9YS5DcH10aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZygpfS5iaW5kKHRoaXMpLDEwMCl9LEdwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLlRwKCk6ITF9LEdjOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5HYygpOi0xfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxxbDpmdW5jdGlvbihhLGIpe3RoaXMuWWI9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuWWJ8fDMwMj09dGhpcy5ZYj90aGlzLnVhPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5ZYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksMTAwKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMudWE/KHRoaXMudygpLHRoaXMub2EoKSk6YS5NZSgpPyh0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLktsKGEpPyh0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGJiPWMuQ2p8fGJiOyhmdW5jdGlvbihjKXtjLkVqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbm06ZnVuY3Rpb24oKXt3aW5kb3cuT08uTmoubmsubGs/d2luZG93Lk9PLk5qLm5rLmxrLkFwKGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ubSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBhPWNhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkZlKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPW5ldyBhYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgYmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIGNiPWMuRWp8fGNiLGRiPW5ldyBjYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMub289YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBlYj1jLm9vfHxlYjtuZXcgZWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMTt0aGlzLmRoKCl9LGRoOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTthJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRoKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sS2E6ZnVuY3Rpb24oKXt0aGlzLkhoKCl9LEhoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5VJiYoMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhoKCl9LmJpbmQodGhpcyksMTAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZmI9Yy5GaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuRWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0scmc6ZnVuY3Rpb24oYSl7dmFyIGI9CmEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLm9hKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMub2EoKTp0aGlzLmcoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMucmcoYS5hZEVycm9yRXZlbnRzKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5yZyhhKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGdiPWMuRWl8fGdiOyhmdW5jdGlvbihjKXtjLkdpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sS2g6ZnVuY3Rpb24oYSl7YT1uZXcgZmIoYSk7YS5qYT90aGlzLlAoKTp0aGlzLkwoYSl8fChhLkdkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLk4oYSksKG5ldyBnYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLnJsfHwodGhpcy5ybD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuS2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLktoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7CnRoaXMuUCgpfX0pfSkoYyk7dmFyIGhiPWMuR2l8fGhiLFM9bmV3IGhiKHIpO1MuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5obD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGliPWMuaGx8fGliO25ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLksuYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LFJjOmZ1bmN0aW9uKCl7dmFyIGE9bDtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFQ9Yy5Xanx8VDsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LmNkKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7CnguY2QoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5QbShhKX0uYmluZCh0aGlzKSk7eC5jZCgiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRCgpfS5iaW5kKHRoaXMpKTt4LmNkKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5VbCgpfSxQbTpmdW5jdGlvbihhKXt2YXIgYj0iIixjO2ZvcihjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSl7Yj1pc05hTihhW2NdKT8hMTphW2NdO2lmKDEwMDk9PWFbY118fDEwMDE9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKXt0aGlzLncoKTt0aGlzLm9hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBhW2NdKWlmKGFbY10uaGFzT3duUHJvcGVydHkoZCkmJihiPWlzTmFOKGFbY11bZF0pPyExOmFbY11bZF0sMTAwOT09YVtjXVtkXXx8CjEwMDE9PWFbY11bZF18fDMwMz09YVtjXVtkXXx8NDAzPT1hW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5vYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkQoKX19KX0pKGMpO3ZhciBVPWMuVmp8fFU7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxiLmxlbmd0aDtjKyspYS5wdXNoKGJbY10pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspYS5wdXNoKGJbY10pO3RoaXMuQWQmJihhPWUuZGwoYSx0aGlzLkFkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFQoZCk7aWYoIXRoaXMuTChkKSl7dGhpcy5OKGQpOwp2YXIgZj1uZXcgVShkLHRoaXMuRyk7Zi5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGM9YVtiXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuQWR8fCh0aGlzLkFkPVtdKSx0aGlzLkFkLnB1c2goYVtiXSksZD1uZXcgVChoKSx0aGlzLkwoZCl8fCh0aGlzLk4oZCksZj1uZXcgVShkLHRoaXMuRyksZi5mKCkpfWNhdGNoKGspe319fXRoaXMuUCgpfSxjZDpmdW5jdGlvbihhLGIsYyl7dGhpcy5hYXx8KHRoaXMuYWE9e30pO3RoaXMuYWFbYV18fCh0aGlzLmFhW2FdPXt9KTt0aGlzLmFhW2FdW2JdfHwodGhpcy5hYVthXVtiXT1bXSk7dGhpcy5hYVthXVtiXS5wdXNoKGMpfSxubzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmFhfHx0aGlzLmFhJiYhdGhpcy5hYVtiXSl0aGlzLk5jfHwKKHRoaXMuTmM9W10pLHRoaXMuTmMucHVzaChhKSx0aGlzLnRuKCkmJih0aGlzLnBmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoYz1hLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbYl1bY10mJjA8dGhpcy5hYVtiXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmFhW2JdW2NdLmxlbmd0aDtkKyspdGhpcy5hYVtiXVtjXVtkXShhKX19LFVsOmZ1bmN0aW9uKCl7aWYodGhpcy5OYylmb3IodmFyIGE9MDthPHRoaXMuTmMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5OY1thXSxjPWIuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoZD1iLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbY11bZF0mJjA8dGhpcy5hYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmFhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5hYVtjXVtkXVtlXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT0KYS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ4Lm5vKGEpfX0pfSkoYyk7dmFyIGpiPWMuWGp8fGpiLHg9bmV3IGpiKHIpO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2I9Yy5ibnx8a2I7bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVyhiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0sd2E6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBsYj1jLkJpfHxsYjsoZnVuY3Rpb24oYyl7Yy5DaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKJCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkQoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwphLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbWI9Yy5DaXx8Cm1iOyhmdW5jdGlvbihjKXtjLkRpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbGIoZCk7dGhpcy5MKGgpfHwodGhpcy5OKGgpLChuZXcgbWIoaCx0aGlzLkcpKS5mKCkpfWNhdGNoKGspe319dGhpcy5QKCl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5KYSlpZihiPT10aGlzLkphW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuRGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBwYj1jLk1pfHxwYjtuZXcgcGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLndnPXRoaXMuRWM9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dmFyIGI9dGhpcy5KZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuRWM9Yik7aWYoIXRoaXMud2cmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fAphLnNvdXJjZS5DSE9PU0VSX0FCKSl7dmFyIGM9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixhLnNvdXJjZS5DSE9PU0VSX0FCfHwiIiwhMCk7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixjLCEwKTt0aGlzLndnPSEwfX19Y2F0Y2goaCl7fX0uYmluZCh0aGlzKSk7dGhpcy5WZygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuZ24odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSxWZzpmdW5jdGlvbigpe2lmKHRoaXMuRWMpcmV0dXJuIHRoaXMuRWM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuSmcoYSkpcmV0dXJuIHRoaXMuRWM9CmF9fSxKZzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiZhLnZpZGVvU2xvdCYmKGI9YSk7YSYmYS5oZHZwYWlkJiYoYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sZ246ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5wYXVzZSYmdGhpcy5lYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5yZXN1bWUmJnRoaXMuZWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiYKdGhpcy5lYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5tdXRlJiZ0aGlzLmVhLm11dGUoKX0uYmluZCh0aGlzKSk7YSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEudW5tdXRlJiZ0aGlzLmVhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sbWg6ZnVuY3Rpb24oYSl7dGhpcy5lYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcWI9Yy55anx8cWI7KGZ1bmN0aW9uKGMpe2MueGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLnRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLnRpJiYodGhpcy5nKCksdGhpcy50aT0hMCx0aGlzLmthKCkpOwpiLkdhKCkuYWRkRXZlbnRMaXN0ZW5lcihhLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuVmcoKT90aGlzLkQoKToodGhpcy55ZXx8KHRoaXMueWU9MSksdGhpcy55ZSsrLDEwMDx0aGlzLnllP3RoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgcmI9Yy54anx8cmI7KGZ1bmN0aW9uKGMpe2Muemo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBhPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyBxYihhW2RdKSx0aGlzLkwoYyl8fCh0aGlzLk4oYyksKG5ldyByYihjLHRoaXMuRykpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTsKdmFyIHNiPWMuemp8fHNiLFY9bmV3IHNiKHIpO1YuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5RbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRiPWMuUW18fHRiO25ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmZrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LEthOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5VPygwLHRoaXMuVSkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuZmt8fHViOyhmdW5jdGlvbihjKXtjLmVrPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEljOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSwKYT1hLmdldFJhd1BsYXllcigpO3JldHVybiBhLmltYUFkc0xvYWRlcn0sZW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMub2EoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuZygpO3RoaXMuZ2V0UGxheWVyKCk7CnRoaXMuQmE/dGhpcy5lbih0aGlzLkJhKToodGhpcy5CYT10aGlzLkljKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuRCgpO3JldHVybn1pZighdGhpcy54Yyl7dGhpcy5EKCk7cmV0dXJufWE9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmViLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmViW2JdJiYzMDMhPXRoaXMuZWJbYl0mJjQwMyE9dGhpcy5lYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMub2EoKTtlbHNle3RoaXMuRCgpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMuZWt8fHZiOyhmdW5jdGlvbihjKXtjLmdrPQp0LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLlRhPS0xO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGM9bmV3IHViKGEuaXRlbShiKSk7dGhpcy5MKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGMpLChuZXcgdmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHdiPWMuZ2t8fHdiLHhiPW5ldyB3YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB5Yj1jLmJtfHx5YjtuZXcgeWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Saj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuamY9ITF9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLldtKCl9LmJpbmQodGhpcyksNTAwKX0sV206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5VJiZ0aGlzLlUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksCmI9MDthLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYj1hLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuamYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuamYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXbjpmdW5jdGlvbigpe3RoaXMuamY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciB6Yj1jLlJqfHwKemI7KGZ1bmN0aW9uKGMpe2MuUWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLnBjPTB9LGY6ZnVuY3Rpb24oKXt0aGlzLkVtPTEwO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5wY3x8KHRoaXMucGM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5nKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8Cih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKToodGhpcy5wY3x8dGhpcy5wYysrLHRoaXMucGM8PXRoaXMuRW0/KHRoaXMucGMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAo1MDApKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5XbigpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQWI9Yy5Ranx8QWI7KGZ1bmN0aW9uKGMpe2MuU2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgemIod2luZG93LnBsYXllckFwaSksdGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgQWIoYSwKdGhpcy5HKSkuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgQmI9Yy5Tanx8QmIsQ2I9bmV3IEJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIERiPWMueG98fERiO25ldyBEYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0iIjthLmN1cnJlbnRUaW1lJiYoYj1hLmN1cnJlbnRUaW1lKTtyZXR1cm4gYn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sS2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5VKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEViPWMuUGp8fEViOyhmdW5jdGlvbihjKXtjLk9qPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5HYSgpLGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZztiJiZiLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7YS5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuWGsoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5CYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMudW0oKTp0aGlzLnRnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFnKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5nKCEwKSl9LmJpbmQodGhpcyksCjFFMyl9LFhrOmZ1bmN0aW9uKCl7dGhpcy5hZygpfHx0aGlzLmcoITApfSx1bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQmIoKTshYS5uYSYmYS5WJiZhLnpwJiZhLkJwJiYodGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZygpKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7YS5hZHNMb2FkZXI/YS5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBjO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihjIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2NdKXtjPWFbY107YnJlYWsgYX1jPXZvaWQgMH0xMDA5PT1jfHwzMDM9PWN8fDQwMz09Yz8odGhpcy53KCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZygpfS5iaW5kKHRoaXMpLDEwMCl9LEJiOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2gpZm9yKHZhciBhPQpjLlpjLkJiKCksYj10aGlzLmdldFBsYXllcigpLkdhKCkuaWQsZT0wO2U8YS5sZW5ndGg7ZSsrKWFbZV0uaWQ9PWImJih0aGlzLkNoPWFbZV0pO3JldHVybiB0aGlzLkNofSxVcDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxnOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2E/dGhpcy5CYigpLmFkc0xvYWRlcj90aGlzLkQoITApOnRoaXMuRCgpOnRoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBGYj1jLk9qfHxGYjsoZnVuY3Rpb24oYyl7Yy5aYz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFBrOmZ1bmN0aW9uKGEpe2E9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgRmIoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Yy5aYy5CYigpO2lmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXRoaXMuUGsoYVtiXSk7dGhpcy5QKCl9fSk7Yy5aYy5CYj1mdW5jdGlvbigpe3ZhciBhPVtdO2lmKGwmJmwucGxheWVyYXBpJiYoYT1sLnBsYXllcmFwaSgpKSYmYS5sZW5ndGgpcmV0dXJuIGE7dmFyIGE9W10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSwKYltjXSYmYltjXS5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kJiZhLnB1c2goYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCksYltjXSYmYltjXS5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuZmVybW9kJiZhLnB1c2goYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuZmVybW9kKTtpZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgR2I9Yy5aY3x8R2IsSGI9bmV3IEdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEliPWMuJGl8fEliO25ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnVqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCks6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RSYmKGE9YS5maXJzdENoaWxkKTtpZihhKXt0aGlzLlQoYSk7aWYoYS50YWdOYW1lKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1iP3RoaXMuVyhiKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxTcDpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe2lmKEUpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmIWEucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxSYzpmdW5jdGlvbigpe3JldHVybiEwfSxHYTpmdW5jdGlvbigpe3ZhciBhO0U/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFc9CmMudWp8fFc7KGZ1bmN0aW9uKGMpe2MudGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMua2Y9IiI7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthJiYodGhpcy5rZj1hLmlkKTtFP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYz1hLnBsYXllckNvbnRhaW5lcjtjJiZ0aGlzLmtmJiZjIT10aGlzLmtmfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuRigidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEuJHApLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJgoodGhpcy5tKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFg9Yy50anx8WDsoZnVuY3Rpb24oYyl7Yy52aj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRSlmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBXKGEpLGEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBYKGEsdGhpcy5HKSxhLmYoKSl9ZWxzZSBpZihhPQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYT1uZXcgVyhhKSxhLmphP3RoaXMucGYoKTp0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIEUsSmI9Yy52anx8SmIsS2I9bmV3IEpiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBMYj1jLlVtfHxMYjtuZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5ZaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLApjPWEuR2V0RWwoKSxiJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLlooKSk6dGhpcy5aKCk6dGhpcy5aKCk6dGhpcy5aKCl9LHduOmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LHdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxYcDpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBNYj1jLllpfHxNYjsoZnVuY3Rpb24oYyl7Yy5YaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5xZygpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMua2EoKX0uYmluZCh0aGlzKSl9LHFnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj1hLkdldEFkRXJyb3JzQ2FjaGUoKSxjPTA7YzxiLmxlbmd0aDtjKyspdGhpcy5oYW5kbGVFcnJvcihiW2NdKTthLkNsZWFyQWRFcnJvcnNDYWNoZSgpfSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhKXtpZihudWxsPT0KYSl0aGlzLnFnKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuZygpKX19LGc6ZnVuY3Rpb24oYSl7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIE5iPWMuWGl8fE5iOyhmdW5jdGlvbihjKXtjLlppPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcms7YXx8KGE9d2luZG93LlRPbmxpbmVNZWRpYXBsYXllckZyYW1ld29yayk7aWYoYSYmYS5HZXRBbGxQbGF5ZXJzJiYoYT1hLkdldEFsbFBsYXllcnMoKSkmJjA8YS5sZW5ndGgpZm9yKHZhciBiPQowO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1uZXcgTWIoYVtiXSk7Yy5qYXx8dGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgTmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIE9iPWMuWml8fE9iLFBiPW5ldyBPYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBRYj1jLkltfHxRYjtuZXcgUWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKXtmb3IodmFyIGI9YT1hWzBdO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTsKYnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuWigpfSxSZDpmdW5jdGlvbihhKXt2YXIgYj0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9iPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6e319KTooYj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxiLmluaXRDdXN0b21FdmVudChhLCExLCExLGRhdGEpKTtiJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChiKX0sZm46ZnVuY3Rpb24oKXt0aGlzLlhjPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXtpZihhLmRldGFpbCYmImFkUmVxdWVzdCI9PWEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuWGN8fCh0aGlzLlhjPSEwLHRoaXMuUmQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChiKXt9fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSwKcGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlhjJiYodGhpcy5SZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlhjPSExKSx0aGlzLlJkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LHdhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgUmI9Yy5qa3x8UmI7KGZ1bmN0aW9uKGMpe2MuaWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sTGg6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2E/KGEmJmEuYWRkRXZlbnRMaXN0ZW5lciYmKGEuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLAphLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iYyhhKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKSksYSYmYS5hZGRBZEVycm9yTGlzdGVuZXImJmEuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuYmMoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkxoLmJpbmQodGhpcyksMTApfSxiYzpmdW5jdGlvbihhKXt2YXIgYj17fTthLmdldEVycm9yJiYoYS5nZXRFcnJvcigpLGI9YS5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMub2s9CiEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fDMwMz09Yi5nZXRFcnJvckNvZGUoKXx8NDAzPT1iLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMuZygpKToodGhpcy5va3x8dGhpcy5tKCJub2ZyYW1ld29yayIpLHRoaXMuZygpKX0sWWY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYT0wO2E8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YSsrKXRoaXMuYmMod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFthXSk7dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLllmLmJpbmQodGhpcyksMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuTGgoKTt0aGlzLllmKCk7dGhpcy5qbigpfSxqbjpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmRuP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihhKXt0aGlzLmRuPSEwO2lmKGEmJmEuZGV0YWlsKWZvcih2YXIgYiBpbiBhLmRldGFpbCkiYWRUYWdVcmwiPT1iJiYoYS5kZXRhaWxbYl18fHRoaXMuYmMoYSkpfX0pfSkoYyk7dmFyIFNiPWMuaWt8fFNiOyhmdW5jdGlvbihjKXtjLmtrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGE9bmV3IFJiKHdpbmRvdy5ETDhfR0xPQkFMUyk7YS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGEuZm4oKSxhPW5ldyBTYihhLHRoaXMuRyksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLAphLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgVGI9Yy5ra3x8VGIsVWI9bmV3IFRiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuamw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYj1jLmpsfHxWYjtuZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5aaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLkZoPSExO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb01vZGVsKXt2YXIgYj1hLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYil7dGhpcy5UKGIpO3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVyhjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihhKXt0aGlzLkptPWF9LmJpbmQodGhpcykpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX1lbHNlIHRoaXMuWigpfSx3bjpmdW5jdGlvbigpe30sc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MTtyZXR1cm4gYS52aWRlb01vZGVsJiZhLnZpZGVvTW9kZWwuZ2V0JiYoYj1hLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGIpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KbX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFI6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuUGQoYSl9LmJpbmQodGhpcykpfSxQZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiYhdGhpcy5GaCYmKHRoaXMuRmg9ITAsdGhpcy5VJiZ0aGlzLlUoKSl9fSl9KShjKTt2YXIgTj1jLlpqfHxOOyhmdW5jdGlvbihjKXtjLllqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5CZSlpZih0aGlzLkhifHwKKHRoaXMuSGI9MCksdGhpcy5IYisrLDE1PHRoaXMuSGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhKXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuSm4oKTp0aGlzLmcoITApLCEwO3RoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKTthLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMuZygpOnRoaXMuZyghMCl9ZWxzZSBpZihhPWEudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkJlPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsCmZ1bmN0aW9uKGEpe3RoaXMuY2EoYSk7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk89YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPQphLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CYSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIE89Yy5Zanx8TzsoZnVuY3Rpb24oYyl7Yy4kaj0KdC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpO3RoaXMuVGE9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBhPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7YS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHwKdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5wZigpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIFdiPWMuJGp8fFdiLFhiPW5ldyBXYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYj1jLkVrfHxZYjtuZXcgWWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5xaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSwKUjpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWT1jLnFqfHxZOyhmdW5jdGlvbihjKXtjLnBqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmloPTA7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPXRoaXMuS2M9dGhpcy5CYT10aGlzLmVkPSExO3RoaXMuSmg9ZS5MYigxMCk7dGhpcy5xaCgpfSxxaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLnNiKCksITA7dGhpcy5paCsrO2lmKDEwPHRoaXMuaWgpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMuZyghMCk6dGhpcy5nKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5xaC5iaW5kKHRoaXMpLDEwMCksITF9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuY2EoYSwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuY2EoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuYmEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PQphLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLnVhPQohMH0sYmE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCk/KHRoaXMudygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJmIuYXBpLnBsYXllZCgpP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgWj1jLnBqfHxaOyhmdW5jdGlvbihjKXtjLnJqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBZKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWSh3aW5kb3cucGxheWVyKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWihhLHRoaXMuRyksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLnJqfHxaYiwkYj1uZXcgWmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy4kbHx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsCmI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgYmM9Yy5WaXx8YmM7KGZ1bmN0aW9uKGMpe2MuVWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2coKX0sc2c6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBjYz1jLlVpfHwKY2M7KGZ1bmN0aW9uKGMpe2MuV2k9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGJjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmphKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTChhKSl7dGhpcy5OKGEpOyhuZXcgY2MoYSx0aGlzLkcpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYz1jLldpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmM9Yy5Va3x8ZmM7bmV3IGZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLndpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5aKCkpOnRoaXMuWigpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgZ2M9Yy53aXx8Z2M7KGZ1bmN0aW9uKGMpe2Mudmk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcykpO3RoaXMuc2UoKTt0aGlzLm9nKCl9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LENhOmZ1bmN0aW9uKCl7dGhpcy51YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sb2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5vYSgpKTp0aGlzLmcoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9nLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuc2UuYmluZCh0aGlzKSwxMDApfSxzZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5nKCk6dGhpcy5nKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX19LGc6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5rYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIGhjPWMudml8fGhjOyhmdW5jdGlvbihjKXtjLnhpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sUmE6ZnVuY3Rpb24oYSl7YT0KbmV3IGdjKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgaGMoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuUmEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlJhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIGljPWMueGl8fGljLGpjPW5ldyBpYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYz1jLm5sfHxrYztuZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMucmg9dGhpcy50aD10aGlzLnNoPSExO3RoaXMuQ2Q9W107dGhpcy5vZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHphP251bGw6emEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgUz9udWxsOlMsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHVhP251bGw6dWEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFhiP251bGw6WGIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFViP251bGw6VWIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9iP251bGw6b2IsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGRiP251bGw6ZGIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBDYj9udWxsOkNiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeGI/bnVsbDp4YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6Vn19Yy5Maj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLkxsKGEpOltdLGM7dGhpcy50aD0hMDtpZihhLmxlbmd0aCl7dGhpcy5zaD0hMDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyljPWFbZF0sCnRoaXMuUmgoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLm9mKXtpZih0aGlzLnJoKWJyZWFrO2M9dGhpcy5vZltkXTt0aGlzLkpmKGMpJiYodGhpcy5DZC5wdXNoKGMpLHRoaXMuUmgoYykpfX0sSmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxMbDpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspZD1hW2VdLGQ9dGhpcy5vZltkXSx0aGlzLkpmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LFJoOmZ1bmN0aW9uKGEpe3RoaXMuSmYoYSkmJmEuZigpfSxZbjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcSYmIXRoaXMuc2gpZm9yKHRoaXMucmg9ITAsYT0wO2E8dGhpcy5DZC5sZW5ndGg7YSsrKXRoaXMuQ2RbYV0uU2ImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZFthXS5TYil9fX0pKGMpO3ZhciBsYz1jLkxqfHxsYyxMPW5ldyBsYztMLmYoKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5nbHx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuRmMoay5BbyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsCmMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuTm0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtDLndpZHRoPTE7Qy5oZWlnaHQ9MTtDLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChDKTt2YXIgcWM9Qy5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1DLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChDKTt2YXIgRz1uZXcgSCxsPSExO0cuZmEoKTtHLm5oKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5mYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcubmgoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LAohMSk7Ry5mYSgpO3ZhciByYz1xYyhmdW5jdGlvbigpe2UuTmcod2luZG93LEcuZG0oKSx7aWQ6cmN9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlNpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy5TaXx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkdoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy54ZD0wO3RoaXMuYmI9IiI7dGhpcy5EZD1bXTt0aGlzLkVkPTA7dGhpcy5JaD0hMTt0aGlzLmxmPVtdO2UucGIoIm5ld0FkZGVsaXZlcnkiKX1jLnlpPWE7YS5wcm90b3R5cGU9e0ZuOmZ1bmN0aW9uKGEpe3RoaXMuR2g9YX0sdmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmJiPXRoaXMucGxheWVyLlIoKX0sCmdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQW46ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSx6bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm5iKTsKdmFyIGQ9ITEsZj0hMTtpZih0aGlzLmVtKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5wYSx0aGlzLm5iLm5mLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5XbCgpKXRoaXMudm4oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuJG4oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsaCk7bC54bih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuRG0oYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwKInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuVWUmJihkPXRoaXMucGxheWVyLlVlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLldlKGEsZCxmKTt0aGlzLnBsYXllci5TaChsKX19LGVtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMueGQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy54ZC5nZXRUaW1lKCksdGhpcy54ZD1hLDNFNTxjPyEwOiExO3RoaXMueGQ9YTtyZXR1cm4hMX0sUW46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS51ZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuRmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLklnKGEpKT90aGlzLlNjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksCjApLGUubyhrLm1kLHRoaXMucGxheWVyLmwoKSkpfSxQbjpmdW5jdGlvbihhKXtpZighdGhpcy5HaCl7ZS51ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuRm4oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuSWcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS5vKGsubWQsdGhpcy5wbGF5ZXIubCgpKSl9fSxJZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sbW46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Nbih0aGlzLlBuLmJpbmQodGhpcykpOwp0aGlzLnBsYXllci5LYSgpfSxJZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS51ZigibWlkcm9sbCIpO2lmKCF0aGlzLndoKXt0aGlzLndoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm1kLHRoaXMucGxheWVyLmwoKSkpfX0sbG46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Fbih0aGlzLklkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlplKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlFuKCk7dGhpcy5wbGF5ZXIuWmUmJnRoaXMubG4oKTt0aGlzLm1uKCl9LG5uOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/CmE9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkRkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5jcChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuRWQ9dGhpcy5EZC5sZW5ndGh9LFdsOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkVkJiYoYT0hMCk7cmV0dXJuIGF9LHZuOmZ1bmN0aW9uKGEpe3RoaXMuSWg9YTtmb3IoYT0wO2E8dGhpcy5EZC5sZW5ndGg7YSsrKXRoaXMuRGRbYV1bImZ1bmN0aW9uIl0odGhpcy4kbS5iaW5kKHRoaXMpKX0sJG06ZnVuY3Rpb24oYSl7dGhpcy5FZC0tO2EmJnRoaXMubGYucHVzaChhKTswPj10aGlzLkVkJiZ0aGlzLkloKCl9LERtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0iIixkPTA7ZDx0aGlzLmxmLmxlbmd0aDtkKyspYz0KdGhpcy5sZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy55aXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLnBsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoZWVCaWNoYWhNaWFNZWVHaCxlZUJpY2hhaE1pYU1lZUdoKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.219.72.195 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

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

Response headers

Date
Tue, 03 Dec 2019 12:58:42 GMT
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
x-amz-request-id
C05ACADBA7B3B4A2
Content-Length
53
x-amz-id-2
ixx3PZhMW1+/YBUZkIO6Xrn+NzsqM55+62RXDlLXOtnp9W0lo2ak45LOPtDXvdEmCmSEe9i9BvI=
Last-Modified
Tue, 03 Dec 2019 06:40:04 GMT
Server
AmazonS3
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Access-Control-Max-Age
3000
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
https://videos.giga.de
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
Accept-Ranges
bytes
Expires
0
giga-ssl.json
videos.giga.de/homad/ Frame 34FB
265 B
436 B
XHR
General
Full URL
https://videos.giga.de/homad/giga-ssl.json?cache=6924814971
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGVlQmljaGFoTWlhTWVlR2g9ZWVCaWNoYWhNaWFNZWVHaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZmZ8fCh4LmZmPTApO3guZmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5mZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5IayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2IudmYoYyk7Yi5BbihtKTtiLnpuKGwpO2Iubm4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Jbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS51aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudWgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmlsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5pbHx8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuSGs9ITE7dGhpcy5HYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlptLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5naD17fTt0aGlzLnNmPSExfWMuY2o9YTthLnByb3RvdHlwZT17Wm46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt0aGlzLnNmfHwodGhpcy5zZj1lLlgoMTApKTtyZXR1cm4gdGhpcy5zZn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmdoW2JdJiYodGhpcy5naFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLlpuKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx6azpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sWm06ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuWW0oYi5kYXRhKX0sWW06ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxCZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5XZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMueWQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxXZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSx4azpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnRhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnRsKGIpKXJldHVybjsoYT10aGlzLkJnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx0bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTGc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHBtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFVnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxLbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHhmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuYWwoYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuS24oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sSms6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGFsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5KayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxEZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxwaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxMYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFRoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LGttOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scWQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLmFjPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0FpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEhpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LAphbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxGajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxoazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sc2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxVajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LERrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuQWkoKXx8Yi5IaSgpfHxiLmFtKCl8fGIuRmooKXx8Yi5oaygpfHxiLnNqKCl8fGIuVWooKX19O3JldHVybiBudWxsIT1iLkRrKCl9LHlsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sdGE6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxDYjpmdW5jdGlvbihiKXtiPXRoaXMudGEoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LE1sOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMudGEoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxkbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxSbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxRZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMua2koYSkrIjoiK3RoaXMua2koTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGtpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx1ZjpmdW5jdGlvbihiKXt0aGlzLkdiPWJ9LE5nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuR2I7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxhbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLk1sKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sU246ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmdjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5hbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLnZhKGIsITApO2I9bS52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS52YShmLCEwKTtmPW0udmEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFFkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS52YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uT2soKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnVkKGIpOiIifSx1ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG1nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy5wbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnFmJiZ3aW5kb3cuc2FuZGJveC5xZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLkxnKGIpKXJldHVybiB0aGlzLkxnKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS53ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy54ayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixlKTtlPWsudmEoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHlkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSx5bTpmdW5jdGlvbihiLGEsZCl7dGhpcy55ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx1aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMueW0oZi53ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCkluOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGNwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxGazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0saW06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuY2p8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLmJqPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuVG09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuTW09e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuWm89e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5rbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmJwPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuZ2c9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuWmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5kZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5oZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EucGs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuYmc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Gbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EubGw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS4kbz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS54Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLlprPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5tZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5mZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eucms9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5iZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnFrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5yaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLk9tPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuemQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS55Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuWW89e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuQm89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkNvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Bbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLk5tPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5ianx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLmZsfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxJbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdGQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnRkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudGQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudGQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG5oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5JbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnRkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmRqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5oaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLmhqfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuSWk9YX0pKGMpO3ZhciBLPWMuSWl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Ca3x8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Laj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTWI9MDt0aGlzLlRhPTE1MDt0aGlzLlNiPTA7dGhpcy5CbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGE/KHRoaXMuTWIrKyx0aGlzLlNiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5TYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHRuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWI+dGhpcy5UYT8hMDohMX0scGY6ZnVuY3Rpb24oKXt0aGlzLk1iPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxCbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sR2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudGgmJkwuWW4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxqbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLktqfHx0OyhmdW5jdGlvbihjKXtjLk1qPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5NYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRmI9IiI7dGhpcy5EZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKTW46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sRW46ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGEmJih0aGlzLk1iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVGc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sR2Q6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5YbCgpfHx0aGlzLnRrKCk7dGhpcy5HZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHRrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sWGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx3YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxTaDpmdW5jdGlvbihhKXt0aGlzLkZiPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmJ9LE9oOmZ1bmN0aW9uKCl7dGhpcy5GYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRmImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkRnfHwodGhpcy5EZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLk1qfHxxOyhmdW5jdGlvbihjKXtjLnppPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuV2Y9IjEiO3RoaXMuWGY9IjIiO3RoaXMubWs9IjMiO3RoaXMuJGM9MDt0aGlzLkZtPQozMDt0aGlzLlhiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5pZz10aGlzLm1pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMudmYoYSk7dGhpcy5DbihiKX0sZjpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLm1pfHwodGhpcy5taT0hMCxlLlhlKCkpfSxBaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGNtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmdjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5nYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV09MX0sZ206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZ2MoKSYmKHRoaXMud2YoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy56YSgpKXt0aGlzLmNtKCk7aWYoIXRoaXMuZ20oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMud2YoKTtyZXR1cm59dGhpcy53ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuZ2koKTt0aGlzLmlnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy56YSgpfHwodGhpcy5YYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGdpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5YYiYmMDx0aGlzLlhiLmxlbmd0aCYmKHRoaXMuWGI9ZS51bmlxdWUodGhpcy5YYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWGIuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLldmfSx3ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWGZ9LEpuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ta30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxhZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5XZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWGZ9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx2ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LENuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxHbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEJtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy56aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkJqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5Canx8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUGk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUGl8fG5hOyhmdW5jdGlvbihjKXtjLlFpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubmE/Yi5uYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlFpfHxvYTsoZnVuY3Rpb24oYyl7Yy5SaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5SaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLnRvfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5uaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuS2coKTt0aGlzLk1nKCk7dGhpcy5Zaz0hMX0sS2c6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxNZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5JZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSWQoYil9LmJpbmQodGhpcykpfSxJZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5uanx8cmE7KGZ1bmN0aW9uKGMpe2MubWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuaGU9ITE7dGhpcy5rZT0xO3RoaXMuYWQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuaGU9ITE7dGhpcy5rZT0xO3RoaXMuYWQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTtpZihhLmdldENvbmZpZylpZihiPWEuZ2V0Q29uZmlnKCksYi5hZHZlcnRpc2luZyl7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSlpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcyliLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5rZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMueWI9ITApO2Vsc2V7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSBpbnN0YW5jZW9mIEFycmF5KWZvcih2YXIgZz0wO2c8Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5sZW5ndGg7ZysrKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGVbZ10udGFnKXt0aGlzLnliPSEwO2JyZWFrfWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMueWI9ITApO2IuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMueWI9ITApfWIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy55Yj0hMCl9ZWxzZSB0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpO2Zvcih2YXIgZD0KImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGc9MDtnPGQubGVuZ3RoO2crKylhLm9uKGRbZ10sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtnXSYmKHRoaXMuaGU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtnXSYmdGhpcy5BaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLkZtJiYhdGhpcy56YSgpJiYodGhpcy55Yj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5nKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoZXZlbnQuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKTthLm9uKCJwbGF5bGlzdGl0ZW0iLApmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLllrPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5GYjtiJiYoYi5CZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmFkLmluZGV4T2YoYikmJnRoaXMuYWQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy53KCksdGhpcy5vYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMudygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLmFkLmxlbmd0aD49dGhpcy5rZSYmdGhpcy5nKCkpfSwKQm06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRGYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmhlfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuS2coKSxiLk1nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciBzYT1jLm1qfHxzYTsoZnVuY3Rpb24oYyl7Yy5vaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT0KdGhpcy5DbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2E9W107aWYoMTxiLmxlbmd0aClmb3IoZz0wO2c8Yi5sZW5ndGg7ZysrKWEucHVzaChiW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBhLnB1c2goandwbGF5ZXIoKS5pZCk7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpO3RoaXMuTChnKXx8dGhpcy5qbShnKXx8KHRoaXMuTihnKSxnPW5ldyBzYShnLHRoaXMuRyksZy5LKCksZy5mKCkpfX10aGlzLlAoKX19LEpwOmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LENsOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS56YihhLmFuY2hvcil9fSl9KShjKTt2YXIgdGE9Yy5vanx8dGEsdWE9bmV3IHRhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ibz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuYm98fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmNrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCks6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEpe3ZhciBiPWEuZWxfO2J8fChiPWEuZWwoKSk7Yj8odGhpcy5UKGIpLChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlcoYSk6dGhpcy5aKCkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYSl7dGhpcy5QZChhKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFiWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGEuYXV0b3BsYXk/YS5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sd2E6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHdhPWMuY2t8fHdhOyhmdW5jdGlvbihjKXtjLmJrPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMudWE9dGhpcy5LYz10aGlzLkJhPXRoaXMuZWQ9ITE7dGhpcy5KaD1lLkxiKDEwKTt0aGlzLklmPSEwO3RoaXMueGM9dGhpcy5raD0hMTt0aGlzLkttKGEuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy56aCgpLHRoaXMuS2soKSx0aGlzLnNiKCkpfSxLbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLAoiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGEuViwiOyIsdHlwZW9mIGEuViwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYS5WP2EuVi5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGEuVj90eXBlb2YgYS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYS5pbWEsIjsiLHR5cGVvZiBhLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGEuSCwiOyIsdHlwZW9mIGEuSCwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLmltYT9hLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuRWE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuRWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILkVhOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguRWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5pbWEmJmEuaW1hLkVhP2EuaW1hLkVhKCk6InVuZGVmaW5lZFgiLCI7IixhLmltYSYmYS5pbWEuRWE/dHlwZW9mIGEuaW1hLkVhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5mZToKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuZmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixhLkg/YS5ILmZlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguZmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILmdlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguZ2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubmE6InVuZGVmaW5lZFgiLCI7IixhLkg/CnR5cGVvZiBhLkgubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5xZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuSmgpfSxIYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5pbWEzJiYodGhpcy5pbWE9YS5pbWEzKTtpZihhLmltYSl7dGhpcy5pbWE9YS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmCih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LEljOmZ1bmN0aW9uKCl7aWYoIXRoaXMubmEpe3ZhciBhPXRoaXMuSGMoKTthJiYoYS5hZHNMb2FkZXImJih0aGlzLm5hPWEuYWRzTG9hZGVyKSxhLl9hZHNMb2FkZXImJih0aGlzLm5hPWEuX2Fkc0xvYWRlciksYS5nZXRBZHNMb2FkZXImJih0aGlzLm5hPWEuZ2V0QWRzTG9hZGVyKSxhLmNvbnRyb2xsZXImJmEuY29udHJvbGxlci5zZGtJbXBsJiZhLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm5hPWEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm5hfSxZZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LGhtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuamgpe3ZhciBhPQp0aGlzLkhjKCksYj10aGlzLmZtKCk7d2luZG93LmltYSYmYSYmKGEuX2Fkc0xvYWRlcnx8YS5hZHNMb2FkZXJ8fGIpJiYodGhpcy5qaD0hMCl9cmV0dXJuIHRoaXMuamh9LGZtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5lZCYmYS5hZHMmJihhLmFkcy5zdGF0ZXx8YS5hZHMuX3N0YXRlKSYmKHRoaXMuZWQ9ITApO3JldHVybiB0aGlzLmVkfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWMoKTtpZihhKXt2YXIgYj0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5rbigpfS5iaW5kKHRoaXMpKSwKYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5jYShiLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5iYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxrbjpmdW5jdGlvbigpe3RoaXMueGM9ITA7dmFyIGE9dGhpcy5ZZygpO2lmKGF8fHRoaXMuemEoKSl7dmFyIGI9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5jYShiKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oYil7dGhpcy5jYShiLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5iYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuU2EoKSYmKGQ9Ik1fIik7YS5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDsKaWYoZS5GKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYi5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIisKZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnljfHwodGhpcy5tKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5iYSgpLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LElwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5BZyYmYS5hZHMmJih0aGlzLkFnPWEuYWRzKTtyZXR1cm4gdGhpcy5BZ30sS2s6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7CnRoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLkFoKCl9LmJpbmQodGhpcykpfSxvZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksCjUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YSYmKChhPXRoaXMuWWcoKSkmJmEuZGVzdHJveT9hLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2QoKX0uYmluZCh0aGlzKSw1MCkpfSx6aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcoKSYmMDxhLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5obSgpKXt2YXIgYj10aGlzLkhjKCksZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLncoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5raD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8KKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5iYSgpKToodGhpcy5iYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMua2g9ITA7YS5pc1BsYXlpbmcoKSYmMTA8YS5jdXJyZW50VGltZSgpfHx0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56aCgpfS5iaW5kKHRoaXMpLDUwKX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYihnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sTGs6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpOwpyZXR1cm59fWVsc2UgdGhpcy5DYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGsoKX0uYmluZCh0aGlzKSwxMCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIGUueGU/ITE6dGhpcy51YX0sQ2E6ZnVuY3Rpb24oKXtpZih0aGlzLllsKCkpe3RoaXMudWE9ITA7aWYoZS5GKCJnaWdhLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKXRoaXMuSWY9ITEsZS50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsInNldCIsITApO3RoaXMuZyghMCl9ZWxzZSB0aGlzLnVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpfSxZbDpmdW5jdGlvbigpe2lmKDA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPQohMTtlLnlkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2E9IWUuZmIoYi5jYyl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXthPSExfSwhMCwhMCk7dmFyIGI9ZS55bCgpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGUueGU9LTEhPWIuaW5kZXhPZigiZmlyZWZveCIpfHwtMSE9Yi5pbmRleE9mKCJzYWZhcmkiKXx8YX1yZXR1cm4hMX0sYmE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCk/KHRoaXMudygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy56YSgpfHwoYXx8KHRoaXMuSWY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSWYsZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApUazpmdW5jdGlvbigpe3RoaXMuUnB8fCgxMDx0aGlzLkxvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuTG8rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5zbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UaygpfS5iaW5kKHRoaXMpLDUwKSkpfSxzbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Nbyl7dGhpcy5Nbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7CmEudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmJrfHx4YTsoZnVuY3Rpb24oYyl7Yy5kaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuWGgod2luZG93KTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyl0cnl7Yj1ifHx0aGlzLlhoKGFbZ10pfWNhdGNoKGQpe310aGlzLlAoKX19LFhoOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5TYj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5RYyl9fSl9KShjKTt2YXIgeWE9Yy5ka3x8eWEsemE9bmV3IHlhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Baj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEFhPWMuQWp8fEFhO25ldyBBYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuZ2Y9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTsKcmV0dXJufXRoaXMuVChiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2E/dGhpcy5XKGEpOnRoaXMuWigpfSxWbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkZiLGc9dGhpcy5oYSgpLGQ9IiI7YS5tZW1vJiYoZD1hLm1lbW8udmlkZW9pZCk7ZCYmYiYmYi5qYyYmKDA8PWcuaW5kZXhPZihkKXx8Yi5CZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuZ2Y9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKd2E6ZnVuY3Rpb24oKXt0aGlzLmdmKys7aWYoMTA8dGhpcy5nZilyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFBkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgphJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlUmJnRoaXMuVSgpfX0pfSkoYyk7dmFyIEJhPWMuSGp8fEJhOyhmdW5jdGlvbihjKXtjLkdqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQmUpaWYodGhpcy5IYnx8KHRoaXMuSGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5IYisrLDE1PHRoaXMuSGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZyghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPQohMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYihnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpOwp2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLm9sPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy5vbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlZtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwKMTAwKX0sZzpmdW5jdGlvbihhKXt0aGlzLkQoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Hanx8Q2E7KGZ1bmN0aW9uKGMpe2MuSWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5UYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmCihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyBCYShhW2JdKTtnLmphfHx0aGlzLkwoZyl8fCh0aGlzLk4oZyksKG5ldyBDYShnLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRGE9Yy5Janx8RGEsRWE9bmV3IERhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5UbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuVGx8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmpqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlVnKGEsImVsZW1lbnRJRCIpOwpzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLlhtPWEucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1hLndpZHRoO2cuc3R5bGUubWluV2lkdGg9YS53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5YbSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsCmIpfXRoaXMuVChnKTt0aGlzLlcoZyk7dGhpcy5yZD1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMucmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnJkKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sU2s6ZnVuY3Rpb24oKXtlLnBoKHRoaXMucmQpO2UuT2UodGhpcy5yZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNrKCl9LmJpbmQodGhpcyksNTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LFVlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5qanx8R2E7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuaWp8fEhhOyhmdW5jdGlvbihjKXtjLmtqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiYKbC5pbnJlYWQpe3ZhciBhPWwuaW5yZWFkLGI9ZS5VZyhhLCJlbGVtZW50SUQiKTtpZihlLnBoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTChhKSkpe3RoaXMuTihhKTsobmV3IEhhKGEsdGhpcy5HKSkuZigpO3JldHVybn10aGlzLlNiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBJYT1jLmtqfHxJYSxKYT1uZXcgSWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy53anx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPQoiR0VUIjt0aGlzLmRhdGE9e319Yy5laj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxEbjpmdW5jdGlvbihiKXt0aGlzLm1ldGhvZD1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LHVrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBBPWMuZWp8fEE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixnLGQsZil7dGhpcy5YYT1iO3RoaXMuUGc9dGhpcy51aT0hMTt0aGlzLkJoPWQ7dGhpcy5ZaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmCjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmMD09Yy5zdGF0dXMmJm0mJm0uUmUodGhpcy5YYS51cmwpJiZtLlZjKXt2YXIgZT1uZXcgQShiLnVybCk7ZS5EbigiUE9TVCIpO2Uuc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGEoZSxmdW5jdGlvbihiKXt2YXIgYT0hMTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChnKXthPSExfWEmJmEucGluZyYmInBvbmciPT1hLnBpbmcmJihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZmo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiKwpkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYVtkXSk7Yj1iLnN1YnN0cigxKX10aGlzLlBnJiYoYis9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0aGlzLmhiLnVybENhbGxlZD10aGlzLlhhLnVybDt0cnl7dGhpcy5ZaD90aGlzLmhiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITEpOnRoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMCksdGhpcy51aXx8KHRoaXMuaGIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGIubGVuZ3RoJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwKInJlcXVlc3RfZmFpbGVkIiwhMCk6bS5SZSh0aGlzLlhhLnVybCksdGhpcy5CaCYmdGhpcy5CaCgpfXJldHVybiB0aGlzLmhifX19KShjKTt2YXIgTGE9Yy5manx8TGE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkRhPXRoaXMuYmU9ITF9Yy5KaT1hO2EucHJvdG90eXBlPXtIbjpmdW5jdGlvbihiKXt0aGlzLmJlPWJ9LEduOmZ1bmN0aW9uKGIpe3RoaXMuRGE9Yn0scW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIiwicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIiwKdnA6IkFkU2tpcHBlZCIsd3A6IkFkU3RhcnRlZCIsbHA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixtcDoiQWRJbXByZXNzaW9uIixpcDoiQWRDcmVhdGl2ZVZpZXciLHBwOiJBZFZpZGVvTWlkcG9pbnQiLHFwOiJBZFBhdXNlZCIsc3A6IkFkVmlkZW9TdGFydCIsdHA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5iZSxhW2RdKX0scG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmFlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmFlKXRoaXMuRGEuYWUuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuRGEsdGhpcy5EYS5hZVthXSk7dGhpcy5EYSYmdGhpcy5EYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EYS5nZXRFcnJvcigpO2ImJmNvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsImdvdCBlcnJvciIsYil9LmJpbmQodGhpcyksMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5iZSYmdGhpcy5xbigpO3RoaXMuRGEmJnRoaXMucG4oKX19fSkoYyk7dmFyIE1hPWMuSml8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5IYT0hMTt0aGlzLiRiPSIiO3RoaXMuZmQ9dGhpcy5aYj10aGlzLmpiPW51bGw7dGhpcy5HZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMucGE9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm5mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk9iPSIiO3RoaXMuWmQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7CnRoaXMuWWQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLnZiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLldiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLlBiPSIiO3RoaXMuUWI9W107dGhpcy5SYj1bXTt0aGlzLlVjPVtdO3RoaXMub2M9IiI7dGhpcy5BYj0hMTt0aGlzLk9kPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuaWM9ITE7dGhpcy52Zz10aGlzLlVkPW51bGw7dGhpcy56Zj10aGlzLlZiPXRoaXMuRmc9dGhpcy5TZD10aGlzLlZjPXRoaXMuaGQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnZkPTA7dGhpcy5maD0hMTt0aGlzLmVoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5naj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy4kYixhZHRhZ21vZGlmaWVyOnRoaXMuamIsYWR0YWdtb2RpZmllckFkdjp0aGlzLlpiLGFkdGFncmVnZXg6dGhpcy5mZCxiaXRyYXRlOnRoaXMuT2EsanNwb3B1cHM6dGhpcy5UZSxzaWRlbG9hZHM6dGhpcy50YixkaXNhYmxldGVzdHM6dGhpcy5HZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLlNlLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnBhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5PYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuWmQsSE9NQURfQkxPQ0tFRDp0aGlzLllkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLldiLHRlc3RIaWRlOnRoaXMuUGIsdGVzdFRhZ3M6dGhpcy5RYix0ZXN0VGFnc0pTOnRoaXMuUmIsCnRlc3RUYWdzWEhSOnRoaXMuVWMsdGVzdDNQQ29va2llOnRoaXMub2MsdGhyb3R0bGU6dGhpcy5PZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLmljLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMudmcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5zYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuaGQsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuVmMsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuU2QsY29uZmlnRmFpbHVyZXM6dGhpcy5aYSxzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5yZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5WYixza2lwQWxsb3dlZDp0aGlzLnpmLHZtYXBzOnRoaXMuTmYsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LHluOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy4kYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLmpiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuWmI9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5mZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkdnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuU2U9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuSmM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5wYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5PYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9CmIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLlpkPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuWWQ9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMudmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5XYj1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuUGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5SYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMub2M9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLk9kPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLmljPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLnZnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuaGQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmCih0aGlzLlZjPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuU2Q9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLlphPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5yZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVmI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuemY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmCih0aGlzLk5mPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuemM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmllPWIuYWRGYWxsYmFja1VSTCl9LFZsOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYTtmb3IoYSBpbiB0aGlzLlphKSJib29sZWFuIj09dHlwZW9mIHRoaXMuWmFbYV0mJjE9PXRoaXMuWmFbYV0mJihiPSEwKTtyZXR1cm4gYn0sdGY6ZnVuY3Rpb24oYil7dGhpcy5aYVtiXT0hMH0sRGw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxNZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGI9ZS5GayhiKX0sdmE6ZnVuY3Rpb24oYixhLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy50YShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuJGJ8fHRoaXMuamJ8fAp0aGlzLlpifHx0aGlzLmZkKSYmKGg9dGhpcy5IbShoKSk7Yj1uZXcgQShlKTtiLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkZsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1oO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGgpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sUWU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSwKTGM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuZ2EmJnRoaXMuZ2EubGVuZ3RoJiYwPHRoaXMuZ2EubGVuZ3RoJiYoYT10aGlzLmdhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LFJlOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuUWUoYik7cmV0dXJuIGF9LEZsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwOwpyZXR1cm4ibm9uZSJ9LHdkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2FbdGhpcy5yZl19LFBjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy53ZCgpLGE9dGhpcy5UaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSx4aDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxHbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUudGEoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPApoLmxlbmd0aDtGKyspe3ZhciBrPWhbRl0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWZbbF09dGhpcy54aChmW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZiloLnB1c2gobCsiPSIrZltsXSk7Zj1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMueGgoZC5xdWVyeUtleVtjXSxjLGFbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxIbTpmdW5jdGlvbihiKXt0aGlzLiRiJiYoYis9dGhpcy4kYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5aYiYmKGI9dGhpcy5HbShiLHRoaXMuWmIpKTtyZXR1cm4gYn0sUms6ZnVuY3Rpb24oKXt0aGlzLnlhJiYKdGhpcy55YS5jbGllbnRBUElzJiZ0aGlzLk1rKHRoaXMueWEuY2xpZW50QVBJcyl9LE1rOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBNYTtiLnB1Ymxpc2hlckFQSSYmYS5IbihiLnB1Ymxpc2hlckFQSSk7Yi5wbGF5ZXImJmEuR24oYi5wbGF5ZXIpO2EuZigpfX0saTpmdW5jdGlvbihiLGEsZCxmLGMsZSl7bT10aGlzO3RoaXMuU2U9ITA7dGhpcy5KYz1iO3RoaXMucGE9YTt0aGlzLm5mPWQ7dGhpcy5VZD1mO3RoaXMuRGM9Yzt0aGlzLnlhPWV8fHt9O3RoaXMuUmsoKTt0aGlzLnhtKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnBhKXRoaXMudm0oKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMucGEpdHJ5e3RoaXMucGE9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnBhKXRyeXt0aGlzLnBhPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSwKcmI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGF9LHhtOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgQSh0aGlzLkpjK3RoaXMub2UoImdsb2JhbCIpKSx0aGlzLlNsLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnRmKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuQWMoKX0uYmluZCh0aGlzKSwhMCl9LHZtOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgQSh0aGlzLnBhK3RoaXMub2UoImNsaWVudCIsLTEhPXRoaXMucGEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy50ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoKIj8iKSsoImNhY2hlPSIrdGhpcy5MYigpKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1iJiYoZD0iIik7dGhpcy55YSYmdGhpcy55YS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGRhOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhkKXt0aGlzLmhkPSEwO3ZhciBhPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChnKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpOwpmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLkRjPSExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWWQpKTsKdGhpcy5UYigpO2UuRmMoay5UbSk7KGE9ZS5DYih0aGlzLndkKCkpKXx8KGE9ZS5DYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sU2w6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9aWYoIWEuZW5hYmxlZHx8IWEuZm9yY2VfZGlzYWJsZWQpdHJ5e2E9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGYpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucGF8fHRoaXMuT2J8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSwKdGhpcy5UYigpKX19LEFjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLnBhfWVsc2UgZD10aGlzLnBhO2lmKCEoZC5lbmFibGVkJiZkLnNlcnZlciYmZC5hbGlhcyYmZC5jb25maWcpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChjKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5mYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5nYT1kLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuZ2EubGVuZ3RoO2IrKyl0aGlzLmdhW2JdPXRoaXMuZ2FbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLkYoIndlYi5kZSIpfHxlLkYoImdteC5uZXQiKXx8ZS5GKCJnbXguYXQiKXx8ZS5GKCJnbXguY2giKXx8CmUuRigiMXVuZDEuZGUiKSkmJiF0aGlzLkxjKCkpZm9yKGI9MDtiPHRoaXMuZ2EubGVuZ3RoO2IrKyl0aGlzLmdhW2JdPXRoaXMuZ2FbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5PYj1kLmNvbmZpZ3x8IiI7dGhpcy5BYT1kLmFsaWFzfHxudWxsO3RoaXMuSmU9ZC5hZHBhdGh8fCIiO3RoaXMucmY9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuZ2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5PYiYmdGhpcy5BYSYmdGhpcy5nYS5sZW5ndGg/dGhpcy5NYyghMSk6KHRoaXMuSGE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy5UYigpKX0sTWM6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307aWYoYil7dmFyIGE9bmV3IEEodGhpcy5QYygpKSxkPXRoaXMudGEodGhpcy5PYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjsKYS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2EubWV0aG9kPSJQT1NUIn1lbHNlIGE9bmV3IEEodGhpcy5PYit0aGlzLm9lKCJjdXN0b21lciIpKTt0aGlzLklhKGEsdGhpcy5hby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy50ZigiY3VzdG9tZXIiKTtiP3RoaXMuVGo/dGhpcy5kYSgibm9TVk1Db25maWciKToodGhpcy5Uaj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuTWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGFvOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPWIucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtpZighdGhpcy5pYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuaWM9ITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpKXRyeXtkPQoobmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuVmM9dGhpcy5mYihkLnN0cmljdCk7dGhpcy5TZD10aGlzLmZiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkZnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy4kYT10aGlzLmZiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5mYihkLmVuYWJsZWQpO3RoaXMuUGI9ZC50ZXN0aGlkZXx8IiI7dGhpcy5SYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLlVjPWQudGVzdGFkdGFnc3hocnx8W107dGhpcy5vYz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy4kYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmpiPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLlpiPWQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5mZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5UZT0KZC5qc3BvcHVwc3x8ITE7dGhpcy50Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5WYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuVmI7dGhpcy56Zj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLmpkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5OZj1kLnZtYXBzfHwiIjt0aGlzLnpjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5PYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmllPWQuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLk9kPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMuaWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLmljPSEwLHRoaXMuTWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMucG8oKSYmKHRoaXMuUGJ8fHRoaXMuUmJ8fHRoaXMuUWJ8fHRoaXMuVWMpP3RoaXMubmY/KHRoaXMuSGE9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy50ZSgpLHRoaXMuVGIoKSk6CnRoaXMuZm8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5GZigpKX19LGZvOmZ1bmN0aW9uKCl7dGhpcy5lbygpO3RoaXMuaG8oKX0saG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksCkY9ZS5YKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihGLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2IoRikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwplLnpiKGIoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYil7fWlmKDMhPWQpe3ZhciBjPWUucWQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlNhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGEsITApO3JldHVybn10aGlzLmRhKCJjc3BfIithKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxGZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpO3RoaXMuVGIoKX0sTmQ6ZnVuY3Rpb24oYil7dGhpcy5zYz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuSGE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKGIpKSx0aGlzLlRiKCksdGhpcy50ZSgpKX0sZW86ZnVuY3Rpb24oKXtpZih0aGlzLlBiKXt2YXIgYj1lLnFkKCk7aWYoKGIuaXNDaHJvbWV8fGIuaXNGaXJlZm94KSYmdGhpcy5tbSgpKXRoaXMuTmQodGhpcy5XYiwibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXtiPSExO3RyeXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuUGIpO2Euc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5QYik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpOwpiPWR9Y2F0Y2goZil7fWI/dGhpcy5OZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5jaSgpfX1lbHNlIHRoaXMuY2koKX0sYmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoKSk7dGhpcy5rbyhmLDA8ZC5sZW5ndGg/Yi5iaW5kKHRoaXMpOnRoaXMuWmguYmluZCh0aGlzKSxhLmJpbmQodGhpcykpfWZ1bmN0aW9uIGEoKXt0aGlzLk5kKHRoaXMuV2IsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5RYj10aGlzLlVjKSYmdGhpcy5RYi5sZW5ndGgpe3ZhciBkPXRoaXMuUWIuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5aaCgpfSxrbzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwKITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSWEobmV3IEEoYiksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LGNpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYigpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkxiKCkpO3RoaXMubG8oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLmJpLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1mdW5jdGlvbiBhKCl7dGhpcy5OZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlJiJiZ0aGlzLlJiLmxlbmd0aCl7dmFyIGQ9dGhpcy5SYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLmJpKCl9LGxvOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwKITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihhLGQpe2Q9PWImJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWI7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sWmg6ZnVuY3Rpb24oKXtpZih0aGlzLm9jKXRyeXtlLnlkKHRoaXMub2MsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO3RoaXMuQWI9IXRoaXMuZmIoYi5jYyk7dGhpcy5GZigpfS5iaW5kKHRoaXMpLHRoaXMuJGguYmluZCh0aGlzKSwhMCl9Y2F0Y2goYil7dGhpcy4kaCgpfWVsc2UgdGhpcy5GZigpfSwKJGg6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKTt0aGlzLlRiKCk7dGhpcy50ZSgpfSxtbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChiKXtyZXR1cm4iZmFpbCJ9fSxUYjpmdW5jdGlvbigpe3ZhciBiPSIwIixhPSIwIjt0cnl7ZS5TYSgpJiYoYj0iMSIpfWNhdGNoKGQpe2I9Mn10aGlzLnNjJiYoYT0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYisiIithLCEwKTt0aGlzLm9jJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuQWIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlpkKSk7dGhpcy5VZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlVkJiZ0aGlzLlVkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkFifSl9LApRazpmdW5jdGlvbigpe2lmKHRoaXMuU2QmJnRoaXMuVmwoKSl7dmFyIGI9dGhpcy5EbCgpO2ImJmIuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYi5qb2luKCJfIiksITApfX0sZ2k6ZnVuY3Rpb24oYil7Ynx8KGI9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGIpdHJ5e2I9Yi50b1N0cmluZygpfWNhdGNoKGEpe2I9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9Yj1iLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITApfSxJYTpmdW5jdGlvbihiLGEsZCxmLGMsaCl7dGhpcy52ZHx8KHRoaXMudmQ9MCk7dGhpcy52ZCsrO3RoaXMudmQ+dGhpcy5laCYmIXRoaXMuZmgmJih0aGlzLmZoPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5laCwhMCkpO2I9bmV3IExhKGIsYSxkKTtmJiYoYi51aT0hMCk7YyYmZS5rbSgpJiYoYi5QZz0hMCk7aCYmKGIuWWg9ITApO3JldHVybiBiLmxvYWQoKX0sTms6ZnVuY3Rpb24oKXtlLlNhKCl8fAplLmFiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihiKXt2YXIgYT1udWxsLGQ9bnVsbCxmPSIiO3RyeXsoYT1iLnJlc3BvbnNlWE1MKXx8KGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYi5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLmRhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihiPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGJbMF0mJihiPWJbMF0pLGIpe2Y9YiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkxjKCl8fChiPXRoaXMudGEoZiksZj1iLnByb3RvY29sKyI6Ly8iK2IuaG9zdCk7dmFyIGU9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5kYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2UuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5kYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sY286ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuTmZ9LE9rOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKITApO3ZhciBiPXRoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2IuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYix0aGlzLkVvLmJpbmQodGhpcyksdGhpcy5Eby5iaW5kKHRoaXMpKX0sRW86ZnVuY3Rpb24oYil7dmFyIGE9bnVsbCxkPW51bGw7dHJ5eyhhPWIucmVzcG9uc2VYTUwpfHwoYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhiLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1kfHx0aGlzLm1sKCl9LERvOmZ1bmN0aW9uKCl7fSxtbDpmdW5jdGlvbigpe2UuRmMoay5sbCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5kYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sCnRlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMudGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy50Yi5sZW5ndGg7YisrKXt2YXIgYT10aGlzLnRiW2JdOyJyZXF1ZXN0Ij09YS50eXBlJiZlLmFiKGEudXJsLGEuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09YS50eXBlKXt2YXIgZD1uZXcgSDt3aW5kb3dbZC5mYSgpXT10aGlzO2UuYWIoYS51cmwsYS5hbGlhcyxudWxsLGZ1bmN0aW9uKGIpe2lmKGIucmVzcG9uc2VUZXh0KXRyeXtldmFsKGIucmVzcG9uc2VUZXh0KX1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0scG86ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5PZH0sTGI6ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYnx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sWDpmdW5jdGlvbihiKXtiPWJ8fDEwO2Zvcih2YXIgYT0KIiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9LHpiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGYsYyxlLGgsayxsPTA7bDxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQobCsrKSxmPWIuY2hhckNvZGVBdChsKyspLGM9Yi5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxoPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9oPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBhfSx0YTpmdW5jdGlvbihhKXt2YXIgZz0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxjPTE0O2MtLTspZFtnW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZ1sxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSxUaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBnKGEpe3ZhciBiPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9YT4+PjQqZCYxNSxiKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gYn1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixyPTI3MTczMzg3OCx0PTMyODUzNzc1MjAsbixxLHUsdix3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGM9MDtjPG4tMztjKz00KWU9YS5jaGFyQ29kZUF0KGMpPDwyNHxhLmNoYXJDb2RlQXQoYysxKTw8MTZ8YS5jaGFyQ29kZUF0KGMrMik8PDh8YS5jaGFyQ29kZUF0KGMrMykseC5wdXNoKGUpOwpzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihjPTA7MTY+YztjKyspaFtjXT14W2ErY107Zm9yKGM9MTY7Nzk+PWM7YysrKWhbY109ZChoW2MtM11eaFtjLThdXmhbYy0xNF1eaFtjLTE2XSwxKTtlPWs7bj1sO3E9bTt1PXI7dj10O2ZvcihjPTA7MTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8fm4mdSkrditoW2NdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8biZ1fHEmdSkrditoW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YraFtjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1O3Q9dCt2JjQyOTQ5NjcyOTV9cmV0dXJuKGcoaykrZyhsKStnKG0pK2cocikrZyh0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE5hPWMuZ2p8fE5hLG09bmV3IE5hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMuYXA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBPYT1jLmFwfHxPYTtuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZyxkKXt0aGlzLmE9YTthLmMuUj90aGlzLmJiPWEuYy5SKCk6dGhpcy5iYj0iIjthLmMubWgmJmEuYy5taCh7cGF1c2U6dGhpcy5CZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLlFoLmJpbmQodGhpcyksbXV0ZTp0aGlzLmFmLmJpbmQodGhpcyksdW5tdXRlOnRoaXMud28uYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYS5rYjt0aGlzLnBsYXllcj10aGlzLmEuYzt0aGlzLmVjPXRoaXMuZ2Q9ITE7dGhpcy5Daz0xRTM7dGhpcy5yYT1udWxsO3RoaXMuQj1nO3RoaXMuZ2I9e307dGhpcy52aWRlbz17fTt0aGlzLktkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLkdrPWUuWCgxMCk7CnRoaXMuQmY9MDt0aGlzLmRkPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuZGQ9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMuZGQ9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQWs9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5lZj10aGlzLkpkPSExO3RoaXMudmg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYj17fTt0aGlzLm5lPSExO3RoaXMuamk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5qYz0hMTt0aGlzLiRrPWUuWCgxMCk7dGhpcy5LYj1lLlgoMTApO3RoaXMuSWI9ZS5YKDEwKTt0aGlzLlVoPWUuWCgxMCk7dGhpcy5jb25mPXt9O3RoaXMuVmQ9CnRoaXMuVWI9dGhpcy52ZT10aGlzLm5kPXRoaXMuTGQ9dGhpcy51Yj10aGlzLnFjPXRoaXMuRGg9dGhpcy5zZD10aGlzLnFvPXRoaXMueGI9dGhpcy5KYj0hMTt0aGlzLnZjPVtdO3RoaXMubGM9e307dGhpcy5SbT0yMDA7dGhpcy5RZj10aGlzLldjPXRoaXMucmU9dGhpcy5QZj10aGlzLm1mPSExO3RoaXMuY2Y9e319Yy5haj1hO2EucHJvdG90eXBlPXt4bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGc9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoZz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBnfSxoaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5HYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLldhKCksITApO3RoaXMuVW4oKTtlLm8oay5yayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxXZTpmdW5jdGlvbihhLGcsZCxjKXt0aGlzLnhiPQpkO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkIuUyl0aGlzLkJmKyssZS5wYigibmV3U21hbGxBZElkIiksdGhpcy5CLlFrKCksYz1tLmdldENvbmZpZygpLGUueGUmJih0aGlzLkIueW4oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQi5IYSYmdGhpcy5CLmlzRW5hYmxlZD8odGhpcy5oaSgpLG5ldyBSKHRoaXMsYSx0aGlzLnZoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpnLGJpdHJhdGU6Yy5PYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQi5WYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpnPyh0aGlzLmhpKCksCm5ldyBSKHRoaXMsYSx0aGlzLnZoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5CLlZiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5PYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUGEoKTtlbHNle3ZhciBrPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2suV2UoYSxnLGQpfSw1MCl9fSxoZjpmdW5jdGlvbihhKXthLllhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuVmQ9dGhpcy5VYj10aGlzLnNkPSExO3RoaXMuYj1hO3RoaXMuTm4odGhpcy5iKTt0aGlzLmFoKGEpO3RoaXMudmM9dGhpcy5SZyhhKTt0aGlzLlZrKCl9LGFoOmZ1bmN0aW9uKGIpe2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mCmEmJih0aGlzLktkPXRoaXMuT2woYikpLHRoaXMuYWgoYi5wYXJlbnQpKX0sUmc6ZnVuY3Rpb24oYil7dmFyIGM9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoYz10aGlzLlJnKGIucGFyZW50KSksYy5wdXNoKHRoaXMueGwoYikpKTtyZXR1cm4gY30seGw6ZnVuY3Rpb24oYSl7dmFyIGM9IiIsZD1bXTtpZihhJiZhLkomJmEuSi5nZXRBdHRyaWJ1dGUpe2M9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKylkLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpjLGNyZWF0aXZlSUQ6ZH19LE9sOmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGQ9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5KKXtjPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpOwpmPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkouZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLkouZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLkouZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKGs9MDtrPGMubGVuZ3RoO2srKylkLnB1c2goYS5sYihjW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmh9fSxxYTpmdW5jdGlvbihhKXthLllhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGM9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJgooYz1hLmVycm9yLmRldGFpbC5jb2RlKSxhLnBkJiZhLnBkLmVycm9yJiZhLnBkLmVycm9yLmNvZGUmJihjPWEucGQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5ZYy5jb2RlOmM9PUQuY2UuY29kZT9lLm8oay5abyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpOihlLlhlKCksYz09RC5VZi5jb2RlJiZlLm8oay5MbSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKTtlLm8oay5rbCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVm4oKTt0aGlzLlVhKCJlbXB0eSIpO3RoaXMuQi5BYiYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkFiLCEwKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay5Gbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3LlZmLmNvZGU6ZS5vKGsuJG8sCnRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LmVlLmNvZGU6ZS5vKGsuYnAsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJ4bWxwYXJzZSIpO2JyZWFrO2Nhc2Ugdy4kZC5jb2RlOmUubyhrLk1tLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgibm9tZWRpYSIpO2JyZWFrO2Nhc2Ugdy5YZC5jb2RlOmUubyhrLkJvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdy5SZi5jb2RlOmUubyhrLkNvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuVWEoInVua25vd24iKX10aGlzLmZjKGEpO3RoaXMuUGEoKX0sZmM6ZnVuY3Rpb24oYSl7dmFyIGM9CjkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihjPWEuZXJyb3IuY29kZSw5MDE8YyYmKGM9OTAwKSk7Zm9yKGM9eyJbRVJST1JDT0RFXSI6Y307YS5NYS5sZW5ndGg7KXRyeXt2YXIgZD1hLk1hLnBvcCgpO3RoaXMuVmUoZC51cmwsZC50eXBlLGMpfWNhdGNoKGYpe319LE5uOmZ1bmN0aW9uKGEpe3RoaXMudmU9ITE7dGhpcy5nYj10aGlzLmEuSTt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLnhmKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dmFyIGM9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYz10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuZ2IuekluZGV4PWM7Yz10aGlzLmEuQTt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksZj0iIjtkJiZkLmVudnZhcnMmJihmPWQuZW52dmFycygpKTtmLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLmdldEVudmlyb25tZW50VmFyaWFibGVzJiYoZj1kLmdldEVudmlyb25tZW50VmFyaWFibGVzKCkpOwpmLnZpZGVvU2xvdCYmKGM9Zi52aWRlb1Nsb3QsdGhpcy5tZj0hMCl9Y2F0Y2goaCl7fWMuY3E9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGMuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihjLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZjLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLkFrJiZ0aGlzLnBsYXllci5DZSgpJiYoYy52b2x1bWU9dGhpcy5wbGF5ZXIuQ2UoKS8xMDApO2Zvcig7Yy5maXJzdENoaWxkOyljLnJlbW92ZUNoaWxkKGMuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPAphLk0ubGVuZ3RoO2QrKyljLmNhblBsYXlUeXBlKGEuTVtkXS50eXBlKSYmdGhpcy52ayhjLGEuTVtkXS51cmwrIiIsYS5NW2RdLnR5cGUpO3RoaXMubWYmJmMubG9hZCgpO2lmKHRoaXMuZGkoYykpe3RoaXMuVmgoInNldHVwIix0aGlzLldhKCkpO3RoaXMueWsoYyk7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT10aGlzLmdiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLm1mP3RoaXMudmlkZW89Yzp0aGlzLnZpZGVvPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyl9Y2F0Y2gobCl7dGhpcy52aWRlbz1jfX1lbHNlIHRoaXMuYi5XaygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/CmEuc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLmdiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChjKSx0aGlzLkxuKCkpOnRoaXMuYi5vcmlnaW4uSGcody4kZCl9LExuOmZ1bmN0aW9uKCl7dGhpcy5QZj0hMDt0aGlzLnViPXRoaXMucWM9ITE7dGhpcy5hLmMuc2EmJnRoaXMuYS5jLnNhKCkmJihlLm8oay55Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMudWI9ITApO2UudWUoKTt0aGlzLmImJnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4ubWEmJmUuemsodGhpcy5iLm9yaWdpbi5tYSk7dGhpcy5WaCgic2V0dXAiLHRoaXMuV2EoKSk7dmFyIGE9dGhpcy5hLkE7dGhpcy5hLkE9Qi5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5BLGEpO3RoaXMuYS5FaCgpO3RoaXMuYS55ZigpO2ZvcihhPQp0aGlzLmEuSTthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5hLnlmKCk7dGhpcy5nYj10aGlzLmEuSTt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLnhmKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dGhpcy5yYT10aGlzLmEuSTt0aGlzLm5pKCJ2cGFpZCIpO2lmKHRoaXMudWIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5OYigibXV0ZWQiLCJjb250ZW50Iik7ZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX10aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsCiJubyIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5hLkkuYXBwZW5kQ2hpbGQodGhpcy5DKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmUueGYodGhpcy5DLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5DLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLlJsKCksYz10aGlzLmIudS5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fApiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsCiJjb25maWciLGgpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLm1nKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5CKTt0aGlzLkMuc3JjPWE7ZS5wZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMud2EmJiF0aGlzLkxkJiZ0aGlzLmEuYy53YSgpJiZlLm8oay5CYywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEuaGMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMudmM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5ObyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLk9vKCksdGhpcy5hLmhjKCEwKSwhdGhpcy5VYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5VYj17ZWw6dGhpcy5DLApjYjpmdW5jdGlvbigpe3RoaXMuVmQ9ITA7ZS5vKGsucmksdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuUGUodGhpcy5VYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmhjKCEwKSx0aGlzLlNvKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5XbygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5WbygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlhvKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlRvKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPQphLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5kYyk7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLm8oay54Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkIuemN8fHRoaXMuV2MpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goYyl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuUm8oKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUubyhrLmxlLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuUG8oKTsKIkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5XYyYmKHRoaXMuUWY9ITEsdGhpcy5uYygpKSx0aGlzLlFvKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMudWI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLk5iKCJtdXRlZCIsInVzZXIiKSxlLm8oay56ZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKToodGhpcy51Yj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTmIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSGYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksZS5vKGsubGUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLAp0aGlzLnMoKSkpfX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5QYSgpfS5iaW5kKHRoaXMpKTtlLnBlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLmpnKGZ1bmN0aW9uKGEpe2UuaWEodGhpcy5DLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sUG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UubyhrLmplLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnFjPSEwfSxRbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UubyhrLmJkLHRoaXMuYi51LAp0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMucWM9ITF9LFNvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS5vKGsuZ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sUm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuZmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sT286ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5XaCgpO2UubyhrLmJnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlZhKCJzdGFydCIpO2UubyhrLmJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFVvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuc2Q9ITA7dGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpO2UubyhrLlpmLAp0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxWbzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5WYSgibWlkcG9pbnQiKTtlLm8oay5kZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxYbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIik7ZS5vKGsuaGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sVG86ZnVuY3Rpb24oKXt0aGlzLktmKCk7dGhpcy5WYSgiY29tcGxldGUiKX0sc2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5DJiZ0aGlzLkMucGFyZW50Tm9kZSYmdGhpcy5DLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5VYSgidnBhaWRzdG9wcGVkIik7dmFyIGM9dGhpcy5DLnBhcmVudE5vZGU7dGhpcy5DLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5DKTtjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyk7CmUudWUoKTt0aGlzLkM9ITE7dGhpcy5QYShhKX19LE5vOmZ1bmN0aW9uKGEpe3ZhciBjPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWMmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGM9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGMubWF0Y2goZCkpO3RoaXMuVWEoInZwYWlkZXJyb3IiKTtlLm8oay5Zbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuc2koITApfSx2azpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkhhJiZiLmlzRW5hYmxlZCYmIWIuTGMoKSl7dmFyIGM9Yi50YShhKTtyZXR1cm4gYy5wcm90b2NvbCsiOi8vIitjLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9ZChjLHRoaXMuQik7Zi5vbmVycm9yPXRoaXMuS28uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmQoYyx0aGlzLkIpKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LHlrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLm9pLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnBpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuS2YuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5MZi5iaW5kKHRoaXMpKX0sRmQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMub2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5NZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuS2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5MZi5iaW5kKHRoaXMpKX0sb2k6ZnVuY3Rpb24oYSl7dGhpcy5lY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVjfHx0aGlzLk1mKGEpfS5iaW5kKHRoaXMpLHRoaXMuQ2spKX0sTWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZ2QmJnRoaXMuZGkodGhpcy52aWRlbykmJiF0aGlzLkpiJiYhdGhpcy5lYyl7dGhpcy5nZD0hMDt0cnl7aWYoIWUuU2EoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuSmJ8fCh0aGlzLkpiPSEwLHRoaXMuRmQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5XYSgpLCEwKSx0aGlzLkIuRmd8fHRoaXMuQi5kYSgidmlkZW8tbm9vcCIpKTt0aGlzLlBhKCk7cmV0dXJufX1jYXRjaChjKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5XYSgpLCEwKX10aGlzLkhvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEueWYoKTt0aGlzLkdvKCk7dGhpcy5uaSgpO3RoaXMubmcoKTt0aGlzLmEuRWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuQ2YoKX19LENmOmZ1bmN0aW9uKCl7dGhpcy5uZHx8dGhpcy4kZigpfSwkZjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnZpZGVvLnBsYXkoKTtpZihjJiZjWyJjYXRjaCJdKWNbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLm5kfHwoYT90aGlzLlBhKCk6KHRoaXMuYWYoITApLHRoaXMuJGYoITApKSl9LmJpbmQodGhpcykpO2JhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5tYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5tYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5tYy5iaW5kKHRoaXMpKSk6ST1mdW5jdGlvbigpe3RoaXMubmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNmKCkpfS5iaW5kKHRoaXMpO3RoaXMuRWUoKS5TaCh0aGlzKX0sS2Y6ZnVuY3Rpb24oKXt0aGlzLkIuJGEmJiF0aGlzLkpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApLHRoaXMuVmEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS5vKGsucGssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlBhKCl9LHNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxkPSExLGY9MDtmPGEubGVuZ3RoO2YrKylkPWUuV2coYVtmXSksYy5wdXNoKGQpO2E9e2hhc2hlczpjfTthPWsuUmEoYSx0aGlzLnMoKSk7ZS5TbihhKX0sUGE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuV2QmJnRoaXMuc2sodGhpcy5iLldkKTsKaWYoIXRoaXMudmUpaWYodGhpcy52ZT0hMCx0aGlzLlZkfHwoZS5vKGsuT20sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmIud2J8fHRoaXMuYi50Yyl7ZS5wYigibmV3U21hbGxBZElkIik7dGhpcy5CZisrO3RoaXMuZWM9dGhpcy5nZD0hMTt0cnl7dGhpcy5GZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLmdiLnJlbW92ZUNoaWxkKHRoaXMucmEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMuSmQ9ITE7dHJ5e3RoaXMuYS5saSgpfWNhdGNoKGgpe310aGlzLkxkPSEwO3RoaXMuYS5JZSgpO3RoaXMuamM9ITE7dGhpcy5FZSgpLk9oKCk7dGhpcy5iLndiJiZ0aGlzLmIub3JpZ2luLmJmKCk7dGhpcy5iLnRjJiYoYT90aGlzLmIub3JpZ2luLnloKCk6dGhpcy53ZSgpKX1lbHNlIHRoaXMud2UoKX0sCktvOmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRmQodGhpcy52aWRlbyksdGhpcy5MZihhKSl9LExmOmZ1bmN0aW9uKGEpe3RoaXMuZWM9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5CLk5rKCk7dGhpcy5iLm9yaWdpbi5IZyh3LiRkKX0scGk6ZnVuY3Rpb24oKXtpZih0aGlzLnFvKXRoaXMuUGEoKTtlbHNle3RoaXMuamM9ITA7dGhpcy5hLmMud2EmJiF0aGlzLkxkJiZ0aGlzLmEuYy53YSgpJiZlLm8oay5CYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7CnRoaXMudW8oYSk7aWYoIXRoaXMuVWIpe3ZhciBjPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5VYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuVmQ9ITA7ZS5vKGsucmksdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpjLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2UuUGUodGhpcy5VYil9ZD0iIjt0aGlzLmIuQWYmJihjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVWgpKSYmKGQ9dGhpcy5iLkFmLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsCmQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5KZHx8KHRoaXMuSmQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuZmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLmIud2I/KHRoaXMuZWM9dGhpcy5nZD0hMSx0aGlzLkZkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnJhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSmQ9ITEsdGhpcy5hLmxpKCksdGhpcy5iLm9yaWdpbi5iZigpKTp0aGlzLlBhKCl9LmJpbmQodGhpcykpKSksYy5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLmRkLnJlcGxhY2UoIlt0aW1lXSIsZS5RZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLm5lPSEwOwp0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0saWk6ZnVuY3Rpb24oKXt0aGlzLkRofHwodGhpcy5EaD0hMCx0aGlzLnNkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sdW86ZnVuY3Rpb24oYSl7ZS5vKGsubGUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTthPT10aGlzLmppfHx0aGlzLkpifHwoMD09YSYmKHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkFiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuaWkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmlpKCl9LmJpbmQodGhpcykpLHRoaXMuSmJ8fAp0aGlzLldoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkIuJGEmJnRoaXMuVmEoInN0YXJ0IiksZS5vKGsuYmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSxlLm8oay5nZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi80KSYmKHRoaXMuQi4kYSYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuVmEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLnNkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS5vKGsuWmYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSwKZS5vKGsuZGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYi5kdXJhdGlvbi80KSYmKHRoaXMuQi4kYSYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuVmEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUubyhrLmhnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLHRoaXMuamk9YSl9LFZoOmZ1bmN0aW9uKGEsYyl7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGMsITApfSxVbjpmdW5jdGlvbigpe2UuUWQoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sV2g6ZnVuY3Rpb24oKXtlLlFkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFZuOmZ1bmN0aW9uKCl7ZS5RZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrCnRoaXMuV2EoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxVYTpmdW5jdGlvbihhKXtlLlFkKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFZhOmZ1bmN0aW9uKGEpeyh0aGlzLlBmfHx0aGlzLkIuJGEpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5XYSgpLCEwKX0sTmI6ZnVuY3Rpb24oYSxjKXt0aGlzLkIuJGEmJmUudHJhY2soInN0YXRzX2hkXyIrYSxjLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxjKXtpZighdGhpcy5KYil7dGhpcy5jZiYmdGhpcy5jZi50cmFjayYmdGhpcy5jZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmUueGUmJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPQohMH12YXIgZD1bXTt0cnl7ZD10aGlzLlBsKHRoaXMuYi5NYSxhKX1jYXRjaChmKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgaD1kLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmKHRoaXMucmU9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5LZC5pbXByZXNzaW9ucyYmZS5pbShoLnVybCx0aGlzLktkLmltcHJlc3Npb25zKT90aGlzLlZlKGgudXJsLGgudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLm8oay5xayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCkse2FkSWQ6dGhpcy5LZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5zKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuVmUoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWMpdHJ5e3RoaXMuYi5NYT10aGlzLmNsKHRoaXMuYi5NYSxhKX1jYXRjaChtKXt9fX0sV2E6ZnVuY3Rpb24oKXt2YXIgYT1lLlNhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLApjPSIiO3RoaXMuUGYmJihjPSJfdnBhaWQiKTt0aGlzLldjJiYoYz0iX3dlbGVjdCIpO3JldHVybiBhK2N9LFZlOmZ1bmN0aW9uKGEsYyxkLGYsZSl7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGM9dGhpcy5CLnZhKGEpLGQmJmMudWsoZCksZnx8KGY9dGhpcy5FZyksZXx8KGU9dGhpcy5FZyksdGhpcy53ayhhKSx0aGlzLkIuSWEoYyxmdW5jdGlvbigpe3RoaXMuTmgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5OaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sd2s6ZnVuY3Rpb24oYSl7dGhpcy5sY1thXT0ib3BlbiJ9LE5oOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09ImNsb3NlZCJ9LFZrOmZ1bmN0aW9uKCl7dGhpcy5sYz17fX0sWG46ZnVuY3Rpb24oKXt2YXIgYT0wLGM7Zm9yKGMgaW4gdGhpcy5sYyl0aGlzLmxjLmhhc093blByb3BlcnR5KGMpJiYib3BlbiI9PXRoaXMubGNbY10mJmErKztyZXR1cm4gYX0sUGw6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09CmN9KX0sY2w6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWN9KX0sSG86ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLklvLmJpbmQodGhpcykpfSxJbzpmdW5jdGlvbigpe2UuU2EoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMubmMoKTp0aGlzLmIuZGMmJihlLm8oay54Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkIuemN8fHRoaXMuV2MpYT0iX2JsYW5rIjt0cnl7dmFyIGM9d2luZG93Lm9wZW4oIiIsYSk7Yy5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2MuZG9jdW1lbnQubG9jYXRpb24uaHJlZj0KdGhpcy5iLmRjfWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYi5kYyxhKX19LmJpbmQodGhpcyksNTAwKSl9LEdvOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0KImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmRkLnJlcGxhY2UoIlt0aW1lXSIsZS5RZygwKSk7dmFyIGM9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5CLmpkJiYoYz10aGlzLkIuamQpO2MmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRGIuYmluZCh0aGlzKSwxRTMqYyk7dGhpcy5jYXB0aW9uPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSl9fSxEYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5CLmpkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxIZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5CLmpkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sbmk6ZnVuY3Rpb24oYSl7aWYoIWUuRGYodGhpcy5jb250cm9scykpe3ZhciBjPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy4kazt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5IZCgpfS5iaW5kKHRoaXMpKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5LYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmZpLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5laS5iaW5kKHRoaXMpKSxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmVpLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5IZCgpfS5iaW5kKHRoaXMpKTsKZi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkViKCk7dGhpcy5EYigpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihoLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGguc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixoLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuSWI7aC5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9oLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnNvLmJpbmQodGhpcykpOmguYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucm8uYmluZCh0aGlzKSk7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSGQoKX0uYmluZCh0aGlzKSk7CmguYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuVWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChmKTt0aGlzLmIuQWYmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChoKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuU2EoKXx8KHRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLkhkKCl9LmJpbmQodGhpcykpLHRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChkKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsCmMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIsYy5zdHlsZS5kaXNwbGF5PSJub25lIixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGQub25lcnJvcj1mdW5jdGlvbigpe3RoaXMueGEmJih0aGlzLnhhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksZC5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApjLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnhhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5hLmpnKGZ1bmN0aW9uKGEpe3RoaXMueGEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoZS5vKGsueWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLmFmKCkpO3RoaXMuRWIoKX19LEViOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sbmM6ZnVuY3Rpb24oKXsiaGlkZGVuIj09dGhpcy5jb250cm9scy5zdHlsZS52aXNpYmlsaXR5fHx0aGlzLnhhJiYiYmxvY2siPT10aGlzLnhhLnN0eWxlLmRpc3BsYXl8fHRoaXMuUWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGVpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5hLkEucGF1c2VkPwoodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5iZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5BLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLm8oay5qZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkViKCksdGhpcy5EYigpKSl9LGZpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5xYz8oZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJwbGF5IiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnFjPSExKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkViKCksdGhpcy5EYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMucWM9ITApfSxCZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYS5BLnBhdXNlZHx8KHRoaXMuYS5BLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLm8oay5qZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sUWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQS5wYXVzZWQmJih0aGlzLmEuQS5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsCiEwKSxlLm8oay5iZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0scm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKTt0aGlzLmEuQS5tdXRlZD8odGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5OYigidW5tdXRlZCIsInVzZXIiKSxlLm8oay5IZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKToodGhpcy5hLkEubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHNvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy51Yj8oZS5pYSh0aGlzLkMsCiJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJtdXRlIiksdGhpcy51Yj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxhZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMuYS5BLm11dGVkfHwodGhpcy5hLkEubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHdvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy5hLkEubXV0ZWQmJih0aGlzLmEuQS5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLAohMCksdGhpcy5OYigidW5tdXRlZCIsImNvbnRlbnQiKSxlLm8oay5IZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sbWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5tYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5tYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMpO3RoaXMubmR8fHRoaXMubmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNmKCkpfSx3ZTpmdW5jdGlvbigpe3RoaXMucm0oKSYmdGhpcy5xbSgpJiYodGhpcy5CLnNjfHwic3BpZWdlbC5kZSI9PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYicHJlcm9sbCI9PWUuR2ImJnRoaXMudm8oKXx8KHRoaXMubmQ9ITAsdGhpcy54YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy54YiksdGhpcy54Yj0hMSksdGhpcy56ZygpKX0scm06ZnVuY3Rpb24oKXt2YXIgYT0KZS5xZCgpO3JldHVybiB0aGlzLkIuVmImJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0scW06ZnVuY3Rpb24oKXt2YXIgYT0hMSxjPW0uZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciIT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcnx8dGhpcy5lZnx8KGE9ITAsYy5hZEZhbGxiYWNrVVJMfHwoYy5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3JldHVybihhfHwhdGhpcy5yZSYmYy5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuZWZ9LEVsOmZ1bmN0aW9uKCl7dmFyIGE9bS5nZXRDb25maWcoKS5hZEZhbGxiYWNrVVJMLGM9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthfHwic3ZtcHJldmlldyIhPWMuYW5jaG9yfHwoYT0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpO3JldHVybiBhfSx2bzpmdW5jdGlvbigpe20uZ2V0Q29uZmlnKCk7CnRoaXMuZWY9dGhpcy5XYz10aGlzLlFmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0Iix0aGlzLldhKCksITApO3RoaXMucmU9ITA7dmFyIGE9dGhpcy5FbCgpLGE9ZS5tZyhhLHRoaXMuQiwhMSx7b25seVVSTDohMH0pO2lmKCFhKXJldHVybiExO3RoaXMuV2UoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KTtyZXR1cm4hMH0semc6ZnVuY3Rpb24oYSl7dGhpcy5YbigpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemcoITApfS5iaW5kKHRoaXMpLHRoaXMuUm0pOih0aGlzLkxkPSEwLHRoaXMuYS5JZSgpLHRoaXMuYS51bigpLHRoaXMuamM9ITEsZS5vKGsuWmssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLkVlKCkuT2goKSl9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmEmJnRoaXMuYS5jJiYoYT10aGlzLmEuYyk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GYSgibWluVmlzIik7CmEmJihlLk9lKHRoaXMudmlkZW8sYSk/dGhpcy5RaCgpOnRoaXMuQmQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5kYyxhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi53Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnZjJiYwPHRoaXMudmMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnZjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LHM6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLkdrKyItIit0aGlzLkJmO3RoaXMuYiYmdGhpcy5iLlhnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPQp0aGlzLmIuWGcoKSk7cmV0dXJuIGF9LEVnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy5hanx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWE9Yy5DbXx8UWE7bmV3IFFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5sYT1udWxsO3RoaXMuVj1bXTt0aGlzLko9bnVsbDt0aGlzLnVjPXRoaXMud2M9ITE7dGhpcy5tYT0iIjt0aGlzLk9mPSExO3RoaXMuaGg9IiI7ZCYmZC5lbXB0eT90aGlzLkFtKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfQp2YXIgYj0wLGcsZD1bXTtjLmFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnFkKCksYjtiPWUudGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEEodGhpcy51cmwpOm0udmEobS5NZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0uYmluZCh0aGlzKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIGUuRigibWFydGhhc3Rld2FydC5jb20iKXx8ZS5GKCJmYW5kb20uY29tIil8fGUuRigiZ2lnYS5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImRlc2lyZWQuZGUiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxnKCkpe3ZhciBoPWUuQmcodGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbX0uYmluZCh0aGlzKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8aC5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIil9LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpJiYwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil9LmJpbmQodGhpcyksbD1mdW5jdGlvbigpe3JldHVybiAwPT09CmguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTtpZihkKCl8fGcoKXx8aygpfHwiYXBwc3BvdCI9PWMpbCgpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0uTWQoaCkpKyImdHlwZT1qcyIsYj1tLnZhKG0uTWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiLGUudHJhY2soInN0YXRzX2hkX2FkeCIsIiIsITApKTpiPW0udmEobS5NZChoKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJgooYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLklhKGIsdGhpcy56bS5iaW5kKHRoaXMpLHRoaXMud20uYmluZCh0aGlzKSl9LFNnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLmxhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5HYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuR2J8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkdifHx0aGlzLm9tKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxtLmNvKCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7CnZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2RbYl09Zy5maXJzdENoaWxkO2MucHVzaChnKX1jYXRjaChoKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LG9tOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sCmM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0sem06ZnVuY3Rpb24oYSl7dGhpcy5jbihhKTt0cnl7dGhpcy5sYT1hLnJlc3BvbnNlWE1MLHRoaXMubGF8fCh0aGlzLmxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuUWEody5lZSkpfXRoaXMuVj0KdGhpcy5TZygpO3RoaXMud2M9dGhpcy5FZigpO3RoaXMudWM9dGhpcy5haSgpO3RoaXMuaGg9YS51cmxDYWxsZWQ7aWYodGhpcy5WLmxlbmd0aCl0aGlzLk9jKCk7ZWxzZXt0aGlzLnFhKHRoaXMuUWEody5ZYyx7ZXJyb3I6dGhpcy5PZj9ELmNlOkQuVGZ9KSk7dHJ5e2UudHJhY2soInN0YXRzX2hkX210eXVybCIsZS5DYih0aGlzLm1hKSwhMCl9Y2F0Y2goYyl7fX19LEFtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuUWEody5lZSkpfXRoaXMuVj10aGlzLlNnKCk7dGhpcy53Yz10aGlzLkVmKCk7dGhpcy51Yz10aGlzLmFpKCk7dGhpcy5WLmxlbmd0aD90aGlzLk9jKCk6dGhpcy5xYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuT2Y/RC5jZTpELlRmfSkpfSx3bTpmdW5jdGlvbigpe3RoaXMucWEodGhpcy5RYSh3LlNmLHtkZXB0aDpifSkpfSwKT2M6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5WLnNoaWZ0KCk7dGhpcy5zbSgpP3RoaXMubW8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5iaCgpLGcse0FkU3lzdGVtOnRoaXMud2woKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5xYSh0aGlzLlFhKHcuVmYpKTooYj0wLHRoaXMuem8oKSYmdGhpcy5oZih0aGlzLmJsKCkpKX0sYmY6ZnVuY3Rpb24oKXt0aGlzLndjPyh0aGlzLndjPTE8dGhpcy5WLmxlbmd0aCx0aGlzLlYubGVuZ3RoJiZ0aGlzLk9jKCkpOnRoaXMucGFyZW50LmJmKCl9LHloOmZ1bmN0aW9uKCl7dGhpcy51Yz8odGhpcy51Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5PYygpKTp0aGlzLnBhcmVudC55aCgpfSx6bzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmpvKCk/dGhpcy5pbygpPyEwOigtMSE9dGhpcy5HYygpP3RoaXMucWEodGhpcy5RYSh3LlhkKSk6dGhpcy5xYSh0aGlzLlFhKHcuUmYpKSwhMSk6KHRoaXMucWEodGhpcy5RYSh3LlljLApELlVmKSksITEpfSxoZjpmdW5jdGlvbihhKXt0aGlzLm1hfHwodGhpcy5tYT0iIik7YS5XZHx8KGEuV2Q9W10pO2EuV2QucHVzaCh0aGlzLmhoKTthLk1hPWEuTWEuY29uY2F0KHRoaXMuWWUoKSk7YS53Yj1hLndiP2Eud2I6dGhpcy53YzthLnRjPWEudGM/YS50Yzp0aGlzLnVjO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLm1hLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5PZzt0aGlzLnBhcmVudC5oZihhKX0sYmw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgUmE7dGhpcy5tYXx8KHRoaXMubWE9IiIpO2EuZHVyYXRpb249dGhpcy5HYygpO2EuTT10aGlzLlpnKCk7YS5kYz10aGlzLnpsKCk7YS5rcT1bXTthLm9yaWdpbj10aGlzO2EudT10aGlzLnZsKCk7YS5BZj10aGlzLk5sKGEuZHVyYXRpb24pO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLm1hLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5PZztyZXR1cm4gYX0scWE6ZnVuY3Rpb24oYSl7dGhpcy5tYXx8Cih0aGlzLm1hPSIiKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5tYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuT2c7aWYoIXRoaXMuSiYmdGhpcy5sYSYmdGhpcy5sYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj10aGlzLmxhO3RyeXtpZih0aGlzLkomJnRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGM9ITE7KGM9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmYy5sZW5ndGgmJmUudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChkKXt9fXRoaXMuSiYmKGEuTWE9YS5lcnJvci5jb2RlIT13LlhkLmNvZGU/YS5NYS5jb25jYXQodGhpcy5BbCgpKTphLk1hLmNvbmNhdCh0aGlzLkpsKCkpKTt0aGlzLlYubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuZmMmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5mYyYmdGhpcy5wYXJlbnQuZmMoYSksYj0wLHRoaXMuT2MoKSk6Cih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucWEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5xYSYmdGhpcy5wYXJlbnQucWEoYSksYj0wKX0sZmM6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuZmMoYSl9LEhnOmZ1bmN0aW9uKGEsYil7dGhpcy5xYSh0aGlzLlFhKGEsYikpfSxRYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBTYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LG1vOmZ1bmN0aW9uKCl7cmV0dXJuIGI8Z30sam86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlpnKCkubGVuZ3RofSxpbzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuR2MoKX0sRWY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlYuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxhaTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuViYmMjw9dGhpcy5WLmxlbmd0aCYmCiF0aGlzLkVmKCkmJihhPSEwKTtyZXR1cm4gYX0sY246ZnVuY3Rpb24oYSl7dGhpcy5tYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLm1hPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMubWE9IlVOS05PV04ifXRyeXt0aGlzLk9mPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5iaCgpLmxlbmd0aH0sYmg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5EZSh0aGlzLkosIlZBU1RBZFRhZ1VSSSIpfSx3bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRlKHRoaXMuSiwiQWRTeXN0ZW0iKX0sWWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMub2goYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMubGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxvaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLm9oKGEucGFyZW50Tm9kZSk6ITF9LEpsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LEFsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx6bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxPYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksRXA6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMubGIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuT2F8fDFFMzt0cnl7dmFyIGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLApiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksYj1nLmNvbmNhdChlKX1jYXRjaChoKXt9cmV0dXJuIGJ9LHZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMudWQoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LEdjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMubGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sTmw6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5SbihkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LERlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5sYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sR2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGxiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMudWQoYSk6IiJ9LHVkOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLkdlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5ha3x8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmxqfHxUYTtuZXcgVGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLk1hPVtdO3RoaXMuTT1bXTt0aGlzLmRjPSIiO3RoaXMudT10aGlzLnRjPXRoaXMud2I9ITE7dGhpcy5LZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuTGU9IiJ9Yy5Kaj1hO2EucHJvdG90eXBlPXtXazpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk0ubGVuZ3RoO2MrKylpZigwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxIbDpmdW5jdGlvbigpe2lmKCF0aGlzLktlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ubGEpe3ZhciBhPXRoaXMub3JpZ2luLmxhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYz0iIixkPTA7ZDxhLmxlbmd0aDtkKyspKGM9YVtkXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1jLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLktlPWFbZF0pfXJldHVybiB0aGlzLktlfSxYZzpmdW5jdGlvbigpe2lmKHRoaXMuTGUpcmV0dXJuIHRoaXMuTGU7dmFyIGE9IiI7KGE9dGhpcy5IbCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuTGU9YX0sUmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk1bY107cmV0dXJuIGF9fX0pKGMpO3ZhciBSYT1jLkpqfHxSYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLkxpfHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHc9e2VlOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLExhOiJYTUxfUEFSU0VfRVJST1IifSxSZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTGE6IkRVUkFUSU9OX0VSUk9SIn0sWWM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLExhOiJFTVBUWV9WQVNUIn0sVmY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCkxhOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxTZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixMYToiTE9BRF9FUlJPUiJ9LCRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixMYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LAplcDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixMYToiTUVESUFGSUxFX0VSUk9SIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTGE6IkRVTU1ZX0FEIn19LEQ9e1RmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTGE6Ik5PX0FEUyJ9LFVmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixMYToiTk9fTUVESUFGSUxFUyJ9LGZwOnt0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLExhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sY2U6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTGE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlvPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIFZhPWMueW98fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5lcnJvcj1hO3RoaXMucGQ9Yzt0aGlzLk1hPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5PaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFNhPWMuT2l8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5OaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdhPWMuTml8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5QaD1hO3RoaXMudmlkZW89Yzt0aGlzLlRkPVtdO3RoaXMuTWg9W107dGhpcy5kZj1bXTt0aGlzLkpvPQoibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSygpfWMuZ3A9YTthLnByb3RvdHlwZT17SzpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5QaC5sZW5ndGg7YSsrKXt2YXIgYz10aGlzLlBoW2FdLGQ9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtoLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaCk7dmFyIGs9aC5jb250ZW50V2luZG93O2suWnA9CntyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLnJuLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmhuLmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1kO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5UZC5wdXNoKHtzcmM6ZCxmcmFtZTpoLFNtOmUsdmVuZG9yOmMuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTA7Yzx0aGlzLmRmLmxlbmd0aDtjKyspe3ZhciBkPXRoaXMuZGZbY107ZC50eXBlPT09YSYmZC5Jayh0aGlzLkJsKGEpKX19LApCbDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntpcTohMCxocTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntWcDoidmlkZW8iLGxxOiJqc0N1c3RvbSIsbXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxucToxLEZwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sClFsOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5UZC5sZW5ndGg7YysrKWlmKHRoaXMuVGRbY10udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5UZFtjXS5TbTtyZXR1cm4iIn0scm46ZnVuY3Rpb24oYSxjKXt0aGlzLk1oLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLlFsKGMpLHZlbmRvcjpjfSk7dGhpcy5UbigpfSxobjpmdW5jdGlvbihhLGMpeyJ2aWRlbyI9PT1hP3RoaXMuSm8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMua2coYSxjKX0uYmluZCh0aGlzKSk6dGhpcy5rZyhhLGMpfSxrZzpmdW5jdGlvbihhLGMpe3RoaXMuZGYucHVzaCh7dHlwZTphLElrOmMsZnE6ITF9KX0sVG46ZnVuY3Rpb24oKXt0aGlzLk1oLm1hcChmdW5jdGlvbihhKXthLmxtfHwoYS5ZcCh7YWRTZXNzaW9uSWQ6ZS5YKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5qcSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLAphLmxtPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy50bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPWMudG18fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5jb25mPWN8fHt9O3RoaXMuYz1hO3RoaXMua2I9YS5UZygpO3RoaXMuST1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkkuaWQ9ZS5YKDEwKTt0aGlzLkE9Qi5wb3AoKTt0aGlzLkF8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5OYT17fTt0aGlzLmxnPSExOwp0aGlzLmFjPVtdfWMuS2k9YTthLnByb3RvdHlwZT17dWw6ZnVuY3Rpb24oYSl7dmFyIGM9e30sZD0hMSxlPTAsYz0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihjPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD0iZml4ZWQiLGU9Yy5sZWZ0LGM9Yy50b3ApO2g9e3g6ZSx5OmN9O2gucG9zaXRpb249ZDtyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy51bChhKTtmb3IodmFyIGM9MCxkPTAsZT0hMSxoPXRoaXMuWmwoYSksaz17fTthOyljKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGQrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7aCYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCwKYys9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsZCs9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpjLHk6ZH07ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LCRuOmZ1bmN0aW9uKCl7dGhpcy5sZz0hMH0sbGk6ZnVuY3Rpb24oKXt0aGlzLkE9Qi5wb3AoKTt0aGlzLkF8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LEVoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7ZS5vKGsuQmMsdGhpcy5jLmwoKSl9LHVuOmZ1bmN0aW9uKCl7dGhpcy5sZ3x8Cih0aGlzLmMucGxheSgpLGUubyhrLm1kLHRoaXMuYy5sKCkpKX0seWY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSS5zdHlsZS56SW5kZXg9YTt0aGlzLkkuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5JLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkkuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkkuc3R5bGUuYm94U2l6aW5nPXRoaXMua2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuSS5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PXRoaXMua2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkEuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmtiKTsKdGhpcy5jLlJjJiZ0aGlzLmMuUmMoKT90aGlzLmMuVGcoKS5hcHBlbmRDaGlsZCh0aGlzLkkpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5JKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhjLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSxabDpmdW5jdGlvbihhKXtmb3IodmFyIGM9d2luZG93LmdldENvbXB1dGVkU3R5bGUsZD0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGMmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7ZD0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gZH0sc2w6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5nZXRQb3NpdGlvbihhKTtjLnBvc2l0aW9uP2MucG9zaXRpb249Yy5wb3NpdGlvbjpjLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yy53aWR0aD1hLm9mZnNldFdpZHRoO2MuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0OwpyZXR1cm4gY30saGM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5zbCh0aGlzLmtiKTtpZihjLnghPXRoaXMuTmEueHx8Yy55IT10aGlzLk5hLnl8fGMucG9zaXRpb24hPXRoaXMuTmEucG9zaXRpb258fGMud2lkdGghPXRoaXMuTmEud2lkdGh8fGMuaGVpZ2h0IT10aGlzLk5hLmhlaWdodHx8YSl7aWYoMDx0aGlzLk5hLndpZHRoJiYwPHRoaXMuTmEuaGVpZ2h0JiYwPT1jLndpZHRoJiYwPT1jLmhlaWdodCl7dGhpcy5JZSgpO3JldHVybn10aGlzLk5hPWM7dGhpcy5jLlJjKCk/KHRoaXMuSS5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSS5zdHlsZS50b3A9IjBweCIpOih0aGlzLkkuc3R5bGUubGVmdD1jLngrInB4Iix0aGlzLkkuc3R5bGUudG9wPWMueSsicHgiKTt0aGlzLkkuc3R5bGUud2lkdGg9Yy53aWR0aCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9Yy5oZWlnaHQrInB4Ijt0aGlzLkkuc3R5bGUucG9zaXRpb249Yy5wb3NpdGlvbjt0aGlzLkEuc3R5bGUud2lkdGg9Yy53aWR0aCsicHgiOwp0aGlzLkEuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuYWMubGVuZ3RoO2ErKyl0aGlzLmFjW2FdKHt3aWR0aDpjLndpZHRoLGhlaWdodDpjLmhlaWdodH0pfWUuRGYodGhpcy5JKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0samc6ZnVuY3Rpb24oYSl7dGhpcy5hY3x8KHRoaXMuYWM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmFjLnB1c2goYSl9LEllOmZ1bmN0aW9uKCl7dGhpcy5JJiZ0aGlzLkkucGFyZW50Tm9kZSYmdGhpcy5JLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSSk7dGhpcy5BJiZ0aGlzLkEucGF1c2UmJnRoaXMuQS5wYXVzZSgpfX19KShjKTtmb3IodmFyIFlhPWMuS2l8fFlhLEI9W10sWmE9MDsxMDA+WmE7WmErKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPQplLlgoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGJhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgJGE9Yy5UaXx8JGE7bmV3ICRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwKKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlQoYik7dGhpcy5HZChhKTt0aGlzLkNnKCl9LEdkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2EoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiYKYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsYz10aGlzLkdhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWMpYS5jb250YWluZXJJZD1jLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTt2YXIgYWI9Yy5Eanx8YWI7KGZ1bmN0aW9uKGMpe2MuQ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWNhKCk7dGhpcy5ZYj10aGlzLllifHwhMTt0aGlzLmNnPXRoaXMuZWc9CnRoaXMubGg9dGhpcy51YT10aGlzLkdmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucWwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLkdmPSEwO3RoaXMubGgmJnRoaXMudWcoKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5GYjthJiZhLmpjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMua2QoKTt0aGlzLmxoPSEwO3RoaXMudWcoKX0uYmluZCh0aGlzKSk7CnRoaXMucGcoKX0sdWc6ZnVuY3Rpb24oKXtpZighdGhpcy5ZYil7dGhpcy5rZCgpO2lmKCF0aGlzLkdmJiYhdGhpcy5rZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuR2YmJnRoaXMuY2cmJiF0aGlzLmVnJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApfX0sa2Q6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LCRnOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGIubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1iLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YSlyZXR1cm4gZC5pbnN0YW5jZX19LHBnOmZ1bmN0aW9uKCl7aWYodGhpcy5rZCgpKXt2YXIgYT0KdGhpcy4kZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLmVnPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMuY2c9YS5DcH10aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZygpfS5iaW5kKHRoaXMpLDEwMCl9LEdwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLlRwKCk6ITF9LEdjOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5HYygpOi0xfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxxbDpmdW5jdGlvbihhLGIpe3RoaXMuWWI9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuWWJ8fDMwMj09dGhpcy5ZYj90aGlzLnVhPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5ZYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksMTAwKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMudWE/KHRoaXMudygpLHRoaXMub2EoKSk6YS5NZSgpPyh0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLktsKGEpPyh0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGJiPWMuQ2p8fGJiOyhmdW5jdGlvbihjKXtjLkVqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbm06ZnVuY3Rpb24oKXt3aW5kb3cuT08uTmoubmsubGs/d2luZG93Lk9PLk5qLm5rLmxrLkFwKGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ubSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBhPWNhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkZlKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPW5ldyBhYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgYmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIGNiPWMuRWp8fGNiLGRiPW5ldyBjYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMub289YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBlYj1jLm9vfHxlYjtuZXcgZWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMTt0aGlzLmRoKCl9LGRoOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTthJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRoKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sS2E6ZnVuY3Rpb24oKXt0aGlzLkhoKCl9LEhoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5VJiYoMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhoKCl9LmJpbmQodGhpcyksMTAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZmI9Yy5GaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuRWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0scmc6ZnVuY3Rpb24oYSl7dmFyIGI9CmEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLm9hKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMub2EoKTp0aGlzLmcoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMucmcoYS5hZEVycm9yRXZlbnRzKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5yZyhhKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGdiPWMuRWl8fGdiOyhmdW5jdGlvbihjKXtjLkdpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sS2g6ZnVuY3Rpb24oYSl7YT1uZXcgZmIoYSk7YS5qYT90aGlzLlAoKTp0aGlzLkwoYSl8fChhLkdkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLk4oYSksKG5ldyBnYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLnJsfHwodGhpcy5ybD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuS2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLktoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7CnRoaXMuUCgpfX0pfSkoYyk7dmFyIGhiPWMuR2l8fGhiLFM9bmV3IGhiKHIpO1MuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5obD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGliPWMuaGx8fGliO25ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLksuYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LFJjOmZ1bmN0aW9uKCl7dmFyIGE9bDtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFQ9Yy5Xanx8VDsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LmNkKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7CnguY2QoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5QbShhKX0uYmluZCh0aGlzKSk7eC5jZCgiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRCgpfS5iaW5kKHRoaXMpKTt4LmNkKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5VbCgpfSxQbTpmdW5jdGlvbihhKXt2YXIgYj0iIixjO2ZvcihjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSl7Yj1pc05hTihhW2NdKT8hMTphW2NdO2lmKDEwMDk9PWFbY118fDEwMDE9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKXt0aGlzLncoKTt0aGlzLm9hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBhW2NdKWlmKGFbY10uaGFzT3duUHJvcGVydHkoZCkmJihiPWlzTmFOKGFbY11bZF0pPyExOmFbY11bZF0sMTAwOT09YVtjXVtkXXx8CjEwMDE9PWFbY11bZF18fDMwMz09YVtjXVtkXXx8NDAzPT1hW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5vYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkQoKX19KX0pKGMpO3ZhciBVPWMuVmp8fFU7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxiLmxlbmd0aDtjKyspYS5wdXNoKGJbY10pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspYS5wdXNoKGJbY10pO3RoaXMuQWQmJihhPWUuZGwoYSx0aGlzLkFkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFQoZCk7aWYoIXRoaXMuTChkKSl7dGhpcy5OKGQpOwp2YXIgZj1uZXcgVShkLHRoaXMuRyk7Zi5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGM9YVtiXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuQWR8fCh0aGlzLkFkPVtdKSx0aGlzLkFkLnB1c2goYVtiXSksZD1uZXcgVChoKSx0aGlzLkwoZCl8fCh0aGlzLk4oZCksZj1uZXcgVShkLHRoaXMuRyksZi5mKCkpfWNhdGNoKGspe319fXRoaXMuUCgpfSxjZDpmdW5jdGlvbihhLGIsYyl7dGhpcy5hYXx8KHRoaXMuYWE9e30pO3RoaXMuYWFbYV18fCh0aGlzLmFhW2FdPXt9KTt0aGlzLmFhW2FdW2JdfHwodGhpcy5hYVthXVtiXT1bXSk7dGhpcy5hYVthXVtiXS5wdXNoKGMpfSxubzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmFhfHx0aGlzLmFhJiYhdGhpcy5hYVtiXSl0aGlzLk5jfHwKKHRoaXMuTmM9W10pLHRoaXMuTmMucHVzaChhKSx0aGlzLnRuKCkmJih0aGlzLnBmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoYz1hLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbYl1bY10mJjA8dGhpcy5hYVtiXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmFhW2JdW2NdLmxlbmd0aDtkKyspdGhpcy5hYVtiXVtjXVtkXShhKX19LFVsOmZ1bmN0aW9uKCl7aWYodGhpcy5OYylmb3IodmFyIGE9MDthPHRoaXMuTmMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5OY1thXSxjPWIuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoZD1iLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbY11bZF0mJjA8dGhpcy5hYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmFhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5hYVtjXVtkXVtlXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT0KYS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ4Lm5vKGEpfX0pfSkoYyk7dmFyIGpiPWMuWGp8fGpiLHg9bmV3IGpiKHIpO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2I9Yy5ibnx8a2I7bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVyhiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0sd2E6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBsYj1jLkJpfHxsYjsoZnVuY3Rpb24oYyl7Yy5DaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKJCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkQoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwphLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbWI9Yy5DaXx8Cm1iOyhmdW5jdGlvbihjKXtjLkRpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbGIoZCk7dGhpcy5MKGgpfHwodGhpcy5OKGgpLChuZXcgbWIoaCx0aGlzLkcpKS5mKCkpfWNhdGNoKGspe319dGhpcy5QKCl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5KYSlpZihiPT10aGlzLkphW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuRGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBwYj1jLk1pfHxwYjtuZXcgcGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLndnPXRoaXMuRWM9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dmFyIGI9dGhpcy5KZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuRWM9Yik7aWYoIXRoaXMud2cmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fAphLnNvdXJjZS5DSE9PU0VSX0FCKSl7dmFyIGM9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixhLnNvdXJjZS5DSE9PU0VSX0FCfHwiIiwhMCk7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixjLCEwKTt0aGlzLndnPSEwfX19Y2F0Y2goaCl7fX0uYmluZCh0aGlzKSk7dGhpcy5WZygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuZ24odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSxWZzpmdW5jdGlvbigpe2lmKHRoaXMuRWMpcmV0dXJuIHRoaXMuRWM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuSmcoYSkpcmV0dXJuIHRoaXMuRWM9CmF9fSxKZzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiZhLnZpZGVvU2xvdCYmKGI9YSk7YSYmYS5oZHZwYWlkJiYoYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sZ246ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5wYXVzZSYmdGhpcy5lYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5yZXN1bWUmJnRoaXMuZWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiYKdGhpcy5lYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5tdXRlJiZ0aGlzLmVhLm11dGUoKX0uYmluZCh0aGlzKSk7YSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEudW5tdXRlJiZ0aGlzLmVhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sbWg6ZnVuY3Rpb24oYSl7dGhpcy5lYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcWI9Yy55anx8cWI7KGZ1bmN0aW9uKGMpe2MueGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLnRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLnRpJiYodGhpcy5nKCksdGhpcy50aT0hMCx0aGlzLmthKCkpOwpiLkdhKCkuYWRkRXZlbnRMaXN0ZW5lcihhLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuVmcoKT90aGlzLkQoKToodGhpcy55ZXx8KHRoaXMueWU9MSksdGhpcy55ZSsrLDEwMDx0aGlzLnllP3RoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgcmI9Yy54anx8cmI7KGZ1bmN0aW9uKGMpe2Muemo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBhPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyBxYihhW2RdKSx0aGlzLkwoYyl8fCh0aGlzLk4oYyksKG5ldyByYihjLHRoaXMuRykpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTsKdmFyIHNiPWMuemp8fHNiLFY9bmV3IHNiKHIpO1YuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5RbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRiPWMuUW18fHRiO25ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmZrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LEthOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5VPygwLHRoaXMuVSkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuZmt8fHViOyhmdW5jdGlvbihjKXtjLmVrPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEljOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSwKYT1hLmdldFJhd1BsYXllcigpO3JldHVybiBhLmltYUFkc0xvYWRlcn0sZW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMub2EoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuZygpO3RoaXMuZ2V0UGxheWVyKCk7CnRoaXMuQmE/dGhpcy5lbih0aGlzLkJhKToodGhpcy5CYT10aGlzLkljKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuRCgpO3JldHVybn1pZighdGhpcy54Yyl7dGhpcy5EKCk7cmV0dXJufWE9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmViLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmViW2JdJiYzMDMhPXRoaXMuZWJbYl0mJjQwMyE9dGhpcy5lYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMub2EoKTtlbHNle3RoaXMuRCgpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMuZWt8fHZiOyhmdW5jdGlvbihjKXtjLmdrPQp0LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLlRhPS0xO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGM9bmV3IHViKGEuaXRlbShiKSk7dGhpcy5MKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGMpLChuZXcgdmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHdiPWMuZ2t8fHdiLHhiPW5ldyB3YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB5Yj1jLmJtfHx5YjtuZXcgeWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Saj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuamY9ITF9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLldtKCl9LmJpbmQodGhpcyksNTAwKX0sV206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5VJiZ0aGlzLlUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksCmI9MDthLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYj1hLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuamYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuamYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXbjpmdW5jdGlvbigpe3RoaXMuamY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciB6Yj1jLlJqfHwKemI7KGZ1bmN0aW9uKGMpe2MuUWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLnBjPTB9LGY6ZnVuY3Rpb24oKXt0aGlzLkVtPTEwO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5wY3x8KHRoaXMucGM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5nKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8Cih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKToodGhpcy5wY3x8dGhpcy5wYysrLHRoaXMucGM8PXRoaXMuRW0/KHRoaXMucGMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAo1MDApKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5XbigpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQWI9Yy5Ranx8QWI7KGZ1bmN0aW9uKGMpe2MuU2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgemIod2luZG93LnBsYXllckFwaSksdGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgQWIoYSwKdGhpcy5HKSkuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgQmI9Yy5Tanx8QmIsQ2I9bmV3IEJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIERiPWMueG98fERiO25ldyBEYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0iIjthLmN1cnJlbnRUaW1lJiYoYj1hLmN1cnJlbnRUaW1lKTtyZXR1cm4gYn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sS2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5VKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEViPWMuUGp8fEViOyhmdW5jdGlvbihjKXtjLk9qPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5HYSgpLGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZztiJiZiLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7YS5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuWGsoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5CYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMudW0oKTp0aGlzLnRnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFnKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5nKCEwKSl9LmJpbmQodGhpcyksCjFFMyl9LFhrOmZ1bmN0aW9uKCl7dGhpcy5hZygpfHx0aGlzLmcoITApfSx1bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQmIoKTshYS5uYSYmYS5WJiZhLnpwJiZhLkJwJiYodGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZygpKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7YS5hZHNMb2FkZXI/YS5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBjO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihjIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2NdKXtjPWFbY107YnJlYWsgYX1jPXZvaWQgMH0xMDA5PT1jfHwzMDM9PWN8fDQwMz09Yz8odGhpcy53KCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZygpfS5iaW5kKHRoaXMpLDEwMCl9LEJiOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2gpZm9yKHZhciBhPQpjLlpjLkJiKCksYj10aGlzLmdldFBsYXllcigpLkdhKCkuaWQsZT0wO2U8YS5sZW5ndGg7ZSsrKWFbZV0uaWQ9PWImJih0aGlzLkNoPWFbZV0pO3JldHVybiB0aGlzLkNofSxVcDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxnOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2E/dGhpcy5CYigpLmFkc0xvYWRlcj90aGlzLkQoITApOnRoaXMuRCgpOnRoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBGYj1jLk9qfHxGYjsoZnVuY3Rpb24oYyl7Yy5aYz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFBrOmZ1bmN0aW9uKGEpe2E9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgRmIoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Yy5aYy5CYigpO2lmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXRoaXMuUGsoYVtiXSk7dGhpcy5QKCl9fSk7Yy5aYy5CYj1mdW5jdGlvbigpe3ZhciBhPVtdO2lmKGwmJmwucGxheWVyYXBpJiYoYT1sLnBsYXllcmFwaSgpKSYmYS5sZW5ndGgpcmV0dXJuIGE7dmFyIGE9W10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSwKYltjXSYmYltjXS5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kJiZhLnB1c2goYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCksYltjXSYmYltjXS5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuZmVybW9kJiZhLnB1c2goYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuZmVybW9kKTtpZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgR2I9Yy5aY3x8R2IsSGI9bmV3IEdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEliPWMuJGl8fEliO25ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnVqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCks6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RSYmKGE9YS5maXJzdENoaWxkKTtpZihhKXt0aGlzLlQoYSk7aWYoYS50YWdOYW1lKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1iP3RoaXMuVyhiKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxTcDpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe2lmKEUpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmIWEucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxSYzpmdW5jdGlvbigpe3JldHVybiEwfSxHYTpmdW5jdGlvbigpe3ZhciBhO0U/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFc9CmMudWp8fFc7KGZ1bmN0aW9uKGMpe2MudGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMua2Y9IiI7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthJiYodGhpcy5rZj1hLmlkKTtFP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYz1hLnBsYXllckNvbnRhaW5lcjtjJiZ0aGlzLmtmJiZjIT10aGlzLmtmfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuRigidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEuJHApLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJgoodGhpcy5tKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFg9Yy50anx8WDsoZnVuY3Rpb24oYyl7Yy52aj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRSlmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBXKGEpLGEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBYKGEsdGhpcy5HKSxhLmYoKSl9ZWxzZSBpZihhPQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYT1uZXcgVyhhKSxhLmphP3RoaXMucGYoKTp0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIEUsSmI9Yy52anx8SmIsS2I9bmV3IEpiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBMYj1jLlVtfHxMYjtuZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5ZaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLApjPWEuR2V0RWwoKSxiJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLlooKSk6dGhpcy5aKCk6dGhpcy5aKCk6dGhpcy5aKCl9LHduOmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LHdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxYcDpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBNYj1jLllpfHxNYjsoZnVuY3Rpb24oYyl7Yy5YaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5xZygpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMua2EoKX0uYmluZCh0aGlzKSl9LHFnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj1hLkdldEFkRXJyb3JzQ2FjaGUoKSxjPTA7YzxiLmxlbmd0aDtjKyspdGhpcy5oYW5kbGVFcnJvcihiW2NdKTthLkNsZWFyQWRFcnJvcnNDYWNoZSgpfSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhKXtpZihudWxsPT0KYSl0aGlzLnFnKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuZygpKX19LGc6ZnVuY3Rpb24oYSl7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIE5iPWMuWGl8fE5iOyhmdW5jdGlvbihjKXtjLlppPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcms7YXx8KGE9d2luZG93LlRPbmxpbmVNZWRpYXBsYXllckZyYW1ld29yayk7aWYoYSYmYS5HZXRBbGxQbGF5ZXJzJiYoYT1hLkdldEFsbFBsYXllcnMoKSkmJjA8YS5sZW5ndGgpZm9yKHZhciBiPQowO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1uZXcgTWIoYVtiXSk7Yy5qYXx8dGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgTmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIE9iPWMuWml8fE9iLFBiPW5ldyBPYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBRYj1jLkltfHxRYjtuZXcgUWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKXtmb3IodmFyIGI9YT1hWzBdO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTsKYnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuWigpfSxSZDpmdW5jdGlvbihhKXt2YXIgYj0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9iPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6e319KTooYj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxiLmluaXRDdXN0b21FdmVudChhLCExLCExLGRhdGEpKTtiJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChiKX0sZm46ZnVuY3Rpb24oKXt0aGlzLlhjPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXtpZihhLmRldGFpbCYmImFkUmVxdWVzdCI9PWEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuWGN8fCh0aGlzLlhjPSEwLHRoaXMuUmQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChiKXt9fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSwKcGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlhjJiYodGhpcy5SZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlhjPSExKSx0aGlzLlJkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LHdhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgUmI9Yy5qa3x8UmI7KGZ1bmN0aW9uKGMpe2MuaWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sTGg6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2E/KGEmJmEuYWRkRXZlbnRMaXN0ZW5lciYmKGEuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLAphLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iYyhhKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKSksYSYmYS5hZGRBZEVycm9yTGlzdGVuZXImJmEuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuYmMoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkxoLmJpbmQodGhpcyksMTApfSxiYzpmdW5jdGlvbihhKXt2YXIgYj17fTthLmdldEVycm9yJiYoYS5nZXRFcnJvcigpLGI9YS5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMub2s9CiEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fDMwMz09Yi5nZXRFcnJvckNvZGUoKXx8NDAzPT1iLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMuZygpKToodGhpcy5va3x8dGhpcy5tKCJub2ZyYW1ld29yayIpLHRoaXMuZygpKX0sWWY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYT0wO2E8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YSsrKXRoaXMuYmMod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFthXSk7dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLllmLmJpbmQodGhpcyksMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuTGgoKTt0aGlzLllmKCk7dGhpcy5qbigpfSxqbjpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmRuP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihhKXt0aGlzLmRuPSEwO2lmKGEmJmEuZGV0YWlsKWZvcih2YXIgYiBpbiBhLmRldGFpbCkiYWRUYWdVcmwiPT1iJiYoYS5kZXRhaWxbYl18fHRoaXMuYmMoYSkpfX0pfSkoYyk7dmFyIFNiPWMuaWt8fFNiOyhmdW5jdGlvbihjKXtjLmtrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGE9bmV3IFJiKHdpbmRvdy5ETDhfR0xPQkFMUyk7YS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGEuZm4oKSxhPW5ldyBTYihhLHRoaXMuRyksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLAphLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgVGI9Yy5ra3x8VGIsVWI9bmV3IFRiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuamw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYj1jLmpsfHxWYjtuZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5aaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLkZoPSExO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb01vZGVsKXt2YXIgYj1hLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYil7dGhpcy5UKGIpO3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVyhjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihhKXt0aGlzLkptPWF9LmJpbmQodGhpcykpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX1lbHNlIHRoaXMuWigpfSx3bjpmdW5jdGlvbigpe30sc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MTtyZXR1cm4gYS52aWRlb01vZGVsJiZhLnZpZGVvTW9kZWwuZ2V0JiYoYj1hLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGIpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KbX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFI6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuUGQoYSl9LmJpbmQodGhpcykpfSxQZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiYhdGhpcy5GaCYmKHRoaXMuRmg9ITAsdGhpcy5VJiZ0aGlzLlUoKSl9fSl9KShjKTt2YXIgTj1jLlpqfHxOOyhmdW5jdGlvbihjKXtjLllqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5CZSlpZih0aGlzLkhifHwKKHRoaXMuSGI9MCksdGhpcy5IYisrLDE1PHRoaXMuSGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhKXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuSm4oKTp0aGlzLmcoITApLCEwO3RoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKTthLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMuZygpOnRoaXMuZyghMCl9ZWxzZSBpZihhPWEudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkJlPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsCmZ1bmN0aW9uKGEpe3RoaXMuY2EoYSk7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk89YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPQphLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CYSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIE89Yy5Zanx8TzsoZnVuY3Rpb24oYyl7Yy4kaj0KdC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpO3RoaXMuVGE9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBhPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7YS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHwKdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5wZigpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIFdiPWMuJGp8fFdiLFhiPW5ldyBXYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYj1jLkVrfHxZYjtuZXcgWWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5xaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSwKUjpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWT1jLnFqfHxZOyhmdW5jdGlvbihjKXtjLnBqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmloPTA7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPXRoaXMuS2M9dGhpcy5CYT10aGlzLmVkPSExO3RoaXMuSmg9ZS5MYigxMCk7dGhpcy5xaCgpfSxxaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLnNiKCksITA7dGhpcy5paCsrO2lmKDEwPHRoaXMuaWgpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMuZyghMCk6dGhpcy5nKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5xaC5iaW5kKHRoaXMpLDEwMCksITF9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuY2EoYSwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuY2EoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuYmEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PQphLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLnVhPQohMH0sYmE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCk/KHRoaXMudygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJmIuYXBpLnBsYXllZCgpP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgWj1jLnBqfHxaOyhmdW5jdGlvbihjKXtjLnJqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBZKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWSh3aW5kb3cucGxheWVyKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWihhLHRoaXMuRyksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLnJqfHxaYiwkYj1uZXcgWmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy4kbHx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsCmI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgYmM9Yy5WaXx8YmM7KGZ1bmN0aW9uKGMpe2MuVWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2coKX0sc2c6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBjYz1jLlVpfHwKY2M7KGZ1bmN0aW9uKGMpe2MuV2k9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGJjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmphKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTChhKSl7dGhpcy5OKGEpOyhuZXcgY2MoYSx0aGlzLkcpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYz1jLldpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmM9Yy5Va3x8ZmM7bmV3IGZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLndpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5aKCkpOnRoaXMuWigpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgZ2M9Yy53aXx8Z2M7KGZ1bmN0aW9uKGMpe2Mudmk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcykpO3RoaXMuc2UoKTt0aGlzLm9nKCl9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LENhOmZ1bmN0aW9uKCl7dGhpcy51YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sb2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5vYSgpKTp0aGlzLmcoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9nLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuc2UuYmluZCh0aGlzKSwxMDApfSxzZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5nKCk6dGhpcy5nKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX19LGc6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5rYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIGhjPWMudml8fGhjOyhmdW5jdGlvbihjKXtjLnhpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sUmE6ZnVuY3Rpb24oYSl7YT0KbmV3IGdjKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgaGMoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuUmEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlJhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIGljPWMueGl8fGljLGpjPW5ldyBpYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYz1jLm5sfHxrYztuZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMucmg9dGhpcy50aD10aGlzLnNoPSExO3RoaXMuQ2Q9W107dGhpcy5vZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHphP251bGw6emEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgUz9udWxsOlMsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHVhP251bGw6dWEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFhiP251bGw6WGIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFViP251bGw6VWIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9iP251bGw6b2IsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGRiP251bGw6ZGIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBDYj9udWxsOkNiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeGI/bnVsbDp4YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6Vn19Yy5Maj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLkxsKGEpOltdLGM7dGhpcy50aD0hMDtpZihhLmxlbmd0aCl7dGhpcy5zaD0hMDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyljPWFbZF0sCnRoaXMuUmgoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLm9mKXtpZih0aGlzLnJoKWJyZWFrO2M9dGhpcy5vZltkXTt0aGlzLkpmKGMpJiYodGhpcy5DZC5wdXNoKGMpLHRoaXMuUmgoYykpfX0sSmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxMbDpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspZD1hW2VdLGQ9dGhpcy5vZltkXSx0aGlzLkpmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LFJoOmZ1bmN0aW9uKGEpe3RoaXMuSmYoYSkmJmEuZigpfSxZbjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcSYmIXRoaXMuc2gpZm9yKHRoaXMucmg9ITAsYT0wO2E8dGhpcy5DZC5sZW5ndGg7YSsrKXRoaXMuQ2RbYV0uU2ImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZFthXS5TYil9fX0pKGMpO3ZhciBsYz1jLkxqfHxsYyxMPW5ldyBsYztMLmYoKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5nbHx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuRmMoay5BbyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsCmMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuTm0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtDLndpZHRoPTE7Qy5oZWlnaHQ9MTtDLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChDKTt2YXIgcWM9Qy5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1DLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChDKTt2YXIgRz1uZXcgSCxsPSExO0cuZmEoKTtHLm5oKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5mYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcubmgoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LAohMSk7Ry5mYSgpO3ZhciByYz1xYyhmdW5jdGlvbigpe2UuTmcod2luZG93LEcuZG0oKSx7aWQ6cmN9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlNpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy5TaXx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkdoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy54ZD0wO3RoaXMuYmI9IiI7dGhpcy5EZD1bXTt0aGlzLkVkPTA7dGhpcy5JaD0hMTt0aGlzLmxmPVtdO2UucGIoIm5ld0FkZGVsaXZlcnkiKX1jLnlpPWE7YS5wcm90b3R5cGU9e0ZuOmZ1bmN0aW9uKGEpe3RoaXMuR2g9YX0sdmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmJiPXRoaXMucGxheWVyLlIoKX0sCmdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQW46ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSx6bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm5iKTsKdmFyIGQ9ITEsZj0hMTtpZih0aGlzLmVtKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5wYSx0aGlzLm5iLm5mLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5XbCgpKXRoaXMudm4oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuJG4oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsaCk7bC54bih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuRG0oYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwKInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuVWUmJihkPXRoaXMucGxheWVyLlVlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLldlKGEsZCxmKTt0aGlzLnBsYXllci5TaChsKX19LGVtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMueGQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy54ZC5nZXRUaW1lKCksdGhpcy54ZD1hLDNFNTxjPyEwOiExO3RoaXMueGQ9YTtyZXR1cm4hMX0sUW46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS51ZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuRmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLklnKGEpKT90aGlzLlNjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksCjApLGUubyhrLm1kLHRoaXMucGxheWVyLmwoKSkpfSxQbjpmdW5jdGlvbihhKXtpZighdGhpcy5HaCl7ZS51ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuRm4oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuSWcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS5vKGsubWQsdGhpcy5wbGF5ZXIubCgpKSl9fSxJZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sbW46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Nbih0aGlzLlBuLmJpbmQodGhpcykpOwp0aGlzLnBsYXllci5LYSgpfSxJZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS51ZigibWlkcm9sbCIpO2lmKCF0aGlzLndoKXt0aGlzLndoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm1kLHRoaXMucGxheWVyLmwoKSkpfX0sbG46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Fbih0aGlzLklkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlplKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlFuKCk7dGhpcy5wbGF5ZXIuWmUmJnRoaXMubG4oKTt0aGlzLm1uKCl9LG5uOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/CmE9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkRkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5jcChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuRWQ9dGhpcy5EZC5sZW5ndGh9LFdsOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkVkJiYoYT0hMCk7cmV0dXJuIGF9LHZuOmZ1bmN0aW9uKGEpe3RoaXMuSWg9YTtmb3IoYT0wO2E8dGhpcy5EZC5sZW5ndGg7YSsrKXRoaXMuRGRbYV1bImZ1bmN0aW9uIl0odGhpcy4kbS5iaW5kKHRoaXMpKX0sJG06ZnVuY3Rpb24oYSl7dGhpcy5FZC0tO2EmJnRoaXMubGYucHVzaChhKTswPj10aGlzLkVkJiZ0aGlzLkloKCl9LERtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0iIixkPTA7ZDx0aGlzLmxmLmxlbmd0aDtkKyspYz0KdGhpcy5sZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy55aXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLnBsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoZWVCaWNoYWhNaWFNZWVHaCxlZUJpY2hhaE1pYU1lZUdoKTsK
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

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

Response headers

date
Tue, 03 Dec 2019 12:58:41 GMT
content-encoding
gzip
last-modified
Thu, 04 Jul 2019 08:23:54 GMT
server
nginx/1.14.1
etag
W/"5d1db79a-109"
status
200
access-control-allow-methods
GET
content-type
application/json
access-control-allow-origin
*
cache-control
max-age=900
access-control-allow-headers
accept, content-type
expires
Tue, 03 Dec 2019 13:13:41 GMT
config.json
hgc-cf-cache-1.svonm.com/www.giga.de/ Frame 34FB
724 B
1 KB
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.giga.de/config.json?cache=4024001810
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGVlQmljaGFoTWlhTWVlR2g9ZWVCaWNoYWhNaWFNZWVHaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZmZ8fCh4LmZmPTApO3guZmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5mZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5IayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2IudmYoYyk7Yi5BbihtKTtiLnpuKGwpO2Iubm4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Jbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS51aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudWgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmlsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5pbHx8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuSGs9ITE7dGhpcy5HYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlptLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5naD17fTt0aGlzLnNmPSExfWMuY2o9YTthLnByb3RvdHlwZT17Wm46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt0aGlzLnNmfHwodGhpcy5zZj1lLlgoMTApKTtyZXR1cm4gdGhpcy5zZn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmdoW2JdJiYodGhpcy5naFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLlpuKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx6azpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sWm06ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuWW0oYi5kYXRhKX0sWW06ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxCZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5XZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMueWQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxXZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSx4azpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnRhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnRsKGIpKXJldHVybjsoYT10aGlzLkJnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx0bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTGc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHBtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFVnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxLbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHhmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuYWwoYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuS24oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sSms6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGFsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5KayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxEZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxwaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxMYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFRoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LGttOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scWQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLmFjPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0FpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEhpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LAphbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxGajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxoazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sc2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxVajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LERrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuQWkoKXx8Yi5IaSgpfHxiLmFtKCl8fGIuRmooKXx8Yi5oaygpfHxiLnNqKCl8fGIuVWooKX19O3JldHVybiBudWxsIT1iLkRrKCl9LHlsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sdGE6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxDYjpmdW5jdGlvbihiKXtiPXRoaXMudGEoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LE1sOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMudGEoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxkbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxSbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxRZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMua2koYSkrIjoiK3RoaXMua2koTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGtpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx1ZjpmdW5jdGlvbihiKXt0aGlzLkdiPWJ9LE5nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuR2I7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxhbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLk1sKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sU246ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmdjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5hbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLnZhKGIsITApO2I9bS52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS52YShmLCEwKTtmPW0udmEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFFkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS52YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uT2soKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnVkKGIpOiIifSx1ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG1nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy5wbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnFmJiZ3aW5kb3cuc2FuZGJveC5xZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLkxnKGIpKXJldHVybiB0aGlzLkxnKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS53ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy54ayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixlKTtlPWsudmEoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHlkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSx5bTpmdW5jdGlvbihiLGEsZCl7dGhpcy55ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx1aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMueW0oZi53ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCkluOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGNwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxGazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0saW06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuY2p8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLmJqPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuVG09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuTW09e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuWm89e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5rbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmJwPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuZ2c9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuWmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5kZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5oZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EucGs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuYmc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Gbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EubGw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS4kbz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS54Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLlprPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5tZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5mZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eucms9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5iZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnFrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5yaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLk9tPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuemQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS55Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuWW89e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuQm89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkNvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Bbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLk5tPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5ianx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLmZsfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxJbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdGQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnRkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudGQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudGQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG5oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5JbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnRkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmRqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5oaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLmhqfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuSWk9YX0pKGMpO3ZhciBLPWMuSWl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Ca3x8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Laj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTWI9MDt0aGlzLlRhPTE1MDt0aGlzLlNiPTA7dGhpcy5CbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGE/KHRoaXMuTWIrKyx0aGlzLlNiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5TYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHRuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWI+dGhpcy5UYT8hMDohMX0scGY6ZnVuY3Rpb24oKXt0aGlzLk1iPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxCbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sR2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudGgmJkwuWW4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxqbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLktqfHx0OyhmdW5jdGlvbihjKXtjLk1qPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5NYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRmI9IiI7dGhpcy5EZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKTW46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sRW46ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGEmJih0aGlzLk1iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVGc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sR2Q6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5YbCgpfHx0aGlzLnRrKCk7dGhpcy5HZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHRrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sWGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx3YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxTaDpmdW5jdGlvbihhKXt0aGlzLkZiPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmJ9LE9oOmZ1bmN0aW9uKCl7dGhpcy5GYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRmImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkRnfHwodGhpcy5EZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLk1qfHxxOyhmdW5jdGlvbihjKXtjLnppPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuV2Y9IjEiO3RoaXMuWGY9IjIiO3RoaXMubWs9IjMiO3RoaXMuJGM9MDt0aGlzLkZtPQozMDt0aGlzLlhiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5pZz10aGlzLm1pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMudmYoYSk7dGhpcy5DbihiKX0sZjpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLm1pfHwodGhpcy5taT0hMCxlLlhlKCkpfSxBaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGNtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmdjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5nYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV09MX0sZ206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZ2MoKSYmKHRoaXMud2YoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy56YSgpKXt0aGlzLmNtKCk7aWYoIXRoaXMuZ20oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMud2YoKTtyZXR1cm59dGhpcy53ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuZ2koKTt0aGlzLmlnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy56YSgpfHwodGhpcy5YYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGdpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5YYiYmMDx0aGlzLlhiLmxlbmd0aCYmKHRoaXMuWGI9ZS51bmlxdWUodGhpcy5YYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWGIuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLldmfSx3ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWGZ9LEpuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ta30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxhZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5XZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWGZ9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx2ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LENuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxHbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEJtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy56aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkJqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5Canx8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUGk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUGl8fG5hOyhmdW5jdGlvbihjKXtjLlFpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubmE/Yi5uYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlFpfHxvYTsoZnVuY3Rpb24oYyl7Yy5SaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5SaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLnRvfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5uaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuS2coKTt0aGlzLk1nKCk7dGhpcy5Zaz0hMX0sS2c6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxNZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5JZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSWQoYil9LmJpbmQodGhpcykpfSxJZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5uanx8cmE7KGZ1bmN0aW9uKGMpe2MubWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuaGU9ITE7dGhpcy5rZT0xO3RoaXMuYWQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuaGU9ITE7dGhpcy5rZT0xO3RoaXMuYWQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTtpZihhLmdldENvbmZpZylpZihiPWEuZ2V0Q29uZmlnKCksYi5hZHZlcnRpc2luZyl7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSlpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcyliLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5rZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMueWI9ITApO2Vsc2V7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSBpbnN0YW5jZW9mIEFycmF5KWZvcih2YXIgZz0wO2c8Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5sZW5ndGg7ZysrKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGVbZ10udGFnKXt0aGlzLnliPSEwO2JyZWFrfWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMueWI9ITApO2IuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMueWI9ITApfWIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy55Yj0hMCl9ZWxzZSB0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpO2Zvcih2YXIgZD0KImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGc9MDtnPGQubGVuZ3RoO2crKylhLm9uKGRbZ10sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtnXSYmKHRoaXMuaGU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtnXSYmdGhpcy5BaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLkZtJiYhdGhpcy56YSgpJiYodGhpcy55Yj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5nKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoZXZlbnQuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKTthLm9uKCJwbGF5bGlzdGl0ZW0iLApmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLllrPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5GYjtiJiYoYi5CZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmFkLmluZGV4T2YoYikmJnRoaXMuYWQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy53KCksdGhpcy5vYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMudygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLmFkLmxlbmd0aD49dGhpcy5rZSYmdGhpcy5nKCkpfSwKQm06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRGYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmhlfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuS2coKSxiLk1nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciBzYT1jLm1qfHxzYTsoZnVuY3Rpb24oYyl7Yy5vaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT0KdGhpcy5DbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2E9W107aWYoMTxiLmxlbmd0aClmb3IoZz0wO2c8Yi5sZW5ndGg7ZysrKWEucHVzaChiW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBhLnB1c2goandwbGF5ZXIoKS5pZCk7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpO3RoaXMuTChnKXx8dGhpcy5qbShnKXx8KHRoaXMuTihnKSxnPW5ldyBzYShnLHRoaXMuRyksZy5LKCksZy5mKCkpfX10aGlzLlAoKX19LEpwOmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LENsOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS56YihhLmFuY2hvcil9fSl9KShjKTt2YXIgdGE9Yy5vanx8dGEsdWE9bmV3IHRhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ibz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuYm98fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmNrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCks6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEpe3ZhciBiPWEuZWxfO2J8fChiPWEuZWwoKSk7Yj8odGhpcy5UKGIpLChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlcoYSk6dGhpcy5aKCkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYSl7dGhpcy5QZChhKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFiWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGEuYXV0b3BsYXk/YS5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sd2E6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHdhPWMuY2t8fHdhOyhmdW5jdGlvbihjKXtjLmJrPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMudWE9dGhpcy5LYz10aGlzLkJhPXRoaXMuZWQ9ITE7dGhpcy5KaD1lLkxiKDEwKTt0aGlzLklmPSEwO3RoaXMueGM9dGhpcy5raD0hMTt0aGlzLkttKGEuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy56aCgpLHRoaXMuS2soKSx0aGlzLnNiKCkpfSxLbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLAoiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGEuViwiOyIsdHlwZW9mIGEuViwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYS5WP2EuVi5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGEuVj90eXBlb2YgYS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYS5pbWEsIjsiLHR5cGVvZiBhLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGEuSCwiOyIsdHlwZW9mIGEuSCwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLmltYT9hLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuRWE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuRWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILkVhOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguRWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5pbWEmJmEuaW1hLkVhP2EuaW1hLkVhKCk6InVuZGVmaW5lZFgiLCI7IixhLmltYSYmYS5pbWEuRWE/dHlwZW9mIGEuaW1hLkVhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5mZToKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuZmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixhLkg/YS5ILmZlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguZmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILmdlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguZ2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubmE6InVuZGVmaW5lZFgiLCI7IixhLkg/CnR5cGVvZiBhLkgubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5xZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuSmgpfSxIYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5pbWEzJiYodGhpcy5pbWE9YS5pbWEzKTtpZihhLmltYSl7dGhpcy5pbWE9YS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmCih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LEljOmZ1bmN0aW9uKCl7aWYoIXRoaXMubmEpe3ZhciBhPXRoaXMuSGMoKTthJiYoYS5hZHNMb2FkZXImJih0aGlzLm5hPWEuYWRzTG9hZGVyKSxhLl9hZHNMb2FkZXImJih0aGlzLm5hPWEuX2Fkc0xvYWRlciksYS5nZXRBZHNMb2FkZXImJih0aGlzLm5hPWEuZ2V0QWRzTG9hZGVyKSxhLmNvbnRyb2xsZXImJmEuY29udHJvbGxlci5zZGtJbXBsJiZhLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm5hPWEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm5hfSxZZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LGhtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuamgpe3ZhciBhPQp0aGlzLkhjKCksYj10aGlzLmZtKCk7d2luZG93LmltYSYmYSYmKGEuX2Fkc0xvYWRlcnx8YS5hZHNMb2FkZXJ8fGIpJiYodGhpcy5qaD0hMCl9cmV0dXJuIHRoaXMuamh9LGZtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5lZCYmYS5hZHMmJihhLmFkcy5zdGF0ZXx8YS5hZHMuX3N0YXRlKSYmKHRoaXMuZWQ9ITApO3JldHVybiB0aGlzLmVkfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWMoKTtpZihhKXt2YXIgYj0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5rbigpfS5iaW5kKHRoaXMpKSwKYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5jYShiLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5iYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxrbjpmdW5jdGlvbigpe3RoaXMueGM9ITA7dmFyIGE9dGhpcy5ZZygpO2lmKGF8fHRoaXMuemEoKSl7dmFyIGI9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5jYShiKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oYil7dGhpcy5jYShiLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5iYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuU2EoKSYmKGQ9Ik1fIik7YS5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDsKaWYoZS5GKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYi5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIisKZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnljfHwodGhpcy5tKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5iYSgpLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LElwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5BZyYmYS5hZHMmJih0aGlzLkFnPWEuYWRzKTtyZXR1cm4gdGhpcy5BZ30sS2s6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7CnRoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLkFoKCl9LmJpbmQodGhpcykpfSxvZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksCjUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YSYmKChhPXRoaXMuWWcoKSkmJmEuZGVzdHJveT9hLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2QoKX0uYmluZCh0aGlzKSw1MCkpfSx6aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcoKSYmMDxhLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5obSgpKXt2YXIgYj10aGlzLkhjKCksZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLncoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5raD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8KKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5iYSgpKToodGhpcy5iYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMua2g9ITA7YS5pc1BsYXlpbmcoKSYmMTA8YS5jdXJyZW50VGltZSgpfHx0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56aCgpfS5iaW5kKHRoaXMpLDUwKX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYihnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sTGs6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpOwpyZXR1cm59fWVsc2UgdGhpcy5DYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGsoKX0uYmluZCh0aGlzKSwxMCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIGUueGU/ITE6dGhpcy51YX0sQ2E6ZnVuY3Rpb24oKXtpZih0aGlzLllsKCkpe3RoaXMudWE9ITA7aWYoZS5GKCJnaWdhLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKXRoaXMuSWY9ITEsZS50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsInNldCIsITApO3RoaXMuZyghMCl9ZWxzZSB0aGlzLnVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpfSxZbDpmdW5jdGlvbigpe2lmKDA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPQohMTtlLnlkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2E9IWUuZmIoYi5jYyl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXthPSExfSwhMCwhMCk7dmFyIGI9ZS55bCgpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGUueGU9LTEhPWIuaW5kZXhPZigiZmlyZWZveCIpfHwtMSE9Yi5pbmRleE9mKCJzYWZhcmkiKXx8YX1yZXR1cm4hMX0sYmE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCk/KHRoaXMudygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy56YSgpfHwoYXx8KHRoaXMuSWY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSWYsZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApUazpmdW5jdGlvbigpe3RoaXMuUnB8fCgxMDx0aGlzLkxvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuTG8rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5zbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UaygpfS5iaW5kKHRoaXMpLDUwKSkpfSxzbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Nbyl7dGhpcy5Nbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7CmEudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmJrfHx4YTsoZnVuY3Rpb24oYyl7Yy5kaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuWGgod2luZG93KTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyl0cnl7Yj1ifHx0aGlzLlhoKGFbZ10pfWNhdGNoKGQpe310aGlzLlAoKX19LFhoOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5TYj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5RYyl9fSl9KShjKTt2YXIgeWE9Yy5ka3x8eWEsemE9bmV3IHlhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Baj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEFhPWMuQWp8fEFhO25ldyBBYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuZ2Y9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTsKcmV0dXJufXRoaXMuVChiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2E/dGhpcy5XKGEpOnRoaXMuWigpfSxWbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkZiLGc9dGhpcy5oYSgpLGQ9IiI7YS5tZW1vJiYoZD1hLm1lbW8udmlkZW9pZCk7ZCYmYiYmYi5qYyYmKDA8PWcuaW5kZXhPZihkKXx8Yi5CZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuZ2Y9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKd2E6ZnVuY3Rpb24oKXt0aGlzLmdmKys7aWYoMTA8dGhpcy5nZilyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFBkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgphJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlUmJnRoaXMuVSgpfX0pfSkoYyk7dmFyIEJhPWMuSGp8fEJhOyhmdW5jdGlvbihjKXtjLkdqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQmUpaWYodGhpcy5IYnx8KHRoaXMuSGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5IYisrLDE1PHRoaXMuSGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZyghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPQohMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYihnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpOwp2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLm9sPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy5vbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlZtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwKMTAwKX0sZzpmdW5jdGlvbihhKXt0aGlzLkQoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Hanx8Q2E7KGZ1bmN0aW9uKGMpe2MuSWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5UYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmCihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyBCYShhW2JdKTtnLmphfHx0aGlzLkwoZyl8fCh0aGlzLk4oZyksKG5ldyBDYShnLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRGE9Yy5Janx8RGEsRWE9bmV3IERhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5UbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuVGx8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmpqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlVnKGEsImVsZW1lbnRJRCIpOwpzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLlhtPWEucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1hLndpZHRoO2cuc3R5bGUubWluV2lkdGg9YS53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5YbSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsCmIpfXRoaXMuVChnKTt0aGlzLlcoZyk7dGhpcy5yZD1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMucmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnJkKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sU2s6ZnVuY3Rpb24oKXtlLnBoKHRoaXMucmQpO2UuT2UodGhpcy5yZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNrKCl9LmJpbmQodGhpcyksNTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LFVlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5qanx8R2E7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuaWp8fEhhOyhmdW5jdGlvbihjKXtjLmtqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiYKbC5pbnJlYWQpe3ZhciBhPWwuaW5yZWFkLGI9ZS5VZyhhLCJlbGVtZW50SUQiKTtpZihlLnBoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTChhKSkpe3RoaXMuTihhKTsobmV3IEhhKGEsdGhpcy5HKSkuZigpO3JldHVybn10aGlzLlNiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBJYT1jLmtqfHxJYSxKYT1uZXcgSWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy53anx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPQoiR0VUIjt0aGlzLmRhdGE9e319Yy5laj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxEbjpmdW5jdGlvbihiKXt0aGlzLm1ldGhvZD1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LHVrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBBPWMuZWp8fEE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixnLGQsZil7dGhpcy5YYT1iO3RoaXMuUGc9dGhpcy51aT0hMTt0aGlzLkJoPWQ7dGhpcy5ZaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmCjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmMD09Yy5zdGF0dXMmJm0mJm0uUmUodGhpcy5YYS51cmwpJiZtLlZjKXt2YXIgZT1uZXcgQShiLnVybCk7ZS5EbigiUE9TVCIpO2Uuc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGEoZSxmdW5jdGlvbihiKXt2YXIgYT0hMTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChnKXthPSExfWEmJmEucGluZyYmInBvbmciPT1hLnBpbmcmJihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZmo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiKwpkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYVtkXSk7Yj1iLnN1YnN0cigxKX10aGlzLlBnJiYoYis9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0aGlzLmhiLnVybENhbGxlZD10aGlzLlhhLnVybDt0cnl7dGhpcy5ZaD90aGlzLmhiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITEpOnRoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMCksdGhpcy51aXx8KHRoaXMuaGIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGIubGVuZ3RoJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwKInJlcXVlc3RfZmFpbGVkIiwhMCk6bS5SZSh0aGlzLlhhLnVybCksdGhpcy5CaCYmdGhpcy5CaCgpfXJldHVybiB0aGlzLmhifX19KShjKTt2YXIgTGE9Yy5manx8TGE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkRhPXRoaXMuYmU9ITF9Yy5KaT1hO2EucHJvdG90eXBlPXtIbjpmdW5jdGlvbihiKXt0aGlzLmJlPWJ9LEduOmZ1bmN0aW9uKGIpe3RoaXMuRGE9Yn0scW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIiwicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIiwKdnA6IkFkU2tpcHBlZCIsd3A6IkFkU3RhcnRlZCIsbHA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixtcDoiQWRJbXByZXNzaW9uIixpcDoiQWRDcmVhdGl2ZVZpZXciLHBwOiJBZFZpZGVvTWlkcG9pbnQiLHFwOiJBZFBhdXNlZCIsc3A6IkFkVmlkZW9TdGFydCIsdHA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5iZSxhW2RdKX0scG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmFlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmFlKXRoaXMuRGEuYWUuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuRGEsdGhpcy5EYS5hZVthXSk7dGhpcy5EYSYmdGhpcy5EYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EYS5nZXRFcnJvcigpO2ImJmNvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsImdvdCBlcnJvciIsYil9LmJpbmQodGhpcyksMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5iZSYmdGhpcy5xbigpO3RoaXMuRGEmJnRoaXMucG4oKX19fSkoYyk7dmFyIE1hPWMuSml8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5IYT0hMTt0aGlzLiRiPSIiO3RoaXMuZmQ9dGhpcy5aYj10aGlzLmpiPW51bGw7dGhpcy5HZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMucGE9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm5mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk9iPSIiO3RoaXMuWmQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7CnRoaXMuWWQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLnZiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLldiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLlBiPSIiO3RoaXMuUWI9W107dGhpcy5SYj1bXTt0aGlzLlVjPVtdO3RoaXMub2M9IiI7dGhpcy5BYj0hMTt0aGlzLk9kPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuaWM9ITE7dGhpcy52Zz10aGlzLlVkPW51bGw7dGhpcy56Zj10aGlzLlZiPXRoaXMuRmc9dGhpcy5TZD10aGlzLlZjPXRoaXMuaGQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnZkPTA7dGhpcy5maD0hMTt0aGlzLmVoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5naj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy4kYixhZHRhZ21vZGlmaWVyOnRoaXMuamIsYWR0YWdtb2RpZmllckFkdjp0aGlzLlpiLGFkdGFncmVnZXg6dGhpcy5mZCxiaXRyYXRlOnRoaXMuT2EsanNwb3B1cHM6dGhpcy5UZSxzaWRlbG9hZHM6dGhpcy50YixkaXNhYmxldGVzdHM6dGhpcy5HZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLlNlLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnBhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5PYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuWmQsSE9NQURfQkxPQ0tFRDp0aGlzLllkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLldiLHRlc3RIaWRlOnRoaXMuUGIsdGVzdFRhZ3M6dGhpcy5RYix0ZXN0VGFnc0pTOnRoaXMuUmIsCnRlc3RUYWdzWEhSOnRoaXMuVWMsdGVzdDNQQ29va2llOnRoaXMub2MsdGhyb3R0bGU6dGhpcy5PZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLmljLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMudmcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5zYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuaGQsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuVmMsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuU2QsY29uZmlnRmFpbHVyZXM6dGhpcy5aYSxzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5yZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5WYixza2lwQWxsb3dlZDp0aGlzLnpmLHZtYXBzOnRoaXMuTmYsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LHluOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy4kYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLmpiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuWmI9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5mZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkdnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuU2U9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuSmM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5wYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5PYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9CmIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLlpkPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuWWQ9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMudmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5XYj1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuUGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5SYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMub2M9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLk9kPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLmljPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLnZnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuaGQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmCih0aGlzLlZjPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuU2Q9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLlphPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5yZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVmI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuemY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmCih0aGlzLk5mPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuemM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmllPWIuYWRGYWxsYmFja1VSTCl9LFZsOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYTtmb3IoYSBpbiB0aGlzLlphKSJib29sZWFuIj09dHlwZW9mIHRoaXMuWmFbYV0mJjE9PXRoaXMuWmFbYV0mJihiPSEwKTtyZXR1cm4gYn0sdGY6ZnVuY3Rpb24oYil7dGhpcy5aYVtiXT0hMH0sRGw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxNZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGI9ZS5GayhiKX0sdmE6ZnVuY3Rpb24oYixhLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy50YShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuJGJ8fHRoaXMuamJ8fAp0aGlzLlpifHx0aGlzLmZkKSYmKGg9dGhpcy5IbShoKSk7Yj1uZXcgQShlKTtiLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkZsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1oO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGgpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sUWU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSwKTGM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuZ2EmJnRoaXMuZ2EubGVuZ3RoJiYwPHRoaXMuZ2EubGVuZ3RoJiYoYT10aGlzLmdhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LFJlOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuUWUoYik7cmV0dXJuIGF9LEZsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwOwpyZXR1cm4ibm9uZSJ9LHdkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2FbdGhpcy5yZl19LFBjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy53ZCgpLGE9dGhpcy5UaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSx4aDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxHbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUudGEoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPApoLmxlbmd0aDtGKyspe3ZhciBrPWhbRl0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWZbbF09dGhpcy54aChmW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZiloLnB1c2gobCsiPSIrZltsXSk7Zj1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMueGgoZC5xdWVyeUtleVtjXSxjLGFbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxIbTpmdW5jdGlvbihiKXt0aGlzLiRiJiYoYis9dGhpcy4kYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5aYiYmKGI9dGhpcy5HbShiLHRoaXMuWmIpKTtyZXR1cm4gYn0sUms6ZnVuY3Rpb24oKXt0aGlzLnlhJiYKdGhpcy55YS5jbGllbnRBUElzJiZ0aGlzLk1rKHRoaXMueWEuY2xpZW50QVBJcyl9LE1rOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBNYTtiLnB1Ymxpc2hlckFQSSYmYS5IbihiLnB1Ymxpc2hlckFQSSk7Yi5wbGF5ZXImJmEuR24oYi5wbGF5ZXIpO2EuZigpfX0saTpmdW5jdGlvbihiLGEsZCxmLGMsZSl7bT10aGlzO3RoaXMuU2U9ITA7dGhpcy5KYz1iO3RoaXMucGE9YTt0aGlzLm5mPWQ7dGhpcy5VZD1mO3RoaXMuRGM9Yzt0aGlzLnlhPWV8fHt9O3RoaXMuUmsoKTt0aGlzLnhtKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnBhKXRoaXMudm0oKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMucGEpdHJ5e3RoaXMucGE9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnBhKXRyeXt0aGlzLnBhPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSwKcmI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGF9LHhtOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgQSh0aGlzLkpjK3RoaXMub2UoImdsb2JhbCIpKSx0aGlzLlNsLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnRmKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuQWMoKX0uYmluZCh0aGlzKSwhMCl9LHZtOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgQSh0aGlzLnBhK3RoaXMub2UoImNsaWVudCIsLTEhPXRoaXMucGEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy50ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoKIj8iKSsoImNhY2hlPSIrdGhpcy5MYigpKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1iJiYoZD0iIik7dGhpcy55YSYmdGhpcy55YS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGRhOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhkKXt0aGlzLmhkPSEwO3ZhciBhPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChnKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpOwpmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLkRjPSExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWWQpKTsKdGhpcy5UYigpO2UuRmMoay5UbSk7KGE9ZS5DYih0aGlzLndkKCkpKXx8KGE9ZS5DYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sU2w6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9aWYoIWEuZW5hYmxlZHx8IWEuZm9yY2VfZGlzYWJsZWQpdHJ5e2E9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGYpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucGF8fHRoaXMuT2J8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSwKdGhpcy5UYigpKX19LEFjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLnBhfWVsc2UgZD10aGlzLnBhO2lmKCEoZC5lbmFibGVkJiZkLnNlcnZlciYmZC5hbGlhcyYmZC5jb25maWcpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChjKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5mYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5nYT1kLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuZ2EubGVuZ3RoO2IrKyl0aGlzLmdhW2JdPXRoaXMuZ2FbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLkYoIndlYi5kZSIpfHxlLkYoImdteC5uZXQiKXx8ZS5GKCJnbXguYXQiKXx8ZS5GKCJnbXguY2giKXx8CmUuRigiMXVuZDEuZGUiKSkmJiF0aGlzLkxjKCkpZm9yKGI9MDtiPHRoaXMuZ2EubGVuZ3RoO2IrKyl0aGlzLmdhW2JdPXRoaXMuZ2FbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5PYj1kLmNvbmZpZ3x8IiI7dGhpcy5BYT1kLmFsaWFzfHxudWxsO3RoaXMuSmU9ZC5hZHBhdGh8fCIiO3RoaXMucmY9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuZ2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5PYiYmdGhpcy5BYSYmdGhpcy5nYS5sZW5ndGg/dGhpcy5NYyghMSk6KHRoaXMuSGE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy5UYigpKX0sTWM6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307aWYoYil7dmFyIGE9bmV3IEEodGhpcy5QYygpKSxkPXRoaXMudGEodGhpcy5PYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjsKYS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2EubWV0aG9kPSJQT1NUIn1lbHNlIGE9bmV3IEEodGhpcy5PYit0aGlzLm9lKCJjdXN0b21lciIpKTt0aGlzLklhKGEsdGhpcy5hby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy50ZigiY3VzdG9tZXIiKTtiP3RoaXMuVGo/dGhpcy5kYSgibm9TVk1Db25maWciKToodGhpcy5Uaj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuTWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGFvOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPWIucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtpZighdGhpcy5pYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuaWM9ITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpKXRyeXtkPQoobmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuVmM9dGhpcy5mYihkLnN0cmljdCk7dGhpcy5TZD10aGlzLmZiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkZnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy4kYT10aGlzLmZiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5mYihkLmVuYWJsZWQpO3RoaXMuUGI9ZC50ZXN0aGlkZXx8IiI7dGhpcy5SYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLlVjPWQudGVzdGFkdGFnc3hocnx8W107dGhpcy5vYz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy4kYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmpiPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLlpiPWQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5mZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5UZT0KZC5qc3BvcHVwc3x8ITE7dGhpcy50Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5WYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuVmI7dGhpcy56Zj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLmpkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5OZj1kLnZtYXBzfHwiIjt0aGlzLnpjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5PYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmllPWQuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLk9kPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMuaWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLmljPSEwLHRoaXMuTWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMucG8oKSYmKHRoaXMuUGJ8fHRoaXMuUmJ8fHRoaXMuUWJ8fHRoaXMuVWMpP3RoaXMubmY/KHRoaXMuSGE9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy50ZSgpLHRoaXMuVGIoKSk6CnRoaXMuZm8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5GZigpKX19LGZvOmZ1bmN0aW9uKCl7dGhpcy5lbygpO3RoaXMuaG8oKX0saG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksCkY9ZS5YKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihGLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2IoRikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwplLnpiKGIoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYil7fWlmKDMhPWQpe3ZhciBjPWUucWQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlNhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGEsITApO3JldHVybn10aGlzLmRhKCJjc3BfIithKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxGZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpO3RoaXMuVGIoKX0sTmQ6ZnVuY3Rpb24oYil7dGhpcy5zYz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuSGE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKGIpKSx0aGlzLlRiKCksdGhpcy50ZSgpKX0sZW86ZnVuY3Rpb24oKXtpZih0aGlzLlBiKXt2YXIgYj1lLnFkKCk7aWYoKGIuaXNDaHJvbWV8fGIuaXNGaXJlZm94KSYmdGhpcy5tbSgpKXRoaXMuTmQodGhpcy5XYiwibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXtiPSExO3RyeXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuUGIpO2Euc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5QYik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpOwpiPWR9Y2F0Y2goZil7fWI/dGhpcy5OZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5jaSgpfX1lbHNlIHRoaXMuY2koKX0sYmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoKSk7dGhpcy5rbyhmLDA8ZC5sZW5ndGg/Yi5iaW5kKHRoaXMpOnRoaXMuWmguYmluZCh0aGlzKSxhLmJpbmQodGhpcykpfWZ1bmN0aW9uIGEoKXt0aGlzLk5kKHRoaXMuV2IsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5RYj10aGlzLlVjKSYmdGhpcy5RYi5sZW5ndGgpe3ZhciBkPXRoaXMuUWIuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5aaCgpfSxrbzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwKITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSWEobmV3IEEoYiksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LGNpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYigpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkxiKCkpO3RoaXMubG8oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLmJpLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1mdW5jdGlvbiBhKCl7dGhpcy5OZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlJiJiZ0aGlzLlJiLmxlbmd0aCl7dmFyIGQ9dGhpcy5SYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLmJpKCl9LGxvOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwKITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihhLGQpe2Q9PWImJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWI7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sWmg6ZnVuY3Rpb24oKXtpZih0aGlzLm9jKXRyeXtlLnlkKHRoaXMub2MsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO3RoaXMuQWI9IXRoaXMuZmIoYi5jYyk7dGhpcy5GZigpfS5iaW5kKHRoaXMpLHRoaXMuJGguYmluZCh0aGlzKSwhMCl9Y2F0Y2goYil7dGhpcy4kaCgpfWVsc2UgdGhpcy5GZigpfSwKJGg6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKTt0aGlzLlRiKCk7dGhpcy50ZSgpfSxtbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChiKXtyZXR1cm4iZmFpbCJ9fSxUYjpmdW5jdGlvbigpe3ZhciBiPSIwIixhPSIwIjt0cnl7ZS5TYSgpJiYoYj0iMSIpfWNhdGNoKGQpe2I9Mn10aGlzLnNjJiYoYT0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYisiIithLCEwKTt0aGlzLm9jJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuQWIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlpkKSk7dGhpcy5VZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlVkJiZ0aGlzLlVkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkFifSl9LApRazpmdW5jdGlvbigpe2lmKHRoaXMuU2QmJnRoaXMuVmwoKSl7dmFyIGI9dGhpcy5EbCgpO2ImJmIuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYi5qb2luKCJfIiksITApfX0sZ2k6ZnVuY3Rpb24oYil7Ynx8KGI9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGIpdHJ5e2I9Yi50b1N0cmluZygpfWNhdGNoKGEpe2I9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9Yj1iLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITApfSxJYTpmdW5jdGlvbihiLGEsZCxmLGMsaCl7dGhpcy52ZHx8KHRoaXMudmQ9MCk7dGhpcy52ZCsrO3RoaXMudmQ+dGhpcy5laCYmIXRoaXMuZmgmJih0aGlzLmZoPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5laCwhMCkpO2I9bmV3IExhKGIsYSxkKTtmJiYoYi51aT0hMCk7YyYmZS5rbSgpJiYoYi5QZz0hMCk7aCYmKGIuWWg9ITApO3JldHVybiBiLmxvYWQoKX0sTms6ZnVuY3Rpb24oKXtlLlNhKCl8fAplLmFiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihiKXt2YXIgYT1udWxsLGQ9bnVsbCxmPSIiO3RyeXsoYT1iLnJlc3BvbnNlWE1MKXx8KGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYi5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLmRhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihiPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGJbMF0mJihiPWJbMF0pLGIpe2Y9YiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkxjKCl8fChiPXRoaXMudGEoZiksZj1iLnByb3RvY29sKyI6Ly8iK2IuaG9zdCk7dmFyIGU9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5kYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2UuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5kYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sY286ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuTmZ9LE9rOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKITApO3ZhciBiPXRoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2IuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYix0aGlzLkVvLmJpbmQodGhpcyksdGhpcy5Eby5iaW5kKHRoaXMpKX0sRW86ZnVuY3Rpb24oYil7dmFyIGE9bnVsbCxkPW51bGw7dHJ5eyhhPWIucmVzcG9uc2VYTUwpfHwoYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhiLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1kfHx0aGlzLm1sKCl9LERvOmZ1bmN0aW9uKCl7fSxtbDpmdW5jdGlvbigpe2UuRmMoay5sbCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5kYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sCnRlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMudGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy50Yi5sZW5ndGg7YisrKXt2YXIgYT10aGlzLnRiW2JdOyJyZXF1ZXN0Ij09YS50eXBlJiZlLmFiKGEudXJsLGEuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09YS50eXBlKXt2YXIgZD1uZXcgSDt3aW5kb3dbZC5mYSgpXT10aGlzO2UuYWIoYS51cmwsYS5hbGlhcyxudWxsLGZ1bmN0aW9uKGIpe2lmKGIucmVzcG9uc2VUZXh0KXRyeXtldmFsKGIucmVzcG9uc2VUZXh0KX1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0scG86ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5PZH0sTGI6ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYnx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sWDpmdW5jdGlvbihiKXtiPWJ8fDEwO2Zvcih2YXIgYT0KIiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9LHpiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGYsYyxlLGgsayxsPTA7bDxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQobCsrKSxmPWIuY2hhckNvZGVBdChsKyspLGM9Yi5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxoPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9oPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBhfSx0YTpmdW5jdGlvbihhKXt2YXIgZz0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxjPTE0O2MtLTspZFtnW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZ1sxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSxUaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBnKGEpe3ZhciBiPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9YT4+PjQqZCYxNSxiKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gYn1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixyPTI3MTczMzg3OCx0PTMyODUzNzc1MjAsbixxLHUsdix3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGM9MDtjPG4tMztjKz00KWU9YS5jaGFyQ29kZUF0KGMpPDwyNHxhLmNoYXJDb2RlQXQoYysxKTw8MTZ8YS5jaGFyQ29kZUF0KGMrMik8PDh8YS5jaGFyQ29kZUF0KGMrMykseC5wdXNoKGUpOwpzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihjPTA7MTY+YztjKyspaFtjXT14W2ErY107Zm9yKGM9MTY7Nzk+PWM7YysrKWhbY109ZChoW2MtM11eaFtjLThdXmhbYy0xNF1eaFtjLTE2XSwxKTtlPWs7bj1sO3E9bTt1PXI7dj10O2ZvcihjPTA7MTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8fm4mdSkrditoW2NdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8biZ1fHEmdSkrditoW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YraFtjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1O3Q9dCt2JjQyOTQ5NjcyOTV9cmV0dXJuKGcoaykrZyhsKStnKG0pK2cocikrZyh0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE5hPWMuZ2p8fE5hLG09bmV3IE5hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMuYXA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBPYT1jLmFwfHxPYTtuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZyxkKXt0aGlzLmE9YTthLmMuUj90aGlzLmJiPWEuYy5SKCk6dGhpcy5iYj0iIjthLmMubWgmJmEuYy5taCh7cGF1c2U6dGhpcy5CZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLlFoLmJpbmQodGhpcyksbXV0ZTp0aGlzLmFmLmJpbmQodGhpcyksdW5tdXRlOnRoaXMud28uYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYS5rYjt0aGlzLnBsYXllcj10aGlzLmEuYzt0aGlzLmVjPXRoaXMuZ2Q9ITE7dGhpcy5Daz0xRTM7dGhpcy5yYT1udWxsO3RoaXMuQj1nO3RoaXMuZ2I9e307dGhpcy52aWRlbz17fTt0aGlzLktkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLkdrPWUuWCgxMCk7CnRoaXMuQmY9MDt0aGlzLmRkPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuZGQ9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMuZGQ9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQWs9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5lZj10aGlzLkpkPSExO3RoaXMudmg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYj17fTt0aGlzLm5lPSExO3RoaXMuamk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5qYz0hMTt0aGlzLiRrPWUuWCgxMCk7dGhpcy5LYj1lLlgoMTApO3RoaXMuSWI9ZS5YKDEwKTt0aGlzLlVoPWUuWCgxMCk7dGhpcy5jb25mPXt9O3RoaXMuVmQ9CnRoaXMuVWI9dGhpcy52ZT10aGlzLm5kPXRoaXMuTGQ9dGhpcy51Yj10aGlzLnFjPXRoaXMuRGg9dGhpcy5zZD10aGlzLnFvPXRoaXMueGI9dGhpcy5KYj0hMTt0aGlzLnZjPVtdO3RoaXMubGM9e307dGhpcy5SbT0yMDA7dGhpcy5RZj10aGlzLldjPXRoaXMucmU9dGhpcy5QZj10aGlzLm1mPSExO3RoaXMuY2Y9e319Yy5haj1hO2EucHJvdG90eXBlPXt4bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGc9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoZz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBnfSxoaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5HYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLldhKCksITApO3RoaXMuVW4oKTtlLm8oay5yayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxXZTpmdW5jdGlvbihhLGcsZCxjKXt0aGlzLnhiPQpkO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkIuUyl0aGlzLkJmKyssZS5wYigibmV3U21hbGxBZElkIiksdGhpcy5CLlFrKCksYz1tLmdldENvbmZpZygpLGUueGUmJih0aGlzLkIueW4oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQi5IYSYmdGhpcy5CLmlzRW5hYmxlZD8odGhpcy5oaSgpLG5ldyBSKHRoaXMsYSx0aGlzLnZoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpnLGJpdHJhdGU6Yy5PYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQi5WYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpnPyh0aGlzLmhpKCksCm5ldyBSKHRoaXMsYSx0aGlzLnZoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5CLlZiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5PYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUGEoKTtlbHNle3ZhciBrPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2suV2UoYSxnLGQpfSw1MCl9fSxoZjpmdW5jdGlvbihhKXthLllhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuVmQ9dGhpcy5VYj10aGlzLnNkPSExO3RoaXMuYj1hO3RoaXMuTm4odGhpcy5iKTt0aGlzLmFoKGEpO3RoaXMudmM9dGhpcy5SZyhhKTt0aGlzLlZrKCl9LGFoOmZ1bmN0aW9uKGIpe2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mCmEmJih0aGlzLktkPXRoaXMuT2woYikpLHRoaXMuYWgoYi5wYXJlbnQpKX0sUmc6ZnVuY3Rpb24oYil7dmFyIGM9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoYz10aGlzLlJnKGIucGFyZW50KSksYy5wdXNoKHRoaXMueGwoYikpKTtyZXR1cm4gY30seGw6ZnVuY3Rpb24oYSl7dmFyIGM9IiIsZD1bXTtpZihhJiZhLkomJmEuSi5nZXRBdHRyaWJ1dGUpe2M9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKylkLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpjLGNyZWF0aXZlSUQ6ZH19LE9sOmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGQ9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5KKXtjPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpOwpmPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkouZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLkouZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLkouZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKGs9MDtrPGMubGVuZ3RoO2srKylkLnB1c2goYS5sYihjW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmh9fSxxYTpmdW5jdGlvbihhKXthLllhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGM9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJgooYz1hLmVycm9yLmRldGFpbC5jb2RlKSxhLnBkJiZhLnBkLmVycm9yJiZhLnBkLmVycm9yLmNvZGUmJihjPWEucGQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5ZYy5jb2RlOmM9PUQuY2UuY29kZT9lLm8oay5abyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpOihlLlhlKCksYz09RC5VZi5jb2RlJiZlLm8oay5MbSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKTtlLm8oay5rbCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVm4oKTt0aGlzLlVhKCJlbXB0eSIpO3RoaXMuQi5BYiYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkFiLCEwKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay5Gbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3LlZmLmNvZGU6ZS5vKGsuJG8sCnRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LmVlLmNvZGU6ZS5vKGsuYnAsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJ4bWxwYXJzZSIpO2JyZWFrO2Nhc2Ugdy4kZC5jb2RlOmUubyhrLk1tLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgibm9tZWRpYSIpO2JyZWFrO2Nhc2Ugdy5YZC5jb2RlOmUubyhrLkJvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdy5SZi5jb2RlOmUubyhrLkNvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuVWEoInVua25vd24iKX10aGlzLmZjKGEpO3RoaXMuUGEoKX0sZmM6ZnVuY3Rpb24oYSl7dmFyIGM9CjkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihjPWEuZXJyb3IuY29kZSw5MDE8YyYmKGM9OTAwKSk7Zm9yKGM9eyJbRVJST1JDT0RFXSI6Y307YS5NYS5sZW5ndGg7KXRyeXt2YXIgZD1hLk1hLnBvcCgpO3RoaXMuVmUoZC51cmwsZC50eXBlLGMpfWNhdGNoKGYpe319LE5uOmZ1bmN0aW9uKGEpe3RoaXMudmU9ITE7dGhpcy5nYj10aGlzLmEuSTt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLnhmKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dmFyIGM9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYz10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuZ2IuekluZGV4PWM7Yz10aGlzLmEuQTt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksZj0iIjtkJiZkLmVudnZhcnMmJihmPWQuZW52dmFycygpKTtmLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLmdldEVudmlyb25tZW50VmFyaWFibGVzJiYoZj1kLmdldEVudmlyb25tZW50VmFyaWFibGVzKCkpOwpmLnZpZGVvU2xvdCYmKGM9Zi52aWRlb1Nsb3QsdGhpcy5tZj0hMCl9Y2F0Y2goaCl7fWMuY3E9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGMuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihjLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZjLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLkFrJiZ0aGlzLnBsYXllci5DZSgpJiYoYy52b2x1bWU9dGhpcy5wbGF5ZXIuQ2UoKS8xMDApO2Zvcig7Yy5maXJzdENoaWxkOyljLnJlbW92ZUNoaWxkKGMuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPAphLk0ubGVuZ3RoO2QrKyljLmNhblBsYXlUeXBlKGEuTVtkXS50eXBlKSYmdGhpcy52ayhjLGEuTVtkXS51cmwrIiIsYS5NW2RdLnR5cGUpO3RoaXMubWYmJmMubG9hZCgpO2lmKHRoaXMuZGkoYykpe3RoaXMuVmgoInNldHVwIix0aGlzLldhKCkpO3RoaXMueWsoYyk7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT10aGlzLmdiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLm1mP3RoaXMudmlkZW89Yzp0aGlzLnZpZGVvPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyl9Y2F0Y2gobCl7dGhpcy52aWRlbz1jfX1lbHNlIHRoaXMuYi5XaygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/CmEuc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLmdiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChjKSx0aGlzLkxuKCkpOnRoaXMuYi5vcmlnaW4uSGcody4kZCl9LExuOmZ1bmN0aW9uKCl7dGhpcy5QZj0hMDt0aGlzLnViPXRoaXMucWM9ITE7dGhpcy5hLmMuc2EmJnRoaXMuYS5jLnNhKCkmJihlLm8oay55Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMudWI9ITApO2UudWUoKTt0aGlzLmImJnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4ubWEmJmUuemsodGhpcy5iLm9yaWdpbi5tYSk7dGhpcy5WaCgic2V0dXAiLHRoaXMuV2EoKSk7dmFyIGE9dGhpcy5hLkE7dGhpcy5hLkE9Qi5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5BLGEpO3RoaXMuYS5FaCgpO3RoaXMuYS55ZigpO2ZvcihhPQp0aGlzLmEuSTthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5hLnlmKCk7dGhpcy5nYj10aGlzLmEuSTt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLnhmKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dGhpcy5yYT10aGlzLmEuSTt0aGlzLm5pKCJ2cGFpZCIpO2lmKHRoaXMudWIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5OYigibXV0ZWQiLCJjb250ZW50Iik7ZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX10aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsCiJubyIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5hLkkuYXBwZW5kQ2hpbGQodGhpcy5DKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmUueGYodGhpcy5DLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5DLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLlJsKCksYz10aGlzLmIudS5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fApiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsCiJjb25maWciLGgpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLm1nKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5CKTt0aGlzLkMuc3JjPWE7ZS5wZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMud2EmJiF0aGlzLkxkJiZ0aGlzLmEuYy53YSgpJiZlLm8oay5CYywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEuaGMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMudmM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5ObyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLk9vKCksdGhpcy5hLmhjKCEwKSwhdGhpcy5VYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5VYj17ZWw6dGhpcy5DLApjYjpmdW5jdGlvbigpe3RoaXMuVmQ9ITA7ZS5vKGsucmksdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuUGUodGhpcy5VYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmhjKCEwKSx0aGlzLlNvKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5XbygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5WbygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlhvKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlRvKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPQphLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5kYyk7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLm8oay54Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkIuemN8fHRoaXMuV2MpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goYyl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuUm8oKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUubyhrLmxlLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuUG8oKTsKIkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5XYyYmKHRoaXMuUWY9ITEsdGhpcy5uYygpKSx0aGlzLlFvKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMudWI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLk5iKCJtdXRlZCIsInVzZXIiKSxlLm8oay56ZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKToodGhpcy51Yj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTmIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSGYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksZS5vKGsubGUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLAp0aGlzLnMoKSkpfX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5QYSgpfS5iaW5kKHRoaXMpKTtlLnBlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLmpnKGZ1bmN0aW9uKGEpe2UuaWEodGhpcy5DLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sUG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UubyhrLmplLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnFjPSEwfSxRbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UubyhrLmJkLHRoaXMuYi51LAp0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMucWM9ITF9LFNvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS5vKGsuZ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sUm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuZmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sT286ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5XaCgpO2UubyhrLmJnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlZhKCJzdGFydCIpO2UubyhrLmJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFVvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuc2Q9ITA7dGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpO2UubyhrLlpmLAp0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxWbzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5WYSgibWlkcG9pbnQiKTtlLm8oay5kZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxYbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIik7ZS5vKGsuaGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sVG86ZnVuY3Rpb24oKXt0aGlzLktmKCk7dGhpcy5WYSgiY29tcGxldGUiKX0sc2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5DJiZ0aGlzLkMucGFyZW50Tm9kZSYmdGhpcy5DLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5VYSgidnBhaWRzdG9wcGVkIik7dmFyIGM9dGhpcy5DLnBhcmVudE5vZGU7dGhpcy5DLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5DKTtjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyk7CmUudWUoKTt0aGlzLkM9ITE7dGhpcy5QYShhKX19LE5vOmZ1bmN0aW9uKGEpe3ZhciBjPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWMmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGM9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGMubWF0Y2goZCkpO3RoaXMuVWEoInZwYWlkZXJyb3IiKTtlLm8oay5Zbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuc2koITApfSx2azpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkhhJiZiLmlzRW5hYmxlZCYmIWIuTGMoKSl7dmFyIGM9Yi50YShhKTtyZXR1cm4gYy5wcm90b2NvbCsiOi8vIitjLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9ZChjLHRoaXMuQik7Zi5vbmVycm9yPXRoaXMuS28uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmQoYyx0aGlzLkIpKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LHlrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLm9pLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnBpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuS2YuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5MZi5iaW5kKHRoaXMpKX0sRmQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMub2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5NZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuS2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5MZi5iaW5kKHRoaXMpKX0sb2k6ZnVuY3Rpb24oYSl7dGhpcy5lY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVjfHx0aGlzLk1mKGEpfS5iaW5kKHRoaXMpLHRoaXMuQ2spKX0sTWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZ2QmJnRoaXMuZGkodGhpcy52aWRlbykmJiF0aGlzLkpiJiYhdGhpcy5lYyl7dGhpcy5nZD0hMDt0cnl7aWYoIWUuU2EoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuSmJ8fCh0aGlzLkpiPSEwLHRoaXMuRmQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5XYSgpLCEwKSx0aGlzLkIuRmd8fHRoaXMuQi5kYSgidmlkZW8tbm9vcCIpKTt0aGlzLlBhKCk7cmV0dXJufX1jYXRjaChjKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5XYSgpLCEwKX10aGlzLkhvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEueWYoKTt0aGlzLkdvKCk7dGhpcy5uaSgpO3RoaXMubmcoKTt0aGlzLmEuRWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuQ2YoKX19LENmOmZ1bmN0aW9uKCl7dGhpcy5uZHx8dGhpcy4kZigpfSwkZjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnZpZGVvLnBsYXkoKTtpZihjJiZjWyJjYXRjaCJdKWNbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLm5kfHwoYT90aGlzLlBhKCk6KHRoaXMuYWYoITApLHRoaXMuJGYoITApKSl9LmJpbmQodGhpcykpO2JhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5tYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5tYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5tYy5iaW5kKHRoaXMpKSk6ST1mdW5jdGlvbigpe3RoaXMubmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNmKCkpfS5iaW5kKHRoaXMpO3RoaXMuRWUoKS5TaCh0aGlzKX0sS2Y6ZnVuY3Rpb24oKXt0aGlzLkIuJGEmJiF0aGlzLkpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApLHRoaXMuVmEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS5vKGsucGssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlBhKCl9LHNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxkPSExLGY9MDtmPGEubGVuZ3RoO2YrKylkPWUuV2coYVtmXSksYy5wdXNoKGQpO2E9e2hhc2hlczpjfTthPWsuUmEoYSx0aGlzLnMoKSk7ZS5TbihhKX0sUGE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuV2QmJnRoaXMuc2sodGhpcy5iLldkKTsKaWYoIXRoaXMudmUpaWYodGhpcy52ZT0hMCx0aGlzLlZkfHwoZS5vKGsuT20sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmIud2J8fHRoaXMuYi50Yyl7ZS5wYigibmV3U21hbGxBZElkIik7dGhpcy5CZisrO3RoaXMuZWM9dGhpcy5nZD0hMTt0cnl7dGhpcy5GZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLmdiLnJlbW92ZUNoaWxkKHRoaXMucmEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMuSmQ9ITE7dHJ5e3RoaXMuYS5saSgpfWNhdGNoKGgpe310aGlzLkxkPSEwO3RoaXMuYS5JZSgpO3RoaXMuamM9ITE7dGhpcy5FZSgpLk9oKCk7dGhpcy5iLndiJiZ0aGlzLmIub3JpZ2luLmJmKCk7dGhpcy5iLnRjJiYoYT90aGlzLmIub3JpZ2luLnloKCk6dGhpcy53ZSgpKX1lbHNlIHRoaXMud2UoKX0sCktvOmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRmQodGhpcy52aWRlbyksdGhpcy5MZihhKSl9LExmOmZ1bmN0aW9uKGEpe3RoaXMuZWM9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5CLk5rKCk7dGhpcy5iLm9yaWdpbi5IZyh3LiRkKX0scGk6ZnVuY3Rpb24oKXtpZih0aGlzLnFvKXRoaXMuUGEoKTtlbHNle3RoaXMuamM9ITA7dGhpcy5hLmMud2EmJiF0aGlzLkxkJiZ0aGlzLmEuYy53YSgpJiZlLm8oay5CYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7CnRoaXMudW8oYSk7aWYoIXRoaXMuVWIpe3ZhciBjPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5VYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuVmQ9ITA7ZS5vKGsucmksdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpjLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2UuUGUodGhpcy5VYil9ZD0iIjt0aGlzLmIuQWYmJihjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVWgpKSYmKGQ9dGhpcy5iLkFmLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsCmQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5KZHx8KHRoaXMuSmQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuZmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLmIud2I/KHRoaXMuZWM9dGhpcy5nZD0hMSx0aGlzLkZkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnJhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSmQ9ITEsdGhpcy5hLmxpKCksdGhpcy5iLm9yaWdpbi5iZigpKTp0aGlzLlBhKCl9LmJpbmQodGhpcykpKSksYy5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLmRkLnJlcGxhY2UoIlt0aW1lXSIsZS5RZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLm5lPSEwOwp0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0saWk6ZnVuY3Rpb24oKXt0aGlzLkRofHwodGhpcy5EaD0hMCx0aGlzLnNkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sdW86ZnVuY3Rpb24oYSl7ZS5vKGsubGUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTthPT10aGlzLmppfHx0aGlzLkpifHwoMD09YSYmKHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkFiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuaWkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmlpKCl9LmJpbmQodGhpcykpLHRoaXMuSmJ8fAp0aGlzLldoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkIuJGEmJnRoaXMuVmEoInN0YXJ0IiksZS5vKGsuYmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSxlLm8oay5nZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi80KSYmKHRoaXMuQi4kYSYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuVmEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLnNkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS5vKGsuWmYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSwKZS5vKGsuZGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYi5kdXJhdGlvbi80KSYmKHRoaXMuQi4kYSYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuVmEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUubyhrLmhnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLHRoaXMuamk9YSl9LFZoOmZ1bmN0aW9uKGEsYyl7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGMsITApfSxVbjpmdW5jdGlvbigpe2UuUWQoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sV2g6ZnVuY3Rpb24oKXtlLlFkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFZuOmZ1bmN0aW9uKCl7ZS5RZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrCnRoaXMuV2EoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxVYTpmdW5jdGlvbihhKXtlLlFkKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFZhOmZ1bmN0aW9uKGEpeyh0aGlzLlBmfHx0aGlzLkIuJGEpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5XYSgpLCEwKX0sTmI6ZnVuY3Rpb24oYSxjKXt0aGlzLkIuJGEmJmUudHJhY2soInN0YXRzX2hkXyIrYSxjLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxjKXtpZighdGhpcy5KYil7dGhpcy5jZiYmdGhpcy5jZi50cmFjayYmdGhpcy5jZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmUueGUmJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPQohMH12YXIgZD1bXTt0cnl7ZD10aGlzLlBsKHRoaXMuYi5NYSxhKX1jYXRjaChmKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgaD1kLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmKHRoaXMucmU9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5LZC5pbXByZXNzaW9ucyYmZS5pbShoLnVybCx0aGlzLktkLmltcHJlc3Npb25zKT90aGlzLlZlKGgudXJsLGgudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLm8oay5xayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCkse2FkSWQ6dGhpcy5LZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5zKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuVmUoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWMpdHJ5e3RoaXMuYi5NYT10aGlzLmNsKHRoaXMuYi5NYSxhKX1jYXRjaChtKXt9fX0sV2E6ZnVuY3Rpb24oKXt2YXIgYT1lLlNhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLApjPSIiO3RoaXMuUGYmJihjPSJfdnBhaWQiKTt0aGlzLldjJiYoYz0iX3dlbGVjdCIpO3JldHVybiBhK2N9LFZlOmZ1bmN0aW9uKGEsYyxkLGYsZSl7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGM9dGhpcy5CLnZhKGEpLGQmJmMudWsoZCksZnx8KGY9dGhpcy5FZyksZXx8KGU9dGhpcy5FZyksdGhpcy53ayhhKSx0aGlzLkIuSWEoYyxmdW5jdGlvbigpe3RoaXMuTmgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5OaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sd2s6ZnVuY3Rpb24oYSl7dGhpcy5sY1thXT0ib3BlbiJ9LE5oOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09ImNsb3NlZCJ9LFZrOmZ1bmN0aW9uKCl7dGhpcy5sYz17fX0sWG46ZnVuY3Rpb24oKXt2YXIgYT0wLGM7Zm9yKGMgaW4gdGhpcy5sYyl0aGlzLmxjLmhhc093blByb3BlcnR5KGMpJiYib3BlbiI9PXRoaXMubGNbY10mJmErKztyZXR1cm4gYX0sUGw6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09CmN9KX0sY2w6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWN9KX0sSG86ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLklvLmJpbmQodGhpcykpfSxJbzpmdW5jdGlvbigpe2UuU2EoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMubmMoKTp0aGlzLmIuZGMmJihlLm8oay54Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkIuemN8fHRoaXMuV2MpYT0iX2JsYW5rIjt0cnl7dmFyIGM9d2luZG93Lm9wZW4oIiIsYSk7Yy5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2MuZG9jdW1lbnQubG9jYXRpb24uaHJlZj0KdGhpcy5iLmRjfWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYi5kYyxhKX19LmJpbmQodGhpcyksNTAwKSl9LEdvOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0KImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmRkLnJlcGxhY2UoIlt0aW1lXSIsZS5RZygwKSk7dmFyIGM9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5CLmpkJiYoYz10aGlzLkIuamQpO2MmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRGIuYmluZCh0aGlzKSwxRTMqYyk7dGhpcy5jYXB0aW9uPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSl9fSxEYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5CLmpkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxIZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5CLmpkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sbmk6ZnVuY3Rpb24oYSl7aWYoIWUuRGYodGhpcy5jb250cm9scykpe3ZhciBjPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy4kazt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5IZCgpfS5iaW5kKHRoaXMpKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5LYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmZpLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5laS5iaW5kKHRoaXMpKSxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmVpLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5IZCgpfS5iaW5kKHRoaXMpKTsKZi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkViKCk7dGhpcy5EYigpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihoLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGguc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixoLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuSWI7aC5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9oLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnNvLmJpbmQodGhpcykpOmguYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucm8uYmluZCh0aGlzKSk7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSGQoKX0uYmluZCh0aGlzKSk7CmguYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuVWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChmKTt0aGlzLmIuQWYmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChoKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuU2EoKXx8KHRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLkhkKCl9LmJpbmQodGhpcykpLHRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChkKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsCmMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIsYy5zdHlsZS5kaXNwbGF5PSJub25lIixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGQub25lcnJvcj1mdW5jdGlvbigpe3RoaXMueGEmJih0aGlzLnhhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksZC5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApjLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnhhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5hLmpnKGZ1bmN0aW9uKGEpe3RoaXMueGEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoZS5vKGsueWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLmFmKCkpO3RoaXMuRWIoKX19LEViOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sbmM6ZnVuY3Rpb24oKXsiaGlkZGVuIj09dGhpcy5jb250cm9scy5zdHlsZS52aXNpYmlsaXR5fHx0aGlzLnhhJiYiYmxvY2siPT10aGlzLnhhLnN0eWxlLmRpc3BsYXl8fHRoaXMuUWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGVpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5hLkEucGF1c2VkPwoodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5iZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5BLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLm8oay5qZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkViKCksdGhpcy5EYigpKSl9LGZpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5xYz8oZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJwbGF5IiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnFjPSExKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkViKCksdGhpcy5EYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMucWM9ITApfSxCZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYS5BLnBhdXNlZHx8KHRoaXMuYS5BLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLm8oay5qZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sUWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQS5wYXVzZWQmJih0aGlzLmEuQS5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsCiEwKSxlLm8oay5iZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0scm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKTt0aGlzLmEuQS5tdXRlZD8odGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5OYigidW5tdXRlZCIsInVzZXIiKSxlLm8oay5IZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKToodGhpcy5hLkEubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHNvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy51Yj8oZS5pYSh0aGlzLkMsCiJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJtdXRlIiksdGhpcy51Yj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxhZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMuYS5BLm11dGVkfHwodGhpcy5hLkEubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHdvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy5hLkEubXV0ZWQmJih0aGlzLmEuQS5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLAohMCksdGhpcy5OYigidW5tdXRlZCIsImNvbnRlbnQiKSxlLm8oay5IZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sbWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5tYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5tYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMpO3RoaXMubmR8fHRoaXMubmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNmKCkpfSx3ZTpmdW5jdGlvbigpe3RoaXMucm0oKSYmdGhpcy5xbSgpJiYodGhpcy5CLnNjfHwic3BpZWdlbC5kZSI9PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYicHJlcm9sbCI9PWUuR2ImJnRoaXMudm8oKXx8KHRoaXMubmQ9ITAsdGhpcy54YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy54YiksdGhpcy54Yj0hMSksdGhpcy56ZygpKX0scm06ZnVuY3Rpb24oKXt2YXIgYT0KZS5xZCgpO3JldHVybiB0aGlzLkIuVmImJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0scW06ZnVuY3Rpb24oKXt2YXIgYT0hMSxjPW0uZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciIT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcnx8dGhpcy5lZnx8KGE9ITAsYy5hZEZhbGxiYWNrVVJMfHwoYy5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3JldHVybihhfHwhdGhpcy5yZSYmYy5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuZWZ9LEVsOmZ1bmN0aW9uKCl7dmFyIGE9bS5nZXRDb25maWcoKS5hZEZhbGxiYWNrVVJMLGM9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthfHwic3ZtcHJldmlldyIhPWMuYW5jaG9yfHwoYT0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpO3JldHVybiBhfSx2bzpmdW5jdGlvbigpe20uZ2V0Q29uZmlnKCk7CnRoaXMuZWY9dGhpcy5XYz10aGlzLlFmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0Iix0aGlzLldhKCksITApO3RoaXMucmU9ITA7dmFyIGE9dGhpcy5FbCgpLGE9ZS5tZyhhLHRoaXMuQiwhMSx7b25seVVSTDohMH0pO2lmKCFhKXJldHVybiExO3RoaXMuV2UoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KTtyZXR1cm4hMH0semc6ZnVuY3Rpb24oYSl7dGhpcy5YbigpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemcoITApfS5iaW5kKHRoaXMpLHRoaXMuUm0pOih0aGlzLkxkPSEwLHRoaXMuYS5JZSgpLHRoaXMuYS51bigpLHRoaXMuamM9ITEsZS5vKGsuWmssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLkVlKCkuT2goKSl9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmEmJnRoaXMuYS5jJiYoYT10aGlzLmEuYyk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GYSgibWluVmlzIik7CmEmJihlLk9lKHRoaXMudmlkZW8sYSk/dGhpcy5RaCgpOnRoaXMuQmQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5kYyxhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi53Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnZjJiYwPHRoaXMudmMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnZjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LHM6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLkdrKyItIit0aGlzLkJmO3RoaXMuYiYmdGhpcy5iLlhnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPQp0aGlzLmIuWGcoKSk7cmV0dXJuIGF9LEVnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy5hanx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWE9Yy5DbXx8UWE7bmV3IFFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5sYT1udWxsO3RoaXMuVj1bXTt0aGlzLko9bnVsbDt0aGlzLnVjPXRoaXMud2M9ITE7dGhpcy5tYT0iIjt0aGlzLk9mPSExO3RoaXMuaGg9IiI7ZCYmZC5lbXB0eT90aGlzLkFtKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfQp2YXIgYj0wLGcsZD1bXTtjLmFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnFkKCksYjtiPWUudGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEEodGhpcy51cmwpOm0udmEobS5NZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0uYmluZCh0aGlzKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIGUuRigibWFydGhhc3Rld2FydC5jb20iKXx8ZS5GKCJmYW5kb20uY29tIil8fGUuRigiZ2lnYS5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImRlc2lyZWQuZGUiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxnKCkpe3ZhciBoPWUuQmcodGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbX0uYmluZCh0aGlzKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8aC5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIil9LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpJiYwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil9LmJpbmQodGhpcyksbD1mdW5jdGlvbigpe3JldHVybiAwPT09CmguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTtpZihkKCl8fGcoKXx8aygpfHwiYXBwc3BvdCI9PWMpbCgpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0uTWQoaCkpKyImdHlwZT1qcyIsYj1tLnZhKG0uTWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiLGUudHJhY2soInN0YXRzX2hkX2FkeCIsIiIsITApKTpiPW0udmEobS5NZChoKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJgooYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLklhKGIsdGhpcy56bS5iaW5kKHRoaXMpLHRoaXMud20uYmluZCh0aGlzKSl9LFNnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLmxhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5HYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuR2J8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkdifHx0aGlzLm9tKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxtLmNvKCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7CnZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2RbYl09Zy5maXJzdENoaWxkO2MucHVzaChnKX1jYXRjaChoKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LG9tOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sCmM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0sem06ZnVuY3Rpb24oYSl7dGhpcy5jbihhKTt0cnl7dGhpcy5sYT1hLnJlc3BvbnNlWE1MLHRoaXMubGF8fCh0aGlzLmxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuUWEody5lZSkpfXRoaXMuVj0KdGhpcy5TZygpO3RoaXMud2M9dGhpcy5FZigpO3RoaXMudWM9dGhpcy5haSgpO3RoaXMuaGg9YS51cmxDYWxsZWQ7aWYodGhpcy5WLmxlbmd0aCl0aGlzLk9jKCk7ZWxzZXt0aGlzLnFhKHRoaXMuUWEody5ZYyx7ZXJyb3I6dGhpcy5PZj9ELmNlOkQuVGZ9KSk7dHJ5e2UudHJhY2soInN0YXRzX2hkX210eXVybCIsZS5DYih0aGlzLm1hKSwhMCl9Y2F0Y2goYyl7fX19LEFtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuUWEody5lZSkpfXRoaXMuVj10aGlzLlNnKCk7dGhpcy53Yz10aGlzLkVmKCk7dGhpcy51Yz10aGlzLmFpKCk7dGhpcy5WLmxlbmd0aD90aGlzLk9jKCk6dGhpcy5xYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuT2Y/RC5jZTpELlRmfSkpfSx3bTpmdW5jdGlvbigpe3RoaXMucWEodGhpcy5RYSh3LlNmLHtkZXB0aDpifSkpfSwKT2M6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5WLnNoaWZ0KCk7dGhpcy5zbSgpP3RoaXMubW8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5iaCgpLGcse0FkU3lzdGVtOnRoaXMud2woKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5xYSh0aGlzLlFhKHcuVmYpKTooYj0wLHRoaXMuem8oKSYmdGhpcy5oZih0aGlzLmJsKCkpKX0sYmY6ZnVuY3Rpb24oKXt0aGlzLndjPyh0aGlzLndjPTE8dGhpcy5WLmxlbmd0aCx0aGlzLlYubGVuZ3RoJiZ0aGlzLk9jKCkpOnRoaXMucGFyZW50LmJmKCl9LHloOmZ1bmN0aW9uKCl7dGhpcy51Yz8odGhpcy51Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5PYygpKTp0aGlzLnBhcmVudC55aCgpfSx6bzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmpvKCk/dGhpcy5pbygpPyEwOigtMSE9dGhpcy5HYygpP3RoaXMucWEodGhpcy5RYSh3LlhkKSk6dGhpcy5xYSh0aGlzLlFhKHcuUmYpKSwhMSk6KHRoaXMucWEodGhpcy5RYSh3LlljLApELlVmKSksITEpfSxoZjpmdW5jdGlvbihhKXt0aGlzLm1hfHwodGhpcy5tYT0iIik7YS5XZHx8KGEuV2Q9W10pO2EuV2QucHVzaCh0aGlzLmhoKTthLk1hPWEuTWEuY29uY2F0KHRoaXMuWWUoKSk7YS53Yj1hLndiP2Eud2I6dGhpcy53YzthLnRjPWEudGM/YS50Yzp0aGlzLnVjO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLm1hLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5PZzt0aGlzLnBhcmVudC5oZihhKX0sYmw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgUmE7dGhpcy5tYXx8KHRoaXMubWE9IiIpO2EuZHVyYXRpb249dGhpcy5HYygpO2EuTT10aGlzLlpnKCk7YS5kYz10aGlzLnpsKCk7YS5rcT1bXTthLm9yaWdpbj10aGlzO2EudT10aGlzLnZsKCk7YS5BZj10aGlzLk5sKGEuZHVyYXRpb24pO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLm1hLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5PZztyZXR1cm4gYX0scWE6ZnVuY3Rpb24oYSl7dGhpcy5tYXx8Cih0aGlzLm1hPSIiKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5tYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuT2c7aWYoIXRoaXMuSiYmdGhpcy5sYSYmdGhpcy5sYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj10aGlzLmxhO3RyeXtpZih0aGlzLkomJnRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGM9ITE7KGM9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmYy5sZW5ndGgmJmUudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChkKXt9fXRoaXMuSiYmKGEuTWE9YS5lcnJvci5jb2RlIT13LlhkLmNvZGU/YS5NYS5jb25jYXQodGhpcy5BbCgpKTphLk1hLmNvbmNhdCh0aGlzLkpsKCkpKTt0aGlzLlYubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuZmMmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5mYyYmdGhpcy5wYXJlbnQuZmMoYSksYj0wLHRoaXMuT2MoKSk6Cih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucWEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5xYSYmdGhpcy5wYXJlbnQucWEoYSksYj0wKX0sZmM6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuZmMoYSl9LEhnOmZ1bmN0aW9uKGEsYil7dGhpcy5xYSh0aGlzLlFhKGEsYikpfSxRYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBTYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LG1vOmZ1bmN0aW9uKCl7cmV0dXJuIGI8Z30sam86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlpnKCkubGVuZ3RofSxpbzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuR2MoKX0sRWY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlYuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxhaTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuViYmMjw9dGhpcy5WLmxlbmd0aCYmCiF0aGlzLkVmKCkmJihhPSEwKTtyZXR1cm4gYX0sY246ZnVuY3Rpb24oYSl7dGhpcy5tYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLm1hPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMubWE9IlVOS05PV04ifXRyeXt0aGlzLk9mPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5iaCgpLmxlbmd0aH0sYmg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5EZSh0aGlzLkosIlZBU1RBZFRhZ1VSSSIpfSx3bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRlKHRoaXMuSiwiQWRTeXN0ZW0iKX0sWWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMub2goYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMubGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxvaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLm9oKGEucGFyZW50Tm9kZSk6ITF9LEpsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LEFsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx6bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxPYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksRXA6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMubGIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuT2F8fDFFMzt0cnl7dmFyIGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLApiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksYj1nLmNvbmNhdChlKX1jYXRjaChoKXt9cmV0dXJuIGJ9LHZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMudWQoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LEdjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMubGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sTmw6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5SbihkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LERlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5sYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sR2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGxiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMudWQoYSk6IiJ9LHVkOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLkdlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5ha3x8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmxqfHxUYTtuZXcgVGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLk1hPVtdO3RoaXMuTT1bXTt0aGlzLmRjPSIiO3RoaXMudT10aGlzLnRjPXRoaXMud2I9ITE7dGhpcy5LZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuTGU9IiJ9Yy5Kaj1hO2EucHJvdG90eXBlPXtXazpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk0ubGVuZ3RoO2MrKylpZigwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxIbDpmdW5jdGlvbigpe2lmKCF0aGlzLktlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ubGEpe3ZhciBhPXRoaXMub3JpZ2luLmxhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYz0iIixkPTA7ZDxhLmxlbmd0aDtkKyspKGM9YVtkXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1jLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLktlPWFbZF0pfXJldHVybiB0aGlzLktlfSxYZzpmdW5jdGlvbigpe2lmKHRoaXMuTGUpcmV0dXJuIHRoaXMuTGU7dmFyIGE9IiI7KGE9dGhpcy5IbCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuTGU9YX0sUmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk1bY107cmV0dXJuIGF9fX0pKGMpO3ZhciBSYT1jLkpqfHxSYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLkxpfHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHc9e2VlOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLExhOiJYTUxfUEFSU0VfRVJST1IifSxSZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTGE6IkRVUkFUSU9OX0VSUk9SIn0sWWM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLExhOiJFTVBUWV9WQVNUIn0sVmY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCkxhOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxTZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixMYToiTE9BRF9FUlJPUiJ9LCRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixMYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LAplcDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixMYToiTUVESUFGSUxFX0VSUk9SIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTGE6IkRVTU1ZX0FEIn19LEQ9e1RmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTGE6Ik5PX0FEUyJ9LFVmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixMYToiTk9fTUVESUFGSUxFUyJ9LGZwOnt0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLExhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sY2U6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTGE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlvPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIFZhPWMueW98fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5lcnJvcj1hO3RoaXMucGQ9Yzt0aGlzLk1hPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5PaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFNhPWMuT2l8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5OaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdhPWMuTml8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5QaD1hO3RoaXMudmlkZW89Yzt0aGlzLlRkPVtdO3RoaXMuTWg9W107dGhpcy5kZj1bXTt0aGlzLkpvPQoibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSygpfWMuZ3A9YTthLnByb3RvdHlwZT17SzpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5QaC5sZW5ndGg7YSsrKXt2YXIgYz10aGlzLlBoW2FdLGQ9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtoLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaCk7dmFyIGs9aC5jb250ZW50V2luZG93O2suWnA9CntyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLnJuLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmhuLmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1kO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5UZC5wdXNoKHtzcmM6ZCxmcmFtZTpoLFNtOmUsdmVuZG9yOmMuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTA7Yzx0aGlzLmRmLmxlbmd0aDtjKyspe3ZhciBkPXRoaXMuZGZbY107ZC50eXBlPT09YSYmZC5Jayh0aGlzLkJsKGEpKX19LApCbDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntpcTohMCxocTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntWcDoidmlkZW8iLGxxOiJqc0N1c3RvbSIsbXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxucToxLEZwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sClFsOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5UZC5sZW5ndGg7YysrKWlmKHRoaXMuVGRbY10udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5UZFtjXS5TbTtyZXR1cm4iIn0scm46ZnVuY3Rpb24oYSxjKXt0aGlzLk1oLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLlFsKGMpLHZlbmRvcjpjfSk7dGhpcy5UbigpfSxobjpmdW5jdGlvbihhLGMpeyJ2aWRlbyI9PT1hP3RoaXMuSm8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMua2coYSxjKX0uYmluZCh0aGlzKSk6dGhpcy5rZyhhLGMpfSxrZzpmdW5jdGlvbihhLGMpe3RoaXMuZGYucHVzaCh7dHlwZTphLElrOmMsZnE6ITF9KX0sVG46ZnVuY3Rpb24oKXt0aGlzLk1oLm1hcChmdW5jdGlvbihhKXthLmxtfHwoYS5ZcCh7YWRTZXNzaW9uSWQ6ZS5YKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5qcSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLAphLmxtPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy50bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPWMudG18fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5jb25mPWN8fHt9O3RoaXMuYz1hO3RoaXMua2I9YS5UZygpO3RoaXMuST1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkkuaWQ9ZS5YKDEwKTt0aGlzLkE9Qi5wb3AoKTt0aGlzLkF8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5OYT17fTt0aGlzLmxnPSExOwp0aGlzLmFjPVtdfWMuS2k9YTthLnByb3RvdHlwZT17dWw6ZnVuY3Rpb24oYSl7dmFyIGM9e30sZD0hMSxlPTAsYz0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihjPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD0iZml4ZWQiLGU9Yy5sZWZ0LGM9Yy50b3ApO2g9e3g6ZSx5OmN9O2gucG9zaXRpb249ZDtyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy51bChhKTtmb3IodmFyIGM9MCxkPTAsZT0hMSxoPXRoaXMuWmwoYSksaz17fTthOyljKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGQrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7aCYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCwKYys9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsZCs9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpjLHk6ZH07ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LCRuOmZ1bmN0aW9uKCl7dGhpcy5sZz0hMH0sbGk6ZnVuY3Rpb24oKXt0aGlzLkE9Qi5wb3AoKTt0aGlzLkF8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LEVoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7ZS5vKGsuQmMsdGhpcy5jLmwoKSl9LHVuOmZ1bmN0aW9uKCl7dGhpcy5sZ3x8Cih0aGlzLmMucGxheSgpLGUubyhrLm1kLHRoaXMuYy5sKCkpKX0seWY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSS5zdHlsZS56SW5kZXg9YTt0aGlzLkkuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5JLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkkuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkkuc3R5bGUuYm94U2l6aW5nPXRoaXMua2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuSS5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PXRoaXMua2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkEuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmtiKTsKdGhpcy5jLlJjJiZ0aGlzLmMuUmMoKT90aGlzLmMuVGcoKS5hcHBlbmRDaGlsZCh0aGlzLkkpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5JKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhjLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSxabDpmdW5jdGlvbihhKXtmb3IodmFyIGM9d2luZG93LmdldENvbXB1dGVkU3R5bGUsZD0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGMmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7ZD0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gZH0sc2w6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5nZXRQb3NpdGlvbihhKTtjLnBvc2l0aW9uP2MucG9zaXRpb249Yy5wb3NpdGlvbjpjLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yy53aWR0aD1hLm9mZnNldFdpZHRoO2MuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0OwpyZXR1cm4gY30saGM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5zbCh0aGlzLmtiKTtpZihjLnghPXRoaXMuTmEueHx8Yy55IT10aGlzLk5hLnl8fGMucG9zaXRpb24hPXRoaXMuTmEucG9zaXRpb258fGMud2lkdGghPXRoaXMuTmEud2lkdGh8fGMuaGVpZ2h0IT10aGlzLk5hLmhlaWdodHx8YSl7aWYoMDx0aGlzLk5hLndpZHRoJiYwPHRoaXMuTmEuaGVpZ2h0JiYwPT1jLndpZHRoJiYwPT1jLmhlaWdodCl7dGhpcy5JZSgpO3JldHVybn10aGlzLk5hPWM7dGhpcy5jLlJjKCk/KHRoaXMuSS5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSS5zdHlsZS50b3A9IjBweCIpOih0aGlzLkkuc3R5bGUubGVmdD1jLngrInB4Iix0aGlzLkkuc3R5bGUudG9wPWMueSsicHgiKTt0aGlzLkkuc3R5bGUud2lkdGg9Yy53aWR0aCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9Yy5oZWlnaHQrInB4Ijt0aGlzLkkuc3R5bGUucG9zaXRpb249Yy5wb3NpdGlvbjt0aGlzLkEuc3R5bGUud2lkdGg9Yy53aWR0aCsicHgiOwp0aGlzLkEuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuYWMubGVuZ3RoO2ErKyl0aGlzLmFjW2FdKHt3aWR0aDpjLndpZHRoLGhlaWdodDpjLmhlaWdodH0pfWUuRGYodGhpcy5JKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0samc6ZnVuY3Rpb24oYSl7dGhpcy5hY3x8KHRoaXMuYWM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmFjLnB1c2goYSl9LEllOmZ1bmN0aW9uKCl7dGhpcy5JJiZ0aGlzLkkucGFyZW50Tm9kZSYmdGhpcy5JLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSSk7dGhpcy5BJiZ0aGlzLkEucGF1c2UmJnRoaXMuQS5wYXVzZSgpfX19KShjKTtmb3IodmFyIFlhPWMuS2l8fFlhLEI9W10sWmE9MDsxMDA+WmE7WmErKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPQplLlgoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGJhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgJGE9Yy5UaXx8JGE7bmV3ICRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwKKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlQoYik7dGhpcy5HZChhKTt0aGlzLkNnKCl9LEdkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2EoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiYKYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsYz10aGlzLkdhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWMpYS5jb250YWluZXJJZD1jLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTt2YXIgYWI9Yy5Eanx8YWI7KGZ1bmN0aW9uKGMpe2MuQ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWNhKCk7dGhpcy5ZYj10aGlzLllifHwhMTt0aGlzLmNnPXRoaXMuZWc9CnRoaXMubGg9dGhpcy51YT10aGlzLkdmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucWwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLkdmPSEwO3RoaXMubGgmJnRoaXMudWcoKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5GYjthJiZhLmpjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMua2QoKTt0aGlzLmxoPSEwO3RoaXMudWcoKX0uYmluZCh0aGlzKSk7CnRoaXMucGcoKX0sdWc6ZnVuY3Rpb24oKXtpZighdGhpcy5ZYil7dGhpcy5rZCgpO2lmKCF0aGlzLkdmJiYhdGhpcy5rZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuR2YmJnRoaXMuY2cmJiF0aGlzLmVnJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApfX0sa2Q6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LCRnOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGIubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1iLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YSlyZXR1cm4gZC5pbnN0YW5jZX19LHBnOmZ1bmN0aW9uKCl7aWYodGhpcy5rZCgpKXt2YXIgYT0KdGhpcy4kZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLmVnPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMuY2c9YS5DcH10aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZygpfS5iaW5kKHRoaXMpLDEwMCl9LEdwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLlRwKCk6ITF9LEdjOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5HYygpOi0xfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxxbDpmdW5jdGlvbihhLGIpe3RoaXMuWWI9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuWWJ8fDMwMj09dGhpcy5ZYj90aGlzLnVhPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5ZYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksMTAwKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMudWE/KHRoaXMudygpLHRoaXMub2EoKSk6YS5NZSgpPyh0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLktsKGEpPyh0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGJiPWMuQ2p8fGJiOyhmdW5jdGlvbihjKXtjLkVqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbm06ZnVuY3Rpb24oKXt3aW5kb3cuT08uTmoubmsubGs/d2luZG93Lk9PLk5qLm5rLmxrLkFwKGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ubSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBhPWNhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkZlKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPW5ldyBhYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgYmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIGNiPWMuRWp8fGNiLGRiPW5ldyBjYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMub289YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBlYj1jLm9vfHxlYjtuZXcgZWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMTt0aGlzLmRoKCl9LGRoOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTthJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRoKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sS2E6ZnVuY3Rpb24oKXt0aGlzLkhoKCl9LEhoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5VJiYoMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhoKCl9LmJpbmQodGhpcyksMTAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZmI9Yy5GaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuRWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0scmc6ZnVuY3Rpb24oYSl7dmFyIGI9CmEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLm9hKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMub2EoKTp0aGlzLmcoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMucmcoYS5hZEVycm9yRXZlbnRzKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5yZyhhKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGdiPWMuRWl8fGdiOyhmdW5jdGlvbihjKXtjLkdpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sS2g6ZnVuY3Rpb24oYSl7YT1uZXcgZmIoYSk7YS5qYT90aGlzLlAoKTp0aGlzLkwoYSl8fChhLkdkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLk4oYSksKG5ldyBnYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLnJsfHwodGhpcy5ybD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuS2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLktoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7CnRoaXMuUCgpfX0pfSkoYyk7dmFyIGhiPWMuR2l8fGhiLFM9bmV3IGhiKHIpO1MuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5obD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGliPWMuaGx8fGliO25ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLksuYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LFJjOmZ1bmN0aW9uKCl7dmFyIGE9bDtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFQ9Yy5Xanx8VDsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LmNkKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7CnguY2QoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5QbShhKX0uYmluZCh0aGlzKSk7eC5jZCgiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRCgpfS5iaW5kKHRoaXMpKTt4LmNkKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5VbCgpfSxQbTpmdW5jdGlvbihhKXt2YXIgYj0iIixjO2ZvcihjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSl7Yj1pc05hTihhW2NdKT8hMTphW2NdO2lmKDEwMDk9PWFbY118fDEwMDE9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKXt0aGlzLncoKTt0aGlzLm9hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBhW2NdKWlmKGFbY10uaGFzT3duUHJvcGVydHkoZCkmJihiPWlzTmFOKGFbY11bZF0pPyExOmFbY11bZF0sMTAwOT09YVtjXVtkXXx8CjEwMDE9PWFbY11bZF18fDMwMz09YVtjXVtkXXx8NDAzPT1hW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5vYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkQoKX19KX0pKGMpO3ZhciBVPWMuVmp8fFU7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxiLmxlbmd0aDtjKyspYS5wdXNoKGJbY10pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspYS5wdXNoKGJbY10pO3RoaXMuQWQmJihhPWUuZGwoYSx0aGlzLkFkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFQoZCk7aWYoIXRoaXMuTChkKSl7dGhpcy5OKGQpOwp2YXIgZj1uZXcgVShkLHRoaXMuRyk7Zi5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGM9YVtiXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuQWR8fCh0aGlzLkFkPVtdKSx0aGlzLkFkLnB1c2goYVtiXSksZD1uZXcgVChoKSx0aGlzLkwoZCl8fCh0aGlzLk4oZCksZj1uZXcgVShkLHRoaXMuRyksZi5mKCkpfWNhdGNoKGspe319fXRoaXMuUCgpfSxjZDpmdW5jdGlvbihhLGIsYyl7dGhpcy5hYXx8KHRoaXMuYWE9e30pO3RoaXMuYWFbYV18fCh0aGlzLmFhW2FdPXt9KTt0aGlzLmFhW2FdW2JdfHwodGhpcy5hYVthXVtiXT1bXSk7dGhpcy5hYVthXVtiXS5wdXNoKGMpfSxubzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmFhfHx0aGlzLmFhJiYhdGhpcy5hYVtiXSl0aGlzLk5jfHwKKHRoaXMuTmM9W10pLHRoaXMuTmMucHVzaChhKSx0aGlzLnRuKCkmJih0aGlzLnBmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoYz1hLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbYl1bY10mJjA8dGhpcy5hYVtiXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmFhW2JdW2NdLmxlbmd0aDtkKyspdGhpcy5hYVtiXVtjXVtkXShhKX19LFVsOmZ1bmN0aW9uKCl7aWYodGhpcy5OYylmb3IodmFyIGE9MDthPHRoaXMuTmMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5OY1thXSxjPWIuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoZD1iLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbY11bZF0mJjA8dGhpcy5hYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmFhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5hYVtjXVtkXVtlXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT0KYS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ4Lm5vKGEpfX0pfSkoYyk7dmFyIGpiPWMuWGp8fGpiLHg9bmV3IGpiKHIpO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2I9Yy5ibnx8a2I7bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVyhiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0sd2E6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBsYj1jLkJpfHxsYjsoZnVuY3Rpb24oYyl7Yy5DaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKJCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkQoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwphLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbWI9Yy5DaXx8Cm1iOyhmdW5jdGlvbihjKXtjLkRpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbGIoZCk7dGhpcy5MKGgpfHwodGhpcy5OKGgpLChuZXcgbWIoaCx0aGlzLkcpKS5mKCkpfWNhdGNoKGspe319dGhpcy5QKCl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5KYSlpZihiPT10aGlzLkphW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuRGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBwYj1jLk1pfHxwYjtuZXcgcGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLndnPXRoaXMuRWM9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dmFyIGI9dGhpcy5KZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuRWM9Yik7aWYoIXRoaXMud2cmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fAphLnNvdXJjZS5DSE9PU0VSX0FCKSl7dmFyIGM9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixhLnNvdXJjZS5DSE9PU0VSX0FCfHwiIiwhMCk7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixjLCEwKTt0aGlzLndnPSEwfX19Y2F0Y2goaCl7fX0uYmluZCh0aGlzKSk7dGhpcy5WZygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuZ24odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSxWZzpmdW5jdGlvbigpe2lmKHRoaXMuRWMpcmV0dXJuIHRoaXMuRWM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuSmcoYSkpcmV0dXJuIHRoaXMuRWM9CmF9fSxKZzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiZhLnZpZGVvU2xvdCYmKGI9YSk7YSYmYS5oZHZwYWlkJiYoYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sZ246ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5wYXVzZSYmdGhpcy5lYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5yZXN1bWUmJnRoaXMuZWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiYKdGhpcy5lYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5tdXRlJiZ0aGlzLmVhLm11dGUoKX0uYmluZCh0aGlzKSk7YSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEudW5tdXRlJiZ0aGlzLmVhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sbWg6ZnVuY3Rpb24oYSl7dGhpcy5lYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcWI9Yy55anx8cWI7KGZ1bmN0aW9uKGMpe2MueGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLnRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLnRpJiYodGhpcy5nKCksdGhpcy50aT0hMCx0aGlzLmthKCkpOwpiLkdhKCkuYWRkRXZlbnRMaXN0ZW5lcihhLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuVmcoKT90aGlzLkQoKToodGhpcy55ZXx8KHRoaXMueWU9MSksdGhpcy55ZSsrLDEwMDx0aGlzLnllP3RoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgcmI9Yy54anx8cmI7KGZ1bmN0aW9uKGMpe2Muemo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBhPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyBxYihhW2RdKSx0aGlzLkwoYyl8fCh0aGlzLk4oYyksKG5ldyByYihjLHRoaXMuRykpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTsKdmFyIHNiPWMuemp8fHNiLFY9bmV3IHNiKHIpO1YuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5RbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRiPWMuUW18fHRiO25ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmZrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LEthOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5VPygwLHRoaXMuVSkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuZmt8fHViOyhmdW5jdGlvbihjKXtjLmVrPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEljOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSwKYT1hLmdldFJhd1BsYXllcigpO3JldHVybiBhLmltYUFkc0xvYWRlcn0sZW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMub2EoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuZygpO3RoaXMuZ2V0UGxheWVyKCk7CnRoaXMuQmE/dGhpcy5lbih0aGlzLkJhKToodGhpcy5CYT10aGlzLkljKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuRCgpO3JldHVybn1pZighdGhpcy54Yyl7dGhpcy5EKCk7cmV0dXJufWE9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmViLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmViW2JdJiYzMDMhPXRoaXMuZWJbYl0mJjQwMyE9dGhpcy5lYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMub2EoKTtlbHNle3RoaXMuRCgpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMuZWt8fHZiOyhmdW5jdGlvbihjKXtjLmdrPQp0LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLlRhPS0xO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGM9bmV3IHViKGEuaXRlbShiKSk7dGhpcy5MKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGMpLChuZXcgdmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHdiPWMuZ2t8fHdiLHhiPW5ldyB3YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB5Yj1jLmJtfHx5YjtuZXcgeWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Saj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuamY9ITF9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLldtKCl9LmJpbmQodGhpcyksNTAwKX0sV206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5VJiZ0aGlzLlUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksCmI9MDthLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYj1hLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuamYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuamYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXbjpmdW5jdGlvbigpe3RoaXMuamY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciB6Yj1jLlJqfHwKemI7KGZ1bmN0aW9uKGMpe2MuUWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLnBjPTB9LGY6ZnVuY3Rpb24oKXt0aGlzLkVtPTEwO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5wY3x8KHRoaXMucGM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5nKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8Cih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKToodGhpcy5wY3x8dGhpcy5wYysrLHRoaXMucGM8PXRoaXMuRW0/KHRoaXMucGMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAo1MDApKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5XbigpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQWI9Yy5Ranx8QWI7KGZ1bmN0aW9uKGMpe2MuU2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgemIod2luZG93LnBsYXllckFwaSksdGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgQWIoYSwKdGhpcy5HKSkuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgQmI9Yy5Tanx8QmIsQ2I9bmV3IEJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIERiPWMueG98fERiO25ldyBEYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0iIjthLmN1cnJlbnRUaW1lJiYoYj1hLmN1cnJlbnRUaW1lKTtyZXR1cm4gYn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sS2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5VKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEViPWMuUGp8fEViOyhmdW5jdGlvbihjKXtjLk9qPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5HYSgpLGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZztiJiZiLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7YS5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuWGsoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5CYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMudW0oKTp0aGlzLnRnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFnKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5nKCEwKSl9LmJpbmQodGhpcyksCjFFMyl9LFhrOmZ1bmN0aW9uKCl7dGhpcy5hZygpfHx0aGlzLmcoITApfSx1bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQmIoKTshYS5uYSYmYS5WJiZhLnpwJiZhLkJwJiYodGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZygpKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7YS5hZHNMb2FkZXI/YS5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBjO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihjIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2NdKXtjPWFbY107YnJlYWsgYX1jPXZvaWQgMH0xMDA5PT1jfHwzMDM9PWN8fDQwMz09Yz8odGhpcy53KCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZygpfS5iaW5kKHRoaXMpLDEwMCl9LEJiOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2gpZm9yKHZhciBhPQpjLlpjLkJiKCksYj10aGlzLmdldFBsYXllcigpLkdhKCkuaWQsZT0wO2U8YS5sZW5ndGg7ZSsrKWFbZV0uaWQ9PWImJih0aGlzLkNoPWFbZV0pO3JldHVybiB0aGlzLkNofSxVcDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxnOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2E/dGhpcy5CYigpLmFkc0xvYWRlcj90aGlzLkQoITApOnRoaXMuRCgpOnRoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBGYj1jLk9qfHxGYjsoZnVuY3Rpb24oYyl7Yy5aYz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFBrOmZ1bmN0aW9uKGEpe2E9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgRmIoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Yy5aYy5CYigpO2lmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXRoaXMuUGsoYVtiXSk7dGhpcy5QKCl9fSk7Yy5aYy5CYj1mdW5jdGlvbigpe3ZhciBhPVtdO2lmKGwmJmwucGxheWVyYXBpJiYoYT1sLnBsYXllcmFwaSgpKSYmYS5sZW5ndGgpcmV0dXJuIGE7dmFyIGE9W10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSwKYltjXSYmYltjXS5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kJiZhLnB1c2goYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCksYltjXSYmYltjXS5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuZmVybW9kJiZhLnB1c2goYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuZmVybW9kKTtpZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgR2I9Yy5aY3x8R2IsSGI9bmV3IEdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEliPWMuJGl8fEliO25ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnVqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCks6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RSYmKGE9YS5maXJzdENoaWxkKTtpZihhKXt0aGlzLlQoYSk7aWYoYS50YWdOYW1lKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1iP3RoaXMuVyhiKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxTcDpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe2lmKEUpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmIWEucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxSYzpmdW5jdGlvbigpe3JldHVybiEwfSxHYTpmdW5jdGlvbigpe3ZhciBhO0U/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFc9CmMudWp8fFc7KGZ1bmN0aW9uKGMpe2MudGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMua2Y9IiI7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthJiYodGhpcy5rZj1hLmlkKTtFP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYz1hLnBsYXllckNvbnRhaW5lcjtjJiZ0aGlzLmtmJiZjIT10aGlzLmtmfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuRigidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEuJHApLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJgoodGhpcy5tKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFg9Yy50anx8WDsoZnVuY3Rpb24oYyl7Yy52aj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRSlmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBXKGEpLGEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBYKGEsdGhpcy5HKSxhLmYoKSl9ZWxzZSBpZihhPQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYT1uZXcgVyhhKSxhLmphP3RoaXMucGYoKTp0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIEUsSmI9Yy52anx8SmIsS2I9bmV3IEpiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBMYj1jLlVtfHxMYjtuZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5ZaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLApjPWEuR2V0RWwoKSxiJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLlooKSk6dGhpcy5aKCk6dGhpcy5aKCk6dGhpcy5aKCl9LHduOmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LHdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxYcDpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBNYj1jLllpfHxNYjsoZnVuY3Rpb24oYyl7Yy5YaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5xZygpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMua2EoKX0uYmluZCh0aGlzKSl9LHFnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj1hLkdldEFkRXJyb3JzQ2FjaGUoKSxjPTA7YzxiLmxlbmd0aDtjKyspdGhpcy5oYW5kbGVFcnJvcihiW2NdKTthLkNsZWFyQWRFcnJvcnNDYWNoZSgpfSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhKXtpZihudWxsPT0KYSl0aGlzLnFnKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuZygpKX19LGc6ZnVuY3Rpb24oYSl7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIE5iPWMuWGl8fE5iOyhmdW5jdGlvbihjKXtjLlppPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcms7YXx8KGE9d2luZG93LlRPbmxpbmVNZWRpYXBsYXllckZyYW1ld29yayk7aWYoYSYmYS5HZXRBbGxQbGF5ZXJzJiYoYT1hLkdldEFsbFBsYXllcnMoKSkmJjA8YS5sZW5ndGgpZm9yKHZhciBiPQowO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1uZXcgTWIoYVtiXSk7Yy5qYXx8dGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgTmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIE9iPWMuWml8fE9iLFBiPW5ldyBPYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBRYj1jLkltfHxRYjtuZXcgUWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKXtmb3IodmFyIGI9YT1hWzBdO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTsKYnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuWigpfSxSZDpmdW5jdGlvbihhKXt2YXIgYj0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9iPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6e319KTooYj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxiLmluaXRDdXN0b21FdmVudChhLCExLCExLGRhdGEpKTtiJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChiKX0sZm46ZnVuY3Rpb24oKXt0aGlzLlhjPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXtpZihhLmRldGFpbCYmImFkUmVxdWVzdCI9PWEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuWGN8fCh0aGlzLlhjPSEwLHRoaXMuUmQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChiKXt9fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSwKcGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlhjJiYodGhpcy5SZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlhjPSExKSx0aGlzLlJkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LHdhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgUmI9Yy5qa3x8UmI7KGZ1bmN0aW9uKGMpe2MuaWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sTGg6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2E/KGEmJmEuYWRkRXZlbnRMaXN0ZW5lciYmKGEuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLAphLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iYyhhKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKSksYSYmYS5hZGRBZEVycm9yTGlzdGVuZXImJmEuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuYmMoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkxoLmJpbmQodGhpcyksMTApfSxiYzpmdW5jdGlvbihhKXt2YXIgYj17fTthLmdldEVycm9yJiYoYS5nZXRFcnJvcigpLGI9YS5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMub2s9CiEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fDMwMz09Yi5nZXRFcnJvckNvZGUoKXx8NDAzPT1iLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMuZygpKToodGhpcy5va3x8dGhpcy5tKCJub2ZyYW1ld29yayIpLHRoaXMuZygpKX0sWWY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYT0wO2E8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YSsrKXRoaXMuYmMod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFthXSk7dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLllmLmJpbmQodGhpcyksMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuTGgoKTt0aGlzLllmKCk7dGhpcy5qbigpfSxqbjpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmRuP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihhKXt0aGlzLmRuPSEwO2lmKGEmJmEuZGV0YWlsKWZvcih2YXIgYiBpbiBhLmRldGFpbCkiYWRUYWdVcmwiPT1iJiYoYS5kZXRhaWxbYl18fHRoaXMuYmMoYSkpfX0pfSkoYyk7dmFyIFNiPWMuaWt8fFNiOyhmdW5jdGlvbihjKXtjLmtrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGE9bmV3IFJiKHdpbmRvdy5ETDhfR0xPQkFMUyk7YS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGEuZm4oKSxhPW5ldyBTYihhLHRoaXMuRyksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLAphLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgVGI9Yy5ra3x8VGIsVWI9bmV3IFRiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuamw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYj1jLmpsfHxWYjtuZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5aaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLkZoPSExO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb01vZGVsKXt2YXIgYj1hLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYil7dGhpcy5UKGIpO3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVyhjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihhKXt0aGlzLkptPWF9LmJpbmQodGhpcykpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX1lbHNlIHRoaXMuWigpfSx3bjpmdW5jdGlvbigpe30sc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MTtyZXR1cm4gYS52aWRlb01vZGVsJiZhLnZpZGVvTW9kZWwuZ2V0JiYoYj1hLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGIpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KbX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFI6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuUGQoYSl9LmJpbmQodGhpcykpfSxQZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiYhdGhpcy5GaCYmKHRoaXMuRmg9ITAsdGhpcy5VJiZ0aGlzLlUoKSl9fSl9KShjKTt2YXIgTj1jLlpqfHxOOyhmdW5jdGlvbihjKXtjLllqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5CZSlpZih0aGlzLkhifHwKKHRoaXMuSGI9MCksdGhpcy5IYisrLDE1PHRoaXMuSGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhKXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuSm4oKTp0aGlzLmcoITApLCEwO3RoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKTthLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMuZygpOnRoaXMuZyghMCl9ZWxzZSBpZihhPWEudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkJlPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsCmZ1bmN0aW9uKGEpe3RoaXMuY2EoYSk7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk89YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPQphLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CYSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIE89Yy5Zanx8TzsoZnVuY3Rpb24oYyl7Yy4kaj0KdC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpO3RoaXMuVGE9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBhPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7YS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHwKdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5wZigpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIFdiPWMuJGp8fFdiLFhiPW5ldyBXYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYj1jLkVrfHxZYjtuZXcgWWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5xaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSwKUjpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWT1jLnFqfHxZOyhmdW5jdGlvbihjKXtjLnBqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmloPTA7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPXRoaXMuS2M9dGhpcy5CYT10aGlzLmVkPSExO3RoaXMuSmg9ZS5MYigxMCk7dGhpcy5xaCgpfSxxaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLnNiKCksITA7dGhpcy5paCsrO2lmKDEwPHRoaXMuaWgpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMuZyghMCk6dGhpcy5nKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5xaC5iaW5kKHRoaXMpLDEwMCksITF9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuY2EoYSwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuY2EoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuYmEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PQphLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLnVhPQohMH0sYmE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCk/KHRoaXMudygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJmIuYXBpLnBsYXllZCgpP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgWj1jLnBqfHxaOyhmdW5jdGlvbihjKXtjLnJqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBZKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWSh3aW5kb3cucGxheWVyKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWihhLHRoaXMuRyksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLnJqfHxaYiwkYj1uZXcgWmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy4kbHx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsCmI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgYmM9Yy5WaXx8YmM7KGZ1bmN0aW9uKGMpe2MuVWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2coKX0sc2c6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBjYz1jLlVpfHwKY2M7KGZ1bmN0aW9uKGMpe2MuV2k9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGJjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmphKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTChhKSl7dGhpcy5OKGEpOyhuZXcgY2MoYSx0aGlzLkcpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYz1jLldpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmM9Yy5Va3x8ZmM7bmV3IGZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLndpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5aKCkpOnRoaXMuWigpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgZ2M9Yy53aXx8Z2M7KGZ1bmN0aW9uKGMpe2Mudmk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcykpO3RoaXMuc2UoKTt0aGlzLm9nKCl9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LENhOmZ1bmN0aW9uKCl7dGhpcy51YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sb2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5vYSgpKTp0aGlzLmcoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9nLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuc2UuYmluZCh0aGlzKSwxMDApfSxzZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5nKCk6dGhpcy5nKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX19LGc6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5rYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIGhjPWMudml8fGhjOyhmdW5jdGlvbihjKXtjLnhpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sUmE6ZnVuY3Rpb24oYSl7YT0KbmV3IGdjKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgaGMoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuUmEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlJhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIGljPWMueGl8fGljLGpjPW5ldyBpYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYz1jLm5sfHxrYztuZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMucmg9dGhpcy50aD10aGlzLnNoPSExO3RoaXMuQ2Q9W107dGhpcy5vZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHphP251bGw6emEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgUz9udWxsOlMsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHVhP251bGw6dWEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFhiP251bGw6WGIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFViP251bGw6VWIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9iP251bGw6b2IsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGRiP251bGw6ZGIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBDYj9udWxsOkNiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeGI/bnVsbDp4YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6Vn19Yy5Maj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLkxsKGEpOltdLGM7dGhpcy50aD0hMDtpZihhLmxlbmd0aCl7dGhpcy5zaD0hMDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyljPWFbZF0sCnRoaXMuUmgoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLm9mKXtpZih0aGlzLnJoKWJyZWFrO2M9dGhpcy5vZltkXTt0aGlzLkpmKGMpJiYodGhpcy5DZC5wdXNoKGMpLHRoaXMuUmgoYykpfX0sSmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxMbDpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspZD1hW2VdLGQ9dGhpcy5vZltkXSx0aGlzLkpmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LFJoOmZ1bmN0aW9uKGEpe3RoaXMuSmYoYSkmJmEuZigpfSxZbjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcSYmIXRoaXMuc2gpZm9yKHRoaXMucmg9ITAsYT0wO2E8dGhpcy5DZC5sZW5ndGg7YSsrKXRoaXMuQ2RbYV0uU2ImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZFthXS5TYil9fX0pKGMpO3ZhciBsYz1jLkxqfHxsYyxMPW5ldyBsYztMLmYoKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5nbHx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuRmMoay5BbyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsCmMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuTm0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtDLndpZHRoPTE7Qy5oZWlnaHQ9MTtDLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChDKTt2YXIgcWM9Qy5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1DLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChDKTt2YXIgRz1uZXcgSCxsPSExO0cuZmEoKTtHLm5oKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5mYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcubmgoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LAohMSk7Ry5mYSgpO3ZhciByYz1xYyhmdW5jdGlvbigpe2UuTmcod2luZG93LEcuZG0oKSx7aWQ6cmN9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlNpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy5TaXx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkdoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy54ZD0wO3RoaXMuYmI9IiI7dGhpcy5EZD1bXTt0aGlzLkVkPTA7dGhpcy5JaD0hMTt0aGlzLmxmPVtdO2UucGIoIm5ld0FkZGVsaXZlcnkiKX1jLnlpPWE7YS5wcm90b3R5cGU9e0ZuOmZ1bmN0aW9uKGEpe3RoaXMuR2g9YX0sdmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmJiPXRoaXMucGxheWVyLlIoKX0sCmdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQW46ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSx6bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm5iKTsKdmFyIGQ9ITEsZj0hMTtpZih0aGlzLmVtKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5wYSx0aGlzLm5iLm5mLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5XbCgpKXRoaXMudm4oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuJG4oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsaCk7bC54bih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuRG0oYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwKInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuVWUmJihkPXRoaXMucGxheWVyLlVlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLldlKGEsZCxmKTt0aGlzLnBsYXllci5TaChsKX19LGVtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMueGQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy54ZC5nZXRUaW1lKCksdGhpcy54ZD1hLDNFNTxjPyEwOiExO3RoaXMueGQ9YTtyZXR1cm4hMX0sUW46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS51ZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuRmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLklnKGEpKT90aGlzLlNjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksCjApLGUubyhrLm1kLHRoaXMucGxheWVyLmwoKSkpfSxQbjpmdW5jdGlvbihhKXtpZighdGhpcy5HaCl7ZS51ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuRm4oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuSWcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS5vKGsubWQsdGhpcy5wbGF5ZXIubCgpKSl9fSxJZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sbW46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Nbih0aGlzLlBuLmJpbmQodGhpcykpOwp0aGlzLnBsYXllci5LYSgpfSxJZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS51ZigibWlkcm9sbCIpO2lmKCF0aGlzLndoKXt0aGlzLndoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm1kLHRoaXMucGxheWVyLmwoKSkpfX0sbG46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Fbih0aGlzLklkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlplKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlFuKCk7dGhpcy5wbGF5ZXIuWmUmJnRoaXMubG4oKTt0aGlzLm1uKCl9LG5uOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/CmE9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkRkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5jcChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuRWQ9dGhpcy5EZC5sZW5ndGh9LFdsOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkVkJiYoYT0hMCk7cmV0dXJuIGF9LHZuOmZ1bmN0aW9uKGEpe3RoaXMuSWg9YTtmb3IoYT0wO2E8dGhpcy5EZC5sZW5ndGg7YSsrKXRoaXMuRGRbYV1bImZ1bmN0aW9uIl0odGhpcy4kbS5iaW5kKHRoaXMpKX0sJG06ZnVuY3Rpb24oYSl7dGhpcy5FZC0tO2EmJnRoaXMubGYucHVzaChhKTswPj10aGlzLkVkJiZ0aGlzLkloKCl9LERtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0iIixkPTA7ZDx0aGlzLmxmLmxlbmd0aDtkKyspYz0KdGhpcy5sZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy55aXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLnBsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoZWVCaWNoYWhNaWFNZWVHaCxlZUJpY2hhaE1pYU1lZUdoKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
13.225.78.95 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-13-225-78-95.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
b1ae253cba132ab2566227a6f5a59ea9a90cdffef6f6bf06c55a222ed3afef53

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
Referer
https://videos.giga.de/embed/78410589?autoplay=0
Origin
https://videos.giga.de

Response headers

Date
Tue, 03 Dec 2019 12:58:41 GMT
Via
1.1 e5b747ffd1713cb17ddd7d55234a3301.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
X-Amz-Cf-Pop
FRA2-C2
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
724
Last-Modified
Mon, 18 Nov 2019 12:24:39 GMT
Server
AmazonS3
ETag
"bb9cc8757cf3880ea4d6e84944c9118b"
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
OTED9BvN354PNPOTyg4ElQXqb70irlbOtv62ow-GaII99z1garGZWA==
Expires
0
/
ssl.1.damoh.giga.de/bb14bce17282106e97f126651f0f40b9441ab351/ Frame 34FB
724 B
2 KB
XHR
General
Full URL
https://ssl.1.damoh.giga.de/bb14bce17282106e97f126651f0f40b9441ab351/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGVlQmljaGFoTWlhTWVlR2g9ZWVCaWNoYWhNaWFNZWVHaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZmZ8fCh4LmZmPTApO3guZmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5mZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5IayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2IudmYoYyk7Yi5BbihtKTtiLnpuKGwpO2Iubm4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Jbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS51aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudWgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmlsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5pbHx8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuSGs9ITE7dGhpcy5HYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlptLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5naD17fTt0aGlzLnNmPSExfWMuY2o9YTthLnByb3RvdHlwZT17Wm46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt0aGlzLnNmfHwodGhpcy5zZj1lLlgoMTApKTtyZXR1cm4gdGhpcy5zZn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmdoW2JdJiYodGhpcy5naFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLlpuKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx6azpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sWm06ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuWW0oYi5kYXRhKX0sWW06ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxCZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5XZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMueWQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxXZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSx4azpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnRhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnRsKGIpKXJldHVybjsoYT10aGlzLkJnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx0bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTGc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHBtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFVnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxLbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHhmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuYWwoYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuS24oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sSms6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGFsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5KayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxEZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxwaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxMYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFRoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LGttOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scWQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLmFjPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0FpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEhpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LAphbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxGajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxoazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sc2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxVajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LERrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuQWkoKXx8Yi5IaSgpfHxiLmFtKCl8fGIuRmooKXx8Yi5oaygpfHxiLnNqKCl8fGIuVWooKX19O3JldHVybiBudWxsIT1iLkRrKCl9LHlsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sdGE6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxDYjpmdW5jdGlvbihiKXtiPXRoaXMudGEoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LE1sOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMudGEoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxkbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxSbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxRZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMua2koYSkrIjoiK3RoaXMua2koTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGtpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx1ZjpmdW5jdGlvbihiKXt0aGlzLkdiPWJ9LE5nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuR2I7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxhbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLk1sKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sU246ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmdjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5hbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLnZhKGIsITApO2I9bS52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS52YShmLCEwKTtmPW0udmEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFFkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS52YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uT2soKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnVkKGIpOiIifSx1ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG1nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy5wbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnFmJiZ3aW5kb3cuc2FuZGJveC5xZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLkxnKGIpKXJldHVybiB0aGlzLkxnKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS53ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy54ayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixlKTtlPWsudmEoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHlkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSx5bTpmdW5jdGlvbihiLGEsZCl7dGhpcy55ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx1aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMueW0oZi53ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCkluOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGNwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxGazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0saW06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuY2p8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLmJqPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuVG09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuTW09e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuWm89e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5rbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmJwPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuZ2c9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuWmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5kZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5oZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EucGs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuYmc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Gbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EubGw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS4kbz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS54Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLlprPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5tZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5mZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eucms9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5iZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnFrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5yaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLk9tPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuemQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS55Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuWW89e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuQm89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkNvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Bbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLk5tPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5ianx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLmZsfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxJbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdGQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnRkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudGQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudGQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG5oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5JbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnRkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmRqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5oaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLmhqfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuSWk9YX0pKGMpO3ZhciBLPWMuSWl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Ca3x8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Laj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTWI9MDt0aGlzLlRhPTE1MDt0aGlzLlNiPTA7dGhpcy5CbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGE/KHRoaXMuTWIrKyx0aGlzLlNiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5TYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHRuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWI+dGhpcy5UYT8hMDohMX0scGY6ZnVuY3Rpb24oKXt0aGlzLk1iPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxCbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sR2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudGgmJkwuWW4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxqbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLktqfHx0OyhmdW5jdGlvbihjKXtjLk1qPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5NYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRmI9IiI7dGhpcy5EZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKTW46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sRW46ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGEmJih0aGlzLk1iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVGc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sR2Q6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5YbCgpfHx0aGlzLnRrKCk7dGhpcy5HZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHRrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sWGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx3YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxTaDpmdW5jdGlvbihhKXt0aGlzLkZiPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmJ9LE9oOmZ1bmN0aW9uKCl7dGhpcy5GYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRmImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkRnfHwodGhpcy5EZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLk1qfHxxOyhmdW5jdGlvbihjKXtjLnppPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuV2Y9IjEiO3RoaXMuWGY9IjIiO3RoaXMubWs9IjMiO3RoaXMuJGM9MDt0aGlzLkZtPQozMDt0aGlzLlhiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5pZz10aGlzLm1pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMudmYoYSk7dGhpcy5DbihiKX0sZjpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLm1pfHwodGhpcy5taT0hMCxlLlhlKCkpfSxBaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGNtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmdjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5nYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV09MX0sZ206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZ2MoKSYmKHRoaXMud2YoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy56YSgpKXt0aGlzLmNtKCk7aWYoIXRoaXMuZ20oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMud2YoKTtyZXR1cm59dGhpcy53ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuZ2koKTt0aGlzLmlnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy56YSgpfHwodGhpcy5YYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGdpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5YYiYmMDx0aGlzLlhiLmxlbmd0aCYmKHRoaXMuWGI9ZS51bmlxdWUodGhpcy5YYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWGIuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLldmfSx3ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWGZ9LEpuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ta30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxhZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5XZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWGZ9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx2ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LENuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxHbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEJtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy56aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkJqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5Canx8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUGk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUGl8fG5hOyhmdW5jdGlvbihjKXtjLlFpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubmE/Yi5uYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlFpfHxvYTsoZnVuY3Rpb24oYyl7Yy5SaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5SaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLnRvfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5uaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuS2coKTt0aGlzLk1nKCk7dGhpcy5Zaz0hMX0sS2c6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxNZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5JZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSWQoYil9LmJpbmQodGhpcykpfSxJZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5uanx8cmE7KGZ1bmN0aW9uKGMpe2MubWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuaGU9ITE7dGhpcy5rZT0xO3RoaXMuYWQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuaGU9ITE7dGhpcy5rZT0xO3RoaXMuYWQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTtpZihhLmdldENvbmZpZylpZihiPWEuZ2V0Q29uZmlnKCksYi5hZHZlcnRpc2luZyl7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSlpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcyliLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5rZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMueWI9ITApO2Vsc2V7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSBpbnN0YW5jZW9mIEFycmF5KWZvcih2YXIgZz0wO2c8Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5sZW5ndGg7ZysrKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGVbZ10udGFnKXt0aGlzLnliPSEwO2JyZWFrfWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMueWI9ITApO2IuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMueWI9ITApfWIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy55Yj0hMCl9ZWxzZSB0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpO2Zvcih2YXIgZD0KImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGc9MDtnPGQubGVuZ3RoO2crKylhLm9uKGRbZ10sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtnXSYmKHRoaXMuaGU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtnXSYmdGhpcy5BaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLkZtJiYhdGhpcy56YSgpJiYodGhpcy55Yj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5nKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoZXZlbnQuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKTthLm9uKCJwbGF5bGlzdGl0ZW0iLApmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLllrPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5GYjtiJiYoYi5CZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmFkLmluZGV4T2YoYikmJnRoaXMuYWQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy53KCksdGhpcy5vYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMudygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLmFkLmxlbmd0aD49dGhpcy5rZSYmdGhpcy5nKCkpfSwKQm06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRGYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmhlfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuS2coKSxiLk1nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciBzYT1jLm1qfHxzYTsoZnVuY3Rpb24oYyl7Yy5vaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT0KdGhpcy5DbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2E9W107aWYoMTxiLmxlbmd0aClmb3IoZz0wO2c8Yi5sZW5ndGg7ZysrKWEucHVzaChiW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBhLnB1c2goandwbGF5ZXIoKS5pZCk7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpO3RoaXMuTChnKXx8dGhpcy5qbShnKXx8KHRoaXMuTihnKSxnPW5ldyBzYShnLHRoaXMuRyksZy5LKCksZy5mKCkpfX10aGlzLlAoKX19LEpwOmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LENsOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS56YihhLmFuY2hvcil9fSl9KShjKTt2YXIgdGE9Yy5vanx8dGEsdWE9bmV3IHRhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ibz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuYm98fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmNrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCks6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEpe3ZhciBiPWEuZWxfO2J8fChiPWEuZWwoKSk7Yj8odGhpcy5UKGIpLChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlcoYSk6dGhpcy5aKCkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYSl7dGhpcy5QZChhKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFiWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGEuYXV0b3BsYXk/YS5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sd2E6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHdhPWMuY2t8fHdhOyhmdW5jdGlvbihjKXtjLmJrPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMudWE9dGhpcy5LYz10aGlzLkJhPXRoaXMuZWQ9ITE7dGhpcy5KaD1lLkxiKDEwKTt0aGlzLklmPSEwO3RoaXMueGM9dGhpcy5raD0hMTt0aGlzLkttKGEuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy56aCgpLHRoaXMuS2soKSx0aGlzLnNiKCkpfSxLbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLAoiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGEuViwiOyIsdHlwZW9mIGEuViwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYS5WP2EuVi5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGEuVj90eXBlb2YgYS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYS5pbWEsIjsiLHR5cGVvZiBhLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGEuSCwiOyIsdHlwZW9mIGEuSCwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLmltYT9hLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuRWE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuRWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILkVhOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguRWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5pbWEmJmEuaW1hLkVhP2EuaW1hLkVhKCk6InVuZGVmaW5lZFgiLCI7IixhLmltYSYmYS5pbWEuRWE/dHlwZW9mIGEuaW1hLkVhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5mZToKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuZmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixhLkg/YS5ILmZlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguZmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILmdlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguZ2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubmE6InVuZGVmaW5lZFgiLCI7IixhLkg/CnR5cGVvZiBhLkgubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5xZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuSmgpfSxIYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5pbWEzJiYodGhpcy5pbWE9YS5pbWEzKTtpZihhLmltYSl7dGhpcy5pbWE9YS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmCih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LEljOmZ1bmN0aW9uKCl7aWYoIXRoaXMubmEpe3ZhciBhPXRoaXMuSGMoKTthJiYoYS5hZHNMb2FkZXImJih0aGlzLm5hPWEuYWRzTG9hZGVyKSxhLl9hZHNMb2FkZXImJih0aGlzLm5hPWEuX2Fkc0xvYWRlciksYS5nZXRBZHNMb2FkZXImJih0aGlzLm5hPWEuZ2V0QWRzTG9hZGVyKSxhLmNvbnRyb2xsZXImJmEuY29udHJvbGxlci5zZGtJbXBsJiZhLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm5hPWEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm5hfSxZZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LGhtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuamgpe3ZhciBhPQp0aGlzLkhjKCksYj10aGlzLmZtKCk7d2luZG93LmltYSYmYSYmKGEuX2Fkc0xvYWRlcnx8YS5hZHNMb2FkZXJ8fGIpJiYodGhpcy5qaD0hMCl9cmV0dXJuIHRoaXMuamh9LGZtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5lZCYmYS5hZHMmJihhLmFkcy5zdGF0ZXx8YS5hZHMuX3N0YXRlKSYmKHRoaXMuZWQ9ITApO3JldHVybiB0aGlzLmVkfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWMoKTtpZihhKXt2YXIgYj0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5rbigpfS5iaW5kKHRoaXMpKSwKYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5jYShiLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5iYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxrbjpmdW5jdGlvbigpe3RoaXMueGM9ITA7dmFyIGE9dGhpcy5ZZygpO2lmKGF8fHRoaXMuemEoKSl7dmFyIGI9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5jYShiKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oYil7dGhpcy5jYShiLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5iYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuU2EoKSYmKGQ9Ik1fIik7YS5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDsKaWYoZS5GKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYi5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIisKZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnljfHwodGhpcy5tKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5iYSgpLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LElwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5BZyYmYS5hZHMmJih0aGlzLkFnPWEuYWRzKTtyZXR1cm4gdGhpcy5BZ30sS2s6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7CnRoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLkFoKCl9LmJpbmQodGhpcykpfSxvZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksCjUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YSYmKChhPXRoaXMuWWcoKSkmJmEuZGVzdHJveT9hLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2QoKX0uYmluZCh0aGlzKSw1MCkpfSx6aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcoKSYmMDxhLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5obSgpKXt2YXIgYj10aGlzLkhjKCksZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLncoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5raD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8KKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5iYSgpKToodGhpcy5iYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMua2g9ITA7YS5pc1BsYXlpbmcoKSYmMTA8YS5jdXJyZW50VGltZSgpfHx0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56aCgpfS5iaW5kKHRoaXMpLDUwKX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYihnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sTGs6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpOwpyZXR1cm59fWVsc2UgdGhpcy5DYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGsoKX0uYmluZCh0aGlzKSwxMCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIGUueGU/ITE6dGhpcy51YX0sQ2E6ZnVuY3Rpb24oKXtpZih0aGlzLllsKCkpe3RoaXMudWE9ITA7aWYoZS5GKCJnaWdhLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKXRoaXMuSWY9ITEsZS50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsInNldCIsITApO3RoaXMuZyghMCl9ZWxzZSB0aGlzLnVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpfSxZbDpmdW5jdGlvbigpe2lmKDA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPQohMTtlLnlkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2E9IWUuZmIoYi5jYyl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXthPSExfSwhMCwhMCk7dmFyIGI9ZS55bCgpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGUueGU9LTEhPWIuaW5kZXhPZigiZmlyZWZveCIpfHwtMSE9Yi5pbmRleE9mKCJzYWZhcmkiKXx8YX1yZXR1cm4hMX0sYmE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCk/KHRoaXMudygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy56YSgpfHwoYXx8KHRoaXMuSWY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSWYsZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApUazpmdW5jdGlvbigpe3RoaXMuUnB8fCgxMDx0aGlzLkxvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuTG8rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5zbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UaygpfS5iaW5kKHRoaXMpLDUwKSkpfSxzbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Nbyl7dGhpcy5Nbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7CmEudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmJrfHx4YTsoZnVuY3Rpb24oYyl7Yy5kaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuWGgod2luZG93KTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyl0cnl7Yj1ifHx0aGlzLlhoKGFbZ10pfWNhdGNoKGQpe310aGlzLlAoKX19LFhoOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5TYj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5RYyl9fSl9KShjKTt2YXIgeWE9Yy5ka3x8eWEsemE9bmV3IHlhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Baj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEFhPWMuQWp8fEFhO25ldyBBYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuZ2Y9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTsKcmV0dXJufXRoaXMuVChiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2E/dGhpcy5XKGEpOnRoaXMuWigpfSxWbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkZiLGc9dGhpcy5oYSgpLGQ9IiI7YS5tZW1vJiYoZD1hLm1lbW8udmlkZW9pZCk7ZCYmYiYmYi5qYyYmKDA8PWcuaW5kZXhPZihkKXx8Yi5CZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuZ2Y9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKd2E6ZnVuY3Rpb24oKXt0aGlzLmdmKys7aWYoMTA8dGhpcy5nZilyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFBkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgphJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlUmJnRoaXMuVSgpfX0pfSkoYyk7dmFyIEJhPWMuSGp8fEJhOyhmdW5jdGlvbihjKXtjLkdqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQmUpaWYodGhpcy5IYnx8KHRoaXMuSGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5IYisrLDE1PHRoaXMuSGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZyghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPQohMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYihnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpOwp2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLm9sPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy5vbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlZtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwKMTAwKX0sZzpmdW5jdGlvbihhKXt0aGlzLkQoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Hanx8Q2E7KGZ1bmN0aW9uKGMpe2MuSWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5UYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmCihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyBCYShhW2JdKTtnLmphfHx0aGlzLkwoZyl8fCh0aGlzLk4oZyksKG5ldyBDYShnLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRGE9Yy5Janx8RGEsRWE9bmV3IERhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5UbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuVGx8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmpqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlVnKGEsImVsZW1lbnRJRCIpOwpzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLlhtPWEucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1hLndpZHRoO2cuc3R5bGUubWluV2lkdGg9YS53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5YbSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsCmIpfXRoaXMuVChnKTt0aGlzLlcoZyk7dGhpcy5yZD1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMucmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnJkKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sU2s6ZnVuY3Rpb24oKXtlLnBoKHRoaXMucmQpO2UuT2UodGhpcy5yZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNrKCl9LmJpbmQodGhpcyksNTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LFVlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5qanx8R2E7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuaWp8fEhhOyhmdW5jdGlvbihjKXtjLmtqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiYKbC5pbnJlYWQpe3ZhciBhPWwuaW5yZWFkLGI9ZS5VZyhhLCJlbGVtZW50SUQiKTtpZihlLnBoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTChhKSkpe3RoaXMuTihhKTsobmV3IEhhKGEsdGhpcy5HKSkuZigpO3JldHVybn10aGlzLlNiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBJYT1jLmtqfHxJYSxKYT1uZXcgSWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy53anx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPQoiR0VUIjt0aGlzLmRhdGE9e319Yy5laj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxEbjpmdW5jdGlvbihiKXt0aGlzLm1ldGhvZD1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LHVrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBBPWMuZWp8fEE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixnLGQsZil7dGhpcy5YYT1iO3RoaXMuUGc9dGhpcy51aT0hMTt0aGlzLkJoPWQ7dGhpcy5ZaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmCjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmMD09Yy5zdGF0dXMmJm0mJm0uUmUodGhpcy5YYS51cmwpJiZtLlZjKXt2YXIgZT1uZXcgQShiLnVybCk7ZS5EbigiUE9TVCIpO2Uuc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGEoZSxmdW5jdGlvbihiKXt2YXIgYT0hMTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChnKXthPSExfWEmJmEucGluZyYmInBvbmciPT1hLnBpbmcmJihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZmo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiKwpkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYVtkXSk7Yj1iLnN1YnN0cigxKX10aGlzLlBnJiYoYis9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0aGlzLmhiLnVybENhbGxlZD10aGlzLlhhLnVybDt0cnl7dGhpcy5ZaD90aGlzLmhiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITEpOnRoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMCksdGhpcy51aXx8KHRoaXMuaGIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGIubGVuZ3RoJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwKInJlcXVlc3RfZmFpbGVkIiwhMCk6bS5SZSh0aGlzLlhhLnVybCksdGhpcy5CaCYmdGhpcy5CaCgpfXJldHVybiB0aGlzLmhifX19KShjKTt2YXIgTGE9Yy5manx8TGE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkRhPXRoaXMuYmU9ITF9Yy5KaT1hO2EucHJvdG90eXBlPXtIbjpmdW5jdGlvbihiKXt0aGlzLmJlPWJ9LEduOmZ1bmN0aW9uKGIpe3RoaXMuRGE9Yn0scW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIiwicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIiwKdnA6IkFkU2tpcHBlZCIsd3A6IkFkU3RhcnRlZCIsbHA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixtcDoiQWRJbXByZXNzaW9uIixpcDoiQWRDcmVhdGl2ZVZpZXciLHBwOiJBZFZpZGVvTWlkcG9pbnQiLHFwOiJBZFBhdXNlZCIsc3A6IkFkVmlkZW9TdGFydCIsdHA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5iZSxhW2RdKX0scG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmFlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmFlKXRoaXMuRGEuYWUuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuRGEsdGhpcy5EYS5hZVthXSk7dGhpcy5EYSYmdGhpcy5EYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EYS5nZXRFcnJvcigpO2ImJmNvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsImdvdCBlcnJvciIsYil9LmJpbmQodGhpcyksMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5iZSYmdGhpcy5xbigpO3RoaXMuRGEmJnRoaXMucG4oKX19fSkoYyk7dmFyIE1hPWMuSml8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5IYT0hMTt0aGlzLiRiPSIiO3RoaXMuZmQ9dGhpcy5aYj10aGlzLmpiPW51bGw7dGhpcy5HZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMucGE9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm5mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk9iPSIiO3RoaXMuWmQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7CnRoaXMuWWQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLnZiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLldiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLlBiPSIiO3RoaXMuUWI9W107dGhpcy5SYj1bXTt0aGlzLlVjPVtdO3RoaXMub2M9IiI7dGhpcy5BYj0hMTt0aGlzLk9kPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuaWM9ITE7dGhpcy52Zz10aGlzLlVkPW51bGw7dGhpcy56Zj10aGlzLlZiPXRoaXMuRmc9dGhpcy5TZD10aGlzLlZjPXRoaXMuaGQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnZkPTA7dGhpcy5maD0hMTt0aGlzLmVoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5naj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy4kYixhZHRhZ21vZGlmaWVyOnRoaXMuamIsYWR0YWdtb2RpZmllckFkdjp0aGlzLlpiLGFkdGFncmVnZXg6dGhpcy5mZCxiaXRyYXRlOnRoaXMuT2EsanNwb3B1cHM6dGhpcy5UZSxzaWRlbG9hZHM6dGhpcy50YixkaXNhYmxldGVzdHM6dGhpcy5HZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLlNlLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnBhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5PYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuWmQsSE9NQURfQkxPQ0tFRDp0aGlzLllkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLldiLHRlc3RIaWRlOnRoaXMuUGIsdGVzdFRhZ3M6dGhpcy5RYix0ZXN0VGFnc0pTOnRoaXMuUmIsCnRlc3RUYWdzWEhSOnRoaXMuVWMsdGVzdDNQQ29va2llOnRoaXMub2MsdGhyb3R0bGU6dGhpcy5PZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLmljLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMudmcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5zYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuaGQsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuVmMsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuU2QsY29uZmlnRmFpbHVyZXM6dGhpcy5aYSxzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5yZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5WYixza2lwQWxsb3dlZDp0aGlzLnpmLHZtYXBzOnRoaXMuTmYsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LHluOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy4kYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLmpiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuWmI9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5mZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkdnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuU2U9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuSmM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5wYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5PYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9CmIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLlpkPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuWWQ9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMudmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5XYj1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuUGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5SYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMub2M9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLk9kPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLmljPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLnZnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuaGQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmCih0aGlzLlZjPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuU2Q9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLlphPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5yZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVmI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuemY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmCih0aGlzLk5mPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuemM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmllPWIuYWRGYWxsYmFja1VSTCl9LFZsOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYTtmb3IoYSBpbiB0aGlzLlphKSJib29sZWFuIj09dHlwZW9mIHRoaXMuWmFbYV0mJjE9PXRoaXMuWmFbYV0mJihiPSEwKTtyZXR1cm4gYn0sdGY6ZnVuY3Rpb24oYil7dGhpcy5aYVtiXT0hMH0sRGw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxNZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGI9ZS5GayhiKX0sdmE6ZnVuY3Rpb24oYixhLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy50YShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuJGJ8fHRoaXMuamJ8fAp0aGlzLlpifHx0aGlzLmZkKSYmKGg9dGhpcy5IbShoKSk7Yj1uZXcgQShlKTtiLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkZsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1oO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGgpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sUWU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSwKTGM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuZ2EmJnRoaXMuZ2EubGVuZ3RoJiYwPHRoaXMuZ2EubGVuZ3RoJiYoYT10aGlzLmdhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LFJlOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuUWUoYik7cmV0dXJuIGF9LEZsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwOwpyZXR1cm4ibm9uZSJ9LHdkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2FbdGhpcy5yZl19LFBjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy53ZCgpLGE9dGhpcy5UaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSx4aDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxHbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUudGEoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPApoLmxlbmd0aDtGKyspe3ZhciBrPWhbRl0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWZbbF09dGhpcy54aChmW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZiloLnB1c2gobCsiPSIrZltsXSk7Zj1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMueGgoZC5xdWVyeUtleVtjXSxjLGFbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxIbTpmdW5jdGlvbihiKXt0aGlzLiRiJiYoYis9dGhpcy4kYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5aYiYmKGI9dGhpcy5HbShiLHRoaXMuWmIpKTtyZXR1cm4gYn0sUms6ZnVuY3Rpb24oKXt0aGlzLnlhJiYKdGhpcy55YS5jbGllbnRBUElzJiZ0aGlzLk1rKHRoaXMueWEuY2xpZW50QVBJcyl9LE1rOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBNYTtiLnB1Ymxpc2hlckFQSSYmYS5IbihiLnB1Ymxpc2hlckFQSSk7Yi5wbGF5ZXImJmEuR24oYi5wbGF5ZXIpO2EuZigpfX0saTpmdW5jdGlvbihiLGEsZCxmLGMsZSl7bT10aGlzO3RoaXMuU2U9ITA7dGhpcy5KYz1iO3RoaXMucGE9YTt0aGlzLm5mPWQ7dGhpcy5VZD1mO3RoaXMuRGM9Yzt0aGlzLnlhPWV8fHt9O3RoaXMuUmsoKTt0aGlzLnhtKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnBhKXRoaXMudm0oKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMucGEpdHJ5e3RoaXMucGE9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnBhKXRyeXt0aGlzLnBhPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSwKcmI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGF9LHhtOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgQSh0aGlzLkpjK3RoaXMub2UoImdsb2JhbCIpKSx0aGlzLlNsLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnRmKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuQWMoKX0uYmluZCh0aGlzKSwhMCl9LHZtOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgQSh0aGlzLnBhK3RoaXMub2UoImNsaWVudCIsLTEhPXRoaXMucGEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy50ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoKIj8iKSsoImNhY2hlPSIrdGhpcy5MYigpKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1iJiYoZD0iIik7dGhpcy55YSYmdGhpcy55YS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGRhOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhkKXt0aGlzLmhkPSEwO3ZhciBhPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChnKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpOwpmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLkRjPSExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWWQpKTsKdGhpcy5UYigpO2UuRmMoay5UbSk7KGE9ZS5DYih0aGlzLndkKCkpKXx8KGE9ZS5DYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sU2w6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9aWYoIWEuZW5hYmxlZHx8IWEuZm9yY2VfZGlzYWJsZWQpdHJ5e2E9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGYpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucGF8fHRoaXMuT2J8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSwKdGhpcy5UYigpKX19LEFjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLnBhfWVsc2UgZD10aGlzLnBhO2lmKCEoZC5lbmFibGVkJiZkLnNlcnZlciYmZC5hbGlhcyYmZC5jb25maWcpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChjKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5mYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5nYT1kLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuZ2EubGVuZ3RoO2IrKyl0aGlzLmdhW2JdPXRoaXMuZ2FbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLkYoIndlYi5kZSIpfHxlLkYoImdteC5uZXQiKXx8ZS5GKCJnbXguYXQiKXx8ZS5GKCJnbXguY2giKXx8CmUuRigiMXVuZDEuZGUiKSkmJiF0aGlzLkxjKCkpZm9yKGI9MDtiPHRoaXMuZ2EubGVuZ3RoO2IrKyl0aGlzLmdhW2JdPXRoaXMuZ2FbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5PYj1kLmNvbmZpZ3x8IiI7dGhpcy5BYT1kLmFsaWFzfHxudWxsO3RoaXMuSmU9ZC5hZHBhdGh8fCIiO3RoaXMucmY9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuZ2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5PYiYmdGhpcy5BYSYmdGhpcy5nYS5sZW5ndGg/dGhpcy5NYyghMSk6KHRoaXMuSGE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy5UYigpKX0sTWM6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307aWYoYil7dmFyIGE9bmV3IEEodGhpcy5QYygpKSxkPXRoaXMudGEodGhpcy5PYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjsKYS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2EubWV0aG9kPSJQT1NUIn1lbHNlIGE9bmV3IEEodGhpcy5PYit0aGlzLm9lKCJjdXN0b21lciIpKTt0aGlzLklhKGEsdGhpcy5hby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy50ZigiY3VzdG9tZXIiKTtiP3RoaXMuVGo/dGhpcy5kYSgibm9TVk1Db25maWciKToodGhpcy5Uaj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuTWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGFvOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPWIucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtpZighdGhpcy5pYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuaWM9ITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpKXRyeXtkPQoobmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuVmM9dGhpcy5mYihkLnN0cmljdCk7dGhpcy5TZD10aGlzLmZiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkZnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy4kYT10aGlzLmZiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5mYihkLmVuYWJsZWQpO3RoaXMuUGI9ZC50ZXN0aGlkZXx8IiI7dGhpcy5SYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLlVjPWQudGVzdGFkdGFnc3hocnx8W107dGhpcy5vYz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy4kYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmpiPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLlpiPWQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5mZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5UZT0KZC5qc3BvcHVwc3x8ITE7dGhpcy50Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5WYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuVmI7dGhpcy56Zj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLmpkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5OZj1kLnZtYXBzfHwiIjt0aGlzLnpjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5PYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmllPWQuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLk9kPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMuaWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLmljPSEwLHRoaXMuTWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMucG8oKSYmKHRoaXMuUGJ8fHRoaXMuUmJ8fHRoaXMuUWJ8fHRoaXMuVWMpP3RoaXMubmY/KHRoaXMuSGE9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy50ZSgpLHRoaXMuVGIoKSk6CnRoaXMuZm8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5GZigpKX19LGZvOmZ1bmN0aW9uKCl7dGhpcy5lbygpO3RoaXMuaG8oKX0saG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksCkY9ZS5YKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihGLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2IoRikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwplLnpiKGIoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYil7fWlmKDMhPWQpe3ZhciBjPWUucWQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlNhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGEsITApO3JldHVybn10aGlzLmRhKCJjc3BfIithKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxGZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpO3RoaXMuVGIoKX0sTmQ6ZnVuY3Rpb24oYil7dGhpcy5zYz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuSGE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKGIpKSx0aGlzLlRiKCksdGhpcy50ZSgpKX0sZW86ZnVuY3Rpb24oKXtpZih0aGlzLlBiKXt2YXIgYj1lLnFkKCk7aWYoKGIuaXNDaHJvbWV8fGIuaXNGaXJlZm94KSYmdGhpcy5tbSgpKXRoaXMuTmQodGhpcy5XYiwibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXtiPSExO3RyeXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuUGIpO2Euc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5QYik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpOwpiPWR9Y2F0Y2goZil7fWI/dGhpcy5OZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5jaSgpfX1lbHNlIHRoaXMuY2koKX0sYmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoKSk7dGhpcy5rbyhmLDA8ZC5sZW5ndGg/Yi5iaW5kKHRoaXMpOnRoaXMuWmguYmluZCh0aGlzKSxhLmJpbmQodGhpcykpfWZ1bmN0aW9uIGEoKXt0aGlzLk5kKHRoaXMuV2IsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5RYj10aGlzLlVjKSYmdGhpcy5RYi5sZW5ndGgpe3ZhciBkPXRoaXMuUWIuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5aaCgpfSxrbzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwKITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSWEobmV3IEEoYiksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LGNpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYigpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkxiKCkpO3RoaXMubG8oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLmJpLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1mdW5jdGlvbiBhKCl7dGhpcy5OZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlJiJiZ0aGlzLlJiLmxlbmd0aCl7dmFyIGQ9dGhpcy5SYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLmJpKCl9LGxvOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwKITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihhLGQpe2Q9PWImJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWI7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sWmg6ZnVuY3Rpb24oKXtpZih0aGlzLm9jKXRyeXtlLnlkKHRoaXMub2MsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO3RoaXMuQWI9IXRoaXMuZmIoYi5jYyk7dGhpcy5GZigpfS5iaW5kKHRoaXMpLHRoaXMuJGguYmluZCh0aGlzKSwhMCl9Y2F0Y2goYil7dGhpcy4kaCgpfWVsc2UgdGhpcy5GZigpfSwKJGg6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKTt0aGlzLlRiKCk7dGhpcy50ZSgpfSxtbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChiKXtyZXR1cm4iZmFpbCJ9fSxUYjpmdW5jdGlvbigpe3ZhciBiPSIwIixhPSIwIjt0cnl7ZS5TYSgpJiYoYj0iMSIpfWNhdGNoKGQpe2I9Mn10aGlzLnNjJiYoYT0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYisiIithLCEwKTt0aGlzLm9jJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuQWIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlpkKSk7dGhpcy5VZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlVkJiZ0aGlzLlVkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkFifSl9LApRazpmdW5jdGlvbigpe2lmKHRoaXMuU2QmJnRoaXMuVmwoKSl7dmFyIGI9dGhpcy5EbCgpO2ImJmIuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYi5qb2luKCJfIiksITApfX0sZ2k6ZnVuY3Rpb24oYil7Ynx8KGI9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGIpdHJ5e2I9Yi50b1N0cmluZygpfWNhdGNoKGEpe2I9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9Yj1iLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITApfSxJYTpmdW5jdGlvbihiLGEsZCxmLGMsaCl7dGhpcy52ZHx8KHRoaXMudmQ9MCk7dGhpcy52ZCsrO3RoaXMudmQ+dGhpcy5laCYmIXRoaXMuZmgmJih0aGlzLmZoPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5laCwhMCkpO2I9bmV3IExhKGIsYSxkKTtmJiYoYi51aT0hMCk7YyYmZS5rbSgpJiYoYi5QZz0hMCk7aCYmKGIuWWg9ITApO3JldHVybiBiLmxvYWQoKX0sTms6ZnVuY3Rpb24oKXtlLlNhKCl8fAplLmFiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihiKXt2YXIgYT1udWxsLGQ9bnVsbCxmPSIiO3RyeXsoYT1iLnJlc3BvbnNlWE1MKXx8KGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYi5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLmRhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihiPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGJbMF0mJihiPWJbMF0pLGIpe2Y9YiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkxjKCl8fChiPXRoaXMudGEoZiksZj1iLnByb3RvY29sKyI6Ly8iK2IuaG9zdCk7dmFyIGU9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5kYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2UuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5kYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sY286ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuTmZ9LE9rOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKITApO3ZhciBiPXRoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2IuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYix0aGlzLkVvLmJpbmQodGhpcyksdGhpcy5Eby5iaW5kKHRoaXMpKX0sRW86ZnVuY3Rpb24oYil7dmFyIGE9bnVsbCxkPW51bGw7dHJ5eyhhPWIucmVzcG9uc2VYTUwpfHwoYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhiLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1kfHx0aGlzLm1sKCl9LERvOmZ1bmN0aW9uKCl7fSxtbDpmdW5jdGlvbigpe2UuRmMoay5sbCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5kYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sCnRlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMudGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy50Yi5sZW5ndGg7YisrKXt2YXIgYT10aGlzLnRiW2JdOyJyZXF1ZXN0Ij09YS50eXBlJiZlLmFiKGEudXJsLGEuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09YS50eXBlKXt2YXIgZD1uZXcgSDt3aW5kb3dbZC5mYSgpXT10aGlzO2UuYWIoYS51cmwsYS5hbGlhcyxudWxsLGZ1bmN0aW9uKGIpe2lmKGIucmVzcG9uc2VUZXh0KXRyeXtldmFsKGIucmVzcG9uc2VUZXh0KX1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0scG86ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5PZH0sTGI6ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYnx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sWDpmdW5jdGlvbihiKXtiPWJ8fDEwO2Zvcih2YXIgYT0KIiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9LHpiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGYsYyxlLGgsayxsPTA7bDxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQobCsrKSxmPWIuY2hhckNvZGVBdChsKyspLGM9Yi5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxoPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9oPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBhfSx0YTpmdW5jdGlvbihhKXt2YXIgZz0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxjPTE0O2MtLTspZFtnW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZ1sxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSxUaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBnKGEpe3ZhciBiPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9YT4+PjQqZCYxNSxiKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gYn1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixyPTI3MTczMzg3OCx0PTMyODUzNzc1MjAsbixxLHUsdix3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGM9MDtjPG4tMztjKz00KWU9YS5jaGFyQ29kZUF0KGMpPDwyNHxhLmNoYXJDb2RlQXQoYysxKTw8MTZ8YS5jaGFyQ29kZUF0KGMrMik8PDh8YS5jaGFyQ29kZUF0KGMrMykseC5wdXNoKGUpOwpzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihjPTA7MTY+YztjKyspaFtjXT14W2ErY107Zm9yKGM9MTY7Nzk+PWM7YysrKWhbY109ZChoW2MtM11eaFtjLThdXmhbYy0xNF1eaFtjLTE2XSwxKTtlPWs7bj1sO3E9bTt1PXI7dj10O2ZvcihjPTA7MTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8fm4mdSkrditoW2NdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8biZ1fHEmdSkrditoW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YraFtjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1O3Q9dCt2JjQyOTQ5NjcyOTV9cmV0dXJuKGcoaykrZyhsKStnKG0pK2cocikrZyh0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE5hPWMuZ2p8fE5hLG09bmV3IE5hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMuYXA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBPYT1jLmFwfHxPYTtuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZyxkKXt0aGlzLmE9YTthLmMuUj90aGlzLmJiPWEuYy5SKCk6dGhpcy5iYj0iIjthLmMubWgmJmEuYy5taCh7cGF1c2U6dGhpcy5CZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLlFoLmJpbmQodGhpcyksbXV0ZTp0aGlzLmFmLmJpbmQodGhpcyksdW5tdXRlOnRoaXMud28uYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYS5rYjt0aGlzLnBsYXllcj10aGlzLmEuYzt0aGlzLmVjPXRoaXMuZ2Q9ITE7dGhpcy5Daz0xRTM7dGhpcy5yYT1udWxsO3RoaXMuQj1nO3RoaXMuZ2I9e307dGhpcy52aWRlbz17fTt0aGlzLktkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLkdrPWUuWCgxMCk7CnRoaXMuQmY9MDt0aGlzLmRkPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuZGQ9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMuZGQ9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQWs9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5lZj10aGlzLkpkPSExO3RoaXMudmg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYj17fTt0aGlzLm5lPSExO3RoaXMuamk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5qYz0hMTt0aGlzLiRrPWUuWCgxMCk7dGhpcy5LYj1lLlgoMTApO3RoaXMuSWI9ZS5YKDEwKTt0aGlzLlVoPWUuWCgxMCk7dGhpcy5jb25mPXt9O3RoaXMuVmQ9CnRoaXMuVWI9dGhpcy52ZT10aGlzLm5kPXRoaXMuTGQ9dGhpcy51Yj10aGlzLnFjPXRoaXMuRGg9dGhpcy5zZD10aGlzLnFvPXRoaXMueGI9dGhpcy5KYj0hMTt0aGlzLnZjPVtdO3RoaXMubGM9e307dGhpcy5SbT0yMDA7dGhpcy5RZj10aGlzLldjPXRoaXMucmU9dGhpcy5QZj10aGlzLm1mPSExO3RoaXMuY2Y9e319Yy5haj1hO2EucHJvdG90eXBlPXt4bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGc9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoZz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBnfSxoaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5HYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLldhKCksITApO3RoaXMuVW4oKTtlLm8oay5yayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxXZTpmdW5jdGlvbihhLGcsZCxjKXt0aGlzLnhiPQpkO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkIuUyl0aGlzLkJmKyssZS5wYigibmV3U21hbGxBZElkIiksdGhpcy5CLlFrKCksYz1tLmdldENvbmZpZygpLGUueGUmJih0aGlzLkIueW4oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQi5IYSYmdGhpcy5CLmlzRW5hYmxlZD8odGhpcy5oaSgpLG5ldyBSKHRoaXMsYSx0aGlzLnZoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpnLGJpdHJhdGU6Yy5PYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQi5WYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpnPyh0aGlzLmhpKCksCm5ldyBSKHRoaXMsYSx0aGlzLnZoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5CLlZiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5PYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUGEoKTtlbHNle3ZhciBrPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2suV2UoYSxnLGQpfSw1MCl9fSxoZjpmdW5jdGlvbihhKXthLllhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuVmQ9dGhpcy5VYj10aGlzLnNkPSExO3RoaXMuYj1hO3RoaXMuTm4odGhpcy5iKTt0aGlzLmFoKGEpO3RoaXMudmM9dGhpcy5SZyhhKTt0aGlzLlZrKCl9LGFoOmZ1bmN0aW9uKGIpe2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mCmEmJih0aGlzLktkPXRoaXMuT2woYikpLHRoaXMuYWgoYi5wYXJlbnQpKX0sUmc6ZnVuY3Rpb24oYil7dmFyIGM9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoYz10aGlzLlJnKGIucGFyZW50KSksYy5wdXNoKHRoaXMueGwoYikpKTtyZXR1cm4gY30seGw6ZnVuY3Rpb24oYSl7dmFyIGM9IiIsZD1bXTtpZihhJiZhLkomJmEuSi5nZXRBdHRyaWJ1dGUpe2M9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKylkLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpjLGNyZWF0aXZlSUQ6ZH19LE9sOmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGQ9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5KKXtjPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpOwpmPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkouZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLkouZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLkouZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKGs9MDtrPGMubGVuZ3RoO2srKylkLnB1c2goYS5sYihjW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmh9fSxxYTpmdW5jdGlvbihhKXthLllhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGM9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJgooYz1hLmVycm9yLmRldGFpbC5jb2RlKSxhLnBkJiZhLnBkLmVycm9yJiZhLnBkLmVycm9yLmNvZGUmJihjPWEucGQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5ZYy5jb2RlOmM9PUQuY2UuY29kZT9lLm8oay5abyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpOihlLlhlKCksYz09RC5VZi5jb2RlJiZlLm8oay5MbSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKTtlLm8oay5rbCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVm4oKTt0aGlzLlVhKCJlbXB0eSIpO3RoaXMuQi5BYiYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkFiLCEwKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay5Gbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3LlZmLmNvZGU6ZS5vKGsuJG8sCnRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LmVlLmNvZGU6ZS5vKGsuYnAsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJ4bWxwYXJzZSIpO2JyZWFrO2Nhc2Ugdy4kZC5jb2RlOmUubyhrLk1tLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgibm9tZWRpYSIpO2JyZWFrO2Nhc2Ugdy5YZC5jb2RlOmUubyhrLkJvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdy5SZi5jb2RlOmUubyhrLkNvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuVWEoInVua25vd24iKX10aGlzLmZjKGEpO3RoaXMuUGEoKX0sZmM6ZnVuY3Rpb24oYSl7dmFyIGM9CjkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihjPWEuZXJyb3IuY29kZSw5MDE8YyYmKGM9OTAwKSk7Zm9yKGM9eyJbRVJST1JDT0RFXSI6Y307YS5NYS5sZW5ndGg7KXRyeXt2YXIgZD1hLk1hLnBvcCgpO3RoaXMuVmUoZC51cmwsZC50eXBlLGMpfWNhdGNoKGYpe319LE5uOmZ1bmN0aW9uKGEpe3RoaXMudmU9ITE7dGhpcy5nYj10aGlzLmEuSTt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLnhmKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dmFyIGM9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYz10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuZ2IuekluZGV4PWM7Yz10aGlzLmEuQTt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksZj0iIjtkJiZkLmVudnZhcnMmJihmPWQuZW52dmFycygpKTtmLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLmdldEVudmlyb25tZW50VmFyaWFibGVzJiYoZj1kLmdldEVudmlyb25tZW50VmFyaWFibGVzKCkpOwpmLnZpZGVvU2xvdCYmKGM9Zi52aWRlb1Nsb3QsdGhpcy5tZj0hMCl9Y2F0Y2goaCl7fWMuY3E9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGMuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihjLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZjLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLkFrJiZ0aGlzLnBsYXllci5DZSgpJiYoYy52b2x1bWU9dGhpcy5wbGF5ZXIuQ2UoKS8xMDApO2Zvcig7Yy5maXJzdENoaWxkOyljLnJlbW92ZUNoaWxkKGMuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPAphLk0ubGVuZ3RoO2QrKyljLmNhblBsYXlUeXBlKGEuTVtkXS50eXBlKSYmdGhpcy52ayhjLGEuTVtkXS51cmwrIiIsYS5NW2RdLnR5cGUpO3RoaXMubWYmJmMubG9hZCgpO2lmKHRoaXMuZGkoYykpe3RoaXMuVmgoInNldHVwIix0aGlzLldhKCkpO3RoaXMueWsoYyk7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT10aGlzLmdiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLm1mP3RoaXMudmlkZW89Yzp0aGlzLnZpZGVvPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyl9Y2F0Y2gobCl7dGhpcy52aWRlbz1jfX1lbHNlIHRoaXMuYi5XaygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/CmEuc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLmdiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChjKSx0aGlzLkxuKCkpOnRoaXMuYi5vcmlnaW4uSGcody4kZCl9LExuOmZ1bmN0aW9uKCl7dGhpcy5QZj0hMDt0aGlzLnViPXRoaXMucWM9ITE7dGhpcy5hLmMuc2EmJnRoaXMuYS5jLnNhKCkmJihlLm8oay55Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMudWI9ITApO2UudWUoKTt0aGlzLmImJnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4ubWEmJmUuemsodGhpcy5iLm9yaWdpbi5tYSk7dGhpcy5WaCgic2V0dXAiLHRoaXMuV2EoKSk7dmFyIGE9dGhpcy5hLkE7dGhpcy5hLkE9Qi5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5BLGEpO3RoaXMuYS5FaCgpO3RoaXMuYS55ZigpO2ZvcihhPQp0aGlzLmEuSTthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5hLnlmKCk7dGhpcy5nYj10aGlzLmEuSTt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLnhmKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dGhpcy5yYT10aGlzLmEuSTt0aGlzLm5pKCJ2cGFpZCIpO2lmKHRoaXMudWIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5OYigibXV0ZWQiLCJjb250ZW50Iik7ZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX10aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsCiJubyIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5hLkkuYXBwZW5kQ2hpbGQodGhpcy5DKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmUueGYodGhpcy5DLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5DLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLlJsKCksYz10aGlzLmIudS5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fApiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsCiJjb25maWciLGgpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLm1nKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5CKTt0aGlzLkMuc3JjPWE7ZS5wZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMud2EmJiF0aGlzLkxkJiZ0aGlzLmEuYy53YSgpJiZlLm8oay5CYywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEuaGMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMudmM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5ObyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLk9vKCksdGhpcy5hLmhjKCEwKSwhdGhpcy5VYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5VYj17ZWw6dGhpcy5DLApjYjpmdW5jdGlvbigpe3RoaXMuVmQ9ITA7ZS5vKGsucmksdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuUGUodGhpcy5VYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmhjKCEwKSx0aGlzLlNvKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5XbygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5WbygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlhvKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlRvKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPQphLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5kYyk7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLm8oay54Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkIuemN8fHRoaXMuV2MpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goYyl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuUm8oKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUubyhrLmxlLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuUG8oKTsKIkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5XYyYmKHRoaXMuUWY9ITEsdGhpcy5uYygpKSx0aGlzLlFvKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMudWI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLk5iKCJtdXRlZCIsInVzZXIiKSxlLm8oay56ZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKToodGhpcy51Yj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTmIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSGYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksZS5vKGsubGUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLAp0aGlzLnMoKSkpfX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5QYSgpfS5iaW5kKHRoaXMpKTtlLnBlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLmpnKGZ1bmN0aW9uKGEpe2UuaWEodGhpcy5DLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sUG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UubyhrLmplLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnFjPSEwfSxRbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UubyhrLmJkLHRoaXMuYi51LAp0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMucWM9ITF9LFNvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS5vKGsuZ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sUm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuZmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sT286ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5XaCgpO2UubyhrLmJnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlZhKCJzdGFydCIpO2UubyhrLmJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFVvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuc2Q9ITA7dGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpO2UubyhrLlpmLAp0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxWbzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5WYSgibWlkcG9pbnQiKTtlLm8oay5kZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxYbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIik7ZS5vKGsuaGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sVG86ZnVuY3Rpb24oKXt0aGlzLktmKCk7dGhpcy5WYSgiY29tcGxldGUiKX0sc2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5DJiZ0aGlzLkMucGFyZW50Tm9kZSYmdGhpcy5DLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5VYSgidnBhaWRzdG9wcGVkIik7dmFyIGM9dGhpcy5DLnBhcmVudE5vZGU7dGhpcy5DLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5DKTtjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyk7CmUudWUoKTt0aGlzLkM9ITE7dGhpcy5QYShhKX19LE5vOmZ1bmN0aW9uKGEpe3ZhciBjPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWMmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGM9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGMubWF0Y2goZCkpO3RoaXMuVWEoInZwYWlkZXJyb3IiKTtlLm8oay5Zbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuc2koITApfSx2azpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkhhJiZiLmlzRW5hYmxlZCYmIWIuTGMoKSl7dmFyIGM9Yi50YShhKTtyZXR1cm4gYy5wcm90b2NvbCsiOi8vIitjLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9ZChjLHRoaXMuQik7Zi5vbmVycm9yPXRoaXMuS28uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmQoYyx0aGlzLkIpKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LHlrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLm9pLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnBpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuS2YuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5MZi5iaW5kKHRoaXMpKX0sRmQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMub2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5NZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuS2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5MZi5iaW5kKHRoaXMpKX0sb2k6ZnVuY3Rpb24oYSl7dGhpcy5lY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVjfHx0aGlzLk1mKGEpfS5iaW5kKHRoaXMpLHRoaXMuQ2spKX0sTWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZ2QmJnRoaXMuZGkodGhpcy52aWRlbykmJiF0aGlzLkpiJiYhdGhpcy5lYyl7dGhpcy5nZD0hMDt0cnl7aWYoIWUuU2EoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuSmJ8fCh0aGlzLkpiPSEwLHRoaXMuRmQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5XYSgpLCEwKSx0aGlzLkIuRmd8fHRoaXMuQi5kYSgidmlkZW8tbm9vcCIpKTt0aGlzLlBhKCk7cmV0dXJufX1jYXRjaChjKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5XYSgpLCEwKX10aGlzLkhvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEueWYoKTt0aGlzLkdvKCk7dGhpcy5uaSgpO3RoaXMubmcoKTt0aGlzLmEuRWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuQ2YoKX19LENmOmZ1bmN0aW9uKCl7dGhpcy5uZHx8dGhpcy4kZigpfSwkZjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnZpZGVvLnBsYXkoKTtpZihjJiZjWyJjYXRjaCJdKWNbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLm5kfHwoYT90aGlzLlBhKCk6KHRoaXMuYWYoITApLHRoaXMuJGYoITApKSl9LmJpbmQodGhpcykpO2JhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5tYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5tYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5tYy5iaW5kKHRoaXMpKSk6ST1mdW5jdGlvbigpe3RoaXMubmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNmKCkpfS5iaW5kKHRoaXMpO3RoaXMuRWUoKS5TaCh0aGlzKX0sS2Y6ZnVuY3Rpb24oKXt0aGlzLkIuJGEmJiF0aGlzLkpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApLHRoaXMuVmEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS5vKGsucGssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlBhKCl9LHNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxkPSExLGY9MDtmPGEubGVuZ3RoO2YrKylkPWUuV2coYVtmXSksYy5wdXNoKGQpO2E9e2hhc2hlczpjfTthPWsuUmEoYSx0aGlzLnMoKSk7ZS5TbihhKX0sUGE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuV2QmJnRoaXMuc2sodGhpcy5iLldkKTsKaWYoIXRoaXMudmUpaWYodGhpcy52ZT0hMCx0aGlzLlZkfHwoZS5vKGsuT20sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmIud2J8fHRoaXMuYi50Yyl7ZS5wYigibmV3U21hbGxBZElkIik7dGhpcy5CZisrO3RoaXMuZWM9dGhpcy5nZD0hMTt0cnl7dGhpcy5GZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLmdiLnJlbW92ZUNoaWxkKHRoaXMucmEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMuSmQ9ITE7dHJ5e3RoaXMuYS5saSgpfWNhdGNoKGgpe310aGlzLkxkPSEwO3RoaXMuYS5JZSgpO3RoaXMuamM9ITE7dGhpcy5FZSgpLk9oKCk7dGhpcy5iLndiJiZ0aGlzLmIub3JpZ2luLmJmKCk7dGhpcy5iLnRjJiYoYT90aGlzLmIub3JpZ2luLnloKCk6dGhpcy53ZSgpKX1lbHNlIHRoaXMud2UoKX0sCktvOmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRmQodGhpcy52aWRlbyksdGhpcy5MZihhKSl9LExmOmZ1bmN0aW9uKGEpe3RoaXMuZWM9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5CLk5rKCk7dGhpcy5iLm9yaWdpbi5IZyh3LiRkKX0scGk6ZnVuY3Rpb24oKXtpZih0aGlzLnFvKXRoaXMuUGEoKTtlbHNle3RoaXMuamM9ITA7dGhpcy5hLmMud2EmJiF0aGlzLkxkJiZ0aGlzLmEuYy53YSgpJiZlLm8oay5CYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7CnRoaXMudW8oYSk7aWYoIXRoaXMuVWIpe3ZhciBjPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5VYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuVmQ9ITA7ZS5vKGsucmksdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpjLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2UuUGUodGhpcy5VYil9ZD0iIjt0aGlzLmIuQWYmJihjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVWgpKSYmKGQ9dGhpcy5iLkFmLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsCmQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5KZHx8KHRoaXMuSmQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuZmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLmIud2I/KHRoaXMuZWM9dGhpcy5nZD0hMSx0aGlzLkZkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnJhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSmQ9ITEsdGhpcy5hLmxpKCksdGhpcy5iLm9yaWdpbi5iZigpKTp0aGlzLlBhKCl9LmJpbmQodGhpcykpKSksYy5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLmRkLnJlcGxhY2UoIlt0aW1lXSIsZS5RZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLm5lPSEwOwp0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0saWk6ZnVuY3Rpb24oKXt0aGlzLkRofHwodGhpcy5EaD0hMCx0aGlzLnNkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sdW86ZnVuY3Rpb24oYSl7ZS5vKGsubGUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTthPT10aGlzLmppfHx0aGlzLkpifHwoMD09YSYmKHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkFiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuaWkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmlpKCl9LmJpbmQodGhpcykpLHRoaXMuSmJ8fAp0aGlzLldoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkIuJGEmJnRoaXMuVmEoInN0YXJ0IiksZS5vKGsuYmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSxlLm8oay5nZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi80KSYmKHRoaXMuQi4kYSYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuVmEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLnNkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS5vKGsuWmYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSwKZS5vKGsuZGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYi5kdXJhdGlvbi80KSYmKHRoaXMuQi4kYSYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuVmEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUubyhrLmhnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLHRoaXMuamk9YSl9LFZoOmZ1bmN0aW9uKGEsYyl7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGMsITApfSxVbjpmdW5jdGlvbigpe2UuUWQoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sV2g6ZnVuY3Rpb24oKXtlLlFkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFZuOmZ1bmN0aW9uKCl7ZS5RZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrCnRoaXMuV2EoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxVYTpmdW5jdGlvbihhKXtlLlFkKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFZhOmZ1bmN0aW9uKGEpeyh0aGlzLlBmfHx0aGlzLkIuJGEpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5XYSgpLCEwKX0sTmI6ZnVuY3Rpb24oYSxjKXt0aGlzLkIuJGEmJmUudHJhY2soInN0YXRzX2hkXyIrYSxjLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxjKXtpZighdGhpcy5KYil7dGhpcy5jZiYmdGhpcy5jZi50cmFjayYmdGhpcy5jZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmUueGUmJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPQohMH12YXIgZD1bXTt0cnl7ZD10aGlzLlBsKHRoaXMuYi5NYSxhKX1jYXRjaChmKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgaD1kLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmKHRoaXMucmU9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5LZC5pbXByZXNzaW9ucyYmZS5pbShoLnVybCx0aGlzLktkLmltcHJlc3Npb25zKT90aGlzLlZlKGgudXJsLGgudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLm8oay5xayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCkse2FkSWQ6dGhpcy5LZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5zKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuVmUoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWMpdHJ5e3RoaXMuYi5NYT10aGlzLmNsKHRoaXMuYi5NYSxhKX1jYXRjaChtKXt9fX0sV2E6ZnVuY3Rpb24oKXt2YXIgYT1lLlNhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLApjPSIiO3RoaXMuUGYmJihjPSJfdnBhaWQiKTt0aGlzLldjJiYoYz0iX3dlbGVjdCIpO3JldHVybiBhK2N9LFZlOmZ1bmN0aW9uKGEsYyxkLGYsZSl7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGM9dGhpcy5CLnZhKGEpLGQmJmMudWsoZCksZnx8KGY9dGhpcy5FZyksZXx8KGU9dGhpcy5FZyksdGhpcy53ayhhKSx0aGlzLkIuSWEoYyxmdW5jdGlvbigpe3RoaXMuTmgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5OaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sd2s6ZnVuY3Rpb24oYSl7dGhpcy5sY1thXT0ib3BlbiJ9LE5oOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09ImNsb3NlZCJ9LFZrOmZ1bmN0aW9uKCl7dGhpcy5sYz17fX0sWG46ZnVuY3Rpb24oKXt2YXIgYT0wLGM7Zm9yKGMgaW4gdGhpcy5sYyl0aGlzLmxjLmhhc093blByb3BlcnR5KGMpJiYib3BlbiI9PXRoaXMubGNbY10mJmErKztyZXR1cm4gYX0sUGw6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09CmN9KX0sY2w6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWN9KX0sSG86ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLklvLmJpbmQodGhpcykpfSxJbzpmdW5jdGlvbigpe2UuU2EoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMubmMoKTp0aGlzLmIuZGMmJihlLm8oay54Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkIuemN8fHRoaXMuV2MpYT0iX2JsYW5rIjt0cnl7dmFyIGM9d2luZG93Lm9wZW4oIiIsYSk7Yy5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2MuZG9jdW1lbnQubG9jYXRpb24uaHJlZj0KdGhpcy5iLmRjfWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYi5kYyxhKX19LmJpbmQodGhpcyksNTAwKSl9LEdvOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0KImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmRkLnJlcGxhY2UoIlt0aW1lXSIsZS5RZygwKSk7dmFyIGM9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5CLmpkJiYoYz10aGlzLkIuamQpO2MmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRGIuYmluZCh0aGlzKSwxRTMqYyk7dGhpcy5jYXB0aW9uPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSl9fSxEYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5CLmpkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxIZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5CLmpkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sbmk6ZnVuY3Rpb24oYSl7aWYoIWUuRGYodGhpcy5jb250cm9scykpe3ZhciBjPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy4kazt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5IZCgpfS5iaW5kKHRoaXMpKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5LYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmZpLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5laS5iaW5kKHRoaXMpKSxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmVpLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5IZCgpfS5iaW5kKHRoaXMpKTsKZi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkViKCk7dGhpcy5EYigpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihoLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGguc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixoLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuSWI7aC5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9oLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnNvLmJpbmQodGhpcykpOmguYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucm8uYmluZCh0aGlzKSk7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSGQoKX0uYmluZCh0aGlzKSk7CmguYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuVWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChmKTt0aGlzLmIuQWYmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChoKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuU2EoKXx8KHRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLkhkKCl9LmJpbmQodGhpcykpLHRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChkKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsCmMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIsYy5zdHlsZS5kaXNwbGF5PSJub25lIixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGQub25lcnJvcj1mdW5jdGlvbigpe3RoaXMueGEmJih0aGlzLnhhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksZC5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApjLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnhhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5hLmpnKGZ1bmN0aW9uKGEpe3RoaXMueGEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoZS5vKGsueWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLmFmKCkpO3RoaXMuRWIoKX19LEViOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sbmM6ZnVuY3Rpb24oKXsiaGlkZGVuIj09dGhpcy5jb250cm9scy5zdHlsZS52aXNpYmlsaXR5fHx0aGlzLnhhJiYiYmxvY2siPT10aGlzLnhhLnN0eWxlLmRpc3BsYXl8fHRoaXMuUWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGVpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5hLkEucGF1c2VkPwoodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5iZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5BLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLm8oay5qZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkViKCksdGhpcy5EYigpKSl9LGZpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5xYz8oZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJwbGF5IiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnFjPSExKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkViKCksdGhpcy5EYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMucWM9ITApfSxCZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYS5BLnBhdXNlZHx8KHRoaXMuYS5BLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLm8oay5qZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sUWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQS5wYXVzZWQmJih0aGlzLmEuQS5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsCiEwKSxlLm8oay5iZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0scm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKTt0aGlzLmEuQS5tdXRlZD8odGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5OYigidW5tdXRlZCIsInVzZXIiKSxlLm8oay5IZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKToodGhpcy5hLkEubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHNvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy51Yj8oZS5pYSh0aGlzLkMsCiJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJtdXRlIiksdGhpcy51Yj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxhZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMuYS5BLm11dGVkfHwodGhpcy5hLkEubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHdvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy5hLkEubXV0ZWQmJih0aGlzLmEuQS5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLAohMCksdGhpcy5OYigidW5tdXRlZCIsImNvbnRlbnQiKSxlLm8oay5IZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sbWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5tYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5tYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMpO3RoaXMubmR8fHRoaXMubmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNmKCkpfSx3ZTpmdW5jdGlvbigpe3RoaXMucm0oKSYmdGhpcy5xbSgpJiYodGhpcy5CLnNjfHwic3BpZWdlbC5kZSI9PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYicHJlcm9sbCI9PWUuR2ImJnRoaXMudm8oKXx8KHRoaXMubmQ9ITAsdGhpcy54YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy54YiksdGhpcy54Yj0hMSksdGhpcy56ZygpKX0scm06ZnVuY3Rpb24oKXt2YXIgYT0KZS5xZCgpO3JldHVybiB0aGlzLkIuVmImJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0scW06ZnVuY3Rpb24oKXt2YXIgYT0hMSxjPW0uZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciIT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcnx8dGhpcy5lZnx8KGE9ITAsYy5hZEZhbGxiYWNrVVJMfHwoYy5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3JldHVybihhfHwhdGhpcy5yZSYmYy5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuZWZ9LEVsOmZ1bmN0aW9uKCl7dmFyIGE9bS5nZXRDb25maWcoKS5hZEZhbGxiYWNrVVJMLGM9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthfHwic3ZtcHJldmlldyIhPWMuYW5jaG9yfHwoYT0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpO3JldHVybiBhfSx2bzpmdW5jdGlvbigpe20uZ2V0Q29uZmlnKCk7CnRoaXMuZWY9dGhpcy5XYz10aGlzLlFmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0Iix0aGlzLldhKCksITApO3RoaXMucmU9ITA7dmFyIGE9dGhpcy5FbCgpLGE9ZS5tZyhhLHRoaXMuQiwhMSx7b25seVVSTDohMH0pO2lmKCFhKXJldHVybiExO3RoaXMuV2UoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KTtyZXR1cm4hMH0semc6ZnVuY3Rpb24oYSl7dGhpcy5YbigpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemcoITApfS5iaW5kKHRoaXMpLHRoaXMuUm0pOih0aGlzLkxkPSEwLHRoaXMuYS5JZSgpLHRoaXMuYS51bigpLHRoaXMuamM9ITEsZS5vKGsuWmssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLkVlKCkuT2goKSl9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmEmJnRoaXMuYS5jJiYoYT10aGlzLmEuYyk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GYSgibWluVmlzIik7CmEmJihlLk9lKHRoaXMudmlkZW8sYSk/dGhpcy5RaCgpOnRoaXMuQmQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5kYyxhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi53Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnZjJiYwPHRoaXMudmMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnZjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LHM6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLkdrKyItIit0aGlzLkJmO3RoaXMuYiYmdGhpcy5iLlhnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPQp0aGlzLmIuWGcoKSk7cmV0dXJuIGF9LEVnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy5hanx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWE9Yy5DbXx8UWE7bmV3IFFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5sYT1udWxsO3RoaXMuVj1bXTt0aGlzLko9bnVsbDt0aGlzLnVjPXRoaXMud2M9ITE7dGhpcy5tYT0iIjt0aGlzLk9mPSExO3RoaXMuaGg9IiI7ZCYmZC5lbXB0eT90aGlzLkFtKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfQp2YXIgYj0wLGcsZD1bXTtjLmFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnFkKCksYjtiPWUudGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEEodGhpcy51cmwpOm0udmEobS5NZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0uYmluZCh0aGlzKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIGUuRigibWFydGhhc3Rld2FydC5jb20iKXx8ZS5GKCJmYW5kb20uY29tIil8fGUuRigiZ2lnYS5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImRlc2lyZWQuZGUiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxnKCkpe3ZhciBoPWUuQmcodGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbX0uYmluZCh0aGlzKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8aC5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIil9LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpJiYwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil9LmJpbmQodGhpcyksbD1mdW5jdGlvbigpe3JldHVybiAwPT09CmguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTtpZihkKCl8fGcoKXx8aygpfHwiYXBwc3BvdCI9PWMpbCgpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0uTWQoaCkpKyImdHlwZT1qcyIsYj1tLnZhKG0uTWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiLGUudHJhY2soInN0YXRzX2hkX2FkeCIsIiIsITApKTpiPW0udmEobS5NZChoKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJgooYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLklhKGIsdGhpcy56bS5iaW5kKHRoaXMpLHRoaXMud20uYmluZCh0aGlzKSl9LFNnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLmxhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5HYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuR2J8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkdifHx0aGlzLm9tKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxtLmNvKCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7CnZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2RbYl09Zy5maXJzdENoaWxkO2MucHVzaChnKX1jYXRjaChoKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LG9tOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sCmM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0sem06ZnVuY3Rpb24oYSl7dGhpcy5jbihhKTt0cnl7dGhpcy5sYT1hLnJlc3BvbnNlWE1MLHRoaXMubGF8fCh0aGlzLmxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuUWEody5lZSkpfXRoaXMuVj0KdGhpcy5TZygpO3RoaXMud2M9dGhpcy5FZigpO3RoaXMudWM9dGhpcy5haSgpO3RoaXMuaGg9YS51cmxDYWxsZWQ7aWYodGhpcy5WLmxlbmd0aCl0aGlzLk9jKCk7ZWxzZXt0aGlzLnFhKHRoaXMuUWEody5ZYyx7ZXJyb3I6dGhpcy5PZj9ELmNlOkQuVGZ9KSk7dHJ5e2UudHJhY2soInN0YXRzX2hkX210eXVybCIsZS5DYih0aGlzLm1hKSwhMCl9Y2F0Y2goYyl7fX19LEFtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuUWEody5lZSkpfXRoaXMuVj10aGlzLlNnKCk7dGhpcy53Yz10aGlzLkVmKCk7dGhpcy51Yz10aGlzLmFpKCk7dGhpcy5WLmxlbmd0aD90aGlzLk9jKCk6dGhpcy5xYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuT2Y/RC5jZTpELlRmfSkpfSx3bTpmdW5jdGlvbigpe3RoaXMucWEodGhpcy5RYSh3LlNmLHtkZXB0aDpifSkpfSwKT2M6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5WLnNoaWZ0KCk7dGhpcy5zbSgpP3RoaXMubW8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5iaCgpLGcse0FkU3lzdGVtOnRoaXMud2woKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5xYSh0aGlzLlFhKHcuVmYpKTooYj0wLHRoaXMuem8oKSYmdGhpcy5oZih0aGlzLmJsKCkpKX0sYmY6ZnVuY3Rpb24oKXt0aGlzLndjPyh0aGlzLndjPTE8dGhpcy5WLmxlbmd0aCx0aGlzLlYubGVuZ3RoJiZ0aGlzLk9jKCkpOnRoaXMucGFyZW50LmJmKCl9LHloOmZ1bmN0aW9uKCl7dGhpcy51Yz8odGhpcy51Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5PYygpKTp0aGlzLnBhcmVudC55aCgpfSx6bzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmpvKCk/dGhpcy5pbygpPyEwOigtMSE9dGhpcy5HYygpP3RoaXMucWEodGhpcy5RYSh3LlhkKSk6dGhpcy5xYSh0aGlzLlFhKHcuUmYpKSwhMSk6KHRoaXMucWEodGhpcy5RYSh3LlljLApELlVmKSksITEpfSxoZjpmdW5jdGlvbihhKXt0aGlzLm1hfHwodGhpcy5tYT0iIik7YS5XZHx8KGEuV2Q9W10pO2EuV2QucHVzaCh0aGlzLmhoKTthLk1hPWEuTWEuY29uY2F0KHRoaXMuWWUoKSk7YS53Yj1hLndiP2Eud2I6dGhpcy53YzthLnRjPWEudGM/YS50Yzp0aGlzLnVjO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLm1hLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5PZzt0aGlzLnBhcmVudC5oZihhKX0sYmw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgUmE7dGhpcy5tYXx8KHRoaXMubWE9IiIpO2EuZHVyYXRpb249dGhpcy5HYygpO2EuTT10aGlzLlpnKCk7YS5kYz10aGlzLnpsKCk7YS5rcT1bXTthLm9yaWdpbj10aGlzO2EudT10aGlzLnZsKCk7YS5BZj10aGlzLk5sKGEuZHVyYXRpb24pO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLm1hLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5PZztyZXR1cm4gYX0scWE6ZnVuY3Rpb24oYSl7dGhpcy5tYXx8Cih0aGlzLm1hPSIiKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5tYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuT2c7aWYoIXRoaXMuSiYmdGhpcy5sYSYmdGhpcy5sYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj10aGlzLmxhO3RyeXtpZih0aGlzLkomJnRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGM9ITE7KGM9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmYy5sZW5ndGgmJmUudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChkKXt9fXRoaXMuSiYmKGEuTWE9YS5lcnJvci5jb2RlIT13LlhkLmNvZGU/YS5NYS5jb25jYXQodGhpcy5BbCgpKTphLk1hLmNvbmNhdCh0aGlzLkpsKCkpKTt0aGlzLlYubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuZmMmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5mYyYmdGhpcy5wYXJlbnQuZmMoYSksYj0wLHRoaXMuT2MoKSk6Cih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucWEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5xYSYmdGhpcy5wYXJlbnQucWEoYSksYj0wKX0sZmM6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuZmMoYSl9LEhnOmZ1bmN0aW9uKGEsYil7dGhpcy5xYSh0aGlzLlFhKGEsYikpfSxRYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBTYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LG1vOmZ1bmN0aW9uKCl7cmV0dXJuIGI8Z30sam86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlpnKCkubGVuZ3RofSxpbzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuR2MoKX0sRWY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlYuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxhaTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuViYmMjw9dGhpcy5WLmxlbmd0aCYmCiF0aGlzLkVmKCkmJihhPSEwKTtyZXR1cm4gYX0sY246ZnVuY3Rpb24oYSl7dGhpcy5tYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLm1hPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMubWE9IlVOS05PV04ifXRyeXt0aGlzLk9mPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5iaCgpLmxlbmd0aH0sYmg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5EZSh0aGlzLkosIlZBU1RBZFRhZ1VSSSIpfSx3bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRlKHRoaXMuSiwiQWRTeXN0ZW0iKX0sWWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMub2goYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMubGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxvaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLm9oKGEucGFyZW50Tm9kZSk6ITF9LEpsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LEFsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx6bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxPYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksRXA6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMubGIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuT2F8fDFFMzt0cnl7dmFyIGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLApiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksYj1nLmNvbmNhdChlKX1jYXRjaChoKXt9cmV0dXJuIGJ9LHZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMudWQoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LEdjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMubGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sTmw6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5SbihkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LERlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5sYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sR2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGxiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMudWQoYSk6IiJ9LHVkOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLkdlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5ha3x8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmxqfHxUYTtuZXcgVGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLk1hPVtdO3RoaXMuTT1bXTt0aGlzLmRjPSIiO3RoaXMudT10aGlzLnRjPXRoaXMud2I9ITE7dGhpcy5LZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuTGU9IiJ9Yy5Kaj1hO2EucHJvdG90eXBlPXtXazpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk0ubGVuZ3RoO2MrKylpZigwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxIbDpmdW5jdGlvbigpe2lmKCF0aGlzLktlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ubGEpe3ZhciBhPXRoaXMub3JpZ2luLmxhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYz0iIixkPTA7ZDxhLmxlbmd0aDtkKyspKGM9YVtkXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1jLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLktlPWFbZF0pfXJldHVybiB0aGlzLktlfSxYZzpmdW5jdGlvbigpe2lmKHRoaXMuTGUpcmV0dXJuIHRoaXMuTGU7dmFyIGE9IiI7KGE9dGhpcy5IbCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuTGU9YX0sUmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk1bY107cmV0dXJuIGF9fX0pKGMpO3ZhciBSYT1jLkpqfHxSYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLkxpfHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHc9e2VlOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLExhOiJYTUxfUEFSU0VfRVJST1IifSxSZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTGE6IkRVUkFUSU9OX0VSUk9SIn0sWWM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLExhOiJFTVBUWV9WQVNUIn0sVmY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCkxhOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxTZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixMYToiTE9BRF9FUlJPUiJ9LCRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixMYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LAplcDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixMYToiTUVESUFGSUxFX0VSUk9SIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTGE6IkRVTU1ZX0FEIn19LEQ9e1RmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTGE6Ik5PX0FEUyJ9LFVmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixMYToiTk9fTUVESUFGSUxFUyJ9LGZwOnt0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLExhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sY2U6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTGE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlvPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIFZhPWMueW98fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5lcnJvcj1hO3RoaXMucGQ9Yzt0aGlzLk1hPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5PaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFNhPWMuT2l8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5OaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdhPWMuTml8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5QaD1hO3RoaXMudmlkZW89Yzt0aGlzLlRkPVtdO3RoaXMuTWg9W107dGhpcy5kZj1bXTt0aGlzLkpvPQoibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSygpfWMuZ3A9YTthLnByb3RvdHlwZT17SzpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5QaC5sZW5ndGg7YSsrKXt2YXIgYz10aGlzLlBoW2FdLGQ9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtoLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaCk7dmFyIGs9aC5jb250ZW50V2luZG93O2suWnA9CntyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLnJuLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmhuLmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1kO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5UZC5wdXNoKHtzcmM6ZCxmcmFtZTpoLFNtOmUsdmVuZG9yOmMuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTA7Yzx0aGlzLmRmLmxlbmd0aDtjKyspe3ZhciBkPXRoaXMuZGZbY107ZC50eXBlPT09YSYmZC5Jayh0aGlzLkJsKGEpKX19LApCbDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntpcTohMCxocTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntWcDoidmlkZW8iLGxxOiJqc0N1c3RvbSIsbXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxucToxLEZwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sClFsOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5UZC5sZW5ndGg7YysrKWlmKHRoaXMuVGRbY10udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5UZFtjXS5TbTtyZXR1cm4iIn0scm46ZnVuY3Rpb24oYSxjKXt0aGlzLk1oLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLlFsKGMpLHZlbmRvcjpjfSk7dGhpcy5UbigpfSxobjpmdW5jdGlvbihhLGMpeyJ2aWRlbyI9PT1hP3RoaXMuSm8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMua2coYSxjKX0uYmluZCh0aGlzKSk6dGhpcy5rZyhhLGMpfSxrZzpmdW5jdGlvbihhLGMpe3RoaXMuZGYucHVzaCh7dHlwZTphLElrOmMsZnE6ITF9KX0sVG46ZnVuY3Rpb24oKXt0aGlzLk1oLm1hcChmdW5jdGlvbihhKXthLmxtfHwoYS5ZcCh7YWRTZXNzaW9uSWQ6ZS5YKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5qcSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLAphLmxtPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy50bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPWMudG18fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5jb25mPWN8fHt9O3RoaXMuYz1hO3RoaXMua2I9YS5UZygpO3RoaXMuST1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkkuaWQ9ZS5YKDEwKTt0aGlzLkE9Qi5wb3AoKTt0aGlzLkF8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5OYT17fTt0aGlzLmxnPSExOwp0aGlzLmFjPVtdfWMuS2k9YTthLnByb3RvdHlwZT17dWw6ZnVuY3Rpb24oYSl7dmFyIGM9e30sZD0hMSxlPTAsYz0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihjPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD0iZml4ZWQiLGU9Yy5sZWZ0LGM9Yy50b3ApO2g9e3g6ZSx5OmN9O2gucG9zaXRpb249ZDtyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy51bChhKTtmb3IodmFyIGM9MCxkPTAsZT0hMSxoPXRoaXMuWmwoYSksaz17fTthOyljKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGQrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7aCYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCwKYys9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsZCs9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpjLHk6ZH07ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LCRuOmZ1bmN0aW9uKCl7dGhpcy5sZz0hMH0sbGk6ZnVuY3Rpb24oKXt0aGlzLkE9Qi5wb3AoKTt0aGlzLkF8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LEVoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7ZS5vKGsuQmMsdGhpcy5jLmwoKSl9LHVuOmZ1bmN0aW9uKCl7dGhpcy5sZ3x8Cih0aGlzLmMucGxheSgpLGUubyhrLm1kLHRoaXMuYy5sKCkpKX0seWY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSS5zdHlsZS56SW5kZXg9YTt0aGlzLkkuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5JLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkkuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkkuc3R5bGUuYm94U2l6aW5nPXRoaXMua2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuSS5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PXRoaXMua2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkEuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmtiKTsKdGhpcy5jLlJjJiZ0aGlzLmMuUmMoKT90aGlzLmMuVGcoKS5hcHBlbmRDaGlsZCh0aGlzLkkpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5JKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhjLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSxabDpmdW5jdGlvbihhKXtmb3IodmFyIGM9d2luZG93LmdldENvbXB1dGVkU3R5bGUsZD0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGMmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7ZD0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gZH0sc2w6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5nZXRQb3NpdGlvbihhKTtjLnBvc2l0aW9uP2MucG9zaXRpb249Yy5wb3NpdGlvbjpjLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yy53aWR0aD1hLm9mZnNldFdpZHRoO2MuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0OwpyZXR1cm4gY30saGM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5zbCh0aGlzLmtiKTtpZihjLnghPXRoaXMuTmEueHx8Yy55IT10aGlzLk5hLnl8fGMucG9zaXRpb24hPXRoaXMuTmEucG9zaXRpb258fGMud2lkdGghPXRoaXMuTmEud2lkdGh8fGMuaGVpZ2h0IT10aGlzLk5hLmhlaWdodHx8YSl7aWYoMDx0aGlzLk5hLndpZHRoJiYwPHRoaXMuTmEuaGVpZ2h0JiYwPT1jLndpZHRoJiYwPT1jLmhlaWdodCl7dGhpcy5JZSgpO3JldHVybn10aGlzLk5hPWM7dGhpcy5jLlJjKCk/KHRoaXMuSS5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSS5zdHlsZS50b3A9IjBweCIpOih0aGlzLkkuc3R5bGUubGVmdD1jLngrInB4Iix0aGlzLkkuc3R5bGUudG9wPWMueSsicHgiKTt0aGlzLkkuc3R5bGUud2lkdGg9Yy53aWR0aCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9Yy5oZWlnaHQrInB4Ijt0aGlzLkkuc3R5bGUucG9zaXRpb249Yy5wb3NpdGlvbjt0aGlzLkEuc3R5bGUud2lkdGg9Yy53aWR0aCsicHgiOwp0aGlzLkEuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuYWMubGVuZ3RoO2ErKyl0aGlzLmFjW2FdKHt3aWR0aDpjLndpZHRoLGhlaWdodDpjLmhlaWdodH0pfWUuRGYodGhpcy5JKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0samc6ZnVuY3Rpb24oYSl7dGhpcy5hY3x8KHRoaXMuYWM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmFjLnB1c2goYSl9LEllOmZ1bmN0aW9uKCl7dGhpcy5JJiZ0aGlzLkkucGFyZW50Tm9kZSYmdGhpcy5JLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSSk7dGhpcy5BJiZ0aGlzLkEucGF1c2UmJnRoaXMuQS5wYXVzZSgpfX19KShjKTtmb3IodmFyIFlhPWMuS2l8fFlhLEI9W10sWmE9MDsxMDA+WmE7WmErKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPQplLlgoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGJhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgJGE9Yy5UaXx8JGE7bmV3ICRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwKKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlQoYik7dGhpcy5HZChhKTt0aGlzLkNnKCl9LEdkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2EoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiYKYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsYz10aGlzLkdhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWMpYS5jb250YWluZXJJZD1jLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTt2YXIgYWI9Yy5Eanx8YWI7KGZ1bmN0aW9uKGMpe2MuQ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWNhKCk7dGhpcy5ZYj10aGlzLllifHwhMTt0aGlzLmNnPXRoaXMuZWc9CnRoaXMubGg9dGhpcy51YT10aGlzLkdmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucWwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLkdmPSEwO3RoaXMubGgmJnRoaXMudWcoKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5GYjthJiZhLmpjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMua2QoKTt0aGlzLmxoPSEwO3RoaXMudWcoKX0uYmluZCh0aGlzKSk7CnRoaXMucGcoKX0sdWc6ZnVuY3Rpb24oKXtpZighdGhpcy5ZYil7dGhpcy5rZCgpO2lmKCF0aGlzLkdmJiYhdGhpcy5rZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuR2YmJnRoaXMuY2cmJiF0aGlzLmVnJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApfX0sa2Q6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LCRnOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGIubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1iLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YSlyZXR1cm4gZC5pbnN0YW5jZX19LHBnOmZ1bmN0aW9uKCl7aWYodGhpcy5rZCgpKXt2YXIgYT0KdGhpcy4kZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLmVnPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMuY2c9YS5DcH10aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZygpfS5iaW5kKHRoaXMpLDEwMCl9LEdwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLlRwKCk6ITF9LEdjOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5HYygpOi0xfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxxbDpmdW5jdGlvbihhLGIpe3RoaXMuWWI9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuWWJ8fDMwMj09dGhpcy5ZYj90aGlzLnVhPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5ZYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksMTAwKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMudWE/KHRoaXMudygpLHRoaXMub2EoKSk6YS5NZSgpPyh0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLktsKGEpPyh0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGJiPWMuQ2p8fGJiOyhmdW5jdGlvbihjKXtjLkVqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbm06ZnVuY3Rpb24oKXt3aW5kb3cuT08uTmoubmsubGs/d2luZG93Lk9PLk5qLm5rLmxrLkFwKGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ubSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBhPWNhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkZlKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPW5ldyBhYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgYmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIGNiPWMuRWp8fGNiLGRiPW5ldyBjYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMub289YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBlYj1jLm9vfHxlYjtuZXcgZWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMTt0aGlzLmRoKCl9LGRoOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTthJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRoKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sS2E6ZnVuY3Rpb24oKXt0aGlzLkhoKCl9LEhoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5VJiYoMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhoKCl9LmJpbmQodGhpcyksMTAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZmI9Yy5GaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuRWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0scmc6ZnVuY3Rpb24oYSl7dmFyIGI9CmEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLm9hKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMub2EoKTp0aGlzLmcoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMucmcoYS5hZEVycm9yRXZlbnRzKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5yZyhhKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGdiPWMuRWl8fGdiOyhmdW5jdGlvbihjKXtjLkdpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sS2g6ZnVuY3Rpb24oYSl7YT1uZXcgZmIoYSk7YS5qYT90aGlzLlAoKTp0aGlzLkwoYSl8fChhLkdkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLk4oYSksKG5ldyBnYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLnJsfHwodGhpcy5ybD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuS2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLktoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7CnRoaXMuUCgpfX0pfSkoYyk7dmFyIGhiPWMuR2l8fGhiLFM9bmV3IGhiKHIpO1MuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5obD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGliPWMuaGx8fGliO25ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLksuYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LFJjOmZ1bmN0aW9uKCl7dmFyIGE9bDtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFQ9Yy5Xanx8VDsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LmNkKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7CnguY2QoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5QbShhKX0uYmluZCh0aGlzKSk7eC5jZCgiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRCgpfS5iaW5kKHRoaXMpKTt4LmNkKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5VbCgpfSxQbTpmdW5jdGlvbihhKXt2YXIgYj0iIixjO2ZvcihjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSl7Yj1pc05hTihhW2NdKT8hMTphW2NdO2lmKDEwMDk9PWFbY118fDEwMDE9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKXt0aGlzLncoKTt0aGlzLm9hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBhW2NdKWlmKGFbY10uaGFzT3duUHJvcGVydHkoZCkmJihiPWlzTmFOKGFbY11bZF0pPyExOmFbY11bZF0sMTAwOT09YVtjXVtkXXx8CjEwMDE9PWFbY11bZF18fDMwMz09YVtjXVtkXXx8NDAzPT1hW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5vYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkQoKX19KX0pKGMpO3ZhciBVPWMuVmp8fFU7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxiLmxlbmd0aDtjKyspYS5wdXNoKGJbY10pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspYS5wdXNoKGJbY10pO3RoaXMuQWQmJihhPWUuZGwoYSx0aGlzLkFkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFQoZCk7aWYoIXRoaXMuTChkKSl7dGhpcy5OKGQpOwp2YXIgZj1uZXcgVShkLHRoaXMuRyk7Zi5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGM9YVtiXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuQWR8fCh0aGlzLkFkPVtdKSx0aGlzLkFkLnB1c2goYVtiXSksZD1uZXcgVChoKSx0aGlzLkwoZCl8fCh0aGlzLk4oZCksZj1uZXcgVShkLHRoaXMuRyksZi5mKCkpfWNhdGNoKGspe319fXRoaXMuUCgpfSxjZDpmdW5jdGlvbihhLGIsYyl7dGhpcy5hYXx8KHRoaXMuYWE9e30pO3RoaXMuYWFbYV18fCh0aGlzLmFhW2FdPXt9KTt0aGlzLmFhW2FdW2JdfHwodGhpcy5hYVthXVtiXT1bXSk7dGhpcy5hYVthXVtiXS5wdXNoKGMpfSxubzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmFhfHx0aGlzLmFhJiYhdGhpcy5hYVtiXSl0aGlzLk5jfHwKKHRoaXMuTmM9W10pLHRoaXMuTmMucHVzaChhKSx0aGlzLnRuKCkmJih0aGlzLnBmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoYz1hLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbYl1bY10mJjA8dGhpcy5hYVtiXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmFhW2JdW2NdLmxlbmd0aDtkKyspdGhpcy5hYVtiXVtjXVtkXShhKX19LFVsOmZ1bmN0aW9uKCl7aWYodGhpcy5OYylmb3IodmFyIGE9MDthPHRoaXMuTmMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5OY1thXSxjPWIuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoZD1iLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbY11bZF0mJjA8dGhpcy5hYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmFhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5hYVtjXVtkXVtlXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT0KYS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ4Lm5vKGEpfX0pfSkoYyk7dmFyIGpiPWMuWGp8fGpiLHg9bmV3IGpiKHIpO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2I9Yy5ibnx8a2I7bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVyhiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0sd2E6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBsYj1jLkJpfHxsYjsoZnVuY3Rpb24oYyl7Yy5DaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKJCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkQoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwphLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbWI9Yy5DaXx8Cm1iOyhmdW5jdGlvbihjKXtjLkRpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbGIoZCk7dGhpcy5MKGgpfHwodGhpcy5OKGgpLChuZXcgbWIoaCx0aGlzLkcpKS5mKCkpfWNhdGNoKGspe319dGhpcy5QKCl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5KYSlpZihiPT10aGlzLkphW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuRGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBwYj1jLk1pfHxwYjtuZXcgcGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLndnPXRoaXMuRWM9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dmFyIGI9dGhpcy5KZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuRWM9Yik7aWYoIXRoaXMud2cmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fAphLnNvdXJjZS5DSE9PU0VSX0FCKSl7dmFyIGM9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixhLnNvdXJjZS5DSE9PU0VSX0FCfHwiIiwhMCk7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixjLCEwKTt0aGlzLndnPSEwfX19Y2F0Y2goaCl7fX0uYmluZCh0aGlzKSk7dGhpcy5WZygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuZ24odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSxWZzpmdW5jdGlvbigpe2lmKHRoaXMuRWMpcmV0dXJuIHRoaXMuRWM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuSmcoYSkpcmV0dXJuIHRoaXMuRWM9CmF9fSxKZzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiZhLnZpZGVvU2xvdCYmKGI9YSk7YSYmYS5oZHZwYWlkJiYoYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sZ246ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5wYXVzZSYmdGhpcy5lYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5yZXN1bWUmJnRoaXMuZWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiYKdGhpcy5lYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5tdXRlJiZ0aGlzLmVhLm11dGUoKX0uYmluZCh0aGlzKSk7YSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEudW5tdXRlJiZ0aGlzLmVhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sbWg6ZnVuY3Rpb24oYSl7dGhpcy5lYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcWI9Yy55anx8cWI7KGZ1bmN0aW9uKGMpe2MueGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLnRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLnRpJiYodGhpcy5nKCksdGhpcy50aT0hMCx0aGlzLmthKCkpOwpiLkdhKCkuYWRkRXZlbnRMaXN0ZW5lcihhLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuVmcoKT90aGlzLkQoKToodGhpcy55ZXx8KHRoaXMueWU9MSksdGhpcy55ZSsrLDEwMDx0aGlzLnllP3RoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgcmI9Yy54anx8cmI7KGZ1bmN0aW9uKGMpe2Muemo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBhPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyBxYihhW2RdKSx0aGlzLkwoYyl8fCh0aGlzLk4oYyksKG5ldyByYihjLHRoaXMuRykpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTsKdmFyIHNiPWMuemp8fHNiLFY9bmV3IHNiKHIpO1YuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5RbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRiPWMuUW18fHRiO25ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmZrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LEthOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5VPygwLHRoaXMuVSkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuZmt8fHViOyhmdW5jdGlvbihjKXtjLmVrPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEljOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSwKYT1hLmdldFJhd1BsYXllcigpO3JldHVybiBhLmltYUFkc0xvYWRlcn0sZW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMub2EoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuZygpO3RoaXMuZ2V0UGxheWVyKCk7CnRoaXMuQmE/dGhpcy5lbih0aGlzLkJhKToodGhpcy5CYT10aGlzLkljKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuRCgpO3JldHVybn1pZighdGhpcy54Yyl7dGhpcy5EKCk7cmV0dXJufWE9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmViLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmViW2JdJiYzMDMhPXRoaXMuZWJbYl0mJjQwMyE9dGhpcy5lYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMub2EoKTtlbHNle3RoaXMuRCgpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMuZWt8fHZiOyhmdW5jdGlvbihjKXtjLmdrPQp0LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLlRhPS0xO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGM9bmV3IHViKGEuaXRlbShiKSk7dGhpcy5MKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGMpLChuZXcgdmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHdiPWMuZ2t8fHdiLHhiPW5ldyB3YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB5Yj1jLmJtfHx5YjtuZXcgeWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Saj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuamY9ITF9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLldtKCl9LmJpbmQodGhpcyksNTAwKX0sV206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5VJiZ0aGlzLlUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksCmI9MDthLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYj1hLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuamYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuamYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXbjpmdW5jdGlvbigpe3RoaXMuamY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciB6Yj1jLlJqfHwKemI7KGZ1bmN0aW9uKGMpe2MuUWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLnBjPTB9LGY6ZnVuY3Rpb24oKXt0aGlzLkVtPTEwO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5wY3x8KHRoaXMucGM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5nKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8Cih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKToodGhpcy5wY3x8dGhpcy5wYysrLHRoaXMucGM8PXRoaXMuRW0/KHRoaXMucGMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAo1MDApKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5XbigpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQWI9Yy5Ranx8QWI7KGZ1bmN0aW9uKGMpe2MuU2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgemIod2luZG93LnBsYXllckFwaSksdGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgQWIoYSwKdGhpcy5HKSkuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgQmI9Yy5Tanx8QmIsQ2I9bmV3IEJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIERiPWMueG98fERiO25ldyBEYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0iIjthLmN1cnJlbnRUaW1lJiYoYj1hLmN1cnJlbnRUaW1lKTtyZXR1cm4gYn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sS2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5VKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEViPWMuUGp8fEViOyhmdW5jdGlvbihjKXtjLk9qPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5HYSgpLGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZztiJiZiLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7YS5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuWGsoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5CYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMudW0oKTp0aGlzLnRnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFnKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5nKCEwKSl9LmJpbmQodGhpcyksCjFFMyl9LFhrOmZ1bmN0aW9uKCl7dGhpcy5hZygpfHx0aGlzLmcoITApfSx1bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQmIoKTshYS5uYSYmYS5WJiZhLnpwJiZhLkJwJiYodGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZygpKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7YS5hZHNMb2FkZXI/YS5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBjO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihjIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2NdKXtjPWFbY107YnJlYWsgYX1jPXZvaWQgMH0xMDA5PT1jfHwzMDM9PWN8fDQwMz09Yz8odGhpcy53KCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZygpfS5iaW5kKHRoaXMpLDEwMCl9LEJiOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2gpZm9yKHZhciBhPQpjLlpjLkJiKCksYj10aGlzLmdldFBsYXllcigpLkdhKCkuaWQsZT0wO2U8YS5sZW5ndGg7ZSsrKWFbZV0uaWQ9PWImJih0aGlzLkNoPWFbZV0pO3JldHVybiB0aGlzLkNofSxVcDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxnOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2E/dGhpcy5CYigpLmFkc0xvYWRlcj90aGlzLkQoITApOnRoaXMuRCgpOnRoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBGYj1jLk9qfHxGYjsoZnVuY3Rpb24oYyl7Yy5aYz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFBrOmZ1bmN0aW9uKGEpe2E9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgRmIoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Yy5aYy5CYigpO2lmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXRoaXMuUGsoYVtiXSk7dGhpcy5QKCl9fSk7Yy5aYy5CYj1mdW5jdGlvbigpe3ZhciBhPVtdO2lmKGwmJmwucGxheWVyYXBpJiYoYT1sLnBsYXllcmFwaSgpKSYmYS5sZW5ndGgpcmV0dXJuIGE7dmFyIGE9W10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSwKYltjXSYmYltjXS5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kJiZhLnB1c2goYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCksYltjXSYmYltjXS5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuZmVybW9kJiZhLnB1c2goYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuZmVybW9kKTtpZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgR2I9Yy5aY3x8R2IsSGI9bmV3IEdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEliPWMuJGl8fEliO25ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnVqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCks6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RSYmKGE9YS5maXJzdENoaWxkKTtpZihhKXt0aGlzLlQoYSk7aWYoYS50YWdOYW1lKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1iP3RoaXMuVyhiKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxTcDpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe2lmKEUpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmIWEucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxSYzpmdW5jdGlvbigpe3JldHVybiEwfSxHYTpmdW5jdGlvbigpe3ZhciBhO0U/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFc9CmMudWp8fFc7KGZ1bmN0aW9uKGMpe2MudGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMua2Y9IiI7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthJiYodGhpcy5rZj1hLmlkKTtFP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYz1hLnBsYXllckNvbnRhaW5lcjtjJiZ0aGlzLmtmJiZjIT10aGlzLmtmfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuRigidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEuJHApLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJgoodGhpcy5tKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFg9Yy50anx8WDsoZnVuY3Rpb24oYyl7Yy52aj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRSlmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBXKGEpLGEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBYKGEsdGhpcy5HKSxhLmYoKSl9ZWxzZSBpZihhPQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYT1uZXcgVyhhKSxhLmphP3RoaXMucGYoKTp0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIEUsSmI9Yy52anx8SmIsS2I9bmV3IEpiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBMYj1jLlVtfHxMYjtuZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5ZaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLApjPWEuR2V0RWwoKSxiJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLlooKSk6dGhpcy5aKCk6dGhpcy5aKCk6dGhpcy5aKCl9LHduOmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LHdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxYcDpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBNYj1jLllpfHxNYjsoZnVuY3Rpb24oYyl7Yy5YaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5xZygpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMua2EoKX0uYmluZCh0aGlzKSl9LHFnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj1hLkdldEFkRXJyb3JzQ2FjaGUoKSxjPTA7YzxiLmxlbmd0aDtjKyspdGhpcy5oYW5kbGVFcnJvcihiW2NdKTthLkNsZWFyQWRFcnJvcnNDYWNoZSgpfSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhKXtpZihudWxsPT0KYSl0aGlzLnFnKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuZygpKX19LGc6ZnVuY3Rpb24oYSl7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIE5iPWMuWGl8fE5iOyhmdW5jdGlvbihjKXtjLlppPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcms7YXx8KGE9d2luZG93LlRPbmxpbmVNZWRpYXBsYXllckZyYW1ld29yayk7aWYoYSYmYS5HZXRBbGxQbGF5ZXJzJiYoYT1hLkdldEFsbFBsYXllcnMoKSkmJjA8YS5sZW5ndGgpZm9yKHZhciBiPQowO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1uZXcgTWIoYVtiXSk7Yy5qYXx8dGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgTmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIE9iPWMuWml8fE9iLFBiPW5ldyBPYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBRYj1jLkltfHxRYjtuZXcgUWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKXtmb3IodmFyIGI9YT1hWzBdO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTsKYnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuWigpfSxSZDpmdW5jdGlvbihhKXt2YXIgYj0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9iPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6e319KTooYj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxiLmluaXRDdXN0b21FdmVudChhLCExLCExLGRhdGEpKTtiJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChiKX0sZm46ZnVuY3Rpb24oKXt0aGlzLlhjPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXtpZihhLmRldGFpbCYmImFkUmVxdWVzdCI9PWEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuWGN8fCh0aGlzLlhjPSEwLHRoaXMuUmQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChiKXt9fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSwKcGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlhjJiYodGhpcy5SZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlhjPSExKSx0aGlzLlJkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LHdhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgUmI9Yy5qa3x8UmI7KGZ1bmN0aW9uKGMpe2MuaWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sTGg6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2E/KGEmJmEuYWRkRXZlbnRMaXN0ZW5lciYmKGEuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLAphLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iYyhhKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKSksYSYmYS5hZGRBZEVycm9yTGlzdGVuZXImJmEuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuYmMoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkxoLmJpbmQodGhpcyksMTApfSxiYzpmdW5jdGlvbihhKXt2YXIgYj17fTthLmdldEVycm9yJiYoYS5nZXRFcnJvcigpLGI9YS5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMub2s9CiEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fDMwMz09Yi5nZXRFcnJvckNvZGUoKXx8NDAzPT1iLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMuZygpKToodGhpcy5va3x8dGhpcy5tKCJub2ZyYW1ld29yayIpLHRoaXMuZygpKX0sWWY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYT0wO2E8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YSsrKXRoaXMuYmMod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFthXSk7dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLllmLmJpbmQodGhpcyksMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuTGgoKTt0aGlzLllmKCk7dGhpcy5qbigpfSxqbjpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmRuP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihhKXt0aGlzLmRuPSEwO2lmKGEmJmEuZGV0YWlsKWZvcih2YXIgYiBpbiBhLmRldGFpbCkiYWRUYWdVcmwiPT1iJiYoYS5kZXRhaWxbYl18fHRoaXMuYmMoYSkpfX0pfSkoYyk7dmFyIFNiPWMuaWt8fFNiOyhmdW5jdGlvbihjKXtjLmtrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGE9bmV3IFJiKHdpbmRvdy5ETDhfR0xPQkFMUyk7YS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGEuZm4oKSxhPW5ldyBTYihhLHRoaXMuRyksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLAphLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgVGI9Yy5ra3x8VGIsVWI9bmV3IFRiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuamw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYj1jLmpsfHxWYjtuZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5aaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLkZoPSExO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb01vZGVsKXt2YXIgYj1hLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYil7dGhpcy5UKGIpO3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVyhjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihhKXt0aGlzLkptPWF9LmJpbmQodGhpcykpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX1lbHNlIHRoaXMuWigpfSx3bjpmdW5jdGlvbigpe30sc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MTtyZXR1cm4gYS52aWRlb01vZGVsJiZhLnZpZGVvTW9kZWwuZ2V0JiYoYj1hLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGIpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KbX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFI6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuUGQoYSl9LmJpbmQodGhpcykpfSxQZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiYhdGhpcy5GaCYmKHRoaXMuRmg9ITAsdGhpcy5VJiZ0aGlzLlUoKSl9fSl9KShjKTt2YXIgTj1jLlpqfHxOOyhmdW5jdGlvbihjKXtjLllqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5CZSlpZih0aGlzLkhifHwKKHRoaXMuSGI9MCksdGhpcy5IYisrLDE1PHRoaXMuSGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhKXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuSm4oKTp0aGlzLmcoITApLCEwO3RoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKTthLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMuZygpOnRoaXMuZyghMCl9ZWxzZSBpZihhPWEudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkJlPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsCmZ1bmN0aW9uKGEpe3RoaXMuY2EoYSk7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk89YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPQphLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CYSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIE89Yy5Zanx8TzsoZnVuY3Rpb24oYyl7Yy4kaj0KdC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpO3RoaXMuVGE9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBhPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7YS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHwKdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5wZigpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIFdiPWMuJGp8fFdiLFhiPW5ldyBXYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYj1jLkVrfHxZYjtuZXcgWWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5xaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSwKUjpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWT1jLnFqfHxZOyhmdW5jdGlvbihjKXtjLnBqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmloPTA7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPXRoaXMuS2M9dGhpcy5CYT10aGlzLmVkPSExO3RoaXMuSmg9ZS5MYigxMCk7dGhpcy5xaCgpfSxxaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLnNiKCksITA7dGhpcy5paCsrO2lmKDEwPHRoaXMuaWgpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMuZyghMCk6dGhpcy5nKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5xaC5iaW5kKHRoaXMpLDEwMCksITF9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuY2EoYSwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuY2EoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuYmEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PQphLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLnVhPQohMH0sYmE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCk/KHRoaXMudygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJmIuYXBpLnBsYXllZCgpP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgWj1jLnBqfHxaOyhmdW5jdGlvbihjKXtjLnJqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBZKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWSh3aW5kb3cucGxheWVyKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWihhLHRoaXMuRyksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLnJqfHxaYiwkYj1uZXcgWmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy4kbHx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsCmI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgYmM9Yy5WaXx8YmM7KGZ1bmN0aW9uKGMpe2MuVWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2coKX0sc2c6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBjYz1jLlVpfHwKY2M7KGZ1bmN0aW9uKGMpe2MuV2k9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGJjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmphKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTChhKSl7dGhpcy5OKGEpOyhuZXcgY2MoYSx0aGlzLkcpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYz1jLldpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmM9Yy5Va3x8ZmM7bmV3IGZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLndpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5aKCkpOnRoaXMuWigpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgZ2M9Yy53aXx8Z2M7KGZ1bmN0aW9uKGMpe2Mudmk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcykpO3RoaXMuc2UoKTt0aGlzLm9nKCl9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LENhOmZ1bmN0aW9uKCl7dGhpcy51YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sb2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5vYSgpKTp0aGlzLmcoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9nLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuc2UuYmluZCh0aGlzKSwxMDApfSxzZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5nKCk6dGhpcy5nKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX19LGc6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5rYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIGhjPWMudml8fGhjOyhmdW5jdGlvbihjKXtjLnhpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sUmE6ZnVuY3Rpb24oYSl7YT0KbmV3IGdjKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgaGMoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuUmEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlJhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIGljPWMueGl8fGljLGpjPW5ldyBpYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYz1jLm5sfHxrYztuZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMucmg9dGhpcy50aD10aGlzLnNoPSExO3RoaXMuQ2Q9W107dGhpcy5vZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHphP251bGw6emEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgUz9udWxsOlMsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHVhP251bGw6dWEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFhiP251bGw6WGIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFViP251bGw6VWIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9iP251bGw6b2IsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGRiP251bGw6ZGIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBDYj9udWxsOkNiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeGI/bnVsbDp4YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6Vn19Yy5Maj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLkxsKGEpOltdLGM7dGhpcy50aD0hMDtpZihhLmxlbmd0aCl7dGhpcy5zaD0hMDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyljPWFbZF0sCnRoaXMuUmgoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLm9mKXtpZih0aGlzLnJoKWJyZWFrO2M9dGhpcy5vZltkXTt0aGlzLkpmKGMpJiYodGhpcy5DZC5wdXNoKGMpLHRoaXMuUmgoYykpfX0sSmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxMbDpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspZD1hW2VdLGQ9dGhpcy5vZltkXSx0aGlzLkpmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LFJoOmZ1bmN0aW9uKGEpe3RoaXMuSmYoYSkmJmEuZigpfSxZbjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcSYmIXRoaXMuc2gpZm9yKHRoaXMucmg9ITAsYT0wO2E8dGhpcy5DZC5sZW5ndGg7YSsrKXRoaXMuQ2RbYV0uU2ImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZFthXS5TYil9fX0pKGMpO3ZhciBsYz1jLkxqfHxsYyxMPW5ldyBsYztMLmYoKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5nbHx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuRmMoay5BbyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsCmMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuTm0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtDLndpZHRoPTE7Qy5oZWlnaHQ9MTtDLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChDKTt2YXIgcWM9Qy5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1DLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChDKTt2YXIgRz1uZXcgSCxsPSExO0cuZmEoKTtHLm5oKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5mYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcubmgoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LAohMSk7Ry5mYSgpO3ZhciByYz1xYyhmdW5jdGlvbigpe2UuTmcod2luZG93LEcuZG0oKSx7aWQ6cmN9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlNpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy5TaXx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkdoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy54ZD0wO3RoaXMuYmI9IiI7dGhpcy5EZD1bXTt0aGlzLkVkPTA7dGhpcy5JaD0hMTt0aGlzLmxmPVtdO2UucGIoIm5ld0FkZGVsaXZlcnkiKX1jLnlpPWE7YS5wcm90b3R5cGU9e0ZuOmZ1bmN0aW9uKGEpe3RoaXMuR2g9YX0sdmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmJiPXRoaXMucGxheWVyLlIoKX0sCmdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQW46ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSx6bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm5iKTsKdmFyIGQ9ITEsZj0hMTtpZih0aGlzLmVtKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5wYSx0aGlzLm5iLm5mLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5XbCgpKXRoaXMudm4oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuJG4oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsaCk7bC54bih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuRG0oYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwKInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuVWUmJihkPXRoaXMucGxheWVyLlVlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLldlKGEsZCxmKTt0aGlzLnBsYXllci5TaChsKX19LGVtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMueGQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy54ZC5nZXRUaW1lKCksdGhpcy54ZD1hLDNFNTxjPyEwOiExO3RoaXMueGQ9YTtyZXR1cm4hMX0sUW46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS51ZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuRmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLklnKGEpKT90aGlzLlNjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksCjApLGUubyhrLm1kLHRoaXMucGxheWVyLmwoKSkpfSxQbjpmdW5jdGlvbihhKXtpZighdGhpcy5HaCl7ZS51ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuRm4oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuSWcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS5vKGsubWQsdGhpcy5wbGF5ZXIubCgpKSl9fSxJZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sbW46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Nbih0aGlzLlBuLmJpbmQodGhpcykpOwp0aGlzLnBsYXllci5LYSgpfSxJZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS51ZigibWlkcm9sbCIpO2lmKCF0aGlzLndoKXt0aGlzLndoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm1kLHRoaXMucGxheWVyLmwoKSkpfX0sbG46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Fbih0aGlzLklkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlplKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlFuKCk7dGhpcy5wbGF5ZXIuWmUmJnRoaXMubG4oKTt0aGlzLm1uKCl9LG5uOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/CmE9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkRkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5jcChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuRWQ9dGhpcy5EZC5sZW5ndGh9LFdsOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkVkJiYoYT0hMCk7cmV0dXJuIGF9LHZuOmZ1bmN0aW9uKGEpe3RoaXMuSWg9YTtmb3IoYT0wO2E8dGhpcy5EZC5sZW5ndGg7YSsrKXRoaXMuRGRbYV1bImZ1bmN0aW9uIl0odGhpcy4kbS5iaW5kKHRoaXMpKX0sJG06ZnVuY3Rpb24oYSl7dGhpcy5FZC0tO2EmJnRoaXMubGYucHVzaChhKTswPj10aGlzLkVkJiZ0aGlzLkloKCl9LERtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0iIixkPTA7ZDx0aGlzLmxmLmxlbmd0aDtkKyspYz0KdGhpcy5sZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy55aXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLnBsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoZWVCaWNoYWhNaWFNZWVHaCxlZUJpY2hhaE1pYU1lZUdoKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
144.76.115.236 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.236.115.76.144.clients.your-server.de
Software
AmazonS3 /
Resource Hash
b1ae253cba132ab2566227a6f5a59ea9a90cdffef6f6bf06c55a222ed3afef53

Request headers

Referer
https://videos.giga.de/embed/78410589?autoplay=0
Origin
https://videos.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
Content-type
application/x-www-form-urlencoded

Response headers

Date
Tue, 03 Dec 2019 12:58:41 GMT
Connection
keep-alive
Content-Length
724
Last-Modified
Mon, 18 Nov 2019 12:24:40 GMT
Server
AmazonS3
Etag
"bb9cc8757cf3880ea4d6e84944c9118b"
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-3
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
hic_qos
ssl.1.damoh.giga.de/ Frame 34FB
24 B
409 B
XHR
General
Full URL
https://ssl.1.damoh.giga.de/hic_qos?ads&adserv=1&_werbebanner_&simple_ad_
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGVlQmljaGFoTWlhTWVlR2g9ZWVCaWNoYWhNaWFNZWVHaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZmZ8fCh4LmZmPTApO3guZmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5mZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5IayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2IudmYoYyk7Yi5BbihtKTtiLnpuKGwpO2Iubm4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Jbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS51aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudWgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmlsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5pbHx8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuSGs9ITE7dGhpcy5HYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlptLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5naD17fTt0aGlzLnNmPSExfWMuY2o9YTthLnByb3RvdHlwZT17Wm46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt0aGlzLnNmfHwodGhpcy5zZj1lLlgoMTApKTtyZXR1cm4gdGhpcy5zZn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmdoW2JdJiYodGhpcy5naFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLlpuKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx6azpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sWm06ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuWW0oYi5kYXRhKX0sWW06ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxCZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5XZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMueWQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxXZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSx4azpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnRhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnRsKGIpKXJldHVybjsoYT10aGlzLkJnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx0bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTGc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHBtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFVnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxLbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHhmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuYWwoYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuS24oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sSms6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGFsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5KayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxEZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxwaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxMYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFRoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LGttOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scWQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLmFjPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0FpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEhpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LAphbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxGajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxoazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sc2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxVajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LERrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuQWkoKXx8Yi5IaSgpfHxiLmFtKCl8fGIuRmooKXx8Yi5oaygpfHxiLnNqKCl8fGIuVWooKX19O3JldHVybiBudWxsIT1iLkRrKCl9LHlsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sdGE6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxDYjpmdW5jdGlvbihiKXtiPXRoaXMudGEoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LE1sOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMudGEoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxkbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxSbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxRZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMua2koYSkrIjoiK3RoaXMua2koTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGtpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx1ZjpmdW5jdGlvbihiKXt0aGlzLkdiPWJ9LE5nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuR2I7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxhbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLk1sKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sU246ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmdjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5hbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLnZhKGIsITApO2I9bS52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS52YShmLCEwKTtmPW0udmEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFFkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS52YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uT2soKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnVkKGIpOiIifSx1ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG1nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy5wbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnFmJiZ3aW5kb3cuc2FuZGJveC5xZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLkxnKGIpKXJldHVybiB0aGlzLkxnKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS53ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy54ayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixlKTtlPWsudmEoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHlkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSx5bTpmdW5jdGlvbihiLGEsZCl7dGhpcy55ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx1aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMueW0oZi53ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCkluOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGNwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxGazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0saW06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuY2p8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLmJqPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuVG09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuTW09e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuWm89e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5rbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmJwPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuZ2c9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuWmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5kZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5oZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EucGs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuYmc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Gbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EubGw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS4kbz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS54Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLlprPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5tZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5mZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eucms9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5iZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnFrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5yaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLk9tPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuemQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS55Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuWW89e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuQm89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkNvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Bbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLk5tPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5ianx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLmZsfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxJbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdGQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnRkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudGQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudGQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG5oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5JbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnRkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmRqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5oaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLmhqfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuSWk9YX0pKGMpO3ZhciBLPWMuSWl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Ca3x8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Laj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTWI9MDt0aGlzLlRhPTE1MDt0aGlzLlNiPTA7dGhpcy5CbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGE/KHRoaXMuTWIrKyx0aGlzLlNiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5TYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHRuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWI+dGhpcy5UYT8hMDohMX0scGY6ZnVuY3Rpb24oKXt0aGlzLk1iPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxCbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sR2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudGgmJkwuWW4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxqbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLktqfHx0OyhmdW5jdGlvbihjKXtjLk1qPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5NYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRmI9IiI7dGhpcy5EZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKTW46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sRW46ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGEmJih0aGlzLk1iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVGc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sR2Q6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5YbCgpfHx0aGlzLnRrKCk7dGhpcy5HZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHRrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sWGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx3YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxTaDpmdW5jdGlvbihhKXt0aGlzLkZiPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmJ9LE9oOmZ1bmN0aW9uKCl7dGhpcy5GYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRmImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkRnfHwodGhpcy5EZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLk1qfHxxOyhmdW5jdGlvbihjKXtjLnppPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuV2Y9IjEiO3RoaXMuWGY9IjIiO3RoaXMubWs9IjMiO3RoaXMuJGM9MDt0aGlzLkZtPQozMDt0aGlzLlhiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5pZz10aGlzLm1pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMudmYoYSk7dGhpcy5DbihiKX0sZjpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLm1pfHwodGhpcy5taT0hMCxlLlhlKCkpfSxBaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGNtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmdjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5nYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV09MX0sZ206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZ2MoKSYmKHRoaXMud2YoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy56YSgpKXt0aGlzLmNtKCk7aWYoIXRoaXMuZ20oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMud2YoKTtyZXR1cm59dGhpcy53ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuZ2koKTt0aGlzLmlnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy56YSgpfHwodGhpcy5YYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGdpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5YYiYmMDx0aGlzLlhiLmxlbmd0aCYmKHRoaXMuWGI9ZS51bmlxdWUodGhpcy5YYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWGIuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLldmfSx3ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWGZ9LEpuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ta30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxhZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5XZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWGZ9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx2ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LENuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxHbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEJtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy56aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkJqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5Canx8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUGk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUGl8fG5hOyhmdW5jdGlvbihjKXtjLlFpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubmE/Yi5uYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlFpfHxvYTsoZnVuY3Rpb24oYyl7Yy5SaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5SaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLnRvfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5uaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuS2coKTt0aGlzLk1nKCk7dGhpcy5Zaz0hMX0sS2c6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxNZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5JZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSWQoYil9LmJpbmQodGhpcykpfSxJZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5uanx8cmE7KGZ1bmN0aW9uKGMpe2MubWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuaGU9ITE7dGhpcy5rZT0xO3RoaXMuYWQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuaGU9ITE7dGhpcy5rZT0xO3RoaXMuYWQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTtpZihhLmdldENvbmZpZylpZihiPWEuZ2V0Q29uZmlnKCksYi5hZHZlcnRpc2luZyl7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSlpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcyliLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5rZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMueWI9ITApO2Vsc2V7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSBpbnN0YW5jZW9mIEFycmF5KWZvcih2YXIgZz0wO2c8Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5sZW5ndGg7ZysrKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGVbZ10udGFnKXt0aGlzLnliPSEwO2JyZWFrfWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMueWI9ITApO2IuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMueWI9ITApfWIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy55Yj0hMCl9ZWxzZSB0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpO2Zvcih2YXIgZD0KImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGc9MDtnPGQubGVuZ3RoO2crKylhLm9uKGRbZ10sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtnXSYmKHRoaXMuaGU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtnXSYmdGhpcy5BaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLkZtJiYhdGhpcy56YSgpJiYodGhpcy55Yj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5nKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoZXZlbnQuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKTthLm9uKCJwbGF5bGlzdGl0ZW0iLApmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLllrPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5GYjtiJiYoYi5CZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmFkLmluZGV4T2YoYikmJnRoaXMuYWQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy53KCksdGhpcy5vYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMudygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLmFkLmxlbmd0aD49dGhpcy5rZSYmdGhpcy5nKCkpfSwKQm06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRGYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmhlfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuS2coKSxiLk1nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciBzYT1jLm1qfHxzYTsoZnVuY3Rpb24oYyl7Yy5vaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT0KdGhpcy5DbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2E9W107aWYoMTxiLmxlbmd0aClmb3IoZz0wO2c8Yi5sZW5ndGg7ZysrKWEucHVzaChiW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBhLnB1c2goandwbGF5ZXIoKS5pZCk7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpO3RoaXMuTChnKXx8dGhpcy5qbShnKXx8KHRoaXMuTihnKSxnPW5ldyBzYShnLHRoaXMuRyksZy5LKCksZy5mKCkpfX10aGlzLlAoKX19LEpwOmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LENsOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS56YihhLmFuY2hvcil9fSl9KShjKTt2YXIgdGE9Yy5vanx8dGEsdWE9bmV3IHRhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ibz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuYm98fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmNrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCks6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEpe3ZhciBiPWEuZWxfO2J8fChiPWEuZWwoKSk7Yj8odGhpcy5UKGIpLChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlcoYSk6dGhpcy5aKCkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYSl7dGhpcy5QZChhKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFiWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGEuYXV0b3BsYXk/YS5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sd2E6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHdhPWMuY2t8fHdhOyhmdW5jdGlvbihjKXtjLmJrPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMudWE9dGhpcy5LYz10aGlzLkJhPXRoaXMuZWQ9ITE7dGhpcy5KaD1lLkxiKDEwKTt0aGlzLklmPSEwO3RoaXMueGM9dGhpcy5raD0hMTt0aGlzLkttKGEuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy56aCgpLHRoaXMuS2soKSx0aGlzLnNiKCkpfSxLbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLAoiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGEuViwiOyIsdHlwZW9mIGEuViwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYS5WP2EuVi5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGEuVj90eXBlb2YgYS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYS5pbWEsIjsiLHR5cGVvZiBhLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGEuSCwiOyIsdHlwZW9mIGEuSCwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLmltYT9hLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuRWE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuRWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILkVhOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguRWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5pbWEmJmEuaW1hLkVhP2EuaW1hLkVhKCk6InVuZGVmaW5lZFgiLCI7IixhLmltYSYmYS5pbWEuRWE/dHlwZW9mIGEuaW1hLkVhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5mZToKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuZmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixhLkg/YS5ILmZlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguZmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILmdlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguZ2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubmE6InVuZGVmaW5lZFgiLCI7IixhLkg/CnR5cGVvZiBhLkgubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5xZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuSmgpfSxIYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5pbWEzJiYodGhpcy5pbWE9YS5pbWEzKTtpZihhLmltYSl7dGhpcy5pbWE9YS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmCih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LEljOmZ1bmN0aW9uKCl7aWYoIXRoaXMubmEpe3ZhciBhPXRoaXMuSGMoKTthJiYoYS5hZHNMb2FkZXImJih0aGlzLm5hPWEuYWRzTG9hZGVyKSxhLl9hZHNMb2FkZXImJih0aGlzLm5hPWEuX2Fkc0xvYWRlciksYS5nZXRBZHNMb2FkZXImJih0aGlzLm5hPWEuZ2V0QWRzTG9hZGVyKSxhLmNvbnRyb2xsZXImJmEuY29udHJvbGxlci5zZGtJbXBsJiZhLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm5hPWEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm5hfSxZZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LGhtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuamgpe3ZhciBhPQp0aGlzLkhjKCksYj10aGlzLmZtKCk7d2luZG93LmltYSYmYSYmKGEuX2Fkc0xvYWRlcnx8YS5hZHNMb2FkZXJ8fGIpJiYodGhpcy5qaD0hMCl9cmV0dXJuIHRoaXMuamh9LGZtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5lZCYmYS5hZHMmJihhLmFkcy5zdGF0ZXx8YS5hZHMuX3N0YXRlKSYmKHRoaXMuZWQ9ITApO3JldHVybiB0aGlzLmVkfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWMoKTtpZihhKXt2YXIgYj0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5rbigpfS5iaW5kKHRoaXMpKSwKYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5jYShiLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5iYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxrbjpmdW5jdGlvbigpe3RoaXMueGM9ITA7dmFyIGE9dGhpcy5ZZygpO2lmKGF8fHRoaXMuemEoKSl7dmFyIGI9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5jYShiKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oYil7dGhpcy5jYShiLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5iYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuU2EoKSYmKGQ9Ik1fIik7YS5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDsKaWYoZS5GKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYi5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIisKZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnljfHwodGhpcy5tKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5iYSgpLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LElwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5BZyYmYS5hZHMmJih0aGlzLkFnPWEuYWRzKTtyZXR1cm4gdGhpcy5BZ30sS2s6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7CnRoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLkFoKCl9LmJpbmQodGhpcykpfSxvZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksCjUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YSYmKChhPXRoaXMuWWcoKSkmJmEuZGVzdHJveT9hLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2QoKX0uYmluZCh0aGlzKSw1MCkpfSx6aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcoKSYmMDxhLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5obSgpKXt2YXIgYj10aGlzLkhjKCksZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLncoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5raD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8KKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5iYSgpKToodGhpcy5iYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMua2g9ITA7YS5pc1BsYXlpbmcoKSYmMTA8YS5jdXJyZW50VGltZSgpfHx0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56aCgpfS5iaW5kKHRoaXMpLDUwKX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYihnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sTGs6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpOwpyZXR1cm59fWVsc2UgdGhpcy5DYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGsoKX0uYmluZCh0aGlzKSwxMCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIGUueGU/ITE6dGhpcy51YX0sQ2E6ZnVuY3Rpb24oKXtpZih0aGlzLllsKCkpe3RoaXMudWE9ITA7aWYoZS5GKCJnaWdhLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKXRoaXMuSWY9ITEsZS50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsInNldCIsITApO3RoaXMuZyghMCl9ZWxzZSB0aGlzLnVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpfSxZbDpmdW5jdGlvbigpe2lmKDA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPQohMTtlLnlkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2E9IWUuZmIoYi5jYyl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXthPSExfSwhMCwhMCk7dmFyIGI9ZS55bCgpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGUueGU9LTEhPWIuaW5kZXhPZigiZmlyZWZveCIpfHwtMSE9Yi5pbmRleE9mKCJzYWZhcmkiKXx8YX1yZXR1cm4hMX0sYmE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCk/KHRoaXMudygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy56YSgpfHwoYXx8KHRoaXMuSWY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSWYsZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApUazpmdW5jdGlvbigpe3RoaXMuUnB8fCgxMDx0aGlzLkxvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuTG8rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5zbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UaygpfS5iaW5kKHRoaXMpLDUwKSkpfSxzbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Nbyl7dGhpcy5Nbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7CmEudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmJrfHx4YTsoZnVuY3Rpb24oYyl7Yy5kaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuWGgod2luZG93KTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyl0cnl7Yj1ifHx0aGlzLlhoKGFbZ10pfWNhdGNoKGQpe310aGlzLlAoKX19LFhoOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5TYj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5RYyl9fSl9KShjKTt2YXIgeWE9Yy5ka3x8eWEsemE9bmV3IHlhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Baj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEFhPWMuQWp8fEFhO25ldyBBYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuZ2Y9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTsKcmV0dXJufXRoaXMuVChiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2E/dGhpcy5XKGEpOnRoaXMuWigpfSxWbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkZiLGc9dGhpcy5oYSgpLGQ9IiI7YS5tZW1vJiYoZD1hLm1lbW8udmlkZW9pZCk7ZCYmYiYmYi5qYyYmKDA8PWcuaW5kZXhPZihkKXx8Yi5CZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuZ2Y9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKd2E6ZnVuY3Rpb24oKXt0aGlzLmdmKys7aWYoMTA8dGhpcy5nZilyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFBkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgphJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlUmJnRoaXMuVSgpfX0pfSkoYyk7dmFyIEJhPWMuSGp8fEJhOyhmdW5jdGlvbihjKXtjLkdqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQmUpaWYodGhpcy5IYnx8KHRoaXMuSGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5IYisrLDE1PHRoaXMuSGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZyghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPQohMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYihnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpOwp2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLm9sPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy5vbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlZtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwKMTAwKX0sZzpmdW5jdGlvbihhKXt0aGlzLkQoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Hanx8Q2E7KGZ1bmN0aW9uKGMpe2MuSWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5UYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmCihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyBCYShhW2JdKTtnLmphfHx0aGlzLkwoZyl8fCh0aGlzLk4oZyksKG5ldyBDYShnLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRGE9Yy5Janx8RGEsRWE9bmV3IERhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5UbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuVGx8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmpqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlVnKGEsImVsZW1lbnRJRCIpOwpzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLlhtPWEucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1hLndpZHRoO2cuc3R5bGUubWluV2lkdGg9YS53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5YbSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsCmIpfXRoaXMuVChnKTt0aGlzLlcoZyk7dGhpcy5yZD1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMucmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnJkKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sU2s6ZnVuY3Rpb24oKXtlLnBoKHRoaXMucmQpO2UuT2UodGhpcy5yZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNrKCl9LmJpbmQodGhpcyksNTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LFVlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5qanx8R2E7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuaWp8fEhhOyhmdW5jdGlvbihjKXtjLmtqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiYKbC5pbnJlYWQpe3ZhciBhPWwuaW5yZWFkLGI9ZS5VZyhhLCJlbGVtZW50SUQiKTtpZihlLnBoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTChhKSkpe3RoaXMuTihhKTsobmV3IEhhKGEsdGhpcy5HKSkuZigpO3JldHVybn10aGlzLlNiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBJYT1jLmtqfHxJYSxKYT1uZXcgSWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy53anx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPQoiR0VUIjt0aGlzLmRhdGE9e319Yy5laj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxEbjpmdW5jdGlvbihiKXt0aGlzLm1ldGhvZD1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LHVrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBBPWMuZWp8fEE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixnLGQsZil7dGhpcy5YYT1iO3RoaXMuUGc9dGhpcy51aT0hMTt0aGlzLkJoPWQ7dGhpcy5ZaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmCjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmMD09Yy5zdGF0dXMmJm0mJm0uUmUodGhpcy5YYS51cmwpJiZtLlZjKXt2YXIgZT1uZXcgQShiLnVybCk7ZS5EbigiUE9TVCIpO2Uuc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGEoZSxmdW5jdGlvbihiKXt2YXIgYT0hMTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChnKXthPSExfWEmJmEucGluZyYmInBvbmciPT1hLnBpbmcmJihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZmo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiKwpkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYVtkXSk7Yj1iLnN1YnN0cigxKX10aGlzLlBnJiYoYis9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0aGlzLmhiLnVybENhbGxlZD10aGlzLlhhLnVybDt0cnl7dGhpcy5ZaD90aGlzLmhiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITEpOnRoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMCksdGhpcy51aXx8KHRoaXMuaGIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGIubGVuZ3RoJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwKInJlcXVlc3RfZmFpbGVkIiwhMCk6bS5SZSh0aGlzLlhhLnVybCksdGhpcy5CaCYmdGhpcy5CaCgpfXJldHVybiB0aGlzLmhifX19KShjKTt2YXIgTGE9Yy5manx8TGE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkRhPXRoaXMuYmU9ITF9Yy5KaT1hO2EucHJvdG90eXBlPXtIbjpmdW5jdGlvbihiKXt0aGlzLmJlPWJ9LEduOmZ1bmN0aW9uKGIpe3RoaXMuRGE9Yn0scW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIiwicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIiwKdnA6IkFkU2tpcHBlZCIsd3A6IkFkU3RhcnRlZCIsbHA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixtcDoiQWRJbXByZXNzaW9uIixpcDoiQWRDcmVhdGl2ZVZpZXciLHBwOiJBZFZpZGVvTWlkcG9pbnQiLHFwOiJBZFBhdXNlZCIsc3A6IkFkVmlkZW9TdGFydCIsdHA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5iZSxhW2RdKX0scG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmFlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmFlKXRoaXMuRGEuYWUuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuRGEsdGhpcy5EYS5hZVthXSk7dGhpcy5EYSYmdGhpcy5EYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EYS5nZXRFcnJvcigpO2ImJmNvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsImdvdCBlcnJvciIsYil9LmJpbmQodGhpcyksMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5iZSYmdGhpcy5xbigpO3RoaXMuRGEmJnRoaXMucG4oKX19fSkoYyk7dmFyIE1hPWMuSml8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5IYT0hMTt0aGlzLiRiPSIiO3RoaXMuZmQ9dGhpcy5aYj10aGlzLmpiPW51bGw7dGhpcy5HZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMucGE9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm5mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk9iPSIiO3RoaXMuWmQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7CnRoaXMuWWQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLnZiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLldiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLlBiPSIiO3RoaXMuUWI9W107dGhpcy5SYj1bXTt0aGlzLlVjPVtdO3RoaXMub2M9IiI7dGhpcy5BYj0hMTt0aGlzLk9kPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuaWM9ITE7dGhpcy52Zz10aGlzLlVkPW51bGw7dGhpcy56Zj10aGlzLlZiPXRoaXMuRmc9dGhpcy5TZD10aGlzLlZjPXRoaXMuaGQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnZkPTA7dGhpcy5maD0hMTt0aGlzLmVoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5naj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy4kYixhZHRhZ21vZGlmaWVyOnRoaXMuamIsYWR0YWdtb2RpZmllckFkdjp0aGlzLlpiLGFkdGFncmVnZXg6dGhpcy5mZCxiaXRyYXRlOnRoaXMuT2EsanNwb3B1cHM6dGhpcy5UZSxzaWRlbG9hZHM6dGhpcy50YixkaXNhYmxldGVzdHM6dGhpcy5HZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLlNlLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnBhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5PYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuWmQsSE9NQURfQkxPQ0tFRDp0aGlzLllkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLldiLHRlc3RIaWRlOnRoaXMuUGIsdGVzdFRhZ3M6dGhpcy5RYix0ZXN0VGFnc0pTOnRoaXMuUmIsCnRlc3RUYWdzWEhSOnRoaXMuVWMsdGVzdDNQQ29va2llOnRoaXMub2MsdGhyb3R0bGU6dGhpcy5PZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLmljLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMudmcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5zYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuaGQsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuVmMsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuU2QsY29uZmlnRmFpbHVyZXM6dGhpcy5aYSxzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5yZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5WYixza2lwQWxsb3dlZDp0aGlzLnpmLHZtYXBzOnRoaXMuTmYsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LHluOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy4kYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLmpiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuWmI9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5mZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkdnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuU2U9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuSmM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5wYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5PYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9CmIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLlpkPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuWWQ9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMudmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5XYj1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuUGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5SYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMub2M9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLk9kPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLmljPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLnZnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuaGQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmCih0aGlzLlZjPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuU2Q9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLlphPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5yZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVmI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuemY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmCih0aGlzLk5mPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuemM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmllPWIuYWRGYWxsYmFja1VSTCl9LFZsOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYTtmb3IoYSBpbiB0aGlzLlphKSJib29sZWFuIj09dHlwZW9mIHRoaXMuWmFbYV0mJjE9PXRoaXMuWmFbYV0mJihiPSEwKTtyZXR1cm4gYn0sdGY6ZnVuY3Rpb24oYil7dGhpcy5aYVtiXT0hMH0sRGw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxNZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGI9ZS5GayhiKX0sdmE6ZnVuY3Rpb24oYixhLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy50YShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuJGJ8fHRoaXMuamJ8fAp0aGlzLlpifHx0aGlzLmZkKSYmKGg9dGhpcy5IbShoKSk7Yj1uZXcgQShlKTtiLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkZsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1oO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGgpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sUWU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSwKTGM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuZ2EmJnRoaXMuZ2EubGVuZ3RoJiYwPHRoaXMuZ2EubGVuZ3RoJiYoYT10aGlzLmdhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LFJlOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuUWUoYik7cmV0dXJuIGF9LEZsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwOwpyZXR1cm4ibm9uZSJ9LHdkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2FbdGhpcy5yZl19LFBjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy53ZCgpLGE9dGhpcy5UaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSx4aDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxHbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUudGEoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPApoLmxlbmd0aDtGKyspe3ZhciBrPWhbRl0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWZbbF09dGhpcy54aChmW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZiloLnB1c2gobCsiPSIrZltsXSk7Zj1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMueGgoZC5xdWVyeUtleVtjXSxjLGFbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxIbTpmdW5jdGlvbihiKXt0aGlzLiRiJiYoYis9dGhpcy4kYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5aYiYmKGI9dGhpcy5HbShiLHRoaXMuWmIpKTtyZXR1cm4gYn0sUms6ZnVuY3Rpb24oKXt0aGlzLnlhJiYKdGhpcy55YS5jbGllbnRBUElzJiZ0aGlzLk1rKHRoaXMueWEuY2xpZW50QVBJcyl9LE1rOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBNYTtiLnB1Ymxpc2hlckFQSSYmYS5IbihiLnB1Ymxpc2hlckFQSSk7Yi5wbGF5ZXImJmEuR24oYi5wbGF5ZXIpO2EuZigpfX0saTpmdW5jdGlvbihiLGEsZCxmLGMsZSl7bT10aGlzO3RoaXMuU2U9ITA7dGhpcy5KYz1iO3RoaXMucGE9YTt0aGlzLm5mPWQ7dGhpcy5VZD1mO3RoaXMuRGM9Yzt0aGlzLnlhPWV8fHt9O3RoaXMuUmsoKTt0aGlzLnhtKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnBhKXRoaXMudm0oKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMucGEpdHJ5e3RoaXMucGE9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnBhKXRyeXt0aGlzLnBhPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSwKcmI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGF9LHhtOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgQSh0aGlzLkpjK3RoaXMub2UoImdsb2JhbCIpKSx0aGlzLlNsLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnRmKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuQWMoKX0uYmluZCh0aGlzKSwhMCl9LHZtOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgQSh0aGlzLnBhK3RoaXMub2UoImNsaWVudCIsLTEhPXRoaXMucGEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy50ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoKIj8iKSsoImNhY2hlPSIrdGhpcy5MYigpKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1iJiYoZD0iIik7dGhpcy55YSYmdGhpcy55YS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGRhOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhkKXt0aGlzLmhkPSEwO3ZhciBhPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChnKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpOwpmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLkRjPSExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWWQpKTsKdGhpcy5UYigpO2UuRmMoay5UbSk7KGE9ZS5DYih0aGlzLndkKCkpKXx8KGE9ZS5DYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sU2w6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9aWYoIWEuZW5hYmxlZHx8IWEuZm9yY2VfZGlzYWJsZWQpdHJ5e2E9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGYpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucGF8fHRoaXMuT2J8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSwKdGhpcy5UYigpKX19LEFjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLnBhfWVsc2UgZD10aGlzLnBhO2lmKCEoZC5lbmFibGVkJiZkLnNlcnZlciYmZC5hbGlhcyYmZC5jb25maWcpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChjKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5mYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5nYT1kLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuZ2EubGVuZ3RoO2IrKyl0aGlzLmdhW2JdPXRoaXMuZ2FbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLkYoIndlYi5kZSIpfHxlLkYoImdteC5uZXQiKXx8ZS5GKCJnbXguYXQiKXx8ZS5GKCJnbXguY2giKXx8CmUuRigiMXVuZDEuZGUiKSkmJiF0aGlzLkxjKCkpZm9yKGI9MDtiPHRoaXMuZ2EubGVuZ3RoO2IrKyl0aGlzLmdhW2JdPXRoaXMuZ2FbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5PYj1kLmNvbmZpZ3x8IiI7dGhpcy5BYT1kLmFsaWFzfHxudWxsO3RoaXMuSmU9ZC5hZHBhdGh8fCIiO3RoaXMucmY9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuZ2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5PYiYmdGhpcy5BYSYmdGhpcy5nYS5sZW5ndGg/dGhpcy5NYyghMSk6KHRoaXMuSGE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy5UYigpKX0sTWM6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307aWYoYil7dmFyIGE9bmV3IEEodGhpcy5QYygpKSxkPXRoaXMudGEodGhpcy5PYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjsKYS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2EubWV0aG9kPSJQT1NUIn1lbHNlIGE9bmV3IEEodGhpcy5PYit0aGlzLm9lKCJjdXN0b21lciIpKTt0aGlzLklhKGEsdGhpcy5hby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy50ZigiY3VzdG9tZXIiKTtiP3RoaXMuVGo/dGhpcy5kYSgibm9TVk1Db25maWciKToodGhpcy5Uaj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuTWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGFvOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPWIucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtpZighdGhpcy5pYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuaWM9ITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpKXRyeXtkPQoobmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuVmM9dGhpcy5mYihkLnN0cmljdCk7dGhpcy5TZD10aGlzLmZiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkZnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy4kYT10aGlzLmZiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5mYihkLmVuYWJsZWQpO3RoaXMuUGI9ZC50ZXN0aGlkZXx8IiI7dGhpcy5SYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLlVjPWQudGVzdGFkdGFnc3hocnx8W107dGhpcy5vYz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy4kYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmpiPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLlpiPWQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5mZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5UZT0KZC5qc3BvcHVwc3x8ITE7dGhpcy50Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5WYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuVmI7dGhpcy56Zj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLmpkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5OZj1kLnZtYXBzfHwiIjt0aGlzLnpjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5PYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmllPWQuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLk9kPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMuaWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLmljPSEwLHRoaXMuTWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMucG8oKSYmKHRoaXMuUGJ8fHRoaXMuUmJ8fHRoaXMuUWJ8fHRoaXMuVWMpP3RoaXMubmY/KHRoaXMuSGE9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy50ZSgpLHRoaXMuVGIoKSk6CnRoaXMuZm8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5GZigpKX19LGZvOmZ1bmN0aW9uKCl7dGhpcy5lbygpO3RoaXMuaG8oKX0saG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksCkY9ZS5YKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihGLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2IoRikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwplLnpiKGIoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYil7fWlmKDMhPWQpe3ZhciBjPWUucWQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlNhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGEsITApO3JldHVybn10aGlzLmRhKCJjc3BfIithKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxGZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpO3RoaXMuVGIoKX0sTmQ6ZnVuY3Rpb24oYil7dGhpcy5zYz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuSGE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKGIpKSx0aGlzLlRiKCksdGhpcy50ZSgpKX0sZW86ZnVuY3Rpb24oKXtpZih0aGlzLlBiKXt2YXIgYj1lLnFkKCk7aWYoKGIuaXNDaHJvbWV8fGIuaXNGaXJlZm94KSYmdGhpcy5tbSgpKXRoaXMuTmQodGhpcy5XYiwibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXtiPSExO3RyeXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuUGIpO2Euc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5QYik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpOwpiPWR9Y2F0Y2goZil7fWI/dGhpcy5OZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5jaSgpfX1lbHNlIHRoaXMuY2koKX0sYmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoKSk7dGhpcy5rbyhmLDA8ZC5sZW5ndGg/Yi5iaW5kKHRoaXMpOnRoaXMuWmguYmluZCh0aGlzKSxhLmJpbmQodGhpcykpfWZ1bmN0aW9uIGEoKXt0aGlzLk5kKHRoaXMuV2IsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5RYj10aGlzLlVjKSYmdGhpcy5RYi5sZW5ndGgpe3ZhciBkPXRoaXMuUWIuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5aaCgpfSxrbzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwKITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSWEobmV3IEEoYiksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LGNpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYigpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkxiKCkpO3RoaXMubG8oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLmJpLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1mdW5jdGlvbiBhKCl7dGhpcy5OZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlJiJiZ0aGlzLlJiLmxlbmd0aCl7dmFyIGQ9dGhpcy5SYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLmJpKCl9LGxvOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwKITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihhLGQpe2Q9PWImJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWI7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sWmg6ZnVuY3Rpb24oKXtpZih0aGlzLm9jKXRyeXtlLnlkKHRoaXMub2MsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO3RoaXMuQWI9IXRoaXMuZmIoYi5jYyk7dGhpcy5GZigpfS5iaW5kKHRoaXMpLHRoaXMuJGguYmluZCh0aGlzKSwhMCl9Y2F0Y2goYil7dGhpcy4kaCgpfWVsc2UgdGhpcy5GZigpfSwKJGg6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKTt0aGlzLlRiKCk7dGhpcy50ZSgpfSxtbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChiKXtyZXR1cm4iZmFpbCJ9fSxUYjpmdW5jdGlvbigpe3ZhciBiPSIwIixhPSIwIjt0cnl7ZS5TYSgpJiYoYj0iMSIpfWNhdGNoKGQpe2I9Mn10aGlzLnNjJiYoYT0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYisiIithLCEwKTt0aGlzLm9jJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuQWIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlpkKSk7dGhpcy5VZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlVkJiZ0aGlzLlVkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkFifSl9LApRazpmdW5jdGlvbigpe2lmKHRoaXMuU2QmJnRoaXMuVmwoKSl7dmFyIGI9dGhpcy5EbCgpO2ImJmIuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYi5qb2luKCJfIiksITApfX0sZ2k6ZnVuY3Rpb24oYil7Ynx8KGI9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGIpdHJ5e2I9Yi50b1N0cmluZygpfWNhdGNoKGEpe2I9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9Yj1iLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITApfSxJYTpmdW5jdGlvbihiLGEsZCxmLGMsaCl7dGhpcy52ZHx8KHRoaXMudmQ9MCk7dGhpcy52ZCsrO3RoaXMudmQ+dGhpcy5laCYmIXRoaXMuZmgmJih0aGlzLmZoPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5laCwhMCkpO2I9bmV3IExhKGIsYSxkKTtmJiYoYi51aT0hMCk7YyYmZS5rbSgpJiYoYi5QZz0hMCk7aCYmKGIuWWg9ITApO3JldHVybiBiLmxvYWQoKX0sTms6ZnVuY3Rpb24oKXtlLlNhKCl8fAplLmFiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihiKXt2YXIgYT1udWxsLGQ9bnVsbCxmPSIiO3RyeXsoYT1iLnJlc3BvbnNlWE1MKXx8KGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYi5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLmRhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihiPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGJbMF0mJihiPWJbMF0pLGIpe2Y9YiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkxjKCl8fChiPXRoaXMudGEoZiksZj1iLnByb3RvY29sKyI6Ly8iK2IuaG9zdCk7dmFyIGU9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5kYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2UuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5kYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sY286ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuTmZ9LE9rOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKITApO3ZhciBiPXRoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2IuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYix0aGlzLkVvLmJpbmQodGhpcyksdGhpcy5Eby5iaW5kKHRoaXMpKX0sRW86ZnVuY3Rpb24oYil7dmFyIGE9bnVsbCxkPW51bGw7dHJ5eyhhPWIucmVzcG9uc2VYTUwpfHwoYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhiLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1kfHx0aGlzLm1sKCl9LERvOmZ1bmN0aW9uKCl7fSxtbDpmdW5jdGlvbigpe2UuRmMoay5sbCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5kYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sCnRlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMudGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy50Yi5sZW5ndGg7YisrKXt2YXIgYT10aGlzLnRiW2JdOyJyZXF1ZXN0Ij09YS50eXBlJiZlLmFiKGEudXJsLGEuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09YS50eXBlKXt2YXIgZD1uZXcgSDt3aW5kb3dbZC5mYSgpXT10aGlzO2UuYWIoYS51cmwsYS5hbGlhcyxudWxsLGZ1bmN0aW9uKGIpe2lmKGIucmVzcG9uc2VUZXh0KXRyeXtldmFsKGIucmVzcG9uc2VUZXh0KX1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0scG86ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5PZH0sTGI6ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYnx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sWDpmdW5jdGlvbihiKXtiPWJ8fDEwO2Zvcih2YXIgYT0KIiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9LHpiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGYsYyxlLGgsayxsPTA7bDxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQobCsrKSxmPWIuY2hhckNvZGVBdChsKyspLGM9Yi5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxoPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9oPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBhfSx0YTpmdW5jdGlvbihhKXt2YXIgZz0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxjPTE0O2MtLTspZFtnW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZ1sxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSxUaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBnKGEpe3ZhciBiPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9YT4+PjQqZCYxNSxiKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gYn1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixyPTI3MTczMzg3OCx0PTMyODUzNzc1MjAsbixxLHUsdix3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGM9MDtjPG4tMztjKz00KWU9YS5jaGFyQ29kZUF0KGMpPDwyNHxhLmNoYXJDb2RlQXQoYysxKTw8MTZ8YS5jaGFyQ29kZUF0KGMrMik8PDh8YS5jaGFyQ29kZUF0KGMrMykseC5wdXNoKGUpOwpzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihjPTA7MTY+YztjKyspaFtjXT14W2ErY107Zm9yKGM9MTY7Nzk+PWM7YysrKWhbY109ZChoW2MtM11eaFtjLThdXmhbYy0xNF1eaFtjLTE2XSwxKTtlPWs7bj1sO3E9bTt1PXI7dj10O2ZvcihjPTA7MTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8fm4mdSkrditoW2NdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8biZ1fHEmdSkrditoW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YraFtjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1O3Q9dCt2JjQyOTQ5NjcyOTV9cmV0dXJuKGcoaykrZyhsKStnKG0pK2cocikrZyh0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE5hPWMuZ2p8fE5hLG09bmV3IE5hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMuYXA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBPYT1jLmFwfHxPYTtuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZyxkKXt0aGlzLmE9YTthLmMuUj90aGlzLmJiPWEuYy5SKCk6dGhpcy5iYj0iIjthLmMubWgmJmEuYy5taCh7cGF1c2U6dGhpcy5CZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLlFoLmJpbmQodGhpcyksbXV0ZTp0aGlzLmFmLmJpbmQodGhpcyksdW5tdXRlOnRoaXMud28uYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYS5rYjt0aGlzLnBsYXllcj10aGlzLmEuYzt0aGlzLmVjPXRoaXMuZ2Q9ITE7dGhpcy5Daz0xRTM7dGhpcy5yYT1udWxsO3RoaXMuQj1nO3RoaXMuZ2I9e307dGhpcy52aWRlbz17fTt0aGlzLktkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLkdrPWUuWCgxMCk7CnRoaXMuQmY9MDt0aGlzLmRkPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuZGQ9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMuZGQ9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQWs9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5lZj10aGlzLkpkPSExO3RoaXMudmg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYj17fTt0aGlzLm5lPSExO3RoaXMuamk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5qYz0hMTt0aGlzLiRrPWUuWCgxMCk7dGhpcy5LYj1lLlgoMTApO3RoaXMuSWI9ZS5YKDEwKTt0aGlzLlVoPWUuWCgxMCk7dGhpcy5jb25mPXt9O3RoaXMuVmQ9CnRoaXMuVWI9dGhpcy52ZT10aGlzLm5kPXRoaXMuTGQ9dGhpcy51Yj10aGlzLnFjPXRoaXMuRGg9dGhpcy5zZD10aGlzLnFvPXRoaXMueGI9dGhpcy5KYj0hMTt0aGlzLnZjPVtdO3RoaXMubGM9e307dGhpcy5SbT0yMDA7dGhpcy5RZj10aGlzLldjPXRoaXMucmU9dGhpcy5QZj10aGlzLm1mPSExO3RoaXMuY2Y9e319Yy5haj1hO2EucHJvdG90eXBlPXt4bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGc9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoZz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBnfSxoaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5HYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLldhKCksITApO3RoaXMuVW4oKTtlLm8oay5yayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxXZTpmdW5jdGlvbihhLGcsZCxjKXt0aGlzLnhiPQpkO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkIuUyl0aGlzLkJmKyssZS5wYigibmV3U21hbGxBZElkIiksdGhpcy5CLlFrKCksYz1tLmdldENvbmZpZygpLGUueGUmJih0aGlzLkIueW4oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQi5IYSYmdGhpcy5CLmlzRW5hYmxlZD8odGhpcy5oaSgpLG5ldyBSKHRoaXMsYSx0aGlzLnZoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpnLGJpdHJhdGU6Yy5PYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQi5WYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpnPyh0aGlzLmhpKCksCm5ldyBSKHRoaXMsYSx0aGlzLnZoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5CLlZiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5PYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUGEoKTtlbHNle3ZhciBrPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2suV2UoYSxnLGQpfSw1MCl9fSxoZjpmdW5jdGlvbihhKXthLllhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuVmQ9dGhpcy5VYj10aGlzLnNkPSExO3RoaXMuYj1hO3RoaXMuTm4odGhpcy5iKTt0aGlzLmFoKGEpO3RoaXMudmM9dGhpcy5SZyhhKTt0aGlzLlZrKCl9LGFoOmZ1bmN0aW9uKGIpe2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mCmEmJih0aGlzLktkPXRoaXMuT2woYikpLHRoaXMuYWgoYi5wYXJlbnQpKX0sUmc6ZnVuY3Rpb24oYil7dmFyIGM9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoYz10aGlzLlJnKGIucGFyZW50KSksYy5wdXNoKHRoaXMueGwoYikpKTtyZXR1cm4gY30seGw6ZnVuY3Rpb24oYSl7dmFyIGM9IiIsZD1bXTtpZihhJiZhLkomJmEuSi5nZXRBdHRyaWJ1dGUpe2M9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKylkLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpjLGNyZWF0aXZlSUQ6ZH19LE9sOmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGQ9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5KKXtjPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpOwpmPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkouZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLkouZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLkouZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKGs9MDtrPGMubGVuZ3RoO2srKylkLnB1c2goYS5sYihjW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmh9fSxxYTpmdW5jdGlvbihhKXthLllhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGM9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJgooYz1hLmVycm9yLmRldGFpbC5jb2RlKSxhLnBkJiZhLnBkLmVycm9yJiZhLnBkLmVycm9yLmNvZGUmJihjPWEucGQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5ZYy5jb2RlOmM9PUQuY2UuY29kZT9lLm8oay5abyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpOihlLlhlKCksYz09RC5VZi5jb2RlJiZlLm8oay5MbSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKTtlLm8oay5rbCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVm4oKTt0aGlzLlVhKCJlbXB0eSIpO3RoaXMuQi5BYiYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkFiLCEwKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay5Gbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3LlZmLmNvZGU6ZS5vKGsuJG8sCnRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LmVlLmNvZGU6ZS5vKGsuYnAsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJ4bWxwYXJzZSIpO2JyZWFrO2Nhc2Ugdy4kZC5jb2RlOmUubyhrLk1tLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgibm9tZWRpYSIpO2JyZWFrO2Nhc2Ugdy5YZC5jb2RlOmUubyhrLkJvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdy5SZi5jb2RlOmUubyhrLkNvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuVWEoInVua25vd24iKX10aGlzLmZjKGEpO3RoaXMuUGEoKX0sZmM6ZnVuY3Rpb24oYSl7dmFyIGM9CjkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihjPWEuZXJyb3IuY29kZSw5MDE8YyYmKGM9OTAwKSk7Zm9yKGM9eyJbRVJST1JDT0RFXSI6Y307YS5NYS5sZW5ndGg7KXRyeXt2YXIgZD1hLk1hLnBvcCgpO3RoaXMuVmUoZC51cmwsZC50eXBlLGMpfWNhdGNoKGYpe319LE5uOmZ1bmN0aW9uKGEpe3RoaXMudmU9ITE7dGhpcy5nYj10aGlzLmEuSTt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLnhmKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dmFyIGM9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYz10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuZ2IuekluZGV4PWM7Yz10aGlzLmEuQTt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksZj0iIjtkJiZkLmVudnZhcnMmJihmPWQuZW52dmFycygpKTtmLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLmdldEVudmlyb25tZW50VmFyaWFibGVzJiYoZj1kLmdldEVudmlyb25tZW50VmFyaWFibGVzKCkpOwpmLnZpZGVvU2xvdCYmKGM9Zi52aWRlb1Nsb3QsdGhpcy5tZj0hMCl9Y2F0Y2goaCl7fWMuY3E9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGMuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihjLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZjLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLkFrJiZ0aGlzLnBsYXllci5DZSgpJiYoYy52b2x1bWU9dGhpcy5wbGF5ZXIuQ2UoKS8xMDApO2Zvcig7Yy5maXJzdENoaWxkOyljLnJlbW92ZUNoaWxkKGMuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPAphLk0ubGVuZ3RoO2QrKyljLmNhblBsYXlUeXBlKGEuTVtkXS50eXBlKSYmdGhpcy52ayhjLGEuTVtkXS51cmwrIiIsYS5NW2RdLnR5cGUpO3RoaXMubWYmJmMubG9hZCgpO2lmKHRoaXMuZGkoYykpe3RoaXMuVmgoInNldHVwIix0aGlzLldhKCkpO3RoaXMueWsoYyk7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT10aGlzLmdiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLm1mP3RoaXMudmlkZW89Yzp0aGlzLnZpZGVvPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyl9Y2F0Y2gobCl7dGhpcy52aWRlbz1jfX1lbHNlIHRoaXMuYi5XaygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/CmEuc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLmdiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChjKSx0aGlzLkxuKCkpOnRoaXMuYi5vcmlnaW4uSGcody4kZCl9LExuOmZ1bmN0aW9uKCl7dGhpcy5QZj0hMDt0aGlzLnViPXRoaXMucWM9ITE7dGhpcy5hLmMuc2EmJnRoaXMuYS5jLnNhKCkmJihlLm8oay55Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMudWI9ITApO2UudWUoKTt0aGlzLmImJnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4ubWEmJmUuemsodGhpcy5iLm9yaWdpbi5tYSk7dGhpcy5WaCgic2V0dXAiLHRoaXMuV2EoKSk7dmFyIGE9dGhpcy5hLkE7dGhpcy5hLkE9Qi5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5BLGEpO3RoaXMuYS5FaCgpO3RoaXMuYS55ZigpO2ZvcihhPQp0aGlzLmEuSTthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5hLnlmKCk7dGhpcy5nYj10aGlzLmEuSTt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLnhmKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dGhpcy5yYT10aGlzLmEuSTt0aGlzLm5pKCJ2cGFpZCIpO2lmKHRoaXMudWIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5OYigibXV0ZWQiLCJjb250ZW50Iik7ZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX10aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsCiJubyIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5hLkkuYXBwZW5kQ2hpbGQodGhpcy5DKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmUueGYodGhpcy5DLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5DLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLlJsKCksYz10aGlzLmIudS5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fApiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsCiJjb25maWciLGgpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLm1nKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5CKTt0aGlzLkMuc3JjPWE7ZS5wZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMud2EmJiF0aGlzLkxkJiZ0aGlzLmEuYy53YSgpJiZlLm8oay5CYywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEuaGMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMudmM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5ObyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLk9vKCksdGhpcy5hLmhjKCEwKSwhdGhpcy5VYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5VYj17ZWw6dGhpcy5DLApjYjpmdW5jdGlvbigpe3RoaXMuVmQ9ITA7ZS5vKGsucmksdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuUGUodGhpcy5VYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmhjKCEwKSx0aGlzLlNvKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5XbygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5WbygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlhvKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlRvKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPQphLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5kYyk7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLm8oay54Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkIuemN8fHRoaXMuV2MpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goYyl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuUm8oKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUubyhrLmxlLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuUG8oKTsKIkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5XYyYmKHRoaXMuUWY9ITEsdGhpcy5uYygpKSx0aGlzLlFvKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMudWI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLk5iKCJtdXRlZCIsInVzZXIiKSxlLm8oay56ZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKToodGhpcy51Yj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTmIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSGYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksZS5vKGsubGUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLAp0aGlzLnMoKSkpfX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5QYSgpfS5iaW5kKHRoaXMpKTtlLnBlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLmpnKGZ1bmN0aW9uKGEpe2UuaWEodGhpcy5DLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sUG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UubyhrLmplLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnFjPSEwfSxRbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UubyhrLmJkLHRoaXMuYi51LAp0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMucWM9ITF9LFNvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS5vKGsuZ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sUm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuZmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sT286ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5XaCgpO2UubyhrLmJnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlZhKCJzdGFydCIpO2UubyhrLmJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFVvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuc2Q9ITA7dGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpO2UubyhrLlpmLAp0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxWbzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5WYSgibWlkcG9pbnQiKTtlLm8oay5kZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxYbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIik7ZS5vKGsuaGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sVG86ZnVuY3Rpb24oKXt0aGlzLktmKCk7dGhpcy5WYSgiY29tcGxldGUiKX0sc2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5DJiZ0aGlzLkMucGFyZW50Tm9kZSYmdGhpcy5DLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5VYSgidnBhaWRzdG9wcGVkIik7dmFyIGM9dGhpcy5DLnBhcmVudE5vZGU7dGhpcy5DLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5DKTtjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyk7CmUudWUoKTt0aGlzLkM9ITE7dGhpcy5QYShhKX19LE5vOmZ1bmN0aW9uKGEpe3ZhciBjPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWMmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGM9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGMubWF0Y2goZCkpO3RoaXMuVWEoInZwYWlkZXJyb3IiKTtlLm8oay5Zbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuc2koITApfSx2azpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkhhJiZiLmlzRW5hYmxlZCYmIWIuTGMoKSl7dmFyIGM9Yi50YShhKTtyZXR1cm4gYy5wcm90b2NvbCsiOi8vIitjLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9ZChjLHRoaXMuQik7Zi5vbmVycm9yPXRoaXMuS28uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmQoYyx0aGlzLkIpKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LHlrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLm9pLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnBpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuS2YuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5MZi5iaW5kKHRoaXMpKX0sRmQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMub2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5NZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuS2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5MZi5iaW5kKHRoaXMpKX0sb2k6ZnVuY3Rpb24oYSl7dGhpcy5lY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVjfHx0aGlzLk1mKGEpfS5iaW5kKHRoaXMpLHRoaXMuQ2spKX0sTWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZ2QmJnRoaXMuZGkodGhpcy52aWRlbykmJiF0aGlzLkpiJiYhdGhpcy5lYyl7dGhpcy5nZD0hMDt0cnl7aWYoIWUuU2EoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuSmJ8fCh0aGlzLkpiPSEwLHRoaXMuRmQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5XYSgpLCEwKSx0aGlzLkIuRmd8fHRoaXMuQi5kYSgidmlkZW8tbm9vcCIpKTt0aGlzLlBhKCk7cmV0dXJufX1jYXRjaChjKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5XYSgpLCEwKX10aGlzLkhvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEueWYoKTt0aGlzLkdvKCk7dGhpcy5uaSgpO3RoaXMubmcoKTt0aGlzLmEuRWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuQ2YoKX19LENmOmZ1bmN0aW9uKCl7dGhpcy5uZHx8dGhpcy4kZigpfSwkZjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnZpZGVvLnBsYXkoKTtpZihjJiZjWyJjYXRjaCJdKWNbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLm5kfHwoYT90aGlzLlBhKCk6KHRoaXMuYWYoITApLHRoaXMuJGYoITApKSl9LmJpbmQodGhpcykpO2JhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5tYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5tYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5tYy5iaW5kKHRoaXMpKSk6ST1mdW5jdGlvbigpe3RoaXMubmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNmKCkpfS5iaW5kKHRoaXMpO3RoaXMuRWUoKS5TaCh0aGlzKX0sS2Y6ZnVuY3Rpb24oKXt0aGlzLkIuJGEmJiF0aGlzLkpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApLHRoaXMuVmEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS5vKGsucGssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlBhKCl9LHNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxkPSExLGY9MDtmPGEubGVuZ3RoO2YrKylkPWUuV2coYVtmXSksYy5wdXNoKGQpO2E9e2hhc2hlczpjfTthPWsuUmEoYSx0aGlzLnMoKSk7ZS5TbihhKX0sUGE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuV2QmJnRoaXMuc2sodGhpcy5iLldkKTsKaWYoIXRoaXMudmUpaWYodGhpcy52ZT0hMCx0aGlzLlZkfHwoZS5vKGsuT20sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmIud2J8fHRoaXMuYi50Yyl7ZS5wYigibmV3U21hbGxBZElkIik7dGhpcy5CZisrO3RoaXMuZWM9dGhpcy5nZD0hMTt0cnl7dGhpcy5GZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLmdiLnJlbW92ZUNoaWxkKHRoaXMucmEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMuSmQ9ITE7dHJ5e3RoaXMuYS5saSgpfWNhdGNoKGgpe310aGlzLkxkPSEwO3RoaXMuYS5JZSgpO3RoaXMuamM9ITE7dGhpcy5FZSgpLk9oKCk7dGhpcy5iLndiJiZ0aGlzLmIub3JpZ2luLmJmKCk7dGhpcy5iLnRjJiYoYT90aGlzLmIub3JpZ2luLnloKCk6dGhpcy53ZSgpKX1lbHNlIHRoaXMud2UoKX0sCktvOmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRmQodGhpcy52aWRlbyksdGhpcy5MZihhKSl9LExmOmZ1bmN0aW9uKGEpe3RoaXMuZWM9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5CLk5rKCk7dGhpcy5iLm9yaWdpbi5IZyh3LiRkKX0scGk6ZnVuY3Rpb24oKXtpZih0aGlzLnFvKXRoaXMuUGEoKTtlbHNle3RoaXMuamM9ITA7dGhpcy5hLmMud2EmJiF0aGlzLkxkJiZ0aGlzLmEuYy53YSgpJiZlLm8oay5CYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7CnRoaXMudW8oYSk7aWYoIXRoaXMuVWIpe3ZhciBjPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5VYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuVmQ9ITA7ZS5vKGsucmksdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpjLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2UuUGUodGhpcy5VYil9ZD0iIjt0aGlzLmIuQWYmJihjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVWgpKSYmKGQ9dGhpcy5iLkFmLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsCmQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5KZHx8KHRoaXMuSmQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuZmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLmIud2I/KHRoaXMuZWM9dGhpcy5nZD0hMSx0aGlzLkZkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnJhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSmQ9ITEsdGhpcy5hLmxpKCksdGhpcy5iLm9yaWdpbi5iZigpKTp0aGlzLlBhKCl9LmJpbmQodGhpcykpKSksYy5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLmRkLnJlcGxhY2UoIlt0aW1lXSIsZS5RZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLm5lPSEwOwp0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0saWk6ZnVuY3Rpb24oKXt0aGlzLkRofHwodGhpcy5EaD0hMCx0aGlzLnNkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sdW86ZnVuY3Rpb24oYSl7ZS5vKGsubGUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTthPT10aGlzLmppfHx0aGlzLkpifHwoMD09YSYmKHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkFiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuaWkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmlpKCl9LmJpbmQodGhpcykpLHRoaXMuSmJ8fAp0aGlzLldoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkIuJGEmJnRoaXMuVmEoInN0YXJ0IiksZS5vKGsuYmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSxlLm8oay5nZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi80KSYmKHRoaXMuQi4kYSYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuVmEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLnNkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS5vKGsuWmYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSwKZS5vKGsuZGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYi5kdXJhdGlvbi80KSYmKHRoaXMuQi4kYSYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuVmEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUubyhrLmhnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLHRoaXMuamk9YSl9LFZoOmZ1bmN0aW9uKGEsYyl7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGMsITApfSxVbjpmdW5jdGlvbigpe2UuUWQoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sV2g6ZnVuY3Rpb24oKXtlLlFkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFZuOmZ1bmN0aW9uKCl7ZS5RZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrCnRoaXMuV2EoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxVYTpmdW5jdGlvbihhKXtlLlFkKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFZhOmZ1bmN0aW9uKGEpeyh0aGlzLlBmfHx0aGlzLkIuJGEpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5XYSgpLCEwKX0sTmI6ZnVuY3Rpb24oYSxjKXt0aGlzLkIuJGEmJmUudHJhY2soInN0YXRzX2hkXyIrYSxjLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxjKXtpZighdGhpcy5KYil7dGhpcy5jZiYmdGhpcy5jZi50cmFjayYmdGhpcy5jZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmUueGUmJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPQohMH12YXIgZD1bXTt0cnl7ZD10aGlzLlBsKHRoaXMuYi5NYSxhKX1jYXRjaChmKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgaD1kLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmKHRoaXMucmU9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5LZC5pbXByZXNzaW9ucyYmZS5pbShoLnVybCx0aGlzLktkLmltcHJlc3Npb25zKT90aGlzLlZlKGgudXJsLGgudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLm8oay5xayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCkse2FkSWQ6dGhpcy5LZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5zKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuVmUoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWMpdHJ5e3RoaXMuYi5NYT10aGlzLmNsKHRoaXMuYi5NYSxhKX1jYXRjaChtKXt9fX0sV2E6ZnVuY3Rpb24oKXt2YXIgYT1lLlNhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLApjPSIiO3RoaXMuUGYmJihjPSJfdnBhaWQiKTt0aGlzLldjJiYoYz0iX3dlbGVjdCIpO3JldHVybiBhK2N9LFZlOmZ1bmN0aW9uKGEsYyxkLGYsZSl7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGM9dGhpcy5CLnZhKGEpLGQmJmMudWsoZCksZnx8KGY9dGhpcy5FZyksZXx8KGU9dGhpcy5FZyksdGhpcy53ayhhKSx0aGlzLkIuSWEoYyxmdW5jdGlvbigpe3RoaXMuTmgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5OaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sd2s6ZnVuY3Rpb24oYSl7dGhpcy5sY1thXT0ib3BlbiJ9LE5oOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09ImNsb3NlZCJ9LFZrOmZ1bmN0aW9uKCl7dGhpcy5sYz17fX0sWG46ZnVuY3Rpb24oKXt2YXIgYT0wLGM7Zm9yKGMgaW4gdGhpcy5sYyl0aGlzLmxjLmhhc093blByb3BlcnR5KGMpJiYib3BlbiI9PXRoaXMubGNbY10mJmErKztyZXR1cm4gYX0sUGw6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09CmN9KX0sY2w6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWN9KX0sSG86ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLklvLmJpbmQodGhpcykpfSxJbzpmdW5jdGlvbigpe2UuU2EoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMubmMoKTp0aGlzLmIuZGMmJihlLm8oay54Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkIuemN8fHRoaXMuV2MpYT0iX2JsYW5rIjt0cnl7dmFyIGM9d2luZG93Lm9wZW4oIiIsYSk7Yy5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2MuZG9jdW1lbnQubG9jYXRpb24uaHJlZj0KdGhpcy5iLmRjfWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYi5kYyxhKX19LmJpbmQodGhpcyksNTAwKSl9LEdvOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0KImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmRkLnJlcGxhY2UoIlt0aW1lXSIsZS5RZygwKSk7dmFyIGM9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5CLmpkJiYoYz10aGlzLkIuamQpO2MmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRGIuYmluZCh0aGlzKSwxRTMqYyk7dGhpcy5jYXB0aW9uPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSl9fSxEYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5CLmpkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxIZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5CLmpkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sbmk6ZnVuY3Rpb24oYSl7aWYoIWUuRGYodGhpcy5jb250cm9scykpe3ZhciBjPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy4kazt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5IZCgpfS5iaW5kKHRoaXMpKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5LYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmZpLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5laS5iaW5kKHRoaXMpKSxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmVpLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5IZCgpfS5iaW5kKHRoaXMpKTsKZi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkViKCk7dGhpcy5EYigpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihoLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGguc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixoLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuSWI7aC5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9oLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnNvLmJpbmQodGhpcykpOmguYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucm8uYmluZCh0aGlzKSk7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSGQoKX0uYmluZCh0aGlzKSk7CmguYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuVWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChmKTt0aGlzLmIuQWYmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChoKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuU2EoKXx8KHRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLkhkKCl9LmJpbmQodGhpcykpLHRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChkKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsCmMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIsYy5zdHlsZS5kaXNwbGF5PSJub25lIixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGQub25lcnJvcj1mdW5jdGlvbigpe3RoaXMueGEmJih0aGlzLnhhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksZC5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApjLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnhhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5hLmpnKGZ1bmN0aW9uKGEpe3RoaXMueGEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoZS5vKGsueWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLmFmKCkpO3RoaXMuRWIoKX19LEViOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sbmM6ZnVuY3Rpb24oKXsiaGlkZGVuIj09dGhpcy5jb250cm9scy5zdHlsZS52aXNpYmlsaXR5fHx0aGlzLnhhJiYiYmxvY2siPT10aGlzLnhhLnN0eWxlLmRpc3BsYXl8fHRoaXMuUWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGVpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5hLkEucGF1c2VkPwoodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5iZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5BLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLm8oay5qZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkViKCksdGhpcy5EYigpKSl9LGZpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5xYz8oZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJwbGF5IiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnFjPSExKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkViKCksdGhpcy5EYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMucWM9ITApfSxCZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYS5BLnBhdXNlZHx8KHRoaXMuYS5BLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLm8oay5qZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sUWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQS5wYXVzZWQmJih0aGlzLmEuQS5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsCiEwKSxlLm8oay5iZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0scm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKTt0aGlzLmEuQS5tdXRlZD8odGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5OYigidW5tdXRlZCIsInVzZXIiKSxlLm8oay5IZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKToodGhpcy5hLkEubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHNvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy51Yj8oZS5pYSh0aGlzLkMsCiJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJtdXRlIiksdGhpcy51Yj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxhZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMuYS5BLm11dGVkfHwodGhpcy5hLkEubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHdvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy5hLkEubXV0ZWQmJih0aGlzLmEuQS5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLAohMCksdGhpcy5OYigidW5tdXRlZCIsImNvbnRlbnQiKSxlLm8oay5IZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sbWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5tYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5tYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMpO3RoaXMubmR8fHRoaXMubmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNmKCkpfSx3ZTpmdW5jdGlvbigpe3RoaXMucm0oKSYmdGhpcy5xbSgpJiYodGhpcy5CLnNjfHwic3BpZWdlbC5kZSI9PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYicHJlcm9sbCI9PWUuR2ImJnRoaXMudm8oKXx8KHRoaXMubmQ9ITAsdGhpcy54YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy54YiksdGhpcy54Yj0hMSksdGhpcy56ZygpKX0scm06ZnVuY3Rpb24oKXt2YXIgYT0KZS5xZCgpO3JldHVybiB0aGlzLkIuVmImJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0scW06ZnVuY3Rpb24oKXt2YXIgYT0hMSxjPW0uZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciIT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcnx8dGhpcy5lZnx8KGE9ITAsYy5hZEZhbGxiYWNrVVJMfHwoYy5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3JldHVybihhfHwhdGhpcy5yZSYmYy5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuZWZ9LEVsOmZ1bmN0aW9uKCl7dmFyIGE9bS5nZXRDb25maWcoKS5hZEZhbGxiYWNrVVJMLGM9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthfHwic3ZtcHJldmlldyIhPWMuYW5jaG9yfHwoYT0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpO3JldHVybiBhfSx2bzpmdW5jdGlvbigpe20uZ2V0Q29uZmlnKCk7CnRoaXMuZWY9dGhpcy5XYz10aGlzLlFmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0Iix0aGlzLldhKCksITApO3RoaXMucmU9ITA7dmFyIGE9dGhpcy5FbCgpLGE9ZS5tZyhhLHRoaXMuQiwhMSx7b25seVVSTDohMH0pO2lmKCFhKXJldHVybiExO3RoaXMuV2UoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KTtyZXR1cm4hMH0semc6ZnVuY3Rpb24oYSl7dGhpcy5YbigpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemcoITApfS5iaW5kKHRoaXMpLHRoaXMuUm0pOih0aGlzLkxkPSEwLHRoaXMuYS5JZSgpLHRoaXMuYS51bigpLHRoaXMuamM9ITEsZS5vKGsuWmssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLkVlKCkuT2goKSl9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmEmJnRoaXMuYS5jJiYoYT10aGlzLmEuYyk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GYSgibWluVmlzIik7CmEmJihlLk9lKHRoaXMudmlkZW8sYSk/dGhpcy5RaCgpOnRoaXMuQmQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5kYyxhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi53Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnZjJiYwPHRoaXMudmMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnZjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LHM6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLkdrKyItIit0aGlzLkJmO3RoaXMuYiYmdGhpcy5iLlhnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPQp0aGlzLmIuWGcoKSk7cmV0dXJuIGF9LEVnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy5hanx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWE9Yy5DbXx8UWE7bmV3IFFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5sYT1udWxsO3RoaXMuVj1bXTt0aGlzLko9bnVsbDt0aGlzLnVjPXRoaXMud2M9ITE7dGhpcy5tYT0iIjt0aGlzLk9mPSExO3RoaXMuaGg9IiI7ZCYmZC5lbXB0eT90aGlzLkFtKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfQp2YXIgYj0wLGcsZD1bXTtjLmFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnFkKCksYjtiPWUudGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEEodGhpcy51cmwpOm0udmEobS5NZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0uYmluZCh0aGlzKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIGUuRigibWFydGhhc3Rld2FydC5jb20iKXx8ZS5GKCJmYW5kb20uY29tIil8fGUuRigiZ2lnYS5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImRlc2lyZWQuZGUiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxnKCkpe3ZhciBoPWUuQmcodGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbX0uYmluZCh0aGlzKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8aC5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIil9LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpJiYwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil9LmJpbmQodGhpcyksbD1mdW5jdGlvbigpe3JldHVybiAwPT09CmguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTtpZihkKCl8fGcoKXx8aygpfHwiYXBwc3BvdCI9PWMpbCgpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0uTWQoaCkpKyImdHlwZT1qcyIsYj1tLnZhKG0uTWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiLGUudHJhY2soInN0YXRzX2hkX2FkeCIsIiIsITApKTpiPW0udmEobS5NZChoKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJgooYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLklhKGIsdGhpcy56bS5iaW5kKHRoaXMpLHRoaXMud20uYmluZCh0aGlzKSl9LFNnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLmxhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5HYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuR2J8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkdifHx0aGlzLm9tKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxtLmNvKCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7CnZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2RbYl09Zy5maXJzdENoaWxkO2MucHVzaChnKX1jYXRjaChoKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LG9tOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sCmM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0sem06ZnVuY3Rpb24oYSl7dGhpcy5jbihhKTt0cnl7dGhpcy5sYT1hLnJlc3BvbnNlWE1MLHRoaXMubGF8fCh0aGlzLmxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuUWEody5lZSkpfXRoaXMuVj0KdGhpcy5TZygpO3RoaXMud2M9dGhpcy5FZigpO3RoaXMudWM9dGhpcy5haSgpO3RoaXMuaGg9YS51cmxDYWxsZWQ7aWYodGhpcy5WLmxlbmd0aCl0aGlzLk9jKCk7ZWxzZXt0aGlzLnFhKHRoaXMuUWEody5ZYyx7ZXJyb3I6dGhpcy5PZj9ELmNlOkQuVGZ9KSk7dHJ5e2UudHJhY2soInN0YXRzX2hkX210eXVybCIsZS5DYih0aGlzLm1hKSwhMCl9Y2F0Y2goYyl7fX19LEFtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuUWEody5lZSkpfXRoaXMuVj10aGlzLlNnKCk7dGhpcy53Yz10aGlzLkVmKCk7dGhpcy51Yz10aGlzLmFpKCk7dGhpcy5WLmxlbmd0aD90aGlzLk9jKCk6dGhpcy5xYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuT2Y/RC5jZTpELlRmfSkpfSx3bTpmdW5jdGlvbigpe3RoaXMucWEodGhpcy5RYSh3LlNmLHtkZXB0aDpifSkpfSwKT2M6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5WLnNoaWZ0KCk7dGhpcy5zbSgpP3RoaXMubW8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5iaCgpLGcse0FkU3lzdGVtOnRoaXMud2woKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5xYSh0aGlzLlFhKHcuVmYpKTooYj0wLHRoaXMuem8oKSYmdGhpcy5oZih0aGlzLmJsKCkpKX0sYmY6ZnVuY3Rpb24oKXt0aGlzLndjPyh0aGlzLndjPTE8dGhpcy5WLmxlbmd0aCx0aGlzLlYubGVuZ3RoJiZ0aGlzLk9jKCkpOnRoaXMucGFyZW50LmJmKCl9LHloOmZ1bmN0aW9uKCl7dGhpcy51Yz8odGhpcy51Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5PYygpKTp0aGlzLnBhcmVudC55aCgpfSx6bzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmpvKCk/dGhpcy5pbygpPyEwOigtMSE9dGhpcy5HYygpP3RoaXMucWEodGhpcy5RYSh3LlhkKSk6dGhpcy5xYSh0aGlzLlFhKHcuUmYpKSwhMSk6KHRoaXMucWEodGhpcy5RYSh3LlljLApELlVmKSksITEpfSxoZjpmdW5jdGlvbihhKXt0aGlzLm1hfHwodGhpcy5tYT0iIik7YS5XZHx8KGEuV2Q9W10pO2EuV2QucHVzaCh0aGlzLmhoKTthLk1hPWEuTWEuY29uY2F0KHRoaXMuWWUoKSk7YS53Yj1hLndiP2Eud2I6dGhpcy53YzthLnRjPWEudGM/YS50Yzp0aGlzLnVjO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLm1hLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5PZzt0aGlzLnBhcmVudC5oZihhKX0sYmw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgUmE7dGhpcy5tYXx8KHRoaXMubWE9IiIpO2EuZHVyYXRpb249dGhpcy5HYygpO2EuTT10aGlzLlpnKCk7YS5kYz10aGlzLnpsKCk7YS5rcT1bXTthLm9yaWdpbj10aGlzO2EudT10aGlzLnZsKCk7YS5BZj10aGlzLk5sKGEuZHVyYXRpb24pO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLm1hLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5PZztyZXR1cm4gYX0scWE6ZnVuY3Rpb24oYSl7dGhpcy5tYXx8Cih0aGlzLm1hPSIiKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5tYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuT2c7aWYoIXRoaXMuSiYmdGhpcy5sYSYmdGhpcy5sYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj10aGlzLmxhO3RyeXtpZih0aGlzLkomJnRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGM9ITE7KGM9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmYy5sZW5ndGgmJmUudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChkKXt9fXRoaXMuSiYmKGEuTWE9YS5lcnJvci5jb2RlIT13LlhkLmNvZGU/YS5NYS5jb25jYXQodGhpcy5BbCgpKTphLk1hLmNvbmNhdCh0aGlzLkpsKCkpKTt0aGlzLlYubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuZmMmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5mYyYmdGhpcy5wYXJlbnQuZmMoYSksYj0wLHRoaXMuT2MoKSk6Cih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucWEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5xYSYmdGhpcy5wYXJlbnQucWEoYSksYj0wKX0sZmM6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuZmMoYSl9LEhnOmZ1bmN0aW9uKGEsYil7dGhpcy5xYSh0aGlzLlFhKGEsYikpfSxRYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBTYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LG1vOmZ1bmN0aW9uKCl7cmV0dXJuIGI8Z30sam86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlpnKCkubGVuZ3RofSxpbzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuR2MoKX0sRWY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlYuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxhaTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuViYmMjw9dGhpcy5WLmxlbmd0aCYmCiF0aGlzLkVmKCkmJihhPSEwKTtyZXR1cm4gYX0sY246ZnVuY3Rpb24oYSl7dGhpcy5tYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLm1hPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMubWE9IlVOS05PV04ifXRyeXt0aGlzLk9mPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5iaCgpLmxlbmd0aH0sYmg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5EZSh0aGlzLkosIlZBU1RBZFRhZ1VSSSIpfSx3bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRlKHRoaXMuSiwiQWRTeXN0ZW0iKX0sWWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMub2goYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMubGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxvaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLm9oKGEucGFyZW50Tm9kZSk6ITF9LEpsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LEFsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx6bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxPYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksRXA6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMubGIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuT2F8fDFFMzt0cnl7dmFyIGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLApiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksYj1nLmNvbmNhdChlKX1jYXRjaChoKXt9cmV0dXJuIGJ9LHZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMudWQoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LEdjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMubGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sTmw6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5SbihkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LERlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5sYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sR2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGxiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMudWQoYSk6IiJ9LHVkOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLkdlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5ha3x8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmxqfHxUYTtuZXcgVGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLk1hPVtdO3RoaXMuTT1bXTt0aGlzLmRjPSIiO3RoaXMudT10aGlzLnRjPXRoaXMud2I9ITE7dGhpcy5LZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuTGU9IiJ9Yy5Kaj1hO2EucHJvdG90eXBlPXtXazpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk0ubGVuZ3RoO2MrKylpZigwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxIbDpmdW5jdGlvbigpe2lmKCF0aGlzLktlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ubGEpe3ZhciBhPXRoaXMub3JpZ2luLmxhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYz0iIixkPTA7ZDxhLmxlbmd0aDtkKyspKGM9YVtkXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1jLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLktlPWFbZF0pfXJldHVybiB0aGlzLktlfSxYZzpmdW5jdGlvbigpe2lmKHRoaXMuTGUpcmV0dXJuIHRoaXMuTGU7dmFyIGE9IiI7KGE9dGhpcy5IbCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuTGU9YX0sUmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk1bY107cmV0dXJuIGF9fX0pKGMpO3ZhciBSYT1jLkpqfHxSYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLkxpfHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHc9e2VlOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLExhOiJYTUxfUEFSU0VfRVJST1IifSxSZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTGE6IkRVUkFUSU9OX0VSUk9SIn0sWWM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLExhOiJFTVBUWV9WQVNUIn0sVmY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCkxhOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxTZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixMYToiTE9BRF9FUlJPUiJ9LCRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixMYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LAplcDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixMYToiTUVESUFGSUxFX0VSUk9SIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTGE6IkRVTU1ZX0FEIn19LEQ9e1RmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTGE6Ik5PX0FEUyJ9LFVmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixMYToiTk9fTUVESUFGSUxFUyJ9LGZwOnt0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLExhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sY2U6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTGE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlvPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIFZhPWMueW98fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5lcnJvcj1hO3RoaXMucGQ9Yzt0aGlzLk1hPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5PaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFNhPWMuT2l8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5OaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdhPWMuTml8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5QaD1hO3RoaXMudmlkZW89Yzt0aGlzLlRkPVtdO3RoaXMuTWg9W107dGhpcy5kZj1bXTt0aGlzLkpvPQoibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSygpfWMuZ3A9YTthLnByb3RvdHlwZT17SzpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5QaC5sZW5ndGg7YSsrKXt2YXIgYz10aGlzLlBoW2FdLGQ9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtoLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaCk7dmFyIGs9aC5jb250ZW50V2luZG93O2suWnA9CntyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLnJuLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmhuLmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1kO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5UZC5wdXNoKHtzcmM6ZCxmcmFtZTpoLFNtOmUsdmVuZG9yOmMuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTA7Yzx0aGlzLmRmLmxlbmd0aDtjKyspe3ZhciBkPXRoaXMuZGZbY107ZC50eXBlPT09YSYmZC5Jayh0aGlzLkJsKGEpKX19LApCbDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntpcTohMCxocTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntWcDoidmlkZW8iLGxxOiJqc0N1c3RvbSIsbXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxucToxLEZwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sClFsOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5UZC5sZW5ndGg7YysrKWlmKHRoaXMuVGRbY10udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5UZFtjXS5TbTtyZXR1cm4iIn0scm46ZnVuY3Rpb24oYSxjKXt0aGlzLk1oLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLlFsKGMpLHZlbmRvcjpjfSk7dGhpcy5UbigpfSxobjpmdW5jdGlvbihhLGMpeyJ2aWRlbyI9PT1hP3RoaXMuSm8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMua2coYSxjKX0uYmluZCh0aGlzKSk6dGhpcy5rZyhhLGMpfSxrZzpmdW5jdGlvbihhLGMpe3RoaXMuZGYucHVzaCh7dHlwZTphLElrOmMsZnE6ITF9KX0sVG46ZnVuY3Rpb24oKXt0aGlzLk1oLm1hcChmdW5jdGlvbihhKXthLmxtfHwoYS5ZcCh7YWRTZXNzaW9uSWQ6ZS5YKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5qcSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLAphLmxtPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy50bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPWMudG18fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5jb25mPWN8fHt9O3RoaXMuYz1hO3RoaXMua2I9YS5UZygpO3RoaXMuST1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkkuaWQ9ZS5YKDEwKTt0aGlzLkE9Qi5wb3AoKTt0aGlzLkF8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5OYT17fTt0aGlzLmxnPSExOwp0aGlzLmFjPVtdfWMuS2k9YTthLnByb3RvdHlwZT17dWw6ZnVuY3Rpb24oYSl7dmFyIGM9e30sZD0hMSxlPTAsYz0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihjPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD0iZml4ZWQiLGU9Yy5sZWZ0LGM9Yy50b3ApO2g9e3g6ZSx5OmN9O2gucG9zaXRpb249ZDtyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy51bChhKTtmb3IodmFyIGM9MCxkPTAsZT0hMSxoPXRoaXMuWmwoYSksaz17fTthOyljKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGQrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7aCYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCwKYys9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsZCs9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpjLHk6ZH07ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LCRuOmZ1bmN0aW9uKCl7dGhpcy5sZz0hMH0sbGk6ZnVuY3Rpb24oKXt0aGlzLkE9Qi5wb3AoKTt0aGlzLkF8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LEVoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7ZS5vKGsuQmMsdGhpcy5jLmwoKSl9LHVuOmZ1bmN0aW9uKCl7dGhpcy5sZ3x8Cih0aGlzLmMucGxheSgpLGUubyhrLm1kLHRoaXMuYy5sKCkpKX0seWY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSS5zdHlsZS56SW5kZXg9YTt0aGlzLkkuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5JLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkkuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkkuc3R5bGUuYm94U2l6aW5nPXRoaXMua2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuSS5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PXRoaXMua2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkEuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmtiKTsKdGhpcy5jLlJjJiZ0aGlzLmMuUmMoKT90aGlzLmMuVGcoKS5hcHBlbmRDaGlsZCh0aGlzLkkpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5JKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhjLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSxabDpmdW5jdGlvbihhKXtmb3IodmFyIGM9d2luZG93LmdldENvbXB1dGVkU3R5bGUsZD0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGMmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7ZD0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gZH0sc2w6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5nZXRQb3NpdGlvbihhKTtjLnBvc2l0aW9uP2MucG9zaXRpb249Yy5wb3NpdGlvbjpjLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yy53aWR0aD1hLm9mZnNldFdpZHRoO2MuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0OwpyZXR1cm4gY30saGM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5zbCh0aGlzLmtiKTtpZihjLnghPXRoaXMuTmEueHx8Yy55IT10aGlzLk5hLnl8fGMucG9zaXRpb24hPXRoaXMuTmEucG9zaXRpb258fGMud2lkdGghPXRoaXMuTmEud2lkdGh8fGMuaGVpZ2h0IT10aGlzLk5hLmhlaWdodHx8YSl7aWYoMDx0aGlzLk5hLndpZHRoJiYwPHRoaXMuTmEuaGVpZ2h0JiYwPT1jLndpZHRoJiYwPT1jLmhlaWdodCl7dGhpcy5JZSgpO3JldHVybn10aGlzLk5hPWM7dGhpcy5jLlJjKCk/KHRoaXMuSS5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSS5zdHlsZS50b3A9IjBweCIpOih0aGlzLkkuc3R5bGUubGVmdD1jLngrInB4Iix0aGlzLkkuc3R5bGUudG9wPWMueSsicHgiKTt0aGlzLkkuc3R5bGUud2lkdGg9Yy53aWR0aCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9Yy5oZWlnaHQrInB4Ijt0aGlzLkkuc3R5bGUucG9zaXRpb249Yy5wb3NpdGlvbjt0aGlzLkEuc3R5bGUud2lkdGg9Yy53aWR0aCsicHgiOwp0aGlzLkEuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuYWMubGVuZ3RoO2ErKyl0aGlzLmFjW2FdKHt3aWR0aDpjLndpZHRoLGhlaWdodDpjLmhlaWdodH0pfWUuRGYodGhpcy5JKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0samc6ZnVuY3Rpb24oYSl7dGhpcy5hY3x8KHRoaXMuYWM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmFjLnB1c2goYSl9LEllOmZ1bmN0aW9uKCl7dGhpcy5JJiZ0aGlzLkkucGFyZW50Tm9kZSYmdGhpcy5JLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSSk7dGhpcy5BJiZ0aGlzLkEucGF1c2UmJnRoaXMuQS5wYXVzZSgpfX19KShjKTtmb3IodmFyIFlhPWMuS2l8fFlhLEI9W10sWmE9MDsxMDA+WmE7WmErKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPQplLlgoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGJhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgJGE9Yy5UaXx8JGE7bmV3ICRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwKKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlQoYik7dGhpcy5HZChhKTt0aGlzLkNnKCl9LEdkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2EoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiYKYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsYz10aGlzLkdhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWMpYS5jb250YWluZXJJZD1jLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTt2YXIgYWI9Yy5Eanx8YWI7KGZ1bmN0aW9uKGMpe2MuQ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWNhKCk7dGhpcy5ZYj10aGlzLllifHwhMTt0aGlzLmNnPXRoaXMuZWc9CnRoaXMubGg9dGhpcy51YT10aGlzLkdmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucWwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLkdmPSEwO3RoaXMubGgmJnRoaXMudWcoKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5GYjthJiZhLmpjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMua2QoKTt0aGlzLmxoPSEwO3RoaXMudWcoKX0uYmluZCh0aGlzKSk7CnRoaXMucGcoKX0sdWc6ZnVuY3Rpb24oKXtpZighdGhpcy5ZYil7dGhpcy5rZCgpO2lmKCF0aGlzLkdmJiYhdGhpcy5rZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuR2YmJnRoaXMuY2cmJiF0aGlzLmVnJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApfX0sa2Q6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LCRnOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGIubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1iLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YSlyZXR1cm4gZC5pbnN0YW5jZX19LHBnOmZ1bmN0aW9uKCl7aWYodGhpcy5rZCgpKXt2YXIgYT0KdGhpcy4kZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLmVnPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMuY2c9YS5DcH10aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZygpfS5iaW5kKHRoaXMpLDEwMCl9LEdwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLlRwKCk6ITF9LEdjOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5HYygpOi0xfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxxbDpmdW5jdGlvbihhLGIpe3RoaXMuWWI9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuWWJ8fDMwMj09dGhpcy5ZYj90aGlzLnVhPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5ZYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksMTAwKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMudWE/KHRoaXMudygpLHRoaXMub2EoKSk6YS5NZSgpPyh0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLktsKGEpPyh0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGJiPWMuQ2p8fGJiOyhmdW5jdGlvbihjKXtjLkVqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbm06ZnVuY3Rpb24oKXt3aW5kb3cuT08uTmoubmsubGs/d2luZG93Lk9PLk5qLm5rLmxrLkFwKGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ubSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBhPWNhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkZlKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPW5ldyBhYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgYmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIGNiPWMuRWp8fGNiLGRiPW5ldyBjYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMub289YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBlYj1jLm9vfHxlYjtuZXcgZWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMTt0aGlzLmRoKCl9LGRoOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTthJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRoKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sS2E6ZnVuY3Rpb24oKXt0aGlzLkhoKCl9LEhoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5VJiYoMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhoKCl9LmJpbmQodGhpcyksMTAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZmI9Yy5GaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuRWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0scmc6ZnVuY3Rpb24oYSl7dmFyIGI9CmEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLm9hKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMub2EoKTp0aGlzLmcoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMucmcoYS5hZEVycm9yRXZlbnRzKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5yZyhhKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGdiPWMuRWl8fGdiOyhmdW5jdGlvbihjKXtjLkdpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sS2g6ZnVuY3Rpb24oYSl7YT1uZXcgZmIoYSk7YS5qYT90aGlzLlAoKTp0aGlzLkwoYSl8fChhLkdkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLk4oYSksKG5ldyBnYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLnJsfHwodGhpcy5ybD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuS2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLktoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7CnRoaXMuUCgpfX0pfSkoYyk7dmFyIGhiPWMuR2l8fGhiLFM9bmV3IGhiKHIpO1MuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5obD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGliPWMuaGx8fGliO25ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLksuYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LFJjOmZ1bmN0aW9uKCl7dmFyIGE9bDtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFQ9Yy5Xanx8VDsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LmNkKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7CnguY2QoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5QbShhKX0uYmluZCh0aGlzKSk7eC5jZCgiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRCgpfS5iaW5kKHRoaXMpKTt4LmNkKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5VbCgpfSxQbTpmdW5jdGlvbihhKXt2YXIgYj0iIixjO2ZvcihjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSl7Yj1pc05hTihhW2NdKT8hMTphW2NdO2lmKDEwMDk9PWFbY118fDEwMDE9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKXt0aGlzLncoKTt0aGlzLm9hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBhW2NdKWlmKGFbY10uaGFzT3duUHJvcGVydHkoZCkmJihiPWlzTmFOKGFbY11bZF0pPyExOmFbY11bZF0sMTAwOT09YVtjXVtkXXx8CjEwMDE9PWFbY11bZF18fDMwMz09YVtjXVtkXXx8NDAzPT1hW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5vYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkQoKX19KX0pKGMpO3ZhciBVPWMuVmp8fFU7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxiLmxlbmd0aDtjKyspYS5wdXNoKGJbY10pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspYS5wdXNoKGJbY10pO3RoaXMuQWQmJihhPWUuZGwoYSx0aGlzLkFkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFQoZCk7aWYoIXRoaXMuTChkKSl7dGhpcy5OKGQpOwp2YXIgZj1uZXcgVShkLHRoaXMuRyk7Zi5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGM9YVtiXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuQWR8fCh0aGlzLkFkPVtdKSx0aGlzLkFkLnB1c2goYVtiXSksZD1uZXcgVChoKSx0aGlzLkwoZCl8fCh0aGlzLk4oZCksZj1uZXcgVShkLHRoaXMuRyksZi5mKCkpfWNhdGNoKGspe319fXRoaXMuUCgpfSxjZDpmdW5jdGlvbihhLGIsYyl7dGhpcy5hYXx8KHRoaXMuYWE9e30pO3RoaXMuYWFbYV18fCh0aGlzLmFhW2FdPXt9KTt0aGlzLmFhW2FdW2JdfHwodGhpcy5hYVthXVtiXT1bXSk7dGhpcy5hYVthXVtiXS5wdXNoKGMpfSxubzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmFhfHx0aGlzLmFhJiYhdGhpcy5hYVtiXSl0aGlzLk5jfHwKKHRoaXMuTmM9W10pLHRoaXMuTmMucHVzaChhKSx0aGlzLnRuKCkmJih0aGlzLnBmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoYz1hLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbYl1bY10mJjA8dGhpcy5hYVtiXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmFhW2JdW2NdLmxlbmd0aDtkKyspdGhpcy5hYVtiXVtjXVtkXShhKX19LFVsOmZ1bmN0aW9uKCl7aWYodGhpcy5OYylmb3IodmFyIGE9MDthPHRoaXMuTmMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5OY1thXSxjPWIuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoZD1iLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbY11bZF0mJjA8dGhpcy5hYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmFhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5hYVtjXVtkXVtlXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT0KYS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ4Lm5vKGEpfX0pfSkoYyk7dmFyIGpiPWMuWGp8fGpiLHg9bmV3IGpiKHIpO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2I9Yy5ibnx8a2I7bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVyhiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0sd2E6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBsYj1jLkJpfHxsYjsoZnVuY3Rpb24oYyl7Yy5DaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKJCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkQoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwphLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbWI9Yy5DaXx8Cm1iOyhmdW5jdGlvbihjKXtjLkRpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbGIoZCk7dGhpcy5MKGgpfHwodGhpcy5OKGgpLChuZXcgbWIoaCx0aGlzLkcpKS5mKCkpfWNhdGNoKGspe319dGhpcy5QKCl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5KYSlpZihiPT10aGlzLkphW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuRGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBwYj1jLk1pfHxwYjtuZXcgcGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLndnPXRoaXMuRWM9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dmFyIGI9dGhpcy5KZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuRWM9Yik7aWYoIXRoaXMud2cmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fAphLnNvdXJjZS5DSE9PU0VSX0FCKSl7dmFyIGM9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixhLnNvdXJjZS5DSE9PU0VSX0FCfHwiIiwhMCk7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixjLCEwKTt0aGlzLndnPSEwfX19Y2F0Y2goaCl7fX0uYmluZCh0aGlzKSk7dGhpcy5WZygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuZ24odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSxWZzpmdW5jdGlvbigpe2lmKHRoaXMuRWMpcmV0dXJuIHRoaXMuRWM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuSmcoYSkpcmV0dXJuIHRoaXMuRWM9CmF9fSxKZzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiZhLnZpZGVvU2xvdCYmKGI9YSk7YSYmYS5oZHZwYWlkJiYoYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sZ246ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5wYXVzZSYmdGhpcy5lYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5yZXN1bWUmJnRoaXMuZWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiYKdGhpcy5lYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5tdXRlJiZ0aGlzLmVhLm11dGUoKX0uYmluZCh0aGlzKSk7YSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEudW5tdXRlJiZ0aGlzLmVhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sbWg6ZnVuY3Rpb24oYSl7dGhpcy5lYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcWI9Yy55anx8cWI7KGZ1bmN0aW9uKGMpe2MueGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLnRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLnRpJiYodGhpcy5nKCksdGhpcy50aT0hMCx0aGlzLmthKCkpOwpiLkdhKCkuYWRkRXZlbnRMaXN0ZW5lcihhLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuVmcoKT90aGlzLkQoKToodGhpcy55ZXx8KHRoaXMueWU9MSksdGhpcy55ZSsrLDEwMDx0aGlzLnllP3RoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgcmI9Yy54anx8cmI7KGZ1bmN0aW9uKGMpe2Muemo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBhPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyBxYihhW2RdKSx0aGlzLkwoYyl8fCh0aGlzLk4oYyksKG5ldyByYihjLHRoaXMuRykpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTsKdmFyIHNiPWMuemp8fHNiLFY9bmV3IHNiKHIpO1YuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5RbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRiPWMuUW18fHRiO25ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmZrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LEthOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5VPygwLHRoaXMuVSkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuZmt8fHViOyhmdW5jdGlvbihjKXtjLmVrPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEljOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSwKYT1hLmdldFJhd1BsYXllcigpO3JldHVybiBhLmltYUFkc0xvYWRlcn0sZW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMub2EoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuZygpO3RoaXMuZ2V0UGxheWVyKCk7CnRoaXMuQmE/dGhpcy5lbih0aGlzLkJhKToodGhpcy5CYT10aGlzLkljKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuRCgpO3JldHVybn1pZighdGhpcy54Yyl7dGhpcy5EKCk7cmV0dXJufWE9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmViLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmViW2JdJiYzMDMhPXRoaXMuZWJbYl0mJjQwMyE9dGhpcy5lYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMub2EoKTtlbHNle3RoaXMuRCgpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMuZWt8fHZiOyhmdW5jdGlvbihjKXtjLmdrPQp0LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLlRhPS0xO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGM9bmV3IHViKGEuaXRlbShiKSk7dGhpcy5MKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGMpLChuZXcgdmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHdiPWMuZ2t8fHdiLHhiPW5ldyB3YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB5Yj1jLmJtfHx5YjtuZXcgeWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Saj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuamY9ITF9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLldtKCl9LmJpbmQodGhpcyksNTAwKX0sV206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5VJiZ0aGlzLlUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksCmI9MDthLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYj1hLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuamYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuamYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXbjpmdW5jdGlvbigpe3RoaXMuamY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciB6Yj1jLlJqfHwKemI7KGZ1bmN0aW9uKGMpe2MuUWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLnBjPTB9LGY6ZnVuY3Rpb24oKXt0aGlzLkVtPTEwO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5wY3x8KHRoaXMucGM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5nKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8Cih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKToodGhpcy5wY3x8dGhpcy5wYysrLHRoaXMucGM8PXRoaXMuRW0/KHRoaXMucGMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAo1MDApKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5XbigpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQWI9Yy5Ranx8QWI7KGZ1bmN0aW9uKGMpe2MuU2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgemIod2luZG93LnBsYXllckFwaSksdGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgQWIoYSwKdGhpcy5HKSkuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgQmI9Yy5Tanx8QmIsQ2I9bmV3IEJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIERiPWMueG98fERiO25ldyBEYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0iIjthLmN1cnJlbnRUaW1lJiYoYj1hLmN1cnJlbnRUaW1lKTtyZXR1cm4gYn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sS2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5VKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEViPWMuUGp8fEViOyhmdW5jdGlvbihjKXtjLk9qPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5HYSgpLGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZztiJiZiLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7YS5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuWGsoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5CYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMudW0oKTp0aGlzLnRnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFnKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5nKCEwKSl9LmJpbmQodGhpcyksCjFFMyl9LFhrOmZ1bmN0aW9uKCl7dGhpcy5hZygpfHx0aGlzLmcoITApfSx1bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQmIoKTshYS5uYSYmYS5WJiZhLnpwJiZhLkJwJiYodGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZygpKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7YS5hZHNMb2FkZXI/YS5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBjO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihjIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2NdKXtjPWFbY107YnJlYWsgYX1jPXZvaWQgMH0xMDA5PT1jfHwzMDM9PWN8fDQwMz09Yz8odGhpcy53KCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZygpfS5iaW5kKHRoaXMpLDEwMCl9LEJiOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2gpZm9yKHZhciBhPQpjLlpjLkJiKCksYj10aGlzLmdldFBsYXllcigpLkdhKCkuaWQsZT0wO2U8YS5sZW5ndGg7ZSsrKWFbZV0uaWQ9PWImJih0aGlzLkNoPWFbZV0pO3JldHVybiB0aGlzLkNofSxVcDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxnOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2E/dGhpcy5CYigpLmFkc0xvYWRlcj90aGlzLkQoITApOnRoaXMuRCgpOnRoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBGYj1jLk9qfHxGYjsoZnVuY3Rpb24oYyl7Yy5aYz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFBrOmZ1bmN0aW9uKGEpe2E9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgRmIoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Yy5aYy5CYigpO2lmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXRoaXMuUGsoYVtiXSk7dGhpcy5QKCl9fSk7Yy5aYy5CYj1mdW5jdGlvbigpe3ZhciBhPVtdO2lmKGwmJmwucGxheWVyYXBpJiYoYT1sLnBsYXllcmFwaSgpKSYmYS5sZW5ndGgpcmV0dXJuIGE7dmFyIGE9W10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSwKYltjXSYmYltjXS5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kJiZhLnB1c2goYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCksYltjXSYmYltjXS5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuZmVybW9kJiZhLnB1c2goYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuZmVybW9kKTtpZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgR2I9Yy5aY3x8R2IsSGI9bmV3IEdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEliPWMuJGl8fEliO25ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnVqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCks6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RSYmKGE9YS5maXJzdENoaWxkKTtpZihhKXt0aGlzLlQoYSk7aWYoYS50YWdOYW1lKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1iP3RoaXMuVyhiKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxTcDpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe2lmKEUpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmIWEucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxSYzpmdW5jdGlvbigpe3JldHVybiEwfSxHYTpmdW5jdGlvbigpe3ZhciBhO0U/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFc9CmMudWp8fFc7KGZ1bmN0aW9uKGMpe2MudGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMua2Y9IiI7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthJiYodGhpcy5rZj1hLmlkKTtFP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYz1hLnBsYXllckNvbnRhaW5lcjtjJiZ0aGlzLmtmJiZjIT10aGlzLmtmfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuRigidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEuJHApLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJgoodGhpcy5tKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFg9Yy50anx8WDsoZnVuY3Rpb24oYyl7Yy52aj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRSlmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBXKGEpLGEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBYKGEsdGhpcy5HKSxhLmYoKSl9ZWxzZSBpZihhPQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYT1uZXcgVyhhKSxhLmphP3RoaXMucGYoKTp0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIEUsSmI9Yy52anx8SmIsS2I9bmV3IEpiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBMYj1jLlVtfHxMYjtuZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5ZaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLApjPWEuR2V0RWwoKSxiJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLlooKSk6dGhpcy5aKCk6dGhpcy5aKCk6dGhpcy5aKCl9LHduOmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LHdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxYcDpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBNYj1jLllpfHxNYjsoZnVuY3Rpb24oYyl7Yy5YaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5xZygpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMua2EoKX0uYmluZCh0aGlzKSl9LHFnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj1hLkdldEFkRXJyb3JzQ2FjaGUoKSxjPTA7YzxiLmxlbmd0aDtjKyspdGhpcy5oYW5kbGVFcnJvcihiW2NdKTthLkNsZWFyQWRFcnJvcnNDYWNoZSgpfSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhKXtpZihudWxsPT0KYSl0aGlzLnFnKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuZygpKX19LGc6ZnVuY3Rpb24oYSl7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIE5iPWMuWGl8fE5iOyhmdW5jdGlvbihjKXtjLlppPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcms7YXx8KGE9d2luZG93LlRPbmxpbmVNZWRpYXBsYXllckZyYW1ld29yayk7aWYoYSYmYS5HZXRBbGxQbGF5ZXJzJiYoYT1hLkdldEFsbFBsYXllcnMoKSkmJjA8YS5sZW5ndGgpZm9yKHZhciBiPQowO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1uZXcgTWIoYVtiXSk7Yy5qYXx8dGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgTmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIE9iPWMuWml8fE9iLFBiPW5ldyBPYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBRYj1jLkltfHxRYjtuZXcgUWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKXtmb3IodmFyIGI9YT1hWzBdO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTsKYnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuWigpfSxSZDpmdW5jdGlvbihhKXt2YXIgYj0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9iPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6e319KTooYj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxiLmluaXRDdXN0b21FdmVudChhLCExLCExLGRhdGEpKTtiJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChiKX0sZm46ZnVuY3Rpb24oKXt0aGlzLlhjPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXtpZihhLmRldGFpbCYmImFkUmVxdWVzdCI9PWEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuWGN8fCh0aGlzLlhjPSEwLHRoaXMuUmQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChiKXt9fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSwKcGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlhjJiYodGhpcy5SZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlhjPSExKSx0aGlzLlJkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LHdhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgUmI9Yy5qa3x8UmI7KGZ1bmN0aW9uKGMpe2MuaWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sTGg6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2E/KGEmJmEuYWRkRXZlbnRMaXN0ZW5lciYmKGEuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLAphLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iYyhhKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKSksYSYmYS5hZGRBZEVycm9yTGlzdGVuZXImJmEuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuYmMoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkxoLmJpbmQodGhpcyksMTApfSxiYzpmdW5jdGlvbihhKXt2YXIgYj17fTthLmdldEVycm9yJiYoYS5nZXRFcnJvcigpLGI9YS5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMub2s9CiEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fDMwMz09Yi5nZXRFcnJvckNvZGUoKXx8NDAzPT1iLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMuZygpKToodGhpcy5va3x8dGhpcy5tKCJub2ZyYW1ld29yayIpLHRoaXMuZygpKX0sWWY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYT0wO2E8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YSsrKXRoaXMuYmMod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFthXSk7dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLllmLmJpbmQodGhpcyksMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuTGgoKTt0aGlzLllmKCk7dGhpcy5qbigpfSxqbjpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmRuP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihhKXt0aGlzLmRuPSEwO2lmKGEmJmEuZGV0YWlsKWZvcih2YXIgYiBpbiBhLmRldGFpbCkiYWRUYWdVcmwiPT1iJiYoYS5kZXRhaWxbYl18fHRoaXMuYmMoYSkpfX0pfSkoYyk7dmFyIFNiPWMuaWt8fFNiOyhmdW5jdGlvbihjKXtjLmtrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGE9bmV3IFJiKHdpbmRvdy5ETDhfR0xPQkFMUyk7YS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGEuZm4oKSxhPW5ldyBTYihhLHRoaXMuRyksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLAphLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgVGI9Yy5ra3x8VGIsVWI9bmV3IFRiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuamw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYj1jLmpsfHxWYjtuZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5aaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLkZoPSExO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb01vZGVsKXt2YXIgYj1hLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYil7dGhpcy5UKGIpO3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVyhjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihhKXt0aGlzLkptPWF9LmJpbmQodGhpcykpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX1lbHNlIHRoaXMuWigpfSx3bjpmdW5jdGlvbigpe30sc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MTtyZXR1cm4gYS52aWRlb01vZGVsJiZhLnZpZGVvTW9kZWwuZ2V0JiYoYj1hLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGIpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KbX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFI6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuUGQoYSl9LmJpbmQodGhpcykpfSxQZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiYhdGhpcy5GaCYmKHRoaXMuRmg9ITAsdGhpcy5VJiZ0aGlzLlUoKSl9fSl9KShjKTt2YXIgTj1jLlpqfHxOOyhmdW5jdGlvbihjKXtjLllqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5CZSlpZih0aGlzLkhifHwKKHRoaXMuSGI9MCksdGhpcy5IYisrLDE1PHRoaXMuSGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhKXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuSm4oKTp0aGlzLmcoITApLCEwO3RoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKTthLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMuZygpOnRoaXMuZyghMCl9ZWxzZSBpZihhPWEudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkJlPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsCmZ1bmN0aW9uKGEpe3RoaXMuY2EoYSk7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk89YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPQphLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CYSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIE89Yy5Zanx8TzsoZnVuY3Rpb24oYyl7Yy4kaj0KdC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpO3RoaXMuVGE9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBhPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7YS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHwKdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5wZigpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIFdiPWMuJGp8fFdiLFhiPW5ldyBXYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYj1jLkVrfHxZYjtuZXcgWWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5xaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSwKUjpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWT1jLnFqfHxZOyhmdW5jdGlvbihjKXtjLnBqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmloPTA7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPXRoaXMuS2M9dGhpcy5CYT10aGlzLmVkPSExO3RoaXMuSmg9ZS5MYigxMCk7dGhpcy5xaCgpfSxxaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLnNiKCksITA7dGhpcy5paCsrO2lmKDEwPHRoaXMuaWgpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMuZyghMCk6dGhpcy5nKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5xaC5iaW5kKHRoaXMpLDEwMCksITF9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuY2EoYSwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuY2EoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuYmEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PQphLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLnVhPQohMH0sYmE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCk/KHRoaXMudygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJmIuYXBpLnBsYXllZCgpP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgWj1jLnBqfHxaOyhmdW5jdGlvbihjKXtjLnJqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBZKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWSh3aW5kb3cucGxheWVyKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWihhLHRoaXMuRyksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLnJqfHxaYiwkYj1uZXcgWmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy4kbHx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsCmI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgYmM9Yy5WaXx8YmM7KGZ1bmN0aW9uKGMpe2MuVWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2coKX0sc2c6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBjYz1jLlVpfHwKY2M7KGZ1bmN0aW9uKGMpe2MuV2k9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGJjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmphKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTChhKSl7dGhpcy5OKGEpOyhuZXcgY2MoYSx0aGlzLkcpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYz1jLldpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmM9Yy5Va3x8ZmM7bmV3IGZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLndpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5aKCkpOnRoaXMuWigpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgZ2M9Yy53aXx8Z2M7KGZ1bmN0aW9uKGMpe2Mudmk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcykpO3RoaXMuc2UoKTt0aGlzLm9nKCl9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LENhOmZ1bmN0aW9uKCl7dGhpcy51YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sb2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5vYSgpKTp0aGlzLmcoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9nLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuc2UuYmluZCh0aGlzKSwxMDApfSxzZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5nKCk6dGhpcy5nKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX19LGc6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5rYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIGhjPWMudml8fGhjOyhmdW5jdGlvbihjKXtjLnhpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sUmE6ZnVuY3Rpb24oYSl7YT0KbmV3IGdjKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgaGMoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuUmEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlJhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIGljPWMueGl8fGljLGpjPW5ldyBpYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYz1jLm5sfHxrYztuZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMucmg9dGhpcy50aD10aGlzLnNoPSExO3RoaXMuQ2Q9W107dGhpcy5vZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHphP251bGw6emEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgUz9udWxsOlMsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHVhP251bGw6dWEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFhiP251bGw6WGIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFViP251bGw6VWIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9iP251bGw6b2IsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGRiP251bGw6ZGIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBDYj9udWxsOkNiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeGI/bnVsbDp4YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6Vn19Yy5Maj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLkxsKGEpOltdLGM7dGhpcy50aD0hMDtpZihhLmxlbmd0aCl7dGhpcy5zaD0hMDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyljPWFbZF0sCnRoaXMuUmgoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLm9mKXtpZih0aGlzLnJoKWJyZWFrO2M9dGhpcy5vZltkXTt0aGlzLkpmKGMpJiYodGhpcy5DZC5wdXNoKGMpLHRoaXMuUmgoYykpfX0sSmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxMbDpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspZD1hW2VdLGQ9dGhpcy5vZltkXSx0aGlzLkpmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LFJoOmZ1bmN0aW9uKGEpe3RoaXMuSmYoYSkmJmEuZigpfSxZbjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcSYmIXRoaXMuc2gpZm9yKHRoaXMucmg9ITAsYT0wO2E8dGhpcy5DZC5sZW5ndGg7YSsrKXRoaXMuQ2RbYV0uU2ImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZFthXS5TYil9fX0pKGMpO3ZhciBsYz1jLkxqfHxsYyxMPW5ldyBsYztMLmYoKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5nbHx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuRmMoay5BbyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsCmMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuTm0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtDLndpZHRoPTE7Qy5oZWlnaHQ9MTtDLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChDKTt2YXIgcWM9Qy5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1DLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChDKTt2YXIgRz1uZXcgSCxsPSExO0cuZmEoKTtHLm5oKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5mYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcubmgoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LAohMSk7Ry5mYSgpO3ZhciByYz1xYyhmdW5jdGlvbigpe2UuTmcod2luZG93LEcuZG0oKSx7aWQ6cmN9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlNpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy5TaXx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkdoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy54ZD0wO3RoaXMuYmI9IiI7dGhpcy5EZD1bXTt0aGlzLkVkPTA7dGhpcy5JaD0hMTt0aGlzLmxmPVtdO2UucGIoIm5ld0FkZGVsaXZlcnkiKX1jLnlpPWE7YS5wcm90b3R5cGU9e0ZuOmZ1bmN0aW9uKGEpe3RoaXMuR2g9YX0sdmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmJiPXRoaXMucGxheWVyLlIoKX0sCmdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQW46ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSx6bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm5iKTsKdmFyIGQ9ITEsZj0hMTtpZih0aGlzLmVtKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5wYSx0aGlzLm5iLm5mLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5XbCgpKXRoaXMudm4oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuJG4oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsaCk7bC54bih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuRG0oYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwKInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuVWUmJihkPXRoaXMucGxheWVyLlVlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLldlKGEsZCxmKTt0aGlzLnBsYXllci5TaChsKX19LGVtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMueGQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy54ZC5nZXRUaW1lKCksdGhpcy54ZD1hLDNFNTxjPyEwOiExO3RoaXMueGQ9YTtyZXR1cm4hMX0sUW46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS51ZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuRmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLklnKGEpKT90aGlzLlNjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksCjApLGUubyhrLm1kLHRoaXMucGxheWVyLmwoKSkpfSxQbjpmdW5jdGlvbihhKXtpZighdGhpcy5HaCl7ZS51ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuRm4oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuSWcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS5vKGsubWQsdGhpcy5wbGF5ZXIubCgpKSl9fSxJZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sbW46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Nbih0aGlzLlBuLmJpbmQodGhpcykpOwp0aGlzLnBsYXllci5LYSgpfSxJZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS51ZigibWlkcm9sbCIpO2lmKCF0aGlzLndoKXt0aGlzLndoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm1kLHRoaXMucGxheWVyLmwoKSkpfX0sbG46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Fbih0aGlzLklkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlplKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlFuKCk7dGhpcy5wbGF5ZXIuWmUmJnRoaXMubG4oKTt0aGlzLm1uKCl9LG5uOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/CmE9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkRkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5jcChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuRWQ9dGhpcy5EZC5sZW5ndGh9LFdsOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkVkJiYoYT0hMCk7cmV0dXJuIGF9LHZuOmZ1bmN0aW9uKGEpe3RoaXMuSWg9YTtmb3IoYT0wO2E8dGhpcy5EZC5sZW5ndGg7YSsrKXRoaXMuRGRbYV1bImZ1bmN0aW9uIl0odGhpcy4kbS5iaW5kKHRoaXMpKX0sJG06ZnVuY3Rpb24oYSl7dGhpcy5FZC0tO2EmJnRoaXMubGYucHVzaChhKTswPj10aGlzLkVkJiZ0aGlzLkloKCl9LERtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0iIixkPTA7ZDx0aGlzLmxmLmxlbmd0aDtkKyspYz0KdGhpcy5sZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy55aXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLnBsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoZWVCaWNoYWhNaWFNZWVHaCxlZUJpY2hhaE1pYU1lZUdoKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
144.76.115.236 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.236.115.76.144.clients.your-server.de
Software
openresty/1.15.8.2 /
Resource Hash
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc

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
Referer
https://videos.giga.de/embed/78410589?autoplay=0
Origin
https://videos.giga.de

Response headers

Date
Tue, 03 Dec 2019 12:58:41 GMT
Last-Modified
Wed, 15 May 2019 14:42:46 GMT
Server
openresty/1.15.8.2
ETag
"5cdc2566-18"
Access-Control-Allow-Methods
GET
Content-Type
application/octet-stream
Access-Control-Allow-Origin
https://videos.giga.de
Access-Control-Allow-Credentials
true
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
24
truncated
/ Frame 8F76
241 B
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
30693e9cf6f8bc2ebb84da020fbd3eff888b9482a6fce3d5aacf2934e5312503

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/5244e16181ab0c7d546b0838eebe2f946c893cac/ Frame 34FB
109 B
671 B
XHR
General
Full URL
https://ssl.1.damoh.giga.de/5244e16181ab0c7d546b0838eebe2f946c893cac/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIGVlQmljaGFoTWlhTWVlR2g9ZWVCaWNoYWhNaWFNZWVHaHx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBhYSgpe3guZmZ8fCh4LmZmPTApO3guZmYrKzt3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2UhPXgudmlkZW9wa2dJbnRlcmZhY2UmJih3aW5kb3cudmlkZW9wa2dJbnRlcmZhY2U9eC52aWRlb3BrZ0ludGVyZmFjZSk7MTA+eC5mZiYmd2luZG93LnNldFRpbWVvdXQoYWEsNTAwKX1mdW5jdGlvbiB6KCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHopO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIseik7YmE9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBhPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWEpYS50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1JJiYoSSgpLEk9ITEpfWZ1bmN0aW9uIGNhKCl7dmFyIGM9d2luZG93Lk9PO2N8fChjPXdpbmRvdy5qT09QbGF5ZXJfMCk7cmV0dXJuIGN9ZnVuY3Rpb24gZGEoKXtpZihsKXtsLnBhdXNlQnV0dG9ufHwobC5wYXVzZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wYXVzZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTjBRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMFUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNRalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM1F6WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BnSG5DckVBQUFGMFNVUkJWSGphN0ptOWlvTkFFTWZqM1JVVzhTTWFQd2hhMjRjSTFsWldlWUxZK1FTV2dwVytnNCtVSm04UnRVMU1pbURsTGJjZ3dTUEhRY0xlempGVHpRNHkrOXZoUHlQTENrbVN6S0RaeCtsMGdnZDlQcC9oUWQ5dU4zalF3ekFnTkF0N213RTBsQWRDWXlOaXBSRWFOWTJWUm1pUTBOdnROZ3hEU1pLcXFqb2NEbU44dFZydGRqdlA4OXEyemZPY0krak5abE9XSmZVSlh4UkYxK3VWTG91aThIMmYrazNUa0NQeE1qM2lPQjU5V1pZSjkzaUFrWmpZdmYvM2xTYXFtRVJvMmtkeExxQW5TWVl2K3lITzQvUjRCTTFYcFJsRDQyLzhGeFhGUmtSTmc5UTB5SkdIallqeXdPbUJqZmlmRzdHdTYvdmw4WGlrYVlreitld2wyNzJUMjlIeldmYjcvWHE5ZGwyMzY3b3N5OGlTeGkrWEN3RU5na0FVUlJKTTA3VHYrK2UzRXh6SHdVWkU2RWVhbnMvbjRLQUYyN1lSbWdtMFpWbndvRTNUaEFkdEdBWTg2T1Z5aWRCTW9IVmRod2V0YVJvODZNVmlBUTlhVlZXRVpnS3RLQW84NkpmY1hGaERmMy9MNGQ4K0JSZ0ErUk5XU3hQaVI0d0FBQUFBU1VWT1JLNUNZSUk9Ii8+Jyk7CmwucGxheUJ1dHRvbnx8KGwucGxheUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIG9uZXJyb3I9InRoaXMuc3JjPVwnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9wbGF5MTgxMDAyLnBuZ1wnIiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UXpRNU56VTFOemsyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRelE1TnpVMU4wRTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERORGszTlRVM056WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRE5EazNOVFUzT0RZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWa0dJa0FBQUhaU1VSQlZIamE3Smd4aXNKUUVJWjFYYkJSbXdoaURpQjZnVTB0cEJJRUM0dUFoVTBNQkZ2RlhxMFZQRUNDVm9MYWVnR0xpS1dGSGlDa2pyR3hqTE11aUd6QTNlVWx6L2ZZK2FzUW5QQmwvT2RsWnVLcXFzWjQwN3ZydXZ4Qm4wNG4vcUF2bHd0LzBMN3ZJelFOdmNVNEZOb0RvYkVRTWRNSWpaN0dUSDhxa2N2bFNPTFQ2WFM5WHQvdjkxVHQ0Wk9wV3ExMnU5MzVmSjVLcFh4YUlvV0dUTU9yRjR2RjlYcGRLQlQ0Z0w2WFJDYVRXU3dXalVhREJuUzRidXYxZW9QQjRDdjk3SG82K01SYXJXWVlSajZmNThBZWp3S0xMNWZMY3JrY0VYUWltODJTL0ZNZk53WHZKNVBKU3FVQ0Y3dmRqamw3UFA4MnRkdnR5V1FTK21rWStXZGNsdVhwZEFxR1lib1FneXFWU3NBTkJScWFwd1ZCSVBTMEpFay8vZ3dzRGltSG8zQ3oyZkNSNmJ1YXplWnNOaU8zT08zV1ZMcnB4YTNwbjhMUDU3T3U2K1NISUwxKytuQTRBTEhqT0s4ZkFuNFpicHJtY0Rqa1puSUJTMEFMdFZxdEdCcTNub2VESlRxZHp2RjQ1R2F3aFo1SlVaVFFpU08wUjcvZmh3YVYwV2s4R0c3YnRxWnBZQXh1VmdpV1piVmFMU2crcHZjZWorR2owV2c4SHROWTFvVHlGTS96VkZYZGJyZVVsaldFUXlnTTRkREJBWEdrSnY2bXVDaUt1TXREYUZ6MUlqUkNZeUZpcGhFYW9iRVFFZm9mUVY4RkdBQkdFSjRVNUZJZnp3QUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwubXV0ZUJ1dHRvbnx8KGwubXV0ZUJ1dHRvbj0nPGltZyBzdHlsZT0ibWF4LXdpZHRoOiAyNXB4O21heC1oZWlnaHQ6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBvbmVycm9yPSJ0aGlzLnNyYz1cJ2h0dHBzOi8vaG1kYXNzdHMuc2NobmVldm9ubW9yZ2VuLmNvbS9pbWcvbXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpBMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRakUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNSalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVNE1EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1ByV2YzOGNBQUFKVVNVUkJWSGphN0ptL2p3RkJGTWU1dTNKUmM5UkVmZndCTGxHaW9ISTZqV3Y5QVZSWGllZ0ZDWTJ3Q2pyMDRoL2dMOUQ3MFlocTc1dWRaQ0xyZHRuZDJjM04zYnhpOHF6ZE41OTU3L3RtN2ZLV3kyVVBiL2F5MysvNWd6NGNEdnhCbjg5bi9xQVZSUkhRYnRpVGgwTVQ4aERRb2hGRnBnVzAwRFI3YUlXcDFldDF4WGxqQmkxSjBuQTR6R1F5TGtDejBiVFA1MnUzMjlGb0ZMNExUY0lBT2hRS3RWcXRXQ3hHUGpLQlJzVXd6bVl6UjZDUjNXNjM2L2Y3NlJFN0FiUFpMTWJwZElxd3lBSWM5cnZITGJFMSsxQU56cHRxY0dqZEdPOGVxS0FzeTdmRWowY29Gb3VWU2dVT1lZWHpxaHF0bGVsR1JLVnl1WnpCY3BQSjVJL0g3OHFqVkNwaEhBd0dpVVFDSFl6ek1WSkVqV05PMDFpeEhwYXg2UVdrcktsVUNrNi8zNmVzbWd0dkhSUHlzQ1pRVFpCUDFlQzhxL1lJNGwxNU9IVWIvMUtOcU1oYXhWejl3VVFDUWwyUHA5T3NQSFNoN2NqamVyVHB1SnBwSmduV2JjUS85YmhsVXg2T1pwcExlVGlWNmNWaWdUczhaNDNZNi9YSXg4bGtRZzZlVGlleWpOK2JhV3I0VVVVZEFtMkJYZ3V0Ti9kdXQxdXYxM3JmWXRaNFBHNXFNY3ZsVXJNTVRCRU9oMW51SHJKcUJsYzJHbzE4UG0raFJKRDd0WVB6UVcrY2UyYWFybGFybTgybVZxdFoxdFY4UHI5MmNPSHhlSFM4RVR1ZERxWnBOcHMybTRIU2o4ZGpFbUc3M1VJNVR1MGVtSVp3QndJQis4K0lsSDYxV2htRThscHJCWTJoS1VlakVlR09SQ0o4dkdHQ3VBdUZ3clVpK1hqREJPNTBPbzNSQldodk1CaGtXRGpzWExoM09DMlBaMG1TR0lhN1hDN2lWYS80SjBCQS93OW8wWWdDV2tDTFJoVHlFTkRNN1Z1QUFRQndvdnZJdjA5WTZnQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7CmwudW5tdXRlQnV0dG9ufHwobC51bm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3BhZGRpbmctcmlnaHQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgb25lcnJvcj0idGhpcy5zcmM9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3VubXV0ZTE4MTAwMi5wbmdcJyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlEwWkNNRGMwUWpRMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UTBaQ01EYzBRalUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBEUmtJd056UkNNalkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERSa0l3TnpSQ016WTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BpL2RxR3dBQUFTRlNVUkJWSGphN0psTFRCTkJHTWUzaUVpbDcyNUxhMHVRaTYyUEF4b0RIUEhDelpaRXFpYVFRQTJKd3NGWHZHaE1DSGZmSmlZRzFDWWVSRUUweElQdEJZN1lFeWFDK0VLSUVCTXI3VzRWaW9qV2IzZXRXYnF6MjA1WjFFMzJPMndtT3pQZi9QYWIvenhYMDk3ZVRpak5paE9KaFBLZ0tZcFNIblFxbFZJZWREcWRWcUgvaGhVUkNqUlZIaXEwT2hEVlNLdlFxcWIvZmFUUHpNM3RvK2t0eTh0Zk5tdzQ1UEY4TENuaDUzWjNkM2QxZGVWMHNpMlZhbzdGd0kvK3g0OVhXdTFoandjdjBta2NxNmNvYUF5SW9TYTBkM2xxU3JleXdtWHBkTHErdmo2Zno1ZlR5YmJGeGQ0M2IzenhPSGdBUDU1VWF2LzhQQllHSmpSTjg3L1lzN1RVOC9ZdGNBTnhUMCtQaHcxWVRtS29vdi81ays5bmZ6eU9oWUVuRHk0MmZQTXVMZlcrZTBjTUQzdTlYdTZOaEVNSWF1L1VsR0UxTWJJVzlCZzhoNGFHWkpESERac3RXVlFrNVBZZU8wWmtUa0FTTWI0bFFuelhhdVhLK0ZpREJIU2EzKzhYbFFmV0NJQkJjNlNxU3NoTlBIOU8xTmNUNGljM2lQSHQ5KytSeE9kZExsZG5aMHRMQzZUM3NzWUVJdE52TWtRYWJMSzBOTGgxcXdRM01zWml4SS85L3NjbUU4Y0tKVjJzL1pFS3RxYWhkeG9iRzhXKzlVc3NabWh1SmxhUFM0NGJ4aVhNaHZ6QmVtZDZHa21jdkhadFMyMXRPaGpVNi9WL0VMTVNlUE0wZkhGTlRZMlVWa1pHbU5BS3VPOXMydFJXV2NseGc5eERNek5JNG5OT1oyTnRMWjlNSW9FaGp4d0NyNjVtdUkzR3JOZmJ2MzBEVUlnMzZGaU1PTnJSOFNoVFVScGFob0dZUDNkMDgrWkhpUVJhRlZldkVtMXRhOXA3RkJqbVhOeU12ck9VdzlwWmgyT3lyaTVQVlJTeUlxNlZXMkRQT2pvR0RZYjBtbTNOa2M2Ym0xRkZhMnVlQVY1UFRXZHhYN2tpbG5uZFlubkp6aFh5N0tkbGtBZG5ZMlBFeVpOaW1hMFU1WXJGOGc5d2dackdKaGJPMlR5RGFjUU5DL1hZbUN6UW9vc0xCbmN1NHQ5RzA5czdPNzFPcDNEWmswaXN6NVFYQ2hHN2QrY216c1Q3eWR6Y2ptajBuMFlhaUlOQjlLbU1KT0Y1NGZObkJQcUpFOFRSbzFnNnlkNTdpUEhNenM2T2pvNkt4c3hnWUFJbVR2eFFwK1BTU082Nm16Y1BrQ1EwNFhhNzVUellEckFtVnEzcDY5Y0w4L05vWXF0MW9LeU1ZTjF5Q1dSSitKakk0T0J0blE0QWdON0FManI1UnJxQWV3K0dPQjVIWk1EaUVncjFRKy96ZlBhWGxkRWFEWEFiQlEwMTNMc1h0bGpnU0J3T2h6bEVtaDBiaFc5TlJZa1hGaTZLRWNPaVdGMmRQbjQ4S3llczFYNncyKzkvK2lUa0JsZndhb0NGWnI2d3Y1OWpuWmlZQU9XSXNXbXdWQlZZV0xpRS9JV1hJWVprUlVVRnN1Nk81ZVVIc1pnUnhYSGFiSVlPV2RVSkRRM3dqRVFpTXR3d0JSWVhFZk92Um5ONnp4NjZxa3E2N2tSSnlVR2JEUXJuNHpiQ21qeG5SR0dUOENaQWtnOWV2dzRFQW54RkltMTg0MFlvakhTeWpwYzFUMHRMc3hwcklrbEFZWURHeDZGUDRTbnRBUW8zQ2JqQkxSYUd4dWwwWWlua01rVWRZditYdmlndVBtVXlBVVRXL0oxTUpuTTYyZm45Ty9qWnRiSUM2ZnRhTGZqQll0QTRIQTdGM1pvcUU3cTh2Rng1MEhhN1hYblFOcHROZWRBa3U0ZFVvZGNmMm1xMUtnL2FZckVvRDlwc05pc1Ayb1M1aEtyUWhVSWI4N2c0L08rZ1lWK21QR2p1ZjRleTdKY0FBd0Rhbk9MSU8vcGdrQUFBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwpsLnNraXBhYmxlQnV0dG9ufHwobC5za2lwYWJsZUJ1dHRvbj0nPGRpdiBzdHlsZT0ib3BhY2l0eTogMC43O21pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLXJpZ2h0OiA2cHg7Ym9yZGVyOiAjRkZGRkZGO2JhY2tncm91bmQtY29sb3I6YmxhY2s7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpO2wuc2tpcEJ1dHRvbnx8KGwuc2tpcEJ1dHRvbj0nPGRpdiBzdHlsZT0ibWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O29wYWNpdHk6IDAuNjttYXJnaW4tcmlnaHQ6IDZweDtwYWRkaW5nLWxlZnQ6IDZweDt2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO2Rpc3BsYXk6IGlubGluZS1ibG9jaztsaW5lLWhlaWdodDogMjVweDtiYWNrZ3JvdW5kLWNvbG9yOmJsYWNrO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIG9uZXJyb3I9XCdodHRwczovL2htZGFzc3RzLnNjaG5lZXZvbm1vcmdlbi5jb20vaW1nL3NraXAxODEwMDIucG5nXCcgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQVlBQUFBNi9ObHlBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQTNCcFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1UTTRJRGM1TGpFMU9UZ3lOQ3dnTWpBeE5pOHdPUzh4TkMwd01Ub3dPVG93TVNBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3VFUwOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXRiUzhpSUhodGJHNXpPbk4wVW1WbVBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZjMVI1Y0dVdlVtVnpiM1Z5WTJWU1pXWWpJaUI0Yld4dWN6cDRiWEE5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM4aUlIaHRjRTFOT2s5eWFXZHBibUZzUkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRk9UWkRRalZHTUVSR01USXhNVVUyT0RReFFVVkJOME5HTVVNeU9Ua3hOU0lnZUcxd1RVMDZSRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGUmpjM09VRkdNRVJHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3VFUwNlNXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcEZSamMzT1VGRlJrUkdSRFV4TVVVMk9FTTFPVUU0UWtKR1JqZEdOa1EzTmlJZ2VHMXdPa055WldGMGIzSlViMjlzUFNKQlpHOWlaU0JRYUc5MGIzTm9iM0FnUTBNZ01qQXhOeUFvVFdGamFXNTBiM05vS1NJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09tUXpZemsxTkRCbUxUVmxZVE10TkRsbE5DMWhOR1V5TFdRMk1qUXlOVGN6Wm1VNVlTSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1BtNlhOVDRBQUFKcVNVUkJWSGphWXZ6Ly96L0RTQUpNRENNTWpIcDQxTU9qSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oN0VCbHNIbUlFTkR3d0JzNHVmUG45OUFGUXRBQXdEVXhqWTJOakZkWFYwcjlmWDEvVWpWQzlXREFzZ3hCeGVtU1pMMkJZTFMwdEt3RlN0V3JBUjZQZ3JrWUZJaWdCaXhRWldIZVhsNWVVQzBob1lHeDdadDI1YXFBWUdlbnA0UGtSNytSNHpZb1BJd2Nvenc4ZkV4ckY2OXVqc2FDSFIxZFgwR09vYnBWbWlWbDVkSHFLdXJhMWhaV2ZFY08zWnN4WWdvcFFNQ0FneUF5WHkrbTVzYnp6TWd1SExseXJiaGtxUnhPaENVcjllc1dUUGJFUWkwdGJXOWhrV2hSUWlBOHZYa3laTkxzckt5TXJXMHREeUdWYUdGRDJSblovdE1talJwc3BtWldjaXdLN1J3QVJjWEZ4VnBhZW1GZ1lHQk1qZUFZRVMwcFRVMU5ia1dMbHpZRHl6VS9HbWRwRmxvbEtUL2taT3YyOXZiTTRDRm1zYXdLN1R3Z2ZqNGVJY2hWMmlOdVA0d0pVbncwNmRQRENNbVNWKzdkdTBic0tNVlA2eGFXcmpBL1Buejk0RzZsVStBWUZqSE1DZ0pBL3ZPVTVxQjRPN2R1L3VHYXJWRWRCSXVLU2twdm43OStvMzc5KzhmR05ZdExXQUg0a3hUVTFQanBVdVh0Z3piN2lFTUFEMjZhTjY4ZVhNZlBIaHdpTjdkUTdxMnRCNC9mc3lRbHBhV0NVeksxeDQrZkhob1dJOTRIRDkrL0ZrcUVBQUxxVStQSGowNlFrcGdEYmxDcTYrdmIxMC9FQUJqK0FnNUJkNlFpZUdQSHo4eXBLU2tsSjRBQW1JOE8yU2JsbGV2WHIyeVk4ZU9HKzd1N3VIQXBIeU1GTS9TT2tuVFpPYUJFaXdsSldXRlB2TUFGYU9LK1lOdWJna1VtMEFQV3RMS2ZNYlJ4YVdqSGg3MThLaUhSejA4NnVGUkQ0OTZlTlREb3g0ZTlmQ29oMGM5UE9waEJnYUFBQU1BR21DMHBlSmNHRUlBQUFBQVNVVk9SSzVDWUlJPSIvPjwvZGl2PicpOwppZihsLnNpZGVsb2Fkcyl7dmFyIGM9ZnVuY3Rpb24oKXt9O2wuc2lkZWxvYWRzLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGE9Yi5hbGlhczsiZnVuY3Rpb24iPT09dHlwZW9mIGEmJihhPWEoKSk7Yj1iLnVybDsiZnVuY3Rpb24iPT09dHlwZW9mIGImJihiPWIoKSk7ZS5hYihiLGEsW10sYyxjLG0pfSl9bS5pKGwuZ2xvYmFsQ29uZmlnLGwuY2xpZW50Q29uZmlnLGwucHJlY2hlY2tlZCxsLm9uUmVhZHksbC5vbkZhaWx1cmUsbCk7ZG9jdW1lbnQuaGRfcmVhZHk9ITA7dmFyIGE9bC5zdGFydFBsYXllcjthJiYiZnVuY3Rpb24iPT09dHlwZW9mIGEmJmEoKX1lbHNlIHBjKGRhLDUwKX1mdW5jdGlvbiByKGMsYSl7aWYoZS5IayllLnRyYWNrKCJzdGF0c19oZF9ieXBhc3MiLCIiLCEwKTtlbHNlIGlmKGwmJm0peyhsLmFkVGFnfHxsLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtlLm8oay5CYyxjLmwoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGI9Yy5nZXRDdXJyZW50VGltZSgpO2ImJgplLnRyYWNrKCJhY3RpdmF0ZWRBdCIsYil9YT9tLkhhPSEwOmUudHJhY2soInN0YXRzX2hkX2FiZCIsIiIsITApO2I9bmV3IGVhO2IudmYoYyk7Yi5BbihtKTtiLnpuKGwpO2Iubm4oKTtiLmYoKX1lbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihjLGEpfS5iaW5kKHRoaXMpLDUwKX1mdW5jdGlvbiBmYShjLGEpe2MucGF1c2UoKTtpZihtLnRiLmxlbmd0aCl7dmFyIGI9bS50Yi5zaGlmdCgpO2lmKCJhZGNhbGwiPT1iLnR5cGUpe3ZhciBnO2c9ZS5Jbih7IltMT0FEU0NSSVBUXSI6ZS5YKDEwKSwiW1VUSUxTXSI6ZS5YKDEwKSwiW0NBTExCQUNLXSI6ZS5YKDEwKX0pO3dpbmRvd1tnWyJbTE9BRFNDUklQVF0iXV09ZS51aC5iaW5kKGUpO3dpbmRvd1tnWyJbVVRJTFNdIl1dPW07Zm9yKHdpbmRvd1tnWyJbQ0FMTEJBQ0tdIl1dPWZ1bmN0aW9uKGIpe2Zvcih2YXIgZyBpbiBiKWxbZ109YltnXTtyKGMsYSl9O2c9Yi5zY3JpcHRzLnNoaWZ0KCk7KWUudWgoZyxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBzdWNjZXNzIil9LApmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sbSl9ZWxzZSByKGMsYSl9ZWxzZSByKGMsYSl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmlsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZ2E9Yy5pbHx8Z2E7bmV3IGdhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuSGs9ITE7dGhpcy5HYj0ic2V0dXAiO3RoaXMuVGM9W107dGhpcy51ZSgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLlptLmJpbmQodGhpcykpO3RoaXMub2I9e307dGhpcy5naD17fTt0aGlzLnNmPSExfWMuY2o9YTthLnByb3RvdHlwZT17Wm46ZnVuY3Rpb24oKXt2YXIgYj0iIixhO2ZvcihhIGluIHRoaXMub2IpdGhpcy5vYi5oYXNPd25Qcm9wZXJ0eShhKSYmKGIrPQphK3RoaXMub2JbYV0rIl8iKTtyZXR1cm4gYn0sZ2M6ZnVuY3Rpb24oKXt0aGlzLnNmfHwodGhpcy5zZj1lLlgoMTApKTtyZXR1cm4gdGhpcy5zZn0scGI6ZnVuY3Rpb24oYil7dGhpcy5vYltiXXx8KHRoaXMub2JbYl09MCk7dGhpcy5vYltiXSs9MTs1PHRoaXMub2JbYl0mJiF0aGlzLmdoW2JdJiYodGhpcy5naFtiXT0hMCwibmV3QmlnQWRJZCI9PWImJnRoaXMudHJhY2soInN0YXRzX2hkX2NoZWNrdHJhY2tzIix0aGlzLlpuKCksITApKX0sdWU6ZnVuY3Rpb24oKXt0aGlzLlk9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSx6azpmdW5jdGlvbihiKXt0aGlzLlkuZXJybXNnLnB1c2goYil9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGIsYSl7dHJ5e2IuY29udGVudFdpbmRvdyYmCihiPWIuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWImJmIucG9zdE1lc3NhZ2UmJmIucG9zdE1lc3NhZ2UoYSwiKiIpfSxpYTpmdW5jdGlvbihiLGEsZCl7dGhpcy5wb3N0TWVzc2FnZShiLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YSxkYXRhOmR9KX0sWm06ZnVuY3Rpb24oYil7YiYmYi5kYXRhJiZiLmRhdGEudHlwZSYmInZwYWlkIj09Yi5kYXRhLnR5cGUmJnRoaXMuWW0oYi5kYXRhKX0sWW06ZnVuY3Rpb24oYil7aWYodGhpcy5ZJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcilmb3IodmFyIGE9dGhpcy5ZLmV2ZW50bGlzdGVuZXIubGVuZ3RoLGQ9MDtkPGE7ZCsrKXRoaXMuWSYmdGhpcy5ZLmV2ZW50bGlzdGVuZXImJnRoaXMuWS5ldmVudGxpc3RlbmVyW2RdJiZiLmV2ZW50PT10aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5uYW1lJiZ0aGlzLlkuZXZlbnRsaXN0ZW5lcltkXS5jYihiKX0scGU6ZnVuY3Rpb24oYixhKXt0aGlzLlkuZXZlbnRsaXN0ZW5lci5wdXNoKHtuYW1lOmIsY2I6YX0pfSxCZzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5XZyhiKSxkPSExO2lmKGEpcmV0dXJuIHRoaXMueWQoYiwiUE9TVCIse2hvbWFkX3Jlc29sdmVfaGFzaDphfSxmdW5jdGlvbihiKXt0cnl7ZD1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KS51cmx9Y2F0Y2goYSl7fX0sZnVuY3Rpb24oKXt9LCEwLCEwKSxkfSxXZzpmdW5jdGlvbihiKXt2YXIgYT1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTtpZigoYT1hLmV4ZWMoYikpJiYoYVsyXXx8YVs1XSkpe2lmKGFbMl0pcmV0dXJuIGFbMl07aWYoYVs1XSlyZXR1cm4gYVs1XX1lbHNlIGlmKGE9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoYT1hLmV4ZWMoYikpJiZhWzRdKXJldHVybiBhWzRdO3JldHVybiExfSx4azpmdW5jdGlvbihiLGEpe2lmKGEmJiEoMD50aGlzLnRhKGIpLmhvc3QuaW5kZXhPZigiZGFtb2giKSkpe2lmKGI9PQphKXtpZihlLnRsKGIpKXJldHVybjsoYT10aGlzLkJnKGIpKXx8KGE9Yil9MD09PWEuaW5kZXhPZigiLy8iKSYmKGE9Imh0dHBzOiIrYSk7dGhpcy5ZLnVybHNbYl09YTt0aGlzLlkudXJsc1thXT1iO3RoaXMuWS5ob21hZFVybHNbYl09YTt0aGlzLlkub3JpZ2luYWxVcmxzW2FdPWJ9fSx0bDpmdW5jdGlvbihiKXt2YXIgYT0hMTt0aGlzLlkuaG9tYWRVcmxzW2JdJiYoYT10aGlzLlkuaG9tYWRVcmxzW2JdKTtyZXR1cm4gYX0sTGc6ZnVuY3Rpb24oYil7dmFyIGE9ITE7dGhpcy5ZLm9yaWdpbmFsVXJscyYmdGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSYmKGE9dGhpcy5ZLm9yaWdpbmFsVXJsc1tiXSk7cmV0dXJuIGF9LHBtOmZ1bmN0aW9uKGIpe3JldHVybiJhYm91dDpibGFuayI9PWJ8fCJhYm91dDpzZWxmIj09Ynx8IiI9PWJ9LEZlOmZ1bmN0aW9uKGIpe2lmKCFifHwib2JqZWN0IiE9PXR5cGVvZiBiKXJldHVybiAwO3ZhciBhPTAsZD0iIjtmb3IoZCBpbiBiKWIuaGFzT3duUHJvcGVydHkoZCkmJgphKys7cmV0dXJuIGF9LFVnOmZ1bmN0aW9uKGIsYSl7dmFyIGQ9YlthXTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQpOiJmdW5jdGlvbiI9PT10eXBlb2YgZD9kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkKCkpOiJvYmplY3QiPT09dHlwZW9mIGQ/ZDpudWxsfSxLbjpmdW5jdGlvbihiLGEsZCl7YiYmKGIuc3R5bGVbYV09ZCl9LHhmOmZ1bmN0aW9uKGIsYSl7Zm9yKHZhciBkPXRoaXMuYWwoYSksZj0wO2Y8ZC5sZW5ndGg7ZisrKXRoaXMuS24oYixkW2ZdLmtleSxkW2ZdLnZhbHVlKX0sSms6ZnVuY3Rpb24oYil7aWYoInN0cmluZyIhPT10eXBlb2YgYilyZXR1cm4iIjt0cnl7cmV0dXJuIGIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKX1jYXRjaChhKXtyZXR1cm4iIn19LGFsOmZ1bmN0aW9uKGIpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgYT1bXSxkPXt9LGY9ZD0iIixwPTA7cDxiLmxlbmd0aDtwKyspe3ZhciBjPWJbcF0uc3BsaXQoIjoiKSwKZD1jWzBdLnRyaW0oKTtjWzFdJiZjWzFdLnRyaW0/Zj1jWzFdLnRyaW0oKTpmPSIiO2QuaW5kZXhPZiYmMDw9ZC5pbmRleE9mKCItIikmJihjPWQuc3BsaXQoIi0iKSxkPWNbMF0rdGhpcy5KayhjWzFdKSk7ZD17a2V5OmQsdmFsdWU6Zn07YS5wdXNoKGQpfXJldHVybiBhfSxEZjpmdW5jdGlvbihiKXtmb3IoO2IhPWRvY3VtZW50LmJvZHkmJm51bGwhPWI7KWI9Yi5wYXJlbnRFbGVtZW50O3JldHVybiBiPT1kb2N1bWVudC5ib2R5PyEwOiExfSxwaDpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5nZXRCb3VuZGluZ0NsaWVudFJlY3Q/KGI9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk/MDw9Yi50b3AmJjA8PWIubGVmdCYmYi5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZiLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6CiExOiExfSxPZTpmdW5jdGlvbihiLGEpe3ZhciBkPTAsZj0wLHA9MCxjPTAsZT0hMTtpZighYnx8IWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0fHwiZnVuY3Rpb24iIT09dHlwZW9mIGIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXJldHVybiExO3ZhciBoPWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoIWgpcmV0dXJuITE7cD1oLmhlaWdodCpoLndpZHRoO2Q9aC53aWR0aDtmPWguaGVpZ2h0OzA+aC50b3AmJihmKz1oLnRvcCk7aC5ib3R0b20+KHdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCkmJihmLT1oLmJvdHRvbS0od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD5oLmxlZnQmJihkKz1oLmxlZnQpO2gucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09aC5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpKTswPmYmJihmPTApOzA+ZCYmKGQ9MCk7MDxwJiYoYz0xMDAvcCpkKmYpO2M+PWEmJihlPSEwKTtyZXR1cm4gZX0sUGU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5PZShiLmVsLGIucGVyY2VudCk7Yi5zdGFydFRpbWV8fChiLnN0YXJ0VGltZT0obmV3IERhdGUpLmdldFRpbWUoKSk7aWYoYSl7aWYoKG5ldyBEYXRlKS5nZXRUaW1lKCktYi5zdGFydFRpbWU+PWIudGltZU1TKXtiLmNiKCk7cmV0dXJufX1lbHNlIGIuc3RhcnRUaW1lPSExO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5QZShiKX0uYmluZCh0aGlzKSwxMDApfSxMYjpmdW5jdGlvbihiKXtiPWImJiJudW1iZXIiPT09dHlwZW9mIGI/TWF0aC5hYnMoYik6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYikqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxYOmZ1bmN0aW9uKGIpe2I9YiYmIm51bWJlciI9PT10eXBlb2YgYiYmCjA8Yj9NYXRoLnJvdW5kKGIpOjEwO2Zvcih2YXIgYT0iIixkPTA7ZDxiO2QrKylhKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPzY1Ojk3KStNYXRoLmZsb29yKDI2Kk1hdGgucmFuZG9tKCkpKTtyZXR1cm4gYX0sSGU6ZnVuY3Rpb24oYil7dmFyIGE9MCxkLGY7aWYoMD09PWIubGVuZ3RoKXJldHVybiBhO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIGF9LFRoOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYil7dmFyIGc9IiIsZCxmO2ZvcihkPTc7MDw9ZDtkLS0pZj1iPj4+NCpkJjE1LGcrPWYudG9TdHJpbmcoMTYpO3JldHVybiBnfWZ1bmN0aW9uIGQoYixhKXtyZXR1cm4gYjw8YXxiPj4+MzItYX12YXIgZixwLGM9QXJyYXkoODApLGU9MTczMjU4NDE5MyxoPTQwMjMyMzM0MTcsSj0yNTYyMzgzMTAyLGs9MjcxNzMzODc4LG09MzI4NTM3NzUyMCxuLGwsdSxyLHQ7Yj1iJiYic3RyaW5nIj09PQp0eXBlb2YgYj9iOiIiO249Yi5sZW5ndGg7dmFyIHE9W107Zm9yKGY9MDtmPG4tMztmKz00KXA9Yi5jaGFyQ29kZUF0KGYpPDwyNHxiLmNoYXJDb2RlQXQoZisxKTw8MTZ8Yi5jaGFyQ29kZUF0KGYrMik8PDh8Yi5jaGFyQ29kZUF0KGYrMykscS5wdXNoKHApO3N3aXRjaChuJTQpe2Nhc2UgMDpmPTIxNDc0ODM2NDg7YnJlYWs7Y2FzZSAxOmY9Yi5jaGFyQ29kZUF0KG4tMSk8PDI0fDgzODg2MDg7YnJlYWs7Y2FzZSAyOmY9Yi5jaGFyQ29kZUF0KG4tMik8PDI0fGIuY2hhckNvZGVBdChuLTEpPDwxNnwzMjc2ODticmVhaztjYXNlIDM6Zj1iLmNoYXJDb2RlQXQobi0zKTw8MjR8Yi5jaGFyQ29kZUF0KG4tMik8PDE2fGIuY2hhckNvZGVBdChuLTEpPDw4fDEyOH1mb3IocS5wdXNoKGYpOzE0IT1xLmxlbmd0aCUxNjspcS5wdXNoKDApO3EucHVzaChuPj4+MjkpO3EucHVzaChuPDwzJjQyOTQ5NjcyOTUpO2ZvcihiPTA7YjxxLmxlbmd0aDtiKz0xNil7Zm9yKGY9MDsxNj5mO2YrKyljW2ZdPXFbYisKZl07Zm9yKGY9MTY7Nzk+PWY7ZisrKWNbZl09ZChjW2YtM11eY1tmLThdXmNbZi0xNF1eY1tmLTE2XSwxKTtwPWU7bj1oO2w9Sjt1PWs7cj1tO2ZvcihmPTA7MTk+PWY7ZisrKXQ9ZChwLDUpKyhuJmx8fm4mdSkrcitjW2ZdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2ZvcihmPTIwOzM5Pj1mO2YrKyl0PWQocCw1KSsobl5sXnUpK3IrY1tmXSsxODU5Nzc1MzkzJjQyOTQ5NjcyOTUscj11LHU9bCxsPWQobiwzMCksbj1wLHA9dDtmb3IoZj00MDs1OT49ZjtmKyspdD1kKHAsNSkrKG4mbHxuJnV8bCZ1KStyK2NbZl0rMjQwMDk1OTcwOCY0Mjk0OTY3Mjk1LHI9dSx1PWwsbD1kKG4sMzApLG49cCxwPXQ7Zm9yKGY9NjA7Nzk+PWY7ZisrKXQ9ZChwLDUpKyhuXmxedSkrcitjW2ZdKzMzOTU0Njk3ODImNDI5NDk2NzI5NSxyPXUsdT1sLGw9ZChuLDMwKSxuPXAscD10O2U9ZStwJjQyOTQ5NjcyOTU7aD1oK24mNDI5NDk2NzI5NTtKPUorbCY0Mjk0OTY3Mjk1OwprPWsrdSY0Mjk0OTY3Mjk1O209bStyJjQyOTQ5NjcyOTV9cmV0dXJuKGEoZSkrYShoKSthKEopK2EoaykrYShtKSkudG9Mb3dlckNhc2UoKX0semI6ZnVuY3Rpb24oYil7Zm9yKHZhciBhPSIiLGQsZixwLGMsZSxoLGs9MDtrPGIubGVuZ3RoOylkPWIuY2hhckNvZGVBdChrKyspLGY9Yi5jaGFyQ29kZUF0KGsrKykscD1iLmNoYXJDb2RlQXQoaysrKSxjPWQ+PjIsZD0oZCYzKTw8NHxmPj40LGU9KGYmMTUpPDwyfHA+PjYsaD1wJjYzLGlzTmFOKGYpP2U9aD02NDppc05hTihwKSYmKGg9NjQpLGE9YSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChjKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChkKSsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iLmNoYXJBdChlKSsKIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCk7cmV0dXJuIGF9LGttOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJi0xPG5hdmlnYXRvci52ZW5kb3IuaW5kZXhPZigiQXBwbGUiKX0scWQ6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPSExLGQ9ITEsZj0hMSxwPSExLGM9ITEsZT0hMSxoPSExLGs9ITEsbT0hMSxsPSExO3RyeXthPWNoZWNrRm9yUGhhbnRvbUpTKCl9Y2F0Y2gobil7fXRyeXsvXGJIZWFkbGVzc0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYoZD0hMCl9Y2F0Y2gocil7fXRyeXtmPXdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJ3ZWJkcml2ZXIiKXx8bmF2aWdhdG9yLmFjPyEwOiExfWNhdGNoKHUpe310cnl7cD0tMSE9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJPcGVyYSIpLGM9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRmlyZWZveCIpLAplPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLGg9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLG09LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksaz0haCYmISF3aW5kb3cuU3R5bGVNZWRpYXx8LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiRWRnZSIpLGw9KG18fHApJiYhIXdpbmRvdy5DU1N9Y2F0Y2godCl7fWIuaXNQaGFudG9tSlM9YTtiLmlzQ2hyb21lSGVhZGxlc3M9ZDtiLmlzRmlyZWZveEhlYWRsZXNzPWY7Yi5pc09wZXJhPXA7Yi5pc0ZpcmVmb3g9YztiLmlzU2FmYXJpPWU7Yi5pc0lFPWg7Yi5pc0VkZ2U9aztiLmlzQ2hyb21lPW07Yi5pc0JsaW5rPWw7cmV0dXJuIGJ9LFNhOmZ1bmN0aW9uKCl7dmFyIGI9e0FpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FuZHJvaWQvaSl9LEhpOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LAphbTpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUGhvbmV8aVBhZHxpUG9kL2kpfSxGajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PcGVyYSBNaW5pL2kpfSxoazpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9JRU1vYmlsZS9pKX0sc2o6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTW9iaWxlL2kpfSxVajpmdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TYW1zdW5nL2kpfHxuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9TTS0vaSl9LERrOmZ1bmN0aW9uKCl7cmV0dXJuIGIuQWkoKXx8Yi5IaSgpfHxiLmFtKCl8fGIuRmooKXx8Yi5oaygpfHxiLnNqKCl8fGIuVWooKX19O3JldHVybiBudWxsIT1iLkRrKCl9LHlsOmZ1bmN0aW9uKGIpe3ZhciBhPW5hdmlnYXRvci51c2VyQWdlbnQsZCxmPWEubWF0Y2goLyhvcGVyYXxjaHJvbWV8c2FmYXJpfGZpcmVmb3h8bXNpZXx0cmlkZW50KD89XC8pKVwvP1xzKihcZCspL2kpfHwKW107aWYoL3RyaWRlbnQvaS50ZXN0KGZbMV0pKXJldHVybiBkPS9cYnJ2WyA6XSsoXGQrKS9nLmV4ZWMoYSl8fFtdLCJJRSAiKyhkWzFdfHwiIik7aWYoIkNocm9tZSI9PT1mWzFdJiYoZD1hLm1hdGNoKC9cYihPUFJ8RWRnZSlcLyhcZCspLyksbnVsbCE9ZCkpcmV0dXJuIGQuc2xpY2UoMSkuam9pbigiICIpLnJlcGxhY2UoIk9QUiIsIk9wZXJhIik7aWYoIWIpcmV0dXJuIGZbMV07Zj1mWzJdP1tmWzFdLGZbMl1dOltuYXZpZ2F0b3IuYXBwTmFtZSxuYXZpZ2F0b3IuYXBwVmVyc2lvbiwiLT8iXTtudWxsIT0oZD1hLm1hdGNoKC92ZXJzaW9uXC8oXGQrKS9pKSkmJmYuc3BsaWNlKDEsMSxkWzFdKTtyZXR1cm4gZi5qb2luKCIiKX0sdGE6ZnVuY3Rpb24oYil7dmFyIGE9InNvdXJjZSBwcm90b2NvbCBhdXRob3JpdHkgdXNlckluZm8gdXNlciBwYXNzd29yZCBob3N0IHBvcnQgcmVsYXRpdmUgcGF0aCBkaXJlY3RvcnkgZmlsZSBxdWVyeSBhbmNob3IiLnNwbGl0KCIgIik7Yj0vXig/Oig/IVteOkBdKzpbXjpAXC9dKkApKFteOlwvPyMuXSspOik/KD86XC9cLyk/KCg/OigoW146QF0qKSg/OjooW146QF0qKSk/KT9AKT8oW146XC8/I10qKSg/OjooXGQqKSk/KSgoKFwvKD86W14/I10oPyFbXj8jXC9dKlwuW14/I1wvLl0rKD86Wz8jXXwkKSkpKlwvPyk/KFtePyNcL10qKSkoPzpcPyhbXiNdKikpPyg/OiMoLiopKT8pLy5leGVjKGIpOwpmb3IodmFyIGQ9e30sZj0xNDtmLS07KWRbYVtmXV09YltmXXx8IiI7ZC5xdWVyeUtleT17fTtkW2FbMTJdXS5yZXBsYWNlKC8oPzpefCYpKFteJj1dKik9PyhbXiZdKikvZyxmdW5jdGlvbihiLGEsZyl7YSYmKGQucXVlcnlLZXlbYV09Zyl9KTtyZXR1cm4gZH0sdW5pcXVlOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT17fSxkPVtdLGY9MCxwPWIubGVuZ3RoO2Y8cDsrK2YpYS5oYXNPd25Qcm9wZXJ0eShiW2ZdKXx8KGQucHVzaChiW2ZdKSxhW2JbZl1dPTEpO3JldHVybiBkfSxDYjpmdW5jdGlvbihiKXtiPXRoaXMudGEoYikuaG9zdC5zcGxpdCgiLiIpO3ZhciBhPSIiO2JbYi5sZW5ndGgtMl0mJihhKz1iW2IubGVuZ3RoLTJdKyIuIik7YltiLmxlbmd0aC0xXSYmKGErPWJbYi5sZW5ndGgtMV0pO3JldHVybiBhfSxGOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9ITE7d2luZG93JiZ3aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSYmKGE9d2luZG93LmxvY2F0aW9uLmhvc3RuYW1lKTsKYSYmLTE8YS5pbmRleE9mKGIpJiYoZD0hMCk7cmV0dXJuIGR9LE1sOmZ1bmN0aW9uKCl7dmFyIGI9IiIsYT0iIixkPSIiO3RyeXtiPXdpbmRvdy5sb2NhdGlvbi5ob3N0LGE9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLHdpbmRvdyE9d2luZG93LnRvcCYmKGI9d2luZG93LnRvcC5sb2NhdGlvbi5ob3N0LGE9d2luZG93LnRvcC5sb2NhdGlvbi5wYXRobmFtZSl9Y2F0Y2goZil7ZG9jdW1lbnQucmVmZXJyZXImJihkPXRoaXMudGEoZG9jdW1lbnQucmVmZXJyZXIpLGI9ZC5ob3N0LGE9ZC5wYXRoKX1yZXR1cm4gYithfSxkbDpmdW5jdGlvbihiLGEpe2Zvcih2YXIgZD1bXSxmPVtdLHA9MDtwPGEubGVuZ3RoO3ArKylkW2FbcF1dPSEwO2ZvcihwPTA7cDxiLmxlbmd0aDtwKyspZFtiW3BdXXx8Zi5wdXNoKGJbcF0pO3JldHVybiBmfSxSbjpmdW5jdGlvbihiLGEpe3ZhciBkPS0xLGY9IiI7dHJ5ezA8Yi5pbmRleE9mKCIlIikmJjA8YT8oZj1iLnNwbGl0KCIlIiksZD1hLzEwMCpmKTooZD1iLnNwbGl0KCI6IiksCmQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChwKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxRZzpmdW5jdGlvbihiKXtiPU1hdGgucm91bmQoYik7dmFyIGE9Ii0tOi0tIjswPD1iJiYoYj1NYXRoLmZsb29yKGIpLGE9TWF0aC5mbG9vcihiLzYwKSxhPXRoaXMua2koYSkrIjoiK3RoaXMua2koTWF0aC5mbG9vcihiLTYwKmEpKSk7cmV0dXJuIGF9LGtpOmZ1bmN0aW9uKGIpe3JldHVybiAxMD5iPyIwIitiLnRvU3RyaW5nKCk6Yi50b1N0cmluZygpfSx1ZjpmdW5jdGlvbihiKXt0aGlzLkdiPWJ9LE5nOmZ1bmN0aW9uKGIsYSxkKXt2YXIgZjtkLnN0YXRlPXRoaXMuR2I7dGhpcy5tZShkKTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9mPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6ZH0pOihmPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGYuaW5pdEN1c3RvbUV2ZW50KGEsITEsITEsZCkpOwpiLmRpc3BhdGNoRXZlbnQoZil9LEZjOmZ1bmN0aW9uKGIsYSxkKXthfHwoYT0iaGRFdmVudCIpO2R8fChkPXdpbmRvdyk7dGhpcy5OZyhkLGEsYil9LG86ZnVuY3Rpb24oYixhLGQsZixwLGMsaCl7dmFyIHk9YjtkJiZhJiYoYT1rLlJhKGEsZCkpO2EmJih5PWsuUmEoYixhKSk7ZiYmKHk9ay5SYSh5LGYpKTtwJiYoeT1rLlJhKHkscCkpO2MmJih5PWsuUmEoeSxjKSk7aCYmKHk9ay5SYSh5LGMpKTtlLkZjKHkpfSxhbjpmdW5jdGlvbihiKXt2YXIgYT17fTtpZighYi5jb2RlKXJldHVybiExO2lmKGIuc3BlY2lhbF90cmFjaylhPWI7ZWxzZSBpZighKGIuY29kZSYmMTAwNTw9Yi5jb2RlJiYxMDI5Pj1iLmNvZGUpfHwxMDIzPT1iLmNvZGV8fDEwMTg9PWIuY29kZSlyZXR1cm47dHJ5e2hhJiYoYS5zZXNzaW9uX2lkPWhhKTthLmFkc2Vzc2lvbl9pZD1iLmFkc2Vzc2lvbl9pZD9iLmFkc2Vzc2lvbl9pZDoiZXBvbiI7Yi5ob21hZEltcHJlc3Npb25BZElkJiYoYS5hZF9pZD1iLmhvbWFkSW1wcmVzc2lvbkFkSWQpOwphLmV2ZW50PWIuY29kZTthLnNpdGVfaHJlZj10aGlzLk1sKCk7aWYoYi5zdGF0ZSlzd2l0Y2goYi5zdGF0ZSl7Y2FzZSAicHJlcm9sbCI6YS5wb3NpdGlvbj0xO2JyZWFrO2Nhc2UgIm1pZHJvbGwiOmEucG9zaXRpb249MjticmVhaztjYXNlICJwb3N0cm9sbCI6YS5wb3NpdGlvbj0zO2JyZWFrO2RlZmF1bHQ6YS5wb3NpdGlvbj0wfWIudmlkZW9fZHVyYXRpb24mJihhLnZpZGVvX2R1cmF0aW9uPWIudmlkZW9fZHVyYXRpb24pfWNhdGNoKGQpe31yZXR1cm4gYX0sU246ZnVuY3Rpb24oYil7Yi5zcGVjaWFsX3RyYWNrPSEwO2Iuc2Vzc2lvbl9pZD10aGlzLmdjKCk7Yi5ldmVudF9jb2RlfHwoYi5ldmVudF9jb2RlPTk5OTAwKTtiLmNvZGU9Yi5ldmVudF9jb2RlO2IuZXZlbnRfbmFtZXx8KGIuZXZlbnRfbmFtZT0ibm9uYW1lIik7dGhpcy5tZShiKX0sbWU6ZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5hbihiKTtpZihhKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5tZShhKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtpZigib2JqZWN0Ij09dHlwZW9mIGEpdHJ5e2E9SlNPTi5zdHJpbmdpZnkoYSl9Y2F0Y2goZCl7YT1hLnRvU3RyaW5nP2EudG9TdHJpbmcoKToiIn1hJiZhLnRyaW0mJihhPWEudHJpbSgpKTtiPW0uUGMoKTttLnZhKGIsITApO2I9bS52YShiLCEwKTtiLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtiLmRhdGEuaG9tYWRfYXQ9YTttLklhKGIsZnVuY3Rpb24oKXt9KX19LHRyYWNrOmZ1bmN0aW9uKGIsYSxkKXtpZihkKWlmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhiLGEsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXtiJiZiLnRyaW0mJihiPWIudHJpbSgpKTthJiZhLnRyaW0mJihhPWEudHJpbSgpKTt2YXIgZj1tLlBjKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYikrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChhKTsKbS52YShmLCEwKTtmPW0udmEoZiwhMCk7Zi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9IiI7Zi5kYXRhLmhvbWFkX3RyYWNrX2tleT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjtmLmRhdGEuaG9tYWRfdHJhY2tfdmFsdWU9IioiK2VuY29kZVVSSUNvbXBvbmVudChhKSsiKiI7bS5JYShmLGZ1bmN0aW9uKGQpe3ZhciBmPSExO2Q9ZC5yZXNwb25zZVRleHQ7dHJ5e2Q9SlNPTi5wYXJzZShkKSxkPWQuZGF0YSxkWzBdPT1lbmNvZGVVUklDb21wb25lbnQoYikmJihmPSEwKSxkWzFdJiZkWzFdIT1lbmNvZGVVUklDb21wb25lbnQoYSkmJihmPSExKX1jYXRjaChjKXt9Znx8dGhpcy50cmFjaygic3RhdHNfaGRfdHJhY2tjaGVjayIsKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LFFkOmZ1bmN0aW9uKGIpe2lmKCFtfHwhbS5TKXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50cmFjayhrZXksYSxmb3JjZVRyYWNrKX0uYmluZCh0aGlzKSwKNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgYT1iLmpvaW4oIiwiKTtiPW0uUGMoKSsiP2hvbWFkX3RyYWNrPSIrZW5jb2RlVVJJQ29tcG9uZW50KGEpO2I9bS52YShiLCEwKTtiLmRhdGEuaG9tYWRfdHJhY2s9YTttLklhKGIpfX0sWGU6ZnVuY3Rpb24oKXttJiZtLlM/bS5pc0VuYWJsZWQmJm0uT2soKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSw1MDApfSxEZTpmdW5jdGlvbihiLGEpe3JldHVybiBiJiYib2JqZWN0Ij09dHlwZW9mIGImJmIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYSkubGVuZ3RoP3RoaXMubGIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZShhKVswXSk6IiJ9LEdlOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmNoaWxkTm9kZXMmJmIuY2hpbGROb2Rlc1swXT9iLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlOiIifSxsYjpmdW5jdGlvbihiKXtyZXR1cm4gYj90aGlzLnVkKGIpOiIifSx1ZDpmdW5jdGlvbihiKXt2YXIgYT10aGlzLkdlKGIpOwphJiYoYT1hLnRyaW0oKSk7IWEmJmIudGV4dENvbnRlbnQmJihhPWIudGV4dENvbnRlbnQsYT1hLnRyaW0oKSk7cmV0dXJuIGF9LG1nOmZ1bmN0aW9uKGIsYSxkLGYpe2Q9ITE7aWYoYS5RZShiKXx8dGhpcy5wbShiKXx8MDw9Yi5pbmRleE9mKCJkYXRhOmltYWdlIikpcmV0dXJuIGI7d2luZG93LnNhbmRib3gmJndpbmRvdy5zYW5kYm94LnFmJiZ3aW5kb3cuc2FuZGJveC5xZlsiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LnFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJlcnJvciIpfHxzYW5kYm94LnFmWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGIpKCJFcnJvciIpKTtpZih0aGlzLkxnKGIpKXJldHVybiB0aGlzLkxnKGIpO3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1iO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy56YihiKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0KInRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjtmJiZmLnBvc3QmJihjWyJYLUhvbWFkLVBvc3QiXT0idHJ1ZSIpO2QmJihjLmhvbWFkX2ludHJvc3BlY3Q9ImlmcmFtZSIpO2MuaG9tYWRfdnBhaWRfY29tcGF0aWJsZT0idHJ1ZSI7Yy5ob21hZF92cGFpZF9jdHg9InRydWUiO2YmJmYub25seVVSTCYmKGMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M9Ik1lZGlhRmlsZSIpO3ZhciBlPSExO2Q9ITE7ZD10aGlzLmFiKGIsYS5BYSxjLGZ1bmN0aW9uKGIpe2U9Yi5yZXNwb25zZVRleHR9LGZ1bmN0aW9uKCl7fSxhLCEwKTt0cnl7ZXx8KGU9ZCksZT1KU09OLnBhcnNlKGUpfWNhdGNoKGgpe2U9ITF9ZS51cmwmJmUuaGFzaCYmKGU9YS53ZCgpLnJlcGxhY2UoIltoYXNoXSIsZS5oYXNoKSk7dGhpcy54ayhlLGIpO3JldHVybiBlfSxhYjpmdW5jdGlvbihiLGEsZCxmLGMsZSxoLHkpe3ZhciBrPWV8fG07ZT0hMDt5JiYoZT0hMSk7aWYoayYmay5TKWlmKGsuaXNFbmFibGVkKXtpZigiZnVuY3Rpb24iPT0KdHlwZW9mIGIpdHJ5e2I9YigpfWNhdGNoKGwpe2MobCl9aWYoInN0cmluZyIhPXR5cGVvZiBiKWMoKTtlbHNle2sudmEoYixlKTtlPWsudmEoYixlKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1hO2UuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO2Zvcih2YXIgciBpbiBkKWUuZGF0YVtyXT1kW3JdO3JldHVybiBrLklhKGUsZixjLCIiLCIiLGgpfX1lbHNlIGMoKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5hYihiLGEsZCxmLGMsayxoLHkpfS5iaW5kKHRoaXMpLDUwMCl9LHlkOmZ1bmN0aW9uKGIsYSxkLGYsYyxlLGgpe3ZhciBrPSEwO2gmJihrPSExKTtpZigic3RyaW5nIiE9dHlwZW9mIGQpe2g9ZDtkPSIiO2Zvcih2YXIgbSBpbiBoKWQrPSImIittKyI9IitlbmNvZGVVUklDb21wb25lbnQoaFttXSk7ZD1kLnN1YnN0cigxKX12YXIgbD1uZXcgWE1MSHR0cFJlcXVlc3Q7bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZnx8CjQhPWwucmVhZHlTdGF0ZXx8MjAwIT1sLnN0YXR1cyYmMjAxIT1sLnN0YXR1c3x8ZihsKTtjJiY0PT1sLnJlYWR5U3RhdGUmJjIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXMmJmMobCl9O3RyeXtsLm9wZW4oYSxiLGspLGwud2l0aENyZWRlbnRpYWxzPWUsMDxkLmxlbmd0aCYmbC5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSxsLnNlbmQoZCl9Y2F0Y2gocil7YyYmYygpfXJldHVybiBsfSx5bTpmdW5jdGlvbihiLGEsZCl7dGhpcy55ZChiLCJHRVQiLCIiLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7aWYodGhpcy5UYylmb3IodmFyIGMgaW4gdGhpcy5UYyliPWIuc3BsaXQoYykuam9pbih0aGlzLlRjW2NdKTtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2MudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtjLnNyYz0iZGF0YTp0ZXh0L2phdmFzY3JpcHQ7YmFzZTY0LCIrZS56YihiKTtkJiYKKGMub25lcnJvcj1kKTtkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQ/ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYyxkb2N1bWVudC5oZWFkLmZpcnN0Q2hpbGQpOmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYyk7YSYmc2V0VGltZW91dChhLDApfS5iaW5kKHRoaXMpLGQpfSx1aDpmdW5jdGlvbihiLGEsZCxmKXt2YXIgYz17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtjLmhvbWFkX3VybF9zdWZmaXg9YjtjLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMuemIoYik7Yy5ob21hZF9yZXR1cm5fb25seV91cmxfYW5kX2hhc2g9InRydWUiO2MuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLmFiKGIsZi5BYSxjLGZ1bmN0aW9uKGIpe2I9Yi5yZXNwb25zZVRleHQ7dHJ5e2I9SlNPTi5wYXJzZShiKX1jYXRjaChjKXtiPSExfXRoaXMueW0oZi53ZCgpLnJlcGxhY2UoIltoYXNoXSIsYi5oYXNoKSxhLGQpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7fSxmLCEwKX0sCkluOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLlRjPWJ9LGNwOmZ1bmN0aW9uKGIsYSxkLGYsYyl7dGhpcy5hYihiLGQse30sZnVuY3Rpb24oYil7dHJ5e3ZhciBkPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2RbMF0mJihkPWRbMF0pO2Q/ZC5pZD8oYT1hLnJlcGxhY2UoIltpZF0iLGQuaWQpLGE9YS5yZXBsYWNlKCJbcHJpY2VdIixkLnByaWNlKSxhPWEucmVwbGFjZSgiW2FkdmVydGlzZXJdIixkLmFkdmVydGlzZXIpLGE9YS5yZXBsYWNlKCJbY3VybF0iLGQuY3VybCksYT1hLnJlcGxhY2UoIltmb3JtYXRdIixkLmZvcm1hdCksYT1hLnJlcGxhY2UoIltzcmNdIixkLnNyYyksYT1hLnJlcGxhY2UoIltwcmljZXJhbmdlXSIsZC5wcmljZXJhbmdlKSxhPWEucmVwbGFjZSgiW3BpZF0iLGQucGlkKSxhPWEucmVwbGFjZSgiW3ByaW9dIixkLnByaW8pLGE9YS5yZXBsYWNlKCJbZGlkXSIsZC5kaWQpLGMoe3BsYWNlaG9sZGVyOmEsbWFjcm86Zn0pKTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSk6CmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX1jYXRjaChlKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzpmfSl9fSxmdW5jdGlvbigpe2Moe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmZ9KX0pfSxGazpmdW5jdGlvbihiKXtmb3IodmFyIGE9ITE7IWE7KXt2YXIgZD1iLmxhc3RJbmRleE9mKCJFTkNPREUoIik7MD5kP2E9ITA6KGQ9Yi5zdWJzdHJpbmcoZCs3LGIuaW5kZXhPZigiKSIsZCkpLGI9Yi5yZXBsYWNlKCJFTkNPREUoIitkKyIpIixlbmNvZGVVUklDb21wb25lbnQoZCkpKX1yZXR1cm4gYn0saW06ZnVuY3Rpb24oYixhKXt2YXIgZD0hMTtpZihhKWZvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKWlmKGFbZl09PWIpe2Q9ITA7YnJlYWt9cmV0dXJuIGR9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9fX0pKGMpO3ZhciBQPWMuY2p8fFA7bmV3IFA7dmFyIGU9bmV3IFA7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYil7dGhpcy5kYXRhPQpifHx7fX1jLmJqPWE7YS5SYT1mdW5jdGlvbihiLGEpe3ZhciBkPXt9LGY7Zm9yKGYgaW4gYSlkW2ZdPWFbZl07Zm9yKGYgaW4gYilkW2ZdPWJbZl07cmV0dXJuIGR9O2EuVG09e2NvZGU6IjEwMDAiLHR5cGU6InBlbmFsdHkiLG1lc3NhZ2U6IiIsbmFtZToicGVuYWx0eSJ9O2EuTW09e2NvZGU6IjEwMDEiLHR5cGU6Im1lZGlhZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuWm89e2NvZGU6IjEwMDIiLHR5cGU6InZwYWlkIixtZXNzYWdlOiIiLG5hbWU6InZwYWlkIn07YS5rbD17Y29kZToiMTAwMyIsdHlwZToiZW1wdHlWYXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLmJwPXtjb2RlOiIxMDA0Iix0eXBlOiJtYWxmb3JtYXR0ZWRYTUwiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuZ2c9e2NvZGU6IjEwMDUiLHR5cGU6ImFkU3RhcnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTdGFydCJ9O2EuWmY9e2NvZGU6IjEwMDYiLHR5cGU6ImFkRmlyc3RRdWFydGlsZSIsCm1lc3NhZ2U6IiIsbmFtZToiYWRGaXJzdFF1YXJ0aWxlIn07YS5kZz17Y29kZToiMTAwNyIsdHlwZToiYWRNaWRQb2ludCIsbWVzc2FnZToiIixuYW1lOiJhZE1pZFBvaW50In07YS5oZz17Y29kZToiMTAwOCIsdHlwZToiYWRUaGlyZFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkVGhpcmRRdWFydGlsZSJ9O2EucGs9e2NvZGU6IjEwMDkiLHR5cGU6ImFkQ29tcGxldGUiLG1lc3NhZ2U6IiIsbmFtZToiYWRDb21wbGV0ZSJ9O2EuYmc9e2NvZGU6IjEwMTAiLHR5cGU6ImFkSW1wcmVzc2lvbnNDYWxsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRJbXByZXNzaW9uIn07YS5Gbz17Y29kZToiMTAxMSIsdHlwZToidmFzdExvYWRpbmdGYWlsZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuTG09e2NvZGU6IjEwMTIiLHR5cGU6Im5vQ3JlYXRpdmUiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EubGw9e2NvZGU6IjEwMTMiLHR5cGU6ImVtcHR5VmFzdEZyb21Ib21hZFNlcnZlckV2ZW50IiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS4kbz17Y29kZToiMTAxNCIsdHlwZToid3JhcHBlckxpbWl0UmVhY2hlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS54Zz17Y29kZToiMTAxNSIsdHlwZToiY2xpY2t0aHJvdWdoIixtZXNzYWdlOiIiLG5hbWU6ImFkQ2xpY2sifTthLlprPXtjb2RlOiIxMDE2Iix0eXBlOiJjb250aW51ZUNvbnRlbnQiLG1lc3NhZ2U6IiIsbmFtZToiY29udGludWVDb250ZW50In07YS5tZD17Y29kZToiMTAxNyIsdHlwZToiY29udGVudFBsYXllclBsYXkiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBsYXkifTthLkJjPXtjb2RlOiIxMDE4Iix0eXBlOiJjb250ZW50UGxheWVyUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiY29udGVudFBsYXllclBhdXNlIn07YS5mZz17Y29kZToiMTAxOSIsdHlwZToiYWRTa2lwcGVkIixtZXNzYWdlOiIiLG5hbWU6ImFkU2tpcHBlZCJ9O2Eucms9e2NvZGU6IjEwMjAiLHR5cGU6ImFkUmVxdWVzdCIsCm1lc3NhZ2U6IiIsbmFtZToiYWRSZXF1ZXN0In07YS5iZD17Y29kZToiMTAyMSIsdHlwZToiYWRQbGF5IixtZXNzYWdlOiIiLG5hbWU6ImFkUGxheSJ9O2EuamU9e2NvZGU6IjEwMjIiLHR5cGU6ImFkUGF1c2UiLG1lc3NhZ2U6IiIsbmFtZToiYWRQYXVzZSJ9O2EubGU9e2NvZGU6IjEwMjMiLHR5cGU6ImFkVGltZSIsbWVzc2FnZToiIixuYW1lOiJhZFRpbWUifTthLnFrPXtjb2RlOiIxMDI0Iix0eXBlOiJhZE1ldGEiLG1lc3NhZ2U6IiIsbmFtZToiYWRNZXRhIn07YS5yaT17Y29kZToiMTAyNSIsdHlwZToidmlld2FibGUiLG1lc3NhZ2U6IiIsbmFtZToidmlld2FibGUifTthLk9tPXtjb2RlOiIxMDI2Iix0eXBlOiJub3RWaWV3YWJsZSIsbWVzc2FnZToiIixuYW1lOiJub3RWaWV3YWJsZSJ9O2EuemQ9e2NvZGU6IjEwMjciLHR5cGU6Im11dGUiLG1lc3NhZ2U6IiIsbmFtZToibXV0ZSJ9O2EuSGY9e2NvZGU6IjEwMjgiLHR5cGU6InVubXV0ZSIsbWVzc2FnZToiIixuYW1lOiJ1bm11dGUifTsKYS55Zz17Y29kZToiMTAyOSIsdHlwZToiY29udGVudFBsYXllck11dGVkIixtZXNzYWdlOiIiLG5hbWU6ImNvbnRlbnRQbGF5ZXJNdXRlZCJ9O2EuWW89e2NvZGU6IjEwMzAiLHR5cGU6InZwYWlkZXJyb3IiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2EuQm89e2NvZGU6IjEwMzEiLHR5cGU6InZhc3RkdW1teWFkIixtZXNzYWdlOiIiLG5hbWU6ImFkRXJyb3IifTthLkNvPXtjb2RlOiIxMDMyIix0eXBlOiJ2YXN0ZHVyYXRpb25lcnJvciIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07YS5Bbz17Y29kZToiOTAwMSIsdHlwZToidmFyaWFibGVEZWxldGVkRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToidmFyaWFibGVEZWxldGVkRXZlbnQifTthLk5tPXtjb2RlOiI5MDAyIix0eXBlOiJub1ZhcmlhYmxlU2V0dGluZ0V2ZW50IixtZXNzYWdlOiIiLG5hbWU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQifTthLnByb3RvdHlwZT17Z2V0RXJyb3JDb2RlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JDb2RlfX19KShjKTsKdmFyIGs9Yy5ianx8aztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuZmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBpYT1jLmZsfHxpYTtuZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmRqPWE7YS5wcm90b3R5cGU9e0hlOmZ1bmN0aW9uKGIpe3ZhciBhPTAsZCxmLGM7aWYoMD09Yi5sZW5ndGgpcmV0dXJuIGE7ZD0wO2ZvcihjPWIubGVuZ3RoO2Q8YztkKyspZj1iLmNoYXJDb2RlQXQoZCksYT0oYTw8NSktYStmLGF8PTA7cmV0dXJuIE1hdGguYWJzKGEpfSxoYTpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDAvMjQpK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50KwpuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLk5hfHwieCIpfSxJbDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnJvdW5kKERhdGUubm93KCkvMUUzLzM2MDApK25hdmlnYXRvci5hcHBDb2RlTmFtZStuYXZpZ2F0b3IuYXBwTmFtZStuYXZpZ2F0b3IuYXBwVmVyc2lvbituYXZpZ2F0b3IudXNlckFnZW50K25hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3IuTmF8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sdGQ6ZnVuY3Rpb24oYil7Yj1wYXJzZUludChiKTtpZig2NTw9YiYmOTA+PWJ8fDk3PD1iJiYxMjI+PWIpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYik7aWYoMD49YilyZXR1cm4iIjtpZig2NT5iKXJldHVybiB0aGlzLnRkKGIrNjUpO2lmKDkwPGIpcmV0dXJuIHRoaXMudGQoTWF0aC5yb3VuZChiLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihiKXtmb3IodmFyIGE9IiIsCmQ9Yi5sZW5ndGgtMSxhPSIiOzA8PWQ7YSs9YltkLS1dKTtyZXR1cm4gYX0sZmE6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5IZSh0aGlzLmhhKCkrIiIpLGI9KGIrIiIrdGhpcy5yZXZlcnNlKGIrIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGE9IiIsZD0wO2Q8Yi5sZW5ndGg7ZCsrKWErPXRoaXMudGQoYltkXSk7MD09YS5sZW5ndGgmJihhPSJ6b3JrIik7cmV0dXJuIGF9LGRtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmEoKSsiMiJ9LG5oOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPXRoaXMuSGUodGhpcy5JbCgpKyIiKSxiPShiKyIiK3RoaXMucmV2ZXJzZShiKyIiKSkubWF0Y2goLy57MSwyfS9nKSxhPSIiLGQ9MDtkPGIubGVuZ3RoO2QrKylhKz10aGlzLnRkKGJbZF0pOzA9PWEubGVuZ3RoJiYoYT0iem9yayIpO3JldHVybiBhfX19KShjKTt2YXIgSD1jLmRqfHxIO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5oaj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGphPQpjLmhqfHxqYTtuZXcgamEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fXZhciBiPS94eXovLnRlc3QoZnVuY3Rpb24oKXt4eXp9KT8vXGJfc3VwZXJcYi86Ly4qLzthLmV4dGVuZD1mdW5jdGlvbihnKXt2YXIgZD10aGlzLnByb3RvdHlwZSxmPU9iamVjdC5jcmVhdGUoZCksYztmb3IoYyBpbiBnKWZbY109ImZ1bmN0aW9uIj09PXR5cGVvZiBnW2NdJiYiZnVuY3Rpb24iPT10eXBlb2YgZFtjXSYmYi50ZXN0KGdbY10pP2Z1bmN0aW9uKGIsYSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGc9dGhpcy5qO3RoaXMuaj1kW2JdO3ZhciBmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaj1nO3JldHVybiBmfX0oYyxnW2NdKTpnW2NdO2c9ImZ1bmN0aW9uIj09PXR5cGVvZiBmLmk/Zi5oYXNPd25Qcm9wZXJ0eSgiaW5pdCIpPwpmLmk6ZnVuY3Rpb24oKXtkLmkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTpmdW5jdGlvbigpe307Zy5wcm90b3R5cGU9ZjtmLmNvbnN0cnVjdG9yPWc7Zy5leHRlbmQ9YS5leHRlbmQ7cmV0dXJuIGd9O2MuSWk9YX0pKGMpO3ZhciBLPWMuSWl8fEs7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkJrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2E9Yy5Ca3x8a2E7bmV3IGthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Laj1LLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLkphPXt9O3RoaXMuRz1udWxsO3RoaXMuUWM9MTAwO3RoaXMuTWI9MDt0aGlzLlRhPTE1MDt0aGlzLlNiPTA7dGhpcy5CbihhKX0sZjpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGE/KHRoaXMuTWIrKyx0aGlzLlNiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSk6MD50aGlzLlRhJiYodGhpcy5TYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmYuYmluZCh0aGlzKSx0aGlzLlFjKSl9LHRuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWI+dGhpcy5UYT8hMDohMX0scGY6ZnVuY3Rpb24oKXt0aGlzLk1iPTB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iZW1wdHkifSxCbjpmdW5jdGlvbihhKXt0aGlzLkc9YX0sR2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HfSxOOmZ1bmN0aW9uKGEpe3RoaXMuSmFbYS5oYSgpXT1hO0wmJkwudGgmJkwuWW4oYSl9LE1wOmZ1bmN0aW9uKCl7cmV0dXJuIGUuRmUodGhpcy5KYSl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMuSmEpaWYoYj09dGhpcy5KYVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfSxqbTpmdW5jdGlvbihhKXthPWEuR2EoKTtmb3IodmFyIGIgaW4gdGhpcy5KYSlpZihhLmlkPT0KdGhpcy5KYVtiXS5HYSgpLmlkKXJldHVybiEwO3JldHVybiExfSxlcTpmdW5jdGlvbihhKXt0aGlzLkphW2EuaWRdPW51bGx9fSl9KShjKTt2YXIgdD1jLktqfHx0OyhmdW5jdGlvbihjKXtjLk1qPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW9UYWc9dGhpcy5jb250YWluZXI9dGhpcy5pZD1udWxsO3RoaXMuUWM9MTA7dGhpcy5NYj0wO3RoaXMuVGE9NTA7dGhpcy5VPW51bGw7dGhpcy5qYT0hMTt0aGlzLnBsYXllcj1hO3RoaXMuRmI9IiI7dGhpcy5EZz0hMTt0aGlzLksoKX0sUjpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsZz10aGlzLkdhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGEudmlkZW9UYWc9YilhLnZpZGVvVGFnSWQ9Yi5pZDtpZihhLmNvbnRhaW5lcj1nKWEuY29udGFpbmVySWQ9Zy5pZDtkJiYoYS5wbGF5ZXI9ZCk7cmV0dXJuIGF9LEs6ZnVuY3Rpb24oKXt9LEthOmZ1bmN0aW9uKCl7fSwKTW46ZnVuY3Rpb24oYSl7dGhpcy5VPWF9LE5wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVX0sRW46ZnVuY3Rpb24oYSl7dGhpcy4kZT1hfSxMcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlfSxaZTpmdW5jdGlvbigpe30sUDpmdW5jdGlvbigpe3RoaXMuTWI8PXRoaXMuVGEmJih0aGlzLk1iKyssd2luZG93LnNldFRpbWVvdXQodGhpcy5LLmJpbmQodGhpcyksdGhpcy5RYykpfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt0cnl7aWYoZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKVsiY2F0Y2giXShmdW5jdGlvbigpe30pO2Vsc2UgaWYoZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4pZG9jdW1lbnQud2Via2l0RXhpdEZ1bGxzY3JlZW4oKTtlbHNlIGlmKGRvY3VtZW50Lm1vekNhbmNlbEZ1bGxTY3JlZW4pZG9jdW1lbnQubW96Q2FuY2VsRnVsbFNjcmVlbigpO2Vsc2UgaWYoZG9jdW1lbnQubXNFeGl0RnVsbHNjcmVlbilkb2N1bWVudC5tc0V4aXRGdWxsc2NyZWVuKCk7CmVsc2UgcmV0dXJuITF9Y2F0Y2goYSl7fX0sVGc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5HYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0saGE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sR2Q6ZnVuY3Rpb24oYSl7dGhpcy5pZD1hfSxncTpmdW5jdGlvbigpe30sVzpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWE7dGhpcy5YbCgpfHx0aGlzLnRrKCk7dGhpcy5HZCh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LE9wOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LHRrOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixlLlgoMTApKX0sWGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWRlb1RhZy5nZXRBdHRyaWJ1dGUoImlkIik/ITA6ITF9LFQ6ZnVuY3Rpb24oYSl7dGhpcy5jb250YWluZXI9CmF9LEdhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLmNvbnRhaW5lcj90aGlzLmNvbnRhaW5lcigpOnRoaXMuY29udGFpbmVyfSxnZXRSYXdQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LE1lOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiEwfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuY3VycmVudFRpbWU/YS5jdXJyZW50VGltZTowfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWc7cmV0dXJuIGEmJmEuZHVyYXRpb24/YS5kdXJhdGlvbjowfSx3YTpmdW5jdGlvbigpe3JldHVybiExfSxXcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmphfSxaOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMH0sUmM6ZnVuY3Rpb24oKXt2YXIgYT1sO3JldHVybiBhJiZhLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy52aWRlb1RhZztyZXR1cm4gYSYmYS5tdXRlZD9hLm11dGVkOiExfSxVZTpmdW5jdGlvbigpe3JldHVybiExfSxTaDpmdW5jdGlvbihhKXt0aGlzLkZiPWF9LEtwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRmJ9LE9oOmZ1bmN0aW9uKCl7dGhpcy5GYj1udWxsfSxRcDpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuRmImJihhPSEwKTtyZXR1cm4gYX0sYXE6ZnVuY3Rpb24oKXt0aGlzLkRnfHwodGhpcy5EZz0hMCl9LENlOmZ1bmN0aW9uKCl7cmV0dXJuITF9LEhwOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj10aGlzLnZpZGVvVGFnO2ImJmIuZ2V0QXR0cmlidXRlKCJpZCIpJiYoYT1iLmdldEF0dHJpYnV0ZSgiaWQiKSk7cmV0dXJuIGF9fSl9KShjKTt2YXIgcT1jLk1qfHxxOyhmdW5jdGlvbihjKXtjLnppPUsuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5HPXRoaXMucGxheWVyPSIiO3RoaXMuV2Y9IjEiO3RoaXMuWGY9IjIiO3RoaXMubWs9IjMiO3RoaXMuJGM9MDt0aGlzLkZtPQozMDt0aGlzLlhiPVtdO3RoaXMuaWI9W107dGhpcy5yYz17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5pZz10aGlzLm1pPSExO3RoaXMuc3RhdHVzPXRoaXMuJGM7dGhpcy5pZD1lLlgoMTApO3RoaXMudmYoYSk7dGhpcy5DbihiKX0sZjpmdW5jdGlvbigpe30sb2E6ZnVuY3Rpb24oKXt0aGlzLm1pfHwodGhpcy5taT0hMCxlLlhlKCkpfSxBaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuUigpO1EmJlEuamMmJiFsYSYmKGxhPSEwLGUudHJhY2soInBvc3NpYmxlRG91YmxlQWQiLCIxMDRfIithKSl9LGNtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSxiPW5ldyBIO3dpbmRvd1tiLmZhKCldfHwod2luZG93W2IuZmEoKV09e30pO3dpbmRvd1tiLmZhKCldW2EuaGEoKV18fCh3aW5kb3dbYi5mYSgpXVthLmhhKCldPXt9LHdpbmRvd1tiLmZhKCldW2EuaGEoKV0uaW5pdGlhdG9yPQplLmdjKCkpO3dpbmRvd1tiLmZhKCldW2EuaGEoKV1bZS5nYygpXT93aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV0rKzp3aW5kb3dbYi5mYSgpXVthLmhhKCldW2UuZ2MoKV09MX0sZ206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLGI9ITAsZz1uZXcgSDt3aW5kb3dbZy5mYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXSYmd2luZG93W2cuZmEoKV1bYS5oYSgpXS5pbml0aWF0b3IhPWUuZ2MoKSYmKHRoaXMud2YoKSxiPSExKTtyZXR1cm4gYn0sRDpmdW5jdGlvbihhLGIpe3ZhciBnPSEwO2EmJihnPSExKTtpZighdGhpcy56YSgpKXt0aGlzLmNtKCk7aWYoIXRoaXMuZ20oKSl7ZS50cmFjaygic3RhdHNfaGRfZG91YmxlTWFpbiIsIiIsITApO3RoaXMud2YoKTtyZXR1cm59dGhpcy53ZigpO3RoaXMuRyh0aGlzLmdldFBsYXllcigpLGcpO3RoaXMuZ2koKTt0aGlzLmlnPSEwO2ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiJiZiKCk7cmV0dXJuITB9cmV0dXJuITF9LG06ZnVuY3Rpb24oYSwKYil7dGhpcy56YSgpfHwodGhpcy5YYi5wdXNoKGEpLHRoaXMuaWIucHVzaCh7cmVhc29uOmEsZGV0YWlsOmJ9KSl9LGdpOmZ1bmN0aW9uKCl7dmFyIGE9InVua25vd24iLGI9W107dGhpcy5YYiYmMDx0aGlzLlhiLmxlbmd0aCYmKHRoaXMuWGI9ZS51bmlxdWUodGhpcy5YYiksZS50cmFjaygiYWN0aXZhdGVkQnkiLHRoaXMuWGIuam9pbigiLCIpKSk7aWYodGhpcy5pYil7Zm9yKHZhciBnPTA7Zzx0aGlzLmliLmxlbmd0aDtnKyspdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl09PXRoaXMucmNbYV0mJmIucHVzaCh0aGlzLmliW2ddLmRldGFpbCksdGhpcy5yY1t0aGlzLmliW2ddLnJlYXNvbl08dGhpcy5yY1thXSYmKGI9W10sYi5wdXNoKHRoaXMuaWJbZ10uZGV0YWlsKSxhPXRoaXMuaWJbZ10ucmVhc29uKTt0aGlzLnJjW2FdfHwoYT0idW5rbm93biIsYj1bXSk7MDxiLmxlbmd0aCYmKGc9ZS51bmlxdWUoYiksYT1hKyItIitnLmpvaW4oIi0iKSk7ZS50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIiwKYSwhMCxiKX19LFBwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWd9LHc6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLldmfSx3ZjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuWGZ9LEpuOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5ta30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjfSxhZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5XZn0seHA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuWGZ9LHphOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLiRjfSx2ZjpmdW5jdGlvbihhKXt0aGlzLnBsYXllcj1hfSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LENuOmZ1bmN0aW9uKGEpe3RoaXMuRz1hfSxHbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd9LEJtOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHY9Yy56aXx8djtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fQpjLkJqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWE9Yy5Canx8bWE7bmV3IG1hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuUGk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb0NvbnRhaW5lcjt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpLnZpZGVvO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkV4cFBsYXllciJ9fSl9KShjKTsKdmFyIG5hPWMuUGl8fG5hOyhmdW5jdGlvbihjKXtjLlFpPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGI9YS55cDtiP2IubmE/Yi5uYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihiKXt2YXIgYT0hMSxmPSIiO2IuZ2V0RXJyb3ImJihhPWIuZ2V0RXJyb3IoKSk7YXx8Yi5kZXRhaWwuZ2V0RXJyb3ImJihhPWIuZGV0YWlsLmdldEVycm9yKCkpO2EuZ2V0RXJyb3JDb2RlJiYoZis9YS5nZXRFcnJvckNvZGUoKSk7YS5nZXRNZXNzYWdlJiYoZis9YS5nZXRNZXNzYWdlKCkpO2YuaW5kZXhPZiYmKDA8PWYuaW5kZXhPZigiMTAwOSIpfHwwPD1mLmluZGV4T2YoIjMwMyIpfHwwPD1mLmluZGV4T2YoIjQwMyIpKT8odGhpcy53KCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIiksdGhpcy5nKCkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAoxMDApOmEuX2FkQ29uZmlnLmFkc0Rpc2FibGVkfHwodGhpcy5tKCJmcmFtZXdvcmsiKSx0aGlzLmcoKSl9LGc6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLkQoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBvYT1jLlFpfHxvYTsoZnVuY3Rpb24oYyl7Yy5SaT10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cucGxheWVyTWFuYWdlciYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycyYmd2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKXt2YXIgYT1uZXcgbmEod2luZG93LnBsYXllck1hbmFnZXIuZ2V0QWxsUGxheWVycygpWzBdKTt0aGlzLkwoYSl8fCh0aGlzLk4oYSksKG5ldyBvYShhLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgcGE9Yy5SaXx8cGE7KG5ldyBwYShyKSkuZigpOwpjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMudG89YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBxYT1jLnRvfHxxYTtuZXcgcWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5uaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3RoaXMuS2coKTt0aGlzLk1nKCk7dGhpcy5Zaz0hMX0sS2c6ZnVuY3Rpb24oKXt0aGlzLmtjPSExO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTthfHwodGhpcy5rYz0hMCk7aWYoIk9CSkVDVCI9PWEubm9kZU5hbWV8fCJWSURFTyI9PWEubm9kZU5hbWUpYT1hLnBhcmVudE5vZGU7dGhpcy5UKGEpfSxNZzpmdW5jdGlvbigpe2lmKCF0aGlzLmtjKXt2YXIgYT10aGlzLkdhKCksYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdOwpifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Ynx8KHRoaXMua2M9ITApO3RoaXMuVyhiKX19LEthOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYobC5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQpYS5fZXZlbnRzLmJlZm9yZUNvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLlUmJigwLHRoaXMuVSkoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYS5fZXZlbnRzJiZhLl9ldmVudHMudGltZSYmYS5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tYi5wb3NpdGlvbiYmdGhpcy5VJiYoMCx0aGlzLlUpKCl9LmJpbmQodGhpcyl9KSxhLm9uVGltZSlhLm9uVGltZShmdW5jdGlvbihiKXtiLmR1cmF0aW9uJiZiLnBvc2l0aW9uJiYxPmIuZHVyYXRpb24tCmIucG9zaXRpb24mJnRoaXMuVSYmKDAsdGhpcy5VKSgpfS5iaW5kKHRoaXMpKX0sWmU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLl9ldmVudHMmJmEuX2V2ZW50cy5hZEVycm9yJiZhLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmEsY2FsbGJhY2s6ZnVuY3Rpb24oYil7dGhpcy5JZChiKX0uYmluZCh0aGlzKX0pO2lmKGEub25BZEVycm9yKWEub25BZEVycm9yKGZ1bmN0aW9uKGIpe3RoaXMuSWQoYil9LmJpbmQodGhpcykpfSxJZDpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnBsYXllcjtiLmdldFBvc2l0aW9uKCk7Yi5nZXRQb3NpdGlvbigpO2IuZ2V0RHVyYXRpb24oKTtiLmdldFBvc2l0aW9uKCk7Yi5nZXREdXJhdGlvbigpO2IuZ2V0UG9zaXRpb24oKTsibWlkIj09YS5hZHBvc2l0aW9uJiZiLmdldFBvc2l0aW9uJiYzMDxiLmdldFBvc2l0aW9uKCkmJjMwPGIuZ2V0RHVyYXRpb24oKS1iLmdldFBvc2l0aW9uKCkmJnRoaXMuJGUmJigwLHRoaXMuJGUpKCl9LApwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5wbGF5ZXI7aWYoIWEuZ2V0U3RhdGV8fCJwbGF5aW5nIiE9YS5nZXRTdGF0ZSgpfHx0aGlzLnZpZGVvVGFnLnBhdXNlZClyZXR1cm4gdGhpcy5wbGF5ZXIucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxheWVyO3JldHVybiBhLmdldFN0YXRlJiYicGF1c2VkIj09YS5nZXRTdGF0ZSgpPyJwYXVzZWQiOnRoaXMucGxheWVyLnBhdXNlKCEwKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4icGF1c2VkIj09dGhpcy5wYXVzZSgpPyExOiEwfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIkpXUGxheWVyIn0sZXhpdEZ1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnBsYXllcjthLmdldEZ1bGxzY3JlZW4mJmEuZ2V0RnVsbHNjcmVlbigpJiZhLnNldEZ1bGxzY3JlZW4oKX0sc2E6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPXRoaXMucGxheWVyO2IuZ2V0TXV0ZSYmYi5nZXRNdXRlKCkmJihhPSEwKTtyZXR1cm4gYX0sQ2U6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5wbGF5ZXIsYj0hMTthLmdldFZvbHVtZSYmYS5nZXRWb2x1bWUoKSYmKGI9YS5nZXRWb2x1bWUoKSk7cmV0dXJuIGJ9fSl9KShjKTt2YXIgcmE9Yy5uanx8cmE7KGZ1bmN0aW9uKGMpe2MubWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sSzpmdW5jdGlvbigpe30sa2E6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLiRjO3RoaXMuaXNQbGF5aW5nPXRoaXMuaGU9ITE7dGhpcy5rZT0xO3RoaXMuYWQ9W107dGhpcy55Yj0hMX0sZjpmdW5jdGlvbigpe3RoaXMuaXNQbGF5aW5nPXRoaXMuaGU9ITE7dGhpcy5rZT0xO3RoaXMuYWQ9W107dGhpcy55Yj0hMTt0aGlzLmdldFBsYXllcigpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj17fTtpZihhLmdldENvbmZpZylpZihiPWEuZ2V0Q29uZmlnKCksYi5hZHZlcnRpc2luZyl7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSlpZihiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcyliLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJgpiLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoJiYodGhpcy5rZT1iLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcubGVuZ3RoLHRoaXMueWI9ITApO2Vsc2V7aWYoYi5hZHZlcnRpc2luZy5zY2hlZHVsZSBpbnN0YW5jZW9mIEFycmF5KWZvcih2YXIgZz0wO2c8Yi5hZHZlcnRpc2luZy5zY2hlZHVsZS5sZW5ndGg7ZysrKWlmKGIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGVbZ10udGFnKXt0aGlzLnliPSEwO2JyZWFrfWIuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMueWI9ITApO2IuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmYi5hZHZlcnRpc2luZy5zY2hlZHVsZS5hZGJyZWFrcHJlLnRhZyYmKHRoaXMueWI9ITApfWIuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy55Yj0hMCl9ZWxzZSB0aGlzLncoIm5vIGFkdmVydGlzaW5nIGNvbmZpZ3VyZWQgZm9yIHBsYXllciIpO2Zvcih2YXIgZD0KImFkUGxheSBhZENvbXBsZXRlIGFkQ2xpY2sgYWRJbXByZXNzaW9uIGFkTWV0YSBhZFNraXBwZWQgYWRUaW1lIi5zcGxpdCgiICIpLGc9MDtnPGQubGVuZ3RoO2crKylhLm9uKGRbZ10sZnVuY3Rpb24oYil7dGhpcy53KGIudHlwZSk7ImFkQ29tcGxldGUiPT09ZFtnXSYmKHRoaXMuaGU9ITApOyJhZEltcHJlc3Npb24iPT09ZFtnXSYmdGhpcy5BaCgpfS5iaW5kKHRoaXMpKTthLm9uKCJhZEVycm9yIixmdW5jdGlvbihiKXt0aGlzLm9uQWRFcnJvcihiKX0uYmluZCh0aGlzKSk7YS5vbigidGltZSIsZnVuY3Rpb24oYil7dGhpcy5pc1BsYXlpbmc9ITA7Yi5kdXJhdGlvbj50aGlzLkZtJiYhdGhpcy56YSgpJiYodGhpcy55Yj8odGhpcy5tKCJjb250ZW50cGxheU5vQWRzIiwiIiksdGhpcy5nKCkpOih0aGlzLm0oImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoZXZlbnQuZHVyYXRpb24vMUUzKSksdGhpcy5nKCEwKSkpfS5iaW5kKHRoaXMpKTthLm9uKCJwbGF5bGlzdGl0ZW0iLApmdW5jdGlvbigpe2lmKHRoaXMuemEoKSYmKHRoaXMua2EoKSx0aGlzLmdldFBsYXllcigpLllrPSEwLGwuc2tpcEFkT25Db250ZXh0Q2hhbmdlKSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5GYjtiJiYoYi5CZCgpLGIud2UoKSl9fS5iaW5kKHRoaXMpKX0sb25BZEVycm9yOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFnOy0xPT10aGlzLmFkLmluZGV4T2YoYikmJnRoaXMuYWQucHVzaChiKTsiMTAxIj09YS5jb2RlfHwiMTAwMSI9PWEuY29kZT8odGhpcy53KCksdGhpcy5vYSgpKTo5MDA9PWEuY29kZSYmMDxhLm1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJlbXB0eSIpP3RoaXMudygiZW1wdHkiKTozMDM9PWEuY29kZSYmMDxhLm1lc3NhZ2UuaW5kZXhPZigiTm8gQWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMiKT90aGlzLncoImVtcHR5Iik6KHRoaXMubSgiYWRlcnJvciIsYS5jb2RlKSx0aGlzLmFkLmxlbmd0aD49dGhpcy5rZSYmdGhpcy5nKCkpfSwKQm06ZnVuY3Rpb24oYSl7dGhpcy5qKCJKVzogIithLnR5cGUpfSxnOmZ1bmN0aW9uKGEpe2E/dGhpcy5BZT90aGlzLkFlKys6dGhpcy5BZT0xOnRoaXMuemU/dGhpcy56ZSsrOnRoaXMuemU9MTt2YXIgYj10aGlzLmdldFBsYXllcigpO2UuRGYoYi52aWRlb1RhZyk/Yi5rYz90aGlzLncoInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmhlfHx0aGlzLmlzUGxheWluZz8odGhpcy56ZT50aGlzLkFlJiYoYT0hMSksdGhpcy5EKGEpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSw1MCk6KGIuS2coKSxiLk1nKCksYi5rY3x8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMjApKX19KX0pKGMpO3ZhciBzYT1jLm1qfHxzYTsoZnVuY3Rpb24oYyl7Yy5vaj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT0KdGhpcy5DbCgpfHwhYS5hdXRob3JpdHl8fCFhLmF1dGhvcml0eXx8Ind3dy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJxczIucHJldmlldy5zcGllZ2VsLmRlIiE9YS5hdXRob3JpdHkmJiJwcmV2aWV3LnNwaWVnZWwuZGUiIT1hLmF1dGhvcml0eSYmInByb2Quc3BpZWdlbC5kZSIhPWEuYXV0aG9yaXR5KXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKCF3aW5kb3cuandwbGF5ZXJ8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKXx8IkEiIT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChqd3BsYXllcigpLmlkKS5ub2RlTmFtZSlpZih3aW5kb3cuandwbGF5ZXImJmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGp3cGxheWVyKCkuaWQpfHxnJiZnKCkuaWQpe2E9W107aWYoMTxiLmxlbmd0aClmb3IoZz0wO2c8Yi5sZW5ndGg7ZysrKWEucHVzaChiW2ddLmdldEF0dHJpYnV0ZSgiaWQiKSk7ZWxzZSBhLnB1c2goandwbGF5ZXIoKS5pZCk7CmZvcihiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyByYSh3aW5kb3cuandwbGF5ZXIoYVtiXSkpO3RoaXMuTChnKXx8dGhpcy5qbShnKXx8KHRoaXMuTihnKSxnPW5ldyBzYShnLHRoaXMuRyksZy5LKCksZy5mKCkpfX10aGlzLlAoKX19LEpwOmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LENsOmZ1bmN0aW9uKCl7dmFyIGE9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZS56YihhLmFuY2hvcil9fSl9KShjKTt2YXIgdGE9Yy5vanx8dGEsdWE9bmV3IHRhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5ibz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHZhPWMuYm98fHZhO25ldyB2YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmNrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCks6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO2lmKGEpe3ZhciBiPWEuZWxfO2J8fChiPWEuZWwoKSk7Yj8odGhpcy5UKGIpLChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYT90aGlzLlcoYSk6dGhpcy5aKCkpOnRoaXMuWigpfWVsc2UgdGhpcy5aKCl9LFI6ZnVuY3Rpb24oKXtyZXR1cm4idmlkZW9qcyJ9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oYSl7dGhpcy5QZChhKX0uYmluZCh0aGlzKSl9LFBkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxiPWEuY3VycmVudFRpbWUoKSxhPWEuZHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0yJiZ0aGlzLlUmJnRoaXMuVSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTsKaWYoYSl0cnl7dmFyIGI9SlNPTi5wYXJzZShhKTtpZihiLmhhc093blByb3BlcnR5KCJ4LWF1dG9wbGF5IikmJiFiWyJ4LWF1dG9wbGF5Il0pcmV0dXJuITF9Y2F0Y2goZyl7fWE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYS5hdXRvcGxheSYmImZ1bmN0aW9uIj09dHlwZW9mIGEuYXV0b3BsYXk/YS5hdXRvcGxheSgpOiExfSxzYTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5tdXRlZCYmdGhpcy5wbGF5ZXIubXV0ZWQoKX0sd2E6ZnVuY3Rpb24oKXt0aGlzLnBhdXNlKCk7cmV0dXJuITB9LGlzUGxheWluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlZCgpPyExOiEwfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1hLmlzRnVsbHNjcmVlbjtpZigiZnVuY3Rpb24iPT10eXBlb2YgYil0cnl7Yj1iKCl9Y2F0Y2goZyl7Yj0hMX1iJiZhLmV4aXRGdWxsc2NyZWVuKCl9LGN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5jdXJyZW50VGltZSlyZXR1cm4gYS5jdXJyZW50VGltZSgpfX0pfSkoYyk7dmFyIHdhPWMuY2t8fHdhOyhmdW5jdGlvbihjKXtjLmJrPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLk89dGhpcy5PfHwhMTt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMudWE9dGhpcy5LYz10aGlzLkJhPXRoaXMuZWQ9ITE7dGhpcy5KaD1lLkxiKDEwKTt0aGlzLklmPSEwO3RoaXMueGM9dGhpcy5raD0hMTt0aGlzLkttKGEuZ2V0UmF3UGxheWVyKCkpfHwodGhpcy56aCgpLHRoaXMuS2soKSx0aGlzLnNiKCkpfSxLbTpmdW5jdGlvbihhKXtyZXR1cm4gZS5GKCJ0LW9ubGluZS5kZSIpPyExPT09YS5vcHRpb25zXy5hZFByZXJvbGw6ITF9LGJxOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5oYSgpLCI7Iiwid2luZG93LmltYToiLAoiOyIsd2luZG93LmltYSwiOyIsdHlwZW9mIHdpbmRvdy5pbWEsIjsiLCJwbGF5ZXIuYWRzOiIsIjsiLGEuViwiOyIsdHlwZW9mIGEuViwiOyIsInBsYXllci5hZHMuc3RhdGU6IiwiOyIsYS5WP2EuVi5zdGF0ZToidW5kZWZpbmVkWCIsIjsiLGEuVj90eXBlb2YgYS5WLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYS5pbWEsIjsiLHR5cGVvZiBhLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGEuSCwiOyIsdHlwZW9mIGEuSCwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLmltYT9hLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixhLkg/YS5ILmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixhLkg/dHlwZW9mIGEuSC5hZGRFdmVudExpc3RlbmVyOgoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmdldEFkc01hbmFnZXI6IiwiOyIsYS5pbWE/YS5pbWEuRWE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuRWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILkVhOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguRWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYS5pbWEmJmEuaW1hLkVhP2EuaW1hLkVhKCk6InVuZGVmaW5lZFgiLCI7IixhLmltYSYmYS5pbWEuRWE/dHlwZW9mIGEuaW1hLkVhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGEuSCYmYS5ILkVhP2EuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsYS5IJiZhLkguRWE/dHlwZW9mIGEuSC5FYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixhLmltYT9hLmltYS5mZToKInVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEuZmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuX2Fkc0xvYWRlcjoiLCI7IixhLkg/YS5ILmZlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguZmU6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixhLmltYT9hLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLGEuaW1hP3R5cGVvZiBhLmltYS5nZToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixhLkg/YS5ILmdlOiJ1bmRlZmluZWRYIiwiOyIsYS5IP3R5cGVvZiBhLkguZ2U6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYS5pbWE/YS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IixhLmltYT90eXBlb2YgYS5pbWEubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGEuSD9hLkgubmE6InVuZGVmaW5lZFgiLCI7IixhLkg/CnR5cGVvZiBhLkgubmE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNNYW5hZ2VyOiIsIjsiLGEuaW1hP2EuaW1hLnFlOiJ1bmRlZmluZWRYIiwiOyIsYS5pbWE/dHlwZW9mIGEuaW1hLnFlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYS5IP2EuSC5xZToidW5kZWZpbmVkWCIsIjsiLGEuSD90eXBlb2YgYS5ILnFlOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuSmgpfSxIYzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5pbWEzJiYodGhpcy5pbWE9YS5pbWEzKTtpZihhLmltYSl7dGhpcy5pbWE9YS5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmCih0aGlzLmltYT10aGlzLmltYS5jb250cm9sbGVyKSl9Y2F0Y2goYil7fX1yZXR1cm4gdGhpcy5pbWF9LEljOmZ1bmN0aW9uKCl7aWYoIXRoaXMubmEpe3ZhciBhPXRoaXMuSGMoKTthJiYoYS5hZHNMb2FkZXImJih0aGlzLm5hPWEuYWRzTG9hZGVyKSxhLl9hZHNMb2FkZXImJih0aGlzLm5hPWEuX2Fkc0xvYWRlciksYS5nZXRBZHNMb2FkZXImJih0aGlzLm5hPWEuZ2V0QWRzTG9hZGVyKSxhLmNvbnRyb2xsZXImJmEuY29udHJvbGxlci5zZGtJbXBsJiZhLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm5hPWEuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm5hfSxZZzpmdW5jdGlvbigpe2lmKCF0aGlzLktjKXt2YXIgYT10aGlzLkhjKCk7YSYmKGEuYWRzTWFuYWdlciYmKHRoaXMuS2M9YS5hZHNNYW5hZ2VyKSxhLmdldEFkc01hbmFnZXImJih0aGlzLktjPWEuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuS2N9LGhtOmZ1bmN0aW9uKCl7aWYoIXRoaXMuamgpe3ZhciBhPQp0aGlzLkhjKCksYj10aGlzLmZtKCk7d2luZG93LmltYSYmYSYmKGEuX2Fkc0xvYWRlcnx8YS5hZHNMb2FkZXJ8fGIpJiYodGhpcy5qaD0hMCl9cmV0dXJuIHRoaXMuamh9LGZtOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5lZCYmYS5hZHMmJihhLmFkcy5zdGF0ZXx8YS5hZHMuX3N0YXRlKSYmKHRoaXMuZWQ9ITApO3JldHVybiB0aGlzLmVkfSxzYjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWMoKTtpZihhKXt2YXIgYj0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJgpnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCYmKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGIpe3RoaXMuY2EoYiwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihnLGZ1bmN0aW9uKCl7dGhpcy5rbigpfS5iaW5kKHRoaXMpKSwKYS5hZGRFdmVudExpc3RlbmVyKGQsZnVuY3Rpb24oYil7dGhpcy5jYShiLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5iYSghMCl9LmJpbmQodGhpcykpKX1lbHNlIHRoaXMuemEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNiKCl9LmJpbmQodGhpcyksMjApfSxrbjpmdW5jdGlvbigpe3RoaXMueGM9ITA7dmFyIGE9dGhpcy5ZZygpO2lmKGF8fHRoaXMuemEoKSl7dmFyIGI9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihiPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmCihnPWdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyk7YS5hZGRFdmVudExpc3RlbmVyKGIsZnVuY3Rpb24oYil7dGhpcy5jYShiKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oYil7dGhpcy5jYShiLCEwKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyk7dGhpcy5iYSghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2UuU2EoKSYmKGQ9Ik1fIik7YS5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInN0YXJ0IiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiZmlzdHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDsKaWYoZS5GKCJjaGlwLmRlIikpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7ZS50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCk7ZS50cmFjaygic3RhdHNfY3VzdF9kb3VibGVwbGF5IiwhYi5wYXVzZWQoKSwhMCl9fS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoInRoaXJkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy55Yz0hMDtlLkYoImNoaXAuZGUiKSYmZS50cmFjaygic3RhdHNfY3VzdF8iK2QrInRoaXJkcXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJjb21wbGV0ZSIsZnVuY3Rpb24oKXt0aGlzLnljPSEwO2UuRigiY2hpcC5kZSIpJiZlLnRyYWNrKCJzdGF0c19jdXN0XyIrZCsiY29tcGxldGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJpbXByZXNzaW9uIixmdW5jdGlvbigpe3RoaXMueWM9ITA7ZS5GKCJjaGlwLmRlIikmJmUudHJhY2soInN0YXRzX2N1c3RfIisKZCsiaW1wcmVzc2lvbiIsIiIsITApfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFsbEFkc0NvbXBsZXRlZCIsZnVuY3Rpb24oKXt0aGlzLnljfHwodGhpcy5tKCJhZGVycm9yIiwibm9hZGV2ZW50IiksdGhpcy5iYSgpLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCl9LElwOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5BZyYmYS5hZHMmJih0aGlzLkFnPWEuYWRzKTtyZXR1cm4gdGhpcy5BZ30sS2s6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2Eub24oImFkc2Vycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkdHJpZ2dlciIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5iYSghMCk7CnRoaXMubSgidHJpZ2dlciIsIkhPTUFEIil9LmJpbmQodGhpcykpO2Eub24oImltYTNlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzYWRlcnJvciIsZnVuY3Rpb24oYil7dGhpcy5jYShiKTt0aGlzLmJhKCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pfS5iaW5kKHRoaXMpKTthLm9uKCJpbWEzLWFkLWVycm9yIixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMuYmEoKTt0aGlzLm0oImFkZXJyb3IiLHRoaXMuTyl9LmJpbmQodGhpcykpO2Eub24oImFkcy1maXJzdC1xdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKTt0aGlzLkFoKCl9LmJpbmQodGhpcykpfSxvZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtpZihob21hZFV0aWxzJiZob21hZFV0aWxzLlMpaG9tYWRVdGlscy5IYSYmKGE9ITApO2Vsc2V7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcyksCjUwKTtyZXR1cm59fWNhdGNoKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vZCgpfS5iaW5kKHRoaXMpLDUwKTtyZXR1cm59YSYmKChhPXRoaXMuWWcoKSkmJmEuZGVzdHJveT9hLmRlc3Ryb3koKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMub2QoKX0uYmluZCh0aGlzKSw1MCkpfSx6aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7aWYoYS5pc1BsYXlpbmcoKSYmMDxhLmN1cnJlbnRUaW1lKCkpaWYodGhpcy5obSgpKXt2YXIgYj10aGlzLkhjKCksZz10aGlzLkljKCk7YiYmZyYmKHRoaXMueGN8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54Yz90aGlzLncoKToodGhpcy5iYSghMCksdGhpcy5tKCJub0Fkc01hbmFnZXIiLCJhZHNNYW5hZ2VyIikpfS5iaW5kKHRoaXMpLDJFMykpfWVsc2UgdGhpcy5raD93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBiPXRoaXMuSGMoKSxhPXRoaXMuSWMoKTtiJiYhYT8KKHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUFfQURTTE9BREVSIiksdGhpcy5iYSgpKToodGhpcy5iYSghMCksdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpKX0uYmluZCh0aGlzKSwxMDApOnRoaXMua2g9ITA7YS5pc1BsYXlpbmcoKSYmMTA8YS5jdXJyZW50VGltZSgpfHx0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy56aCgpfS5iaW5kKHRoaXMpLDUwKX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPSEwKTsibnVtYmVyIj09dHlwZW9mIGImJihhLk89YixhLm0oImFkZXJyb3IiLGIpKX1yZXR1cm4gZ31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09CnR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYihnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sTGs6ZnVuY3Rpb24oKXt0aGlzLkNjfHwodGhpcy5DYz0idW5rbm93biIpO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5hZHMpe2lmKHRoaXMuQ2MhPWEuYWRzLnN0YXRlJiYodGhpcy5DYz1hLmFkcy5zdGF0ZSksImFkLXBsYXliYWNrIj09dGhpcy5DYyl7dGhpcy53KCJhZC1wbGF5YmFjayIpOwpyZXR1cm59fWVsc2UgdGhpcy5DYz0ibm8tYWRzIjt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTGsoKX0uYmluZCh0aGlzKSwxMCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIGUueGU/ITE6dGhpcy51YX0sQ2E6ZnVuY3Rpb24oKXtpZih0aGlzLllsKCkpe3RoaXMudWE9ITA7aWYoZS5GKCJnaWdhLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigiZGVzaXJlZC5kZSIpKXRoaXMuSWY9ITEsZS50cmFjaygic3RhdHNfaGRfY29va2llbW9kZSIsInNldCIsITApO3RoaXMuZyghMCl9ZWxzZSB0aGlzLnVhPSEwLHRoaXMudygiZW1wdHkgdmFzdCIpfSxZbDpmdW5jdGlvbigpe2lmKDA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24pLmluZGV4T2YoInN0ZXJuLmRlIikmJjEwMDk9PXRoaXMuTylyZXR1cm4hMDtpZihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpe3ZhciBhPQohMTtlLnlkKCJodHRwczovL2Fkc2VydmVyLnNjaG5lZXZvbm1vcmdlbi5jb20vYWRzZXJ2ZS92MS9jYyIsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO2E9IWUuZmIoYi5jYyl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXthPSExfSwhMCwhMCk7dmFyIGI9ZS55bCgpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIGUueGU9LTEhPWIuaW5kZXhPZigiZmlyZWZveCIpfHwtMSE9Yi5pbmRleE9mKCJzYWZhcmkiKXx8YX1yZXR1cm4hMX0sYmE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCk/KHRoaXMudygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dGhpcy56YSgpfHwoYXx8KHRoaXMuSWY9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5EKHRoaXMuSWYsZnVuY3Rpb24oKXt0aGlzLm9kKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApUazpmdW5jdGlvbigpe3RoaXMuUnB8fCgxMDx0aGlzLkxvPyh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKSk6KHRoaXMuTG8rKyx0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLnZwRXZlbnQ/dGhpcy5zbigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5UaygpfS5iaW5kKHRoaXMpLDUwKSkpfSxzbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS52cEV2ZW50JiYhdGhpcy5Nbyl7dGhpcy5Nbz0hMDt2YXIgYj0iIjthLnZwRXZlbnQucmFuZG9tVGVzdCYmKGI9IiIpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZHMtZXJyb3IiK2IsZnVuY3Rpb24oKXt0aGlzLm0oImFkZXJyb3IiLCJ2cDphZHMtZXJyb3IiKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmJhLmJpbmQodGhpcyksNTAwKX0uYmluZCh0aGlzKSk7CmEudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrYixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInZwOmFkLWVycm9yIik7d2luZG93LnNldFRpbWVvdXQodGhpcy5iYS5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2EudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2IsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IitiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciB4YT1jLmJrfHx4YTsoZnVuY3Rpb24oYyl7Yy5kaz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApmOmZ1bmN0aW9uKCl7aWYoIXdpbmRvdy5kZW1vUGxheWVyKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYjtiPXRoaXMuWGgod2luZG93KTtmb3IodmFyIGc9MDtnPGEubGVuZ3RoO2crKyl0cnl7Yj1ifHx0aGlzLlhoKGFbZ10pfWNhdGNoKGQpe310aGlzLlAoKX19LFhoOmZ1bmN0aW9uKGEpe3ZhciBiPVtdO2EudmlkZW9qcyYmYS52aWRlb2pzLmdldFBsYXllcnM/Yj1hLnZpZGVvanMuZ2V0UGxheWVycygpOmEudmlkZW9qcyYmYS52aWRlb2pzLnBsYXllcnMmJihiPWEudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGUuRmUoYikpe2E9Yjtmb3IodmFyIGcgaW4gYSlhLmhhc093blByb3BlcnR5KGcpJiYoYj1uZXcgd2EoYVtnXSksYi5qYXx8dGhpcy5MKGIpfHwhMT09PWIuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLk4oYiksKG5ldyB4YShiLHRoaXMuRykpLmYoKSkpO3JldHVybiEwfXJldHVybiExfSxQOmZ1bmN0aW9uKCl7dGhpcy5TYj0Kd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksdGhpcy5RYyl9fSl9KShjKTt2YXIgeWE9Yy5ka3x8eWEsemE9bmV3IHlhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5Baj1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEFhPWMuQWp8fEFhO25ldyBBYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLkhqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3RoaXMuZ2Y9MDt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9YS5wbGF5ZXJDb250YWluZXI7aWYoIWImJihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmlkJiYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhLnBsYXllckluc3RhbmNlLmlkKSkmJihiPWEucGFyZW50Tm9kZSksIWIpKXt0aGlzLlooKTsKcmV0dXJufXRoaXMuVChiKTsoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2E/dGhpcy5XKGEpOnRoaXMuWigpfSxWbTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLkZiLGc9dGhpcy5oYSgpLGQ9IiI7YS5tZW1vJiYoZD1hLm1lbW8udmlkZW9pZCk7ZCYmYiYmYi5qYyYmKDA8PWcuaW5kZXhPZihkKXx8Yi5CZCgpKX0scGF1c2U6ZnVuY3Rpb24oYSl7YXx8KHRoaXMuZ2Y9MCk7YT10aGlzLmdldFJhd1BsYXllcigpO2EucGxheWVySW5zdGFuY2UmJmEucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxhLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSwKd2E6ZnVuY3Rpb24oKXt0aGlzLmdmKys7aWYoMTA8dGhpcy5nZilyZXR1cm4hMTt0aGlzLnBhdXNlKCJwYXVzZVJlcGVhdE9uQWREZWxpdmVyeSIpO3JldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGEucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4hMT09PWEucGxheWVySW5zdGFuY2UucGF1c2VkPyEwOiEwPT09YS5wbGF5ZXJJbnN0YW5jZS5wYXVzZWQ/ITE6YS5pc1BsYXlpbmd9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS5wbGF5ZXJJbnN0YW5jZSYmYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYS5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihhLnBsYXllckluc3RhbmNlJiZhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uKXJldHVybiBhLnBsYXllckluc3RhbmNlLmR1cmF0aW9uO2lmKHdpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5nZXREdXJhdGlvbilyZXR1cm4gd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24oKX0sUjpmdW5jdGlvbigpe3JldHVybiJPdlZpZGVvIn0sS2E6ZnVuY3Rpb24oKXt9LFBkOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpPgphJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiZ0aGlzLlUmJnRoaXMuVSgpfX0pfSkoYyk7dmFyIEJhPWMuSGp8fEJhOyhmdW5jdGlvbihjKXtjLkdqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQmUpaWYodGhpcy5IYnx8KHRoaXMuSGI9MCksdGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKSYmdGhpcy5IYisrLDE1PHRoaXMuSGIpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZyghMCk7ZWxzZXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWR2ZXJ0aXNpbmcpaWYoYT1hLmFkdmVydGlzaW5nLmFkc0xvYWRlcil7dGhpcy5CZT0hMDt2YXIgYj0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYj1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihiKXt0aGlzLmNhKGIpO3RoaXMucWIoKXx8KHRoaXMubSgiYWRlcnJvciIsdGhpcy5PKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkJhKCl9LmJpbmQodGhpcyksMTApfX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGEpe3ZhciBnPSExO2lmKGIpe2lmKDEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iKWc9ITA7Z3x8IWIuaW5kZXhPZnx8LTE9PT1iLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1iLmluZGV4T2YoIjMwMyIpJiYtMT09PWIuaW5kZXhPZigiNDAzIil8fChnPQohMCk7Im51bWJlciI9PXR5cGVvZiBiJiYoYS5PPWIsYS5tKCJhZGVycm9yIixiKSl9cmV0dXJuIGd9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgZz1hLmdldEVycm9yKCk7aWYoZy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBnLmdldEVycm9yQ29kZSYmYihnLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5CYSgpOwp2YXIgYj13aW5kb3cub3ZWaWRlbztifHwoYj13aW5kb3cub3YudmlkZW8uUGxheWVyKTtiJiZiLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLm9sPyhiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5Pbl9QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5QTEFZRVJfREVTVFJPWUVELGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpKSxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfQURFUlJPUixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsdGhpcy5PKTt0aGlzLmcoKX0uYmluZCh0aGlzKSksdGhpcy5vbD0hMCxiLnJlZ2lzdGVyRXZlbnQoYi5PTl9QTEFZRVJfU1RPUFBFRCxmdW5jdGlvbihiKXthLlZtKGIpfS5iaW5kKHRoaXMpKSk6YS5pc1BsYXlpbmcoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmYoKX0uYmluZCh0aGlzKSwKMTAwKX0sZzpmdW5jdGlvbihhKXt0aGlzLkQoYSl9fSl9KShjKTt2YXIgQ2E9Yy5Hanx8Q2E7KGZ1bmN0aW9uKGMpe2MuSWo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5UYT0xNTAwO3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPVtdO3dpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXImJndpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyJiYwPHdpbmRvdy5vdlZpZGVvLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmKGE9d2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO3dpbmRvdy5vdiYmd2luZG93Lm92LnZpZGVvJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyJiZ3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplciYmd2luZG93Lm92LnZpZGVvLlBsYXllci5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3YudmlkZW8uUGxheWVyLnN5bmNocm9uaXplci5yZWdpc3RlcmVkUGxheWVyLmxlbmd0aCYmCihhPXdpbmRvdy5vdi52aWRlby5QbGF5ZXIuc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXIpO2lmKDA8YS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspe3ZhciBnPW5ldyBCYShhW2JdKTtnLmphfHx0aGlzLkwoZyl8fCh0aGlzLk4oZyksKG5ldyBDYShnLHRoaXMuRykpLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgRGE9Yy5Janx8RGEsRWE9bmV3IERhKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5UbD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEZhPWMuVGx8fEZhO25ldyBGYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmpqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj1lLlVnKGEsImVsZW1lbnRJRCIpOwpzd2l0Y2goYS5lbGVtZW50UGF0aCl7Y2FzZSAidXAiOmIucGFyZW50Tm9kZSYmKGI9Yi5wYXJlbnROb2RlKX10aGlzLlhtPWEucG9zaXRpb25pbmc7dmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1hLndpZHRoO2cuc3R5bGUubWluV2lkdGg9YS53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWEud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9YS5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjtzd2l0Y2godGhpcy5YbSl7Y2FzZSAiYmVmb3JlIjpiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYik7YnJlYWs7Y2FzZSAiYWZ0ZXIiOmIucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZyxiLm5leHRTaWJsaW5nKTticmVhaztjYXNlICJpbnNpZGUiOmIuYXBwZW5kQ2hpbGQoZyk7YnJlYWs7ZGVmYXVsdDpiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGcsCmIpfXRoaXMuVChnKTt0aGlzLlcoZyk7dGhpcy5yZD1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMucmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnJkKX0sc2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sU2s6ZnVuY3Rpb24oKXtlLnBoKHRoaXMucmQpO2UuT2UodGhpcy5yZCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNrKCl9LmJpbmQodGhpcyksNTApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuImlucmVhZCJ9LFVlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSl9KShjKTt2YXIgR2E9Yy5qanx8R2E7KGZ1bmN0aW9uKGMpe2MuaWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMubSgiZXh0ZXJuYWwiKTt0aGlzLkQoITApfX0pfSkoYyk7dmFyIEhhPWMuaWp8fEhhOyhmdW5jdGlvbihjKXtjLmtqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuVGE9MTUwMDt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZihsJiYKbC5pbnJlYWQpe3ZhciBhPWwuaW5yZWFkLGI9ZS5VZyhhLCJlbGVtZW50SUQiKTtpZihlLnBoKGIpJiYoYT1uZXcgR2EoYSksIXRoaXMuTChhKSkpe3RoaXMuTihhKTsobmV3IEhhKGEsdGhpcy5HKSkuZigpO3JldHVybn10aGlzLlNiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZi5iaW5kKHRoaXMpLDEwMCl9ZWxzZSB0aGlzLlNiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5mKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBJYT1jLmtqfHxJYSxKYT1uZXcgSWEocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLndqPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgS2E9Yy53anx8S2E7bmV3IEthKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYShiKXt0aGlzLnVybD1iO3RoaXMubWV0aG9kPQoiR0VUIjt0aGlzLmRhdGE9e319Yy5laj1hO2EucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGIpe3RoaXMuZGF0YT1ifSxEbjpmdW5jdGlvbihiKXt0aGlzLm1ldGhvZD1ifSxhcHBlbmREYXRhOmZ1bmN0aW9uKGIsYSl7dGhpcy5kYXRhW2JdPWF9LHVrOmZ1bmN0aW9uKGIpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYikpfWNhdGNoKGEpe319fX0pKGMpO3ZhciBBPWMuZWp8fEE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYixnLGQsZil7dGhpcy5YYT1iO3RoaXMuUGc9dGhpcy51aT0hMTt0aGlzLkJoPWQ7dGhpcy5ZaD0hMTsic3RyaW5nIj09PXR5cGVvZiBiJiYodGhpcy5YYT1uZXcgQShiKSk7dmFyIGM9dGhpcy5oYj1uZXcgWE1MSHR0cFJlcXVlc3Q7Yy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Yy5yZWFkeVN0YXRlfHwyMDAhPWMuc3RhdHVzJiYyMDEhPWMuc3RhdHVzfHxnKGMpO2lmKGQmJjQ9PWMucmVhZHlTdGF0ZSYmCjIwMCE9Yy5zdGF0dXMmJjIwMSE9Yy5zdGF0dXMpZChjKTtlbHNlIGlmKDQ9PWMucmVhZHlTdGF0ZSYmMD09Yy5zdGF0dXMmJm0mJm0uUmUodGhpcy5YYS51cmwpJiZtLlZjKXt2YXIgZT1uZXcgQShiLnVybCk7ZS5EbigiUE9TVCIpO2Uuc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGEoZSxmdW5jdGlvbihiKXt2YXIgYT0hMTt0cnl7YT1KU09OLnBhcnNlKGIucmVzcG9uc2VUZXh0KX1jYXRjaChnKXthPSExfWEmJmEucGluZyYmInBvbmciPT1hLnBpbmcmJihhPSEwKTthfHxtLmRhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5kYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9ZiYmNCE9Yy5yZWFkeVN0YXRlJiZmKGMpfS5iaW5kKHRoaXMpfWMuZmo9YTthLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuWGEuZGF0YTtpZigic3RyaW5nIiE9dHlwZW9mIGIpe3ZhciBhPWIsYj0iIixkO2ZvcihkIGluIGEpYis9IiYiKwpkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYVtkXSk7Yj1iLnN1YnN0cigxKX10aGlzLlBnJiYoYis9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0aGlzLmhiLnVybENhbGxlZD10aGlzLlhhLnVybDt0cnl7dGhpcy5ZaD90aGlzLmhiLm9wZW4odGhpcy5YYS5tZXRob2QsdGhpcy5YYS51cmwsITEpOnRoaXMuaGIub3Blbih0aGlzLlhhLm1ldGhvZCx0aGlzLlhhLnVybCwhMCksdGhpcy51aXx8KHRoaXMuaGIud2l0aENyZWRlbnRpYWxzPSEwKSwwPGIubGVuZ3RoJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGJbIlgtSG9tYWQtUG9zdCJdJiZ0aGlzLmhiLnNldFJlcXVlc3RIZWFkZXIoIlgtSG9tYWQtUG9zdCIsInRydWUiKSx0aGlzLmhiLnNlbmQoYil9Y2F0Y2goZil7bSYmbS5SZSh0aGlzLlhhLnVybCk/bS5WYz9tLmRhKCJyZXF1ZXN0X2ZhaWxlZCIpOmUudHJhY2soImNoZWNrIiwKInJlcXVlc3RfZmFpbGVkIiwhMCk6bS5SZSh0aGlzLlhhLnVybCksdGhpcy5CaCYmdGhpcy5CaCgpfXJldHVybiB0aGlzLmhifX19KShjKTt2YXIgTGE9Yy5manx8TGE7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkRhPXRoaXMuYmU9ITF9Yy5KaT1hO2EucHJvdG90eXBlPXtIbjpmdW5jdGlvbihiKXt0aGlzLmJlPWJ9LEduOmZ1bmN0aW9uKGIpe3RoaXMuRGE9Yn0scW46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIiwicmVnaXN0ZXJpbmdzIGV2ZW50OiIsYSk7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYil7Y29uc29sZS5sb2coIlVUSUxTIiwicHVibGlzaGVyQVBJIGdvdCBldmVudCIsYSxiKX0pfXZhciBhPXtocDoiQWRDbGlja1RocnUiLGpwOiJBZEVycm9yIixrcDoiQWRTdG9wcGVkIixucDoiQWRMaW5lYXJDaGFuZ2UiLG9wOiJBZFRhZ1BhcnNlZCIscnA6IkFkVmlkZW9Db21wbGV0ZSIsdXA6IkFkTG9hZGVkIiwKdnA6IkFkU2tpcHBlZCIsd3A6IkFkU3RhcnRlZCIsbHA6IkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixtcDoiQWRJbXByZXNzaW9uIixpcDoiQWRDcmVhdGl2ZVZpZXciLHBwOiJBZFZpZGVvTWlkcG9pbnQiLHFwOiJBZFBhdXNlZCIsc3A6IkFkVmlkZW9TdGFydCIsdHA6IkFkUGxheWluZyJ9O3dpbmRvdy5zbWFydGNsaWVudGNvcmUmJndpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQmJihhPXdpbmRvdy5zbWFydGNsaWVudGNvcmUuRVZFTlQpO2Zvcih2YXIgZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIodGhpcy5iZSxhW2RdKX0scG46ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIsYSl7Y29uc29sZS5sb2coIlVUSUxTIiwiZmFjYWRlIiwicmVnaXN0ZXJpbmcgZXZlbnQ6IixhKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihiKXtjb25zb2xlLmxvZygiVVRJTFMiLCJmYWNhZGUiLGEsYil9KX1pZih0aGlzLkRhJiZ0aGlzLkRhLmFlKWZvcih2YXIgYSBpbiB0aGlzLkRhLmFlKXRoaXMuRGEuYWUuaGFzT3duUHJvcGVydHkoYSkmJgpiKHRoaXMuRGEsdGhpcy5EYS5hZVthXSk7dGhpcy5EYSYmdGhpcy5EYS5nZXRFcnJvciYmd2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5EYS5nZXRFcnJvcigpO2ImJmNvbnNvbGUubG9nKCJVVElMUyIsImZhY2FkZSIsImdvdCBlcnJvciIsYil9LmJpbmQodGhpcyksMTApfSxmOmZ1bmN0aW9uKCl7dGhpcy5iZSYmdGhpcy5xbigpO3RoaXMuRGEmJnRoaXMucG4oKX19fSkoYyk7dmFyIE1hPWMuSml8fE1hOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7dGhpcy5IYT0hMTt0aGlzLiRiPSIiO3RoaXMuZmQ9dGhpcy5aYj10aGlzLmpiPW51bGw7dGhpcy5HZz10aGlzLnRiPXRoaXMuVGU9ITE7dGhpcy5BYT0iIjt0aGlzLlNlPSExO3RoaXMucGE9dGhpcy5KYz0iIjt0aGlzLk5lPXRoaXMuUz10aGlzLmlzRW5hYmxlZD10aGlzLm5mPSExO3RoaXMuZ2E9W107dGhpcy5KZT10aGlzLk9iPSIiO3RoaXMuWmQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9WRVJJRklFRCI7CnRoaXMuWWQ9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9CTE9DS0VEIjt0aGlzLnZiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfTk9CTE9DS0VSIjt0aGlzLldiPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQURCTE9DS0VSIjt0aGlzLlBiPSIiO3RoaXMuUWI9W107dGhpcy5SYj1bXTt0aGlzLlVjPVtdO3RoaXMub2M9IiI7dGhpcy5BYj0hMTt0aGlzLk9kPTA7dGhpcy52aWRlb3BsYXphPXt9O3RoaXMuaWM9ITE7dGhpcy52Zz10aGlzLlVkPW51bGw7dGhpcy56Zj10aGlzLlZiPXRoaXMuRmc9dGhpcy5TZD10aGlzLlZjPXRoaXMuaGQ9dGhpcy5zYz0hMTt0aGlzLlphPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfTt0aGlzLnZkPTA7dGhpcy5maD0hMTt0aGlzLmVoPTFFMzt0aGlzLnpjPSExO3RoaXMuT2E9MUUzO3RoaXMuaWU9IiJ9Yy5naj1hO2EucHJvdG90eXBlPXtnZXRDb25maWc6ZnVuY3Rpb24oKXtyZXR1cm57aXNBY3RpdmU6dGhpcy5IYSwKYWR0YWdwYXJhbWV0ZXI6dGhpcy4kYixhZHRhZ21vZGlmaWVyOnRoaXMuamIsYWR0YWdtb2RpZmllckFkdjp0aGlzLlpiLGFkdGFncmVnZXg6dGhpcy5mZCxiaXRyYXRlOnRoaXMuT2EsanNwb3B1cHM6dGhpcy5UZSxzaWRlbG9hZHM6dGhpcy50YixkaXNhYmxldGVzdHM6dGhpcy5HZyxob21hZEFsaWFzOnRoaXMuQWEsaXNJbml0aWFsaXplZDp0aGlzLlNlLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnBhLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuUyxpc0Jsb2NrZWQ6dGhpcy5OZSxzZXJ2ZXI6dGhpcy5nYSxzdm1Db25maWc6dGhpcy5PYixob21hZEFkcGF0aDp0aGlzLkplLEhPTUFEX1ZFUklGSUVEOnRoaXMuWmQsSE9NQURfQkxPQ0tFRDp0aGlzLllkLEhPTUFEX05PQkxPQ0tFUjp0aGlzLnZiLEhPTUFEX0FEQkxPQ0tFUjp0aGlzLldiLHRlc3RIaWRlOnRoaXMuUGIsdGVzdFRhZ3M6dGhpcy5RYix0ZXN0VGFnc0pTOnRoaXMuUmIsCnRlc3RUYWdzWEhSOnRoaXMuVWMsdGVzdDNQQ29va2llOnRoaXMub2MsdGhyb3R0bGU6dGhpcy5PZCx2aWRlb3BsYXphOnRoaXMudmlkZW9wbGF6YSxob21hZFRlc3RlZDp0aGlzLmljLGNoZWNrZWRIb21hZFN0YXR1c0NhbGxiYWNrOnRoaXMudmcsYWRCbG9ja2VyRGV0ZWN0ZWQ6dGhpcy5zYyxibG9ja2VkV2FzQ2FsbGVkOnRoaXMuaGQsdXNlU3RyaWN0Q2hlY2tzOnRoaXMuVmMsdXNlU3RyaWN0Q29uZmlnQ2hlY2tzOnRoaXMuU2QsY29uZmlnRmFpbHVyZXM6dGhpcy5aYSxzaXRlQ29uZmlnOnRoaXMueWEsc2VydmVySWQ6dGhpcy5yZixlbmFibGVRdWFydGlsZVRyYWNraW5nOnRoaXMuJGEsdnBhaWQ6dGhpcy5WYixza2lwQWxsb3dlZDp0aGlzLnpmLHZtYXBzOnRoaXMuTmYsYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaDp0aGlzLnpjLGFkRmFsbGJhY2tVUkw6dGhpcy5pZX19LHluOmZ1bmN0aW9uKGIpeyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaXNBY3RpdmUmJih0aGlzLkhhPWIuaXNBY3RpdmUpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFncGFyYW1ldGVyJiYodGhpcy4kYj1iLmFkdGFncGFyYW1ldGVyKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkdGFnbW9kaWZpZXImJih0aGlzLmpiPWIuYWR0YWdtb2RpZmllcik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ21vZGlmaWVyX2FkdiYmKHRoaXMuWmI9Yi5hZHRhZ21vZGlmaWVyX2Fkdik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5hZHRhZ3JlZ2V4JiYodGhpcy5mZD1iLmFkdGFncmVnZXgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuanNwb3B1cHMmJih0aGlzLlRlPWIuanNwb3B1cHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2lkZWxvYWRzJiYodGhpcy50Yj1iLnNpZGVsb2Fkcyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5kaXNhYmxldGVzdHMmJih0aGlzLkdnPWIuZGlzYWJsZXRlc3RzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmhvbWFkQWxpYXMmJih0aGlzLkFhPWIuaG9tYWRBbGlhcyk7InVuZGVmaW5lZCIhPT0KdHlwZW9mIGIuaXNJbml0aWFsaXplZCYmKHRoaXMuU2U9Yi5pc0luaXRpYWxpemVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmdsb2JhbENvbmZpZyYmKHRoaXMuSmM9Yi5nbG9iYWxDb25maWcpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2xpZW50Q29uZmlnJiYodGhpcy5wYT1iLmNsaWVudENvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0VuYWJsZWQmJih0aGlzLmlzRW5hYmxlZD1iLmlzRW5hYmxlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc1ZlcmlmaWVkJiYodGhpcy5TPWIuaXNWZXJpZmllZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5pc0Jsb2NrZWQmJih0aGlzLk5lPWIuaXNCbG9ja2VkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlciYmKHRoaXMuZ2E9Yi5zZXJ2ZXIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc3ZtQ29uZmlnJiYodGhpcy5PYj1iLnN2bUNvbmZpZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5ob21hZEFkcGF0aCYmKHRoaXMuSmU9CmIuaG9tYWRBZHBhdGgpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfVkVSSUZJRUQmJih0aGlzLlpkPWIuSE9NQURfVkVSSUZJRUQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQkxPQ0tFRCYmKHRoaXMuWWQ9Yi5IT01BRF9CTE9DS0VEKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLkhPTUFEX05PQkxPQ0tFUiYmKHRoaXMudmI9Yi5IT01BRF9OT0JMT0NLRVIpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuSE9NQURfQURCTE9DS0VSJiYodGhpcy5XYj1iLkhPTUFEX0FEQkxPQ0tFUik7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0SGlkZSYmKHRoaXMuUGI9Yi50ZXN0SGlkZSk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFncyYmKHRoaXMuUWI9Yi50ZXN0VGFncyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi50ZXN0VGFnc0pTJiYodGhpcy5SYj1iLnRlc3RUYWdzSlMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGVzdFRhZ3NYSFImJih0aGlzLlVjPWIudGVzdFRhZ3NYSFIpOwoidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnRlc3QzUENvb2tpZSYmKHRoaXMub2M9Yi50ZXN0M1BDb29raWUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudGhyb3R0bGUmJih0aGlzLk9kPWIudGhyb3R0bGUpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIudmlkZW9wbGF6YSYmKHRoaXMudmlkZW9wbGF6YT1iLnZpZGVvcGxhemEpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuaG9tYWRUZXN0ZWQmJih0aGlzLmljPWIuaG9tYWRUZXN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2smJih0aGlzLnZnPWIuY2hlY2tlZEhvbWFkU3RhdHVzQ2FsbGJhY2spOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWRCbG9ja2VyRGV0ZWN0ZWQmJih0aGlzLnNjPWIuYWRCbG9ja2VyRGV0ZWN0ZWQpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYmxvY2tlZFdhc0NhbGxlZCYmKHRoaXMuaGQ9Yi5ibG9ja2VkV2FzQ2FsbGVkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENoZWNrcyYmCih0aGlzLlZjPWIudXNlU3RyaWN0Q2hlY2tzKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnVzZVN0cmljdENvbmZpZ0NoZWNrcyYmKHRoaXMuU2Q9Yi51c2VTdHJpY3RDb25maWdDaGVja3MpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuY29uZmlnRmFpbHVyZXMmJih0aGlzLlphPWIuY29uZmlnRmFpbHVyZXMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuc2l0ZUNvbmZpZyYmKHRoaXMueWE9Yi5zaXRlQ29uZmlnKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLnNlcnZlcklkJiYodGhpcy5yZj1iLnNlcnZlcklkKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmVuYWJsZVF1YXJ0aWxlVHJhY2tpbmcmJih0aGlzLiRhPWIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52cGFpZCYmKHRoaXMuVmI9Yi52cGFpZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi5za2lwQWxsb3dlZCYmKHRoaXMuemY9Yi5za2lwQWxsb3dlZCk7InVuZGVmaW5lZCIhPT10eXBlb2YgYi52bWFwcyYmCih0aGlzLk5mPWIudm1hcHMpOyJ1bmRlZmluZWQiIT09dHlwZW9mIGIuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaCYmKHRoaXMuemM9Yi5hbHRlcm5hdGVfY2xpY2t0aHJvdWdoKTsidW5kZWZpbmVkIiE9PXR5cGVvZiBiLmFkRmFsbGJhY2tVUkwmJih0aGlzLmllPWIuYWRGYWxsYmFja1VSTCl9LFZsOmZ1bmN0aW9uKCl7dmFyIGI9ITEsYTtmb3IoYSBpbiB0aGlzLlphKSJib29sZWFuIj09dHlwZW9mIHRoaXMuWmFbYV0mJjE9PXRoaXMuWmFbYV0mJihiPSEwKTtyZXR1cm4gYn0sdGY6ZnVuY3Rpb24oYil7dGhpcy5aYVtiXT0hMH0sRGw6ZnVuY3Rpb24oKXt2YXIgYj1bXSxhO2ZvcihhIGluIHRoaXMuWmEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5aYVthXSYmMT09dGhpcy5aYVthXSYmYi5wdXNoKGEpO3JldHVybiBifSxNZDpmdW5jdGlvbihiKXtiPWJ8fCIiO2lmKCJzdHJpbmciIT10eXBlb2YgYilyZXR1cm4gYjtiPWIucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLwoxRTMpKTtiPWIucmVwbGFjZSgiW3RpbWVNU10iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3RpbWVzdGFtcF0iLChuZXcgRGF0ZSkuZ2V0VGltZSgpKTtiPWIucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoMTApLnRvU3RyaW5nKCkpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRVUkxdIixkb2N1bWVudC5VUkwpO2I9Yi5yZXBsYWNlKCJbZG9jdW1lbnRCYXNlVVJJXSIsZG9jdW1lbnQuYmFzZVVSSSk7cmV0dXJuIGI9ZS5GayhiKX0sdmE6ZnVuY3Rpb24oYixhLGQpe3ZhciBmPSIiLGM9IiIsZT0iIixoPSIiO2lmKCF0aGlzLkhhJiYhYSlyZXR1cm4gbmV3IEEoYik7Zj10aGlzLlFlKGIpO2M9dGhpcy50YShiKTtmPyh0aGlzLkxjKCk/ZT1iOmU9Yy5wcm90b2NvbCsiOi8vIitjLmF1dGhvcml0eSsiLyIsaD1jLnBhdGguc3Vic3RyKDEpKTooZT10aGlzLlBjKCksaD1jLnBhdGguc3Vic3RyKDEpKyhjLnF1ZXJ5PyI/IitjLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuJGJ8fHRoaXMuamJ8fAp0aGlzLlpifHx0aGlzLmZkKSYmKGg9dGhpcy5IbShoKSk7Yj1uZXcgQShlKTtiLnVybD1lO2U9IiI7ZT1mP2MuaG9zdC5zcGxpdCgiLiIpLnNsaWNlKDEpLmpvaW4oIi0iKTp0aGlzLkZsKGMuaG9zdCk7Yi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ZTtiLmRhdGEuaG9tYWRfdXJsX3N1ZmZpeD1oO2IuZGF0YS5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLnpiKGgpO2IubWV0aG9kPSJQT1NUIjtyZXR1cm4gYn0sUWU6ZnVuY3Rpb24oYil7dmFyIGE9ITEsZD1uZXcgUmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/KFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsImciKTsoZD1kLmV4ZWMoYikpJiYoZFsyXXx8ZFs1XSk/YT0hMDp0aGlzLkxjKCkmJihkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbdy4tXSopOj8uKihbMC05XSspPy8oW2EtZjAtOV17NDB9KS8/JCIsImciKSwoZD1kLmV4ZWMoYikpJiZkWzRdJiYoYT0hMCkpO3JldHVybiBhfSwKTGM6ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSIiO3RoaXMuZ2EmJnRoaXMuZ2EubGVuZ3RoJiYwPHRoaXMuZ2EubGVuZ3RoJiYoYT10aGlzLmdhWzBdLGE9YS5yZXBsYWNlKCJodHRwczovLyIsIiIpLGE9YS5yZXBsYWNlKCJodHRwOi8vIiwiIiksYT1hLnJlcGxhY2UoIi8vIiwiIiksYj0oYj1hLnNwbGl0KCIuIikpJiZiWzBdJiYiW2hhc2hdIj09YlswXT8hMTohMCk7cmV0dXJuIGJ9LFJlOmZ1bmN0aW9uKGIpe3ZhciBhPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhiKTtkJiYoZFsyXXx8ZFs1XSk/YT0hMDphPXRoaXMuUWUoYik7cmV0dXJuIGF9LEZsOmZ1bmN0aW9uKGIpe3ZhciBhPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy5BYSYmMDx0aGlzLkFhLmxlbmd0aClyZXR1cm4gdGhpcy5BYTtmb3IoZCBpbiB0aGlzLkFhKWlmKGE9dGhpcy5BYVtkXSxhLmhhc093blByb3BlcnR5KCJ1cmwiKSYmYS51cmw9PT1iKXJldHVybiBhLkRwOwpyZXR1cm4ibm9uZSJ9LHdkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2FbdGhpcy5yZl19LFBjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy53ZCgpLGE9dGhpcy5UaCgobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGIucmVwbGFjZSgiW2hhc2hdIixhLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSx4aDpmdW5jdGlvbihiLGEsZCl7Yj0hMTthPSIiO2lmKGQuZXZhbCl0cnl7YT1ldmFsKCIoIitkLmV2YWwrIikoKSIpfWNhdGNoKGYpe2I9ITB9ZWxzZSBiPSEwO2ImJiJLRUVQIiE9PWQuZmFsbGJhY2smJihhPWQuZmFsbGJhY2spO3JldHVybiBhfSxHbTpmdW5jdGlvbihiLGEpe3ZhciBkPWUudGEoYiksZj0iIixmPSIiLGM7Zm9yKGMgaW4gYSl7aWYoYVtjXS5zdWJ2YWx1ZXMpe2Zvcih2YXIgaD1kZWNvZGVVUklDb21wb25lbnQoZC5xdWVyeUtleVtjXSkuc3BsaXQoIiYiKSxmPXt9LEY9MDtGPApoLmxlbmd0aDtGKyspe3ZhciBrPWhbRl0uc3BsaXQoIj0iKTtmW2tbMF1dPWtbMV19Zm9yKHZhciBsIGluIGFbY10uc3VidmFsdWVzKWZbbF09dGhpcy54aChmW2xdLGwsYVtjXS5zdWJ2YWx1ZXNbbF0pO2g9W107Zm9yKGwgaW4gZiloLnB1c2gobCsiPSIrZltsXSk7Zj1oPWVuY29kZVVSSUNvbXBvbmVudChoLmpvaW4oIiYiKSl9ZWxzZSBmPXRoaXMueGgoZC5xdWVyeUtleVtjXSxjLGFbY10pO2QucXVlcnlLZXlbY109Zn1sPVtdO2ZvcihjIGluIGQucXVlcnlLZXkpbC5wdXNoKGMrIj0iK2QucXVlcnlLZXlbY10pO3JldHVybiBmPWQuaG9zdCtkLnBhdGgrIj8iK2wuam9pbigiJiIpfSxIbTpmdW5jdGlvbihiKXt0aGlzLiRiJiYoYis9dGhpcy4kYik7aWYodGhpcy5qYilmb3IodmFyIGEgaW4gdGhpcy5qYil0aGlzLmpiLmhhc093blByb3BlcnR5KGEpJiYoYj1iLnJlcGxhY2UoYSx0aGlzLmpiW2FdKSk7dGhpcy5aYiYmKGI9dGhpcy5HbShiLHRoaXMuWmIpKTtyZXR1cm4gYn0sUms6ZnVuY3Rpb24oKXt0aGlzLnlhJiYKdGhpcy55YS5jbGllbnRBUElzJiZ0aGlzLk1rKHRoaXMueWEuY2xpZW50QVBJcyl9LE1rOmZ1bmN0aW9uKGIpe2lmKGIpe3ZhciBhPW5ldyBNYTtiLnB1Ymxpc2hlckFQSSYmYS5IbihiLnB1Ymxpc2hlckFQSSk7Yi5wbGF5ZXImJmEuR24oYi5wbGF5ZXIpO2EuZigpfX0saTpmdW5jdGlvbihiLGEsZCxmLGMsZSl7bT10aGlzO3RoaXMuU2U9ITA7dGhpcy5KYz1iO3RoaXMucGE9YTt0aGlzLm5mPWQ7dGhpcy5VZD1mO3RoaXMuRGM9Yzt0aGlzLnlhPWV8fHt9O3RoaXMuUmsoKTt0aGlzLnhtKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnBhKXRoaXMudm0oKTtlbHNlIGlmKCJvYmplY3QiIT09dHlwZW9mIHRoaXMucGEpdHJ5e3RoaXMucGE9YSgpLHRoaXMuQWMoKX1jYXRjaChoKXt0aGlzLmRhKCJub0NsaWVudENvbmZpZyIpfWVsc2UgaWYoIm9iamVjdCI9PXR5cGVvZiB0aGlzLnBhKXRyeXt0aGlzLnBhPWEsdGhpcy5BYygpfWNhdGNoKGspe3RoaXMuZGEoIm5vQ2xpZW50Q29uZmlnIil9fSwKcmI6ZnVuY3Rpb24oYil7dmFyIGE9bnVsbDt0cnl7YT1uZXcgRXZlbnQoYil9Y2F0Y2goZCl7YT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxhLmluaXRFdmVudCgiY3VzdG9tIiwhMCwhMSl9cmV0dXJuIGF9LHhtOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgQSh0aGlzLkpjK3RoaXMub2UoImdsb2JhbCIpKSx0aGlzLlNsLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLnRmKCJnbG9iYWwiKTsib2JqZWN0Ij09dHlwZW9mIF9jbGllbnRDb25maWcmJnRoaXMuQWMoKX0uYmluZCh0aGlzKSwhMCl9LHZtOmZ1bmN0aW9uKCl7dGhpcy5JYShuZXcgQSh0aGlzLnBhK3RoaXMub2UoImNsaWVudCIsLTEhPXRoaXMucGEuaW5kZXhPZigiPyIpKSksdGhpcy5BYy5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy50ZigiY2xpZW50Iik7dGhpcy5kYSgiY2xpZW50Q29uZmlnQ291bGROb3RCZUxvYWRlZCIpfS5iaW5kKHRoaXMpLCEwKX0sb2U6ZnVuY3Rpb24oYixhKXt2YXIgZDtkPShhPyImIjoKIj8iKSsoImNhY2hlPSIrdGhpcy5MYigpKTt0aGlzLnlhJiZ0aGlzLnlhLm5vQ2xpZW50Q29uZmlnQ2FjaGVCdXN0ZXImJiJjbGllbnQiPT1iJiYoZD0iIik7dGhpcy55YSYmdGhpcy55YS5ub0NhY2hlQnVzdGVyJiYoZD0iIik7cmV0dXJuIGR9LGRhOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhkKXt0aGlzLmhkPSEwO3ZhciBhPWZ1bmN0aW9uKCl7Zm9yKHZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLGE9MDthPGIubGVuZ3RoO2ErKyl7aWYoYlthXSYmYlthXS5wYXVzZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbYV0ucGF1c2UpdHJ5e2JbYV0ucGF1c2UoKX1jYXRjaChnKXt9YlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pfWI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihhPTA7YTxiLmxlbmd0aDthKyspYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW8td3JhcHBlciIpOwpmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgidmlkZW9wbGF5ZXIiKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWJbYV0mJmJbYV0ucGFyZW50Tm9kZSYmYlthXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGJbYV0pO2lmKHdpbmRvdy5zZWxmIT13aW5kb3cudG9wKWZvcihiPXdpbmRvdy5kb2N1bWVudDtiLmhhc0NoaWxkTm9kZXMoKTspYi5yZW1vdmVDaGlsZChiLmxhc3RDaGlsZCl9OyI0cGxheWVycy5kZSI9PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikmJih0aGlzLkRjPSExKTt0aGlzLkRjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuRGM/dGhpcy5EYygpOihhKCksd2luZG93LnNldEludGVydmFsKGEsNTAwKSk7dGhpcy5TPXRoaXMuTmU9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMuWWQpKTsKdGhpcy5UYigpO2UuRmMoay5UbSk7KGE9ZS5DYih0aGlzLndkKCkpKXx8KGE9ZS5DYihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7Ynx8KGI9InVua293biIpO2UudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGIsITApfX0sU2w6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307dHJ5e2E9SlNPTi5wYXJzZShiLnJlc3BvbnNlVGV4dCl9Y2F0Y2goZCl7YS5lbmFibGVkPSJmYWxzZSJ9aWYoIWEuZW5hYmxlZHx8IWEuZm9yY2VfZGlzYWJsZWQpdHJ5e2E9KG5ldyBGdW5jdGlvbigicmV0dXJuICIrYi5yZXNwb25zZVRleHQucmVwbGFjZSgvXHMvZywiIikpKSgpfWNhdGNoKGYpe310aGlzLmlzRW5hYmxlZD10aGlzLmZiKGEuZW5hYmxlZCk7dGhpcy5TPSF0aGlzLmlzRW5hYmxlZDt0aGlzLmlzRW5hYmxlZD8ib2JqZWN0IiE9dHlwZW9mIHRoaXMucGF8fHRoaXMuT2J8fHRoaXMuQWF8fHRoaXMuQWMoKToodGhpcy5IYT10aGlzLmlzRW5hYmxlZD0hMSx0aGlzLlM9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKSwKdGhpcy5UYigpKX19LEFjOmZ1bmN0aW9uKGIpe3ZhciBhPSExO2ImJihhPWIucmVzcG9uc2VUZXh0KTt2YXIgZD17fTtpZihhKXRyeXtkPUpTT04ucGFyc2UoYSl9Y2F0Y2goZil7ZD10aGlzLnBhfWVsc2UgZD10aGlzLnBhO2lmKCEoZC5lbmFibGVkJiZkLnNlcnZlciYmZC5hbGlhcyYmZC5jb25maWcpKXRyeXtkPShuZXcgRnVuY3Rpb24oInJldHVybiAiK2IucmVzcG9uc2VUZXh0LnJlcGxhY2UoL1xzL2csIiIpKSkoKX1jYXRjaChjKXt9dGhpcy5pc0VuYWJsZWQ9dGhpcy5mYihkLmVuYWJsZWQpO3RoaXMuUz0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5nYT1kLnNlcnZlcnx8W107Zm9yKGI9MDtiPHRoaXMuZ2EubGVuZ3RoO2IrKyl0aGlzLmdhW2JdPXRoaXMuZ2FbYl0ucmVwbGFjZSgiZGFtb2gud2lraWEuY29tIiwiZGFtb2gud2lraWEuY29tLnN2b25tLWFsaWFzLmNvbSIpO2lmKChlLkYoIndlYi5kZSIpfHxlLkYoImdteC5uZXQiKXx8ZS5GKCJnbXguYXQiKXx8ZS5GKCJnbXguY2giKXx8CmUuRigiMXVuZDEuZGUiKSkmJiF0aGlzLkxjKCkpZm9yKGI9MDtiPHRoaXMuZ2EubGVuZ3RoO2IrKyl0aGlzLmdhW2JdPXRoaXMuZ2FbYl0ucmVwbGFjZSgiW2hhc2hdIiwic3NsIikuY29uY2F0KCJbaGFzaF0vIik7dGhpcy5PYj1kLmNvbmZpZ3x8IiI7dGhpcy5BYT1kLmFsaWFzfHxudWxsO3RoaXMuSmU9ZC5hZHBhdGh8fCIiO3RoaXMucmY9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuZ2EubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5PYiYmdGhpcy5BYSYmdGhpcy5nYS5sZW5ndGg/dGhpcy5NYyghMSk6KHRoaXMuSGE9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy5UYigpKX0sTWM6ZnVuY3Rpb24oYil7aWYoIXRoaXMuUyl7dmFyIGE9e307aWYoYil7dmFyIGE9bmV3IEEodGhpcy5QYygpKSxkPXRoaXMudGEodGhpcy5PYik7YS5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9InMzaG9tYWRnbG9iYWxjb25maWdzIjsKYS5kYXRhLmhvbWFkX3VybF9zdWZmaXg9ZC5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2EubWV0aG9kPSJQT1NUIn1lbHNlIGE9bmV3IEEodGhpcy5PYit0aGlzLm9lKCJjdXN0b21lciIpKTt0aGlzLklhKGEsdGhpcy5hby5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy50ZigiY3VzdG9tZXIiKTtiP3RoaXMuVGo/dGhpcy5kYSgibm9TVk1Db25maWciKToodGhpcy5Uaj0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuTWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGFvOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLlMpe3ZhciBhPWIucmVzcG9uc2VUZXh0LGQ9e307dHJ5e2Q9SlNPTi5wYXJzZShhKX1jYXRjaChmKXtpZighdGhpcy5pYyYmdGhpcy5pc0VuYWJsZWQpe3RoaXMuaWM9ITA7dGhpcy5NYyghMCk7cmV0dXJufX1pZighZC5oYXNPd25Qcm9wZXJ0eSgiZW5hYmxlZCIpKXRyeXtkPQoobmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC9ccy9nLCIiKSkpKCl9Y2F0Y2goYyl7fXRoaXMuVmM9dGhpcy5mYihkLnN0cmljdCk7dGhpcy5TZD10aGlzLmZiKGQuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkZnPWQuZHVyYXRpb25fY2hlY2tfcGVuYWx0eV9kaXNhYmxlZHx8ITE7dGhpcy4kYT10aGlzLmZiKGQuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5mYihkLmVuYWJsZWQpO3RoaXMuUGI9ZC50ZXN0aGlkZXx8IiI7dGhpcy5SYj1kLnRlc3RhZHRhZ3Nqc3x8ZC50ZXN0YWR0YWdzfHxbXTt0aGlzLlVjPWQudGVzdGFkdGFnc3hocnx8W107dGhpcy5vYz1kLnRlc3QzcGNvb2tpZXx8IiI7dGhpcy4kYj1kLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmpiPWQuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLlpiPWQuYWR0YWdtb2RpZmllcl9hZHZ8fG51bGw7dGhpcy5mZD1kLmFkdGFncmVnZXh8fG51bGw7dGhpcy5UZT0KZC5qc3BvcHVwc3x8ITE7dGhpcy50Yj1kLnNpZGVsb2Fkc3x8ITE7dGhpcy5WYj1kLnZwYWlkfHwhMTt0aGlzLnlhLnZwYWlkPXRoaXMuVmI7dGhpcy56Zj1kLnNraXBhbGxvd2VkfHwhMTt0aGlzLmpkPWQuY2FwdGlvbl9kdXJhdGlvbnx8ITE7dGhpcy5OZj1kLnZtYXBzfHwiIjt0aGlzLnpjPWQuYWx0ZXJuYXRlX2NsaWNrdGhyb3VnaHx8ITE7dGhpcy5PYT1kLmJpdHJhdGV8fDFFMzt0aGlzLmllPWQuYWRfZmFsbGJhY2tfVVJMfHwiIjt0aGlzLk9kPWQudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWQudmlkZW9wbGF6YXx8e307IXRoaXMuaWMmJnRoaXMuaXNFbmFibGVkPyh0aGlzLmljPSEwLHRoaXMuTWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMucG8oKSYmKHRoaXMuUGJ8fHRoaXMuUmJ8fHRoaXMuUWJ8fHRoaXMuVWMpP3RoaXMubmY/KHRoaXMuSGE9dGhpcy5TPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLnZiKSksdGhpcy50ZSgpLHRoaXMuVGIoKSk6CnRoaXMuZm8oKToodGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5GZigpKX19LGZvOmZ1bmN0aW9uKCl7dGhpcy5lbygpO3RoaXMuaG8oKX0saG86ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGIpe3JldHVybiJ2YXIgZXZ0ID0ge307aWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJyIrYisiJyk7fSBlbHNlIHtldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtldnQuaW5pdEN1c3RvbUV2ZW50KCciK2IrIicsIGZhbHNlLCBmYWxzZSwge30pO313aW5kb3cucGFyZW50LmRvY3VtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTsifXZhciBhPSJpbmxpbmVldmFsZGF0YSIsZD0wO3RyeXt2YXIgZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtmLndpZHRoPTE7Zi5oZWlnaHQ9MTtmLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2Yuc3JjPSJhYm91dDpibGFuayI7dmFyIGM9ZS5YKDEwKSxoPWUuWCgxMCksCkY9ZS5YKDEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oKXtkKys7YT1hLnJlcGxhY2UoImRhdGEiLCIiKX0pO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoaCxmdW5jdGlvbigpe2QrKzthPWEucmVwbGFjZSgiZXZhbCIsIiIpfSk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihGLGZ1bmN0aW9uKCl7ZCsrO2E9YS5yZXBsYWNlKCJpbmxpbmUiLCIiKX0pO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZik7Zi5jb250ZW50V2luZG93LmRvY3VtZW50LndyaXRlKGF0b2IoIlBHaDBiV3crUEdobFlXUStQSE5qY21sd2RDQjBlWEJsUFNKMFpYaDBMMnBoZG1GelkzSnBjSFFpUGc9PSIpK2IoRikrYXRvYigiUEM5elkzSnBjSFErUEhOamNtbHdkQ0IwZVhCbFBTSjBaWGgwTDJwaGRtRnpZM0pwY0hRaVBtVjJZV3dvSWc9PSIpK2IoaCkrYXRvYigiSWlrOEwzTmpjbWx3ZEQ0OGMyTnlhWEIwSUhSNWNHVTlJblJsZUhRdmFtRjJZWE5qY21sd2RDSWdjM0pqUFNKa1lYUmhPblJsZUhRdmFtRjJZWE5qY21sd2REdGlZWE5sTmpRcyIpKwplLnpiKGIoYykpK2F0b2IoIklqNDhMM05qY21sd2RENDhMMmhsWVdRK1BHSnZaSGsrUEM5aWIyUjVQand2YUhSdGJEND0iKSl9Y2F0Y2goayl7fXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZil9Y2F0Y2goYil7fWlmKDMhPWQpe3ZhciBjPWUucWQoKTtpZigoYy5pc0Nocm9tZXx8Yy5pc0ZpcmVmb3gpJiYhYy5pc0VkZ2UmJiFlLlNhKCkpe2lmKHRoaXMueWEmJnRoaXMueWEucGxheWVyJiZ0aGlzLnlhLnBsYXllci5sZW5ndGgpe2UudHJhY2soInN0YXRzX2hkX2NzcF9oZHAiLGEsITApO3JldHVybn10aGlzLmRhKCJjc3BfIithKX1lLnRyYWNrKCJzdGF0c19oZF9jc3AiLGEsITApfX0uYmluZCh0aGlzKSwxRTMpfSxGZjpmdW5jdGlvbigpe3RoaXMuUz0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMucmIodGhpcy52YikpO3RoaXMuVGIoKX0sTmQ6ZnVuY3Rpb24oYil7dGhpcy5zYz0hMDt0aGlzLlN8fCh0aGlzLlM9CnRoaXMuSGE9ITAsZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKGIpKSx0aGlzLlRiKCksdGhpcy50ZSgpKX0sZW86ZnVuY3Rpb24oKXtpZih0aGlzLlBiKXt2YXIgYj1lLnFkKCk7aWYoKGIuaXNDaHJvbWV8fGIuaXNGaXJlZm94KSYmdGhpcy5tbSgpKXRoaXMuTmQodGhpcy5XYiwibiBIb21hZFV0aWwudGVzdEFkSGlkZSgpIHN0ZXZlIGlzIGFsaXZlIik7ZWxzZXtiPSExO3RyeXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTthLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuUGIpO2Euc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5QYik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MTBweDtoZWlnaHQ6MTBweDttaW4td2lkdGg6MTBweDttaW4taGVpZ2h0OjEwcHg7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7dmFyIGQ9MD09PWEub2Zmc2V0V2lkdGh8fDA9PT1hLm9mZnNldEhlaWdodDtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpOwpiPWR9Y2F0Y2goZil7fWI/dGhpcy5OZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6dGhpcy5jaSgpfX1lbHNlIHRoaXMuY2koKX0sYmk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7Zj1kLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMuTGIoKSk7dGhpcy5rbyhmLDA8ZC5sZW5ndGg/Yi5iaW5kKHRoaXMpOnRoaXMuWmguYmluZCh0aGlzKSxhLmJpbmQodGhpcykpfWZ1bmN0aW9uIGEoKXt0aGlzLk5kKHRoaXMuV2IsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZigodGhpcy5RYj10aGlzLlVjKSYmdGhpcy5RYi5sZW5ndGgpe3ZhciBkPXRoaXMuUWIuc2xpY2UoKSxmPSIiO2IuYmluZCh0aGlzKSgpfWVsc2UgdGhpcy5aaCgpfSxrbzpmdW5jdGlvbihiLGEsZCl7ZnVuY3Rpb24gZigpe2MoKSYmYSgpfWZ1bmN0aW9uIGMoKXtyZXR1cm4gZT8od2luZG93LmNsZWFyVGltZW91dChlKSwKITApOiExfXZhciBlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RoaXMuSWEobmV3IEEoYiksZixmdW5jdGlvbigpe2MoKSYmZCgpfSl9LGNpOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYigpe2Y9ZC5zaGlmdCgpLnJlcGxhY2UoIltyYW5kb21dIix0aGlzLkxiKCkpO3RoaXMubG8oZiwwPGQubGVuZ3RoP2IuYmluZCh0aGlzKTp0aGlzLmJpLmJpbmQodGhpcyksYS5iaW5kKHRoaXMpKX1mdW5jdGlvbiBhKCl7dGhpcy5OZCh0aGlzLldiLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2YrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLlJiJiZ0aGlzLlJiLmxlbmd0aCl7dmFyIGQ9dGhpcy5SYi5zbGljZSgpLGY7Yi5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLmJpKCl9LGxvOmZ1bmN0aW9uKGIsYSxkKXtmdW5jdGlvbiBmKCl7ZSgpJiZhKCl9ZnVuY3Rpb24gYygpe2UoKSYmZCgpfWZ1bmN0aW9uIGUoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwKITApOiExfXZhciBoPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZigpfSwzRTMpO3RyeXt3aW5kb3cub25lcnJvcj1mdW5jdGlvbihhLGQpe2Q9PWImJmUoKSYmYygpfTt2YXIgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGspO2suc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7ay5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtrLm9ubG9hZD1mO2sub25lcnJvcj1jO2suc3JjPWI7ay5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9Y2F0Y2gobCl7ZigpfX0sWmg6ZnVuY3Rpb24oKXtpZih0aGlzLm9jKXRyeXtlLnlkKHRoaXMub2MsImdldCIsbnVsbCxmdW5jdGlvbihiKXtiPUpTT04ucGFyc2UoYi5yZXNwb25zZVRleHQpO3RoaXMuQWI9IXRoaXMuZmIoYi5jYyk7dGhpcy5GZigpfS5iaW5kKHRoaXMpLHRoaXMuJGguYmluZCh0aGlzKSwhMCl9Y2F0Y2goYil7dGhpcy4kaCgpfWVsc2UgdGhpcy5GZigpfSwKJGg6ZnVuY3Rpb24oKXt0aGlzLlM9ITA7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudCh0aGlzLnJiKHRoaXMudmIpKTt0aGlzLlRiKCk7dGhpcy50ZSgpfSxtbTpmdW5jdGlvbigpe3RyeXtyZXR1cm4hSlNPTi5wYXJzZSgneyJlbmFibGVkIjp0cnVlLCAiZm9yY2VfZGlzYWJsZWQiOnRydWV9JykuaGFzT3duUHJvcGVydHkoImVuYWJsZWQiKX1jYXRjaChiKXtyZXR1cm4iZmFpbCJ9fSxUYjpmdW5jdGlvbigpe3ZhciBiPSIwIixhPSIwIjt0cnl7ZS5TYSgpJiYoYj0iMSIpfWNhdGNoKGQpe2I9Mn10aGlzLnNjJiYoYT0iMSIpO2UudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYisiIithLCEwKTt0aGlzLm9jJiZlLnRyYWNrKCJzdGF0c19oZF9jb29raWVieXBhc3MiLHRoaXMuQWIsITApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5yYih0aGlzLlpkKSk7dGhpcy5VZCYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLlVkJiZ0aGlzLlVkKHtob21hZENvb2tpZUJ5cGFzczp0aGlzLkFifSl9LApRazpmdW5jdGlvbigpe2lmKHRoaXMuU2QmJnRoaXMuVmwoKSl7dmFyIGI9dGhpcy5EbCgpO2ImJmIuam9pbiYmZS50cmFjaygiY29uZmlnX2ZhaWxlZCIsYi5qb2luKCJfIiksITApfX0sZ2k6ZnVuY3Rpb24oYil7Ynx8KGI9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGIpdHJ5e2I9Yi50b1N0cmluZygpfWNhdGNoKGEpe2I9ImNvdWxkX25vdF9jb252ZXJ0X3RvX3N0cmluZyJ9Yj1iLnRyaW0oKTtlLnRyYWNrKCJzdGF0c19oZF9hY3RpdmF0ZWQiLGIsITApfSxJYTpmdW5jdGlvbihiLGEsZCxmLGMsaCl7dGhpcy52ZHx8KHRoaXMudmQ9MCk7dGhpcy52ZCsrO3RoaXMudmQ+dGhpcy5laCYmIXRoaXMuZmgmJih0aGlzLmZoPSEwLGUudHJhY2soInN0YXRzX2hkX3JlcXVlc3Rjb3VudCIsdGhpcy5laCwhMCkpO2I9bmV3IExhKGIsYSxkKTtmJiYoYi51aT0hMCk7YyYmZS5rbSgpJiYoYi5QZz0hMCk7aCYmKGIuWWg9ITApO3JldHVybiBiLmxvYWQoKX0sTms6ZnVuY3Rpb24oKXtlLlNhKCl8fAplLmFiKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCJob21hZHN0YXRpY3Zhc3QiLHtob21hZF9oYXNoX2d1ZXNzZWQ6InRydWUifSxmdW5jdGlvbihiKXt2YXIgYT1udWxsLGQ9bnVsbCxmPSIiO3RyeXsoYT1iLnJlc3BvbnNlWE1MKXx8KGE9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYi5yZXNwb25zZVRleHQsInRleHQveG1sIikpLGQ9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKVswXX1jYXRjaChjKXt0aGlzLmRhKCJtZWRpYWZpbGVfbm94bWwiKTtyZXR1cm59aWYoZClpZihiPWQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIk1lZGlhRmlsZSIpKWlmKGJbMF0mJihiPWJbMF0pLGIpe2Y9YiYmYi5jaGlsZE5vZGVzJiZiLmNoaWxkTm9kZXNbMF0/Yi5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIjt0aGlzLkxjKCl8fChiPXRoaXMudGEoZiksZj1iLnByb3RvY29sKyI6Ly8iK2IuaG9zdCk7dmFyIGU9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIik7ZS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXtlLm5ldHdvcmtTdGF0ZT09ZS5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5kYSgibWVkaWFmaWxlIil9LmJpbmQodGhpcykpO2UuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIikpO2Uuc2V0QXR0cmlidXRlKCJzcmMiLGYpfWVsc2UgdGhpcy5kYSgibWVkaWFmaWxlX25vbWVkaWEiKTtlbHNlIHRoaXMuZGEoIm1lZGlhZmlsZV9ub21lZGlhIik7ZWxzZSB0aGlzLmRhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5kYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sY286ZnVuY3Rpb24oKXtyZXR1cm4iYWxsIj09PXRoaXMuTmZ9LE9rOmZ1bmN0aW9uKCl7dGhpcy52YSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwKITApO3ZhciBiPXRoaXMudmEoImh0dHA6Ly9kMzc5OTY0YXltZXgyeC5jbG91ZGZyb250Lm5ldC9jaGVjay54bWw/ZW1wdHk9dHJ1ZSIsITApO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJob21hZHN0YXRpY3Zhc3QiO2IuZGF0YS5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuSWEoYix0aGlzLkVvLmJpbmQodGhpcyksdGhpcy5Eby5iaW5kKHRoaXMpKX0sRW86ZnVuY3Rpb24oYil7dmFyIGE9bnVsbCxkPW51bGw7dHJ5eyhhPWIucmVzcG9uc2VYTUwpfHwoYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhiLnJlc3BvbnNlVGV4dCwidGV4dC94bWwiKSksZD1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpWzBdfWNhdGNoKGYpe3JldHVybn1kfHx0aGlzLm1sKCl9LERvOmZ1bmN0aW9uKCl7fSxtbDpmdW5jdGlvbigpe2UuRmMoay5sbCk7ZS50cmFjaygiZmFpbC1pbml0IiwiMTAxIik7dGhpcy5kYSgidmFzdGZpbGVNYW5pcHVsYXRpb24iKX0sCnRlOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0VuYWJsZWQmJnRoaXMudGIubGVuZ3RoKWZvcih2YXIgYj0wO2I8dGhpcy50Yi5sZW5ndGg7YisrKXt2YXIgYT10aGlzLnRiW2JdOyJyZXF1ZXN0Ij09YS50eXBlJiZlLmFiKGEudXJsLGEuYWxpYXMsbnVsbCxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMpO2lmKCJldmFsIj09YS50eXBlKXt2YXIgZD1uZXcgSDt3aW5kb3dbZC5mYSgpXT10aGlzO2UuYWIoYS51cmwsYS5hbGlhcyxudWxsLGZ1bmN0aW9uKGIpe2lmKGIucmVzcG9uc2VUZXh0KXRyeXtldmFsKGIucmVzcG9uc2VUZXh0KX1jYXRjaChhKXt9fSxmdW5jdGlvbigpe30sdGhpcyl9fX0scG86ZnVuY3Rpb24oKXtyZXR1cm4gMTAwKk1hdGgucmFuZG9tKCk8dGhpcy5PZH0sTGI6ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYnx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0sWDpmdW5jdGlvbihiKXtiPWJ8fDEwO2Zvcih2YXIgYT0KIiIsZD0wO2Q8YjtkKyspYSs9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGF9LGZiOmZ1bmN0aW9uKGIpe3JldHVybiJUcnVlIj09Ynx8InRydWUiPT1ifHwxPT1ifHwiMSI9PWJ8fDE9PWJ9LHpiOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT0iIixkLGYsYyxlLGgsayxsPTA7bDxiLmxlbmd0aDspZD1iLmNoYXJDb2RlQXQobCsrKSxmPWIuY2hhckNvZGVBdChsKyspLGM9Yi5jaGFyQ29kZUF0KGwrKyksZT1kPj4yLGQ9KGQmMyk8PDR8Zj4+NCxoPShmJjE1KTw8MnxjPj42LGs9YyY2Myxpc05hTihmKT9oPWs9NjQ6aXNOYU4oYykmJihrPTY0KSxhPWErIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZSkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGgpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspO3JldHVybiBhfSx0YTpmdW5jdGlvbihhKXt2YXIgZz0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgZD17fSxjPTE0O2MtLTspZFtnW2NdXT1hW2NdfHwiIjtkLnF1ZXJ5S2V5PXt9O2RbZ1sxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoZC5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBkfSxUaDpmdW5jdGlvbihhKXtmdW5jdGlvbiBnKGEpe3ZhciBiPSIiLGQsZztmb3IoZD03OzA8PWQ7ZC0tKWc9YT4+PjQqZCYxNSxiKz1nLnRvU3RyaW5nKDE2KTtyZXR1cm4gYn1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGMsZSxoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixyPTI3MTczMzg3OCx0PTMyODUzNzc1MjAsbixxLHUsdix3O249YS5sZW5ndGg7dmFyIHg9W107Zm9yKGM9MDtjPG4tMztjKz00KWU9YS5jaGFyQ29kZUF0KGMpPDwyNHxhLmNoYXJDb2RlQXQoYysxKTw8MTZ8YS5jaGFyQ29kZUF0KGMrMik8PDh8YS5jaGFyQ29kZUF0KGMrMykseC5wdXNoKGUpOwpzd2l0Y2gobiU0KXtjYXNlIDA6Yz0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTpjPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjpjPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmM9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHgucHVzaChjKTsxNCE9eC5sZW5ndGglMTY7KXgucHVzaCgwKTt4LnB1c2gobj4+PjI5KTt4LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eC5sZW5ndGg7YSs9MTYpe2ZvcihjPTA7MTY+YztjKyspaFtjXT14W2ErY107Zm9yKGM9MTY7Nzk+PWM7YysrKWhbY109ZChoW2MtM11eaFtjLThdXmhbYy0xNF1eaFtjLTE2XSwxKTtlPWs7bj1sO3E9bTt1PXI7dj10O2ZvcihjPTA7MTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8fm4mdSkrditoW2NdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztmb3IoYz0yMDszOT49YztjKyspdz1kKGUsNSkrKG5ecV51KSt2K2hbY10rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHY9dSx1PXEscT1kKG4sMzApLG49ZSxlPXc7Zm9yKGM9NDA7NTk+PWM7YysrKXc9ZChlLDUpKyhuJnF8biZ1fHEmdSkrditoW2NdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx2PXUsdT1xLHE9ZChuLDMwKSxuPWUsZT13O2ZvcihjPTYwOzc5Pj1jO2MrKyl3PWQoZSw1KSsobl5xXnUpK3YraFtjXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdj11LHU9cSxxPWQobiwzMCksbj1lLGU9dztrPWsrZSY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3EmNDI5NDk2NzI5NTtyPXIrdSY0Mjk0OTY3Mjk1O3Q9dCt2JjQyOTQ5NjcyOTV9cmV0dXJuKGcoaykrZyhsKStnKG0pK2cocikrZyh0KSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIE5hPWMuZ2p8fE5hLG09bmV3IE5hO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9CmMuYXA9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBPYT1jLmFwfHxPYTtuZXcgT2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsZyxkKXt0aGlzLmE9YTthLmMuUj90aGlzLmJiPWEuYy5SKCk6dGhpcy5iYj0iIjthLmMubWgmJmEuYy5taCh7cGF1c2U6dGhpcy5CZC5iaW5kKHRoaXMpLHJlc3VtZTp0aGlzLlFoLmJpbmQodGhpcyksbXV0ZTp0aGlzLmFmLmJpbmQodGhpcyksdW5tdXRlOnRoaXMud28uYmluZCh0aGlzKX0pO3RoaXMuY29udGFpbmVyPXRoaXMuYS5rYjt0aGlzLnBsYXllcj10aGlzLmEuYzt0aGlzLmVjPXRoaXMuZ2Q9ITE7dGhpcy5Daz0xRTM7dGhpcy5yYT1udWxsO3RoaXMuQj1nO3RoaXMuZ2I9e307dGhpcy52aWRlbz17fTt0aGlzLktkPXt9O2UucGIoIm5ld0JpZ0FkSWQiKTt0aGlzLkdrPWUuWCgxMCk7CnRoaXMuQmY9MDt0aGlzLmRkPSJXZXJidW5nIC0gW3RpbWVdIjtkJiZkLmFkbWVzc2FnZSYmKHRoaXMuZGQ9ZC5hZG1lc3NhZ2UsImZ1bmN0aW9uIj09dHlwZW9mIGQuYWRtZXNzYWdlJiYoKGE9dGhpcy5hLmMpJiZ0aGlzLmEuYy5sJiYoYT10aGlzLmEuYy5sKCkpLHRoaXMuZGQ9ZC5hZG1lc3NhZ2UoYSkpKTtkJiYidHJ1ZSI9PVN0cmluZyhkLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuQWs9ZC5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5lZj10aGlzLkpkPSExO3RoaXMudmg9ZCYmZC5tYXhXcmFwcGVyRGVwdGg/cGFyc2VJbnQoZC5tYXhXcmFwcGVyRGVwdGgpOjE1O3RoaXMuYj17fTt0aGlzLm5lPSExO3RoaXMuamk9LTE7dGhpcy5jb250cm9scz10aGlzLmNhcHRpb249dGhpcy5qYz0hMTt0aGlzLiRrPWUuWCgxMCk7dGhpcy5LYj1lLlgoMTApO3RoaXMuSWI9ZS5YKDEwKTt0aGlzLlVoPWUuWCgxMCk7dGhpcy5jb25mPXt9O3RoaXMuVmQ9CnRoaXMuVWI9dGhpcy52ZT10aGlzLm5kPXRoaXMuTGQ9dGhpcy51Yj10aGlzLnFjPXRoaXMuRGg9dGhpcy5zZD10aGlzLnFvPXRoaXMueGI9dGhpcy5KYj0hMTt0aGlzLnZjPVtdO3RoaXMubGM9e307dGhpcy5SbT0yMDA7dGhpcy5RZj10aGlzLldjPXRoaXMucmU9dGhpcy5QZj10aGlzLm1mPSExO3RoaXMuY2Y9e319Yy5haj1hO2EucHJvdG90eXBlPXt4bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGc9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoZz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBnfSxoaTpmdW5jdGlvbigpeyJwcmVyb2xsIj09ZS5HYiYmZS50cmFjaygic3RhdHNfaGRfYWN0aXZlIix0aGlzLldhKCksITApO3RoaXMuVW4oKTtlLm8oay5yayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxXZTpmdW5jdGlvbihhLGcsZCxjKXt0aGlzLnhiPQpkO3ZhciBoPSExO2MmJmMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJihoPSEwKTtpZih0aGlzLkIuUyl0aGlzLkJmKyssZS5wYigibmV3U21hbGxBZElkIiksdGhpcy5CLlFrKCksYz1tLmdldENvbmZpZygpLGUueGUmJih0aGlzLkIueW4oe2FkdGFncGFyYW1ldGVyOiImc3ZtLWRhdD0xIn0pLGUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJjYWxsIiwhMCkpLHRoaXMuQi5IYSYmdGhpcy5CLmlzRW5hYmxlZD8odGhpcy5oaSgpLG5ldyBSKHRoaXMsYSx0aGlzLnZoLHtmaXJzdENhbGw6ITAsdXNlQWRUYWdQYXJhbWV0ZXI6ITAsa2VlcFVSTDpnLGJpdHJhdGU6Yy5PYSxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuQi5WYixob21hZF9yZXBsYWNlX3VybHNfaW5fdGFnczpoLGNvbnRlbnRWaWRlbzp7ZHVyYXRpb246dGhpcy5hLmMuZ2V0RHVyYXRpb24oKSxjdXJyZW50VGltZTp0aGlzLmEuYy5nZXRDdXJyZW50VGltZSgpfX0pKTpnPyh0aGlzLmhpKCksCm5ldyBSKHRoaXMsYSx0aGlzLnZoLHtmaXJzdENhbGw6ITAsdnBhaWQ6dGhpcy5CLlZiLHVzZUFkVGFnUGFyYW1ldGVyOiEwLGJpdHJhdGU6Yy5PYSxrZWVwVVJMOiEwLGhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzOmgsY29udGVudFZpZGVvOntkdXJhdGlvbjp0aGlzLmEuYy5nZXREdXJhdGlvbigpLGN1cnJlbnRUaW1lOnRoaXMuYS5jLmdldEN1cnJlbnRUaW1lKCl9fSkpOnRoaXMuUGEoKTtlbHNle3ZhciBrPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2suV2UoYSxnLGQpfSw1MCl9fSxoZjpmdW5jdGlvbihhKXthLllhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJhZCIsITApO3RoaXMuVmQ9dGhpcy5VYj10aGlzLnNkPSExO3RoaXMuYj1hO3RoaXMuTm4odGhpcy5iKTt0aGlzLmFoKGEpO3RoaXMudmM9dGhpcy5SZyhhKTt0aGlzLlZrKCl9LGFoOmZ1bmN0aW9uKGIpe2ImJihiLm9yaWdpbiYmKGI9Yi5vcmlnaW4pLGIucGFyZW50JiZiLnBhcmVudCBpbnN0YW5jZW9mCmEmJih0aGlzLktkPXRoaXMuT2woYikpLHRoaXMuYWgoYi5wYXJlbnQpKX0sUmc6ZnVuY3Rpb24oYil7dmFyIGM9W107YiYmKGIub3JpZ2luJiYoYj1iLm9yaWdpbiksIWJ8fCFiLnBhcmVudHx8Yi5wYXJlbnQgaW5zdGFuY2VvZiBhfHwoYz10aGlzLlJnKGIucGFyZW50KSksYy5wdXNoKHRoaXMueGwoYikpKTtyZXR1cm4gY30seGw6ZnVuY3Rpb24oYSl7dmFyIGM9IiIsZD1bXTtpZihhJiZhLkomJmEuSi5nZXRBdHRyaWJ1dGUpe2M9YS5KLmdldEF0dHJpYnV0ZSgiaWQiKTthPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTtmb3IodmFyIGY9MDtmPGEubGVuZ3RoO2YrKylkLnB1c2goYVtmXS5nZXRBdHRyaWJ1dGUoImlkIikpOzE9PWQubGVuZ3RoJiYoZD1kWzBdKX1yZXR1cm57YWRJRDpjLGNyZWF0aXZlSUQ6ZH19LE9sOmZ1bmN0aW9uKGEpe3ZhciBjPVtdLGQ9W10sZj1bXSxlPVtdLGg9IiI7aWYoYS5KKXtjPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSW1wcmVzc2lvbiIpOwpmPWEuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ3JlYXRpdmUiKTthLkouZ2V0QXR0cmlidXRlKCJpZCIpJiYoaD1hLkouZ2V0QXR0cmlidXRlKCJpZCIpLGUucHVzaChoKSk7YS5KLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1hLkouZ2V0QXR0cmlidXRlKCJhZElEIiksZS5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGYubGVuZ3RoO2srKylmW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZltrXS5nZXRBdHRyaWJ1dGUoImlkIiksZS5wdXNoKGgpKSxmW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1mW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGUucHVzaChoKSk7Zm9yKGs9MDtrPGMubGVuZ3RoO2srKylkLnB1c2goYS5sYihjW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmQsYWRJZHM6ZSxhZElkOmh9fSxxYTpmdW5jdGlvbihhKXthLllhJiZlLnRyYWNrKCJzdGF0c19oZF93cmFwcGVyc2MiLCJub2FkIiwhMCk7dmFyIGM9MDthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJgooYz1hLmVycm9yLmRldGFpbC5jb2RlKSxhLnBkJiZhLnBkLmVycm9yJiZhLnBkLmVycm9yLmNvZGUmJihjPWEucGQuZXJyb3IuY29kZSkpO3N3aXRjaChhLmVycm9yLmNvZGUpe2Nhc2Ugdy5ZYy5jb2RlOmM9PUQuY2UuY29kZT9lLm8oay5abyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpOihlLlhlKCksYz09RC5VZi5jb2RlJiZlLm8oay5MbSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKTtlLm8oay5rbCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVm4oKTt0aGlzLlVhKCJlbXB0eSIpO3RoaXMuQi5BYiYmZS50cmFjaygic3RhdHNfaGRfY29va2llYnlwYXNzX2VtcHR5Iix0aGlzLkFiLCEwKTticmVhaztjYXNlIHcuU2YuY29kZTplLm8oay5Gbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuVWEoInZhc3Rsb2FkZmFpbGVkIik7YnJlYWs7Y2FzZSB3LlZmLmNvZGU6ZS5vKGsuJG8sCnRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgid3JhcHBlcmxpbWl0Iik7YnJlYWs7Y2FzZSB3LmVlLmNvZGU6ZS5vKGsuYnAsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlVhKCJ4bWxwYXJzZSIpO2JyZWFrO2Nhc2Ugdy4kZC5jb2RlOmUubyhrLk1tLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgibm9tZWRpYSIpO2JyZWFrO2Nhc2Ugdy5YZC5jb2RlOmUubyhrLkJvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgiZHVtbXlhZCIpO2JyZWFrO2Nhc2Ugdy5SZi5jb2RlOmUubyhrLkNvLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7dGhpcy5VYSgiZHVyYXRpb24iKTticmVhaztkZWZhdWx0OnRoaXMuVWEoInVua25vd24iKX10aGlzLmZjKGEpO3RoaXMuUGEoKX0sZmM6ZnVuY3Rpb24oYSl7dmFyIGM9CjkwMDthJiZhLmVycm9yJiZhLmVycm9yLmNvZGUmJihjPWEuZXJyb3IuY29kZSw5MDE8YyYmKGM9OTAwKSk7Zm9yKGM9eyJbRVJST1JDT0RFXSI6Y307YS5NYS5sZW5ndGg7KXRyeXt2YXIgZD1hLk1hLnBvcCgpO3RoaXMuVmUoZC51cmwsZC50eXBlLGMpfWNhdGNoKGYpe319LE5uOmZ1bmN0aW9uKGEpe3RoaXMudmU9ITE7dGhpcy5nYj10aGlzLmEuSTt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLnhmKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dmFyIGM9OTk5OTt0aGlzLmNvbmYuekluZGV4JiYoYz10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMuZ2IuekluZGV4PWM7Yz10aGlzLmEuQTt0cnl7dmFyIGQ9dGhpcy5hLmMuZ2V0UmF3UGxheWVyKCksZj0iIjtkJiZkLmVudnZhcnMmJihmPWQuZW52dmFycygpKTtmLnZpZGVvU2xvdHx8KGQ9dGhpcy5hLmMpJiZkLmdldEVudmlyb25tZW50VmFyaWFibGVzJiYoZj1kLmdldEVudmlyb25tZW50VmFyaWFibGVzKCkpOwpmLnZpZGVvU2xvdCYmKGM9Zi52aWRlb1Nsb3QsdGhpcy5tZj0hMCl9Y2F0Y2goaCl7fWMuY3E9ImF1dG8iO3RoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSYmKGMuc3R5bGUucG9zaXRpb249dGhpcy5jb25mWyJ2aWRlby5zdHlsZS5wb3NpdGlvbiJdKTt0aGlzLmNvbmZbInZpZGVvLnN0eWxlIl0mJihjLnN0eWxlPXRoaXMuY29uZlsidmlkZW8uc3R5bGUiXSk7aWYodGhpcy5jb25mWyJ2aWRlby5hdHRyaWJ1dGVzIl0pZm9yKHZhciBrIGluIHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdKXRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdLmhhc093blByb3BlcnR5KGspJiZjLnNldEF0dHJpYnV0ZShrLHRoaXMuY29uZlsidmlkZW8uYXR0cmlidXRlcyJdW2tdKTt0aGlzLkFrJiZ0aGlzLnBsYXllci5DZSgpJiYoYy52b2x1bWU9dGhpcy5wbGF5ZXIuQ2UoKS8xMDApO2Zvcig7Yy5maXJzdENoaWxkOyljLnJlbW92ZUNoaWxkKGMuZmlyc3RDaGlsZCk7Zm9yKGQ9MDtkPAphLk0ubGVuZ3RoO2QrKyljLmNhblBsYXlUeXBlKGEuTVtkXS50eXBlKSYmdGhpcy52ayhjLGEuTVtkXS51cmwrIiIsYS5NW2RdLnR5cGUpO3RoaXMubWYmJmMubG9hZCgpO2lmKHRoaXMuZGkoYykpe3RoaXMuVmgoInNldHVwIix0aGlzLldhKCkpO3RoaXMueWsoYyk7YT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuaGVpZ2h0PSIxMDAlIik7dGhpcy5yYT10aGlzLmdiLmFwcGVuZENoaWxkKGEpO3RyeXt0aGlzLm1mP3RoaXMudmlkZW89Yzp0aGlzLnZpZGVvPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyl9Y2F0Y2gobCl7dGhpcy52aWRlbz1jfX1lbHNlIHRoaXMuYi5XaygpPyhhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl0/CmEuc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5yYT10aGlzLmdiLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5yYS5hcHBlbmRDaGlsZChjKSx0aGlzLkxuKCkpOnRoaXMuYi5vcmlnaW4uSGcody4kZCl9LExuOmZ1bmN0aW9uKCl7dGhpcy5QZj0hMDt0aGlzLnViPXRoaXMucWM9ITE7dGhpcy5hLmMuc2EmJnRoaXMuYS5jLnNhKCkmJihlLm8oay55Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMudWI9ITApO2UudWUoKTt0aGlzLmImJnRoaXMuYi5vcmlnaW4mJnRoaXMuYi5vcmlnaW4ubWEmJmUuemsodGhpcy5iLm9yaWdpbi5tYSk7dGhpcy5WaCgic2V0dXAiLHRoaXMuV2EoKSk7dmFyIGE9dGhpcy5hLkE7dGhpcy5hLkE9Qi5wb3AoKTthLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHRoaXMuYS5BLGEpO3RoaXMuYS5FaCgpO3RoaXMuYS55ZigpO2ZvcihhPQp0aGlzLmEuSTthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTthLnBhcmVudHx8dGhpcy5hLnlmKCk7dGhpcy5nYj10aGlzLmEuSTt0aGlzLmNvbmZbImNvbnRhaW5lci5zdHlsZSJdJiZlLnhmKHRoaXMuZ2IsdGhpcy5jb25mWyJjb250YWluZXIuc3R5bGUiXSk7dGhpcy5yYT10aGlzLmEuSTt0aGlzLm5pKCJ2cGFpZCIpO2lmKHRoaXMudWIpe2lmKGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYikpYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbjt0aGlzLnRyYWNrKCJtdXRlIiwhMCk7dGhpcy5OYigibXV0ZWQiLCJjb250ZW50Iik7ZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX10aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7dGhpcy5DLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoInNjcm9sbGluZyIsCiJubyIpO3RoaXMuQy5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLkMuc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7dGhpcy5hLkkuYXBwZW5kQ2hpbGQodGhpcy5DKTt0aGlzLmNvbmZbInZwYWlkSWZyYW1lLnN0eWxlIl0mJmUueGYodGhpcy5DLHRoaXMuY29uZlsidnBhaWRJZnJhbWUuc3R5bGUiXSk7dGhpcy5DLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoYT0hMCk7dmFyIGI9dGhpcy5iLlJsKCksYz10aGlzLmIudS5PcmlnaW5hbEFkUGFyYW1ldGVycyxoPXtob21hZDpKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG0uZ2V0Q29uZmlnKCkpKSx2cGFpZDp7dXJsOmIudXJsLHZpZXdtb2RlOiJub3JtYWwiLGRlc2lyZWRCaXRyYXRlOmIuZGVzaXJlZEJpdHJhdGV8fApiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmEuSS5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuYS5JLnN0eWxlLmhlaWdodCl9fSxjb250ZW50UGxheWVyOnttdXRlZDphfX07ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDUwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSw3MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsCiJjb25maWciLGgpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlhKHRoaXMuQywiY29uZmlnIixoKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5pYSh0aGlzLkMsImNvbmZpZyIsaCl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2UuaWEodGhpcy5DLCJjb25maWciLGgpfS5iaW5kKHRoaXMpLDVFMyl9LmJpbmQodGhpcyk7YT1lLm1nKCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9pZnJhbWUuaHRtbCIsdGhpcy5CKTt0aGlzLkMuc3JjPWE7ZS5wZSgidnBhaWRldmVudCIsZnVuY3Rpb24oYSl7dGhpcy5hLmMud2EmJiF0aGlzLkxkJiZ0aGlzLmEuYy53YSgpJiZlLm8oay5CYywKdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTsiQWRTaXplQ2hhbmdlIiE9YS5kYXRhLm5hbWUmJiJBZFJlbWFpbmluZ1RpbWVDaGFuZ2UiIT1bImRhdGEiXS5uYW1lJiZ0aGlzLmEuaGMoITApO2lmKGEmJmEuZGF0YSYmYS5kYXRhLm5hbWUpe3RoaXMudmM9YS5kYXRhLm9yaWdpbmFsZXZlbnQuYWRJRHM7IkFkRXJyb3IiPT1hLmRhdGEubmFtZSYmdGhpcy5ObyhhKTtpZigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJih0aGlzLk9vKCksdGhpcy5hLmhjKCEwKSwhdGhpcy5VYikpe3ZhciBiPTJFMyxjPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihiPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5VYj17ZWw6dGhpcy5DLApjYjpmdW5jdGlvbigpe3RoaXMuVmQ9ITA7ZS5vKGsucmksdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpiLHBlcmNlbnQ6YyxzdGFydFRpbWU6ITF9O2UuUGUodGhpcy5VYil9IkFkU3RhcnRlZCI9PWEuZGF0YS5uYW1lJiYodGhpcy5hLmhjKCEwKSx0aGlzLlNvKCkpOyJBZFZpZGVvU3RhcnQiPT1hLmRhdGEubmFtZSYmKHRoaXMuYS5oYyghMCksdGhpcy5XbygpKTsiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5VbygpOyJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5WbygpOyJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlhvKCk7IkFkVmlkZW9Db21wbGV0ZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLlRvKCk7IkFkU3RvcHBlZCI9PWEuZGF0YS5uYW1lJiZ0aGlzLnNpKCk7aWYoIkFkQ2xpY2tUaHJ1Ij09YS5kYXRhLm5hbWUpe3ZhciBoPQphLmRhdGEuY2xpY2tUaHJ1VGFyZ2V0O2h8fChoPXRoaXMuYi5kYyk7aWYoIWgpcmV0dXJuO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTtlLm8oay54Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9Il90b3AiO3RyeXtpZih0aGlzLkIuemN8fHRoaXMuV2MpYT0iX2JsYW5rIjt2YXIgYj13aW5kb3cub3BlbigiIixhKTtiLmRvY3VtZW50LmJvZHkuaW5uZXJIVE1MPSI8ZGl2PjwvZGl2PiI7Yi5kb2N1bWVudC5sb2NhdGlvbi5ocmVmPWh9Y2F0Y2goYyl7d2luZG93Lm9wZW4oaCxhKX19LmJpbmQodGhpcyksNTAwKX0iQWRTa2lwcGVkIj09YS5kYXRhLm5hbWUmJnRoaXMuUm8oKTsiQWRSZW1haW5pbmdUaW1lQ2hhbmdlIj09YS5kYXRhLm5hbWUmJmUubyhrLmxlLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7IkFkUGF1c2VkIj09YS5kYXRhLm5hbWUmJnRoaXMuUG8oKTsKIkFkUGxheWluZyI9PWEuZGF0YS5uYW1lJiYodGhpcy5XYyYmKHRoaXMuUWY9ITEsdGhpcy5uYygpKSx0aGlzLlFvKCkpOyJBZFZvbHVtZUNoYW5nZSI9PWEuZGF0YS5uYW1lJiYoYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKSwwPT1hLmRhdGEub3JpZ2luYWxldmVudC52b2x1bWU/KHRoaXMudWI9ITAsYiYmKGIuaW5uZXJIVE1MPXRoaXMuY29uZi51bm11dGVCdXR0b24pLHRoaXMudHJhY2soIm11dGUiLCEwKSx0aGlzLk5iKCJtdXRlZCIsInVzZXIiKSxlLm8oay56ZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKToodGhpcy51Yj0hMSxiJiYoYi5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pLHRoaXMudHJhY2soInVubXV0ZSIsITApLHRoaXMuTmIoInVubXV0ZWQiLCJ1c2VyIiksZS5vKGsuSGYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksZS5vKGsubGUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLAp0aGlzLnMoKSkpfX0uYmluZCh0aGlzKSk7ZS5wZSgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5QYSgpfS5iaW5kKHRoaXMpKTtlLnBlKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuUGEoKX0uYmluZCh0aGlzKSk7dGhpcy5hLmpnKGZ1bmN0aW9uKGEpe2UuaWEodGhpcy5DLCJyZXNpemUiLGEpfS5iaW5kKHRoaXMpKX0sUG86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLnRyYWNrKCJwYXVzZSIpO2UubyhrLmplLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSk7YSYmKGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uKTt0aGlzLnFjPSEwfSxRbzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO2EmJihhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24pO3RoaXMudHJhY2soInJlc3VtZSIsITApO2UubyhrLmJkLHRoaXMuYi51LAp0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMucWM9ITF9LFNvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iik7ZS5vKGsuZ2csdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sUm86ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuZmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sT286ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJpbXByZXNzaW9uIik7dGhpcy5XaCgpO2UubyhrLmJnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFdvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygic3RhcnQiKTt0aGlzLlZhKCJzdGFydCIpO2UubyhrLmJkLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSl9LFVvOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO3RoaXMuc2Q9ITA7dGhpcy5WYSgiZmlyc3RRdWFydGlsZSIpO2UubyhrLlpmLAp0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxWbzpmdW5jdGlvbigpe3RoaXMudHJhY2soIm1pZHBvaW50Iik7dGhpcy5WYSgibWlkcG9pbnQiKTtlLm8oay5kZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpfSxYbzpmdW5jdGlvbigpe3RoaXMudHJhY2soInRoaXJkUXVhcnRpbGUiKTt0aGlzLlZhKCJ0aGlyZFF1YXJ0aWxlIik7ZS5vKGsuaGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKX0sVG86ZnVuY3Rpb24oKXt0aGlzLktmKCk7dGhpcy5WYSgiY29tcGxldGUiKX0sc2k6ZnVuY3Rpb24oYSl7aWYodGhpcy5DJiZ0aGlzLkMucGFyZW50Tm9kZSYmdGhpcy5DLnBhcmVudE5vZGUucGFyZW50Tm9kZSl7dGhpcy5VYSgidnBhaWRzdG9wcGVkIik7dmFyIGM9dGhpcy5DLnBhcmVudE5vZGU7dGhpcy5DLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5DKTtjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyk7CmUudWUoKTt0aGlzLkM9ITE7dGhpcy5QYShhKX19LE5vOmZ1bmN0aW9uKGEpe3ZhciBjPWEubWVzc2FnZXx8IiIsZD0vXGQrL2c7IWMmJmEuZGF0YSYmYS5kYXRhLm9yaWdpbmFsZXZlbnQmJmEuZGF0YS5vcmlnaW5hbGV2ZW50Lm1zZyYmKGM9YS5kYXRhLm9yaWdpbmFsZXZlbnQubXNnLGMubWF0Y2goZCkpO3RoaXMuVWEoInZwYWlkZXJyb3IiKTtlLm8oay5Zbyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3RoaXMuc2koITApfSx2azpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGQoYSxiKXtpZihiLkhhJiZiLmlzRW5hYmxlZCYmIWIuTGMoKSl7dmFyIGM9Yi50YShhKTtyZXR1cm4gYy5wcm90b2NvbCsiOi8vIitjLmhvc3R9cmV0dXJuIGF9aWYoYS5hcHBlbmRDaGlsZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic291cmNlIik7Zi5zcmM9ZChjLHRoaXMuQik7Zi5vbmVycm9yPXRoaXMuS28uYmluZCh0aGlzKTthLmFwcGVuZENoaWxkKGYpfWVsc2UgYS5zZXRBdHRyaWJ1dGUoInNyYyIsCmQoYyx0aGlzLkIpKX0sZGk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWU/MDxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzb3VyY2UiKS5sZW5ndGg6ITB9LHlrOmZ1bmN0aW9uKGEpe2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZHN0YXJ0Iix0aGlzLm9pLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZGVkbWV0YWRhdGEiLHRoaXMuTWYuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnBpLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuS2YuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5MZi5iaW5kKHRoaXMpKX0sRmQ6ZnVuY3Rpb24oYSl7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2Fkc3RhcnQiLHRoaXMub2kuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkZWRtZXRhZGF0YSIsdGhpcy5NZi5iaW5kKHRoaXMpKTsKYS5yZW1vdmVFdmVudExpc3RlbmVyKCJ0aW1ldXBkYXRlIix0aGlzLnBpLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZW5kZWQiLHRoaXMuS2YuYmluZCh0aGlzKSk7YS5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdGhpcy5MZi5iaW5kKHRoaXMpKX0sb2k6ZnVuY3Rpb24oYSl7dGhpcy5lY3x8KHRoaXMudmlkZW8uY29udHJvbHM9ITEsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVjfHx0aGlzLk1mKGEpfS5iaW5kKHRoaXMpLHRoaXMuQ2spKX0sTWY6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZ2QmJnRoaXMuZGkodGhpcy52aWRlbykmJiF0aGlzLkpiJiYhdGhpcy5lYyl7dGhpcy5nZD0hMDt0cnl7aWYoIWUuU2EoKSYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMuYi5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuSmJ8fCh0aGlzLkpiPSEwLHRoaXMuRmQodGhpcy52aWRlbyksZS50cmFjaygic3RhdHNfaGRfbm9vcHZpZGVvIiwKdGhpcy5XYSgpLCEwKSx0aGlzLkIuRmd8fHRoaXMuQi5kYSgidmlkZW8tbm9vcCIpKTt0aGlzLlBhKCk7cmV0dXJufX1jYXRjaChjKXtlLnRyYWNrKCJzdGF0c19oZF9ub29wdmlkZW9fZmFpbCIsdGhpcy5XYSgpLCEwKX10aGlzLkhvKCk7dGhpcy52aWRlby5jb250cm9scz0hMTt0aGlzLmEueWYoKTt0aGlzLkdvKCk7dGhpcy5uaSgpO3RoaXMubmcoKTt0aGlzLmEuRWgoKTt0aGlzLnZpZGVvLnBsYXkmJnRoaXMuQ2YoKX19LENmOmZ1bmN0aW9uKCl7dGhpcy5uZHx8dGhpcy4kZigpfSwkZjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnZpZGVvLnBsYXkoKTtpZihjJiZjWyJjYXRjaCJdKWNbImNhdGNoIl0oZnVuY3Rpb24oKXt0aGlzLm5kfHwoYT90aGlzLlBhKCk6KHRoaXMuYWYoITApLHRoaXMuJGYoITApKSl9LmJpbmQodGhpcykpO2JhPyh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5tYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwKdGhpcy5tYy5iaW5kKHRoaXMpKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5tYy5iaW5kKHRoaXMpKSk6ST1mdW5jdGlvbigpe3RoaXMubmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNmKCkpfS5iaW5kKHRoaXMpO3RoaXMuRWUoKS5TaCh0aGlzKX0sS2Y6ZnVuY3Rpb24oKXt0aGlzLkIuJGEmJiF0aGlzLkpiJiYoZS50cmFjaygicXVhcnRpbGUiLCJjb21wbGV0ZSIsITApLHRoaXMuVmEoImNvbXBsZXRlIikpO3RoaXMudHJhY2soImNvbXBsZXRlIik7ZS5vKGsucGssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLlBhKCl9LHNrOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxkPSExLGY9MDtmPGEubGVuZ3RoO2YrKylkPWUuV2coYVtmXSksYy5wdXNoKGQpO2E9e2hhc2hlczpjfTthPWsuUmEoYSx0aGlzLnMoKSk7ZS5TbihhKX0sUGE6ZnVuY3Rpb24oYSl7dGhpcy5iJiZ0aGlzLmIuV2QmJnRoaXMuc2sodGhpcy5iLldkKTsKaWYoIXRoaXMudmUpaWYodGhpcy52ZT0hMCx0aGlzLlZkfHwoZS5vKGsuT20sdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLnRyYWNrKCJub3R2aWV3YWJsZSIpKSx0aGlzLmIud2J8fHRoaXMuYi50Yyl7ZS5wYigibmV3U21hbGxBZElkIik7dGhpcy5CZisrO3RoaXMuZWM9dGhpcy5nZD0hMTt0cnl7dGhpcy5GZCh0aGlzLnZpZGVvKX1jYXRjaChjKXt9dHJ5e3RoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyl9Y2F0Y2goZCl7fXRyeXt0aGlzLmdiLnJlbW92ZUNoaWxkKHRoaXMucmEpfWNhdGNoKGYpe310aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsO3RoaXMuSmQ9ITE7dHJ5e3RoaXMuYS5saSgpfWNhdGNoKGgpe310aGlzLkxkPSEwO3RoaXMuYS5JZSgpO3RoaXMuamM9ITE7dGhpcy5FZSgpLk9oKCk7dGhpcy5iLndiJiZ0aGlzLmIub3JpZ2luLmJmKCk7dGhpcy5iLnRjJiYoYT90aGlzLmIub3JpZ2luLnloKCk6dGhpcy53ZSgpKX1lbHNlIHRoaXMud2UoKX0sCktvOmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpO3RoaXMudmlkZW8ubmV0d29ya1N0YXRlJiZ0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmKHRoaXMuRmQodGhpcy52aWRlbyksdGhpcy5MZihhKSl9LExmOmZ1bmN0aW9uKGEpe3RoaXMuZWM9ITA7YSYmYS50YXJnZXQmJmEudGFyZ2V0LmVycm9yJiZhLnRhcmdldC5lcnJvci5jb2RlfHx0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZT09dGhpcy52aWRlby5ORVRXT1JLX05PX1NPVVJDRSYmdGhpcy5CLk5rKCk7dGhpcy5iLm9yaWdpbi5IZyh3LiRkKX0scGk6ZnVuY3Rpb24oKXtpZih0aGlzLnFvKXRoaXMuUGEoKTtlbHNle3RoaXMuamM9ITA7dGhpcy5hLmMud2EmJiF0aGlzLkxkJiZ0aGlzLmEuYy53YSgpJiZlLm8oay5CYyx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpO3ZhciBhPU1hdGguZmxvb3IodGhpcy52aWRlby5jdXJyZW50VGltZSk7CnRoaXMudW8oYSk7aWYoIXRoaXMuVWIpe3ZhciBjPTJFMyxkPTUwO3RoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24mJih0aGlzLmNvbmYudmlld2FibGVJbXByZXNzaW9uLnBlcmNlbnQmJihkPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24ucGVyY2VudCksdGhpcy5jb25mLnZpZXdhYmxlSW1wcmVzc2lvbi50aW1lTVMmJihjPXRoaXMuY29uZi52aWV3YWJsZUltcHJlc3Npb24udGltZU1TKSk7dGhpcy5VYj17ZWw6dGhpcy52aWRlbyxjYjpmdW5jdGlvbigpe3RoaXMuVmQ9ITA7ZS5vKGsucmksdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLnRyYWNrKCJ2aWV3YWJsZSIpfS5iaW5kKHRoaXMpLHRpbWVNUzpjLHBlcmNlbnQ6ZCxzdGFydFRpbWU6ITF9O2UuUGUodGhpcy5VYil9ZD0iIjt0aGlzLmIuQWYmJihjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVWgpKSYmKGQ9dGhpcy5iLkFmLWEsMDxkP2Q9dGhpcy5jb25mLnNraXBhYmxlQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsCmQpOihkPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsZCksdGhpcy5KZHx8KHRoaXMuSmQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7ZS5vKGsuZmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTt0aGlzLmIud2I/KHRoaXMuZWM9dGhpcy5nZD0hMSx0aGlzLkZkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5nYi5yZW1vdmVDaGlsZCh0aGlzLnJhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuSmQ9ITEsdGhpcy5hLmxpKCksdGhpcy5iLm9yaWdpbi5iZigpKTp0aGlzLlBhKCl9LmJpbmQodGhpcykpKSksYy5pbm5lckhUTUw9ZCk7dGhpcy5jYXB0aW9uJiYodGhpcy5jYXB0aW9uLmlubmVySFRNTD10aGlzLmRkLnJlcGxhY2UoIlt0aW1lXSIsZS5RZyh0aGlzLmIuZHVyYXRpb24tYSkpKTt0aGlzLm5lPSEwOwp0aGlzLnZpZGVvLmNvbnRyb2xzPSExfX0saWk6ZnVuY3Rpb24oKXt0aGlzLkRofHwodGhpcy5EaD0hMCx0aGlzLnNkfHxlLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sdW86ZnVuY3Rpb24oYSl7ZS5vKGsubGUsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKTthPT10aGlzLmppfHx0aGlzLkpifHwoMD09YSYmKHRoaXMueGImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMueGIpLHRoaXMueGI9ITEpLHRoaXMudHJhY2soImltcHJlc3Npb24iKSx0aGlzLkIuQWImJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZWJ5cGFzc19pbXByZXNzaW9uIix0aGlzLkFiLCEwKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIixmdW5jdGlvbigpe3RoaXMuaWkoKX0uYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLmlpKCl9LmJpbmQodGhpcykpLHRoaXMuSmJ8fAp0aGlzLldoKCksdGhpcy50cmFjaygiY3JlYXRpdmVWaWV3IiksdGhpcy50cmFjaygic3RhcnQiKSx0aGlzLkIuJGEmJnRoaXMuVmEoInN0YXJ0IiksZS5vKGsuYmcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSxlLm8oay5nZyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKSxhPT1NYXRoLmZsb29yKHRoaXMuYi5kdXJhdGlvbi80KSYmKHRoaXMuQi4kYSYmKGUudHJhY2soInF1YXJ0aWxlIiwiZmlyc3RRdWFydGlsZSIsITApLHRoaXMuVmEoImZpcnN0UXVhcnRpbGUiKSx0aGlzLnNkPSEwKSx0aGlzLnRyYWNrKCJmaXJzdFF1YXJ0aWxlIiksZS5vKGsuWmYsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcih0aGlzLmIuZHVyYXRpb24vMikmJih0aGlzLkIuJGEmJihlLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy5WYSgibWlkcG9pbnQiKSksdGhpcy50cmFjaygibWlkcG9pbnQiKSwKZS5vKGsuZGcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSksYT09TWF0aC5mbG9vcigzKnRoaXMuYi5kdXJhdGlvbi80KSYmKHRoaXMuQi4kYSYmKGUudHJhY2soInF1YXJ0aWxlIiwidGhpcmRRdWFydGlsZSIsITApLHRoaXMuVmEoInRoaXJkUXVhcnRpbGUiKSksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGUubyhrLmhnLHRoaXMuYi51LHRoaXMuYS5jLmwoKSx0aGlzLnYoKSx0aGlzLnMoKSkpLHRoaXMuamk9YSl9LFZoOmZ1bmN0aW9uKGEsYyl7ZS50cmFjaygic3RhdHNfaGRfYWRfIithLGMsITApfSxVbjpmdW5jdGlvbigpe2UuUWQoWyJzdGF0c19oZF9hZF9jYWxsOiIrdGhpcy5XYSgpLCJzdGF0c19oZF9hZF9jYWxsX3N1bSJdKX0sV2g6ZnVuY3Rpb24oKXtlLlFkKFsic3RhdHNfaGRfYWRfaW1wcmVzc2lvbjoiK3RoaXMuV2EoKSwic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9zdW0iXSl9LFZuOmZ1bmN0aW9uKCl7ZS5RZChbInN0YXRzX2hkX2FkX2VtcHR5OiIrCnRoaXMuV2EoKSwic3RhdHNfaGRfYWRfZW1wdHlfc3VtIl0pfSxVYTpmdW5jdGlvbihhKXtlLlFkKFsic3RhdHNfaGRfYWRfZXJyb3I6IithLCJzdGF0c19oZF9hZF9lcnJvcl9zdW0iXSl9LFZhOmZ1bmN0aW9uKGEpeyh0aGlzLlBmfHx0aGlzLkIuJGEpJiZlLnRyYWNrKCJzdGF0c19oZF9hZF9xdWFydGlsZV8iK2EsdGhpcy5XYSgpLCEwKX0sTmI6ZnVuY3Rpb24oYSxjKXt0aGlzLkIuJGEmJmUudHJhY2soInN0YXRzX2hkXyIrYSxjLCEwKX0sdHJhY2s6ZnVuY3Rpb24oYSxjKXtpZighdGhpcy5KYil7dGhpcy5jZiYmdGhpcy5jZi50cmFjayYmdGhpcy5jZi50cmFjayhhKTsiaW1wcmVzc2lvbiI9PWEmJmUueGUmJmUudHJhY2soInN0YXRzX2hkX2Nvb2tpZW1vZGUiLCJpbXByZXNzaW9uIiwhMCk7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPQohMH12YXIgZD1bXTt0cnl7ZD10aGlzLlBsKHRoaXMuYi5NYSxhKX1jYXRjaChmKXtkPVtdfWZvcig7ZC5sZW5ndGg7KXRyeXt2YXIgaD1kLnBvcCgpOyJpbXByZXNzaW9uIj09YSYmKHRoaXMucmU9ITApOyJpbXByZXNzaW9uIj09YSYmdGhpcy5LZC5pbXByZXNzaW9ucyYmZS5pbShoLnVybCx0aGlzLktkLmltcHJlc3Npb25zKT90aGlzLlZlKGgudXJsLGgudHlwZSx7fSxmdW5jdGlvbihhKXt0cnl7dmFyIGI9YS5nZXRSZXNwb25zZUhlYWRlcigiWC1Ib21hZC1VcmwiKTtlLm8oay5xayx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCkse2FkSWQ6dGhpcy5LZC5hZElkLGltcHJlc3Npb25VUkw6Yn0sdGhpcy5zKCkpfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuVmUoaC51cmwsaC50eXBlKX1jYXRjaChsKXt9aWYoIWMpdHJ5e3RoaXMuYi5NYT10aGlzLmNsKHRoaXMuYi5NYSxhKX1jYXRjaChtKXt9fX0sV2E6ZnVuY3Rpb24oKXt2YXIgYT1lLlNhKCk/Im1vYmlsZSI6ImRlZmF1bHQiLApjPSIiO3RoaXMuUGYmJihjPSJfdnBhaWQiKTt0aGlzLldjJiYoYz0iX3dlbGVjdCIpO3JldHVybiBhK2N9LFZlOmZ1bmN0aW9uKGEsYyxkLGYsZSl7YSYmInN0cmluZyI9PXR5cGVvZiBhJiZhLmxlbmd0aCYmKGM9dGhpcy5CLnZhKGEpLGQmJmMudWsoZCksZnx8KGY9dGhpcy5FZyksZXx8KGU9dGhpcy5FZyksdGhpcy53ayhhKSx0aGlzLkIuSWEoYyxmdW5jdGlvbigpe3RoaXMuTmgoYSk7ZigpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5OaChhKTtlKCl9LmJpbmQodGhpcyksITEsITApKX0sd2s6ZnVuY3Rpb24oYSl7dGhpcy5sY1thXT0ib3BlbiJ9LE5oOmZ1bmN0aW9uKGEpe3RoaXMubGNbYV09ImNsb3NlZCJ9LFZrOmZ1bmN0aW9uKCl7dGhpcy5sYz17fX0sWG46ZnVuY3Rpb24oKXt2YXIgYT0wLGM7Zm9yKGMgaW4gdGhpcy5sYyl0aGlzLmxjLmhhc093blByb3BlcnR5KGMpJiYib3BlbiI9PXRoaXMubGNbY10mJmErKztyZXR1cm4gYX0sUGw6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09CmN9KX0sY2w6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZSE9PWN9KX0sSG86ZnVuY3Rpb24oKXt0aGlzLnZpZGVvLnN0eWxlJiYodGhpcy52aWRlby5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHRoaXMudmlkZW8ub25jbGljaz10aGlzLklvLmJpbmQodGhpcykpfSxJbzpmdW5jdGlvbigpe2UuU2EoKSYmIm5vbmUiPT09dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5P3RoaXMubmMoKTp0aGlzLmIuZGMmJihlLm8oay54Zyx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPSJfdG9wIjtpZih0aGlzLkIuemN8fHRoaXMuV2MpYT0iX2JsYW5rIjt0cnl7dmFyIGM9d2luZG93Lm9wZW4oIiIsYSk7Yy5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2MuZG9jdW1lbnQubG9jYXRpb24uaHJlZj0KdGhpcy5iLmRjfWNhdGNoKGQpe3dpbmRvdy5vcGVuKHRoaXMuYi5kYyxhKX19LmJpbmQodGhpcyksNTAwKSl9LEdvOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY2FwdGlvbil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJjYXB0aW9uLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXTooYS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0KImJvcmRlci1ib3giKTthLmlubmVySFRNTD10aGlzLmRkLnJlcGxhY2UoIlt0aW1lXSIsZS5RZygwKSk7dmFyIGM9dGhpcy5jb25mWyJjYXB0aW9uLmR1cmF0aW9uIl07dGhpcy5CLmpkJiYoYz10aGlzLkIuamQpO2MmJndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuRGIuYmluZCh0aGlzKSwxRTMqYyk7dGhpcy5jYXB0aW9uPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSl9fSxEYjpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5CLmpkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxIZDpmdW5jdGlvbigpeyh0aGlzLmNvbmZbImNhcHRpb24uZHVyYXRpb24iXXx8dGhpcy5CLmpkKSYmdGhpcy5jYXB0aW9uJiZ0aGlzLmNhcHRpb24uc3R5bGUmJih0aGlzLmNhcHRpb24uc3R5bGUuZGlzcGxheT0iYmxvY2siKX0sbmk6ZnVuY3Rpb24oYSl7aWYoIWUuRGYodGhpcy5jb250cm9scykpe3ZhciBjPQpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QuaWQ9dGhpcy4kazt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/ZC5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06KGQuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixkLnN0eWxlLndpZHRoPSIxMDAlIixkLnN0eWxlLmZvbnRGYW1pbHk9IkFyaWFsLCBWZXJkYW5hIixkLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixkLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixkLnN0eWxlLmJvdHRvbT0iMHB4IixkLnN0eWxlLnpJbmRleD0iMTAwMDAiKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5IZCgpfS5iaW5kKHRoaXMpKTtkLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3V0IixmdW5jdGlvbigpe3RoaXMuRWIoKTt0aGlzLkRiKCl9LmJpbmQodGhpcykpO3ZhciBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwp0aGlzLmNvbmZbInBsYXlQYXVzZS5zdHlsZSJdP2Yuc3R5bGU9dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXTooZi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6bGVmdCIpLGYuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixmLnN0eWxlWyJmbG9hdCJdPSJsZWZ0IixmLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO2YuaWQ9dGhpcy5LYjtmLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b247InZwYWlkIj09YT8oZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5maS5iaW5kKHRoaXMpKSxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmZpLmJpbmQodGhpcykpKTooZi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5laS5iaW5kKHRoaXMpKSxjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLmVpLmJpbmQodGhpcykpKTtmLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt0aGlzLm5jKCk7dGhpcy5IZCgpfS5iaW5kKHRoaXMpKTsKZi5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsZnVuY3Rpb24oKXt0aGlzLkViKCk7dGhpcy5EYigpfS5iaW5kKHRoaXMpKTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbIm11dGUuc3R5bGUiXT9oLnN0eWxlPXRoaXMuY29uZlsibXV0ZS5zdHlsZSJdOihoLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJmbG9hdDpyaWdodCIpLGguc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixoLnN0eWxlWyJmbG9hdCJdPSJyaWdodCIsaC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtoLmlkPXRoaXMuSWI7aC5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b247InZwYWlkIj09YT9oLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnNvLmJpbmQodGhpcykpOmguYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMucm8uYmluZCh0aGlzKSk7aC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dGhpcy5uYygpO3RoaXMuSGQoKX0uYmluZCh0aGlzKSk7CmguYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSk7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/bC5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXToobC5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixsLnN0eWxlLnRvcD0iLTUwcHgiLGwuc3R5bGUucmlnaHQ9IjBweCIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtsLmlkPXRoaXMuVWg7bC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2wuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9bC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7bC5pbm5lckhUTUw9IiI7ZC5hcHBlbmRDaGlsZChmKTt0aGlzLmIuQWYmJmQuYXBwZW5kQ2hpbGQobCk7ZC5hcHBlbmRDaGlsZChoKTtkLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2UuU2EoKXx8KHRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIixmdW5jdGlvbigpe3RoaXMubmMoKTt0aGlzLkhkKCl9LmJpbmQodGhpcykpLHRoaXMucmEuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dGhpcy5FYigpO3RoaXMuRGIoKX0uYmluZCh0aGlzKSkpO3RoaXMuY29udHJvbHM9dGhpcy5yYS5hcHBlbmRDaGlsZChkKTt0aGlzLmNvbmZbInJlc3VtZUNvbnRyb2wuc3R5bGUiXT9jLnN0eWxlPXRoaXMuY29uZlsicmVzdW1lQ29udHJvbC5zdHlsZSJdOihjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYy5zdHlsZS53aWR0aD0iMTAwJSIsYy5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsCmMuc3R5bGUuY29sb3I9IiNmZmZmZmYiLGMuc3R5bGUudGV4dEFsaWduPSJjZW50ZXIiLGMuc3R5bGUuYm90dG9tPSIwcHgiLGMuc3R5bGUuekluZGV4PSIxMDAwMCIsYy5zdHlsZS5kaXNwbGF5PSJub25lIixkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLGQub25lcnJvcj1mdW5jdGlvbigpe3RoaXMueGEmJih0aGlzLnhhLnN0eWxlLmJhY2tncm91bmQ9InVybCgnaHR0cHM6Ly9obWRhc3N0cy5zY2huZWV2b25tb3JnZW4uY29tL2ltZy9iaWdwbGF5MTkwNjA2LnBuZycpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIil9LmJpbmQodGhpcyksZC5zcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSGdBQUFCNENBWUFBQUE1WkRiU0FBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTVRRMUlEYzVMakUyTXpRNU9Td2dNakF4T0M4d09DOHhNeTB4TmpvME1Eb3lNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01Ua2dLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2T0Rnd01VWTVOa1kzUmpsQ01URkZPVGt3UmpnNVJUZ3pSRFU0T0RRME1qVWlJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZPRGd3TVVZNU56QTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEbzRPREF4UmprMlJEZEdPVUl4TVVVNU9UQkdPRGxGT0RORU5UZzRORFF5TlNJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRvNE9EQXhSamsyUlRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUHZWN29SSUFBQXlyU1VSQlZIamE3RjBKYkZUWEZiMkRiY0JBS1FHTXpXNldRRnBTS2lyV1FnZ3BVSUhiaEpLMHFnMUdrQWdvUXFsRTFRcXpTRWhJN0dEUzRyS0pGZ3pZMkdyQllJc0NqVkFOaENXaHhSVENXb1BManNHQU1hRUdZd3k5NTgzNzFqRE1qR2ZHZitiL1AvOGQ2V2p3T0JuL2Q4KzhlOSs5YjNQMDd0MmI5SVRENGZENXM3ZjNkRUEwZjI0YmZ1M0tiTXVNWStMbk41ak5tQTBsWHpDcm1OWE1TbVk1OHk2empIbWJXZkx5NVV2OC9GenZCK1RQcmZNOVQvOU52WXhDMXNWYlRIdzdCekM3NDk5c0hJamF0SjZmK3o4cDl0Zk1ZdVpYek5QTUMxWTBrcFVFUnE4Y3hoekJITXpzR2FLLzAxUXkwZTM5aTh3anpQM01BN0szSzRIcmlRVG0rOHlmTWQ5anhocjRMRDBsUDJFK1lSWXk4NWtGekZLekd0QmgwaGljeEp6QS9JRFp4T1Jmd2tvcGNoYnpiMmFMd1ExTVpDajB6c25NSW1tb1pBdUlTL0laOGF5NzViTlBOdGpUbUU1Z0dHTW1ScS9NRGN3K0ZoNzQ5WkZ0S0pGdGlyVzd3SjlLWXl5VjhUWlNrQ0RiVkNMYmFEdUJrNlE3eTRnd1lUMEpuU0hibW1TSFVUUWFuTTREaVhGa0wvU1I0NHB0ek4rR2M5UWR6aDQ4aVhtT2FUZHhYVEZPMm1CU0pBbjhMZVpXNWlaeWxnM3RqamVrTGJaSzIxamFSUTltZDV6TnI1MlZycThobGZtT2ZEMXN4Ujc4Sy9uZ1NsenZnRzIra0xheWxNQ2ZNZGNwL2Z6R09ta3pTd2k4blRsRGFSWXdaa2pibVRZR1J6SDNjOHdkcHJRS0doK1JjNlpxT0xQR1REMFlFK25IeURtZHAxQS92Q3R0MlZDWEhsemYyUXVIdzRHZWkzblN2a29iM2RCUDJuUWc2MU5qZEE4dVZPS0dCSDJsYlEyTndYbjhEWHRIYVJFeXdMWjV6QStONk1HL1o0NVZHb1FjWTZXdGd4djV0bW5USnBpNGkyVXJpNVR0dzRhQnpKdnNMWXZDNGFLL3ozL296OHJtWVFjV0VweGduZ3lsaThiUS9lL0sxb1poYjZEcFU2QUNZejR6WHRuWk1NUkxEVUlpY0FvNUt5MEt4dUlqcVlXdUFuK2J1Vm5aMWpUWUxEWFJUV0I4WUl5eXEya1E0MitIODBkZzdDZ1lvMnhxT295UjJ0UmI0STFHdGlJcUtvb2VQWHBFang4L3BnWU5HaWhaQTlRbUtpNHV6dGZ2c2RJZzFjZ1dWRlZWVWRldVhlbjU4K2RVWEZ4TUxWcTBFRUxydmNYRG9taEJ6aFdhSjRMcHdaZ2xXbVowQzY1ZXZVb1RKMDZrL1B4OEdqVnFGRjI2ZElsdTNib2xSQTdSUG1PcllRblRFWXpBdjJFMk4vcnBhMnBxcUtLaWdoSVRFeWt2TDQrMmJ0MUszYnAxbzNQbnp0SERodytGQzFlOTJQc0tHbTh1R3NKam9YWmpvNS8rd1lNSE5HTEVDQm80Y0tENHVWZXZYcFNhbWtyTm1qV2preWRQMHVYTGw4Vy9HelpzU0M5ZXZMQ3J5RERPY3VaTGYzdnd4LzdtV1VZZ05qYVcwdExTcUxDd2tLWk9uVXJsNWVYQ2RTTXUyM1FnQnEwbUJlS2kwNnpRcXM2ZE85UHExYXRwOSs3ZE5IcjBhTkdiYlJ5ZjAvd1ZlQ2p6VFN1MWJOQ2dRYlJqeHc3YXVIR2ppTTluejU2MVkzeCtVMnIzcXNCd2EyNzgxTU43aHRKZmpCOC9uZzRkT2tSTGxpd1I0cDQ1YzRhZVBuMWFtMWJaZ0s5cDU5NkRNV3EyOUNxTnhvMGIwOHlaTStuZ3dZTTBiZG8wdW52M3JwM2k4MWozek1lOXhUOG5heCt0VkF1a1ZXdldyS0c5ZS9mUzhPSERSWkhFQnZFNVdtcm8xVVVubTlYOUJJc2hRNGFJUWRqbXpadHI0ek5HM1ZwdmprQTNuZUxOUldOYjQvQkkvV29qUGg4NWNvUVdMRmhBMGRIUlFtZ3RQa2NZM3BQRmo5ZGM5SS9KWEtmdTZBNFVRK2JPblNzR1l0T25UNmQ3OSs2SitJd0NTUVFKSGVYYVVkMEZ0Z1VRbjVFLzc5bXpKMUx6NTFHZUJIN1hicFVCeE9kZHUzWlJWbGFXbUxHS29QcjJqOXdGeGdtdDNjaW1TRTVPcHNPSEQ5T2lSWXNvSmlhR3pwOC9MNllwTGV5MmEvWFVXakNBYkE3VXQyZlBuaTN5NXlsVHBvajRYRkpTWXVYOGVZQ3J3RDhnaGRyNHZHN2RPcEZhalJ3NTBzcnh1WTlySHZ5MldmTTZvNllBaHc0ZFNnVUZCYUsrcmNWbkxYKzJTRDc4dHBZSDQydlpVL1ZkejVnd1lZS0l6NHNYTHhhREx3aU4rR3lCZ1JnMGRVRGdkc3lPU2tyZjhYbldyRmtpUG1QK3VheXN6QXIxYldqYURpNDZrUmx0ZHBkakJxRFV1WDc5ZXRxM2IxOXRmZnZtelp1MXNkbGtOb09taVZvUFZnZ3dmMGFSWk11V0xXSlFkdUhDQlpFL203QTN0OE1UeFNuSmdnUFdoaDAvZnB6bXo1OHY2dHNRMm1UeE9RNEN0MVJTQlk5R2pSclJ2SG56UkgwYjg4OWFmZHNrOGJrbFluQXJGWHQxS0IxeEtyVjI3VnJodXJFSzFDVHh1UlcrWXMxVlA5UTNmNGJJMmRuWllsQjI4ZUpGSSt2YnpTRndJeVdML2hnM2JweVlmMTY0Y0tHb2J5TStQM3YyTE54Q040TEFhbHRvaU5Da1NST2FNMmVPS0pSTW5qeFp2SWRGQm1GRURBUitvYVFJTFpCS2JkaXdRU3cydUgvL3Z0aU9FeTVna1ZhVmtpQzBRSy9GQW9QdDI3Zlg3bzRNRTZvaDhETWxRZWlRbTV0THk1Y3ZwNktpSXNLWlpLMWF0UkpiWWNPRUtwU3pucGpkU0ZiY0M2eE5VR0JFM2JScFUrclJvNGRvUjNWMWRUZ2Y0eHYwNEllcW4rbUhhOWV1MGRLbFM4VXkzY3JLU3BFZm84cGwwTFJuQlFRdVU3TFVIMGlCVnF4WUlZb2ROMjdjb0E0ZE9naGlRR1hndHRaN0VQaU9rcWQrd0tiMDlQUjBPblhxRkxWdTNWcTRZNGdhenRHeUY1UWlCdDlTRWdVZloxSEl3UFFoY3Q3dTNidUw5MDBncklaYjZNRlh5SGxmZmJTU3pEOWN1WEpGREtBd1hZZ1VxRXVYTGtiR1dXK0FwbGNoNmsyTURjaTUxRktoamppN2N1VktXclZxRmQyK2ZWdkVXUFJjZytPc04xeUh0bHJHL1I4bG4yOWc4Z0RuaEdCcExZUkduTVZVb1luY3NUc3VJc1BVTHVVNFN5N2JIVlFlN0RtZnhkNWp4Rms4VHhpTEZjRUNtdGJHM1JPcWo3NEtuTStseGRrblQ1NkllcklKNDZ3dm5IQVYrQ3NscVJNWU5DSE9vbmFNQmUvdDI3YzNjNXoxaGVPdUFwZXcyN2xNTnQ2ZkJHemJ0azFVb1U2ZlBrMHRXN1lVN2hpaVdzQWR1NlBFNFhCY0ZnSzd4TGVEZGhYNDZOR2pJcDlGbk1YQUNTc3hZQmNURDZEcXdnRk5WOWZjOTNQbUozWVM5dnIxNnlMT2J0cTBTYmhtbkx0bHNUanJEWjlyLzNEdHdYZ1RYMW5UN2NuUWV4UU5sN3RzMlRMS3lNaWcwdEpTU2toSUVETStKaWt2MWhjMXJnSzd6anlYa3c1WHFaa2RPVGs1MUxkdlg3RzZBcU5qdUdPa1B4QTJRbzRvTHBSYXZ1YWlnVnptaUVnVTFyVnVqRVZ3S0MrS3I3djFleXg1MEpDOENmeFhjdDVHSFRGMWFlU3pPRmtuTXpOVHVPWk9uVHBGU3B6MUdIMmtobDRGZnNUY3lmeUYxVnVxemMraWJuem56cDNhT0d2QmZEWVE3Sklha3FjWXJPR1BWbThsNnNiOSt2VVRjUmFqWTljNEcrSEljSC9Ea3lzK3hDd21pNTA0Q3h3N2RreTRZK1N6aUxOWUxtUHhmRFlRRkV2dDZoUVlXTXI4azFWYWhuVlFPQ0ZIcXh0SGVKejFCby8zYTNpNzRqMlRtVTRtUHZVZHdGWk5iWDRXK1d4OGZEeTFiZHMyVXZMWlFGREIzT1RwRncxOEpNc0xUSjBMNU9aUy8vNzl4ZFlRYmZWaWhPV3pnV0MrMU14dmdZSFAzRWRrUnNIVjFXSkRWMUpTRXFXa3BJZ0R5NURQWW1MQVpqM1dGVmoyN1BXR2NGLzVMaXcyVStiRmhxSmp4NDVpTkR4anhneHhyQkVXaitNOUc4WlpUNWhGSG01YjBlREFnS1FPL0plWmFOVFR3LzNpVGdaczJzS3NENjRCd2pVNk51NnhycmhhbHpiK0NJenpoLzloVkF2UVN6R0FBakNJUW85VjE5clZBb2VPK3B3LzhHZWJHejRnMzZnV29MeUl4ZVNnVFFkUTNwQlBma3dPK2J1UGNTS3pXdG5VTklBV2svenlnSDcyaUFvcDhqWmxXMU5nRXZtNWFUQ1FuY2c1ekR4bFc4T1JGMGhIQzNTcmVRcXB6V3BHNG83VXdQOUJhb0IvNEJtNzlOSDhXcVJzYlFpU0hBNUhRQ2N5UkRWdkh2QXhXY2hac0NQeGZXWHZzR0lxT2EvOHBWQUxUTElINDU2bGdjcnVZY0VmbUl1QytSL3JjOXdMYnAzZXFXd2ZjdXdrSHpkOGgxSmc0RVBtRjBxRGtPR3d0REVaSlRDQVV1YS9sQmE2QTV2SGh0WDNRL1FRR0ZYL3djeC9LazEwQTJ6NVEvSXl4eHR1Z1VYNnhCeEV6djFOQ3ZYRFFXbExYUTZvQzNZVTdRbWNJci9NNU5mdk1uc3BuWUxDWDVnLzVWeFh0eG1WVUJ5YStFdHlydWRTQ0F6cDBuYTZJbFNuWXY1T0p1WUsvbUdxdEpudUNPVVdsUTNzc3I4bTUxNlp6a3BEajhDS2pHUjJ5VitHNmcrRStseGJQUGozbU5sS3k5ZVFMVzN6WlNqL1NEZ09MdjZHbWNyOG1GeTJOZG9ZNWRJV3FkSTJaSFdCTldUSzBYV09qY1hOa1RiSUROY2YxRE5OOGdlUE9TN3ZJR2ZsNnp2TXRqWVI5dDlNWE5xd2hPUHRZL2RmdWw5YnErYzF0a2JkM0lScEw5eFovR3R5VGo5R0trcGxHL3RRRUZOOVZoWllBN2FxNG1TZnRBZ1R1bFMycVJzWnZCM1hnUU0xOVlMN0FqNVBDL3A4TFBLTDVkK041OWZwOGh0dlJaeGtybVVYbThXdkhxOUs4T1IrUSttaXpTU3c2KzkrSWtlWkh6Q2JtRnpVU21ZQk0wdHp3NzRFVWdLL2lnUXA4aGh5VGt2R21rUlU5RTV0UTBDQmUzaFJBdnN2c0NzdzRoNUd6bE9BTUQwWjdtdnBjVHp2RWVaKzVnSG03VUJFVkFKVHdBZWV2Y1hzVGM1MVlUaExIMVdoTmpxNGRMamN1MHlVV1MrUnM5SjBtbm5CYjZNcWdYVVIyQjNSVXVDdXNyZmo0dXQ0Wmd0bU0zSmV3cW5kMDRpdEg3anhEVGtwZGdoZ3ZYR1o3SlVsVXVDZ1R5QTFrOEQvRjJBQUU4YkJqOGQ0ZEM0QUFBQUFTVVZPUks1Q1lJST0iLApjLnN0eWxlLmJhY2tncm91bmQ9InVybCgnZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFIZ0FBQUI0Q0FZQUFBQTVaRGJTQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVFExSURjNUxqRTJNelE1T1N3Z01qQXhPQzh3T0M4eE15MHhOam8wTURveU1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRrZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZPRGd3TVVZNU5rWTNSamxDTVRGRk9Ua3dSamc1UlRnelJEVTRPRFEwTWpVaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNk9EZ3dNVVk1TnpBM1JqbENNVEZGT1Rrd1JqZzVSVGd6UkRVNE9EUTBNalVpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRvNE9EQXhSamsyUkRkR09VSXhNVVU1T1RCR09EbEZPRE5FTlRnNE5EUXlOU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRG80T0RBeFJqazJSVGRHT1VJeE1VVTVPVEJHT0RsRk9ETkVOVGc0TkRReU5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QdlY3b1JJQUFBeXJTVVJCVkhqYTdGMEpiRlRYRmIyRGJjQkFLUUdNelc2V1FGcFNLaXJXUWdncFVJSGJoSkswcWcxR2tBZ29RcWxFMVFxelNFaEk3R0RTNHJLSkZnelkyR3JCWUlzQ2pWQU5oQ1doeFJUQ1dvUExqc0dBTWFFR1l3eTk1ODM3MWpETWpHZkdmK2IvUC84ZDZXandPQm4vZDgrOGU5KzliM1AwN3QyYjlJVEQ0ZkQ1czdmM2RFQTBmMjRiZnUzS2JNdU1ZK0xuTjVqTm1BMGxYekNybU5YTVNtWTU4eTZ6akhtYldmTHk1VXY4L0Z6dkIrVFByZk05VC85TnZZeEMxc1ZiVEh3N0J6Qzc0OTlzSElqYXRKNmYrejhwOXRmTVl1Wlh6TlBNQzFZMGtwVUVScThjeGh6QkhNenNHYUsvMDFReTBlMzlpOHdqelAzTUE3SzNLNEhyaVFUbSs4eWZNZDlqeGhyNExEMGxQMkUrWVJZeTg1a0Z6Rkt6R3RCaDBoaWN4SnpBL0lEWnhPUmZ3a29wY2hiemIyYUx3UTFNWkNqMHpzbk1JbW1vWkF1SVMvSVo4YXk3NWJOUE50alRtRTVnR0dNbVJxL01EY3crRmg3NDlaRnRLSkZ0aXJXN3dKOUtZeXlWOFRaU2tDRGJWQ0xiYUR1Qms2UTd5NGd3WVQwSm5TSGJtbVNIVVRRYW5NNERpWEZrTC9TUjQ0cHR6TitHYzlRZHpoNDhpWG1PYVRkeFhURk8ybUJTSkFuOExlWlc1aVp5bGczdGpqZWtMYlpLMjFqYVJROW1kNXpOcjUyVnJxOGhsZm1PZkQxc3hSNzhLL25nU2x6dmdHMitrTGF5bE1DZk1kY3AvZnpHT21relN3aThuVGxEYVJZd1pramJtVFlHUnpIM2M4d2RwclFLR2grUmM2WnFPTFBHVEQwWUUrbkh5RG1kcDFBL3ZDdHQyVkNYSGx6ZjJRdUh3NEdlaTNuU3Zrb2IzZEJQMm5RZzYxTmpkQTh1Vk9LR0JIMmxiUTJOd1huOERYdEhhUkV5d0xaNXpBK042TUcvWjQ1VkdvUWNZNld0Z3h2NXRtblRKcGk0aTJVcmk1VHR3NGFCekp2c0xZdkM0YUsvejMvb3o4cm1ZUWNXRXB4Z25neWxpOGJRL2UvSzFvWmhiNkRwVTZBQ1l6NHpYdG5aTU1STERVSWljQW81S3kwS3h1SWpxWVd1QW4rYnVWbloxalRZTERYUlRXQjhZSXl5cTJrUTQyK0g4MGRnN0NnWW8yeHFPb3lSMnRSYjRJMUd0aUlxS29vZVBYcEVqeDgvcGdZTkdpaFpBOVFtS2k0dXp0ZnZzZElnMWNnV1ZGVlZVZGV1WGVuNTgrZFVYRnhNTFZxMEVFTHJ2Y1hEb21oQnpoV2FKNExwd1pnbFdtWjBDNjVldlVvVEowNmsvUHg4R2pWcUZGMjZkSWx1M2JvbFJBN1JQbU9yWVFuVEVZekF2MkUyTi9ycGEycHFxS0tpZ2hJVEV5a3ZMNCsyYnQxSzNicDFvM1BuenRIRGh3K0ZDMWU5MlBzS0dtOHVHc0pqb1haam81Lyt3WU1ITkdMRUNCbzRjS0Q0dVZldlhwU2Fta3JObWpXamt5ZFAwdVhMbDhXL0d6WnNTQzlldkxDcnlERE9jdVpMZjN2d3gvN21XVVlnTmphVzB0TFNxTEN3a0taT25Vcmw1ZVhDZFNNdTIzUWdCcTBtQmVLaTA2elFxczZkTzlQcTFhdHA5KzdkTkhyMGFOR2JiUnlmMC93VmVDanpUU3UxYk5DZ1FiUmp4dzdhdUhHamlNOW56NTYxWTN4K1UycjNxc0J3YTI3ODFNTjdodEpmakI4L25nNGRPa1JMbGl3UjRwNDVjNGFlUG4xYW0xYlpnSzlwNTk2RE1XcTI5Q3FOeG8wYjA4eVpNK25nd1lNMGJkbzB1bnYzcnAzaTgxajN6TWU5eFQ4bmF4K3RWQXVrVld2V3JLRzllL2ZTOE9IRFJaSEVCdkU1V21ybzFVVW5tOVg5QklzaFE0YUlRZGptelp0cjR6TkczVnB2amtBM25lTE5SV05iNC9CSS9Xb2pQaDg1Y29RV0xGaEEwZEhSUW1ndFBrY1kzcFBGajlkYzlJL0pYS2Z1NkE0VVErYk9uU3NHWXRPblQ2ZDc5KzZKK0l3Q1NRUUpIZVhhVWQwRnRnVVFuNUUvNzltekoxTHo1MUdlQkg3WGJwVUJ4T2RkdTNaUlZsYVdtTEdLb1ByMmo5d0Z4Z210M2NpbVNFNU9wc09IRDlPaVJZc29KaWFHenA4L0w2WXBMZXkyYS9YVVdqQ0FiQTdVdDJmUG5pM3k1eWxUcG9qNFhGSlNZdVg4ZVlDcndEOGdoZHI0dkc3ZE9wRmFqUnc1MHNyeHVZOXJIdnkyV2ZNNm82WUFodzRkU2dVRkJhSytyY1ZuTFgrMlNENzh0cFlINDJ2WlUvVmR6NWd3WVlLSXo0c1hMeGFETHdpTitHeUJnUmcwZFVEZ2RzeU9Ta3JmOFhuV3JGa2lQbVArdWF5c3pBcjFiV2phRGk0NmtSbHRkcGRqQnFEVXVYNzlldHEzYjE5dGZmdm16WnUxc2Rsa05vT21pVm9QVmdnd2YwYVJaTXVXTFdKUWR1SENCWkUvbTdBM3Q4TVR4U25KZ2dQV2hoMC9mcHptejU4djZ0c1EybVR4T1E0Q3QxUlNCWTlHalJyUnZIbnpSSDBiODg5YWZkc2s4YmtsWW5BckZYdDFLQjF4S3JWMjdWcmh1ckVLMUNUeHVSVytZczFWUDlRM2Y0YkkyZG5aWWxCMjhlSkZJK3ZielNGd0l5V0wvaGczYnB5WWYxNjRjS0dvYnlNK1AzdjJMTnhDTjRMQWFsdG9pTkNrU1JPYU0yZU9LSlJNbmp4WnZJZEZCbUZFREFSK29hUUlMWkJLYmRpd1FTdzJ1SC8vdnRpT0V5NWdrVmFWa2lDMFFLL0ZBb1B0MjdmWDdvNE1FNm9oOERNbFFlaVFtNXRMeTVjdnA2S2lJc0taWksxYXRSSmJZY09FS3BTem5wamRTRmJjQzZ4TlVHQkUzYlJwVStyUm80ZG9SM1YxZFRnZjR4djA0SWVxbittSGE5ZXUwZEtsUzhVeTNjcktTcEVmbzhwbDBMUm5CUVF1VTdMVUgwaUJWcXhZSVlvZE4yN2NvQTRkT2doaVFHWGd0dFo3RVBpT2txZCt3S2IwOVBSME9uWHFGTFZ1M1ZxNFk0Z2F6dEd5RjVRaUJ0OVNFZ1VmWjFISXdQUWhjdDd1M2J1TDkwMGdySVpiNk1GWHlIbGZmYlNTekQ5Y3VYSkZES0F3WFlnVXFFdVhMa2JHV1crQXBsY2g2azJNRGNpNTFGS2hqamk3Y3VWS1dyVnFGZDIrZlZ2RVdQUmNnK09zTjF5SHRsckcvUjhsbjI5ZzhnRG5oR0JwTFlSR25NVlVvWW5jc1RzdUlzUFVMdVU0U3k3YkhWUWU3RG1meGQ1anhGazhUeGlMRmNFQ210YkczUk9xajc0S25NK2x4ZGtuVDU2SWVySUo0Nnd2bkhBVitDc2xxUk1ZTkNIT29uYU1CZS90MjdjM2M1ejFoZU91QXBldzI3bE1OdDZmQkd6YnRrMVVvVTZmUGswdFc3WVU3aGlpV3NBZHU2UEU0WEJjRmdLN3hMZURkaFg0Nk5HaklwOUZuTVhBQ1NzeFlCY1RENkRxd2dGTlY5ZmM5M1BtSjNZUzl2cjE2eUxPYnRxMFNiaG1uTHRsc1RqckRaOXIvM0R0d1hnVFgxblQ3Y25RZXhRTmw3dHMyVExLeU1pZzB0SlNTa2hJRURNK0ppa3YxaGMxcmdLN3pqeVhrdzVYcVprZE9UazUxTGR2WDdHNkFxTmp1R09rUHhBMlFvNG9McFJhdnVhaWdWem1pRWdVMXJWdWpFVndLQytLcjd2MWV5eDUwSkM4Q2Z4WGN0NUdIVEYxYWVTek9Ga25Nek5UdU9aT25UcEZTcHoxR0gya2hsNEZmc1RjeWZ5RjFWdXF6YytpYm56bnpwM2FPR3ZCZkRZUTdKSWFrcWNZck9HUFZtOGw2c2I5K3ZVVGNSYWpZOWM0RytISWNIL0RreXMreEN3bWk1MDRDeHc3ZGt5NFkrU3ppTE5ZTG1QeGZEWVFGRXZ0NmhRWVdNcjhrMVZhaG5WUU9DRkhxeHRIZUp6MUJvLzNhM2k3NGoyVG1VNG1QdlVkd0ZaTmJYNFcrV3g4ZkR5MWJkczJVdkxaUUZEQjNPVHBGdzE4Sk1zTFRKMEw1T1pTLy83OXhkWVFiZlZpaE9XemdXQysxTXh2Z1lIUDNFZGtSc0hWMVdKRFYxSlNFcVdrcElnRHk1RFBZbUxBWmozV0ZWajI3UFdHY0YvNUxpdzJVK2JGaHFKang0NWlORHhqeGd4eHJCRVdqK005RzhaWlQ1aEZIbTViMGVEQWdLUU8vSmVaYU5UVHcvM2lUZ1pzMnNLc0Q2NEJ3alU2TnU2eHJyaGFsemIrQ0l6emgvOWhWQXZRU3pHQUFqQ0lRbzlWMTlyVkFvZU8rcHcvOEdlYkd6NGczNmdXb0x5SXhlU2dUUWRRM3BCUGZrd08rYnVQY1NLeld0blVOSUFXay96eWdINzJpQW9wOGpabFcxTmdFdm01YVRDUW5jZzV6RHhsVzhPUkYwaEhDM1NyZVFxcHpXcEc0bzdVd1A5QmFvQi80Qm03OU5IOFdxUnNiUWlTSEE1SFFDY3lSRFZ2SHZBeFdjaFpzQ1B4ZldYdnNHSXFPYS84cFZBTFRMSUg0NTZsZ2NydVljRWZtSXVDK1IvcmM5d0xicDNlcVd3ZmN1d2tIemQ4aDFKZzRFUG1GMHFEa09Hd3RERVpKVENBVXVhL2xCYTZBNXZIaHRYM1EvUVFHRlgvd2N4L0trMTBBMno1US9JeXh4dHVnVVg2eEJ4RXp2MU5DdlhEUVdsTFhRNm9DM1lVN1FtY0lyL001TmZ2TW5zcG5ZTENYNWcvNVZ4WHR4bVZVQnlhK0V0eXJ1ZFNDQXpwMG5hNklsU25ZdjVPSnVZSy9tR3F0Sm51Q09VV2xRM3NzcjhtNTE2WnprcERqOENLakdSMnlWK0c2ZytFK2x4YlBQajNtTmxLeTllUUxXM3paU2ovU0RnT0x2NkdtY3I4bUZ5Mk5kb1k1ZElXcWRJMlpIV0JOV1RLMFhXT2pjWE5rVGJJRE5jZjFETk44Z2VQT1M3dklHZmw2enZNdGpZUjl0OU1YTnF3aE9QdFkvZGZ1bDlicStjMXRrYmQzSVJwTDl4Wi9HdHlUajlHS2twbEcvdFFFRk45VmhaWUE3YXE0bVNmdEFnVHVsUzJxUnNadkIzWGdRTTE5WUw3QWo1UEMvcDhMUEtMNWQrTjU5ZnA4aHR2Ulp4a3JtVVhtOFd2SHE5SzhPUitRK21pelNTdzYrOStJa2VaSHpDYm1GelVTbVlCTTB0enc3NEVVZ0svaWdRcDhoaHlUa3ZHbWtSVTlFNXRRMENCZTNoUkF2c3ZzQ3N3NGg1R3psT0FNRDBaN212cGNUenZFZVorNWdIbTdVQkVWQUpUd0FlZXZjWHNUYzUxWVRoTEgxV2hOanE0ZExqY3UweVVXUytSczlKMG1ubkJiNk1xZ1hVUjJCM1JVdUN1c3JmajR1dDRaZ3RtTTNKZXdxbmQwNGl0SDdqeERUa3BkZ2hndlhHWjdKVWxVdUNnVHlBMWs4RC9GMkFBRThiQmo4ZDRkQzRBQUFBQVNVVk9SSzVDWUlJPScpIG5vLXJlcGVhdCBjZW50ZXIgY2VudGVyIiwKYy5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTt0aGlzLnhhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYyk7dGhpcy5hLmpnKGZ1bmN0aW9uKGEpe3RoaXMueGEuc3R5bGUuaGVpZ2h0PWEuaGVpZ2h0KyJweCJ9LmJpbmQodGhpcykpOyJ2cGFpZCIhPWEmJnRoaXMuYS5jLnNhJiZ0aGlzLmEuYy5zYSgpJiYoZS5vKGsueWcsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLmFmKCkpO3RoaXMuRWIoKX19LEViOmZ1bmN0aW9uKCl7dGhpcy5jb250cm9scy5zdHlsZS5kaXNwbGF5PSJub25lIn0sbmM6ZnVuY3Rpb24oKXsiaGlkZGVuIj09dGhpcy5jb250cm9scy5zdHlsZS52aXNpYmlsaXR5fHx0aGlzLnhhJiYiYmxvY2siPT10aGlzLnhhLnN0eWxlLmRpc3BsYXl8fHRoaXMuUWZ8fCh0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LGVpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5hLkEucGF1c2VkPwoodGhpcy5hLkEucGxheSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wYXVzZUJ1dHRvbix0aGlzLnRyYWNrKCJyZXN1bWUiLCEwKSxlLm8oay5iZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSk6KHRoaXMuYS5BLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLm8oay5qZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkViKCksdGhpcy5EYigpKSl9LGZpOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5LYik7dGhpcy5xYz8oZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJwbGF5IiksdGhpcy54YSYmKHRoaXMueGEuc3R5bGUuZGlzcGxheT0ibm9uZSIpLGEmJihhLmlubmVySFRNTD0KdGhpcy5jb25mLnBhdXNlQnV0dG9uKSx0aGlzLnFjPSExKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJwYXVzZSIpLHRoaXMueGEmJih0aGlzLnhhLnN0eWxlLmRpc3BsYXk9ImJsb2NrIix0aGlzLkViKCksdGhpcy5EYigpKSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24pLHRoaXMucWM9ITApfSxCZDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuS2IpO3RoaXMuYS5BLnBhdXNlZHx8KHRoaXMuYS5BLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxlLm8oay5qZSx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sUWg6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLktiKTt0aGlzLmEuQS5wYXVzZWQmJih0aGlzLmEuQS5wbGF5KCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBhdXNlQnV0dG9uLHRoaXMudHJhY2soInJlc3VtZSIsCiEwKSxlLm8oay5iZCx0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0scm86ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLkliKTt0aGlzLmEuQS5tdXRlZD8odGhpcy5hLkEubXV0ZWQ9ITEsYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24sdGhpcy50cmFjaygidW5tdXRlIiwhMCksdGhpcy5OYigidW5tdXRlZCIsInVzZXIiKSxlLm8oay5IZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKToodGhpcy5hLkEubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJ1c2VyIiksZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHNvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy51Yj8oZS5pYSh0aGlzLkMsCiJjb250cm9sIiwidW5tdXRlIiksdGhpcy51Yj0hMSxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLm11dGVCdXR0b24pKTooZS5pYSh0aGlzLkMsImNvbnRyb2wiLCJtdXRlIiksdGhpcy51Yj0hMCxhJiYoYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbikpfSxhZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuSWIpO3RoaXMuYS5BLm11dGVkfHwodGhpcy5hLkEubXV0ZWQ9ITAsYS5pbm5lckhUTUw9dGhpcy5jb25mLnVubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJtdXRlIiwhMCksdGhpcy5OYigibXV0ZWQiLCJjb250ZW50IiksZS5vKGsuemQsdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSl9LHdvOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5JYik7dGhpcy5hLkEubXV0ZWQmJih0aGlzLmEuQS5tdXRlZD0hMSxhLmlubmVySFRNTD10aGlzLmNvbmYubXV0ZUJ1dHRvbix0aGlzLnRyYWNrKCJ1bm11dGUiLAohMCksdGhpcy5OYigidW5tdXRlZCIsImNvbnRlbnQiKSxlLm8oay5IZix0aGlzLmIudSx0aGlzLmEuYy5sKCksdGhpcy52KCksdGhpcy5zKCkpKX0sbWM6ZnVuY3Rpb24oKXt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsdGhpcy5tYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5tYyk7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMubWMpO3RoaXMubmR8fHRoaXMubmV8fCh0aGlzLnZpZGVvLmxvYWQoKSx0aGlzLkNmKCkpfSx3ZTpmdW5jdGlvbigpe3RoaXMucm0oKSYmdGhpcy5xbSgpJiYodGhpcy5CLnNjfHwic3BpZWdlbC5kZSI9PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikpJiYicHJlcm9sbCI9PWUuR2ImJnRoaXMudm8oKXx8KHRoaXMubmQ9ITAsdGhpcy54YiYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy54YiksdGhpcy54Yj0hMSksdGhpcy56ZygpKX0scm06ZnVuY3Rpb24oKXt2YXIgYT0KZS5xZCgpO3JldHVybiB0aGlzLkIuVmImJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0scW06ZnVuY3Rpb24oKXt2YXIgYT0hMSxjPW0uZ2V0Q29uZmlnKCk7InN2bXByZXZpZXciIT1lLnRhKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpLmFuY2hvcnx8dGhpcy5lZnx8KGE9ITAsYy5hZEZhbGxiYWNrVVJMfHwoYy5hZEZhbGxiYWNrVVJMPSJodHRwczovL2hnYy1jZi1jYWNoZS0xLnN2b25tLmNvbS93ZWxlY3QueG1sIikpO3JldHVybihhfHwhdGhpcy5yZSYmYy5hZEZhbGxiYWNrVVJMKSYmIXRoaXMuZWZ9LEVsOmZ1bmN0aW9uKCl7dmFyIGE9bS5nZXRDb25maWcoKS5hZEZhbGxiYWNrVVJMLGM9ZS50YShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTthfHwic3ZtcHJldmlldyIhPWMuYW5jaG9yfHwoYT0iaHR0cHM6Ly9oZ2MtY2YtY2FjaGUtMS5zdm9ubS5jb20vd2VsZWN0LnhtbCIpO3JldHVybiBhfSx2bzpmdW5jdGlvbigpe20uZ2V0Q29uZmlnKCk7CnRoaXMuZWY9dGhpcy5XYz10aGlzLlFmPSEwO2UudHJhY2soInN0YXRzX3d0X3N0YXJ0Iix0aGlzLldhKCksITApO3RoaXMucmU9ITA7dmFyIGE9dGhpcy5FbCgpLGE9ZS5tZyhhLHRoaXMuQiwhMSx7b25seVVSTDohMH0pO2lmKCFhKXJldHVybiExO3RoaXMuV2UoYSwhMCwhMSx7aG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3M6ITB9KTtyZXR1cm4hMH0semc6ZnVuY3Rpb24oYSl7dGhpcy5YbigpJiYhYT93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuemcoITApfS5iaW5kKHRoaXMpLHRoaXMuUm0pOih0aGlzLkxkPSEwLHRoaXMuYS5JZSgpLHRoaXMuYS51bigpLHRoaXMuamM9ITEsZS5vKGsuWmssdGhpcy5iLnUsdGhpcy5hLmMubCgpLHRoaXMudigpLHRoaXMucygpKSx0aGlzLkVlKCkuT2goKSl9LEVlOmZ1bmN0aW9uKCl7dmFyIGE9bnVsbDt0aGlzLmEmJnRoaXMuYS5jJiYoYT10aGlzLmEuYyk7cmV0dXJuIGF9LG5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5GYSgibWluVmlzIik7CmEmJihlLk9lKHRoaXMudmlkZW8sYSk/dGhpcy5RaCgpOnRoaXMuQmQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubmcoKX0uYmluZCh0aGlzKSwxMDApKX0sdjpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMuYiYmKGEuY2xpY2t0aHJvdWdoPXRoaXMuYi5kYyxhLmR1cmF0aW9uPXRoaXMuYi5kdXJhdGlvbixhLmFkUG9kPXRoaXMuYi53Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSx0aGlzLnZjJiYwPHRoaXMudmMubGVuZ3RoJiYoYS5hZElkcz10aGlzLnZjKSk7dGhpcy52aWRlbyYmdGhpcy52aWRlby5kdXJhdGlvbiYmKGEudmlkZW9fZHVyYXRpb249dGhpcy52aWRlby5kdXJhdGlvbik7cmV0dXJuIGF9LHM6ZnVuY3Rpb24oKXt2YXIgYT17fTthLmFkc2Vzc2lvbl9pZD10aGlzLkdrKyItIit0aGlzLkJmO3RoaXMuYiYmdGhpcy5iLlhnJiYoYS5ob21hZEltcHJlc3Npb25BZElkPQp0aGlzLmIuWGcoKSk7cmV0dXJuIGF9LEVnOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgUGE9Yy5hanx8UGE7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLkNtPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgUWE9Yy5DbXx8UWE7bmV3IFFhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5sYT1udWxsO3RoaXMuVj1bXTt0aGlzLko9bnVsbDt0aGlzLnVjPXRoaXMud2M9ITE7dGhpcy5tYT0iIjt0aGlzLk9mPSExO3RoaXMuaGg9IiI7ZCYmZC5lbXB0eT90aGlzLkFtKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PjxWQVNUIHZlcnNpb249IjMuMCI+PC9WQVNUPicpOnRoaXMubG9hZCgpfQp2YXIgYj0wLGcsZD1bXTtjLmFrPWE7YS5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1lLnFkKCksYjtiPWUudGEoZG9jdW1lbnQubG9jYXRpb24uaHJlZik7dmFyIGM9IiI7Yi5xdWVyeUtleSYmKGM9Yi5xdWVyeUtleS5odnApO2MmJih0aGlzLm9wdGlvbnMudnBhaWQ9ITApO2I9dGhpcy5vcHRpb25zLmtlZXBVUkw/bmV3IEEodGhpcy51cmwpOm0udmEobS5NZCh0aGlzLnVybCksITEsdGhpcy5vcHRpb25zLnVzZUFkVGFnUGFyYW1ldGVyKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudnBhaWQmJiFlLlNhKCkmJihhLmlzQ2hyb21lfHxhLmlzRmlyZWZveCkmJiFhLmlzRWRnZX0uYmluZCh0aGlzKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIGUuRigibWFydGhhc3Rld2FydC5jb20iKXx8ZS5GKCJmYW5kb20uY29tIil8fGUuRigiZ2lnYS5kZSIpfHxlLkYoImtpbm8uZGUiKXx8ZS5GKCJzcGllbGV0aXBwcy5kZSIpfHxlLkYoImRlc2lyZWQuZGUiKX0uYmluZCh0aGlzKTsKaWYoZCgpfHxnKCkpe3ZhciBoPWUuQmcodGhpcy51cmwpO2h8fChoPXRoaXMudXJsKTt2YXIgZD1mdW5jdGlvbigpe3JldHVybiAwPD1kb2N1bWVudC5sb2NhdGlvbi5ocmVmLmluZGV4T2YoIm1hcnRoYXN0ZXdhcnQiKSYmdGhpcy5vcHRpb25zLkFkU3lzdGVtJiYiR0RGUCI9PXRoaXMub3B0aW9ucy5BZFN5c3RlbX0uYmluZCh0aGlzKSxnPWZ1bmN0aW9uKCl7cmV0dXJuIDA8ZG9jdW1lbnQubG9jYXRpb24uaHJlZi5pbmRleE9mKCJmYW5kb20uY29tIikmJjA8aC5pbmRleE9mKCJwdWJhZHMuZy5kb3VibGVjbGljay5uZXQvIil9LmJpbmQodGhpcyksaz1mdW5jdGlvbigpe3JldHVybihlLkYoImdpZ2EuZGUiKXx8ZS5GKCJraW5vLmRlIil8fGUuRigic3BpZWxldGlwcHMuZGUiKXx8ZS5GKCJkZXNpcmVkLmRlIikpJiYwPT09aC5pbmRleE9mKCJodHRwczovL3B1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC9nYW1wYWQvYWRzIil9LmJpbmQodGhpcyksbD1mdW5jdGlvbigpe3JldHVybiAwPT09CmguaW5kZXhPZigiaHR0cHM6Ly9wdWJhZHMuZy5kb3VibGVjbGljay5uZXQvZ2FtcGFkL2FkcyIpfHwwPGguaW5kZXhPZigiZ29vZ2xlYWRzLmcuZG91YmxlY2xpY2submV0L3BhZ2VhZC9hZHMiKX0uYmluZCh0aGlzKTtpZihkKCl8fGcoKXx8aygpfHwiYXBwc3BvdCI9PWMpbCgpPyh0aGlzLnVybD0iaHR0cHM6Ly9pbWEzdnBhaWQuYXBwc3BvdC5jb20vP2FkVGFnVXJsPSIrZW5jb2RlVVJJQ29tcG9uZW50KG0uTWQoaCkpKyImdHlwZT1qcyIsYj1tLnZhKG0uTWQodGhpcy51cmwpLCExLHRoaXMub3B0aW9ucy51c2VBZFRhZ1BhcmFtZXRlciksYi5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9ImNvbWFwcHNwb3RpbWEzdnBhaWQiLGUudHJhY2soInN0YXRzX2hkX2FkeCIsIiIsITApKTpiPW0udmEobS5NZChoKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO2IuZGF0YS5ob21hZF92cGFpZF9jb21wYXRpYmxlPSJ0cnVlIjt0aGlzLm9wdGlvbnMuaG9tYWRfcmVwbGFjZV91cmxzX2luX3RhZ3MmJgooYi5kYXRhLmhvbWFkX3JlcGxhY2VfdXJsc19pbl90YWdzPSJNZWRpYWZpbGUiKX1tLklhKGIsdGhpcy56bS5iaW5kKHRoaXMpLHRoaXMud20uYmluZCh0aGlzKSl9LFNnOmZ1bmN0aW9uKCl7dmFyIGE9MDx0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOlZBU1RBZERhdGEiKS5sZW5ndGg/W106W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZCIpKTsiUGxheWxpc3QiPT10aGlzLmxhLmZpcnN0Q2hpbGQubm9kZU5hbWUmJmEuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoMT09YS5jaGlsZE5vZGVzLmxlbmd0aClpZihhLnBhcmVudE5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09ZS5HYil0cnl7dmFyIGQ9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrYS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsCiJ0ZXh0L3htbCIpO2NbYl09ZC5maXJzdENoaWxkfWNhdGNoKGYpe2NbYl09e319ZWxzZSBjLnNwbGljZShiLDEpfSk7dmFyIGI9W10uc2xpY2UuY2FsbCh0aGlzLmxhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2bWFwOkFkQnJlYWsiKSk7MD49Yi5sZW5ndGgmJihiPVtdLnNsaWNlLmNhbGwodGhpcy5sYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRCcmVhayIpKSk7dmFyIGM9W107Yi5mb3JFYWNoKGZ1bmN0aW9uKGEsYixkKXtpZigic3RhcnQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicHJlcm9sbCI9PWUuR2J8fCJlbmQiPT1hLmdldEF0dHJpYnV0ZSgidGltZU9mZnNldCIpJiYicG9zdHJvbGwiPT1lLkdifHx0aGlzLm9tKGEuZ2V0QXR0cmlidXRlKCJ0aW1lT2Zmc2V0IikpfHxtLmNvKCkpdHJ5e3ZhciBmPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZtYXA6QWRUYWdVUkkiKTswPj1mLmxlbmd0aCYmKGY9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7CnZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrKGIrMSkrJyI+PFdyYXBwZXI+PFZBU1RBZFRhZ1VSST48IVtDREFUQVsnK2ZbMF0udGV4dENvbnRlbnQudHJpbSgpKyJdXVx4M2U8L1ZBU1RBZFRhZ1VSST48L1dyYXBwZXI+PC9BZD4iLCJ0ZXh0L3htbCIpO2RbYl09Zy5maXJzdENoaWxkO2MucHVzaChnKX1jYXRjaChoKXtmb3IoYT1bXS5zbGljZS5jYWxsKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIikpLGI9MDtiPGEubGVuZ3RoO2IrKyljLnB1c2goYVtiXSl9fS5iaW5kKHRoaXMpKTthPWEuY29uY2F0KGMpO3JldHVybiBhPWEuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKT9OdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpPE51bWJlcihiLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk/LTE6MTowfSl9LG9tOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5jb250ZW50VmlkZW8sCmM9dGhpcy5vcHRpb25zLnRpbWVPZmZzZXREZWx0YXx8MTAsZD0wO2lmKCEoYSYmYiYmYi5kdXJhdGlvbiYmYi5jdXJyZW50VGltZSkpcmV0dXJuITE7MDw9YS5pbmRleE9mKCIlIik/ZD1iLmR1cmF0aW9uLzEwMCpwYXJzZUludChhKTowPD1hLmluZGV4T2YoIjoiKSYmKDA8PWEuaW5kZXhPZigiLiIpJiYoYT1hLnN1YnN0cmluZygwLGEuaW5kZXhPZigiLiIpKSksYT1hLnNwbGl0KCI6IiksYT1hLnJldmVyc2UoKSxkPXBhcnNlSW50KGFbMF0pKzYwKnBhcnNlSW50KGFbMV0pKzM2MDAqcGFyc2VJbnQoYVsyXSkpO3JldHVybiBkJiZNYXRoLmFicyhkLXBhcnNlSW50KGIuY3VycmVudFRpbWUpKTw9Yz8hMDohMX0sem06ZnVuY3Rpb24oYSl7dGhpcy5jbihhKTt0cnl7dGhpcy5sYT1hLnJlc3BvbnNlWE1MLHRoaXMubGF8fCh0aGlzLmxhPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuUWEody5lZSkpfXRoaXMuVj0KdGhpcy5TZygpO3RoaXMud2M9dGhpcy5FZigpO3RoaXMudWM9dGhpcy5haSgpO3RoaXMuaGg9YS51cmxDYWxsZWQ7aWYodGhpcy5WLmxlbmd0aCl0aGlzLk9jKCk7ZWxzZXt0aGlzLnFhKHRoaXMuUWEody5ZYyx7ZXJyb3I6dGhpcy5PZj9ELmNlOkQuVGZ9KSk7dHJ5e2UudHJhY2soInN0YXRzX2hkX210eXVybCIsZS5DYih0aGlzLm1hKSwhMCl9Y2F0Y2goYyl7fX19LEFtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmxhfHwodGhpcy5sYT0obmV3IHdpbmRvdy5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyhhLCJ0ZXh0L3htbCIpKX1jYXRjaChiKXt0aGlzLnFhKHRoaXMuUWEody5lZSkpfXRoaXMuVj10aGlzLlNnKCk7dGhpcy53Yz10aGlzLkVmKCk7dGhpcy51Yz10aGlzLmFpKCk7dGhpcy5WLmxlbmd0aD90aGlzLk9jKCk6dGhpcy5xYSh0aGlzLlFhKHcuWWMse2Vycm9yOnRoaXMuT2Y/RC5jZTpELlRmfSkpfSx3bTpmdW5jdGlvbigpe3RoaXMucWEodGhpcy5RYSh3LlNmLHtkZXB0aDpifSkpfSwKT2M6ZnVuY3Rpb24oKXt0aGlzLko9dGhpcy5WLnNoaWZ0KCk7dGhpcy5zbSgpP3RoaXMubW8oKT8oYisrLG5ldyBhKHRoaXMsdGhpcy5iaCgpLGcse0FkU3lzdGVtOnRoaXMud2woKSx2cGFpZDp0aGlzLm9wdGlvbnMudnBhaWR9KSk6dGhpcy5xYSh0aGlzLlFhKHcuVmYpKTooYj0wLHRoaXMuem8oKSYmdGhpcy5oZih0aGlzLmJsKCkpKX0sYmY6ZnVuY3Rpb24oKXt0aGlzLndjPyh0aGlzLndjPTE8dGhpcy5WLmxlbmd0aCx0aGlzLlYubGVuZ3RoJiZ0aGlzLk9jKCkpOnRoaXMucGFyZW50LmJmKCl9LHloOmZ1bmN0aW9uKCl7dGhpcy51Yz8odGhpcy51Yz0xPHRoaXMuVi5sZW5ndGgsdGhpcy5WLmxlbmd0aCYmdGhpcy5PYygpKTp0aGlzLnBhcmVudC55aCgpfSx6bzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmpvKCk/dGhpcy5pbygpPyEwOigtMSE9dGhpcy5HYygpP3RoaXMucWEodGhpcy5RYSh3LlhkKSk6dGhpcy5xYSh0aGlzLlFhKHcuUmYpKSwhMSk6KHRoaXMucWEodGhpcy5RYSh3LlljLApELlVmKSksITEpfSxoZjpmdW5jdGlvbihhKXt0aGlzLm1hfHwodGhpcy5tYT0iIik7YS5XZHx8KGEuV2Q9W10pO2EuV2QucHVzaCh0aGlzLmhoKTthLk1hPWEuTWEuY29uY2F0KHRoaXMuWWUoKSk7YS53Yj1hLndiP2Eud2I6dGhpcy53YzthLnRjPWEudGM/YS50Yzp0aGlzLnVjO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLm1hLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5PZzt0aGlzLnBhcmVudC5oZihhKX0sYmw6ZnVuY3Rpb24oKXt2YXIgYT1uZXcgUmE7dGhpcy5tYXx8KHRoaXMubWE9IiIpO2EuZHVyYXRpb249dGhpcy5HYygpO2EuTT10aGlzLlpnKCk7YS5kYz10aGlzLnpsKCk7YS5rcT1bXTthLm9yaWdpbj10aGlzO2EudT10aGlzLnZsKCk7YS5BZj10aGlzLk5sKGEuZHVyYXRpb24pO2EuWWE9YS5ZYT9hLllhOi0xIT10aGlzLm1hLmluZGV4T2YoInNtYXJ0Y2xpcC5uZXQiKSYmIXRoaXMub3B0aW9ucy5PZztyZXR1cm4gYX0scWE6ZnVuY3Rpb24oYSl7dGhpcy5tYXx8Cih0aGlzLm1hPSIiKTthLllhPWEuWWE/YS5ZYTotMSE9dGhpcy5tYS5pbmRleE9mKCJzbWFydGNsaXAubmV0IikmJiF0aGlzLm9wdGlvbnMuT2c7aWYoIXRoaXMuSiYmdGhpcy5sYSYmdGhpcy5sYS5oYXNDaGlsZE5vZGVzKCkpe3RoaXMuSj10aGlzLmxhO3RyeXtpZih0aGlzLkomJnRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSl7dmFyIGM9ITE7KGM9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJFcnJvciIpKSYmYy5sZW5ndGgmJmUudHJhY2soInN0YXRzX2hkX2VtcHR5QWRFcnJvclN3aXRjaCIsIiIsITApfX1jYXRjaChkKXt9fXRoaXMuSiYmKGEuTWE9YS5lcnJvci5jb2RlIT13LlhkLmNvZGU/YS5NYS5jb25jYXQodGhpcy5BbCgpKTphLk1hLmNvbmNhdCh0aGlzLkpsKCkpKTt0aGlzLlYubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuZmMmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5mYyYmdGhpcy5wYXJlbnQuZmMoYSksYj0wLHRoaXMuT2MoKSk6Cih0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucWEmJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC5xYSYmdGhpcy5wYXJlbnQucWEoYSksYj0wKX0sZmM6ZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnQuZmMoYSl9LEhnOmZ1bmN0aW9uKGEsYil7dGhpcy5xYSh0aGlzLlFhKGEsYikpfSxRYTpmdW5jdGlvbihhLGIpe3ZhciBjPW5ldyBTYShhLGIpO2Mub3JpZ2luPXRoaXM7cmV0dXJuIGN9LG1vOmZ1bmN0aW9uKCl7cmV0dXJuIGI8Z30sam86ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLlpnKCkubGVuZ3RofSxpbzpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuR2MoKX0sRWY6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLlYuZmlsdGVyKGZ1bmN0aW9uKGEpe3ZhciBiPSExO2EuZ2V0QXR0cmlidXRlJiYoYj0wPE51bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSkpO3JldHVybiBifSkubGVuZ3RofSxhaTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuViYmMjw9dGhpcy5WLmxlbmd0aCYmCiF0aGlzLkVmKCkmJihhPSEwKTtyZXR1cm4gYX0sY246ZnVuY3Rpb24oYSl7dGhpcy5tYT0iVU5LTk9XTiI7dHJ5e2QucHVzaCh0aGlzLm1hPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe3RoaXMubWE9IlVOS05PV04ifXRyeXt0aGlzLk9mPWEuZ2V0UmVzcG9uc2VIZWFkZXImJmEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVnBhaWQtSWdub3JlZCIpfWNhdGNoKGMpe319LHNtOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy5iaCgpLmxlbmd0aH0sYmg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5EZSh0aGlzLkosIlZBU1RBZFRhZ1VSSSIpfSx3bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRlKHRoaXMuSiwiQWRTeXN0ZW0iKX0sWWU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9IkltcHJlc3Npb24gVHJhY2tpbmcgQ2xpY2tUcmFja2luZyBFcnJvciBWaWV3YWJsZSBOb3RWaWV3YWJsZSB2aWV3YWJsZV9pbXByZXNzaW9uIG1lYXN1cmFibGVfaW1wcmVzc2lvbiIuc3BsaXQoIiAiKSwKYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107W10uc2xpY2UuY2FsbCh0aGlzLkouZ2V0RWxlbWVudHNCeVRhZ05hbWUoZCkpLmZvckVhY2goZnVuY3Rpb24oYSl7aWYoYSYmIXRoaXMub2goYSkpe3ZhciBjPWEuZ2V0QXR0cmlidXRlKCJldmVudCIpfHxkLnRvTG93ZXJDYXNlKCk7Yi5wdXNoKHt0eXBlOmMsdXJsOnRoaXMubGIoYSl9KX19LmJpbmQodGhpcykpfXJldHVybiBifSxvaDpmdW5jdGlvbihhKXtyZXR1cm4gYT8iQ29tcGFuaW9uIj09YS5ub2RlTmFtZT8hMDp0aGlzLm9oKGEucGFyZW50Tm9kZSk6ITF9LEpsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJpbXByZXNzaW9uIj09YS50eXBlfSl9LEFsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5ZZSgpO3JldHVybiBhPWEuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJlcnJvciI9PWEudHlwZX0pfSx6bDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxiKHRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKWmc6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJNZWRpYUZpbGUiKSxiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyliLnB1c2goe2lkOmFbY10uZ2V0QXR0cmlidXRlKCJpZCIpLHR5cGU6YVtjXS5nZXRBdHRyaWJ1dGUoInR5cGUiKSxPYTphW2NdLmdldEF0dHJpYnV0ZSgiYml0cmF0ZSIpLHdpZHRoOmFbY10uZ2V0QXR0cmlidXRlKCJ3aWR0aCIpLGhlaWdodDphW2NdLmdldEF0dHJpYnV0ZSgiaGVpZ2h0IiksRXA6YVtjXS5nZXRBdHRyaWJ1dGUoImRlbGl2ZXJ5IiksdXJsOnRoaXMubGIoYVtjXSl9KTt2YXIgZD10aGlzLm9wdGlvbnMuT2F8fDFFMzt0cnl7dmFyIGc9Yi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuLTEhPWEudHlwZS5pbmRleE9mKCJtcDQiKX0pLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksZT1iLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4tMT09YS50eXBlLmluZGV4T2YoIm1wNCIpfSkuc29ydChmdW5jdGlvbihhLApiKXtyZXR1cm4gTWF0aC5hYnMoZC1hLk9hKS1NYXRoLmFicyhkLWIuT2EpfSksYj1nLmNvbmNhdChlKX1jYXRjaChoKXt9cmV0dXJuIGJ9LHZsOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhZFBhcmFtZXRlcnMiKTthJiYwIT1hLmxlbmd0aHx8KGE9dGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJBZFBhcmFtZXRlcnMiKSk7Zm9yKHZhciBiPSIiLGM9ITEsZD1bXSxiPSExLGc9IiIsZT1bXSxoPSIiLGg9MDtoPGEubGVuZ3RoO2grKyl7Zz1iPXRoaXMudWQoYVtoXSk7dHJ5e2M9SlNPTi5wYXJzZShiKX1jYXRjaChrKXtjPWJ9ZC5wdXNoKGMpO2UucHVzaChnKX0xPGEubGVuZ3RoPyhiPWQsaD1nKTooYj1jLGg9ZSk7cmV0dXJue0FkUGFyYW1ldGVyczpiLE9yaWdpbmFsQWRQYXJhbWV0ZXJzOmgudG9TdHJpbmcoKX19LEdjOmZ1bmN0aW9uKCl7dmFyIGE7dHJ5e3JldHVybiBhPXRoaXMubGIodGhpcy5KLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sTmw6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxkPSExO3RyeXtjPXRoaXMuSi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZD1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9ZS5SbihkLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGcpe2I9ITF9cmV0dXJuIGJ9LERlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy5sYihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0sR2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LGxiOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMudWQoYSk6IiJ9LHVkOmZ1bmN0aW9uKGEpe3ZhciBiPQp0aGlzLkdlKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFI9Yy5ha3x8UjtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubGo9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBUYT1jLmxqfHxUYTtuZXcgVGEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMuZHVyYXRpb249MDt0aGlzLk1hPVtdO3RoaXMuTT1bXTt0aGlzLmRjPSIiO3RoaXMudT10aGlzLnRjPXRoaXMud2I9ITE7dGhpcy5LZT10aGlzLm9yaWdpbj1udWxsO3RoaXMuTGU9IiJ9Yy5Kaj1hO2EucHJvdG90eXBlPXtXazpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxjPTA7Yzx0aGlzLk0ubGVuZ3RoO2MrKylpZigwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxIbDpmdW5jdGlvbigpe2lmKCF0aGlzLktlJiZ0aGlzLm9yaWdpbiYmdGhpcy5vcmlnaW4ubGEpe3ZhciBhPXRoaXMub3JpZ2luLmxhO2lmKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUpZm9yKHZhciBhPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJJbXByZXNzaW9uIiksYz0iIixkPTA7ZDxhLmxlbmd0aDtkKyspKGM9YVtkXS5nZXRBdHRyaWJ1dGUoImlkIikpJiYwPD1jLmluZGV4T2YoIkhPTUFEIikmJih0aGlzLktlPWFbZF0pfXJldHVybiB0aGlzLktlfSxYZzpmdW5jdGlvbigpe2lmKHRoaXMuTGUpcmV0dXJuIHRoaXMuTGU7dmFyIGE9IiI7KGE9dGhpcy5IbCgpKSYmYS5nZXRBdHRyaWJ1dGU/KGE9YS5nZXRBdHRyaWJ1dGUoImlkIiksYT1hLnJlcGxhY2UoIkhPTUFEXyIsIiIpLChhPWEucmVwbGFjZSgiSE9NQUQiLCIiKSl8fChhPSJlbXB0eSIpKTphPSJub19pbXBfbm9kZSI7cmV0dXJuIHRoaXMuTGU9YX0sUmw6ZnVuY3Rpb24oKXtmb3IodmFyIGE9ITEsYz0wO2M8dGhpcy5NLmxlbmd0aDtjKyspaWYoMDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil8fAowPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQvZWNtYXNjcmlwdCIpfHwwPD10aGlzLk1bY10udHlwZS5pbmRleE9mKCJ0ZXh0L2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2NdLnR5cGUuaW5kZXhPZigidGV4dC9qc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtjXS50eXBlLmluZGV4T2YoInRleHQveC1qYXZhc2NyaXB0IikpYT10aGlzLk1bY107cmV0dXJuIGF9fX0pKGMpO3ZhciBSYT1jLkpqfHxSYTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTGk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBVYT1jLkxpfHxVYTtuZXcgVWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLApuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7dmFyIHc9e2VlOnt0eXBlOiJlcnJvciIsY29kZToxMDAsbWVzc2FnZToiWE1MIHBhcnNpbmcgZXJyb3IiLExhOiJYTUxfUEFSU0VfRVJST1IifSxSZjp7dHlwZToiZXJyb3IiLGNvZGU6MjAyLG1lc3NhZ2U6IlZpZGVvIHBsYXllciBleHBlY3RpbmcgZGlmZmVyZW50IGR1cmF0aW9uLiIsTGE6IkRVUkFUSU9OX0VSUk9SIn0sWWM6e3R5cGU6ImVycm9yIixjb2RlOjMwMyxtZXNzYWdlOiJObyBhZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycy4gQWxzbyBpbmNsdWRlcyBudW1iZXIgb2YgZW1wdHkgVkFTVCByZXNwb25zZXMgZnJvbSBmYWxsYmFjay4iLExhOiJFTVBUWV9WQVNUIn0sVmY6e3R5cGU6ImNyaXRpY2FsIixjb2RlOjMwMixtZXNzYWdlOiJXcmFwcGVyIGxpbWl0IHJlYWNoZWQsIGFzIGRlZmluZWQgYnkgdGhlIHZpZGVvIHBsYXllci4gVG9vIG1hbnkgV3JhcHBlciByZXNwb25zZXMgaGF2ZSBiZWVuIHJlY2VpdmVkIHdpdGggbm8gSW5MaW5lIHJlc3BvbnNlLiIsCkxhOiJXUkFQUEVSX0xJTUlUX1JFQUNIRUQifSxTZjp7dHlwZToiZXJyb3IiLGNvZGU6MzAxLG1lc3NhZ2U6IlRpbWVvdXQgb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gV3JhcHBlciBlbGVtZW50LCBvciBvZiBWQVNUIFVSSSBwcm92aWRlZCBpbiBhIHN1YnNlcXVlbnQgV3JhcHBlciBlbGVtZW50LiBJbmNsdWRlcyByZXF1ZXN0IGVycm9ycyBzdWNoIGFzIGludmFsaWQgVVJJLCB1bnJlYWNoYWJsZSBvciByZXF1ZXN0IHRpbWVvdXQgZm9yIFVSSSwgYW5kIHNlY3VyaXR5IG9yIG90aGVyIGV4Y2VwdGlvbnMgcmVsYXRlZCB0byByZXF1ZXN0aW5nIGEgVkFTVCBVUkkuIixMYToiTE9BRF9FUlJPUiJ9LCRkOnt0eXBlOiJlcnJvciIsY29kZTo0MDMsbWVzc2FnZToiQ291bGQgbm90IGZpbmQgTWVkaWFGaWxlIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgdmlkZW8gcGxheWVyLCBiYXNlZCBvbiB0aGUgYXR0cmlidXRlcyBvZiB0aGUgTWVkaWFGaWxlIGVsZW1lbnQuIixMYToiTk9fUExBWUFCTEVfU09VUkNFUyJ9LAplcDp7dHlwZToiZXJyb3IiLGNvZGU6NDA1LG1lc3NhZ2U6IlByb2JsZW0gZGlzcGxheWluZyBNZWRpYUZpbGUuIixMYToiTUVESUFGSUxFX0VSUk9SIn0sWGQ6e3R5cGU6ImVycm9yIixjb2RlOjk5OSxtZXNzYWdlOiIxIHNlYyBkdW1teSBhZCIsTGE6IkRVTU1ZX0FEIn19LEQ9e1RmOnt0eXBlOiJlcnJvciIsY29kZTozMDMxLG1lc3NhZ2U6Im5vIGFkcyIsTGE6Ik5PX0FEUyJ9LFVmOnt0eXBlOiJlcnJvciIsY29kZTozMDMyLG1lc3NhZ2U6Im5vIG1lZGlhZmlsZXMgc3BlY2lmaWVkIixMYToiTk9fTUVESUFGSUxFUyJ9LGZwOnt0eXBlOiJlcnJvciIsY29kZTozMDMzLG1lc3NhZ2U6Im5vIHBsYXlhYmxlIG1lZGlhZmlsZXMiLExhOiJOT19QTEFZQUJMRV9NRURJQUZJTEVTIn0sY2U6e3R5cGU6ImVycm9yIixjb2RlOjMwMzQsbWVzc2FnZToidnBhaWQgaWdub3JlZCIsTGE6IlZQQUlEX0lHTk9SRUQifX07Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLnlvPWE7YS5wcm90b3R5cGU9Cnt9fSkoYyk7dmFyIFZhPWMueW98fFZhO25ldyBWYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5lcnJvcj1hO3RoaXMucGQ9Yzt0aGlzLk1hPVtdO3RoaXMub3JpZ2luPW51bGx9Yy5PaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFNhPWMuT2l8fFNhO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5OaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFdhPWMuTml8fFdhO25ldyBXYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5QaD1hO3RoaXMudmlkZW89Yzt0aGlzLlRkPVtdO3RoaXMuTWg9W107dGhpcy5kZj1bXTt0aGlzLkpvPQoibG9hZGVkIHN0YXJ0IGZpcnN0UXVhcnRpbGUgbWlkcG9pbnQgdGhpcmRRdWFydGlsZSBjb21wbGV0ZSBwYXVzZSByZXN1bWUgYnVmZmVyU3RhcnQgYnVmZmVyRmluaXNoIHNraXBwZWQgdm9sdW1lQ2hhbmdlIHBsYXllclN0YXRlQ2hhbmdlIGFkVXNlckludGVyYWN0aW9uIi5zcGxpdCgiICIpO3RoaXMuSygpfWMuZ3A9YTthLnByb3RvdHlwZT17SzpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy5QaC5sZW5ndGg7YSsrKXt2YXIgYz10aGlzLlBoW2FdLGQ9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiSmF2YVNjcmlwdFJlc291cmNlIilbMF0udGV4dENvbnRlbnQsZT1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJWZXJpZmljYXRpb25QYXJhbWV0ZXJzIilbMF0udGV4dENvbnRlbnQsaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtoLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaCk7dmFyIGs9aC5jb250ZW50V2luZG93O2suWnA9CntyZWdpc3RlclNlc3Npb25PYnNlcnZlcjp0aGlzLnJuLmJpbmQodGhpcyksYWRkRXZlbnRMaXN0ZW5lcjp0aGlzLmhuLmJpbmQodGhpcyl9O3ZhciBsPWsuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7bC5zcmM9Imh0dHBzOi8vZGV2LnNjaG5lZXZvbm1vcmdlbi5jb20vdmluY2VudC9zYW5kYm94L3NhbmRib3hfc2EuanMiO2wub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGE9ay5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTthLnNyYz1kO2suZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChhKX0uYmluZCh0aGlzKTtrLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCk7dGhpcy5UZC5wdXNoKHtzcmM6ZCxmcmFtZTpoLFNtOmUsdmVuZG9yOmMuZ2V0QXR0cmlidXRlKCJ2ZW5kb3IiKX0pfX0sdHJhY2s6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTA7Yzx0aGlzLmRmLmxlbmd0aDtjKyspe3ZhciBkPXRoaXMuZGZbY107ZC50eXBlPT09YSYmZC5Jayh0aGlzLkJsKGEpKX19LApCbDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAibG9hZGVkIjpyZXR1cm57dHlwZToibG9hZGVkIixkYXRhOntpcTohMCxocTo1LGF1dG9wbGF5OiExLHBvc2l0aW9uOiJzdGFuZGFsb25lIn19O2Nhc2UgImltcHJlc3Npb24iOnJldHVybnt0eXBlOiJpbXByZXNzaW9uIixkYXRhOntWcDoidmlkZW8iLGxxOiJqc0N1c3RvbSIsbXE6IjEuMC4wLWRldiJ9fTtjYXNlICJzdGFydCI6cmV0dXJue3R5cGU6InN0YXJ0IixkYXRhOntkdXJhdGlvbjoxMCxucToxLEZwOjB9fTtkZWZhdWx0OnJldHVybnt0eXBlOmEsZGF0YTp7fX19fSxnZXRDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2FwaVZlcnNpb246IjEuMCIsZW52aXJvbm1lbnQ6IndlYiIsYWNjZXNzTW9kZToiZnVsbCIsdmlkZW9FbGVtZW50OnRoaXMudmlkZW8sYWRTZXNzaW9uVHlwZToiaHRtbCIsYWRTZXJ2aW5nSWQ6InVuZGVmaW5lZCIsb21pZEpzSW5mbzp7b21pZEltcGxlbWVudGVyOiJob21hZCIsc2VydmljZVZlcnNpb246IjEuMC4wLWRldiJ9fX0sClFsOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wO2M8dGhpcy5UZC5sZW5ndGg7YysrKWlmKHRoaXMuVGRbY10udmVuZG9yPT09YSlyZXR1cm4gdGhpcy5UZFtjXS5TbTtyZXR1cm4iIn0scm46ZnVuY3Rpb24oYSxjKXt0aGlzLk1oLnB1c2goe29ic2VydmVyOmEsdmVyaWZpY2F0aW9uUGFyYW1ldGVyczp0aGlzLlFsKGMpLHZlbmRvcjpjfSk7dGhpcy5UbigpfSxobjpmdW5jdGlvbihhLGMpeyJ2aWRlbyI9PT1hP3RoaXMuSm8ubWFwKGZ1bmN0aW9uKGEpe3RoaXMua2coYSxjKX0uYmluZCh0aGlzKSk6dGhpcy5rZyhhLGMpfSxrZzpmdW5jdGlvbihhLGMpe3RoaXMuZGYucHVzaCh7dHlwZTphLElrOmMsZnE6ITF9KX0sVG46ZnVuY3Rpb24oKXt0aGlzLk1oLm1hcChmdW5jdGlvbihhKXthLmxtfHwoYS5ZcCh7YWRTZXNzaW9uSWQ6ZS5YKDIwKSx0eXBlOiJzZXNzaW9uU3RhcnQiLHRpbWVzdGFtcDpEYXRlLm5vdygpLGRhdGE6e3ZlcmlmaWNhdGlvblBhcmFtZXRlcnM6YS5qcSxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dCgpfX0pLAphLmxtPSEwKX0uYmluZCh0aGlzKSl9fX0pKGMpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy50bT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIFhhPWMudG18fFhhO25ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKGEsYyl7dGhpcy5jb25mPWN8fHt9O3RoaXMuYz1hO3RoaXMua2I9YS5UZygpO3RoaXMuST1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkkuaWQ9ZS5YKDEwKTt0aGlzLkE9Qi5wb3AoKTt0aGlzLkF8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIik7dGhpcy5OYT17fTt0aGlzLmxnPSExOwp0aGlzLmFjPVtdfWMuS2k9YTthLnByb3RvdHlwZT17dWw6ZnVuY3Rpb24oYSl7dmFyIGM9e30sZD0hMSxlPTAsYz0wLGg9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihjPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD0iZml4ZWQiLGU9Yy5sZWZ0LGM9Yy50b3ApO2g9e3g6ZSx5OmN9O2gucG9zaXRpb249ZDtyZXR1cm4gaH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy51bChhKTtmb3IodmFyIGM9MCxkPTAsZT0hMSxoPXRoaXMuWmwoYSksaz17fTthOyljKz1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGQrPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGE9YS5vZmZzZXRQYXJlbnQ7aCYmKGE9dm9pZCAwIT09d2luZG93LnBhZ2VZT2Zmc2V0P3dpbmRvdy5wYWdlWU9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCwKYys9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsZCs9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7az17eDpjLHk6ZH07ZSYmKGsucG9zaXRpb249ZSk7cmV0dXJuIGt9LCRuOmZ1bmN0aW9uKCl7dGhpcy5sZz0hMH0sbGk6ZnVuY3Rpb24oKXt0aGlzLkE9Qi5wb3AoKTt0aGlzLkF8fChlLnRyYWNrKCJzdGF0c19oZF9ub1ZpZGVvVGFnTGVmdCIsIiIsITApLHRoaXMuQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpLHRoaXMuQS5pZD0iYWRYZGlzcGxheSIsdGhpcy5BLnN0eWxlLmRpc3BsYXk9ImJsb2NrIil9LEVoOmZ1bmN0aW9uKCl7dGhpcy5jLnBhdXNlKCk7ZS5vKGsuQmMsdGhpcy5jLmwoKSl9LHVuOmZ1bmN0aW9uKCl7dGhpcy5sZ3x8Cih0aGlzLmMucGxheSgpLGUubyhrLm1kLHRoaXMuYy5sKCkpKX0seWY6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMuYy5wYXVzZSgpO3RoaXMuSS5zdHlsZS56SW5kZXg9YTt0aGlzLkkuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5JLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkkuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkkuc3R5bGUuYm94U2l6aW5nPXRoaXMua2Iuc3R5bGUuYm94U2l6aW5nO3RoaXMuSS5zdHlsZS53aWR0aD10aGlzLmtiLm9mZnNldFdpZHRoKzArInB4Ijt0aGlzLkkuc3R5bGUuaGVpZ2h0PXRoaXMua2Iub2Zmc2V0SGVpZ2h0KzArInB4Ijt0aGlzLkEuc3R5bGUud2lkdGg9dGhpcy5rYi5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5BLnN0eWxlLmhlaWdodD10aGlzLmtiLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5nZXRQb3NpdGlvbih0aGlzLmtiKTsKdGhpcy5jLlJjJiZ0aGlzLmMuUmMoKT90aGlzLmMuVGcoKS5hcHBlbmRDaGlsZCh0aGlzLkkpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5JKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmhjLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMuYy5leGl0RnVsbHNjcmVlbigpfSxabDpmdW5jdGlvbihhKXtmb3IodmFyIGM9d2luZG93LmdldENvbXB1dGVkU3R5bGUsZD0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fGMmJiJmaXhlZCI9PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLnBvc2l0aW9uKSl7ZD0hMDticmVha31hPWEucGFyZW50Tm9kZX1yZXR1cm4gZH0sc2w6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5nZXRQb3NpdGlvbihhKTtjLnBvc2l0aW9uP2MucG9zaXRpb249Yy5wb3NpdGlvbjpjLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yy53aWR0aD1hLm9mZnNldFdpZHRoO2MuaGVpZ2h0PWEub2Zmc2V0SGVpZ2h0OwpyZXR1cm4gY30saGM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5zbCh0aGlzLmtiKTtpZihjLnghPXRoaXMuTmEueHx8Yy55IT10aGlzLk5hLnl8fGMucG9zaXRpb24hPXRoaXMuTmEucG9zaXRpb258fGMud2lkdGghPXRoaXMuTmEud2lkdGh8fGMuaGVpZ2h0IT10aGlzLk5hLmhlaWdodHx8YSl7aWYoMDx0aGlzLk5hLndpZHRoJiYwPHRoaXMuTmEuaGVpZ2h0JiYwPT1jLndpZHRoJiYwPT1jLmhlaWdodCl7dGhpcy5JZSgpO3JldHVybn10aGlzLk5hPWM7dGhpcy5jLlJjKCk/KHRoaXMuSS5zdHlsZS5sZWZ0PSIwcHgiLHRoaXMuSS5zdHlsZS50b3A9IjBweCIpOih0aGlzLkkuc3R5bGUubGVmdD1jLngrInB4Iix0aGlzLkkuc3R5bGUudG9wPWMueSsicHgiKTt0aGlzLkkuc3R5bGUud2lkdGg9Yy53aWR0aCsicHgiO3RoaXMuSS5zdHlsZS5oZWlnaHQ9Yy5oZWlnaHQrInB4Ijt0aGlzLkkuc3R5bGUucG9zaXRpb249Yy5wb3NpdGlvbjt0aGlzLkEuc3R5bGUud2lkdGg9Yy53aWR0aCsicHgiOwp0aGlzLkEuc3R5bGUuaGVpZ2h0PWMuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMuYWMubGVuZ3RoO2ErKyl0aGlzLmFjW2FdKHt3aWR0aDpjLndpZHRoLGhlaWdodDpjLmhlaWdodH0pfWUuRGYodGhpcy5JKSYmd2luZG93LnNldFRpbWVvdXQodGhpcy5oYy5iaW5kKHRoaXMpLDEwKX0samc6ZnVuY3Rpb24oYSl7dGhpcy5hY3x8KHRoaXMuYWM9W10pOyJmdW5jdGlvbiI9PXR5cGVvZiBhJiZ0aGlzLmFjLnB1c2goYSl9LEllOmZ1bmN0aW9uKCl7dGhpcy5JJiZ0aGlzLkkucGFyZW50Tm9kZSYmdGhpcy5JLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuSS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuSSk7dGhpcy5BJiZ0aGlzLkEucGF1c2UmJnRoaXMuQS5wYXVzZSgpfX19KShjKTtmb3IodmFyIFlhPWMuS2l8fFlhLEI9W10sWmE9MDsxMDA+WmE7WmErKyl7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtNLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjtNLmlkPQplLlgoMTApO00uY29udHJvbHM9ITA7Qi5wdXNoKE0pfXZhciBJPSExLGJhPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIseik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHopO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIseik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlRpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgJGE9Yy5UaXx8JGE7bmV3ICRhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRGo9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5lbGVtZW50SWQsYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChhKTtifHwKKGE9dGhpcy5nZXRSYXdQbGF5ZXIoKS5nZXRFbGVtZW50SWQoKSxiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpKTt0aGlzLlQoYik7dGhpcy5HZChhKTt0aGlzLkNnKCl9LEdkOmZ1bmN0aW9uKGEpe3RoaXMuaWR8fCh0aGlzLmlkPWEpfSxDZzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuR2EoKSxiPXRoaXMudmlkZW9UYWc7Ynx8KChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pfHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSksYj90aGlzLlcoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNnKCl9LmJpbmQodGhpcyksMTAwKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTthLmlzUGxheWluZyYmImZ1bmN0aW9uIj09dHlwZW9mIGEuaXNQbGF5aW5nJiYKYS5pc1BsYXlpbmcoKSYmdGhpcy5wYXVzZSgpfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGEucGFyYW1ldGVycyYmITE9PT1hLnBhcmFtZXRlcnMuYXV0b3BsYXk/ITE6ITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iT295YWxhIn0sc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGw6ZnVuY3Rpb24oKXt2YXIgYT17fSxiPXRoaXMudmlkZW9UYWcsYz10aGlzLkdhKCk7aWYoYS52aWRlb1RhZz1iKWEudmlkZW9UYWdJZD1iLmlkO2lmKGEuY29udGFpbmVyPWMpYS5jb250YWluZXJJZD1jLmlkO2EucGxheWVyPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGF9fSl9KShjKTt2YXIgYWI9Yy5Eanx8YWI7KGZ1bmN0aW9uKGMpe2MuQ2o9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPWNhKCk7dGhpcy5ZYj10aGlzLllifHwhMTt0aGlzLmNnPXRoaXMuZWc9CnRoaXMubGg9dGhpcy51YT10aGlzLkdmPSExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX0VSUk9SLCJleGFtcGxlIixmdW5jdGlvbihhLGIpe3RoaXMucWwoYSxiKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuQURTX1BMQVlFRCwiZXhhbXBsZSIsZnVuY3Rpb24oKXt0aGlzLkdmPSEwO3RoaXMubGgmJnRoaXMudWcoKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuUExBWUlORywiZXhhbXBsZSIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5GYjthJiZhLmpjJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7Yi5tYi5zdWJzY3JpYmUoYS5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMua2QoKTt0aGlzLmxoPSEwO3RoaXMudWcoKX0uYmluZCh0aGlzKSk7CnRoaXMucGcoKX0sdWc6ZnVuY3Rpb24oKXtpZighdGhpcy5ZYil7dGhpcy5rZCgpO2lmKCF0aGlzLkdmJiYhdGhpcy5rZCgpKXJldHVybiB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApLCEwO3RoaXMuR2YmJnRoaXMuY2cmJiF0aGlzLmVnJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApfX0sa2Q6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRnKCJhZE1hbmFnZXJDb250cm9sbGVyIik7cmV0dXJuIGEmJmEuYWRNYW5hZ2VycyYmYS5hZE1hbmFnZXJzWyJnb29nbGUtaW1hLWFkcy1tYW5hZ2VyIl19LCRnOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGIubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1iLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YSlyZXR1cm4gZC5pbnN0YW5jZX19LHBnOmZ1bmN0aW9uKCl7aWYodGhpcy5rZCgpKXt2YXIgYT0KdGhpcy4kZygiYWRNYW5hZ2VyQ29udHJvbGxlciIpLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXTt0aGlzLmVnPTA8YS5nZXRDdXJyZW50VGltZSgpO3RoaXMuY2c9YS5DcH10aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5wZygpfS5iaW5kKHRoaXMpLDEwMCl9LEdwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmlzQWRQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYS5pc0FkUGxheWluZz9hLlRwKCk6ITF9LEdjOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEFkRHVyYXRpb24mJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEFkRHVyYXRpb24/YS5HYygpOi0xfSxLbDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmlzUGxheWluZz9hLmlzUGxheWluZygpOi0xfSxxbDpmdW5jdGlvbihhLGIpe3RoaXMuWWI9Yi5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYi5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09CnRoaXMuWWJ8fDMwMj09dGhpcy5ZYj90aGlzLnVhPSEwOnRoaXMubSgiYWRlcnJvciIsdGhpcy5ZYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmxkKCl9LmJpbmQodGhpcyksMTAwKX0sbGQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO3RoaXMudWE/KHRoaXMudygpLHRoaXMub2EoKSk6YS5NZSgpPyh0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp0aGlzLktsKGEpPyh0aGlzLkQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMua2EoKX0uYmluZCh0aGlzKSwyRTMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubGQoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIGJiPWMuQ2p8fGJiOyhmdW5jdGlvbihjKXtjLkVqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sbm06ZnVuY3Rpb24oKXt3aW5kb3cuT08uTmoubmsubGs/d2luZG93Lk9PLk5qLm5rLmxrLkFwKGZ1bmN0aW9uKCl7fSk6CndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5ubSgpfSwxMDApfSxmOmZ1bmN0aW9uKCl7dGhpcy5UYT0xNTAwO3ZhciBhPWNhKCk7aWYoYSYmYS5fX2ludGVybmFsJiZhLl9faW50ZXJuYWwucGxheWVycyYmMDxlLkZlKGEuX19pbnRlcm5hbC5wbGF5ZXJzKSlmb3IodmFyIGIgaW4gYS5fX2ludGVybmFsLnBsYXllcnMpaWYoYS5fX2ludGVybmFsLnBsYXllcnMuaGFzT3duUHJvcGVydHkoYikpe3ZhciBjPW5ldyBhYihhLl9faW50ZXJuYWwucGxheWVyc1tiXSk7dGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgYmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIGNiPWMuRWp8fGNiLGRiPW5ldyBjYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMub289YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBlYj1jLm9vfHxlYjtuZXcgZWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLApNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuRmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dGhpcy5qYT0hMTt0aGlzLmRoKCl9LGRoOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRGaWd1cmUmJihhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldEZpZ3VyZSgpKTthfHwoYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5lbGVtZW50KTt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5nZXRWaWRlb0VsZW1lbnQmJihiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLmdldFZpZGVvRWxlbWVudCgpKTthJiYhYiYmKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmRoKCl9LmJpbmQodGhpcyksMTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXllci5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWVyLnBsYXkoKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0Q3VycmVudFRpbWUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuZ2V0RHVyYXRpb24oKX0sS2E6ZnVuY3Rpb24oKXt0aGlzLkhoKCl9LEhoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJyZW50VGltZSgpOzE+dGhpcy5nZXREdXJhdGlvbigpLWE/dGhpcy5VJiYoMCx0aGlzLlUpKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhoKCl9LmJpbmQodGhpcyksMTAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJCaXRtb3ZpbiJ9fSl9KShjKTt2YXIgZmI9Yy5GaXx8ZmI7KGZ1bmN0aW9uKGMpe2MuRWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0scmc6ZnVuY3Rpb24oYSl7dmFyIGI9CmEuY29kZSxjPWEubWVzc2FnZTthLmRhdGEmJihiPWEuZGF0YS5jb2RlLGM9YS5kYXRhLm1lc3NhZ2UpOzEyMDUhPWImJig5MDA9PWImJjA8Yy50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/KHRoaXMudygiZW1wdHkiKSx0aGlzLm9hKCkpOjEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iP3RoaXMub2EoKTp0aGlzLmcoKSl9LGY6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuYWRFcnJvckV2ZW50cylmb3IodmFyIGI9MDtiPGEuYWRFcnJvckV2ZW50cy5sZW5ndGg7YisrKXRoaXMucmcoYS5hZEVycm9yRXZlbnRzKTthLnBsYXllci5vbigiYWRlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5yZyhhKX0uYmluZCh0aGlzKSk7YS5wbGF5ZXIub24oImFkcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy53KCJhZHF1YXJ0aWxlIil9LmJpbmQodGhpcykpfSxnOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5wbGF5ZXIuaXNQbGF5aW5nKCk/CnRoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGdiPWMuRWl8fGdiOyhmdW5jdGlvbihjKXtjLkdpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sS2g6ZnVuY3Rpb24oYSl7YT1uZXcgZmIoYSk7YS5qYT90aGlzLlAoKTp0aGlzLkwoYSl8fChhLkdkKE1hdGguY2VpbCgxRTEwKk1hdGgucmFuZG9tKCkpKSx0aGlzLk4oYSksKG5ldyBnYihhLHRoaXMuRykpLmYoKSl9LGY6ZnVuY3Rpb24oKXt0aGlzLnJsfHwodGhpcy5ybD0hMCxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzdm06cGxheWVyaW5zdGFuY2UiLGZ1bmN0aW9uKGEpe3RoaXMuS2goYS5kZXRhaWwpfS5iaW5kKHRoaXMpKSk7aWYod2luZG93Ll9fc2NobmVlVm9uTW9yZ2VuJiZ3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuX19zY2huZWVWb25Nb3JnZW4udmlkZW9QbGF5ZXJJbnN0YW5jZXMubGVuZ3RoO2ErKyl0aGlzLktoKHdpbmRvdy5fX3NjaG5lZVZvbk1vcmdlbi52aWRlb1BsYXllckluc3RhbmNlc1thXSk7CnRoaXMuUCgpfX0pfSkoYyk7dmFyIGhiPWMuR2l8fGhiLFM9bmV3IGhiKHIpO1MuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5obD1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIGliPWMuaGx8fGliO25ldyBpYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLldqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuVChhKTtpZihhKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlcoYil9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLksuYmluZCh0aGlzKSwxMDApfSxwYXVzZTpmdW5jdGlvbigpe3RyeXt0Zm1zdWl0ZSgiIyIrCnRoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJwYXVzZSIpfWNhdGNoKGEpe319LHBsYXk6ZnVuY3Rpb24oKXt0cnl7dGZtc3VpdGUoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLnRmbXZpZGVvKCJyZXN1bWUiKX1jYXRjaChhKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBsYXkiKX19LFJjOmZ1bmN0aW9uKCl7dmFyIGE9bDtyZXR1cm4gYSYmYS5ydW5JbnNpZGVDb250YWluZXI/ITA6ITF9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iVEZNc3VpdGUifX0pfSkoYyk7dmFyIFQ9Yy5Xanx8VDsoZnVuY3Rpb24oYyl7Yy5Waj12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt4LmNkKCIjIithLCJvbkFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7d2luZG93LnNldFRpbWVvdXQodGhpcy53LmJpbmQodGhpcyksMjAwKX0uYmluZCh0aGlzKSk7CnguY2QoIiMiK2EsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5QbShhKX0uYmluZCh0aGlzKSk7eC5jZCgiIyIrYSwiYWRzTG9hZGVyRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsImFkc0xvYWRlckZhaWxlZCIpO3RoaXMuRCgpfS5iaW5kKHRoaXMpKTt4LmNkKCIjIithLCJyZXF1ZXN0QWRzRmFpbGVkIixmdW5jdGlvbigpe3RoaXMubSgiYWRlcnJvciIsInJlcXVlc3RBZHNGYWlsZWQiKTt0aGlzLkQoKX0uYmluZCh0aGlzKSk7eC5VbCgpfSxQbTpmdW5jdGlvbihhKXt2YXIgYj0iIixjO2ZvcihjIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShjKSl7Yj1pc05hTihhW2NdKT8hMTphW2NdO2lmKDEwMDk9PWFbY118fDEwMDE9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKXt0aGlzLncoKTt0aGlzLm9hKCk7cmV0dXJufWZvcih2YXIgZCBpbiBhW2NdKWlmKGFbY10uaGFzT3duUHJvcGVydHkoZCkmJihiPWlzTmFOKGFbY11bZF0pPyExOmFbY11bZF0sMTAwOT09YVtjXVtkXXx8CjEwMDE9PWFbY11bZF18fDMwMz09YVtjXVtkXXx8NDAzPT1hW2NdW2RdKSl7dGhpcy53KCk7dGhpcy5vYSgpO3JldHVybn19dGhpcy5tKCJhZGVycm9yIixiKTt0aGlzLkQoKX19KX0pKGMpO3ZhciBVPWMuVmp8fFU7KGZ1bmN0aW9uKGMpe2MuWGo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnRmbXN1aXRlKXtmb3IodmFyIGE9W10sYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxjPTA7YzxiLmxlbmd0aDtjKyspYS5wdXNoKGJbY10pO2I9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspYS5wdXNoKGJbY10pO3RoaXMuQWQmJihhPWUuZGwoYSx0aGlzLkFkKSk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGQ9YVtiXS5pZC5yZXBsYWNlKCJjb250ZW50RWxlbWVudCIsIiIpLGQ9bmV3IFQoZCk7aWYoIXRoaXMuTChkKSl7dGhpcy5OKGQpOwp2YXIgZj1uZXcgVShkLHRoaXMuRyk7Zi5mKCl9fWZvcihiPTA7YjxhLmxlbmd0aDtiKyspZm9yKGM9YVtiXTtjLnBhcmVudEVsZW1lbnQ7KXt2YXIgYz1jLnBhcmVudEVsZW1lbnQsaD1jLmdldEF0dHJpYnV0ZSgiaWQiKTtpZihoKXRyeXt0Zm1zdWl0ZSgiIyIraCkudGZtdmlkZW8oInJlc3VtZSIpLHRoaXMuQWR8fCh0aGlzLkFkPVtdKSx0aGlzLkFkLnB1c2goYVtiXSksZD1uZXcgVChoKSx0aGlzLkwoZCl8fCh0aGlzLk4oZCksZj1uZXcgVShkLHRoaXMuRyksZi5mKCkpfWNhdGNoKGspe319fXRoaXMuUCgpfSxjZDpmdW5jdGlvbihhLGIsYyl7dGhpcy5hYXx8KHRoaXMuYWE9e30pO3RoaXMuYWFbYV18fCh0aGlzLmFhW2FdPXt9KTt0aGlzLmFhW2FdW2JdfHwodGhpcy5hYVthXVtiXT1bXSk7dGhpcy5hYVthXVtiXS5wdXNoKGMpfSxubzpmdW5jdGlvbihhKXt2YXIgYj1hLnNQbGF5ZXJTZWxlY3RvcjtpZihhKWlmKCF0aGlzLmFhfHx0aGlzLmFhJiYhdGhpcy5hYVtiXSl0aGlzLk5jfHwKKHRoaXMuTmM9W10pLHRoaXMuTmMucHVzaChhKSx0aGlzLnRuKCkmJih0aGlzLnBmKCksdGhpcy5mKCkpO2Vsc2V7dmFyIGM9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYS5vRXZlbnRUeXBlJiYoYz1hLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbYl1bY10mJjA8dGhpcy5hYVtiXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLmFhW2JdW2NdLmxlbmd0aDtkKyspdGhpcy5hYVtiXVtjXVtkXShhKX19LFVsOmZ1bmN0aW9uKCl7aWYodGhpcy5OYylmb3IodmFyIGE9MDthPHRoaXMuTmMubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5OY1thXSxjPWIuc1BsYXllclNlbGVjdG9yLGQ9Im9iamVjdCI7InN0cmluZyI9PT10eXBlb2YgYi5vRXZlbnRUeXBlJiYoZD1iLm9FdmVudFR5cGUpO2lmKHRoaXMuYWFbY11bZF0mJjA8dGhpcy5hYVtjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLmFhW2NdW2RdLmxlbmd0aDtlKyspdGhpcy5hYVtjXVtkXVtlXShiKX19LHZpZGVvcGtnSW50ZXJmYWNlOmZ1bmN0aW9uKGEpeyJhdXRvUmVzaXplQ2FsbGJhY2tCZWZvcmUiIT0KYS5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWEub0V2ZW50VHlwZS5oJiZ4Lm5vKGEpfX0pfSkoYyk7dmFyIGpiPWMuWGp8fGpiLHg9bmV3IGpiKHIpO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmJuPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIga2I9Yy5ibnx8a2I7bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuQmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5tdXRlZD0hMTt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmdldFJhd1BsYXllcigpKTt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7CnRoaXMuVyhiKX0scGF1c2U6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wYXVzZSgpfSl9LHBsYXk6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5wbGF5KCl9KX0sd2E6ZnVuY3Rpb24oKXskKCIjIit0aGlzLmdldFJhd1BsYXllcigpKS5kYXRhKCJtZWRpYXBsYXllciIpLnRoZW4oZnVuY3Rpb24oYSl7YS5pc1BsYXlpbmcoKSYmYS5wYXVzZSgpfSl9LHNhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXV0ZWR9LFI6ZnVuY3Rpb24oKXtyZXR1cm4iQmlsZE1lZGlhUGxheWVyIn19KX0pKGMpO3ZhciBsYj1jLkJpfHxsYjsoZnVuY3Rpb24oYyl7Yy5DaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKJCgiIyIrYSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGEpe3RoaXMucGxheWVyLm11dGVkPWEuZGF0YS5tdXRlZDthLm9uKCJlcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXtpZighYS5pc1BsYXlpbmd8fGEuaXNQbGF5aW5nKCkpYS5pc0FkJiZhLmlzQWQoKT90aGlzLncoKTphLmRhdGEmJmEuZGF0YS5hZHMmJmEuZGF0YS5hZHMudmFzdCYmYS5kYXRhLmFkcy52YXN0LnNyY2VzPyh0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm0oIm5vQWQiLCJwbGF5ZWQiKTt0aGlzLkQoITApfS5iaW5kKHRoaXMpLDI1MCl9LmJpbmQodGhpcykpO2Eub24oInBhdXNlIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigid2FpdGluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpOwphLm9uKCJhZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZEVycm9yIixmdW5jdGlvbigpe3RoaXMuRCgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZExvYWRlZCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oIkFkU3RhcnRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1N0YXJ0IixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFBsYXlpbmciLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9GaXJzdFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvTWlkcG9pbnQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9UaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgbWI9Yy5DaXx8Cm1iOyhmdW5jdGlvbihjKXtjLkRpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIm1lZGlhcGxheWVyIik7aWYod2luZG93LmRlJiZ3aW5kb3cuZGUuYmlsZCYmd2luZG93LmRlLmJpbGQubWVkaWFwbGF5ZXImJmEmJjA8YS5sZW5ndGgpZm9yKHZhciBiIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShiKSl7dmFyIGM9YVtiXSxkPSIiO3RyeXtkPWMuZ2V0QXR0cmlidXRlKCJpZCIpfWNhdGNoKGUpe2Q9Yy5pZH1pZihkJiYkKCIjIitkKS5kYXRhKCJtZWRpYXBsYXllciIpKXRyeXt2YXIgaD1uZXcgbGIoZCk7dGhpcy5MKGgpfHwodGhpcy5OKGgpLChuZXcgbWIoaCx0aGlzLkcpKS5mKCkpfWNhdGNoKGspe319dGhpcy5QKCl9LEw6ZnVuY3Rpb24oYSl7dmFyIGI9YS5nZXRSYXdQbGF5ZXIoKTskKCIjIitiKTtmb3IodmFyIGMgaW4gdGhpcy5KYSlpZihiPT10aGlzLkphW2NdLmdldFJhd1BsYXllcigpKXJldHVybiEwOwpyZXR1cm4gdGhpcy5KYVthLmhhKCldPyEwOiExfX0pfSkoYyk7dmFyIG5iPWMuRGl8fG5iLG9iPW5ldyBuYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuTWk9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBwYj1jLk1pfHxwYjtuZXcgcGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy55aj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLndnPXRoaXMuRWM9ITEsYj0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZnVuY3Rpb24oYSl7dHJ5e2lmKGEmJmEuc291cmNlJiZhLnNvdXJjZS5fZW52dmFycyl7dmFyIGI9dGhpcy5KZyhhLnNvdXJjZS5fZW52dmFycyk7YiYmKHRoaXMuRWM9Yik7aWYoIXRoaXMud2cmJihhLnNvdXJjZS5DSE9PU0VSX1RJTUV8fAphLnNvdXJjZS5DSE9PU0VSX0FCKSl7dmFyIGM9YS5zb3VyY2UuQ0hPT1NFUl9USU1FfHwiIjtlLnRyYWNrKCJzdGF0c19jaG9vc2VyX2FiIixhLnNvdXJjZS5DSE9PU0VSX0FCfHwiIiwhMCk7ZS50cmFjaygic3RhdHNfY2hvb3Nlcl90aW1lIixjLCEwKTt0aGlzLndnPSEwfX19Y2F0Y2goaCl7fX0uYmluZCh0aGlzKSk7dGhpcy5WZygpO3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQmJihhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkuY29udGFpbmVySUQpKTthJiYoYj1hKTt0aGlzLlQoYSk7dGhpcy5XKGIpO3RoaXMuZ24odGhpcy5nZXRSYXdQbGF5ZXIoKSxhKTt0aGlzLmdldFJhd1BsYXllcigpfSxWZzpmdW5jdGlvbigpe2lmKHRoaXMuRWMpcmV0dXJuIHRoaXMuRWM7aWYodGhpcy5nZXRSYXdQbGF5ZXIoKS5lbnZ2YXJzKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLmVudnZhcnMoKTtpZihhPXRoaXMuSmcoYSkpcmV0dXJuIHRoaXMuRWM9CmF9fSxKZzpmdW5jdGlvbihhKXt2YXIgYj0hMTthJiZhLnZpZGVvU2xvdCYmKGI9YSk7YSYmYS5oZHZwYWlkJiYoYj1hLmhkdnBhaWQpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe30sZ246ZnVuY3Rpb24oYSxiKXthJiZhLnBhdXNlRXZlbnQmJmIuYWRkRXZlbnRMaXN0ZW5lcihhLnBhdXNlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnBhdXNlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5wYXVzZSYmdGhpcy5lYS5wYXVzZSgpfS5iaW5kKHRoaXMpKTthJiZhLnJlc3VtZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5yZXN1bWVFdmVudCxmdW5jdGlvbigpe3RoaXMuZWEmJnRoaXMuZWEucmVzdW1lJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5yZXN1bWUmJnRoaXMuZWEucmVzdW1lKCl9LmJpbmQodGhpcykpO2EmJmEubXV0ZUV2ZW50JiZiLmFkZEV2ZW50TGlzdGVuZXIoYS5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiYKdGhpcy5lYS5tdXRlJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5lYS5tdXRlJiZ0aGlzLmVhLm11dGUoKX0uYmluZCh0aGlzKSk7YSYmYS51bm11dGVFdmVudCYmYi5hZGRFdmVudExpc3RlbmVyKGEudW5tdXRlRXZlbnQsZnVuY3Rpb24oKXt0aGlzLmVhJiZ0aGlzLmVhLnVubXV0ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZWEudW5tdXRlJiZ0aGlzLmVhLnVubXV0ZSgpfS5iaW5kKHRoaXMpKX0sbWg6ZnVuY3Rpb24oYSl7dGhpcy5lYT1hfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIk9ubHlIT01BRCJ9fSl9KShjKTt2YXIgcWI9Yy55anx8cWI7KGZ1bmN0aW9uKGMpe2MueGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLnRpPSExfSxmOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxiPXRoaXMuZ2V0UGxheWVyKCk7YS5hdXRvc3RhcnQmJiF0aGlzLnRpJiYodGhpcy5nKCksdGhpcy50aT0hMCx0aGlzLmthKCkpOwpiLkdhKCkuYWRkRXZlbnRMaXN0ZW5lcihhLnBsYXlFdmVudCxmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuVmcoKT90aGlzLkQoKToodGhpcy55ZXx8KHRoaXMueWU9MSksdGhpcy55ZSsrLDEwMDx0aGlzLnllP3RoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KHRoaXMuZy5iaW5kKHRoaXMpLDEwKSl9fSl9KShjKTt2YXIgcmI9Yy54anx8cmI7KGZ1bmN0aW9uKGMpe2Muemo9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7aWYobCl7aWYobC5wbGF5ZXIpe3ZhciBhPWwucGxheWVyO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChiKXtlLnRyYWNrKCJvbmx5SE9NQURDb25mRmFpbGVkIiwiIiwhMCl9Zm9yKHZhciBjPSExLGQ9MDtkPGEubGVuZ3RoO2QrKyljPW5ldyBxYihhW2RdKSx0aGlzLkwoYyl8fCh0aGlzLk4oYyksKG5ldyByYihjLHRoaXMuRykpLmYoKSl9fWVsc2UgdGhpcy5QKCl9fSl9KShjKTsKdmFyIHNiPWMuemp8fHNiLFY9bmV3IHNiKHIpO1YuZigpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy5RbT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIHRiPWMuUW18fHRiO25ldyB0YigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLmZrPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLlQoYSk7YT10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuVyhhKTt0aGlzLmlzUGxheWluZz0hMTthLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLnZpZGVvVGFnO3JldHVybiBhP2EubXV0ZWQ6ITB9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuY3VycmVudFRpbWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuZHVyYXRpb259LEthOmZ1bmN0aW9uKCl7MDx0aGlzLmdldER1cmF0aW9uKCkmJjA8dGhpcy5nZXRDdXJyZW50VGltZSgpJiYxLjU+dGhpcy5nZXREdXJhdGlvbigpLXRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmdGhpcy5VPygwLHRoaXMuVSkoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuS2EoKX0uYmluZCh0aGlzKSw0MDApfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIldGdjQifX0pfSkoYyk7dmFyIHViPWMuZmt8fHViOyhmdW5jdGlvbihjKXtjLmVrPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEljOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKSwKYT1hLmdldFJhd1BsYXllcigpO3JldHVybiBhLmltYUFkc0xvYWRlcn0sZW46ZnVuY3Rpb24oYSl7YS5hZGRFdmVudExpc3RlbmVyKGdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IsZnVuY3Rpb24oYSl7YT1hLmdldEVycm9yKCk7YS5nZXRFcnJvckNvZGUoKTt0aGlzLmVifHwodGhpcy5lYj1bXSk7dGhpcy5lYi5wdXNoKGEuZ2V0RXJyb3JDb2RlKCkpOzEwMDk9PWEuZ2V0RXJyb3JDb2RlKCl8fDMwMz09YS5nZXRFcnJvckNvZGUoKXx8NDAzPT1hLmdldEVycm9yQ29kZSgpP3RoaXMub2EoKTp0aGlzLm0oImFkZXJyb3IiLGEuZ2V0RXJyb3JDb2RlKCkpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImFkc01hbmFnZXJMb2FkZWQiLGZ1bmN0aW9uKCl7dGhpcy54Yz0hMDt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJsb2ciLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZjpmdW5jdGlvbigpe3RoaXMuZygpO3RoaXMuZ2V0UGxheWVyKCk7CnRoaXMuQmE/dGhpcy5lbih0aGlzLkJhKToodGhpcy5CYT10aGlzLkljKCksd2luZG93LnNldFRpbWVvdXQodGhpcy5mLmJpbmQodGhpcyksMTAwKSl9LGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpO2lmKGEuaXNQbGF5aW5nJiYxPGEuZ2V0Q3VycmVudFRpbWUoKSl7aWYoIXRoaXMuQmEpe3RoaXMuRCgpO3JldHVybn1pZighdGhpcy54Yyl7dGhpcy5EKCk7cmV0dXJufWE9ITA7aWYodGhpcy5lYiYmdGhpcy5lYi5sZW5ndGgmJjE8dGhpcy5lYi5sZW5ndGgpZm9yKHZhciBiPTA7Yjx0aGlzLmViLmxlbmd0aC0xO2IrKykxMDA5IT10aGlzLmViW2JdJiYzMDMhPXRoaXMuZWJbYl0mJjQwMyE9dGhpcy5lYltiXSYmKGE9ITEpO2lmKGEpdGhpcy53KCJlbXB0eSIpLHRoaXMub2EoKTtlbHNle3RoaXMuRCgpO3JldHVybn19d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoKX0uYmluZCh0aGlzKSw1MDApfX0pfSkoYyk7dmFyIHZiPWMuZWt8fHZiOyhmdW5jdGlvbihjKXtjLmdrPQp0LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXt0aGlzLlRhPS0xO3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxhLmxlbmd0aClmb3IodmFyIGIgaW4gYSl7dmFyIGM9bmV3IHViKGEuaXRlbShiKSk7dGhpcy5MKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwodGhpcy5OKGMpLChuZXcgdmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIHdiPWMuZ2t8fHdiLHhiPW5ldyB3YihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuYm09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciB5Yj1jLmJtfHx5YjtuZXcgeWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5Saj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LApLOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKVswXTt0aGlzLlQoYSk7dGhpcy5XKGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF0pO3RoaXMuamY9ITF9LEthOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLldtKCl9LmJpbmQodGhpcyksNTAwKX0sV206ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBvc2l0aW9uKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5VJiZ0aGlzLlUoKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYj1hLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBifSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksCmI9MDthLnBsYXliYWNrLmdldFBvc2l0aW9uJiYoYj1hLnBsYXliYWNrLmdldFBvc2l0aW9uKCkpO3JldHVybiBifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuamYmJndpbmRvdy5jbGVhckludGVydmFsKHRoaXMuamYpO3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheWJhY2sucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBhLnBsYXliYWNrJiZhLnBsYXliYWNrLmdldFBsYXlTdGF0ZT8oYS5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWEucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXbjpmdW5jdGlvbigpe3RoaXMuamY9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciB6Yj1jLlJqfHwKemI7KGZ1bmN0aW9uKGMpe2MuUWo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKTt0aGlzLnBjPTB9LGY6ZnVuY3Rpb24oKXt0aGlzLkVtPTEwO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5wY3x8KHRoaXMucGM9MCxhLmFkZEV2ZW50TGlzdGVuZXIoImFkRXJyb3IiLGZ1bmN0aW9uKCl7dGhpcy5tKCJhZGVycm9yIik7dGhpcy5nKCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKCl7fSkpO3dpbmRvdy52aWRlb3BsYXphPyh3aW5kb3cudmlkZW9wbGF6YS5idWlsZERhdGV8fCh0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8Cih0aGlzLm0oIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMuZygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLm1vZGVsfHwodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5wYXJzZXx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUucmVxdWVzdHx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSksd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubSgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5nKCkpKToodGhpcy5wY3x8dGhpcy5wYysrLHRoaXMucGM8PXRoaXMuRW0/KHRoaXMucGMrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZigpfS5iaW5kKHRoaXMpLAo1MDApKToodGhpcy5tKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLmcoKSkpfSxnOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKT8odGhpcy5nZXRQbGF5ZXIoKS5XbigpLHRoaXMuRCgpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZygpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgQWI9Yy5Ranx8QWI7KGZ1bmN0aW9uKGMpe2MuU2o9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgibXR2LXBsYXllci1jb250YWluZXIiKSxiPSExO2EmJmFbMF0mJihiPWFbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZhJiYoYT1uZXcgemIod2luZG93LnBsYXllckFwaSksdGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgQWIoYSwKdGhpcy5HKSkuZigpKSk7dGhpcy5QKCl9fSl9KShjKTt2YXIgQmI9Yy5Tanx8QmIsQ2I9bmV3IEJiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy54bz1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIERiPWMueG98fERiO25ldyBEYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLlBqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZS5wYXJlbnROb2RlO3RoaXMuVChhKTthPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5XKGEpO3RoaXMuaXNQbGF5aW5nPSExO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCksYj0iIjthLmN1cnJlbnRUaW1lJiYoYj1hLmN1cnJlbnRUaW1lKTtyZXR1cm4gYn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MDthLmR1cmF0aW9uJiYoYj1hLmR1cmF0aW9uKTtyZXR1cm4gYn0sS2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldEN1cnJlbnRUaW1lKCksYj10aGlzLmdldER1cmF0aW9uKCk7YSYmYiYmMT5iLWE/dGhpcy5VKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkthKCl9LmJpbmQodGhpcyksMjAwKX0sUjpmdW5jdGlvbigpe3JldHVybiJSYWRpYW50TVAifX0pfSkoYyk7dmFyIEViPWMuUGp8fEViOyhmdW5jdGlvbihjKXtjLk9qPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5HYSgpLGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZztiJiZiLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmthKCk7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc9ITF9LmJpbmQodGhpcykpO3RoaXMuZ2V0UGxheWVyKCk7YS5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuWGsoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJhZHN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy53KCl9LmJpbmQodGhpcykpO2E9dGhpcy5CYigpOzA8YS5nZXRDdXJyZW50VGltZSgpP3RoaXMudW0oKTp0aGlzLnRnKCk7YS5hdXRvcGxheSYmd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmFnKCl8fCh0aGlzLm0oImNvbnRlbnRwbGF5IiksdGhpcy5nKCEwKSl9LmJpbmQodGhpcyksCjFFMyl9LFhrOmZ1bmN0aW9uKCl7dGhpcy5hZygpfHx0aGlzLmcoITApfSx1bTpmdW5jdGlvbigpe3ZhciBhPXRoaXMuQmIoKTshYS5uYSYmYS5WJiZhLnpwJiZhLkJwJiYodGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHRoaXMuZygpKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLkJiKCk7YS5hZHNMb2FkZXI/YS5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe3ZhciBjO2E6e2E9YS5nZXRFcnJvcigpO2ZvcihjIGluIGEpaWYoIm51bWJlciI9PXR5cGVvZiBhW2NdKXtjPWFbY107YnJlYWsgYX1jPXZvaWQgMH0xMDA5PT1jfHwzMDM9PWN8fDQwMz09Yz8odGhpcy53KCksdGhpcy5vYSgpKToodGhpcy5tKCJhZGVycm9yIixjKSx0aGlzLmcoKSl9LmJpbmQodGhpcykpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZygpfS5iaW5kKHRoaXMpLDEwMCl9LEJiOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQ2gpZm9yKHZhciBhPQpjLlpjLkJiKCksYj10aGlzLmdldFBsYXllcigpLkdhKCkuaWQsZT0wO2U8YS5sZW5ndGg7ZSsrKWFbZV0uaWQ9PWImJih0aGlzLkNoPWFbZV0pO3JldHVybiB0aGlzLkNofSxVcDpmdW5jdGlvbigpe3JldHVybiB3aW5kb3cuaW1hPyFpbWEudmlkZW8uY2xpZW50LmpzVGFnJiYhaW1hLnZpZGVvLmNsaWVudC50YWdnZWQmJiFpbWEudmlkZW8uY2xpZW50LmdldEVEYXRhOiExfSxnOmZ1bmN0aW9uKGEpe3RoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nP2E/dGhpcy5CYigpLmFkc0xvYWRlcj90aGlzLkQoITApOnRoaXMuRCgpOnRoaXMuRCgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBGYj1jLk9qfHxGYjsoZnVuY3Rpb24oYyl7Yy5aYz10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LFBrOmZ1bmN0aW9uKGEpe2E9bmV3IEViKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTsKdGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgRmIoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9Yy5aYy5CYigpO2lmKGEmJmEubGVuZ3RoKWZvcih2YXIgYj0wO2I8YS5sZW5ndGg7YisrKXRoaXMuUGsoYVtiXSk7dGhpcy5QKCl9fSk7Yy5aYy5CYj1mdW5jdGlvbigpe3ZhciBhPVtdO2lmKGwmJmwucGxheWVyYXBpJiYoYT1sLnBsYXllcmFwaSgpKSYmYS5sZW5ndGgpcmV0dXJuIGE7dmFyIGE9W10sYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIucm1wLWNvbnRhaW5lciIpO2lmKGImJmIubGVuZ3RoKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXS5mZXJtb2Q7ZCYmYS5wdXNoKGQpfWlmKGEmJmEubGVuZ3RoKXJldHVybiBhfWE9W107aWYoKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZiLmxlbmd0aCl7Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdJiZiW2NdLmZlcm1vZCYmYS5wdXNoKGJbY10uZmVybW9kKSwKYltjXSYmYltjXS5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQuZmVybW9kJiZhLnB1c2goYltjXS5wYXJlbnRFbGVtZW50LmZlcm1vZCksYltjXSYmYltjXS5wYXJlbnRFbGVtZW50JiZiW2NdLnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudCYmYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuZmVybW9kJiZhLnB1c2goYltjXS5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuZmVybW9kKTtpZihhJiZhLmxlbmd0aClyZXR1cm4gYX1yZXR1cm5bXX19KShjKTt2YXIgR2I9Yy5aY3x8R2IsSGI9bmV3IEdiKHIpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt9Yy4kaT1hO2EucHJvdG90eXBlPXt9fSkoYyk7dmFyIEliPWMuJGl8fEliO25ldyBJYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLnVqPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sCks6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RSYmKGE9YS5maXJzdENoaWxkKTtpZihhKXt0aGlzLlQoYSk7aWYoYS50YWdOYW1lKXt2YXIgYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2J8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1iP3RoaXMuVyhiKTp0aGlzLlooKX1lbHNlIHRoaXMuWigpfSxTcDpmdW5jdGlvbigpe3ZhciBhPSExOzA8PWUuQ2IoZG9jdW1lbnQubG9jYXRpb24uaHJlZikuaW5kZXhPZigic3BpZWdlbC5kZSIpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRSl7dmFyIGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuX3BsYXkuY29udHJvbC5pbnRlcmFjdC5wYXVzZShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwYXVzZSIpfSwKcGxheTpmdW5jdGlvbigpe2lmKEUpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShhLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LHdhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy52aWRlb1RhZztyZXR1cm4gYSYmIWEucGF1c2VkPyh0aGlzLnBhdXNlKCksITApOiExfSxSOmZ1bmN0aW9uKCl7cmV0dXJuIm5leHQifSxSYzpmdW5jdGlvbigpe3JldHVybiEwfSxHYTpmdW5jdGlvbigpe3ZhciBhO0U/KGE9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEuaWQpLmZpcnN0Q2hpbGQpOmE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpO2EhPXRoaXMuY29udGFpbmVyJiYodGhpcy5jb250YWluZXI9YSk7cmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFc9CmMudWp8fFc7KGZ1bmN0aW9uKGMpe2MudGo9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMua2Y9IiI7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthJiYodGhpcy5rZj1hLmlkKTtFP3dpbmRvdy5fcGxheS5jb25maWcuYWRkQWRkb25MaXN0ZW5lcihmdW5jdGlvbihhKXt2YXIgYz1hLnBsYXllckNvbnRhaW5lcjtjJiZ0aGlzLmtmJiZjIT10aGlzLmtmfHwiYWRlcnJvciIhPWEuZXZlbnR8fGUuRigidGVsZTUuZGUiKSYmInBvc3Ryb2xsIj09YS5hZFR5cGV8fChhLmFkVVJMJiYobC5hZFRhZz1hLmFkVVJMKSx0aGlzLm0oImFkZXJyb3IiLGEuJHApLHRoaXMuRCgpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5rYSgpfS5iaW5kKHRoaXMpLDEwMCkpfS5iaW5kKHRoaXMpLCJzdm0iKTp3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZXRMaXN0ZW5lcihmdW5jdGlvbihhKXsiYWRlcnJvciI9PWEmJgoodGhpcy5tKCJhZGVycm9yIiksdGhpcy5EKCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmthKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIFg9Yy50anx8WDsoZnVuY3Rpb24oYyl7Yy52aj10LmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX3BsYXkmJndpbmRvdy5fcGxheS5hZGRvbnMmJndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtKXtFPSJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXI/ITE6ITA7dmFyIGE7aWYoRSlmb3IodmFyIGI9d2luZG93Ll9wbGF5LmNvbnRyb2wuZ2V0SW5zdGFuY2VzKCksYz1iLmxlbmd0aCxkPTA7ZDxjO2QrKyl7aWYoYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2RdKSlhPW5ldyBXKGEpLGEuamF8fHRoaXMuTChhKXx8KHRoaXMuTihhKSxhPW5ldyBYKGEsdGhpcy5HKSxhLmYoKSl9ZWxzZSBpZihhPQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSkpYT1uZXcgVyhhKSxhLmphP3RoaXMucGYoKTp0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWChhLHRoaXMuRyksYS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIEUsSmI9Yy52anx8SmIsS2I9bmV3IEpiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuVW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBMYj1jLlVtfHxMYjtuZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5ZaT1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9ITEsYz0hMTthP2EuR2V0VmlkZW9FbD9hLkdldEVsPyhiPWEuR2V0VmlkZW9FbCgpLApjPWEuR2V0RWwoKSxiJiZjPyh0aGlzLlQoYyksdGhpcy5XKGIpKTp0aGlzLlooKSk6dGhpcy5aKCk6dGhpcy5aKCk6dGhpcy5aKCl9LHduOmZ1bmN0aW9uKCl7fSxzYTpmdW5jdGlvbigpe3ZhciBhPSExO3RoaXMuZ2V0UmF3UGxheWVyKCkuSXNNdXRlZCgpJiYoYT0hMCk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5QbGF5KCl9LHdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuSXNQYXVzZWQoKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sUjpmdW5jdGlvbigpe3JldHVybiJHb3JpbGxhTWVkaWEifSxYcDpmdW5jdGlvbigpe319KX0pKGMpO3ZhciBNYj1jLllpfHxNYjsoZnVuY3Rpb24oYyl7Yy5YaT12LmV4dGVuZCh7aTpmdW5jdGlvbihhLGIpe3RoaXMuaihhLGIpfSxmOmZ1bmN0aW9uKCl7dGhpcy5PPXRoaXMuT3x8ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTsKdGhpcy5xZygpO2EuT24oImFkRXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuaGFuZGxlRXJyb3IoYSl9LmJpbmQodGhpcykpO2EuT24oImFkRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRNaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5PbigiYWRUaGlyZFF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfS5iaW5kKHRoaXMpKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYSl7YS5kZXRhaWwmJiJjb250ZW50UGxheWVyUGxheSI9PWEuZGV0YWlsLm5hbWUmJnRoaXMua2EoKX0uYmluZCh0aGlzKSl9LHFnOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCksYj1hLkdldEFkRXJyb3JzQ2FjaGUoKSxjPTA7YzxiLmxlbmd0aDtjKyspdGhpcy5oYW5kbGVFcnJvcihiW2NdKTthLkNsZWFyQWRFcnJvcnNDYWNoZSgpfSxoYW5kbGVFcnJvcjpmdW5jdGlvbihhKXtpZihudWxsPT0KYSl0aGlzLnFnKCk7ZWxzZXtpZigib2JqZWN0Ij09dHlwZW9mIGEpaWYoYSYmYS5sZW5ndGgpZm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspYVtiXSYmYVtiXS52YXN0RXJyb3JDb2RlJiYoYT1hW2JdLnZhc3RFcnJvckNvZGUpO2Vsc2UgYSYmYS52YXN0RXJyb3JDb2RlJiYoYT1hLnZhc3RFcnJvckNvZGUpOzEwMDk9PWF8fDMwMz09YXx8NDAzPT1hPyh0aGlzLncoKSx0aGlzLm9hKCkpOih0aGlzLm0oImFkZXJyb3IiLGEpLHRoaXMuZygpKX19LGc6ZnVuY3Rpb24oYSl7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIE5iPWMuWGl8fE5iOyhmdW5jdGlvbihjKXtjLlppPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPXdpbmRvdy5Hb3JpbGxhTWVkaWFwbGF5ZXJGcmFtZXdvcms7YXx8KGE9d2luZG93LlRPbmxpbmVNZWRpYXBsYXllckZyYW1ld29yayk7aWYoYSYmYS5HZXRBbGxQbGF5ZXJzJiYoYT1hLkdldEFsbFBsYXllcnMoKSkmJjA8YS5sZW5ndGgpZm9yKHZhciBiPQowO2I8YS5sZW5ndGg7YisrKXt2YXIgYz1uZXcgTWIoYVtiXSk7Yy5qYXx8dGhpcy5MKGMpfHwodGhpcy5OKGMpLChuZXcgTmIoYyx0aGlzLkcpKS5mKCkpfXRoaXMuUCgpfX0pfSkoYyk7dmFyIE9iPWMuWml8fE9iLFBiPW5ldyBPYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuSW09YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBRYj1jLkltfHxRYjtuZXcgUWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5qaz1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKTtpZihhJiZhWzBdKXtmb3IodmFyIGI9YT1hWzBdO2ImJmIucGFyZW50Tm9kZTspe2lmKCJCT0RZIj09Yi5wYXJlbnROb2RlLm5vZGVOYW1lKXtiPWIucGFyZW50Tm9kZTsKYnJlYWt9Yj1iLnBhcmVudE5vZGV9dGhpcy5XKGEpO3RoaXMuVChiKX1lbHNlIHRoaXMuWigpfSxSZDpmdW5jdGlvbihhKXt2YXIgYj0hMTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9iPW5ldyBDdXN0b21FdmVudChhLHtkZXRhaWw6e319KTooYj1kb2N1bWVudC5jcmVhdGVFdmVudCgiQ3VzdG9tRXZlbnQiKSxiLmluaXRDdXN0b21FdmVudChhLCExLCExLGRhdGEpKTtiJiZ3aW5kb3cuZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChiKX0sZm46ZnVuY3Rpb24oKXt0aGlzLlhjPSExO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoZEV2ZW50IixmdW5jdGlvbihhKXtpZihhLmRldGFpbCYmImFkUmVxdWVzdCI9PWEuZGV0YWlsLm5hbWUpdHJ5e3RoaXMuWGN8fCh0aGlzLlhjPSEwLHRoaXMuUmQoIngtZGw4LWhkLWNvbnRlbnQtYWQtc3RhcnRlZCIpKX1jYXRjaChiKXt9fS5iaW5kKHRoaXMpKX0scGF1c2U6ZnVuY3Rpb24oKXt0cnl7dGhpcy5SZCgieC1kbDgtaGQtY29udGVudC1wYXVzZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBhdXNlKCl9fSwKcGxheTpmdW5jdGlvbigpe3RyeXt0aGlzLlhjJiYodGhpcy5SZCgieC1kbDgtaGQtY29udGVudC1hZC1jb21wbGV0ZWQiKSx0aGlzLlhjPSExKSx0aGlzLlJkKCJ4LWRsOC1oZC1jb250ZW50LXJlc3VtZS1yZXF1ZXN0ZWQiKX1jYXRjaChhKXt0aGlzLnZpZGVvVGFnLnBsYXkoKX19LHdhOmZ1bmN0aW9uKCl7aWYoIXRoaXMudmlkZW9UYWcucGF1c2VkKXJldHVybiB0aGlzLnBhdXNlKCksITB9LFI6ZnVuY3Rpb24oKXtyZXR1cm4ieHltYXRpYyJ9fSl9KShjKTt2YXIgUmI9Yy5qa3x8UmI7KGZ1bmN0aW9uKGMpe2MuaWs9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sTGg6ZnVuY3Rpb24oKXt2YXIgYT13aW5kb3cuX19kbDhfYWRzTG9hZGVyO2E/KGEmJmEuYWRkRXZlbnRMaXN0ZW5lciYmKGEuYWRkRXZlbnRMaXN0ZW5lcigiaW1wcmVzc2lvbiIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLGEuYWRkRXZlbnRMaXN0ZW5lcigiZmlyc3RxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLncoKX0pLAphLmFkZEV2ZW50TGlzdGVuZXIoIm1pZHBvaW50IixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJ0aGlyZHF1YXJ0aWxlIixmdW5jdGlvbigpe3RoaXMudygpfSksYS5hZGRFdmVudExpc3RlbmVyKCJhZHNFcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5iYyhhKX0uYmluZCh0aGlzKSksYS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIixmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKSksYSYmYS5hZGRBZEVycm9yTGlzdGVuZXImJmEuYWRkQWRFcnJvckxpc3RlbmVyKGZ1bmN0aW9uKGEpe3RoaXMuYmMoYSl9LmJpbmQodGhpcykpKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLkxoLmJpbmQodGhpcyksMTApfSxiYzpmdW5jdGlvbihhKXt2YXIgYj17fTthLmdldEVycm9yJiYoYS5nZXRFcnJvcigpLGI9YS5nZXRFcnJvcigpKTtiLmdldEVycm9yQ29kZT8oYi5nZXRFcnJvckNvZGUoKSx0aGlzLm0oImFkZXJyb3IiLGIuZ2V0RXJyb3JDb2RlKCkpLHRoaXMub2s9CiEwLDEwMDk9PWIuZ2V0RXJyb3JDb2RlKCl8fDMwMz09Yi5nZXRFcnJvckNvZGUoKXx8NDAzPT1iLmdldEVycm9yQ29kZSgpP3RoaXMudygpOnRoaXMuZygpKToodGhpcy5va3x8dGhpcy5tKCJub2ZyYW1ld29yayIpLHRoaXMuZygpKX0sWWY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuX19kbDhfYWRFcnJvckV2ZW50QnVja2V0KWZvcih2YXIgYT0wO2E8d2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldC5sZW5ndGg7YSsrKXRoaXMuYmMod2luZG93Ll9fZGw4X2FkRXJyb3JFdmVudEJ1Y2tldFthXSk7dGhpcy56YSgpfHx3aW5kb3cuc2V0VGltZW91dCh0aGlzLllmLmJpbmQodGhpcyksMTAwKX0sZjpmdW5jdGlvbigpe3RoaXMuTGgoKTt0aGlzLllmKCk7dGhpcy5qbigpfSxqbjpmdW5jdGlvbigpe3dpbmRvdy5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ4LWRsOC1oZC1yZXF1ZXN0LWFkcy1mYWxsYmFjayIsdGhpcy5nby5iaW5kKHRoaXMpKTt3aW5kb3cuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigieC1kbDgtaGQtcHVzaC1lcnJvci1idWNrZXQiLApmdW5jdGlvbihhKXt0aGlzLmJjKGEpfS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmRuP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMDApfSxnbzpmdW5jdGlvbihhKXt0aGlzLmRuPSEwO2lmKGEmJmEuZGV0YWlsKWZvcih2YXIgYiBpbiBhLmRldGFpbCkiYWRUYWdVcmwiPT1iJiYoYS5kZXRhaWxbYl18fHRoaXMuYmMoYSkpfX0pfSkoYyk7dmFyIFNiPWMuaWt8fFNiOyhmdW5jdGlvbihjKXtjLmtrPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe2lmKHdpbmRvdy5ETDhfR0xPQkFMUyl7dmFyIGE9bmV3IFJiKHdpbmRvdy5ETDhfR0xPQkFMUyk7YS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGEuZm4oKSxhPW5ldyBTYihhLHRoaXMuRyksd2luZG93LkRMOF9yZXF1ZXN0QWRzRmFsbGJhY2t8fCh3aW5kb3cuREw4X3JlcXVlc3RBZHNGYWxsYmFjaz1hLmdvLmJpbmQoYSkpLAphLmYoKSl9dGhpcy5QKCl9fSl9KShjKTt2YXIgVGI9Yy5ra3x8VGIsVWI9bmV3IFRiKGZhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuamw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBWYj1jLmpsfHxWYjtuZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5aaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt0aGlzLkZoPSExO3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYS52aWRlb01vZGVsKXt2YXIgYj1hLnZpZGVvTW9kZWwuZ2V0KCJwbGF5ZXJFbGVtZW50Iik7aWYoYil7dGhpcy5UKGIpO3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07Y3x8KGM9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2M/KHRoaXMuVyhjKSxhLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLApmdW5jdGlvbihhKXt0aGlzLkptPWF9LmJpbmQodGhpcykpLGEudmlkZW9Nb2RlbC5vYnNlcnZlKCJkdXJhdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5kdXJhdGlvbj1hfS5iaW5kKHRoaXMpKSk6dGhpcy5aKCl9ZWxzZSB0aGlzLlooKX1lbHNlIHRoaXMuWigpfSx3bjpmdW5jdGlvbigpe30sc2E6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLGI9MTtyZXR1cm4gYS52aWRlb01vZGVsJiZhLnZpZGVvTW9kZWwuZ2V0JiYoYj1hLnZpZGVvTW9kZWwuZ2V0KCJ2b2x1bWUiKSwwPGIpPyExOiEwfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLnBsYXkoKX0sd2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS52aWRlb01vZGVsLmdldCgiaXNQYXVzZWQiKT8hMToodGhpcy5wYXVzZSgpLCEwKX0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KbX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LFI6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sS2E6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuUGQoYSl9LmJpbmQodGhpcykpfSxQZDpmdW5jdGlvbihhKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5hJiYoYT10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBiPXRoaXMuZ2V0RHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0xJiYhdGhpcy5GaCYmKHRoaXMuRmg9ITAsdGhpcy5VJiZ0aGlzLlUoKSl9fSl9KShjKTt2YXIgTj1jLlpqfHxOOyhmdW5jdGlvbihjKXtjLllqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LEJhOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZighdGhpcy5CZSlpZih0aGlzLkhifHwKKHRoaXMuSGI9MCksdGhpcy5IYisrLDE1PHRoaXMuSGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhKXJldHVybiB3aW5kb3cuY2FuUnVuQWRzP3RoaXMuSm4oKTp0aGlzLmcoITApLCEwO3RoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKTthLnZpZGVvTW9kZWwuZ2V0KCJhZFRhZ1VybCIpP3RoaXMuZygpOnRoaXMuZyghMCl9ZWxzZSBpZihhPWEudmlkZW9Nb2RlbC5nZXQoImFkc0xvYWRlciIpKXt0aGlzLkJlPSEwO3ZhciBiPSJhZEVycm9yIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7YS5hZGRFdmVudExpc3RlbmVyKGIsCmZ1bmN0aW9uKGEpe3RoaXMuY2EoYSk7dGhpcy5xYigpfHwodGhpcy5tKCJhZGVycm9yIix0aGlzLk8pLHRoaXMuZygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQmEoKX0uYmluZCh0aGlzKSwxMCl9LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLk89YSxiLm0oImFkZXJyb3IiLGEpKTpiLm0oImFkZXJyb3IiKX1yZXR1cm4gY31hLm9yaWdpbmFsRXZlbnQmJihhPWEub3JpZ2luYWxFdmVudCk7aWYoYS5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZ2V0RXJyb3Ipe3ZhciBjPQphLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0sZjpmdW5jdGlvbigpe3RoaXMuTz10aGlzLk98fCExO3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5CYSgpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLGZ1bmN0aW9uKGEpeyJwbGF5aW5nIj09YSYmKHRoaXMuaXNQbGF5aW5nPSEwKX0uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoInBsYXlNb2RlIiwKZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2EudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sZzpmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz90aGlzLkQoYSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmcoYSl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIE89Yy5Zanx8TzsoZnVuY3Rpb24oYyl7Yy4kaj0KdC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpO3RoaXMuVGE9LTF9LGY6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBhPW5ldyBOKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7YS5qYXx8dGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2IrKylhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgTyhhLHRoaXMuRyksYS5mKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGIgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYikmJndpbmRvdy5UVjJQbGF5ZXJzW2JdLnZpZGVvTW9kZWwmJihhPW5ldyBOKHdpbmRvdy5UVjJQbGF5ZXJzW2JdKSxhLmphfHwKdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IE8oYSx0aGlzLkcpLGEuZigpKSk7dGhpcy5wZigpO3RoaXMuUCgpfX0pfSkoYyk7dmFyIFdiPWMuJGp8fFdiLFhiPW5ldyBXYihyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMuRWs9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBZYj1jLkVrfHxZYjtuZXcgWWIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTsoZnVuY3Rpb24oYyl7Yy5xaj1xLmV4dGVuZCh7aTpmdW5jdGlvbihhKXt0aGlzLmooYSl9LEs6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLlQoYSk7dmFyIGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtifHwoYj1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5XKGIpO2ImJnRoaXMuVChiLnBhcmVudE5vZGUpfSwKUjpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgWT1jLnFqfHxZOyhmdW5jdGlvbihjKXtjLnBqPXYuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEsYil7dGhpcy5qKGEsYil9LGY6ZnVuY3Rpb24oKXt0aGlzLmloPTA7dGhpcy5PPXRoaXMuT3x8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLnVhPXRoaXMuS2M9dGhpcy5CYT10aGlzLmVkPSExO3RoaXMuSmg9ZS5MYigxMCk7dGhpcy5xaCgpfSxxaDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYS5zdWJQbGF5ZXImJmEuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYS5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5uYT1hLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLnNiKCksITA7dGhpcy5paCsrO2lmKDEwPHRoaXMuaWgpdGhpcy5tKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMuZyghMCk6dGhpcy5nKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5xaC5iaW5kKHRoaXMpLDEwMCksITF9LHNiOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5uYTtpZihhKXt2YXIgYj0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGEuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuc2IoKX0uYmluZCh0aGlzKSwyMCk6KGEuYWRkRXZlbnRMaXN0ZW5lcihiLGZ1bmN0aW9uKGEpe3RoaXMuY2EoYSwhMCl9LmJpbmQodGhpcykpLGEuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKGEpe3RoaXMuY2EoYSwhMCk7dGhpcy5tKCJhZGVycm9yIix0aGlzLk8pO3RoaXMuYmEoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLnphKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5zYigpfS5iaW5kKHRoaXMpLDIwKX0sY2E6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PQphLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLkNhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGQpJiZhW2RdJiZhW2RdLmFkRXJyb3ImJmFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZiKGFbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5DYSgpO2JyZWFrfX0scWI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51YX0sQ2E6ZnVuY3Rpb24oKXt0aGlzLnVhPQohMH0sYmE6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFiKCk/KHRoaXMudygpLHRoaXMub2EoKSk6dGhpcy5nKGEpfS5iaW5kKHRoaXMpLDEwMCl9LGc6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFwaS5wbGF5ZWQmJmIuYXBpLnBsYXllZCgpP3RoaXMuRChhKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuZyhhKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgWj1jLnBqfHxaOyhmdW5jdGlvbihjKXtjLnJqPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sZjpmdW5jdGlvbigpe3ZhciBhPSExO2lmKHdpbmRvdy5sMVBsYXllckluc3RhbmNlJiZ3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZS5sZW5ndGgmJjA8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoKWZvcih2YXIgYj0wO2I8d2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoO2IrKylhPW5ldyBZKHdpbmRvdy5sMVBsYXllckluc3RhbmNlWzBdKSwKdGhpcy5MKGEpfHwodGhpcy5OKGEpLGE9bmV3IFooYSx0aGlzLkcpLGEuZigpKTtlbHNlIHdpbmRvdy5wbGF5ZXImJndpbmRvdy5wbGF5ZXIuYXBpJiZ3aW5kb3cucGxheWVyLmwxUGxheWVyJiYoYT1uZXcgWSh3aW5kb3cucGxheWVyKSx0aGlzLkwoYSl8fCh0aGlzLk4oYSksYT1uZXcgWihhLHRoaXMuRyksYS5mKCkpKTt0aGlzLlAoKX19KX0pKGMpO3ZhciBaYj1jLnJqfHxaYiwkYj1uZXcgWmIocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLiRsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgYWM9Yy4kbHx8YWM7bmV3IGFjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2MuVmk9cS5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxLOmZ1bmN0aW9uKCl7dmFyIGE9ITEsYj0hMTt0cnl7YT10aGlzLmdldFJhd1BsYXllcigpWzBdLnBhcmVudE5vZGUsCmI9dGhpcy5nZXRSYXdQbGF5ZXIoKVswXX1jYXRjaChjKXt9YSYmYj8odGhpcy5UKGEpLHRoaXMuVyhiKSx0aGlzLmdldFJhd1BsYXllcigpKTp0aGlzLlooKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLmNzcygiZGlzcGxheSIsIm5vbmUiKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5IiwiYmxvY2siKX0sUjpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgYmM9Yy5WaXx8YmM7KGZ1bmN0aW9uKGMpe2MuVWk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3RoaXMuc2coKX0sc2c6ZnVuY3Rpb24oYSl7d2luZG93LkdBTl9WaWRlb3x8KGE/KHRoaXMubSgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLkQoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnNnKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciBjYz1jLlVpfHwKY2M7KGZ1bmN0aW9uKGMpe2MuV2k9dC5leHRlbmQoe2k6ZnVuY3Rpb24oYSl7dGhpcy5qKGEpfSxmOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImdhbWUiKTtpZihhJiYiRElWIj09YS5ub2RlTmFtZSYmd2luZG93LnZpZGVvYWRfZ2FuX3N0YXJ0JiZ3aW5kb3cuJCYmd2luZG93LiQoImRpdiNnYW1lIikpe2E9bmV3IGJjKHdpbmRvdy4kKCJkaXYjZ2FtZSIpKTtpZihhLmphKXt0aGlzLlAoKTtyZXR1cm59aWYoIXRoaXMuTChhKSl7dGhpcy5OKGEpOyhuZXcgY2MoYSx0aGlzLkcpKS5mKCk7dGhpcy5QKCk7cmV0dXJufX10aGlzLlAoKX19KX0pKGMpO3ZhciBkYz1jLldpfHxkYyxlYz1uZXcgZGMocik7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlVrPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgZmM9Yy5Va3x8ZmM7bmV3IGZjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksCiJ0ZiIsIlooVFREWlRSUiIpOyhmdW5jdGlvbihjKXtjLndpPXEuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sSzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0V3JhcHBlcigpO2E/KHRoaXMuVChhKSwoYT1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlcoYSk6dGhpcy5aKCkpOnRoaXMuWigpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VWaWRlbygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5VmlkZW8oKX0sUjpmdW5jdGlvbigpe3JldHVybiJBViJ9fSl9KShjKTt2YXIgZ2M9Yy53aXx8Z2M7KGZ1bmN0aW9uKGMpe2Mudmk9di5leHRlbmQoe2k6ZnVuY3Rpb24oYSxiKXt0aGlzLmooYSxiKX0sZjpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dCh0aGlzLmcuYmluZCh0aGlzKSwKMTAwKX0uYmluZCh0aGlzKSk7YS5vbigiYWRGcmFtZXdvcmtOb3RBdmFpbGFibGUiLGZ1bmN0aW9uKCl7dGhpcy5nKCl9LmJpbmQodGhpcykpO3RoaXMuc2UoKTt0aGlzLm9nKCl9LGNhOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYoYi5PPWEsYi5tKCJhZGVycm9yIixhKSl9cmV0dXJuIGN9YS5vcmlnaW5hbEV2ZW50JiYoYT1hLm9yaWdpbmFsRXZlbnQpO2lmKGEuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldEVycm9yKXt2YXIgYz1hLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYihjLmdldEVycm9yQ29kZSgpLAp0aGlzKSl7dGhpcy5DYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGEpaWYoYS5oYXNPd25Qcm9wZXJ0eShkKSYmYVtkXSYmYVtkXS5hZEVycm9yJiZhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYVtkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYihhW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMuQ2EoKTticmVha319LHFiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWF9LENhOmZ1bmN0aW9uKCl7dGhpcy51YT0hMDt0aGlzLncoImVtcHR5IHZhc3QiKX0sb2c6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKGEuZ2V0U2VsZWN0ZWRBZEhhbmRsZXIpaWYoKGE9YS5nZXRTZWxlY3RlZEFkSGFuZGxlcigpKSYmYS5hZHNMb2FkZXIpZm9yKHZhciBiPTA7YjxhLmFkc0xvYWRlci5sZW5ndGg7YisrKXt2YXIgYz0iYWRFcnJvciI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJgpnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYz1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTthLmFkc0xvYWRlcltiXS5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7YS5nZXRFcnJvciYmKGE9YS5nZXRFcnJvcigpKTt2YXIgYj0hMTtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSliPSEwO2lmKCFiKWZvcih2YXIgYyBpbiBhKXtpZihhW2NdJiZhW2NdLmluZGV4T2YmJigtMSE9YVtjXS5pbmRleE9mKCIxMDA5Iil8fC0xIT1hW2NdLmluZGV4T2YoIjMwMyIpfHwtMSE9YVtjXS5pbmRleE9mKCI0MDMiKSkpe2I9ITA7YnJlYWt9aWYoYVtjXSYmKDEwMDk9PWFbY118fDMwMz09YVtjXXx8NDAzPT1hW2NdKSl7Yj0hMDticmVha319Yj8odGhpcy53KCksdGhpcy5vYSgpKTp0aGlzLmcoKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dCh0aGlzLm9nLmJpbmQodGhpcyksCjUwKTtlbHNlIHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuc2UuYmluZCh0aGlzKSwxMDApfSxzZTpmdW5jdGlvbigpe2lmKCF0aGlzLnphKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7InBsYXlpbmciPT1hLmdldFBsYXlTdGF0ZSgpP2EuZ2V0QWRJbmZvKCk/KHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMua2EuYmluZCh0aGlzKSwxMCksdGhpcy53KCkpOmEuX3BsYXllck9wdGlvbnMmJmEuX3BsYXllck9wdGlvbnMucGxheUFkdmVydGlzZW1lbnRzfHxhLl9hZFJlZ2lzdGVyZWQ/dGhpcy5nKCk6dGhpcy5nKCEwKTp3aW5kb3cuc2V0VGltZW91dCh0aGlzLnNlLmJpbmQodGhpcyksMTAwKX19LGc6ZnVuY3Rpb24oYSl7d2luZG93LnNldFRpbWVvdXQodGhpcy5rYS5iaW5kKHRoaXMpLDFFNCk7dGhpcy5EKGEpfX0pfSkoYyk7dmFyIGhjPWMudml8fGhjOyhmdW5jdGlvbihjKXtjLnhpPXQuZXh0ZW5kKHtpOmZ1bmN0aW9uKGEpe3RoaXMuaihhKX0sUmE6ZnVuY3Rpb24oYSl7YT0KbmV3IGdjKGEpO2EuamE/dGhpcy5QKCk6dGhpcy5MKGEpfHwodGhpcy5OKGEpLChuZXcgaGMoYSx0aGlzLkcpKS5mKCkpfSxmOmZ1bmN0aW9uKCl7aWYod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXMpZm9yKHZhciBhPTA7YTx3aW5kb3cuc3JhdnZwbFBsYXllckluc3RhbmNlcy5sZW5ndGg7YSsrKXRoaXMuUmEod2luZG93LnNyYXZ2cGxQbGF5ZXJJbnN0YW5jZXNbYV0pO2Vsc2Ugd2luZG93LnNldHVwUGxheWVyRWxlbWVudD90aGlzLlJhKHdpbmRvdy5zZXR1cFBsYXllckVsZW1lbnQpOnRoaXMuUCgpfX0pfSkoYyk7dmFyIGljPWMueGl8fGljLGpjPW5ldyBpYyhyKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMubmw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBrYz1jLm5sfHxrYztuZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTtjPWN8fAp7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe3RoaXMucmg9dGhpcy50aD10aGlzLnNoPSExO3RoaXMuQ2Q9W107dGhpcy5vZj17R0FOVmlkZW86InVuZGVmaW5lZCI9PT10eXBlb2YgZWM/bnVsbDplYyxsYW9sYTFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgJGI/bnVsbDokYixWaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIHphP251bGw6emEsYml0bW92aW46InVuZGVmaW5lZCI9PT10eXBlb2YgUz9udWxsOlMsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBFYT9udWxsOkVhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBIYj9udWxsOkhiLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHVhP251bGw6dWEsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFhiP251bGw6WGIsdGZtc3VpdGVQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgeD9udWxsOngsbmV4dFBsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj9udWxsOktiLHh5bWF0aWNQbGF5ZXI6InVuZGVmaW5lZCI9PT0KdHlwZW9mIFViP251bGw6VWIsR29yaWxsYU1lZGlhcGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsYmlsZE1lZGlhUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIG9iP251bGw6b2IsT295YWxhOiJ1bmRlZmluZWQiPT09dHlwZW9mIGRiP251bGw6ZGIsUm9ja2VyeToidW5kZWZpbmVkIj09PXR5cGVvZiBDYj9udWxsOkNiLGluUmVhZDoidW5kZWZpbmVkIj09PXR5cGVvZiBKYT9udWxsOkphLHdmdjQ6InVuZGVmaW5lZCI9PT10eXBlb2YgeGI/bnVsbDp4YixBVlBsYXllckRldGVjdGlvbjoidW5kZWZpbmVkIj09PXR5cGVvZiBqYz9udWxsOmpjLE9ubHlIT01BRDoidW5kZWZpbmVkIj09PXR5cGVvZiBWP251bGw6Vn19Yy5Maj1hO2EucHJvdG90eXBlPXtmOmZ1bmN0aW9uKCl7dmFyIGE9W10sYT1hLmxlbmd0aD90aGlzLkxsKGEpOltdLGM7dGhpcy50aD0hMDtpZihhLmxlbmd0aCl7dGhpcy5zaD0hMDtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyljPWFbZF0sCnRoaXMuUmgoYyl9ZWxzZSBmb3IoZCBpbiB0aGlzLm9mKXtpZih0aGlzLnJoKWJyZWFrO2M9dGhpcy5vZltkXTt0aGlzLkpmKGMpJiYodGhpcy5DZC5wdXNoKGMpLHRoaXMuUmgoYykpfX0sSmY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiB0PyEwOiExfSxMbDpmdW5jdGlvbihhKXt2YXIgYz1bXSxkO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGM7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspZD1hW2VdLGQ9dGhpcy5vZltkXSx0aGlzLkpmKGQpJiZjLnB1c2goZCk7cmV0dXJuIGN9LFJoOmZ1bmN0aW9uKGEpe3RoaXMuSmYoYSkmJmEuZigpfSxZbjpmdW5jdGlvbihhKXtpZihhJiZhIGluc3RhbmNlb2YgcSYmIXRoaXMuc2gpZm9yKHRoaXMucmg9ITAsYT0wO2E8dGhpcy5DZC5sZW5ndGg7YSsrKXRoaXMuQ2RbYV0uU2ImJndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5DZFthXS5TYil9fX0pKGMpO3ZhciBsYz1jLkxqfHxsYyxMPW5ldyBsYztMLmYoKTtjPWN8fHt9OwooZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLmdsPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbWM9Yy5nbHx8bWM7bmV3IG1jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihjKXtpZihjLmVycm9yIGluc3RhbmNlb2YgUmVmZXJlbmNlRXJyb3Ipe3ZhciBhPWMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9YS5pbmRleE9mKCJob21hZCIpfHwtMSE9YS5pbmRleE9mKCJoZC1tYWluIikpYT1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1hLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCI6IikrMSxhLmluZGV4T2YoImlzIG5vdCIpLTEpLGUuRmMoay5BbyksZS50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsCmMsITApKTotMSE9Yy5pbmRleE9mKCJzZXRAIikmJihlLkZjKGsuTm0pLGUudHJhY2soInN0YXRzX2hkX3Zhcm5vdHNldCIsIiIsITApKX19KTt2YXIgQz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtDLndpZHRoPTE7Qy5oZWlnaHQ9MTtDLnNldEF0dHJpYnV0ZSgibmFtZSIsInBtdG12cyIpO0Muc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChDKTt2YXIgcWM9Qy5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSxwYz1DLmNvbnRlbnRXaW5kb3cuc2V0VGltZW91dC5iaW5kKHdpbmRvdyk7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChDKTt2YXIgRz1uZXcgSCxsPSExO0cuZmEoKTtHLm5oKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRy5mYSgpLGZ1bmN0aW9uKGMpe2x8fChsPWMuZGV0YWlsKX0sITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKEcubmgoKSxmdW5jdGlvbihjKXtsfHwobD1jLmRldGFpbCl9LAohMSk7Ry5mYSgpO3ZhciByYz1xYyhmdW5jdGlvbigpe2UuTmcod2luZG93LEcuZG0oKSx7aWQ6cmN9KX0sNTAwKSxoYT1lLlgoMTApO2RhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYSgpe31jLlNpPWE7YS5wcm90b3R5cGU9e319KShjKTt2YXIgbmM9Yy5TaXx8bmM7bmV3IG5jKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGEoKXt0aGlzLkdoPXRoaXMuY29uZj10aGlzLm5iPXRoaXMucGxheWVyPW51bGw7dGhpcy54ZD0wO3RoaXMuYmI9IiI7dGhpcy5EZD1bXTt0aGlzLkVkPTA7dGhpcy5JaD0hMTt0aGlzLmxmPVtdO2UucGIoIm5ld0FkZGVsaXZlcnkiKX1jLnlpPWE7YS5wcm90b3R5cGU9e0ZuOmZ1bmN0aW9uKGEpe3RoaXMuR2g9YX0sdmY6ZnVuY3Rpb24oYSl7dGhpcy5wbGF5ZXI9YTt0aGlzLmJiPXRoaXMucGxheWVyLlIoKX0sCmdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sQW46ZnVuY3Rpb24oYSl7dGhpcy5uYj1hfSx6bjpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sRmE6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLmJiXSYmdGhpcy5jb25mW3RoaXMuYmJdW2FdJiYoYz10aGlzLmNvbmZbdGhpcy5iYl1bYV0pO3JldHVybiBjfSxTYzpmdW5jdGlvbihhLGMpe2UuRigid2VsdC5kZSIpJiZlLmFiKCJodHRwczovL2Fzdi5udWdnYWQubmV0L2JrP251Z2duPTE1Njk5MDUxMDImbnVnZ3NpZD0xOTgyMjE3NTUwJm51Z2dyaWQ9IitlbmNvZGVVUklDb21wb25lbnQobG9jYXRpb24uaHJlZikrIiZudWdnbD1odHRwcyUzQSUyRiUyRnd3MjUxLnNtYXJ0YWRzZXJ2ZXIuY29tJTJGdHJhY2slMkZjb21wLmFzcCUzRmtleXdvcmQlM0ROVUdHVkFSUyUyNnNpdGUlM0Q4NTE0NSIsIm5ldG51Z2dhZGFzdiIse30sZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzLm5iKTsKdmFyIGQ9ITEsZj0hMTtpZih0aGlzLmVtKCkpdGhpcy5uYi5pKHRoaXMubmIuSmMsdGhpcy5uYi5wYSx0aGlzLm5iLm5mLGZ1bmN0aW9uKCl7dGhpcy5TYyhhLGMpfS5iaW5kKHRoaXMpLHRoaXMubmIuRGMpO2Vsc2UgaWYodGhpcy5XbCgpKXRoaXMudm4oZnVuY3Rpb24oKXt0aGlzLlNjKGEsYyl9LmJpbmQodGhpcykpO2Vsc2V7dGhpcy5wbGF5ZXIucGF1c2UoKTtlLm8oay5CYyx0aGlzLnBsYXllci5sKCkpO3ZhciBoPXRoaXMuY29uZixsPW5ldyBZYSh0aGlzLmdldFBsYXllcigpLGgpO2MmJmwuJG4oKTtsLmV4aXRGdWxsc2NyZWVuKCk7ZS5wYigibmV3SG9tYWREaXNwbGF5Iik7UT1sPW5ldyBQYShsLHRoaXMubmIsaCk7bC54bih0aGlzLmNvbmYpO2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIG09ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYobT10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKG0pfShhPXRoaXMuRG0oYSkpfHxlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwKInNob3ciLCEwKTsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuVWUmJihkPXRoaXMucGxheWVyLlVlKCkpO2guYWRTdGFydFRpbWVvdXQmJihmPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtsLldlKGEsZCxmKTt0aGlzLnBsYXllci5TaChsKX19LGVtOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYz0wO2lmKHRoaXMueGQpcmV0dXJuIGM9YS5nZXRUaW1lKCktdGhpcy54ZC5nZXRUaW1lKCksdGhpcy54ZD1hLDNFNTxjPyEwOiExO3RoaXMueGQ9YTtyZXR1cm4hMX0sUW46ZnVuY3Rpb24oKXtlLnBiKCJwcmVyb2xsIik7ZS51ZigicHJlcm9sbCIpO3ZhciBhPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicHJlcm9sbEFkVGFnIikmJihhPXRoaXMuRmEoInByZXJvbGxBZFRhZyIpKTsoYT10aGlzLklnKGEpKT90aGlzLlNjKGEpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwicHJlIiwhMCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksCjApLGUubyhrLm1kLHRoaXMucGxheWVyLmwoKSkpfSxQbjpmdW5jdGlvbihhKXtpZighdGhpcy5HaCl7ZS51ZigicG9zdHJvbGwiKTtlLnBiKCJwb3N0cm9sbCIpO3RoaXMuRm4oITApO3ZhciBjPXRoaXMuY29uZixkPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgicG9zdHJvbGxBZFRhZyIpJiYoZD10aGlzLkZhKCJwb3N0cm9sbEFkVGFnIikpOyhkPXRoaXMuSWcoZCkpP3RoaXMuU2MoZCxjLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudD8hMDphKTooZS50cmFjaygic3RhdHNfaGRfbm9BZFRhZyIsInBvc3QiLCEwKSx0aGlzLnBsYXllci5wbGF5KCksZS5vKGsubWQsdGhpcy5wbGF5ZXIubCgpKSl9fSxJZzpmdW5jdGlvbihhKXtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGEpe3ZhciBjPSExO3RoaXMucGxheWVyLmdldFJhd1BsYXllciYmKGM9dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkpO2E9YShjKX1yZXR1cm4gYX0sbW46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Nbih0aGlzLlBuLmJpbmQodGhpcykpOwp0aGlzLnBsYXllci5LYSgpfSxJZDpmdW5jdGlvbihhKXtlLnBiKCJtaWRyb2xsIik7ZS51ZigibWlkcm9sbCIpO2lmKCF0aGlzLndoKXt0aGlzLndoPSEwO3ZhciBjPXRoaXMuRmEoImFkVGFnIik7dGhpcy5GYSgibWlkcm9sbEFkVGFnIikmJihjPXRoaXMuRmEoIm1pZHJvbGxBZFRhZyIpKTtjPyh0aGlzLlNjKGMsYSksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLndoPSExfS5iaW5kKHRoaXMpLDFFMykpOihlLnRyYWNrKCJzdGF0c19oZF9ub0FkVGFnIiwibWlkIiwhMCksdGhpcy5wbGF5ZXIucGxheSgpLGUubyhrLm1kLHRoaXMucGxheWVyLmwoKSkpfX0sbG46ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Fbih0aGlzLklkLmJpbmQodGhpcykpO3RoaXMucGxheWVyLlplKCl9LGY6ZnVuY3Rpb24oKXt0aGlzLlFuKCk7dGhpcy5wbGF5ZXIuWmUmJnRoaXMubG4oKTt0aGlzLm1uKCl9LG5uOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/CmE9dGhpcy5jb25mLnlpZWxkbGFiOmFbMF09dGhpcy5jb25mLnlpZWxkbGFiO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKShmdW5jdGlvbihhLGIsYyxnKXt0aGlzLkRkLnB1c2goeyJmdW5jdGlvbiI6ZnVuY3Rpb24oZSl7dGhpcy5jcChhLGIsYyxnLGUpfS5iaW5kKGUpfSl9KS5jYWxsKHRoaXMsYVtjXS51cmwsYVtjXS5wbGFjZWhvbGRlcixhW2NdLmFsaWFzLGFbY10ubWFjcm8pfXRoaXMuRWQ9dGhpcy5EZC5sZW5ndGh9LFdsOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLkVkJiYoYT0hMCk7cmV0dXJuIGF9LHZuOmZ1bmN0aW9uKGEpe3RoaXMuSWg9YTtmb3IoYT0wO2E8dGhpcy5EZC5sZW5ndGg7YSsrKXRoaXMuRGRbYV1bImZ1bmN0aW9uIl0odGhpcy4kbS5iaW5kKHRoaXMpKX0sJG06ZnVuY3Rpb24oYSl7dGhpcy5FZC0tO2EmJnRoaXMubGYucHVzaChhKTswPj10aGlzLkVkJiZ0aGlzLkloKCl9LERtOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0iIixkPTA7ZDx0aGlzLmxmLmxlbmd0aDtkKyspYz0KdGhpcy5sZltkXSxhPWEucmVwbGFjZShjLm1hY3JvLGMucGxhY2Vob2xkZXIpO3JldHVybiBhfX19KShjKTt2YXIgZWE9Yy55aXx8ZWEsUT0hMSxsYT0hMTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBhKCl7fWMucGw9YTthLnByb3RvdHlwZT17fX0pKGMpO3ZhciBvYz1jLnBsfHxvYztuZXcgb2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKX0pLmNhbGwoZWVCaWNoYWhNaWFNZWVHaCxlZUJpY2hhaE1pYU1lZUdoKTsK
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
144.76.115.236 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.236.115.76.144.clients.your-server.de
Software
TornadoServer/5.0 /
Resource Hash
9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61

Request headers

Referer
https://videos.giga.de/embed/78410589?autoplay=0
Origin
https://videos.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
Content-type
application/x-www-form-urlencoded

Response headers

Date
Tue, 03 Dec 2019 12:58:41 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
pd
eu-u.openx.net/w/1.0/ Frame CB71
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.167.2 /
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
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
sec-fetch-mode
nested-navigate
referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
accept-encoding
gzip, deflate, br
cookie
i=e17543d1-6777-0bc5-0e74-7a7076a8ac9f|1575377921
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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/

Response headers

status
200
vary
Accept
set-cookie
i=e17543d1-6777-0bc5-0e74-7a7076a8ac9f|1575377921; Version=1; Expires=Wed, 02-Dec-2020 12:58:41 GMT; Max-Age=31536000; Domain=.openx.net; Path=/ pd=v2|1575377921|mOgikimWiygu; Version=1; Expires=Wed, 18-Dec-2019 12:58:41 GMT; Max-Age=1296000; Domain=.openx.net; Path=/
server
OXGW/16.167.2
p3p
CP="CUR ADM OUR NOR STA NID"
date
Tue, 03 Dec 2019 12:58:41 GMT
content-type
text/html
content-length
592
via
1.1 google
alt-svc
clear

Redirect headers

status
302
set-cookie
i=e17543d1-6777-0bc5-0e74-7a7076a8ac9f|1575377921; Version=1; Expires=Wed, 02-Dec-2020 12:58:41 GMT; Max-Age=31536000; Domain=.openx.net; Path=/
server
OXGW/16.167.2
p3p
CP="CUR ADM OUR NOR STA NID"
location
https://eu-u.openx.net/w/1.0/pd?cc=1&plm=6&ph=2671f27c-3f24-410f-8105-4de0c801f2a9&gdpr=1
date
Tue, 03 Dec 2019 12:58:41 GMT
content-length
0
via
1.1 google
alt-svc
clear
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/ Frame A682
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
72.247.225.17 , United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a72-247-225-17.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
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/

Response headers

Last-Modified
Fri, 20 May 2016 02:07:09 GMT
ETag
"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
Wed, 02 Dec 2020 12:58:41 GMT
Date
Tue, 03 Dec 2019 12:58:41 GMT
Connection
keep-alive
usync.html
eus.rubiconproject.com/ Frame A822
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
23.37.55.184 , Netherlands, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a23-37-55-184.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
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/

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
Thu, 14 Nov 2019 18:59:50 GMT
Content-Encoding
gzip
Content-Length
7460
Content-Type
text/html; charset=UTF-8
Cache-Control
max-age=53131
Expires
Wed, 04 Dec 2019 03:44:12 GMT
Date
Tue, 03 Dec 2019 12:58:41 GMT
Connection
keep-alive
Vary
Accept-Encoding
async_usersync.html
acdn.adnxs.com/ib/static/usersync/v3/ Frame 9831
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
72.247.225.17 , United States, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a72-247-225-17.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
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
Sec-Fetch-Mode
nested-navigate
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
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
Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/

Response headers

Last-Modified
Fri, 20 May 2016 02:07:09 GMT
ETag
"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
Wed, 02 Dec 2020 12:58:41 GMT
Date
Tue, 03 Dec 2019 12:58:41 GMT
Connection
keep-alive
data
lb38.s400.meetrics.net/
43 B
308 B
Image
General
Full URL
https://lb38.s400.meetrics.net/data?/tpmJGIOBALkqFK0kyByyAw0Az0A62A35A2wAw6AwyFl0FptFlBF2qoFx1A31Az3A35Ax2A32A35E6kFv3F51FynEoBFTkzFARksFAQtjFCmpOSA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
136.243.3.206 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h213.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:42 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Tue, 03-Dec-19 12:58:41 GMT
data
b47.s79.research.de.com/
43 B
308 B
Image
General
Full URL
https://b47.s79.research.de.com/data?//hojFOOBALl1FDLkqFK+kyBoyyAw0Az0A62A35A2wAw6AwyFl0FptFl6BwhFnlFfpFtwFylFzzFpvFufFpkF2qoFx1A31Az3A35Ax2A32A35E6kFv3F51FynEoBFTkzFPPjFAAZAwSAcAAAARksFAQtjFUsmQSA
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
144.76.237.196 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
h371.meetrics.de
Software
nginx /
Resource Hash
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:43 GMT
Server
nginx
Transfer-Encoding
chunked
Content-Type
image/gif
Cache-control
no-cache,no-store,must-revalidate
Connection
keep-alive
Expires
Tue, 03-Dec-19 12:58:42 GMT
dt
dt.adsafeprotected.com/
43 B
301 B
Image
General
Full URL
https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=fb3f2068-5b00-a4e5-9683-b2be5d627beb&tv={c:vK3KIl,pingTime:5,time:5068,type:p,clog:[{piv:100,vs:i,r:,w:300,h:250,t:28}],es:0,sc:1,ha:1,gm:0,slTimes:{i:5068,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:28,wc:0.0.1600.1200,ac:968.278.300.250,am:i,cc:968.278.300.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[5060~100],as:[5060~300.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:257,fm:rJAVcpX+11|12|1311|1312|1313|14|15|161|1711|18|19|1a|1b|1c|1d|1e|1f|1g*.346702-39754020|1h|1i|1j|1k,idMap:1g*,rend:0,renddet:WINDOW,rmeas:0}&br=u
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.36.20 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
nyidt.adsafeprotected.com
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:44 GMT
X-Server-Name
dt56.303net.pvt
P3P
CP="COM NAV INT STA NID OUR IND NOI"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Server
nginx
o.gif
go.giga-abs.de/
35 B
355 B
Image
General
Full URL
https://go.giga-abs.de/o.gif?__iz=0&__id=1575377927307&__it=-60&__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

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:47 GMT
Last-Modified
Wed, 25 Nov 2009 12:58:40 GMT
Server
X/1.0
Content-Type
image/gif
Cache-Control
private, no-cache, no-store, proxy-revalidate, no-transform
Connection
keep-alive
Content-Length
35
Expires
Tue, 27 Nov 2012 12:58:40 GMT
dt
dt.adsafeprotected.com/
43 B
301 B
Image
General
Full URL
https://dt.adsafeprotected.com/dt?advEntityId=346702&asId=fb3f2068-5b00-a4e5-9683-b2be5d627beb&tv={c:vK3NjC,pingTime:15,time:15067,type:p,clog:[{piv:100,vs:i,r:,w:300,h:250,t:28}],es:0,sc:1,ha:1,gm:0,slTimes:{i:15067,o:0,n:0,pp:0,pm:0},slEvents:[{sl:i,t:28,wc:0.0.1600.1200,ac:968.278.300.250,am:i,cc:968.278.300.250,piv:100,obst:0,th:0,reas:,bkn:{piv:[15058~100],as:[15058~300.250]}}],slEventCount:1,em:true,fr:true,e:,tt:rjss,dtt:259,fm:rJAVcpX+11|12|1311|1312|1313|14|15|161|1711|18|19|1a|1b|1c|1d|1e|1f|1g*.346702-39754020|1h|1i|1j|1k,idMap:1g*,rend:0,renddet:WINDOW,rmeas:0}&br=u
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.36.20 , United States, ASN7415 (ADSAFE-1 - Integral Ad Science, Inc., US),
Reverse DNS
nyidt.adsafeprotected.com
Software
nginx /
Resource Hash
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b

Request headers

Referer
https://www.giga.de/extra/livestream/specials/ist-serienstream.to-legal-oder-illegal-hier-erfahrt-ihr-es/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 03 Dec 2019 12:58:54 GMT
X-Server-Name
dt40.303net.pvt
P3P
CP="COM NAV INT STA NID OUR IND NOI"
Cache-Control
no-cache
Connection
keep-alive
Content-Type
image/gif
Content-Length
43
Server
nginx

Verdicts & Comments Add Verdict or Comment

336 JavaScript Global Variables

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

object| onformdata object| onpointerrawupdate string| cookieName function| getCookie function| setCookie object| smbContext object| LUX object| POST_META object| smbt object| smbadloader string| GoogleAnalyticsObject function| ga function| adLoader object| apstag object| _m6rq object| smbDmpTracking object| dimensions 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 boolean| smbt_only function| requirejs function| require function| define object| DKUIM_SETTINGS object| is number| LUX_t_start number| LUX_t_end object| gaLog string| szmvars object| iom object| smbVideoService string| lazyLoadAmdUrl string| polyfillAmdUrl object| dependencies object| _absconfig object| iam_data object| pagespeed object| adsbygoogle function| setImmediate function| clearImmediate object| google_tag_data object| gaplugins object| gaGlobal object| gaData boolean| apstagLOADED object| google_js_reporting_queue number| google_srt 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 boolean| _gfp_a_ object| google_sa_queue object| google_sl_win function| google_process_slots boolean| google_apltlad boolean| _gfp_p_ function| google_spfd number| google_lpabyc number| google_unique_id object| google_sv_map object| google_t12n_vars function| _extends function| _typeof string| type function| sdibgclick object| _ecoconf object| _tfa function| getSDG object| SDG function| showSdgDebug object| googletag object| pbjsYLHH boolean| yieldlove_prevent_autoload string| sdgMeetricsStatus object| _enqAdpParam function| setUpAgknTag object| cp2 object| nativendo_588f272a3e49c_conf function| google_sa_impl object| google_jobrunner object| google_persistent_state_async object| __google_ad_urls number| google_global_correlator object| google_prev_clients object| ampInaboxIframes object| ampInaboxPendingMessages object| google_iframe_oncopy function| Goog_AdSense_getAdAdapterInstance boolean| google_osd_loaded boolean| google_onload_fired number| _m6rApiLoaded object| _econa function| send object| TFASC object| TRC object| _taboola number| taboola_view_id object| TRCImpl function| __trcError function| __trcJSONify object| queue function| _ 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| _m6rOnce number| _m6rContainerLoaded object| closure_memoize_cache_ object| yieldlove_site_settings object| yieldlove_cmd object| YLHH object| core function| pbjsYLHHChunk object| stroeerCore function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure function| google_osd_amcb function| checkOmid3pExist object| de_meetrics object| list string| preloadType object| NUGGjson function| aplauncherExec function| aplauncher string| n_pbt object| OMSVad function| agknTagBuilder object| _agknTag string| _agknTagName object| _agknEchoTag number| _isAgknTagSet object| _tblConsole undefined| msg object| _comscore boolean| google_noFetch function| webpackJsonpdkuim object| Base64 boolean| dkuimInited function| $ function| jQuery function| isEmpty object| confiant function| udm_ object| ns_p object| COMSCORE function| __trcCopyProps function| __trcFromError function| __trcClientTimestamp function| __trcLog function| __trcDebug function| __trcInfo function| __trcWarn function| __trcDOMWalker function| __trcPurgeEventHandlers function| __trcUnJSONify function| __trcGetMargins function| __trcAttachResize function| __trcDetachResize function| __trcTrim function| __trcGetElementsByClass function| __trcToArray function| __trcObjectCreate function| PageManager function| addHashParam number| trc_debug_level string| trc_article_id function| Goog_AdSense_OsdAdapter string| sdm_ift object| nativendo_588f272a3e49c_map function| confiantTryToGetConfig object| containers object| images object| BrandBoosterLoader object| first_document_in_list object| first_window_in_list number| mtrcs_pid function| mtrcs_callReadJavascript object| teadsscript object| teads object| trcManager object| trcRbox object| options object| cmTag function| startCMTagMain object| google_image_requests string| category function| webpackHotUpdate 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 string| vpaidId function| OvaMediaPlayer object| Adform function| _h object| _adexc object| adex object| ibb_lib object| _EQLService object| _EQPScript object| pbstck object| _EQPService object| _adrtx number| _emqUSSMutex function| _emqUSSCall string| segments object| segmentsArr undefined| result string| _emqstr

35 Cookies

Domain/Path Name / Value
.taboola.com/ Name: t_gid
Value: 276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d
.teads.tv/ Name: tt_skp
Value:
.teads.tv/ Name: tt_dar
Value:
.teads.tv/ Name: tt_neustar
Value:
.teads.tv/ Name: tt_viewer
Value: c41806fd-8408-4530-a24e-2d9ccf4650f2
.agkn.com/ Name: ab
Value: 0001%3AWa%2BQP%2FVarNd%2BYbQWDdVllg906f9UFNM14Loljjv9Sp3JG4849AmDUQ%3D%3D
.agkn.com/ Name: u
Value: C|0AEAleRh9JXkYfQAAAAAAAg1RAQCADVIBAIA
.m6r.eu/ Name: adscale
Value: 2019-12-03T12%3A58%3A37.607Z
.amazon-adsystem.com/ Name: ad-privacy
Value: 0
.m6r.eu/ Name: appnexus
Value: 2019-12-03T12%3A58%3A37.234Z
.m6r.eu/ Name: yieldlab
Value: 2019-12-03T12%3A58%3A37.227Z
.giga.de/ Name: ioam2018
Value: 000e51aa00fcb3a495de65bfc:1601557116932:1575377916932:.giga.de:2:giga:film_content:noevent:1575377916932:90fpja
.doubleclick.net/ Name: DSID
Value: NO_DATA
.giga.de/ Name: _gid
Value: GA1.2.166720197.1575377917
.doubleclick.net/ Name: IDE
Value: AHWqTUkc78Tk1NTkwbgheKQqGYd44B7XO2MgH-xm8NOJfNu0IdnX-o_69YIMmvvw
www.giga.de/ Name: smbVideoStickyAutoplay-GIGA
Value: 12
.teads.tv/ Name: tt_exelate
Value:
www.giga.de/ Name: session_id
Value: 8378240d-f9a3-4ab1-baf6-35513bb0c808
.m6r.eu/ Name: adx
Value: 2019-12-03T12%3A58%3A37.289Z
www.giga.de/ Name: trc_cookie_storage
Value: stroeer-smb-giga%253Asession-data%3Dv2_1125c4e44b9cd4114ea7a76ed13993a1_276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d_1575377917_1575377917_CNawjgYQrMVBGIGr3d7sLSABKAEwODib4wlAgooQSJjEF1Cl7BBYAGAA%7Ctaboola%2520global%253Alocal-storage-keys%3D%255B%2522stroeer-smb-giga%253Asession-data%2522%252C%2522taboola%2520global%253Alspb%2522%252C%2522taboola%2520global%253Auser-id%2522%255D%7Ctaboola%2520global%253Alspb%3DCwsIQhCKoz4MCwiJARCKoz4MCwhMEIqjPgwLCI4BEIqjPgwLCJEBEIqjPgwLCJUBEIqjPgwLCCAQiqM-DAsIJBCKoz4MCwhkEIqjPgwLCCcQiqM-DAsILRCKoz4MCwg7EIqjPgwLCD0QqtQ9DAsIPxCKoz4MDBMU%7Ctaboola%2520global%253Auser-id%3D276d975b-703c-4c7b-8380-ee44a5fd3a7b-tuct4dfe17d
.teads.tv/ Name: tt_liveramp
Value:
www.giga.de/ Name: _econa
Value: d60947d71dc6b8363d958031bdb4812c
.teads.tv/ Name: tt_bluekai
Value:
.giga.de/ Name: __gads
Value: ID=16ebbbe24a324309:T=1575377917:S=ALNI_MZFulAOD9HkgzMrfPY_owmzS680iA
.giga.de/ Name: _gat_gt1
Value: 1
.m6r.eu/ Name: test
Value: true
www.giga.de/ Name: POPUPCHECK
Value: 1575464316933
.giga.de/ Name: _ga
Value: GA1.2.2115578610.1575377917
.teads.tv/ Name: tt_salesforce
Value:
.amazon-adsystem.com/ Name: ad-id
Value: AypmDGFGjUcSlAccZIwcgoE
www.giga.de/ Name: injectTest
Value: 1
.teads.tv/ Name: tt_emetriq
Value:
.m6r.eu/ Name: id
Value: c691c1b2ce4aa7b0c77ae005c6c76af2
www.giga.de/ Name: smb-session
Value: direct-1-default
www.giga.de/ Name: lux_uid
Value: 157537791692190069

6 Console Messages

Source Level URL
Text
console-api log URL: https://gocp.stroeermediabrands.de/trackcp.js(Line 1)
Message:
starting version 20181002
console-api log URL: https://cdn.taboola.com/libtrc/unip/1092206/tfa.js(Line 3)
Message:
Taboola Pixel: An error occurred while handling command '{"notify":"event","name":"page_view","id":1092206,"tim":1575377917316}'. TypeError: Cannot read property 'getItem' of null
console-api info URL: https://gocp.stroeermediabrands.de/trackcp.js(Line 1)
Message:
got title from meta
console-api log (Line 114)
Message:
inline_ad: No video available; loading inline-ad by Teads
console-api debug URL: https://static.adsafeprotected.com/sca.17.4.95.js(Line 32)
Message:
a: 0.002197265625ms
console-api error (Line 1)
Message:
Pubstack.io // [object Object]

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
acdn.prod.pubstack.io
adservice.google.com
adservice.google.de
adstax-match.adrtx.net
ajax.googleapis.com
ams.creativecdn.com
api.theadex.com
api.yieldlove-ad-serving.net
b47.s79.research.de.com
bbcdn-bbnaut.ibillboard.com
bh.contextweb.com
boot.pubstack.io
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
cdnjs.cloudflare.com
cds.taboola.com
cm.g.doubleclick.net
cmp.teads.mgr.consensu.org
confiant-integrations.global.ssl.fastly.net
convammp.taboola.com
creativecdn.com
d.agkn.com
d.nativendo.de
de-gmtdmp.mookie1.com
de.ioam.de
dkuim.de
dmp.theadex.com
dt.adsafeprotected.com
eu-u.openx.net
eus.rubiconproject.com
fastlane.rubiconproject.com
files.giga-video.de
fw.adsafeprotected.com
go.giga-abs.de
gocp.stroeermediabrands.de
googleads.g.doubleclick.net
hgc-cf-cache-1.svonm.com
ib.adnxs.com
ih.adscale.de
imasdk.googleapis.com
imprammp.taboola.com
intake.prod.pubstack.io
irqs.ioam.de
js.adscale.de
js.agkn.com
js.stroeermediabrands.de
lb38.s400.meetrics.net
match.adsrvr.org
match.taboola.com
maxcdn.bootstrapcdn.com
media.oadts.com
nugmw.userreport.com
pagead2.googlesyndication.com
pixel.rubiconproject.com
prod-ingestion.tracking.v2.yieldlove-ad-serving.net
prod.perf-serving.com
px.powerlinks.com
quiz-media.stroeermediabrands.de
quiz.stroeermediabrands.de
rtb.mfadsrvr.com
s3.eu-central-1.amazonaws.com
s400.mxcdn.net
s79.mxcdn.net
s79.research.de.com
sb.scorecardresearch.com
script.ioam.de
securepubads.g.doubleclick.net
si.nuggad.net
smbad.de
ssl-econa.met.vgwort.de
ssl.1.damoh.giga.de
static.adsafeprotected.com
static.giga.de
sync.mathtag.com
sync.teads.tv
t.nativendo.de
t.teads.tv
tpc.googlesyndication.com
track.adform.net
tracker-adserver.ibillboard.com
tracking.m6r.eu
trc.taboola.com
ups.xplosion.de
uss.xplosion.de
video-adserver.ibillboard.com
videos.giga.de
vidstat.taboola.com
www.dunkirkinception.com
www.facebook.com
www.giga.de
www.google-analytics.com
www.googletagservices.com
www.storygize.net
x.bidswitch.net
xpl.theadex.com
yieldlove-d.openx.net
104.109.82.87
104.244.36.20
107.178.241.34
108.128.71.27
109.71.25.30
13.224.199.29
13.225.78.95
136.243.116.5
136.243.3.206
136.243.36.209
141.226.224.32
143.204.101.73
144.76.115.236
144.76.237.196
151.101.113.194
151.101.114.2
151.101.114.49
151.101.12.166
151.101.14.2
151.101.14.217
151.101.14.49
161.156.66.178
172.217.16.162
178.19.65.130
178.19.70.100
178.19.72.10
178.19.72.20
18.194.21.214
18.194.252.229
18.195.163.192
18.195.39.206
18.196.130.47
185.184.8.30
185.22.221.117
185.29.135.234
185.33.223.206
188.40.16.106
192.132.33.46
193.46.63.75
199.166.0.24
199.166.0.32
2.18.232.7
2001:4de0:ac19::1:b:3a
216.58.208.34
23.37.55.184
23.5.97.37
2600:9000:2043:fc00:15:efbc:e300:93a1
2600:9000:20eb:cc00:12:6213:9cc0:93a1
2600:9000:2156:3a00:1c:8c89:a300:93a1
2600:9000:21f3:3a00:1f:a1b:34c0:93a1
2600:9000:21f3:5a00:19:fc2c:a140:93a1
2606:4700:20::681a:4fb
2606:4700::6811:4104
2620:1ec:bdf::10
2a00:1450:4001:808::200e
2a00:1450:4001:814::2002
2a00:1450:4001:816::200a
2a00:1450:4001:81c::200a
2a00:1450:4001:820::2001
2a02:26f0:6c00:292::2c92
2a02:26f0:6c00:2bc::5f76
2a03:2880:f11c:8183:face:b00c:0:25de
3.121.253.254
34.95.120.147
35.186.238.175
37.157.2.236
40.113.136.100
46.253.113.178
46.253.113.181
52.18.103.144
52.219.72.195
52.36.182.29
52.51.24.119
52.95.123.41
54.194.33.101
54.77.22.22
62.168.44.118
62.168.44.125
63.34.92.224
69.173.144.140
69.173.144.165
72.247.224.195
72.247.225.134
72.247.225.17
72.247.225.182
89.163.159.101
89.163.159.125
91.215.103.64
91.215.103.65
01295ef44ccf7fdfaea9e0be7cc992544e0680b5fa8275ebc6b985734f89e867
03b07f320a1692a2d507465027fffaa6560d19d248c33bb6a5f2c97b75680c1d
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
06b99248a163333e36980a6cfb756f1a7de60fa49517162b87b1a44d5d48f844
09a1f9790511ecc67c9ae82c262542b5ad75ccbc22d59dd066919906c5a4ea8e
0adcf4e6fecc0e5cda60872684182fe5ec6b654641256a17d6fac92003f8e0a5
0dbbaa3c57cc19372d94124069c8c05ed2fc89f0f8c5755f6cf2e4d46e61c603
0e6f831bb3dbd78ef661b62aa1f6b4606bb13426d5a9378d061aa20354f24499
0e946b0ee0337cf23c845f67a238e1fefd5f1e014fdbd8ea27870172fcedd40f
0fb9b799443ee998432bc9cd5269cbf0761ee3d2eaa52680d879cd5d64b14f0a
0fcdcfd13a1beb422d1068e345ba2f7a71595f093cf755768808f352c9aa8f47
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
10eba73b3641332bde05fa8d6223e7017ac5207673602247c35f358ea89e3092
12af38f7094522f639ce5c48e15ae2a09d215c4c64b4457f7ac5ac391f23da8b
12eab7ed9516d8d3da05af9f6af5f31f280da236929d76b0a135cf7cce47ea82
1412d7245072504d1975da264074e475485b5bab1edab58938a536542a4f3dd5
149c8d10677f2f6979fa28c078cf832f575ee53c397d791b739e7c4c687fe7bc
161fa8a1e2b8212bad87b3f22f027acd38503428dc1c4e429fa14cb2cd42d992
17d01f74488cbd29d651ec014ec2c25c9e4cf86f942090a2fbbb5e501faed76f
1c3b2ef5bd8dd65a075f5e2e01b69421c16206237d55d600be9011b1cb29442f
1eacd5fb7ff66fa8240af370a7d0a29967d704a26c8420925b08ecd8ad0263a6
23f5a3eca6fec1f8380dd45a87da65ee9ab4c93d4602403dc26b18e2afeb201f
24e480e4659fbae818853a38f8a3036f529f539024dc3e772c0b594ce02ea9db
27fb6386870d840d410b95bcfc93a520f1ffa4f9534679ce876d322ac87ae5c8
29bdf43229a6b2bba4790837d06a94f32c77a43595fb2268f116ee5d3ea4db39
2acf99a6973c3a8bb60d4f510fcdfad0317956eed7e40d9367f592901cbb96cb
2b62326a6aafef471d4775604603e2404453f26c5c29d9f97f946227d23f4544
2c85d2c1402ee7b03f119d747a0081e9f5d6e9c3d0330c76a9214848855823de
2d865c4f2d21f06c2c74d99850d1a387bc4b2f42add0b96c6297d039b884d46f
300a8f36e78e494d1a1428c4695fe9a611ae7a5758a5c66eae4437d2f2af5767
30693e9cf6f8bc2ebb84da020fbd3eff888b9482a6fce3d5aacf2934e5312503
30fb61ad4bb1e361d27475f94e0984897b12089643c2dda1db5d360875e8d14e
318aa9e4e0f088ebfd57d281213d8d9d53bf439c2bf5a3be03c8c96d208aeb80
328e90a318268aea96180cc31666ae6d6f79d90d078c123bc3d98ee08a192fb7
34551142e5075260bfd6c13302ed849d0137908467293e0ab35a58b4cd6dcb41
37771301c81ae14de26883a0cb2b58f21e18dc944f036c5590e8b37231b396be
39b076e4bb4fab9b8a142499cf6155f8c128464974691a04de7e764f71b72618
3ed46201cc86ee90919161ca890da9150ae66e57b74cd9d539cb896d3281dc1c
413364272994992257eb29f54a63fd828220d3217d8cf955e57f4edb3a4e3402
4532f79dd4221b45bb4f0008abce433420eeb875e88a9ea119063b90adbb6cb5
463ae7ce60933744e6d01d7b90bd3900f02bcd4f5ae97b91e3ba0cf1acf52a66
466ad4346ce936aca54d8e30d30f4a3b6890280581344a35a2ec48cb787a2c40
47c51e501d2b66d6bab72a5e78746c270fc58b0d93fb56fc492afaffbe19cf88
49b11c901e39d47f6124a05eb2a85b49828b1ab13045ff657d9a622df6445e72
4e0705327480ad2323cb03d9c450ffcae4a98bf3a5382fa0c7882145ed620e49
505b170e929bca71e7fec8a2bff588459b60e1e9bc99e6f68443d29b3cd73335
512afe73bd2420dfbf82c396f889384236b495c657e21a5d184880f4be46f4aa
51ae405ef31ebea30c1fac7a7645a14a85f62095fdfc06c8c5ce4ea73caade0f
53964478a7c634e8dad34ecc303dd8048d00dce4993906de1bacf67f663486ef
546390dabb77f8ffa37721249a74cd4ac7e117b65a2860d797821c14c16e3cab
548f2d6f4d0d820c6c5ffbeffcbd7f0e73193e2932eefe542accc84762deec87
55ca5b82055e27d50f27e915973c0678b05b50485652feab993f890e0088db54
5d9e8cfd13ab9f3cb184ee716c93c4c007837b001ab17f762269a64b2d8958cc
5dbbdc8fcb6ffca57165278f6620f2587433608ff9b0fe88c646a8421b6f010d
5fa6833aaa4245a425c0bf047e200f7be29f46246239529a6e4ac8085736671d
60ddc774c7b5fd0c01d169321a444da403d60c0042f6bee01b0c96f6e1535fda
6387a46bae805c27f405e88ef824bea4c91699296180acdd650eff057dcfc4c1
63d85f730cd218fc87d0e3a95068f2fc4064c15506a2b73ac236479aa33fec8d
65edc2b88e65c2513f32a712868d68482ad33e098a8b449717d9e9553888c1cc
68986dd8f1ef6b05cbc0a2f532b87ea2f93ebe9ccd06f8265b15044dd1f4ab17
69e942532f5c4b64fd68a98c15a62eb5d6fd6cb864282fa9a0c11ead2cdc9268
6adc3d4c1056996e4e8b765a62604c78b1f867cceb3b15d0b9bedb7c4857f992
6b29f06a3eb022974574b6b61557208e9806654a7302e66ab62222e61f2dc635
6eeaa330e79de82579d573d85b1e62ee0017782c71406518af6b366b78c7981e
6f128586b7017fd051b211b07fa7ed4ef775c82ba9a715a05995b579737e79f6
705473781c1aec7f0f3374bb1d97006bd0bfd8a9c906f5204045aeab7c2a99e7
71d6f1be201b12679e95174bb48c793084abf7813b767a4069b8ddbe4876c6ec
72855c173e195a3e74f1f7e4587bb29f51a762fa9b9e0fbbf6d80e420957a8ca
73032accf72bdc46460f8cf7395082094db4444d5e41e7e9b2a2617b38b88847
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
76c393f564f53c19e795307e622edc8657a603f7a816c2646385697286d11313
7725538fe2f71147bffeba7452b434c826aef9009666cb4360c605d0b2a91d1d
790407d643dfe21ecd773a44007cde3980d7a5eabd829ad1f06c2738b72fd1a2
793a510499b087f0a49bfa613a33c9411fba84a96883014c0ed34c02c5cfba30
7de0e304007e1f691f02d07805cea3467c4cd7e4f88f25651c71d08771793a44
7efa3776e9fae7550b1ce0fb32d1b75e018bd7566c10c68c2f6ffb693315b267
8123470f5549b50c979d1251dd4b27dc0c0db2cd15ad8f68c54858cc2ae57504
821e2efd660f6b759d561cd5cd194670e51ecebcbc06055cdcbebcd91ec94a56
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
86927cafa657ae14a28bdca63befb837251fc4ce67683aa19fdccf4d1bfeef3b
87083882cc6015984eb0411a99d3981817f5dc5c90ba24f0940420c5548d82de
893fa7339c102fb976d4065531644d8a8ac565fc84818a77600ad3ed5a72a26b
89b7e20cf73c5d61af4ae659c63f2eab235dd32a1dce673b5e6c3d47be59d6ef
8b703b9f986241e1202672cb854dfa0c5d18d18d762ed927cc9f0ecbad7addfe
8beb904f67cc6daaa4d6d22518152461f640b003b4accab3b705bb2cb92e8230
8db3daba71f655f21d2c31ce0a75b09e27e339241b2acd3637580db9a9eb2120
8db624e21c35d3f1626601a61acb544d8dc307f820c325f945d4a2b60cb2c2eb
8eb1b12b01dcfd0e7d7a431cb5daf50292db75a75516bed8758ba55a2c9de2f0
92bf1430101750b07257b8b4ea6e183ac4506d1e5bfa6812034f5f82a8792547
9725b267c37b60d3a97a87216aa18ef1d1922138faa4f548e506fccfe5517f61
9d5718f13181da45241b915b1d7ae28f54f80f543bb8aab1904fe3efbcb2465e
9efa53ec1a261a8576a66a71befaf9d03c1a108aac36271f4599b87597b8a71e
a065920df8cc4016d67c3a464be90099c9d28ffe7c9e6ee3a18f257efc58cbd7
a52f6ae223268cd95cd086b2cb01396c1337d3ac5a0d06acefe0fba13fdad3a0
a918398757d96e3ea56588bac74d195c9a3ecbf4314501c7ed51b19de2daf581
aaf4e5c88ec1e577a13ba8c49f7c556b9b9139f66952624c5bef7159db8d2632
ab8bbbaf028510d8b119cce741f0c2cc94816dcc113d83cac81a6aade6a76fa9
aba21d1efe464adb5078f827948c4976fe821709b0a2d9414b6790070eaee37c
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
aea12b3a674fe2f59d097b8d516e53bcf16116d940190a361514f67327f364a4
af9e05e18a2be5ae5a15505e259ae486da5030111e991c9d1bc5060fcd938221
b1442e85b03bdcaf66dc58c7abb98745dd2687d86350be9a298a1d9382ac849b
b1719c56cbcf138e4ebd26dbe62e34b2f58760f0e77ec01eee6e18624c344926
b198f6c8ffd50a477f7dea4911bcbeb614271d080084eb189c30716ef24af5db
b1ae253cba132ab2566227a6f5a59ea9a90cdffef6f6bf06c55a222ed3afef53
b2a27a31e9d34704f0c2adae8a77ce35e0bc3c352a40a682d89783142780c2f7
b8e39cd9d9fd668f0fa22bc541e8ba3aa8d58ad5e6c37aa81d671dc47ce280f3
b9ea552a4ee1c36700f2b82f6ceeb49a2ca8b8516f7ee11d0ec071ba3a8daf81
bdeed1e1c0751610c8f3dc2a5c78c93f841c366b36a7f7a54f5e6752c2656c05
c09055f0d3ce5ac45f886c935226d1e4cb0f7488525e9f8b298f26fc0171e5a8
c0d3b7161f73aec5b644854dbd8252ba88a438fd2c34e1dff48c7d47cf41cde9
c1f50d02c61b8c4117a0dca2f615697d34c74a1de958e3ef8cde8b663112d2ad
c6b15940ada672bb9d1bf510d00597727670784d224cb95a06b09633646010e6
c82374d4dce9d17bd18331dfb61f597894994e818486faefac7b1ada908c6813
c835e222d8b3ebd4420d7d7ae757cfd0f3627c11d5bebb9e703662e24a7615f9
c86b97039dee366847426e8ecac1d0dcdb158aea76b2d00a74eb479b05a2a5cb
c872510d9beca2adca7dc000239c71c9d54c03f3fc805833a661de6a23a2e4ec
cb992eae898417162c48b37712991d9ad8053c4a64fce51aff195edc69dc35f2
cddc04822e3d360c8d4ce7041294700199c5c9e3395ae7c21a311a112ae0526f
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
cf5f7097095ba3ad82d596ed9d919f9f5c9e8110c655e860ac16088c39df9aa6
d032695018480726794e6e6eff112f7116a5122bb269d22dc77f3516604a1c1e
d7a4d52f0d11ac4b648bd9199feae31ea441cd3cf0677529a4d2f0d20b7a5913
d8381e66783011957eabadb622d7899061bf93e78fff38ebfe00ab743d6c8e60
d9a75729ca40f061dff3a36b6dae2a1cc1d9ebc5d6d2f83ec08a89a982178c3c
da290c3461cc9e7d0d7bce8bf68712cc34a5259f0c07849805b46ac27d4e9adc
dbb67c620eaabf6679a314db18d3ae43037aef71ab27422e6feec08ee987cc0a
dc111a70984a9eda00752b06277113029ef288f1125c31eff2477413e15e8aa4
dc82de33871a9ed40a5379ed264dd0456d9bf58839286b913231648f527bc72b
dd28ac8237e60211a798ccc9ecacec2accc1fd02ee06f6264a3624606cd38831
df9a8ea808eab2cfe30957bbf9979a1c2b892c6a074c2a848661aa4cf89c6416
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e4053662ea4a6fc5287c4793a62aeeb34c6c906eb350bb9fd601809e01c68d10
e48c4975b293be404aa17aca3844095d270597494ffabe5316cad8c3e45d5004
e4e8c69010873988afa00cab5c1c1d7f51ad9c21ce37774fd0be40618ff38434
eabf1e513f3a3a42429be6d8e0bb8163ce61ac7ae2079f9aa656f58335b7489b
ec64597779d754515551af95d0f7f66ddc2aa9004eb5b401acb8d9725c261188
ec6e84a87ec3b3c62ff5cb631f7634018d3e0e01dd6233901eb55eff958f7a47
ed030d2e8119198ff49d389fd0f9c4a8547cfc60e8986dcc378b9f389c6f3c1c
ede401f1ed56b31a6f0f795b0b8f1a9948878459b450d5f9eea82051c2e24d40
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f2627d56fad12cefb399d0578c9f3c4ad45eba9cd72cc173bc85c366a925a276
f43c9a6473f8db88131adcf90e78eb36c06aaeb7c87cfa7127312a4db59b5985
f4fbbb7746d71d3ed2cf5ba8df40b1f906d988ee88e79c7c4086c40cf373f5c4
f50167bee40cd7fdd6c623efb794e0edddec7de87ef71f48c8b1b1413e1dfc4a
f624a1340df7bd5790c3cc8e9bef71e8e374ca2f165030e9c9f3c5b51548b7c3
f68019eb4b4e5933301d4ee75969e0cb94ed8333bf514630fa749eb9c3e483c9
f90124131fbd91439b9215f735fece7a698d64650f9e6ed3b7c7f315ae80e883
fec6f3ec568bf48390b82bd29ae53a4e8f3324fd5b5fd062ff807a0de553188a