Submitted URL: http://www.golem.de/
Effective URL: https://www.golem.de/
Submission: On August 04 via manual from DE

Summary

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

urlscan.io Verdict: No classification

Domain & IP information

IP Address AS Autonomous System
1 72 77.247.84.129 25291 (SYSELEVEN...)
2 77.247.84.128 25291 (SYSELEVEN...)
8 2a00:13c8:f5:... 25291 (SYSELEVEN...)
17 2a00:13c8:f5:... 25291 (SYSELEVEN...)
2 2a00:13c8:f5:... 25291 (SYSELEVEN...)
1 91.215.100.39 43407 (INFONLINE-AS)
1 2a00:1450:400... 15169 (GOOGLE)
8 2a00:1450:400... 15169 (GOOGLE)
15 2.18.235.40 16625 (AKAMAI-AS)
1 2600:9000:204... 16509 (AMAZON-02)
1 1 52.19.206.103 16509 (AMAZON-02)
2 52.17.80.93 16509 (AMAZON-02)
1 2.18.232.23 16625 (AKAMAI-AS)
1 89.163.159.126 24961 (MYLOC-AS)
1 2600:9000:204... 16509 (AMAZON-02)
2 2.18.232.233 16625 (AKAMAI-AS)
9 2a00:1450:400... 15169 (GOOGLE)
3 2a00:1450:400... 15169 (GOOGLE)
13 172.217.22.66 15169 (GOOGLE)
2 35.165.133.163 16509 (AMAZON-02)
1 52.56.240.94 16509 (AMAZON-02)
7 185.33.223.216 29990 (ASN-APPNEXUS)
1 178.250.2.130 44788 (ASN-CRITE...)
17 2a00:1450:400... 15169 (GOOGLE)
1 2 91.215.100.40 43407 (INFONLINE-AS)
1 2a00:1450:400... 15169 (GOOGLE)
1 2a00:13c8:f5:... 25291 (SYSELEVEN...)
1 178.250.2.89 44788 (ASN-CRITE...)
1 2600:9000:204... 16509 (AMAZON-02)
1 1 2a00:1450:400... 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
2 52.216.1.195 16509 (AMAZON-02)
1 52.222.150.179 16509 (AMAZON-02)
1 54.72.140.158 16509 (AMAZON-02)
1 85.114.144.198 24961 (MYLOC-AS)
1 2 89.163.159.116 24961 (MYLOC-AS)
1 1 2001:16e0:10a... 12611 (RKOM R-KO...)
1 1 85.114.159.93 24961 (MYLOC-AS)
1 2001:16e0:10a... 12611 (RKOM R-KO...)
1 176.9.101.100 24940 (HETZNER-AS)
1 2400:cb00:204... 13335 (CLOUDFLAR...)
3 52.49.47.75 16509 (AMAZON-02)
1 54.77.222.97 16509 (AMAZON-02)
2 2a00:1450:400... 15169 (GOOGLE)
1 1 66.117.28.86 15224 (OMNITURE)
1 2a00:1450:400... 15169 (GOOGLE)
1 52.222.150.128 16509 (AMAZON-02)
1 176.9.3.108 24940 (HETZNER-AS)
2 188.40.138.133 24940 (HETZNER-AS)
1 62.138.242.228 61157 (PLUSSERVE...)
213 46
Apex Domain
Subdomains
Transfer
106 golem.de
www.golem.de
iqdtms.golem.de
cpxl.golem.de
video.golem.de
ads.golem.de
cpx.golem.de
ssl.1.damoh.golem.de
2 MB
25 googlesyndication.com
tpc.googlesyndication.com
pagead2.googlesyndication.com
257 KB
20 doubleclick.net
securepubads.g.doubleclick.net
stats.g.doubleclick.net
googleads.g.doubleclick.net
122 KB
16 moatads.com
z.moatads.com
mb.moatads.com
px.moatads.com
193 KB
7 adnxs.com
ib.adnxs.com
5 KB
5 demdex.net
dpm.demdex.net
iqdigital.demdex.net
4 KB
3 google.com
adservice.google.com
513 B
3 google.de
adservice.google.de
513 B
3 yieldlab.net
ad.yieldlab.net
p.yieldlab.net
2 KB
3 theadex.com
dmp.theadex.com
xpl.theadex.com
15 KB
3 ioam.de
script.ioam.de
de.ioam.de
10 KB
2 googleapis.com
imasdk.googleapis.com
79 KB
2 df-srv.de
d.df-srv.de
1 KB
2 adrtx.net
cdn.adrtx.net
adstax-match.adrtx.net
848 B
2 svonm.com
hgc-cf-cache-1.svonm.com
2 KB
2 amazonaws.com
s3.amazonaws.com
1 KB
2 google-analytics.com
www.google-analytics.com
ssl.google-analytics.com
17 KB
2 xplosion.de
ups.xplosion.de
5 KB
2 emetriq.de
dyn.emetriq.de
cdn.emetriq.de
2 KB
2 cloudfront.net
dx6ctphzljkf1.cloudfront.net
d1pywvbolq0b04.cloudfront.net
29 KB
1 whitepaperdb.de
golem.whitepaperdb.de
1 2mdn.net
s0.2mdn.net
10 KB
1 everesttech.net
cm.everesttech.net
527 B
1 radiantmediatechs.com
cdn.radiantmediatechs.com
2 KB
1 adition.com
dsp.adfarm1.adition.com
486 B
1 criteo.com
bidder.criteo.com
186 B
1 criteo.net
static.criteo.net
23 KB
1 adobedtm.com
assets.adobedtm.com
36 KB
1 googletagservices.com
www.googletagservices.com
8 KB
213 29
Domain Requested by
72 www.golem.de 1 redirects www.golem.de
17 pagead2.googlesyndication.com www.golem.de
pagead2.googlesyndication.com
securepubads.g.doubleclick.net
17 video.golem.de www.golem.de
text
video.golem.de
13 securepubads.g.doubleclick.net www.googletagservices.com
securepubads.g.doubleclick.net
www.golem.de
9 px.moatads.com www.golem.de
8 tpc.googlesyndication.com www.golem.de
securepubads.g.doubleclick.net
8 cpxl.golem.de www.golem.de
video.golem.de
7 ib.adnxs.com dx6ctphzljkf1.cloudfront.net
6 googleads.g.doubleclick.net pagead2.googlesyndication.com
6 z.moatads.com www.golem.de
4 ssl.1.damoh.golem.de www.golem.de
text
3 iqdigital.demdex.net www.golem.de
assets.adobedtm.com
3 adservice.google.com www.googletagservices.com
pagead2.googlesyndication.com
3 adservice.google.de www.googletagservices.com
pagead2.googlesyndication.com
2 imasdk.googleapis.com www.golem.de
imasdk.googleapis.com
2 d.df-srv.de 1 redirects www.golem.de
2 xpl.theadex.com 1 redirects www.golem.de
2 hgc-cf-cache-1.svonm.com www.golem.de
text
2 s3.amazonaws.com www.golem.de
text
2 de.ioam.de 1 redirects www.golem.de
2 dpm.demdex.net assets.adobedtm.com
www.golem.de
2 ad.yieldlab.net www.golem.de
2 ups.xplosion.de www.golem.de
cdn.emetriq.de
2 ads.golem.de www.golem.de
2 iqdtms.golem.de www.golem.de
1 golem.whitepaperdb.de securepubads.g.doubleclick.net
1 s0.2mdn.net imasdk.googleapis.com
1 cm.everesttech.net 1 redirects
1 adstax-match.adrtx.net cdn.adrtx.net
1 cdn.radiantmediatechs.com www.golem.de
1 dsp.adfarm1.adition.com 1 redirects
1 p.yieldlab.net www.golem.de
1 cdn.adrtx.net www.golem.de
1 stats.g.doubleclick.net www.golem.de
1 ssl.google-analytics.com 1 redirects
1 cdn.emetriq.de ups.xplosion.de
1 bidder.criteo.com static.criteo.net
1 cpx.golem.de www.golem.de
1 www.google-analytics.com www.golem.de
1 static.criteo.net dx6ctphzljkf1.cloudfront.net
1 mb.moatads.com z.moatads.com
1 d1pywvbolq0b04.cloudfront.net www.golem.de
1 dmp.theadex.com www.golem.de
1 assets.adobedtm.com www.golem.de
1 dyn.emetriq.de 1 redirects
1 dx6ctphzljkf1.cloudfront.net www.golem.de
1 www.googletagservices.com iqdtms.golem.de
1 script.ioam.de www.golem.de
213 48
Subject Issuer Validity Valid
*.golem.de
GeoTrust TLS RSA CA G1
2018-06-29 -
2019-08-28
a year crt.sh
*.g.doubleclick.net
Google Internet Authority G3
2018-07-24 -
2018-10-02
2 months crt.sh
ssl.1.damoh.golem.de
Let's Encrypt Authority X3
2018-07-24 -
2018-10-22
3 months crt.sh
*.adrtx.net
Amazon
2017-10-25 -
2018-11-25
a year crt.sh
*.demdex.net
DigiCert SHA2 High Assurance Server CA
2018-01-09 -
2021-02-12
3 years crt.sh
*.googleapis.com
Google Internet Authority G3
2018-07-24 -
2018-10-02
2 months crt.sh
tpc.googlesyndication.com
Google Internet Authority G3
2018-07-24 -
2018-10-02
2 months crt.sh
golem.whitepaperdb.de
Let's Encrypt Authority X3
2018-07-06 -
2018-10-04
3 months crt.sh

This page contains 24 frames:

Primary Page: https://www.golem.de/
Frame ID: C8E5367B20A50A4DC6DF33589CB7A061
Requests: 171 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/html/r20180801/r20180604/zrt_lookup.html
Frame ID: F385AB10DE88A6AFA747FCA6011E38AD
Requests: 1 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/show_ads_impl.js
Frame ID: 68BE02293A22487617C06CA006DB1D8C
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=6643888890&adk=2120986408&adf=2993371392&w=460&lmt=1533407800&num_ads=1&guci=1.2.0.0.2.2.0&format=460x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1533407800774&bpp=8&bdt=759&fdt=12&idt=148&shv=r20180801&cbv=r20180604&saldr=aa&abxe=1&correlator=410721347715&frm=20&pv=2&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=139286814&ga_fc=1&iag=0&icsg=1521724269006784&dssz=75&mdo=0&mso=32&u_tz=0&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=4084&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C21062171%2C368226401%2C42631003&oid=3&rx=0&eae=0&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=7&osw_key=2289871070&ifi=1&fsb=1&xpc=AMvcfpViW0&p=https%3A//www.golem.de&dtd=173
Frame ID: 5571D7D6EC6DFB18636D5D37F11D80E7
Requests: 1 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/show_ads_impl.js
Frame ID: F8185807D5C4ECAD197ED41F3088AA42
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=9597355291&adk=3463405676&adf=3103571475&w=460&lmt=1533407801&num_ads=1&guci=1.2.0.0.2.2.0&format=460x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1533407800786&bpp=9&bdt=770&fdt=224&idt=227&shv=r20180801&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=460x120&correlator=410721347715&frm=20&pv=1&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=139286814&ga_fc=1&iag=0&icsg=1521724269006784&dssz=84&mdo=0&mso=32&u_tz=0&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=4805&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C21062171%2C368226401%2C42631003&oid=3&rx=0&eae=0&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=7&osw_key=1724946463&ifi=2&fsb=1&xpc=9jlyjGVfxY&p=https%3A//www.golem.de&dtd=239
Frame ID: D9A1AF47D2291580EA26D2433112550B
Requests: 1 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/show_ads_impl.js
Frame ID: 4D97B1A1C9259E5AB96BB8D24CE0E0A3
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=2074088491&adk=1810682093&adf=700606410&w=460&lmt=1533407801&num_ads=1&guci=1.2.0.0.2.2.0&format=460x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1533407800795&bpp=5&bdt=780&fdt=288&idt=291&shv=r20180801&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=460x120%2C460x120&correlator=410721347715&frm=20&pv=1&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=139286814&ga_fc=1&iag=0&icsg=1521724269006784&dssz=84&mdo=0&mso=32&u_tz=0&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=5527&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C21062171%2C368226401%2C42631003&oid=3&rx=0&eae=0&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=7&osw_key=1026561616&ifi=3&fsb=1&xpc=BJ8lwemWvt&p=https%3A//www.golem.de&dtd=305
Frame ID: 7AB2B87E3A51D7D48118F32BCDF988BA
Requests: 1 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/show_ads_impl.js
Frame ID: 2C8645A857B14F05D477D33CA187A7D6
Requests: 1 HTTP requests in this frame

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

Frame: https://iqdigital.demdex.net/dest5.html?d_nsid=0
Frame ID: D21A7716C270F833C443C9E157EEB447
Requests: 1 HTTP requests in this frame

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

Frame: https://tpc.googlesyndication.com/pagead/js/r20180801/r20110914/activeview/osd_listener.js
Frame ID: 2E5297B2772952A906C693D4DC4506D7
Requests: 5 HTTP requests in this frame

Frame: https://video.golem.de/bannertest/golem/desktop-banner-728.shtml
Frame ID: B0CF0BB6FA0441B0C3204984CFB63B6B
Requests: 8 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/safeframe/1-0-29/html/container.html
Frame ID: 7684C1FF45831C1F1D09398ACD2973AF
Requests: 1 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Frame ID: DB9A9E75D92D702EE80ADF31534CC598
Requests: 9 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/show_ads_impl.js
Frame ID: E2F1D80718E4F9B7A8B9663715394984
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-6583763995580712&output=html&h=250&slotname=3923427907&adk=825103508&adf=2162829632&w=300&guci=1.2.0.0.2.2.0&format=300x250&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&avail_w=0&wgl=1&dt=1533407802351&bpp=7&bdt=634&fdt=7&idt=9&shv=r20180801&cbv=r20180604&saldr=aa&correlator=410721347715&frm=23&ife=4&pv=2&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=1895738927&ga_fc=1&iag=3&icsg=2728&nhd=1&dssz=14&mdo=0&mso=0&u_tz=0&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=993&ady=4144&biw=1585&bih=1200&isw=300&ish=250&ifk=1933803164&scr_x=0&scr_y=0&eid=21060853%2C21062171%2C368226400&oid=3&rx=0&eae=2&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C300%2C250&vis=1&rsz=o%7Co%7CeEbr%7C&abl=NS&ppjl=u&pfx=0&fu=20&bc=7&osw_key=606431463&ifi=1&fsb=1&dtd=17
Frame ID: 4E7BA149301E49677360CF2095A7F5DF
Requests: 1 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Frame ID: 162F6CB1E1AFDBDF1F39AC3E1946267E
Requests: 9 HTTP requests in this frame

Frame: https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/show_ads_impl.js
Frame ID: 2CDDCF3D5864BEC4EE5F165681DEE572
Requests: 1 HTTP requests in this frame

Frame: https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-6583763995580712&output=html&h=250&slotname=9888525209&adk=1110963404&adf=4205041376&w=800&guci=1.2.0.0.2.2.0&format=800x250&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&wgl=1&dt=1533407802541&bpp=4&bdt=821&fdt=5&idt=6&shv=r20180801&cbv=r20180604&saldr=aa&correlator=410721347715&frm=23&ife=4&pv=1&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=646917476&ga_fc=1&iag=3&icsg=2728&nhd=1&dssz=14&mdo=0&mso=0&u_tz=0&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=393&ady=11315&biw=1585&bih=1200&isw=800&ish=250&ifk=539073182&scr_x=0&scr_y=0&eid=21060853%2C21062171%2C368226400&oid=3&rx=0&eae=2&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C800%2C250&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=20&bc=7&osw_key=2012678058&ifi=1&fsb=1&dtd=13
Frame ID: B507AB282E58F9C586FD35DA5EA0EF1C
Requests: 1 HTTP requests in this frame

Frame: https://golem.whitepaperdb.de/?tag=golem
Frame ID: 9C2E7CF29E25FD52A8B22323274E18E9
Requests: 1 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/pagead/js/r20180801/r20110914/activeview/osd_listener.js
Frame ID: ADBD947D03EB9956563500E7BDD4C8BE
Requests: 4 HTTP requests in this frame

Frame: https://tpc.googlesyndication.com/pagead/js/r20180801/r20110914/activeview/osd_listener.js
Frame ID: 2F6DE7019BABDBAA3BA980B45909DF34
Requests: 4 HTTP requests in this frame

Screenshot


Page URL History Show full URLs

  1. http://www.golem.de/ HTTP 301
    https://www.golem.de/ Page URL

Detected technologies

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

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

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

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

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

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

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

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

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

Page Statistics

213
Requests

54 %
HTTPS

40 %
IPv6

29
Domains

48
Subdomains

46
IPs

6
Countries

3293 kB
Transfer

7718 kB
Size

16
Cookies

Page URL History

This captures the URL locations of the websites, including HTTP redirects and client-side redirects via JavaScript or Meta fields.

  1. http://www.golem.de/ HTTP 301
    https://www.golem.de/ Page URL

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 24
  • https://dyn.emetriq.de/loader/97578/default.js HTTP 302
  • https://ups.xplosion.de/loader/97578/default.js?xplrdir=1
Request Chain 60
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0012&i2=0012374d13b51c4225b65f238&ep=1558392831&vr=409&id=s9k4qs&lt=1533407800676&ev=&cs=1jejua&mo=1 HTTP 302
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0012&i2=0012374d13b51c4225b65f238&ep=1558392831&vr=409&id=s9k4qs&lt=1533407800676&ev=&cs=1jejua&mo=1&sr=71
Request Chain 115
  • https://ssl.google-analytics.com/r/__utm.gif?utmwv=5.7.2&utms=1&utmn=1050885305&utmhn=www.golem.de&utme=8(HTML5)9(1)11(2)&utmcs=UTF-8&utmsr=1600x1200&utmvp=1585x1200&utmsc=24-bit&utmul=en-us&utmje=0&utmfl=-&utmdt=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&utmhid=139286814&utmr=-&utmp=%2F&utmht=1533407800761&utmac=UA-518800-2&utmcc=__utma%3D21769261.108889994.1533407801.1533407801.1533407801.1%3B%2B__utmz%3D21769261.1533407801.1.1.utmcsr%3D(direct)%7Cutmccn%3D(direct)%7Cutmcmd%3D(none)%3B&aip=1&utmjid=1536962634&utmredir=1&utmu=qRQAAAAAAAAAAAAAAAAAAAAE~ HTTP 302
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=108889994.1533407801&jid=1536962634&_v=5.7.2&z=1050885305
Request Chain 134
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSasBs_AWsJABibsBSf-BiUABifkBif-BsfABiUABifABfrr HTTP 302
  • https://xpl.theadex.com/d/327/i/2.gif?_sc=1000717912036410004&axd_pid=22&axd_fuid=BSasBs_AWsJABibsBSf-BiUABifkBif-BsfABiUABifABfrr
Request Chain 135
  • https://d.df-srv.de/match/a.js?pid=42 HTTP 302
  • https://dsp.adfarm1.adition.com/cookie/?redirect=https%3A%2F%2Fd.df-srv.de%2Fmatch%2Fa.js%3Fpid%3D42%26l%3D1%26adition_vid%3D%25%25COOKIE%25%25 HTTP 302
  • https://d.df-srv.de/match/a.js?pid=42&l=1&adition_vid=6585936356731058199
Request Chain 157
  • https://cm.everesttech.net/cm/dd?d_uuid=15523052123455657943557814271170652056 HTTP 302
  • https://dpm.demdex.net/ibs:dpid=411&dpuuid=W2XyOQAABuTbdzx0

213 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
Primary Request Cookie set /
www.golem.de/
Redirect Chain
  • http://www.golem.de/
  • https://www.golem.de/
169 KB
170 KB
Document
General
Full URL
https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3d19ec539a1a6b7e6400fbadc83e61a61a442fc840750004df6201d384b6ecd0
Security Headers
Name Value
Strict-Transport-Security max-age=11001100; includeSubDomains; preload

Request headers

Host
www.golem.de
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding
gzip, deflate
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
X-DevTools-Emulate-Network-Conditions-Client-Id
C8E5367B20A50A4DC6DF33589CB7A061

Response headers

Server
nginx
Date
Sat, 04 Aug 2018 18:36:40 GMT
Content-Type
text/html; charset=UTF-8
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Set-Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; expires=Sun, 05-Aug-2018 06:36:39 GMT; Max-Age=43200; path=/; domain=.golem.de
Strict-Transport-Security
max-age=11001100; includeSubDomains; preload
Cache-Control
private
Vary
User-Agent, Accept-Encoding

Redirect headers

Location
https://www.golem.de/
Server
BigIP
Connection
Keep-Alive
Content-Length
0
golem_main_114-min.css
www.golem.de/staticrl/styles/
73 KB
20 KB
Stylesheet
General
Full URL
https://www.golem.de/staticrl/styles/golem_main_114-min.css
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
2bdb9058c86c9b82b28d52d721fb75df307033cac39891be256b4f74bbb1b083

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/css,*/*;q=0.1
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Content-Encoding
gzip
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
W/"5b0d91ca-12251"
Vary
Accept-Encoding
Content-Type
text/css
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Tue, 04 Sep 2018 18:36:40 GMT
iqd_gzip_test.js.gz
iqdtms.golem.de/
23 B
491 B
Script
General
Full URL
https://iqdtms.golem.de/iqd_gzip_test.js.gz
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.128 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ec734c8897764322b10b819d78cc8933f050ba27cc3f971ee23ea91b9fdc958e

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
iqdtms.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Tue, 13 Jan 2015 08:41:49 GMT
Server
nginx
x-amz-request-id
65F76781748D7D50
ETag
"1ec37da4a5d51c998484c055cc5ae466"
Content-Type
application/x-gzip
X-UPSTREAM
52.219.74.52:443 hybrid1.golem.de
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
23
x-amz-id-2
wd1XNfrw+FYMwWcOmKwfnJo31/6U2AmpUOvnPSIkzs658cFRjIU1fEGyxBSWvTr4B23Srea6ES0=
logo-g.png
www.golem.de/staticrl/images/
4 KB
4 KB
Image
General
Full URL
https://www.golem.de/staticrl/images/logo-g.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ec3943468e660a13879ad7ea484da73199fd5220d765a1163c045294fbc1c546

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-e82"
Content-Type
image/png
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
3714
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135835-170320-170318_rc.jpg
www.golem.de/1808/
18 KB
19 KB
Image
General
Full URL
https://www.golem.de/1808/135835-170320-170318_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
11bff00987c994f5ec78a5864e686c4b449879905328b5927a2c7a5b8e307312

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Sat, 04 Aug 2018 12:30:06 GMT
Server
nginx
ETag
"5b659c4e-4972"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
18802
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135833-170317-170314_rc.jpg
www.golem.de/1808/
8 KB
9 KB
Image
General
Full URL
https://www.golem.de/1808/135833-170317-170314_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1fbd2c22d6f321559e81dd8af4a9b243f1f43cb81a9562a0f5de66757e9ed66b

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Sat, 04 Aug 2018 11:16:04 GMT
Server
nginx
ETag
"5b658af4-2175"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8565
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135837-170329-170326_rc.jpg
www.golem.de/1808/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1808/135837-170329-170326_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
48e540075547b37df71fb60e3cea8b1c0da7f27038fea83e43b7026780278e31

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

X-Cnection
close
Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Sat, 04 Aug 2018 13:45:05 GMT
Server
nginx
ETag
"5b65ade1-17a5"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Accept-Ranges
bytes
Content-Length
6053
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135836-170325-170322_rc.jpg
www.golem.de/1808/
3 KB
3 KB
Image
General
Full URL
https://www.golem.de/1808/135836-170325-170322_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
9e62630fe5b68c1a7ec5cd05c3e283faa7a50fd59224caeb094ab127ba357147

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Sat, 04 Aug 2018 13:15:05 GMT
Server
nginx
ETag
"5b65a6d9-c84"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
3204
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135813-170228-170227_rc.jpg
www.golem.de/1808/
8 KB
9 KB
Image
General
Full URL
https://www.golem.de/1808/135813-170228-170227_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
43814f576ca8f07d79b059fc167caf849855e567ff76c5a0078bc229222f671d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Fri, 03 Aug 2018 07:00:08 GMT
Server
nginx
ETag
"5b63fd78-2181"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8577
Expires
Tue, 04 Sep 2018 18:36:40 GMT
gif
cpxl.golem.de/
43 B
292 B
Image
General
Full URL
https://cpxl.golem.de/gif?u=https%3A%2F%2Fwww.golem.de%2F&d=1533406141&f=ev&v=d&t=ad%2Fjobs2016kw24
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
98b3d9d20e032f90aca49e9b116225d539ff6fbdb7e42c3c363f63896ac03d2a

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
cpxl.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Content-Type
image/gif
X-RateLimit-Remaining
762
Transfer-Encoding
chunked
X-RateLimit-Limit
800
Connection
keep-alive
silvana-snap.jpg
video.golem.de/teaser/1/1/21550/thumb-high-1000/
87 KB
87 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/21550/thumb-high-1000/silvana-snap.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e0da4b1ee9e976b49dc9386f3566116a912ab17c4a1c70cb21d293b52d5580e0

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Fri, 03 Aug 2018 08:05:14 GMT
Server
nginx
ETag
"5b640cba-15b68"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
88936
Expires
Tue, 04 Sep 2018 18:36:40 GMT
capturecards-snap6.jpg
video.golem.de/teaser/1/1/21485/thumb-high-1000/
117 KB
117 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/21485/thumb-high-1000/capturecards-snap6.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
50e4207d414884b31a535e76afbf2a67f80e990ae1497c11c72a4c857509953a

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Fri, 27 Jul 2018 20:51:46 GMT
Server
nginx
ETag
"5b5b85e2-1d30a"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
119562
Expires
Tue, 04 Sep 2018 18:36:40 GMT
gif
cpxl.golem.de/
43 B
292 B
Image
General
Full URL
https://cpxl.golem.de/gif?u=https%3A%2F%2Fwww.golem.de%2F&d=1533407041&f=ev&v=d&t=ad%2Fdeals2016kw24
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
98b3d9d20e032f90aca49e9b116225d539ff6fbdb7e42c3c363f63896ac03d2a

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
cpxl.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Content-Type
image/gif
X-RateLimit-Remaining
761
Transfer-Encoding
chunked
X-RateLimit-Limit
800
Connection
keep-alive
135171-167202-167198_rc.jpg
www.golem.de/1806/
74 KB
75 KB
Image
General
Full URL
https://www.golem.de/1806/135171-167202-167198_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3f7b4aea2fdb1d4289fd00e783d62f7ceb8c688f4630e0c19ad588ff1a29dfef

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Thu, 28 Jun 2018 10:12:07 GMT
Server
nginx
ETag
"5b34b477-128ae"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
75950
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135460-168609-168606_rc.jpg
www.golem.de/1807/
83 KB
84 KB
Image
General
Full URL
https://www.golem.de/1807/135460-168609-168606_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
f68e85f197e649cbbad2544598485f7a5a5b1c2c4391bce3ce2edd1fcfeeb0f4

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Fri, 20 Jul 2018 10:20:17 GMT
Server
nginx
ETag
"5b51b761-14cc3"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
85187
Expires
Tue, 04 Sep 2018 18:36:40 GMT
golem_main_114-min.js
www.golem.de/staticrl/scripts/
100 KB
41 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d250260787efed78dd06a1f30ef3503b52ce8271cc22a08b891adaf21eefabc1

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Content-Encoding
gzip
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
W/"5b0d91ca-190c7"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Tue, 04 Sep 2018 18:36:40 GMT
longread-swiper_117-min.js
www.golem.de/staticrl/scripts/
2 KB
1 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/longread-swiper_117-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
f9419c8665c921f8c9e31bfa93744613721289a9c3b45a0ace0507fa54813da0

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Content-Encoding
gzip
Last-Modified
Tue, 29 May 2018 19:20:25 GMT
Server
nginx
ETag
W/"5b0da7f9-974"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Tue, 04 Sep 2018 18:36:40 GMT
account_js_dt18_1_0.php
www.golem.de/abo/
88 B
474 B
Script
General
Full URL
https://www.golem.de/abo/account_js_dt18_1_0.php
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
8a5ebf17c751099d2f751d23dd57cd262691ccc803fc6f8fa1712922a86a8a8d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

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

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
ads.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Tue, 13 May 2014 18:28:31 GMT
Server
nginx
ETag
"5372644f-3f"
Content-Type
application/javascript
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
63
Expires
Tue, 04 Sep 2018 18:36:40 GMT
iam.js
script.ioam.de/
26 KB
9 KB
Script
General
Full URL
https://script.ioam.de/iam.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Server
91.215.100.39 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
script4.ioam.de
Software
nginx / BLACKBIRD-SRC v0.9 0012
Resource Hash
4377f1167496d3c32e39f8c5c10b77db13f0460f2648afb46d23052406b2a6b7

Request headers

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

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Content-Encoding
gzip
Last-Modified
Sat, 04 Aug 2018 18:36:40 GMT
Server
nginx
X-Powered-By
BLACKBIRD-SRC v0.9 0012
Vary
Accept-Encoding
P3P
policyref=https://script.ioam.de/p3p.xml, CP=NOI DSP NID PSAa OUR NOR UNI COM NAV
Cache-Control
privat, max-age=7200, pre-check=7200
Transfer-Encoding
chunked
Connection
keep-alive
Content-Type
application/javascript
Expires
Sat, 04 Aug 2018 20:36:40 GMT
iqadcontroller.js.gz
iqdtms.golem.de/cdn_golem_dt/live/
178 KB
46 KB
Script
General
Full URL
https://iqdtms.golem.de/cdn_golem_dt/live/iqadcontroller.js.gz
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.128 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
714b111098ec8f8a5521c4698585d0ca59efc6e450351c5770f01f2c0794a6e3

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
iqdtms.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Content-Encoding
gzip
Last-Modified
Fri, 27 Jul 2018 13:59:24 GMT
Server
nginx
x-amz-request-id
D850672D070F0E24
ETag
"7fad8aff3b92707165b324b0f23f8e2b"
Content-Type
text/javascript
X-UPSTREAM
52.219.73.68:443 hybrid3.golem.de
Cache-Control
no-cache
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
46126
x-amz-id-2
1Xh6OZCnMcR6XDIZUCfco06iGJSooJnSmZBX09Pr6TqLWvd1aLzmoh0GwkDNEAPQ/qx3k3pjY6Q=
gpt.js
www.googletagservices.com/tag/js/
20 KB
8 KB
Script
General
Full URL
https://www.googletagservices.com/tag/js/gpt.js
Requested by
Host: iqdtms.golem.de
URL: https://iqdtms.golem.de/cdn_golem_dt/live/iqadcontroller.js.gz
Protocol
SPDY
Server
2a00:1450:4001:825::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
d2042f11d6be3b4a1c4d5cbb8c0edf0d8857a9de215c29d8e4d38ba354991966
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Sat, 04 Aug 2018 18:36:40 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
etag
"6 / 560 of 1000 / last-modified: 1533261456"
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900, stale-while-revalidate=3600
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
7808
x-xss-protection
1; mode=block
expires
Sat, 04 Aug 2018 18:36:40 GMT
imgad
tpc.googlesyndication.com/pagead/
25 B
191 B
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/imgad?id=CICAgKDTj9fOKBABGAEoATIIXhWOvj-krslA_KSrtwU
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Server
2a00:1450:4001:81c::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
eebd6f2e5a80bb5d11966fd2446842888fcefdc5b18a36a619aa6fa0756e9376
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Fri, 03 Aug 2018 01:40:21 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
age
147379
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
content-type
application/x-javascript; charset=UTF-8
status
200
cache-control
public, max-age=604800
content-disposition
attachment; filename="f.txt"
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
45
x-xss-protection
1; mode=block
expires
Fri, 10 Aug 2018 01:40:21 GMT
yield.js
z.moatads.com/iqdigitaldfpprebidheader645711382528/
98 KB
30 KB
Script
General
Full URL
https://z.moatads.com/iqdigitaldfpprebidheader645711382528/yield.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
dff33a67b61fc44fb90cd3d8dcede66b087afeb992b3338e8ffecaac478f246e

Request headers

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

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Content-Encoding
gzip
Last-Modified
Tue, 10 Jul 2018 14:39:07 GMT
Server
AmazonS3
x-amz-request-id
F358812C1A08881F
ETag
"286afe07681bd2ccd695928b81a9d6e7"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=20860
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
30032
x-amz-id-2
vmyJxA6a4Kq4zDRVFuCJ/FD2sNhEq7DVg4zwOVdHzRwHD7pSJyAiDJNty+EK/Oz7nJgv87xGMAU=
prebid15122017.js
dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/
87 KB
28 KB
Script
General
Full URL
https://dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/prebid15122017.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Server
2600:9000:2047:e00:1:9777:c740:21 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
7984292f8c57a537016e4e88ab90ef2bf63982f9b76a0d7bd66cf2012b574ccc

Request headers

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

Response headers

date
Wed, 11 Apr 2018 11:10:26 GMT
content-encoding
gzip
last-modified
Wed, 21 Feb 2018 10:31:22 GMT
server
AmazonS3
age
9962775
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
application/javascript
status
200
cache-control
max-age=31536000,public
x-amz-cf-id
ZzgDlMOilYDOTlsbTxMuL-2pldsNqPoCyeZOOmeD1zSY1i-OVPdzKA==
via
1.1 0e417d376ffbd42061f20338431828b5.cloudfront.net (CloudFront)
default.js
ups.xplosion.de/loader/97578/
Redirect Chain
  • https://dyn.emetriq.de/loader/97578/default.js
  • https://ups.xplosion.de/loader/97578/default.js?xplrdir=1
2 KB
2 KB
Script
General
Full URL
https://ups.xplosion.de/loader/97578/default.js?xplrdir=1
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Server
52.17.80.93 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-17-80-93.eu-west-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash
45661a3e6863d0c77529828a7bd5bc802d65fb7dbce6d7fde4df6d05f3394954

Request headers

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

Response headers

Date
Sat, 04 Aug 2018 18:36:39 GMT
Server
Apache-Coyote/1.1
P3P
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
Access-Control-Allow-Origin
*
Cache-Control
must-revalidate,no-cache,no-store
Connection
keep-alive
Content-Type
text/javascript
Content-Length
1544

Redirect headers

Location
https://ups.xplosion.de/loader/97578/default.js?xplrdir=1
Date
Sat, 04 Aug 2018 18:36:39 GMT
Server
Apache-Coyote/1.1
Connection
keep-alive
Content-Length
0
launch-EN92e1075482f3410d81944270acba8d90.min.js
assets.adobedtm.com/
111 KB
36 KB
Script
General
Full URL
https://assets.adobedtm.com/launch-EN92e1075482f3410d81944270acba8d90.min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Server
2.18.232.23 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-23.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
b6e89b196dba23b546bd19d80743af51191cd3a844f664c8e07cd29bfd9f2778

Request headers

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

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Content-Encoding
gzip
Last-Modified
Thu, 26 Jul 2018 10:10:22 GMT
Server
Apache
ETag
"c1a3f059eb315643337ae6774ba9d911:1532599822"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=3600
Connection
keep-alive
Accept-Ranges
bytes
Timing-Allow-Origin
*, *
Content-Length
36836
Expires
Sat, 04 Aug 2018 19:36:40 GMT
adex.js
dmp.theadex.com/d/494/1428/s/
38 KB
14 KB
Script
General
Full URL
https://dmp.theadex.com/d/494/1428/s/adex.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Server
89.163.159.126 Hattersheim, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
f9bdcab450e855bce8221fca51b8e74ee0efefbe9329b2da090a3df6f1e709c8

Request headers

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

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Content-Encoding
gzip
Last-Modified
Thu, 12 Jul 2018 18:20:03 GMT
Server
nginx
ETag
W/"5b479bd3-998f"
Transfer-Encoding
chunked
Content-Type
application/javascript
Cache-Control
max-age=300
Access-Control-Allow-Credentials
true
Connection
keep-alive
Expires
Sat, 04 Aug 2018 18:41:40 GMT
visclass.js
d1pywvbolq0b04.cloudfront.net/iqdvis/golem/
1 KB
832 B
Script
General
Full URL
https://d1pywvbolq0b04.cloudfront.net/iqdvis/golem/visclass.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Server
2600:9000:2047:2400:1c:9fd1:6d00:21 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
aeaf2087d22fbd527fbcab06ff6081c164cc1e41feb7c718c2d9592455b16432

Request headers

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

Response headers

date
Thu, 02 Aug 2018 09:39:22 GMT
content-encoding
gzip
last-modified
Thu, 02 Aug 2018 09:36:01 GMT
x-amz-meta-expires
Sat, 01 Sep 2018 16:00:00 GMT
age
205039
vary
Accept-Encoding
x-cache
Hit from cloudfront
content-type
text/javascript
status
200
x-amz-meta-contenttype
text/javascript
x-amz-cf-id
JM-lyRQ5Q_EXemt4KyN4KVNONsc3MgcsL2TZLOR5MZZGIFhaEbQcvg==
via
1.1 36c13eeffcddf77ad33d7874b28e6168.cloudfront.net (CloudFront)
server
AmazonS3
expires
Sat, 01 Sep 2018 16:00:00 GMT
26033,26034,26035,660053,660071,660107,660089,5108423,464839
ad.yieldlab.net/yp/
154 B
707 B
Script
General
Full URL
https://ad.yieldlab.net/yp/26033,26034,26035,660053,660071,660107,660089,5108423,464839?ts=1533407800351&yl_rtb_pubkey=21719_golem
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Server
2.18.232.233 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-233.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
0bdda96858933db76979b062926fc3adcf1108a88fdec7602567b0b412740bd8

Request headers

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

Response headers

Pragma
no-cache
Date
Sat, 04 Aug 2018 18:36:40 GMT
Content-Encoding
gzip
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa OUR IND COM NAV INT"
Vary
Accept-Encoding
Content-Language
de-DE
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Connection
keep-alive
Content-Type
text/javascript;charset=UTF-8
Content-Length
123
Expires
Fri, 03 Aug 2018 18:36:40 GMT
DroidSans-Bold.woff2
www.golem.de/staticrl/fonts/droidsans/
22 KB
22 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidsans/DroidSans-Bold.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e94712bd5679e91d66469fac2cbf6322a706e4e8f25fe37c762b8167391a7c2c

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-57f4"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22516
Expires
Tue, 04 Sep 2018 18:36:40 GMT
DroidSerif.woff2
www.golem.de/staticrl/fonts/droidserif/
22 KB
22 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidserif/DroidSerif.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
334edfbf00ad918aebbf33d4ea9365ce1f41afc3346c9f2ba7edd127d6b30f6c

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-5870"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22640
Expires
Tue, 04 Sep 2018 18:36:40 GMT
DroidSans.woff2
www.golem.de/staticrl/fonts/droidsans/
21 KB
21 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidsans/DroidSans.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d5ea92e80113829e1cc60cb096ac79b4cf7c30c836991667ca7c6605f181bb13

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-53c8"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
21448
Expires
Tue, 04 Sep 2018 18:36:40 GMT
truncated
/
258 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
4d131d092f6a1d44397026f1bf84f5d43382aaa32db44deb0d9226ed826f27b2

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/svg+xml
truncated
/
325 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
352c699a724df4758e0005476752014202d4156ce13cbf91f9f948f676488088

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/svg+xml
truncated
/
768 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
9655762a829d7bfcb524c4c1ed77ae3a8eca3326fe70411a6c7e333a4b3fcbe5

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/svg+xml
truncated
/
153 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
34815dfa238f8c0e9c2f0c533e27feb0c872d20ee404deb6feb781175c033f31

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/svg+xml
truncated
/
147 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
b526b37334371d31e1d10fbf239d21e98de6d2de57d12f654550ac0a0158c04f

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/svg+xml
truncated
/
126 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
4e8d6e3b35948e5fb1b6d570acce30f0b1560ed00ec1f300793389f19c967dff

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/svg+xml
DroidSerif-Bold.woff2
www.golem.de/staticrl/fonts/droidserif/
26 KB
26 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidserif/DroidSerif-Bold.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e63c19432c52962af286557eff528b01b61c8bf5b7247f00b393c16418f9630a

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-6624"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
26148
Expires
Tue, 04 Sep 2018 18:36:40 GMT
DroidSerif-Italic.woff2
www.golem.de/staticrl/fonts/droidserif/
20 KB
20 KB
Font
General
Full URL
https://www.golem.de/staticrl/fonts/droidserif/DroidSerif-Italic.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
33a615b30f0b0648a299b0d7e7f57e6c5a1b52cfcc831b3572c1f6ff77c1e2b1

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-5074"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
20596
Expires
Tue, 04 Sep 2018 18:36:40 GMT
integrator.js
adservice.google.de/adsid/
109 B
171 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.js?domain=www.golem.de
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
SPDY
Server
2a00:1450:4001:81e::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

timing-allow-origin
*
date
Sat, 04 Aug 2018 18:36:40 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
104
x-xss-protection
1; mode=block
integrator.js
adservice.google.com/adsid/
109 B
171 B
Script
General
Full URL
https://adservice.google.com/adsid/integrator.js?domain=www.golem.de
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
SPDY
Server
2a00:1450:4001:824::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

timing-allow-origin
*
date
Sat, 04 Aug 2018 18:36:40 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
104
x-xss-protection
1; mode=block
pubads_impl_237.js
securepubads.g.doubleclick.net/gpt/
179 KB
62 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
Requested by
Host: www.googletagservices.com
URL: https://www.googletagservices.com/tag/js/gpt.js
Protocol
SPDY
Server
172.217.22.66 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
sffe /
Resource Hash
b0b3c8f57bae0e0f2240b410e306fef853b90d73d16eef0e28d6be3d8810e589
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Sat, 04 Aug 2018 18:36:40 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 01 Aug 2018 13:57:22 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="44,43,39,35"
content-length
63104
x-xss-protection
1; mode=block
expires
Sat, 04 Aug 2018 18:36:40 GMT
918034,918035,918036,918038,918037,918039,918040,5196623,918310
ad.yieldlab.net/yp/
154 B
707 B
Script
General
Full URL
https://ad.yieldlab.net/yp/918034,918035,918036,918038,918037,918039,918040,5196623,918310?ts=1533407800351&yl_rtb_pubkey=781119_golem
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Server
2.18.232.233 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-232-233.deploy.static.akamaitechnologies.com
Software
/
Resource Hash
0bdda96858933db76979b062926fc3adcf1108a88fdec7602567b0b412740bd8

Request headers

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

Response headers

Pragma
no-cache
Date
Sat, 04 Aug 2018 18:36:40 GMT
Content-Encoding
gzip
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa OUR IND COM NAV INT"
Vary
Accept-Encoding
Content-Language
de-DE
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
Connection
keep-alive
Content-Type
text/javascript;charset=UTF-8
Content-Length
123
Expires
Fri, 03 Aug 2018 18:36:40 GMT
id
dpm.demdex.net/
1 KB
1 KB
XHR
General
Full URL
https://dpm.demdex.net/id?d_visid_ver=3.2.0&d_fieldgroup=MC&d_rtbd=json&d_ver=2&d_orgid=41833DF75A550B4B0A495DA6%40AdobeOrg&d_nsid=0&ts=1533407800518
Requested by
Host: assets.adobedtm.com
URL: https://assets.adobedtm.com/launch-EN92e1075482f3410d81944270acba8d90.min.js
Protocol
HTTP/1.1
Server
35.165.133.163 Boardman, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-35-165-133-163.us-west-2.compute.amazonaws.com
Software
/
Resource Hash
6ce443467d94e55a6b2b941a556f75f30145dcf47dfa7f993d38613f365b7c7d

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded

Response headers

DCS
usw2-prod-dcs-ac478d70.edge-usw2.demdex.com 5.35.1.20180801150814 3ms
Pragma
no-cache
Content-Encoding
gzip
X-TID
Vp0RzdH0Qfo=
Vary
Origin, Accept-Encoding, User-Agent
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa PSAa PSDa OUR SAMa BUS PUR COM NAV INT"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache,no-store,must-revalidate,max-age=0,proxy-revalidate,no-transform,private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json;charset=utf-8
Content-Length
537
Expires
Thu, 01 Jan 1970 00:00:00 GMT
yi.js
mb.moatads.com/
2 KB
2 KB
Script
General
Full URL
https://mb.moatads.com/yi.js?ud=false&ue=false&uu=false&qm=0&qn=(%2BIb%7Cj8o%3FJ(jkkeL07ta_*JRM!6t9B%2CN%3Ey)%2ChXbvU37_*NhSfBghz%5D*vOJ%23_%3DNoUA%5DRgBU_Gr1%3E%3AHuFTn%3ADXqJHZ%3BR%23yAb%2Bho8bYLaXBjA%3AmQ)%3CF!tAbjrzJ%3BgoVYGVxc%40lQQV%23tc3%2Fh%7C%3FVKV%3BW5.NO)Wx%7C*E%24%3D!L2ux%7Ci_lOfxECSR23_hFAkD%3Dv%3CN%5B.%22%24b_o%3FtVD%5D%5BpN%7CQF%40Sy7%7BA&qp=00000&qq=000000000000&qr=0&is=voqBBkBBBBHhBBBBBZkJjBRCqUCY3CTCB6BXwUcu8gKCBS9lYBBBCCBpYFmR4BOZBBgSJTcBBBBBBBBHUoKOFCyz7BB3CZ6mv5TimBBe9oeCt9lXqBvBCfBBBBBBBBBBBBBBCBMBaBeBBkKzQClBeaKaMVMBj5iMPzyHVY9zqxknZlysGxCBcBBBC9CctORpnICyRBBB4OBBBBBBBBBBC9TiFF3dOKBCBBxBBBBBBBfBz1BD7fB3BpkBJUDyDCS6IDDDCCCCDDCCCCCCCBdh2eBBBGI79kNB8DJoDBBBBCiBBiB&iv=6&gz=0&hh=0&hn=0&qt=0&tw=null&url=https%3A%2F%2Fwww.golem.de%2F&confidence=2&pcode=iqdigitaldfpprebidheader645711382528&callback=MoatNadoAllJsonpRequest_27277248
Requested by
Host: z.moatads.com
URL: https://z.moatads.com/iqdigitaldfpprebidheader645711382528/yield.js
Protocol
HTTP/1.1
Server
52.56.240.94 London, United Kingdom, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-56-240-94.eu-west-2.compute.amazonaws.com
Software
nginx/1.7.9 /
Resource Hash
984d6c047a051a122d2ad6f9a807c98ff8347921b053ab2062f2d56aba372ff8

Request headers

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

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Server
nginx/1.7.9
Etag
"a5f2504aa273e5e65c5ec94e70ce6ed76be72c55"
Content-Type
text/html; charset=UTF-8
Cache-Control
max-age=900
Connection
keep-alive
Timing-Allow-Origin
*
Content-Length
1639
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=17&t=1533407800532&de=250316664204&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatRendered=0&zMoatSlotTargetingLoaded=0&zMoatSlotTargetingSet=0&zMoatPageDataTargetingSet=0&zMoatSafetyTargetingSet=0&zMoatEmptySlot=0&zMoatNadoDataLoadTime=Not%20Loaded&zMoatAllDataLoadTime=Not%20Loaded&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&na=398424009&cs=0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

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

Response headers

Pragma
no-cache
Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Sat, 04 Aug 2018 18:36:40 GMT
jpt
ib.adnxs.com/
0
663 B
Script
General
Full URL
https://ib.adnxs.com/jpt?callback=pbjs.handleAnCB&callback_uid=25776ec2ae4177&psa=0&member=6975&code=golem-homepage-iqadtile1&size=728x90&referrer=https%3A%2F%2Fwww.golem.de%2F
Requested by
Host: dx6ctphzljkf1.cloudfront.net
URL: https://dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/prebid15122017.js
Protocol
HTTP/1.1
Server
185.33.223.216 , European Union, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
Software
nginx/1.13.4 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Xss-Protection 0

Request headers

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

Response headers

Pragma
no-cache
Date
Sat, 04 Aug 2018 18:36:42 GMT
X-Proxy-Origin
148.251.45.254; 148.251.45.254; 312.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.72:80
AN-X-Request-Uuid
36733cf1-f79a-4217-985d-4068264bb36b
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
text/html; charset=utf-8
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
jpt
ib.adnxs.com/
0
663 B
Script
General
Full URL
https://ib.adnxs.com/jpt?callback=pbjs.handleAnCB&callback_uid=3631350dd86457&psa=0&member=6975&code=golem-homepage-iqadtile16&size=1000x333&promo_sizes=1000x167,1000x125,1000x100,970x250,800x250,970x90,728x90,660x250&referrer=https%3A%2F%2Fwww.golem.de%2F
Requested by
Host: dx6ctphzljkf1.cloudfront.net
URL: https://dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/prebid15122017.js
Protocol
HTTP/1.1
Server
185.33.223.216 , European Union, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
Software
nginx/1.13.4 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Xss-Protection 0

Request headers

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

Response headers

Pragma
no-cache
Date
Sat, 04 Aug 2018 18:36:42 GMT
X-Proxy-Origin
148.251.45.254; 148.251.45.254; 312.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.45:80
AN-X-Request-Uuid
a1d31f5b-53b6-41b3-9918-3bac4a6fa04c
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
text/html; charset=utf-8
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
jpt
ib.adnxs.com/
0
663 B
Script
General
Full URL
https://ib.adnxs.com/jpt?callback=pbjs.handleAnCB&callback_uid=43077ac32eb451&psa=0&member=6975&code=golem-homepage-iqadtile3&size=1000x333&promo_sizes=1000x250,1000x100,970x90,940x250,970x250,800x250&referrer=https%3A%2F%2Fwww.golem.de%2F
Requested by
Host: dx6ctphzljkf1.cloudfront.net
URL: https://dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/prebid15122017.js
Protocol
HTTP/1.1
Server
185.33.223.216 , European Union, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
Software
nginx/1.13.4 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Xss-Protection 0

Request headers

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

Response headers

Pragma
no-cache
Date
Sat, 04 Aug 2018 18:36:42 GMT
X-Proxy-Origin
148.251.45.254; 148.251.45.254; 312.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.47:80
AN-X-Request-Uuid
76828dd5-966d-47b6-8b46-d636b487b16b
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
text/html; charset=utf-8
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
jpt
ib.adnxs.com/
0
663 B
Script
General
Full URL
https://ib.adnxs.com/jpt?callback=pbjs.handleAnCB&callback_uid=565f21f14be5d1&psa=0&member=6975&code=golem-homepage-iqadtile4&size=1000x500&promo_sizes=1000x333,1000x250,1000x167,1000x125,1000x100,970x90,800x250,970x250,970x90,800x250&referrer=https%3A%2F%2Fwww.golem.de%2F
Requested by
Host: dx6ctphzljkf1.cloudfront.net
URL: https://dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/prebid15122017.js
Protocol
HTTP/1.1
Server
185.33.223.216 , European Union, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
Software
nginx/1.13.4 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Xss-Protection 0

Request headers

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

Response headers

Pragma
no-cache
Date
Sat, 04 Aug 2018 18:36:42 GMT
X-Proxy-Origin
148.251.45.254; 148.251.45.254; 312.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.45:80
AN-X-Request-Uuid
091bd672-8840-4f34-b65f-8d41f873691b
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
text/html; charset=utf-8
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
jpt
ib.adnxs.com/
0
663 B
Script
General
Full URL
https://ib.adnxs.com/jpt?callback=pbjs.handleAnCB&callback_uid=6c5ca7b612c85&psa=0&member=6975&code=golem-homepage-iqadtile5&size=1000x500&promo_sizes=1000x333,1000x250,1000x167,1000x125,1000x100,970x90,800x250,970x250,970x90,800x250&referrer=https%3A%2F%2Fwww.golem.de%2F
Requested by
Host: dx6ctphzljkf1.cloudfront.net
URL: https://dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/prebid15122017.js
Protocol
HTTP/1.1
Server
185.33.223.216 , European Union, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
Software
nginx/1.13.4 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Xss-Protection 0

Request headers

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

Response headers

Pragma
no-cache
Date
Sat, 04 Aug 2018 18:36:42 GMT
X-Proxy-Origin
148.251.45.254; 148.251.45.254; 312.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.72:80
AN-X-Request-Uuid
0c861712-b219-4141-8dd1-736d2117378b
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
text/html; charset=utf-8
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
jpt
ib.adnxs.com/
0
663 B
Script
General
Full URL
https://ib.adnxs.com/jpt?callback=pbjs.handleAnCB&callback_uid=771aa09e3cac05&psa=0&member=6975&code=golem-homepage-iqadtile8&size=300x300&promo_sizes=300x600,300x250&referrer=https%3A%2F%2Fwww.golem.de%2F
Requested by
Host: dx6ctphzljkf1.cloudfront.net
URL: https://dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/prebid15122017.js
Protocol
HTTP/1.1
Server
185.33.223.216 , European Union, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
Software
nginx/1.13.4 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Xss-Protection 0

Request headers

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

Response headers

Pragma
no-cache
Date
Sat, 04 Aug 2018 18:36:42 GMT
X-Proxy-Origin
148.251.45.254; 148.251.45.254; 312.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.223.85:80
AN-X-Request-Uuid
fed49b38-d624-4008-9745-919a781c9067
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
text/html; charset=utf-8
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
jpt
ib.adnxs.com/
0
663 B
Script
General
Full URL
https://ib.adnxs.com/jpt?callback=pbjs.handleAnCB&callback_uid=8046c139822d14&psa=0&member=6975&code=golem-homepage-iqadtile9&size=300x300&promo_sizes=300x600,300x250&referrer=https%3A%2F%2Fwww.golem.de%2F
Requested by
Host: dx6ctphzljkf1.cloudfront.net
URL: https://dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/prebid15122017.js
Protocol
HTTP/1.1
Server
185.33.223.216 , European Union, ASN29990 (ASN-APPNEXUS - AppNexus, Inc, US),
Reverse DNS
Software
nginx/1.13.4 /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Xss-Protection 0

Request headers

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

Response headers

Pragma
no-cache
Date
Sat, 04 Aug 2018 18:36:42 GMT
X-Proxy-Origin
148.251.45.254; 148.251.45.254; 312.bm-nginx-loadbalancer.mgmt.ams1; *.adnxs.com; 185.33.220.52:80
AN-X-Request-Uuid
65ff6ea5-28c8-471b-a085-370edf67aa16
Server
nginx/1.13.4
P3P
policyref="http://cdn.adnxs.com/w3c/policy/p3p.xml", CP="NOI DSP COR ADM PSAo PSDo OURo SAMo UNRo OTRo BUS COM NAV DEM STA PRE"
Access-Control-Allow-Origin
*
Cache-Control
no-store, no-cache, private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
text/html; charset=utf-8
Content-Length
0
X-XSS-Protection
0
Expires
Sat, 15 Nov 2008 16:00:00 GMT
publishertag.js
static.criteo.net/js/ld/
76 KB
23 KB
Script
General
Full URL
https://static.criteo.net/js/ld/publishertag.js
Requested by
Host: dx6ctphzljkf1.cloudfront.net
URL: https://dx6ctphzljkf1.cloudfront.net/iqdcdnes/prebid/prebid15122017.js
Protocol
HTTP/1.1
Server
178.250.2.130 , France, ASN44788 (ASN-CRITEO-EUROPE, FR),
Reverse DNS
Software
nginx /
Resource Hash
d0022240da09ad3c144bc9e93f1834a7ddbf085af4772bcfe831483aef5b4a6d

Request headers

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

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Content-Encoding
gzip
Last-Modified
Wed, 19 Sep 2007 08:50:25 GMT
Server
nginx
ETag
W/"5b509c3d-131c1"
Transfer-Encoding
chunked
Content-Type
text/javascript
Access-Control-Allow-Origin
*
Cache-Control
max-age=86400, public
Connection
keep-alive
Timing-Allow-Origin
*
Expires
Sun, 05 Aug 2018 18:36:40 GMT
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=0&t=1533407800532&de=250316664204&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatRendered=0&zMoatSlotTargetingLoaded=0&zMoatSlotTargetingSet=0&zMoatPageDataTargetingSet=0&zMoatSafetyTargetingSet=0&zMoatEmptySlot=0&zMoatNadoDataLoadTime=Not%20Loaded&zMoatAllDataLoadTime=Not%20Loaded&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=0&zMoat_YI1=0&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=1424699895&cs=0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

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

Response headers

Pragma
no-cache
Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Sat, 04 Aug 2018 18:36:40 GMT
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/
74 KB
27 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Server
2a00:1450:4001:81f::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
dc4ebc15ba0d09ed863adb0bddf3f578bc5365aaaed89d20f879ac56bee92508
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Sat, 04 Aug 2018 18:36:40 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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
27678
x-xss-protection
1; mode=block
server
cafe
etag
2274637023386634109
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Sat, 04 Aug 2018 18:36:40 GMT
golem_csi-114-min.js
www.golem.de/staticrl/scripts/adsense/
3 KB
2 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/adsense/golem_csi-114-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
841aa5512f19637e5282324602a3c50df33b534efacff2591a8f3e2a5b338482

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Content-Encoding
gzip
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
W/"5b0d91ca-b18"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Tue, 04 Sep 2018 18:36:40 GMT
gx-ads.js
ads.golem.de/track.ads/
124 B
492 B
Script
General
Full URL
https://ads.golem.de/track.ads/gx-ads.js?ord=7232792311790437&adsize=300x250&adunit=11
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:17a , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
54a5c9011a4eec01cb0af8620d0ce3dd3bba04b167b7f674b074428eeb06e020

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
ads.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Tue, 12 Jan 2016 21:49:10 GMT
Server
nginx
ETag
"569574d6-7c"
Content-Type
application/javascript
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
124
Expires
Tue, 04 Sep 2018 18:36:40 GMT
btn-follow-sp4.png
www.golem.de/staticrl/images/
4 KB
4 KB
Image
General
Full URL
https://www.golem.de/staticrl/images/btn-follow-sp4.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a62f5daff85d4695d52eb94efef62aea68deb1eb2baaa3c6463d6f95dadbb240

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/staticrl/styles/golem_main_114-min.css
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/staticrl/styles/golem_main_114-min.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-fb2"
Content-Type
image/png
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
4018
Expires
Tue, 04 Sep 2018 18:36:40 GMT
tx.io
de.ioam.de/
Redirect Chain
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0012&i2=0012374d13b51c4225b65f238&ep=1558392831&vr=409&id=s9k4qs&lt=1533...
  • https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0012&i2=0012374d13b51c4225b65f238&ep=1558392831&vr=409&id=s9k4qs&lt=1533...
0
694 B
Script
General
Full URL
https://de.ioam.de/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0012&i2=0012374d13b51c4225b65f238&ep=1558392831&vr=409&id=s9k4qs&lt=1533407800676&ev=&cs=1jejua&mo=1&sr=71
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Server
91.215.100.40 , Germany, ASN43407 (INFONLINE-AS, NL),
Reverse DNS
de4.ioam.de
Software
nginx / BLACKBIRD-RCV v1.04.6 0023
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Server
nginx
X-Powered-By
BLACKBIRD-RCV v1.04.6 0023
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
Sat, 04 Aug 2018 18:36:40 GMT
Access-Control-Allow-Origin
*
X-Powered-By
BLACKBIRD-RCV v1.04.6 0023
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
Sat, 04 Aug 2018 18:36:40 GMT
Server
nginx
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
text/html
Location
/tx.io?st=golem&cp=GHOME&sv=ke&pt=CP&ps=lin&er=N22&rf=&r2=&ur=www.golem.de&xy=1600x1200x24&lo=DE%2Fn.a.&cb=0012&i2=0012374d13b51c4225b65f238&ep=1558392831&vr=409&id=s9k4qs&lt=1533407800676&ev=&cs=1jejua&mo=1&sr=71
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
Fri, 04 Aug 2017 18:36:40 GMT
ga.js
www.google-analytics.com/
45 KB
17 KB
Script
General
Full URL
https://www.google-analytics.com/ga.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Server
2a00:1450:4001:81c::200e , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
1259ea99bd76596239bfd3102c679eb0a5052578dc526b0452f4d42f8bcdd45f
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

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

Response headers

strict-transport-security
max-age=10886400; includeSubDomains; preload
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Fri, 18 May 2018 01:10:24 GMT
server
Golfe2
age
2522
date
Sat, 04 Aug 2018 17:54:38 GMT
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
public, max-age=7200
timing-allow-origin
*
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
17168
expires
Sat, 04 Aug 2018 19:54:38 GMT
swiper-4.2.2.custom.min.js
www.golem.de/staticrl/scripts/external/
69 KB
23 KB
XHR
General
Full URL
https://www.golem.de/staticrl/scripts/external/swiper-4.2.2.custom.min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e3e6c93defad2cf35199cb4a925b7ddd47efa939786ca22038d4d3b5ef4ea14c

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Accept
text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Content-Encoding
gzip
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
W/"5b0d91ca-113e8"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Tue, 04 Sep 2018 18:36:40 GMT
golem_cpxl_113-min.js
www.golem.de/staticrl/scripts/
8 KB
4 KB
Script
General
Full URL
https://www.golem.de/staticrl/scripts/golem_cpxl_113-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
42bb877744c06037d98b964f68c3e5d4794968c0915fef531db5137a39b3b0c5

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Content-Encoding
gzip
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
W/"5b0d91ca-1e61"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Tue, 04 Sep 2018 18:36:40 GMT
nms.jpg
video.golem.de/teaser/1/1/21537/thumb-high-1000/
134 KB
134 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/21537/thumb-high-1000/nms.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
23faf11c5252eff54a4691b009ccb47879962ffdae366328496c282d2366915d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Wed, 01 Aug 2018 08:28:03 GMT
Server
nginx
ETag
"5b616f13-2173c"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
137020
Expires
Tue, 04 Sep 2018 18:36:40 GMT
pgi-snap.jpg
video.golem.de/teaser/1/1/21535/thumb-high-1000/
172 KB
173 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/21535/thumb-high-1000/pgi-snap.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
f5fb8f9665297597414c1d5fb85126edf1667aa7d603bd6756d7d54b582d7ef9

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Tue, 31 Jul 2018 08:53:37 GMT
Server
nginx
ETag
"5b602391-2b10d"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
176397
Expires
Tue, 04 Sep 2018 18:36:40 GMT
screenshot2018-08-02at09.41.19.jpg
video.golem.de/teaser/1/1/21548/thumb-high-1000/
61 KB
62 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/21548/thumb-high-1000/screenshot2018-08-02at09.41.19.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5f5016d4491699bfccc0ae0906b21a4b7c427f58ae24265e46cb6aecfc4612ca

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Thu, 02 Aug 2018 07:42:32 GMT
Server
nginx
ETag
"5b62b5e8-f5d8"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
62936
Expires
Tue, 04 Sep 2018 18:36:40 GMT
gran-turismo-sport-juli-update-trailer.jpg
video.golem.de/teaser/1/1/21547/thumb-high-1000/
102 KB
102 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/21547/thumb-high-1000/gran-turismo-sport-juli-update-trailer.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ca45c62be33cfe9a0a2f13b2d136f1df1cb7215691403038825639da75afbf3f

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Thu, 02 Aug 2018 07:31:32 GMT
Server
nginx
ETag
"5b62b354-1981c"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
104476
Expires
Tue, 04 Sep 2018 18:36:40 GMT
matebookprox-snap.jpg
video.golem.de/teaser/1/1/21518/thumb-high-1000/
98 KB
98 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/21518/thumb-high-1000/matebookprox-snap.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ee52a10d40743de74b0423fe5545236523d63452b157deea7c6cdfa27385a336

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Tue, 31 Jul 2018 12:33:15 GMT
Server
nginx
ETag
"5b60570b-186ad"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
100013
Expires
Tue, 04 Sep 2018 18:36:40 GMT
1533308152_hqdefault.jpg
video.golem.de/teaser/1/1/21555/thumb-high-1000/
16 KB
17 KB
Image
General
Full URL
https://video.golem.de/teaser/1/1/21555/thumb-high-1000/1533308152_hqdefault.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
14aa86542caf98951b0a6e5cdcefee98efe6c7c167fb1d0c5f1c38ba90d16b42

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Fri, 03 Aug 2018 14:55:49 GMT
Server
nginx
ETag
"5b646cf5-415f"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
16735
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135822-170262-170259_rc.jpg
www.golem.de/1808/
11 KB
12 KB
Image
General
Full URL
https://www.golem.de/1808/135822-170262-170259_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
f88e118eda8f80290c8a8c66e75ba47e9b96188892b054e44ceb50c6a08537c1

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Fri, 03 Aug 2018 09:29:06 GMT
Server
nginx
ETag
"5b642062-2db3"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
11699
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135820-170250-170247_rc.jpg
www.golem.de/1808/
7 KB
7 KB
Image
General
Full URL
https://www.golem.de/1808/135820-170250-170247_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
fe8d5bc5ff7f1e75941480d428134e3acd978c865accb77d110cc55e3b120d4d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Fri, 03 Aug 2018 08:30:08 GMT
Server
nginx
ETag
"5b641290-1a3b"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6715
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135746-170221-170218_rc.jpg
www.golem.de/1808/
5 KB
5 KB
Image
General
Full URL
https://www.golem.de/1808/135746-170221-170218_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
9cb0d8ca23e85c573020bb10fd0c1dc4dd49ef1cc52dba24a386b90dfa03f242

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Fri, 03 Aug 2018 10:04:06 GMT
Server
nginx
ETag
"5b642896-1295"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
4757
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135834-170313-170309_rc.jpg
www.golem.de/1808/
10 KB
10 KB
Image
General
Full URL
https://www.golem.de/1808/135834-170313-170309_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5a9398a248087d6325690b856480f340f7d32645f436a794a730e9c801543e24

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Sat, 04 Aug 2018 11:47:05 GMT
Server
nginx
ETag
"5b659239-2843"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
10307
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135817-170242-170237_rc.jpg
www.golem.de/1808/
2 KB
3 KB
Image
General
Full URL
https://www.golem.de/1808/135817-170242-170237_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
71615fc82cdbb28aa6e3b296cc214a504e6139a3b7b441878bdf0c499cbf1529

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Fri, 03 Aug 2018 05:11:05 GMT
Server
nginx
ETag
"5b63e3e9-9c5"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
2501
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135453-168708-168705_rc.jpg
www.golem.de/1807/
106 KB
106 KB
Image
General
Full URL
https://www.golem.de/1807/135453-168708-168705_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
c60846aed56a26eafbf8d3f328d625369a1a203bf94668e35d24fc1d1968069f

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Thu, 19 Jul 2018 10:07:06 GMT
Server
nginx
ETag
"5b5062ca-1a68d"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
108173
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135306-167826-167818_rc.jpg
www.golem.de/1807/
192 KB
192 KB
Image
General
Full URL
https://www.golem.de/1807/135306-167826-167818_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
7029e5ae6be4b0c21655d2269a96f553c8721c4012ab8fee483acf10e50e603f

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Mon, 23 Jul 2018 10:04:09 GMT
Server
nginx
ETag
"5b55a819-2ff97"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
196503
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135801-170158-170155_rc.jpg
www.golem.de/1808/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1808/135801-170158-170155_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1a5d7b696ec9b6bd762889b3fa0328e5fc6affd8882a934228d8fa56fdfb5185

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Thu, 02 Aug 2018 08:34:07 GMT
Server
nginx
ETag
"5b62c1ff-1f08"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7944
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135828-170296-170295_rc.jpg
www.golem.de/1808/
7 KB
8 KB
Image
General
Full URL
https://www.golem.de/1808/135828-170296-170295_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
100e170273ad8c9607749895a8769d960f7cdda4f8907ef0386e5fc2756a4081

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Fri, 03 Aug 2018 15:17:06 GMT
Server
nginx
ETag
"5b6471f2-1cc6"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7366
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135827-170284-170283_rc.jpg
www.golem.de/1808/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1808/135827-170284-170283_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
fcca3b2893a95fe263221d949f650ebbae88f3465c4ec87e17900ea6df0d58f3

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Fri, 03 Aug 2018 11:23:05 GMT
Server
nginx
ETag
"5b643b19-1853"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6227
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135826-170282-170279_rc.jpg
www.golem.de/1808/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1808/135826-170282-170279_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a5af499ea50451b9b3cf1a8a315a7123737ca8763742c2797175234c6aba5cfd

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Fri, 03 Aug 2018 10:46:07 GMT
Server
nginx
ETag
"5b64326f-230c"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8972
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135824-170278-170277_rc.jpg
www.golem.de/1808/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1808/135824-170278-170277_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
01ac0b96663800a7bdc3b993afacce59001fd838ef971566fd795a06009eaa8f

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Fri, 03 Aug 2018 10:03:07 GMT
Server
nginx
ETag
"5b64285b-1f9b"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8091
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135825-170276-170273_rc.jpg
www.golem.de/1808/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1808/135825-170276-170273_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
237e4b6c429f6541b6a99c0e2d9181a15cec70caf07d79f3ac3722a7ace1caa2

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Fri, 03 Aug 2018 09:53:07 GMT
Server
nginx
ETag
"5b642603-1676"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5750
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135823-170266-170263_rc.jpg
www.golem.de/1808/
9 KB
9 KB
Image
General
Full URL
https://www.golem.de/1808/135823-170266-170263_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
2127e9cb02c99bec78195c5cd25cc9759d50a1018d982604b137b3cba56a36b8

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Fri, 03 Aug 2018 09:47:07 GMT
Server
nginx
ETag
"5b64249b-2481"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9345
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135821-170258-170255_rc.jpg
www.golem.de/1808/
6 KB
6 KB
Image
General
Full URL
https://www.golem.de/1808/135821-170258-170255_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b38b0e3eff73eeb3a5a6280427497a4356db8e352facac5e6ec48f96dddb6598

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Fri, 03 Aug 2018 09:12:08 GMT
Server
nginx
ETag
"5b641c68-163e"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
5694
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135819-170254-170251_rc.jpg
www.golem.de/1808/
7 KB
8 KB
Image
General
Full URL
https://www.golem.de/1808/135819-170254-170251_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
b86dbaf33aed868e17e2be26b2b79b3f608227993089419ec4c298e57544b17f

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Fri, 03 Aug 2018 08:45:07 GMT
Server
nginx
ETag
"5b641613-1da4"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7588
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135796-170138-170135_rc.jpg
www.golem.de/1808/
10 KB
10 KB
Image
General
Full URL
https://www.golem.de/1808/135796-170138-170135_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
cb16ea669bb13941fc86a8c6d8e8318154b531c3e81f8161c2958dfbeeeca26e

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Thu, 02 Aug 2018 14:20:07 GMT
Server
nginx
ETag
"5b631317-26e1"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9953
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135818-170246-170243_rc.jpg
www.golem.de/1808/
6 KB
7 KB
Image
General
Full URL
https://www.golem.de/1808/135818-170246-170243_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
1883a7179fb0b411b16737f59f9b99ee2ef51c102731ea55217a838430b430c4

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Fri, 03 Aug 2018 08:19:05 GMT
Server
nginx
ETag
"5b640ff9-1988"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6536
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135624-169860-169854_rc.jpg
www.golem.de/1808/
7 KB
8 KB
Image
General
Full URL
https://www.golem.de/1808/135624-169860-169854_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
70df84d6d9c505a4a0e012fcca28acb82d7f74b5939a433e3b789623740f3410

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:41 GMT
Last-Modified
Wed, 01 Aug 2018 10:04:08 GMT
Server
nginx
ETag
"5b618598-1cd6"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7382
Expires
Tue, 04 Sep 2018 18:36:41 GMT
135816-170236-170233_rc.jpg
www.golem.de/1808/
4 KB
4 KB
Image
General
Full URL
https://www.golem.de/1808/135816-170236-170233_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
be349e4a81c1b5b8a11915a8537a9b73e24d8a583a60e02cf5681cdddcacb67a

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Fri, 03 Aug 2018 05:31:05 GMT
Server
nginx
ETag
"5b63e899-eed"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
3821
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135689-169812-169809_rc.jpg
www.golem.de/1808/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1808/135689-169812-169809_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e968b471fa7b2768c0e4b827d941766b635115a3b610cce0fdb1d098ba6e8e66

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Thu, 02 Aug 2018 10:00:13 GMT
Server
nginx
ETag
"5b62d62d-1e2e"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
7726
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135815-170217-170216_rc.jpg
www.golem.de/1808/
8 KB
8 KB
Image
General
Full URL
https://www.golem.de/1808/135815-170217-170216_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
6ce9b19b20765d6af57db7cbfd3b1948c96affe4a54866b6832283cb180ffef2

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Thu, 02 Aug 2018 14:45:05 GMT
Server
nginx
ETag
"5b6318f1-208a"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8330
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135795-170143-170140_rc.jpg
www.golem.de/1808/
9 KB
10 KB
Image
General
Full URL
https://www.golem.de/1808/135795-170143-170140_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
068d9a40a218198cbda9912d38b759e1cf2f1713984d654856519ab451b98089

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Thu, 02 Aug 2018 07:00:08 GMT
Server
nginx
ETag
"5b62abf8-254a"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
9546
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135812-170204-170203_rc.jpg
www.golem.de/1808/
4 KB
5 KB
Image
General
Full URL
https://www.golem.de/1808/135812-170204-170203_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
24489edaab8622c869b52085b7d0a9c8dcd4108951be7c4c655af011ba2ff85e

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Thu, 02 Aug 2018 14:00:08 GMT
Server
nginx
ETag
"5b630e68-11fc"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
4604
Expires
Tue, 04 Sep 2018 18:36:40 GMT
135503-168959-168958_rc.jpg
www.golem.de/1808/
6 KB
7 KB
Image
General
Full URL
https://www.golem.de/1808/135503-168959-168958_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
c5302497f6664f4f5e3aa7541aebf2f49b9f4d2a52ae4e2cc5d130ed84c2a468

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Wed, 01 Aug 2018 07:00:06 GMT
Server
nginx
ETag
"5b615a76-19a3"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
6563
Expires
Tue, 04 Sep 2018 18:36:40 GMT
sp_135521-168907-168905_rc.jpg
www.golem.de/1807/
17 KB
18 KB
Image
General
Full URL
https://www.golem.de/1807/sp_135521-168907-168905_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
098d6450c44fcac4f25e3dfc639711a12d80f5d7ee6d262f4b475eb0693b4ddd

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Wed, 18 Jul 2018 07:01:07 GMT
Server
nginx
ETag
"5b4ee5b3-451f"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
17695
Expires
Tue, 04 Sep 2018 18:36:40 GMT
sp_135477-168702-168700_rc.jpg
www.golem.de/1807/
20 KB
20 KB
Image
General
Full URL
https://www.golem.de/1807/sp_135477-168702-168700_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
4163d60123d5517bc229ba591dcf009f18842d219847455e9ab154ed6751fd5e

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Sun, 15 Jul 2018 12:15:07 GMT
Server
nginx
ETag
"5b4b3acb-4fdf"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
20447
Expires
Tue, 04 Sep 2018 18:36:40 GMT
sp_135361-168120-168118_rc.jpg
www.golem.de/1807/
22 KB
22 KB
Image
General
Full URL
https://www.golem.de/1807/sp_135361-168120-168118_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e3164f36e9232deb3418aa5597704cece8e3a5f29d47e32434e4e244eac69bc6

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Wed, 11 Jul 2018 09:59:06 GMT
Server
nginx
ETag
"5b45d4ea-56e3"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22243
Expires
Tue, 04 Sep 2018 18:36:40 GMT
sp_135357-168175-168173_rc.jpg
www.golem.de/1807/
20 KB
20 KB
Image
General
Full URL
https://www.golem.de/1807/sp_135357-168175-168173_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a9c3dccc596ea428ef624a1e0d182aeaba5d31ebd85555c055725c475ac79180

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Mon, 09 Jul 2018 10:09:08 GMT
Server
nginx
ETag
"5b433444-4eec"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
20204
Expires
Tue, 04 Sep 2018 18:36:40 GMT
sp_135507-168846-168844_rc.jpg
www.golem.de/1807/
15 KB
16 KB
Image
General
Full URL
https://www.golem.de/1807/sp_135507-168846-168844_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a09039b257b8f42b4eb51b238e69cafb461843c2d9a983e9fe38a223157de92e

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Tue, 17 Jul 2018 10:06:08 GMT
Server
nginx
ETag
"5b4dbf90-3dcf"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
15823
Expires
Tue, 04 Sep 2018 18:36:40 GMT
sp_135323-168129-168127_rc.jpg
www.golem.de/1807/
28 KB
28 KB
Image
General
Full URL
https://www.golem.de/1807/sp_135323-168129-168127_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
f6909127fd4c3efa17cc2c29ad497ca29a8522dd0009cca8d0d6cd508c75ee54

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Mon, 16 Jul 2018 07:39:08 GMT
Server
nginx
ETag
"5b4c4b9c-6f71"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
28529
Expires
Tue, 04 Sep 2018 18:36:40 GMT
sp_135162-168425-168423_rc.jpg
www.golem.de/1807/
28 KB
28 KB
Image
General
Full URL
https://www.golem.de/1807/sp_135162-168425-168423_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
4498c3ecab477e09bdc4e8b1a6aeca352448cbd50b3db9bedc23d655aad906b3

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Thu, 12 Jul 2018 10:03:07 GMT
Server
nginx
ETag
"5b47275b-6ee5"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
28389
Expires
Tue, 04 Sep 2018 18:36:40 GMT
sp_135324-168080-168078_rc.jpg
www.golem.de/1807/
13 KB
14 KB
Image
General
Full URL
https://www.golem.de/1807/sp_135324-168080-168078_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d811dc88d585ffb20a2d37cd6dbe20e3f62025359c59bed17e3a865d33fe98b6

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Wed, 11 Jul 2018 07:00:11 GMT
Server
nginx
ETag
"5b45aafb-34e5"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
13541
Expires
Tue, 04 Sep 2018 18:36:40 GMT
sp_135452-168571-168568_rc.jpg
www.golem.de/1807/
22 KB
22 KB
Image
General
Full URL
https://www.golem.de/1807/sp_135452-168571-168568_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
fb5fde7ad48f0e3be65777054634282f3bb40f1ab4b228194465ab30f590af6e

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Thu, 12 Jul 2018 14:51:06 GMT
Server
nginx
ETag
"5b476ada-5657"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22103
Expires
Tue, 04 Sep 2018 18:36:40 GMT
sp_135383-168222-168220_rc.jpg
www.golem.de/1807/
24 KB
24 KB
Image
General
Full URL
https://www.golem.de/1807/sp_135383-168222-168220_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
83b8cb33a2dc75c2e9f36d30a83096d1b01fbfd72d9abd18b1d7c23b5afda507

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Thu, 12 Jul 2018 08:14:05 GMT
Server
nginx
ETag
"5b470dcd-6034"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
24628
Expires
Tue, 04 Sep 2018 18:36:40 GMT
sp_135356-168106-168104_rc.jpg
www.golem.de/1807/
17 KB
18 KB
Image
General
Full URL
https://www.golem.de/1807/sp_135356-168106-168104_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
c96cce85dd167f83c9f83421911804fe0e6779dd5f2e916d57ed16f12dfca6c4

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Fri, 13 Jul 2018 07:10:05 GMT
Server
nginx
ETag
"5b48504d-44ed"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
17645
Expires
Tue, 04 Sep 2018 18:36:40 GMT
sp_135154-168268-168266_rc.jpg
www.golem.de/1807/
23 KB
24 KB
Image
General
Full URL
https://www.golem.de/1807/sp_135154-168268-168266_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e2d8cbfea0973cd587c24331f4e4a3860f3304dbe615387546e6d6d18bc13fce

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Tue, 10 Jul 2018 07:19:08 GMT
Server
nginx
ETag
"5b445dec-5cb1"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
23729
Expires
Tue, 04 Sep 2018 18:36:40 GMT
sp_135180-167241-167239_rc.jpg
www.golem.de/1807/
13 KB
13 KB
Image
General
Full URL
https://www.golem.de/1807/sp_135180-167241-167239_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
0151c5c63c1b0c1fd982c15b016482e8c06045b37de25a0df79fb36808f17a5b

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Tue, 10 Jul 2018 10:04:09 GMT
Server
nginx
ETag
"5b448499-3444"
Content-Type
image/jpeg
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
13380
Expires
Tue, 04 Sep 2018 18:36:40 GMT
sp_135214-167428-167426_rc.jpg
www.golem.de/1807/
18 KB
19 KB
Image
General
Full URL
https://www.golem.de/1807/sp_135214-167428-167426_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
8bc02857898a0eb9d2d93d339c917f081a5cd1d509736b41cbc506791e080612

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Tue, 03 Jul 2018 10:00:13 GMT
Server
nginx
ETag
"5b3b492d-4953"
Content-Type
image/jpeg
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
18771
Expires
Tue, 04 Sep 2018 18:36:40 GMT
sp_135331-167979-167977_rc.jpg
www.golem.de/1807/
23 KB
23 KB
Image
General
Full URL
https://www.golem.de/1807/sp_135331-167979-167977_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d26219502db4341b143487b9d86a786920a11c69c3bab275d4ecbbbb41c40361

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Thu, 05 Jul 2018 12:32:08 GMT
Server
nginx
ETag
"5b3e0fc8-5b8e"
Content-Type
image/jpeg
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
23438
Expires
Tue, 04 Sep 2018 18:36:40 GMT
cpx.php
cpx.golem.de/
42 B
420 B
Image
General
Full URL
https://cpx.golem.de/cpx.php?class=0&ts=1533407801&ref=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:182 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
Apache /
Resource Hash
b2c78c910f5ea29e3a9d223dabc203c055c8708b1fe7d83788b490638126db4d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
cpx.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Sat, 04 Aug 2018 18:36:40 GMT
Server
Apache
P3P
CP="NOI NID ADMa OUR IND UNI COM NAV"
Cache-Control
no-store, no-cache, must-revalidate post-check=0, pre-check=0
Connection
close
Content-Type
image/gif
Content-Length
42
Expires
Sat, 10 Oct 2000 03:33:33 GMT
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=44&t=1533407800532&de=250316664204&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatRendered=0&zMoatSlotTargetingLoaded=0&zMoatSlotTargetingSet=0&zMoatPageDataTargetingSet=0&zMoatSafetyTargetingSet=0&zMoatEmptySlot=0&zMoatNadoDataLoadTime=189&zMoatAllDataLoadTime=189&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=189&zMoat_YI3=189&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=1195580031&cs=0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

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

Response headers

Pragma
no-cache
Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Sat, 04 Aug 2018 18:36:40 GMT
cdb
bidder.criteo.com/
0
186 B
XHR
General
Full URL
https://bidder.criteo.com/cdb?ptv=54&profileId=125&av=1&cb=91398508823
Requested by
Host: static.criteo.net
URL: https://static.criteo.net/js/ld/publishertag.js
Protocol
HTTP/1.1
Server
178.250.2.89 , France, ASN44788 (ASN-CRITEO-EUROPE, FR),
Reverse DNS
Software
Finatra /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Access-Control-Allow-Origin
https://www.golem.de
Date
Sat, 04 Aug 2018 18:36:40 GMT
Access-Control-Allow-Credentials
true
Server
Finatra
Vary
Origin
p.min.js
cdn.emetriq.de/adp/profiling/0.1.13/
4 KB
2 KB
Script
General
Full URL
https://cdn.emetriq.de/adp/profiling/0.1.13/p.min.js
Requested by
Host: ups.xplosion.de
URL: https://ups.xplosion.de/loader/97578/default.js?xplrdir=1
Protocol
SPDY
Server
2600:9000:2047:a000:1c:8c89:a300:93a1 , United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
03f56c523e42f36e912b7109c0a97e43703d78c0884f59c07ff115e590e9fd7f

Request headers

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

Response headers

date
Wed, 31 May 2017 11:06:08 GMT
content-encoding
gzip
last-modified
Tue, 11 Apr 2017 11:21:30 GMT
server
AmazonS3
age
22272744
vary
Accept-Encoding
x-cache
Hit from cloudfront
x-amz-version-id
FiFeAFfpoMZPPyU16IPZd0oUAvReA_Mm
status
200
cache-control
max-age=31536000, no-transform, public
content-type
application/javascript; charset=utf-8
x-amz-cf-id
1gOIE9P9QgcXLxsewxMCNr3Rxbs99Bxd7WtqwKSPMAju1f6toMiW1Q==
via
1.1 2905d0bd25e66c3f788fb2134262d52a.cloudfront.net (CloudFront)
sp_W7V4vf-433666-i_rc.jpg
www.golem.de/6731/
68 B
486 B
Image
General
Full URL
https://www.golem.de/6731/sp_W7V4vf-433666-i_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Sat, 04 Aug 2018 18:36:40 GMT
Server
nginx
X-Powered-By
AdDefend GmbH
Vary
Accept-Encoding
Content-Type
image/png
Cache-Control
max-age=0, max-stale=0, must-revalidate, no-cache, no-store, no-transform, post-check=0, pre-check=0, private no-cache
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
68
Expires
0
collect
stats.g.doubleclick.net/r/
Redirect Chain
  • https://ssl.google-analytics.com/r/__utm.gif?utmwv=5.7.2&utms=1&utmn=1050885305&utmhn=www.golem.de&utme=8(HTML5)9(1)11(2)&utmcs=UTF-8&utmsr=1600x1200&utmvp=1585x1200&utmsc=24-bit&utmul=en-us&utmje=...
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=108889994.1533407801&jid=1536962634&_v=5.7.2&z=1050885305
35 B
102 B
Image
General
Full URL
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=108889994.1533407801&jid=1536962634&_v=5.7.2&z=1050885305
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Server
2a00:1450:400c:c07::9a , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

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

Response headers

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

Redirect headers

pragma
no-cache
date
Sat, 04 Aug 2018 18:36:40 GMT
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
status
302
location
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-518800-2&cid=108889994.1533407801&jid=1536962634&_v=5.7.2&z=1050885305
content-type
text/html; charset=UTF-8
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
368
expires
Fri, 01 Jan 1990 00:00:00 GMT
ca-pub-2342548244565729.js
pagead2.googlesyndication.com/pub-config/r20160913/
133 B
239 B
Script
General
Full URL
https://pagead2.googlesyndication.com/pub-config/r20160913/ca-pub-2342548244565729.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Server
2a00:1450:4001:81f::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
7e7fa886d5d75c745d95be4fc3c5bfb4c988019b3f643c669734612345e1b8c8
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Sat, 04 Aug 2018 10:02:05 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Fri, 03 Aug 2018 22:50:20 GMT
server
sffe
age
30875
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
public, max-age=43200
accept-ranges
bytes
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
125
x-xss-protection
1; mode=block
expires
Sat, 04 Aug 2018 22:02:05 GMT
zrt_lookup.html
googleads.g.doubleclick.net/pagead/html/r20180801/r20180604/ Frame F385
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/html/r20180801/r20180604/zrt_lookup.html
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:81e::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/html/r20180801/r20180604/zrt_lookup.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.golem.de/
accept-encoding
gzip, deflate
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
X-DevTools-Emulate-Network-Conditions-Client-Id
C8E5367B20A50A4DC6DF33589CB7A061
Referer
https://www.golem.de/

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, 01 Aug 2018 14:14:49 GMT
expires
Wed, 15 Aug 2018 14:14:49 GMT
content-type
text/html; charset=UTF-8
etag
14382040638843487582
x-content-type-options
nosniff
content-encoding
gzip
server
cafe
content-length
6932
x-xss-protection
1; mode=block
cache-control
public, max-age=1209600
age
274911
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/ Frame 68BE
186 KB
69 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Server
2a00:1450:4001:81f::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
6fce4c31ae850b2040455bce806118643449d95394856d93a96e1711c48bcd89
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Sat, 04 Aug 2018 18:36:40 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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
70600
x-xss-protection
1; mode=block
server
cafe
etag
2033713322655698268
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Sat, 04 Aug 2018 18:36:40 GMT
rmpslider-rl_117-min.js
www.golem.de/staticrl/scripts/radiant/
15 KB
6 KB
XHR
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/rmpslider-rl_117-min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
a16d97b255903274b8c390ca7cc0da0940acbae6f9ca5de5d7760ba84b0317be

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801
Connection
keep-alive
Cache-Control
no-cache
Accept
text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Content-Encoding
gzip
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
W/"5b0d91ca-3a80"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Tue, 04 Sep 2018 18:36:40 GMT
json
cpxl.golem.de/
0
474 B
XHR
General
Full URL
https://cpxl.golem.de/json
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate
Host
cpxl.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8
Accept
*/*
Cache-Control
no-cache
Referer
https://www.golem.de/
Connection
keep-alive
Content-Length
244
Accept
*/*
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

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

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate
Host
cpxl.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8
Accept
*/*
Cache-Control
no-cache
Referer
https://www.golem.de/
Connection
keep-alive
Content-Length
252
Accept
*/*
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

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

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate
Host
cpxl.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8
Accept
*/*
Cache-Control
no-cache
Referer
https://www.golem.de/
Connection
keep-alive
Content-Length
252
Accept
*/*
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

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

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate
Host
cpxl.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8
Accept
*/*
Cache-Control
no-cache
Referer
https://www.golem.de/
Connection
keep-alive
Content-Length
250
Accept
*/*
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

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

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate
Host
cpxl.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8
Accept
*/*
Cache-Control
no-cache
Referer
https://www.golem.de/
Connection
keep-alive
Content-Length
250
Accept
*/*
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded; charset=UTF-8

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
X-RateLimit-Limit
800
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Access-Control-Allow-Methods
POST, OPTIONS
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Max-Age
86400
Access-Control-Allow-Credentials
true
X-RateLimit-Remaining
753
Connection
keep-alive
Access-Control-Allow-Headers
Origin, X-Requested-With, Content-Type, Accept
ETag
W/"a-oQDOV50e1MN2H/N8GYi+8w"
global_config.json
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
53 B
642 B
XHR
General
Full URL
https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Server
52.216.1.195 Ashburn, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

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

Response headers

Date
Sat, 04 Aug 2018 18:36:42 GMT
Last-Modified
Sat, 04 Aug 2018 06:10:56 GMT
Server
AmazonS3
x-amz-request-id
972026F229D0908E
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Access-Control-Max-Age
3000
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
Content-Length
53
x-amz-id-2
C41s24MGJEAykOtsubAkpuJuIAZCN5TuYXaX/0VWkoitM/LIuMD/YRzHnDh5lvbXl4ZSh1TzZG0=
Expires
0
homadclienthttpsle-json.php
video.golem.de/staticrl/scripts/radiant/
286 B
677 B
XHR
General
Full URL
https://video.golem.de/staticrl/scripts/radiant/homadclienthttpsle-json.php
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ff4b8e8962f23810dfba6084bd82cc367d9aa3b49bfe0612bb2a98bc592eb1fe

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
Vary
User-Agent, Accept-Encoding
Access-Control-Allow-Methods
POST, GET, OPTIONS
Content-Type
application/json;charset=utf-8
Access-Control-Allow-Origin
*
Cache-Control
private
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
rmp.min.js
www.golem.de/staticrl/scripts/radiant/4.9.1/js/
378 KB
110 KB
XHR
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/js/rmp.min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3eac381fd296094c158c1fe2690efd8ec90c4065a681597f57f35855a3c4a98d

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47
Connection
keep-alive
Cache-Control
no-cache
Accept
text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Referer
https://www.golem.de/
X-Requested-With
XMLHttpRequest
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Content-Encoding
gzip
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
W/"5b0d91ca-5e9f0"
Vary
Accept-Encoding
Content-Type
application/javascript
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Tue, 04 Sep 2018 18:36:40 GMT
data
ups.xplosion.de/
4 KB
3 KB
Script
General
Full URL
https://ups.xplosion.de/data?title=Golem.de%3A%20IT-News%20f%C3%BCr%20Profis&hostSiteUrl=https%3A%2F%2Fwww.golem.de%2F&userAgent=5.0%20(Macintosh%3B%20Intel%20Mac%20OS%20X%2010_13_5)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F67.0.3396.87%20Safari%2F537.36&userLang=en-US&color=24&os=Linux%20x86_64&timezone=0&screen=1200x1600&event_id=page_view&_sid=97578&_ver=0.1.13&_seg=jsonp&_=310940349654
Requested by
Host: cdn.emetriq.de
URL: https://cdn.emetriq.de/adp/profiling/0.1.13/p.min.js
Protocol
HTTP/1.1
Server
52.17.80.93 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-17-80-93.eu-west-1.compute.amazonaws.com
Software
Apache-Coyote/1.1 /
Resource Hash
da8bee83ba5ce5cb5c51c9c871a3893541127f06d069e145d59366462c57d694

Request headers

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

Response headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Content-Encoding
gzip
Server
Apache-Coyote/1.1
Vary
Accept-Encoding
P3P
CP="NOI DSP COR NID PSAo OUR SAMo BUS"
Access-Control-Allow-Origin
*
Cache-Control
must-revalidate,no-cache,no-store
Connection
keep-alive
Content-Type
text/javascript
Content-Length
1499
ads
googleads.g.doubleclick.net/pagead/ Frame 5571
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=6643888890&adk=2120986408&adf=2993371392&w=460&lmt=1533407800&num_ads=1&guci=1.2.0.0.2.2.0&format=460x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1533407800774&bpp=8&bdt=759&fdt=12&idt=148&shv=r20180801&cbv=r20180604&saldr=aa&abxe=1&correlator=410721347715&frm=20&pv=2&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=139286814&ga_fc=1&iag=0&icsg=1521724269006784&dssz=75&mdo=0&mso=32&u_tz=0&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=4084&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C21062171%2C368226401%2C42631003&oid=3&rx=0&eae=0&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=7&osw_key=2289871070&ifi=1&fsb=1&xpc=AMvcfpViW0&p=https%3A//www.golem.de&dtd=173
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/show_ads_impl.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:81e::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=6643888890&adk=2120986408&adf=2993371392&w=460&lmt=1533407800&num_ads=1&guci=1.2.0.0.2.2.0&format=460x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1533407800774&bpp=8&bdt=759&fdt=12&idt=148&shv=r20180801&cbv=r20180604&saldr=aa&abxe=1&correlator=410721347715&frm=20&pv=2&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=139286814&ga_fc=1&iag=0&icsg=1521724269006784&dssz=75&mdo=0&mso=32&u_tz=0&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=4084&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C21062171%2C368226401%2C42631003&oid=3&rx=0&eae=0&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=7&osw_key=2289871070&ifi=1&fsb=1&xpc=AMvcfpViW0&p=https%3A//www.golem.de&dtd=173
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.golem.de/
accept-encoding
gzip, deflate
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
X-DevTools-Emulate-Network-Conditions-Client-Id
C8E5367B20A50A4DC6DF33589CB7A061
Referer
https://www.golem.de/

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
gzip
date
Sat, 04 Aug 2018 18:36:41 GMT
server
cafe
cache-control
private
content-length
15827
x-xss-protection
1; mode=block
set-cookie
test_cookie=CheckForPermission; expires=Sat, 04-Aug-2018 18:51:40 GMT; path=/; domain=.doubleclick.net
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
expires
Sat, 04 Aug 2018 18:36:41 GMT
osd.js
pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/
70 KB
26 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/osd.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/show_ads_impl.js
Protocol
SPDY
Server
2a00:1450:4001:81f::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
6546ea7bd057a25d0198ff233e30008c8c8f99bcef163ff487a255db68577007
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Wed, 01 Aug 2018 14:14:45 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
274915
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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
26269
x-xss-protection
1; mode=block
server
cafe
etag
15748226983099521862
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Wed, 15 Aug 2018 14:14:45 GMT
config.json
hgc-cf-cache-1.svonm.com/www.golem.de/
229 B
896 B
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.golem.de/config.json
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Server
52.222.150.179 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-150-179.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
25d819bf5e7ae2c998690015c6e8958ddceb44dac2497783eb70680c777a7406

Request headers

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

Response headers

Date
Sat, 04 Aug 2018 14:32:18 GMT
Via
1.1 b2eb119180a1f499dade55aa4e26c619.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
Age
60
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
229
Last-Modified
Sat, 04 Aug 2018 14:32:00 GMT
Server
AmazonS3
ETag
"ea0192f51aeefc151385c82c9d9a0348"
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
uW3u1REL4x1DcVNbLJBnfp9i4jvjSaMIpsHkZZZN4z610mL3nJ1mvQ==
Expires
0
adrtxtag.min.js
cdn.adrtx.net/
840 B
848 B
Script
General
Full URL
https://cdn.adrtx.net/adrtxtag.min.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Server
54.72.140.158 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-72-140-158.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.3 /
Resource Hash
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08

Request headers

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

Response headers

Date
Fri, 03 Aug 2018 06:40:34 GMT
Content-Encoding
gzip
Last-Modified
Fri, 03 Aug 2018 06:40:10 GMT
Server
akka-http/10.1.3
ETag
"8fda08a34733677008755479a59fa669"
Content-Type
application/javascript; charset=UTF-8
Cache-Control
max-age=86400, must-revalidate
Connection
keep-alive
Content-Length
509
m
p.yieldlab.net/
0
336 B
Image
General
Full URL
https://p.yieldlab.net/m?dm_id=21719&ext_id=BSasBs_AWsJABibsBSf-BiUABifkBif-BsfABiUABifABfrr&ddata_seg=e0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Server
85.114.144.198 , Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
lb.yieldlab.net
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

Pragma
no-cache
Date
Sat, 04 Aug 2018 18:36:41 GMT
X-Content-Type-Options
nosniff
X-Frame-Options
DENY
Cache-Control
no-store,no-cache,max-age=-3600,must-revalidate,post-check=0,pre-check=0
X-XSS-Protection
1; mode=block
X-Application-Context
application
Expires
Fri, 03 Aug 2018 18:36:41 GMT
2.gif
xpl.theadex.com/d/327/i/
Redirect Chain
  • https://xpl.theadex.com/d/327/i/2.gif?axd_pid=22&axd_fuid=BSasBs_AWsJABibsBSf-BiUABifkBif-BsfABiUABifABfrr
  • https://xpl.theadex.com/d/327/i/2.gif?_sc=1000717912036410004&axd_pid=22&axd_fuid=BSasBs_AWsJABibsBSf-BiUABifkBif-BsfABiUABifABfrr
43 B
717 B
Image
General
Full URL
https://xpl.theadex.com/d/327/i/2.gif?_sc=1000717912036410004&axd_pid=22&axd_fuid=BSasBs_AWsJABibsBSf-BiUABifkBif-BsfABiUABifABfrr
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Server
89.163.159.116 Hattersheim, Germany, ASN24961 (MYLOC-AS, DE),
Reverse DNS
Software
nginx /
Resource Hash
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277

Request headers

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

Response headers

Pragma
no-cache
Date
Sat, 04 Aug 2018 18:36:41 GMT
Last-Modified
Sat, 04 Aug 2018 18:36:41 GMT
Server
nginx
P3P
CP="CAO PSA OUR"
Cache-Control
no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Content-Transfer-Encoding
binary
Connection
keep-alive
Access-Control-Allow-Credentials
true
Content-Type
image/gif
Content-Length
43
Expires
Mon, 26 Jul 1997 05:00:00 GMT

Redirect headers

Date
Sat, 04 Aug 2018 18:36:41 GMT
Server
nginx
Transfer-Encoding
chunked
P3P
CP="CAO PSA OUR"
Location
https://xpl.theadex.com:443/d/327/i/2.gif?_sc=1000717912036410004&axd_pid=22&axd_fuid=BSasBs_AWsJABibsBSf-BiUABifkBif-BsfABiUABifABfrr
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
text/html; charset=UTF-8
a.js
d.df-srv.de/match/
Redirect Chain
  • https://d.df-srv.de/match/a.js?pid=42
  • https://dsp.adfarm1.adition.com/cookie/?redirect=https%3A%2F%2Fd.df-srv.de%2Fmatch%2Fa.js%3Fpid%3D42%26l%3D1%26adition_vid%3D%25%25COOKIE%25%25
  • https://d.df-srv.de/match/a.js?pid=42&l=1&adition_vid=6585936356731058199
3 B
466 B
Image
General
Full URL
https://d.df-srv.de/match/a.js?pid=42&l=1&adition_vid=6585936356731058199
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Server
2001:16e0:10a:1::c2:1 , Germany, ASN12611 (RKOM R-KOM Regensburger Telekommunikations GmbH & Co. KG, DE),
Reverse DNS
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

Pragma
no-cache
Date
Sat, 04 Aug 2018 18:36:28 GMT
Server
nginx
P3P
CP="Contact Impact does not have a P3P policy.
Cache-Control
no-cache, no-store, must-revalidate
Connection
close
Content-Type
application/javascript; charset=utf-8
Content-Length
3
Expires
0

Redirect headers

Location
https://d.df-srv.de/match/a.js?pid=42&l=1&adition_vid=6585936356731058199
Date
Sat, 04 Aug 2018 18:36:41 GMT
Server
nginx
Connection
keep-alive
p3p
policyref="http://imagesrv.adition.com/w3c/p3p.xml",CP="NON DSP ADM DEV PSD IVDo OTPi OUR IND STP PHY PRE NAV UNI"
Transfer-Encoding
chunked
Expires
Thu, 01 Jan 1970 00:00:00 GMT
sp_W7V4vf-108687-i_rc.jpg
www.golem.de/8266/ad_pics/
68 B
486 B
Image
General
Full URL
https://www.golem.de/8266/ad_pics/sp_W7V4vf-108687-i_rc.jpg
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx / AdDefend GmbH
Resource Hash
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47; adp_segs=e0
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Pragma
no-cache
Date
Sat, 04 Aug 2018 18:36:41 GMT
Server
nginx
X-Powered-By
AdDefend GmbH
Vary
Accept-Encoding
Content-Type
image/png
Cache-Control
max-age=0, max-stale=0, must-revalidate, no-cache, no-store, no-transform, post-check=0, pre-check=0, private no-cache
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
68
Expires
0
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/ Frame F818
186 KB
0
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Server
2a00:1450:4001:81f::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
6fce4c31ae850b2040455bce806118643449d95394856d93a96e1711c48bcd89
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Sat, 04 Aug 2018 18:36:40 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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
70600
x-xss-protection
1; mode=block
server
cafe
etag
2033713322655698268
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Sat, 04 Aug 2018 18:36:40 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame D9A1
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=9597355291&adk=3463405676&adf=3103571475&w=460&lmt=1533407801&num_ads=1&guci=1.2.0.0.2.2.0&format=460x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1533407800786&bpp=9&bdt=770&fdt=224&idt=227&shv=r20180801&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=460x120&correlator=410721347715&frm=20&pv=1&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=139286814&ga_fc=1&iag=0&icsg=1521724269006784&dssz=84&mdo=0&mso=32&u_tz=0&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=4805&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C21062171%2C368226401%2C42631003&oid=3&rx=0&eae=0&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=7&osw_key=1724946463&ifi=2&fsb=1&xpc=9jlyjGVfxY&p=https%3A//www.golem.de&dtd=239
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/show_ads_impl.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:81e::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=9597355291&adk=3463405676&adf=3103571475&w=460&lmt=1533407801&num_ads=1&guci=1.2.0.0.2.2.0&format=460x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1533407800786&bpp=9&bdt=770&fdt=224&idt=227&shv=r20180801&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=460x120&correlator=410721347715&frm=20&pv=1&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=139286814&ga_fc=1&iag=0&icsg=1521724269006784&dssz=84&mdo=0&mso=32&u_tz=0&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=4805&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C21062171%2C368226401%2C42631003&oid=3&rx=0&eae=0&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=7&osw_key=1724946463&ifi=2&fsb=1&xpc=9jlyjGVfxY&p=https%3A//www.golem.de&dtd=239
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.golem.de/
accept-encoding
gzip, deflate
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
X-DevTools-Emulate-Network-Conditions-Client-Id
C8E5367B20A50A4DC6DF33589CB7A061
Referer
https://www.golem.de/

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
gzip
date
Sat, 04 Aug 2018 18:36:41 GMT
server
cafe
cache-control
private
content-length
15875
x-xss-protection
1; mode=block
set-cookie
test_cookie=CheckForPermission; expires=Sat, 04-Aug-2018 18:51:41 GMT; path=/; domain=.doubleclick.net
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
expires
Sat, 04 Aug 2018 18:36:41 GMT
/
ssl.1.damoh.golem.de/800302642e2d6d2c2b1c3324043d8966a016239d/
184 KB
51 KB
XHR
General
Full URL
https://ssl.1.damoh.golem.de/800302642e2d6d2c2b1c3324043d8966a016239d/
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
176.9.101.100 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.100.101.9.176.clients.your-server.de
Software
AmazonS3 /
Resource Hash
62d79df14cd7c855ebdc917e294b9e303ddd2a0c18a598bb8dc23fed081a0b36

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate
Host
ssl.1.damoh.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-type
application/x-www-form-urlencoded
Accept
*/*
Cache-Control
no-cache
Referer
https://www.golem.de/
Connection
keep-alive
Content-Length
118
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Sat, 04 Aug 2018 18:36:41 GMT
Content-Encoding
gzip
Connection
keep-alive
Content-Length
51037
Last-Modified
Tue, 24 Jul 2018 07:35:54 GMT
Server
AmazonS3
Vary
Accept-Encoding, Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/javascript; charset=UTF-8
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Expose-Headers
X-Homad-Instance, X-Homad-Long-Ad-Ignored, X-Homad-Sig, X-Homad-Url, X-Homad-Vpaid-Ignored, X-Homad-Ad-Id
Cache-Control
no-cache
Access-Control-Allow-Credentials
true
X-Homad-Instance
de4-homad-2
X-Homad-Url
https://hgc-cf-cache-1.svonm.com/hd-main.js
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/ Frame 4D97
186 KB
0
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Server
2a00:1450:4001:81f::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
6fce4c31ae850b2040455bce806118643449d95394856d93a96e1711c48bcd89
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Sat, 04 Aug 2018 18:36:40 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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
70600
x-xss-protection
1; mode=block
server
cafe
etag
2033713322655698268
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Sat, 04 Aug 2018 18:36:40 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 7AB2
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=2074088491&adk=1810682093&adf=700606410&w=460&lmt=1533407801&num_ads=1&guci=1.2.0.0.2.2.0&format=460x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1533407800795&bpp=5&bdt=780&fdt=288&idt=291&shv=r20180801&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=460x120%2C460x120&correlator=410721347715&frm=20&pv=1&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=139286814&ga_fc=1&iag=0&icsg=1521724269006784&dssz=84&mdo=0&mso=32&u_tz=0&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=5527&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C21062171%2C368226401%2C42631003&oid=3&rx=0&eae=0&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=7&osw_key=1026561616&ifi=3&fsb=1&xpc=BJ8lwemWvt&p=https%3A//www.golem.de&dtd=305
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/show_ads_impl.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:81e::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-2342548244565729&output=html&h=120&slotname=2074088491&adk=1810682093&adf=700606410&w=460&lmt=1533407801&num_ads=1&guci=1.2.0.0.2.2.0&format=460x120&url=https%3A%2F%2Fwww.golem.de%2F&flash=0&wgl=1&adsid=NT&dt=1533407800795&bpp=5&bdt=780&fdt=288&idt=291&shv=r20180801&cbv=r20180604&saldr=aa&abxe=1&prev_fmts=460x120%2C460x120&correlator=410721347715&frm=20&pv=1&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=139286814&ga_fc=1&iag=0&icsg=1521724269006784&dssz=84&mdo=0&mso=32&u_tz=0&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=453&ady=5527&biw=1585&bih=1200&scr_x=0&scr_y=0&eid=21060853%2C21062171%2C368226401%2C42631003&oid=3&rx=0&eae=0&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C1600%2C1200&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=16&bc=7&osw_key=1026561616&ifi=3&fsb=1&xpc=BJ8lwemWvt&p=https%3A//www.golem.de&dtd=305
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.golem.de/
accept-encoding
gzip, deflate
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
X-DevTools-Emulate-Network-Conditions-Client-Id
C8E5367B20A50A4DC6DF33589CB7A061
Referer
https://www.golem.de/

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
gzip
date
Sat, 04 Aug 2018 18:36:41 GMT
server
cafe
cache-control
private
content-length
8847
x-xss-protection
1; mode=block
set-cookie
test_cookie=CheckForPermission; expires=Sat, 04-Aug-2018 18:51:41 GMT; path=/; domain=.doubleclick.net
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
expires
Sat, 04 Aug 2018 18:36:41 GMT
vgs.json
cdn.radiantmediatechs.com/rmp/rr/
3 KB
2 KB
XHR
General
Full URL
https://cdn.radiantmediatechs.com/rmp/rr/vgs.json?rdm=425946
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Server
2400:cb00:2048:1::6818:6724 , United States, ASN13335 (CLOUDFLARENET - Cloudflare, Inc., US),
Reverse DNS
Software
cloudflare /
Resource Hash
60fde9a3d1231076ddc27b729fb0f13218efa59200b0a562d3ebc77e84155d6f
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

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

Response headers

date
Sat, 04 Aug 2018 18:36:41 GMT
content-encoding
gzip
x-content-type-options
nosniff
cf-cache-status
HIT
status
200
content-length
1605
timing-allow-origin
*
last-modified
Tue, 31 Jul 2018 13:15:09 GMT
server
cloudflare
expect-ct
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
vary
Accept-Encoding
access-control-allow-methods
OPTIONS, GET, POST, HEAD
content-type
application/json; charset=utf-8
access-control-allow-origin
*
access-control-expose-headers
Date, Server, Content-Type, Content-Length
cache-control
public, max-age=3600
accept-ranges
bytes
cf-ray
445321857c6d2696-FRA
access-control-allow-headers
Content-Type, User-Agent, If-Modified-Since, Cache-Control, Range
expires
Sat, 04 Aug 2018 19:36:41 GMT
rmp-s2.min.css
www.golem.de/staticrl/scripts/radiant/4.9.1/css/
57 KB
12 KB
Stylesheet
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
208b975a401cac12224ab9aa61d73bb5e9d75f4561ae756896e2c59be6074ba9

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/css,*/*;q=0.1
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47; adp_segs=e0
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:41 GMT
Content-Encoding
gzip
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
W/"5b0d91ca-e209"
Vary
Accept-Encoding
Content-Type
text/css
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Tue, 04 Sep 2018 18:36:41 GMT
/
iqdigital.demdex.net/event/
42 B
623 B
Image
General
Full URL
https://iqdigital.demdex.net/event/?d_cid_ic=emetriq%01BSasBs_AWsJABibsBSf-BiUABifkBif-BsfABiUABifABfrr%010
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Server
52.49.47.75 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-49-47-75.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

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

Response headers

DCS
irl1-prod-dcs-0d0186a72.edge-irl1.demdex.com 5.35.1.20180801150814 8ms
Pragma
no-cache
X-TID
vwUHXPw5Rlc=
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa PSAa PSDa OUR SAMa BUS PUR COM NAV INT"
Cache-Control
no-cache,no-store,must-revalidate,max-age=0,proxy-revalidate,no-transform,private
Connection
keep-alive
Content-Type
image/gif
Content-Length
42
Expires
Thu, 01 Jan 1970 00:00:00 GMT
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/ Frame 2C86
186 KB
0
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Server
2a00:1450:4001:81f::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
6fce4c31ae850b2040455bce806118643449d95394856d93a96e1711c48bcd89
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Sat, 04 Aug 2018 18:36:40 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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
70600
x-xss-protection
1; mode=block
server
cafe
etag
2033713322655698268
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Sat, 04 Aug 2018 18:36:40 GMT
display-ohne-werbung3.png
www.golem.de/staticrl/images/abo/
924 B
1 KB
Image
General
Full URL
https://www.golem.de/staticrl/images/abo/display-ohne-werbung3.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
fec4969577c947a272b6be6924b17ca584660dccaa35d17dd05471b0f0b3e548

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/staticrl/styles/golem_main_114-min.css
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47; adp_segs=e0
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/staticrl/styles/golem_main_114-min.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:41 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-39c"
Content-Type
image/png
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
924
Expires
Tue, 04 Sep 2018 18:36:41 GMT
display-mit-werbung3.png
www.golem.de/staticrl/images/abo/
1 KB
1 KB
Image
General
Full URL
https://www.golem.de/staticrl/images/abo/display-mit-werbung3.png
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e192dd8b901bad10acc59606190d742e67dc587f9d3334c609ab030fe12ed52e

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://www.golem.de/staticrl/styles/golem_main_114-min.css
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47; adp_segs=e0
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/staticrl/styles/golem_main_114-min.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:41 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-44b"
Content-Type
image/png
X-UPSTREAM
hybrid2.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
1099
Expires
Tue, 04 Sep 2018 18:36:41 GMT
activation
adstax-match.adrtx.net/ Frame C07E
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
54.77.222.97 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-54-77-222-97.eu-west-1.compute.amazonaws.com
Software
akka-http/10.1.3 /
Resource Hash

Request headers

Host
adstax-match.adrtx.net
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer
https://www.golem.de/
Accept-Encoding
gzip, deflate
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
X-DevTools-Emulate-Network-Conditions-Client-Id
C8E5367B20A50A4DC6DF33589CB7A061
Referer
https://www.golem.de/

Response headers

Cache-Control
no-cache, no-store, must-revalidate
Content-Type
text/html; charset=UTF-8
Date
Sat, 04 Aug 2018 18:36:41 GMT
Server
akka-http/10.1.3
X-Error-Reason
Missing UserId in activation request for config adaud.
Content-Length
39
Connection
keep-alive
ima3.js
imasdk.googleapis.com/js/sdkloader/
231 KB
79 KB
Script
General
Full URL
https://imasdk.googleapis.com/js/sdkloader/ima3.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Server
2a00:1450:4001:810::200a , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
58d691bab385679733ace3e3897224239ec3f2550c6e747003cc6fbb8b612ca8
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Sat, 04 Aug 2018 18:36:41 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900
accept-ranges
bytes
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
80590
x-xss-protection
1; mode=block
expires
Sat, 04 Aug 2018 18:36:41 GMT
truncated
/
68 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
431ced6916a2a21a156e38701afe55bbd7f88969fbbfc56d7fe099d47f265460

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/png
truncated
/
184 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
62d79df14cd7c855ebdc917e294b9e303ddd2a0c18a598bb8dc23fed081a0b36

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
text/javascript
rmp-font.woff2
www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/
8 KB
9 KB
Font
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/rmp-font.woff2?vj7w12
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5c53c39018b0b497f2aa2e27114075534e637621a37383bcfa38bcbfff734418

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47; adp_segs=e0
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Origin
https://www.golem.de

Response headers

Date
Sat, 04 Aug 2018 18:36:41 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-20e4"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
8420
Expires
Tue, 04 Sep 2018 18:36:41 GMT
truncated
/
2 KB
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
9d02d662da8a47fb5fb610b545007507b6017028043dbb63cd09ec897d3b9627

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/png
roboto-v18-latin-regular.woff2
www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/
15 KB
15 KB
Font
General
Full URL
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/fonts/roboto-v18-latin-regular.woff2
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
77.247.84.129 Berlin, Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate
Host
www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CvVersion%7C3.2.0; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47; adp_segs=e0
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/staticrl/scripts/radiant/4.9.1/css/rmp-s2.min.css
Origin
https://www.golem.de

Response headers

Date
Sat, 04 Aug 2018 18:36:41 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-3bf0"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
15344
Expires
Tue, 04 Sep 2018 18:36:41 GMT
Cookie set dest5.html
iqdigital.demdex.net/ Frame D21A
0
0
Document
General
Full URL
https://iqdigital.demdex.net/dest5.html?d_nsid=0
Requested by
Host: assets.adobedtm.com
URL: https://assets.adobedtm.com/launch-EN92e1075482f3410d81944270acba8d90.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.49.47.75 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-49-47-75.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash

Request headers

Host
iqdigital.demdex.net
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer
https://www.golem.de/
Accept-Encoding
gzip, deflate
Cookie
demdex=64046142864768518129162640840116317301
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
X-DevTools-Emulate-Network-Conditions-Client-Id
C8E5367B20A50A4DC6DF33589CB7A061
Referer
https://www.golem.de/

Response headers

Accept-Ranges
bytes
Cache-Control
max-age=21600
Content-Encoding
gzip
Content-Type
text/html
Expires
Thu, 01 Jan 1970 00:00:00 GMT
Last-Modified
Sat, 04 Aug 2018 18:07:29 GMT
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa PSAa PSDa OUR SAMa BUS PUR COM NAV INT"
Pragma
no-cache
Set-Cookie
demdex=64046142864768518129162640840116317301;Path=/;Domain=.demdex.net;Expires=Thu, 31-Jan-2019 18:36:41 GMT;Max-Age=15552000
Vary
Accept-Encoding, User-Agent
X-TID
Q6OCaBy0QGw=
Content-Length
2766
Connection
keep-alive
event
iqdigital.demdex.net/
848 B
2 KB
XHR
General
Full URL
https://iqdigital.demdex.net/event?_ts=1533407800680
Requested by
Host: assets.adobedtm.com
URL: https://assets.adobedtm.com/launch-EN92e1075482f3410d81944270acba8d90.min.js
Protocol
HTTP/1.1
Server
52.49.47.75 Dublin, Ireland, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-52-49-47-75.eu-west-1.compute.amazonaws.com
Software
/
Resource Hash
3e9458a6670521726551a40d3c22d3935ce1b050e7fe68b9a3f04eb73e6901c9

Request headers

Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-Type
application/x-www-form-urlencoded

Response headers

DCS
irl1-prod-dcs-ddbb781d.edge-irl1.demdex.com 5.35.1.20180801150814 9ms
Pragma
no-cache
X-TID
iP/w8aUuRdk=
Vary
Origin
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa PSAa PSDa OUR SAMa BUS PUR COM NAV INT"
Access-Control-Allow-Origin
https://www.golem.de
Cache-Control
no-cache,no-store,must-revalidate,max-age=0,proxy-revalidate,no-transform,private
Access-Control-Allow-Credentials
true
Connection
keep-alive
Content-Type
application/json;charset=utf-8
Content-Length
848
Expires
Thu, 01 Jan 1970 00:00:00 GMT
ibs:dpid=411&dpuuid=W2XyOQAABuTbdzx0
dpm.demdex.net/
Redirect Chain
  • https://cm.everesttech.net/cm/dd?d_uuid=15523052123455657943557814271170652056
  • https://dpm.demdex.net/ibs:dpid=411&dpuuid=W2XyOQAABuTbdzx0
42 B
764 B
Image
General
Full URL
https://dpm.demdex.net/ibs:dpid=411&dpuuid=W2XyOQAABuTbdzx0
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Server
35.165.133.163 Boardman, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
ec2-35-165-133-163.us-west-2.compute.amazonaws.com
Software
/
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629

Request headers

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

Response headers

DCS
usw2-prod-dcs-086dc1a63.edge-usw2.demdex.com 5.35.1.20180801150814 3ms
Pragma
no-cache
X-TID
k9xks64HSy4=
P3P
policyref="/w3c/p3p.xml", CP="NOI NID CURa ADMa DEVa PSAa PSDa OUR SAMa BUS PUR COM NAV INT"
Cache-Control
no-cache,no-store,must-revalidate,max-age=0,proxy-revalidate,no-transform,private
Connection
keep-alive
Content-Type
image/gif
Content-Length
42
Expires
Thu, 01 Jan 1970 00:00:00 GMT

Redirect headers

Date
Sat, 04 Aug 2018 18:36:40 GMT
Server
AMO-cookiemap/1.1
P3P
CP="NOI NID DEVa PSAa PSDa OUR IND PUR COM NAV INT DEM"
Location
https://dpm.demdex.net/ibs:dpid=411&dpuuid=W2XyOQAABuTbdzx0
Cache-Control
no-cache
Connection
Keep-Alive
Keep-Alive
timeout=15,max=100
Content-Length
0
bridge3.225.0_de.html
imasdk.googleapis.com/js/core/ Frame 9C5B
0
0
Document
General
Full URL
https://imasdk.googleapis.com/js/core/bridge3.225.0_de.html
Requested by
Host: imasdk.googleapis.com
URL: https://imasdk.googleapis.com/js/sdkloader/ima3.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:810::200a , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

:method
GET
:authority
imasdk.googleapis.com
:scheme
https
:path
/js/core/bridge3.225.0_de.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.golem.de/
accept-encoding
gzip, deflate
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
X-DevTools-Emulate-Network-Conditions-Client-Id
C8E5367B20A50A4DC6DF33589CB7A061
Referer
https://www.golem.de/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
content-length
163926
date
Fri, 27 Jul 2018 18:28:24 GMT
expires
Sat, 27 Jul 2019 18:28:24 GMT
last-modified
Fri, 27 Jul 2018 18:21:34 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
1; mode=block
cache-control
public, max-age=31536000
age
691697
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
client.js
s0.2mdn.net/instream/video/
26 KB
10 KB
Script
General
Full URL
https://s0.2mdn.net/instream/video/client.js
Requested by
Host: imasdk.googleapis.com
URL: https://imasdk.googleapis.com/js/sdkloader/ima3.js
Protocol
SPDY
Server
2a00:1450:4001:81c::2006 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
62f2eeec7851ae0d5e322062cf40092478236d4a4fc5a2cfd87b257739104147
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Sat, 04 Aug 2018 18:36:41 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
vary
Accept-Encoding
content-type
text/javascript
status
200
cache-control
private, max-age=900
accept-ranges
bytes
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
10523
x-xss-protection
1; mode=block
expires
Sat, 04 Aug 2018 18:36:41 GMT
global_config.json
s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/
53 B
642 B
XHR
General
Full URL
https://s3.amazonaws.com/homad-global-configs.schneevonmorgen.com/global_config.json?cache=9454056353
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFBpZXh1dXBoZWhhcGhvaFY9UGlleHV1cGhlaGFwaG9oVnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBYKCl7eS5TZHx8KHkuU2Q9MCk7eS5TZCsrO3dpbmRvdy52aWRlb3BrZ0ludGVyZmFjZSE9eS52aWRlb3BrZ0ludGVyZmFjZSYmKHdpbmRvdy52aWRlb3BrZ0ludGVyZmFjZT15LnZpZGVvcGtnSW50ZXJmYWNlKTsxMD55LlNkJiZ3aW5kb3cuc2V0VGltZW91dChYLDUwMCl9ZnVuY3Rpb24gQSgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLEEpO1k9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIFooKXt2YXIgYz13aW5kb3cuT087Y3x8KGM9d2luZG93LmpPT1BsYXllcl8wKTtyZXR1cm4gY31mdW5jdGlvbiBhYSgpe2lmKGspe2sucGF1c2VCdXR0b258fChrLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwprLnBsYXlCdXR0b258fChrLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLm11dGVCdXR0b258fChrLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnVubXV0ZUJ1dHRvbnx8KGsudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmsuc2tpcGFibGVCdXR0b258fChrLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjY7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpOwprLnNraXBCdXR0b258fChrLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSIpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYoay5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtrLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2E9YS51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2YuWWEoYSxiLFtdLGMsYyxtKX0pfW0uYyhrLmdsb2JhbENvbmZpZyxrLmNsaWVudENvbmZpZyxrLnByZWNoZWNrZWQsay5vblJlYWR5LGsub25GYWlsdXJlLGspO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBiPWsuc3RhcnRQbGF5ZXI7YiYmImZ1bmN0aW9uIj09PXR5cGVvZiBiJiZiKCl9ZWxzZSBiYShhYSw1MCl9ZnVuY3Rpb24gY2EoYyxiKXtifHwoYj0icHJlIik7aWYoayYmbSl7Yy5wYXVzZSgpO3ZhciBhPW5ldyBOKGMpLGE9bmV3IE8oYSxtKSxnPWsuYWRUYWc7InByZSI9PWImJmsucHJlcm9sbEFkVGFnJiYoZz1rLnByZXJvbGxBZFRhZyk7InBvc3QiPT1iJiZrLnBvc3Ryb2xsQWRUYWcmJihnPWsucG9zdHJvbGxBZFRhZyk7CmcmJihhLmdnKGspLGEuSmQoZykpfWVsc2UgYmEoZnVuY3Rpb24oKXtjYShjKX0uYmluZCh0aGlzKSw1MCl9ZnVuY3Rpb24gcShjLGIpeyhrLmFkVGFnfHxrLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLkQobC55YyxjLkIoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmYudHJhY2soImFjdGl2YXRlZEF0IixhKX1rJiZtPyhiP20ub2E9ITA6Zi50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCksYT1uZXcgZGEsYS5ZYyhjKSxhLkVzKG0pLGEuRHMoayksYS5vcygpLGEuYigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWG09dGhpcy5hWzFdO3RoaXMuZWs9dGhpcy5hWzddO3RoaXMuTXE9dGhpcy5hWzZdO3RoaXMuc2s9dGhpcy5hWzVdOwp0aGlzLmc9dGhpcy5hWzZdfWMudXU9YjtiLnByb3RvdHlwZT17V206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhtOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lazp0aGlzLkxxKGEpfSxMcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTXE6dGhpcy5yayhhKX0scms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnNrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgZWE9Yy51dXx8ZWEsSGM9bmV3IGVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SGMuV20oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuRWE9InNldHVwIjt0aGlzLmRjPVtdO3RoaXMuU2UoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5jcy5iaW5kKHRoaXMpKX0KYy5TaT1iO2IucHJvdG90eXBlPXtTZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxGbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEucG9zdE1lc3NhZ2UoYiwiKiIpfSxHYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sY3M6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuYnMoYS5kYXRhKX0sYnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQowO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0scmQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sRG06ZnVuY3Rpb24oYSxiKXswPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmxhLnVybHNbYV09Yjt0aGlzLmxhLnVybHNbYl09YTt0aGlzLmxhLmhvbWFkVXJsc1thXT1iO3RoaXMubGEub3JpZ2luYWxVcmxzW2JdPWF9LGJmOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMubGEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmxhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LCRhOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO2Zvcih2YXIgZD0wO2Q8dGhpcy5sYS5lcnJtc2cubGVuZ3RoO2QrKyliKz0iXG4iK3RoaXMubGEuZXJybXNnW2RdO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrCmEsYiwhMCl9LERhOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0saGY6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFhzOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LERmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD0KYS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEVmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxlPTAsYz0wLGg9MCxmPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIHU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighdSlyZXR1cm4hMTtjPXUuaGVpZ2h0KnUud2lkdGg7ZD11LndpZHRoO2U9dS5oZWlnaHQ7MD51LnRvcCYmKGUrPXUudG9wKTt1LmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGUtPXUuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD51LmxlZnQmJihkKz11LmxlZnQpO3UucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09dS5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZSYmKGU9MCk7MD5kJiYoZD0wKTswPGMmJihoPTEwMC9jKmQqZSk7aD49YiYmKGY9ITApO3JldHVybiBmfSxrYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPwo2NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEJkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxlO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWU9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZSxifD0wO3JldHVybiBifSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZTtmb3IoZD03OzA8PWQ7ZC0tKWU9YT4+PjQqZCYxNSxnKz1lLnRvU3RyaW5nKDE2KTtyZXR1cm4gZ31mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsYyxoPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsdT00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixJPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbixsLHcscSxyO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGU9MDtlPG4tMztlKz00KWM9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsKMSk8PDE2fGEuY2hhckNvZGVBdChlKzIpPDw4fGEuY2hhckNvZGVBdChlKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChlKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT1wW2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09ZChoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtjPWY7bj11O2w9azt3PUk7cT1tO2ZvcihlPQowOzE5Pj1lO2UrKylyPWQoYyw1KSsobiZsfH5uJncpK3EraFtlXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZT0yMDszOT49ZTtlKyspcj1kKGMsNSkrKG5ebF53KStxK2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGU9NDA7NTk+PWU7ZSsrKXI9ZChjLDUpKyhuJmx8biZ3fGwmdykrcStoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihlPTYwOzc5Pj1lO2UrKylyPWQoYyw1KSsobl5sXncpK3EraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmPWYrYyY0Mjk0OTY3Mjk1O3U9dStuJjQyOTQ5NjcyOTU7az1rK2wmNDI5NDk2NzI5NTtJPUkrdyY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZikrYih1KStiKGspK2IoSSkrYihtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQoiIixkLGUsYyxoLGYsdSxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxlPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8ZT4+NCxmPShlJjE1KTw8MnxjPj42LHU9YyY2Myxpc05hTihlKT9mPXU9NjQ6aXNOYU4oYykmJih1PTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZikrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQodSk7cmV0dXJuIGJ9LG5xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJgotMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LFdlOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGU9ITEsYz0hMSxoPSExLGY9ITEsdT0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7ZT13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5zbj8hMDohMX1jYXRjaChyKXt9dHJ5e2M9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLHU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksCms9IXUmJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZTthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZjthLmlzSUU9dTthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9bTtyZXR1cm4gYX0sWG86ZnVuY3Rpb24oKXt2YXIgYT0iVSIsYj10aGlzLldlKCk7Yi5pc1BoYW50b21KUz9hPSJIUCI6Yi5pc0Nocm9tZUhlYWRsZXNzP2E9IkhDIjpiLmlzRmlyZWZveEhlYWRsZXNzP2E9IkhGIjooYi5pc0JsaW5rJiYoYT0iQiIpLGIuaXNPcGVyYSYmKGE9Ik8iKSxiLmlzRmlyZWZveCYmKGE9IkYiKSxiLmlzU2FmYXJpJiYoYT0iUyIpLGIuaXNJRSYmKGE9IkkiKSxiLmlzRWRnZSYmKGE9IkUiKSxiLmlzQ2hyb21lJiYoYT0iQyIpKTtyZXR1cm4gYX0sWGE6ZnVuY3Rpb24oKXt2YXIgYT17b2g6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sCkNoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LENwOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHlrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LFVsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxrbjpmdW5jdGlvbigpe3JldHVybiBhLm9oKCl8fGEuQ2goKXx8YS5DcCgpfHxhLnlrKCl8fGEuVWwoKX19O3JldHVybiBhLmtuKCl9LEthOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGU9MTQ7ZS0tOylkW2JbZV1dPWFbZV18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxlPTAsYz1hLmxlbmd0aDtlPGM7KytlKWIuaGFzT3duUHJvcGVydHkoYVtlXSl8fChkLnB1c2goYVtlXSksYlthW2VdXT0xKTtyZXR1cm4gZH0sb2Y6ZnVuY3Rpb24oYSl7YT10aGlzLkthKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0saWI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sVW46ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZT1bXSxjPTA7YzxiLmxlbmd0aDtjKyspZFtiW2NdXT0hMDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWRbYVtjXV18fGUucHVzaChhW2NdKTtyZXR1cm4gZX0sVnM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxlPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGU9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZSk6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxlZjpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMueGcoYikrIjoiK3RoaXMueGcoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3JldHVybiAxMD4KYT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZWU6ZnVuY3Rpb24oYSl7dGhpcy5FYT1hfSxmaXJlRXZlbnQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlO2Quc3RhdGU9dGhpcy5FYTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9lPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGUuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChlKX0sVGI6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLmZpcmVFdmVudChkLGIsYSl9LEQ6ZnVuY3Rpb24oYSxiLGQsZSxjKXt2YXIgaD1hO2QmJmImJihiPWwuRmMoYixkKSk7YiYmKGg9bC5GYyhhLGIpKTtlJiYoaD1sLkZjKGgsZSkpO2MmJihoPWwuRmMoaCxjKSk7Zi5UYihoKX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgZT1tLmFlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTttLlRhKGUsITApO2U9bS5UYShlLCEwKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtlLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2UuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkZhKGUsZnVuY3Rpb24oZCl7dmFyIGU9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGU9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGU9ITEpfWNhdGNoKGMpe31lfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwKKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LEtkOmZ1bmN0aW9uKCl7bSYmbS5ZP20uaXNFbmFibGVkJiZtLkVuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktkKCl9LmJpbmQodGhpcyksNTAwKX0seW46ZnVuY3Rpb24oYSxiKXtpZihiLk9jKGEpfHwiYWJvdXQ6YmxhbmsiPT1hfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5lZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy4kYSgiZXJyX3VybCIsYSk7aWYodGhpcy5iZihhKSlyZXR1cm4gdGhpcy5iZihhKTt2YXIgZD17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtkLmhvbWFkX3VybF9zdWZmaXg9CmE7ZC5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGEpO2QuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtkLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dmFyIGU9ITEsYz0hMSxjPXRoaXMuWWEoYSxiLnVhLGQsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1jKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goaCl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLkxjKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLkRtKGUsYSk7cmV0dXJuIGV9LFlhOmZ1bmN0aW9uKGEsYixkLGUsYyxoLGYsdSl7dmFyIGs9aHx8bTtoPSEwO3UmJihoPSExKTtpZihrJiZrLlkpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChsKXtjKGwpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLlRhKGEsaCk7aD1rLlRhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7aC5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciBxIGluIGQpaC5kYXRhW3FdPWRbcV07cmV0dXJuIGsuRmEoaCxlLGMsIiIsIiIsZil9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGUsYyxrLGYsdSl9LmJpbmQodGhpcyksNTAwKX0sR3E6ZnVuY3Rpb24oYSxiLGQsZSxjLGgsZil7dmFyIHU9ITA7ZiYmKHU9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zj1kO2Q9IiI7Zm9yKHZhciBrIGluIGYpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChmW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFlfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGUobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsdSksbC53aXRoQ3JlZGVudGlhbHM9aCwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LEhxOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkdxKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLmRjKWZvcih2YXIgYyBpbiB0aGlzLmRjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuZGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LE1mOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWWEoYSxlLnVhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5IcShlLkxjKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGUsITApfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYz1hfSxJdTpmdW5jdGlvbihhLGIsZCxlLGMpe3RoaXMuWWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzplfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86ZX0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9KX0sbG46ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxqcTpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspaWYoYltlXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFA9Yy5TaXx8UDtuZXcgUDt2YXIgZj1uZXcgUDt3aW5kb3cuZnY9ZjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5SaT1iO2IuRmM9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxlO2ZvcihlIGluIGIpZFtlXT1iW2VdO2ZvcihlIGluIGEpZFtlXT1hW2VdO3JldHVybiBkfTtiLk5yPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLiRxPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5zdT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLnhvPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuR3U9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53bT17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5xbT17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IudG09e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IueW09e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLnBtPXtjb2RlOiIxMDA5IiwKdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5ybT17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld0PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5acT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55bz17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQnU9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTG49e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Rbj17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IiwKbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLnpjPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IueWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLnZtPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi51bT17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWU9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLkhlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLnptPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07CmIuc209e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLlR0PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuYXI9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgbD1jLlJpfHxsO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxoPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuUms9YjtiLnByb3RvdHlwZT17a2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGZhPWMuUmt8fGZhLEpjPW5ldyBmYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUpjLmtoKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuVGk9YjtiLnByb3RvdHlwZT17QmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGUsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKyllPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2UsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sZnA6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLnZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sR2M6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkdjKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuR2MoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD0KYS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sTWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuR2MoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWMoKSsiMiJ9LEJmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmQodGhpcy5mcCgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLkdjKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgZ2E9Yy5UaXx8Z2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlFxPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzJdfWMuJG49YjtiLnByb3RvdHlwZT17UHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy4kbnx8aGEsS2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9S2MuUHEoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZT1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZyllW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT8KZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGU9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGV9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGUuYz9lLmhhc093blByb3BlcnR5KCJpbml0Iik/ZS5jOmZ1bmN0aW9uKCl7ZC5jLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWU7ZS5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLnVlPWJ9KShjKTt2YXIgSj1jLnVlfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRoPXRoaXMuYVs3XTt0aGlzLnhyPXRoaXMuYVs1XTt0aGlzLlBvPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs3XTt0aGlzLnRyPXRoaXMuYVs3XTt0aGlzLkxrPXRoaXMuYVs1XTt0aGlzLmZpPQp0aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLlJxPWI7Yi5wcm90b3R5cGU9e1poOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kaDp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHI6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBvOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucG46dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnRyOnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Mazp0aGlzLmVpKGEpfSxlaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYT1jLlJxfHxpYSxMYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuWmgoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Oaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPXt9O3RoaXMuQT1udWxsO3RoaXMuYWM9MTAwO3RoaXMubGI9MDt0aGlzLndhPTE1MDt0aGlzLnFiPTA7dGhpcy5GcyhiKX0sYjpmdW5jdGlvbigpe30sSDpmdW5jdGlvbigpe3RoaXMubGI8PXRoaXMud2E/KHRoaXMubGIrKyx0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKTowPnRoaXMud2EmJih0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKX0scnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYj50aGlzLndhPyEwOiExfSxjZzpmdW5jdGlvbigpe3RoaXMubGI9MH0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEw6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmZiKCldPQpiO0smJksuS2YmJksuWXMoYil9LG52OmZ1bmN0aW9uKCl7cmV0dXJuIGYuRGEodGhpcy54YSl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueGEpaWYoYT09dGhpcy54YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy54YVtiLmZiKCldPyEwOiExfSxtcTpmdW5jdGlvbihiKXtiPWIuQ2EoKTtmb3IodmFyIGEgaW4gdGhpcy54YSlpZihiLmlkPT10aGlzLnhhW2FdLkNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LEJ2OmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMuTmt8fHI7KGZ1bmN0aW9uKGMpe2MuUGs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5hYz0xMDt0aGlzLmxiPTA7dGhpcy53YT01MDt0aGlzLko9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLlllPSExO3RoaXMuTigpfSwKSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7fSxPczpmdW5jdGlvbihiKXt0aGlzLko9Yn0sb3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KfSxJczpmdW5jdGlvbihiKXt0aGlzLk9kPWJ9LG12OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2R9LE5kOmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YSYmKHRoaXMubGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmFjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSwKZ2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5DYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sZmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxDdjpmdW5jdGlvbigpe30sUjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5CcCgpfHx0aGlzLkFtKCk7dGhpcy5mZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LHB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEFtOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixmLnBhKDEwKSl9LEJwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxPOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LENhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxOYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0samI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdnY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sZGE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxXYTpmdW5jdGlvbigpe3JldHVybiExfSxIZDpmdW5jdGlvbigpe3JldHVybiExfSxoZzpmdW5jdGlvbihiKXt0aGlzLmdiPWJ9LGx2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LHFzOmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxydjpmdW5jdGlvbigpe3ZhciBiPQohMTt0aGlzLmdiJiYoYj0hMCk7cmV0dXJuIGJ9LHh2OmZ1bmN0aW9uKCl7dGhpcy5ZZXx8KHRoaXMuWWU9ITApfSxIYzpmdW5jdGlvbigpe3JldHVybiExfSxpdjpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5Qa3x8cDsoZnVuY3Rpb24oYyl7Yy5PZz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuQT10aGlzLnBsYXllcj0iIjt0aGlzLkRlPSIxIjt0aGlzLkVlPSIyIjt0aGlzLmptPSIzIjt0aGlzLmljPTA7dGhpcy5QZj0zMDt0aGlzLnRiPVtdO3RoaXMuT2E9W107dGhpcy5MYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5LZT10aGlzLkJnPSExO3RoaXMuc3RhdHVzPXRoaXMuaWM7dGhpcy5pZD1mLnBhKDEwKTt0aGlzLlljKGIpOwp0aGlzLkdzKGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuQmd8fCh0aGlzLkJnPSEwLGYuS2QoKSl9LFJkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LKCk7USYmUS5ZYiYmIWphJiYoamE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdzpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLkxzKCksdGhpcy5BKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy50ZygpLHRoaXMuS2U9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LGw6ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnRiLnB1c2goYiksdGhpcy5PYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnRiJiYwPHRoaXMudGIubGVuZ3RoJiYodGhpcy50Yj1mLnVuaXF1ZSh0aGlzLnRiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsCnRoaXMudGIuam9pbigiLCIpKSk7aWYodGhpcy5PYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLk9hLmxlbmd0aDtnKyspdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl09PXRoaXMuTGJbYl0mJmEucHVzaCh0aGlzLk9hW2ddLmRldGFpbCksdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl08dGhpcy5MYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuT2FbZ10uZGV0YWlsKSxiPXRoaXMuT2FbZ10ucmVhc29uKTt0aGlzLkxiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9Zi51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sbTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGV9LExzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5FZX0sTXM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmptfSxDYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPQp0aGlzLmljfSxGZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5EZX0sWHU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuRWV9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmljfSxZYzpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEdzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEtxOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5PZ3x8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GaT10aGlzLmFbNV07dGhpcy5jdD10aGlzLmFbNV07dGhpcy5Eaj10aGlzLmFbOF07dGhpcy4kbD10aGlzLmFbN107dGhpcy5ndD10aGlzLmFbMTBdO3RoaXMuY3I9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19CmMuUGc9YjtiLnByb3RvdHlwZT17RWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZpOnRoaXMuYnQoYSl9LGJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdDp0aGlzLkNqKGEpfSxDajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGo6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRsOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ndDp0aGlzLmJyKGEpfSxicjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYT1jLlBnfHxrYSxNYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5FaSg0KTsoZnVuY3Rpb24oYyl7Yy5OaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5KJiZ0aGlzLkooKX0sSzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgUj1jLk5ofHxSOyhmdW5jdGlvbihjKXtjLk1oPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5nZD1udWxsO3RoaXMuaHU9MUUzO3RoaXMuV2Y9Cm51bGw7dGhpcy52dD0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuc24pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Jby5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMueHAuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy53cChhLGIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMua3UoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLmx1KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMudnAoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLk9uKGEpfS5iaW5kKHRoaXMpKX0sCk9uOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sa3U6ZnVuY3Rpb24oYil7dGhpcy5nZHx8KHRoaXMuZ2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm11KGIpfS5iaW5kKHRoaXMpLHRoaXMuaHUpKX0sbXU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZ2QpO3RoaXMudygpfSxsdTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5nZCl9LHZwOmZ1bmN0aW9uKGIpe3RoaXMuZHYoYik7dGhpcy5XZj1uZXcgRGF0ZTt0aGlzLldmLXRoaXMuWHI8dGhpcy52dD90aGlzLncoKTp0aGlzLm0oKX0seHA6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5ZYyhuZXcgUihhKSkpO3RoaXMudygpfSxJbzpmdW5jdGlvbigpe30sd3A6ZnVuY3Rpb24oKXt0aGlzLlhyPW5ldyBEYXRlfX0pfSkoYyk7dmFyIGxhPWMuTWh8fGxhOyhmdW5jdGlvbihjKXtjLk9oPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxmLkRhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFIoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgbGEoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkgoKX19fSl9KShjKTt2YXIgbWE9Yy5PaHx8bWEsbmE9bmV3IG1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnd1PXRoaXMuYVs5XTt0aGlzLlRvPXRoaXMuYVs5XTt0aGlzLkdwPXRoaXMuYVs4XTt0aGlzLmJoPXRoaXMuYVsyXTt0aGlzLmhpPXRoaXMuYVs4XTt0aGlzLkR0PXRoaXMuYVszXTt0aGlzLlR1PXRoaXMuYVs5XTsKdGhpcy5Ucj10aGlzLmFbNV07dGhpcy5mcz10aGlzLmFbNV07dGhpcy5Iaz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxXX1jLkh1PWI7Yi5wcm90b3R5cGU9e3Z1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53dTp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVG86dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdwOnRoaXMuYWgoYSl9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5iaDp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaGk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkR0OnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5UdTp0aGlzLlNyKGEpfSxTcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHI6dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZzOnRoaXMuR2soYSl9LApHazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgb2E9Yy5IdXx8b2EsTmM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMudnUoNCk7KGZ1bmN0aW9uKGMpe2Mucmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdLHRoaXMubHE9ITApO3RoaXMuUihhKTsKdGhpcy5SZigpO3RoaXMuUG49ITF9LFJmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYSgpLGE9dGhpcy52aWRlb1RhZyxnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtpZihnKXtpZigiT0JKRUNUIj09Zy5ub2RlTmFtZXx8IlZJREVPIj09Zy5ub2RlTmFtZSlnPWcucGFyZW50Tm9kZTtnIT1iJiZ0aGlzLk8oZyk7Yj1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2lmKCFiKWI9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF07ZWxzZSBpZih0aGlzLmxxKXt0aGlzLmtxPSEwO3JldHVybn1iJiZiIT1hJiZ0aGlzLlIoYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl9LmJpbmQodGhpcyksNTApfX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihrLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllciwKY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcykpfSxOZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLiRjKGEpfS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpfSwkYzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuT2QmJigwLHRoaXMuT2QpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LApqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxIYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHBhPWMucmp8fHBhOyhmdW5jdGlvbihjKXtjLnFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LENiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5pYzt0aGlzLmlzUGxheWluZz10aGlzLmtjPQohMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmCmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmJiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5iYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMua2M9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkSW1wcmVzc2lvbiIpOwp0aGlzLlJkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5QZiYmIXRoaXMuaGEoKSYmKHRoaXMuYmI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJih0aGlzLkNiKCksdGhpcy5nZXRQbGF5ZXIoKS5Qbj0hMCxrLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2I7YSYmKGEuVGQoKSxhLkFhKCkpfX0uYmluZCh0aGlzKX0pOwppZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5rYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUGYmJiF0aGlzLmhhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMubWMuaW5kZXhPZihhKSYmdGhpcy5tYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5tKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubSgiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMubWMubGVuZ3RoPj10aGlzLnBkJiZ0aGlzLm8oKSl9LEtxOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sbzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKTtmLlhzKGEudmlkZW9UYWcpJiYoYS5rcT90aGlzLm0oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmtjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksNTApKX19KX0pKGMpO3ZhciBxYT1jLnFqfHxxYTsoZnVuY3Rpb24oYyl7Yy5zaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmFwKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07ZHx8KGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2R8fCJPQkpFQ1QiIT1nLm5vZGVOYW1lJiYiVklERU8iIT1nLm5vZGVOYW1lfHwoZD1nKTtpZihkKXt2YXIgZz1uZXcgcGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMubXEoZyl8fCh0aGlzLkwoZyksZz1uZXcgcWEoZyx0aGlzLkEpLApnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGFwOmZ1bmN0aW9uKCl7dmFyIGI9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZi53YihiLmFuY2hvcil9fSl9KShjKTt2YXIgcmE9Yy5zanx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLm5oPXRoaXMuYVsxMF07dGhpcy5yaT10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVs0XX1jLiRnPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50cTp0aGlzLm1oKGEpfSxtaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubmg6dGhpcy5waShhKX0scGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5yaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIHRhPWMuJGd8fHRhLE9jPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLnNxKDQpOyhmdW5jdGlvbihjKXtjLlhsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuTyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5SKGIpOnRoaXMuSCgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB1YT1jLlhsfHx1YTsoZnVuY3Rpb24oYyl7Yy5XbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm0oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5vKCkpfSxvOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgdmE9Yy5XbHx8dmE7KGZ1bmN0aW9uKGMpe2MuWWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8Zi5EYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgdWEoZyksdGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgdmEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgd2E9Yy5ZbHx8d2EseGE9bmV3IHdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zdD10aGlzLmFbMl07dGhpcy51bz10aGlzLmFbOF07dGhpcy5XZz10aGlzLmFbOV07dGhpcy5GdD10aGlzLmFbOV07dGhpcy5BdT10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs3XX1jLlVvPWI7Yi5wcm90b3R5cGU9e3J0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLnRvKGEpfSx0bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudW86dGhpcy5WZyhhKX0sVmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldnOnRoaXMuRXQoYSl9LEV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GdDp0aGlzLnp1KGEpfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgeWE9Yy5Vb3x8eWEsUGM9bmV3IHlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLnJ0KDQpOyhmdW5jdGlvbihjKXtjLkpsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLk8oYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUihiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sSzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnBiKGIpfS5iaW5kKHRoaXMpKX0scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkomJnRoaXMuSigpfSxOYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5leGl0RnVsbHNjcmVlbigpfSwKY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB6YT1jLkpsfHx6YTsoZnVuY3Rpb24oYyl7Yy5JbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy56Zz0hMDt0aGlzLnRkPXRoaXMueWY9ITE7dGhpcy5TZigpO3RoaXMuQm4oKTt0aGlzLkhhKCl9LHl2OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5mYigpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5iYSwiOyIsCnR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5zYToKInVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLmxkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLm1kOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuRj9iLkYubWE6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2Q6InVuZGVmaW5lZFgiLAoiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuYWcpfSxTYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sVmI6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGI9CnRoaXMuU2EoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLlhiKXt2YXIgYj10aGlzLlNhKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWGI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlhiPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWGJ9LGlxOmZ1bmN0aW9uKCl7aWYoIXRoaXMueGYpe3ZhciBiPXRoaXMuU2EoKSxhPXRoaXMuZ3EoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJgoodGhpcy54Zj0hMCl9cmV0dXJuIHRoaXMueGZ9LGdxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5xYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMucWM9ITApO3JldHVybiB0aGlzLnFjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYKKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXt0aGlzLmJlKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxiZTpmdW5jdGlvbigpe3RoaXMudGQ9ITA7dmFyIGI9dGhpcy5rZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2YuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2YuaWIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPQohMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMuTmJ8fCh0aGlzLmwoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLlcoKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksCjIwKX0sanY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlRlJiZiLmFkcyYmKHRoaXMuVGU9Yi5hZHMpO3JldHVybiB0aGlzLlRlfSxCbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuVygpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpOwpiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKX0sVmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDUwKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuaXEoKSl7dmFyIGE9dGhpcy5TYSgpLGc9dGhpcy5WYigpO2EmJmcmJih0aGlzLlNhKCksdGhpcy5WYigpLHRoaXMudGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZD90aGlzLm0oKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5TYSgpfWVsc2UgdGhpcy55Zj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhKCksYj10aGlzLlZiKCk7YSYmIWI/KHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuU2EoKTt0aGlzLlZiKCl9LmJpbmQodGhpcyksMTAwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuVygpKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy55Zj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl9LmJpbmQodGhpcyksNTApfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYKKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LENuOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihiLmFkcyl7aWYodGhpcy5RYiE9Yi5hZHMuc3RhdGUmJih0aGlzLlFiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLlFiKXt0aGlzLm0oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuUWI9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNuKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITA7dGhpcy5tKCJlbXB0eSB2YXN0Iil9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuemc9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuemcsZnVuY3Rpb24oKXt0aGlzLlZlKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApIbjpmdW5jdGlvbigpe3RoaXMudHZ8fCgxMDx0aGlzLml1Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApKToodGhpcy5pdSsrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnBzKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhuKCl9LmJpbmQodGhpcyksNTApKSl9LHBzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLmp1KXt0aGlzLmp1PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrCmEsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBBYT1jLklsfHxBYTsoZnVuY3Rpb24oYyl7Yy5LbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1nKGJbZ10pfWNhdGNoKGQpe310aGlzLkgoKX19LG1nOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYuRGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgemEoYltnXSksYS5qYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBBYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxIOmZ1bmN0aW9uKCl7dGhpcy5xYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmFjKX19KX0pKGMpOwp2YXIgQmE9Yy5LbHx8QmEsQ2E9bmV3IEJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk11PXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzZdfWMuU3M9YjtiLnByb3RvdHlwZT17THU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk11OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgRGE9Yy5Tc3x8RGEsUWM9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuTHUoNCk7KGZ1bmN0aW9uKGMpe2Mudmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpOwpiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuTyhhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe30scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSiYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKToKYi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEVhPWMudmx8fEVhOyhmdW5jdGlvbihjKXtjLnVsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLnpiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmVjPSExO3RoaXMuYmcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9CmIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLm0oKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZWM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy51YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlFlKCk6dGhpcy5tKCl9LHVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlOwphLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMubSgpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5lYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZWM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy51Yy5iaW5kKHRoaXMpLAoxMDApfX0sUWU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuemIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuemImJih0aGlzLnpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lY3x8Cih0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFlLmJpbmQodGhpcyksNTApfX0sYmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5lYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJgp0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZhPWMudWx8fEZhOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBFYSh2aWRlbyk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgRmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIEdhPWMud2x8fEdhLEhhPW5ldyBHYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLmRyPQpiO2IucHJvdG90eXBlPXtiajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgSWE9Yy5kcnx8SWEsUmM9bmV3IElhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuYmooNCk7KGZ1bmN0aW9uKGMpe2MueGg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5RZj1hfSxOOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLlFmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFmKS5wYXJlbnROb2RlO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKSzpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgSmE9Yy54aHx8SmE7KGZ1bmN0aW9uKGMpe2Mud2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIEthPWMud2h8fEthOyhmdW5jdGlvbihjKXtjLnloPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IEphKGQsYSksdGhpcy5JKGQpfHwoZC5MZChhKSx0aGlzLkwoZCksCmQ9bmV3IEthKGQsdGhpcy5BLGcpLGQuTGQoZyksZC5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgTGE9Yy55aHx8TGEsTWE9bmV3IExhKGNhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zaD10aGlzLmFbOF07dGhpcy5Sbz10aGlzLmFbNl07dGhpcy5MdD10aGlzLmFbMV07dGhpcy5Ecj10aGlzLmFbNV07dGhpcy5Qcj10aGlzLmFbNV07dGhpcy53aj10aGlzLmFbN107dGhpcy5qbD10aGlzLmFbOV07dGhpcy5GdT10aGlzLmFbNV07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLmpoPWI7Yi5wcm90b3R5cGU9e3JoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zaDp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm86dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT8KdGhpcy5MdDp0aGlzLkNyKGEpfSxDcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHI6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlByOnRoaXMudmooYSl9LHZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53ajp0aGlzLmlsKGEpfSxpbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamw6dGhpcy5FdShhKX0sRXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GdTp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgTmE9Yy5qaHx8TmEsU2M9bmV3IE5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MucmgoNCk7KGZ1bmN0aW9uKGMpe2MuV2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLk8oYik7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sWGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmMDwkKCJib2R5LmRldmljZV9tb2JpbGUiKS5sZW5ndGgmJihiPSEwKTtyZXR1cm4gYn0sSzpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgT2E9Yy5Xanx8T2E7KGZ1bmN0aW9uKGMpe2MuVmo9CnQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlhhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMubGMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpKTp0aGlzLmxjKCl9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkP2IuYWRDb250ZXh0Ll9hZFJlc3BvbnNlP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpOwp2YXIgUGE9Yy5Wanx8UGE7KGZ1bmN0aW9uKGMpe2MuWGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBPYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFBhKGIsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBRYT1jLlhqfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW09dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVszXTt0aGlzLnFoPXRoaXMuYVsxXTt0aGlzLmlrPXRoaXMuYVszXTt0aGlzLlppPXRoaXMuYVs1XTt0aGlzLkhyPXRoaXMuYVs2XTt0aGlzLkxwPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5uaj0KdGhpcy5hWzNdO3RoaXMuR289dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMl19Yy5CbD1iO2IucHJvdG90eXBlPXtMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTW06dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmV0OnRoaXMucGgoYSl9LHBoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucWg6dGhpcy5oayhhKX0saGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlrOnRoaXMuWWkoYSl9LFlpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5aaTp0aGlzLkdyKGEpfSxHcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHI6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxwOnRoaXMuQXMoYSl9LEFzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQnM6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5qOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuR286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBTYT1jLkJsfHxTYSxUYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5MbSg0KTsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLlVkPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLk8oYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlIoYik6dGhpcy5kYSgpfSxZcjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5ZYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5UZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWQ9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuVWQrKztpZigxMDx0aGlzLlVkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkomJnRoaXMuSigpfX0pfSkoYyk7dmFyIFRhPWMuQWt8fFRhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkVvPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLkVvPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuWXIoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFVhPWMuemt8fFVhOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVGEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkkoYSl8fCh0aGlzLkwoYSksKG5ldyBVYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgVmE9Yy5Ca3x8VmEsV2E9bmV3IFZhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlF0PXRoaXMuYVs4XTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLmppPXRoaXMuYVszXTt0aGlzLmd1PXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzFdfWMudXM9YjtiLnByb3RvdHlwZT17UHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ubDp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuamk6dGhpcy5mdShhKX0sZnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzoKYX19fSkoYyk7dmFyIFhhPWMudXN8fFhhLFVjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVVjLlB0KDQpOyhmdW5jdGlvbihjKXtjLk9pPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5PKGIuZWxlbWVudCk7dGhpcy5SKGIuZWxlbWVudCl9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIFlhPWMuT2l8fFlhOyhmdW5jdGlvbihjKXtjLk5pPQp0LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmRldGFpbCYmIjEwMTAiPT1iLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCl9fSl9KShjKTt2YXIgWmE9Yy5OaXx8WmE7KGZ1bmN0aW9uKGMpe2MuUGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLGZ1bmN0aW9uKGIpe2I9bmV3IFlhKGIuZGV0YWlsKTtiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuQSkpLmIoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciAkYT1jLlBpfHwkYSxhYj1uZXcgJGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWc9dGhpcy5hWzNdO3RoaXMuWHA9dGhpcy5hWzhdO3RoaXMuS2g9dGhpcy5hWzZdO3RoaXMubGk9dGhpcy5hWzhdO3RoaXMuRGk9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzZdO3RoaXMudmk9dGhpcy5hWzhdO3RoaXMuWmo9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbNl19Yy5IcD1iO2IucHJvdG90eXBlPXtUZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWc6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlhwOnRoaXMuSmgoYSl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5LaDp0aGlzLmtpKGEpfSxraTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubGk6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5EaTp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLktvOnRoaXMudWkoYSl9LHVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52aTp0aGlzLllqKGEpfSxZajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGJiPWMuSHB8fGJiLFZjPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVZjLlRnKDQpOyhmdW5jdGlvbihjKXtjLmtqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1mLmhmKGIsImVsZW1lbnRJRCIpO3RoaXMuWWY9Yi5wb3NpdGlvbmluZzsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuTyhnKTt0aGlzLlIoZyk7dGhpcy5EYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuRGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkRjKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCkduOmZ1bmN0aW9uKCl7Zi5EZih0aGlzLkRjKTtmLkVmKHRoaXMuRGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HbigpfS5iaW5kKHRoaXMpLDUwKX0sSzpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxIZDpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGNiPWMua2p8fGNiOyhmdW5jdGlvbihjKXtjLmpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBkYj1jLmpqfHxkYjsoZnVuY3Rpb24oYyl7Yy5saj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLndhPTE1MDA7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoayYmay5pbnJlYWQpe3ZhciBiPWsuaW5yZWFkLGE9Zi5oZihiLCJlbGVtZW50SUQiKTtmLkRmKGEpJiYoYj1uZXcgY2IoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgZGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLnFiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5xYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZWI9Yy5sanx8ZWIsZmI9bmV3IGViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVoPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzFdfWMuZ3M9YjtiLnByb3RvdHlwZT17ZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVoOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgZ2I9Yy5nc3x8Z2IsV2M9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9V2MuZGgoNCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5VaT1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxIczpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LEJtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB6PWMuVWl8fHo7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5JYT1hO3RoaXMuZGY9dGhpcy5LZz0hMTt0aGlzLlRmPWQ7dGhpcy5uZz0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5JYT1uZXcgeihhKSk7dmFyIGY9dGhpcy5OYT1uZXcgWE1MSHR0cFJlcXVlc3Q7Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Zi5yZWFkeVN0YXRlfHwKMjAwIT1mLnN0YXR1cyYmMjAxIT1mLnN0YXR1c3x8ZyhmKTtpZihkJiY0PT1mLnJlYWR5U3RhdGUmJjIwMCE9Zi5zdGF0dXMmJjIwMSE9Zi5zdGF0dXMpZChmKTtlbHNlIGlmKDQ9PWYucmVhZHlTdGF0ZSYmMD09Zi5zdGF0dXMmJm0mJm0uRmQodGhpcy5JYS51cmwpJiZtLmRkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5IcygiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxtLmdhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5nYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9Zi5yZWFkeVN0YXRlJiZjKGYpfS5iaW5kKHRoaXMpfWMuVmk9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEuZGF0YTsKaWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmRmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5uZz90aGlzLk5hLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITEpOnRoaXMuTmEub3Blbih0aGlzLklhLm1ldGhvZCx0aGlzLklhLnVybCwhMCksdGhpcy5LZ3x8KHRoaXMuTmEud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGsmJmsudnBhaWQmJm0mJm0uT2ModGhpcy5JYS51cmwpJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuTmEuc2VuZChhKX1jYXRjaChjKXttJiYKbS5GZCh0aGlzLklhLnVybCk/bS5kZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmYudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkZkKHRoaXMuSWEudXJsKSx0aGlzLlRmJiZ0aGlzLlRmKCl9cmV0dXJuIHRoaXMuTmF9fX0pKGMpO3ZhciBoYj1jLlZpfHxoYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnVkPXRoaXMuZWI9bnVsbDt0aGlzLlZuPXRoaXMubmI9dGhpcy5MZj0hMTt0aGlzLnVhPSIiO3RoaXMuR2Y9ITE7dGhpcy56YT10aGlzLkpjPSIiO3RoaXMuQ2Y9dGhpcy5ZPXRoaXMuaXNFbmFibGVkPXRoaXMuWmQ9ITE7dGhpcy5NYT1bXTt0aGlzLnRmPXRoaXMuRmI9IiI7dGhpcy55ZD0hMTt0aGlzLmtlPTA7dGhpcy55ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5zYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7CnRoaXMuaGM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMueGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMub2I9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMubGU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5DZD0hMTt0aGlzLkluPXRoaXMuZWQ9bnVsbDt0aGlzLmZjPXRoaXMuQWc9dGhpcy5uZT10aGlzLmRkPXRoaXMudmQ9dGhpcy5qYz0hMTt0aGlzLlBhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfX1jLldpPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmViLGFkdGFncmVnZXg6dGhpcy51ZCxqc3BvcHVwczp0aGlzLkxmLHNpZGVsb2Fkczp0aGlzLm5iLGRpc2FibGV0ZXN0czp0aGlzLlZuLGhvbWFkQWxpYXM6dGhpcy51YSwKaXNJbml0aWFsaXplZDp0aGlzLkdmLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnphLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5DZixzZXJ2ZXI6dGhpcy5NYSxzdm1Db25maWc6dGhpcy5GYixob21hZEFkcGF0aDp0aGlzLnRmLGRpc2FibGVDb29raWVUZXN0OnRoaXMueWQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMua2UsSE9NQURfVkVSSUZJRUQ6dGhpcy55ZSxIT01BRF9CTE9DS0VEOnRoaXMud2UsSE9NQURfTk9CTE9DS0VSOnRoaXMuc2IsSE9NQURfQURCTE9DS0VSOnRoaXMuaGMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLnhlLHRlc3RIaWRlOnRoaXMuSGIsdGVzdFRhZ3M6dGhpcy5vYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMubGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5DZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkluLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLmpjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy52ZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5kZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5uZSxjb25maWdGYWlsdXJlczp0aGlzLlBhLHNpdGVDb25maWc6dGhpcy5FYixzZXJ2ZXJJZDp0aGlzLmZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5TYix2cGFpZDp0aGlzLmZjfX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuUGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5QYVtiXSYmMT09dGhpcy5QYVtiXSYmKGE9ITApO3JldHVybiBhfSxjZTpmdW5jdGlvbihhKXt0aGlzLlBhW2FdPSEwfSxicDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYxPT10aGlzLlBhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LFpzOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhOwphPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLmxuKGEpfSxUYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZj0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuT2MoYSk7Zj10aGlzLkthKGEpO2M/KHRoaXMuWmIoKT9oPWE6aD1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixrPWYucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMuYWUoKSxrPWYucGF0aC5zdWJzdHIoMSkrCihmLnF1ZXJ5PyI/IitmLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuT2J8fHRoaXMuZWJ8fHRoaXMudWQpJiYoaz10aGlzLlNxKGspKTthPW5ldyB6KGgpO2EudXJsPWg7aD0iIjtoPWM/Zi5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuY3AoZi5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxPYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuWmIoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuTWEmJnRoaXMuTWEubGVuZ3RoJiYwPHRoaXMuTWEubGVuZ3RoJiYoYj10aGlzLk1hWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuT2MoYSk7cmV0dXJuIGJ9LGNwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSwKYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5idjtyZXR1cm4ibm9uZSJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWFbdGhpcy5mZ119LGFlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5MYygpLGI9dGhpcy5qZygobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxTcTpmdW5jdGlvbihhKXt0aGlzLk9iJiYoYSs9dGhpcy5PYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7cmV0dXJuIGF9LGM6ZnVuY3Rpb24oYSxiLGQsYyxmLGgpe209dGhpczt0aGlzLkdmPSEwO3RoaXMuSmM9YTt0aGlzLnphPWI7dGhpcy5aZD1kO3RoaXMuZWQ9Yzt0aGlzLkJjPWY7dGhpcy5FYj0KaDt0aGlzLkZxKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnphKXRoaXMuRHEoKTtlbHNlIHRyeXt0aGlzLnphPWIoKSx0aGlzLndjKCl9Y2F0Y2goayl7dGhpcy5nYSgibm9DbGllbnRDb25maWciKX19LFphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxGcTpmdW5jdGlvbigpe3RoaXMuRmEobmV3IHoodGhpcy5KYyt0aGlzLm9jKCJnbG9iYWwiKSksdGhpcy5zcC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLndjKCl9LmJpbmQodGhpcyksITApfSxEcTpmdW5jdGlvbigpe25ldyB6KHRoaXMuemErdGhpcy5vYygiY2xpZW50IikpO3RoaXMuRmEobmV3IHoodGhpcy56YSt0aGlzLm9jKCJjbGllbnQiKSksdGhpcy53Yy5iaW5kKHRoaXMpLApmdW5jdGlvbigpe3RoaXMuY2UoImNsaWVudCIpO3RoaXMuZ2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LG9jOmZ1bmN0aW9uKGEpe3ZhciBiPSI/Y2FjaGU9Iit0aGlzLmtiKCk7dGhpcy5FYiYmdGhpcy5FYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuRWImJnRoaXMuRWIubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxnYTpmdW5jdGlvbihhKXtpZighdGhpcy52ZCl7dGhpcy52ZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuQ2Y9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndlKSk7dGhpcy5yYigpO2YuVGIobC5Ocik7KGI9Zi5vZih0aGlzLkxjKCkpKXx8KGI9Zi5vZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sc3A6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnphfHx0aGlzLkZifHx0aGlzLnVhfHx0aGlzLndjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX19LHdjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnphfWVsc2UgYT10aGlzLnphO3RoaXMuaXNFbmFibGVkPXRoaXMuSmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuTWE9YS5zZXJ2ZXJ8fFtdO3RoaXMuRmI9YS5jb25maWd8fCIiO3RoaXMudWE9YS5hbGlhc3x8bnVsbDt0aGlzLnRmPWEuYWRwYXRofHwiIjt0aGlzLnlkPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuZmc9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuTWEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5GYiYmdGhpcy51YSYmdGhpcy5NYS5sZW5ndGg/dGhpcy5RYyghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX0sUWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9Cm5ldyB6KHRoaXMuYWUoKSksYz10aGlzLkthKHRoaXMuRmIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5GYit0aGlzLm9jKCJjdXN0b21lciIpKTt0aGlzLkZhKGIsdGhpcy5hdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiY3VzdG9tZXIiKTthP3RoaXMuYWw/dGhpcy5nYSgibm9TVk1Db25maWciKToodGhpcy5hbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuUWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGF0OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5kZD0KdGhpcy5KYihiLnN0cmljdCk7dGhpcy5uZT10aGlzLkpiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkFnPWIuZHVyYXRpb25fY2hlY2tfZW5hYmxlZHx8ITE7dGhpcy5TYj10aGlzLkpiKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuSGI9Yi50ZXN0aGlkZXx8IiI7dGhpcy5vYj1iLnRlc3RhZHRhZ3N8fFtdO3RoaXMuSWI9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PYj1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmViPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnVkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLkxmPWIuanNwb3B1cHN8fCExO3RoaXMubmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuZmM9Yi52cGFpZHx8ITE7dGhpcy5FYi52cGFpZD10aGlzLmZjO3RoaXMuR2I9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMubXAoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnlkJiYodGhpcy5HYj1udWxsKTt0aGlzLmxlPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuQ2QmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkNkPSEwLHRoaXMuUWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMudHQoKSYmKHRoaXMuSGJ8fHRoaXMuSWJ8fHRoaXMub2J8fHRoaXMuR2IpP3RoaXMuWmQ/KHRoaXMub2E9dGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy53ZCgpLHRoaXMucmIoKSk6dGhpcy5qdCgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmt0KCkpfX0sanQ6ZnVuY3Rpb24oKXt0aGlzLml0KCl9LGt0OmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSk7dGhpcy5yYigpfSxjZDpmdW5jdGlvbihhKXt0aGlzLmpjPQohMDt0aGlzLll8fCh0aGlzLlk9dGhpcy5vYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEoYSkpLHRoaXMucmIoKSx0aGlzLndkKCkpfSxpdDpmdW5jdGlvbigpe2lmKHRoaXMuSGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZSl7fWE/dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMucWcoKX1lbHNlIHRoaXMucWcoKX0scGc6ZnVuY3Rpb24oKXt2YXIgZTt2YXIgYztmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoKSk7dGhpcy5udChlLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuaWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmNkKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX10aGlzLm9iPW51bGwsdGhpcy5pZSgpfSxudDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZSgpe2YoKSYmYigpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dGhpcy5GYShuZXcgeihhKSxlLGZ1bmN0aW9uKCl7ZigpJiZjKCl9KX0scWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLmtiKCkpO3RoaXMub3QoZSwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBnLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLkliJiZ0aGlzLkliLmxlbmd0aCl7dmFyIGM9dGhpcy5JYi5zbGljZSgpLGU7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnBnKCl9LG90OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBlKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZigpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZmKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1lO2wub25lcnJvcj1mO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobSl7ZSgpfX0saWU6ZnVuY3Rpb24oKXt0aGlzLkdiPyh0aGlzLmtlKyssdGhpcy5GYShuZXcgeih0aGlzLkdiKSx0aGlzLmh0LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMub2coKX0samU6ZnVuY3Rpb24oYSl7dGhpcy5jZCh0aGlzLnhlLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saHQ6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMua2U/dGhpcy5pZSgpOnRoaXMuamUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5vZygpOnRoaXMuamUoIkFBQSIpfSxvZzpmdW5jdGlvbigpe3RoaXMuWT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy5zYikpO3RoaXMucmIoKTt0aGlzLndkKCl9LHJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO2YuWGEoKSYmKGE9IjEiKTt0aGlzLmpjJiYoYj0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy55ZSkpO3RoaXMuZWQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZCYmdGhpcy5lZCgpfSxGbjpmdW5jdGlvbigpe2lmKHRoaXMubmUmJnRoaXMuenAoKSl7dmFyIGE9dGhpcy5icCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sdGc6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9CiJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRmE6ZnVuY3Rpb24oYSxiLGMsZSxoLEljKXthPW5ldyBoYihhLGIsYyk7ZSYmKGEuS2c9ITApO2gmJmYubnEoKSYmKGEuZGY9ITApO0ljJiYoYS5uZz0hMCk7cmV0dXJuIGEubG9hZCgpfSxPZTpmdW5jdGlvbigpe2YuWGEoKXx8Zi5ZYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZT0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5nYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7ZT0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLlpiKCl8fChhPXRoaXMuS2EoZSksZT1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZSl9ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sRW46ZnVuY3Rpb24oKXt0aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkZhKGEsdGhpcy5WdC5iaW5kKHRoaXMpLHRoaXMuVXQuYmluZCh0aGlzKSl9LFZ0OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7cmV0dXJufWN8fHRoaXMuem8oKX0sVXQ6ZnVuY3Rpb24oKXt9LHpvOmZ1bmN0aW9uKCl7Zi5UYihsLnlvKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx3ZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm5iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMubmIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5uYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZi5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKX19LHR0OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMubGV9LG1wOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCwKYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHdiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGUsZixoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8ZT4+NCxrPShlJjE1KTw8MnxmPj42LGw9ZiY2Myxpc05hTihlKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxLYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgYz17fSxlPTE0O2UtLTspY1tiW2VdXT1hW2VdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsZixoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGU9MDtlPG4tMztlKz00KWY9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsxKTw8MTZ8YS5jaGFyQ29kZUF0KGUrMik8PDh8YS5jaGFyQ29kZUF0KGUrMykseS5wdXNoKGYpOwpzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHkucHVzaChlKTsxNCE9eS5sZW5ndGglMTY7KXkucHVzaCgwKTt5LnB1c2gobj4+PjI5KTt5LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT15W2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09YyhoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtmPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihlPTA7MTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8fm4mdykrdCtoW2VdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtmb3IoZT0yMDszOT49ZTtlKyspeD1jKGYsNSkrKG5ecF53KSt0K2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZixmPXg7Zm9yKGU9NDA7NTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8biZ3fHAmdykrdCtoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsZj14O2ZvcihlPTYwOzc5Pj1lO2UrKyl4PWMoZiw1KSsobl5wXncpK3QraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtrPWsrZiY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGliPWMuV2l8fGliLG09bmV3IGliO3dpbmRvdy5ndj1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMTBdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuRXA9dGhpcy5hWzRdO3RoaXMuYWs9dGhpcy5hWzJdO3RoaXMuT3Q9dGhpcy5hWzZdO3RoaXMuVnA9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19Yy5wcj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY2s6dGhpcy56dChhKX0senQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkF0OnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRXA6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFrOnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpOwp2YXIgamI9Yy5wcnx8amIsWGM9bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuYmsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5qPWE7YS51Lks/dGhpcy5MYT1hLnUuSygpOnRoaXMuTGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5qLlFhO3RoaXMucGxheWVyPXRoaXMuai51O3RoaXMucmM9ITE7dGhpcy5qbj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmJkPXt9O3RoaXMucGM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5wYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmoudSkmJnRoaXMuai51LkImJihhPXRoaXMuai51LkIoKSksdGhpcy5wYz1jLmFkbWVzc2FnZShhKSkpOwpjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuSW09Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5hZD0hMTt0aGlzLk5mPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLnM9e307dGhpcy5uYz0hMTt0aGlzLndnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuWWI9ITE7dGhpcy5Sbj1mLnBhKDEwKTt0aGlzLlRjPWYucGEoMTApO3RoaXMuUGQ9Zi5wYSgxMCk7dGhpcy5rZz1mLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkFiPSExO3RoaXMuemQ9bnVsbDt0aGlzLkFjPXRoaXMubGc9dGhpcy5VZj10aGlzLkVjPXRoaXMud3Q9dGhpcy5hYj0hMX1jLlFpPWI7Yi5wcm90b3R5cGU9e2dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuTGFdJiYKdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSx1ZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5FYSYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULmpjP2YudHJhY2soImFkY2FsbCIsIjEiKTpmLnRyYWNrKCJhZGNhbGwiLCIwIik7Zi50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2YuRChsLnVtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSl9LEpkOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmFiPWM7aWYodGhpcy5ULlkpdGhpcy5ULkZuKCksdGhpcy5ULm9hJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5mY30pKTpiPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLlQuZmMsCnVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5BYSgpO2Vsc2V7dmFyIGU9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5KZChhLGIsYyl9LDUwKX19LFZkOmZ1bmN0aW9uKGEpe3RoaXMuRWM9ITE7dGhpcy5zPWE7dGhpcy5Qcyh0aGlzLnMpO3RoaXMucGYoYSl9LHBmOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLmJkPXRoaXMub3AoYSkpLHRoaXMucGYoYS5wYXJlbnQpKX0sb3A6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxlPVtdLGY9W10saD0iIjtpZihhLmFhKXtiPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtlPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5hYS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuYWEuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSk7YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmCihoPWEuYWEuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGUubGVuZ3RoO2srKyllW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZVtrXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGgpKSxlW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS55YihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZixhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQ2MmJmEuQ2MuZXJyb3ImJmEuQ2MuZXJyb3IuY29kZSYmKGI9YS5DYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmdjLmNvZGU6Yj09Qy5qZC5jb2RlPwpmLkQobC5zdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpOihmLktkKCksYj09Qy5CZS5jb2RlJiZmLkQobC5acSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKTtmLkQobC54byx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHguemUuY29kZTpmLkQobC5XdCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguQ2UuY29kZTpmLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtmLkQobC5CdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LmtkLmNvZGU6Zi5EKGwuR3UsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmhkLmNvZGU6Zi5EKGwuJHEsCnRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksZi50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChmLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7Zi50cmFjayhjLCIiLCEwKTt0aGlzLnhiKGEpO3RoaXMuQWEoKX0seGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLnlhLmxlbmd0aDspdHJ5e3ZhciBjPWEueWEucG9wKCk7dGhpcy5JZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZSl7fX0sUHM6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJgooYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWI7Yj10aGlzLmouQztiLnp2PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5JbSYmdGhpcy5wbGF5ZXIuSGMoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkhjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuQ20oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLnNnKGIpPyh0aGlzLkVtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLAp0aGlzLmNhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmNhLmFwcGVuZENoaWxkKGIpKTp0aGlzLnMuTW4oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLk5zKCkpOnRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5zLm9yaWdpbi4kZSh4LmhkKX0sTnM6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2E9YS5yZXBsYWNlKC8mYW1wOy9nLCImIik7YT1hLnJlcGxhY2UoLyZsdDsvZywiPCIpO2E9YS5yZXBsYWNlKC8mZ3Q7L2csIj4iKTtyZXR1cm4gYT1hLnJlcGxhY2UoLyZxdW90Oy9nLCciJyl9Zi5TZSgpO3RoaXMucyYmdGhpcy5zLm9yaWdpbiYmdGhpcy5zLm9yaWdpbi50ZSYmCmYuRm0odGhpcy5zLm9yaWdpbi50ZSk7Zi4kYSgic2V0VXBWcGFpZCIpO3ZhciBiPXRoaXMuai5DO3RoaXMuai5DPUIucG9wKCk7Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmouQyxiKTt0aGlzLmouVmYoKTt0aGlzLmouY2MoKTtmb3IoYj10aGlzLmouRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5qLmNjKCk7dGhpcy5YPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7CnRoaXMuai5HLmFwcGVuZENoaWxkKHRoaXMuWCk7dGhpcy5YLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBiPXRoaXMucy5xcCgpLGM9YSh0aGlzLnMuUC5PcmlnaW5hbEFkUGFyYW1ldGVycyksZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmouRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLmhlaWdodCl9fX07Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLApnKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2I9Zi55bigiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuVCk7dGhpcy5YLnNyYz1iO2YucmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJnRoaXMubnUoKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJnRoaXMub3UoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJ1KCksIkFkVmlkZW9Db21wbGV0ZSI9PQphLmRhdGEubmFtZSYmdGhpcy5xdSgpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5wdSgpKX0uYmluZCh0aGlzKSk7Zi5yZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpKTtmLnJkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSl9LG91OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iil9LG51OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2YuJGEoImltcHJlc3Npb24iKX0sSGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2YuJGEoInN0YXJ0Iil9LEdnOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2YuJGEoImZpcnN0UXVhcnRpbGUiKX0scnU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7Zi4kYSgidGhpcmRRdWFydGlsZSIpfSxxdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNvbXBsZXRlIik7CmYuJGEoImNvbXBsZXRlIil9LHB1OmZ1bmN0aW9uKCl7Zi4kYSgiYWRzdG9wcGVkIik7dGhpcy5BYSgpfSxDbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBlPWIsZj10aGlzLlQ7Zi5vYSYmZi5pc0VuYWJsZWQmJiFmLlpiKCk/KGU9Zi5LYShlKSxiPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTpiPWU7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmV1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxFbTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMucmUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5wZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmZkLmJpbmQodGhpcykpfSxYYzpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LEZnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW8uY29udHJvbHM9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFlKGEpfS5iaW5kKHRoaXMpLHRoaXMuam4pfSxxZTpmdW5jdGlvbihhKXt0cnl7aWYoIWYuWGEoKSYmCnRoaXMuVC5BZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQWJ8fCh0aGlzLkFiPSEwLHRoaXMuWGModGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMucmN8fCF0aGlzLnNnKHRoaXMudmlkZW8pfHx0aGlzLkFifHwodGhpcy5yYz0hMCx0aGlzLmR1KCksdGhpcy52aWRlby5jb250cm9scz0hMSx0aGlzLmouY2MoKSx0aGlzLkNnKCksdGhpcy5EZygpLHRoaXMuTWUoKSx0aGlzLmouVmYoKSx0aGlzLnZpZGVvLnBsYXkmJnRoaXMuaGUoKSl9LGhlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZi5FYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5LYz1bXTtmb3IodmFyIGI9CnRoaXMuai5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLktjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5vZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTsKdmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2YudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtmLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMub2QoKX1lbHNlIHRoaXMub2QoKX0sb2Q6ZnVuY3Rpb24oKXtpZih0aGlzLktjKWZvcih2YXIgYT0wO2E8dGhpcy5LYy5sZW5ndGg7YSsrKXRoaXMuS2NbYV0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChhPXRoaXMudmlkZW8ucGxheSgpKSYmYVsiY2F0Y2giXSlhWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWEoKSxmLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsIiIsITApKX0uYmluZCh0aGlzKSk7WT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQmIuYmluZCh0aGlzKSkpOkg9ZnVuY3Rpb24oKXt0aGlzLm5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5oZSgpKX0uYmluZCh0aGlzKTt0aGlzLm5mKCkuaGcodGhpcyl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtmLkQobC5wbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMucy52Yj8odGhpcy5yYz0hMSx0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuYWQ9ITEsdGhpcy5qLnlnKCksdGhpcy5zLm9yaWdpbi5RZCgpKTp0aGlzLkFhKCl9LGV1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5mZChhKSl9LGZkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkVkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuT2UoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5PZSgpKTt0aGlzLnMub3JpZ2luLiRlKHguaGQpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMud3QpdGhpcy5BYSgpO2Vsc2V7dGhpcy5ZYj0hMDt0aGlzLmoudS5qYiYmIXRoaXMubGcmJnRoaXMuai51LmpiKCkmJmYuRChsLnljLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTsKdGhpcy5CdChhKTt2YXIgYj0iIjtpZih0aGlzLnMuZ2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMua2cpO2MmJihiPXRoaXMucy5nZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5hZHx8KHRoaXMuYWQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7Zi5EKGwudm0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTt0aGlzLnMudmI/KHRoaXMucmM9ITEsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmFkPSExLHRoaXMuai55ZygpLHRoaXMucy5vcmlnaW4uUWQoKSk6dGhpcy5BYSgpfS5iaW5kKHRoaXMpKSkpLApjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMubmM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwKImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5pcCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmouY2MoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuRWcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuQ2coKTt0aGlzLkRnKCk7dGhpcy56ZD1zZXRJbnRlcnZhbCh0aGlzLkRuLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0saXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZT1iPXRoaXMucy5NW2NdLGY7Zj1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmCmguaXNFbmFibGVkJiYhaC5aYigpJiYoZj1oLkthKGYpLGY9Zi5wcm90b2NvbCsiOi8vIitmLmhvc3QpO2UudXJsPWY7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sRG46ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLnpkKSx0aGlzLnBlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMucmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuemQpLHRoaXMuZmQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSx2ZzpmdW5jdGlvbigpe3RoaXMuVWZ8fCh0aGlzLlVmPSEwLHRoaXMuRWN8fApmLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sQnQ6ZnVuY3Rpb24oYSl7YT09dGhpcy53Z3x8dGhpcy5BYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy52ZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZmLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5BYnx8Zi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGYuWGEoKSYmZi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLApmLkQobC5ybSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpLGYuRChsLndtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy5SYiYmZi50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5FYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGYuRChsLnFtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLkQobC50bSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsCiJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGYuRChsLnltLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGYuRChsLnptLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy53Zz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5BYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnBwKHRoaXMucy55YSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBlPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmJkLmltcHJlc3Npb25zJiZmLmpxKGUudXJsLHRoaXMuYmQuaW1wcmVzc2lvbnMpP3RoaXMuSWQoZS51cmwsZS50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpOwpmLkQobC5zbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkse2FkSWQ6dGhpcy5iZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSWQoZS51cmwsZS50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMucy55YT10aGlzLlRuKHRoaXMucy55YSxhKSl9fSxJZDpmdW5jdGlvbihhLGIsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuVGEoYSksYyYmYS5CbShjKSxlfHwoZT10aGlzLlplKSx0aGlzLlQuRmEoYSxlLHRoaXMuWmUsITEsITApKX0scHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxUbjpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxkdTpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5FZy5iaW5kKHRoaXMpfSwKRWc6ZnVuY3Rpb24oKXtmLkQobC5Mbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5FYyYmZi5YYSgpJiZmLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZi5YbygpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMudmN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnZjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsCmEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Sbjt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuVGM7Yi5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnl0LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMueHQuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLlpjLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLnRvcD0iLTUwcHgiLGUuc3R5bGUucmlnaHQ9IjBweCIsZS5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtlLmlkPXRoaXMua2c7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2UuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7ZS5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMuZ2UmJmEuYXBwZW5kQ2hpbGQoZSk7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LldhJiZ0aGlzLmoudS5XYSgpJiZ0aGlzLlZxKCk7dGhpcy5XYigpfX0sV2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxaYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSx5dDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVGMpO3RoaXMuai5DLnBhdXNlZD8KKHRoaXMuai5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSk6KHRoaXMuai5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLkQobC5IZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sVGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlRjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5EKGwuSGUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHNzOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLAphLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHh0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWQ/KHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGYudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LFZxOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLAp0aGlzLnRyYWNrKCJtdXRlIiwhMCksZi50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxCYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYik7dGhpcy5BY3x8dGhpcy5uY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuaGUoKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5BYz0hMDt0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1mLkVhJiZ0aGlzLm5jfHwicG9zdHJvbGwiPT1mLkVhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShmLkVhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiYKYSl7Zm9yKHZhciBiPXRoaXMuai5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmouY2MoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy54ZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7CmYudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7Zi50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy54ZCgpfWVsc2UgdGhpcy54ZCgpfSx4ZDpmdW5jdGlvbigpe3RoaXMubGc9ITA7dGhpcy5qLnNmKCk7dGhpcy5qLnRzKCk7dGhpcy5ZYj0hMTtmLkQobC5Rbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMubmYoKS5xcygpfSxuZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxFZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYKKGE9ITApfXJldHVybiBhfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihmLkVmKHRoaXMudmlkZW8sYSk/dGhpcy5zcygpOnRoaXMuVGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKX0uYmluZCh0aGlzKSwxMDApKX0sUzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy52YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy52Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLlFpfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVvPXRoaXMuYVs2XTt0aGlzLmtyPXRoaXMuYVs5XTt0aGlzLmFqPQp0aGlzLmFbOF07dGhpcy5hcz10aGlzLmFbN107dGhpcy5BbD10aGlzLmFbN107dGhpcy5Kaj10aGlzLmFbN107dGhpcy5QcD10aGlzLmFbNF07dGhpcy5paj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLndzPWI7Yi5wcm90b3R5cGU9e2NvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3I6dGhpcy4kaShhKX0sJGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFqOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hczp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQWw6dGhpcy5JaihhKX0sSWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkpqOnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5QcDp0aGlzLmhqKGEpfSxoajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaWo6dGhpcy5mKGEpfSwKZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIga2I9Yy53c3x8a2IsWWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuY28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5KYT1udWxsO3RoaXMuYmE9W107dGhpcy5hYT1udWxsO3RoaXMuTWI9ITE7dGhpcy50ZT0iIjt0aGlzLnNlPSExO2QmJmQuZW1wdHk/dGhpcy5KcSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLkhsPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLldlKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMPwpuZXcgeih0aGlzLnVybCk6bS5UYShtLlpzKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO3RoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmKGIuZGF0YS5ob21hZF9jb21wYXRpYmxlX3ZwYWlkPSJ0cnVlIik7bS5GYShiLHRoaXMuSXEuYmluZCh0aGlzKSx0aGlzLkVxLmJpbmQodGhpcykpfSxmZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuRWEpdHJ5e3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChlKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLkVhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5FYSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PQpnLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZ1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1lLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LElxOmZ1bmN0aW9uKGEpe3RoaXMuanMoYSk7dHJ5e3RoaXMuSmE9YS5yZXNwb25zZVhNTCx0aGlzLkphfHwodGhpcy5KYT0KKG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sSnE6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sRXE6ZnVuY3Rpb24oKXt0aGlzLmZhKHRoaXMuQmEoeC56ZSx7ZGVwdGg6YX0pKX0sUmM6ZnVuY3Rpb24oKXt0aGlzLmFhPQp0aGlzLmJhLnNoaWZ0KCk7dGhpcy5wcSgpP3RoaXMucHQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5xZigpLGcpKTp0aGlzLmZhKHRoaXMuQmEoeC5DZSkpOihhPTAsdGhpcy5TdCgpJiZ0aGlzLlZkKHRoaXMuU24oKSkpfSxRZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5SYygpKTp0aGlzLnBhcmVudC5RZCgpfSxTdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm10KCk/dGhpcy5sdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5CYSh4LnZlKSk6dGhpcy5mYSh0aGlzLkJhKHguTGgpKSwhMSk6KHRoaXMuZmEodGhpcy5CYSh4LmdjLEMuQmUpKSwhMSl9LFZkOmZ1bmN0aW9uKGEpe2EueWE9YS55YS5jb25jYXQodGhpcy5NZCgpKTthLnZiPWEudmI/YS52Yjp0aGlzLk1iO3RoaXMucGFyZW50LlZkKGEpfSxTbjpmdW5jdGlvbigpe3ZhciBhPW5ldyBsYjthLmR1cmF0aW9uPXRoaXMuVWIoKTthLk09dGhpcy5sZigpOwphLnZjPXRoaXMuWW8oKTthLm9yaWdpbj10aGlzO2EuUD10aGlzLlZvKCk7YS5nZT10aGlzLm5wKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLmFhJiYoYi55YT1iLmVycm9yLmNvZGUhPXgudmUuY29kZT9iLnlhLmNvbmNhdCh0aGlzLiRvKCkpOmIueWEuY29uY2F0KHRoaXMuZ3AoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQueGImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC54YiYmdGhpcy5wYXJlbnQueGIoYiksYT0wLHRoaXMuUmMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5mYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx4YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC54YihhKX0sJGU6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQmEoYSxiKSl9LEJhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG1iKGEsYik7Yy5vcmlnaW49dGhpczsKcmV0dXJuIGN9LHB0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sbXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxmKCkubGVuZ3RofSxsdDpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0scmc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sanM6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRlPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy5zZT1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxwcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMucWYoKS5sZW5ndGh9LHFmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuanAodGhpcy5hYSwiVkFTVEFkVGFnVVJJIil9LApNZDpmdW5jdGlvbigpe2Zvcih2YXIgYT1bIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZShnKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnliKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sZ3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sJG86ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFlvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWIodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksc2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLGV2OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnliKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnNjKS1NYXRoLmFicyg3MDAtYi5zYyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksYj1nLmNvbmNhdChkKX1jYXRjaChmKXt9cmV0dXJuIGJ9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtkPWI9dGhpcy5yZihhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1nLnB1c2goYyk7Zi5wdXNoKGQpfTE8YS5sZW5ndGg/KGI9ZyxoPWQpOihiPWMsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sVWI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy55Yih0aGlzLmFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sbnA6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGUpdHJ5e2M9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZz1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5WcyhnLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGQpe2I9ITF9cmV0dXJuIGJ9LGpwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy55YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHliOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmYoYSk6IiJ9LApyZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnJwKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5IbHx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbT10aGlzLmFbMTBdO3RoaXMudm49dGhpcy5hWzldO3RoaXMuZWo9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMl19Yy5RZz1iO2IucHJvdG90eXBlPXtjbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZG06dGhpcy51bihhKX0sdW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuZGooYSl9LGRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5lajp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIG5iPWMuUWd8fG5iLFpjPW5ldyBuYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1aYy5jbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLnlhPVtdO3RoaXMuTT1bXTt0aGlzLnZjPSIiO3RoaXMuUD10aGlzLnZiPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Naz1iO2IucHJvdG90eXBlPXtNbjpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxxcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIGxiPWMuTWt8fGxiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVs2XTt0aGlzLnVwPXRoaXMuYVs4XTt0aGlzLmdoPXRoaXMuYVs1XTt0aGlzLmdqPXRoaXMuYVs0XTt0aGlzLmloPXRoaXMuYVs0XTt0aGlzLnlqPXRoaXMuYVszXTt0aGlzLnRpPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs2XTt0aGlzLkdsPQp0aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLm1pPWI7Yi5wcm90b3R5cGU9e2ZuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nbjp0aGlzLnRwKGEpfSx0cDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudXA6dGhpcy5maChhKX0sZmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmdoOnRoaXMuZmooYSl9LGZqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5najp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWg6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnlqOnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50aTp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVHA6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTsKdmFyIG9iPWMubWl8fG9iLCRjPW5ldyBvYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PSRjLmZuKDQpO3ZhciB4PXtrZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixrYToiWE1MX1BBUlNFX0VSUk9SIn0sTGg6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLGthOiJEVVJBVElPTl9FUlJPUiJ9LGdjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixrYToiRU1QVFlfVkFTVCJ9LENlOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsCm1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixrYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0semU6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsa2E6IkxPQURfRVJST1IifSxoZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLAptZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sVXU6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsa2E6Ik1FRElBRklMRV9FUlJPUiJ9LHZlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLGthOiJEVU1NWV9BRCJ9fSxDPXtBZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLGthOiJOT19BRFMifSxCZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsa2E6Ik5PX01FRElBRklMRVMifSxXdTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIiwKa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5WbT10aGlzLmFbM107dGhpcy5RdT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs1XX1jLlpnPWI7Yi5wcm90b3R5cGU9e1VtOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5WbTp0aGlzLlB1KGEpfSxQdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy5aZ3x8cGIsYWQ9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9CmFkLlVtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuQ2M9Yjt0aGlzLnlhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy53aT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1iPWMud2l8fG1iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldrPXRoaXMuYVs5XTt0aGlzLmc9dGhpcy5hWzhdfWMuJGs9YjtiLnByb3RvdHlwZT17Vms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLldrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy4ka3x8cWIsYmQ9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YmQuVmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSwKYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuUWE9YS5nZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9Zi5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuUmE9e307dGhpcy5JZj0hMTt0aGlzLnZmPVtdfWMuUGg9YjtiLnByb3RvdHlwZT17bHA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGY9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2Y9e3g6ZSx5OmJ9O2YucG9zaXRpb249YztyZXR1cm4gZn0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5scChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZj10aGlzLmhxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2YmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7aD17eDpiLHk6Y307ZSYmKGgucG9zaXRpb249ZSk7cmV0dXJuIGh9LCRzOmZ1bmN0aW9uKCl7dGhpcy5JZj0hMH0sCnlnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxWZjpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpO2YuRChsLnljLHRoaXMudS5CKCkpfSx0czpmdW5jdGlvbigpe3RoaXMuSWZ8fCh0aGlzLnUucGxheSgpLGYuRChsLnpjLHRoaXMudS5CKCkpKX0sY2M6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMudS5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLlFhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5RYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlFhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuUWEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5RYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5RYSk7dGhpcy51LkRiJiZ0aGlzLnUuRGIoKT90aGlzLnUuZ2YoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVmLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMudS5leGl0RnVsbHNjcmVlbigpfSxocTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFpvOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sdWY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5abyh0aGlzLlFhKTtpZihiLnghPXRoaXMuUmEueHx8Yi55IT10aGlzLlJhLnl8fGIucG9zaXRpb24hPXRoaXMuUmEucG9zaXRpb258fGIud2lkdGghPXRoaXMuUmEud2lkdGh8fGIuaGVpZ2h0IT10aGlzLlJhLmhlaWdodHx8YSl7aWYoMDx0aGlzLlJhLndpZHRoJiYwPHRoaXMuUmEuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5zZigpO3JldHVybn10aGlzLlJhPWI7dGhpcy51LkRiKCk/KHRoaXMuRy5zdHlsZS5sZWZ0PQoiMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5DLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMudmYubGVuZ3RoO2ErKyl0aGlzLnZmW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWYuYmluZCh0aGlzKSwxMCl9LHNmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTsKZm9yKHZhciBOPWMuUGh8fE4sQj1bXSxyYj0wOzEwMD5yYjtyYisrKXt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO0wuc3R5bGUuZGlzcGxheT0iYmxvY2siO0wuaWQ9Zi5wYSgxMCk7TC5jb250cm9scz0hMDtCLnB1c2goTCl9dmFyIEg9ITEsWT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNuPXRoaXMuYVsxMF07dGhpcy51az10aGlzLmFbNF07dGhpcy5PbD10aGlzLmFbNV07dGhpcy5FaD10aGlzLmFbNl07dGhpcy5vaz10aGlzLmFbNV07dGhpcy5JaD10aGlzLmFbOV07dGhpcy5pcj10aGlzLmFbN107CnRoaXMuaGw9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbN119Yy5NdD1iO2IucHJvdG90eXBlPXtibjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY246dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnVrOnRoaXMuTmwoYSl9LE5sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT2w6dGhpcy5EaChhKX0sRGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkVoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vazp0aGlzLkhoKGEpfSxIaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSWg6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlyOnRoaXMuZ2woYSl9LGdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNiPWMuTXR8fHNiLGNkPW5ldyBzYigxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5ibig0KTsoZnVuY3Rpb24oYyl7Yy53az1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5PKGEpO3RoaXMuZmUoYik7dGhpcy5YZSgpfSxmZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sWGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkNhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5SKGEpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkNhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD0KYy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIHRiPWMud2t8fHRiOyhmdW5jdGlvbihjKXtjLnZrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj1aKCk7dGhpcy51Yj10aGlzLnVifHwhMTt0aGlzLkdlPXRoaXMuSmU9dGhpcy56Zj10aGlzLmlhPXRoaXMubWU9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5IbyhhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMubWU9ITA7dGhpcy56ZiYmdGhpcy5SZSgpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLlliJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLnpmPSEwO3RoaXMuUmUoKX0uYmluZCh0aGlzKSk7dGhpcy5OZSgpfSxSZTpmdW5jdGlvbigpe2lmKCF0aGlzLnViKXt0aGlzLnRjKCk7aWYoIXRoaXMubWUmJiF0aGlzLnRjKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5tZSYmdGhpcy5HZSYmIXRoaXMuSmUmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCl9fSx0YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sCm1mOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LE5lOmZ1bmN0aW9uKCl7aWYodGhpcy50YygpKXt2YXIgYj10aGlzLm1mKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuSmU9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5HZT1iLmF2fXRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5lKCl9LmJpbmQodGhpcyksMTAwKX0saHY6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IudXYoKTohMX0sVWI6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj8KYi5VYigpOi0xfSxocDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxIbzpmdW5jdGlvbihiLGEpe3RoaXMudWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy51Ynx8MzAyPT10aGlzLnViP3RoaXMuaWE9ITA6dGhpcy5sKCJhZGVycm9yIix0aGlzLnViKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfSx4YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5pYT8odGhpcy5tKCksdGhpcy5uYSgpKTpiLk5jKCk/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuaHAoYik/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHViPWMudmt8fHViOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sb3E6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWsua20uaW0/d2luZG93Lk9PLlFrLmttLmltLlp1KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9xKCl9LDEwMCl9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPTE1MDA7dmFyIGI9WigpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5EYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgdGIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IHViKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmIsd2I9bmV3IHZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpyPXRoaXMuYVsxXTt0aGlzLlNnPXRoaXMuYVszXTt0aGlzLkJvPXRoaXMuYVs2XTt0aGlzLkpwPXRoaXMuYVs2XTt0aGlzLktyPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzVdfWMueHM9YjtiLnByb3RvdHlwZT17eXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy56cjp0aGlzLlJnKGEpfSxSZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2c6dGhpcy5BbyhhKX0sQW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJvOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KcDp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuS3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZzphfX19KShjKTt2YXIgeGI9Yy54c3x8eGIsZGQ9bmV3IHhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQueXIoNCk7KGZ1bmN0aW9uKGMpe2Muc2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSwKRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sSzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgeWI9Yy5zbHx8eWI7KGZ1bmN0aW9uKGMpe2Mucmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5xZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5lcihhKX0uYmluZCh0aGlzKSk7CnkueXAoKX0sZXI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciB6Yj1jLnJsfHx6YjsoZnVuY3Rpb24oYyl7Yy50bD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuU2MmJihiPWYuVW4oYix0aGlzLlNjKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxkPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGQpdHJ5e3RmbXN1aXRlKCIjIitkKS50Zm12aWRlbygicmVzdW1lIik7dGhpcy5TY3x8KHRoaXMuU2M9W10pO3RoaXMuU2MucHVzaChiW2FdKTt2YXIgZT1uZXcgeWIoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgemIoZSx0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319fXRoaXMuSCgpfSxxZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5afHwodGhpcy5aPXt9KTt0aGlzLlpbYl18fCh0aGlzLlpbYl09e30pO3RoaXMuWltiXVthXXx8KHRoaXMuWltiXVthXT1bXSk7CnRoaXMuWltiXVthXS5wdXNoKGMpfSxxdDpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLlp8fHRoaXMuWiYmIXRoaXMuWlthXSl0aGlzLiRifHwodGhpcy4kYj1bXSksdGhpcy4kYi5wdXNoKGIpLHRoaXMucnMoKSYmKHRoaXMuY2coKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5aW2FdW2NdJiYwPHRoaXMuWlthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLlpbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLlpbYV1bY11bZF0oYil9fSx5cDpmdW5jdGlvbigpe2lmKHRoaXMuJGIpZm9yKHZhciBiPTA7Yjx0aGlzLiRiLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuJGJbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLlpbY11bZF0mJgowPHRoaXMuWltjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLlpbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLlpbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF0KGIpfX0pfSkoYyk7dmFyIEFiPWMudGx8fEFiLHk9bmV3IEFiKHEpO1goKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NaT10aGlzLmFbNV07dGhpcy56cT10aGlzLmFbM107dGhpcy5ncj10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMV07dGhpcy5zbz10aGlzLmFbMV07dGhpcy5jdT10aGlzLmFbN107dGhpcy5acD10aGlzLmFbNF07dGhpcy54cT10aGlzLmFbOF07dGhpcy5obz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX0KYy5tbj1iO2IucHJvdG90eXBlPXtMaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWk6dGhpcy55cShhKX0seXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpxOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudWo6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNvOnRoaXMuYnUoYSl9LGJ1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdTp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWnA6dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnhxOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5obzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIEJiPWMubW58fEJiLGVkPW5ldyBCYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC5MaSg0KTsoZnVuY3Rpb24oYyl7Yy56aD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LApqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuemh8fENiOyhmdW5jdGlvbihjKXtjLkFoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5Xcnx8KHRoaXMuV3I9CiEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkFofHxEYjsoZnVuY3Rpb24oYyl7Yy5CaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IENiKGQpO3RoaXMuSShmKXx8Cih0aGlzLkwoZiksKG5ldyBEYihmLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkgoKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkJofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2g9dGhpcy5hWzZdO3RoaXMuaG09dGhpcy5hWzEwXTt0aGlzLlptPXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzRdfWMuaG49YjtiLnByb3RvdHlwZT17Rmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdoOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5obTp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlptOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy5obnx8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQuRmgoNCk7KGZ1bmN0aW9uKGMpe2MuUWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LApnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sSzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBIYj1jLlFsfHxIYjsoZnVuY3Rpb24oYyl7Yy5QbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkxlfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLAoxMDApO3RoaXMuTm98fCh0aGlzLkFmKCksdGhpcy5Obz0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5MZT8odGhpcy5sKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLm8oKSk6KHRoaXMuTGU9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MDApKX0sV286ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5XbygpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMuaWE9ITAsdGhpcy5tKCksdGhpcy5uYSgpKToKKHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWYoKX0uYmluZCh0aGlzKSw1MCl9LHN2OmZ1bmN0aW9uKCl7cmV0dXJuITB9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJYj1jLlBsfHxJYjsoZnVuY3Rpb24oYyl7Yy5SbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IEhiKGIuaXRlbShhKSk7dGhpcy5JKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwKKHRoaXMuTChjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBKYj1jLlJsfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS209dGhpcy5hWzFdO3RoaXMuTW89dGhpcy5hWzNdO3RoaXMuWWg9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19Yy5ocz1iO2IucHJvdG90eXBlPXtKbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS206dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nbzp0aGlzLlhoKGEpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWWg6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBMYj1jLmhzfHxMYixnZD1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Z2QuSm0oNCk7KGZ1bmN0aW9uKGMpe2MuQWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5KJiYKKDAsdGhpcy5KKSghMCl9LmJpbmQodGhpcykpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuImthbHR1cmEifX0pfSkoYyk7dmFyIE1iPWMuQWp8fE1iOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGxvZzpmdW5jdGlvbigpe30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuY2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLnhtKCl9LmJpbmQodGhpcykpLHRoaXMuSmc9ITEsdGhpcy50dT0xRTMsdGhpcy5YZj17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLlhmLmRvbmV8fCh0aGlzLlhmLmRvbmU9ITAsdGhpcy5KZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWcoKX0uYmluZCh0aGlzKSx0aGlzLnR1KSl9LHhtOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkpnKTt0aGlzLm0oKX0sSWc6ZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLncoKSl9LGpmOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmCmJbY11bZF0uZ2V0RXJyb3JDb2RlKXt2YXIgZT1iW2NdW2RdO2JbY11bZF0uZ2V0RXJyb3JDb2RlKCk7YltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7YS5wdXNoKGUuZ2V0RXJyb3JDb2RlKCkpfXJldHVybiBhfSx2YTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuamYobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5qZih0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgTmI9Yy56anx8TmI7KGZ1bmN0aW9uKGMpe2MuQmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJgp3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGYuRGEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyl8fHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj1udWxsO3dpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxmLkRhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBNYihjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBOYihjLHRoaXMuQSkpLmIoKSkpfX10aGlzLkgoKX19KX0pKGMpOwp2YXIgT2I9Yy5Canx8T2IsUGI9bmV3IE9iKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpzPXRoaXMuYVszXTt0aGlzLkJxPXRoaXMuYVs2XTt0aGlzLnl1PXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzldfWMuUnQ9YjtiLnByb3RvdHlwZT17eXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpzOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CcTp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXU6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgUWI9Yy5SdHx8UWIsaGQ9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aGQueXMoNCk7CihmdW5jdGlvbihjKXtjLnBsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBSYj1jLnBsfHxSYjsoZnVuY3Rpb24oYyl7Yy5vbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpO3RoaXMuUGIoKX0sUGI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5HZCgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2QoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGIoKX0uYmluZCh0aGlzKSwxMCl9LEdkOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LApvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgU2I9Yy5vbHx8U2I7KGZ1bmN0aW9uKGMpe2MucWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBSYihkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgU2IoYiwKdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBUYj1jLnFsfHxUYixVYj1uZXcgVGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWWc9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzRdO3RoaXMubGw9dGhpcy5hWzVdO3RoaXMucnI9dGhpcy5hWzNdO3RoaXMubWs9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuV2g9YjtiLnByb3RvdHlwZT17WGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLllnOnRoaXMuTm0oYSl9LE5tOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PbTp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubGw6dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJyOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLldofHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5YZyg0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5XZD0hMX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuWnIoKX0uYmluZCh0aGlzKSw1MDApfSxacjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPApiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5KJiZ0aGlzLkooKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5XZCYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPwooYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXczpmdW5jdGlvbigpe3RoaXMuV2Q9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sSzpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLllrfHxXYjsoZnVuY3Rpb24oYyl7Yy5Yaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuT3E9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLktifHwodGhpcy5LYj0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiKTt0aGlzLm8oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSwKd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuT3E/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLldzKCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBYYj1jLlhrfHxYYjsoZnVuY3Rpb24oYyl7Yy5aaz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLAphPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkgoKX19KX0pKGMpO3ZhciBZYj1jLlprfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW89dGhpcy5hWzZdO3RoaXMuSms9dGhpcy5hWzRdO3RoaXMuam89dGhpcy5hWzJdO3RoaXMueWk9dGhpcy5hWzddO3RoaXMudnI9dGhpcy5hWzddO3RoaXMuYm09dGhpcy5hWzEwXTt0aGlzLlRoPXRoaXMuYVszXTt0aGlzLm1tPXRoaXMuYVs4XTt0aGlzLkJyPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVs1XX1jLmtvPWI7Yi5wcm90b3R5cGU9CntwbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucW86dGhpcy5JayhhKX0sSWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkprOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbzp0aGlzLnhpKGEpfSx4aTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueWk6dGhpcy51cihhKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZyOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ibTp0aGlzLlNoKGEpfSxTaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGg6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1tOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ccjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMua298fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1qZC5wbyg0KTsoZnVuY3Rpb24oYyl7Yy5Uaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTsKcmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLlRrfHxhYzsoZnVuY3Rpb24oYyl7Yy5Taz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5DYSgpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuTm4oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuSWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLkNxKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LE5uOmZ1bmN0aW9uKCl7dGhpcy5GZSgpfHx0aGlzLm8oITApfSxDcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWMoKTshYi5tYSYmYi5iYSYmYi5ZdSYmYi4kdSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjsKYTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sSWM6ZnVuY3Rpb24oKXtmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQ2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspaWYoYltjXS5pZD09YSlyZXR1cm4gYltjXTtyZXR1cm57fX0sR2Q6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbzpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iPwp0aGlzLkljKCkuYWRzTG9hZGVyP3RoaXMudyghMCk6dGhpcy53KCk6dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGJjPWMuU2t8fGJjOyhmdW5jdGlvbihjKXtjLlVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsucGxheWVyYXBpKWZvcih2YXIgYj1rLnBsYXllcmFwaSgpLGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IGFjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBiYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgY2M9Yy5Va3x8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52aD10aGlzLmFbOV07dGhpcy5hcT10aGlzLmFbOV07dGhpcy5raz10aGlzLmFbN107dGhpcy5lcT10aGlzLmFbOF07dGhpcy5PdT10aGlzLmFbOV07dGhpcy5UbD10aGlzLmFbM107dGhpcy5ibz10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVsxXX1jLlZsPWI7Yi5wcm90b3R5cGU9e3VoOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52aDp0aGlzLiRwKGEpfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXE6dGhpcy5qayhhKX0sams6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmtrOnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lcTp0aGlzLk51KGEpfSxOdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT3U6dGhpcy5TbChhKX0sU2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRsOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ibzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYz1jLlZsfHxlYyxrZD1uZXcgZWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC51aCg0KTsoZnVuY3Rpb24oYyl7Yy5Uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLk8oYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUihhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEs6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LENhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTsKcmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFQ9Yy5Uanx8VDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5YZD0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhkPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGQmJmIhPXRoaXMuWGR8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS53diksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLAp0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVT1jLlNqfHxVOyhmdW5jdGlvbihjKXtjLlVqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFQoYiksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFUoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9Cm5ldyBUKGIpLGIuamE/dGhpcy5jZygpOnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBVKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgRCxmYz1jLlVqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5uYi5sZW5ndGgpe3ZhciBhPW0ubmIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWYuS3MoeyJbTE9BRFNDUklQVF0iOmYucGEoMTApLCJbVVRJTFNdIjpmLnBhKDEwKSwiW0NBTExCQUNLXSI6Zi5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWYuTWYuYmluZChmKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSlrW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOylmLk1mKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sCm0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSG09dGhpcy5hWzFdO3RoaXMuVnI9dGhpcy5hWzddO3RoaXMuUmo9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbOF19Yy5Jcj1iO2IucHJvdG90eXBlPXtHbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSG06dGhpcy5VcihhKX0sVXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wcjp0aGlzLlFqKGEpfSxRajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUmo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYz1jLklyfHxoYyxsZD1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1sZC5HbSg0KTsKKGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLk8oYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5SKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5ZcT1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sQ3M6ZnVuY3Rpb24oYil7dGhpcy5uZD1ifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWXF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEs6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5KJiZ0aGlzLkooKSx0aGlzLm5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5uZCYmKG5ldyBHKHRoaXMsdGhpcy5uZCkpLmIoKSl9fSl9KShjKTt2YXIgTT1jLkRsfHwKTTsoZnVuY3Rpb24oYyl7Yy5DbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxWYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8KHRoaXMuaGI9MCksdGhpcy5oYisrLDE1PHRoaXMuaGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB0aGlzLk1zKCksITA7dGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5vKCk6dGhpcy5vKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMudmEoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5VKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlU9YSxiLmwoImFkZXJyb3IiLAphKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlV8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5WYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLApmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbzpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz8KdGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHPWMuQ2x8fEc7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMud2E9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBNKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJgp3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQ3ModGhpcy5BKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSCgpfX0pfSkoYyk7dmFyIGljPWMuRWx8fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tcj10aGlzLmFbOV07dGhpcy5UbT10aGlzLmFbMV07dGhpcy5tbz10aGlzLmFbMl07dGhpcy5naz10aGlzLmFbMl07dGhpcy5NbD10aGlzLmFbMV07dGhpcy5LdT10aGlzLmFbN107dGhpcy5xaz10aGlzLmFbMV07dGhpcy5RbT10aGlzLmFbMTBdO3RoaXMuTWc9dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNF19Yy5adD1iO2IucHJvdG90eXBlPXtscjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm1yOnRoaXMuU20oYSl9LApTbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG06dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nazp0aGlzLkxsKGEpfSxMbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWw6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkt1OnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xazp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFtOnRoaXMuTGcoYSl9LExnOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5NZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYz1jLlp0fHxrYyxtZD1uZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQubHIoNCk7KGZ1bmN0aW9uKGMpe2MuT2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuVWU9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuUihhKTp0aGlzLmRhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0UsCntpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLko/KDAsdGhpcy5KKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHt6bjpmdW5jdGlvbihhKXswPGEmJih0aGlzLlVlPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHt6bjpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sSzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIGxjPWMuT2p8fGxjOyhmdW5jdGlvbihjKXtjLk5qPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEF2OmZ1bmN0aW9uKCl7fSxsczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLnVlKG5ldyBmdW5jdGlvbigpe30pO2EuVnU9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHMoYSk7CndpbmRvdy5jdj1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5rc3x8KHRoaXMua3M9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5EZHx8KHRoaXMuRGQ9MSk7aWYoMjA8dGhpcy5EZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5vKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkhhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuRGQrKzsKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxIYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5iZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJgpiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmCihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMudyhiKX19KX0pKGMpO3ZhciBtYz1jLk5qfHxtYzsoZnVuY3Rpb24oYyl7Yy5Qaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IGxjKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5qYXx8dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgbWMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIG5jPWMuUGp8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EdT10aGlzLmFbOV07dGhpcy55bD10aGlzLmFbN107dGhpcy5lbj10aGlzLmFbOF07dGhpcy5kaT10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVsxXX1jLkFuPWI7Yi5wcm90b3R5cGU9e0N1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5EdTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6CnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lbjp0aGlzLmNpKGEpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLkFufHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5DdSg0KTsoZnVuY3Rpb24oYyl7Yy5Maj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpO2EmJnRoaXMuTyhhLnBhcmVudE5vZGUpfSwKSzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgVj1jLkxqfHxWOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLndmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy5GZigpfSxGZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLkhhKCksITA7dGhpcy53ZisrO2lmKDEwPHRoaXMud2YpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5GZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LApXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFc9Yy5Lanx8VzsoZnVuY3Rpb24oYyl7Yy5Naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgVih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFYod2luZG93LnBsYXllciksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgcWM9Yy5Nanx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1yPXRoaXMuYVsxMF07dGhpcy5ZdD10aGlzLmFbOF07dGhpcy5Ebz10aGlzLmFbMTBdO3RoaXMuUmg9dGhpcy5hWzldO3RoaXMuRmo9dGhpcy5hWzZdO3RoaXMueG49dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOF19Yy5SbT1iO2IucHJvdG90eXBlPXtMcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXI6dGhpcy5YdChhKX0sWHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ZdDp0aGlzLkNvKGEpfSxDbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRG86dGhpcy5RaChhKX0sUWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlJoOnRoaXMuRWooYSl9LEVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gajp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLlJtfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC5Mcig0KTsoZnVuY3Rpb24oYyl7Yy5BaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8KKHRoaXMuTyhiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlIoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sSzpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPWMuQWl8fHRjOyhmdW5jdGlvbihjKXtjLnppPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IiwKZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMubygpKX0sdGVzdDpmdW5jdGlvbigpe30sCm86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMueml8fHVjOyhmdW5jdGlvbihjKXtjLkJpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxmLkRhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdGMoZCksZC5qYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgdWMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5IKCl9fSl9KShjKTsKdmFyIHZjPWMuQml8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Iaj10aGlzLmFbMTBdO3RoaXMuUnA9dGhpcy5hWzddO3RoaXMucnE9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzldO3RoaXMuS2k9dGhpcy5hWzRdO3RoaXMuSnQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbOF19Yy5SdT1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGo6dGhpcy5RcChhKX0sUXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlJwOnRoaXMucXEoYSl9LHFxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ycTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZmw6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuSXQoYSl9LEl0OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnQ6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLlJ1fHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5Haig0KTsoZnVuY3Rpb24oYyl7Yy5IaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuTyhiKSx0aGlzLlIoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoiYmxvY2siKX0sSzpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5IaXx8eWM7KGZ1bmN0aW9uKGMpe2MuR2k9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuUGUoKX0sUGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBlKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciB6Yz1jLkdpfHx6YzsoZnVuY3Rpb24oYyl7Yy5JaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgeWMod2luZG93LiQoImRpdiNnYW1lIikpOwppZihiLmphKXt0aGlzLkgoKTtyZXR1cm59aWYoIXRoaXMuSShiKSl7dGhpcy5MKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5IKCk7cmV0dXJufX10aGlzLkgoKX19KX0pKGMpO3ZhciBBYz1jLklpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHQ9dGhpcy5hWzZdO3RoaXMuZm09dGhpcy5hWzRdO3RoaXMud289dGhpcy5hWzRdO3RoaXMucGo9dGhpcy5hWzldO3RoaXMuRms9dGhpcy5hWzFdO3RoaXMuY2w9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzZdO3RoaXMuWG49dGhpcy5hWzNdO3RoaXMuYmk9dGhpcy5hWzRdO3RoaXMuZz10aGlzLmFbNV19Yy5YaT1iO2IucHJvdG90eXBlPXtHdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHQ6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZtOnRoaXMudm8oYSl9LAp2bzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMud286dGhpcy5vaihhKX0sb2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBqOnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gazp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY2w6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZoOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ybjp0aGlzLmFpKGEpfSxhaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5YaXx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuR3QoNCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkhmPXRoaXMuS2Y9dGhpcy5KZj0hMTt0aGlzLlVjPVtdO3RoaXMuJGQ9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBIYT9udWxsOkhhLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2E/bnVsbDpDYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJhP251bGw6UmEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBXYT9udWxsOldhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHNhP251bGw6c2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjPwpudWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB3Yj9udWxsOndiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj8KbnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBNYT9udWxsOk1hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIG5hP251bGw6bmF9fWMuT2s9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5rcChhKTpbXSxiO3RoaXMuS2Y9ITA7aWYoYS5sZW5ndGgpe3RoaXMuSmY9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuZGcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLiRkKXtpZih0aGlzLkhmKWJyZWFrO2I9dGhpcy4kZFtjXTt0aGlzLm9lKGIpJiYodGhpcy5VYy5wdXNoKGIpLHRoaXMuZGcoYikpfX0sb2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxrcDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz0KYVtlXSxjPXRoaXMuJGRbY10sdGhpcy5vZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxkZzpmdW5jdGlvbihhKXt0aGlzLm9lKGEpJiZhLmIoKX0sWXM6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLkpmKWZvcih0aGlzLkhmPSEwLGE9MDthPHRoaXMuVWMubGVuZ3RoO2ErKyl0aGlzLlVjW2FdLnFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVWNbYV0ucWIpfX19KShjKTt2YXIgRGM9Yy5Pa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnI9dGhpcy5hWzZdO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLlpuPXRoaXMuYVszXTt0aGlzLlhxPXRoaXMuYVsxXTt0aGlzLkRrPXRoaXMuYVs4XTt0aGlzLm9vPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVsxMF19Yy50aD1iO2IucHJvdG90eXBlPXtRcjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlJyOnRoaXMuTXAoYSl9LE1wOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5OcDp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm46dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhxOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLm5vKGEpfSxubzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMub286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBFYz1jLnRofHxFYyxyZD1uZXcgRWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1yZC5Rcig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9CmMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGYuVGIobC5UdCksZi50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGYuVGIobC5hciksZi50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgc2Q9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSwKYmE9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEY9bmV3IGdhLGs9ITE7Ri5NYygpO0YuQmYoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLk1jKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5CZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuTWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtmLmZpcmVFdmVudCh3aW5kb3csRi5icSgpLHtpZDp0ZH0pfSw1MDApO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXU9dGhpcy5hWzJdO3RoaXMudnE9dGhpcy5hWzJdO3RoaXMub2k9dGhpcy5hWzVdO3RoaXMuVXE9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbMl19Yy51dD1iO2IucHJvdG90eXBlPXskdDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmF1OnRoaXMudXEoYSl9LHVxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52cTp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMub2k6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VcTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMudXR8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLiR0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5aZj10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuUGM9MDt0aGlzLkxhPSIiO3RoaXMuVmM9W107dGhpcy5XYz0wO3RoaXMuJGY9ITE7dGhpcy5ZZD1bXX1jLk5nPWI7Yi5wcm90b3R5cGU9e0pzOmZ1bmN0aW9uKGEpe3RoaXMuWmY9CmF9LFljOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5MYT10aGlzLnBsYXllci5LKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXM6ZnVuY3Rpb24oYSl7dGhpcy5VYT1hfSxEczpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLkxhXSYmdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSxiYzpmdW5jdGlvbihhLGIpe2YuaWIoIndlbHQuZGUiKSYmZi5ZYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuVWEpO3ZhciBjPSExLGU9ITE7aWYodGhpcy5mcSgpKXRoaXMuVWEuYyh0aGlzLlVhLkpjLHRoaXMuVWEuemEsdGhpcy5VYS5aZCxmdW5jdGlvbigpe3RoaXMuYmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkJjKTtlbHNlIGlmKHRoaXMuQXAoKSl0aGlzLnZzKGZ1bmN0aW9uKCl7dGhpcy5iYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5EKGwueWMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuJHMoKTtrLmV4aXRGdWxsc2NyZWVuKCk7UT1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLmdnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLk5xKGEpOwoiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSGQmJihjPXRoaXMucGxheWVyLkhkKCkpO2guYWRTdGFydFRpbWVvdXQmJihlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtrLkpkKGEsYyxlKTt0aGlzLnBsYXllci5oZyhrKX19LGZxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuUGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5QYy5nZXRUaW1lKCksdGhpcy5QYz1hLDNFNTxiPyEwOiExO3RoaXMuUGM9YTtyZXR1cm4hMX0sUnM6ZnVuY3Rpb24oKXtmLmVlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuYWYoYSkpP3RoaXMuYmMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5EKGwuemMsdGhpcy5wbGF5ZXIuQigpKSl9LApRczpmdW5jdGlvbihhKXtmLmVlKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlpmKXt0aGlzLkpzKCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLmFmKGMpKT90aGlzLmJjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxmLkQobC56Yyx0aGlzLnBsYXllci5CKCkpKX19LGFmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxuczpmdW5jdGlvbigpe3RoaXMucGxheWVyLk9zKHRoaXMuUXMuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sJGM6ZnVuY3Rpb24oYSl7Zi5lZSgibWlkcm9sbCIpO2lmKCF0aGlzLk9mKXt0aGlzLk9mPSEwO3ZhciBiPQp0aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5iYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZj0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGYuRChsLnpjLHRoaXMucGxheWVyLkIoKSkpfX0sbXM6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Jcyh0aGlzLiRjLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5kKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLlJzKCk7dGhpcy5wbGF5ZXIuTmQmJnRoaXMubXMoKTt0aGlzLm5zKCl9LG9zOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuVmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihmKXt0aGlzLkl1KGEsCmIsYyxnLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuV2M9dGhpcy5WYy5sZW5ndGh9LEFwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLldjJiYoYT0hMCk7cmV0dXJuIGF9LHZzOmZ1bmN0aW9uKGEpe3RoaXMuJGY9YTtmb3IoYT0wO2E8dGhpcy5WYy5sZW5ndGg7YSsrKXRoaXMuVmNbYV1bImZ1bmN0aW9uIl0odGhpcy5kcy5iaW5kKHRoaXMpKX0sZHM6ZnVuY3Rpb24oYSl7dGhpcy5XYy0tO2EmJnRoaXMuWWQucHVzaChhKTswPj10aGlzLldjJiZ0aGlzLiRmKCl9LE5xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLllkLmxlbmd0aDtjKyspYj10aGlzLllkW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBkYT1jLk5nfHxkYSxRPSExLGphPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ybj10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbNV07dGhpcy5hbj10aGlzLmFbMl07dGhpcy5vbT10aGlzLmFbNl07dGhpcy5Gcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLnRuPWI7Yi5wcm90b3R5cGU9e3FuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucm46dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVzOnRoaXMuJG0oYSl9LCRtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hbjp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub206dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy50bnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLnFuKDQpfSkuY2FsbChQaWV4dXVwaGVoYXBob2hWLFBpZXh1dXBoZWhhcGhvaFYpOwo=
Protocol
HTTP/1.1
Server
52.216.1.195 Ashburn, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
s3-1.amazonaws.com
Software
AmazonS3 /
Resource Hash
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a

Request headers

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

Response headers

Date
Sat, 04 Aug 2018 18:36:42 GMT
Last-Modified
Sat, 04 Aug 2018 06:10:56 GMT
Server
AmazonS3
x-amz-request-id
959FFD434C9E62D9
ETag
"3f42d83ce95b1a6eea170c73c8842d09"
Vary
Origin, Access-Control-Request-Headers, Access-Control-Request-Method
Access-Control-Allow-Methods
GET, POST
Content-Type
application/json
Access-Control-Allow-Origin
*
Access-Control-Max-Age
3000
Cache-Control
no-cache, no-store
Accept-Ranges
bytes
Content-Length
53
x-amz-id-2
vHVmlaE/raqh2uTmAjqMrJ9XQkvQw4xfVvOi7zo+mikj2cTD+Q9Zw/N2AYLAc8Xx7qAZqWotAcE=
Expires
0
homadclienthttpsle-json.php
video.golem.de/staticrl/scripts/radiant/
286 B
677 B
XHR
General
Full URL
https://video.golem.de/staticrl/scripts/radiant/homadclienthttpsle-json.php?cache=2570722747
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFBpZXh1dXBoZWhhcGhvaFY9UGlleHV1cGhlaGFwaG9oVnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBYKCl7eS5TZHx8KHkuU2Q9MCk7eS5TZCsrO3dpbmRvdy52aWRlb3BrZ0ludGVyZmFjZSE9eS52aWRlb3BrZ0ludGVyZmFjZSYmKHdpbmRvdy52aWRlb3BrZ0ludGVyZmFjZT15LnZpZGVvcGtnSW50ZXJmYWNlKTsxMD55LlNkJiZ3aW5kb3cuc2V0VGltZW91dChYLDUwMCl9ZnVuY3Rpb24gQSgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLEEpO1k9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIFooKXt2YXIgYz13aW5kb3cuT087Y3x8KGM9d2luZG93LmpPT1BsYXllcl8wKTtyZXR1cm4gY31mdW5jdGlvbiBhYSgpe2lmKGspe2sucGF1c2VCdXR0b258fChrLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwprLnBsYXlCdXR0b258fChrLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLm11dGVCdXR0b258fChrLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnVubXV0ZUJ1dHRvbnx8KGsudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmsuc2tpcGFibGVCdXR0b258fChrLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjY7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpOwprLnNraXBCdXR0b258fChrLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSIpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYoay5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtrLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2E9YS51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2YuWWEoYSxiLFtdLGMsYyxtKX0pfW0uYyhrLmdsb2JhbENvbmZpZyxrLmNsaWVudENvbmZpZyxrLnByZWNoZWNrZWQsay5vblJlYWR5LGsub25GYWlsdXJlLGspO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBiPWsuc3RhcnRQbGF5ZXI7YiYmImZ1bmN0aW9uIj09PXR5cGVvZiBiJiZiKCl9ZWxzZSBiYShhYSw1MCl9ZnVuY3Rpb24gY2EoYyxiKXtifHwoYj0icHJlIik7aWYoayYmbSl7Yy5wYXVzZSgpO3ZhciBhPW5ldyBOKGMpLGE9bmV3IE8oYSxtKSxnPWsuYWRUYWc7InByZSI9PWImJmsucHJlcm9sbEFkVGFnJiYoZz1rLnByZXJvbGxBZFRhZyk7InBvc3QiPT1iJiZrLnBvc3Ryb2xsQWRUYWcmJihnPWsucG9zdHJvbGxBZFRhZyk7CmcmJihhLmdnKGspLGEuSmQoZykpfWVsc2UgYmEoZnVuY3Rpb24oKXtjYShjKX0uYmluZCh0aGlzKSw1MCl9ZnVuY3Rpb24gcShjLGIpeyhrLmFkVGFnfHxrLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLkQobC55YyxjLkIoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmYudHJhY2soImFjdGl2YXRlZEF0IixhKX1rJiZtPyhiP20ub2E9ITA6Zi50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCksYT1uZXcgZGEsYS5ZYyhjKSxhLkVzKG0pLGEuRHMoayksYS5vcygpLGEuYigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWG09dGhpcy5hWzFdO3RoaXMuZWs9dGhpcy5hWzddO3RoaXMuTXE9dGhpcy5hWzZdO3RoaXMuc2s9dGhpcy5hWzVdOwp0aGlzLmc9dGhpcy5hWzZdfWMudXU9YjtiLnByb3RvdHlwZT17V206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhtOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lazp0aGlzLkxxKGEpfSxMcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTXE6dGhpcy5yayhhKX0scms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnNrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgZWE9Yy51dXx8ZWEsSGM9bmV3IGVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SGMuV20oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuRWE9InNldHVwIjt0aGlzLmRjPVtdO3RoaXMuU2UoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5jcy5iaW5kKHRoaXMpKX0KYy5TaT1iO2IucHJvdG90eXBlPXtTZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxGbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEucG9zdE1lc3NhZ2UoYiwiKiIpfSxHYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sY3M6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuYnMoYS5kYXRhKX0sYnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQowO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0scmQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sRG06ZnVuY3Rpb24oYSxiKXswPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmxhLnVybHNbYV09Yjt0aGlzLmxhLnVybHNbYl09YTt0aGlzLmxhLmhvbWFkVXJsc1thXT1iO3RoaXMubGEub3JpZ2luYWxVcmxzW2JdPWF9LGJmOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMubGEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmxhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LCRhOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO2Zvcih2YXIgZD0wO2Q8dGhpcy5sYS5lcnJtc2cubGVuZ3RoO2QrKyliKz0iXG4iK3RoaXMubGEuZXJybXNnW2RdO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrCmEsYiwhMCl9LERhOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0saGY6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFhzOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LERmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD0KYS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEVmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxlPTAsYz0wLGg9MCxmPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIHU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighdSlyZXR1cm4hMTtjPXUuaGVpZ2h0KnUud2lkdGg7ZD11LndpZHRoO2U9dS5oZWlnaHQ7MD51LnRvcCYmKGUrPXUudG9wKTt1LmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGUtPXUuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD51LmxlZnQmJihkKz11LmxlZnQpO3UucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09dS5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZSYmKGU9MCk7MD5kJiYoZD0wKTswPGMmJihoPTEwMC9jKmQqZSk7aD49YiYmKGY9ITApO3JldHVybiBmfSxrYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPwo2NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEJkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxlO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWU9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZSxifD0wO3JldHVybiBifSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZTtmb3IoZD03OzA8PWQ7ZC0tKWU9YT4+PjQqZCYxNSxnKz1lLnRvU3RyaW5nKDE2KTtyZXR1cm4gZ31mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsYyxoPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsdT00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixJPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbixsLHcscSxyO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGU9MDtlPG4tMztlKz00KWM9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsKMSk8PDE2fGEuY2hhckNvZGVBdChlKzIpPDw4fGEuY2hhckNvZGVBdChlKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChlKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT1wW2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09ZChoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtjPWY7bj11O2w9azt3PUk7cT1tO2ZvcihlPQowOzE5Pj1lO2UrKylyPWQoYyw1KSsobiZsfH5uJncpK3EraFtlXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZT0yMDszOT49ZTtlKyspcj1kKGMsNSkrKG5ebF53KStxK2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGU9NDA7NTk+PWU7ZSsrKXI9ZChjLDUpKyhuJmx8biZ3fGwmdykrcStoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihlPTYwOzc5Pj1lO2UrKylyPWQoYyw1KSsobl5sXncpK3EraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmPWYrYyY0Mjk0OTY3Mjk1O3U9dStuJjQyOTQ5NjcyOTU7az1rK2wmNDI5NDk2NzI5NTtJPUkrdyY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZikrYih1KStiKGspK2IoSSkrYihtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQoiIixkLGUsYyxoLGYsdSxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxlPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8ZT4+NCxmPShlJjE1KTw8MnxjPj42LHU9YyY2Myxpc05hTihlKT9mPXU9NjQ6aXNOYU4oYykmJih1PTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZikrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQodSk7cmV0dXJuIGJ9LG5xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJgotMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LFdlOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGU9ITEsYz0hMSxoPSExLGY9ITEsdT0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7ZT13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5zbj8hMDohMX1jYXRjaChyKXt9dHJ5e2M9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLHU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksCms9IXUmJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZTthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZjthLmlzSUU9dTthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9bTtyZXR1cm4gYX0sWG86ZnVuY3Rpb24oKXt2YXIgYT0iVSIsYj10aGlzLldlKCk7Yi5pc1BoYW50b21KUz9hPSJIUCI6Yi5pc0Nocm9tZUhlYWRsZXNzP2E9IkhDIjpiLmlzRmlyZWZveEhlYWRsZXNzP2E9IkhGIjooYi5pc0JsaW5rJiYoYT0iQiIpLGIuaXNPcGVyYSYmKGE9Ik8iKSxiLmlzRmlyZWZveCYmKGE9IkYiKSxiLmlzU2FmYXJpJiYoYT0iUyIpLGIuaXNJRSYmKGE9IkkiKSxiLmlzRWRnZSYmKGE9IkUiKSxiLmlzQ2hyb21lJiYoYT0iQyIpKTtyZXR1cm4gYX0sWGE6ZnVuY3Rpb24oKXt2YXIgYT17b2g6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sCkNoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LENwOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHlrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LFVsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxrbjpmdW5jdGlvbigpe3JldHVybiBhLm9oKCl8fGEuQ2goKXx8YS5DcCgpfHxhLnlrKCl8fGEuVWwoKX19O3JldHVybiBhLmtuKCl9LEthOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGU9MTQ7ZS0tOylkW2JbZV1dPWFbZV18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxlPTAsYz1hLmxlbmd0aDtlPGM7KytlKWIuaGFzT3duUHJvcGVydHkoYVtlXSl8fChkLnB1c2goYVtlXSksYlthW2VdXT0xKTtyZXR1cm4gZH0sb2Y6ZnVuY3Rpb24oYSl7YT10aGlzLkthKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0saWI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sVW46ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZT1bXSxjPTA7YzxiLmxlbmd0aDtjKyspZFtiW2NdXT0hMDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWRbYVtjXV18fGUucHVzaChhW2NdKTtyZXR1cm4gZX0sVnM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxlPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGU9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZSk6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxlZjpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMueGcoYikrIjoiK3RoaXMueGcoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3JldHVybiAxMD4KYT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZWU6ZnVuY3Rpb24oYSl7dGhpcy5FYT1hfSxmaXJlRXZlbnQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlO2Quc3RhdGU9dGhpcy5FYTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9lPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGUuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChlKX0sVGI6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLmZpcmVFdmVudChkLGIsYSl9LEQ6ZnVuY3Rpb24oYSxiLGQsZSxjKXt2YXIgaD1hO2QmJmImJihiPWwuRmMoYixkKSk7YiYmKGg9bC5GYyhhLGIpKTtlJiYoaD1sLkZjKGgsZSkpO2MmJihoPWwuRmMoaCxjKSk7Zi5UYihoKX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgZT1tLmFlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTttLlRhKGUsITApO2U9bS5UYShlLCEwKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtlLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2UuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkZhKGUsZnVuY3Rpb24oZCl7dmFyIGU9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGU9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGU9ITEpfWNhdGNoKGMpe31lfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwKKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LEtkOmZ1bmN0aW9uKCl7bSYmbS5ZP20uaXNFbmFibGVkJiZtLkVuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktkKCl9LmJpbmQodGhpcyksNTAwKX0seW46ZnVuY3Rpb24oYSxiKXtpZihiLk9jKGEpfHwiYWJvdXQ6YmxhbmsiPT1hfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5lZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy4kYSgiZXJyX3VybCIsYSk7aWYodGhpcy5iZihhKSlyZXR1cm4gdGhpcy5iZihhKTt2YXIgZD17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtkLmhvbWFkX3VybF9zdWZmaXg9CmE7ZC5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGEpO2QuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtkLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dmFyIGU9ITEsYz0hMSxjPXRoaXMuWWEoYSxiLnVhLGQsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1jKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goaCl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLkxjKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLkRtKGUsYSk7cmV0dXJuIGV9LFlhOmZ1bmN0aW9uKGEsYixkLGUsYyxoLGYsdSl7dmFyIGs9aHx8bTtoPSEwO3UmJihoPSExKTtpZihrJiZrLlkpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChsKXtjKGwpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLlRhKGEsaCk7aD1rLlRhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7aC5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciBxIGluIGQpaC5kYXRhW3FdPWRbcV07cmV0dXJuIGsuRmEoaCxlLGMsIiIsIiIsZil9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGUsYyxrLGYsdSl9LmJpbmQodGhpcyksNTAwKX0sR3E6ZnVuY3Rpb24oYSxiLGQsZSxjLGgsZil7dmFyIHU9ITA7ZiYmKHU9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zj1kO2Q9IiI7Zm9yKHZhciBrIGluIGYpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChmW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFlfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGUobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsdSksbC53aXRoQ3JlZGVudGlhbHM9aCwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LEhxOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkdxKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLmRjKWZvcih2YXIgYyBpbiB0aGlzLmRjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuZGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LE1mOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWWEoYSxlLnVhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5IcShlLkxjKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGUsITApfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYz1hfSxJdTpmdW5jdGlvbihhLGIsZCxlLGMpe3RoaXMuWWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzplfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86ZX0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9KX0sbG46ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxqcTpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspaWYoYltlXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFA9Yy5TaXx8UDtuZXcgUDt2YXIgZj1uZXcgUDt3aW5kb3cuZnY9ZjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5SaT1iO2IuRmM9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxlO2ZvcihlIGluIGIpZFtlXT1iW2VdO2ZvcihlIGluIGEpZFtlXT1hW2VdO3JldHVybiBkfTtiLk5yPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLiRxPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5zdT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLnhvPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuR3U9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53bT17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5xbT17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IudG09e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IueW09e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLnBtPXtjb2RlOiIxMDA5IiwKdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5ybT17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld0PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5acT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55bz17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQnU9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTG49e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Rbj17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IiwKbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLnpjPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IueWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLnZtPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi51bT17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWU9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLkhlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLnptPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07CmIuc209e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLlR0PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuYXI9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgbD1jLlJpfHxsO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxoPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuUms9YjtiLnByb3RvdHlwZT17a2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGZhPWMuUmt8fGZhLEpjPW5ldyBmYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUpjLmtoKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuVGk9YjtiLnByb3RvdHlwZT17QmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGUsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKyllPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2UsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sZnA6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLnZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sR2M6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkdjKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuR2MoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD0KYS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sTWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuR2MoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWMoKSsiMiJ9LEJmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmQodGhpcy5mcCgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLkdjKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgZ2E9Yy5UaXx8Z2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlFxPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzJdfWMuJG49YjtiLnByb3RvdHlwZT17UHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy4kbnx8aGEsS2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9S2MuUHEoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZT1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZyllW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT8KZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGU9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGV9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGUuYz9lLmhhc093blByb3BlcnR5KCJpbml0Iik/ZS5jOmZ1bmN0aW9uKCl7ZC5jLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWU7ZS5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLnVlPWJ9KShjKTt2YXIgSj1jLnVlfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRoPXRoaXMuYVs3XTt0aGlzLnhyPXRoaXMuYVs1XTt0aGlzLlBvPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs3XTt0aGlzLnRyPXRoaXMuYVs3XTt0aGlzLkxrPXRoaXMuYVs1XTt0aGlzLmZpPQp0aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLlJxPWI7Yi5wcm90b3R5cGU9e1poOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kaDp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHI6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBvOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucG46dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnRyOnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Mazp0aGlzLmVpKGEpfSxlaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYT1jLlJxfHxpYSxMYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuWmgoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Oaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPXt9O3RoaXMuQT1udWxsO3RoaXMuYWM9MTAwO3RoaXMubGI9MDt0aGlzLndhPTE1MDt0aGlzLnFiPTA7dGhpcy5GcyhiKX0sYjpmdW5jdGlvbigpe30sSDpmdW5jdGlvbigpe3RoaXMubGI8PXRoaXMud2E/KHRoaXMubGIrKyx0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKTowPnRoaXMud2EmJih0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKX0scnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYj50aGlzLndhPyEwOiExfSxjZzpmdW5jdGlvbigpe3RoaXMubGI9MH0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEw6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmZiKCldPQpiO0smJksuS2YmJksuWXMoYil9LG52OmZ1bmN0aW9uKCl7cmV0dXJuIGYuRGEodGhpcy54YSl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueGEpaWYoYT09dGhpcy54YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy54YVtiLmZiKCldPyEwOiExfSxtcTpmdW5jdGlvbihiKXtiPWIuQ2EoKTtmb3IodmFyIGEgaW4gdGhpcy54YSlpZihiLmlkPT10aGlzLnhhW2FdLkNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LEJ2OmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMuTmt8fHI7KGZ1bmN0aW9uKGMpe2MuUGs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5hYz0xMDt0aGlzLmxiPTA7dGhpcy53YT01MDt0aGlzLko9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLlllPSExO3RoaXMuTigpfSwKSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7fSxPczpmdW5jdGlvbihiKXt0aGlzLko9Yn0sb3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KfSxJczpmdW5jdGlvbihiKXt0aGlzLk9kPWJ9LG12OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2R9LE5kOmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YSYmKHRoaXMubGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmFjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSwKZ2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5DYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sZmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxDdjpmdW5jdGlvbigpe30sUjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5CcCgpfHx0aGlzLkFtKCk7dGhpcy5mZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LHB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEFtOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixmLnBhKDEwKSl9LEJwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxPOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LENhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxOYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0samI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdnY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sZGE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxXYTpmdW5jdGlvbigpe3JldHVybiExfSxIZDpmdW5jdGlvbigpe3JldHVybiExfSxoZzpmdW5jdGlvbihiKXt0aGlzLmdiPWJ9LGx2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LHFzOmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxydjpmdW5jdGlvbigpe3ZhciBiPQohMTt0aGlzLmdiJiYoYj0hMCk7cmV0dXJuIGJ9LHh2OmZ1bmN0aW9uKCl7dGhpcy5ZZXx8KHRoaXMuWWU9ITApfSxIYzpmdW5jdGlvbigpe3JldHVybiExfSxpdjpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5Qa3x8cDsoZnVuY3Rpb24oYyl7Yy5PZz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuQT10aGlzLnBsYXllcj0iIjt0aGlzLkRlPSIxIjt0aGlzLkVlPSIyIjt0aGlzLmptPSIzIjt0aGlzLmljPTA7dGhpcy5QZj0zMDt0aGlzLnRiPVtdO3RoaXMuT2E9W107dGhpcy5MYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5LZT10aGlzLkJnPSExO3RoaXMuc3RhdHVzPXRoaXMuaWM7dGhpcy5pZD1mLnBhKDEwKTt0aGlzLlljKGIpOwp0aGlzLkdzKGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuQmd8fCh0aGlzLkJnPSEwLGYuS2QoKSl9LFJkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LKCk7USYmUS5ZYiYmIWphJiYoamE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdzpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLkxzKCksdGhpcy5BKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy50ZygpLHRoaXMuS2U9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LGw6ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnRiLnB1c2goYiksdGhpcy5PYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnRiJiYwPHRoaXMudGIubGVuZ3RoJiYodGhpcy50Yj1mLnVuaXF1ZSh0aGlzLnRiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsCnRoaXMudGIuam9pbigiLCIpKSk7aWYodGhpcy5PYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLk9hLmxlbmd0aDtnKyspdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl09PXRoaXMuTGJbYl0mJmEucHVzaCh0aGlzLk9hW2ddLmRldGFpbCksdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl08dGhpcy5MYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuT2FbZ10uZGV0YWlsKSxiPXRoaXMuT2FbZ10ucmVhc29uKTt0aGlzLkxiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9Zi51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sbTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGV9LExzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5FZX0sTXM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmptfSxDYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPQp0aGlzLmljfSxGZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5EZX0sWHU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuRWV9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmljfSxZYzpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEdzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEtxOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5PZ3x8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GaT10aGlzLmFbNV07dGhpcy5jdD10aGlzLmFbNV07dGhpcy5Eaj10aGlzLmFbOF07dGhpcy4kbD10aGlzLmFbN107dGhpcy5ndD10aGlzLmFbMTBdO3RoaXMuY3I9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19CmMuUGc9YjtiLnByb3RvdHlwZT17RWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZpOnRoaXMuYnQoYSl9LGJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdDp0aGlzLkNqKGEpfSxDajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGo6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRsOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ndDp0aGlzLmJyKGEpfSxicjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYT1jLlBnfHxrYSxNYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5FaSg0KTsoZnVuY3Rpb24oYyl7Yy5OaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5KJiZ0aGlzLkooKX0sSzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgUj1jLk5ofHxSOyhmdW5jdGlvbihjKXtjLk1oPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5nZD1udWxsO3RoaXMuaHU9MUUzO3RoaXMuV2Y9Cm51bGw7dGhpcy52dD0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuc24pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Jby5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMueHAuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy53cChhLGIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMua3UoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLmx1KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMudnAoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLk9uKGEpfS5iaW5kKHRoaXMpKX0sCk9uOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sa3U6ZnVuY3Rpb24oYil7dGhpcy5nZHx8KHRoaXMuZ2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm11KGIpfS5iaW5kKHRoaXMpLHRoaXMuaHUpKX0sbXU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZ2QpO3RoaXMudygpfSxsdTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5nZCl9LHZwOmZ1bmN0aW9uKGIpe3RoaXMuZHYoYik7dGhpcy5XZj1uZXcgRGF0ZTt0aGlzLldmLXRoaXMuWHI8dGhpcy52dD90aGlzLncoKTp0aGlzLm0oKX0seHA6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5ZYyhuZXcgUihhKSkpO3RoaXMudygpfSxJbzpmdW5jdGlvbigpe30sd3A6ZnVuY3Rpb24oKXt0aGlzLlhyPW5ldyBEYXRlfX0pfSkoYyk7dmFyIGxhPWMuTWh8fGxhOyhmdW5jdGlvbihjKXtjLk9oPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxmLkRhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFIoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgbGEoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkgoKX19fSl9KShjKTt2YXIgbWE9Yy5PaHx8bWEsbmE9bmV3IG1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnd1PXRoaXMuYVs5XTt0aGlzLlRvPXRoaXMuYVs5XTt0aGlzLkdwPXRoaXMuYVs4XTt0aGlzLmJoPXRoaXMuYVsyXTt0aGlzLmhpPXRoaXMuYVs4XTt0aGlzLkR0PXRoaXMuYVszXTt0aGlzLlR1PXRoaXMuYVs5XTsKdGhpcy5Ucj10aGlzLmFbNV07dGhpcy5mcz10aGlzLmFbNV07dGhpcy5Iaz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxXX1jLkh1PWI7Yi5wcm90b3R5cGU9e3Z1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53dTp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVG86dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdwOnRoaXMuYWgoYSl9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5iaDp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaGk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkR0OnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5UdTp0aGlzLlNyKGEpfSxTcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHI6dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZzOnRoaXMuR2soYSl9LApHazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgb2E9Yy5IdXx8b2EsTmM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMudnUoNCk7KGZ1bmN0aW9uKGMpe2Mucmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdLHRoaXMubHE9ITApO3RoaXMuUihhKTsKdGhpcy5SZigpO3RoaXMuUG49ITF9LFJmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYSgpLGE9dGhpcy52aWRlb1RhZyxnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtpZihnKXtpZigiT0JKRUNUIj09Zy5ub2RlTmFtZXx8IlZJREVPIj09Zy5ub2RlTmFtZSlnPWcucGFyZW50Tm9kZTtnIT1iJiZ0aGlzLk8oZyk7Yj1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2lmKCFiKWI9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF07ZWxzZSBpZih0aGlzLmxxKXt0aGlzLmtxPSEwO3JldHVybn1iJiZiIT1hJiZ0aGlzLlIoYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl9LmJpbmQodGhpcyksNTApfX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihrLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllciwKY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcykpfSxOZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLiRjKGEpfS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpfSwkYzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuT2QmJigwLHRoaXMuT2QpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LApqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxIYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHBhPWMucmp8fHBhOyhmdW5jdGlvbihjKXtjLnFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LENiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5pYzt0aGlzLmlzUGxheWluZz10aGlzLmtjPQohMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmCmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmJiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5iYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMua2M9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkSW1wcmVzc2lvbiIpOwp0aGlzLlJkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5QZiYmIXRoaXMuaGEoKSYmKHRoaXMuYmI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJih0aGlzLkNiKCksdGhpcy5nZXRQbGF5ZXIoKS5Qbj0hMCxrLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2I7YSYmKGEuVGQoKSxhLkFhKCkpfX0uYmluZCh0aGlzKX0pOwppZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5rYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUGYmJiF0aGlzLmhhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMubWMuaW5kZXhPZihhKSYmdGhpcy5tYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5tKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubSgiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMubWMubGVuZ3RoPj10aGlzLnBkJiZ0aGlzLm8oKSl9LEtxOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sbzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKTtmLlhzKGEudmlkZW9UYWcpJiYoYS5rcT90aGlzLm0oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmtjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksNTApKX19KX0pKGMpO3ZhciBxYT1jLnFqfHxxYTsoZnVuY3Rpb24oYyl7Yy5zaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmFwKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07ZHx8KGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2R8fCJPQkpFQ1QiIT1nLm5vZGVOYW1lJiYiVklERU8iIT1nLm5vZGVOYW1lfHwoZD1nKTtpZihkKXt2YXIgZz1uZXcgcGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMubXEoZyl8fCh0aGlzLkwoZyksZz1uZXcgcWEoZyx0aGlzLkEpLApnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGFwOmZ1bmN0aW9uKCl7dmFyIGI9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZi53YihiLmFuY2hvcil9fSl9KShjKTt2YXIgcmE9Yy5zanx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLm5oPXRoaXMuYVsxMF07dGhpcy5yaT10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVs0XX1jLiRnPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50cTp0aGlzLm1oKGEpfSxtaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubmg6dGhpcy5waShhKX0scGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5yaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIHRhPWMuJGd8fHRhLE9jPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLnNxKDQpOyhmdW5jdGlvbihjKXtjLlhsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuTyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5SKGIpOnRoaXMuSCgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB1YT1jLlhsfHx1YTsoZnVuY3Rpb24oYyl7Yy5XbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm0oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5vKCkpfSxvOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgdmE9Yy5XbHx8dmE7KGZ1bmN0aW9uKGMpe2MuWWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8Zi5EYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgdWEoZyksdGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgdmEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgd2E9Yy5ZbHx8d2EseGE9bmV3IHdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zdD10aGlzLmFbMl07dGhpcy51bz10aGlzLmFbOF07dGhpcy5XZz10aGlzLmFbOV07dGhpcy5GdD10aGlzLmFbOV07dGhpcy5BdT10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs3XX1jLlVvPWI7Yi5wcm90b3R5cGU9e3J0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLnRvKGEpfSx0bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudW86dGhpcy5WZyhhKX0sVmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldnOnRoaXMuRXQoYSl9LEV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GdDp0aGlzLnp1KGEpfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgeWE9Yy5Vb3x8eWEsUGM9bmV3IHlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLnJ0KDQpOyhmdW5jdGlvbihjKXtjLkpsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLk8oYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUihiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sSzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnBiKGIpfS5iaW5kKHRoaXMpKX0scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkomJnRoaXMuSigpfSxOYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5leGl0RnVsbHNjcmVlbigpfSwKY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB6YT1jLkpsfHx6YTsoZnVuY3Rpb24oYyl7Yy5JbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy56Zz0hMDt0aGlzLnRkPXRoaXMueWY9ITE7dGhpcy5TZigpO3RoaXMuQm4oKTt0aGlzLkhhKCl9LHl2OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5mYigpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5iYSwiOyIsCnR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5zYToKInVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLmxkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLm1kOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuRj9iLkYubWE6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2Q6InVuZGVmaW5lZFgiLAoiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuYWcpfSxTYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sVmI6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGI9CnRoaXMuU2EoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLlhiKXt2YXIgYj10aGlzLlNhKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWGI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlhiPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWGJ9LGlxOmZ1bmN0aW9uKCl7aWYoIXRoaXMueGYpe3ZhciBiPXRoaXMuU2EoKSxhPXRoaXMuZ3EoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJgoodGhpcy54Zj0hMCl9cmV0dXJuIHRoaXMueGZ9LGdxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5xYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMucWM9ITApO3JldHVybiB0aGlzLnFjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYKKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXt0aGlzLmJlKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxiZTpmdW5jdGlvbigpe3RoaXMudGQ9ITA7dmFyIGI9dGhpcy5rZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2YuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2YuaWIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPQohMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMuTmJ8fCh0aGlzLmwoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLlcoKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksCjIwKX0sanY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlRlJiZiLmFkcyYmKHRoaXMuVGU9Yi5hZHMpO3JldHVybiB0aGlzLlRlfSxCbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuVygpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpOwpiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKX0sVmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDUwKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuaXEoKSl7dmFyIGE9dGhpcy5TYSgpLGc9dGhpcy5WYigpO2EmJmcmJih0aGlzLlNhKCksdGhpcy5WYigpLHRoaXMudGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZD90aGlzLm0oKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5TYSgpfWVsc2UgdGhpcy55Zj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhKCksYj10aGlzLlZiKCk7YSYmIWI/KHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuU2EoKTt0aGlzLlZiKCl9LmJpbmQodGhpcyksMTAwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuVygpKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy55Zj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl9LmJpbmQodGhpcyksNTApfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYKKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LENuOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihiLmFkcyl7aWYodGhpcy5RYiE9Yi5hZHMuc3RhdGUmJih0aGlzLlFiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLlFiKXt0aGlzLm0oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuUWI9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNuKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITA7dGhpcy5tKCJlbXB0eSB2YXN0Iil9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuemc9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuemcsZnVuY3Rpb24oKXt0aGlzLlZlKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApIbjpmdW5jdGlvbigpe3RoaXMudHZ8fCgxMDx0aGlzLml1Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApKToodGhpcy5pdSsrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnBzKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhuKCl9LmJpbmQodGhpcyksNTApKSl9LHBzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLmp1KXt0aGlzLmp1PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrCmEsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBBYT1jLklsfHxBYTsoZnVuY3Rpb24oYyl7Yy5LbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1nKGJbZ10pfWNhdGNoKGQpe310aGlzLkgoKX19LG1nOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYuRGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgemEoYltnXSksYS5qYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBBYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxIOmZ1bmN0aW9uKCl7dGhpcy5xYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmFjKX19KX0pKGMpOwp2YXIgQmE9Yy5LbHx8QmEsQ2E9bmV3IEJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk11PXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzZdfWMuU3M9YjtiLnByb3RvdHlwZT17THU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk11OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgRGE9Yy5Tc3x8RGEsUWM9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuTHUoNCk7KGZ1bmN0aW9uKGMpe2Mudmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpOwpiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuTyhhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe30scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSiYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKToKYi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEVhPWMudmx8fEVhOyhmdW5jdGlvbihjKXtjLnVsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLnpiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmVjPSExO3RoaXMuYmcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9CmIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLm0oKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZWM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy51YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlFlKCk6dGhpcy5tKCl9LHVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlOwphLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMubSgpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5lYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZWM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy51Yy5iaW5kKHRoaXMpLAoxMDApfX0sUWU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuemIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuemImJih0aGlzLnpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lY3x8Cih0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFlLmJpbmQodGhpcyksNTApfX0sYmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5lYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJgp0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZhPWMudWx8fEZhOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBFYSh2aWRlbyk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgRmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIEdhPWMud2x8fEdhLEhhPW5ldyBHYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLmRyPQpiO2IucHJvdG90eXBlPXtiajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgSWE9Yy5kcnx8SWEsUmM9bmV3IElhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuYmooNCk7KGZ1bmN0aW9uKGMpe2MueGg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5RZj1hfSxOOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLlFmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFmKS5wYXJlbnROb2RlO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKSzpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgSmE9Yy54aHx8SmE7KGZ1bmN0aW9uKGMpe2Mud2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIEthPWMud2h8fEthOyhmdW5jdGlvbihjKXtjLnloPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IEphKGQsYSksdGhpcy5JKGQpfHwoZC5MZChhKSx0aGlzLkwoZCksCmQ9bmV3IEthKGQsdGhpcy5BLGcpLGQuTGQoZyksZC5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgTGE9Yy55aHx8TGEsTWE9bmV3IExhKGNhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zaD10aGlzLmFbOF07dGhpcy5Sbz10aGlzLmFbNl07dGhpcy5MdD10aGlzLmFbMV07dGhpcy5Ecj10aGlzLmFbNV07dGhpcy5Qcj10aGlzLmFbNV07dGhpcy53aj10aGlzLmFbN107dGhpcy5qbD10aGlzLmFbOV07dGhpcy5GdT10aGlzLmFbNV07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLmpoPWI7Yi5wcm90b3R5cGU9e3JoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zaDp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm86dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT8KdGhpcy5MdDp0aGlzLkNyKGEpfSxDcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHI6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlByOnRoaXMudmooYSl9LHZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53ajp0aGlzLmlsKGEpfSxpbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamw6dGhpcy5FdShhKX0sRXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GdTp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgTmE9Yy5qaHx8TmEsU2M9bmV3IE5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MucmgoNCk7KGZ1bmN0aW9uKGMpe2MuV2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLk8oYik7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sWGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmMDwkKCJib2R5LmRldmljZV9tb2JpbGUiKS5sZW5ndGgmJihiPSEwKTtyZXR1cm4gYn0sSzpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgT2E9Yy5Xanx8T2E7KGZ1bmN0aW9uKGMpe2MuVmo9CnQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlhhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMubGMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpKTp0aGlzLmxjKCl9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkP2IuYWRDb250ZXh0Ll9hZFJlc3BvbnNlP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpOwp2YXIgUGE9Yy5Wanx8UGE7KGZ1bmN0aW9uKGMpe2MuWGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBPYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFBhKGIsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBRYT1jLlhqfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW09dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVszXTt0aGlzLnFoPXRoaXMuYVsxXTt0aGlzLmlrPXRoaXMuYVszXTt0aGlzLlppPXRoaXMuYVs1XTt0aGlzLkhyPXRoaXMuYVs2XTt0aGlzLkxwPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5uaj0KdGhpcy5hWzNdO3RoaXMuR289dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMl19Yy5CbD1iO2IucHJvdG90eXBlPXtMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTW06dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmV0OnRoaXMucGgoYSl9LHBoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucWg6dGhpcy5oayhhKX0saGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlrOnRoaXMuWWkoYSl9LFlpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5aaTp0aGlzLkdyKGEpfSxHcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHI6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxwOnRoaXMuQXMoYSl9LEFzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQnM6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5qOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuR286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBTYT1jLkJsfHxTYSxUYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5MbSg0KTsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLlVkPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLk8oYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlIoYik6dGhpcy5kYSgpfSxZcjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5ZYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5UZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWQ9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuVWQrKztpZigxMDx0aGlzLlVkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkomJnRoaXMuSigpfX0pfSkoYyk7dmFyIFRhPWMuQWt8fFRhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkVvPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLkVvPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuWXIoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFVhPWMuemt8fFVhOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVGEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkkoYSl8fCh0aGlzLkwoYSksKG5ldyBVYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgVmE9Yy5Ca3x8VmEsV2E9bmV3IFZhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlF0PXRoaXMuYVs4XTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLmppPXRoaXMuYVszXTt0aGlzLmd1PXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzFdfWMudXM9YjtiLnByb3RvdHlwZT17UHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ubDp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuamk6dGhpcy5mdShhKX0sZnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzoKYX19fSkoYyk7dmFyIFhhPWMudXN8fFhhLFVjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVVjLlB0KDQpOyhmdW5jdGlvbihjKXtjLk9pPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5PKGIuZWxlbWVudCk7dGhpcy5SKGIuZWxlbWVudCl9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIFlhPWMuT2l8fFlhOyhmdW5jdGlvbihjKXtjLk5pPQp0LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmRldGFpbCYmIjEwMTAiPT1iLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCl9fSl9KShjKTt2YXIgWmE9Yy5OaXx8WmE7KGZ1bmN0aW9uKGMpe2MuUGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLGZ1bmN0aW9uKGIpe2I9bmV3IFlhKGIuZGV0YWlsKTtiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuQSkpLmIoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciAkYT1jLlBpfHwkYSxhYj1uZXcgJGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWc9dGhpcy5hWzNdO3RoaXMuWHA9dGhpcy5hWzhdO3RoaXMuS2g9dGhpcy5hWzZdO3RoaXMubGk9dGhpcy5hWzhdO3RoaXMuRGk9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzZdO3RoaXMudmk9dGhpcy5hWzhdO3RoaXMuWmo9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbNl19Yy5IcD1iO2IucHJvdG90eXBlPXtUZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWc6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlhwOnRoaXMuSmgoYSl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5LaDp0aGlzLmtpKGEpfSxraTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubGk6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5EaTp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLktvOnRoaXMudWkoYSl9LHVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52aTp0aGlzLllqKGEpfSxZajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGJiPWMuSHB8fGJiLFZjPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVZjLlRnKDQpOyhmdW5jdGlvbihjKXtjLmtqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1mLmhmKGIsImVsZW1lbnRJRCIpO3RoaXMuWWY9Yi5wb3NpdGlvbmluZzsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuTyhnKTt0aGlzLlIoZyk7dGhpcy5EYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuRGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkRjKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCkduOmZ1bmN0aW9uKCl7Zi5EZih0aGlzLkRjKTtmLkVmKHRoaXMuRGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HbigpfS5iaW5kKHRoaXMpLDUwKX0sSzpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxIZDpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGNiPWMua2p8fGNiOyhmdW5jdGlvbihjKXtjLmpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBkYj1jLmpqfHxkYjsoZnVuY3Rpb24oYyl7Yy5saj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLndhPTE1MDA7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoayYmay5pbnJlYWQpe3ZhciBiPWsuaW5yZWFkLGE9Zi5oZihiLCJlbGVtZW50SUQiKTtmLkRmKGEpJiYoYj1uZXcgY2IoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgZGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLnFiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5xYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZWI9Yy5sanx8ZWIsZmI9bmV3IGViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVoPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzFdfWMuZ3M9YjtiLnByb3RvdHlwZT17ZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVoOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgZ2I9Yy5nc3x8Z2IsV2M9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9V2MuZGgoNCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5VaT1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxIczpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LEJtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB6PWMuVWl8fHo7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5JYT1hO3RoaXMuZGY9dGhpcy5LZz0hMTt0aGlzLlRmPWQ7dGhpcy5uZz0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5JYT1uZXcgeihhKSk7dmFyIGY9dGhpcy5OYT1uZXcgWE1MSHR0cFJlcXVlc3Q7Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Zi5yZWFkeVN0YXRlfHwKMjAwIT1mLnN0YXR1cyYmMjAxIT1mLnN0YXR1c3x8ZyhmKTtpZihkJiY0PT1mLnJlYWR5U3RhdGUmJjIwMCE9Zi5zdGF0dXMmJjIwMSE9Zi5zdGF0dXMpZChmKTtlbHNlIGlmKDQ9PWYucmVhZHlTdGF0ZSYmMD09Zi5zdGF0dXMmJm0mJm0uRmQodGhpcy5JYS51cmwpJiZtLmRkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5IcygiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxtLmdhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5nYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9Zi5yZWFkeVN0YXRlJiZjKGYpfS5iaW5kKHRoaXMpfWMuVmk9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEuZGF0YTsKaWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmRmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5uZz90aGlzLk5hLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITEpOnRoaXMuTmEub3Blbih0aGlzLklhLm1ldGhvZCx0aGlzLklhLnVybCwhMCksdGhpcy5LZ3x8KHRoaXMuTmEud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGsmJmsudnBhaWQmJm0mJm0uT2ModGhpcy5JYS51cmwpJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuTmEuc2VuZChhKX1jYXRjaChjKXttJiYKbS5GZCh0aGlzLklhLnVybCk/bS5kZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmYudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkZkKHRoaXMuSWEudXJsKSx0aGlzLlRmJiZ0aGlzLlRmKCl9cmV0dXJuIHRoaXMuTmF9fX0pKGMpO3ZhciBoYj1jLlZpfHxoYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnVkPXRoaXMuZWI9bnVsbDt0aGlzLlZuPXRoaXMubmI9dGhpcy5MZj0hMTt0aGlzLnVhPSIiO3RoaXMuR2Y9ITE7dGhpcy56YT10aGlzLkpjPSIiO3RoaXMuQ2Y9dGhpcy5ZPXRoaXMuaXNFbmFibGVkPXRoaXMuWmQ9ITE7dGhpcy5NYT1bXTt0aGlzLnRmPXRoaXMuRmI9IiI7dGhpcy55ZD0hMTt0aGlzLmtlPTA7dGhpcy55ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5zYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7CnRoaXMuaGM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMueGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMub2I9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMubGU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5DZD0hMTt0aGlzLkluPXRoaXMuZWQ9bnVsbDt0aGlzLmZjPXRoaXMuQWc9dGhpcy5uZT10aGlzLmRkPXRoaXMudmQ9dGhpcy5qYz0hMTt0aGlzLlBhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfX1jLldpPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmViLGFkdGFncmVnZXg6dGhpcy51ZCxqc3BvcHVwczp0aGlzLkxmLHNpZGVsb2Fkczp0aGlzLm5iLGRpc2FibGV0ZXN0czp0aGlzLlZuLGhvbWFkQWxpYXM6dGhpcy51YSwKaXNJbml0aWFsaXplZDp0aGlzLkdmLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnphLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5DZixzZXJ2ZXI6dGhpcy5NYSxzdm1Db25maWc6dGhpcy5GYixob21hZEFkcGF0aDp0aGlzLnRmLGRpc2FibGVDb29raWVUZXN0OnRoaXMueWQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMua2UsSE9NQURfVkVSSUZJRUQ6dGhpcy55ZSxIT01BRF9CTE9DS0VEOnRoaXMud2UsSE9NQURfTk9CTE9DS0VSOnRoaXMuc2IsSE9NQURfQURCTE9DS0VSOnRoaXMuaGMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLnhlLHRlc3RIaWRlOnRoaXMuSGIsdGVzdFRhZ3M6dGhpcy5vYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMubGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5DZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkluLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLmpjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy52ZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5kZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5uZSxjb25maWdGYWlsdXJlczp0aGlzLlBhLHNpdGVDb25maWc6dGhpcy5FYixzZXJ2ZXJJZDp0aGlzLmZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5TYix2cGFpZDp0aGlzLmZjfX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuUGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5QYVtiXSYmMT09dGhpcy5QYVtiXSYmKGE9ITApO3JldHVybiBhfSxjZTpmdW5jdGlvbihhKXt0aGlzLlBhW2FdPSEwfSxicDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYxPT10aGlzLlBhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LFpzOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhOwphPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLmxuKGEpfSxUYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZj0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuT2MoYSk7Zj10aGlzLkthKGEpO2M/KHRoaXMuWmIoKT9oPWE6aD1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixrPWYucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMuYWUoKSxrPWYucGF0aC5zdWJzdHIoMSkrCihmLnF1ZXJ5PyI/IitmLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuT2J8fHRoaXMuZWJ8fHRoaXMudWQpJiYoaz10aGlzLlNxKGspKTthPW5ldyB6KGgpO2EudXJsPWg7aD0iIjtoPWM/Zi5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuY3AoZi5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxPYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuWmIoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuTWEmJnRoaXMuTWEubGVuZ3RoJiYwPHRoaXMuTWEubGVuZ3RoJiYoYj10aGlzLk1hWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuT2MoYSk7cmV0dXJuIGJ9LGNwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSwKYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5idjtyZXR1cm4ibm9uZSJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWFbdGhpcy5mZ119LGFlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5MYygpLGI9dGhpcy5qZygobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxTcTpmdW5jdGlvbihhKXt0aGlzLk9iJiYoYSs9dGhpcy5PYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7cmV0dXJuIGF9LGM6ZnVuY3Rpb24oYSxiLGQsYyxmLGgpe209dGhpczt0aGlzLkdmPSEwO3RoaXMuSmM9YTt0aGlzLnphPWI7dGhpcy5aZD1kO3RoaXMuZWQ9Yzt0aGlzLkJjPWY7dGhpcy5FYj0KaDt0aGlzLkZxKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnphKXRoaXMuRHEoKTtlbHNlIHRyeXt0aGlzLnphPWIoKSx0aGlzLndjKCl9Y2F0Y2goayl7dGhpcy5nYSgibm9DbGllbnRDb25maWciKX19LFphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxGcTpmdW5jdGlvbigpe3RoaXMuRmEobmV3IHoodGhpcy5KYyt0aGlzLm9jKCJnbG9iYWwiKSksdGhpcy5zcC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLndjKCl9LmJpbmQodGhpcyksITApfSxEcTpmdW5jdGlvbigpe25ldyB6KHRoaXMuemErdGhpcy5vYygiY2xpZW50IikpO3RoaXMuRmEobmV3IHoodGhpcy56YSt0aGlzLm9jKCJjbGllbnQiKSksdGhpcy53Yy5iaW5kKHRoaXMpLApmdW5jdGlvbigpe3RoaXMuY2UoImNsaWVudCIpO3RoaXMuZ2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LG9jOmZ1bmN0aW9uKGEpe3ZhciBiPSI/Y2FjaGU9Iit0aGlzLmtiKCk7dGhpcy5FYiYmdGhpcy5FYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuRWImJnRoaXMuRWIubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxnYTpmdW5jdGlvbihhKXtpZighdGhpcy52ZCl7dGhpcy52ZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuQ2Y9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndlKSk7dGhpcy5yYigpO2YuVGIobC5Ocik7KGI9Zi5vZih0aGlzLkxjKCkpKXx8KGI9Zi5vZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sc3A6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnphfHx0aGlzLkZifHx0aGlzLnVhfHx0aGlzLndjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX19LHdjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnphfWVsc2UgYT10aGlzLnphO3RoaXMuaXNFbmFibGVkPXRoaXMuSmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuTWE9YS5zZXJ2ZXJ8fFtdO3RoaXMuRmI9YS5jb25maWd8fCIiO3RoaXMudWE9YS5hbGlhc3x8bnVsbDt0aGlzLnRmPWEuYWRwYXRofHwiIjt0aGlzLnlkPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuZmc9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuTWEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5GYiYmdGhpcy51YSYmdGhpcy5NYS5sZW5ndGg/dGhpcy5RYyghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX0sUWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9Cm5ldyB6KHRoaXMuYWUoKSksYz10aGlzLkthKHRoaXMuRmIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5GYit0aGlzLm9jKCJjdXN0b21lciIpKTt0aGlzLkZhKGIsdGhpcy5hdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiY3VzdG9tZXIiKTthP3RoaXMuYWw/dGhpcy5nYSgibm9TVk1Db25maWciKToodGhpcy5hbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuUWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGF0OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5kZD0KdGhpcy5KYihiLnN0cmljdCk7dGhpcy5uZT10aGlzLkpiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkFnPWIuZHVyYXRpb25fY2hlY2tfZW5hYmxlZHx8ITE7dGhpcy5TYj10aGlzLkpiKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuSGI9Yi50ZXN0aGlkZXx8IiI7dGhpcy5vYj1iLnRlc3RhZHRhZ3N8fFtdO3RoaXMuSWI9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PYj1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmViPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnVkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLkxmPWIuanNwb3B1cHN8fCExO3RoaXMubmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuZmM9Yi52cGFpZHx8ITE7dGhpcy5FYi52cGFpZD10aGlzLmZjO3RoaXMuR2I9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMubXAoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnlkJiYodGhpcy5HYj1udWxsKTt0aGlzLmxlPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuQ2QmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkNkPSEwLHRoaXMuUWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMudHQoKSYmKHRoaXMuSGJ8fHRoaXMuSWJ8fHRoaXMub2J8fHRoaXMuR2IpP3RoaXMuWmQ/KHRoaXMub2E9dGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy53ZCgpLHRoaXMucmIoKSk6dGhpcy5qdCgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmt0KCkpfX0sanQ6ZnVuY3Rpb24oKXt0aGlzLml0KCl9LGt0OmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSk7dGhpcy5yYigpfSxjZDpmdW5jdGlvbihhKXt0aGlzLmpjPQohMDt0aGlzLll8fCh0aGlzLlk9dGhpcy5vYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEoYSkpLHRoaXMucmIoKSx0aGlzLndkKCkpfSxpdDpmdW5jdGlvbigpe2lmKHRoaXMuSGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZSl7fWE/dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMucWcoKX1lbHNlIHRoaXMucWcoKX0scGc6ZnVuY3Rpb24oKXt2YXIgZTt2YXIgYztmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoKSk7dGhpcy5udChlLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuaWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmNkKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX10aGlzLm9iPW51bGwsdGhpcy5pZSgpfSxudDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZSgpe2YoKSYmYigpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dGhpcy5GYShuZXcgeihhKSxlLGZ1bmN0aW9uKCl7ZigpJiZjKCl9KX0scWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLmtiKCkpO3RoaXMub3QoZSwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBnLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLkliJiZ0aGlzLkliLmxlbmd0aCl7dmFyIGM9dGhpcy5JYi5zbGljZSgpLGU7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnBnKCl9LG90OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBlKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZigpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZmKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1lO2wub25lcnJvcj1mO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobSl7ZSgpfX0saWU6ZnVuY3Rpb24oKXt0aGlzLkdiPyh0aGlzLmtlKyssdGhpcy5GYShuZXcgeih0aGlzLkdiKSx0aGlzLmh0LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMub2coKX0samU6ZnVuY3Rpb24oYSl7dGhpcy5jZCh0aGlzLnhlLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saHQ6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMua2U/dGhpcy5pZSgpOnRoaXMuamUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5vZygpOnRoaXMuamUoIkFBQSIpfSxvZzpmdW5jdGlvbigpe3RoaXMuWT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy5zYikpO3RoaXMucmIoKTt0aGlzLndkKCl9LHJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO2YuWGEoKSYmKGE9IjEiKTt0aGlzLmpjJiYoYj0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy55ZSkpO3RoaXMuZWQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZCYmdGhpcy5lZCgpfSxGbjpmdW5jdGlvbigpe2lmKHRoaXMubmUmJnRoaXMuenAoKSl7dmFyIGE9dGhpcy5icCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sdGc6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9CiJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRmE6ZnVuY3Rpb24oYSxiLGMsZSxoLEljKXthPW5ldyBoYihhLGIsYyk7ZSYmKGEuS2c9ITApO2gmJmYubnEoKSYmKGEuZGY9ITApO0ljJiYoYS5uZz0hMCk7cmV0dXJuIGEubG9hZCgpfSxPZTpmdW5jdGlvbigpe2YuWGEoKXx8Zi5ZYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZT0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5nYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7ZT0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLlpiKCl8fChhPXRoaXMuS2EoZSksZT1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZSl9ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sRW46ZnVuY3Rpb24oKXt0aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkZhKGEsdGhpcy5WdC5iaW5kKHRoaXMpLHRoaXMuVXQuYmluZCh0aGlzKSl9LFZ0OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7cmV0dXJufWN8fHRoaXMuem8oKX0sVXQ6ZnVuY3Rpb24oKXt9LHpvOmZ1bmN0aW9uKCl7Zi5UYihsLnlvKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx3ZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm5iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMubmIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5uYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZi5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKX19LHR0OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMubGV9LG1wOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCwKYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHdiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGUsZixoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8ZT4+NCxrPShlJjE1KTw8MnxmPj42LGw9ZiY2Myxpc05hTihlKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxLYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgYz17fSxlPTE0O2UtLTspY1tiW2VdXT1hW2VdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsZixoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGU9MDtlPG4tMztlKz00KWY9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsxKTw8MTZ8YS5jaGFyQ29kZUF0KGUrMik8PDh8YS5jaGFyQ29kZUF0KGUrMykseS5wdXNoKGYpOwpzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHkucHVzaChlKTsxNCE9eS5sZW5ndGglMTY7KXkucHVzaCgwKTt5LnB1c2gobj4+PjI5KTt5LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT15W2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09YyhoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtmPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihlPTA7MTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8fm4mdykrdCtoW2VdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtmb3IoZT0yMDszOT49ZTtlKyspeD1jKGYsNSkrKG5ecF53KSt0K2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZixmPXg7Zm9yKGU9NDA7NTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8biZ3fHAmdykrdCtoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsZj14O2ZvcihlPTYwOzc5Pj1lO2UrKyl4PWMoZiw1KSsobl5wXncpK3QraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtrPWsrZiY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGliPWMuV2l8fGliLG09bmV3IGliO3dpbmRvdy5ndj1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMTBdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuRXA9dGhpcy5hWzRdO3RoaXMuYWs9dGhpcy5hWzJdO3RoaXMuT3Q9dGhpcy5hWzZdO3RoaXMuVnA9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19Yy5wcj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY2s6dGhpcy56dChhKX0senQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkF0OnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRXA6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFrOnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpOwp2YXIgamI9Yy5wcnx8amIsWGM9bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuYmsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5qPWE7YS51Lks/dGhpcy5MYT1hLnUuSygpOnRoaXMuTGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5qLlFhO3RoaXMucGxheWVyPXRoaXMuai51O3RoaXMucmM9ITE7dGhpcy5qbj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmJkPXt9O3RoaXMucGM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5wYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmoudSkmJnRoaXMuai51LkImJihhPXRoaXMuai51LkIoKSksdGhpcy5wYz1jLmFkbWVzc2FnZShhKSkpOwpjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuSW09Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5hZD0hMTt0aGlzLk5mPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLnM9e307dGhpcy5uYz0hMTt0aGlzLndnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuWWI9ITE7dGhpcy5Sbj1mLnBhKDEwKTt0aGlzLlRjPWYucGEoMTApO3RoaXMuUGQ9Zi5wYSgxMCk7dGhpcy5rZz1mLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkFiPSExO3RoaXMuemQ9bnVsbDt0aGlzLkFjPXRoaXMubGc9dGhpcy5VZj10aGlzLkVjPXRoaXMud3Q9dGhpcy5hYj0hMX1jLlFpPWI7Yi5wcm90b3R5cGU9e2dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuTGFdJiYKdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSx1ZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5FYSYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULmpjP2YudHJhY2soImFkY2FsbCIsIjEiKTpmLnRyYWNrKCJhZGNhbGwiLCIwIik7Zi50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2YuRChsLnVtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSl9LEpkOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmFiPWM7aWYodGhpcy5ULlkpdGhpcy5ULkZuKCksdGhpcy5ULm9hJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5mY30pKTpiPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLlQuZmMsCnVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5BYSgpO2Vsc2V7dmFyIGU9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5KZChhLGIsYyl9LDUwKX19LFZkOmZ1bmN0aW9uKGEpe3RoaXMuRWM9ITE7dGhpcy5zPWE7dGhpcy5Qcyh0aGlzLnMpO3RoaXMucGYoYSl9LHBmOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLmJkPXRoaXMub3AoYSkpLHRoaXMucGYoYS5wYXJlbnQpKX0sb3A6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxlPVtdLGY9W10saD0iIjtpZihhLmFhKXtiPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtlPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5hYS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuYWEuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSk7YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmCihoPWEuYWEuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGUubGVuZ3RoO2srKyllW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZVtrXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGgpKSxlW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS55YihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZixhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQ2MmJmEuQ2MuZXJyb3ImJmEuQ2MuZXJyb3IuY29kZSYmKGI9YS5DYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmdjLmNvZGU6Yj09Qy5qZC5jb2RlPwpmLkQobC5zdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpOihmLktkKCksYj09Qy5CZS5jb2RlJiZmLkQobC5acSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKTtmLkQobC54byx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHguemUuY29kZTpmLkQobC5XdCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguQ2UuY29kZTpmLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtmLkQobC5CdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LmtkLmNvZGU6Zi5EKGwuR3UsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmhkLmNvZGU6Zi5EKGwuJHEsCnRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksZi50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChmLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7Zi50cmFjayhjLCIiLCEwKTt0aGlzLnhiKGEpO3RoaXMuQWEoKX0seGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLnlhLmxlbmd0aDspdHJ5e3ZhciBjPWEueWEucG9wKCk7dGhpcy5JZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZSl7fX0sUHM6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJgooYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWI7Yj10aGlzLmouQztiLnp2PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5JbSYmdGhpcy5wbGF5ZXIuSGMoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkhjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuQ20oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLnNnKGIpPyh0aGlzLkVtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLAp0aGlzLmNhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmNhLmFwcGVuZENoaWxkKGIpKTp0aGlzLnMuTW4oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLk5zKCkpOnRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5zLm9yaWdpbi4kZSh4LmhkKX0sTnM6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2E9YS5yZXBsYWNlKC8mYW1wOy9nLCImIik7YT1hLnJlcGxhY2UoLyZsdDsvZywiPCIpO2E9YS5yZXBsYWNlKC8mZ3Q7L2csIj4iKTtyZXR1cm4gYT1hLnJlcGxhY2UoLyZxdW90Oy9nLCciJyl9Zi5TZSgpO3RoaXMucyYmdGhpcy5zLm9yaWdpbiYmdGhpcy5zLm9yaWdpbi50ZSYmCmYuRm0odGhpcy5zLm9yaWdpbi50ZSk7Zi4kYSgic2V0VXBWcGFpZCIpO3ZhciBiPXRoaXMuai5DO3RoaXMuai5DPUIucG9wKCk7Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmouQyxiKTt0aGlzLmouVmYoKTt0aGlzLmouY2MoKTtmb3IoYj10aGlzLmouRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5qLmNjKCk7dGhpcy5YPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7CnRoaXMuai5HLmFwcGVuZENoaWxkKHRoaXMuWCk7dGhpcy5YLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBiPXRoaXMucy5xcCgpLGM9YSh0aGlzLnMuUC5PcmlnaW5hbEFkUGFyYW1ldGVycyksZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmouRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLmhlaWdodCl9fX07Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLApnKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2I9Zi55bigiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuVCk7dGhpcy5YLnNyYz1iO2YucmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJnRoaXMubnUoKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJnRoaXMub3UoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJ1KCksIkFkVmlkZW9Db21wbGV0ZSI9PQphLmRhdGEubmFtZSYmdGhpcy5xdSgpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5wdSgpKX0uYmluZCh0aGlzKSk7Zi5yZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpKTtmLnJkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSl9LG91OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iil9LG51OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2YuJGEoImltcHJlc3Npb24iKX0sSGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2YuJGEoInN0YXJ0Iil9LEdnOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2YuJGEoImZpcnN0UXVhcnRpbGUiKX0scnU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7Zi4kYSgidGhpcmRRdWFydGlsZSIpfSxxdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNvbXBsZXRlIik7CmYuJGEoImNvbXBsZXRlIil9LHB1OmZ1bmN0aW9uKCl7Zi4kYSgiYWRzdG9wcGVkIik7dGhpcy5BYSgpfSxDbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBlPWIsZj10aGlzLlQ7Zi5vYSYmZi5pc0VuYWJsZWQmJiFmLlpiKCk/KGU9Zi5LYShlKSxiPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTpiPWU7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmV1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxFbTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMucmUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5wZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmZkLmJpbmQodGhpcykpfSxYYzpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LEZnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW8uY29udHJvbHM9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFlKGEpfS5iaW5kKHRoaXMpLHRoaXMuam4pfSxxZTpmdW5jdGlvbihhKXt0cnl7aWYoIWYuWGEoKSYmCnRoaXMuVC5BZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQWJ8fCh0aGlzLkFiPSEwLHRoaXMuWGModGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMucmN8fCF0aGlzLnNnKHRoaXMudmlkZW8pfHx0aGlzLkFifHwodGhpcy5yYz0hMCx0aGlzLmR1KCksdGhpcy52aWRlby5jb250cm9scz0hMSx0aGlzLmouY2MoKSx0aGlzLkNnKCksdGhpcy5EZygpLHRoaXMuTWUoKSx0aGlzLmouVmYoKSx0aGlzLnZpZGVvLnBsYXkmJnRoaXMuaGUoKSl9LGhlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZi5FYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5LYz1bXTtmb3IodmFyIGI9CnRoaXMuai5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLktjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5vZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTsKdmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2YudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtmLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMub2QoKX1lbHNlIHRoaXMub2QoKX0sb2Q6ZnVuY3Rpb24oKXtpZih0aGlzLktjKWZvcih2YXIgYT0wO2E8dGhpcy5LYy5sZW5ndGg7YSsrKXRoaXMuS2NbYV0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChhPXRoaXMudmlkZW8ucGxheSgpKSYmYVsiY2F0Y2giXSlhWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWEoKSxmLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsIiIsITApKX0uYmluZCh0aGlzKSk7WT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQmIuYmluZCh0aGlzKSkpOkg9ZnVuY3Rpb24oKXt0aGlzLm5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5oZSgpKX0uYmluZCh0aGlzKTt0aGlzLm5mKCkuaGcodGhpcyl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtmLkQobC5wbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMucy52Yj8odGhpcy5yYz0hMSx0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuYWQ9ITEsdGhpcy5qLnlnKCksdGhpcy5zLm9yaWdpbi5RZCgpKTp0aGlzLkFhKCl9LGV1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5mZChhKSl9LGZkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkVkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuT2UoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5PZSgpKTt0aGlzLnMub3JpZ2luLiRlKHguaGQpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMud3QpdGhpcy5BYSgpO2Vsc2V7dGhpcy5ZYj0hMDt0aGlzLmoudS5qYiYmIXRoaXMubGcmJnRoaXMuai51LmpiKCkmJmYuRChsLnljLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTsKdGhpcy5CdChhKTt2YXIgYj0iIjtpZih0aGlzLnMuZ2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMua2cpO2MmJihiPXRoaXMucy5nZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5hZHx8KHRoaXMuYWQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7Zi5EKGwudm0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTt0aGlzLnMudmI/KHRoaXMucmM9ITEsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmFkPSExLHRoaXMuai55ZygpLHRoaXMucy5vcmlnaW4uUWQoKSk6dGhpcy5BYSgpfS5iaW5kKHRoaXMpKSkpLApjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMubmM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwKImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5pcCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmouY2MoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuRWcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuQ2coKTt0aGlzLkRnKCk7dGhpcy56ZD1zZXRJbnRlcnZhbCh0aGlzLkRuLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0saXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZT1iPXRoaXMucy5NW2NdLGY7Zj1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmCmguaXNFbmFibGVkJiYhaC5aYigpJiYoZj1oLkthKGYpLGY9Zi5wcm90b2NvbCsiOi8vIitmLmhvc3QpO2UudXJsPWY7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sRG46ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLnpkKSx0aGlzLnBlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMucmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuemQpLHRoaXMuZmQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSx2ZzpmdW5jdGlvbigpe3RoaXMuVWZ8fCh0aGlzLlVmPSEwLHRoaXMuRWN8fApmLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sQnQ6ZnVuY3Rpb24oYSl7YT09dGhpcy53Z3x8dGhpcy5BYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy52ZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZmLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5BYnx8Zi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGYuWGEoKSYmZi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLApmLkQobC5ybSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpLGYuRChsLndtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy5SYiYmZi50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5FYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGYuRChsLnFtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLkQobC50bSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsCiJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGYuRChsLnltLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGYuRChsLnptLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy53Zz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5BYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnBwKHRoaXMucy55YSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBlPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmJkLmltcHJlc3Npb25zJiZmLmpxKGUudXJsLHRoaXMuYmQuaW1wcmVzc2lvbnMpP3RoaXMuSWQoZS51cmwsZS50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpOwpmLkQobC5zbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkse2FkSWQ6dGhpcy5iZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSWQoZS51cmwsZS50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMucy55YT10aGlzLlRuKHRoaXMucy55YSxhKSl9fSxJZDpmdW5jdGlvbihhLGIsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuVGEoYSksYyYmYS5CbShjKSxlfHwoZT10aGlzLlplKSx0aGlzLlQuRmEoYSxlLHRoaXMuWmUsITEsITApKX0scHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxUbjpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxkdTpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5FZy5iaW5kKHRoaXMpfSwKRWc6ZnVuY3Rpb24oKXtmLkQobC5Mbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5FYyYmZi5YYSgpJiZmLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZi5YbygpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMudmN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnZjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsCmEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Sbjt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuVGM7Yi5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnl0LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMueHQuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLlpjLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLnRvcD0iLTUwcHgiLGUuc3R5bGUucmlnaHQ9IjBweCIsZS5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtlLmlkPXRoaXMua2c7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2UuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7ZS5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMuZ2UmJmEuYXBwZW5kQ2hpbGQoZSk7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LldhJiZ0aGlzLmoudS5XYSgpJiZ0aGlzLlZxKCk7dGhpcy5XYigpfX0sV2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxaYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSx5dDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVGMpO3RoaXMuai5DLnBhdXNlZD8KKHRoaXMuai5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSk6KHRoaXMuai5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLkQobC5IZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sVGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlRjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5EKGwuSGUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHNzOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLAphLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHh0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWQ/KHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGYudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LFZxOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLAp0aGlzLnRyYWNrKCJtdXRlIiwhMCksZi50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxCYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYik7dGhpcy5BY3x8dGhpcy5uY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuaGUoKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5BYz0hMDt0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1mLkVhJiZ0aGlzLm5jfHwicG9zdHJvbGwiPT1mLkVhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShmLkVhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiYKYSl7Zm9yKHZhciBiPXRoaXMuai5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmouY2MoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy54ZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7CmYudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7Zi50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy54ZCgpfWVsc2UgdGhpcy54ZCgpfSx4ZDpmdW5jdGlvbigpe3RoaXMubGc9ITA7dGhpcy5qLnNmKCk7dGhpcy5qLnRzKCk7dGhpcy5ZYj0hMTtmLkQobC5Rbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMubmYoKS5xcygpfSxuZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxFZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYKKGE9ITApfXJldHVybiBhfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihmLkVmKHRoaXMudmlkZW8sYSk/dGhpcy5zcygpOnRoaXMuVGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKX0uYmluZCh0aGlzKSwxMDApKX0sUzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy52YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy52Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLlFpfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVvPXRoaXMuYVs2XTt0aGlzLmtyPXRoaXMuYVs5XTt0aGlzLmFqPQp0aGlzLmFbOF07dGhpcy5hcz10aGlzLmFbN107dGhpcy5BbD10aGlzLmFbN107dGhpcy5Kaj10aGlzLmFbN107dGhpcy5QcD10aGlzLmFbNF07dGhpcy5paj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLndzPWI7Yi5wcm90b3R5cGU9e2NvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3I6dGhpcy4kaShhKX0sJGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFqOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hczp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQWw6dGhpcy5JaihhKX0sSWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkpqOnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5QcDp0aGlzLmhqKGEpfSxoajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaWo6dGhpcy5mKGEpfSwKZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIga2I9Yy53c3x8a2IsWWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuY28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5KYT1udWxsO3RoaXMuYmE9W107dGhpcy5hYT1udWxsO3RoaXMuTWI9ITE7dGhpcy50ZT0iIjt0aGlzLnNlPSExO2QmJmQuZW1wdHk/dGhpcy5KcSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLkhsPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLldlKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMPwpuZXcgeih0aGlzLnVybCk6bS5UYShtLlpzKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO3RoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmKGIuZGF0YS5ob21hZF9jb21wYXRpYmxlX3ZwYWlkPSJ0cnVlIik7bS5GYShiLHRoaXMuSXEuYmluZCh0aGlzKSx0aGlzLkVxLmJpbmQodGhpcykpfSxmZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuRWEpdHJ5e3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChlKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLkVhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5FYSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PQpnLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZ1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1lLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LElxOmZ1bmN0aW9uKGEpe3RoaXMuanMoYSk7dHJ5e3RoaXMuSmE9YS5yZXNwb25zZVhNTCx0aGlzLkphfHwodGhpcy5KYT0KKG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sSnE6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sRXE6ZnVuY3Rpb24oKXt0aGlzLmZhKHRoaXMuQmEoeC56ZSx7ZGVwdGg6YX0pKX0sUmM6ZnVuY3Rpb24oKXt0aGlzLmFhPQp0aGlzLmJhLnNoaWZ0KCk7dGhpcy5wcSgpP3RoaXMucHQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5xZigpLGcpKTp0aGlzLmZhKHRoaXMuQmEoeC5DZSkpOihhPTAsdGhpcy5TdCgpJiZ0aGlzLlZkKHRoaXMuU24oKSkpfSxRZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5SYygpKTp0aGlzLnBhcmVudC5RZCgpfSxTdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm10KCk/dGhpcy5sdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5CYSh4LnZlKSk6dGhpcy5mYSh0aGlzLkJhKHguTGgpKSwhMSk6KHRoaXMuZmEodGhpcy5CYSh4LmdjLEMuQmUpKSwhMSl9LFZkOmZ1bmN0aW9uKGEpe2EueWE9YS55YS5jb25jYXQodGhpcy5NZCgpKTthLnZiPWEudmI/YS52Yjp0aGlzLk1iO3RoaXMucGFyZW50LlZkKGEpfSxTbjpmdW5jdGlvbigpe3ZhciBhPW5ldyBsYjthLmR1cmF0aW9uPXRoaXMuVWIoKTthLk09dGhpcy5sZigpOwphLnZjPXRoaXMuWW8oKTthLm9yaWdpbj10aGlzO2EuUD10aGlzLlZvKCk7YS5nZT10aGlzLm5wKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLmFhJiYoYi55YT1iLmVycm9yLmNvZGUhPXgudmUuY29kZT9iLnlhLmNvbmNhdCh0aGlzLiRvKCkpOmIueWEuY29uY2F0KHRoaXMuZ3AoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQueGImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC54YiYmdGhpcy5wYXJlbnQueGIoYiksYT0wLHRoaXMuUmMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5mYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx4YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC54YihhKX0sJGU6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQmEoYSxiKSl9LEJhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG1iKGEsYik7Yy5vcmlnaW49dGhpczsKcmV0dXJuIGN9LHB0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sbXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxmKCkubGVuZ3RofSxsdDpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0scmc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sanM6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRlPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy5zZT1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxwcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMucWYoKS5sZW5ndGh9LHFmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuanAodGhpcy5hYSwiVkFTVEFkVGFnVVJJIil9LApNZDpmdW5jdGlvbigpe2Zvcih2YXIgYT1bIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZShnKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnliKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sZ3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sJG86ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFlvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWIodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksc2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLGV2OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnliKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnNjKS1NYXRoLmFicyg3MDAtYi5zYyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksYj1nLmNvbmNhdChkKX1jYXRjaChmKXt9cmV0dXJuIGJ9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtkPWI9dGhpcy5yZihhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1nLnB1c2goYyk7Zi5wdXNoKGQpfTE8YS5sZW5ndGg/KGI9ZyxoPWQpOihiPWMsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sVWI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy55Yih0aGlzLmFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sbnA6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGUpdHJ5e2M9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZz1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5WcyhnLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGQpe2I9ITF9cmV0dXJuIGJ9LGpwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy55YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHliOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmYoYSk6IiJ9LApyZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnJwKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5IbHx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbT10aGlzLmFbMTBdO3RoaXMudm49dGhpcy5hWzldO3RoaXMuZWo9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMl19Yy5RZz1iO2IucHJvdG90eXBlPXtjbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZG06dGhpcy51bihhKX0sdW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuZGooYSl9LGRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5lajp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIG5iPWMuUWd8fG5iLFpjPW5ldyBuYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1aYy5jbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLnlhPVtdO3RoaXMuTT1bXTt0aGlzLnZjPSIiO3RoaXMuUD10aGlzLnZiPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Naz1iO2IucHJvdG90eXBlPXtNbjpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxxcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIGxiPWMuTWt8fGxiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVs2XTt0aGlzLnVwPXRoaXMuYVs4XTt0aGlzLmdoPXRoaXMuYVs1XTt0aGlzLmdqPXRoaXMuYVs0XTt0aGlzLmloPXRoaXMuYVs0XTt0aGlzLnlqPXRoaXMuYVszXTt0aGlzLnRpPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs2XTt0aGlzLkdsPQp0aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLm1pPWI7Yi5wcm90b3R5cGU9e2ZuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nbjp0aGlzLnRwKGEpfSx0cDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudXA6dGhpcy5maChhKX0sZmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmdoOnRoaXMuZmooYSl9LGZqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5najp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWg6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnlqOnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50aTp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVHA6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTsKdmFyIG9iPWMubWl8fG9iLCRjPW5ldyBvYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PSRjLmZuKDQpO3ZhciB4PXtrZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixrYToiWE1MX1BBUlNFX0VSUk9SIn0sTGg6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLGthOiJEVVJBVElPTl9FUlJPUiJ9LGdjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixrYToiRU1QVFlfVkFTVCJ9LENlOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsCm1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixrYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0semU6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsa2E6IkxPQURfRVJST1IifSxoZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLAptZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sVXU6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsa2E6Ik1FRElBRklMRV9FUlJPUiJ9LHZlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLGthOiJEVU1NWV9BRCJ9fSxDPXtBZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLGthOiJOT19BRFMifSxCZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsa2E6Ik5PX01FRElBRklMRVMifSxXdTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIiwKa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5WbT10aGlzLmFbM107dGhpcy5RdT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs1XX1jLlpnPWI7Yi5wcm90b3R5cGU9e1VtOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5WbTp0aGlzLlB1KGEpfSxQdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy5aZ3x8cGIsYWQ9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9CmFkLlVtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuQ2M9Yjt0aGlzLnlhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy53aT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1iPWMud2l8fG1iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldrPXRoaXMuYVs5XTt0aGlzLmc9dGhpcy5hWzhdfWMuJGs9YjtiLnByb3RvdHlwZT17Vms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLldrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy4ka3x8cWIsYmQ9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YmQuVmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSwKYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuUWE9YS5nZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9Zi5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuUmE9e307dGhpcy5JZj0hMTt0aGlzLnZmPVtdfWMuUGg9YjtiLnByb3RvdHlwZT17bHA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGY9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2Y9e3g6ZSx5OmJ9O2YucG9zaXRpb249YztyZXR1cm4gZn0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5scChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZj10aGlzLmhxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2YmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7aD17eDpiLHk6Y307ZSYmKGgucG9zaXRpb249ZSk7cmV0dXJuIGh9LCRzOmZ1bmN0aW9uKCl7dGhpcy5JZj0hMH0sCnlnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxWZjpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpO2YuRChsLnljLHRoaXMudS5CKCkpfSx0czpmdW5jdGlvbigpe3RoaXMuSWZ8fCh0aGlzLnUucGxheSgpLGYuRChsLnpjLHRoaXMudS5CKCkpKX0sY2M6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMudS5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLlFhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5RYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlFhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuUWEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5RYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5RYSk7dGhpcy51LkRiJiZ0aGlzLnUuRGIoKT90aGlzLnUuZ2YoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVmLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMudS5leGl0RnVsbHNjcmVlbigpfSxocTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFpvOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sdWY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5abyh0aGlzLlFhKTtpZihiLnghPXRoaXMuUmEueHx8Yi55IT10aGlzLlJhLnl8fGIucG9zaXRpb24hPXRoaXMuUmEucG9zaXRpb258fGIud2lkdGghPXRoaXMuUmEud2lkdGh8fGIuaGVpZ2h0IT10aGlzLlJhLmhlaWdodHx8YSl7aWYoMDx0aGlzLlJhLndpZHRoJiYwPHRoaXMuUmEuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5zZigpO3JldHVybn10aGlzLlJhPWI7dGhpcy51LkRiKCk/KHRoaXMuRy5zdHlsZS5sZWZ0PQoiMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5DLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMudmYubGVuZ3RoO2ErKyl0aGlzLnZmW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWYuYmluZCh0aGlzKSwxMCl9LHNmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTsKZm9yKHZhciBOPWMuUGh8fE4sQj1bXSxyYj0wOzEwMD5yYjtyYisrKXt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO0wuc3R5bGUuZGlzcGxheT0iYmxvY2siO0wuaWQ9Zi5wYSgxMCk7TC5jb250cm9scz0hMDtCLnB1c2goTCl9dmFyIEg9ITEsWT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNuPXRoaXMuYVsxMF07dGhpcy51az10aGlzLmFbNF07dGhpcy5PbD10aGlzLmFbNV07dGhpcy5FaD10aGlzLmFbNl07dGhpcy5vaz10aGlzLmFbNV07dGhpcy5JaD10aGlzLmFbOV07dGhpcy5pcj10aGlzLmFbN107CnRoaXMuaGw9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbN119Yy5NdD1iO2IucHJvdG90eXBlPXtibjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY246dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnVrOnRoaXMuTmwoYSl9LE5sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT2w6dGhpcy5EaChhKX0sRGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkVoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vazp0aGlzLkhoKGEpfSxIaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSWg6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlyOnRoaXMuZ2woYSl9LGdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNiPWMuTXR8fHNiLGNkPW5ldyBzYigxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5ibig0KTsoZnVuY3Rpb24oYyl7Yy53az1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5PKGEpO3RoaXMuZmUoYik7dGhpcy5YZSgpfSxmZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sWGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkNhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5SKGEpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkNhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD0KYy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIHRiPWMud2t8fHRiOyhmdW5jdGlvbihjKXtjLnZrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj1aKCk7dGhpcy51Yj10aGlzLnVifHwhMTt0aGlzLkdlPXRoaXMuSmU9dGhpcy56Zj10aGlzLmlhPXRoaXMubWU9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5IbyhhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMubWU9ITA7dGhpcy56ZiYmdGhpcy5SZSgpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLlliJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLnpmPSEwO3RoaXMuUmUoKX0uYmluZCh0aGlzKSk7dGhpcy5OZSgpfSxSZTpmdW5jdGlvbigpe2lmKCF0aGlzLnViKXt0aGlzLnRjKCk7aWYoIXRoaXMubWUmJiF0aGlzLnRjKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5tZSYmdGhpcy5HZSYmIXRoaXMuSmUmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCl9fSx0YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sCm1mOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LE5lOmZ1bmN0aW9uKCl7aWYodGhpcy50YygpKXt2YXIgYj10aGlzLm1mKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuSmU9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5HZT1iLmF2fXRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5lKCl9LmJpbmQodGhpcyksMTAwKX0saHY6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IudXYoKTohMX0sVWI6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj8KYi5VYigpOi0xfSxocDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxIbzpmdW5jdGlvbihiLGEpe3RoaXMudWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy51Ynx8MzAyPT10aGlzLnViP3RoaXMuaWE9ITA6dGhpcy5sKCJhZGVycm9yIix0aGlzLnViKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfSx4YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5pYT8odGhpcy5tKCksdGhpcy5uYSgpKTpiLk5jKCk/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuaHAoYik/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHViPWMudmt8fHViOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sb3E6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWsua20uaW0/d2luZG93Lk9PLlFrLmttLmltLlp1KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9xKCl9LDEwMCl9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPTE1MDA7dmFyIGI9WigpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5EYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgdGIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IHViKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmIsd2I9bmV3IHZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpyPXRoaXMuYVsxXTt0aGlzLlNnPXRoaXMuYVszXTt0aGlzLkJvPXRoaXMuYVs2XTt0aGlzLkpwPXRoaXMuYVs2XTt0aGlzLktyPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzVdfWMueHM9YjtiLnByb3RvdHlwZT17eXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy56cjp0aGlzLlJnKGEpfSxSZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2c6dGhpcy5BbyhhKX0sQW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJvOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KcDp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuS3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZzphfX19KShjKTt2YXIgeGI9Yy54c3x8eGIsZGQ9bmV3IHhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQueXIoNCk7KGZ1bmN0aW9uKGMpe2Muc2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSwKRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sSzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgeWI9Yy5zbHx8eWI7KGZ1bmN0aW9uKGMpe2Mucmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5xZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5lcihhKX0uYmluZCh0aGlzKSk7CnkueXAoKX0sZXI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciB6Yj1jLnJsfHx6YjsoZnVuY3Rpb24oYyl7Yy50bD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuU2MmJihiPWYuVW4oYix0aGlzLlNjKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxkPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGQpdHJ5e3RmbXN1aXRlKCIjIitkKS50Zm12aWRlbygicmVzdW1lIik7dGhpcy5TY3x8KHRoaXMuU2M9W10pO3RoaXMuU2MucHVzaChiW2FdKTt2YXIgZT1uZXcgeWIoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgemIoZSx0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319fXRoaXMuSCgpfSxxZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5afHwodGhpcy5aPXt9KTt0aGlzLlpbYl18fCh0aGlzLlpbYl09e30pO3RoaXMuWltiXVthXXx8KHRoaXMuWltiXVthXT1bXSk7CnRoaXMuWltiXVthXS5wdXNoKGMpfSxxdDpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLlp8fHRoaXMuWiYmIXRoaXMuWlthXSl0aGlzLiRifHwodGhpcy4kYj1bXSksdGhpcy4kYi5wdXNoKGIpLHRoaXMucnMoKSYmKHRoaXMuY2coKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5aW2FdW2NdJiYwPHRoaXMuWlthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLlpbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLlpbYV1bY11bZF0oYil9fSx5cDpmdW5jdGlvbigpe2lmKHRoaXMuJGIpZm9yKHZhciBiPTA7Yjx0aGlzLiRiLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuJGJbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLlpbY11bZF0mJgowPHRoaXMuWltjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLlpbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLlpbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF0KGIpfX0pfSkoYyk7dmFyIEFiPWMudGx8fEFiLHk9bmV3IEFiKHEpO1goKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NaT10aGlzLmFbNV07dGhpcy56cT10aGlzLmFbM107dGhpcy5ncj10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMV07dGhpcy5zbz10aGlzLmFbMV07dGhpcy5jdT10aGlzLmFbN107dGhpcy5acD10aGlzLmFbNF07dGhpcy54cT10aGlzLmFbOF07dGhpcy5obz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX0KYy5tbj1iO2IucHJvdG90eXBlPXtMaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWk6dGhpcy55cShhKX0seXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpxOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudWo6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNvOnRoaXMuYnUoYSl9LGJ1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdTp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWnA6dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnhxOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5obzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIEJiPWMubW58fEJiLGVkPW5ldyBCYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC5MaSg0KTsoZnVuY3Rpb24oYyl7Yy56aD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LApqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuemh8fENiOyhmdW5jdGlvbihjKXtjLkFoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5Xcnx8KHRoaXMuV3I9CiEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkFofHxEYjsoZnVuY3Rpb24oYyl7Yy5CaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IENiKGQpO3RoaXMuSShmKXx8Cih0aGlzLkwoZiksKG5ldyBEYihmLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkgoKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkJofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2g9dGhpcy5hWzZdO3RoaXMuaG09dGhpcy5hWzEwXTt0aGlzLlptPXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzRdfWMuaG49YjtiLnByb3RvdHlwZT17Rmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdoOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5obTp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlptOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy5obnx8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQuRmgoNCk7KGZ1bmN0aW9uKGMpe2MuUWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LApnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sSzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBIYj1jLlFsfHxIYjsoZnVuY3Rpb24oYyl7Yy5QbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkxlfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLAoxMDApO3RoaXMuTm98fCh0aGlzLkFmKCksdGhpcy5Obz0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5MZT8odGhpcy5sKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLm8oKSk6KHRoaXMuTGU9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MDApKX0sV286ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5XbygpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMuaWE9ITAsdGhpcy5tKCksdGhpcy5uYSgpKToKKHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWYoKX0uYmluZCh0aGlzKSw1MCl9LHN2OmZ1bmN0aW9uKCl7cmV0dXJuITB9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJYj1jLlBsfHxJYjsoZnVuY3Rpb24oYyl7Yy5SbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IEhiKGIuaXRlbShhKSk7dGhpcy5JKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwKKHRoaXMuTChjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBKYj1jLlJsfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS209dGhpcy5hWzFdO3RoaXMuTW89dGhpcy5hWzNdO3RoaXMuWWg9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19Yy5ocz1iO2IucHJvdG90eXBlPXtKbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS206dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nbzp0aGlzLlhoKGEpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWWg6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBMYj1jLmhzfHxMYixnZD1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Z2QuSm0oNCk7KGZ1bmN0aW9uKGMpe2MuQWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5KJiYKKDAsdGhpcy5KKSghMCl9LmJpbmQodGhpcykpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuImthbHR1cmEifX0pfSkoYyk7dmFyIE1iPWMuQWp8fE1iOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGxvZzpmdW5jdGlvbigpe30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuY2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLnhtKCl9LmJpbmQodGhpcykpLHRoaXMuSmc9ITEsdGhpcy50dT0xRTMsdGhpcy5YZj17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLlhmLmRvbmV8fCh0aGlzLlhmLmRvbmU9ITAsdGhpcy5KZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWcoKX0uYmluZCh0aGlzKSx0aGlzLnR1KSl9LHhtOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkpnKTt0aGlzLm0oKX0sSWc6ZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLncoKSl9LGpmOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmCmJbY11bZF0uZ2V0RXJyb3JDb2RlKXt2YXIgZT1iW2NdW2RdO2JbY11bZF0uZ2V0RXJyb3JDb2RlKCk7YltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7YS5wdXNoKGUuZ2V0RXJyb3JDb2RlKCkpfXJldHVybiBhfSx2YTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuamYobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5qZih0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgTmI9Yy56anx8TmI7KGZ1bmN0aW9uKGMpe2MuQmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJgp3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGYuRGEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyl8fHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj1udWxsO3dpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxmLkRhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBNYihjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBOYihjLHRoaXMuQSkpLmIoKSkpfX10aGlzLkgoKX19KX0pKGMpOwp2YXIgT2I9Yy5Canx8T2IsUGI9bmV3IE9iKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpzPXRoaXMuYVszXTt0aGlzLkJxPXRoaXMuYVs2XTt0aGlzLnl1PXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzldfWMuUnQ9YjtiLnByb3RvdHlwZT17eXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpzOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CcTp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXU6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgUWI9Yy5SdHx8UWIsaGQ9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aGQueXMoNCk7CihmdW5jdGlvbihjKXtjLnBsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBSYj1jLnBsfHxSYjsoZnVuY3Rpb24oYyl7Yy5vbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpO3RoaXMuUGIoKX0sUGI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5HZCgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2QoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGIoKX0uYmluZCh0aGlzKSwxMCl9LEdkOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LApvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgU2I9Yy5vbHx8U2I7KGZ1bmN0aW9uKGMpe2MucWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBSYihkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgU2IoYiwKdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBUYj1jLnFsfHxUYixVYj1uZXcgVGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWWc9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzRdO3RoaXMubGw9dGhpcy5hWzVdO3RoaXMucnI9dGhpcy5hWzNdO3RoaXMubWs9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuV2g9YjtiLnByb3RvdHlwZT17WGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLllnOnRoaXMuTm0oYSl9LE5tOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PbTp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubGw6dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJyOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLldofHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5YZyg0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5XZD0hMX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuWnIoKX0uYmluZCh0aGlzKSw1MDApfSxacjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPApiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5KJiZ0aGlzLkooKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5XZCYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPwooYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXczpmdW5jdGlvbigpe3RoaXMuV2Q9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sSzpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLllrfHxXYjsoZnVuY3Rpb24oYyl7Yy5Yaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuT3E9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLktifHwodGhpcy5LYj0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiKTt0aGlzLm8oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSwKd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuT3E/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLldzKCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBYYj1jLlhrfHxYYjsoZnVuY3Rpb24oYyl7Yy5aaz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLAphPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkgoKX19KX0pKGMpO3ZhciBZYj1jLlprfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW89dGhpcy5hWzZdO3RoaXMuSms9dGhpcy5hWzRdO3RoaXMuam89dGhpcy5hWzJdO3RoaXMueWk9dGhpcy5hWzddO3RoaXMudnI9dGhpcy5hWzddO3RoaXMuYm09dGhpcy5hWzEwXTt0aGlzLlRoPXRoaXMuYVszXTt0aGlzLm1tPXRoaXMuYVs4XTt0aGlzLkJyPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVs1XX1jLmtvPWI7Yi5wcm90b3R5cGU9CntwbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucW86dGhpcy5JayhhKX0sSWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkprOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbzp0aGlzLnhpKGEpfSx4aTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueWk6dGhpcy51cihhKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZyOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ibTp0aGlzLlNoKGEpfSxTaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGg6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1tOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ccjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMua298fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1qZC5wbyg0KTsoZnVuY3Rpb24oYyl7Yy5Uaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTsKcmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLlRrfHxhYzsoZnVuY3Rpb24oYyl7Yy5Taz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5DYSgpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuTm4oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuSWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLkNxKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LE5uOmZ1bmN0aW9uKCl7dGhpcy5GZSgpfHx0aGlzLm8oITApfSxDcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWMoKTshYi5tYSYmYi5iYSYmYi5ZdSYmYi4kdSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjsKYTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sSWM6ZnVuY3Rpb24oKXtmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQ2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspaWYoYltjXS5pZD09YSlyZXR1cm4gYltjXTtyZXR1cm57fX0sR2Q6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbzpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iPwp0aGlzLkljKCkuYWRzTG9hZGVyP3RoaXMudyghMCk6dGhpcy53KCk6dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGJjPWMuU2t8fGJjOyhmdW5jdGlvbihjKXtjLlVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsucGxheWVyYXBpKWZvcih2YXIgYj1rLnBsYXllcmFwaSgpLGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IGFjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBiYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgY2M9Yy5Va3x8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52aD10aGlzLmFbOV07dGhpcy5hcT10aGlzLmFbOV07dGhpcy5raz10aGlzLmFbN107dGhpcy5lcT10aGlzLmFbOF07dGhpcy5PdT10aGlzLmFbOV07dGhpcy5UbD10aGlzLmFbM107dGhpcy5ibz10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVsxXX1jLlZsPWI7Yi5wcm90b3R5cGU9e3VoOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52aDp0aGlzLiRwKGEpfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXE6dGhpcy5qayhhKX0sams6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmtrOnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lcTp0aGlzLk51KGEpfSxOdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT3U6dGhpcy5TbChhKX0sU2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRsOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ibzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYz1jLlZsfHxlYyxrZD1uZXcgZWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC51aCg0KTsoZnVuY3Rpb24oYyl7Yy5Uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLk8oYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUihhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEs6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LENhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTsKcmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFQ9Yy5Uanx8VDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5YZD0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhkPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGQmJmIhPXRoaXMuWGR8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS53diksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLAp0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVT1jLlNqfHxVOyhmdW5jdGlvbihjKXtjLlVqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFQoYiksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFUoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9Cm5ldyBUKGIpLGIuamE/dGhpcy5jZygpOnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBVKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgRCxmYz1jLlVqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5uYi5sZW5ndGgpe3ZhciBhPW0ubmIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWYuS3MoeyJbTE9BRFNDUklQVF0iOmYucGEoMTApLCJbVVRJTFNdIjpmLnBhKDEwKSwiW0NBTExCQUNLXSI6Zi5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWYuTWYuYmluZChmKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSlrW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOylmLk1mKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sCm0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSG09dGhpcy5hWzFdO3RoaXMuVnI9dGhpcy5hWzddO3RoaXMuUmo9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbOF19Yy5Jcj1iO2IucHJvdG90eXBlPXtHbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSG06dGhpcy5VcihhKX0sVXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wcjp0aGlzLlFqKGEpfSxRajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUmo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYz1jLklyfHxoYyxsZD1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1sZC5HbSg0KTsKKGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLk8oYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5SKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5ZcT1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sQ3M6ZnVuY3Rpb24oYil7dGhpcy5uZD1ifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWXF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEs6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5KJiZ0aGlzLkooKSx0aGlzLm5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5uZCYmKG5ldyBHKHRoaXMsdGhpcy5uZCkpLmIoKSl9fSl9KShjKTt2YXIgTT1jLkRsfHwKTTsoZnVuY3Rpb24oYyl7Yy5DbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxWYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8KHRoaXMuaGI9MCksdGhpcy5oYisrLDE1PHRoaXMuaGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB0aGlzLk1zKCksITA7dGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5vKCk6dGhpcy5vKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMudmEoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5VKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlU9YSxiLmwoImFkZXJyb3IiLAphKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlV8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5WYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLApmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbzpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz8KdGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHPWMuQ2x8fEc7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMud2E9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBNKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJgp3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQ3ModGhpcy5BKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSCgpfX0pfSkoYyk7dmFyIGljPWMuRWx8fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tcj10aGlzLmFbOV07dGhpcy5UbT10aGlzLmFbMV07dGhpcy5tbz10aGlzLmFbMl07dGhpcy5naz10aGlzLmFbMl07dGhpcy5NbD10aGlzLmFbMV07dGhpcy5LdT10aGlzLmFbN107dGhpcy5xaz10aGlzLmFbMV07dGhpcy5RbT10aGlzLmFbMTBdO3RoaXMuTWc9dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNF19Yy5adD1iO2IucHJvdG90eXBlPXtscjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm1yOnRoaXMuU20oYSl9LApTbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG06dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nazp0aGlzLkxsKGEpfSxMbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWw6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkt1OnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xazp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFtOnRoaXMuTGcoYSl9LExnOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5NZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYz1jLlp0fHxrYyxtZD1uZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQubHIoNCk7KGZ1bmN0aW9uKGMpe2MuT2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuVWU9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuUihhKTp0aGlzLmRhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0UsCntpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLko/KDAsdGhpcy5KKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHt6bjpmdW5jdGlvbihhKXswPGEmJih0aGlzLlVlPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHt6bjpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sSzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIGxjPWMuT2p8fGxjOyhmdW5jdGlvbihjKXtjLk5qPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEF2OmZ1bmN0aW9uKCl7fSxsczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLnVlKG5ldyBmdW5jdGlvbigpe30pO2EuVnU9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHMoYSk7CndpbmRvdy5jdj1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5rc3x8KHRoaXMua3M9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5EZHx8KHRoaXMuRGQ9MSk7aWYoMjA8dGhpcy5EZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5vKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkhhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuRGQrKzsKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxIYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5iZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJgpiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmCihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMudyhiKX19KX0pKGMpO3ZhciBtYz1jLk5qfHxtYzsoZnVuY3Rpb24oYyl7Yy5Qaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IGxjKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5qYXx8dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgbWMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIG5jPWMuUGp8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EdT10aGlzLmFbOV07dGhpcy55bD10aGlzLmFbN107dGhpcy5lbj10aGlzLmFbOF07dGhpcy5kaT10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVsxXX1jLkFuPWI7Yi5wcm90b3R5cGU9e0N1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5EdTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6CnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lbjp0aGlzLmNpKGEpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLkFufHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5DdSg0KTsoZnVuY3Rpb24oYyl7Yy5Maj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpO2EmJnRoaXMuTyhhLnBhcmVudE5vZGUpfSwKSzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgVj1jLkxqfHxWOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLndmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy5GZigpfSxGZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLkhhKCksITA7dGhpcy53ZisrO2lmKDEwPHRoaXMud2YpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5GZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LApXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFc9Yy5Lanx8VzsoZnVuY3Rpb24oYyl7Yy5Naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgVih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFYod2luZG93LnBsYXllciksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgcWM9Yy5Nanx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1yPXRoaXMuYVsxMF07dGhpcy5ZdD10aGlzLmFbOF07dGhpcy5Ebz10aGlzLmFbMTBdO3RoaXMuUmg9dGhpcy5hWzldO3RoaXMuRmo9dGhpcy5hWzZdO3RoaXMueG49dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOF19Yy5SbT1iO2IucHJvdG90eXBlPXtMcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXI6dGhpcy5YdChhKX0sWHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ZdDp0aGlzLkNvKGEpfSxDbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRG86dGhpcy5RaChhKX0sUWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlJoOnRoaXMuRWooYSl9LEVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gajp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLlJtfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC5Mcig0KTsoZnVuY3Rpb24oYyl7Yy5BaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8KKHRoaXMuTyhiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlIoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sSzpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPWMuQWl8fHRjOyhmdW5jdGlvbihjKXtjLnppPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IiwKZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMubygpKX0sdGVzdDpmdW5jdGlvbigpe30sCm86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMueml8fHVjOyhmdW5jdGlvbihjKXtjLkJpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxmLkRhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdGMoZCksZC5qYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgdWMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5IKCl9fSl9KShjKTsKdmFyIHZjPWMuQml8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Iaj10aGlzLmFbMTBdO3RoaXMuUnA9dGhpcy5hWzddO3RoaXMucnE9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzldO3RoaXMuS2k9dGhpcy5hWzRdO3RoaXMuSnQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbOF19Yy5SdT1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGo6dGhpcy5RcChhKX0sUXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlJwOnRoaXMucXEoYSl9LHFxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ycTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZmw6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuSXQoYSl9LEl0OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnQ6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLlJ1fHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5Haig0KTsoZnVuY3Rpb24oYyl7Yy5IaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuTyhiKSx0aGlzLlIoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoiYmxvY2siKX0sSzpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5IaXx8eWM7KGZ1bmN0aW9uKGMpe2MuR2k9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuUGUoKX0sUGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBlKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciB6Yz1jLkdpfHx6YzsoZnVuY3Rpb24oYyl7Yy5JaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgeWMod2luZG93LiQoImRpdiNnYW1lIikpOwppZihiLmphKXt0aGlzLkgoKTtyZXR1cm59aWYoIXRoaXMuSShiKSl7dGhpcy5MKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5IKCk7cmV0dXJufX10aGlzLkgoKX19KX0pKGMpO3ZhciBBYz1jLklpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHQ9dGhpcy5hWzZdO3RoaXMuZm09dGhpcy5hWzRdO3RoaXMud289dGhpcy5hWzRdO3RoaXMucGo9dGhpcy5hWzldO3RoaXMuRms9dGhpcy5hWzFdO3RoaXMuY2w9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzZdO3RoaXMuWG49dGhpcy5hWzNdO3RoaXMuYmk9dGhpcy5hWzRdO3RoaXMuZz10aGlzLmFbNV19Yy5YaT1iO2IucHJvdG90eXBlPXtHdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHQ6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZtOnRoaXMudm8oYSl9LAp2bzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMud286dGhpcy5vaihhKX0sb2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBqOnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gazp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY2w6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZoOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ybjp0aGlzLmFpKGEpfSxhaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5YaXx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuR3QoNCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkhmPXRoaXMuS2Y9dGhpcy5KZj0hMTt0aGlzLlVjPVtdO3RoaXMuJGQ9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBIYT9udWxsOkhhLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2E/bnVsbDpDYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJhP251bGw6UmEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBXYT9udWxsOldhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHNhP251bGw6c2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjPwpudWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB3Yj9udWxsOndiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj8KbnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBNYT9udWxsOk1hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIG5hP251bGw6bmF9fWMuT2s9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5rcChhKTpbXSxiO3RoaXMuS2Y9ITA7aWYoYS5sZW5ndGgpe3RoaXMuSmY9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuZGcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLiRkKXtpZih0aGlzLkhmKWJyZWFrO2I9dGhpcy4kZFtjXTt0aGlzLm9lKGIpJiYodGhpcy5VYy5wdXNoKGIpLHRoaXMuZGcoYikpfX0sb2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxrcDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz0KYVtlXSxjPXRoaXMuJGRbY10sdGhpcy5vZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxkZzpmdW5jdGlvbihhKXt0aGlzLm9lKGEpJiZhLmIoKX0sWXM6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLkpmKWZvcih0aGlzLkhmPSEwLGE9MDthPHRoaXMuVWMubGVuZ3RoO2ErKyl0aGlzLlVjW2FdLnFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVWNbYV0ucWIpfX19KShjKTt2YXIgRGM9Yy5Pa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnI9dGhpcy5hWzZdO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLlpuPXRoaXMuYVszXTt0aGlzLlhxPXRoaXMuYVsxXTt0aGlzLkRrPXRoaXMuYVs4XTt0aGlzLm9vPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVsxMF19Yy50aD1iO2IucHJvdG90eXBlPXtRcjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlJyOnRoaXMuTXAoYSl9LE1wOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5OcDp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm46dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhxOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLm5vKGEpfSxubzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMub286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBFYz1jLnRofHxFYyxyZD1uZXcgRWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1yZC5Rcig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9CmMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGYuVGIobC5UdCksZi50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGYuVGIobC5hciksZi50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgc2Q9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSwKYmE9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEY9bmV3IGdhLGs9ITE7Ri5NYygpO0YuQmYoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLk1jKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5CZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuTWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtmLmZpcmVFdmVudCh3aW5kb3csRi5icSgpLHtpZDp0ZH0pfSw1MDApO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXU9dGhpcy5hWzJdO3RoaXMudnE9dGhpcy5hWzJdO3RoaXMub2k9dGhpcy5hWzVdO3RoaXMuVXE9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbMl19Yy51dD1iO2IucHJvdG90eXBlPXskdDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmF1OnRoaXMudXEoYSl9LHVxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52cTp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMub2k6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VcTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMudXR8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLiR0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5aZj10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuUGM9MDt0aGlzLkxhPSIiO3RoaXMuVmM9W107dGhpcy5XYz0wO3RoaXMuJGY9ITE7dGhpcy5ZZD1bXX1jLk5nPWI7Yi5wcm90b3R5cGU9e0pzOmZ1bmN0aW9uKGEpe3RoaXMuWmY9CmF9LFljOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5MYT10aGlzLnBsYXllci5LKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXM6ZnVuY3Rpb24oYSl7dGhpcy5VYT1hfSxEczpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLkxhXSYmdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSxiYzpmdW5jdGlvbihhLGIpe2YuaWIoIndlbHQuZGUiKSYmZi5ZYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuVWEpO3ZhciBjPSExLGU9ITE7aWYodGhpcy5mcSgpKXRoaXMuVWEuYyh0aGlzLlVhLkpjLHRoaXMuVWEuemEsdGhpcy5VYS5aZCxmdW5jdGlvbigpe3RoaXMuYmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkJjKTtlbHNlIGlmKHRoaXMuQXAoKSl0aGlzLnZzKGZ1bmN0aW9uKCl7dGhpcy5iYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5EKGwueWMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuJHMoKTtrLmV4aXRGdWxsc2NyZWVuKCk7UT1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLmdnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLk5xKGEpOwoiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSGQmJihjPXRoaXMucGxheWVyLkhkKCkpO2guYWRTdGFydFRpbWVvdXQmJihlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtrLkpkKGEsYyxlKTt0aGlzLnBsYXllci5oZyhrKX19LGZxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuUGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5QYy5nZXRUaW1lKCksdGhpcy5QYz1hLDNFNTxiPyEwOiExO3RoaXMuUGM9YTtyZXR1cm4hMX0sUnM6ZnVuY3Rpb24oKXtmLmVlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuYWYoYSkpP3RoaXMuYmMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5EKGwuemMsdGhpcy5wbGF5ZXIuQigpKSl9LApRczpmdW5jdGlvbihhKXtmLmVlKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlpmKXt0aGlzLkpzKCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLmFmKGMpKT90aGlzLmJjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxmLkQobC56Yyx0aGlzLnBsYXllci5CKCkpKX19LGFmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxuczpmdW5jdGlvbigpe3RoaXMucGxheWVyLk9zKHRoaXMuUXMuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sJGM6ZnVuY3Rpb24oYSl7Zi5lZSgibWlkcm9sbCIpO2lmKCF0aGlzLk9mKXt0aGlzLk9mPSEwO3ZhciBiPQp0aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5iYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZj0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGYuRChsLnpjLHRoaXMucGxheWVyLkIoKSkpfX0sbXM6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Jcyh0aGlzLiRjLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5kKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLlJzKCk7dGhpcy5wbGF5ZXIuTmQmJnRoaXMubXMoKTt0aGlzLm5zKCl9LG9zOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuVmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihmKXt0aGlzLkl1KGEsCmIsYyxnLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuV2M9dGhpcy5WYy5sZW5ndGh9LEFwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLldjJiYoYT0hMCk7cmV0dXJuIGF9LHZzOmZ1bmN0aW9uKGEpe3RoaXMuJGY9YTtmb3IoYT0wO2E8dGhpcy5WYy5sZW5ndGg7YSsrKXRoaXMuVmNbYV1bImZ1bmN0aW9uIl0odGhpcy5kcy5iaW5kKHRoaXMpKX0sZHM6ZnVuY3Rpb24oYSl7dGhpcy5XYy0tO2EmJnRoaXMuWWQucHVzaChhKTswPj10aGlzLldjJiZ0aGlzLiRmKCl9LE5xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLllkLmxlbmd0aDtjKyspYj10aGlzLllkW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBkYT1jLk5nfHxkYSxRPSExLGphPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ybj10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbNV07dGhpcy5hbj10aGlzLmFbMl07dGhpcy5vbT10aGlzLmFbNl07dGhpcy5Gcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLnRuPWI7Yi5wcm90b3R5cGU9e3FuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucm46dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVzOnRoaXMuJG0oYSl9LCRtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hbjp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub206dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy50bnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLnFuKDQpfSkuY2FsbChQaWV4dXVwaGVoYXBob2hWLFBpZXh1dXBoZWhhcGhvaFYpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
ff4b8e8962f23810dfba6084bd82cc367d9aa3b49bfe0612bb2a98bc592eb1fe

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://www.golem.de/
Origin
https://www.golem.de

Response headers

Date
Sat, 04 Aug 2018 18:36:41 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
Vary
User-Agent, Accept-Encoding
Access-Control-Allow-Methods
POST, GET, OPTIONS
Content-Type
application/json;charset=utf-8
Access-Control-Allow-Origin
*
Cache-Control
private
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
ads
securepubads.g.doubleclick.net/gampad/
27 KB
7 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1358082632807747&correlator=44177517017974&output=json_html&callback=googletag.impl.pubads.callbackProxy1&impl=fif&adsid=NT&eid=21062383%2C21062229&vrg=237&guci=1.2.0.0.2.2.0&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=728x90&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile1%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D1%26m_mv%3D80%2C70%2C60%2C50%2C40%2C30%2C20%2C10%26m_gv%3D60%2C50%2C40%2C30%2C20%2C10&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe&cookie_enabled=1&bc=7&abxe=1&lmt=1533407801&dt=1533407801666&frm=20&biw=1585&bih=1200&oid=3&adx=293&ady=0&adk=1018996689&gut=v2&ifi=5&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.golem.de%2F&dssz=87&icsg=1583297448644544&mso=32&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x-1&msz=1000x-1&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=139286814&ga_fc=true
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
Protocol
SPDY
Server
172.217.22.66 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
cafe /
Resource Hash
8cccd4f61058a5068c3e3391580e38565fbbcacb286b802e6db362fa9e48d52e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Sat, 04 Aug 2018 18:36:41 GMT
content-encoding
gzip
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
7004
x-xss-protection
1; mode=block
google-lineitem-id
4686089258
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138235269571
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
https://www.golem.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
pubads_impl_rendering_237.js
securepubads.g.doubleclick.net/gpt/
42 KB
16 KB
Script
General
Full URL
https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_237.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
Protocol
SPDY
Server
172.217.22.66 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
sffe /
Resource Hash
841e51f02812313861d79651021e1bfdcb966aaa484871437158e58350dd2364
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Sat, 04 Aug 2018 18:36:41 GMT
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Wed, 01 Aug 2018 13:57:22 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="44,43,39,35"
content-length
16465
x-xss-protection
1; mode=block
expires
Sat, 04 Aug 2018 18:36:41 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-29/html/
0
0
Other
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-29/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
Protocol
SPDY
Server
2a00:1450:4001:81c::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
/
Resource Hash

Request headers

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

Response headers

expires
Wed, 31 Jul 2019 00:10:56 GMT
cache-control
public, immutable, max-age=31536000
last-modified
Mon, 11 Jun 2018 14:38:59 GMT
content-type
text/html
ads
securepubads.g.doubleclick.net/gampad/
30 KB
10 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1358082632807747&correlator=44177517017974&output=json_html&callback=googletag.impl.pubads.callbackProxy2&impl=fif&adsid=NT&eid=21062383%2C21062229&vrg=237&guci=1.2.0.0.2.2.0&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=1000x333%7C1000x250%7C1000x100%7C970x90%7C940x250%7C970x250%7C800x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile3%2Cvis55801%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D3%26m_mv%3D70%2C60%2C50%2C40%2C30%2C20%2C10%26m_gv%3D70%2C60%2C50%2C40%2C30%2C20%2C10&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe&cookie_enabled=1&bc=7&abxe=1&lmt=1533407801&dt=1533407801681&frm=20&biw=1585&bih=1200&oid=3&adx=0&ady=0&adk=3248118628&gut=v2&ifi=6&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.golem.de%2F&dssz=88&icsg=1583297448644544&mso=32&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x11198&msz=1000x333&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=139286814&ga_fc=true
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
Protocol
SPDY
Server
172.217.22.66 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
cafe /
Resource Hash
65a942306bd489ce6f7e9a200a578e3144d344fbf78b567217f7a6b30892b0a9
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Sat, 04 Aug 2018 18:36:42 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
9964
x-xss-protection
1; mode=block
google-lineitem-id
-1
pragma
no-cache
server
cafe
google-creative-id
-1
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
https://www.golem.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
ads
securepubads.g.doubleclick.net/gampad/
27 KB
7 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1358082632807747&correlator=44177517017974&output=json_html&callback=googletag.impl.pubads.callbackProxy3&impl=fif&adsid=NT&eid=21062383%2C21062229&vrg=237&guci=1.2.0.0.2.2.0&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=300x300%7C300x600%7C300x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile9%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D9%26m_mv%3D30%2C20%2C10%26m_gv%3D30%2C20%2C10&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe&cookie_enabled=1&bc=7&abxe=1&lmt=1533407801&dt=1533407801691&frm=20&biw=1585&bih=1200&oid=3&adx=0&ady=0&adk=3347207360&gut=v2&ifi=7&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.golem.de%2F&dssz=88&icsg=1583297448644544&mso=32&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x483&msz=300x302&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=139286814&ga_fc=true
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
Protocol
SPDY
Server
172.217.22.66 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
cafe /
Resource Hash
8372653a80b960d6c20b63c9579e60b63c3235ab7a41ee1c23b547057fed6b63
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Sat, 04 Aug 2018 18:36:42 GMT
content-encoding
gzip
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
7057
x-xss-protection
1; mode=block
google-lineitem-id
4643513462
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138230737471
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
https://www.golem.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
ads
securepubads.g.doubleclick.net/gampad/
27 KB
7 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1358082632807747&correlator=44177517017974&output=json_html&callback=googletag.impl.pubads.callbackProxy4&impl=fif&adsid=NT&eid=21062383%2C21062229&vrg=237&guci=1.2.0.0.2.2.0&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=1000x333%7C1000x167%7C1000x125%7C1000x100%7C970x250%7C800x250%7C970x90%7C728x90%7C660x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile16%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D16&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe&cookie_enabled=1&bc=7&abxe=1&lmt=1533407801&dt=1533407801700&frm=20&biw=1585&bih=1200&oid=3&adx=0&ady=0&adk=1899381156&gut=v2&ifi=8&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.golem.de%2F&dssz=88&icsg=1583297448644544&mso=32&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x418&msz=1000x333&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=139286814&ga_fc=true
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
Protocol
SPDY
Server
172.217.22.66 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
cafe /
Resource Hash
17537145b679ff12e66022957073c236b926e6938fb38da82f034e53f95f2776
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Sat, 04 Aug 2018 18:36:42 GMT
content-encoding
gzip
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
7061
x-xss-protection
1; mode=block
google-lineitem-id
4751801668
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138234601636
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
https://www.golem.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
config.json
hgc-cf-cache-1.svonm.com/www.golem.de/
229 B
887 B
XHR
General
Full URL
https://hgc-cf-cache-1.svonm.com/www.golem.de/config.json?cache=9839800392
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFBpZXh1dXBoZWhhcGhvaFY9UGlleHV1cGhlaGFwaG9oVnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBYKCl7eS5TZHx8KHkuU2Q9MCk7eS5TZCsrO3dpbmRvdy52aWRlb3BrZ0ludGVyZmFjZSE9eS52aWRlb3BrZ0ludGVyZmFjZSYmKHdpbmRvdy52aWRlb3BrZ0ludGVyZmFjZT15LnZpZGVvcGtnSW50ZXJmYWNlKTsxMD55LlNkJiZ3aW5kb3cuc2V0VGltZW91dChYLDUwMCl9ZnVuY3Rpb24gQSgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLEEpO1k9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIFooKXt2YXIgYz13aW5kb3cuT087Y3x8KGM9d2luZG93LmpPT1BsYXllcl8wKTtyZXR1cm4gY31mdW5jdGlvbiBhYSgpe2lmKGspe2sucGF1c2VCdXR0b258fChrLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwprLnBsYXlCdXR0b258fChrLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLm11dGVCdXR0b258fChrLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnVubXV0ZUJ1dHRvbnx8KGsudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmsuc2tpcGFibGVCdXR0b258fChrLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjY7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpOwprLnNraXBCdXR0b258fChrLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSIpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYoay5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtrLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2E9YS51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2YuWWEoYSxiLFtdLGMsYyxtKX0pfW0uYyhrLmdsb2JhbENvbmZpZyxrLmNsaWVudENvbmZpZyxrLnByZWNoZWNrZWQsay5vblJlYWR5LGsub25GYWlsdXJlLGspO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBiPWsuc3RhcnRQbGF5ZXI7YiYmImZ1bmN0aW9uIj09PXR5cGVvZiBiJiZiKCl9ZWxzZSBiYShhYSw1MCl9ZnVuY3Rpb24gY2EoYyxiKXtifHwoYj0icHJlIik7aWYoayYmbSl7Yy5wYXVzZSgpO3ZhciBhPW5ldyBOKGMpLGE9bmV3IE8oYSxtKSxnPWsuYWRUYWc7InByZSI9PWImJmsucHJlcm9sbEFkVGFnJiYoZz1rLnByZXJvbGxBZFRhZyk7InBvc3QiPT1iJiZrLnBvc3Ryb2xsQWRUYWcmJihnPWsucG9zdHJvbGxBZFRhZyk7CmcmJihhLmdnKGspLGEuSmQoZykpfWVsc2UgYmEoZnVuY3Rpb24oKXtjYShjKX0uYmluZCh0aGlzKSw1MCl9ZnVuY3Rpb24gcShjLGIpeyhrLmFkVGFnfHxrLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLkQobC55YyxjLkIoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmYudHJhY2soImFjdGl2YXRlZEF0IixhKX1rJiZtPyhiP20ub2E9ITA6Zi50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCksYT1uZXcgZGEsYS5ZYyhjKSxhLkVzKG0pLGEuRHMoayksYS5vcygpLGEuYigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWG09dGhpcy5hWzFdO3RoaXMuZWs9dGhpcy5hWzddO3RoaXMuTXE9dGhpcy5hWzZdO3RoaXMuc2s9dGhpcy5hWzVdOwp0aGlzLmc9dGhpcy5hWzZdfWMudXU9YjtiLnByb3RvdHlwZT17V206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhtOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lazp0aGlzLkxxKGEpfSxMcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTXE6dGhpcy5yayhhKX0scms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnNrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgZWE9Yy51dXx8ZWEsSGM9bmV3IGVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SGMuV20oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuRWE9InNldHVwIjt0aGlzLmRjPVtdO3RoaXMuU2UoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5jcy5iaW5kKHRoaXMpKX0KYy5TaT1iO2IucHJvdG90eXBlPXtTZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxGbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEucG9zdE1lc3NhZ2UoYiwiKiIpfSxHYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sY3M6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuYnMoYS5kYXRhKX0sYnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQowO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0scmQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sRG06ZnVuY3Rpb24oYSxiKXswPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmxhLnVybHNbYV09Yjt0aGlzLmxhLnVybHNbYl09YTt0aGlzLmxhLmhvbWFkVXJsc1thXT1iO3RoaXMubGEub3JpZ2luYWxVcmxzW2JdPWF9LGJmOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMubGEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmxhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LCRhOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO2Zvcih2YXIgZD0wO2Q8dGhpcy5sYS5lcnJtc2cubGVuZ3RoO2QrKyliKz0iXG4iK3RoaXMubGEuZXJybXNnW2RdO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrCmEsYiwhMCl9LERhOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0saGY6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFhzOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LERmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD0KYS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEVmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxlPTAsYz0wLGg9MCxmPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIHU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighdSlyZXR1cm4hMTtjPXUuaGVpZ2h0KnUud2lkdGg7ZD11LndpZHRoO2U9dS5oZWlnaHQ7MD51LnRvcCYmKGUrPXUudG9wKTt1LmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGUtPXUuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD51LmxlZnQmJihkKz11LmxlZnQpO3UucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09dS5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZSYmKGU9MCk7MD5kJiYoZD0wKTswPGMmJihoPTEwMC9jKmQqZSk7aD49YiYmKGY9ITApO3JldHVybiBmfSxrYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPwo2NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEJkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxlO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWU9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZSxifD0wO3JldHVybiBifSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZTtmb3IoZD03OzA8PWQ7ZC0tKWU9YT4+PjQqZCYxNSxnKz1lLnRvU3RyaW5nKDE2KTtyZXR1cm4gZ31mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsYyxoPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsdT00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixJPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbixsLHcscSxyO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGU9MDtlPG4tMztlKz00KWM9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsKMSk8PDE2fGEuY2hhckNvZGVBdChlKzIpPDw4fGEuY2hhckNvZGVBdChlKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChlKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT1wW2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09ZChoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtjPWY7bj11O2w9azt3PUk7cT1tO2ZvcihlPQowOzE5Pj1lO2UrKylyPWQoYyw1KSsobiZsfH5uJncpK3EraFtlXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZT0yMDszOT49ZTtlKyspcj1kKGMsNSkrKG5ebF53KStxK2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGU9NDA7NTk+PWU7ZSsrKXI9ZChjLDUpKyhuJmx8biZ3fGwmdykrcStoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihlPTYwOzc5Pj1lO2UrKylyPWQoYyw1KSsobl5sXncpK3EraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmPWYrYyY0Mjk0OTY3Mjk1O3U9dStuJjQyOTQ5NjcyOTU7az1rK2wmNDI5NDk2NzI5NTtJPUkrdyY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZikrYih1KStiKGspK2IoSSkrYihtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQoiIixkLGUsYyxoLGYsdSxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxlPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8ZT4+NCxmPShlJjE1KTw8MnxjPj42LHU9YyY2Myxpc05hTihlKT9mPXU9NjQ6aXNOYU4oYykmJih1PTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZikrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQodSk7cmV0dXJuIGJ9LG5xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJgotMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LFdlOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGU9ITEsYz0hMSxoPSExLGY9ITEsdT0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7ZT13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5zbj8hMDohMX1jYXRjaChyKXt9dHJ5e2M9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLHU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksCms9IXUmJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZTthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZjthLmlzSUU9dTthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9bTtyZXR1cm4gYX0sWG86ZnVuY3Rpb24oKXt2YXIgYT0iVSIsYj10aGlzLldlKCk7Yi5pc1BoYW50b21KUz9hPSJIUCI6Yi5pc0Nocm9tZUhlYWRsZXNzP2E9IkhDIjpiLmlzRmlyZWZveEhlYWRsZXNzP2E9IkhGIjooYi5pc0JsaW5rJiYoYT0iQiIpLGIuaXNPcGVyYSYmKGE9Ik8iKSxiLmlzRmlyZWZveCYmKGE9IkYiKSxiLmlzU2FmYXJpJiYoYT0iUyIpLGIuaXNJRSYmKGE9IkkiKSxiLmlzRWRnZSYmKGE9IkUiKSxiLmlzQ2hyb21lJiYoYT0iQyIpKTtyZXR1cm4gYX0sWGE6ZnVuY3Rpb24oKXt2YXIgYT17b2g6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sCkNoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LENwOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHlrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LFVsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxrbjpmdW5jdGlvbigpe3JldHVybiBhLm9oKCl8fGEuQ2goKXx8YS5DcCgpfHxhLnlrKCl8fGEuVWwoKX19O3JldHVybiBhLmtuKCl9LEthOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGU9MTQ7ZS0tOylkW2JbZV1dPWFbZV18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxlPTAsYz1hLmxlbmd0aDtlPGM7KytlKWIuaGFzT3duUHJvcGVydHkoYVtlXSl8fChkLnB1c2goYVtlXSksYlthW2VdXT0xKTtyZXR1cm4gZH0sb2Y6ZnVuY3Rpb24oYSl7YT10aGlzLkthKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0saWI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sVW46ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZT1bXSxjPTA7YzxiLmxlbmd0aDtjKyspZFtiW2NdXT0hMDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWRbYVtjXV18fGUucHVzaChhW2NdKTtyZXR1cm4gZX0sVnM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxlPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGU9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZSk6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxlZjpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMueGcoYikrIjoiK3RoaXMueGcoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3JldHVybiAxMD4KYT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZWU6ZnVuY3Rpb24oYSl7dGhpcy5FYT1hfSxmaXJlRXZlbnQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlO2Quc3RhdGU9dGhpcy5FYTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9lPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGUuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChlKX0sVGI6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLmZpcmVFdmVudChkLGIsYSl9LEQ6ZnVuY3Rpb24oYSxiLGQsZSxjKXt2YXIgaD1hO2QmJmImJihiPWwuRmMoYixkKSk7YiYmKGg9bC5GYyhhLGIpKTtlJiYoaD1sLkZjKGgsZSkpO2MmJihoPWwuRmMoaCxjKSk7Zi5UYihoKX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgZT1tLmFlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTttLlRhKGUsITApO2U9bS5UYShlLCEwKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtlLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2UuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkZhKGUsZnVuY3Rpb24oZCl7dmFyIGU9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGU9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGU9ITEpfWNhdGNoKGMpe31lfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwKKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LEtkOmZ1bmN0aW9uKCl7bSYmbS5ZP20uaXNFbmFibGVkJiZtLkVuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktkKCl9LmJpbmQodGhpcyksNTAwKX0seW46ZnVuY3Rpb24oYSxiKXtpZihiLk9jKGEpfHwiYWJvdXQ6YmxhbmsiPT1hfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5lZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy4kYSgiZXJyX3VybCIsYSk7aWYodGhpcy5iZihhKSlyZXR1cm4gdGhpcy5iZihhKTt2YXIgZD17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtkLmhvbWFkX3VybF9zdWZmaXg9CmE7ZC5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGEpO2QuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtkLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dmFyIGU9ITEsYz0hMSxjPXRoaXMuWWEoYSxiLnVhLGQsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1jKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goaCl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLkxjKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLkRtKGUsYSk7cmV0dXJuIGV9LFlhOmZ1bmN0aW9uKGEsYixkLGUsYyxoLGYsdSl7dmFyIGs9aHx8bTtoPSEwO3UmJihoPSExKTtpZihrJiZrLlkpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChsKXtjKGwpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLlRhKGEsaCk7aD1rLlRhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7aC5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciBxIGluIGQpaC5kYXRhW3FdPWRbcV07cmV0dXJuIGsuRmEoaCxlLGMsIiIsIiIsZil9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGUsYyxrLGYsdSl9LmJpbmQodGhpcyksNTAwKX0sR3E6ZnVuY3Rpb24oYSxiLGQsZSxjLGgsZil7dmFyIHU9ITA7ZiYmKHU9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zj1kO2Q9IiI7Zm9yKHZhciBrIGluIGYpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChmW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFlfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGUobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsdSksbC53aXRoQ3JlZGVudGlhbHM9aCwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LEhxOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkdxKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLmRjKWZvcih2YXIgYyBpbiB0aGlzLmRjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuZGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LE1mOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWWEoYSxlLnVhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5IcShlLkxjKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGUsITApfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYz1hfSxJdTpmdW5jdGlvbihhLGIsZCxlLGMpe3RoaXMuWWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzplfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86ZX0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9KX0sbG46ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxqcTpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspaWYoYltlXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFA9Yy5TaXx8UDtuZXcgUDt2YXIgZj1uZXcgUDt3aW5kb3cuZnY9ZjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5SaT1iO2IuRmM9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxlO2ZvcihlIGluIGIpZFtlXT1iW2VdO2ZvcihlIGluIGEpZFtlXT1hW2VdO3JldHVybiBkfTtiLk5yPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLiRxPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5zdT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLnhvPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuR3U9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53bT17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5xbT17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IudG09e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IueW09e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLnBtPXtjb2RlOiIxMDA5IiwKdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5ybT17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld0PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5acT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55bz17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQnU9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTG49e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Rbj17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IiwKbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLnpjPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IueWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLnZtPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi51bT17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWU9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLkhlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLnptPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07CmIuc209e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLlR0PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuYXI9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgbD1jLlJpfHxsO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxoPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuUms9YjtiLnByb3RvdHlwZT17a2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGZhPWMuUmt8fGZhLEpjPW5ldyBmYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUpjLmtoKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuVGk9YjtiLnByb3RvdHlwZT17QmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGUsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKyllPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2UsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sZnA6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLnZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sR2M6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkdjKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuR2MoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD0KYS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sTWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuR2MoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWMoKSsiMiJ9LEJmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmQodGhpcy5mcCgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLkdjKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgZ2E9Yy5UaXx8Z2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlFxPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzJdfWMuJG49YjtiLnByb3RvdHlwZT17UHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy4kbnx8aGEsS2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9S2MuUHEoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZT1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZyllW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT8KZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGU9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGV9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGUuYz9lLmhhc093blByb3BlcnR5KCJpbml0Iik/ZS5jOmZ1bmN0aW9uKCl7ZC5jLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWU7ZS5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLnVlPWJ9KShjKTt2YXIgSj1jLnVlfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRoPXRoaXMuYVs3XTt0aGlzLnhyPXRoaXMuYVs1XTt0aGlzLlBvPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs3XTt0aGlzLnRyPXRoaXMuYVs3XTt0aGlzLkxrPXRoaXMuYVs1XTt0aGlzLmZpPQp0aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLlJxPWI7Yi5wcm90b3R5cGU9e1poOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kaDp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHI6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBvOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucG46dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnRyOnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Mazp0aGlzLmVpKGEpfSxlaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYT1jLlJxfHxpYSxMYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuWmgoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Oaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPXt9O3RoaXMuQT1udWxsO3RoaXMuYWM9MTAwO3RoaXMubGI9MDt0aGlzLndhPTE1MDt0aGlzLnFiPTA7dGhpcy5GcyhiKX0sYjpmdW5jdGlvbigpe30sSDpmdW5jdGlvbigpe3RoaXMubGI8PXRoaXMud2E/KHRoaXMubGIrKyx0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKTowPnRoaXMud2EmJih0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKX0scnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYj50aGlzLndhPyEwOiExfSxjZzpmdW5jdGlvbigpe3RoaXMubGI9MH0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEw6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmZiKCldPQpiO0smJksuS2YmJksuWXMoYil9LG52OmZ1bmN0aW9uKCl7cmV0dXJuIGYuRGEodGhpcy54YSl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueGEpaWYoYT09dGhpcy54YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy54YVtiLmZiKCldPyEwOiExfSxtcTpmdW5jdGlvbihiKXtiPWIuQ2EoKTtmb3IodmFyIGEgaW4gdGhpcy54YSlpZihiLmlkPT10aGlzLnhhW2FdLkNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LEJ2OmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMuTmt8fHI7KGZ1bmN0aW9uKGMpe2MuUGs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5hYz0xMDt0aGlzLmxiPTA7dGhpcy53YT01MDt0aGlzLko9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLlllPSExO3RoaXMuTigpfSwKSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7fSxPczpmdW5jdGlvbihiKXt0aGlzLko9Yn0sb3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KfSxJczpmdW5jdGlvbihiKXt0aGlzLk9kPWJ9LG12OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2R9LE5kOmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YSYmKHRoaXMubGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmFjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSwKZ2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5DYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sZmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxDdjpmdW5jdGlvbigpe30sUjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5CcCgpfHx0aGlzLkFtKCk7dGhpcy5mZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LHB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEFtOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixmLnBhKDEwKSl9LEJwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxPOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LENhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxOYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0samI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdnY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sZGE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxXYTpmdW5jdGlvbigpe3JldHVybiExfSxIZDpmdW5jdGlvbigpe3JldHVybiExfSxoZzpmdW5jdGlvbihiKXt0aGlzLmdiPWJ9LGx2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LHFzOmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxydjpmdW5jdGlvbigpe3ZhciBiPQohMTt0aGlzLmdiJiYoYj0hMCk7cmV0dXJuIGJ9LHh2OmZ1bmN0aW9uKCl7dGhpcy5ZZXx8KHRoaXMuWWU9ITApfSxIYzpmdW5jdGlvbigpe3JldHVybiExfSxpdjpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5Qa3x8cDsoZnVuY3Rpb24oYyl7Yy5PZz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuQT10aGlzLnBsYXllcj0iIjt0aGlzLkRlPSIxIjt0aGlzLkVlPSIyIjt0aGlzLmptPSIzIjt0aGlzLmljPTA7dGhpcy5QZj0zMDt0aGlzLnRiPVtdO3RoaXMuT2E9W107dGhpcy5MYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5LZT10aGlzLkJnPSExO3RoaXMuc3RhdHVzPXRoaXMuaWM7dGhpcy5pZD1mLnBhKDEwKTt0aGlzLlljKGIpOwp0aGlzLkdzKGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuQmd8fCh0aGlzLkJnPSEwLGYuS2QoKSl9LFJkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LKCk7USYmUS5ZYiYmIWphJiYoamE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdzpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLkxzKCksdGhpcy5BKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy50ZygpLHRoaXMuS2U9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LGw6ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnRiLnB1c2goYiksdGhpcy5PYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnRiJiYwPHRoaXMudGIubGVuZ3RoJiYodGhpcy50Yj1mLnVuaXF1ZSh0aGlzLnRiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsCnRoaXMudGIuam9pbigiLCIpKSk7aWYodGhpcy5PYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLk9hLmxlbmd0aDtnKyspdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl09PXRoaXMuTGJbYl0mJmEucHVzaCh0aGlzLk9hW2ddLmRldGFpbCksdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl08dGhpcy5MYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuT2FbZ10uZGV0YWlsKSxiPXRoaXMuT2FbZ10ucmVhc29uKTt0aGlzLkxiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9Zi51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sbTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGV9LExzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5FZX0sTXM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmptfSxDYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPQp0aGlzLmljfSxGZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5EZX0sWHU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuRWV9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmljfSxZYzpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEdzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEtxOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5PZ3x8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GaT10aGlzLmFbNV07dGhpcy5jdD10aGlzLmFbNV07dGhpcy5Eaj10aGlzLmFbOF07dGhpcy4kbD10aGlzLmFbN107dGhpcy5ndD10aGlzLmFbMTBdO3RoaXMuY3I9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19CmMuUGc9YjtiLnByb3RvdHlwZT17RWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZpOnRoaXMuYnQoYSl9LGJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdDp0aGlzLkNqKGEpfSxDajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGo6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRsOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ndDp0aGlzLmJyKGEpfSxicjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYT1jLlBnfHxrYSxNYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5FaSg0KTsoZnVuY3Rpb24oYyl7Yy5OaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5KJiZ0aGlzLkooKX0sSzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgUj1jLk5ofHxSOyhmdW5jdGlvbihjKXtjLk1oPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5nZD1udWxsO3RoaXMuaHU9MUUzO3RoaXMuV2Y9Cm51bGw7dGhpcy52dD0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuc24pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Jby5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMueHAuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy53cChhLGIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMua3UoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLmx1KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMudnAoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLk9uKGEpfS5iaW5kKHRoaXMpKX0sCk9uOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sa3U6ZnVuY3Rpb24oYil7dGhpcy5nZHx8KHRoaXMuZ2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm11KGIpfS5iaW5kKHRoaXMpLHRoaXMuaHUpKX0sbXU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZ2QpO3RoaXMudygpfSxsdTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5nZCl9LHZwOmZ1bmN0aW9uKGIpe3RoaXMuZHYoYik7dGhpcy5XZj1uZXcgRGF0ZTt0aGlzLldmLXRoaXMuWHI8dGhpcy52dD90aGlzLncoKTp0aGlzLm0oKX0seHA6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5ZYyhuZXcgUihhKSkpO3RoaXMudygpfSxJbzpmdW5jdGlvbigpe30sd3A6ZnVuY3Rpb24oKXt0aGlzLlhyPW5ldyBEYXRlfX0pfSkoYyk7dmFyIGxhPWMuTWh8fGxhOyhmdW5jdGlvbihjKXtjLk9oPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxmLkRhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFIoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgbGEoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkgoKX19fSl9KShjKTt2YXIgbWE9Yy5PaHx8bWEsbmE9bmV3IG1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnd1PXRoaXMuYVs5XTt0aGlzLlRvPXRoaXMuYVs5XTt0aGlzLkdwPXRoaXMuYVs4XTt0aGlzLmJoPXRoaXMuYVsyXTt0aGlzLmhpPXRoaXMuYVs4XTt0aGlzLkR0PXRoaXMuYVszXTt0aGlzLlR1PXRoaXMuYVs5XTsKdGhpcy5Ucj10aGlzLmFbNV07dGhpcy5mcz10aGlzLmFbNV07dGhpcy5Iaz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxXX1jLkh1PWI7Yi5wcm90b3R5cGU9e3Z1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53dTp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVG86dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdwOnRoaXMuYWgoYSl9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5iaDp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaGk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkR0OnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5UdTp0aGlzLlNyKGEpfSxTcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHI6dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZzOnRoaXMuR2soYSl9LApHazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgb2E9Yy5IdXx8b2EsTmM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMudnUoNCk7KGZ1bmN0aW9uKGMpe2Mucmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdLHRoaXMubHE9ITApO3RoaXMuUihhKTsKdGhpcy5SZigpO3RoaXMuUG49ITF9LFJmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYSgpLGE9dGhpcy52aWRlb1RhZyxnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtpZihnKXtpZigiT0JKRUNUIj09Zy5ub2RlTmFtZXx8IlZJREVPIj09Zy5ub2RlTmFtZSlnPWcucGFyZW50Tm9kZTtnIT1iJiZ0aGlzLk8oZyk7Yj1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2lmKCFiKWI9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF07ZWxzZSBpZih0aGlzLmxxKXt0aGlzLmtxPSEwO3JldHVybn1iJiZiIT1hJiZ0aGlzLlIoYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl9LmJpbmQodGhpcyksNTApfX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihrLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllciwKY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcykpfSxOZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLiRjKGEpfS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpfSwkYzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuT2QmJigwLHRoaXMuT2QpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LApqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxIYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHBhPWMucmp8fHBhOyhmdW5jdGlvbihjKXtjLnFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LENiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5pYzt0aGlzLmlzUGxheWluZz10aGlzLmtjPQohMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmCmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmJiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5iYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMua2M9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkSW1wcmVzc2lvbiIpOwp0aGlzLlJkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5QZiYmIXRoaXMuaGEoKSYmKHRoaXMuYmI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJih0aGlzLkNiKCksdGhpcy5nZXRQbGF5ZXIoKS5Qbj0hMCxrLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2I7YSYmKGEuVGQoKSxhLkFhKCkpfX0uYmluZCh0aGlzKX0pOwppZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5rYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUGYmJiF0aGlzLmhhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMubWMuaW5kZXhPZihhKSYmdGhpcy5tYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5tKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubSgiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMubWMubGVuZ3RoPj10aGlzLnBkJiZ0aGlzLm8oKSl9LEtxOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sbzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKTtmLlhzKGEudmlkZW9UYWcpJiYoYS5rcT90aGlzLm0oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmtjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksNTApKX19KX0pKGMpO3ZhciBxYT1jLnFqfHxxYTsoZnVuY3Rpb24oYyl7Yy5zaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmFwKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07ZHx8KGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2R8fCJPQkpFQ1QiIT1nLm5vZGVOYW1lJiYiVklERU8iIT1nLm5vZGVOYW1lfHwoZD1nKTtpZihkKXt2YXIgZz1uZXcgcGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMubXEoZyl8fCh0aGlzLkwoZyksZz1uZXcgcWEoZyx0aGlzLkEpLApnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGFwOmZ1bmN0aW9uKCl7dmFyIGI9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZi53YihiLmFuY2hvcil9fSl9KShjKTt2YXIgcmE9Yy5zanx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLm5oPXRoaXMuYVsxMF07dGhpcy5yaT10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVs0XX1jLiRnPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50cTp0aGlzLm1oKGEpfSxtaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubmg6dGhpcy5waShhKX0scGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5yaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIHRhPWMuJGd8fHRhLE9jPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLnNxKDQpOyhmdW5jdGlvbihjKXtjLlhsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuTyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5SKGIpOnRoaXMuSCgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB1YT1jLlhsfHx1YTsoZnVuY3Rpb24oYyl7Yy5XbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm0oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5vKCkpfSxvOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgdmE9Yy5XbHx8dmE7KGZ1bmN0aW9uKGMpe2MuWWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8Zi5EYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgdWEoZyksdGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgdmEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgd2E9Yy5ZbHx8d2EseGE9bmV3IHdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zdD10aGlzLmFbMl07dGhpcy51bz10aGlzLmFbOF07dGhpcy5XZz10aGlzLmFbOV07dGhpcy5GdD10aGlzLmFbOV07dGhpcy5BdT10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs3XX1jLlVvPWI7Yi5wcm90b3R5cGU9e3J0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLnRvKGEpfSx0bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudW86dGhpcy5WZyhhKX0sVmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldnOnRoaXMuRXQoYSl9LEV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GdDp0aGlzLnp1KGEpfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgeWE9Yy5Vb3x8eWEsUGM9bmV3IHlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLnJ0KDQpOyhmdW5jdGlvbihjKXtjLkpsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLk8oYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUihiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sSzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnBiKGIpfS5iaW5kKHRoaXMpKX0scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkomJnRoaXMuSigpfSxOYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5leGl0RnVsbHNjcmVlbigpfSwKY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB6YT1jLkpsfHx6YTsoZnVuY3Rpb24oYyl7Yy5JbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy56Zz0hMDt0aGlzLnRkPXRoaXMueWY9ITE7dGhpcy5TZigpO3RoaXMuQm4oKTt0aGlzLkhhKCl9LHl2OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5mYigpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5iYSwiOyIsCnR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5zYToKInVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLmxkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLm1kOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuRj9iLkYubWE6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2Q6InVuZGVmaW5lZFgiLAoiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuYWcpfSxTYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sVmI6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGI9CnRoaXMuU2EoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLlhiKXt2YXIgYj10aGlzLlNhKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWGI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlhiPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWGJ9LGlxOmZ1bmN0aW9uKCl7aWYoIXRoaXMueGYpe3ZhciBiPXRoaXMuU2EoKSxhPXRoaXMuZ3EoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJgoodGhpcy54Zj0hMCl9cmV0dXJuIHRoaXMueGZ9LGdxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5xYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMucWM9ITApO3JldHVybiB0aGlzLnFjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYKKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXt0aGlzLmJlKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxiZTpmdW5jdGlvbigpe3RoaXMudGQ9ITA7dmFyIGI9dGhpcy5rZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2YuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2YuaWIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPQohMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMuTmJ8fCh0aGlzLmwoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLlcoKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksCjIwKX0sanY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlRlJiZiLmFkcyYmKHRoaXMuVGU9Yi5hZHMpO3JldHVybiB0aGlzLlRlfSxCbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuVygpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpOwpiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKX0sVmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDUwKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuaXEoKSl7dmFyIGE9dGhpcy5TYSgpLGc9dGhpcy5WYigpO2EmJmcmJih0aGlzLlNhKCksdGhpcy5WYigpLHRoaXMudGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZD90aGlzLm0oKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5TYSgpfWVsc2UgdGhpcy55Zj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhKCksYj10aGlzLlZiKCk7YSYmIWI/KHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuU2EoKTt0aGlzLlZiKCl9LmJpbmQodGhpcyksMTAwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuVygpKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy55Zj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl9LmJpbmQodGhpcyksNTApfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYKKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LENuOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihiLmFkcyl7aWYodGhpcy5RYiE9Yi5hZHMuc3RhdGUmJih0aGlzLlFiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLlFiKXt0aGlzLm0oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuUWI9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNuKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITA7dGhpcy5tKCJlbXB0eSB2YXN0Iil9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuemc9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuemcsZnVuY3Rpb24oKXt0aGlzLlZlKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApIbjpmdW5jdGlvbigpe3RoaXMudHZ8fCgxMDx0aGlzLml1Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApKToodGhpcy5pdSsrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnBzKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhuKCl9LmJpbmQodGhpcyksNTApKSl9LHBzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLmp1KXt0aGlzLmp1PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrCmEsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBBYT1jLklsfHxBYTsoZnVuY3Rpb24oYyl7Yy5LbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1nKGJbZ10pfWNhdGNoKGQpe310aGlzLkgoKX19LG1nOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYuRGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgemEoYltnXSksYS5qYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBBYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxIOmZ1bmN0aW9uKCl7dGhpcy5xYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmFjKX19KX0pKGMpOwp2YXIgQmE9Yy5LbHx8QmEsQ2E9bmV3IEJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk11PXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzZdfWMuU3M9YjtiLnByb3RvdHlwZT17THU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk11OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgRGE9Yy5Tc3x8RGEsUWM9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuTHUoNCk7KGZ1bmN0aW9uKGMpe2Mudmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpOwpiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuTyhhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe30scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSiYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKToKYi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEVhPWMudmx8fEVhOyhmdW5jdGlvbihjKXtjLnVsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLnpiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmVjPSExO3RoaXMuYmcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9CmIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLm0oKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZWM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy51YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlFlKCk6dGhpcy5tKCl9LHVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlOwphLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMubSgpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5lYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZWM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy51Yy5iaW5kKHRoaXMpLAoxMDApfX0sUWU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuemIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuemImJih0aGlzLnpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lY3x8Cih0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFlLmJpbmQodGhpcyksNTApfX0sYmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5lYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJgp0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZhPWMudWx8fEZhOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBFYSh2aWRlbyk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgRmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIEdhPWMud2x8fEdhLEhhPW5ldyBHYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLmRyPQpiO2IucHJvdG90eXBlPXtiajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgSWE9Yy5kcnx8SWEsUmM9bmV3IElhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuYmooNCk7KGZ1bmN0aW9uKGMpe2MueGg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5RZj1hfSxOOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLlFmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFmKS5wYXJlbnROb2RlO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKSzpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgSmE9Yy54aHx8SmE7KGZ1bmN0aW9uKGMpe2Mud2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIEthPWMud2h8fEthOyhmdW5jdGlvbihjKXtjLnloPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IEphKGQsYSksdGhpcy5JKGQpfHwoZC5MZChhKSx0aGlzLkwoZCksCmQ9bmV3IEthKGQsdGhpcy5BLGcpLGQuTGQoZyksZC5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgTGE9Yy55aHx8TGEsTWE9bmV3IExhKGNhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zaD10aGlzLmFbOF07dGhpcy5Sbz10aGlzLmFbNl07dGhpcy5MdD10aGlzLmFbMV07dGhpcy5Ecj10aGlzLmFbNV07dGhpcy5Qcj10aGlzLmFbNV07dGhpcy53aj10aGlzLmFbN107dGhpcy5qbD10aGlzLmFbOV07dGhpcy5GdT10aGlzLmFbNV07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLmpoPWI7Yi5wcm90b3R5cGU9e3JoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zaDp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm86dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT8KdGhpcy5MdDp0aGlzLkNyKGEpfSxDcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHI6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlByOnRoaXMudmooYSl9LHZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53ajp0aGlzLmlsKGEpfSxpbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamw6dGhpcy5FdShhKX0sRXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GdTp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgTmE9Yy5qaHx8TmEsU2M9bmV3IE5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MucmgoNCk7KGZ1bmN0aW9uKGMpe2MuV2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLk8oYik7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sWGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmMDwkKCJib2R5LmRldmljZV9tb2JpbGUiKS5sZW5ndGgmJihiPSEwKTtyZXR1cm4gYn0sSzpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgT2E9Yy5Xanx8T2E7KGZ1bmN0aW9uKGMpe2MuVmo9CnQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlhhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMubGMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpKTp0aGlzLmxjKCl9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkP2IuYWRDb250ZXh0Ll9hZFJlc3BvbnNlP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpOwp2YXIgUGE9Yy5Wanx8UGE7KGZ1bmN0aW9uKGMpe2MuWGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBPYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFBhKGIsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBRYT1jLlhqfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW09dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVszXTt0aGlzLnFoPXRoaXMuYVsxXTt0aGlzLmlrPXRoaXMuYVszXTt0aGlzLlppPXRoaXMuYVs1XTt0aGlzLkhyPXRoaXMuYVs2XTt0aGlzLkxwPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5uaj0KdGhpcy5hWzNdO3RoaXMuR289dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMl19Yy5CbD1iO2IucHJvdG90eXBlPXtMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTW06dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmV0OnRoaXMucGgoYSl9LHBoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucWg6dGhpcy5oayhhKX0saGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlrOnRoaXMuWWkoYSl9LFlpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5aaTp0aGlzLkdyKGEpfSxHcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHI6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxwOnRoaXMuQXMoYSl9LEFzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQnM6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5qOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuR286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBTYT1jLkJsfHxTYSxUYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5MbSg0KTsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLlVkPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLk8oYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlIoYik6dGhpcy5kYSgpfSxZcjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5ZYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5UZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWQ9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuVWQrKztpZigxMDx0aGlzLlVkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkomJnRoaXMuSigpfX0pfSkoYyk7dmFyIFRhPWMuQWt8fFRhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkVvPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLkVvPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuWXIoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFVhPWMuemt8fFVhOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVGEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkkoYSl8fCh0aGlzLkwoYSksKG5ldyBVYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgVmE9Yy5Ca3x8VmEsV2E9bmV3IFZhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlF0PXRoaXMuYVs4XTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLmppPXRoaXMuYVszXTt0aGlzLmd1PXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzFdfWMudXM9YjtiLnByb3RvdHlwZT17UHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ubDp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuamk6dGhpcy5mdShhKX0sZnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzoKYX19fSkoYyk7dmFyIFhhPWMudXN8fFhhLFVjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVVjLlB0KDQpOyhmdW5jdGlvbihjKXtjLk9pPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5PKGIuZWxlbWVudCk7dGhpcy5SKGIuZWxlbWVudCl9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIFlhPWMuT2l8fFlhOyhmdW5jdGlvbihjKXtjLk5pPQp0LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmRldGFpbCYmIjEwMTAiPT1iLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCl9fSl9KShjKTt2YXIgWmE9Yy5OaXx8WmE7KGZ1bmN0aW9uKGMpe2MuUGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLGZ1bmN0aW9uKGIpe2I9bmV3IFlhKGIuZGV0YWlsKTtiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuQSkpLmIoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciAkYT1jLlBpfHwkYSxhYj1uZXcgJGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWc9dGhpcy5hWzNdO3RoaXMuWHA9dGhpcy5hWzhdO3RoaXMuS2g9dGhpcy5hWzZdO3RoaXMubGk9dGhpcy5hWzhdO3RoaXMuRGk9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzZdO3RoaXMudmk9dGhpcy5hWzhdO3RoaXMuWmo9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbNl19Yy5IcD1iO2IucHJvdG90eXBlPXtUZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWc6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlhwOnRoaXMuSmgoYSl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5LaDp0aGlzLmtpKGEpfSxraTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubGk6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5EaTp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLktvOnRoaXMudWkoYSl9LHVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52aTp0aGlzLllqKGEpfSxZajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGJiPWMuSHB8fGJiLFZjPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVZjLlRnKDQpOyhmdW5jdGlvbihjKXtjLmtqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1mLmhmKGIsImVsZW1lbnRJRCIpO3RoaXMuWWY9Yi5wb3NpdGlvbmluZzsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuTyhnKTt0aGlzLlIoZyk7dGhpcy5EYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuRGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkRjKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCkduOmZ1bmN0aW9uKCl7Zi5EZih0aGlzLkRjKTtmLkVmKHRoaXMuRGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HbigpfS5iaW5kKHRoaXMpLDUwKX0sSzpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxIZDpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGNiPWMua2p8fGNiOyhmdW5jdGlvbihjKXtjLmpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBkYj1jLmpqfHxkYjsoZnVuY3Rpb24oYyl7Yy5saj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLndhPTE1MDA7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoayYmay5pbnJlYWQpe3ZhciBiPWsuaW5yZWFkLGE9Zi5oZihiLCJlbGVtZW50SUQiKTtmLkRmKGEpJiYoYj1uZXcgY2IoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgZGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLnFiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5xYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZWI9Yy5sanx8ZWIsZmI9bmV3IGViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVoPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzFdfWMuZ3M9YjtiLnByb3RvdHlwZT17ZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVoOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgZ2I9Yy5nc3x8Z2IsV2M9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9V2MuZGgoNCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5VaT1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxIczpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LEJtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB6PWMuVWl8fHo7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5JYT1hO3RoaXMuZGY9dGhpcy5LZz0hMTt0aGlzLlRmPWQ7dGhpcy5uZz0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5JYT1uZXcgeihhKSk7dmFyIGY9dGhpcy5OYT1uZXcgWE1MSHR0cFJlcXVlc3Q7Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Zi5yZWFkeVN0YXRlfHwKMjAwIT1mLnN0YXR1cyYmMjAxIT1mLnN0YXR1c3x8ZyhmKTtpZihkJiY0PT1mLnJlYWR5U3RhdGUmJjIwMCE9Zi5zdGF0dXMmJjIwMSE9Zi5zdGF0dXMpZChmKTtlbHNlIGlmKDQ9PWYucmVhZHlTdGF0ZSYmMD09Zi5zdGF0dXMmJm0mJm0uRmQodGhpcy5JYS51cmwpJiZtLmRkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5IcygiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxtLmdhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5nYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9Zi5yZWFkeVN0YXRlJiZjKGYpfS5iaW5kKHRoaXMpfWMuVmk9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEuZGF0YTsKaWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmRmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5uZz90aGlzLk5hLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITEpOnRoaXMuTmEub3Blbih0aGlzLklhLm1ldGhvZCx0aGlzLklhLnVybCwhMCksdGhpcy5LZ3x8KHRoaXMuTmEud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGsmJmsudnBhaWQmJm0mJm0uT2ModGhpcy5JYS51cmwpJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuTmEuc2VuZChhKX1jYXRjaChjKXttJiYKbS5GZCh0aGlzLklhLnVybCk/bS5kZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmYudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkZkKHRoaXMuSWEudXJsKSx0aGlzLlRmJiZ0aGlzLlRmKCl9cmV0dXJuIHRoaXMuTmF9fX0pKGMpO3ZhciBoYj1jLlZpfHxoYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnVkPXRoaXMuZWI9bnVsbDt0aGlzLlZuPXRoaXMubmI9dGhpcy5MZj0hMTt0aGlzLnVhPSIiO3RoaXMuR2Y9ITE7dGhpcy56YT10aGlzLkpjPSIiO3RoaXMuQ2Y9dGhpcy5ZPXRoaXMuaXNFbmFibGVkPXRoaXMuWmQ9ITE7dGhpcy5NYT1bXTt0aGlzLnRmPXRoaXMuRmI9IiI7dGhpcy55ZD0hMTt0aGlzLmtlPTA7dGhpcy55ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5zYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7CnRoaXMuaGM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMueGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMub2I9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMubGU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5DZD0hMTt0aGlzLkluPXRoaXMuZWQ9bnVsbDt0aGlzLmZjPXRoaXMuQWc9dGhpcy5uZT10aGlzLmRkPXRoaXMudmQ9dGhpcy5qYz0hMTt0aGlzLlBhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfX1jLldpPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmViLGFkdGFncmVnZXg6dGhpcy51ZCxqc3BvcHVwczp0aGlzLkxmLHNpZGVsb2Fkczp0aGlzLm5iLGRpc2FibGV0ZXN0czp0aGlzLlZuLGhvbWFkQWxpYXM6dGhpcy51YSwKaXNJbml0aWFsaXplZDp0aGlzLkdmLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnphLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5DZixzZXJ2ZXI6dGhpcy5NYSxzdm1Db25maWc6dGhpcy5GYixob21hZEFkcGF0aDp0aGlzLnRmLGRpc2FibGVDb29raWVUZXN0OnRoaXMueWQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMua2UsSE9NQURfVkVSSUZJRUQ6dGhpcy55ZSxIT01BRF9CTE9DS0VEOnRoaXMud2UsSE9NQURfTk9CTE9DS0VSOnRoaXMuc2IsSE9NQURfQURCTE9DS0VSOnRoaXMuaGMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLnhlLHRlc3RIaWRlOnRoaXMuSGIsdGVzdFRhZ3M6dGhpcy5vYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMubGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5DZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkluLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLmpjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy52ZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5kZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5uZSxjb25maWdGYWlsdXJlczp0aGlzLlBhLHNpdGVDb25maWc6dGhpcy5FYixzZXJ2ZXJJZDp0aGlzLmZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5TYix2cGFpZDp0aGlzLmZjfX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuUGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5QYVtiXSYmMT09dGhpcy5QYVtiXSYmKGE9ITApO3JldHVybiBhfSxjZTpmdW5jdGlvbihhKXt0aGlzLlBhW2FdPSEwfSxicDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYxPT10aGlzLlBhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LFpzOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhOwphPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLmxuKGEpfSxUYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZj0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuT2MoYSk7Zj10aGlzLkthKGEpO2M/KHRoaXMuWmIoKT9oPWE6aD1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixrPWYucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMuYWUoKSxrPWYucGF0aC5zdWJzdHIoMSkrCihmLnF1ZXJ5PyI/IitmLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuT2J8fHRoaXMuZWJ8fHRoaXMudWQpJiYoaz10aGlzLlNxKGspKTthPW5ldyB6KGgpO2EudXJsPWg7aD0iIjtoPWM/Zi5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuY3AoZi5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxPYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuWmIoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuTWEmJnRoaXMuTWEubGVuZ3RoJiYwPHRoaXMuTWEubGVuZ3RoJiYoYj10aGlzLk1hWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuT2MoYSk7cmV0dXJuIGJ9LGNwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSwKYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5idjtyZXR1cm4ibm9uZSJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWFbdGhpcy5mZ119LGFlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5MYygpLGI9dGhpcy5qZygobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxTcTpmdW5jdGlvbihhKXt0aGlzLk9iJiYoYSs9dGhpcy5PYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7cmV0dXJuIGF9LGM6ZnVuY3Rpb24oYSxiLGQsYyxmLGgpe209dGhpczt0aGlzLkdmPSEwO3RoaXMuSmM9YTt0aGlzLnphPWI7dGhpcy5aZD1kO3RoaXMuZWQ9Yzt0aGlzLkJjPWY7dGhpcy5FYj0KaDt0aGlzLkZxKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnphKXRoaXMuRHEoKTtlbHNlIHRyeXt0aGlzLnphPWIoKSx0aGlzLndjKCl9Y2F0Y2goayl7dGhpcy5nYSgibm9DbGllbnRDb25maWciKX19LFphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxGcTpmdW5jdGlvbigpe3RoaXMuRmEobmV3IHoodGhpcy5KYyt0aGlzLm9jKCJnbG9iYWwiKSksdGhpcy5zcC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLndjKCl9LmJpbmQodGhpcyksITApfSxEcTpmdW5jdGlvbigpe25ldyB6KHRoaXMuemErdGhpcy5vYygiY2xpZW50IikpO3RoaXMuRmEobmV3IHoodGhpcy56YSt0aGlzLm9jKCJjbGllbnQiKSksdGhpcy53Yy5iaW5kKHRoaXMpLApmdW5jdGlvbigpe3RoaXMuY2UoImNsaWVudCIpO3RoaXMuZ2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LG9jOmZ1bmN0aW9uKGEpe3ZhciBiPSI/Y2FjaGU9Iit0aGlzLmtiKCk7dGhpcy5FYiYmdGhpcy5FYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuRWImJnRoaXMuRWIubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxnYTpmdW5jdGlvbihhKXtpZighdGhpcy52ZCl7dGhpcy52ZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuQ2Y9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndlKSk7dGhpcy5yYigpO2YuVGIobC5Ocik7KGI9Zi5vZih0aGlzLkxjKCkpKXx8KGI9Zi5vZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sc3A6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnphfHx0aGlzLkZifHx0aGlzLnVhfHx0aGlzLndjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX19LHdjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnphfWVsc2UgYT10aGlzLnphO3RoaXMuaXNFbmFibGVkPXRoaXMuSmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuTWE9YS5zZXJ2ZXJ8fFtdO3RoaXMuRmI9YS5jb25maWd8fCIiO3RoaXMudWE9YS5hbGlhc3x8bnVsbDt0aGlzLnRmPWEuYWRwYXRofHwiIjt0aGlzLnlkPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuZmc9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuTWEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5GYiYmdGhpcy51YSYmdGhpcy5NYS5sZW5ndGg/dGhpcy5RYyghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX0sUWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9Cm5ldyB6KHRoaXMuYWUoKSksYz10aGlzLkthKHRoaXMuRmIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5GYit0aGlzLm9jKCJjdXN0b21lciIpKTt0aGlzLkZhKGIsdGhpcy5hdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiY3VzdG9tZXIiKTthP3RoaXMuYWw/dGhpcy5nYSgibm9TVk1Db25maWciKToodGhpcy5hbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuUWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGF0OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5kZD0KdGhpcy5KYihiLnN0cmljdCk7dGhpcy5uZT10aGlzLkpiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkFnPWIuZHVyYXRpb25fY2hlY2tfZW5hYmxlZHx8ITE7dGhpcy5TYj10aGlzLkpiKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuSGI9Yi50ZXN0aGlkZXx8IiI7dGhpcy5vYj1iLnRlc3RhZHRhZ3N8fFtdO3RoaXMuSWI9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PYj1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmViPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnVkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLkxmPWIuanNwb3B1cHN8fCExO3RoaXMubmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuZmM9Yi52cGFpZHx8ITE7dGhpcy5FYi52cGFpZD10aGlzLmZjO3RoaXMuR2I9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMubXAoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnlkJiYodGhpcy5HYj1udWxsKTt0aGlzLmxlPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuQ2QmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkNkPSEwLHRoaXMuUWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMudHQoKSYmKHRoaXMuSGJ8fHRoaXMuSWJ8fHRoaXMub2J8fHRoaXMuR2IpP3RoaXMuWmQ/KHRoaXMub2E9dGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy53ZCgpLHRoaXMucmIoKSk6dGhpcy5qdCgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmt0KCkpfX0sanQ6ZnVuY3Rpb24oKXt0aGlzLml0KCl9LGt0OmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSk7dGhpcy5yYigpfSxjZDpmdW5jdGlvbihhKXt0aGlzLmpjPQohMDt0aGlzLll8fCh0aGlzLlk9dGhpcy5vYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEoYSkpLHRoaXMucmIoKSx0aGlzLndkKCkpfSxpdDpmdW5jdGlvbigpe2lmKHRoaXMuSGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZSl7fWE/dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMucWcoKX1lbHNlIHRoaXMucWcoKX0scGc6ZnVuY3Rpb24oKXt2YXIgZTt2YXIgYztmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoKSk7dGhpcy5udChlLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuaWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmNkKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX10aGlzLm9iPW51bGwsdGhpcy5pZSgpfSxudDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZSgpe2YoKSYmYigpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dGhpcy5GYShuZXcgeihhKSxlLGZ1bmN0aW9uKCl7ZigpJiZjKCl9KX0scWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLmtiKCkpO3RoaXMub3QoZSwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBnLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLkliJiZ0aGlzLkliLmxlbmd0aCl7dmFyIGM9dGhpcy5JYi5zbGljZSgpLGU7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnBnKCl9LG90OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBlKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZigpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZmKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1lO2wub25lcnJvcj1mO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobSl7ZSgpfX0saWU6ZnVuY3Rpb24oKXt0aGlzLkdiPyh0aGlzLmtlKyssdGhpcy5GYShuZXcgeih0aGlzLkdiKSx0aGlzLmh0LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMub2coKX0samU6ZnVuY3Rpb24oYSl7dGhpcy5jZCh0aGlzLnhlLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saHQ6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMua2U/dGhpcy5pZSgpOnRoaXMuamUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5vZygpOnRoaXMuamUoIkFBQSIpfSxvZzpmdW5jdGlvbigpe3RoaXMuWT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy5zYikpO3RoaXMucmIoKTt0aGlzLndkKCl9LHJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO2YuWGEoKSYmKGE9IjEiKTt0aGlzLmpjJiYoYj0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy55ZSkpO3RoaXMuZWQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZCYmdGhpcy5lZCgpfSxGbjpmdW5jdGlvbigpe2lmKHRoaXMubmUmJnRoaXMuenAoKSl7dmFyIGE9dGhpcy5icCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sdGc6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9CiJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRmE6ZnVuY3Rpb24oYSxiLGMsZSxoLEljKXthPW5ldyBoYihhLGIsYyk7ZSYmKGEuS2c9ITApO2gmJmYubnEoKSYmKGEuZGY9ITApO0ljJiYoYS5uZz0hMCk7cmV0dXJuIGEubG9hZCgpfSxPZTpmdW5jdGlvbigpe2YuWGEoKXx8Zi5ZYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZT0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5nYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7ZT0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLlpiKCl8fChhPXRoaXMuS2EoZSksZT1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZSl9ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sRW46ZnVuY3Rpb24oKXt0aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkZhKGEsdGhpcy5WdC5iaW5kKHRoaXMpLHRoaXMuVXQuYmluZCh0aGlzKSl9LFZ0OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7cmV0dXJufWN8fHRoaXMuem8oKX0sVXQ6ZnVuY3Rpb24oKXt9LHpvOmZ1bmN0aW9uKCl7Zi5UYihsLnlvKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx3ZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm5iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMubmIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5uYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZi5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKX19LHR0OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMubGV9LG1wOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCwKYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHdiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGUsZixoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8ZT4+NCxrPShlJjE1KTw8MnxmPj42LGw9ZiY2Myxpc05hTihlKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxLYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgYz17fSxlPTE0O2UtLTspY1tiW2VdXT1hW2VdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsZixoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGU9MDtlPG4tMztlKz00KWY9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsxKTw8MTZ8YS5jaGFyQ29kZUF0KGUrMik8PDh8YS5jaGFyQ29kZUF0KGUrMykseS5wdXNoKGYpOwpzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHkucHVzaChlKTsxNCE9eS5sZW5ndGglMTY7KXkucHVzaCgwKTt5LnB1c2gobj4+PjI5KTt5LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT15W2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09YyhoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtmPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihlPTA7MTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8fm4mdykrdCtoW2VdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtmb3IoZT0yMDszOT49ZTtlKyspeD1jKGYsNSkrKG5ecF53KSt0K2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZixmPXg7Zm9yKGU9NDA7NTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8biZ3fHAmdykrdCtoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsZj14O2ZvcihlPTYwOzc5Pj1lO2UrKyl4PWMoZiw1KSsobl5wXncpK3QraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtrPWsrZiY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGliPWMuV2l8fGliLG09bmV3IGliO3dpbmRvdy5ndj1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMTBdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuRXA9dGhpcy5hWzRdO3RoaXMuYWs9dGhpcy5hWzJdO3RoaXMuT3Q9dGhpcy5hWzZdO3RoaXMuVnA9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19Yy5wcj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY2s6dGhpcy56dChhKX0senQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkF0OnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRXA6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFrOnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpOwp2YXIgamI9Yy5wcnx8amIsWGM9bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuYmsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5qPWE7YS51Lks/dGhpcy5MYT1hLnUuSygpOnRoaXMuTGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5qLlFhO3RoaXMucGxheWVyPXRoaXMuai51O3RoaXMucmM9ITE7dGhpcy5qbj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmJkPXt9O3RoaXMucGM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5wYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmoudSkmJnRoaXMuai51LkImJihhPXRoaXMuai51LkIoKSksdGhpcy5wYz1jLmFkbWVzc2FnZShhKSkpOwpjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuSW09Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5hZD0hMTt0aGlzLk5mPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLnM9e307dGhpcy5uYz0hMTt0aGlzLndnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuWWI9ITE7dGhpcy5Sbj1mLnBhKDEwKTt0aGlzLlRjPWYucGEoMTApO3RoaXMuUGQ9Zi5wYSgxMCk7dGhpcy5rZz1mLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkFiPSExO3RoaXMuemQ9bnVsbDt0aGlzLkFjPXRoaXMubGc9dGhpcy5VZj10aGlzLkVjPXRoaXMud3Q9dGhpcy5hYj0hMX1jLlFpPWI7Yi5wcm90b3R5cGU9e2dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuTGFdJiYKdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSx1ZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5FYSYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULmpjP2YudHJhY2soImFkY2FsbCIsIjEiKTpmLnRyYWNrKCJhZGNhbGwiLCIwIik7Zi50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2YuRChsLnVtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSl9LEpkOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmFiPWM7aWYodGhpcy5ULlkpdGhpcy5ULkZuKCksdGhpcy5ULm9hJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5mY30pKTpiPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLlQuZmMsCnVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5BYSgpO2Vsc2V7dmFyIGU9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5KZChhLGIsYyl9LDUwKX19LFZkOmZ1bmN0aW9uKGEpe3RoaXMuRWM9ITE7dGhpcy5zPWE7dGhpcy5Qcyh0aGlzLnMpO3RoaXMucGYoYSl9LHBmOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLmJkPXRoaXMub3AoYSkpLHRoaXMucGYoYS5wYXJlbnQpKX0sb3A6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxlPVtdLGY9W10saD0iIjtpZihhLmFhKXtiPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtlPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5hYS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuYWEuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSk7YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmCihoPWEuYWEuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGUubGVuZ3RoO2srKyllW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZVtrXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGgpKSxlW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS55YihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZixhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQ2MmJmEuQ2MuZXJyb3ImJmEuQ2MuZXJyb3IuY29kZSYmKGI9YS5DYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmdjLmNvZGU6Yj09Qy5qZC5jb2RlPwpmLkQobC5zdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpOihmLktkKCksYj09Qy5CZS5jb2RlJiZmLkQobC5acSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKTtmLkQobC54byx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHguemUuY29kZTpmLkQobC5XdCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguQ2UuY29kZTpmLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtmLkQobC5CdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LmtkLmNvZGU6Zi5EKGwuR3UsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmhkLmNvZGU6Zi5EKGwuJHEsCnRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksZi50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChmLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7Zi50cmFjayhjLCIiLCEwKTt0aGlzLnhiKGEpO3RoaXMuQWEoKX0seGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLnlhLmxlbmd0aDspdHJ5e3ZhciBjPWEueWEucG9wKCk7dGhpcy5JZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZSl7fX0sUHM6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJgooYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWI7Yj10aGlzLmouQztiLnp2PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5JbSYmdGhpcy5wbGF5ZXIuSGMoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkhjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuQ20oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLnNnKGIpPyh0aGlzLkVtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLAp0aGlzLmNhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmNhLmFwcGVuZENoaWxkKGIpKTp0aGlzLnMuTW4oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLk5zKCkpOnRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5zLm9yaWdpbi4kZSh4LmhkKX0sTnM6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2E9YS5yZXBsYWNlKC8mYW1wOy9nLCImIik7YT1hLnJlcGxhY2UoLyZsdDsvZywiPCIpO2E9YS5yZXBsYWNlKC8mZ3Q7L2csIj4iKTtyZXR1cm4gYT1hLnJlcGxhY2UoLyZxdW90Oy9nLCciJyl9Zi5TZSgpO3RoaXMucyYmdGhpcy5zLm9yaWdpbiYmdGhpcy5zLm9yaWdpbi50ZSYmCmYuRm0odGhpcy5zLm9yaWdpbi50ZSk7Zi4kYSgic2V0VXBWcGFpZCIpO3ZhciBiPXRoaXMuai5DO3RoaXMuai5DPUIucG9wKCk7Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmouQyxiKTt0aGlzLmouVmYoKTt0aGlzLmouY2MoKTtmb3IoYj10aGlzLmouRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5qLmNjKCk7dGhpcy5YPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7CnRoaXMuai5HLmFwcGVuZENoaWxkKHRoaXMuWCk7dGhpcy5YLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBiPXRoaXMucy5xcCgpLGM9YSh0aGlzLnMuUC5PcmlnaW5hbEFkUGFyYW1ldGVycyksZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmouRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLmhlaWdodCl9fX07Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLApnKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2I9Zi55bigiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuVCk7dGhpcy5YLnNyYz1iO2YucmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJnRoaXMubnUoKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJnRoaXMub3UoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJ1KCksIkFkVmlkZW9Db21wbGV0ZSI9PQphLmRhdGEubmFtZSYmdGhpcy5xdSgpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5wdSgpKX0uYmluZCh0aGlzKSk7Zi5yZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpKTtmLnJkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSl9LG91OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iil9LG51OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2YuJGEoImltcHJlc3Npb24iKX0sSGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2YuJGEoInN0YXJ0Iil9LEdnOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2YuJGEoImZpcnN0UXVhcnRpbGUiKX0scnU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7Zi4kYSgidGhpcmRRdWFydGlsZSIpfSxxdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNvbXBsZXRlIik7CmYuJGEoImNvbXBsZXRlIil9LHB1OmZ1bmN0aW9uKCl7Zi4kYSgiYWRzdG9wcGVkIik7dGhpcy5BYSgpfSxDbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBlPWIsZj10aGlzLlQ7Zi5vYSYmZi5pc0VuYWJsZWQmJiFmLlpiKCk/KGU9Zi5LYShlKSxiPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTpiPWU7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmV1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxFbTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMucmUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5wZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmZkLmJpbmQodGhpcykpfSxYYzpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LEZnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW8uY29udHJvbHM9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFlKGEpfS5iaW5kKHRoaXMpLHRoaXMuam4pfSxxZTpmdW5jdGlvbihhKXt0cnl7aWYoIWYuWGEoKSYmCnRoaXMuVC5BZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQWJ8fCh0aGlzLkFiPSEwLHRoaXMuWGModGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMucmN8fCF0aGlzLnNnKHRoaXMudmlkZW8pfHx0aGlzLkFifHwodGhpcy5yYz0hMCx0aGlzLmR1KCksdGhpcy52aWRlby5jb250cm9scz0hMSx0aGlzLmouY2MoKSx0aGlzLkNnKCksdGhpcy5EZygpLHRoaXMuTWUoKSx0aGlzLmouVmYoKSx0aGlzLnZpZGVvLnBsYXkmJnRoaXMuaGUoKSl9LGhlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZi5FYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5LYz1bXTtmb3IodmFyIGI9CnRoaXMuai5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLktjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5vZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTsKdmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2YudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtmLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMub2QoKX1lbHNlIHRoaXMub2QoKX0sb2Q6ZnVuY3Rpb24oKXtpZih0aGlzLktjKWZvcih2YXIgYT0wO2E8dGhpcy5LYy5sZW5ndGg7YSsrKXRoaXMuS2NbYV0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChhPXRoaXMudmlkZW8ucGxheSgpKSYmYVsiY2F0Y2giXSlhWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWEoKSxmLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsIiIsITApKX0uYmluZCh0aGlzKSk7WT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQmIuYmluZCh0aGlzKSkpOkg9ZnVuY3Rpb24oKXt0aGlzLm5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5oZSgpKX0uYmluZCh0aGlzKTt0aGlzLm5mKCkuaGcodGhpcyl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtmLkQobC5wbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMucy52Yj8odGhpcy5yYz0hMSx0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuYWQ9ITEsdGhpcy5qLnlnKCksdGhpcy5zLm9yaWdpbi5RZCgpKTp0aGlzLkFhKCl9LGV1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5mZChhKSl9LGZkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkVkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuT2UoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5PZSgpKTt0aGlzLnMub3JpZ2luLiRlKHguaGQpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMud3QpdGhpcy5BYSgpO2Vsc2V7dGhpcy5ZYj0hMDt0aGlzLmoudS5qYiYmIXRoaXMubGcmJnRoaXMuai51LmpiKCkmJmYuRChsLnljLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTsKdGhpcy5CdChhKTt2YXIgYj0iIjtpZih0aGlzLnMuZ2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMua2cpO2MmJihiPXRoaXMucy5nZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5hZHx8KHRoaXMuYWQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7Zi5EKGwudm0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTt0aGlzLnMudmI/KHRoaXMucmM9ITEsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmFkPSExLHRoaXMuai55ZygpLHRoaXMucy5vcmlnaW4uUWQoKSk6dGhpcy5BYSgpfS5iaW5kKHRoaXMpKSkpLApjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMubmM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwKImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5pcCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmouY2MoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuRWcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuQ2coKTt0aGlzLkRnKCk7dGhpcy56ZD1zZXRJbnRlcnZhbCh0aGlzLkRuLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0saXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZT1iPXRoaXMucy5NW2NdLGY7Zj1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmCmguaXNFbmFibGVkJiYhaC5aYigpJiYoZj1oLkthKGYpLGY9Zi5wcm90b2NvbCsiOi8vIitmLmhvc3QpO2UudXJsPWY7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sRG46ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLnpkKSx0aGlzLnBlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMucmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuemQpLHRoaXMuZmQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSx2ZzpmdW5jdGlvbigpe3RoaXMuVWZ8fCh0aGlzLlVmPSEwLHRoaXMuRWN8fApmLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sQnQ6ZnVuY3Rpb24oYSl7YT09dGhpcy53Z3x8dGhpcy5BYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy52ZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZmLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5BYnx8Zi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGYuWGEoKSYmZi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLApmLkQobC5ybSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpLGYuRChsLndtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy5SYiYmZi50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5FYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGYuRChsLnFtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLkQobC50bSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsCiJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGYuRChsLnltLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGYuRChsLnptLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy53Zz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5BYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnBwKHRoaXMucy55YSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBlPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmJkLmltcHJlc3Npb25zJiZmLmpxKGUudXJsLHRoaXMuYmQuaW1wcmVzc2lvbnMpP3RoaXMuSWQoZS51cmwsZS50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpOwpmLkQobC5zbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkse2FkSWQ6dGhpcy5iZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSWQoZS51cmwsZS50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMucy55YT10aGlzLlRuKHRoaXMucy55YSxhKSl9fSxJZDpmdW5jdGlvbihhLGIsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuVGEoYSksYyYmYS5CbShjKSxlfHwoZT10aGlzLlplKSx0aGlzLlQuRmEoYSxlLHRoaXMuWmUsITEsITApKX0scHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxUbjpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxkdTpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5FZy5iaW5kKHRoaXMpfSwKRWc6ZnVuY3Rpb24oKXtmLkQobC5Mbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5FYyYmZi5YYSgpJiZmLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZi5YbygpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMudmN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnZjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsCmEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Sbjt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuVGM7Yi5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnl0LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMueHQuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLlpjLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLnRvcD0iLTUwcHgiLGUuc3R5bGUucmlnaHQ9IjBweCIsZS5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtlLmlkPXRoaXMua2c7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2UuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7ZS5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMuZ2UmJmEuYXBwZW5kQ2hpbGQoZSk7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LldhJiZ0aGlzLmoudS5XYSgpJiZ0aGlzLlZxKCk7dGhpcy5XYigpfX0sV2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxaYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSx5dDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVGMpO3RoaXMuai5DLnBhdXNlZD8KKHRoaXMuai5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSk6KHRoaXMuai5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLkQobC5IZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sVGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlRjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5EKGwuSGUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHNzOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLAphLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHh0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWQ/KHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGYudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LFZxOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLAp0aGlzLnRyYWNrKCJtdXRlIiwhMCksZi50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxCYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYik7dGhpcy5BY3x8dGhpcy5uY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuaGUoKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5BYz0hMDt0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1mLkVhJiZ0aGlzLm5jfHwicG9zdHJvbGwiPT1mLkVhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShmLkVhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiYKYSl7Zm9yKHZhciBiPXRoaXMuai5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmouY2MoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy54ZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7CmYudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7Zi50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy54ZCgpfWVsc2UgdGhpcy54ZCgpfSx4ZDpmdW5jdGlvbigpe3RoaXMubGc9ITA7dGhpcy5qLnNmKCk7dGhpcy5qLnRzKCk7dGhpcy5ZYj0hMTtmLkQobC5Rbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMubmYoKS5xcygpfSxuZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxFZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYKKGE9ITApfXJldHVybiBhfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihmLkVmKHRoaXMudmlkZW8sYSk/dGhpcy5zcygpOnRoaXMuVGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKX0uYmluZCh0aGlzKSwxMDApKX0sUzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy52YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy52Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLlFpfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVvPXRoaXMuYVs2XTt0aGlzLmtyPXRoaXMuYVs5XTt0aGlzLmFqPQp0aGlzLmFbOF07dGhpcy5hcz10aGlzLmFbN107dGhpcy5BbD10aGlzLmFbN107dGhpcy5Kaj10aGlzLmFbN107dGhpcy5QcD10aGlzLmFbNF07dGhpcy5paj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLndzPWI7Yi5wcm90b3R5cGU9e2NvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3I6dGhpcy4kaShhKX0sJGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFqOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hczp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQWw6dGhpcy5JaihhKX0sSWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkpqOnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5QcDp0aGlzLmhqKGEpfSxoajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaWo6dGhpcy5mKGEpfSwKZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIga2I9Yy53c3x8a2IsWWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuY28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5KYT1udWxsO3RoaXMuYmE9W107dGhpcy5hYT1udWxsO3RoaXMuTWI9ITE7dGhpcy50ZT0iIjt0aGlzLnNlPSExO2QmJmQuZW1wdHk/dGhpcy5KcSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLkhsPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLldlKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMPwpuZXcgeih0aGlzLnVybCk6bS5UYShtLlpzKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO3RoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmKGIuZGF0YS5ob21hZF9jb21wYXRpYmxlX3ZwYWlkPSJ0cnVlIik7bS5GYShiLHRoaXMuSXEuYmluZCh0aGlzKSx0aGlzLkVxLmJpbmQodGhpcykpfSxmZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuRWEpdHJ5e3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChlKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLkVhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5FYSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PQpnLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZ1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1lLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LElxOmZ1bmN0aW9uKGEpe3RoaXMuanMoYSk7dHJ5e3RoaXMuSmE9YS5yZXNwb25zZVhNTCx0aGlzLkphfHwodGhpcy5KYT0KKG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sSnE6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sRXE6ZnVuY3Rpb24oKXt0aGlzLmZhKHRoaXMuQmEoeC56ZSx7ZGVwdGg6YX0pKX0sUmM6ZnVuY3Rpb24oKXt0aGlzLmFhPQp0aGlzLmJhLnNoaWZ0KCk7dGhpcy5wcSgpP3RoaXMucHQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5xZigpLGcpKTp0aGlzLmZhKHRoaXMuQmEoeC5DZSkpOihhPTAsdGhpcy5TdCgpJiZ0aGlzLlZkKHRoaXMuU24oKSkpfSxRZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5SYygpKTp0aGlzLnBhcmVudC5RZCgpfSxTdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm10KCk/dGhpcy5sdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5CYSh4LnZlKSk6dGhpcy5mYSh0aGlzLkJhKHguTGgpKSwhMSk6KHRoaXMuZmEodGhpcy5CYSh4LmdjLEMuQmUpKSwhMSl9LFZkOmZ1bmN0aW9uKGEpe2EueWE9YS55YS5jb25jYXQodGhpcy5NZCgpKTthLnZiPWEudmI/YS52Yjp0aGlzLk1iO3RoaXMucGFyZW50LlZkKGEpfSxTbjpmdW5jdGlvbigpe3ZhciBhPW5ldyBsYjthLmR1cmF0aW9uPXRoaXMuVWIoKTthLk09dGhpcy5sZigpOwphLnZjPXRoaXMuWW8oKTthLm9yaWdpbj10aGlzO2EuUD10aGlzLlZvKCk7YS5nZT10aGlzLm5wKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLmFhJiYoYi55YT1iLmVycm9yLmNvZGUhPXgudmUuY29kZT9iLnlhLmNvbmNhdCh0aGlzLiRvKCkpOmIueWEuY29uY2F0KHRoaXMuZ3AoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQueGImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC54YiYmdGhpcy5wYXJlbnQueGIoYiksYT0wLHRoaXMuUmMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5mYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx4YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC54YihhKX0sJGU6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQmEoYSxiKSl9LEJhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG1iKGEsYik7Yy5vcmlnaW49dGhpczsKcmV0dXJuIGN9LHB0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sbXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxmKCkubGVuZ3RofSxsdDpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0scmc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sanM6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRlPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy5zZT1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxwcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMucWYoKS5sZW5ndGh9LHFmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuanAodGhpcy5hYSwiVkFTVEFkVGFnVVJJIil9LApNZDpmdW5jdGlvbigpe2Zvcih2YXIgYT1bIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZShnKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnliKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sZ3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sJG86ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFlvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWIodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksc2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLGV2OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnliKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnNjKS1NYXRoLmFicyg3MDAtYi5zYyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksYj1nLmNvbmNhdChkKX1jYXRjaChmKXt9cmV0dXJuIGJ9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtkPWI9dGhpcy5yZihhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1nLnB1c2goYyk7Zi5wdXNoKGQpfTE8YS5sZW5ndGg/KGI9ZyxoPWQpOihiPWMsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sVWI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy55Yih0aGlzLmFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sbnA6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGUpdHJ5e2M9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZz1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5WcyhnLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGQpe2I9ITF9cmV0dXJuIGJ9LGpwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy55YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHliOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmYoYSk6IiJ9LApyZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnJwKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5IbHx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbT10aGlzLmFbMTBdO3RoaXMudm49dGhpcy5hWzldO3RoaXMuZWo9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMl19Yy5RZz1iO2IucHJvdG90eXBlPXtjbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZG06dGhpcy51bihhKX0sdW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuZGooYSl9LGRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5lajp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIG5iPWMuUWd8fG5iLFpjPW5ldyBuYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1aYy5jbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLnlhPVtdO3RoaXMuTT1bXTt0aGlzLnZjPSIiO3RoaXMuUD10aGlzLnZiPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Naz1iO2IucHJvdG90eXBlPXtNbjpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxxcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIGxiPWMuTWt8fGxiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVs2XTt0aGlzLnVwPXRoaXMuYVs4XTt0aGlzLmdoPXRoaXMuYVs1XTt0aGlzLmdqPXRoaXMuYVs0XTt0aGlzLmloPXRoaXMuYVs0XTt0aGlzLnlqPXRoaXMuYVszXTt0aGlzLnRpPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs2XTt0aGlzLkdsPQp0aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLm1pPWI7Yi5wcm90b3R5cGU9e2ZuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nbjp0aGlzLnRwKGEpfSx0cDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudXA6dGhpcy5maChhKX0sZmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmdoOnRoaXMuZmooYSl9LGZqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5najp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWg6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnlqOnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50aTp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVHA6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTsKdmFyIG9iPWMubWl8fG9iLCRjPW5ldyBvYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PSRjLmZuKDQpO3ZhciB4PXtrZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixrYToiWE1MX1BBUlNFX0VSUk9SIn0sTGg6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLGthOiJEVVJBVElPTl9FUlJPUiJ9LGdjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixrYToiRU1QVFlfVkFTVCJ9LENlOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsCm1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixrYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0semU6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsa2E6IkxPQURfRVJST1IifSxoZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLAptZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sVXU6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsa2E6Ik1FRElBRklMRV9FUlJPUiJ9LHZlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLGthOiJEVU1NWV9BRCJ9fSxDPXtBZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLGthOiJOT19BRFMifSxCZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsa2E6Ik5PX01FRElBRklMRVMifSxXdTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIiwKa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5WbT10aGlzLmFbM107dGhpcy5RdT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs1XX1jLlpnPWI7Yi5wcm90b3R5cGU9e1VtOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5WbTp0aGlzLlB1KGEpfSxQdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy5aZ3x8cGIsYWQ9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9CmFkLlVtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuQ2M9Yjt0aGlzLnlhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy53aT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1iPWMud2l8fG1iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldrPXRoaXMuYVs5XTt0aGlzLmc9dGhpcy5hWzhdfWMuJGs9YjtiLnByb3RvdHlwZT17Vms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLldrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy4ka3x8cWIsYmQ9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YmQuVmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSwKYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuUWE9YS5nZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9Zi5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuUmE9e307dGhpcy5JZj0hMTt0aGlzLnZmPVtdfWMuUGg9YjtiLnByb3RvdHlwZT17bHA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGY9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2Y9e3g6ZSx5OmJ9O2YucG9zaXRpb249YztyZXR1cm4gZn0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5scChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZj10aGlzLmhxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2YmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7aD17eDpiLHk6Y307ZSYmKGgucG9zaXRpb249ZSk7cmV0dXJuIGh9LCRzOmZ1bmN0aW9uKCl7dGhpcy5JZj0hMH0sCnlnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxWZjpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpO2YuRChsLnljLHRoaXMudS5CKCkpfSx0czpmdW5jdGlvbigpe3RoaXMuSWZ8fCh0aGlzLnUucGxheSgpLGYuRChsLnpjLHRoaXMudS5CKCkpKX0sY2M6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMudS5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLlFhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5RYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlFhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuUWEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5RYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5RYSk7dGhpcy51LkRiJiZ0aGlzLnUuRGIoKT90aGlzLnUuZ2YoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVmLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMudS5leGl0RnVsbHNjcmVlbigpfSxocTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFpvOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sdWY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5abyh0aGlzLlFhKTtpZihiLnghPXRoaXMuUmEueHx8Yi55IT10aGlzLlJhLnl8fGIucG9zaXRpb24hPXRoaXMuUmEucG9zaXRpb258fGIud2lkdGghPXRoaXMuUmEud2lkdGh8fGIuaGVpZ2h0IT10aGlzLlJhLmhlaWdodHx8YSl7aWYoMDx0aGlzLlJhLndpZHRoJiYwPHRoaXMuUmEuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5zZigpO3JldHVybn10aGlzLlJhPWI7dGhpcy51LkRiKCk/KHRoaXMuRy5zdHlsZS5sZWZ0PQoiMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5DLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMudmYubGVuZ3RoO2ErKyl0aGlzLnZmW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWYuYmluZCh0aGlzKSwxMCl9LHNmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTsKZm9yKHZhciBOPWMuUGh8fE4sQj1bXSxyYj0wOzEwMD5yYjtyYisrKXt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO0wuc3R5bGUuZGlzcGxheT0iYmxvY2siO0wuaWQ9Zi5wYSgxMCk7TC5jb250cm9scz0hMDtCLnB1c2goTCl9dmFyIEg9ITEsWT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNuPXRoaXMuYVsxMF07dGhpcy51az10aGlzLmFbNF07dGhpcy5PbD10aGlzLmFbNV07dGhpcy5FaD10aGlzLmFbNl07dGhpcy5vaz10aGlzLmFbNV07dGhpcy5JaD10aGlzLmFbOV07dGhpcy5pcj10aGlzLmFbN107CnRoaXMuaGw9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbN119Yy5NdD1iO2IucHJvdG90eXBlPXtibjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY246dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnVrOnRoaXMuTmwoYSl9LE5sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT2w6dGhpcy5EaChhKX0sRGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkVoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vazp0aGlzLkhoKGEpfSxIaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSWg6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlyOnRoaXMuZ2woYSl9LGdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNiPWMuTXR8fHNiLGNkPW5ldyBzYigxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5ibig0KTsoZnVuY3Rpb24oYyl7Yy53az1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5PKGEpO3RoaXMuZmUoYik7dGhpcy5YZSgpfSxmZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sWGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkNhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5SKGEpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkNhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD0KYy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIHRiPWMud2t8fHRiOyhmdW5jdGlvbihjKXtjLnZrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj1aKCk7dGhpcy51Yj10aGlzLnVifHwhMTt0aGlzLkdlPXRoaXMuSmU9dGhpcy56Zj10aGlzLmlhPXRoaXMubWU9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5IbyhhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMubWU9ITA7dGhpcy56ZiYmdGhpcy5SZSgpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLlliJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLnpmPSEwO3RoaXMuUmUoKX0uYmluZCh0aGlzKSk7dGhpcy5OZSgpfSxSZTpmdW5jdGlvbigpe2lmKCF0aGlzLnViKXt0aGlzLnRjKCk7aWYoIXRoaXMubWUmJiF0aGlzLnRjKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5tZSYmdGhpcy5HZSYmIXRoaXMuSmUmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCl9fSx0YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sCm1mOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LE5lOmZ1bmN0aW9uKCl7aWYodGhpcy50YygpKXt2YXIgYj10aGlzLm1mKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuSmU9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5HZT1iLmF2fXRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5lKCl9LmJpbmQodGhpcyksMTAwKX0saHY6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IudXYoKTohMX0sVWI6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj8KYi5VYigpOi0xfSxocDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxIbzpmdW5jdGlvbihiLGEpe3RoaXMudWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy51Ynx8MzAyPT10aGlzLnViP3RoaXMuaWE9ITA6dGhpcy5sKCJhZGVycm9yIix0aGlzLnViKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfSx4YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5pYT8odGhpcy5tKCksdGhpcy5uYSgpKTpiLk5jKCk/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuaHAoYik/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHViPWMudmt8fHViOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sb3E6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWsua20uaW0/d2luZG93Lk9PLlFrLmttLmltLlp1KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9xKCl9LDEwMCl9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPTE1MDA7dmFyIGI9WigpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5EYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgdGIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IHViKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmIsd2I9bmV3IHZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpyPXRoaXMuYVsxXTt0aGlzLlNnPXRoaXMuYVszXTt0aGlzLkJvPXRoaXMuYVs2XTt0aGlzLkpwPXRoaXMuYVs2XTt0aGlzLktyPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzVdfWMueHM9YjtiLnByb3RvdHlwZT17eXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy56cjp0aGlzLlJnKGEpfSxSZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2c6dGhpcy5BbyhhKX0sQW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJvOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KcDp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuS3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZzphfX19KShjKTt2YXIgeGI9Yy54c3x8eGIsZGQ9bmV3IHhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQueXIoNCk7KGZ1bmN0aW9uKGMpe2Muc2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSwKRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sSzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgeWI9Yy5zbHx8eWI7KGZ1bmN0aW9uKGMpe2Mucmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5xZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5lcihhKX0uYmluZCh0aGlzKSk7CnkueXAoKX0sZXI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciB6Yj1jLnJsfHx6YjsoZnVuY3Rpb24oYyl7Yy50bD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuU2MmJihiPWYuVW4oYix0aGlzLlNjKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxkPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGQpdHJ5e3RmbXN1aXRlKCIjIitkKS50Zm12aWRlbygicmVzdW1lIik7dGhpcy5TY3x8KHRoaXMuU2M9W10pO3RoaXMuU2MucHVzaChiW2FdKTt2YXIgZT1uZXcgeWIoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgemIoZSx0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319fXRoaXMuSCgpfSxxZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5afHwodGhpcy5aPXt9KTt0aGlzLlpbYl18fCh0aGlzLlpbYl09e30pO3RoaXMuWltiXVthXXx8KHRoaXMuWltiXVthXT1bXSk7CnRoaXMuWltiXVthXS5wdXNoKGMpfSxxdDpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLlp8fHRoaXMuWiYmIXRoaXMuWlthXSl0aGlzLiRifHwodGhpcy4kYj1bXSksdGhpcy4kYi5wdXNoKGIpLHRoaXMucnMoKSYmKHRoaXMuY2coKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5aW2FdW2NdJiYwPHRoaXMuWlthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLlpbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLlpbYV1bY11bZF0oYil9fSx5cDpmdW5jdGlvbigpe2lmKHRoaXMuJGIpZm9yKHZhciBiPTA7Yjx0aGlzLiRiLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuJGJbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLlpbY11bZF0mJgowPHRoaXMuWltjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLlpbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLlpbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF0KGIpfX0pfSkoYyk7dmFyIEFiPWMudGx8fEFiLHk9bmV3IEFiKHEpO1goKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NaT10aGlzLmFbNV07dGhpcy56cT10aGlzLmFbM107dGhpcy5ncj10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMV07dGhpcy5zbz10aGlzLmFbMV07dGhpcy5jdT10aGlzLmFbN107dGhpcy5acD10aGlzLmFbNF07dGhpcy54cT10aGlzLmFbOF07dGhpcy5obz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX0KYy5tbj1iO2IucHJvdG90eXBlPXtMaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWk6dGhpcy55cShhKX0seXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpxOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudWo6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNvOnRoaXMuYnUoYSl9LGJ1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdTp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWnA6dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnhxOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5obzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIEJiPWMubW58fEJiLGVkPW5ldyBCYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC5MaSg0KTsoZnVuY3Rpb24oYyl7Yy56aD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LApqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuemh8fENiOyhmdW5jdGlvbihjKXtjLkFoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5Xcnx8KHRoaXMuV3I9CiEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkFofHxEYjsoZnVuY3Rpb24oYyl7Yy5CaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IENiKGQpO3RoaXMuSShmKXx8Cih0aGlzLkwoZiksKG5ldyBEYihmLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkgoKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkJofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2g9dGhpcy5hWzZdO3RoaXMuaG09dGhpcy5hWzEwXTt0aGlzLlptPXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzRdfWMuaG49YjtiLnByb3RvdHlwZT17Rmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdoOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5obTp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlptOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy5obnx8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQuRmgoNCk7KGZ1bmN0aW9uKGMpe2MuUWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LApnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sSzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBIYj1jLlFsfHxIYjsoZnVuY3Rpb24oYyl7Yy5QbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkxlfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLAoxMDApO3RoaXMuTm98fCh0aGlzLkFmKCksdGhpcy5Obz0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5MZT8odGhpcy5sKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLm8oKSk6KHRoaXMuTGU9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MDApKX0sV286ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5XbygpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMuaWE9ITAsdGhpcy5tKCksdGhpcy5uYSgpKToKKHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWYoKX0uYmluZCh0aGlzKSw1MCl9LHN2OmZ1bmN0aW9uKCl7cmV0dXJuITB9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJYj1jLlBsfHxJYjsoZnVuY3Rpb24oYyl7Yy5SbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IEhiKGIuaXRlbShhKSk7dGhpcy5JKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwKKHRoaXMuTChjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBKYj1jLlJsfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS209dGhpcy5hWzFdO3RoaXMuTW89dGhpcy5hWzNdO3RoaXMuWWg9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19Yy5ocz1iO2IucHJvdG90eXBlPXtKbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS206dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nbzp0aGlzLlhoKGEpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWWg6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBMYj1jLmhzfHxMYixnZD1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Z2QuSm0oNCk7KGZ1bmN0aW9uKGMpe2MuQWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5KJiYKKDAsdGhpcy5KKSghMCl9LmJpbmQodGhpcykpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuImthbHR1cmEifX0pfSkoYyk7dmFyIE1iPWMuQWp8fE1iOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGxvZzpmdW5jdGlvbigpe30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuY2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLnhtKCl9LmJpbmQodGhpcykpLHRoaXMuSmc9ITEsdGhpcy50dT0xRTMsdGhpcy5YZj17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLlhmLmRvbmV8fCh0aGlzLlhmLmRvbmU9ITAsdGhpcy5KZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWcoKX0uYmluZCh0aGlzKSx0aGlzLnR1KSl9LHhtOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkpnKTt0aGlzLm0oKX0sSWc6ZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLncoKSl9LGpmOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmCmJbY11bZF0uZ2V0RXJyb3JDb2RlKXt2YXIgZT1iW2NdW2RdO2JbY11bZF0uZ2V0RXJyb3JDb2RlKCk7YltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7YS5wdXNoKGUuZ2V0RXJyb3JDb2RlKCkpfXJldHVybiBhfSx2YTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuamYobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5qZih0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgTmI9Yy56anx8TmI7KGZ1bmN0aW9uKGMpe2MuQmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJgp3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGYuRGEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyl8fHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj1udWxsO3dpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxmLkRhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBNYihjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBOYihjLHRoaXMuQSkpLmIoKSkpfX10aGlzLkgoKX19KX0pKGMpOwp2YXIgT2I9Yy5Canx8T2IsUGI9bmV3IE9iKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpzPXRoaXMuYVszXTt0aGlzLkJxPXRoaXMuYVs2XTt0aGlzLnl1PXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzldfWMuUnQ9YjtiLnByb3RvdHlwZT17eXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpzOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CcTp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXU6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgUWI9Yy5SdHx8UWIsaGQ9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aGQueXMoNCk7CihmdW5jdGlvbihjKXtjLnBsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBSYj1jLnBsfHxSYjsoZnVuY3Rpb24oYyl7Yy5vbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpO3RoaXMuUGIoKX0sUGI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5HZCgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2QoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGIoKX0uYmluZCh0aGlzKSwxMCl9LEdkOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LApvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgU2I9Yy5vbHx8U2I7KGZ1bmN0aW9uKGMpe2MucWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBSYihkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgU2IoYiwKdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBUYj1jLnFsfHxUYixVYj1uZXcgVGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWWc9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzRdO3RoaXMubGw9dGhpcy5hWzVdO3RoaXMucnI9dGhpcy5hWzNdO3RoaXMubWs9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuV2g9YjtiLnByb3RvdHlwZT17WGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLllnOnRoaXMuTm0oYSl9LE5tOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PbTp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubGw6dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJyOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLldofHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5YZyg0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5XZD0hMX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuWnIoKX0uYmluZCh0aGlzKSw1MDApfSxacjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPApiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5KJiZ0aGlzLkooKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5XZCYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPwooYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXczpmdW5jdGlvbigpe3RoaXMuV2Q9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sSzpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLllrfHxXYjsoZnVuY3Rpb24oYyl7Yy5Yaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuT3E9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLktifHwodGhpcy5LYj0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiKTt0aGlzLm8oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSwKd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuT3E/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLldzKCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBYYj1jLlhrfHxYYjsoZnVuY3Rpb24oYyl7Yy5aaz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLAphPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkgoKX19KX0pKGMpO3ZhciBZYj1jLlprfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW89dGhpcy5hWzZdO3RoaXMuSms9dGhpcy5hWzRdO3RoaXMuam89dGhpcy5hWzJdO3RoaXMueWk9dGhpcy5hWzddO3RoaXMudnI9dGhpcy5hWzddO3RoaXMuYm09dGhpcy5hWzEwXTt0aGlzLlRoPXRoaXMuYVszXTt0aGlzLm1tPXRoaXMuYVs4XTt0aGlzLkJyPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVs1XX1jLmtvPWI7Yi5wcm90b3R5cGU9CntwbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucW86dGhpcy5JayhhKX0sSWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkprOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbzp0aGlzLnhpKGEpfSx4aTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueWk6dGhpcy51cihhKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZyOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ibTp0aGlzLlNoKGEpfSxTaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGg6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1tOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ccjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMua298fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1qZC5wbyg0KTsoZnVuY3Rpb24oYyl7Yy5Uaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTsKcmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLlRrfHxhYzsoZnVuY3Rpb24oYyl7Yy5Taz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5DYSgpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuTm4oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuSWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLkNxKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LE5uOmZ1bmN0aW9uKCl7dGhpcy5GZSgpfHx0aGlzLm8oITApfSxDcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWMoKTshYi5tYSYmYi5iYSYmYi5ZdSYmYi4kdSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjsKYTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sSWM6ZnVuY3Rpb24oKXtmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQ2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspaWYoYltjXS5pZD09YSlyZXR1cm4gYltjXTtyZXR1cm57fX0sR2Q6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbzpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iPwp0aGlzLkljKCkuYWRzTG9hZGVyP3RoaXMudyghMCk6dGhpcy53KCk6dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGJjPWMuU2t8fGJjOyhmdW5jdGlvbihjKXtjLlVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsucGxheWVyYXBpKWZvcih2YXIgYj1rLnBsYXllcmFwaSgpLGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IGFjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBiYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgY2M9Yy5Va3x8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52aD10aGlzLmFbOV07dGhpcy5hcT10aGlzLmFbOV07dGhpcy5raz10aGlzLmFbN107dGhpcy5lcT10aGlzLmFbOF07dGhpcy5PdT10aGlzLmFbOV07dGhpcy5UbD10aGlzLmFbM107dGhpcy5ibz10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVsxXX1jLlZsPWI7Yi5wcm90b3R5cGU9e3VoOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52aDp0aGlzLiRwKGEpfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXE6dGhpcy5qayhhKX0sams6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmtrOnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lcTp0aGlzLk51KGEpfSxOdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT3U6dGhpcy5TbChhKX0sU2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRsOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ibzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYz1jLlZsfHxlYyxrZD1uZXcgZWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC51aCg0KTsoZnVuY3Rpb24oYyl7Yy5Uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLk8oYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUihhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEs6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LENhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTsKcmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFQ9Yy5Uanx8VDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5YZD0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhkPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGQmJmIhPXRoaXMuWGR8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS53diksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLAp0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVT1jLlNqfHxVOyhmdW5jdGlvbihjKXtjLlVqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFQoYiksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFUoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9Cm5ldyBUKGIpLGIuamE/dGhpcy5jZygpOnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBVKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgRCxmYz1jLlVqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5uYi5sZW5ndGgpe3ZhciBhPW0ubmIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWYuS3MoeyJbTE9BRFNDUklQVF0iOmYucGEoMTApLCJbVVRJTFNdIjpmLnBhKDEwKSwiW0NBTExCQUNLXSI6Zi5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWYuTWYuYmluZChmKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSlrW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOylmLk1mKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sCm0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSG09dGhpcy5hWzFdO3RoaXMuVnI9dGhpcy5hWzddO3RoaXMuUmo9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbOF19Yy5Jcj1iO2IucHJvdG90eXBlPXtHbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSG06dGhpcy5VcihhKX0sVXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wcjp0aGlzLlFqKGEpfSxRajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUmo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYz1jLklyfHxoYyxsZD1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1sZC5HbSg0KTsKKGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLk8oYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5SKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5ZcT1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sQ3M6ZnVuY3Rpb24oYil7dGhpcy5uZD1ifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWXF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEs6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5KJiZ0aGlzLkooKSx0aGlzLm5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5uZCYmKG5ldyBHKHRoaXMsdGhpcy5uZCkpLmIoKSl9fSl9KShjKTt2YXIgTT1jLkRsfHwKTTsoZnVuY3Rpb24oYyl7Yy5DbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxWYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8KHRoaXMuaGI9MCksdGhpcy5oYisrLDE1PHRoaXMuaGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB0aGlzLk1zKCksITA7dGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5vKCk6dGhpcy5vKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMudmEoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5VKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlU9YSxiLmwoImFkZXJyb3IiLAphKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlV8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5WYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLApmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbzpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz8KdGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHPWMuQ2x8fEc7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMud2E9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBNKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJgp3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQ3ModGhpcy5BKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSCgpfX0pfSkoYyk7dmFyIGljPWMuRWx8fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tcj10aGlzLmFbOV07dGhpcy5UbT10aGlzLmFbMV07dGhpcy5tbz10aGlzLmFbMl07dGhpcy5naz10aGlzLmFbMl07dGhpcy5NbD10aGlzLmFbMV07dGhpcy5LdT10aGlzLmFbN107dGhpcy5xaz10aGlzLmFbMV07dGhpcy5RbT10aGlzLmFbMTBdO3RoaXMuTWc9dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNF19Yy5adD1iO2IucHJvdG90eXBlPXtscjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm1yOnRoaXMuU20oYSl9LApTbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG06dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nazp0aGlzLkxsKGEpfSxMbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWw6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkt1OnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xazp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFtOnRoaXMuTGcoYSl9LExnOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5NZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYz1jLlp0fHxrYyxtZD1uZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQubHIoNCk7KGZ1bmN0aW9uKGMpe2MuT2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuVWU9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuUihhKTp0aGlzLmRhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0UsCntpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLko/KDAsdGhpcy5KKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHt6bjpmdW5jdGlvbihhKXswPGEmJih0aGlzLlVlPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHt6bjpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sSzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIGxjPWMuT2p8fGxjOyhmdW5jdGlvbihjKXtjLk5qPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEF2OmZ1bmN0aW9uKCl7fSxsczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLnVlKG5ldyBmdW5jdGlvbigpe30pO2EuVnU9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHMoYSk7CndpbmRvdy5jdj1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5rc3x8KHRoaXMua3M9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5EZHx8KHRoaXMuRGQ9MSk7aWYoMjA8dGhpcy5EZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5vKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkhhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuRGQrKzsKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxIYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5iZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJgpiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmCihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMudyhiKX19KX0pKGMpO3ZhciBtYz1jLk5qfHxtYzsoZnVuY3Rpb24oYyl7Yy5Qaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IGxjKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5qYXx8dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgbWMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIG5jPWMuUGp8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EdT10aGlzLmFbOV07dGhpcy55bD10aGlzLmFbN107dGhpcy5lbj10aGlzLmFbOF07dGhpcy5kaT10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVsxXX1jLkFuPWI7Yi5wcm90b3R5cGU9e0N1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5EdTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6CnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lbjp0aGlzLmNpKGEpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLkFufHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5DdSg0KTsoZnVuY3Rpb24oYyl7Yy5Maj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpO2EmJnRoaXMuTyhhLnBhcmVudE5vZGUpfSwKSzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgVj1jLkxqfHxWOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLndmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy5GZigpfSxGZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLkhhKCksITA7dGhpcy53ZisrO2lmKDEwPHRoaXMud2YpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5GZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LApXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFc9Yy5Lanx8VzsoZnVuY3Rpb24oYyl7Yy5Naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgVih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFYod2luZG93LnBsYXllciksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgcWM9Yy5Nanx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1yPXRoaXMuYVsxMF07dGhpcy5ZdD10aGlzLmFbOF07dGhpcy5Ebz10aGlzLmFbMTBdO3RoaXMuUmg9dGhpcy5hWzldO3RoaXMuRmo9dGhpcy5hWzZdO3RoaXMueG49dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOF19Yy5SbT1iO2IucHJvdG90eXBlPXtMcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXI6dGhpcy5YdChhKX0sWHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ZdDp0aGlzLkNvKGEpfSxDbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRG86dGhpcy5RaChhKX0sUWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlJoOnRoaXMuRWooYSl9LEVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gajp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLlJtfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC5Mcig0KTsoZnVuY3Rpb24oYyl7Yy5BaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8KKHRoaXMuTyhiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlIoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sSzpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPWMuQWl8fHRjOyhmdW5jdGlvbihjKXtjLnppPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IiwKZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMubygpKX0sdGVzdDpmdW5jdGlvbigpe30sCm86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMueml8fHVjOyhmdW5jdGlvbihjKXtjLkJpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxmLkRhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdGMoZCksZC5qYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgdWMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5IKCl9fSl9KShjKTsKdmFyIHZjPWMuQml8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Iaj10aGlzLmFbMTBdO3RoaXMuUnA9dGhpcy5hWzddO3RoaXMucnE9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzldO3RoaXMuS2k9dGhpcy5hWzRdO3RoaXMuSnQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbOF19Yy5SdT1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGo6dGhpcy5RcChhKX0sUXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlJwOnRoaXMucXEoYSl9LHFxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ycTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZmw6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuSXQoYSl9LEl0OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnQ6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLlJ1fHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5Haig0KTsoZnVuY3Rpb24oYyl7Yy5IaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuTyhiKSx0aGlzLlIoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoiYmxvY2siKX0sSzpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5IaXx8eWM7KGZ1bmN0aW9uKGMpe2MuR2k9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuUGUoKX0sUGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBlKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciB6Yz1jLkdpfHx6YzsoZnVuY3Rpb24oYyl7Yy5JaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgeWMod2luZG93LiQoImRpdiNnYW1lIikpOwppZihiLmphKXt0aGlzLkgoKTtyZXR1cm59aWYoIXRoaXMuSShiKSl7dGhpcy5MKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5IKCk7cmV0dXJufX10aGlzLkgoKX19KX0pKGMpO3ZhciBBYz1jLklpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHQ9dGhpcy5hWzZdO3RoaXMuZm09dGhpcy5hWzRdO3RoaXMud289dGhpcy5hWzRdO3RoaXMucGo9dGhpcy5hWzldO3RoaXMuRms9dGhpcy5hWzFdO3RoaXMuY2w9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzZdO3RoaXMuWG49dGhpcy5hWzNdO3RoaXMuYmk9dGhpcy5hWzRdO3RoaXMuZz10aGlzLmFbNV19Yy5YaT1iO2IucHJvdG90eXBlPXtHdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHQ6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZtOnRoaXMudm8oYSl9LAp2bzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMud286dGhpcy5vaihhKX0sb2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBqOnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gazp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY2w6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZoOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ybjp0aGlzLmFpKGEpfSxhaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5YaXx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuR3QoNCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkhmPXRoaXMuS2Y9dGhpcy5KZj0hMTt0aGlzLlVjPVtdO3RoaXMuJGQ9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBIYT9udWxsOkhhLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2E/bnVsbDpDYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJhP251bGw6UmEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBXYT9udWxsOldhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHNhP251bGw6c2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjPwpudWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB3Yj9udWxsOndiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj8KbnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBNYT9udWxsOk1hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIG5hP251bGw6bmF9fWMuT2s9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5rcChhKTpbXSxiO3RoaXMuS2Y9ITA7aWYoYS5sZW5ndGgpe3RoaXMuSmY9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuZGcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLiRkKXtpZih0aGlzLkhmKWJyZWFrO2I9dGhpcy4kZFtjXTt0aGlzLm9lKGIpJiYodGhpcy5VYy5wdXNoKGIpLHRoaXMuZGcoYikpfX0sb2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxrcDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz0KYVtlXSxjPXRoaXMuJGRbY10sdGhpcy5vZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxkZzpmdW5jdGlvbihhKXt0aGlzLm9lKGEpJiZhLmIoKX0sWXM6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLkpmKWZvcih0aGlzLkhmPSEwLGE9MDthPHRoaXMuVWMubGVuZ3RoO2ErKyl0aGlzLlVjW2FdLnFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVWNbYV0ucWIpfX19KShjKTt2YXIgRGM9Yy5Pa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnI9dGhpcy5hWzZdO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLlpuPXRoaXMuYVszXTt0aGlzLlhxPXRoaXMuYVsxXTt0aGlzLkRrPXRoaXMuYVs4XTt0aGlzLm9vPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVsxMF19Yy50aD1iO2IucHJvdG90eXBlPXtRcjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlJyOnRoaXMuTXAoYSl9LE1wOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5OcDp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm46dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhxOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLm5vKGEpfSxubzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMub286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBFYz1jLnRofHxFYyxyZD1uZXcgRWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1yZC5Rcig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9CmMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGYuVGIobC5UdCksZi50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGYuVGIobC5hciksZi50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgc2Q9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSwKYmE9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEY9bmV3IGdhLGs9ITE7Ri5NYygpO0YuQmYoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLk1jKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5CZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuTWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtmLmZpcmVFdmVudCh3aW5kb3csRi5icSgpLHtpZDp0ZH0pfSw1MDApO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXU9dGhpcy5hWzJdO3RoaXMudnE9dGhpcy5hWzJdO3RoaXMub2k9dGhpcy5hWzVdO3RoaXMuVXE9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbMl19Yy51dD1iO2IucHJvdG90eXBlPXskdDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmF1OnRoaXMudXEoYSl9LHVxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52cTp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMub2k6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VcTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMudXR8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLiR0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5aZj10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuUGM9MDt0aGlzLkxhPSIiO3RoaXMuVmM9W107dGhpcy5XYz0wO3RoaXMuJGY9ITE7dGhpcy5ZZD1bXX1jLk5nPWI7Yi5wcm90b3R5cGU9e0pzOmZ1bmN0aW9uKGEpe3RoaXMuWmY9CmF9LFljOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5MYT10aGlzLnBsYXllci5LKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXM6ZnVuY3Rpb24oYSl7dGhpcy5VYT1hfSxEczpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLkxhXSYmdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSxiYzpmdW5jdGlvbihhLGIpe2YuaWIoIndlbHQuZGUiKSYmZi5ZYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuVWEpO3ZhciBjPSExLGU9ITE7aWYodGhpcy5mcSgpKXRoaXMuVWEuYyh0aGlzLlVhLkpjLHRoaXMuVWEuemEsdGhpcy5VYS5aZCxmdW5jdGlvbigpe3RoaXMuYmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkJjKTtlbHNlIGlmKHRoaXMuQXAoKSl0aGlzLnZzKGZ1bmN0aW9uKCl7dGhpcy5iYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5EKGwueWMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuJHMoKTtrLmV4aXRGdWxsc2NyZWVuKCk7UT1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLmdnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLk5xKGEpOwoiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSGQmJihjPXRoaXMucGxheWVyLkhkKCkpO2guYWRTdGFydFRpbWVvdXQmJihlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtrLkpkKGEsYyxlKTt0aGlzLnBsYXllci5oZyhrKX19LGZxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuUGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5QYy5nZXRUaW1lKCksdGhpcy5QYz1hLDNFNTxiPyEwOiExO3RoaXMuUGM9YTtyZXR1cm4hMX0sUnM6ZnVuY3Rpb24oKXtmLmVlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuYWYoYSkpP3RoaXMuYmMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5EKGwuemMsdGhpcy5wbGF5ZXIuQigpKSl9LApRczpmdW5jdGlvbihhKXtmLmVlKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlpmKXt0aGlzLkpzKCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLmFmKGMpKT90aGlzLmJjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxmLkQobC56Yyx0aGlzLnBsYXllci5CKCkpKX19LGFmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxuczpmdW5jdGlvbigpe3RoaXMucGxheWVyLk9zKHRoaXMuUXMuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sJGM6ZnVuY3Rpb24oYSl7Zi5lZSgibWlkcm9sbCIpO2lmKCF0aGlzLk9mKXt0aGlzLk9mPSEwO3ZhciBiPQp0aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5iYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZj0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGYuRChsLnpjLHRoaXMucGxheWVyLkIoKSkpfX0sbXM6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Jcyh0aGlzLiRjLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5kKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLlJzKCk7dGhpcy5wbGF5ZXIuTmQmJnRoaXMubXMoKTt0aGlzLm5zKCl9LG9zOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuVmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihmKXt0aGlzLkl1KGEsCmIsYyxnLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuV2M9dGhpcy5WYy5sZW5ndGh9LEFwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLldjJiYoYT0hMCk7cmV0dXJuIGF9LHZzOmZ1bmN0aW9uKGEpe3RoaXMuJGY9YTtmb3IoYT0wO2E8dGhpcy5WYy5sZW5ndGg7YSsrKXRoaXMuVmNbYV1bImZ1bmN0aW9uIl0odGhpcy5kcy5iaW5kKHRoaXMpKX0sZHM6ZnVuY3Rpb24oYSl7dGhpcy5XYy0tO2EmJnRoaXMuWWQucHVzaChhKTswPj10aGlzLldjJiZ0aGlzLiRmKCl9LE5xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLllkLmxlbmd0aDtjKyspYj10aGlzLllkW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBkYT1jLk5nfHxkYSxRPSExLGphPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ybj10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbNV07dGhpcy5hbj10aGlzLmFbMl07dGhpcy5vbT10aGlzLmFbNl07dGhpcy5Gcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLnRuPWI7Yi5wcm90b3R5cGU9e3FuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucm46dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVzOnRoaXMuJG0oYSl9LCRtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hbjp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub206dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy50bnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLnFuKDQpfSkuY2FsbChQaWV4dXVwaGVoYXBob2hWLFBpZXh1dXBoZWhhcGhvaFYpOwo=
Protocol
HTTP/1.1
Server
52.222.150.128 Seattle, United States, ASN16509 (AMAZON-02 - Amazon.com, Inc., US),
Reverse DNS
server-52-222-150-128.fra53.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
25d819bf5e7ae2c998690015c6e8958ddceb44dac2497783eb70680c777a7406

Request headers

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

Response headers

Date
Sat, 04 Aug 2018 14:32:18 GMT
Via
1.1 e8929a64b6920fabf88f772b8cd0125c.cloudfront.net (CloudFront)
Vary
Origin,Access-Control-Request-Headers,Access-Control-Request-Method
X-Cache
Hit from cloudfront
Connection
keep-alive
Content-Length
229
Last-Modified
Sat, 04 Aug 2018 14:32:00 GMT
Server
AmazonS3
ETag
"ea0192f51aeefc151385c82c9d9a0348"
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
wvIFqLrJDqjwymu471WAhYy1dmBnFz7nhfb3uodd9QfDMwYjZkQz9Q==
Expires
0
/
ssl.1.damoh.golem.de/9b397e07d1be0e16e3d2ac8f9dd2f903c2921cdd/
229 B
1 KB
XHR
General
Full URL
https://ssl.1.damoh.golem.de/9b397e07d1be0e16e3d2ac8f9dd2f903c2921cdd/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFBpZXh1dXBoZWhhcGhvaFY9UGlleHV1cGhlaGFwaG9oVnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBYKCl7eS5TZHx8KHkuU2Q9MCk7eS5TZCsrO3dpbmRvdy52aWRlb3BrZ0ludGVyZmFjZSE9eS52aWRlb3BrZ0ludGVyZmFjZSYmKHdpbmRvdy52aWRlb3BrZ0ludGVyZmFjZT15LnZpZGVvcGtnSW50ZXJmYWNlKTsxMD55LlNkJiZ3aW5kb3cuc2V0VGltZW91dChYLDUwMCl9ZnVuY3Rpb24gQSgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLEEpO1k9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIFooKXt2YXIgYz13aW5kb3cuT087Y3x8KGM9d2luZG93LmpPT1BsYXllcl8wKTtyZXR1cm4gY31mdW5jdGlvbiBhYSgpe2lmKGspe2sucGF1c2VCdXR0b258fChrLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwprLnBsYXlCdXR0b258fChrLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLm11dGVCdXR0b258fChrLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnVubXV0ZUJ1dHRvbnx8KGsudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmsuc2tpcGFibGVCdXR0b258fChrLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjY7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpOwprLnNraXBCdXR0b258fChrLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSIpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYoay5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtrLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2E9YS51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2YuWWEoYSxiLFtdLGMsYyxtKX0pfW0uYyhrLmdsb2JhbENvbmZpZyxrLmNsaWVudENvbmZpZyxrLnByZWNoZWNrZWQsay5vblJlYWR5LGsub25GYWlsdXJlLGspO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBiPWsuc3RhcnRQbGF5ZXI7YiYmImZ1bmN0aW9uIj09PXR5cGVvZiBiJiZiKCl9ZWxzZSBiYShhYSw1MCl9ZnVuY3Rpb24gY2EoYyxiKXtifHwoYj0icHJlIik7aWYoayYmbSl7Yy5wYXVzZSgpO3ZhciBhPW5ldyBOKGMpLGE9bmV3IE8oYSxtKSxnPWsuYWRUYWc7InByZSI9PWImJmsucHJlcm9sbEFkVGFnJiYoZz1rLnByZXJvbGxBZFRhZyk7InBvc3QiPT1iJiZrLnBvc3Ryb2xsQWRUYWcmJihnPWsucG9zdHJvbGxBZFRhZyk7CmcmJihhLmdnKGspLGEuSmQoZykpfWVsc2UgYmEoZnVuY3Rpb24oKXtjYShjKX0uYmluZCh0aGlzKSw1MCl9ZnVuY3Rpb24gcShjLGIpeyhrLmFkVGFnfHxrLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLkQobC55YyxjLkIoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmYudHJhY2soImFjdGl2YXRlZEF0IixhKX1rJiZtPyhiP20ub2E9ITA6Zi50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCksYT1uZXcgZGEsYS5ZYyhjKSxhLkVzKG0pLGEuRHMoayksYS5vcygpLGEuYigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWG09dGhpcy5hWzFdO3RoaXMuZWs9dGhpcy5hWzddO3RoaXMuTXE9dGhpcy5hWzZdO3RoaXMuc2s9dGhpcy5hWzVdOwp0aGlzLmc9dGhpcy5hWzZdfWMudXU9YjtiLnByb3RvdHlwZT17V206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhtOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lazp0aGlzLkxxKGEpfSxMcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTXE6dGhpcy5yayhhKX0scms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnNrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgZWE9Yy51dXx8ZWEsSGM9bmV3IGVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SGMuV20oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuRWE9InNldHVwIjt0aGlzLmRjPVtdO3RoaXMuU2UoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5jcy5iaW5kKHRoaXMpKX0KYy5TaT1iO2IucHJvdG90eXBlPXtTZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxGbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEucG9zdE1lc3NhZ2UoYiwiKiIpfSxHYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sY3M6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuYnMoYS5kYXRhKX0sYnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQowO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0scmQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sRG06ZnVuY3Rpb24oYSxiKXswPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmxhLnVybHNbYV09Yjt0aGlzLmxhLnVybHNbYl09YTt0aGlzLmxhLmhvbWFkVXJsc1thXT1iO3RoaXMubGEub3JpZ2luYWxVcmxzW2JdPWF9LGJmOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMubGEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmxhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LCRhOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO2Zvcih2YXIgZD0wO2Q8dGhpcy5sYS5lcnJtc2cubGVuZ3RoO2QrKyliKz0iXG4iK3RoaXMubGEuZXJybXNnW2RdO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrCmEsYiwhMCl9LERhOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0saGY6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFhzOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LERmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD0KYS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEVmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxlPTAsYz0wLGg9MCxmPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIHU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighdSlyZXR1cm4hMTtjPXUuaGVpZ2h0KnUud2lkdGg7ZD11LndpZHRoO2U9dS5oZWlnaHQ7MD51LnRvcCYmKGUrPXUudG9wKTt1LmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGUtPXUuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD51LmxlZnQmJihkKz11LmxlZnQpO3UucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09dS5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZSYmKGU9MCk7MD5kJiYoZD0wKTswPGMmJihoPTEwMC9jKmQqZSk7aD49YiYmKGY9ITApO3JldHVybiBmfSxrYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPwo2NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEJkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxlO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWU9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZSxifD0wO3JldHVybiBifSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZTtmb3IoZD03OzA8PWQ7ZC0tKWU9YT4+PjQqZCYxNSxnKz1lLnRvU3RyaW5nKDE2KTtyZXR1cm4gZ31mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsYyxoPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsdT00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixJPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbixsLHcscSxyO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGU9MDtlPG4tMztlKz00KWM9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsKMSk8PDE2fGEuY2hhckNvZGVBdChlKzIpPDw4fGEuY2hhckNvZGVBdChlKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChlKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT1wW2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09ZChoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtjPWY7bj11O2w9azt3PUk7cT1tO2ZvcihlPQowOzE5Pj1lO2UrKylyPWQoYyw1KSsobiZsfH5uJncpK3EraFtlXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZT0yMDszOT49ZTtlKyspcj1kKGMsNSkrKG5ebF53KStxK2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGU9NDA7NTk+PWU7ZSsrKXI9ZChjLDUpKyhuJmx8biZ3fGwmdykrcStoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihlPTYwOzc5Pj1lO2UrKylyPWQoYyw1KSsobl5sXncpK3EraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmPWYrYyY0Mjk0OTY3Mjk1O3U9dStuJjQyOTQ5NjcyOTU7az1rK2wmNDI5NDk2NzI5NTtJPUkrdyY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZikrYih1KStiKGspK2IoSSkrYihtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQoiIixkLGUsYyxoLGYsdSxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxlPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8ZT4+NCxmPShlJjE1KTw8MnxjPj42LHU9YyY2Myxpc05hTihlKT9mPXU9NjQ6aXNOYU4oYykmJih1PTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZikrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQodSk7cmV0dXJuIGJ9LG5xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJgotMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LFdlOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGU9ITEsYz0hMSxoPSExLGY9ITEsdT0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7ZT13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5zbj8hMDohMX1jYXRjaChyKXt9dHJ5e2M9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLHU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksCms9IXUmJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZTthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZjthLmlzSUU9dTthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9bTtyZXR1cm4gYX0sWG86ZnVuY3Rpb24oKXt2YXIgYT0iVSIsYj10aGlzLldlKCk7Yi5pc1BoYW50b21KUz9hPSJIUCI6Yi5pc0Nocm9tZUhlYWRsZXNzP2E9IkhDIjpiLmlzRmlyZWZveEhlYWRsZXNzP2E9IkhGIjooYi5pc0JsaW5rJiYoYT0iQiIpLGIuaXNPcGVyYSYmKGE9Ik8iKSxiLmlzRmlyZWZveCYmKGE9IkYiKSxiLmlzU2FmYXJpJiYoYT0iUyIpLGIuaXNJRSYmKGE9IkkiKSxiLmlzRWRnZSYmKGE9IkUiKSxiLmlzQ2hyb21lJiYoYT0iQyIpKTtyZXR1cm4gYX0sWGE6ZnVuY3Rpb24oKXt2YXIgYT17b2g6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sCkNoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LENwOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHlrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LFVsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxrbjpmdW5jdGlvbigpe3JldHVybiBhLm9oKCl8fGEuQ2goKXx8YS5DcCgpfHxhLnlrKCl8fGEuVWwoKX19O3JldHVybiBhLmtuKCl9LEthOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGU9MTQ7ZS0tOylkW2JbZV1dPWFbZV18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxlPTAsYz1hLmxlbmd0aDtlPGM7KytlKWIuaGFzT3duUHJvcGVydHkoYVtlXSl8fChkLnB1c2goYVtlXSksYlthW2VdXT0xKTtyZXR1cm4gZH0sb2Y6ZnVuY3Rpb24oYSl7YT10aGlzLkthKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0saWI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sVW46ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZT1bXSxjPTA7YzxiLmxlbmd0aDtjKyspZFtiW2NdXT0hMDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWRbYVtjXV18fGUucHVzaChhW2NdKTtyZXR1cm4gZX0sVnM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxlPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGU9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZSk6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxlZjpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMueGcoYikrIjoiK3RoaXMueGcoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3JldHVybiAxMD4KYT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZWU6ZnVuY3Rpb24oYSl7dGhpcy5FYT1hfSxmaXJlRXZlbnQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlO2Quc3RhdGU9dGhpcy5FYTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9lPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGUuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChlKX0sVGI6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLmZpcmVFdmVudChkLGIsYSl9LEQ6ZnVuY3Rpb24oYSxiLGQsZSxjKXt2YXIgaD1hO2QmJmImJihiPWwuRmMoYixkKSk7YiYmKGg9bC5GYyhhLGIpKTtlJiYoaD1sLkZjKGgsZSkpO2MmJihoPWwuRmMoaCxjKSk7Zi5UYihoKX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgZT1tLmFlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTttLlRhKGUsITApO2U9bS5UYShlLCEwKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtlLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2UuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkZhKGUsZnVuY3Rpb24oZCl7dmFyIGU9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGU9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGU9ITEpfWNhdGNoKGMpe31lfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwKKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LEtkOmZ1bmN0aW9uKCl7bSYmbS5ZP20uaXNFbmFibGVkJiZtLkVuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktkKCl9LmJpbmQodGhpcyksNTAwKX0seW46ZnVuY3Rpb24oYSxiKXtpZihiLk9jKGEpfHwiYWJvdXQ6YmxhbmsiPT1hfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5lZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy4kYSgiZXJyX3VybCIsYSk7aWYodGhpcy5iZihhKSlyZXR1cm4gdGhpcy5iZihhKTt2YXIgZD17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtkLmhvbWFkX3VybF9zdWZmaXg9CmE7ZC5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGEpO2QuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtkLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dmFyIGU9ITEsYz0hMSxjPXRoaXMuWWEoYSxiLnVhLGQsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1jKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goaCl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLkxjKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLkRtKGUsYSk7cmV0dXJuIGV9LFlhOmZ1bmN0aW9uKGEsYixkLGUsYyxoLGYsdSl7dmFyIGs9aHx8bTtoPSEwO3UmJihoPSExKTtpZihrJiZrLlkpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChsKXtjKGwpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLlRhKGEsaCk7aD1rLlRhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7aC5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciBxIGluIGQpaC5kYXRhW3FdPWRbcV07cmV0dXJuIGsuRmEoaCxlLGMsIiIsIiIsZil9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGUsYyxrLGYsdSl9LmJpbmQodGhpcyksNTAwKX0sR3E6ZnVuY3Rpb24oYSxiLGQsZSxjLGgsZil7dmFyIHU9ITA7ZiYmKHU9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zj1kO2Q9IiI7Zm9yKHZhciBrIGluIGYpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChmW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFlfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGUobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsdSksbC53aXRoQ3JlZGVudGlhbHM9aCwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LEhxOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkdxKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLmRjKWZvcih2YXIgYyBpbiB0aGlzLmRjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuZGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LE1mOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWWEoYSxlLnVhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5IcShlLkxjKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGUsITApfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYz1hfSxJdTpmdW5jdGlvbihhLGIsZCxlLGMpe3RoaXMuWWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzplfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86ZX0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9KX0sbG46ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxqcTpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspaWYoYltlXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFA9Yy5TaXx8UDtuZXcgUDt2YXIgZj1uZXcgUDt3aW5kb3cuZnY9ZjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5SaT1iO2IuRmM9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxlO2ZvcihlIGluIGIpZFtlXT1iW2VdO2ZvcihlIGluIGEpZFtlXT1hW2VdO3JldHVybiBkfTtiLk5yPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLiRxPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5zdT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLnhvPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuR3U9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53bT17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5xbT17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IudG09e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IueW09e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLnBtPXtjb2RlOiIxMDA5IiwKdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5ybT17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld0PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5acT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55bz17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQnU9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTG49e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Rbj17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IiwKbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLnpjPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IueWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLnZtPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi51bT17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWU9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLkhlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLnptPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07CmIuc209e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLlR0PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuYXI9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgbD1jLlJpfHxsO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxoPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuUms9YjtiLnByb3RvdHlwZT17a2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGZhPWMuUmt8fGZhLEpjPW5ldyBmYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUpjLmtoKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuVGk9YjtiLnByb3RvdHlwZT17QmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGUsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKyllPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2UsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sZnA6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLnZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sR2M6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkdjKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuR2MoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD0KYS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sTWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuR2MoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWMoKSsiMiJ9LEJmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmQodGhpcy5mcCgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLkdjKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgZ2E9Yy5UaXx8Z2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlFxPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzJdfWMuJG49YjtiLnByb3RvdHlwZT17UHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy4kbnx8aGEsS2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9S2MuUHEoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZT1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZyllW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT8KZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGU9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGV9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGUuYz9lLmhhc093blByb3BlcnR5KCJpbml0Iik/ZS5jOmZ1bmN0aW9uKCl7ZC5jLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWU7ZS5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLnVlPWJ9KShjKTt2YXIgSj1jLnVlfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRoPXRoaXMuYVs3XTt0aGlzLnhyPXRoaXMuYVs1XTt0aGlzLlBvPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs3XTt0aGlzLnRyPXRoaXMuYVs3XTt0aGlzLkxrPXRoaXMuYVs1XTt0aGlzLmZpPQp0aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLlJxPWI7Yi5wcm90b3R5cGU9e1poOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kaDp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHI6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBvOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucG46dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnRyOnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Mazp0aGlzLmVpKGEpfSxlaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYT1jLlJxfHxpYSxMYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuWmgoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Oaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPXt9O3RoaXMuQT1udWxsO3RoaXMuYWM9MTAwO3RoaXMubGI9MDt0aGlzLndhPTE1MDt0aGlzLnFiPTA7dGhpcy5GcyhiKX0sYjpmdW5jdGlvbigpe30sSDpmdW5jdGlvbigpe3RoaXMubGI8PXRoaXMud2E/KHRoaXMubGIrKyx0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKTowPnRoaXMud2EmJih0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKX0scnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYj50aGlzLndhPyEwOiExfSxjZzpmdW5jdGlvbigpe3RoaXMubGI9MH0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEw6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmZiKCldPQpiO0smJksuS2YmJksuWXMoYil9LG52OmZ1bmN0aW9uKCl7cmV0dXJuIGYuRGEodGhpcy54YSl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueGEpaWYoYT09dGhpcy54YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy54YVtiLmZiKCldPyEwOiExfSxtcTpmdW5jdGlvbihiKXtiPWIuQ2EoKTtmb3IodmFyIGEgaW4gdGhpcy54YSlpZihiLmlkPT10aGlzLnhhW2FdLkNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LEJ2OmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMuTmt8fHI7KGZ1bmN0aW9uKGMpe2MuUGs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5hYz0xMDt0aGlzLmxiPTA7dGhpcy53YT01MDt0aGlzLko9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLlllPSExO3RoaXMuTigpfSwKSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7fSxPczpmdW5jdGlvbihiKXt0aGlzLko9Yn0sb3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KfSxJczpmdW5jdGlvbihiKXt0aGlzLk9kPWJ9LG12OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2R9LE5kOmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YSYmKHRoaXMubGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmFjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSwKZ2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5DYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sZmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxDdjpmdW5jdGlvbigpe30sUjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5CcCgpfHx0aGlzLkFtKCk7dGhpcy5mZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LHB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEFtOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixmLnBhKDEwKSl9LEJwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxPOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LENhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxOYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0samI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdnY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sZGE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxXYTpmdW5jdGlvbigpe3JldHVybiExfSxIZDpmdW5jdGlvbigpe3JldHVybiExfSxoZzpmdW5jdGlvbihiKXt0aGlzLmdiPWJ9LGx2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LHFzOmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxydjpmdW5jdGlvbigpe3ZhciBiPQohMTt0aGlzLmdiJiYoYj0hMCk7cmV0dXJuIGJ9LHh2OmZ1bmN0aW9uKCl7dGhpcy5ZZXx8KHRoaXMuWWU9ITApfSxIYzpmdW5jdGlvbigpe3JldHVybiExfSxpdjpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5Qa3x8cDsoZnVuY3Rpb24oYyl7Yy5PZz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuQT10aGlzLnBsYXllcj0iIjt0aGlzLkRlPSIxIjt0aGlzLkVlPSIyIjt0aGlzLmptPSIzIjt0aGlzLmljPTA7dGhpcy5QZj0zMDt0aGlzLnRiPVtdO3RoaXMuT2E9W107dGhpcy5MYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5LZT10aGlzLkJnPSExO3RoaXMuc3RhdHVzPXRoaXMuaWM7dGhpcy5pZD1mLnBhKDEwKTt0aGlzLlljKGIpOwp0aGlzLkdzKGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuQmd8fCh0aGlzLkJnPSEwLGYuS2QoKSl9LFJkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LKCk7USYmUS5ZYiYmIWphJiYoamE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdzpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLkxzKCksdGhpcy5BKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy50ZygpLHRoaXMuS2U9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LGw6ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnRiLnB1c2goYiksdGhpcy5PYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnRiJiYwPHRoaXMudGIubGVuZ3RoJiYodGhpcy50Yj1mLnVuaXF1ZSh0aGlzLnRiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsCnRoaXMudGIuam9pbigiLCIpKSk7aWYodGhpcy5PYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLk9hLmxlbmd0aDtnKyspdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl09PXRoaXMuTGJbYl0mJmEucHVzaCh0aGlzLk9hW2ddLmRldGFpbCksdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl08dGhpcy5MYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuT2FbZ10uZGV0YWlsKSxiPXRoaXMuT2FbZ10ucmVhc29uKTt0aGlzLkxiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9Zi51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sbTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGV9LExzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5FZX0sTXM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmptfSxDYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPQp0aGlzLmljfSxGZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5EZX0sWHU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuRWV9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmljfSxZYzpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEdzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEtxOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5PZ3x8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GaT10aGlzLmFbNV07dGhpcy5jdD10aGlzLmFbNV07dGhpcy5Eaj10aGlzLmFbOF07dGhpcy4kbD10aGlzLmFbN107dGhpcy5ndD10aGlzLmFbMTBdO3RoaXMuY3I9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19CmMuUGc9YjtiLnByb3RvdHlwZT17RWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZpOnRoaXMuYnQoYSl9LGJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdDp0aGlzLkNqKGEpfSxDajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGo6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRsOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ndDp0aGlzLmJyKGEpfSxicjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYT1jLlBnfHxrYSxNYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5FaSg0KTsoZnVuY3Rpb24oYyl7Yy5OaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5KJiZ0aGlzLkooKX0sSzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgUj1jLk5ofHxSOyhmdW5jdGlvbihjKXtjLk1oPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5nZD1udWxsO3RoaXMuaHU9MUUzO3RoaXMuV2Y9Cm51bGw7dGhpcy52dD0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuc24pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Jby5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMueHAuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy53cChhLGIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMua3UoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLmx1KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMudnAoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLk9uKGEpfS5iaW5kKHRoaXMpKX0sCk9uOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sa3U6ZnVuY3Rpb24oYil7dGhpcy5nZHx8KHRoaXMuZ2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm11KGIpfS5iaW5kKHRoaXMpLHRoaXMuaHUpKX0sbXU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZ2QpO3RoaXMudygpfSxsdTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5nZCl9LHZwOmZ1bmN0aW9uKGIpe3RoaXMuZHYoYik7dGhpcy5XZj1uZXcgRGF0ZTt0aGlzLldmLXRoaXMuWHI8dGhpcy52dD90aGlzLncoKTp0aGlzLm0oKX0seHA6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5ZYyhuZXcgUihhKSkpO3RoaXMudygpfSxJbzpmdW5jdGlvbigpe30sd3A6ZnVuY3Rpb24oKXt0aGlzLlhyPW5ldyBEYXRlfX0pfSkoYyk7dmFyIGxhPWMuTWh8fGxhOyhmdW5jdGlvbihjKXtjLk9oPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxmLkRhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFIoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgbGEoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkgoKX19fSl9KShjKTt2YXIgbWE9Yy5PaHx8bWEsbmE9bmV3IG1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnd1PXRoaXMuYVs5XTt0aGlzLlRvPXRoaXMuYVs5XTt0aGlzLkdwPXRoaXMuYVs4XTt0aGlzLmJoPXRoaXMuYVsyXTt0aGlzLmhpPXRoaXMuYVs4XTt0aGlzLkR0PXRoaXMuYVszXTt0aGlzLlR1PXRoaXMuYVs5XTsKdGhpcy5Ucj10aGlzLmFbNV07dGhpcy5mcz10aGlzLmFbNV07dGhpcy5Iaz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxXX1jLkh1PWI7Yi5wcm90b3R5cGU9e3Z1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53dTp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVG86dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdwOnRoaXMuYWgoYSl9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5iaDp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaGk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkR0OnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5UdTp0aGlzLlNyKGEpfSxTcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHI6dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZzOnRoaXMuR2soYSl9LApHazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgb2E9Yy5IdXx8b2EsTmM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMudnUoNCk7KGZ1bmN0aW9uKGMpe2Mucmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdLHRoaXMubHE9ITApO3RoaXMuUihhKTsKdGhpcy5SZigpO3RoaXMuUG49ITF9LFJmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYSgpLGE9dGhpcy52aWRlb1RhZyxnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtpZihnKXtpZigiT0JKRUNUIj09Zy5ub2RlTmFtZXx8IlZJREVPIj09Zy5ub2RlTmFtZSlnPWcucGFyZW50Tm9kZTtnIT1iJiZ0aGlzLk8oZyk7Yj1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2lmKCFiKWI9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF07ZWxzZSBpZih0aGlzLmxxKXt0aGlzLmtxPSEwO3JldHVybn1iJiZiIT1hJiZ0aGlzLlIoYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl9LmJpbmQodGhpcyksNTApfX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihrLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllciwKY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcykpfSxOZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLiRjKGEpfS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpfSwkYzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuT2QmJigwLHRoaXMuT2QpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LApqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxIYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHBhPWMucmp8fHBhOyhmdW5jdGlvbihjKXtjLnFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LENiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5pYzt0aGlzLmlzUGxheWluZz10aGlzLmtjPQohMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmCmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmJiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5iYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMua2M9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkSW1wcmVzc2lvbiIpOwp0aGlzLlJkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5QZiYmIXRoaXMuaGEoKSYmKHRoaXMuYmI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJih0aGlzLkNiKCksdGhpcy5nZXRQbGF5ZXIoKS5Qbj0hMCxrLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2I7YSYmKGEuVGQoKSxhLkFhKCkpfX0uYmluZCh0aGlzKX0pOwppZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5rYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUGYmJiF0aGlzLmhhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMubWMuaW5kZXhPZihhKSYmdGhpcy5tYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5tKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubSgiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMubWMubGVuZ3RoPj10aGlzLnBkJiZ0aGlzLm8oKSl9LEtxOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sbzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKTtmLlhzKGEudmlkZW9UYWcpJiYoYS5rcT90aGlzLm0oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmtjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksNTApKX19KX0pKGMpO3ZhciBxYT1jLnFqfHxxYTsoZnVuY3Rpb24oYyl7Yy5zaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmFwKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07ZHx8KGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2R8fCJPQkpFQ1QiIT1nLm5vZGVOYW1lJiYiVklERU8iIT1nLm5vZGVOYW1lfHwoZD1nKTtpZihkKXt2YXIgZz1uZXcgcGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMubXEoZyl8fCh0aGlzLkwoZyksZz1uZXcgcWEoZyx0aGlzLkEpLApnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGFwOmZ1bmN0aW9uKCl7dmFyIGI9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZi53YihiLmFuY2hvcil9fSl9KShjKTt2YXIgcmE9Yy5zanx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLm5oPXRoaXMuYVsxMF07dGhpcy5yaT10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVs0XX1jLiRnPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50cTp0aGlzLm1oKGEpfSxtaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubmg6dGhpcy5waShhKX0scGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5yaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIHRhPWMuJGd8fHRhLE9jPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLnNxKDQpOyhmdW5jdGlvbihjKXtjLlhsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuTyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5SKGIpOnRoaXMuSCgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB1YT1jLlhsfHx1YTsoZnVuY3Rpb24oYyl7Yy5XbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm0oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5vKCkpfSxvOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgdmE9Yy5XbHx8dmE7KGZ1bmN0aW9uKGMpe2MuWWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8Zi5EYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgdWEoZyksdGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgdmEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgd2E9Yy5ZbHx8d2EseGE9bmV3IHdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zdD10aGlzLmFbMl07dGhpcy51bz10aGlzLmFbOF07dGhpcy5XZz10aGlzLmFbOV07dGhpcy5GdD10aGlzLmFbOV07dGhpcy5BdT10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs3XX1jLlVvPWI7Yi5wcm90b3R5cGU9e3J0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLnRvKGEpfSx0bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudW86dGhpcy5WZyhhKX0sVmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldnOnRoaXMuRXQoYSl9LEV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GdDp0aGlzLnp1KGEpfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgeWE9Yy5Vb3x8eWEsUGM9bmV3IHlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLnJ0KDQpOyhmdW5jdGlvbihjKXtjLkpsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLk8oYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUihiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sSzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnBiKGIpfS5iaW5kKHRoaXMpKX0scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkomJnRoaXMuSigpfSxOYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5leGl0RnVsbHNjcmVlbigpfSwKY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB6YT1jLkpsfHx6YTsoZnVuY3Rpb24oYyl7Yy5JbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy56Zz0hMDt0aGlzLnRkPXRoaXMueWY9ITE7dGhpcy5TZigpO3RoaXMuQm4oKTt0aGlzLkhhKCl9LHl2OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5mYigpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5iYSwiOyIsCnR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5zYToKInVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLmxkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLm1kOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuRj9iLkYubWE6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2Q6InVuZGVmaW5lZFgiLAoiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuYWcpfSxTYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sVmI6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGI9CnRoaXMuU2EoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLlhiKXt2YXIgYj10aGlzLlNhKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWGI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlhiPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWGJ9LGlxOmZ1bmN0aW9uKCl7aWYoIXRoaXMueGYpe3ZhciBiPXRoaXMuU2EoKSxhPXRoaXMuZ3EoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJgoodGhpcy54Zj0hMCl9cmV0dXJuIHRoaXMueGZ9LGdxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5xYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMucWM9ITApO3JldHVybiB0aGlzLnFjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYKKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXt0aGlzLmJlKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxiZTpmdW5jdGlvbigpe3RoaXMudGQ9ITA7dmFyIGI9dGhpcy5rZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2YuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2YuaWIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPQohMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMuTmJ8fCh0aGlzLmwoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLlcoKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksCjIwKX0sanY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlRlJiZiLmFkcyYmKHRoaXMuVGU9Yi5hZHMpO3JldHVybiB0aGlzLlRlfSxCbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuVygpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpOwpiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKX0sVmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDUwKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuaXEoKSl7dmFyIGE9dGhpcy5TYSgpLGc9dGhpcy5WYigpO2EmJmcmJih0aGlzLlNhKCksdGhpcy5WYigpLHRoaXMudGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZD90aGlzLm0oKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5TYSgpfWVsc2UgdGhpcy55Zj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhKCksYj10aGlzLlZiKCk7YSYmIWI/KHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuU2EoKTt0aGlzLlZiKCl9LmJpbmQodGhpcyksMTAwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuVygpKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy55Zj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl9LmJpbmQodGhpcyksNTApfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYKKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LENuOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihiLmFkcyl7aWYodGhpcy5RYiE9Yi5hZHMuc3RhdGUmJih0aGlzLlFiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLlFiKXt0aGlzLm0oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuUWI9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNuKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITA7dGhpcy5tKCJlbXB0eSB2YXN0Iil9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuemc9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuemcsZnVuY3Rpb24oKXt0aGlzLlZlKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApIbjpmdW5jdGlvbigpe3RoaXMudHZ8fCgxMDx0aGlzLml1Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApKToodGhpcy5pdSsrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnBzKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhuKCl9LmJpbmQodGhpcyksNTApKSl9LHBzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLmp1KXt0aGlzLmp1PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrCmEsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBBYT1jLklsfHxBYTsoZnVuY3Rpb24oYyl7Yy5LbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1nKGJbZ10pfWNhdGNoKGQpe310aGlzLkgoKX19LG1nOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYuRGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgemEoYltnXSksYS5qYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBBYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxIOmZ1bmN0aW9uKCl7dGhpcy5xYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmFjKX19KX0pKGMpOwp2YXIgQmE9Yy5LbHx8QmEsQ2E9bmV3IEJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk11PXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzZdfWMuU3M9YjtiLnByb3RvdHlwZT17THU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk11OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgRGE9Yy5Tc3x8RGEsUWM9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuTHUoNCk7KGZ1bmN0aW9uKGMpe2Mudmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpOwpiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuTyhhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe30scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSiYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKToKYi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEVhPWMudmx8fEVhOyhmdW5jdGlvbihjKXtjLnVsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLnpiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmVjPSExO3RoaXMuYmcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9CmIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLm0oKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZWM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy51YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlFlKCk6dGhpcy5tKCl9LHVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlOwphLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMubSgpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5lYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZWM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy51Yy5iaW5kKHRoaXMpLAoxMDApfX0sUWU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuemIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuemImJih0aGlzLnpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lY3x8Cih0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFlLmJpbmQodGhpcyksNTApfX0sYmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5lYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJgp0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZhPWMudWx8fEZhOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBFYSh2aWRlbyk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgRmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIEdhPWMud2x8fEdhLEhhPW5ldyBHYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLmRyPQpiO2IucHJvdG90eXBlPXtiajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgSWE9Yy5kcnx8SWEsUmM9bmV3IElhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuYmooNCk7KGZ1bmN0aW9uKGMpe2MueGg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5RZj1hfSxOOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLlFmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFmKS5wYXJlbnROb2RlO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKSzpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgSmE9Yy54aHx8SmE7KGZ1bmN0aW9uKGMpe2Mud2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIEthPWMud2h8fEthOyhmdW5jdGlvbihjKXtjLnloPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IEphKGQsYSksdGhpcy5JKGQpfHwoZC5MZChhKSx0aGlzLkwoZCksCmQ9bmV3IEthKGQsdGhpcy5BLGcpLGQuTGQoZyksZC5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgTGE9Yy55aHx8TGEsTWE9bmV3IExhKGNhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zaD10aGlzLmFbOF07dGhpcy5Sbz10aGlzLmFbNl07dGhpcy5MdD10aGlzLmFbMV07dGhpcy5Ecj10aGlzLmFbNV07dGhpcy5Qcj10aGlzLmFbNV07dGhpcy53aj10aGlzLmFbN107dGhpcy5qbD10aGlzLmFbOV07dGhpcy5GdT10aGlzLmFbNV07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLmpoPWI7Yi5wcm90b3R5cGU9e3JoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zaDp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm86dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT8KdGhpcy5MdDp0aGlzLkNyKGEpfSxDcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHI6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlByOnRoaXMudmooYSl9LHZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53ajp0aGlzLmlsKGEpfSxpbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamw6dGhpcy5FdShhKX0sRXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GdTp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgTmE9Yy5qaHx8TmEsU2M9bmV3IE5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MucmgoNCk7KGZ1bmN0aW9uKGMpe2MuV2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLk8oYik7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sWGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmMDwkKCJib2R5LmRldmljZV9tb2JpbGUiKS5sZW5ndGgmJihiPSEwKTtyZXR1cm4gYn0sSzpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgT2E9Yy5Xanx8T2E7KGZ1bmN0aW9uKGMpe2MuVmo9CnQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlhhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMubGMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpKTp0aGlzLmxjKCl9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkP2IuYWRDb250ZXh0Ll9hZFJlc3BvbnNlP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpOwp2YXIgUGE9Yy5Wanx8UGE7KGZ1bmN0aW9uKGMpe2MuWGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBPYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFBhKGIsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBRYT1jLlhqfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW09dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVszXTt0aGlzLnFoPXRoaXMuYVsxXTt0aGlzLmlrPXRoaXMuYVszXTt0aGlzLlppPXRoaXMuYVs1XTt0aGlzLkhyPXRoaXMuYVs2XTt0aGlzLkxwPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5uaj0KdGhpcy5hWzNdO3RoaXMuR289dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMl19Yy5CbD1iO2IucHJvdG90eXBlPXtMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTW06dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmV0OnRoaXMucGgoYSl9LHBoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucWg6dGhpcy5oayhhKX0saGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlrOnRoaXMuWWkoYSl9LFlpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5aaTp0aGlzLkdyKGEpfSxHcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHI6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxwOnRoaXMuQXMoYSl9LEFzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQnM6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5qOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuR286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBTYT1jLkJsfHxTYSxUYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5MbSg0KTsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLlVkPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLk8oYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlIoYik6dGhpcy5kYSgpfSxZcjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5ZYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5UZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWQ9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuVWQrKztpZigxMDx0aGlzLlVkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkomJnRoaXMuSigpfX0pfSkoYyk7dmFyIFRhPWMuQWt8fFRhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkVvPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLkVvPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuWXIoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFVhPWMuemt8fFVhOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVGEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkkoYSl8fCh0aGlzLkwoYSksKG5ldyBVYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgVmE9Yy5Ca3x8VmEsV2E9bmV3IFZhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlF0PXRoaXMuYVs4XTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLmppPXRoaXMuYVszXTt0aGlzLmd1PXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzFdfWMudXM9YjtiLnByb3RvdHlwZT17UHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ubDp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuamk6dGhpcy5mdShhKX0sZnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzoKYX19fSkoYyk7dmFyIFhhPWMudXN8fFhhLFVjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVVjLlB0KDQpOyhmdW5jdGlvbihjKXtjLk9pPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5PKGIuZWxlbWVudCk7dGhpcy5SKGIuZWxlbWVudCl9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIFlhPWMuT2l8fFlhOyhmdW5jdGlvbihjKXtjLk5pPQp0LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmRldGFpbCYmIjEwMTAiPT1iLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCl9fSl9KShjKTt2YXIgWmE9Yy5OaXx8WmE7KGZ1bmN0aW9uKGMpe2MuUGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLGZ1bmN0aW9uKGIpe2I9bmV3IFlhKGIuZGV0YWlsKTtiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuQSkpLmIoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciAkYT1jLlBpfHwkYSxhYj1uZXcgJGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWc9dGhpcy5hWzNdO3RoaXMuWHA9dGhpcy5hWzhdO3RoaXMuS2g9dGhpcy5hWzZdO3RoaXMubGk9dGhpcy5hWzhdO3RoaXMuRGk9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzZdO3RoaXMudmk9dGhpcy5hWzhdO3RoaXMuWmo9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbNl19Yy5IcD1iO2IucHJvdG90eXBlPXtUZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWc6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlhwOnRoaXMuSmgoYSl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5LaDp0aGlzLmtpKGEpfSxraTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubGk6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5EaTp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLktvOnRoaXMudWkoYSl9LHVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52aTp0aGlzLllqKGEpfSxZajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGJiPWMuSHB8fGJiLFZjPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVZjLlRnKDQpOyhmdW5jdGlvbihjKXtjLmtqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1mLmhmKGIsImVsZW1lbnRJRCIpO3RoaXMuWWY9Yi5wb3NpdGlvbmluZzsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuTyhnKTt0aGlzLlIoZyk7dGhpcy5EYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuRGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkRjKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCkduOmZ1bmN0aW9uKCl7Zi5EZih0aGlzLkRjKTtmLkVmKHRoaXMuRGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HbigpfS5iaW5kKHRoaXMpLDUwKX0sSzpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxIZDpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGNiPWMua2p8fGNiOyhmdW5jdGlvbihjKXtjLmpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBkYj1jLmpqfHxkYjsoZnVuY3Rpb24oYyl7Yy5saj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLndhPTE1MDA7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoayYmay5pbnJlYWQpe3ZhciBiPWsuaW5yZWFkLGE9Zi5oZihiLCJlbGVtZW50SUQiKTtmLkRmKGEpJiYoYj1uZXcgY2IoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgZGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLnFiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5xYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZWI9Yy5sanx8ZWIsZmI9bmV3IGViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVoPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzFdfWMuZ3M9YjtiLnByb3RvdHlwZT17ZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVoOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgZ2I9Yy5nc3x8Z2IsV2M9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9V2MuZGgoNCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5VaT1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxIczpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LEJtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB6PWMuVWl8fHo7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5JYT1hO3RoaXMuZGY9dGhpcy5LZz0hMTt0aGlzLlRmPWQ7dGhpcy5uZz0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5JYT1uZXcgeihhKSk7dmFyIGY9dGhpcy5OYT1uZXcgWE1MSHR0cFJlcXVlc3Q7Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Zi5yZWFkeVN0YXRlfHwKMjAwIT1mLnN0YXR1cyYmMjAxIT1mLnN0YXR1c3x8ZyhmKTtpZihkJiY0PT1mLnJlYWR5U3RhdGUmJjIwMCE9Zi5zdGF0dXMmJjIwMSE9Zi5zdGF0dXMpZChmKTtlbHNlIGlmKDQ9PWYucmVhZHlTdGF0ZSYmMD09Zi5zdGF0dXMmJm0mJm0uRmQodGhpcy5JYS51cmwpJiZtLmRkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5IcygiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxtLmdhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5nYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9Zi5yZWFkeVN0YXRlJiZjKGYpfS5iaW5kKHRoaXMpfWMuVmk9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEuZGF0YTsKaWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmRmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5uZz90aGlzLk5hLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITEpOnRoaXMuTmEub3Blbih0aGlzLklhLm1ldGhvZCx0aGlzLklhLnVybCwhMCksdGhpcy5LZ3x8KHRoaXMuTmEud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGsmJmsudnBhaWQmJm0mJm0uT2ModGhpcy5JYS51cmwpJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuTmEuc2VuZChhKX1jYXRjaChjKXttJiYKbS5GZCh0aGlzLklhLnVybCk/bS5kZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmYudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkZkKHRoaXMuSWEudXJsKSx0aGlzLlRmJiZ0aGlzLlRmKCl9cmV0dXJuIHRoaXMuTmF9fX0pKGMpO3ZhciBoYj1jLlZpfHxoYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnVkPXRoaXMuZWI9bnVsbDt0aGlzLlZuPXRoaXMubmI9dGhpcy5MZj0hMTt0aGlzLnVhPSIiO3RoaXMuR2Y9ITE7dGhpcy56YT10aGlzLkpjPSIiO3RoaXMuQ2Y9dGhpcy5ZPXRoaXMuaXNFbmFibGVkPXRoaXMuWmQ9ITE7dGhpcy5NYT1bXTt0aGlzLnRmPXRoaXMuRmI9IiI7dGhpcy55ZD0hMTt0aGlzLmtlPTA7dGhpcy55ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5zYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7CnRoaXMuaGM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMueGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMub2I9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMubGU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5DZD0hMTt0aGlzLkluPXRoaXMuZWQ9bnVsbDt0aGlzLmZjPXRoaXMuQWc9dGhpcy5uZT10aGlzLmRkPXRoaXMudmQ9dGhpcy5qYz0hMTt0aGlzLlBhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfX1jLldpPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmViLGFkdGFncmVnZXg6dGhpcy51ZCxqc3BvcHVwczp0aGlzLkxmLHNpZGVsb2Fkczp0aGlzLm5iLGRpc2FibGV0ZXN0czp0aGlzLlZuLGhvbWFkQWxpYXM6dGhpcy51YSwKaXNJbml0aWFsaXplZDp0aGlzLkdmLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnphLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5DZixzZXJ2ZXI6dGhpcy5NYSxzdm1Db25maWc6dGhpcy5GYixob21hZEFkcGF0aDp0aGlzLnRmLGRpc2FibGVDb29raWVUZXN0OnRoaXMueWQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMua2UsSE9NQURfVkVSSUZJRUQ6dGhpcy55ZSxIT01BRF9CTE9DS0VEOnRoaXMud2UsSE9NQURfTk9CTE9DS0VSOnRoaXMuc2IsSE9NQURfQURCTE9DS0VSOnRoaXMuaGMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLnhlLHRlc3RIaWRlOnRoaXMuSGIsdGVzdFRhZ3M6dGhpcy5vYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMubGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5DZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkluLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLmpjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy52ZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5kZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5uZSxjb25maWdGYWlsdXJlczp0aGlzLlBhLHNpdGVDb25maWc6dGhpcy5FYixzZXJ2ZXJJZDp0aGlzLmZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5TYix2cGFpZDp0aGlzLmZjfX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuUGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5QYVtiXSYmMT09dGhpcy5QYVtiXSYmKGE9ITApO3JldHVybiBhfSxjZTpmdW5jdGlvbihhKXt0aGlzLlBhW2FdPSEwfSxicDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYxPT10aGlzLlBhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LFpzOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhOwphPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLmxuKGEpfSxUYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZj0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuT2MoYSk7Zj10aGlzLkthKGEpO2M/KHRoaXMuWmIoKT9oPWE6aD1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixrPWYucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMuYWUoKSxrPWYucGF0aC5zdWJzdHIoMSkrCihmLnF1ZXJ5PyI/IitmLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuT2J8fHRoaXMuZWJ8fHRoaXMudWQpJiYoaz10aGlzLlNxKGspKTthPW5ldyB6KGgpO2EudXJsPWg7aD0iIjtoPWM/Zi5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuY3AoZi5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxPYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuWmIoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuTWEmJnRoaXMuTWEubGVuZ3RoJiYwPHRoaXMuTWEubGVuZ3RoJiYoYj10aGlzLk1hWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuT2MoYSk7cmV0dXJuIGJ9LGNwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSwKYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5idjtyZXR1cm4ibm9uZSJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWFbdGhpcy5mZ119LGFlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5MYygpLGI9dGhpcy5qZygobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxTcTpmdW5jdGlvbihhKXt0aGlzLk9iJiYoYSs9dGhpcy5PYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7cmV0dXJuIGF9LGM6ZnVuY3Rpb24oYSxiLGQsYyxmLGgpe209dGhpczt0aGlzLkdmPSEwO3RoaXMuSmM9YTt0aGlzLnphPWI7dGhpcy5aZD1kO3RoaXMuZWQ9Yzt0aGlzLkJjPWY7dGhpcy5FYj0KaDt0aGlzLkZxKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnphKXRoaXMuRHEoKTtlbHNlIHRyeXt0aGlzLnphPWIoKSx0aGlzLndjKCl9Y2F0Y2goayl7dGhpcy5nYSgibm9DbGllbnRDb25maWciKX19LFphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxGcTpmdW5jdGlvbigpe3RoaXMuRmEobmV3IHoodGhpcy5KYyt0aGlzLm9jKCJnbG9iYWwiKSksdGhpcy5zcC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLndjKCl9LmJpbmQodGhpcyksITApfSxEcTpmdW5jdGlvbigpe25ldyB6KHRoaXMuemErdGhpcy5vYygiY2xpZW50IikpO3RoaXMuRmEobmV3IHoodGhpcy56YSt0aGlzLm9jKCJjbGllbnQiKSksdGhpcy53Yy5iaW5kKHRoaXMpLApmdW5jdGlvbigpe3RoaXMuY2UoImNsaWVudCIpO3RoaXMuZ2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LG9jOmZ1bmN0aW9uKGEpe3ZhciBiPSI/Y2FjaGU9Iit0aGlzLmtiKCk7dGhpcy5FYiYmdGhpcy5FYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuRWImJnRoaXMuRWIubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxnYTpmdW5jdGlvbihhKXtpZighdGhpcy52ZCl7dGhpcy52ZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuQ2Y9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndlKSk7dGhpcy5yYigpO2YuVGIobC5Ocik7KGI9Zi5vZih0aGlzLkxjKCkpKXx8KGI9Zi5vZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sc3A6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnphfHx0aGlzLkZifHx0aGlzLnVhfHx0aGlzLndjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX19LHdjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnphfWVsc2UgYT10aGlzLnphO3RoaXMuaXNFbmFibGVkPXRoaXMuSmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuTWE9YS5zZXJ2ZXJ8fFtdO3RoaXMuRmI9YS5jb25maWd8fCIiO3RoaXMudWE9YS5hbGlhc3x8bnVsbDt0aGlzLnRmPWEuYWRwYXRofHwiIjt0aGlzLnlkPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuZmc9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuTWEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5GYiYmdGhpcy51YSYmdGhpcy5NYS5sZW5ndGg/dGhpcy5RYyghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX0sUWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9Cm5ldyB6KHRoaXMuYWUoKSksYz10aGlzLkthKHRoaXMuRmIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5GYit0aGlzLm9jKCJjdXN0b21lciIpKTt0aGlzLkZhKGIsdGhpcy5hdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiY3VzdG9tZXIiKTthP3RoaXMuYWw/dGhpcy5nYSgibm9TVk1Db25maWciKToodGhpcy5hbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuUWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGF0OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5kZD0KdGhpcy5KYihiLnN0cmljdCk7dGhpcy5uZT10aGlzLkpiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkFnPWIuZHVyYXRpb25fY2hlY2tfZW5hYmxlZHx8ITE7dGhpcy5TYj10aGlzLkpiKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuSGI9Yi50ZXN0aGlkZXx8IiI7dGhpcy5vYj1iLnRlc3RhZHRhZ3N8fFtdO3RoaXMuSWI9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PYj1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmViPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnVkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLkxmPWIuanNwb3B1cHN8fCExO3RoaXMubmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuZmM9Yi52cGFpZHx8ITE7dGhpcy5FYi52cGFpZD10aGlzLmZjO3RoaXMuR2I9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMubXAoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnlkJiYodGhpcy5HYj1udWxsKTt0aGlzLmxlPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuQ2QmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkNkPSEwLHRoaXMuUWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMudHQoKSYmKHRoaXMuSGJ8fHRoaXMuSWJ8fHRoaXMub2J8fHRoaXMuR2IpP3RoaXMuWmQ/KHRoaXMub2E9dGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy53ZCgpLHRoaXMucmIoKSk6dGhpcy5qdCgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmt0KCkpfX0sanQ6ZnVuY3Rpb24oKXt0aGlzLml0KCl9LGt0OmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSk7dGhpcy5yYigpfSxjZDpmdW5jdGlvbihhKXt0aGlzLmpjPQohMDt0aGlzLll8fCh0aGlzLlk9dGhpcy5vYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEoYSkpLHRoaXMucmIoKSx0aGlzLndkKCkpfSxpdDpmdW5jdGlvbigpe2lmKHRoaXMuSGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZSl7fWE/dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMucWcoKX1lbHNlIHRoaXMucWcoKX0scGc6ZnVuY3Rpb24oKXt2YXIgZTt2YXIgYztmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoKSk7dGhpcy5udChlLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuaWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmNkKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX10aGlzLm9iPW51bGwsdGhpcy5pZSgpfSxudDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZSgpe2YoKSYmYigpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dGhpcy5GYShuZXcgeihhKSxlLGZ1bmN0aW9uKCl7ZigpJiZjKCl9KX0scWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLmtiKCkpO3RoaXMub3QoZSwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBnLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLkliJiZ0aGlzLkliLmxlbmd0aCl7dmFyIGM9dGhpcy5JYi5zbGljZSgpLGU7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnBnKCl9LG90OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBlKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZigpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZmKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1lO2wub25lcnJvcj1mO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobSl7ZSgpfX0saWU6ZnVuY3Rpb24oKXt0aGlzLkdiPyh0aGlzLmtlKyssdGhpcy5GYShuZXcgeih0aGlzLkdiKSx0aGlzLmh0LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMub2coKX0samU6ZnVuY3Rpb24oYSl7dGhpcy5jZCh0aGlzLnhlLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saHQ6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMua2U/dGhpcy5pZSgpOnRoaXMuamUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5vZygpOnRoaXMuamUoIkFBQSIpfSxvZzpmdW5jdGlvbigpe3RoaXMuWT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy5zYikpO3RoaXMucmIoKTt0aGlzLndkKCl9LHJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO2YuWGEoKSYmKGE9IjEiKTt0aGlzLmpjJiYoYj0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy55ZSkpO3RoaXMuZWQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZCYmdGhpcy5lZCgpfSxGbjpmdW5jdGlvbigpe2lmKHRoaXMubmUmJnRoaXMuenAoKSl7dmFyIGE9dGhpcy5icCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sdGc6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9CiJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRmE6ZnVuY3Rpb24oYSxiLGMsZSxoLEljKXthPW5ldyBoYihhLGIsYyk7ZSYmKGEuS2c9ITApO2gmJmYubnEoKSYmKGEuZGY9ITApO0ljJiYoYS5uZz0hMCk7cmV0dXJuIGEubG9hZCgpfSxPZTpmdW5jdGlvbigpe2YuWGEoKXx8Zi5ZYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZT0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5nYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7ZT0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLlpiKCl8fChhPXRoaXMuS2EoZSksZT1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZSl9ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sRW46ZnVuY3Rpb24oKXt0aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkZhKGEsdGhpcy5WdC5iaW5kKHRoaXMpLHRoaXMuVXQuYmluZCh0aGlzKSl9LFZ0OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7cmV0dXJufWN8fHRoaXMuem8oKX0sVXQ6ZnVuY3Rpb24oKXt9LHpvOmZ1bmN0aW9uKCl7Zi5UYihsLnlvKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx3ZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm5iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMubmIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5uYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZi5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKX19LHR0OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMubGV9LG1wOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCwKYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHdiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGUsZixoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8ZT4+NCxrPShlJjE1KTw8MnxmPj42LGw9ZiY2Myxpc05hTihlKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxLYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgYz17fSxlPTE0O2UtLTspY1tiW2VdXT1hW2VdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsZixoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGU9MDtlPG4tMztlKz00KWY9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsxKTw8MTZ8YS5jaGFyQ29kZUF0KGUrMik8PDh8YS5jaGFyQ29kZUF0KGUrMykseS5wdXNoKGYpOwpzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHkucHVzaChlKTsxNCE9eS5sZW5ndGglMTY7KXkucHVzaCgwKTt5LnB1c2gobj4+PjI5KTt5LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT15W2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09YyhoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtmPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihlPTA7MTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8fm4mdykrdCtoW2VdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtmb3IoZT0yMDszOT49ZTtlKyspeD1jKGYsNSkrKG5ecF53KSt0K2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZixmPXg7Zm9yKGU9NDA7NTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8biZ3fHAmdykrdCtoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsZj14O2ZvcihlPTYwOzc5Pj1lO2UrKyl4PWMoZiw1KSsobl5wXncpK3QraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtrPWsrZiY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGliPWMuV2l8fGliLG09bmV3IGliO3dpbmRvdy5ndj1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMTBdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuRXA9dGhpcy5hWzRdO3RoaXMuYWs9dGhpcy5hWzJdO3RoaXMuT3Q9dGhpcy5hWzZdO3RoaXMuVnA9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19Yy5wcj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY2s6dGhpcy56dChhKX0senQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkF0OnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRXA6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFrOnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpOwp2YXIgamI9Yy5wcnx8amIsWGM9bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuYmsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5qPWE7YS51Lks/dGhpcy5MYT1hLnUuSygpOnRoaXMuTGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5qLlFhO3RoaXMucGxheWVyPXRoaXMuai51O3RoaXMucmM9ITE7dGhpcy5qbj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmJkPXt9O3RoaXMucGM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5wYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmoudSkmJnRoaXMuai51LkImJihhPXRoaXMuai51LkIoKSksdGhpcy5wYz1jLmFkbWVzc2FnZShhKSkpOwpjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuSW09Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5hZD0hMTt0aGlzLk5mPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLnM9e307dGhpcy5uYz0hMTt0aGlzLndnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuWWI9ITE7dGhpcy5Sbj1mLnBhKDEwKTt0aGlzLlRjPWYucGEoMTApO3RoaXMuUGQ9Zi5wYSgxMCk7dGhpcy5rZz1mLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkFiPSExO3RoaXMuemQ9bnVsbDt0aGlzLkFjPXRoaXMubGc9dGhpcy5VZj10aGlzLkVjPXRoaXMud3Q9dGhpcy5hYj0hMX1jLlFpPWI7Yi5wcm90b3R5cGU9e2dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuTGFdJiYKdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSx1ZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5FYSYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULmpjP2YudHJhY2soImFkY2FsbCIsIjEiKTpmLnRyYWNrKCJhZGNhbGwiLCIwIik7Zi50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2YuRChsLnVtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSl9LEpkOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmFiPWM7aWYodGhpcy5ULlkpdGhpcy5ULkZuKCksdGhpcy5ULm9hJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5mY30pKTpiPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLlQuZmMsCnVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5BYSgpO2Vsc2V7dmFyIGU9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5KZChhLGIsYyl9LDUwKX19LFZkOmZ1bmN0aW9uKGEpe3RoaXMuRWM9ITE7dGhpcy5zPWE7dGhpcy5Qcyh0aGlzLnMpO3RoaXMucGYoYSl9LHBmOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLmJkPXRoaXMub3AoYSkpLHRoaXMucGYoYS5wYXJlbnQpKX0sb3A6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxlPVtdLGY9W10saD0iIjtpZihhLmFhKXtiPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtlPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5hYS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuYWEuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSk7YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmCihoPWEuYWEuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGUubGVuZ3RoO2srKyllW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZVtrXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGgpKSxlW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS55YihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZixhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQ2MmJmEuQ2MuZXJyb3ImJmEuQ2MuZXJyb3IuY29kZSYmKGI9YS5DYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmdjLmNvZGU6Yj09Qy5qZC5jb2RlPwpmLkQobC5zdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpOihmLktkKCksYj09Qy5CZS5jb2RlJiZmLkQobC5acSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKTtmLkQobC54byx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHguemUuY29kZTpmLkQobC5XdCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguQ2UuY29kZTpmLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtmLkQobC5CdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LmtkLmNvZGU6Zi5EKGwuR3UsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmhkLmNvZGU6Zi5EKGwuJHEsCnRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksZi50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChmLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7Zi50cmFjayhjLCIiLCEwKTt0aGlzLnhiKGEpO3RoaXMuQWEoKX0seGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLnlhLmxlbmd0aDspdHJ5e3ZhciBjPWEueWEucG9wKCk7dGhpcy5JZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZSl7fX0sUHM6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJgooYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWI7Yj10aGlzLmouQztiLnp2PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5JbSYmdGhpcy5wbGF5ZXIuSGMoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkhjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuQ20oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLnNnKGIpPyh0aGlzLkVtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLAp0aGlzLmNhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmNhLmFwcGVuZENoaWxkKGIpKTp0aGlzLnMuTW4oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLk5zKCkpOnRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5zLm9yaWdpbi4kZSh4LmhkKX0sTnM6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2E9YS5yZXBsYWNlKC8mYW1wOy9nLCImIik7YT1hLnJlcGxhY2UoLyZsdDsvZywiPCIpO2E9YS5yZXBsYWNlKC8mZ3Q7L2csIj4iKTtyZXR1cm4gYT1hLnJlcGxhY2UoLyZxdW90Oy9nLCciJyl9Zi5TZSgpO3RoaXMucyYmdGhpcy5zLm9yaWdpbiYmdGhpcy5zLm9yaWdpbi50ZSYmCmYuRm0odGhpcy5zLm9yaWdpbi50ZSk7Zi4kYSgic2V0VXBWcGFpZCIpO3ZhciBiPXRoaXMuai5DO3RoaXMuai5DPUIucG9wKCk7Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmouQyxiKTt0aGlzLmouVmYoKTt0aGlzLmouY2MoKTtmb3IoYj10aGlzLmouRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5qLmNjKCk7dGhpcy5YPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7CnRoaXMuai5HLmFwcGVuZENoaWxkKHRoaXMuWCk7dGhpcy5YLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBiPXRoaXMucy5xcCgpLGM9YSh0aGlzLnMuUC5PcmlnaW5hbEFkUGFyYW1ldGVycyksZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmouRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLmhlaWdodCl9fX07Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLApnKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2I9Zi55bigiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuVCk7dGhpcy5YLnNyYz1iO2YucmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJnRoaXMubnUoKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJnRoaXMub3UoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJ1KCksIkFkVmlkZW9Db21wbGV0ZSI9PQphLmRhdGEubmFtZSYmdGhpcy5xdSgpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5wdSgpKX0uYmluZCh0aGlzKSk7Zi5yZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpKTtmLnJkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSl9LG91OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iil9LG51OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2YuJGEoImltcHJlc3Npb24iKX0sSGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2YuJGEoInN0YXJ0Iil9LEdnOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2YuJGEoImZpcnN0UXVhcnRpbGUiKX0scnU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7Zi4kYSgidGhpcmRRdWFydGlsZSIpfSxxdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNvbXBsZXRlIik7CmYuJGEoImNvbXBsZXRlIil9LHB1OmZ1bmN0aW9uKCl7Zi4kYSgiYWRzdG9wcGVkIik7dGhpcy5BYSgpfSxDbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBlPWIsZj10aGlzLlQ7Zi5vYSYmZi5pc0VuYWJsZWQmJiFmLlpiKCk/KGU9Zi5LYShlKSxiPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTpiPWU7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmV1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxFbTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMucmUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5wZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmZkLmJpbmQodGhpcykpfSxYYzpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LEZnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW8uY29udHJvbHM9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFlKGEpfS5iaW5kKHRoaXMpLHRoaXMuam4pfSxxZTpmdW5jdGlvbihhKXt0cnl7aWYoIWYuWGEoKSYmCnRoaXMuVC5BZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQWJ8fCh0aGlzLkFiPSEwLHRoaXMuWGModGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMucmN8fCF0aGlzLnNnKHRoaXMudmlkZW8pfHx0aGlzLkFifHwodGhpcy5yYz0hMCx0aGlzLmR1KCksdGhpcy52aWRlby5jb250cm9scz0hMSx0aGlzLmouY2MoKSx0aGlzLkNnKCksdGhpcy5EZygpLHRoaXMuTWUoKSx0aGlzLmouVmYoKSx0aGlzLnZpZGVvLnBsYXkmJnRoaXMuaGUoKSl9LGhlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZi5FYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5LYz1bXTtmb3IodmFyIGI9CnRoaXMuai5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLktjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5vZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTsKdmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2YudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtmLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMub2QoKX1lbHNlIHRoaXMub2QoKX0sb2Q6ZnVuY3Rpb24oKXtpZih0aGlzLktjKWZvcih2YXIgYT0wO2E8dGhpcy5LYy5sZW5ndGg7YSsrKXRoaXMuS2NbYV0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChhPXRoaXMudmlkZW8ucGxheSgpKSYmYVsiY2F0Y2giXSlhWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWEoKSxmLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsIiIsITApKX0uYmluZCh0aGlzKSk7WT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQmIuYmluZCh0aGlzKSkpOkg9ZnVuY3Rpb24oKXt0aGlzLm5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5oZSgpKX0uYmluZCh0aGlzKTt0aGlzLm5mKCkuaGcodGhpcyl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtmLkQobC5wbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMucy52Yj8odGhpcy5yYz0hMSx0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuYWQ9ITEsdGhpcy5qLnlnKCksdGhpcy5zLm9yaWdpbi5RZCgpKTp0aGlzLkFhKCl9LGV1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5mZChhKSl9LGZkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkVkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuT2UoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5PZSgpKTt0aGlzLnMub3JpZ2luLiRlKHguaGQpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMud3QpdGhpcy5BYSgpO2Vsc2V7dGhpcy5ZYj0hMDt0aGlzLmoudS5qYiYmIXRoaXMubGcmJnRoaXMuai51LmpiKCkmJmYuRChsLnljLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTsKdGhpcy5CdChhKTt2YXIgYj0iIjtpZih0aGlzLnMuZ2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMua2cpO2MmJihiPXRoaXMucy5nZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5hZHx8KHRoaXMuYWQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7Zi5EKGwudm0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTt0aGlzLnMudmI/KHRoaXMucmM9ITEsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmFkPSExLHRoaXMuai55ZygpLHRoaXMucy5vcmlnaW4uUWQoKSk6dGhpcy5BYSgpfS5iaW5kKHRoaXMpKSkpLApjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMubmM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwKImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5pcCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmouY2MoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuRWcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuQ2coKTt0aGlzLkRnKCk7dGhpcy56ZD1zZXRJbnRlcnZhbCh0aGlzLkRuLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0saXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZT1iPXRoaXMucy5NW2NdLGY7Zj1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmCmguaXNFbmFibGVkJiYhaC5aYigpJiYoZj1oLkthKGYpLGY9Zi5wcm90b2NvbCsiOi8vIitmLmhvc3QpO2UudXJsPWY7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sRG46ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLnpkKSx0aGlzLnBlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMucmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuemQpLHRoaXMuZmQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSx2ZzpmdW5jdGlvbigpe3RoaXMuVWZ8fCh0aGlzLlVmPSEwLHRoaXMuRWN8fApmLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sQnQ6ZnVuY3Rpb24oYSl7YT09dGhpcy53Z3x8dGhpcy5BYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy52ZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZmLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5BYnx8Zi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGYuWGEoKSYmZi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLApmLkQobC5ybSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpLGYuRChsLndtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy5SYiYmZi50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5FYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGYuRChsLnFtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLkQobC50bSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsCiJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGYuRChsLnltLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGYuRChsLnptLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy53Zz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5BYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnBwKHRoaXMucy55YSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBlPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmJkLmltcHJlc3Npb25zJiZmLmpxKGUudXJsLHRoaXMuYmQuaW1wcmVzc2lvbnMpP3RoaXMuSWQoZS51cmwsZS50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpOwpmLkQobC5zbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkse2FkSWQ6dGhpcy5iZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSWQoZS51cmwsZS50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMucy55YT10aGlzLlRuKHRoaXMucy55YSxhKSl9fSxJZDpmdW5jdGlvbihhLGIsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuVGEoYSksYyYmYS5CbShjKSxlfHwoZT10aGlzLlplKSx0aGlzLlQuRmEoYSxlLHRoaXMuWmUsITEsITApKX0scHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxUbjpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxkdTpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5FZy5iaW5kKHRoaXMpfSwKRWc6ZnVuY3Rpb24oKXtmLkQobC5Mbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5FYyYmZi5YYSgpJiZmLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZi5YbygpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMudmN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnZjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsCmEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Sbjt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuVGM7Yi5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnl0LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMueHQuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLlpjLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLnRvcD0iLTUwcHgiLGUuc3R5bGUucmlnaHQ9IjBweCIsZS5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtlLmlkPXRoaXMua2c7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2UuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7ZS5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMuZ2UmJmEuYXBwZW5kQ2hpbGQoZSk7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LldhJiZ0aGlzLmoudS5XYSgpJiZ0aGlzLlZxKCk7dGhpcy5XYigpfX0sV2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxaYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSx5dDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVGMpO3RoaXMuai5DLnBhdXNlZD8KKHRoaXMuai5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSk6KHRoaXMuai5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLkQobC5IZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sVGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlRjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5EKGwuSGUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHNzOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLAphLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHh0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWQ/KHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGYudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LFZxOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLAp0aGlzLnRyYWNrKCJtdXRlIiwhMCksZi50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxCYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYik7dGhpcy5BY3x8dGhpcy5uY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuaGUoKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5BYz0hMDt0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1mLkVhJiZ0aGlzLm5jfHwicG9zdHJvbGwiPT1mLkVhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShmLkVhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiYKYSl7Zm9yKHZhciBiPXRoaXMuai5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmouY2MoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy54ZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7CmYudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7Zi50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy54ZCgpfWVsc2UgdGhpcy54ZCgpfSx4ZDpmdW5jdGlvbigpe3RoaXMubGc9ITA7dGhpcy5qLnNmKCk7dGhpcy5qLnRzKCk7dGhpcy5ZYj0hMTtmLkQobC5Rbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMubmYoKS5xcygpfSxuZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxFZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYKKGE9ITApfXJldHVybiBhfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihmLkVmKHRoaXMudmlkZW8sYSk/dGhpcy5zcygpOnRoaXMuVGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKX0uYmluZCh0aGlzKSwxMDApKX0sUzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy52YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy52Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLlFpfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVvPXRoaXMuYVs2XTt0aGlzLmtyPXRoaXMuYVs5XTt0aGlzLmFqPQp0aGlzLmFbOF07dGhpcy5hcz10aGlzLmFbN107dGhpcy5BbD10aGlzLmFbN107dGhpcy5Kaj10aGlzLmFbN107dGhpcy5QcD10aGlzLmFbNF07dGhpcy5paj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLndzPWI7Yi5wcm90b3R5cGU9e2NvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3I6dGhpcy4kaShhKX0sJGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFqOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hczp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQWw6dGhpcy5JaihhKX0sSWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkpqOnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5QcDp0aGlzLmhqKGEpfSxoajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaWo6dGhpcy5mKGEpfSwKZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIga2I9Yy53c3x8a2IsWWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuY28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5KYT1udWxsO3RoaXMuYmE9W107dGhpcy5hYT1udWxsO3RoaXMuTWI9ITE7dGhpcy50ZT0iIjt0aGlzLnNlPSExO2QmJmQuZW1wdHk/dGhpcy5KcSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLkhsPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLldlKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMPwpuZXcgeih0aGlzLnVybCk6bS5UYShtLlpzKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO3RoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmKGIuZGF0YS5ob21hZF9jb21wYXRpYmxlX3ZwYWlkPSJ0cnVlIik7bS5GYShiLHRoaXMuSXEuYmluZCh0aGlzKSx0aGlzLkVxLmJpbmQodGhpcykpfSxmZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuRWEpdHJ5e3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChlKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLkVhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5FYSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PQpnLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZ1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1lLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LElxOmZ1bmN0aW9uKGEpe3RoaXMuanMoYSk7dHJ5e3RoaXMuSmE9YS5yZXNwb25zZVhNTCx0aGlzLkphfHwodGhpcy5KYT0KKG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sSnE6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sRXE6ZnVuY3Rpb24oKXt0aGlzLmZhKHRoaXMuQmEoeC56ZSx7ZGVwdGg6YX0pKX0sUmM6ZnVuY3Rpb24oKXt0aGlzLmFhPQp0aGlzLmJhLnNoaWZ0KCk7dGhpcy5wcSgpP3RoaXMucHQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5xZigpLGcpKTp0aGlzLmZhKHRoaXMuQmEoeC5DZSkpOihhPTAsdGhpcy5TdCgpJiZ0aGlzLlZkKHRoaXMuU24oKSkpfSxRZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5SYygpKTp0aGlzLnBhcmVudC5RZCgpfSxTdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm10KCk/dGhpcy5sdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5CYSh4LnZlKSk6dGhpcy5mYSh0aGlzLkJhKHguTGgpKSwhMSk6KHRoaXMuZmEodGhpcy5CYSh4LmdjLEMuQmUpKSwhMSl9LFZkOmZ1bmN0aW9uKGEpe2EueWE9YS55YS5jb25jYXQodGhpcy5NZCgpKTthLnZiPWEudmI/YS52Yjp0aGlzLk1iO3RoaXMucGFyZW50LlZkKGEpfSxTbjpmdW5jdGlvbigpe3ZhciBhPW5ldyBsYjthLmR1cmF0aW9uPXRoaXMuVWIoKTthLk09dGhpcy5sZigpOwphLnZjPXRoaXMuWW8oKTthLm9yaWdpbj10aGlzO2EuUD10aGlzLlZvKCk7YS5nZT10aGlzLm5wKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLmFhJiYoYi55YT1iLmVycm9yLmNvZGUhPXgudmUuY29kZT9iLnlhLmNvbmNhdCh0aGlzLiRvKCkpOmIueWEuY29uY2F0KHRoaXMuZ3AoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQueGImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC54YiYmdGhpcy5wYXJlbnQueGIoYiksYT0wLHRoaXMuUmMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5mYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx4YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC54YihhKX0sJGU6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQmEoYSxiKSl9LEJhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG1iKGEsYik7Yy5vcmlnaW49dGhpczsKcmV0dXJuIGN9LHB0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sbXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxmKCkubGVuZ3RofSxsdDpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0scmc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sanM6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRlPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy5zZT1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxwcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMucWYoKS5sZW5ndGh9LHFmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuanAodGhpcy5hYSwiVkFTVEFkVGFnVVJJIil9LApNZDpmdW5jdGlvbigpe2Zvcih2YXIgYT1bIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZShnKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnliKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sZ3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sJG86ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFlvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWIodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksc2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLGV2OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnliKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnNjKS1NYXRoLmFicyg3MDAtYi5zYyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksYj1nLmNvbmNhdChkKX1jYXRjaChmKXt9cmV0dXJuIGJ9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtkPWI9dGhpcy5yZihhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1nLnB1c2goYyk7Zi5wdXNoKGQpfTE8YS5sZW5ndGg/KGI9ZyxoPWQpOihiPWMsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sVWI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy55Yih0aGlzLmFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sbnA6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGUpdHJ5e2M9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZz1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5WcyhnLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGQpe2I9ITF9cmV0dXJuIGJ9LGpwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy55YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHliOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmYoYSk6IiJ9LApyZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnJwKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5IbHx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbT10aGlzLmFbMTBdO3RoaXMudm49dGhpcy5hWzldO3RoaXMuZWo9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMl19Yy5RZz1iO2IucHJvdG90eXBlPXtjbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZG06dGhpcy51bihhKX0sdW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuZGooYSl9LGRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5lajp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIG5iPWMuUWd8fG5iLFpjPW5ldyBuYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1aYy5jbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLnlhPVtdO3RoaXMuTT1bXTt0aGlzLnZjPSIiO3RoaXMuUD10aGlzLnZiPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Naz1iO2IucHJvdG90eXBlPXtNbjpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxxcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIGxiPWMuTWt8fGxiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVs2XTt0aGlzLnVwPXRoaXMuYVs4XTt0aGlzLmdoPXRoaXMuYVs1XTt0aGlzLmdqPXRoaXMuYVs0XTt0aGlzLmloPXRoaXMuYVs0XTt0aGlzLnlqPXRoaXMuYVszXTt0aGlzLnRpPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs2XTt0aGlzLkdsPQp0aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLm1pPWI7Yi5wcm90b3R5cGU9e2ZuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nbjp0aGlzLnRwKGEpfSx0cDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudXA6dGhpcy5maChhKX0sZmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmdoOnRoaXMuZmooYSl9LGZqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5najp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWg6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnlqOnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50aTp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVHA6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTsKdmFyIG9iPWMubWl8fG9iLCRjPW5ldyBvYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PSRjLmZuKDQpO3ZhciB4PXtrZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixrYToiWE1MX1BBUlNFX0VSUk9SIn0sTGg6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLGthOiJEVVJBVElPTl9FUlJPUiJ9LGdjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixrYToiRU1QVFlfVkFTVCJ9LENlOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsCm1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixrYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0semU6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsa2E6IkxPQURfRVJST1IifSxoZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLAptZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sVXU6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsa2E6Ik1FRElBRklMRV9FUlJPUiJ9LHZlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLGthOiJEVU1NWV9BRCJ9fSxDPXtBZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLGthOiJOT19BRFMifSxCZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsa2E6Ik5PX01FRElBRklMRVMifSxXdTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIiwKa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5WbT10aGlzLmFbM107dGhpcy5RdT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs1XX1jLlpnPWI7Yi5wcm90b3R5cGU9e1VtOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5WbTp0aGlzLlB1KGEpfSxQdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy5aZ3x8cGIsYWQ9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9CmFkLlVtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuQ2M9Yjt0aGlzLnlhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy53aT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1iPWMud2l8fG1iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldrPXRoaXMuYVs5XTt0aGlzLmc9dGhpcy5hWzhdfWMuJGs9YjtiLnByb3RvdHlwZT17Vms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLldrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy4ka3x8cWIsYmQ9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YmQuVmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSwKYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuUWE9YS5nZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9Zi5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuUmE9e307dGhpcy5JZj0hMTt0aGlzLnZmPVtdfWMuUGg9YjtiLnByb3RvdHlwZT17bHA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGY9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2Y9e3g6ZSx5OmJ9O2YucG9zaXRpb249YztyZXR1cm4gZn0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5scChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZj10aGlzLmhxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2YmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7aD17eDpiLHk6Y307ZSYmKGgucG9zaXRpb249ZSk7cmV0dXJuIGh9LCRzOmZ1bmN0aW9uKCl7dGhpcy5JZj0hMH0sCnlnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxWZjpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpO2YuRChsLnljLHRoaXMudS5CKCkpfSx0czpmdW5jdGlvbigpe3RoaXMuSWZ8fCh0aGlzLnUucGxheSgpLGYuRChsLnpjLHRoaXMudS5CKCkpKX0sY2M6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMudS5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLlFhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5RYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlFhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuUWEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5RYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5RYSk7dGhpcy51LkRiJiZ0aGlzLnUuRGIoKT90aGlzLnUuZ2YoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVmLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMudS5leGl0RnVsbHNjcmVlbigpfSxocTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFpvOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sdWY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5abyh0aGlzLlFhKTtpZihiLnghPXRoaXMuUmEueHx8Yi55IT10aGlzLlJhLnl8fGIucG9zaXRpb24hPXRoaXMuUmEucG9zaXRpb258fGIud2lkdGghPXRoaXMuUmEud2lkdGh8fGIuaGVpZ2h0IT10aGlzLlJhLmhlaWdodHx8YSl7aWYoMDx0aGlzLlJhLndpZHRoJiYwPHRoaXMuUmEuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5zZigpO3JldHVybn10aGlzLlJhPWI7dGhpcy51LkRiKCk/KHRoaXMuRy5zdHlsZS5sZWZ0PQoiMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5DLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMudmYubGVuZ3RoO2ErKyl0aGlzLnZmW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWYuYmluZCh0aGlzKSwxMCl9LHNmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTsKZm9yKHZhciBOPWMuUGh8fE4sQj1bXSxyYj0wOzEwMD5yYjtyYisrKXt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO0wuc3R5bGUuZGlzcGxheT0iYmxvY2siO0wuaWQ9Zi5wYSgxMCk7TC5jb250cm9scz0hMDtCLnB1c2goTCl9dmFyIEg9ITEsWT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNuPXRoaXMuYVsxMF07dGhpcy51az10aGlzLmFbNF07dGhpcy5PbD10aGlzLmFbNV07dGhpcy5FaD10aGlzLmFbNl07dGhpcy5vaz10aGlzLmFbNV07dGhpcy5JaD10aGlzLmFbOV07dGhpcy5pcj10aGlzLmFbN107CnRoaXMuaGw9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbN119Yy5NdD1iO2IucHJvdG90eXBlPXtibjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY246dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnVrOnRoaXMuTmwoYSl9LE5sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT2w6dGhpcy5EaChhKX0sRGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkVoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vazp0aGlzLkhoKGEpfSxIaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSWg6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlyOnRoaXMuZ2woYSl9LGdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNiPWMuTXR8fHNiLGNkPW5ldyBzYigxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5ibig0KTsoZnVuY3Rpb24oYyl7Yy53az1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5PKGEpO3RoaXMuZmUoYik7dGhpcy5YZSgpfSxmZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sWGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkNhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5SKGEpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkNhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD0KYy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIHRiPWMud2t8fHRiOyhmdW5jdGlvbihjKXtjLnZrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj1aKCk7dGhpcy51Yj10aGlzLnVifHwhMTt0aGlzLkdlPXRoaXMuSmU9dGhpcy56Zj10aGlzLmlhPXRoaXMubWU9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5IbyhhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMubWU9ITA7dGhpcy56ZiYmdGhpcy5SZSgpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLlliJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLnpmPSEwO3RoaXMuUmUoKX0uYmluZCh0aGlzKSk7dGhpcy5OZSgpfSxSZTpmdW5jdGlvbigpe2lmKCF0aGlzLnViKXt0aGlzLnRjKCk7aWYoIXRoaXMubWUmJiF0aGlzLnRjKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5tZSYmdGhpcy5HZSYmIXRoaXMuSmUmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCl9fSx0YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sCm1mOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LE5lOmZ1bmN0aW9uKCl7aWYodGhpcy50YygpKXt2YXIgYj10aGlzLm1mKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuSmU9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5HZT1iLmF2fXRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5lKCl9LmJpbmQodGhpcyksMTAwKX0saHY6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IudXYoKTohMX0sVWI6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj8KYi5VYigpOi0xfSxocDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxIbzpmdW5jdGlvbihiLGEpe3RoaXMudWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy51Ynx8MzAyPT10aGlzLnViP3RoaXMuaWE9ITA6dGhpcy5sKCJhZGVycm9yIix0aGlzLnViKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfSx4YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5pYT8odGhpcy5tKCksdGhpcy5uYSgpKTpiLk5jKCk/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuaHAoYik/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHViPWMudmt8fHViOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sb3E6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWsua20uaW0/d2luZG93Lk9PLlFrLmttLmltLlp1KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9xKCl9LDEwMCl9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPTE1MDA7dmFyIGI9WigpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5EYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgdGIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IHViKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmIsd2I9bmV3IHZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpyPXRoaXMuYVsxXTt0aGlzLlNnPXRoaXMuYVszXTt0aGlzLkJvPXRoaXMuYVs2XTt0aGlzLkpwPXRoaXMuYVs2XTt0aGlzLktyPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzVdfWMueHM9YjtiLnByb3RvdHlwZT17eXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy56cjp0aGlzLlJnKGEpfSxSZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2c6dGhpcy5BbyhhKX0sQW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJvOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KcDp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuS3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZzphfX19KShjKTt2YXIgeGI9Yy54c3x8eGIsZGQ9bmV3IHhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQueXIoNCk7KGZ1bmN0aW9uKGMpe2Muc2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSwKRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sSzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgeWI9Yy5zbHx8eWI7KGZ1bmN0aW9uKGMpe2Mucmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5xZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5lcihhKX0uYmluZCh0aGlzKSk7CnkueXAoKX0sZXI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciB6Yj1jLnJsfHx6YjsoZnVuY3Rpb24oYyl7Yy50bD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuU2MmJihiPWYuVW4oYix0aGlzLlNjKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxkPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGQpdHJ5e3RmbXN1aXRlKCIjIitkKS50Zm12aWRlbygicmVzdW1lIik7dGhpcy5TY3x8KHRoaXMuU2M9W10pO3RoaXMuU2MucHVzaChiW2FdKTt2YXIgZT1uZXcgeWIoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgemIoZSx0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319fXRoaXMuSCgpfSxxZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5afHwodGhpcy5aPXt9KTt0aGlzLlpbYl18fCh0aGlzLlpbYl09e30pO3RoaXMuWltiXVthXXx8KHRoaXMuWltiXVthXT1bXSk7CnRoaXMuWltiXVthXS5wdXNoKGMpfSxxdDpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLlp8fHRoaXMuWiYmIXRoaXMuWlthXSl0aGlzLiRifHwodGhpcy4kYj1bXSksdGhpcy4kYi5wdXNoKGIpLHRoaXMucnMoKSYmKHRoaXMuY2coKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5aW2FdW2NdJiYwPHRoaXMuWlthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLlpbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLlpbYV1bY11bZF0oYil9fSx5cDpmdW5jdGlvbigpe2lmKHRoaXMuJGIpZm9yKHZhciBiPTA7Yjx0aGlzLiRiLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuJGJbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLlpbY11bZF0mJgowPHRoaXMuWltjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLlpbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLlpbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF0KGIpfX0pfSkoYyk7dmFyIEFiPWMudGx8fEFiLHk9bmV3IEFiKHEpO1goKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NaT10aGlzLmFbNV07dGhpcy56cT10aGlzLmFbM107dGhpcy5ncj10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMV07dGhpcy5zbz10aGlzLmFbMV07dGhpcy5jdT10aGlzLmFbN107dGhpcy5acD10aGlzLmFbNF07dGhpcy54cT10aGlzLmFbOF07dGhpcy5obz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX0KYy5tbj1iO2IucHJvdG90eXBlPXtMaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWk6dGhpcy55cShhKX0seXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpxOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudWo6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNvOnRoaXMuYnUoYSl9LGJ1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdTp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWnA6dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnhxOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5obzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIEJiPWMubW58fEJiLGVkPW5ldyBCYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC5MaSg0KTsoZnVuY3Rpb24oYyl7Yy56aD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LApqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuemh8fENiOyhmdW5jdGlvbihjKXtjLkFoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5Xcnx8KHRoaXMuV3I9CiEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkFofHxEYjsoZnVuY3Rpb24oYyl7Yy5CaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IENiKGQpO3RoaXMuSShmKXx8Cih0aGlzLkwoZiksKG5ldyBEYihmLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkgoKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkJofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2g9dGhpcy5hWzZdO3RoaXMuaG09dGhpcy5hWzEwXTt0aGlzLlptPXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzRdfWMuaG49YjtiLnByb3RvdHlwZT17Rmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdoOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5obTp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlptOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy5obnx8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQuRmgoNCk7KGZ1bmN0aW9uKGMpe2MuUWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LApnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sSzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBIYj1jLlFsfHxIYjsoZnVuY3Rpb24oYyl7Yy5QbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkxlfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLAoxMDApO3RoaXMuTm98fCh0aGlzLkFmKCksdGhpcy5Obz0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5MZT8odGhpcy5sKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLm8oKSk6KHRoaXMuTGU9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MDApKX0sV286ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5XbygpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMuaWE9ITAsdGhpcy5tKCksdGhpcy5uYSgpKToKKHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWYoKX0uYmluZCh0aGlzKSw1MCl9LHN2OmZ1bmN0aW9uKCl7cmV0dXJuITB9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJYj1jLlBsfHxJYjsoZnVuY3Rpb24oYyl7Yy5SbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IEhiKGIuaXRlbShhKSk7dGhpcy5JKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwKKHRoaXMuTChjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBKYj1jLlJsfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS209dGhpcy5hWzFdO3RoaXMuTW89dGhpcy5hWzNdO3RoaXMuWWg9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19Yy5ocz1iO2IucHJvdG90eXBlPXtKbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS206dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nbzp0aGlzLlhoKGEpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWWg6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBMYj1jLmhzfHxMYixnZD1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Z2QuSm0oNCk7KGZ1bmN0aW9uKGMpe2MuQWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5KJiYKKDAsdGhpcy5KKSghMCl9LmJpbmQodGhpcykpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuImthbHR1cmEifX0pfSkoYyk7dmFyIE1iPWMuQWp8fE1iOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGxvZzpmdW5jdGlvbigpe30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuY2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLnhtKCl9LmJpbmQodGhpcykpLHRoaXMuSmc9ITEsdGhpcy50dT0xRTMsdGhpcy5YZj17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLlhmLmRvbmV8fCh0aGlzLlhmLmRvbmU9ITAsdGhpcy5KZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWcoKX0uYmluZCh0aGlzKSx0aGlzLnR1KSl9LHhtOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkpnKTt0aGlzLm0oKX0sSWc6ZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLncoKSl9LGpmOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmCmJbY11bZF0uZ2V0RXJyb3JDb2RlKXt2YXIgZT1iW2NdW2RdO2JbY11bZF0uZ2V0RXJyb3JDb2RlKCk7YltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7YS5wdXNoKGUuZ2V0RXJyb3JDb2RlKCkpfXJldHVybiBhfSx2YTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuamYobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5qZih0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgTmI9Yy56anx8TmI7KGZ1bmN0aW9uKGMpe2MuQmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJgp3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGYuRGEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyl8fHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj1udWxsO3dpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxmLkRhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBNYihjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBOYihjLHRoaXMuQSkpLmIoKSkpfX10aGlzLkgoKX19KX0pKGMpOwp2YXIgT2I9Yy5Canx8T2IsUGI9bmV3IE9iKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpzPXRoaXMuYVszXTt0aGlzLkJxPXRoaXMuYVs2XTt0aGlzLnl1PXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzldfWMuUnQ9YjtiLnByb3RvdHlwZT17eXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpzOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CcTp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXU6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgUWI9Yy5SdHx8UWIsaGQ9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aGQueXMoNCk7CihmdW5jdGlvbihjKXtjLnBsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBSYj1jLnBsfHxSYjsoZnVuY3Rpb24oYyl7Yy5vbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpO3RoaXMuUGIoKX0sUGI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5HZCgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2QoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGIoKX0uYmluZCh0aGlzKSwxMCl9LEdkOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LApvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgU2I9Yy5vbHx8U2I7KGZ1bmN0aW9uKGMpe2MucWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBSYihkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgU2IoYiwKdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBUYj1jLnFsfHxUYixVYj1uZXcgVGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWWc9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzRdO3RoaXMubGw9dGhpcy5hWzVdO3RoaXMucnI9dGhpcy5hWzNdO3RoaXMubWs9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuV2g9YjtiLnByb3RvdHlwZT17WGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLllnOnRoaXMuTm0oYSl9LE5tOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PbTp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubGw6dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJyOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLldofHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5YZyg0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5XZD0hMX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuWnIoKX0uYmluZCh0aGlzKSw1MDApfSxacjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPApiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5KJiZ0aGlzLkooKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5XZCYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPwooYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXczpmdW5jdGlvbigpe3RoaXMuV2Q9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sSzpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLllrfHxXYjsoZnVuY3Rpb24oYyl7Yy5Yaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuT3E9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLktifHwodGhpcy5LYj0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiKTt0aGlzLm8oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSwKd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuT3E/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLldzKCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBYYj1jLlhrfHxYYjsoZnVuY3Rpb24oYyl7Yy5aaz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLAphPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkgoKX19KX0pKGMpO3ZhciBZYj1jLlprfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW89dGhpcy5hWzZdO3RoaXMuSms9dGhpcy5hWzRdO3RoaXMuam89dGhpcy5hWzJdO3RoaXMueWk9dGhpcy5hWzddO3RoaXMudnI9dGhpcy5hWzddO3RoaXMuYm09dGhpcy5hWzEwXTt0aGlzLlRoPXRoaXMuYVszXTt0aGlzLm1tPXRoaXMuYVs4XTt0aGlzLkJyPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVs1XX1jLmtvPWI7Yi5wcm90b3R5cGU9CntwbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucW86dGhpcy5JayhhKX0sSWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkprOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbzp0aGlzLnhpKGEpfSx4aTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueWk6dGhpcy51cihhKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZyOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ibTp0aGlzLlNoKGEpfSxTaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGg6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1tOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ccjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMua298fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1qZC5wbyg0KTsoZnVuY3Rpb24oYyl7Yy5Uaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTsKcmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLlRrfHxhYzsoZnVuY3Rpb24oYyl7Yy5Taz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5DYSgpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuTm4oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuSWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLkNxKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LE5uOmZ1bmN0aW9uKCl7dGhpcy5GZSgpfHx0aGlzLm8oITApfSxDcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWMoKTshYi5tYSYmYi5iYSYmYi5ZdSYmYi4kdSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjsKYTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sSWM6ZnVuY3Rpb24oKXtmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQ2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspaWYoYltjXS5pZD09YSlyZXR1cm4gYltjXTtyZXR1cm57fX0sR2Q6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbzpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iPwp0aGlzLkljKCkuYWRzTG9hZGVyP3RoaXMudyghMCk6dGhpcy53KCk6dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGJjPWMuU2t8fGJjOyhmdW5jdGlvbihjKXtjLlVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsucGxheWVyYXBpKWZvcih2YXIgYj1rLnBsYXllcmFwaSgpLGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IGFjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBiYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgY2M9Yy5Va3x8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52aD10aGlzLmFbOV07dGhpcy5hcT10aGlzLmFbOV07dGhpcy5raz10aGlzLmFbN107dGhpcy5lcT10aGlzLmFbOF07dGhpcy5PdT10aGlzLmFbOV07dGhpcy5UbD10aGlzLmFbM107dGhpcy5ibz10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVsxXX1jLlZsPWI7Yi5wcm90b3R5cGU9e3VoOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52aDp0aGlzLiRwKGEpfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXE6dGhpcy5qayhhKX0sams6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmtrOnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lcTp0aGlzLk51KGEpfSxOdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT3U6dGhpcy5TbChhKX0sU2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRsOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ibzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYz1jLlZsfHxlYyxrZD1uZXcgZWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC51aCg0KTsoZnVuY3Rpb24oYyl7Yy5Uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLk8oYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUihhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEs6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LENhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTsKcmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFQ9Yy5Uanx8VDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5YZD0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhkPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGQmJmIhPXRoaXMuWGR8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS53diksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLAp0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVT1jLlNqfHxVOyhmdW5jdGlvbihjKXtjLlVqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFQoYiksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFUoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9Cm5ldyBUKGIpLGIuamE/dGhpcy5jZygpOnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBVKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgRCxmYz1jLlVqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5uYi5sZW5ndGgpe3ZhciBhPW0ubmIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWYuS3MoeyJbTE9BRFNDUklQVF0iOmYucGEoMTApLCJbVVRJTFNdIjpmLnBhKDEwKSwiW0NBTExCQUNLXSI6Zi5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWYuTWYuYmluZChmKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSlrW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOylmLk1mKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sCm0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSG09dGhpcy5hWzFdO3RoaXMuVnI9dGhpcy5hWzddO3RoaXMuUmo9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbOF19Yy5Jcj1iO2IucHJvdG90eXBlPXtHbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSG06dGhpcy5VcihhKX0sVXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wcjp0aGlzLlFqKGEpfSxRajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUmo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYz1jLklyfHxoYyxsZD1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1sZC5HbSg0KTsKKGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLk8oYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5SKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5ZcT1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sQ3M6ZnVuY3Rpb24oYil7dGhpcy5uZD1ifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWXF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEs6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5KJiZ0aGlzLkooKSx0aGlzLm5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5uZCYmKG5ldyBHKHRoaXMsdGhpcy5uZCkpLmIoKSl9fSl9KShjKTt2YXIgTT1jLkRsfHwKTTsoZnVuY3Rpb24oYyl7Yy5DbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxWYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8KHRoaXMuaGI9MCksdGhpcy5oYisrLDE1PHRoaXMuaGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB0aGlzLk1zKCksITA7dGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5vKCk6dGhpcy5vKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMudmEoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5VKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlU9YSxiLmwoImFkZXJyb3IiLAphKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlV8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5WYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLApmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbzpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz8KdGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHPWMuQ2x8fEc7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMud2E9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBNKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJgp3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQ3ModGhpcy5BKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSCgpfX0pfSkoYyk7dmFyIGljPWMuRWx8fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tcj10aGlzLmFbOV07dGhpcy5UbT10aGlzLmFbMV07dGhpcy5tbz10aGlzLmFbMl07dGhpcy5naz10aGlzLmFbMl07dGhpcy5NbD10aGlzLmFbMV07dGhpcy5LdT10aGlzLmFbN107dGhpcy5xaz10aGlzLmFbMV07dGhpcy5RbT10aGlzLmFbMTBdO3RoaXMuTWc9dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNF19Yy5adD1iO2IucHJvdG90eXBlPXtscjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm1yOnRoaXMuU20oYSl9LApTbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG06dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nazp0aGlzLkxsKGEpfSxMbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWw6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkt1OnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xazp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFtOnRoaXMuTGcoYSl9LExnOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5NZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYz1jLlp0fHxrYyxtZD1uZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQubHIoNCk7KGZ1bmN0aW9uKGMpe2MuT2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuVWU9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuUihhKTp0aGlzLmRhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0UsCntpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLko/KDAsdGhpcy5KKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHt6bjpmdW5jdGlvbihhKXswPGEmJih0aGlzLlVlPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHt6bjpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sSzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIGxjPWMuT2p8fGxjOyhmdW5jdGlvbihjKXtjLk5qPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEF2OmZ1bmN0aW9uKCl7fSxsczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLnVlKG5ldyBmdW5jdGlvbigpe30pO2EuVnU9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHMoYSk7CndpbmRvdy5jdj1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5rc3x8KHRoaXMua3M9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5EZHx8KHRoaXMuRGQ9MSk7aWYoMjA8dGhpcy5EZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5vKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkhhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuRGQrKzsKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxIYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5iZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJgpiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmCihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMudyhiKX19KX0pKGMpO3ZhciBtYz1jLk5qfHxtYzsoZnVuY3Rpb24oYyl7Yy5Qaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IGxjKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5qYXx8dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgbWMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIG5jPWMuUGp8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EdT10aGlzLmFbOV07dGhpcy55bD10aGlzLmFbN107dGhpcy5lbj10aGlzLmFbOF07dGhpcy5kaT10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVsxXX1jLkFuPWI7Yi5wcm90b3R5cGU9e0N1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5EdTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6CnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lbjp0aGlzLmNpKGEpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLkFufHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5DdSg0KTsoZnVuY3Rpb24oYyl7Yy5Maj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpO2EmJnRoaXMuTyhhLnBhcmVudE5vZGUpfSwKSzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgVj1jLkxqfHxWOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLndmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy5GZigpfSxGZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLkhhKCksITA7dGhpcy53ZisrO2lmKDEwPHRoaXMud2YpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5GZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LApXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFc9Yy5Lanx8VzsoZnVuY3Rpb24oYyl7Yy5Naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgVih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFYod2luZG93LnBsYXllciksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgcWM9Yy5Nanx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1yPXRoaXMuYVsxMF07dGhpcy5ZdD10aGlzLmFbOF07dGhpcy5Ebz10aGlzLmFbMTBdO3RoaXMuUmg9dGhpcy5hWzldO3RoaXMuRmo9dGhpcy5hWzZdO3RoaXMueG49dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOF19Yy5SbT1iO2IucHJvdG90eXBlPXtMcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXI6dGhpcy5YdChhKX0sWHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ZdDp0aGlzLkNvKGEpfSxDbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRG86dGhpcy5RaChhKX0sUWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlJoOnRoaXMuRWooYSl9LEVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gajp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLlJtfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC5Mcig0KTsoZnVuY3Rpb24oYyl7Yy5BaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8KKHRoaXMuTyhiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlIoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sSzpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPWMuQWl8fHRjOyhmdW5jdGlvbihjKXtjLnppPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IiwKZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMubygpKX0sdGVzdDpmdW5jdGlvbigpe30sCm86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMueml8fHVjOyhmdW5jdGlvbihjKXtjLkJpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxmLkRhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdGMoZCksZC5qYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgdWMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5IKCl9fSl9KShjKTsKdmFyIHZjPWMuQml8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Iaj10aGlzLmFbMTBdO3RoaXMuUnA9dGhpcy5hWzddO3RoaXMucnE9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzldO3RoaXMuS2k9dGhpcy5hWzRdO3RoaXMuSnQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbOF19Yy5SdT1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGo6dGhpcy5RcChhKX0sUXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlJwOnRoaXMucXEoYSl9LHFxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ycTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZmw6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuSXQoYSl9LEl0OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnQ6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLlJ1fHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5Haig0KTsoZnVuY3Rpb24oYyl7Yy5IaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuTyhiKSx0aGlzLlIoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoiYmxvY2siKX0sSzpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5IaXx8eWM7KGZ1bmN0aW9uKGMpe2MuR2k9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuUGUoKX0sUGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBlKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciB6Yz1jLkdpfHx6YzsoZnVuY3Rpb24oYyl7Yy5JaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgeWMod2luZG93LiQoImRpdiNnYW1lIikpOwppZihiLmphKXt0aGlzLkgoKTtyZXR1cm59aWYoIXRoaXMuSShiKSl7dGhpcy5MKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5IKCk7cmV0dXJufX10aGlzLkgoKX19KX0pKGMpO3ZhciBBYz1jLklpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHQ9dGhpcy5hWzZdO3RoaXMuZm09dGhpcy5hWzRdO3RoaXMud289dGhpcy5hWzRdO3RoaXMucGo9dGhpcy5hWzldO3RoaXMuRms9dGhpcy5hWzFdO3RoaXMuY2w9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzZdO3RoaXMuWG49dGhpcy5hWzNdO3RoaXMuYmk9dGhpcy5hWzRdO3RoaXMuZz10aGlzLmFbNV19Yy5YaT1iO2IucHJvdG90eXBlPXtHdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHQ6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZtOnRoaXMudm8oYSl9LAp2bzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMud286dGhpcy5vaihhKX0sb2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBqOnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gazp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY2w6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZoOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ybjp0aGlzLmFpKGEpfSxhaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5YaXx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuR3QoNCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkhmPXRoaXMuS2Y9dGhpcy5KZj0hMTt0aGlzLlVjPVtdO3RoaXMuJGQ9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBIYT9udWxsOkhhLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2E/bnVsbDpDYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJhP251bGw6UmEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBXYT9udWxsOldhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHNhP251bGw6c2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjPwpudWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB3Yj9udWxsOndiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj8KbnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBNYT9udWxsOk1hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIG5hP251bGw6bmF9fWMuT2s9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5rcChhKTpbXSxiO3RoaXMuS2Y9ITA7aWYoYS5sZW5ndGgpe3RoaXMuSmY9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuZGcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLiRkKXtpZih0aGlzLkhmKWJyZWFrO2I9dGhpcy4kZFtjXTt0aGlzLm9lKGIpJiYodGhpcy5VYy5wdXNoKGIpLHRoaXMuZGcoYikpfX0sb2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxrcDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz0KYVtlXSxjPXRoaXMuJGRbY10sdGhpcy5vZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxkZzpmdW5jdGlvbihhKXt0aGlzLm9lKGEpJiZhLmIoKX0sWXM6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLkpmKWZvcih0aGlzLkhmPSEwLGE9MDthPHRoaXMuVWMubGVuZ3RoO2ErKyl0aGlzLlVjW2FdLnFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVWNbYV0ucWIpfX19KShjKTt2YXIgRGM9Yy5Pa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnI9dGhpcy5hWzZdO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLlpuPXRoaXMuYVszXTt0aGlzLlhxPXRoaXMuYVsxXTt0aGlzLkRrPXRoaXMuYVs4XTt0aGlzLm9vPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVsxMF19Yy50aD1iO2IucHJvdG90eXBlPXtRcjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlJyOnRoaXMuTXAoYSl9LE1wOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5OcDp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm46dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhxOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLm5vKGEpfSxubzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMub286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBFYz1jLnRofHxFYyxyZD1uZXcgRWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1yZC5Rcig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9CmMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGYuVGIobC5UdCksZi50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGYuVGIobC5hciksZi50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgc2Q9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSwKYmE9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEY9bmV3IGdhLGs9ITE7Ri5NYygpO0YuQmYoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLk1jKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5CZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuTWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtmLmZpcmVFdmVudCh3aW5kb3csRi5icSgpLHtpZDp0ZH0pfSw1MDApO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXU9dGhpcy5hWzJdO3RoaXMudnE9dGhpcy5hWzJdO3RoaXMub2k9dGhpcy5hWzVdO3RoaXMuVXE9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbMl19Yy51dD1iO2IucHJvdG90eXBlPXskdDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmF1OnRoaXMudXEoYSl9LHVxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52cTp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMub2k6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VcTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMudXR8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLiR0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5aZj10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuUGM9MDt0aGlzLkxhPSIiO3RoaXMuVmM9W107dGhpcy5XYz0wO3RoaXMuJGY9ITE7dGhpcy5ZZD1bXX1jLk5nPWI7Yi5wcm90b3R5cGU9e0pzOmZ1bmN0aW9uKGEpe3RoaXMuWmY9CmF9LFljOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5MYT10aGlzLnBsYXllci5LKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXM6ZnVuY3Rpb24oYSl7dGhpcy5VYT1hfSxEczpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLkxhXSYmdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSxiYzpmdW5jdGlvbihhLGIpe2YuaWIoIndlbHQuZGUiKSYmZi5ZYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuVWEpO3ZhciBjPSExLGU9ITE7aWYodGhpcy5mcSgpKXRoaXMuVWEuYyh0aGlzLlVhLkpjLHRoaXMuVWEuemEsdGhpcy5VYS5aZCxmdW5jdGlvbigpe3RoaXMuYmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkJjKTtlbHNlIGlmKHRoaXMuQXAoKSl0aGlzLnZzKGZ1bmN0aW9uKCl7dGhpcy5iYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5EKGwueWMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuJHMoKTtrLmV4aXRGdWxsc2NyZWVuKCk7UT1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLmdnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLk5xKGEpOwoiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSGQmJihjPXRoaXMucGxheWVyLkhkKCkpO2guYWRTdGFydFRpbWVvdXQmJihlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtrLkpkKGEsYyxlKTt0aGlzLnBsYXllci5oZyhrKX19LGZxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuUGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5QYy5nZXRUaW1lKCksdGhpcy5QYz1hLDNFNTxiPyEwOiExO3RoaXMuUGM9YTtyZXR1cm4hMX0sUnM6ZnVuY3Rpb24oKXtmLmVlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuYWYoYSkpP3RoaXMuYmMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5EKGwuemMsdGhpcy5wbGF5ZXIuQigpKSl9LApRczpmdW5jdGlvbihhKXtmLmVlKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlpmKXt0aGlzLkpzKCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLmFmKGMpKT90aGlzLmJjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxmLkQobC56Yyx0aGlzLnBsYXllci5CKCkpKX19LGFmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxuczpmdW5jdGlvbigpe3RoaXMucGxheWVyLk9zKHRoaXMuUXMuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sJGM6ZnVuY3Rpb24oYSl7Zi5lZSgibWlkcm9sbCIpO2lmKCF0aGlzLk9mKXt0aGlzLk9mPSEwO3ZhciBiPQp0aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5iYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZj0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGYuRChsLnpjLHRoaXMucGxheWVyLkIoKSkpfX0sbXM6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Jcyh0aGlzLiRjLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5kKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLlJzKCk7dGhpcy5wbGF5ZXIuTmQmJnRoaXMubXMoKTt0aGlzLm5zKCl9LG9zOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuVmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihmKXt0aGlzLkl1KGEsCmIsYyxnLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuV2M9dGhpcy5WYy5sZW5ndGh9LEFwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLldjJiYoYT0hMCk7cmV0dXJuIGF9LHZzOmZ1bmN0aW9uKGEpe3RoaXMuJGY9YTtmb3IoYT0wO2E8dGhpcy5WYy5sZW5ndGg7YSsrKXRoaXMuVmNbYV1bImZ1bmN0aW9uIl0odGhpcy5kcy5iaW5kKHRoaXMpKX0sZHM6ZnVuY3Rpb24oYSl7dGhpcy5XYy0tO2EmJnRoaXMuWWQucHVzaChhKTswPj10aGlzLldjJiZ0aGlzLiRmKCl9LE5xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLllkLmxlbmd0aDtjKyspYj10aGlzLllkW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBkYT1jLk5nfHxkYSxRPSExLGphPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ybj10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbNV07dGhpcy5hbj10aGlzLmFbMl07dGhpcy5vbT10aGlzLmFbNl07dGhpcy5Gcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLnRuPWI7Yi5wcm90b3R5cGU9e3FuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucm46dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVzOnRoaXMuJG0oYSl9LCRtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hbjp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub206dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy50bnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLnFuKDQpfSkuY2FsbChQaWV4dXVwaGVoYXBob2hWLFBpZXh1dXBoZWhhcGhvaFYpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
176.9.3.108 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.108.3.9.176.clients.your-server.de
Software
AmazonS3 /
Resource Hash
25d819bf5e7ae2c998690015c6e8958ddceb44dac2497783eb70680c777a7406

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate
Host
ssl.1.damoh.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-type
application/x-www-form-urlencoded
Accept
*/*
Cache-Control
no-cache
Referer
https://www.golem.de/
Connection
keep-alive
Content-Length
87
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Sat, 04 Aug 2018 18:36:41 GMT
Connection
keep-alive
Content-Length
229
Last-Modified
Sat, 04 Aug 2018 14:32:00 GMT
Server
AmazonS3
Etag
"ea0192f51aeefc151385c82c9d9a0348"
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Expose-Headers
X-Homad-Instance, X-Homad-Long-Ad-Ignored, X-Homad-Sig, X-Homad-Url, X-Homad-Vpaid-Ignored, X-Homad-Ad-Id
Cache-Control
no-cache, no-store
Access-Control-Allow-Credentials
true
X-Homad-Instance
de4-homad-5
X-Homad-Url
http://homad-global-configs-eu-fra.schneevonmorgen.com.s3.amazonaws.com/www.golem.de/config.json
Accept-Ranges
bytes
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Expires
0
ads
securepubads.g.doubleclick.net/gampad/
24 KB
7 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1358082632807747&correlator=44177517017974&output=json_html&callback=googletag.impl.pubads.callbackProxy5&impl=fif&adsid=NT&eid=21062383%2C21062229&vrg=237&guci=1.2.0.0.2.2.0&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=300x300%7C300x600%7C300x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile8%2Cvis55801%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D8%26m_mv%3D70%2C60%2C50%2C40%2C30%2C20%2C10%26m_gv%3D60%2C50%2C40%2C30%2C20%2C10&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe&cookie_enabled=1&bc=7&abxe=1&lmt=1533407801&dt=1533407801792&frm=20&biw=1585&bih=1200&oid=3&adx=993&ady=868&adk=767446483&gut=v2&ifi=9&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.golem.de%2F&dssz=88&icsg=1583297448644544&mso=32&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=300x671&msz=300x300&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=139286814&ga_fc=true
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
Protocol
SPDY
Server
172.217.22.66 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
cafe /
Resource Hash
ef17b586a6d93ed703c8f3c1886787ffeee59b66420c382951201361c6779b02
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Sat, 04 Aug 2018 18:36:42 GMT
content-encoding
gzip
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
6625
x-xss-protection
1; mode=block
google-lineitem-id
4550222765
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
85376452645
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
https://www.golem.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
ads
securepubads.g.doubleclick.net/gampad/
23 KB
6 KB
XHR
General
Full URL
https://securepubads.g.doubleclick.net/gampad/ads?gdfp_req=1&pvsid=1358082632807747&correlator=44177517017974&output=json_html&callback=googletag.impl.pubads.callbackProxy6&impl=fif&adsid=NT&eid=21062383%2C21062229&vrg=237&guci=1.2.0.0.2.2.0&sc=1&sfv=1-0-29&iu=%2F183%2Fgolem%2Fhomepage&sz=1000x500%7C1000x333%7C1000x250%7C1000x167%7C1000x125%7C1000x100%7C970x90%7C800x250%7C970x250%7C970x90%7C800x250&scp=kw%3Dgolem%2Cdigtransform%2Ciqadtile4%2Cvis55801%2Chomepage%2Ctsilkcalb%2Cgolhtml5%2Ciqlive%26res%3D1600x1200%26doc%3Dhomepage%26tile%3D4%26m_mv%3D60%2C50%2C40%2C30%2C20%2C10%26m_gv%3D60%2C50%2C40%2C30%2C20%2C10&cust_params=m_data%3D1%26m_safety%3Dsafe%26m_categories%3Dmoat_safe&cookie_enabled=1&bc=7&abxe=1&lmt=1533407801&dt=1533407801806&frm=20&biw=1585&bih=1200&oid=3&adx=293&ady=1259&adk=1192895965&gut=v2&ifi=10&u_his=2&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_sd=1&flash=0&url=https%3A%2F%2Fwww.golem.de%2F&dssz=88&icsg=1583297448644544&mso=32&std=0&vis=1&dmc=8&scr_x=0&scr_y=0&psz=1000x503&msz=1000x500&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=139286814&ga_fc=true
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
Protocol
SPDY
Server
172.217.22.66 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
cafe /
Resource Hash
cfd906b7da0a689f73ffec765f41b30ee93374980ca9613d7950e1ecb73e1f22
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Sat, 04 Aug 2018 18:36:42 GMT
content-encoding
gzip
x-content-type-options
nosniff
google-mediationgroup-id
-2
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
status
200
content-disposition
attachment; filename="f.txt"
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
content-length
6393
x-xss-protection
1; mode=block
google-lineitem-id
4686089258
pragma
no-cache
server
cafe
google-mediationtag-id
-2
google-creative-id
138235188476
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
https://www.golem.de
cache-control
no-cache, must-revalidate
access-control-allow-credentials
true
timing-allow-origin
*
expires
Fri, 01 Jan 1990 00:00:00 GMT
hic_qos
ssl.1.damoh.golem.de/
24 B
281 B
Script
General
Full URL
https://ssl.1.damoh.golem.de/hic_qos?adv_partner&_werbebanner_
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFBpZXh1dXBoZWhhcGhvaFY9UGlleHV1cGhlaGFwaG9oVnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBYKCl7eS5TZHx8KHkuU2Q9MCk7eS5TZCsrO3dpbmRvdy52aWRlb3BrZ0ludGVyZmFjZSE9eS52aWRlb3BrZ0ludGVyZmFjZSYmKHdpbmRvdy52aWRlb3BrZ0ludGVyZmFjZT15LnZpZGVvcGtnSW50ZXJmYWNlKTsxMD55LlNkJiZ3aW5kb3cuc2V0VGltZW91dChYLDUwMCl9ZnVuY3Rpb24gQSgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLEEpO1k9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIFooKXt2YXIgYz13aW5kb3cuT087Y3x8KGM9d2luZG93LmpPT1BsYXllcl8wKTtyZXR1cm4gY31mdW5jdGlvbiBhYSgpe2lmKGspe2sucGF1c2VCdXR0b258fChrLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwprLnBsYXlCdXR0b258fChrLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLm11dGVCdXR0b258fChrLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnVubXV0ZUJ1dHRvbnx8KGsudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmsuc2tpcGFibGVCdXR0b258fChrLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjY7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpOwprLnNraXBCdXR0b258fChrLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSIpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYoay5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtrLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2E9YS51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2YuWWEoYSxiLFtdLGMsYyxtKX0pfW0uYyhrLmdsb2JhbENvbmZpZyxrLmNsaWVudENvbmZpZyxrLnByZWNoZWNrZWQsay5vblJlYWR5LGsub25GYWlsdXJlLGspO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBiPWsuc3RhcnRQbGF5ZXI7YiYmImZ1bmN0aW9uIj09PXR5cGVvZiBiJiZiKCl9ZWxzZSBiYShhYSw1MCl9ZnVuY3Rpb24gY2EoYyxiKXtifHwoYj0icHJlIik7aWYoayYmbSl7Yy5wYXVzZSgpO3ZhciBhPW5ldyBOKGMpLGE9bmV3IE8oYSxtKSxnPWsuYWRUYWc7InByZSI9PWImJmsucHJlcm9sbEFkVGFnJiYoZz1rLnByZXJvbGxBZFRhZyk7InBvc3QiPT1iJiZrLnBvc3Ryb2xsQWRUYWcmJihnPWsucG9zdHJvbGxBZFRhZyk7CmcmJihhLmdnKGspLGEuSmQoZykpfWVsc2UgYmEoZnVuY3Rpb24oKXtjYShjKX0uYmluZCh0aGlzKSw1MCl9ZnVuY3Rpb24gcShjLGIpeyhrLmFkVGFnfHxrLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLkQobC55YyxjLkIoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmYudHJhY2soImFjdGl2YXRlZEF0IixhKX1rJiZtPyhiP20ub2E9ITA6Zi50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCksYT1uZXcgZGEsYS5ZYyhjKSxhLkVzKG0pLGEuRHMoayksYS5vcygpLGEuYigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWG09dGhpcy5hWzFdO3RoaXMuZWs9dGhpcy5hWzddO3RoaXMuTXE9dGhpcy5hWzZdO3RoaXMuc2s9dGhpcy5hWzVdOwp0aGlzLmc9dGhpcy5hWzZdfWMudXU9YjtiLnByb3RvdHlwZT17V206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhtOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lazp0aGlzLkxxKGEpfSxMcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTXE6dGhpcy5yayhhKX0scms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnNrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgZWE9Yy51dXx8ZWEsSGM9bmV3IGVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SGMuV20oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuRWE9InNldHVwIjt0aGlzLmRjPVtdO3RoaXMuU2UoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5jcy5iaW5kKHRoaXMpKX0KYy5TaT1iO2IucHJvdG90eXBlPXtTZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxGbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEucG9zdE1lc3NhZ2UoYiwiKiIpfSxHYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sY3M6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuYnMoYS5kYXRhKX0sYnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQowO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0scmQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sRG06ZnVuY3Rpb24oYSxiKXswPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmxhLnVybHNbYV09Yjt0aGlzLmxhLnVybHNbYl09YTt0aGlzLmxhLmhvbWFkVXJsc1thXT1iO3RoaXMubGEub3JpZ2luYWxVcmxzW2JdPWF9LGJmOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMubGEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmxhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LCRhOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO2Zvcih2YXIgZD0wO2Q8dGhpcy5sYS5lcnJtc2cubGVuZ3RoO2QrKyliKz0iXG4iK3RoaXMubGEuZXJybXNnW2RdO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrCmEsYiwhMCl9LERhOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0saGY6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFhzOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LERmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD0KYS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEVmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxlPTAsYz0wLGg9MCxmPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIHU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighdSlyZXR1cm4hMTtjPXUuaGVpZ2h0KnUud2lkdGg7ZD11LndpZHRoO2U9dS5oZWlnaHQ7MD51LnRvcCYmKGUrPXUudG9wKTt1LmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGUtPXUuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD51LmxlZnQmJihkKz11LmxlZnQpO3UucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09dS5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZSYmKGU9MCk7MD5kJiYoZD0wKTswPGMmJihoPTEwMC9jKmQqZSk7aD49YiYmKGY9ITApO3JldHVybiBmfSxrYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPwo2NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEJkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxlO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWU9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZSxifD0wO3JldHVybiBifSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZTtmb3IoZD03OzA8PWQ7ZC0tKWU9YT4+PjQqZCYxNSxnKz1lLnRvU3RyaW5nKDE2KTtyZXR1cm4gZ31mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsYyxoPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsdT00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixJPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbixsLHcscSxyO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGU9MDtlPG4tMztlKz00KWM9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsKMSk8PDE2fGEuY2hhckNvZGVBdChlKzIpPDw4fGEuY2hhckNvZGVBdChlKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChlKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT1wW2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09ZChoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtjPWY7bj11O2w9azt3PUk7cT1tO2ZvcihlPQowOzE5Pj1lO2UrKylyPWQoYyw1KSsobiZsfH5uJncpK3EraFtlXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZT0yMDszOT49ZTtlKyspcj1kKGMsNSkrKG5ebF53KStxK2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGU9NDA7NTk+PWU7ZSsrKXI9ZChjLDUpKyhuJmx8biZ3fGwmdykrcStoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihlPTYwOzc5Pj1lO2UrKylyPWQoYyw1KSsobl5sXncpK3EraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmPWYrYyY0Mjk0OTY3Mjk1O3U9dStuJjQyOTQ5NjcyOTU7az1rK2wmNDI5NDk2NzI5NTtJPUkrdyY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZikrYih1KStiKGspK2IoSSkrYihtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQoiIixkLGUsYyxoLGYsdSxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxlPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8ZT4+NCxmPShlJjE1KTw8MnxjPj42LHU9YyY2Myxpc05hTihlKT9mPXU9NjQ6aXNOYU4oYykmJih1PTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZikrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQodSk7cmV0dXJuIGJ9LG5xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJgotMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LFdlOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGU9ITEsYz0hMSxoPSExLGY9ITEsdT0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7ZT13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5zbj8hMDohMX1jYXRjaChyKXt9dHJ5e2M9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLHU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksCms9IXUmJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZTthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZjthLmlzSUU9dTthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9bTtyZXR1cm4gYX0sWG86ZnVuY3Rpb24oKXt2YXIgYT0iVSIsYj10aGlzLldlKCk7Yi5pc1BoYW50b21KUz9hPSJIUCI6Yi5pc0Nocm9tZUhlYWRsZXNzP2E9IkhDIjpiLmlzRmlyZWZveEhlYWRsZXNzP2E9IkhGIjooYi5pc0JsaW5rJiYoYT0iQiIpLGIuaXNPcGVyYSYmKGE9Ik8iKSxiLmlzRmlyZWZveCYmKGE9IkYiKSxiLmlzU2FmYXJpJiYoYT0iUyIpLGIuaXNJRSYmKGE9IkkiKSxiLmlzRWRnZSYmKGE9IkUiKSxiLmlzQ2hyb21lJiYoYT0iQyIpKTtyZXR1cm4gYX0sWGE6ZnVuY3Rpb24oKXt2YXIgYT17b2g6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sCkNoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LENwOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHlrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LFVsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxrbjpmdW5jdGlvbigpe3JldHVybiBhLm9oKCl8fGEuQ2goKXx8YS5DcCgpfHxhLnlrKCl8fGEuVWwoKX19O3JldHVybiBhLmtuKCl9LEthOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGU9MTQ7ZS0tOylkW2JbZV1dPWFbZV18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxlPTAsYz1hLmxlbmd0aDtlPGM7KytlKWIuaGFzT3duUHJvcGVydHkoYVtlXSl8fChkLnB1c2goYVtlXSksYlthW2VdXT0xKTtyZXR1cm4gZH0sb2Y6ZnVuY3Rpb24oYSl7YT10aGlzLkthKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0saWI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sVW46ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZT1bXSxjPTA7YzxiLmxlbmd0aDtjKyspZFtiW2NdXT0hMDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWRbYVtjXV18fGUucHVzaChhW2NdKTtyZXR1cm4gZX0sVnM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxlPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGU9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZSk6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxlZjpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMueGcoYikrIjoiK3RoaXMueGcoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3JldHVybiAxMD4KYT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZWU6ZnVuY3Rpb24oYSl7dGhpcy5FYT1hfSxmaXJlRXZlbnQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlO2Quc3RhdGU9dGhpcy5FYTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9lPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGUuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChlKX0sVGI6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLmZpcmVFdmVudChkLGIsYSl9LEQ6ZnVuY3Rpb24oYSxiLGQsZSxjKXt2YXIgaD1hO2QmJmImJihiPWwuRmMoYixkKSk7YiYmKGg9bC5GYyhhLGIpKTtlJiYoaD1sLkZjKGgsZSkpO2MmJihoPWwuRmMoaCxjKSk7Zi5UYihoKX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgZT1tLmFlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTttLlRhKGUsITApO2U9bS5UYShlLCEwKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtlLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2UuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkZhKGUsZnVuY3Rpb24oZCl7dmFyIGU9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGU9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGU9ITEpfWNhdGNoKGMpe31lfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwKKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LEtkOmZ1bmN0aW9uKCl7bSYmbS5ZP20uaXNFbmFibGVkJiZtLkVuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktkKCl9LmJpbmQodGhpcyksNTAwKX0seW46ZnVuY3Rpb24oYSxiKXtpZihiLk9jKGEpfHwiYWJvdXQ6YmxhbmsiPT1hfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5lZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy4kYSgiZXJyX3VybCIsYSk7aWYodGhpcy5iZihhKSlyZXR1cm4gdGhpcy5iZihhKTt2YXIgZD17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtkLmhvbWFkX3VybF9zdWZmaXg9CmE7ZC5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGEpO2QuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtkLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dmFyIGU9ITEsYz0hMSxjPXRoaXMuWWEoYSxiLnVhLGQsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1jKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goaCl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLkxjKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLkRtKGUsYSk7cmV0dXJuIGV9LFlhOmZ1bmN0aW9uKGEsYixkLGUsYyxoLGYsdSl7dmFyIGs9aHx8bTtoPSEwO3UmJihoPSExKTtpZihrJiZrLlkpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChsKXtjKGwpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLlRhKGEsaCk7aD1rLlRhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7aC5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciBxIGluIGQpaC5kYXRhW3FdPWRbcV07cmV0dXJuIGsuRmEoaCxlLGMsIiIsIiIsZil9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGUsYyxrLGYsdSl9LmJpbmQodGhpcyksNTAwKX0sR3E6ZnVuY3Rpb24oYSxiLGQsZSxjLGgsZil7dmFyIHU9ITA7ZiYmKHU9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zj1kO2Q9IiI7Zm9yKHZhciBrIGluIGYpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChmW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFlfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGUobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsdSksbC53aXRoQ3JlZGVudGlhbHM9aCwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LEhxOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkdxKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLmRjKWZvcih2YXIgYyBpbiB0aGlzLmRjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuZGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LE1mOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWWEoYSxlLnVhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5IcShlLkxjKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGUsITApfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYz1hfSxJdTpmdW5jdGlvbihhLGIsZCxlLGMpe3RoaXMuWWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzplfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86ZX0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9KX0sbG46ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxqcTpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspaWYoYltlXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFA9Yy5TaXx8UDtuZXcgUDt2YXIgZj1uZXcgUDt3aW5kb3cuZnY9ZjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5SaT1iO2IuRmM9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxlO2ZvcihlIGluIGIpZFtlXT1iW2VdO2ZvcihlIGluIGEpZFtlXT1hW2VdO3JldHVybiBkfTtiLk5yPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLiRxPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5zdT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLnhvPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuR3U9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53bT17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5xbT17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IudG09e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IueW09e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLnBtPXtjb2RlOiIxMDA5IiwKdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5ybT17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld0PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5acT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55bz17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQnU9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTG49e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Rbj17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IiwKbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLnpjPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IueWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLnZtPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi51bT17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWU9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLkhlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLnptPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07CmIuc209e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLlR0PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuYXI9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgbD1jLlJpfHxsO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxoPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuUms9YjtiLnByb3RvdHlwZT17a2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGZhPWMuUmt8fGZhLEpjPW5ldyBmYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUpjLmtoKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuVGk9YjtiLnByb3RvdHlwZT17QmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGUsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKyllPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2UsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sZnA6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLnZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sR2M6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkdjKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuR2MoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD0KYS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sTWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuR2MoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWMoKSsiMiJ9LEJmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmQodGhpcy5mcCgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLkdjKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgZ2E9Yy5UaXx8Z2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlFxPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzJdfWMuJG49YjtiLnByb3RvdHlwZT17UHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy4kbnx8aGEsS2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9S2MuUHEoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZT1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZyllW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT8KZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGU9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGV9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGUuYz9lLmhhc093blByb3BlcnR5KCJpbml0Iik/ZS5jOmZ1bmN0aW9uKCl7ZC5jLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWU7ZS5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLnVlPWJ9KShjKTt2YXIgSj1jLnVlfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRoPXRoaXMuYVs3XTt0aGlzLnhyPXRoaXMuYVs1XTt0aGlzLlBvPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs3XTt0aGlzLnRyPXRoaXMuYVs3XTt0aGlzLkxrPXRoaXMuYVs1XTt0aGlzLmZpPQp0aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLlJxPWI7Yi5wcm90b3R5cGU9e1poOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kaDp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHI6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBvOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucG46dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnRyOnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Mazp0aGlzLmVpKGEpfSxlaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYT1jLlJxfHxpYSxMYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuWmgoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Oaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPXt9O3RoaXMuQT1udWxsO3RoaXMuYWM9MTAwO3RoaXMubGI9MDt0aGlzLndhPTE1MDt0aGlzLnFiPTA7dGhpcy5GcyhiKX0sYjpmdW5jdGlvbigpe30sSDpmdW5jdGlvbigpe3RoaXMubGI8PXRoaXMud2E/KHRoaXMubGIrKyx0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKTowPnRoaXMud2EmJih0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKX0scnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYj50aGlzLndhPyEwOiExfSxjZzpmdW5jdGlvbigpe3RoaXMubGI9MH0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEw6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmZiKCldPQpiO0smJksuS2YmJksuWXMoYil9LG52OmZ1bmN0aW9uKCl7cmV0dXJuIGYuRGEodGhpcy54YSl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueGEpaWYoYT09dGhpcy54YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy54YVtiLmZiKCldPyEwOiExfSxtcTpmdW5jdGlvbihiKXtiPWIuQ2EoKTtmb3IodmFyIGEgaW4gdGhpcy54YSlpZihiLmlkPT10aGlzLnhhW2FdLkNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LEJ2OmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMuTmt8fHI7KGZ1bmN0aW9uKGMpe2MuUGs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5hYz0xMDt0aGlzLmxiPTA7dGhpcy53YT01MDt0aGlzLko9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLlllPSExO3RoaXMuTigpfSwKSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7fSxPczpmdW5jdGlvbihiKXt0aGlzLko9Yn0sb3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KfSxJczpmdW5jdGlvbihiKXt0aGlzLk9kPWJ9LG12OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2R9LE5kOmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YSYmKHRoaXMubGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmFjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSwKZ2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5DYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sZmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxDdjpmdW5jdGlvbigpe30sUjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5CcCgpfHx0aGlzLkFtKCk7dGhpcy5mZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LHB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEFtOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixmLnBhKDEwKSl9LEJwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxPOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LENhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxOYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0samI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdnY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sZGE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxXYTpmdW5jdGlvbigpe3JldHVybiExfSxIZDpmdW5jdGlvbigpe3JldHVybiExfSxoZzpmdW5jdGlvbihiKXt0aGlzLmdiPWJ9LGx2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LHFzOmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxydjpmdW5jdGlvbigpe3ZhciBiPQohMTt0aGlzLmdiJiYoYj0hMCk7cmV0dXJuIGJ9LHh2OmZ1bmN0aW9uKCl7dGhpcy5ZZXx8KHRoaXMuWWU9ITApfSxIYzpmdW5jdGlvbigpe3JldHVybiExfSxpdjpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5Qa3x8cDsoZnVuY3Rpb24oYyl7Yy5PZz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuQT10aGlzLnBsYXllcj0iIjt0aGlzLkRlPSIxIjt0aGlzLkVlPSIyIjt0aGlzLmptPSIzIjt0aGlzLmljPTA7dGhpcy5QZj0zMDt0aGlzLnRiPVtdO3RoaXMuT2E9W107dGhpcy5MYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5LZT10aGlzLkJnPSExO3RoaXMuc3RhdHVzPXRoaXMuaWM7dGhpcy5pZD1mLnBhKDEwKTt0aGlzLlljKGIpOwp0aGlzLkdzKGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuQmd8fCh0aGlzLkJnPSEwLGYuS2QoKSl9LFJkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LKCk7USYmUS5ZYiYmIWphJiYoamE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdzpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLkxzKCksdGhpcy5BKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy50ZygpLHRoaXMuS2U9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LGw6ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnRiLnB1c2goYiksdGhpcy5PYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnRiJiYwPHRoaXMudGIubGVuZ3RoJiYodGhpcy50Yj1mLnVuaXF1ZSh0aGlzLnRiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsCnRoaXMudGIuam9pbigiLCIpKSk7aWYodGhpcy5PYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLk9hLmxlbmd0aDtnKyspdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl09PXRoaXMuTGJbYl0mJmEucHVzaCh0aGlzLk9hW2ddLmRldGFpbCksdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl08dGhpcy5MYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuT2FbZ10uZGV0YWlsKSxiPXRoaXMuT2FbZ10ucmVhc29uKTt0aGlzLkxiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9Zi51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sbTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGV9LExzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5FZX0sTXM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmptfSxDYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPQp0aGlzLmljfSxGZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5EZX0sWHU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuRWV9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmljfSxZYzpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEdzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEtxOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5PZ3x8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GaT10aGlzLmFbNV07dGhpcy5jdD10aGlzLmFbNV07dGhpcy5Eaj10aGlzLmFbOF07dGhpcy4kbD10aGlzLmFbN107dGhpcy5ndD10aGlzLmFbMTBdO3RoaXMuY3I9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19CmMuUGc9YjtiLnByb3RvdHlwZT17RWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZpOnRoaXMuYnQoYSl9LGJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdDp0aGlzLkNqKGEpfSxDajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGo6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRsOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ndDp0aGlzLmJyKGEpfSxicjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYT1jLlBnfHxrYSxNYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5FaSg0KTsoZnVuY3Rpb24oYyl7Yy5OaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5KJiZ0aGlzLkooKX0sSzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgUj1jLk5ofHxSOyhmdW5jdGlvbihjKXtjLk1oPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5nZD1udWxsO3RoaXMuaHU9MUUzO3RoaXMuV2Y9Cm51bGw7dGhpcy52dD0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuc24pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Jby5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMueHAuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy53cChhLGIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMua3UoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLmx1KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMudnAoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLk9uKGEpfS5iaW5kKHRoaXMpKX0sCk9uOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sa3U6ZnVuY3Rpb24oYil7dGhpcy5nZHx8KHRoaXMuZ2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm11KGIpfS5iaW5kKHRoaXMpLHRoaXMuaHUpKX0sbXU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZ2QpO3RoaXMudygpfSxsdTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5nZCl9LHZwOmZ1bmN0aW9uKGIpe3RoaXMuZHYoYik7dGhpcy5XZj1uZXcgRGF0ZTt0aGlzLldmLXRoaXMuWHI8dGhpcy52dD90aGlzLncoKTp0aGlzLm0oKX0seHA6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5ZYyhuZXcgUihhKSkpO3RoaXMudygpfSxJbzpmdW5jdGlvbigpe30sd3A6ZnVuY3Rpb24oKXt0aGlzLlhyPW5ldyBEYXRlfX0pfSkoYyk7dmFyIGxhPWMuTWh8fGxhOyhmdW5jdGlvbihjKXtjLk9oPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxmLkRhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFIoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgbGEoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkgoKX19fSl9KShjKTt2YXIgbWE9Yy5PaHx8bWEsbmE9bmV3IG1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnd1PXRoaXMuYVs5XTt0aGlzLlRvPXRoaXMuYVs5XTt0aGlzLkdwPXRoaXMuYVs4XTt0aGlzLmJoPXRoaXMuYVsyXTt0aGlzLmhpPXRoaXMuYVs4XTt0aGlzLkR0PXRoaXMuYVszXTt0aGlzLlR1PXRoaXMuYVs5XTsKdGhpcy5Ucj10aGlzLmFbNV07dGhpcy5mcz10aGlzLmFbNV07dGhpcy5Iaz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxXX1jLkh1PWI7Yi5wcm90b3R5cGU9e3Z1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53dTp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVG86dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdwOnRoaXMuYWgoYSl9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5iaDp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaGk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkR0OnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5UdTp0aGlzLlNyKGEpfSxTcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHI6dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZzOnRoaXMuR2soYSl9LApHazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgb2E9Yy5IdXx8b2EsTmM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMudnUoNCk7KGZ1bmN0aW9uKGMpe2Mucmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdLHRoaXMubHE9ITApO3RoaXMuUihhKTsKdGhpcy5SZigpO3RoaXMuUG49ITF9LFJmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYSgpLGE9dGhpcy52aWRlb1RhZyxnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtpZihnKXtpZigiT0JKRUNUIj09Zy5ub2RlTmFtZXx8IlZJREVPIj09Zy5ub2RlTmFtZSlnPWcucGFyZW50Tm9kZTtnIT1iJiZ0aGlzLk8oZyk7Yj1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2lmKCFiKWI9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF07ZWxzZSBpZih0aGlzLmxxKXt0aGlzLmtxPSEwO3JldHVybn1iJiZiIT1hJiZ0aGlzLlIoYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl9LmJpbmQodGhpcyksNTApfX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihrLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllciwKY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcykpfSxOZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLiRjKGEpfS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpfSwkYzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuT2QmJigwLHRoaXMuT2QpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LApqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxIYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHBhPWMucmp8fHBhOyhmdW5jdGlvbihjKXtjLnFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LENiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5pYzt0aGlzLmlzUGxheWluZz10aGlzLmtjPQohMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmCmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmJiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5iYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMua2M9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkSW1wcmVzc2lvbiIpOwp0aGlzLlJkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5QZiYmIXRoaXMuaGEoKSYmKHRoaXMuYmI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJih0aGlzLkNiKCksdGhpcy5nZXRQbGF5ZXIoKS5Qbj0hMCxrLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2I7YSYmKGEuVGQoKSxhLkFhKCkpfX0uYmluZCh0aGlzKX0pOwppZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5rYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUGYmJiF0aGlzLmhhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMubWMuaW5kZXhPZihhKSYmdGhpcy5tYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5tKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubSgiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMubWMubGVuZ3RoPj10aGlzLnBkJiZ0aGlzLm8oKSl9LEtxOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sbzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKTtmLlhzKGEudmlkZW9UYWcpJiYoYS5rcT90aGlzLm0oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmtjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksNTApKX19KX0pKGMpO3ZhciBxYT1jLnFqfHxxYTsoZnVuY3Rpb24oYyl7Yy5zaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmFwKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07ZHx8KGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2R8fCJPQkpFQ1QiIT1nLm5vZGVOYW1lJiYiVklERU8iIT1nLm5vZGVOYW1lfHwoZD1nKTtpZihkKXt2YXIgZz1uZXcgcGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMubXEoZyl8fCh0aGlzLkwoZyksZz1uZXcgcWEoZyx0aGlzLkEpLApnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGFwOmZ1bmN0aW9uKCl7dmFyIGI9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZi53YihiLmFuY2hvcil9fSl9KShjKTt2YXIgcmE9Yy5zanx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLm5oPXRoaXMuYVsxMF07dGhpcy5yaT10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVs0XX1jLiRnPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50cTp0aGlzLm1oKGEpfSxtaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubmg6dGhpcy5waShhKX0scGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5yaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIHRhPWMuJGd8fHRhLE9jPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLnNxKDQpOyhmdW5jdGlvbihjKXtjLlhsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuTyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5SKGIpOnRoaXMuSCgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB1YT1jLlhsfHx1YTsoZnVuY3Rpb24oYyl7Yy5XbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm0oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5vKCkpfSxvOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgdmE9Yy5XbHx8dmE7KGZ1bmN0aW9uKGMpe2MuWWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8Zi5EYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgdWEoZyksdGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgdmEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgd2E9Yy5ZbHx8d2EseGE9bmV3IHdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zdD10aGlzLmFbMl07dGhpcy51bz10aGlzLmFbOF07dGhpcy5XZz10aGlzLmFbOV07dGhpcy5GdD10aGlzLmFbOV07dGhpcy5BdT10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs3XX1jLlVvPWI7Yi5wcm90b3R5cGU9e3J0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLnRvKGEpfSx0bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudW86dGhpcy5WZyhhKX0sVmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldnOnRoaXMuRXQoYSl9LEV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GdDp0aGlzLnp1KGEpfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgeWE9Yy5Vb3x8eWEsUGM9bmV3IHlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLnJ0KDQpOyhmdW5jdGlvbihjKXtjLkpsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLk8oYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUihiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sSzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnBiKGIpfS5iaW5kKHRoaXMpKX0scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkomJnRoaXMuSigpfSxOYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5leGl0RnVsbHNjcmVlbigpfSwKY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB6YT1jLkpsfHx6YTsoZnVuY3Rpb24oYyl7Yy5JbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy56Zz0hMDt0aGlzLnRkPXRoaXMueWY9ITE7dGhpcy5TZigpO3RoaXMuQm4oKTt0aGlzLkhhKCl9LHl2OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5mYigpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5iYSwiOyIsCnR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5zYToKInVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLmxkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLm1kOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuRj9iLkYubWE6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2Q6InVuZGVmaW5lZFgiLAoiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuYWcpfSxTYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sVmI6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGI9CnRoaXMuU2EoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLlhiKXt2YXIgYj10aGlzLlNhKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWGI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlhiPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWGJ9LGlxOmZ1bmN0aW9uKCl7aWYoIXRoaXMueGYpe3ZhciBiPXRoaXMuU2EoKSxhPXRoaXMuZ3EoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJgoodGhpcy54Zj0hMCl9cmV0dXJuIHRoaXMueGZ9LGdxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5xYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMucWM9ITApO3JldHVybiB0aGlzLnFjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYKKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXt0aGlzLmJlKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxiZTpmdW5jdGlvbigpe3RoaXMudGQ9ITA7dmFyIGI9dGhpcy5rZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2YuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2YuaWIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPQohMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMuTmJ8fCh0aGlzLmwoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLlcoKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksCjIwKX0sanY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlRlJiZiLmFkcyYmKHRoaXMuVGU9Yi5hZHMpO3JldHVybiB0aGlzLlRlfSxCbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuVygpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpOwpiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKX0sVmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDUwKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuaXEoKSl7dmFyIGE9dGhpcy5TYSgpLGc9dGhpcy5WYigpO2EmJmcmJih0aGlzLlNhKCksdGhpcy5WYigpLHRoaXMudGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZD90aGlzLm0oKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5TYSgpfWVsc2UgdGhpcy55Zj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhKCksYj10aGlzLlZiKCk7YSYmIWI/KHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuU2EoKTt0aGlzLlZiKCl9LmJpbmQodGhpcyksMTAwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuVygpKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy55Zj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl9LmJpbmQodGhpcyksNTApfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYKKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LENuOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihiLmFkcyl7aWYodGhpcy5RYiE9Yi5hZHMuc3RhdGUmJih0aGlzLlFiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLlFiKXt0aGlzLm0oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuUWI9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNuKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITA7dGhpcy5tKCJlbXB0eSB2YXN0Iil9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuemc9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuemcsZnVuY3Rpb24oKXt0aGlzLlZlKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApIbjpmdW5jdGlvbigpe3RoaXMudHZ8fCgxMDx0aGlzLml1Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApKToodGhpcy5pdSsrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnBzKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhuKCl9LmJpbmQodGhpcyksNTApKSl9LHBzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLmp1KXt0aGlzLmp1PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrCmEsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBBYT1jLklsfHxBYTsoZnVuY3Rpb24oYyl7Yy5LbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1nKGJbZ10pfWNhdGNoKGQpe310aGlzLkgoKX19LG1nOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYuRGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgemEoYltnXSksYS5qYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBBYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxIOmZ1bmN0aW9uKCl7dGhpcy5xYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmFjKX19KX0pKGMpOwp2YXIgQmE9Yy5LbHx8QmEsQ2E9bmV3IEJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk11PXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzZdfWMuU3M9YjtiLnByb3RvdHlwZT17THU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk11OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgRGE9Yy5Tc3x8RGEsUWM9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuTHUoNCk7KGZ1bmN0aW9uKGMpe2Mudmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpOwpiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuTyhhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe30scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSiYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKToKYi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEVhPWMudmx8fEVhOyhmdW5jdGlvbihjKXtjLnVsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLnpiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmVjPSExO3RoaXMuYmcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9CmIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLm0oKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZWM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy51YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlFlKCk6dGhpcy5tKCl9LHVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlOwphLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMubSgpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5lYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZWM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy51Yy5iaW5kKHRoaXMpLAoxMDApfX0sUWU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuemIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuemImJih0aGlzLnpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lY3x8Cih0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFlLmJpbmQodGhpcyksNTApfX0sYmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5lYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJgp0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZhPWMudWx8fEZhOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBFYSh2aWRlbyk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgRmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIEdhPWMud2x8fEdhLEhhPW5ldyBHYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLmRyPQpiO2IucHJvdG90eXBlPXtiajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgSWE9Yy5kcnx8SWEsUmM9bmV3IElhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuYmooNCk7KGZ1bmN0aW9uKGMpe2MueGg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5RZj1hfSxOOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLlFmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFmKS5wYXJlbnROb2RlO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKSzpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgSmE9Yy54aHx8SmE7KGZ1bmN0aW9uKGMpe2Mud2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIEthPWMud2h8fEthOyhmdW5jdGlvbihjKXtjLnloPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IEphKGQsYSksdGhpcy5JKGQpfHwoZC5MZChhKSx0aGlzLkwoZCksCmQ9bmV3IEthKGQsdGhpcy5BLGcpLGQuTGQoZyksZC5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgTGE9Yy55aHx8TGEsTWE9bmV3IExhKGNhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zaD10aGlzLmFbOF07dGhpcy5Sbz10aGlzLmFbNl07dGhpcy5MdD10aGlzLmFbMV07dGhpcy5Ecj10aGlzLmFbNV07dGhpcy5Qcj10aGlzLmFbNV07dGhpcy53aj10aGlzLmFbN107dGhpcy5qbD10aGlzLmFbOV07dGhpcy5GdT10aGlzLmFbNV07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLmpoPWI7Yi5wcm90b3R5cGU9e3JoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zaDp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm86dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT8KdGhpcy5MdDp0aGlzLkNyKGEpfSxDcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHI6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlByOnRoaXMudmooYSl9LHZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53ajp0aGlzLmlsKGEpfSxpbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamw6dGhpcy5FdShhKX0sRXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GdTp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgTmE9Yy5qaHx8TmEsU2M9bmV3IE5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MucmgoNCk7KGZ1bmN0aW9uKGMpe2MuV2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLk8oYik7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sWGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmMDwkKCJib2R5LmRldmljZV9tb2JpbGUiKS5sZW5ndGgmJihiPSEwKTtyZXR1cm4gYn0sSzpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgT2E9Yy5Xanx8T2E7KGZ1bmN0aW9uKGMpe2MuVmo9CnQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlhhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMubGMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpKTp0aGlzLmxjKCl9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkP2IuYWRDb250ZXh0Ll9hZFJlc3BvbnNlP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpOwp2YXIgUGE9Yy5Wanx8UGE7KGZ1bmN0aW9uKGMpe2MuWGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBPYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFBhKGIsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBRYT1jLlhqfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW09dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVszXTt0aGlzLnFoPXRoaXMuYVsxXTt0aGlzLmlrPXRoaXMuYVszXTt0aGlzLlppPXRoaXMuYVs1XTt0aGlzLkhyPXRoaXMuYVs2XTt0aGlzLkxwPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5uaj0KdGhpcy5hWzNdO3RoaXMuR289dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMl19Yy5CbD1iO2IucHJvdG90eXBlPXtMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTW06dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmV0OnRoaXMucGgoYSl9LHBoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucWg6dGhpcy5oayhhKX0saGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlrOnRoaXMuWWkoYSl9LFlpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5aaTp0aGlzLkdyKGEpfSxHcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHI6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxwOnRoaXMuQXMoYSl9LEFzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQnM6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5qOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuR286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBTYT1jLkJsfHxTYSxUYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5MbSg0KTsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLlVkPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLk8oYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlIoYik6dGhpcy5kYSgpfSxZcjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5ZYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5UZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWQ9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuVWQrKztpZigxMDx0aGlzLlVkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkomJnRoaXMuSigpfX0pfSkoYyk7dmFyIFRhPWMuQWt8fFRhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkVvPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLkVvPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuWXIoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFVhPWMuemt8fFVhOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVGEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkkoYSl8fCh0aGlzLkwoYSksKG5ldyBVYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgVmE9Yy5Ca3x8VmEsV2E9bmV3IFZhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlF0PXRoaXMuYVs4XTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLmppPXRoaXMuYVszXTt0aGlzLmd1PXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzFdfWMudXM9YjtiLnByb3RvdHlwZT17UHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ubDp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuamk6dGhpcy5mdShhKX0sZnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzoKYX19fSkoYyk7dmFyIFhhPWMudXN8fFhhLFVjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVVjLlB0KDQpOyhmdW5jdGlvbihjKXtjLk9pPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5PKGIuZWxlbWVudCk7dGhpcy5SKGIuZWxlbWVudCl9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIFlhPWMuT2l8fFlhOyhmdW5jdGlvbihjKXtjLk5pPQp0LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmRldGFpbCYmIjEwMTAiPT1iLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCl9fSl9KShjKTt2YXIgWmE9Yy5OaXx8WmE7KGZ1bmN0aW9uKGMpe2MuUGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLGZ1bmN0aW9uKGIpe2I9bmV3IFlhKGIuZGV0YWlsKTtiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuQSkpLmIoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciAkYT1jLlBpfHwkYSxhYj1uZXcgJGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWc9dGhpcy5hWzNdO3RoaXMuWHA9dGhpcy5hWzhdO3RoaXMuS2g9dGhpcy5hWzZdO3RoaXMubGk9dGhpcy5hWzhdO3RoaXMuRGk9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzZdO3RoaXMudmk9dGhpcy5hWzhdO3RoaXMuWmo9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbNl19Yy5IcD1iO2IucHJvdG90eXBlPXtUZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWc6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlhwOnRoaXMuSmgoYSl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5LaDp0aGlzLmtpKGEpfSxraTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubGk6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5EaTp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLktvOnRoaXMudWkoYSl9LHVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52aTp0aGlzLllqKGEpfSxZajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGJiPWMuSHB8fGJiLFZjPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVZjLlRnKDQpOyhmdW5jdGlvbihjKXtjLmtqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1mLmhmKGIsImVsZW1lbnRJRCIpO3RoaXMuWWY9Yi5wb3NpdGlvbmluZzsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuTyhnKTt0aGlzLlIoZyk7dGhpcy5EYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuRGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkRjKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCkduOmZ1bmN0aW9uKCl7Zi5EZih0aGlzLkRjKTtmLkVmKHRoaXMuRGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HbigpfS5iaW5kKHRoaXMpLDUwKX0sSzpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxIZDpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGNiPWMua2p8fGNiOyhmdW5jdGlvbihjKXtjLmpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBkYj1jLmpqfHxkYjsoZnVuY3Rpb24oYyl7Yy5saj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLndhPTE1MDA7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoayYmay5pbnJlYWQpe3ZhciBiPWsuaW5yZWFkLGE9Zi5oZihiLCJlbGVtZW50SUQiKTtmLkRmKGEpJiYoYj1uZXcgY2IoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgZGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLnFiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5xYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZWI9Yy5sanx8ZWIsZmI9bmV3IGViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVoPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzFdfWMuZ3M9YjtiLnByb3RvdHlwZT17ZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVoOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgZ2I9Yy5nc3x8Z2IsV2M9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9V2MuZGgoNCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5VaT1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxIczpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LEJtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB6PWMuVWl8fHo7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5JYT1hO3RoaXMuZGY9dGhpcy5LZz0hMTt0aGlzLlRmPWQ7dGhpcy5uZz0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5JYT1uZXcgeihhKSk7dmFyIGY9dGhpcy5OYT1uZXcgWE1MSHR0cFJlcXVlc3Q7Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Zi5yZWFkeVN0YXRlfHwKMjAwIT1mLnN0YXR1cyYmMjAxIT1mLnN0YXR1c3x8ZyhmKTtpZihkJiY0PT1mLnJlYWR5U3RhdGUmJjIwMCE9Zi5zdGF0dXMmJjIwMSE9Zi5zdGF0dXMpZChmKTtlbHNlIGlmKDQ9PWYucmVhZHlTdGF0ZSYmMD09Zi5zdGF0dXMmJm0mJm0uRmQodGhpcy5JYS51cmwpJiZtLmRkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5IcygiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxtLmdhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5nYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9Zi5yZWFkeVN0YXRlJiZjKGYpfS5iaW5kKHRoaXMpfWMuVmk9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEuZGF0YTsKaWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmRmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5uZz90aGlzLk5hLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITEpOnRoaXMuTmEub3Blbih0aGlzLklhLm1ldGhvZCx0aGlzLklhLnVybCwhMCksdGhpcy5LZ3x8KHRoaXMuTmEud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGsmJmsudnBhaWQmJm0mJm0uT2ModGhpcy5JYS51cmwpJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuTmEuc2VuZChhKX1jYXRjaChjKXttJiYKbS5GZCh0aGlzLklhLnVybCk/bS5kZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmYudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkZkKHRoaXMuSWEudXJsKSx0aGlzLlRmJiZ0aGlzLlRmKCl9cmV0dXJuIHRoaXMuTmF9fX0pKGMpO3ZhciBoYj1jLlZpfHxoYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnVkPXRoaXMuZWI9bnVsbDt0aGlzLlZuPXRoaXMubmI9dGhpcy5MZj0hMTt0aGlzLnVhPSIiO3RoaXMuR2Y9ITE7dGhpcy56YT10aGlzLkpjPSIiO3RoaXMuQ2Y9dGhpcy5ZPXRoaXMuaXNFbmFibGVkPXRoaXMuWmQ9ITE7dGhpcy5NYT1bXTt0aGlzLnRmPXRoaXMuRmI9IiI7dGhpcy55ZD0hMTt0aGlzLmtlPTA7dGhpcy55ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5zYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7CnRoaXMuaGM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMueGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMub2I9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMubGU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5DZD0hMTt0aGlzLkluPXRoaXMuZWQ9bnVsbDt0aGlzLmZjPXRoaXMuQWc9dGhpcy5uZT10aGlzLmRkPXRoaXMudmQ9dGhpcy5qYz0hMTt0aGlzLlBhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfX1jLldpPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmViLGFkdGFncmVnZXg6dGhpcy51ZCxqc3BvcHVwczp0aGlzLkxmLHNpZGVsb2Fkczp0aGlzLm5iLGRpc2FibGV0ZXN0czp0aGlzLlZuLGhvbWFkQWxpYXM6dGhpcy51YSwKaXNJbml0aWFsaXplZDp0aGlzLkdmLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnphLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5DZixzZXJ2ZXI6dGhpcy5NYSxzdm1Db25maWc6dGhpcy5GYixob21hZEFkcGF0aDp0aGlzLnRmLGRpc2FibGVDb29raWVUZXN0OnRoaXMueWQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMua2UsSE9NQURfVkVSSUZJRUQ6dGhpcy55ZSxIT01BRF9CTE9DS0VEOnRoaXMud2UsSE9NQURfTk9CTE9DS0VSOnRoaXMuc2IsSE9NQURfQURCTE9DS0VSOnRoaXMuaGMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLnhlLHRlc3RIaWRlOnRoaXMuSGIsdGVzdFRhZ3M6dGhpcy5vYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMubGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5DZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkluLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLmpjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy52ZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5kZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5uZSxjb25maWdGYWlsdXJlczp0aGlzLlBhLHNpdGVDb25maWc6dGhpcy5FYixzZXJ2ZXJJZDp0aGlzLmZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5TYix2cGFpZDp0aGlzLmZjfX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuUGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5QYVtiXSYmMT09dGhpcy5QYVtiXSYmKGE9ITApO3JldHVybiBhfSxjZTpmdW5jdGlvbihhKXt0aGlzLlBhW2FdPSEwfSxicDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYxPT10aGlzLlBhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LFpzOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhOwphPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLmxuKGEpfSxUYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZj0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuT2MoYSk7Zj10aGlzLkthKGEpO2M/KHRoaXMuWmIoKT9oPWE6aD1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixrPWYucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMuYWUoKSxrPWYucGF0aC5zdWJzdHIoMSkrCihmLnF1ZXJ5PyI/IitmLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuT2J8fHRoaXMuZWJ8fHRoaXMudWQpJiYoaz10aGlzLlNxKGspKTthPW5ldyB6KGgpO2EudXJsPWg7aD0iIjtoPWM/Zi5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuY3AoZi5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxPYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuWmIoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuTWEmJnRoaXMuTWEubGVuZ3RoJiYwPHRoaXMuTWEubGVuZ3RoJiYoYj10aGlzLk1hWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuT2MoYSk7cmV0dXJuIGJ9LGNwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSwKYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5idjtyZXR1cm4ibm9uZSJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWFbdGhpcy5mZ119LGFlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5MYygpLGI9dGhpcy5qZygobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxTcTpmdW5jdGlvbihhKXt0aGlzLk9iJiYoYSs9dGhpcy5PYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7cmV0dXJuIGF9LGM6ZnVuY3Rpb24oYSxiLGQsYyxmLGgpe209dGhpczt0aGlzLkdmPSEwO3RoaXMuSmM9YTt0aGlzLnphPWI7dGhpcy5aZD1kO3RoaXMuZWQ9Yzt0aGlzLkJjPWY7dGhpcy5FYj0KaDt0aGlzLkZxKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnphKXRoaXMuRHEoKTtlbHNlIHRyeXt0aGlzLnphPWIoKSx0aGlzLndjKCl9Y2F0Y2goayl7dGhpcy5nYSgibm9DbGllbnRDb25maWciKX19LFphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxGcTpmdW5jdGlvbigpe3RoaXMuRmEobmV3IHoodGhpcy5KYyt0aGlzLm9jKCJnbG9iYWwiKSksdGhpcy5zcC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLndjKCl9LmJpbmQodGhpcyksITApfSxEcTpmdW5jdGlvbigpe25ldyB6KHRoaXMuemErdGhpcy5vYygiY2xpZW50IikpO3RoaXMuRmEobmV3IHoodGhpcy56YSt0aGlzLm9jKCJjbGllbnQiKSksdGhpcy53Yy5iaW5kKHRoaXMpLApmdW5jdGlvbigpe3RoaXMuY2UoImNsaWVudCIpO3RoaXMuZ2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LG9jOmZ1bmN0aW9uKGEpe3ZhciBiPSI/Y2FjaGU9Iit0aGlzLmtiKCk7dGhpcy5FYiYmdGhpcy5FYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuRWImJnRoaXMuRWIubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxnYTpmdW5jdGlvbihhKXtpZighdGhpcy52ZCl7dGhpcy52ZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuQ2Y9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndlKSk7dGhpcy5yYigpO2YuVGIobC5Ocik7KGI9Zi5vZih0aGlzLkxjKCkpKXx8KGI9Zi5vZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sc3A6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnphfHx0aGlzLkZifHx0aGlzLnVhfHx0aGlzLndjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX19LHdjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnphfWVsc2UgYT10aGlzLnphO3RoaXMuaXNFbmFibGVkPXRoaXMuSmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuTWE9YS5zZXJ2ZXJ8fFtdO3RoaXMuRmI9YS5jb25maWd8fCIiO3RoaXMudWE9YS5hbGlhc3x8bnVsbDt0aGlzLnRmPWEuYWRwYXRofHwiIjt0aGlzLnlkPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuZmc9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuTWEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5GYiYmdGhpcy51YSYmdGhpcy5NYS5sZW5ndGg/dGhpcy5RYyghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX0sUWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9Cm5ldyB6KHRoaXMuYWUoKSksYz10aGlzLkthKHRoaXMuRmIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5GYit0aGlzLm9jKCJjdXN0b21lciIpKTt0aGlzLkZhKGIsdGhpcy5hdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiY3VzdG9tZXIiKTthP3RoaXMuYWw/dGhpcy5nYSgibm9TVk1Db25maWciKToodGhpcy5hbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuUWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGF0OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5kZD0KdGhpcy5KYihiLnN0cmljdCk7dGhpcy5uZT10aGlzLkpiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkFnPWIuZHVyYXRpb25fY2hlY2tfZW5hYmxlZHx8ITE7dGhpcy5TYj10aGlzLkpiKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuSGI9Yi50ZXN0aGlkZXx8IiI7dGhpcy5vYj1iLnRlc3RhZHRhZ3N8fFtdO3RoaXMuSWI9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PYj1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmViPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnVkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLkxmPWIuanNwb3B1cHN8fCExO3RoaXMubmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuZmM9Yi52cGFpZHx8ITE7dGhpcy5FYi52cGFpZD10aGlzLmZjO3RoaXMuR2I9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMubXAoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnlkJiYodGhpcy5HYj1udWxsKTt0aGlzLmxlPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuQ2QmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkNkPSEwLHRoaXMuUWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMudHQoKSYmKHRoaXMuSGJ8fHRoaXMuSWJ8fHRoaXMub2J8fHRoaXMuR2IpP3RoaXMuWmQ/KHRoaXMub2E9dGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy53ZCgpLHRoaXMucmIoKSk6dGhpcy5qdCgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmt0KCkpfX0sanQ6ZnVuY3Rpb24oKXt0aGlzLml0KCl9LGt0OmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSk7dGhpcy5yYigpfSxjZDpmdW5jdGlvbihhKXt0aGlzLmpjPQohMDt0aGlzLll8fCh0aGlzLlk9dGhpcy5vYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEoYSkpLHRoaXMucmIoKSx0aGlzLndkKCkpfSxpdDpmdW5jdGlvbigpe2lmKHRoaXMuSGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZSl7fWE/dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMucWcoKX1lbHNlIHRoaXMucWcoKX0scGc6ZnVuY3Rpb24oKXt2YXIgZTt2YXIgYztmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoKSk7dGhpcy5udChlLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuaWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmNkKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX10aGlzLm9iPW51bGwsdGhpcy5pZSgpfSxudDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZSgpe2YoKSYmYigpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dGhpcy5GYShuZXcgeihhKSxlLGZ1bmN0aW9uKCl7ZigpJiZjKCl9KX0scWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLmtiKCkpO3RoaXMub3QoZSwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBnLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLkliJiZ0aGlzLkliLmxlbmd0aCl7dmFyIGM9dGhpcy5JYi5zbGljZSgpLGU7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnBnKCl9LG90OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBlKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZigpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZmKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1lO2wub25lcnJvcj1mO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobSl7ZSgpfX0saWU6ZnVuY3Rpb24oKXt0aGlzLkdiPyh0aGlzLmtlKyssdGhpcy5GYShuZXcgeih0aGlzLkdiKSx0aGlzLmh0LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMub2coKX0samU6ZnVuY3Rpb24oYSl7dGhpcy5jZCh0aGlzLnhlLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saHQ6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMua2U/dGhpcy5pZSgpOnRoaXMuamUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5vZygpOnRoaXMuamUoIkFBQSIpfSxvZzpmdW5jdGlvbigpe3RoaXMuWT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy5zYikpO3RoaXMucmIoKTt0aGlzLndkKCl9LHJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO2YuWGEoKSYmKGE9IjEiKTt0aGlzLmpjJiYoYj0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy55ZSkpO3RoaXMuZWQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZCYmdGhpcy5lZCgpfSxGbjpmdW5jdGlvbigpe2lmKHRoaXMubmUmJnRoaXMuenAoKSl7dmFyIGE9dGhpcy5icCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sdGc6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9CiJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRmE6ZnVuY3Rpb24oYSxiLGMsZSxoLEljKXthPW5ldyBoYihhLGIsYyk7ZSYmKGEuS2c9ITApO2gmJmYubnEoKSYmKGEuZGY9ITApO0ljJiYoYS5uZz0hMCk7cmV0dXJuIGEubG9hZCgpfSxPZTpmdW5jdGlvbigpe2YuWGEoKXx8Zi5ZYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZT0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5nYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7ZT0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLlpiKCl8fChhPXRoaXMuS2EoZSksZT1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZSl9ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sRW46ZnVuY3Rpb24oKXt0aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkZhKGEsdGhpcy5WdC5iaW5kKHRoaXMpLHRoaXMuVXQuYmluZCh0aGlzKSl9LFZ0OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7cmV0dXJufWN8fHRoaXMuem8oKX0sVXQ6ZnVuY3Rpb24oKXt9LHpvOmZ1bmN0aW9uKCl7Zi5UYihsLnlvKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx3ZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm5iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMubmIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5uYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZi5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKX19LHR0OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMubGV9LG1wOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCwKYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHdiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGUsZixoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8ZT4+NCxrPShlJjE1KTw8MnxmPj42LGw9ZiY2Myxpc05hTihlKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxLYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgYz17fSxlPTE0O2UtLTspY1tiW2VdXT1hW2VdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsZixoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGU9MDtlPG4tMztlKz00KWY9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsxKTw8MTZ8YS5jaGFyQ29kZUF0KGUrMik8PDh8YS5jaGFyQ29kZUF0KGUrMykseS5wdXNoKGYpOwpzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHkucHVzaChlKTsxNCE9eS5sZW5ndGglMTY7KXkucHVzaCgwKTt5LnB1c2gobj4+PjI5KTt5LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT15W2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09YyhoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtmPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihlPTA7MTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8fm4mdykrdCtoW2VdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtmb3IoZT0yMDszOT49ZTtlKyspeD1jKGYsNSkrKG5ecF53KSt0K2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZixmPXg7Zm9yKGU9NDA7NTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8biZ3fHAmdykrdCtoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsZj14O2ZvcihlPTYwOzc5Pj1lO2UrKyl4PWMoZiw1KSsobl5wXncpK3QraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtrPWsrZiY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGliPWMuV2l8fGliLG09bmV3IGliO3dpbmRvdy5ndj1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMTBdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuRXA9dGhpcy5hWzRdO3RoaXMuYWs9dGhpcy5hWzJdO3RoaXMuT3Q9dGhpcy5hWzZdO3RoaXMuVnA9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19Yy5wcj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY2s6dGhpcy56dChhKX0senQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkF0OnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRXA6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFrOnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpOwp2YXIgamI9Yy5wcnx8amIsWGM9bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuYmsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5qPWE7YS51Lks/dGhpcy5MYT1hLnUuSygpOnRoaXMuTGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5qLlFhO3RoaXMucGxheWVyPXRoaXMuai51O3RoaXMucmM9ITE7dGhpcy5qbj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmJkPXt9O3RoaXMucGM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5wYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmoudSkmJnRoaXMuai51LkImJihhPXRoaXMuai51LkIoKSksdGhpcy5wYz1jLmFkbWVzc2FnZShhKSkpOwpjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuSW09Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5hZD0hMTt0aGlzLk5mPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLnM9e307dGhpcy5uYz0hMTt0aGlzLndnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuWWI9ITE7dGhpcy5Sbj1mLnBhKDEwKTt0aGlzLlRjPWYucGEoMTApO3RoaXMuUGQ9Zi5wYSgxMCk7dGhpcy5rZz1mLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkFiPSExO3RoaXMuemQ9bnVsbDt0aGlzLkFjPXRoaXMubGc9dGhpcy5VZj10aGlzLkVjPXRoaXMud3Q9dGhpcy5hYj0hMX1jLlFpPWI7Yi5wcm90b3R5cGU9e2dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuTGFdJiYKdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSx1ZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5FYSYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULmpjP2YudHJhY2soImFkY2FsbCIsIjEiKTpmLnRyYWNrKCJhZGNhbGwiLCIwIik7Zi50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2YuRChsLnVtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSl9LEpkOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmFiPWM7aWYodGhpcy5ULlkpdGhpcy5ULkZuKCksdGhpcy5ULm9hJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5mY30pKTpiPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLlQuZmMsCnVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5BYSgpO2Vsc2V7dmFyIGU9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5KZChhLGIsYyl9LDUwKX19LFZkOmZ1bmN0aW9uKGEpe3RoaXMuRWM9ITE7dGhpcy5zPWE7dGhpcy5Qcyh0aGlzLnMpO3RoaXMucGYoYSl9LHBmOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLmJkPXRoaXMub3AoYSkpLHRoaXMucGYoYS5wYXJlbnQpKX0sb3A6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxlPVtdLGY9W10saD0iIjtpZihhLmFhKXtiPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtlPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5hYS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuYWEuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSk7YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmCihoPWEuYWEuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGUubGVuZ3RoO2srKyllW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZVtrXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGgpKSxlW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS55YihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZixhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQ2MmJmEuQ2MuZXJyb3ImJmEuQ2MuZXJyb3IuY29kZSYmKGI9YS5DYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmdjLmNvZGU6Yj09Qy5qZC5jb2RlPwpmLkQobC5zdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpOihmLktkKCksYj09Qy5CZS5jb2RlJiZmLkQobC5acSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKTtmLkQobC54byx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHguemUuY29kZTpmLkQobC5XdCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguQ2UuY29kZTpmLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtmLkQobC5CdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LmtkLmNvZGU6Zi5EKGwuR3UsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmhkLmNvZGU6Zi5EKGwuJHEsCnRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksZi50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChmLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7Zi50cmFjayhjLCIiLCEwKTt0aGlzLnhiKGEpO3RoaXMuQWEoKX0seGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLnlhLmxlbmd0aDspdHJ5e3ZhciBjPWEueWEucG9wKCk7dGhpcy5JZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZSl7fX0sUHM6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJgooYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWI7Yj10aGlzLmouQztiLnp2PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5JbSYmdGhpcy5wbGF5ZXIuSGMoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkhjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuQ20oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLnNnKGIpPyh0aGlzLkVtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLAp0aGlzLmNhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmNhLmFwcGVuZENoaWxkKGIpKTp0aGlzLnMuTW4oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLk5zKCkpOnRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5zLm9yaWdpbi4kZSh4LmhkKX0sTnM6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2E9YS5yZXBsYWNlKC8mYW1wOy9nLCImIik7YT1hLnJlcGxhY2UoLyZsdDsvZywiPCIpO2E9YS5yZXBsYWNlKC8mZ3Q7L2csIj4iKTtyZXR1cm4gYT1hLnJlcGxhY2UoLyZxdW90Oy9nLCciJyl9Zi5TZSgpO3RoaXMucyYmdGhpcy5zLm9yaWdpbiYmdGhpcy5zLm9yaWdpbi50ZSYmCmYuRm0odGhpcy5zLm9yaWdpbi50ZSk7Zi4kYSgic2V0VXBWcGFpZCIpO3ZhciBiPXRoaXMuai5DO3RoaXMuai5DPUIucG9wKCk7Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmouQyxiKTt0aGlzLmouVmYoKTt0aGlzLmouY2MoKTtmb3IoYj10aGlzLmouRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5qLmNjKCk7dGhpcy5YPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7CnRoaXMuai5HLmFwcGVuZENoaWxkKHRoaXMuWCk7dGhpcy5YLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBiPXRoaXMucy5xcCgpLGM9YSh0aGlzLnMuUC5PcmlnaW5hbEFkUGFyYW1ldGVycyksZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmouRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLmhlaWdodCl9fX07Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLApnKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2I9Zi55bigiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuVCk7dGhpcy5YLnNyYz1iO2YucmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJnRoaXMubnUoKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJnRoaXMub3UoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJ1KCksIkFkVmlkZW9Db21wbGV0ZSI9PQphLmRhdGEubmFtZSYmdGhpcy5xdSgpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5wdSgpKX0uYmluZCh0aGlzKSk7Zi5yZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpKTtmLnJkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSl9LG91OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iil9LG51OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2YuJGEoImltcHJlc3Npb24iKX0sSGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2YuJGEoInN0YXJ0Iil9LEdnOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2YuJGEoImZpcnN0UXVhcnRpbGUiKX0scnU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7Zi4kYSgidGhpcmRRdWFydGlsZSIpfSxxdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNvbXBsZXRlIik7CmYuJGEoImNvbXBsZXRlIil9LHB1OmZ1bmN0aW9uKCl7Zi4kYSgiYWRzdG9wcGVkIik7dGhpcy5BYSgpfSxDbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBlPWIsZj10aGlzLlQ7Zi5vYSYmZi5pc0VuYWJsZWQmJiFmLlpiKCk/KGU9Zi5LYShlKSxiPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTpiPWU7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmV1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxFbTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMucmUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5wZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmZkLmJpbmQodGhpcykpfSxYYzpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LEZnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW8uY29udHJvbHM9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFlKGEpfS5iaW5kKHRoaXMpLHRoaXMuam4pfSxxZTpmdW5jdGlvbihhKXt0cnl7aWYoIWYuWGEoKSYmCnRoaXMuVC5BZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQWJ8fCh0aGlzLkFiPSEwLHRoaXMuWGModGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMucmN8fCF0aGlzLnNnKHRoaXMudmlkZW8pfHx0aGlzLkFifHwodGhpcy5yYz0hMCx0aGlzLmR1KCksdGhpcy52aWRlby5jb250cm9scz0hMSx0aGlzLmouY2MoKSx0aGlzLkNnKCksdGhpcy5EZygpLHRoaXMuTWUoKSx0aGlzLmouVmYoKSx0aGlzLnZpZGVvLnBsYXkmJnRoaXMuaGUoKSl9LGhlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZi5FYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5LYz1bXTtmb3IodmFyIGI9CnRoaXMuai5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLktjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5vZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTsKdmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2YudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtmLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMub2QoKX1lbHNlIHRoaXMub2QoKX0sb2Q6ZnVuY3Rpb24oKXtpZih0aGlzLktjKWZvcih2YXIgYT0wO2E8dGhpcy5LYy5sZW5ndGg7YSsrKXRoaXMuS2NbYV0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChhPXRoaXMudmlkZW8ucGxheSgpKSYmYVsiY2F0Y2giXSlhWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWEoKSxmLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsIiIsITApKX0uYmluZCh0aGlzKSk7WT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQmIuYmluZCh0aGlzKSkpOkg9ZnVuY3Rpb24oKXt0aGlzLm5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5oZSgpKX0uYmluZCh0aGlzKTt0aGlzLm5mKCkuaGcodGhpcyl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtmLkQobC5wbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMucy52Yj8odGhpcy5yYz0hMSx0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuYWQ9ITEsdGhpcy5qLnlnKCksdGhpcy5zLm9yaWdpbi5RZCgpKTp0aGlzLkFhKCl9LGV1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5mZChhKSl9LGZkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkVkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuT2UoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5PZSgpKTt0aGlzLnMub3JpZ2luLiRlKHguaGQpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMud3QpdGhpcy5BYSgpO2Vsc2V7dGhpcy5ZYj0hMDt0aGlzLmoudS5qYiYmIXRoaXMubGcmJnRoaXMuai51LmpiKCkmJmYuRChsLnljLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTsKdGhpcy5CdChhKTt2YXIgYj0iIjtpZih0aGlzLnMuZ2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMua2cpO2MmJihiPXRoaXMucy5nZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5hZHx8KHRoaXMuYWQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7Zi5EKGwudm0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTt0aGlzLnMudmI/KHRoaXMucmM9ITEsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmFkPSExLHRoaXMuai55ZygpLHRoaXMucy5vcmlnaW4uUWQoKSk6dGhpcy5BYSgpfS5iaW5kKHRoaXMpKSkpLApjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMubmM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwKImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5pcCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmouY2MoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuRWcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuQ2coKTt0aGlzLkRnKCk7dGhpcy56ZD1zZXRJbnRlcnZhbCh0aGlzLkRuLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0saXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZT1iPXRoaXMucy5NW2NdLGY7Zj1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmCmguaXNFbmFibGVkJiYhaC5aYigpJiYoZj1oLkthKGYpLGY9Zi5wcm90b2NvbCsiOi8vIitmLmhvc3QpO2UudXJsPWY7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sRG46ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLnpkKSx0aGlzLnBlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMucmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuemQpLHRoaXMuZmQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSx2ZzpmdW5jdGlvbigpe3RoaXMuVWZ8fCh0aGlzLlVmPSEwLHRoaXMuRWN8fApmLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sQnQ6ZnVuY3Rpb24oYSl7YT09dGhpcy53Z3x8dGhpcy5BYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy52ZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZmLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5BYnx8Zi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGYuWGEoKSYmZi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLApmLkQobC5ybSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpLGYuRChsLndtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy5SYiYmZi50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5FYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGYuRChsLnFtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLkQobC50bSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsCiJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGYuRChsLnltLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGYuRChsLnptLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy53Zz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5BYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnBwKHRoaXMucy55YSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBlPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmJkLmltcHJlc3Npb25zJiZmLmpxKGUudXJsLHRoaXMuYmQuaW1wcmVzc2lvbnMpP3RoaXMuSWQoZS51cmwsZS50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpOwpmLkQobC5zbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkse2FkSWQ6dGhpcy5iZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSWQoZS51cmwsZS50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMucy55YT10aGlzLlRuKHRoaXMucy55YSxhKSl9fSxJZDpmdW5jdGlvbihhLGIsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuVGEoYSksYyYmYS5CbShjKSxlfHwoZT10aGlzLlplKSx0aGlzLlQuRmEoYSxlLHRoaXMuWmUsITEsITApKX0scHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxUbjpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxkdTpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5FZy5iaW5kKHRoaXMpfSwKRWc6ZnVuY3Rpb24oKXtmLkQobC5Mbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5FYyYmZi5YYSgpJiZmLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZi5YbygpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMudmN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnZjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsCmEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Sbjt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuVGM7Yi5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnl0LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMueHQuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLlpjLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLnRvcD0iLTUwcHgiLGUuc3R5bGUucmlnaHQ9IjBweCIsZS5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtlLmlkPXRoaXMua2c7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2UuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7ZS5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMuZ2UmJmEuYXBwZW5kQ2hpbGQoZSk7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LldhJiZ0aGlzLmoudS5XYSgpJiZ0aGlzLlZxKCk7dGhpcy5XYigpfX0sV2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxaYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSx5dDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVGMpO3RoaXMuai5DLnBhdXNlZD8KKHRoaXMuai5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSk6KHRoaXMuai5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLkQobC5IZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sVGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlRjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5EKGwuSGUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHNzOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLAphLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHh0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWQ/KHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGYudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LFZxOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLAp0aGlzLnRyYWNrKCJtdXRlIiwhMCksZi50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxCYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYik7dGhpcy5BY3x8dGhpcy5uY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuaGUoKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5BYz0hMDt0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1mLkVhJiZ0aGlzLm5jfHwicG9zdHJvbGwiPT1mLkVhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShmLkVhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiYKYSl7Zm9yKHZhciBiPXRoaXMuai5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmouY2MoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy54ZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7CmYudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7Zi50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy54ZCgpfWVsc2UgdGhpcy54ZCgpfSx4ZDpmdW5jdGlvbigpe3RoaXMubGc9ITA7dGhpcy5qLnNmKCk7dGhpcy5qLnRzKCk7dGhpcy5ZYj0hMTtmLkQobC5Rbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMubmYoKS5xcygpfSxuZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxFZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYKKGE9ITApfXJldHVybiBhfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihmLkVmKHRoaXMudmlkZW8sYSk/dGhpcy5zcygpOnRoaXMuVGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKX0uYmluZCh0aGlzKSwxMDApKX0sUzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy52YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy52Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLlFpfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVvPXRoaXMuYVs2XTt0aGlzLmtyPXRoaXMuYVs5XTt0aGlzLmFqPQp0aGlzLmFbOF07dGhpcy5hcz10aGlzLmFbN107dGhpcy5BbD10aGlzLmFbN107dGhpcy5Kaj10aGlzLmFbN107dGhpcy5QcD10aGlzLmFbNF07dGhpcy5paj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLndzPWI7Yi5wcm90b3R5cGU9e2NvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3I6dGhpcy4kaShhKX0sJGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFqOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hczp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQWw6dGhpcy5JaihhKX0sSWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkpqOnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5QcDp0aGlzLmhqKGEpfSxoajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaWo6dGhpcy5mKGEpfSwKZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIga2I9Yy53c3x8a2IsWWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuY28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5KYT1udWxsO3RoaXMuYmE9W107dGhpcy5hYT1udWxsO3RoaXMuTWI9ITE7dGhpcy50ZT0iIjt0aGlzLnNlPSExO2QmJmQuZW1wdHk/dGhpcy5KcSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLkhsPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLldlKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMPwpuZXcgeih0aGlzLnVybCk6bS5UYShtLlpzKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO3RoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmKGIuZGF0YS5ob21hZF9jb21wYXRpYmxlX3ZwYWlkPSJ0cnVlIik7bS5GYShiLHRoaXMuSXEuYmluZCh0aGlzKSx0aGlzLkVxLmJpbmQodGhpcykpfSxmZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuRWEpdHJ5e3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChlKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLkVhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5FYSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PQpnLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZ1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1lLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LElxOmZ1bmN0aW9uKGEpe3RoaXMuanMoYSk7dHJ5e3RoaXMuSmE9YS5yZXNwb25zZVhNTCx0aGlzLkphfHwodGhpcy5KYT0KKG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sSnE6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sRXE6ZnVuY3Rpb24oKXt0aGlzLmZhKHRoaXMuQmEoeC56ZSx7ZGVwdGg6YX0pKX0sUmM6ZnVuY3Rpb24oKXt0aGlzLmFhPQp0aGlzLmJhLnNoaWZ0KCk7dGhpcy5wcSgpP3RoaXMucHQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5xZigpLGcpKTp0aGlzLmZhKHRoaXMuQmEoeC5DZSkpOihhPTAsdGhpcy5TdCgpJiZ0aGlzLlZkKHRoaXMuU24oKSkpfSxRZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5SYygpKTp0aGlzLnBhcmVudC5RZCgpfSxTdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm10KCk/dGhpcy5sdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5CYSh4LnZlKSk6dGhpcy5mYSh0aGlzLkJhKHguTGgpKSwhMSk6KHRoaXMuZmEodGhpcy5CYSh4LmdjLEMuQmUpKSwhMSl9LFZkOmZ1bmN0aW9uKGEpe2EueWE9YS55YS5jb25jYXQodGhpcy5NZCgpKTthLnZiPWEudmI/YS52Yjp0aGlzLk1iO3RoaXMucGFyZW50LlZkKGEpfSxTbjpmdW5jdGlvbigpe3ZhciBhPW5ldyBsYjthLmR1cmF0aW9uPXRoaXMuVWIoKTthLk09dGhpcy5sZigpOwphLnZjPXRoaXMuWW8oKTthLm9yaWdpbj10aGlzO2EuUD10aGlzLlZvKCk7YS5nZT10aGlzLm5wKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLmFhJiYoYi55YT1iLmVycm9yLmNvZGUhPXgudmUuY29kZT9iLnlhLmNvbmNhdCh0aGlzLiRvKCkpOmIueWEuY29uY2F0KHRoaXMuZ3AoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQueGImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC54YiYmdGhpcy5wYXJlbnQueGIoYiksYT0wLHRoaXMuUmMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5mYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx4YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC54YihhKX0sJGU6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQmEoYSxiKSl9LEJhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG1iKGEsYik7Yy5vcmlnaW49dGhpczsKcmV0dXJuIGN9LHB0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sbXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxmKCkubGVuZ3RofSxsdDpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0scmc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sanM6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRlPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy5zZT1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxwcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMucWYoKS5sZW5ndGh9LHFmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuanAodGhpcy5hYSwiVkFTVEFkVGFnVVJJIil9LApNZDpmdW5jdGlvbigpe2Zvcih2YXIgYT1bIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZShnKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnliKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sZ3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sJG86ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFlvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWIodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksc2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLGV2OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnliKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnNjKS1NYXRoLmFicyg3MDAtYi5zYyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksYj1nLmNvbmNhdChkKX1jYXRjaChmKXt9cmV0dXJuIGJ9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtkPWI9dGhpcy5yZihhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1nLnB1c2goYyk7Zi5wdXNoKGQpfTE8YS5sZW5ndGg/KGI9ZyxoPWQpOihiPWMsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sVWI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy55Yih0aGlzLmFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sbnA6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGUpdHJ5e2M9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZz1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5WcyhnLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGQpe2I9ITF9cmV0dXJuIGJ9LGpwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy55YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHliOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmYoYSk6IiJ9LApyZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnJwKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5IbHx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbT10aGlzLmFbMTBdO3RoaXMudm49dGhpcy5hWzldO3RoaXMuZWo9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMl19Yy5RZz1iO2IucHJvdG90eXBlPXtjbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZG06dGhpcy51bihhKX0sdW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuZGooYSl9LGRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5lajp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIG5iPWMuUWd8fG5iLFpjPW5ldyBuYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1aYy5jbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLnlhPVtdO3RoaXMuTT1bXTt0aGlzLnZjPSIiO3RoaXMuUD10aGlzLnZiPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Naz1iO2IucHJvdG90eXBlPXtNbjpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxxcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIGxiPWMuTWt8fGxiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVs2XTt0aGlzLnVwPXRoaXMuYVs4XTt0aGlzLmdoPXRoaXMuYVs1XTt0aGlzLmdqPXRoaXMuYVs0XTt0aGlzLmloPXRoaXMuYVs0XTt0aGlzLnlqPXRoaXMuYVszXTt0aGlzLnRpPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs2XTt0aGlzLkdsPQp0aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLm1pPWI7Yi5wcm90b3R5cGU9e2ZuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nbjp0aGlzLnRwKGEpfSx0cDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudXA6dGhpcy5maChhKX0sZmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmdoOnRoaXMuZmooYSl9LGZqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5najp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWg6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnlqOnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50aTp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVHA6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTsKdmFyIG9iPWMubWl8fG9iLCRjPW5ldyBvYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PSRjLmZuKDQpO3ZhciB4PXtrZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixrYToiWE1MX1BBUlNFX0VSUk9SIn0sTGg6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLGthOiJEVVJBVElPTl9FUlJPUiJ9LGdjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixrYToiRU1QVFlfVkFTVCJ9LENlOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsCm1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixrYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0semU6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsa2E6IkxPQURfRVJST1IifSxoZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLAptZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sVXU6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsa2E6Ik1FRElBRklMRV9FUlJPUiJ9LHZlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLGthOiJEVU1NWV9BRCJ9fSxDPXtBZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLGthOiJOT19BRFMifSxCZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsa2E6Ik5PX01FRElBRklMRVMifSxXdTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIiwKa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5WbT10aGlzLmFbM107dGhpcy5RdT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs1XX1jLlpnPWI7Yi5wcm90b3R5cGU9e1VtOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5WbTp0aGlzLlB1KGEpfSxQdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy5aZ3x8cGIsYWQ9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9CmFkLlVtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuQ2M9Yjt0aGlzLnlhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy53aT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1iPWMud2l8fG1iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldrPXRoaXMuYVs5XTt0aGlzLmc9dGhpcy5hWzhdfWMuJGs9YjtiLnByb3RvdHlwZT17Vms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLldrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy4ka3x8cWIsYmQ9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YmQuVmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSwKYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuUWE9YS5nZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9Zi5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuUmE9e307dGhpcy5JZj0hMTt0aGlzLnZmPVtdfWMuUGg9YjtiLnByb3RvdHlwZT17bHA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGY9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2Y9e3g6ZSx5OmJ9O2YucG9zaXRpb249YztyZXR1cm4gZn0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5scChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZj10aGlzLmhxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2YmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7aD17eDpiLHk6Y307ZSYmKGgucG9zaXRpb249ZSk7cmV0dXJuIGh9LCRzOmZ1bmN0aW9uKCl7dGhpcy5JZj0hMH0sCnlnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxWZjpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpO2YuRChsLnljLHRoaXMudS5CKCkpfSx0czpmdW5jdGlvbigpe3RoaXMuSWZ8fCh0aGlzLnUucGxheSgpLGYuRChsLnpjLHRoaXMudS5CKCkpKX0sY2M6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMudS5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLlFhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5RYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlFhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuUWEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5RYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5RYSk7dGhpcy51LkRiJiZ0aGlzLnUuRGIoKT90aGlzLnUuZ2YoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVmLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMudS5leGl0RnVsbHNjcmVlbigpfSxocTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFpvOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sdWY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5abyh0aGlzLlFhKTtpZihiLnghPXRoaXMuUmEueHx8Yi55IT10aGlzLlJhLnl8fGIucG9zaXRpb24hPXRoaXMuUmEucG9zaXRpb258fGIud2lkdGghPXRoaXMuUmEud2lkdGh8fGIuaGVpZ2h0IT10aGlzLlJhLmhlaWdodHx8YSl7aWYoMDx0aGlzLlJhLndpZHRoJiYwPHRoaXMuUmEuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5zZigpO3JldHVybn10aGlzLlJhPWI7dGhpcy51LkRiKCk/KHRoaXMuRy5zdHlsZS5sZWZ0PQoiMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5DLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMudmYubGVuZ3RoO2ErKyl0aGlzLnZmW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWYuYmluZCh0aGlzKSwxMCl9LHNmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTsKZm9yKHZhciBOPWMuUGh8fE4sQj1bXSxyYj0wOzEwMD5yYjtyYisrKXt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO0wuc3R5bGUuZGlzcGxheT0iYmxvY2siO0wuaWQ9Zi5wYSgxMCk7TC5jb250cm9scz0hMDtCLnB1c2goTCl9dmFyIEg9ITEsWT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNuPXRoaXMuYVsxMF07dGhpcy51az10aGlzLmFbNF07dGhpcy5PbD10aGlzLmFbNV07dGhpcy5FaD10aGlzLmFbNl07dGhpcy5vaz10aGlzLmFbNV07dGhpcy5JaD10aGlzLmFbOV07dGhpcy5pcj10aGlzLmFbN107CnRoaXMuaGw9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbN119Yy5NdD1iO2IucHJvdG90eXBlPXtibjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY246dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnVrOnRoaXMuTmwoYSl9LE5sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT2w6dGhpcy5EaChhKX0sRGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkVoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vazp0aGlzLkhoKGEpfSxIaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSWg6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlyOnRoaXMuZ2woYSl9LGdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNiPWMuTXR8fHNiLGNkPW5ldyBzYigxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5ibig0KTsoZnVuY3Rpb24oYyl7Yy53az1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5PKGEpO3RoaXMuZmUoYik7dGhpcy5YZSgpfSxmZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sWGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkNhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5SKGEpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkNhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD0KYy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIHRiPWMud2t8fHRiOyhmdW5jdGlvbihjKXtjLnZrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj1aKCk7dGhpcy51Yj10aGlzLnVifHwhMTt0aGlzLkdlPXRoaXMuSmU9dGhpcy56Zj10aGlzLmlhPXRoaXMubWU9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5IbyhhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMubWU9ITA7dGhpcy56ZiYmdGhpcy5SZSgpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLlliJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLnpmPSEwO3RoaXMuUmUoKX0uYmluZCh0aGlzKSk7dGhpcy5OZSgpfSxSZTpmdW5jdGlvbigpe2lmKCF0aGlzLnViKXt0aGlzLnRjKCk7aWYoIXRoaXMubWUmJiF0aGlzLnRjKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5tZSYmdGhpcy5HZSYmIXRoaXMuSmUmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCl9fSx0YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sCm1mOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LE5lOmZ1bmN0aW9uKCl7aWYodGhpcy50YygpKXt2YXIgYj10aGlzLm1mKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuSmU9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5HZT1iLmF2fXRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5lKCl9LmJpbmQodGhpcyksMTAwKX0saHY6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IudXYoKTohMX0sVWI6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj8KYi5VYigpOi0xfSxocDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxIbzpmdW5jdGlvbihiLGEpe3RoaXMudWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy51Ynx8MzAyPT10aGlzLnViP3RoaXMuaWE9ITA6dGhpcy5sKCJhZGVycm9yIix0aGlzLnViKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfSx4YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5pYT8odGhpcy5tKCksdGhpcy5uYSgpKTpiLk5jKCk/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuaHAoYik/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHViPWMudmt8fHViOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sb3E6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWsua20uaW0/d2luZG93Lk9PLlFrLmttLmltLlp1KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9xKCl9LDEwMCl9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPTE1MDA7dmFyIGI9WigpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5EYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgdGIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IHViKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmIsd2I9bmV3IHZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpyPXRoaXMuYVsxXTt0aGlzLlNnPXRoaXMuYVszXTt0aGlzLkJvPXRoaXMuYVs2XTt0aGlzLkpwPXRoaXMuYVs2XTt0aGlzLktyPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzVdfWMueHM9YjtiLnByb3RvdHlwZT17eXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy56cjp0aGlzLlJnKGEpfSxSZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2c6dGhpcy5BbyhhKX0sQW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJvOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KcDp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuS3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZzphfX19KShjKTt2YXIgeGI9Yy54c3x8eGIsZGQ9bmV3IHhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQueXIoNCk7KGZ1bmN0aW9uKGMpe2Muc2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSwKRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sSzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgeWI9Yy5zbHx8eWI7KGZ1bmN0aW9uKGMpe2Mucmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5xZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5lcihhKX0uYmluZCh0aGlzKSk7CnkueXAoKX0sZXI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciB6Yj1jLnJsfHx6YjsoZnVuY3Rpb24oYyl7Yy50bD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuU2MmJihiPWYuVW4oYix0aGlzLlNjKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxkPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGQpdHJ5e3RmbXN1aXRlKCIjIitkKS50Zm12aWRlbygicmVzdW1lIik7dGhpcy5TY3x8KHRoaXMuU2M9W10pO3RoaXMuU2MucHVzaChiW2FdKTt2YXIgZT1uZXcgeWIoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgemIoZSx0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319fXRoaXMuSCgpfSxxZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5afHwodGhpcy5aPXt9KTt0aGlzLlpbYl18fCh0aGlzLlpbYl09e30pO3RoaXMuWltiXVthXXx8KHRoaXMuWltiXVthXT1bXSk7CnRoaXMuWltiXVthXS5wdXNoKGMpfSxxdDpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLlp8fHRoaXMuWiYmIXRoaXMuWlthXSl0aGlzLiRifHwodGhpcy4kYj1bXSksdGhpcy4kYi5wdXNoKGIpLHRoaXMucnMoKSYmKHRoaXMuY2coKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5aW2FdW2NdJiYwPHRoaXMuWlthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLlpbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLlpbYV1bY11bZF0oYil9fSx5cDpmdW5jdGlvbigpe2lmKHRoaXMuJGIpZm9yKHZhciBiPTA7Yjx0aGlzLiRiLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuJGJbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLlpbY11bZF0mJgowPHRoaXMuWltjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLlpbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLlpbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF0KGIpfX0pfSkoYyk7dmFyIEFiPWMudGx8fEFiLHk9bmV3IEFiKHEpO1goKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NaT10aGlzLmFbNV07dGhpcy56cT10aGlzLmFbM107dGhpcy5ncj10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMV07dGhpcy5zbz10aGlzLmFbMV07dGhpcy5jdT10aGlzLmFbN107dGhpcy5acD10aGlzLmFbNF07dGhpcy54cT10aGlzLmFbOF07dGhpcy5obz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX0KYy5tbj1iO2IucHJvdG90eXBlPXtMaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWk6dGhpcy55cShhKX0seXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpxOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudWo6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNvOnRoaXMuYnUoYSl9LGJ1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdTp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWnA6dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnhxOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5obzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIEJiPWMubW58fEJiLGVkPW5ldyBCYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC5MaSg0KTsoZnVuY3Rpb24oYyl7Yy56aD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LApqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuemh8fENiOyhmdW5jdGlvbihjKXtjLkFoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5Xcnx8KHRoaXMuV3I9CiEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkFofHxEYjsoZnVuY3Rpb24oYyl7Yy5CaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IENiKGQpO3RoaXMuSShmKXx8Cih0aGlzLkwoZiksKG5ldyBEYihmLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkgoKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkJofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2g9dGhpcy5hWzZdO3RoaXMuaG09dGhpcy5hWzEwXTt0aGlzLlptPXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzRdfWMuaG49YjtiLnByb3RvdHlwZT17Rmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdoOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5obTp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlptOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy5obnx8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQuRmgoNCk7KGZ1bmN0aW9uKGMpe2MuUWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LApnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sSzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBIYj1jLlFsfHxIYjsoZnVuY3Rpb24oYyl7Yy5QbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkxlfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLAoxMDApO3RoaXMuTm98fCh0aGlzLkFmKCksdGhpcy5Obz0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5MZT8odGhpcy5sKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLm8oKSk6KHRoaXMuTGU9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MDApKX0sV286ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5XbygpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMuaWE9ITAsdGhpcy5tKCksdGhpcy5uYSgpKToKKHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWYoKX0uYmluZCh0aGlzKSw1MCl9LHN2OmZ1bmN0aW9uKCl7cmV0dXJuITB9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJYj1jLlBsfHxJYjsoZnVuY3Rpb24oYyl7Yy5SbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IEhiKGIuaXRlbShhKSk7dGhpcy5JKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwKKHRoaXMuTChjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBKYj1jLlJsfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS209dGhpcy5hWzFdO3RoaXMuTW89dGhpcy5hWzNdO3RoaXMuWWg9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19Yy5ocz1iO2IucHJvdG90eXBlPXtKbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS206dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nbzp0aGlzLlhoKGEpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWWg6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBMYj1jLmhzfHxMYixnZD1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Z2QuSm0oNCk7KGZ1bmN0aW9uKGMpe2MuQWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5KJiYKKDAsdGhpcy5KKSghMCl9LmJpbmQodGhpcykpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuImthbHR1cmEifX0pfSkoYyk7dmFyIE1iPWMuQWp8fE1iOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGxvZzpmdW5jdGlvbigpe30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuY2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLnhtKCl9LmJpbmQodGhpcykpLHRoaXMuSmc9ITEsdGhpcy50dT0xRTMsdGhpcy5YZj17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLlhmLmRvbmV8fCh0aGlzLlhmLmRvbmU9ITAsdGhpcy5KZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWcoKX0uYmluZCh0aGlzKSx0aGlzLnR1KSl9LHhtOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkpnKTt0aGlzLm0oKX0sSWc6ZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLncoKSl9LGpmOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmCmJbY11bZF0uZ2V0RXJyb3JDb2RlKXt2YXIgZT1iW2NdW2RdO2JbY11bZF0uZ2V0RXJyb3JDb2RlKCk7YltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7YS5wdXNoKGUuZ2V0RXJyb3JDb2RlKCkpfXJldHVybiBhfSx2YTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuamYobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5qZih0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgTmI9Yy56anx8TmI7KGZ1bmN0aW9uKGMpe2MuQmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJgp3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGYuRGEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyl8fHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj1udWxsO3dpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxmLkRhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBNYihjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBOYihjLHRoaXMuQSkpLmIoKSkpfX10aGlzLkgoKX19KX0pKGMpOwp2YXIgT2I9Yy5Canx8T2IsUGI9bmV3IE9iKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpzPXRoaXMuYVszXTt0aGlzLkJxPXRoaXMuYVs2XTt0aGlzLnl1PXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzldfWMuUnQ9YjtiLnByb3RvdHlwZT17eXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpzOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CcTp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXU6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgUWI9Yy5SdHx8UWIsaGQ9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aGQueXMoNCk7CihmdW5jdGlvbihjKXtjLnBsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBSYj1jLnBsfHxSYjsoZnVuY3Rpb24oYyl7Yy5vbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpO3RoaXMuUGIoKX0sUGI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5HZCgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2QoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGIoKX0uYmluZCh0aGlzKSwxMCl9LEdkOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LApvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgU2I9Yy5vbHx8U2I7KGZ1bmN0aW9uKGMpe2MucWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBSYihkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgU2IoYiwKdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBUYj1jLnFsfHxUYixVYj1uZXcgVGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWWc9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzRdO3RoaXMubGw9dGhpcy5hWzVdO3RoaXMucnI9dGhpcy5hWzNdO3RoaXMubWs9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuV2g9YjtiLnByb3RvdHlwZT17WGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLllnOnRoaXMuTm0oYSl9LE5tOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PbTp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubGw6dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJyOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLldofHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5YZyg0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5XZD0hMX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuWnIoKX0uYmluZCh0aGlzKSw1MDApfSxacjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPApiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5KJiZ0aGlzLkooKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5XZCYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPwooYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXczpmdW5jdGlvbigpe3RoaXMuV2Q9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sSzpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLllrfHxXYjsoZnVuY3Rpb24oYyl7Yy5Yaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuT3E9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLktifHwodGhpcy5LYj0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiKTt0aGlzLm8oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSwKd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuT3E/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLldzKCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBYYj1jLlhrfHxYYjsoZnVuY3Rpb24oYyl7Yy5aaz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLAphPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkgoKX19KX0pKGMpO3ZhciBZYj1jLlprfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW89dGhpcy5hWzZdO3RoaXMuSms9dGhpcy5hWzRdO3RoaXMuam89dGhpcy5hWzJdO3RoaXMueWk9dGhpcy5hWzddO3RoaXMudnI9dGhpcy5hWzddO3RoaXMuYm09dGhpcy5hWzEwXTt0aGlzLlRoPXRoaXMuYVszXTt0aGlzLm1tPXRoaXMuYVs4XTt0aGlzLkJyPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVs1XX1jLmtvPWI7Yi5wcm90b3R5cGU9CntwbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucW86dGhpcy5JayhhKX0sSWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkprOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbzp0aGlzLnhpKGEpfSx4aTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueWk6dGhpcy51cihhKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZyOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ibTp0aGlzLlNoKGEpfSxTaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGg6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1tOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ccjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMua298fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1qZC5wbyg0KTsoZnVuY3Rpb24oYyl7Yy5Uaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTsKcmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLlRrfHxhYzsoZnVuY3Rpb24oYyl7Yy5Taz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5DYSgpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuTm4oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuSWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLkNxKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LE5uOmZ1bmN0aW9uKCl7dGhpcy5GZSgpfHx0aGlzLm8oITApfSxDcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWMoKTshYi5tYSYmYi5iYSYmYi5ZdSYmYi4kdSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjsKYTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sSWM6ZnVuY3Rpb24oKXtmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQ2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspaWYoYltjXS5pZD09YSlyZXR1cm4gYltjXTtyZXR1cm57fX0sR2Q6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbzpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iPwp0aGlzLkljKCkuYWRzTG9hZGVyP3RoaXMudyghMCk6dGhpcy53KCk6dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGJjPWMuU2t8fGJjOyhmdW5jdGlvbihjKXtjLlVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsucGxheWVyYXBpKWZvcih2YXIgYj1rLnBsYXllcmFwaSgpLGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IGFjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBiYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgY2M9Yy5Va3x8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52aD10aGlzLmFbOV07dGhpcy5hcT10aGlzLmFbOV07dGhpcy5raz10aGlzLmFbN107dGhpcy5lcT10aGlzLmFbOF07dGhpcy5PdT10aGlzLmFbOV07dGhpcy5UbD10aGlzLmFbM107dGhpcy5ibz10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVsxXX1jLlZsPWI7Yi5wcm90b3R5cGU9e3VoOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52aDp0aGlzLiRwKGEpfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXE6dGhpcy5qayhhKX0sams6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmtrOnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lcTp0aGlzLk51KGEpfSxOdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT3U6dGhpcy5TbChhKX0sU2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRsOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ibzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYz1jLlZsfHxlYyxrZD1uZXcgZWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC51aCg0KTsoZnVuY3Rpb24oYyl7Yy5Uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLk8oYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUihhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEs6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LENhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTsKcmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFQ9Yy5Uanx8VDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5YZD0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhkPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGQmJmIhPXRoaXMuWGR8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS53diksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLAp0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVT1jLlNqfHxVOyhmdW5jdGlvbihjKXtjLlVqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFQoYiksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFUoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9Cm5ldyBUKGIpLGIuamE/dGhpcy5jZygpOnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBVKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgRCxmYz1jLlVqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5uYi5sZW5ndGgpe3ZhciBhPW0ubmIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWYuS3MoeyJbTE9BRFNDUklQVF0iOmYucGEoMTApLCJbVVRJTFNdIjpmLnBhKDEwKSwiW0NBTExCQUNLXSI6Zi5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWYuTWYuYmluZChmKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSlrW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOylmLk1mKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sCm0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSG09dGhpcy5hWzFdO3RoaXMuVnI9dGhpcy5hWzddO3RoaXMuUmo9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbOF19Yy5Jcj1iO2IucHJvdG90eXBlPXtHbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSG06dGhpcy5VcihhKX0sVXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wcjp0aGlzLlFqKGEpfSxRajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUmo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYz1jLklyfHxoYyxsZD1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1sZC5HbSg0KTsKKGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLk8oYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5SKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5ZcT1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sQ3M6ZnVuY3Rpb24oYil7dGhpcy5uZD1ifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWXF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEs6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5KJiZ0aGlzLkooKSx0aGlzLm5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5uZCYmKG5ldyBHKHRoaXMsdGhpcy5uZCkpLmIoKSl9fSl9KShjKTt2YXIgTT1jLkRsfHwKTTsoZnVuY3Rpb24oYyl7Yy5DbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxWYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8KHRoaXMuaGI9MCksdGhpcy5oYisrLDE1PHRoaXMuaGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB0aGlzLk1zKCksITA7dGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5vKCk6dGhpcy5vKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMudmEoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5VKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlU9YSxiLmwoImFkZXJyb3IiLAphKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlV8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5WYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLApmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbzpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz8KdGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHPWMuQ2x8fEc7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMud2E9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBNKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJgp3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQ3ModGhpcy5BKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSCgpfX0pfSkoYyk7dmFyIGljPWMuRWx8fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tcj10aGlzLmFbOV07dGhpcy5UbT10aGlzLmFbMV07dGhpcy5tbz10aGlzLmFbMl07dGhpcy5naz10aGlzLmFbMl07dGhpcy5NbD10aGlzLmFbMV07dGhpcy5LdT10aGlzLmFbN107dGhpcy5xaz10aGlzLmFbMV07dGhpcy5RbT10aGlzLmFbMTBdO3RoaXMuTWc9dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNF19Yy5adD1iO2IucHJvdG90eXBlPXtscjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm1yOnRoaXMuU20oYSl9LApTbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG06dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nazp0aGlzLkxsKGEpfSxMbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWw6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkt1OnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xazp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFtOnRoaXMuTGcoYSl9LExnOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5NZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYz1jLlp0fHxrYyxtZD1uZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQubHIoNCk7KGZ1bmN0aW9uKGMpe2MuT2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuVWU9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuUihhKTp0aGlzLmRhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0UsCntpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLko/KDAsdGhpcy5KKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHt6bjpmdW5jdGlvbihhKXswPGEmJih0aGlzLlVlPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHt6bjpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sSzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIGxjPWMuT2p8fGxjOyhmdW5jdGlvbihjKXtjLk5qPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEF2OmZ1bmN0aW9uKCl7fSxsczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLnVlKG5ldyBmdW5jdGlvbigpe30pO2EuVnU9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHMoYSk7CndpbmRvdy5jdj1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5rc3x8KHRoaXMua3M9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5EZHx8KHRoaXMuRGQ9MSk7aWYoMjA8dGhpcy5EZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5vKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkhhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuRGQrKzsKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxIYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5iZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJgpiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmCihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMudyhiKX19KX0pKGMpO3ZhciBtYz1jLk5qfHxtYzsoZnVuY3Rpb24oYyl7Yy5Qaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IGxjKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5qYXx8dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgbWMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIG5jPWMuUGp8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EdT10aGlzLmFbOV07dGhpcy55bD10aGlzLmFbN107dGhpcy5lbj10aGlzLmFbOF07dGhpcy5kaT10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVsxXX1jLkFuPWI7Yi5wcm90b3R5cGU9e0N1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5EdTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6CnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lbjp0aGlzLmNpKGEpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLkFufHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5DdSg0KTsoZnVuY3Rpb24oYyl7Yy5Maj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpO2EmJnRoaXMuTyhhLnBhcmVudE5vZGUpfSwKSzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgVj1jLkxqfHxWOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLndmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy5GZigpfSxGZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLkhhKCksITA7dGhpcy53ZisrO2lmKDEwPHRoaXMud2YpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5GZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LApXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFc9Yy5Lanx8VzsoZnVuY3Rpb24oYyl7Yy5Naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgVih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFYod2luZG93LnBsYXllciksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgcWM9Yy5Nanx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1yPXRoaXMuYVsxMF07dGhpcy5ZdD10aGlzLmFbOF07dGhpcy5Ebz10aGlzLmFbMTBdO3RoaXMuUmg9dGhpcy5hWzldO3RoaXMuRmo9dGhpcy5hWzZdO3RoaXMueG49dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOF19Yy5SbT1iO2IucHJvdG90eXBlPXtMcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXI6dGhpcy5YdChhKX0sWHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ZdDp0aGlzLkNvKGEpfSxDbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRG86dGhpcy5RaChhKX0sUWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlJoOnRoaXMuRWooYSl9LEVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gajp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLlJtfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC5Mcig0KTsoZnVuY3Rpb24oYyl7Yy5BaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8KKHRoaXMuTyhiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlIoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sSzpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPWMuQWl8fHRjOyhmdW5jdGlvbihjKXtjLnppPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IiwKZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMubygpKX0sdGVzdDpmdW5jdGlvbigpe30sCm86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMueml8fHVjOyhmdW5jdGlvbihjKXtjLkJpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxmLkRhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdGMoZCksZC5qYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgdWMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5IKCl9fSl9KShjKTsKdmFyIHZjPWMuQml8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Iaj10aGlzLmFbMTBdO3RoaXMuUnA9dGhpcy5hWzddO3RoaXMucnE9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzldO3RoaXMuS2k9dGhpcy5hWzRdO3RoaXMuSnQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbOF19Yy5SdT1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGo6dGhpcy5RcChhKX0sUXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlJwOnRoaXMucXEoYSl9LHFxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ycTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZmw6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuSXQoYSl9LEl0OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnQ6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLlJ1fHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5Haig0KTsoZnVuY3Rpb24oYyl7Yy5IaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuTyhiKSx0aGlzLlIoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoiYmxvY2siKX0sSzpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5IaXx8eWM7KGZ1bmN0aW9uKGMpe2MuR2k9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuUGUoKX0sUGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBlKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciB6Yz1jLkdpfHx6YzsoZnVuY3Rpb24oYyl7Yy5JaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgeWMod2luZG93LiQoImRpdiNnYW1lIikpOwppZihiLmphKXt0aGlzLkgoKTtyZXR1cm59aWYoIXRoaXMuSShiKSl7dGhpcy5MKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5IKCk7cmV0dXJufX10aGlzLkgoKX19KX0pKGMpO3ZhciBBYz1jLklpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHQ9dGhpcy5hWzZdO3RoaXMuZm09dGhpcy5hWzRdO3RoaXMud289dGhpcy5hWzRdO3RoaXMucGo9dGhpcy5hWzldO3RoaXMuRms9dGhpcy5hWzFdO3RoaXMuY2w9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzZdO3RoaXMuWG49dGhpcy5hWzNdO3RoaXMuYmk9dGhpcy5hWzRdO3RoaXMuZz10aGlzLmFbNV19Yy5YaT1iO2IucHJvdG90eXBlPXtHdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHQ6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZtOnRoaXMudm8oYSl9LAp2bzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMud286dGhpcy5vaihhKX0sb2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBqOnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gazp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY2w6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZoOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ybjp0aGlzLmFpKGEpfSxhaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5YaXx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuR3QoNCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkhmPXRoaXMuS2Y9dGhpcy5KZj0hMTt0aGlzLlVjPVtdO3RoaXMuJGQ9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBIYT9udWxsOkhhLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2E/bnVsbDpDYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJhP251bGw6UmEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBXYT9udWxsOldhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHNhP251bGw6c2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjPwpudWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB3Yj9udWxsOndiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj8KbnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBNYT9udWxsOk1hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIG5hP251bGw6bmF9fWMuT2s9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5rcChhKTpbXSxiO3RoaXMuS2Y9ITA7aWYoYS5sZW5ndGgpe3RoaXMuSmY9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuZGcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLiRkKXtpZih0aGlzLkhmKWJyZWFrO2I9dGhpcy4kZFtjXTt0aGlzLm9lKGIpJiYodGhpcy5VYy5wdXNoKGIpLHRoaXMuZGcoYikpfX0sb2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxrcDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz0KYVtlXSxjPXRoaXMuJGRbY10sdGhpcy5vZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxkZzpmdW5jdGlvbihhKXt0aGlzLm9lKGEpJiZhLmIoKX0sWXM6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLkpmKWZvcih0aGlzLkhmPSEwLGE9MDthPHRoaXMuVWMubGVuZ3RoO2ErKyl0aGlzLlVjW2FdLnFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVWNbYV0ucWIpfX19KShjKTt2YXIgRGM9Yy5Pa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnI9dGhpcy5hWzZdO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLlpuPXRoaXMuYVszXTt0aGlzLlhxPXRoaXMuYVsxXTt0aGlzLkRrPXRoaXMuYVs4XTt0aGlzLm9vPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVsxMF19Yy50aD1iO2IucHJvdG90eXBlPXtRcjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlJyOnRoaXMuTXAoYSl9LE1wOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5OcDp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm46dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhxOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLm5vKGEpfSxubzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMub286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBFYz1jLnRofHxFYyxyZD1uZXcgRWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1yZC5Rcig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9CmMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGYuVGIobC5UdCksZi50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGYuVGIobC5hciksZi50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgc2Q9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSwKYmE9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEY9bmV3IGdhLGs9ITE7Ri5NYygpO0YuQmYoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLk1jKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5CZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuTWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtmLmZpcmVFdmVudCh3aW5kb3csRi5icSgpLHtpZDp0ZH0pfSw1MDApO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXU9dGhpcy5hWzJdO3RoaXMudnE9dGhpcy5hWzJdO3RoaXMub2k9dGhpcy5hWzVdO3RoaXMuVXE9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbMl19Yy51dD1iO2IucHJvdG90eXBlPXskdDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmF1OnRoaXMudXEoYSl9LHVxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52cTp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMub2k6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VcTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMudXR8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLiR0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5aZj10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuUGM9MDt0aGlzLkxhPSIiO3RoaXMuVmM9W107dGhpcy5XYz0wO3RoaXMuJGY9ITE7dGhpcy5ZZD1bXX1jLk5nPWI7Yi5wcm90b3R5cGU9e0pzOmZ1bmN0aW9uKGEpe3RoaXMuWmY9CmF9LFljOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5MYT10aGlzLnBsYXllci5LKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXM6ZnVuY3Rpb24oYSl7dGhpcy5VYT1hfSxEczpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLkxhXSYmdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSxiYzpmdW5jdGlvbihhLGIpe2YuaWIoIndlbHQuZGUiKSYmZi5ZYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuVWEpO3ZhciBjPSExLGU9ITE7aWYodGhpcy5mcSgpKXRoaXMuVWEuYyh0aGlzLlVhLkpjLHRoaXMuVWEuemEsdGhpcy5VYS5aZCxmdW5jdGlvbigpe3RoaXMuYmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkJjKTtlbHNlIGlmKHRoaXMuQXAoKSl0aGlzLnZzKGZ1bmN0aW9uKCl7dGhpcy5iYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5EKGwueWMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuJHMoKTtrLmV4aXRGdWxsc2NyZWVuKCk7UT1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLmdnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLk5xKGEpOwoiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSGQmJihjPXRoaXMucGxheWVyLkhkKCkpO2guYWRTdGFydFRpbWVvdXQmJihlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtrLkpkKGEsYyxlKTt0aGlzLnBsYXllci5oZyhrKX19LGZxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuUGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5QYy5nZXRUaW1lKCksdGhpcy5QYz1hLDNFNTxiPyEwOiExO3RoaXMuUGM9YTtyZXR1cm4hMX0sUnM6ZnVuY3Rpb24oKXtmLmVlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuYWYoYSkpP3RoaXMuYmMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5EKGwuemMsdGhpcy5wbGF5ZXIuQigpKSl9LApRczpmdW5jdGlvbihhKXtmLmVlKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlpmKXt0aGlzLkpzKCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLmFmKGMpKT90aGlzLmJjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxmLkQobC56Yyx0aGlzLnBsYXllci5CKCkpKX19LGFmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxuczpmdW5jdGlvbigpe3RoaXMucGxheWVyLk9zKHRoaXMuUXMuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sJGM6ZnVuY3Rpb24oYSl7Zi5lZSgibWlkcm9sbCIpO2lmKCF0aGlzLk9mKXt0aGlzLk9mPSEwO3ZhciBiPQp0aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5iYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZj0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGYuRChsLnpjLHRoaXMucGxheWVyLkIoKSkpfX0sbXM6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Jcyh0aGlzLiRjLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5kKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLlJzKCk7dGhpcy5wbGF5ZXIuTmQmJnRoaXMubXMoKTt0aGlzLm5zKCl9LG9zOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuVmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihmKXt0aGlzLkl1KGEsCmIsYyxnLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuV2M9dGhpcy5WYy5sZW5ndGh9LEFwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLldjJiYoYT0hMCk7cmV0dXJuIGF9LHZzOmZ1bmN0aW9uKGEpe3RoaXMuJGY9YTtmb3IoYT0wO2E8dGhpcy5WYy5sZW5ndGg7YSsrKXRoaXMuVmNbYV1bImZ1bmN0aW9uIl0odGhpcy5kcy5iaW5kKHRoaXMpKX0sZHM6ZnVuY3Rpb24oYSl7dGhpcy5XYy0tO2EmJnRoaXMuWWQucHVzaChhKTswPj10aGlzLldjJiZ0aGlzLiRmKCl9LE5xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLllkLmxlbmd0aDtjKyspYj10aGlzLllkW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBkYT1jLk5nfHxkYSxRPSExLGphPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ybj10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbNV07dGhpcy5hbj10aGlzLmFbMl07dGhpcy5vbT10aGlzLmFbNl07dGhpcy5Gcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLnRuPWI7Yi5wcm90b3R5cGU9e3FuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucm46dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVzOnRoaXMuJG0oYSl9LCRtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hbjp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub206dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy50bnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLnFuKDQpfSkuY2FsbChQaWV4dXVwaGVoYXBob2hWLFBpZXh1dXBoZWhhcGhvaFYpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
188.40.138.133 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.133.138.40.188.clients.your-server.de
Software
openresty/1.13.6.2 /
Resource Hash
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
ssl.1.damoh.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CMCMID%7C15357430983173705843568274022634328354%7CMCAAMLH-1534012601%7C9%7CMCAAMB-1534012601%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1533415001s%7CNONE%7CMCSYNCSOP%7C411-17755%7CvVersion%7C3.2.0
Connection
keep-alive
Cache-Control
no-cache
Referer
https://www.golem.de/
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:41 GMT
Last-Modified
Tue, 15 May 2018 12:29:23 GMT
Server
openresty/1.13.6.2
ETag
"5afad2a3-18"
Content-Type
application/octet-stream
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
24
/
ssl.1.damoh.golem.de/ad3e0f383fa15913a252794d4ff8ba3c5e108edc/
110 B
672 B
XHR
General
Full URL
https://ssl.1.damoh.golem.de/ad3e0f383fa15913a252794d4ff8ba3c5e108edc/
Requested by
Host: text
URL: data:text/javascript;base64,dmFyIFBpZXh1dXBoZWhhcGhvaFY9UGlleHV1cGhlaGFwaG9oVnx8e307CihmdW5jdGlvbihjKXtmdW5jdGlvbiBYKCl7eS5TZHx8KHkuU2Q9MCk7eS5TZCsrO3dpbmRvdy52aWRlb3BrZ0ludGVyZmFjZSE9eS52aWRlb3BrZ0ludGVyZmFjZSYmKHdpbmRvdy52aWRlb3BrZ0ludGVyZmFjZT15LnZpZGVvcGtnSW50ZXJmYWNlKTsxMD55LlNkJiZ3aW5kb3cuc2V0VGltZW91dChYLDUwMCl9ZnVuY3Rpb24gQSgpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixBKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLEEpO1k9ITA7Zm9yKHZhciBjPTA7YzxCLmxlbmd0aDtjKyspQltjXS5sb2FkKCk7CmZvcihjPTA7YzxCLmxlbmd0aDtjKyspe3ZhciBiPUJbY10ucGxheSgpO2lmKHZvaWQgMCE9PWIpYi50aGVuKGZ1bmN0aW9uKCl7fSlbImNhdGNoIl0oZnVuY3Rpb24oKXt9KX1IJiYoSCgpLEg9ITEpfWZ1bmN0aW9uIFooKXt2YXIgYz13aW5kb3cuT087Y3x8KGM9d2luZG93LmpPT1BsYXllcl8wKTtyZXR1cm4gY31mdW5jdGlvbiBhYSgpe2lmKGspe2sucGF1c2VCdXR0b258fChrLnBhdXNlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1sZWZ0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRelE1TnpVMU4wUTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlF6UTVOelUxTjBVMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUWpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTNRelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QZ0huQ3JFQUFBRjBTVVJCVkhqYTdKbTlpb05BRU1majNSVVc4U01hUHdoYTI0Y0kxbFpXZVlMWStRU1dncFcrZzQrVUptOFJ0VTFNaW1EbExiY2d3U1BIUWNMZXpqRlR6UTR5Kzl2aFB5UExDa21TektEWngrbDBnZ2Q5UHAvaFFkOXVOM2pRd3pBZ05BdDdtd0UwbEFkQ1l5TmlwUkVhTlkyVlJtaVEwTnZ0Tmd4RFNaS3Fxam9jRG1OOHRWcnRkanZQODlxMnpmT2NJK2pOWmxPV0pmVUpYeFJGMSt1VkxvdWk4SDJmK2szVGtDUHhNajNpT0I1OVdaWUo5M2lBa1pqWXZmLzNsU2FxbUVSbzJrZHhMcUFuU1lZdit5SE80L1I0Qk0xWHBSbEQ0Mi84RnhYRlJrUk5nOVEweUpHSGpZanl3T21CamZpZkc3R3U2L3ZsOFhpa2FZa3orZXdsMjcyVDI5SHpXZmI3L1hxOWRsMjM2N29zeThpU3hpK1hDd0VOZ2tBVVJSSk0wN1R2KytlM0V4ekh3VVpFNkVlYW5zL240S0FGMjdZUm1nbTBaVm53b0UzVGhBZHRHQVk4Nk9WeWlkQk1vSFZkaHdldGFSbzg2TVZpQVE5YVZWV0VaZ0t0S0FvODZKZmNYRmhEZjMvTDRkOCtCUmdBK1JOV1N4UGlSNHdBQUFBQVNVVk9SSzVDWUlJPSIvPicpOwprLnBsYXlCdXR0b258fChrLnBsYXlCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLWxlZnQ6IDZweDtwYWRkaW5nLWJvdHRvbTogNnB4OyIgc3JjPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUR3QUFBQThDQUlBQUFDMW5rNGxBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQXlocFZGaDBXRTFNT21OdmJTNWhaRzlpWlM1NGJYQUFBQUFBQUR3L2VIQmhZMnRsZENCaVpXZHBiajBpNzd1L0lpQnBaRDBpVnpWTk1FMXdRMlZvYVVoNmNtVlRlazVVWTNwcll6bGtJajgrSUR4NE9uaHRjRzFsZEdFZ2VHMXNibk02ZUQwaVlXUnZZbVU2Ym5NNmJXVjBZUzhpSUhnNmVHMXdkR3M5SWtGa2IySmxJRmhOVUNCRGIzSmxJRFV1Tmkxak1EWTNJRGM1TGpFMU56YzBOeXdnTWpBeE5TOHdNeTh6TUMweU16bzBNRG8wTWlBZ0lDQWdJQ0FnSWo0Z1BISmtaanBTUkVZZ2VHMXNibk02Y21SbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OHhPVGs1THpBeUx6SXlMWEprWmkxemVXNTBZWGd0Ym5NaklqNGdQSEprWmpwRVpYTmpjbWx3ZEdsdmJpQnlaR1k2WVdKdmRYUTlJaUlnZUcxc2JuTTZlRzF3UFNKb2RIUndPaTh2Ym5NdVlXUnZZbVV1WTI5dEwzaGhjQzh4TGpBdklpQjRiV3h1Y3pwNGJYQk5UVDBpYUhSMGNEb3ZMMjV6TG1Ga2IySmxMbU52YlM5NFlYQXZNUzR3TDIxdEx5SWdlRzFzYm5NNmMzUlNaV1k5SW1oMGRIQTZMeTl1Y3k1aFpHOWlaUzVqYjIwdmVHRndMekV1TUM5elZIbHdaUzlTWlhOdmRYSmpaVkpsWmlNaUlIaHRjRHBEY21WaGRHOXlWRzl2YkQwaVFXUnZZbVVnVUdodmRHOXphRzl3SUVORElESXdNVFVnS0UxaFkybHVkRzl6YUNraUlIaHRjRTFOT2tsdWMzUmhibU5sU1VROUluaHRjQzVwYVdRNlF6UTVOelUxTnprMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpSUhodGNFMU5Pa1J2WTNWdFpXNTBTVVE5SW5odGNDNWthV1E2UXpRNU56VTFOMEUyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lQaUE4ZUcxd1RVMDZSR1Z5YVhabFpFWnliMjBnYzNSU1pXWTZhVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBETkRrM05UVTNOelkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSWdjM1JTWldZNlpHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcERORGszTlRVM09EWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJdlBpQThMM0prWmpwRVpYTmpjbWx3ZEdsdmJqNGdQQzl5WkdZNlVrUkdQaUE4TDNnNmVHMXdiV1YwWVQ0Z1BEOTRjR0ZqYTJWMElHVnVaRDBpY2lJL1B2VmtHSWtBQUFIWlNVUkJWSGphN0pneGlzSlFFSVoxWGJCUm13aGlEaUI2Z1UwdHBCSUVDNHVBaFUwTUJGdkZYcTBWUEVDQ1ZvTGFlZ0dMaUtXRkhpQ2tqckd4akxNdWlHekEzZVVsei9mWSthc1FuUEJsL09kbFp1S3Fxc1o0MDd2cnV2eEJuMDRuL3FBdmx3dC8wTDd2SXpRTnZjVTRGTm9Eb2JFUU1kTUlqWjdHVEg4cWtjdmxTT0xUNlhTOVh0L3Y5MVR0NFpPcFdxMTJ1OTM1Zko1S3BYeGFJb1dHVE1PckY0dkY5WHBkS0JUNGdMNlhSQ2FUV1N3V2pVYURCblM0YnV2MWVvUEI0Q3Y5N0hvNitNUmFyV1lZUmo2ZjU4QWVqd0tMTDVmTGNya2NFWFFpbTgyUy9GTWZOd1h2SjVQSlNxVUNGN3ZkampsN1BQODJ0ZHZ0eVdRUytta1krV2RjbHVYcGRBcUdZYm9RZ3lxVlNzQU5CUnFhcHdWQklQUzBKRWsvL2d3c0RpbUhvM0N6MmZDUjZidWF6ZVpzTmlPM09PM1dWTHJweGEzcG44TFA1N091NitTSElMMSsrbkE0QUxIak9LOGZBbjRaYnBybWNEamtabklCUzBBTHRWcXRHQnEzbm9lREpUcWR6dkY0NUdhd2haNUpVWlRRaVNPMFI3L2Zod2FWMFdrOEdHN2J0cVpwWUF4dVZnaVdaYlZhTFNnK3B2Y2VqK0dqMFdnOEh0Tlkxb1R5Rk0velZGWGRicmVVbGpXRVF5Z000ZERCQVhHa0p2Nm11Q2lLdU10RGFGejFJalJDWXlGaXBoRWFvYkVRRWZvZlFWOEZHQUJHRUo0VTVGSWZ6d0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLm11dGVCdXR0b258fChrLm11dGVCdXR0b249JzxpbWcgc3R5bGU9Im1heC13aWR0aDogMjVweDtwYWRkaW5nLXJpZ2h0OiA2cHg7cGFkZGluZy1ib3R0b206IDZweDsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FJQUFBQzFuazRsQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUF5aHBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNRFkzSURjNUxqRTFOemMwTnl3Z01qQXhOUzh3TXk4ek1DMHlNem8wTURvME1pQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1BTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZJaUI0Yld4dWN6cDRiWEJOVFQwaWFIUjBjRG92TDI1ekxtRmtiMkpsTG1OdmJTOTRZWEF2TVM0d0wyMXRMeUlnZUcxc2JuTTZjM1JTWldZOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOXpWSGx3WlM5U1pYTnZkWEpqWlZKbFppTWlJSGh0Y0RwRGNtVmhkRzl5Vkc5dmJEMGlRV1J2WW1VZ1VHaHZkRzl6YUc5d0lFTkRJREl3TVRVZ0tFMWhZMmx1ZEc5emFDa2lJSGh0Y0UxTk9rbHVjM1JoYm1ObFNVUTlJbmh0Y0M1cGFXUTZRMFpDTURjMFFqQTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaUlIaHRjRTFOT2tSdlkzVnRaVzUwU1VROUluaHRjQzVrYVdRNlEwWkNNRGMwUWpFMk5VVXdNVEZGTlRrNVJqaEJNME16UTBVeE4wVTBSRGdpUGlBOGVHMXdUVTA2UkdWeWFYWmxaRVp5YjIwZ2MzUlNaV1k2YVc1emRHRnVZMlZKUkQwaWVHMXdMbWxwWkRwRE5EazNOVFUzUmpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBETkRrM05UVTRNRFkxUlRBeE1VVTFPVGxHT0VFelF6TkRSVEUzUlRSRU9DSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QcldmMzhjQUFBSlVTVVJCVkhqYTdKbS9qd0ZCRk1lNXUzSlJjOVJFZmZ3QkxsR2lvSEk2ald2OUFWUlhpZWdGQ1kyd0NqcjA0aC9nTDlENzBZaHE3NXVkWkNMcmR0bmQyYzNOM2J4aThxemRONTk1Ny90bTdmS1d5MlVQYi9heTMrLzVnejRjRHZ4Qm44OW4vcUFWUlJIUWJ0aVRoME1UOGhEUW9oRkZwZ1cwMERSN2FJV3AxZXQxeFhsakJpMUowbkE0ekdReUxrQ3owYlRQNTJ1MzI5Rm9GTDRMVGNJQU9oUUt0VnF0V0N4R1BqS0JSc1V3em1ZelI2Q1IzVzYzNi9mNzZSRTdBYlBaTE1icGRJcXd5QUljOXJ2SExiRTErMUFOenB0cWNHamRHTzhlcUtBc3k3ZkVqMGNvRm91VlNnVU9ZWVh6cWhxdGxlbEdSS1Z5dVp6QmNwUEo1SS9INzhxalZDcGhIQXdHaVVRQ0hZenpNVkpFaldOTzAxaXhIcGF4NlFXa3JLbFVDazYvMzZlc21ndHZIUlB5c0NaUVRaQlAxZUM4cS9ZSTRsMTVPSFViLzFLTnFNaGF4Vno5d1VRQ1FsMlBwOU9zUEhTaDdjamplclRwdUpwcEpnbldiY1EvOWJobFV4Nk9acHBMZVRpVjZjVmlnVHM4WjQzWTYvWEl4OGxrUWc2ZVRpZXlqTitiYVdyNFVVVWRBbTJCWGd1dE4vZHV0MXV2MTNyZll0WjRQRzVxTWN2bFVyTU1UQkVPaDFudUhySnFCbGMyR28xOFBtK2hSSkQ3dFlQelFXK2NlMmFhcmxhcm04Mm1WcXRaMXRWOFByOTJjT0h4ZUhTOEVUdWREcVpwTnBzMm00SFNqOGRqRW1HNzNVSTVUdTBlbUlad0J3SUIrOCtJbEg2MVdobUU4bHByQlkyaEtVZWpFZUdPUkNKOHZHR0N1QXVGd3JVaStYakRCTzUwT28zUkJXaHZNQmhrV0Rqc1hMaDNPQzJQWjBtU0dJYTdYQzdpVmEvNEowQkEvdzlvMFlnQ1drQ0xSaFR5RU5ETTdWdUFBUUJ3b3Z2SXYwOVk2Z0FBQUFCSlJVNUVya0pnZ2c9PSIvPicpOwprLnVubXV0ZUJ1dHRvbnx8KGsudW5tdXRlQnV0dG9uPSc8aW1nIHN0eWxlPSJtYXgtd2lkdGg6IDI1cHg7cGFkZGluZy1yaWdodDogNnB4O3BhZGRpbmctYm90dG9tOiA2cHg7IiBzcmM9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRHdBQUFBOENBSUFBQUMxbms0bEFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBeWhwVkZoMFdFMU1PbU52YlM1aFpHOWlaUzU0YlhBQUFBQUFBRHcvZUhCaFkydGxkQ0JpWldkcGJqMGk3N3UvSWlCcFpEMGlWelZOTUUxd1EyVm9hVWg2Y21WVGVrNVVZM3ByWXpsa0lqOCtJRHg0T25odGNHMWxkR0VnZUcxc2JuTTZlRDBpWVdSdlltVTZibk02YldWMFlTOGlJSGc2ZUcxd2RHczlJa0ZrYjJKbElGaE5VQ0JEYjNKbElEVXVOaTFqTURZM0lEYzVMakUxTnpjME55d2dNakF4TlM4d015OHpNQzB5TXpvME1EbzBNaUFnSUNBZ0lDQWdJajRnUEhKa1pqcFNSRVlnZUcxc2JuTTZjbVJtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekF5THpJeUxYSmtaaTF6ZVc1MFlYZ3Ribk1qSWo0Z1BISmtaanBFWlhOamNtbHdkR2x2YmlCeVpHWTZZV0p2ZFhROUlpSWdlRzFzYm5NNmVHMXdQU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2SWlCNGJXeHVjenA0YlhCTlRUMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMMjF0THlJZ2VHMXNibk02YzNSU1pXWTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl6Vkhsd1pTOVNaWE52ZFhKalpWSmxaaU1pSUhodGNEcERjbVZoZEc5eVZHOXZiRDBpUVdSdlltVWdVR2h2ZEc5emFHOXdJRU5ESURJd01UVWdLRTFoWTJsdWRHOXphQ2tpSUhodGNFMU5Pa2x1YzNSaGJtTmxTVVE5SW5odGNDNXBhV1E2UTBaQ01EYzBRalEyTlVVd01URkZOVGs1UmpoQk0wTXpRMFV4TjBVMFJEZ2lJSGh0Y0UxTk9rUnZZM1Z0Wlc1MFNVUTlJbmh0Y0M1a2FXUTZRMFpDTURjMFFqVTJOVVV3TVRGRk5UazVSamhCTTBNelEwVXhOMFUwUkRnaVBpQThlRzF3VFUwNlJHVnlhWFpsWkVaeWIyMGdjM1JTWldZNmFXNXpkR0Z1WTJWSlJEMGllRzF3TG1scFpEcERSa0l3TnpSQ01qWTFSVEF4TVVVMU9UbEdPRUV6UXpORFJURTNSVFJFT0NJZ2MzUlNaV1k2Wkc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRFJrSXdOelJDTXpZMVJUQXhNVVUxT1RsR09FRXpRek5EUlRFM1JUUkVPQ0l2UGlBOEwzSmtaanBFWlhOamNtbHdkR2x2Ymo0Z1BDOXlaR1k2VWtSR1BpQThMM2c2ZUcxd2JXVjBZVDRnUEQ5NGNHRmphMlYwSUdWdVpEMGljaUkvUGkvZHFHd0FBQVNGU1VSQlZIamE3SmxMVEJOQkdNZTNpRWlsNzI1TGEwdVFpNjJQQXhvREhQSEN6WlpFcWlhUVFBMkp3c0ZYdkdoTUNIZmZKaVlHMUNZZVJFRTB4SVB0Qlk3WUV5YUMrRUtJRUJNcjdXNFZpb2pXYjNldFdicXoyMDVaMUUzMk8yd21PelBmL1BhYi96eFgwOTdlVGlqTmloT0poUEtnS1lwU0huUXFsVkllZERxZFZxSC9oaFVSQ2pSVkhpcTBPaERWU0t2UXFxYi9mYVRQek0zdG8ra3R5OHRmTm13NDVQRjhMQ25oNTNaM2QzZDFkZVYwc2kyVmFvN0Z3SS8reDQ5WFd1MWhqd2N2MG1rY3E2Y29hQXlJb1NhMGQzbHFTcmV5d21YcGRMcSt2ajZmejVmVHliYkZ4ZDQzYjN6eE9IZ0FQNTVVYXYvOFBCWUdKalJOODcvWXM3VFU4L1l0Y0FOeFQwK1BodzFZVG1Lb292LzVrKzluZnp5T2hZRW5EeTQyZlBNdUxmVytlMGNNRDN1OVh1Nk5oRU1JYXUvVWxHRTFNYklXOUJnOGg0YUdaSkRIRFpzdFdWUWs1UFllTzBaa1RrQVNNYjRsUW56WGF1WEsrRmlEQkhTYTMrOFhsUWZXQ0lCQmM2U3FTc2hOUEg5TzFOY1Q0aWMzaVBIdDkrK1J4T2RkTGxkblowdExDNlQzc3NZRUl0TnZNa1FhYkxLME5MaDFxd1EzTXNaaXhJLzkvc2NtRThjS0pWMnMvWkVLdHFhaGR4b2JHOFcrOVVzc1ptaHVKbGFQUzQ0YnhpWE1odnpCZW1kNkdrbWN2SFp0UzIxdE9oalU2L1YvRUxNU2VQTTBmSEZOVFkyVVZrWkdtTkFLdU85czJ0UldXY2x4Zzl4RE16Tkk0bk5PWjJOdExaOU1Jb0Voanh3Q3I2NW11STNHck5mYnYzMERVSWczNkZpTU9OclI4U2hUVVJwYWhvR1lQM2QwOCtaSGlRUmFGVmV2RW0xdGE5cDdGQmptWE55TXZyT1V3OXBaaDJPeXJpNVBWUlN5SXE2VlcyRFBPam9HRFliMG1tM05rYzZibTFGRmEydWVBVjVQVFdkeFg3a2lsbm5kWW5uSnpoWHk3S2Rsa0FkblkyUEV5Wk5pbWEwVTVZckY4Zzl3Z1pyR0poYk8yVHlEYWNRTkMvWFltQ3pRb29zTEJuY3U0dDlHMDlzN083MU9wM0RaazBpc3o1UVhDaEc3ZCtjbXpzVDd5ZHpjam1qMG4wWWFpSU5COUttTUpPRjU0Zk5uQlBxSkU4VFJvMWc2eWQ1N2lQSE16czZPam82S3hzeGdZQUltVHZ4UXArUFNTTzY2bXpjUGtDUTA0WGE3NVR6WURyQW1WcTNwNjljTDgvTm9ZcXQxb0t5TVlOMXlDV1JKK0pqSTRPQnRuUTRBZ043QUxqcjVScnFBZXcrR09CNUhaTURpRWdyMVErL3pmUGFYbGRFYURYQWJCUTAxM0xzWHRsamdTQndPaHpsRW1oMGJoVzlOUllrWEZpNktFY09pV0YyZFBuNDhLeWVzMVg2dzIrOS8raVRrQmxmd2FvQ0ZacjZ3djU5am5aaVlBT1dJc1dtd1ZCVllXTGlFL0lXWElZWmtSVVVGc3U2TzVlVUhzWmdSeFhIYWJJWU9XZFVKRFEzd2pFUWlNdHd3QlJZWEVmT3ZSbk42eng2NnFrcTY3a1JKeVVHYkRRcm40emJDbWp4blJHR1Q4Q1pBa2c5ZXZ3NEVBbnhGSW0xODQwWW9qSFN5anBjMVQwdExzeHBySWtsQVlZREd4NkZQNFNudEFRbzNDYmpCTFJhR3h1bDBZaW5rTWtVZFl2K1h2aWd1UG1VeUFVVFcvSjFNSm5NNjJmbjlPL2padGJJQzZmdGFMZmpCWXRBNEhBN0YzWm9xRTdxOHZGeDUwSGE3WFhuUU5wdE5lZEFrdTRkVW9kY2YybXExS2cvYVlyRW9EOXBzTmlzUDJvUzVoS3JRaFVJYjg3ZzQvTytnWVYrbVBHanVmNGV5N0pjQUF3RGFuT0xJTy9wZ2tBQUFBQUJKUlU1RXJrSmdnZz09Ii8+Jyk7Cmsuc2tpcGFibGVCdXR0b258fChrLnNraXBhYmxlQnV0dG9uPSc8ZGl2IHN0eWxlPSJvcGFjaXR5OiAwLjY7bWluLWhlaWdodDogMjVweDttYXgtaGVpZ2h0OiAyNXB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7ZGlzcGxheTogaW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OiAyNXB4O3BhZGRpbmctbGVmdDogNnB4O21hcmdpbi1yaWdodDogNnB4O3BhZGRpbmctcmlnaHQ6IDZweDtib3JkZXI6ICNGRkZGRkY7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSk7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXg7Ij5Ta2lwIEFkIGluIFt0aW1lXXM8ZGl2PicpOwprLnNraXBCdXR0b258fChrLnNraXBCdXR0b249JzxkaXYgc3R5bGU9Im1pbi1oZWlnaHQ6IDI1cHg7bWF4LWhlaWdodDogMjVweDtvcGFjaXR5OiAwLjY7bWFyZ2luLXJpZ2h0OiA2cHg7cGFkZGluZy1sZWZ0OiA2cHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6IDI1cHg7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBOEFOVUFBQThQRHlrcEtTMHRMUk1URXhZV0ZoNGVIaU1qSTJSa1pDSWlJaXNyS3hFUkVTb3FLak16TXpJeU1qYzNOem82T2k4dkx4a1pHVFkyTmtORFF4SVNFaHNiR3hjWEZ5UWtKQ2NuSng4Zkh5NHVMaFVWRlRrNU9SMGRIUTBORFZOVFV5RWhJVFUxTlJvYUdnNE9EaVltSmpBd01DQWdJQkFRRURRME5ERXhNUlFVRkRnNE9DZ29LQmdZR0NVbEpTd3NMQndjSEFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNIL0MxaE5VQ0JFWVhSaFdFMVFQRDk0Y0dGamEyVjBJR0psWjJsdVBTTHZ1NzhpSUdsa1BTSlhOVTB3VFhCRFpXaHBTSHB5WlZONlRsUmplbXRqT1dRaVB6NGdQSGc2ZUcxd2JXVjBZU0I0Yld4dWN6cDRQU0poWkc5aVpUcHVjenB0WlhSaEx5SWdlRHA0YlhCMGF6MGlRV1J2WW1VZ1dFMVFJRU52Y21VZ05TNDJMV014TXpnZ056a3VNVFU1T0RJMExDQXlNREUyTHpBNUx6RTBMVEF4T2pBNU9qQXhJQ0FnSUNBZ0lDQWlQaUE4Y21SbU9sSkVSaUI0Yld4dWN6cHlaR1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTHpFNU9Ua3ZNREl2TWpJdGNtUm1MWE41Ym5SaGVDMXVjeU1pUGlBOGNtUm1Pa1JsYzJOeWFYQjBhVzl1SUhKa1pqcGhZbTkxZEQwaUlpQjRiV3h1Y3pwNGJYQTlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzhpSUhodGJHNXpPbmh0Y0UxTlBTSm9kSFJ3T2k4dmJuTXVZV1J2WW1VdVkyOXRMM2hoY0M4eExqQXZiVzB2SWlCNGJXeHVjenB6ZEZKbFpqMGlhSFIwY0RvdkwyNXpMbUZrYjJKbExtTnZiUzk0WVhBdk1TNHdMM05VZVhCbEwxSmxjMjkxY21ObFVtVm1JeUlnZUcxd09rTnlaV0YwYjNKVWIyOXNQU0pCWkc5aVpTQlFhRzkwYjNOb2IzQWdRME1nTWpBeE55QW9UV0ZqYVc1MGIzTm9LU0lnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGT1RaRFFqVkdNMFJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSWdlRzF3VFUwNlJHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR05FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJK0lEeDRiWEJOVFRwRVpYSnBkbVZrUm5KdmJTQnpkRkpsWmpwcGJuTjBZVzVqWlVsRVBTSjRiWEF1YVdsa09rVTVOa05DTlVZeFJFWXhNakV4UlRZNE5ERkJSVUUzUTBZeFF6STVPVEUxSWlCemRGSmxaanBrYjJOMWJXVnVkRWxFUFNKNGJYQXVaR2xrT2tVNU5rTkNOVVl5UkVZeE1qRXhSVFk0TkRGQlJVRTNRMFl4UXpJNU9URTFJaTgrSUR3dmNtUm1Pa1JsYzJOeWFYQjBhVzl1UGlBOEwzSmtaanBTUkVZK0lEd3ZlRHA0YlhCdFpYUmhQaUE4UDNod1lXTnJaWFFnWlc1a1BTSnlJajgrQWYvKy9mejcrdm40OS9iMTlQUHk4ZkR2N3UzczYrcnA2T2ZtNWVUajR1SGczOTdkM052YTJkalgxdFhVMDlMUjBNL096Y3pMeXNuSXg4YkZ4TVBDd2NDL3ZyMjh1N3E1dUxlMnRiU3pzckd3cjY2dHJLdXFxYWlucHFXa282S2hvSitlblp5Ym1wbVlsNWFWbEpPU2taQ1BqbzJNaTRxSmlJZUdoWVNEZ29HQWYzNTlmSHQ2ZVhoM2RuVjBjM0p4Y0c5dWJXeHJhbWxvWjJabFpHTmlZV0JmWGwxY1cxcFpXRmRXVlZSVFVsRlFUMDVOVEV0S1NVaEhSa1ZFUTBKQlFEOCtQVHc3T2prNE56WTFORE15TVRBdkxpMHNLeW9wS0NjbUpTUWpJaUVnSHg0ZEhCc2FHUmdYRmhVVUV4SVJFQThPRFF3TENna0lCd1lGQkFNQ0FRQUFJZmtFQUFBQUFBQXNBQUFBQUFFQVBBQUFCamZBdzJmeTRLeFdEa2tJaFdJMFVxa1NSQ040dlJLTEFJdUZJYmxjRndNQ1pESmxDaDBZckNLS3RGb1d3a2FsR2xBVXB4Tmc1QWtDQURzPSIpO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14OyI+U2tpcCBBZDxpbWcgc3R5bGU9Im1heC13aWR0aDogMzBweDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246IG1pZGRsZTsiIHNyYz0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEd0FBQUE4Q0FZQUFBQTYvTmx5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUEzQnBWRmgwV0UxTU9tTnZiUzVoWkc5aVpTNTRiWEFBQUFBQUFEdy9lSEJoWTJ0bGRDQmlaV2RwYmowaTc3dS9JaUJwWkQwaVZ6Vk5NRTF3UTJWb2FVaDZjbVZUZWs1VVkzcHJZemxrSWo4K0lEeDRPbmh0Y0cxbGRHRWdlRzFzYm5NNmVEMGlZV1J2WW1VNmJuTTZiV1YwWVM4aUlIZzZlRzF3ZEdzOUlrRmtiMkpsSUZoTlVDQkRiM0psSURVdU5pMWpNVE00SURjNUxqRTFPVGd5TkN3Z01qQXhOaTh3T1M4eE5DMHdNVG93T1Rvd01TQWdJQ0FnSUNBZ0lqNGdQSEprWmpwU1JFWWdlRzFzYm5NNmNtUm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUx6QXlMekl5TFhKa1ppMXplVzUwWVhndGJuTWpJajRnUEhKa1pqcEVaWE5qY21sd2RHbHZiaUJ5WkdZNllXSnZkWFE5SWlJZ2VHMXNibk02ZUcxd1RVMDlJbWgwZEhBNkx5OXVjeTVoWkc5aVpTNWpiMjB2ZUdGd0x6RXVNQzl0YlM4aUlIaHRiRzV6T25OMFVtVm1QU0pvZEhSd09pOHZibk11WVdSdlltVXVZMjl0TDNoaGNDOHhMakF2YzFSNWNHVXZVbVZ6YjNWeVkyVlNaV1lqSWlCNGJXeHVjenA0YlhBOUltaDBkSEE2THk5dWN5NWhaRzlpWlM1amIyMHZlR0Z3THpFdU1DOGlJSGh0Y0UxTk9rOXlhV2RwYm1Gc1JHOWpkVzFsYm5SSlJEMGllRzF3TG1ScFpEcEZPVFpEUWpWR01FUkdNVEl4TVVVMk9EUXhRVVZCTjBOR01VTXlPVGt4TlNJZ2VHMXdUVTA2Ukc5amRXMWxiblJKUkQwaWVHMXdMbVJwWkRwRlJqYzNPVUZHTUVSR1JEVXhNVVUyT0VNMU9VRTRRa0pHUmpkR05rUTNOaUlnZUcxd1RVMDZTVzV6ZEdGdVkyVkpSRDBpZUcxd0xtbHBaRHBGUmpjM09VRkZSa1JHUkRVeE1VVTJPRU0xT1VFNFFrSkdSamRHTmtRM05pSWdlRzF3T2tOeVpXRjBiM0pVYjI5c1BTSkJaRzlpWlNCUWFHOTBiM05vYjNBZ1EwTWdNakF4TnlBb1RXRmphVzUwYjNOb0tTSStJRHg0YlhCTlRUcEVaWEpwZG1Wa1JuSnZiU0J6ZEZKbFpqcHBibk4wWVc1alpVbEVQU0o0YlhBdWFXbGtPbVF6WXprMU5EQm1MVFZsWVRNdE5EbGxOQzFoTkdVeUxXUTJNalF5TlRjelptVTVZU0lnYzNSU1pXWTZaRzlqZFcxbGJuUkpSRDBpZUcxd0xtUnBaRHBGT1RaRFFqVkdNRVJHTVRJeE1VVTJPRFF4UVVWQk4wTkdNVU15T1RreE5TSXZQaUE4TDNKa1pqcEVaWE5qY21sd2RHbHZiajRnUEM5eVpHWTZVa1JHUGlBOEwzZzZlRzF3YldWMFlUNGdQRDk0Y0dGamEyVjBJR1Z1WkQwaWNpSS9QbTZYTlQ0QUFBSnFTVVJCVkhqYVl2ei8vei9EU0FKTURDTU1qSHA0MU1PakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDdFQmxzSG1JRU5Ed3dCczR1ZlBuOTlBRlF0QUF3RFV4alkyTmpGZFhWMHI5ZlgxL1VqVkM5V0RBc2d4QnhlbVNaTDJCWUxTMHRLd0ZTdFdyQVI2UGdya1lGSWlnQml4UVpXSGVYbDVlVUMwaG9ZR3g3WnQyNWFxQVlHZW5wNFBrUjcrUjR6WW9QSXdjb3p3OGZFeHJGNjl1anNhQ0hSMWRYMEdPb2JwVm1pVmw1ZEhxS3VyYTFoWldmRWNPM1pzeFlnb3BRTUNBZ3lBeVh5K201c2J6ek1ndUhMbHlyYmhrcVJ4T2hDVXI5ZXNXVFBiRVFpMHRiVzloa1doUlFpQTh2WGt5Wk5Mc3JLeU1yVzB0RHlHVmFHRkQyUm5aL3RNbWpScHNwbVpXY2l3SzdSd0FSY1hGeFZwYWVtRmdZR0JNamVBWUVTMHBUVTFOYmtXTGx6WUR5elUvR21kcEZsb2xLVC9rWk92Mjl2Yk00Q0Ztc2F3SzdUd2dmajRlSWNoVjJpTnVQNHdKVW53MDZkUERDTW1TVis3ZHUwYnNLTVZQNnhhV3JqQS9Qbno5NEc2bFUrQVlGakhNQ2dKQS92T1U1cUI0TzdkdS91R2FyVkVkQkl1S1NrcHZuNzkrbzM3OSs4ZkdOWXRMV0FINGt4VFUxUGpwVXVYdGd6YjdpRU1BRDI2YU42OGVYTWZQSGh3aU43ZFE3cTJ0QjQvZnN5UWxwYVdDVXpLMXg0K2ZIaG9XSTk0SEQ5Ky9Ga3FFQUFMcVUrUEhqMDZRa3BnRGJsQ3E2K3ZiMTAvRUFCaitBZzVCZDZRaWVHUEh6OHlwS1NrbEo0QUFtSThPMlNibGxldlhyMnlZOGVPRys3dTd1SEFwSHlNRk0vU09rblRaT2FCRWl3bEpXV0ZQdk1BRmFPSytZTnViZ2tVbTBBUFd0TEtmTWJSeGFXakhoNzE4S2lIUnowODZ1RlJENDk2ZU5URG94NGU5ZkNvaDBjOVBPcGhCZ2FBQUFNQUdtQzBwZUpjR0VJQUFBQUFTVVZPUks1Q1lJST0iLz48L2Rpdj4nKTsKaWYoay5zaWRlbG9hZHMpe3ZhciBjPWZ1bmN0aW9uKCl7fTtrLnNpZGVsb2Fkcy5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWEuYWxpYXM7ImZ1bmN0aW9uIj09PXR5cGVvZiBiJiYoYj1iKCkpO2E9YS51cmw7ImZ1bmN0aW9uIj09PXR5cGVvZiBhJiYoYT1hKCkpO2YuWWEoYSxiLFtdLGMsYyxtKX0pfW0uYyhrLmdsb2JhbENvbmZpZyxrLmNsaWVudENvbmZpZyxrLnByZWNoZWNrZWQsay5vblJlYWR5LGsub25GYWlsdXJlLGspO2RvY3VtZW50LmhkX3JlYWR5PSEwO3ZhciBiPWsuc3RhcnRQbGF5ZXI7YiYmImZ1bmN0aW9uIj09PXR5cGVvZiBiJiZiKCl9ZWxzZSBiYShhYSw1MCl9ZnVuY3Rpb24gY2EoYyxiKXtifHwoYj0icHJlIik7aWYoayYmbSl7Yy5wYXVzZSgpO3ZhciBhPW5ldyBOKGMpLGE9bmV3IE8oYSxtKSxnPWsuYWRUYWc7InByZSI9PWImJmsucHJlcm9sbEFkVGFnJiYoZz1rLnByZXJvbGxBZFRhZyk7InBvc3QiPT1iJiZrLnBvc3Ryb2xsQWRUYWcmJihnPWsucG9zdHJvbGxBZFRhZyk7CmcmJihhLmdnKGspLGEuSmQoZykpfWVsc2UgYmEoZnVuY3Rpb24oKXtjYShjKX0uYmluZCh0aGlzKSw1MCl9ZnVuY3Rpb24gcShjLGIpeyhrLmFkVGFnfHxrLnByZXJvbGxBZFRhZykmJmMucGF1c2UoKTtmLkQobC55YyxjLkIoKSk7aWYoYy5nZXRDdXJyZW50VGltZSl7dmFyIGE9Yy5nZXRDdXJyZW50VGltZSgpO2EmJmYudHJhY2soImFjdGl2YXRlZEF0IixhKX1rJiZtPyhiP20ub2E9ITA6Zi50cmFjaygic3RhdHNfaGRfYWJkIiwiIiwhMCksYT1uZXcgZGEsYS5ZYyhjKSxhLkVzKG0pLGEuRHMoayksYS5vcygpLGEuYigpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3EoYyxiKX0uYmluZCh0aGlzKSw1MCl9Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWG09dGhpcy5hWzFdO3RoaXMuZWs9dGhpcy5hWzddO3RoaXMuTXE9dGhpcy5hWzZdO3RoaXMuc2s9dGhpcy5hWzVdOwp0aGlzLmc9dGhpcy5hWzZdfWMudXU9YjtiLnByb3RvdHlwZT17V206ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlhtOnRoaXMuZGsoYSl9LGRrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5lazp0aGlzLkxxKGEpfSxMcTpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuTXE6dGhpcy5yayhhKX0scms6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnNrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgZWE9Yy51dXx8ZWEsSGM9bmV3IGVhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9SGMuV20oNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuRWE9InNldHVwIjt0aGlzLmRjPVtdO3RoaXMuU2UoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy5jcy5iaW5kKHRoaXMpKX0KYy5TaT1iO2IucHJvdG90eXBlPXtTZTpmdW5jdGlvbigpe3RoaXMubGE9e3VybHM6e30saG9tYWRVcmxzOnt9LG9yaWdpbmFsVXJsczp7fSxzY3JpcHRzOnt9LGV2ZW50bGlzdGVuZXI6W10sZ2VuZXJhbEV2ZW50bGlzdGVuZXI6W10saUZyYW1lczpbXSxpRnJhbWVPbkxvYWRIYW5kbGVyOnt9LGlGcmFtZVVybDoiIix0cmFjZTpbXSxzdGFjazpbXSxlcnJtc2c6W119fSxGbTpmdW5jdGlvbihhKXt0aGlzLmxhLmVycm1zZy5wdXNoKGEpfSxwb3N0TWVzc2FnZTpmdW5jdGlvbihhLGIpe3RyeXthLmNvbnRlbnRXaW5kb3cmJihhPWEuY29udGVudFdpbmRvdyl9Y2F0Y2goZCl7fWEucG9zdE1lc3NhZ2UoYiwiKiIpfSxHYTpmdW5jdGlvbihhLGIsZCl7dGhpcy5wb3N0TWVzc2FnZShhLHt0eXBlOiJ2cGFpZCIsZXZlbnQ6YixkYXRhOmR9KX0sY3M6ZnVuY3Rpb24oYSl7YSYmYS5kYXRhJiZhLmRhdGEudHlwZSYmInZwYWlkIj09YS5kYXRhLnR5cGUmJnRoaXMuYnMoYS5kYXRhKX0sYnM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQowO2I8dGhpcy5sYS5ldmVudGxpc3RlbmVyLmxlbmd0aDtiKyspYS5ldmVudD09dGhpcy5sYS5ldmVudGxpc3RlbmVyW2JdLm5hbWUmJnRoaXMubGEuZXZlbnRsaXN0ZW5lcltiXS5jYihhKX0scmQ6ZnVuY3Rpb24oYSxiKXt0aGlzLmxhLmV2ZW50bGlzdGVuZXIucHVzaCh7bmFtZTphLGNiOmJ9KX0sRG06ZnVuY3Rpb24oYSxiKXswPT09Yi5pbmRleE9mKCIvLyIpJiYoYj0iaHR0cHM6IitiKTt0aGlzLmxhLnVybHNbYV09Yjt0aGlzLmxhLnVybHNbYl09YTt0aGlzLmxhLmhvbWFkVXJsc1thXT1iO3RoaXMubGEub3JpZ2luYWxVcmxzW2JdPWF9LGJmOmZ1bmN0aW9uKGEpe3ZhciBiPSExO3RoaXMubGEub3JpZ2luYWxVcmxzW2FdJiYoYj10aGlzLmxhLm9yaWdpbmFsVXJsc1thXSk7cmV0dXJuIGJ9LCRhOmZ1bmN0aW9uKGEsYil7Ynx8KGI9IiIpO2Zvcih2YXIgZD0wO2Q8dGhpcy5sYS5lcnJtc2cubGVuZ3RoO2QrKyliKz0iXG4iK3RoaXMubGEuZXJybXNnW2RdO3RoaXMudHJhY2soInN0YXRzX3ZwYWlkXyIrCmEsYiwhMCl9LERhOmZ1bmN0aW9uKGEpe2lmKCFhfHwib2JqZWN0IiE9PXR5cGVvZiBhKXJldHVybiAwO3ZhciBiPTAsZD0iIjtmb3IoZCBpbiBhKWEuaGFzT3duUHJvcGVydHkoZCkmJmIrKztyZXR1cm4gYn0saGY6ZnVuY3Rpb24oYSxiKXt2YXIgZD1hW2JdO3JldHVybiJzdHJpbmciPT09dHlwZW9mIGQ/ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZCk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGQoKSk6Im9iamVjdCI9PT10eXBlb2YgZD9kOm51bGx9LFhzOmZ1bmN0aW9uKGEpe2Zvcig7YSE9ZG9jdW1lbnQuYm9keSYmbnVsbCE9YTspYT1hLnBhcmVudEVsZW1lbnQ7cmV0dXJuIGE9PWRvY3VtZW50LmJvZHk/ITA6ITF9LERmOmZ1bmN0aW9uKGEpe3JldHVybiBhJiZhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCYmImZ1bmN0aW9uIj09PXR5cGVvZiBhLmdldEJvdW5kaW5nQ2xpZW50UmVjdD8oYT1hLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKT8wPD0KYS50b3AmJjA8PWEubGVmdCYmYS5ib3R0b208PSh3aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpJiZhLnJpZ2h0PD0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCk6ITE6ITF9LEVmOmZ1bmN0aW9uKGEsYil7dmFyIGQ9MCxlPTAsYz0wLGg9MCxmPSExO2lmKCFhfHwhYS5nZXRCb3VuZGluZ0NsaWVudFJlY3R8fCJmdW5jdGlvbiIhPT10eXBlb2YgYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QpcmV0dXJuITE7dmFyIHU9YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZighdSlyZXR1cm4hMTtjPXUuaGVpZ2h0KnUud2lkdGg7ZD11LndpZHRoO2U9dS5oZWlnaHQ7MD51LnRvcCYmKGUrPXUudG9wKTt1LmJvdHRvbT4od2luZG93LmlubmVySGVpZ2h0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSYmKGUtPXUuYm90dG9tLSh3aW5kb3cuaW5uZXJIZWlnaHR8fApkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSk7MD51LmxlZnQmJihkKz11LmxlZnQpO3UucmlnaHQ+KHdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpJiYoZC09dS5yaWdodC0od2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCkpOzA+ZSYmKGU9MCk7MD5kJiYoZD0wKTswPGMmJihoPTEwMC9jKmQqZSk7aD49YiYmKGY9ITApO3JldHVybiBmfSxrYjpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGE/TWF0aC5hYnMoYSk6MTA7cmV0dXJuIE1hdGgucm91bmQoTWF0aC5wb3coMTAsYSkqKC44OTk5OTk5OTkqTWF0aC5yYW5kb20oKSsuMSkpfSxwYTpmdW5jdGlvbihhKXthPWEmJiJudW1iZXIiPT09dHlwZW9mIGEmJjA8YT9NYXRoLnJvdW5kKGEpOjEwO2Zvcih2YXIgYj0iIixkPTA7ZDxhO2QrKyliKz1TdHJpbmcuZnJvbUNoYXJDb2RlKCguNT5NYXRoLnJhbmRvbSgpPwo2NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEJkOmZ1bmN0aW9uKGEpe3ZhciBiPTAsZCxlO2lmKDA9PT1hLmxlbmd0aClyZXR1cm4gYjtmb3IoZD0wO2Q8YS5sZW5ndGg7ZCsrKWU9YS5jaGFyQ29kZUF0KGQpLGI9KGI8PDUpLWIrZSxifD0wO3JldHVybiBifSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBnPSIiLGQsZTtmb3IoZD03OzA8PWQ7ZC0tKWU9YT4+PjQqZCYxNSxnKz1lLnRvU3RyaW5nKDE2KTtyZXR1cm4gZ31mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsYyxoPUFycmF5KDgwKSxmPTE3MzI1ODQxOTMsdT00MDIzMjMzNDE3LGs9MjU2MjM4MzEwMixJPTI3MTczMzg3OCxtPTMyODUzNzc1MjAsbixsLHcscSxyO2E9YSYmInN0cmluZyI9PT10eXBlb2YgYT9hOiIiO249YS5sZW5ndGg7dmFyIHA9W107Zm9yKGU9MDtlPG4tMztlKz00KWM9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsKMSk8PDE2fGEuY2hhckNvZGVBdChlKzIpPDw4fGEuY2hhckNvZGVBdChlKzMpLHAucHVzaChjKTtzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHAucHVzaChlKTsxNCE9cC5sZW5ndGglMTY7KXAucHVzaCgwKTtwLnB1c2gobj4+PjI5KTtwLnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8cC5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT1wW2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09ZChoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtjPWY7bj11O2w9azt3PUk7cT1tO2ZvcihlPQowOzE5Pj1lO2UrKylyPWQoYyw1KSsobiZsfH5uJncpK3EraFtlXSsxNTE4NTAwMjQ5JjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmb3IoZT0yMDszOT49ZTtlKyspcj1kKGMsNSkrKG5ebF53KStxK2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHE9dyx3PWwsbD1kKG4sMzApLG49YyxjPXI7Zm9yKGU9NDA7NTk+PWU7ZSsrKXI9ZChjLDUpKyhuJmx8biZ3fGwmdykrcStoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSxxPXcsdz1sLGw9ZChuLDMwKSxuPWMsYz1yO2ZvcihlPTYwOzc5Pj1lO2UrKylyPWQoYyw1KSsobl5sXncpK3EraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUscT13LHc9bCxsPWQobiwzMCksbj1jLGM9cjtmPWYrYyY0Mjk0OTY3Mjk1O3U9dStuJjQyOTQ5NjcyOTU7az1rK2wmNDI5NDk2NzI5NTtJPUkrdyY0Mjk0OTY3Mjk1O209bStxJjQyOTQ5NjcyOTV9cmV0dXJuKGIoZikrYih1KStiKGspK2IoSSkrYihtKSkudG9Mb3dlckNhc2UoKX0sd2I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQoiIixkLGUsYyxoLGYsdSxrPTA7azxhLmxlbmd0aDspZD1hLmNoYXJDb2RlQXQoaysrKSxlPWEuY2hhckNvZGVBdChrKyspLGM9YS5jaGFyQ29kZUF0KGsrKyksaD1kPj4yLGQ9KGQmMyk8PDR8ZT4+NCxmPShlJjE1KTw8MnxjPj42LHU9YyY2Myxpc05hTihlKT9mPXU9NjQ6aXNOYU4oYykmJih1PTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZCkrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoZikrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQodSk7cmV0dXJuIGJ9LG5xOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci52ZW5kb3ImJgotMTxuYXZpZ2F0b3IudmVuZG9yLmluZGV4T2YoIkFwcGxlIil9LFdlOmZ1bmN0aW9uKCl7dmFyIGE9e30sYj0hMSxkPSExLGU9ITEsYz0hMSxoPSExLGY9ITEsdT0hMSxrPSExLGw9ITEsbT0hMTt0cnl7Yj1jaGVja0ZvclBoYW50b21KUygpfWNhdGNoKG4pe310cnl7L1xiSGVhZGxlc3NDaHJvbWVcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSYmKGQ9ITApfWNhdGNoKHEpe310cnl7ZT13aW5kb3cuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgid2ViZHJpdmVyIil8fG5hdmlnYXRvci5zbj8hMDohMX1jYXRjaChyKXt9dHJ5e2M9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiT3BlcmEiKSxoPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIkZpcmVmb3giKSxmPS0xIT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIlNhZmFyaSIpLHU9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpLGw9LTEhPW5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiQ2hyb21lIiksCms9IXUmJiEhd2luZG93LlN0eWxlTWVkaWEsbT0obHx8YykmJiEhd2luZG93LkNTU31jYXRjaChwKXt9YS5pc1BoYW50b21KUz1iO2EuaXNDaHJvbWVIZWFkbGVzcz1kO2EuaXNGaXJlZm94SGVhZGxlc3M9ZTthLmlzT3BlcmE9YzthLmlzRmlyZWZveD1oO2EuaXNTYWZhcmk9ZjthLmlzSUU9dTthLmlzRWRnZT1rO2EuaXNDaHJvbWU9bDthLmlzQmxpbms9bTtyZXR1cm4gYX0sWG86ZnVuY3Rpb24oKXt2YXIgYT0iVSIsYj10aGlzLldlKCk7Yi5pc1BoYW50b21KUz9hPSJIUCI6Yi5pc0Nocm9tZUhlYWRsZXNzP2E9IkhDIjpiLmlzRmlyZWZveEhlYWRsZXNzP2E9IkhGIjooYi5pc0JsaW5rJiYoYT0iQiIpLGIuaXNPcGVyYSYmKGE9Ik8iKSxiLmlzRmlyZWZveCYmKGE9IkYiKSxiLmlzU2FmYXJpJiYoYT0iUyIpLGIuaXNJRSYmKGE9IkkiKSxiLmlzRWRnZSYmKGE9IkUiKSxiLmlzQ2hyb21lJiYoYT0iQyIpKTtyZXR1cm4gYX0sWGE6ZnVuY3Rpb24oKXt2YXIgYT17b2g6ZnVuY3Rpb24oKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQW5kcm9pZC9pKX0sCkNoOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0JsYWNrQmVycnkvaSl9LENwOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQaG9uZXxpUGFkfGlQb2QvaSl9LHlrOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09wZXJhIE1pbmkvaSl9LFVsOmZ1bmN0aW9uKCl7cmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0lFTW9iaWxlL2kpfSxrbjpmdW5jdGlvbigpe3JldHVybiBhLm9oKCl8fGEuQ2goKXx8YS5DcCgpfHxhLnlrKCl8fGEuVWwoKX19O3JldHVybiBhLmtuKCl9LEthOmZ1bmN0aW9uKGEpe3ZhciBiPSJzb3VyY2UgcHJvdG9jb2wgYXV0aG9yaXR5IHVzZXJJbmZvIHVzZXIgcGFzc3dvcmQgaG9zdCBwb3J0IHJlbGF0aXZlIHBhdGggZGlyZWN0b3J5IGZpbGUgcXVlcnkgYW5jaG9yIi5zcGxpdCgiICIpO2E9L14oPzooPyFbXjpAXSs6W146QFwvXSpAKShbXjpcLz8jLl0rKTopPyg/OlwvXC8pPygoPzooKFteOkBdKikoPzo6KFteOkBdKikpPyk/QCk/KFteOlwvPyNdKikoPzo6KFxkKikpPykoKChcLyg/OltePyNdKD8hW14/I1wvXSpcLltePyNcLy5dKyg/Ols/I118JCkpKSpcLz8pPyhbXj8jXC9dKikpKD86XD8oW14jXSopKT8oPzojKC4qKSk/KS8uZXhlYyhhKTsKZm9yKHZhciBkPXt9LGU9MTQ7ZS0tOylkW2JbZV1dPWFbZV18fCIiO2QucXVlcnlLZXk9e307ZFtiWzEyXV0ucmVwbGFjZSgvKD86XnwmKShbXiY9XSopPT8oW14mXSopL2csZnVuY3Rpb24oYSxiLGcpe2ImJihkLnF1ZXJ5S2V5W2JdPWcpfSk7cmV0dXJuIGR9LHVuaXF1ZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9e30sZD1bXSxlPTAsYz1hLmxlbmd0aDtlPGM7KytlKWIuaGFzT3duUHJvcGVydHkoYVtlXSl8fChkLnB1c2goYVtlXSksYlthW2VdXT0xKTtyZXR1cm4gZH0sb2Y6ZnVuY3Rpb24oYSl7YT10aGlzLkthKGEpLmhvc3Quc3BsaXQoIi4iKTt2YXIgYj0iIjthW2EubGVuZ3RoLTJdJiYoYis9YVthLmxlbmd0aC0yXSsiLiIpO2FbYS5sZW5ndGgtMV0mJihiKz1hW2EubGVuZ3RoLTFdKTtyZXR1cm4gYn0saWI6ZnVuY3Rpb24oYSl7dmFyIGI9IiIsZD0hMTt3aW5kb3cmJndpbmRvdy5sb2NhdGlvbiYmd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lJiYoYj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUpOwpiJiYtMTxiLmluZGV4T2YoYSkmJihkPSEwKTtyZXR1cm4gZH0sVW46ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGQ9W10sZT1bXSxjPTA7YzxiLmxlbmd0aDtjKyspZFtiW2NdXT0hMDtmb3IoYz0wO2M8YS5sZW5ndGg7YysrKWRbYVtjXV18fGUucHVzaChhW2NdKTtyZXR1cm4gZX0sVnM6ZnVuY3Rpb24oYSxiKXt2YXIgZD0tMSxlPSIiO3RyeXswPGEuaW5kZXhPZigiJSIpJiYwPGI/KGU9YS5zcGxpdCgiJSIpLGQ9Yi8xMDAqZSk6KGQ9YS5zcGxpdCgiOiIpLGQ9MzYwMCorZFswXSs2MCorZFsxXSsgK2RbMl0sZD1NYXRoLnJvdW5kKGQpKX1jYXRjaChjKXtkPS0xfXJldHVybiBpc05hTihkKT8tMTpkfSxlZjpmdW5jdGlvbihhKXthPU1hdGgucm91bmQoYSk7dmFyIGI9Ii0tOi0tIjswPD1hJiYoYT1NYXRoLmZsb29yKGEpLGI9TWF0aC5mbG9vcihhLzYwKSxiPXRoaXMueGcoYikrIjoiK3RoaXMueGcoTWF0aC5mbG9vcihhLTYwKmIpKSk7cmV0dXJuIGJ9LHhnOmZ1bmN0aW9uKGEpe3JldHVybiAxMD4KYT8iMCIrYS50b1N0cmluZygpOmEudG9TdHJpbmcoKX0sZWU6ZnVuY3Rpb24oYSl7dGhpcy5FYT1hfSxmaXJlRXZlbnQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlO2Quc3RhdGU9dGhpcy5FYTsiZnVuY3Rpb24iPT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudD9lPW5ldyBDdXN0b21FdmVudChiLHtkZXRhaWw6ZH0pOihlPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpLGUuaW5pdEN1c3RvbUV2ZW50KGIsITEsITEsZCkpO2EuZGlzcGF0Y2hFdmVudChlKX0sVGI6ZnVuY3Rpb24oYSxiLGQpe2J8fChiPSJoZEV2ZW50Iik7ZHx8KGQ9d2luZG93KTt0aGlzLmZpcmVFdmVudChkLGIsYSl9LEQ6ZnVuY3Rpb24oYSxiLGQsZSxjKXt2YXIgaD1hO2QmJmImJihiPWwuRmMoYixkKSk7YiYmKGg9bC5GYyhhLGIpKTtlJiYoaD1sLkZjKGgsZSkpO2MmJihoPWwuRmMoaCxjKSk7Zi5UYihoKX0sdHJhY2s6ZnVuY3Rpb24oYSxiLGQpe2lmKGQpaWYoIW18fCFtLlkpd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnRyYWNrKGEsCmIsZCl9LmJpbmQodGhpcyksNTAwKTtlbHNlIGlmKG0uaXNFbmFibGVkKXt2YXIgZT1tLmFlKCkrIj9ob21hZF90cmFja19rZXk9IitlbmNvZGVVUklDb21wb25lbnQoYSkrIiZob21hZF90cmFja192YWx1ZT0iK2VuY29kZVVSSUNvbXBvbmVudChiKTttLlRhKGUsITApO2U9bS5UYShlLCEwKTtlLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iIjtlLmRhdGEuaG9tYWRfdHJhY2tfa2V5PSIqIitlbmNvZGVVUklDb21wb25lbnQoYSkrIioiO2UuZGF0YS5ob21hZF90cmFja192YWx1ZT0iKiIrZW5jb2RlVVJJQ29tcG9uZW50KGIpKyIqIjttLkZhKGUsZnVuY3Rpb24oZCl7dmFyIGU9ITE7ZD1kLnJlc3BvbnNlVGV4dDt0cnl7ZD1KU09OLnBhcnNlKGQpLGQ9ZC5kYXRhLGRbMF09PWVuY29kZVVSSUNvbXBvbmVudChhKSYmKGU9ITApLGRbMV0mJmRbMV0hPWVuY29kZVVSSUNvbXBvbmVudChiKSYmKGU9ITEpfWNhdGNoKGMpe31lfHx0aGlzLnRyYWNrKCJzdGF0c19oZF90cmFja2NoZWNrIiwKKGRbMF0/ZFswXToiIikrKGRbMV0/ZFsxXToiIiksITApfS5iaW5kKHRoaXMpKX19LEtkOmZ1bmN0aW9uKCl7bSYmbS5ZP20uaXNFbmFibGVkJiZtLkVuKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLktkKCl9LmJpbmQodGhpcyksNTAwKX0seW46ZnVuY3Rpb24oYSxiKXtpZihiLk9jKGEpfHwiYWJvdXQ6YmxhbmsiPT1hfHwwPD1hLmluZGV4T2YoImRhdGE6aW1hZ2UiKSlyZXR1cm4gYTt3aW5kb3cuc2FuZGJveCYmc2FuZGJveC5lZ1siU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIl0mJigwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJlcnJvciIpfHwwPD1zYW5kYm94LmVnWyJTdHJpbmcucHJvdG90eXBlLmluZGV4T2YiXS5iaW5kKGEpKCJFcnJvciIpKSYmdGhpcy4kYSgiZXJyX3VybCIsYSk7aWYodGhpcy5iZihhKSlyZXR1cm4gdGhpcy5iZihhKTt2YXIgZD17aG9tYWRfdXJsX3ByZWZpeF9hbGlhczoidnBhaWQifTtkLmhvbWFkX3VybF9zdWZmaXg9CmE7ZC5ob21hZF91cmxfc3VmZml4X2Jhc2U2ND10aGlzLndiKGEpO2QuaG9tYWRfcmV0dXJuX29ubHlfdXJsX2FuZF9oYXNoPSJ0cnVlIjtkLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7dmFyIGU9ITEsYz0hMSxjPXRoaXMuWWEoYSxiLnVhLGQsZnVuY3Rpb24oYSl7ZT1hLnJlc3BvbnNlVGV4dH0sZnVuY3Rpb24oKXt9LGIsITApO3RyeXtlfHwoZT1jKSxlPUpTT04ucGFyc2UoZSl9Y2F0Y2goaCl7ZT0hMX1lLnVybCYmZS5oYXNoJiYoZT1iLkxjKCkucmVwbGFjZSgiW2hhc2hdIixlLmhhc2gpKTt0aGlzLkRtKGUsYSk7cmV0dXJuIGV9LFlhOmZ1bmN0aW9uKGEsYixkLGUsYyxoLGYsdSl7dmFyIGs9aHx8bTtoPSEwO3UmJihoPSExKTtpZihrJiZrLlkpaWYoay5pc0VuYWJsZWQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXRyeXthPWEoKX1jYXRjaChsKXtjKGwpfWlmKCJzdHJpbmciIT10eXBlb2YgYSljKCk7ZWxzZXtrLlRhKGEsaCk7aD1rLlRhKGEsaCk7aC5kYXRhLmhvbWFkX3VybF9wcmVmaXhfYWxpYXM9CmI7aC5kYXRhLmhvbWFkX2hhc2hfZ3Vlc3NlZD0idHJ1ZSI7Zm9yKHZhciBxIGluIGQpaC5kYXRhW3FdPWRbcV07cmV0dXJuIGsuRmEoaCxlLGMsIiIsIiIsZil9fWVsc2UgYygpO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLllhKGEsYixkLGUsYyxrLGYsdSl9LmJpbmQodGhpcyksNTAwKX0sR3E6ZnVuY3Rpb24oYSxiLGQsZSxjLGgsZil7dmFyIHU9ITA7ZiYmKHU9ITEpO2lmKCJzdHJpbmciIT10eXBlb2YgZCl7Zj1kO2Q9IiI7Zm9yKHZhciBrIGluIGYpZCs9IiYiK2srIj0iK2VuY29kZVVSSUNvbXBvbmVudChmW2tdKTtkPWQuc3Vic3RyKDEpfXZhciBsPW5ldyBYTUxIdHRwUmVxdWVzdDtsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpeyFlfHw0IT1sLnJlYWR5U3RhdGV8fDIwMCE9bC5zdGF0dXMmJjIwMSE9bC5zdGF0dXN8fGUobCk7YyYmND09bC5yZWFkeVN0YXRlJiYyMDAhPWwuc3RhdHVzJiYyMDEhPWwuc3RhdHVzJiZjKGwpfTt0cnl7bC5vcGVuKGIsCmEsdSksbC53aXRoQ3JlZGVudGlhbHM9aCwwPGQubGVuZ3RoJiZsLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGwuc2VuZChkKX1jYXRjaChtKXtjJiZjKCl9cmV0dXJuIGx9LEhxOmZ1bmN0aW9uKGEsYixkKXt0aGlzLkdxKGEsIkdFVCIsIiIsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDtpZih0aGlzLmRjKWZvcih2YXIgYyBpbiB0aGlzLmRjKWE9YS5zcGxpdChjKS5qb2luKHRoaXMuZGNbY10pO2M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7Yy50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiO2Muc3JjPSJkYXRhOnRleHQvamF2YXNjcmlwdDtiYXNlNjQsIitmLndiKGEpO2QmJihjLm9uZXJyb3I9ZCk7ZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkP2RvY3VtZW50LmhlYWQuaW5zZXJ0QmVmb3JlKGMsZG9jdW1lbnQuaGVhZC5maXJzdENoaWxkKTpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGMpOwpiJiZzZXRUaW1lb3V0KGIsMCl9LmJpbmQodGhpcyksZCl9LE1mOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBjPXtob21hZF91cmxfcHJlZml4X2FsaWFzOiJ2cGFpZCJ9O2MuaG9tYWRfdXJsX3N1ZmZpeD1hO2MuaG9tYWRfdXJsX3N1ZmZpeF9iYXNlNjQ9dGhpcy53YihhKTtjLmhvbWFkX3JldHVybl9vbmx5X3VybF9hbmRfaGFzaD0idHJ1ZSI7Yy5ob21hZF9oYXNoX2d1ZXNzZWQ9InRydWUiO3RoaXMuWWEoYSxlLnVhLGMsZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt0cnl7YT1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe2E9ITF9dGhpcy5IcShlLkxjKCkucmVwbGFjZSgiW2hhc2hdIixhLmhhc2gpLGIsZCl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt9LGUsITApfSxLczpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kYz1hfSxJdTpmdW5jdGlvbihhLGIsZCxlLGMpe3RoaXMuWWEoYSxkLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgZD1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KTtkWzBdJiYKKGQ9ZFswXSk7ZD9kLmlkPyhiPWIucmVwbGFjZSgiW2lkXSIsZC5pZCksYj1iLnJlcGxhY2UoIltwcmljZV0iLGQucHJpY2UpLGI9Yi5yZXBsYWNlKCJbYWR2ZXJ0aXNlcl0iLGQuYWR2ZXJ0aXNlciksYj1iLnJlcGxhY2UoIltjdXJsXSIsZC5jdXJsKSxiPWIucmVwbGFjZSgiW2Zvcm1hdF0iLGQuZm9ybWF0KSxiPWIucmVwbGFjZSgiW3NyY10iLGQuc3JjKSxiPWIucmVwbGFjZSgiW3ByaWNlcmFuZ2VdIixkLnByaWNlcmFuZ2UpLGI9Yi5yZXBsYWNlKCJbcGlkXSIsZC5waWQpLGI9Yi5yZXBsYWNlKCJbcHJpb10iLGQucHJpbyksYj1iLnJlcGxhY2UoIltkaWRdIixkLmRpZCksYyh7cGxhY2Vob2xkZXI6YixtYWNybzplfSkpOmMoe3BsYWNlaG9sZGVyOiIiLG1hY3JvOmV9KTpjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9Y2F0Y2goaCl7Yyh7cGxhY2Vob2xkZXI6IiIsbWFjcm86ZX0pfX0sZnVuY3Rpb24oKXtjKHtwbGFjZWhvbGRlcjoiIixtYWNybzplfSl9KX0sbG46ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPQohMTshYjspe3ZhciBkPWEubGFzdEluZGV4T2YoIkVOQ09ERSgiKTswPmQ/Yj0hMDooZD1hLnN1YnN0cmluZyhkKzcsYS5pbmRleE9mKCIpIixkKSksYT1hLnJlcGxhY2UoIkVOQ09ERSgiK2QrIikiLGVuY29kZVVSSUNvbXBvbmVudChkKSkpfXJldHVybiBhfSxqcTpmdW5jdGlvbihhLGIpe3ZhciBkPSExO2lmKGIpZm9yKHZhciBlPTA7ZTxiLmxlbmd0aDtlKyspaWYoYltlXT09YSl7ZD0hMDticmVha31yZXR1cm4gZH19fSkoYyk7dmFyIFA9Yy5TaXx8UDtuZXcgUDt2YXIgZj1uZXcgUDt3aW5kb3cuZnY9ZjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhKXt0aGlzLmRhdGE9YXx8e319Yy5SaT1iO2IuRmM9ZnVuY3Rpb24oYSxiKXt2YXIgZD17fSxlO2ZvcihlIGluIGIpZFtlXT1iW2VdO2ZvcihlIGluIGEpZFtlXT1hW2VdO3JldHVybiBkfTtiLk5yPXtjb2RlOiIxMDAwIix0eXBlOiJwZW5hbHR5IixtZXNzYWdlOiIiLG5hbWU6InBlbmFsdHkifTtiLiRxPXtjb2RlOiIxMDAxIix0eXBlOiJtZWRpYWVycm9yIiwKbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5zdT17Y29kZToiMTAwMiIsdHlwZToidnBhaWQiLG1lc3NhZ2U6IiIsbmFtZToidnBhaWQifTtiLnhvPXtjb2RlOiIxMDAzIix0eXBlOiJlbXB0eVZhc3QiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuR3U9e2NvZGU6IjEwMDQiLHR5cGU6Im1hbGZvcm1hdHRlZFhNTCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi53bT17Y29kZToiMTAwNSIsdHlwZToiYWRTdGFydCIsbWVzc2FnZToiIixuYW1lOiJhZFN0YXJ0In07Yi5xbT17Y29kZToiMTAwNiIsdHlwZToiYWRGaXJzdFF1YXJ0aWxlIixtZXNzYWdlOiIiLG5hbWU6ImFkRmlyc3RRdWFydGlsZSJ9O2IudG09e2NvZGU6IjEwMDciLHR5cGU6ImFkTWlkUG9pbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRNaWRQb2ludCJ9O2IueW09e2NvZGU6IjEwMDgiLHR5cGU6ImFkVGhpcmRRdWFydGlsZSIsbWVzc2FnZToiIixuYW1lOiJhZFRoaXJkUXVhcnRpbGUifTtiLnBtPXtjb2RlOiIxMDA5IiwKdHlwZToiYWRDb21wbGV0ZSIsbWVzc2FnZToiIixuYW1lOiJhZENvbXBsZXRlIn07Yi5ybT17Y29kZToiMTAxMCIsdHlwZToiYWRJbXByZXNzaW9uc0NhbGxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEltcHJlc3Npb24ifTtiLld0PXtjb2RlOiIxMDExIix0eXBlOiJ2YXN0TG9hZGluZ0ZhaWxlZCIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi5acT17Y29kZToiMTAxMiIsdHlwZToibm9DcmVhdGl2ZSIsbWVzc2FnZToiIixuYW1lOiJhZEVycm9yIn07Yi55bz17Y29kZToiMTAxMyIsdHlwZToiZW1wdHlWYXN0RnJvbUhvbWFkU2VydmVyRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuQnU9e2NvZGU6IjEwMTQiLHR5cGU6IndyYXBwZXJMaW1pdFJlYWNoZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRFcnJvciJ9O2IuTG49e2NvZGU6IjEwMTUiLHR5cGU6ImNsaWNrdGhyb3VnaCIsbWVzc2FnZToiIixuYW1lOiJhZENsaWNrIn07Yi5Rbj17Y29kZToiMTAxNiIsdHlwZToiY29udGludWVDb250ZW50IiwKbWVzc2FnZToiIixuYW1lOiJjb250aW51ZUNvbnRlbnQifTtiLnpjPXtjb2RlOiIxMDE3Iix0eXBlOiJjb250ZW50UGxheWVyUGxheSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGxheSJ9O2IueWM9e2NvZGU6IjEwMTgiLHR5cGU6ImNvbnRlbnRQbGF5ZXJQYXVzZSIsbWVzc2FnZToiIixuYW1lOiJjb250ZW50UGxheWVyUGF1c2UifTtiLnZtPXtjb2RlOiIxMDE5Iix0eXBlOiJhZFNraXBwZWQiLG1lc3NhZ2U6IiIsbmFtZToiYWRTa2lwcGVkIn07Yi51bT17Y29kZToiMTAyMCIsdHlwZToiYWRSZXF1ZXN0IixtZXNzYWdlOiIiLG5hbWU6ImFkUmVxdWVzdCJ9O2IuSWU9e2NvZGU6IjEwMjEiLHR5cGU6ImFkUGxheSIsbWVzc2FnZToiIixuYW1lOiJhZFBsYXkifTtiLkhlPXtjb2RlOiIxMDIyIix0eXBlOiJhZFBhdXNlIixtZXNzYWdlOiIiLG5hbWU6ImFkUGF1c2UifTtiLnptPXtjb2RlOiIxMDIzIix0eXBlOiJhZFRpbWUiLG1lc3NhZ2U6IiIsbmFtZToiYWRUaW1lIn07CmIuc209e2NvZGU6IjEwMjQiLHR5cGU6ImFkTWV0YSIsbWVzc2FnZToiIixuYW1lOiJhZE1ldGEifTtiLlR0PXtjb2RlOiI5MDAxIix0eXBlOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCIsbWVzc2FnZToiIixuYW1lOiJ2YXJpYWJsZURlbGV0ZWRFdmVudCJ9O2IuYXI9e2NvZGU6IjkwMDIiLHR5cGU6Im5vVmFyaWFibGVTZXR0aW5nRXZlbnQiLG1lc3NhZ2U6IiIsbmFtZToibm9WYXJpYWJsZVNldHRpbmdFdmVudCJ9O2IucHJvdG90eXBlPXtnZXRFcnJvckNvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvckNvZGV9LGdldFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfX19KShjKTt2YXIgbD1jLlJpfHxsO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmxoPXRoaXMuYVsyXTt0aGlzLmc9dGhpcy5hWzZdfWMuUms9YjtiLnByb3RvdHlwZT17a2g6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8CmE/dGhpcy5saDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmc6YX19fSkoYyk7dmFyIGZhPWMuUmt8fGZhLEpjPW5ldyBmYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PUpjLmtoKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7fWMuVGk9YjtiLnByb3RvdHlwZT17QmQ6ZnVuY3Rpb24oYSl7dmFyIGI9MCxkLGUsYztpZigwPT1hLmxlbmd0aClyZXR1cm4gYjtkPTA7Zm9yKGM9YS5sZW5ndGg7ZDxjO2QrKyllPWEuY2hhckNvZGVBdChkKSxiPShiPDw1KS1iK2UsYnw9MDtyZXR1cm4gTWF0aC5hYnMoYil9LGZiOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgucm91bmQoRGF0ZS5ub3coKS8xRTMvMzYwMC8yNCkrbmF2aWdhdG9yLmFwcENvZGVOYW1lK25hdmlnYXRvci5hcHBOYW1lK25hdmlnYXRvci5hcHBWZXJzaW9uK25hdmlnYXRvci51c2VyQWdlbnQrCm5hdmlnYXRvci5wbGF0Zm9ybSsobmF2aWdhdG9yLmxhbmd1YWdlfHxuYXZpZ2F0b3Iudnx8IngiKX0sZnA6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yb3VuZChEYXRlLm5vdygpLzFFMy8zNjAwKStuYXZpZ2F0b3IuYXBwQ29kZU5hbWUrbmF2aWdhdG9yLmFwcE5hbWUrbmF2aWdhdG9yLmFwcFZlcnNpb24rbmF2aWdhdG9yLnVzZXJBZ2VudCtuYXZpZ2F0b3IucGxhdGZvcm0rKG5hdmlnYXRvci5sYW5ndWFnZXx8bmF2aWdhdG9yLnZ8fCJ4IikrKG5ldyBEYXRlKS50b1RpbWVTdHJpbmcoKS5zdWJzdHIoLTEyKX0sR2M6ZnVuY3Rpb24oYSl7YT1wYXJzZUludChhKTtpZig2NTw9YSYmOTA+PWF8fDk3PD1hJiYxMjI+PWEpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoYSk7aWYoMD49YSlyZXR1cm4iIjtpZig2NT5hKXJldHVybiB0aGlzLkdjKGErNjUpO2lmKDkwPGEpcmV0dXJuIHRoaXMuR2MoTWF0aC5yb3VuZChhLzIpKX0scmV2ZXJzZTpmdW5jdGlvbihhKXtmb3IodmFyIGI9IiIsZD0KYS5sZW5ndGgtMSxiPSIiOzA8PWQ7Yis9YVtkLS1dKTtyZXR1cm4gYn0sTWM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5CZCh0aGlzLmZiKCkrIiIpLGE9KGErIiIrdGhpcy5yZXZlcnNlKGErIiIpKS5tYXRjaCgvLnsxLDJ9L2cpLGI9IiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWIrPXRoaXMuR2MoYVtkXSk7MD09Yi5sZW5ndGgmJihiPSJ6b3JrIik7cmV0dXJuIGJ9LGJxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWMoKSsiMiJ9LEJmOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuQmQodGhpcy5mcCgpKyIiKSxhPShhKyIiK3RoaXMucmV2ZXJzZShhKyIiKSkubWF0Y2goLy57MSwyfS9nKSxiPSIiLGQ9MDtkPGEubGVuZ3RoO2QrKyliKz10aGlzLkdjKGFbZF0pOzA9PWIubGVuZ3RoJiYoYj0iem9yayIpO3JldHVybiBifX19KShjKTt2YXIgZ2E9Yy5UaXx8Z2E7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwp0aGlzLlFxPXRoaXMuYVs4XTt0aGlzLmc9dGhpcy5hWzJdfWMuJG49YjtiLnByb3RvdHlwZT17UHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLlFxOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgaGE9Yy4kbnx8aGEsS2M9bmV3IGhhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9S2MuUHEoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe312YXIgYT0veHl6Ly50ZXN0KGZ1bmN0aW9uKCl7eHl6fSk/L1xiX3N1cGVyXGIvOi8uKi87Yi5leHRlbmQ9ZnVuY3Rpb24oZyl7dmFyIGQ9dGhpcy5wcm90b3R5cGUsZT1PYmplY3QuY3JlYXRlKGQpLGM7Zm9yKGMgaW4gZyllW2NdPSJmdW5jdGlvbiI9PT10eXBlb2YgZ1tjXSYmImZ1bmN0aW9uIj09dHlwZW9mIGRbY10mJmEudGVzdChnW2NdKT8KZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZz10aGlzLmk7dGhpcy5pPWRbYV07dmFyIGU9Yi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pPWc7cmV0dXJuIGV9fShjLGdbY10pOmdbY107Zz0iZnVuY3Rpb24iPT09dHlwZW9mIGUuYz9lLmhhc093blByb3BlcnR5KCJpbml0Iik/ZS5jOmZ1bmN0aW9uKCl7ZC5jLmFwcGx5KHRoaXMsYXJndW1lbnRzKX06ZnVuY3Rpb24oKXt9O2cucHJvdG90eXBlPWU7ZS5jb25zdHJ1Y3Rvcj1nO2cuZXh0ZW5kPWIuZXh0ZW5kO3JldHVybiBnfTtjLnVlPWJ9KShjKTt2YXIgSj1jLnVlfHxKO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLiRoPXRoaXMuYVs3XTt0aGlzLnhyPXRoaXMuYVs1XTt0aGlzLlBvPXRoaXMuYVs2XTt0aGlzLnBuPXRoaXMuYVs3XTt0aGlzLnRyPXRoaXMuYVs3XTt0aGlzLkxrPXRoaXMuYVs1XTt0aGlzLmZpPQp0aGlzLmFbMV07dGhpcy5nPXRoaXMuYVs2XX1jLlJxPWI7Yi5wcm90b3R5cGU9e1poOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy4kaDp0aGlzLndyKGEpfSx3cjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMueHI6dGhpcy5PbyhhKX0sT286ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlBvOnRoaXMubm4oYSl9LG5uOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucG46dGhpcy5zcihhKX0sc3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnRyOnRoaXMuS2soYSl9LEtrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Mazp0aGlzLmVpKGEpfSxlaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZmk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBpYT1jLlJxfHxpYSxMYz1uZXcgaWEoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TGMuWmgoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7Yy5Oaz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLnhhPXt9O3RoaXMuQT1udWxsO3RoaXMuYWM9MTAwO3RoaXMubGI9MDt0aGlzLndhPTE1MDt0aGlzLnFiPTA7dGhpcy5GcyhiKX0sYjpmdW5jdGlvbigpe30sSDpmdW5jdGlvbigpe3RoaXMubGI8PXRoaXMud2E/KHRoaXMubGIrKyx0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKTowPnRoaXMud2EmJih0aGlzLnFiPXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuYi5iaW5kKHRoaXMpLHRoaXMuYWMpKX0scnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYj50aGlzLndhPyEwOiExfSxjZzpmdW5jdGlvbigpe3RoaXMubGI9MH0sSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEZzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEw6ZnVuY3Rpb24oYil7dGhpcy54YVtiLmZiKCldPQpiO0smJksuS2YmJksuWXMoYil9LG52OmZ1bmN0aW9uKCl7cmV0dXJuIGYuRGEodGhpcy54YSl9LEk6ZnVuY3Rpb24oYil7dmFyIGE9Yi52aWRlb1RhZyxnO2ZvcihnIGluIHRoaXMueGEpaWYoYT09dGhpcy54YVtnXS52aWRlb1RhZylyZXR1cm4hMDtyZXR1cm4gdGhpcy54YVtiLmZiKCldPyEwOiExfSxtcTpmdW5jdGlvbihiKXtiPWIuQ2EoKTtmb3IodmFyIGEgaW4gdGhpcy54YSlpZihiLmlkPT10aGlzLnhhW2FdLkNhKCkuaWQpcmV0dXJuITA7cmV0dXJuITF9LEJ2OmZ1bmN0aW9uKGIpe3RoaXMueGFbYi5pZF09bnVsbH19KX0pKGMpO3ZhciByPWMuTmt8fHI7KGZ1bmN0aW9uKGMpe2MuUGs9Si5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy52aWRlb1RhZz10aGlzLmNvbnRhaW5lcj10aGlzLmlkPW51bGw7dGhpcy5hYz0xMDt0aGlzLmxiPTA7dGhpcy53YT01MDt0aGlzLko9bnVsbDt0aGlzLmphPSExO3RoaXMucGxheWVyPWI7dGhpcy5nYj0iIjt0aGlzLlllPSExO3RoaXMuTigpfSwKSzpmdW5jdGlvbigpe3JldHVybiJlbXB0eSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsZz10aGlzLkNhKCksZD10aGlzLmdldFJhd1BsYXllcigpO2lmKGIudmlkZW9UYWc9YSliLnZpZGVvVGFnSWQ9YS5pZDtpZihiLmNvbnRhaW5lcj1nKWIuY29udGFpbmVySWQ9Zy5pZDtkJiYoYi5wbGF5ZXI9ZCk7cmV0dXJuIGJ9LE46ZnVuY3Rpb24oKXt9LGVhOmZ1bmN0aW9uKCl7fSxPczpmdW5jdGlvbihiKXt0aGlzLko9Yn0sb3Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KfSxJczpmdW5jdGlvbihiKXt0aGlzLk9kPWJ9LG12OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuT2R9LE5kOmZ1bmN0aW9uKCl7fSxIOmZ1bmN0aW9uKCl7dGhpcy5sYjw9dGhpcy53YSYmKHRoaXMubGIrKyx3aW5kb3cuc2V0VGltZW91dCh0aGlzLk4uYmluZCh0aGlzKSx0aGlzLmFjKSl9LGlzRnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3JldHVybiExfSwKZ2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5DYSgpfSxwYXVzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllci5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0sZmI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pZH0sZmU6ZnVuY3Rpb24oYil7dGhpcy5pZD1ifSxDdjpmdW5jdGlvbigpe30sUjpmdW5jdGlvbihiKXtpZighYilyZXR1cm4hMTt0aGlzLnZpZGVvVGFnPWI7dGhpcy5CcCgpfHx0aGlzLkFtKCk7dGhpcy5mZSh0aGlzLnZpZGVvVGFnLmdldEF0dHJpYnV0ZSgiaWQiKSl9LHB2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWd9LEFtOmZ1bmN0aW9uKCl7dGhpcy52aWRlb1RhZy5zZXRBdHRyaWJ1dGUoImlkIixmLnBhKDEwKSl9LEJwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJpZCIpPyEwOiExfSxPOmZ1bmN0aW9uKGIpe3RoaXMuY29udGFpbmVyPWJ9LENhOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09PQp0eXBlb2YgdGhpcy5jb250YWluZXI/dGhpcy5jb250YWluZXIoKTp0aGlzLmNvbnRhaW5lcn0sZ2V0UmF3UGxheWVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyfSxOYzpmdW5jdGlvbigpe3JldHVybiEwfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMH0samI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sdnY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qYX0sZGE6ZnVuY3Rpb24oKXt0aGlzLmphPSEwfSxEYjpmdW5jdGlvbigpe3ZhciBiPWs7cmV0dXJuIGImJmIucnVuSW5zaWRlQ29udGFpbmVyPyEwOiExfSxXYTpmdW5jdGlvbigpe3JldHVybiExfSxIZDpmdW5jdGlvbigpe3JldHVybiExfSxoZzpmdW5jdGlvbihiKXt0aGlzLmdiPWJ9LGx2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2J9LHFzOmZ1bmN0aW9uKCl7dGhpcy5nYj1udWxsfSxydjpmdW5jdGlvbigpe3ZhciBiPQohMTt0aGlzLmdiJiYoYj0hMCk7cmV0dXJuIGJ9LHh2OmZ1bmN0aW9uKCl7dGhpcy5ZZXx8KHRoaXMuWWU9ITApfSxIYzpmdW5jdGlvbigpe3JldHVybiExfSxpdjpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy52aWRlb1RhZzthJiZhLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGI9YS5nZXRBdHRyaWJ1dGUoImlkIikpO3JldHVybiBifX0pfSkoYyk7dmFyIHA9Yy5Qa3x8cDsoZnVuY3Rpb24oYyl7Yy5PZz1KLmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuQT10aGlzLnBsYXllcj0iIjt0aGlzLkRlPSIxIjt0aGlzLkVlPSIyIjt0aGlzLmptPSIzIjt0aGlzLmljPTA7dGhpcy5QZj0zMDt0aGlzLnRiPVtdO3RoaXMuT2E9W107dGhpcy5MYj17ZXh0ZXJuYWw6MSxub2ZyYW1ld29yazoyLGFkZXJyb3I6Myxjb250ZW50cGxheTo0LG5vQWRzTWFuYWdlcjo1LHVua25vd246Nn07dGhpcy5LZT10aGlzLkJnPSExO3RoaXMuc3RhdHVzPXRoaXMuaWM7dGhpcy5pZD1mLnBhKDEwKTt0aGlzLlljKGIpOwp0aGlzLkdzKGEpfSxiOmZ1bmN0aW9uKCl7fSxuYTpmdW5jdGlvbigpe3RoaXMuQmd8fCh0aGlzLkJnPSEwLGYuS2QoKSl9LFJkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5LKCk7USYmUS5ZYiYmIWphJiYoamE9ITAsZi50cmFjaygicG9zc2libGVEb3VibGVBZCIsIjEwNF8iK2IpKX0sdzpmdW5jdGlvbihiLGEpe3ZhciBnPSEwO2ImJihnPSExKTtyZXR1cm4gdGhpcy5oYSgpPyExOih0aGlzLkxzKCksdGhpcy5BKHRoaXMuZ2V0UGxheWVyKCksZyksdGhpcy50ZygpLHRoaXMuS2U9ITAsYSYmImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEoKSwhMCl9LGw6ZnVuY3Rpb24oYixhKXt0aGlzLmhhKCl8fCh0aGlzLnRiLnB1c2goYiksdGhpcy5PYS5wdXNoKHtyZWFzb246YixkZXRhaWw6YX0pKX0sdGc6ZnVuY3Rpb24oKXt2YXIgYj0idW5rbm93biIsYT1bXTt0aGlzLnRiJiYwPHRoaXMudGIubGVuZ3RoJiYodGhpcy50Yj1mLnVuaXF1ZSh0aGlzLnRiKSxmLnRyYWNrKCJhY3RpdmF0ZWRCeSIsCnRoaXMudGIuam9pbigiLCIpKSk7aWYodGhpcy5PYSl7Zm9yKHZhciBnPTA7Zzx0aGlzLk9hLmxlbmd0aDtnKyspdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl09PXRoaXMuTGJbYl0mJmEucHVzaCh0aGlzLk9hW2ddLmRldGFpbCksdGhpcy5MYlt0aGlzLk9hW2ddLnJlYXNvbl08dGhpcy5MYltiXSYmKGE9W10sYS5wdXNoKHRoaXMuT2FbZ10uZGV0YWlsKSxiPXRoaXMuT2FbZ10ucmVhc29uKTt0aGlzLkxiW2JdfHwoYj0idW5rbm93biIsYT1bXSk7MDxhLmxlbmd0aCYmKGc9Zi51bmlxdWUoYSksYj1iKyItIitnLmpvaW4oIi0iKSk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixiLCEwLGEpfX0scXY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5LZX0sbTpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPXRoaXMuRGV9LExzOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5FZX0sTXM6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1cz10aGlzLmptfSxDYjpmdW5jdGlvbigpe3RoaXMuc3RhdHVzPQp0aGlzLmljfSxGZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXR1cz09dGhpcy5EZX0sWHU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0dXM9PXRoaXMuRWV9LGhhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhdHVzIT10aGlzLmljfSxZYzpmdW5jdGlvbihiKXt0aGlzLnBsYXllcj1ifSxnZXRQbGF5ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5ZXJ9LEdzOmZ1bmN0aW9uKGIpe3RoaXMuQT1ifSxlcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkF9LEtxOmZ1bmN0aW9uKCl7fX0pfSkoYyk7dmFyIHQ9Yy5PZ3x8dDtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5GaT10aGlzLmFbNV07dGhpcy5jdD10aGlzLmFbNV07dGhpcy5Eaj10aGlzLmFbOF07dGhpcy4kbD10aGlzLmFbN107dGhpcy5ndD10aGlzLmFbMTBdO3RoaXMuY3I9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19CmMuUGc9YjtiLnByb3RvdHlwZT17RWk6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLkZpOnRoaXMuYnQoYSl9LGJ0OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdDp0aGlzLkNqKGEpfSxDajpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuRGo6dGhpcy5abChhKX0sWmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLiRsOnRoaXMuZnQoYSl9LGZ0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5ndDp0aGlzLmJyKGEpfSxicjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuY3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYT1jLlBnfHxrYSxNYz1uZXcga2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1NYy5FaSg0KTsoZnVuY3Rpb24oYyl7Yy5OaD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LApOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250ZW50RWwoKTt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1iLmN1cnJlbnRUaW1lKCksYj1iLmR1cmF0aW9uKCk7YSYmMDxhJiZiJiYwPGImJmE+PWItMSYmdGhpcy5KJiZ0aGlzLkooKX0sSzpmdW5jdGlvbigpe3JldHVybiJEZW1vVmlkZW9KUyJ9fSl9KShjKTt2YXIgUj1jLk5ofHxSOyhmdW5jdGlvbihjKXtjLk1oPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSk7dGhpcy5nZD1udWxsO3RoaXMuaHU9MUUzO3RoaXMuV2Y9Cm51bGw7dGhpcy52dD0yRTN9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2lmKHdpbmRvdy5kZW1vUGxheWVyJiZ3aW5kb3cuc24pYi5vbigicGxheSIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7Yi5vbigiZGlzYWJsZSIsdGhpcy5Jby5iaW5kKHRoaXMpKTtiLm9uKCJhZHRpbWVvdXQiLHRoaXMueHAuYmluZCh0aGlzKSk7Yi5vbigiYWRzdGFydCIsZnVuY3Rpb24oYSl7dGhpcy53cChhLGIpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQmJihiLm9uKCJwbGF5IixmdW5jdGlvbigpe3RoaXMua3UoYil9LmJpbmQodGhpcykpLGIudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIsZnVuY3Rpb24oKXt0aGlzLmx1KGIpfS5iaW5kKHRoaXMpKSk7Yi5vbigiYWRlbmQiLGZ1bmN0aW9uKGEpe3RoaXMudnAoYSxiKX0uYmluZCh0aGlzKSk7Yi5vbigiY29udGVudHBsYXliYWNrIixmdW5jdGlvbihhKXt0aGlzLk9uKGEpfS5iaW5kKHRoaXMpKX0sCk9uOmZ1bmN0aW9uKGIpeyJhZHNlcnJvciI9PWIudHJpZ2dlcmV2ZW50JiZ0aGlzLncoKX0sa3U6ZnVuY3Rpb24oYil7dGhpcy5nZHx8KHRoaXMuZ2Q9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm11KGIpfS5iaW5kKHRoaXMpLHRoaXMuaHUpKX0sbXU6ZnVuY3Rpb24oKXt3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuZ2QpO3RoaXMudygpfSxsdTpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5nZCl9LHZwOmZ1bmN0aW9uKGIpe3RoaXMuZHYoYik7dGhpcy5XZj1uZXcgRGF0ZTt0aGlzLldmLXRoaXMuWHI8dGhpcy52dD90aGlzLncoKTp0aGlzLm0oKX0seHA6ZnVuY3Rpb24oYixhKXshYSYmYi50YXJnZXQucGxheWVyJiYoYT1iLnRhcmdldC5wbGF5ZXIsdGhpcy5ZYyhuZXcgUihhKSkpO3RoaXMudygpfSxJbzpmdW5jdGlvbigpe30sd3A6ZnVuY3Rpb24oKXt0aGlzLlhyPW5ldyBEYXRlfX0pfSkoYyk7dmFyIGxhPWMuTWh8fGxhOyhmdW5jdGlvbihjKXtjLk9oPQpyLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuZGVtb1BsYXllcil7aWYod2luZG93LnZpZGVvanMmJnZpZGVvanMucGxheWVycyYmMDxmLkRhKHZpZGVvanMucGxheWVycykpe3ZhciBiPXZpZGVvanMucGxheWVycyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9bmV3IFIoYlthXSk7dGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgbGEoZyx0aGlzLkEpKS5iKCkpfX10aGlzLkgoKX19fSl9KShjKTt2YXIgbWE9Yy5PaHx8bWEsbmE9bmV3IG1hKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnd1PXRoaXMuYVs5XTt0aGlzLlRvPXRoaXMuYVs5XTt0aGlzLkdwPXRoaXMuYVs4XTt0aGlzLmJoPXRoaXMuYVsyXTt0aGlzLmhpPXRoaXMuYVs4XTt0aGlzLkR0PXRoaXMuYVszXTt0aGlzLlR1PXRoaXMuYVs5XTsKdGhpcy5Ucj10aGlzLmFbNV07dGhpcy5mcz10aGlzLmFbNV07dGhpcy5Iaz10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVsxXX1jLkh1PWI7Yi5wcm90b3R5cGU9e3Z1OmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53dTp0aGlzLlNvKGEpfSxTbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVG86dGhpcy5GcChhKX0sRnA6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdwOnRoaXMuYWgoYSl9LGFoOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5iaDp0aGlzLmdpKGEpfSxnaTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuaGk6dGhpcy5DdChhKX0sQ3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkR0OnRoaXMuU3UoYSl9LFN1OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5UdTp0aGlzLlNyKGEpfSxTcjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuVHI6dGhpcy5lcyhhKX0sZXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmZzOnRoaXMuR2soYSl9LApHazpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkhrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgb2E9Yy5IdXx8b2EsTmM9bmV3IG9hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9TmMudnUoNCk7KGZ1bmN0aW9uKGMpe2Mucmo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wbGF5ZXIuaWQpO2lmKCJPQkpFQ1QiPT1iLm5vZGVOYW1lfHwiVklERU8iPT1iLm5vZGVOYW1lKWI9Yi5wYXJlbnROb2RlO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdLHRoaXMubHE9ITApO3RoaXMuUihhKTsKdGhpcy5SZigpO3RoaXMuUG49ITF9LFJmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5DYSgpLGE9dGhpcy52aWRlb1RhZyxnPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucGxheWVyLmlkKTtpZihnKXtpZigiT0JKRUNUIj09Zy5ub2RlTmFtZXx8IlZJREVPIj09Zy5ub2RlTmFtZSlnPWcucGFyZW50Tm9kZTtnIT1iJiZ0aGlzLk8oZyk7Yj1nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2lmKCFiKWI9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF07ZWxzZSBpZih0aGlzLmxxKXt0aGlzLmtxPSEwO3JldHVybn1iJiZiIT1hJiZ0aGlzLlIoYik7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJmKCl9LmJpbmQodGhpcyksNTApfX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZihrLnBvc3Ryb2xsVXNlQ29tcGxldGVFdmVudCliLl9ldmVudHMuYmVmb3JlQ29tcGxldGUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllciwKY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoKX0uYmluZCh0aGlzKX0pO2Vsc2UgaWYoYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDp0aGlzLnBsYXllcixjYWxsYmFjazpmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcyl9KSxiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXthLmR1cmF0aW9uJiZhLnBvc2l0aW9uJiYxPmEuZHVyYXRpb24tYS5wb3NpdGlvbiYmdGhpcy5KJiYoMCx0aGlzLkopKCl9LmJpbmQodGhpcykpfSxOZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkRXJyb3ImJmIuX2V2ZW50cy5hZEVycm9yLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbihhKXt0aGlzLiRjKGEpfS5iaW5kKHRoaXMpfSk7CmlmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMuJGMoYSl9LmJpbmQodGhpcykpfSwkYzpmdW5jdGlvbihiKXt2YXIgYT10aGlzLnBsYXllcjthLmdldFBvc2l0aW9uKCk7YS5nZXRQb3NpdGlvbigpO2EuZ2V0RHVyYXRpb24oKTthLmdldFBvc2l0aW9uKCk7YS5nZXREdXJhdGlvbigpO2EuZ2V0UG9zaXRpb24oKTsibWlkIj09Yi5hZHBvc2l0aW9uJiZhLmdldFBvc2l0aW9uJiYzMDxhLmdldFBvc2l0aW9uKCkmJjMwPGEuZ2V0RHVyYXRpb24oKS1hLmdldFBvc2l0aW9uKCkmJnRoaXMuT2QmJigwLHRoaXMuT2QpKCl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtpZighYi5nZXRTdGF0ZXx8InBsYXlpbmciIT1iLmdldFN0YXRlKCkpcmV0dXJuIHRoaXMucGxheWVyLnBsYXkoKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllcjtyZXR1cm4gYi5nZXRTdGF0ZSYmInBhdXNlZCI9PWIuZ2V0U3RhdGUoKT8icGF1c2VkIjp0aGlzLnBsYXllci5wYXVzZSghMCl9LApqYjpmdW5jdGlvbigpe3JldHVybiJwYXVzZWQiPT10aGlzLnBhdXNlKCk/ITE6ITB9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iSldQbGF5ZXIifSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyO2IuZ2V0RnVsbHNjcmVlbiYmYi5nZXRGdWxsc2NyZWVuKCkmJmIuc2V0RnVsbHNjcmVlbigpfSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXI7YS5nZXRNdXRlJiZhLmdldE11dGUoKSYmKGI9ITApO3JldHVybiBifSxIYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMucGxheWVyLGE9ITE7Yi5nZXRWb2x1bWUmJmIuZ2V0Vm9sdW1lKCkmJihhPWIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIHBhPWMucmp8fHBhOyhmdW5jdGlvbihjKXtjLnFqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LE46ZnVuY3Rpb24oKXt9LENiOmZ1bmN0aW9uKCl7dGhpcy5zdGF0dXM9dGhpcy5pYzt0aGlzLmlzUGxheWluZz10aGlzLmtjPQohMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExfSxiOmZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9dGhpcy5rYz0hMTt0aGlzLnBkPTE7dGhpcy5tYz1bXTt0aGlzLmJiPSExO3RoaXMuZ2V0UGxheWVyKCk7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPXt9O2IuZ2V0Q29uZmlnJiYoYT1iLmdldENvbmZpZygpLGEuYWR2ZXJ0aXNpbmc/KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUmJihhLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcz9hLmFkdmVydGlzaW5nLnNjaGVkdWxlLmFkcy50YWcmJmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgmJih0aGlzLnBkPWEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRzLnRhZy5sZW5ndGgsdGhpcy5iYj0hMCk6KGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUucHJlcm9sbCYmYS5hZHZlcnRpc2luZy5zY2hlZHVsZS5wcmVyb2xsLnRhZyYmKHRoaXMuYmI9ITApLGEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZSYmCmEuYWR2ZXJ0aXNpbmcuc2NoZWR1bGUuYWRicmVha3ByZS50YWcmJih0aGlzLmJiPSEwKSkpLGEuYWR2ZXJ0aXNpbmcudGFnJiYodGhpcy5iYj0hMCkpOnRoaXMubSgibm8gYWR2ZXJ0aXNpbmcgY29uZmlndXJlZCBmb3IgcGxheWVyIikpO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkQ29tcGxldGUmJmIuX2V2ZW50cy5hZENvbXBsZXRlLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRDb21wbGV0ZSIpO3RoaXMua2M9ITB9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZENsaWNrJiZiLl9ldmVudHMuYWRDbGljay5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkQ2xpY2siKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbiYmYi5fZXZlbnRzLmFkSW1wcmVzc2lvbi5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkSW1wcmVzc2lvbiIpOwp0aGlzLlJkKCl9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZE1ldGEmJmIuX2V2ZW50cy5hZE1ldGEucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5tKCJhZE1ldGEiKX0uYmluZCh0aGlzKX0pO2IuX2V2ZW50cyYmYi5fZXZlbnRzLmFkU2tpcHBlZCYmYi5fZXZlbnRzLmFkU2tpcHBlZC5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oKXt0aGlzLm0oImFkU2tpcHBlZCIpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMuYWRUaW1lJiZiLl9ldmVudHMuYWRUaW1lLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6YixjYWxsYmFjazpmdW5jdGlvbigpe3RoaXMubSgiYWRUaW1lIil9LmJpbmQodGhpcyl9KTtiLl9ldmVudHMmJmIuX2V2ZW50cy5hZEVycm9yJiZiLl9ldmVudHMuYWRFcnJvci5wdXNoKHtjb250ZXh0Om51bGwsY3R4OmIsY2FsbGJhY2s6ZnVuY3Rpb24oYSl7dGhpcy5vbkFkRXJyb3IoYSl9LmJpbmQodGhpcyl9KTsKYi5fZXZlbnRzJiZiLl9ldmVudHMudGltZSYmYi5fZXZlbnRzLnRpbWUucHVzaCh7Y29udGV4dDpudWxsLGN0eDpiLGNhbGxiYWNrOmZ1bmN0aW9uKGEpe3RoaXMuaXNQbGF5aW5nPSEwO2EuZHVyYXRpb24+dGhpcy5QZiYmIXRoaXMuaGEoKSYmKHRoaXMuYmI/KHRoaXMubCgiY29udGVudHBsYXlOb0FkcyIsIiIpLHRoaXMubygpKToodGhpcy5sKCJjb250ZW50cGxheVRpbWUiLDFFMypNYXRoLnJvdW5kKGEuZHVyYXRpb24vMUUzKSksdGhpcy5vKCEwKSkpfS5iaW5kKHRoaXMpfSk7Yi5fZXZlbnRzJiZiLl9ldmVudHMucGxheWxpc3RJdGVtJiZiLl9ldmVudHMucGxheWxpc3RJdGVtLnB1c2goe2NvbnRleHQ6bnVsbCxjdHg6dGhpcy5wbGF5ZXIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtpZih0aGlzLmhhKCkmJih0aGlzLkNiKCksdGhpcy5nZXRQbGF5ZXIoKS5Qbj0hMCxrLnNraXBBZE9uQ29udGV4dENoYW5nZSkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2I7YSYmKGEuVGQoKSxhLkFhKCkpfX0uYmluZCh0aGlzKX0pOwppZihiLm9uQWRDb21wbGV0ZSliLm9uQWRDb21wbGV0ZShmdW5jdGlvbigpe3RoaXMubSgib25BZENvbXBsZXRlIik7dGhpcy5rYz0hMH0uYmluZCh0aGlzKSk7aWYoYi5vbkFkSW1wcmVzc2lvbiliLm9uQWRJbXByZXNzaW9uKGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkSW1wcmVzc2lvbiIpO3RoaXMuUmQoKX0uYmluZCh0aGlzKSk7aWYoYi5vbkFkUGxheSliLm9uQWRQbGF5KGZ1bmN0aW9uKCl7dGhpcy5tKCJvbkFkUGxheSIpfS5iaW5kKHRoaXMpKTtpZihiLm9uQWRUaW1lKWIub25BZFRpbWUoZnVuY3Rpb24oKXt0aGlzLm0oIm9uQWRUaW1lIil9LmJpbmQodGhpcykpO2lmKGIub25BZEVycm9yKWIub25BZEVycm9yKGZ1bmN0aW9uKGEpe3RoaXMub25BZEVycm9yKGEpfS5iaW5kKHRoaXMpKTtpZihiLm9uVGltZSliLm9uVGltZShmdW5jdGlvbihhKXt0aGlzLmlzUGxheWluZz0hMDthLmR1cmF0aW9uPnRoaXMuUGYmJiF0aGlzLmhhKCkmJih0aGlzLmJiPyh0aGlzLmwoImNvbnRlbnRwbGF5Tm9BZHMiLAoiIiksdGhpcy5vKCkpOih0aGlzLmwoImNvbnRlbnRwbGF5VGltZSIsMUUzKk1hdGgucm91bmQoYS5kdXJhdGlvbi8xRTMpKSx0aGlzLm8oITApKSl9LmJpbmQodGhpcykpfSxvbkFkRXJyb3I6ZnVuY3Rpb24oYil7dmFyIGE9Yi50YWc7LTE9PXRoaXMubWMuaW5kZXhPZihhKSYmdGhpcy5tYy5wdXNoKGEpOyIxMDEiPT1iLmNvZGV8fCIxMDAxIj09Yi5jb2RlPyh0aGlzLm0oKSx0aGlzLm5hKCkpOjkwMD09Yi5jb2RlJiYwPGIubWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoImVtcHR5Iik/dGhpcy5tKCJlbXB0eSIpOjMwMz09Yi5jb2RlJiYwPGIubWVzc2FnZS5pbmRleE9mKCJObyBBZHMgVkFTVCByZXNwb25zZSBhZnRlciBvbmUgb3IgbW9yZSBXcmFwcGVycyIpP3RoaXMubSgiZW1wdHkiKToodGhpcy5sKCJhZGVycm9yIixiLmNvZGUpLHRoaXMubWMubGVuZ3RoPj10aGlzLnBkJiZ0aGlzLm8oKSl9LEtxOmZ1bmN0aW9uKGIpe3RoaXMuaSgiSlc6ICIrYi50eXBlKX0sbzpmdW5jdGlvbihiKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKTtmLlhzKGEudmlkZW9UYWcpJiYoYS5rcT90aGlzLm0oInBsYXllciBpcyBpbnZhbGQiKTp0aGlzLmtjfHx0aGlzLmlzUGxheWluZz90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksNTApKX19KX0pKGMpO3ZhciBxYT1jLnFqfHxxYTsoZnVuY3Rpb24oYyl7Yy5zaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1mLkthKGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO2lmKCJZV1JwZEdsdmJpNXJaV2x1WlhacFpHVnZkMlZ5WW5WdVp6MHgiIT10aGlzLmFwKCl8fCFiLmF1dGhvcml0eXx8IWIuYXV0aG9yaXR5fHwid3d3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInFzMi5wcmV2aWV3LnNwaWVnZWwuZGUiIT1iLmF1dGhvcml0eSYmInByZXZpZXcuc3BpZWdlbC5kZSIhPWIuYXV0aG9yaXR5JiYicHJvZC5zcGllZ2VsLmRlIiE9Yi5hdXRob3JpdHkpe3ZhciBhPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJqd3BsYXllciIpO2lmKHdpbmRvdy5qd3BsYXllciYmZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoandwbGF5ZXIoKS5pZCl8fGcmJmcoKS5pZCl7Yj1bXTtpZigxPGEubGVuZ3RoKWZvcihnPTA7ZzxhLmxlbmd0aDtnKyspYi5wdXNoKGFbZ10uZ2V0QXR0cmlidXRlKCJpZCIpKTtlbHNlIGIucHVzaChqd3BsYXllcigpLmlkKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKXt2YXIgZz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiW2FdKSxkPWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07ZHx8KGQ9Zy5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO2R8fCJPQkpFQ1QiIT1nLm5vZGVOYW1lJiYiVklERU8iIT1nLm5vZGVOYW1lfHwoZD1nKTtpZihkKXt2YXIgZz1uZXcgcGEod2luZG93Lmp3cGxheWVyKGJbYV0pKTt0aGlzLkkoZyl8fHRoaXMubXEoZyl8fCh0aGlzLkwoZyksZz1uZXcgcWEoZyx0aGlzLkEpLApnLk4oKSxnLmIoKSl9ZWxzZXt0aGlzLkgoKTtyZXR1cm59fX10aGlzLkgoKX19LGt2OmZ1bmN0aW9uKCl7cmV0dXJuIllXUnBkR2x2Ymk1clpXbHVaWFpwWkdWdmQyVnlZblZ1WnoweCJ9LGFwOmZ1bmN0aW9uKCl7dmFyIGI9Zi5LYShkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtyZXR1cm4gZi53YihiLmFuY2hvcil9fSl9KShjKTt2YXIgcmE9Yy5zanx8cmEsc2E9bmV3IHJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnRxPXRoaXMuYVs3XTt0aGlzLm5oPXRoaXMuYVsxMF07dGhpcy5yaT10aGlzLmFbOV07dGhpcy5nPXRoaXMuYVs0XX1jLiRnPWI7Yi5wcm90b3R5cGU9e3NxOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50cTp0aGlzLm1oKGEpfSxtaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMubmg6dGhpcy5waShhKX0scGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5yaTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmc6YX19fSkoYyk7dmFyIHRhPWMuJGd8fHRhLE9jPW5ldyB0YSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PU9jLnNxKDQpOyhmdW5jdGlvbihjKXtjLlhsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9faWQpO3RoaXMuTyhiKTt2YXIgYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdLGE9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiJiZhLmNvbnRyb2xzJiZhLmNvbnRyb2xzLnBsYXllciYmYS5jb250cm9scy5wbGF5ZXIucGF1c2U/dGhpcy5SKGIpOnRoaXMuSCgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY29udHJvbHMucGxheWVyLnBhdXNlKCl9LApwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIucGxheSgpfSxpc1BsYXlpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5jb250cm9scy5wbGF5ZXIuaXNQbGF5aW5nKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iWE9aQ09NIn19KX0pKGMpO3ZhciB1YT1jLlhsfHx1YTsoZnVuY3Rpb24oYyl7Yy5XbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLnRyYWNrZXIudmFzdF9wcmVyb2xsfHxiLnRyYWNrZXIudmFzdF9wb3N0cm9sbD90aGlzLm0oKToodGhpcy5sKCJhZGVycm9yIiksdGhpcy5vKCkpfSxvOmZ1bmN0aW9uKCl7dmFyIGI9ITE7dHJ5e2I9dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmcoKX1jYXRjaChhKXt9Yj90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLAoxMCl9fSl9KShjKTt2YXIgdmE9Yy5XbHx8dmE7KGZ1bmN0aW9uKGMpe2MuWWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmNvbSYmd2luZG93LmNvbS54b3omJndpbmRvdy5jb20ueG96LnZpZGVvcGxheWVyJiZ3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMmJjA8Zi5EYSh3aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMpKXt2YXIgYj13aW5kb3cuY29tLnhvei52aWRlb3BsYXllci5pbnN0YW5jZXMsYTtmb3IoYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBnPWJbYV07aWYoZy5jb250cm9scyYmZy5jb250cm9scy5wbGF5ZXIpZz1uZXcgdWEoZyksdGhpcy5JKGcpfHwodGhpcy5MKGcpLChuZXcgdmEoZyx0aGlzLkEpKS5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgd2E9Yy5ZbHx8d2EseGE9bmV3IHdhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zdD10aGlzLmFbMl07dGhpcy51bz10aGlzLmFbOF07dGhpcy5XZz10aGlzLmFbOV07dGhpcy5GdD10aGlzLmFbOV07dGhpcy5BdT10aGlzLmFbM107dGhpcy5nPXRoaXMuYVs3XX1jLlVvPWI7Yi5wcm90b3R5cGU9e3J0OmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5zdDp0aGlzLnRvKGEpfSx0bzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMudW86dGhpcy5WZyhhKX0sVmc6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLldnOnRoaXMuRXQoYSl9LEV0OmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5GdDp0aGlzLnp1KGEpfSx6dTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLkF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgeWE9Yy5Vb3x8eWEsUGM9bmV3IHlhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVBjLnJ0KDQpOyhmdW5jdGlvbihjKXtjLkpsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYil7dmFyIGE9Yi5lbF87YXx8KGE9Yi5lbCgpKTthPyh0aGlzLk8oYSksKGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKSxiP3RoaXMuUihiKTp0aGlzLmRhKCkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sSzpmdW5jdGlvbigpe3JldHVybiJ2aWRlb2pzIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLm9uKCJ0aW1ldXBkYXRlIixmdW5jdGlvbihiKXt0aGlzLnBiKGIpfS5iaW5kKHRoaXMpKX0scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5jdXJyZW50VGltZSgpLApiPWIuZHVyYXRpb24oKTthJiYwPGEmJmImJjA8YiYmYT49Yi0yJiZ0aGlzLkomJnRoaXMuSigpfSxOYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMudmlkZW9UYWcuZ2V0QXR0cmlidXRlKCJkYXRhLXgtc2V0dXAiKTtpZihiKXRyeXt2YXIgYT1KU09OLnBhcnNlKGIpO2lmKGEuaGFzT3duUHJvcGVydHkoIngtYXV0b3BsYXkiKSYmIWFbIngtYXV0b3BsYXkiXSlyZXR1cm4hMX1jYXRjaChnKXt9Yj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5JiYiZnVuY3Rpb24iPT10eXBlb2YgYi5hdXRvcGxheT9iLmF1dG9wbGF5KCk6ITF9LFdhOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGxheWVyLm11dGVkJiZ0aGlzLnBsYXllci5tdXRlZCgpfSxqYjpmdW5jdGlvbigpe3RoaXMucGF1c2UoKTtyZXR1cm4hMH0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2VkKCk/ITE6ITB9LGV4aXRGdWxsc2NyZWVuOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5leGl0RnVsbHNjcmVlbigpfSwKY3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2lmKGIuY3VycmVudFRpbWUpcmV0dXJuIGIuY3VycmVudFRpbWUoKX19KX0pKGMpO3ZhciB6YT1jLkpsfHx6YTsoZnVuY3Rpb24oYyl7Yy5JbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy56Zz0hMDt0aGlzLnRkPXRoaXMueWY9ITE7dGhpcy5TZigpO3RoaXMuQm4oKTt0aGlzLkhhKCl9LHl2OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtjb25zb2xlLmluZm8odGhpcy5nZXRQbGF5ZXIoKS5mYigpLCI7Iiwid2luZG93LmltYToiLCI7Iix3aW5kb3cuaW1hLCI7Iix0eXBlb2Ygd2luZG93LmltYSwiOyIsInBsYXllci5hZHM6IiwiOyIsYi5iYSwiOyIsCnR5cGVvZiBiLmJhLCI7IiwicGxheWVyLmFkcy5zdGF0ZToiLCI7IixiLmJhP2IuYmEuc3RhdGU6InVuZGVmaW5lZFgiLCI7IixiLmJhP3R5cGVvZiBiLmJhLnN0YXRlOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWE6IiwiOyIsYi5pbWEsIjsiLHR5cGVvZiBiLmltYSwiOyIsInBsYXllci5pbWEzOiIsIjsiLGIuRiwiOyIsdHlwZW9mIGIuRiwiOyIsInBsYXllci5pbWEuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLmltYT9iLmltYS5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRkRXZlbnRMaXN0ZW5lcjoiLCI7IixiLkY/Yi5GLmFkZEV2ZW50TGlzdGVuZXI6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5hZGRFdmVudExpc3RlbmVyOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5zYToKInVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLnNhOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYuc2E6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5nZXRBZHNNYW5hZ2VyKCk6IiwiOyIsYi5pbWEmJmIuaW1hLnNhP2IuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IixiLmltYSYmYi5pbWEuc2E/dHlwZW9mIGIuaW1hLnNhKCk6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuZ2V0QWRzTWFuYWdlcigpOiIsIjsiLGIuRiYmYi5GLnNhP2IuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsYi5GJiZiLkYuc2E/dHlwZW9mIGIuRi5zYSgpOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEuX2Fkc0xvYWRlcjoiLCI7IixiLmltYT9iLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5sZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTG9hZGVyOiIsCiI7IixiLkY/Yi5GLmxkOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubGQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5fYWRzTWFuYWdlcjoiLCI7IixiLmltYT9iLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLGIuaW1hP3R5cGVvZiBiLmltYS5tZDoidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hMy5fYWRzTWFuYWdlcjoiLCI7IixiLkY/Yi5GLm1kOiJ1bmRlZmluZWRYIiwiOyIsYi5GP3R5cGVvZiBiLkYubWQ6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYS5hZHNMb2FkZXI6IiwiOyIsYi5pbWE/Yi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IixiLmltYT90eXBlb2YgYi5pbWEubWE6InVuZGVmaW5lZFgiLCI7IiwicGxheWVyLmltYTMuYWRzTG9hZGVyOiIsIjsiLGIuRj9iLkYubWE6InVuZGVmaW5lZFgiLCI7IixiLkY/dHlwZW9mIGIuRi5tYToidW5kZWZpbmVkWCIsIjsiLCJwbGF5ZXIuaW1hLmFkc01hbmFnZXI6IiwiOyIsYi5pbWE/Yi5pbWEuc2Q6InVuZGVmaW5lZFgiLAoiOyIsYi5pbWE/dHlwZW9mIGIuaW1hLnNkOiJ1bmRlZmluZWRYIiwiOyIsInBsYXllci5pbWEzLmFkc01hbmFnZXI6IiwiOyIsYi5GP2IuRi5zZDoidW5kZWZpbmVkWCIsIjsiLGIuRj90eXBlb2YgYi5GLnNkOiJ1bmRlZmluZWRYIiwiOyIsIkRPTkUiLHRoaXMuYWcpfSxTYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5pbWEzJiYodGhpcy5pbWE9Yi5pbWEzKTtpZihiLmltYSl7dGhpcy5pbWE9Yi5pbWE7dHJ5eyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmltYSYmdGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyKCkuYWN0aXZlUGx1Z2luc18mJjE9PXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpLmFjdGl2ZVBsdWdpbnNfLmltYSYmKHRoaXMuaW1hPXRoaXMuaW1hKCksdGhpcy5pbWEuY29udHJvbGxlciYmKHRoaXMuaW1hPXRoaXMuaW1hLmNvbnRyb2xsZXIpKX1jYXRjaChhKXt9fXJldHVybiB0aGlzLmltYX0sVmI6ZnVuY3Rpb24oKXtpZighdGhpcy5tYSl7dmFyIGI9CnRoaXMuU2EoKTtiJiYoYi5hZHNMb2FkZXImJih0aGlzLm1hPWIuYWRzTG9hZGVyKSxiLl9hZHNMb2FkZXImJih0aGlzLm1hPWIuX2Fkc0xvYWRlciksYi5nZXRBZHNMb2FkZXImJih0aGlzLm1hPWIuZ2V0QWRzTG9hZGVyKSxiLmNvbnRyb2xsZXImJmIuY29udHJvbGxlci5zZGtJbXBsJiZiLmNvbnRyb2xsZXIuc2RrSW1wbC5hZHNMb2FkZXImJih0aGlzLm1hPWIuY29udHJvbGxlci5zZGtJbXBsLmFkc0xvYWRlcikpfXJldHVybiB0aGlzLm1hfSxrZjpmdW5jdGlvbigpe2lmKCF0aGlzLlhiKXt2YXIgYj10aGlzLlNhKCk7YiYmKGIuYWRzTWFuYWdlciYmKHRoaXMuWGI9Yi5hZHNNYW5hZ2VyKSxiLmdldEFkc01hbmFnZXImJih0aGlzLlhiPWIuZ2V0QWRzTWFuYWdlcigpKSl9cmV0dXJuIHRoaXMuWGJ9LGlxOmZ1bmN0aW9uKCl7aWYoIXRoaXMueGYpe3ZhciBiPXRoaXMuU2EoKSxhPXRoaXMuZ3EoKTt3aW5kb3cuaW1hJiZiJiYoYi5fYWRzTG9hZGVyfHxiLmFkc0xvYWRlcnx8YSkmJgoodGhpcy54Zj0hMCl9cmV0dXJuIHRoaXMueGZ9LGdxOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTshdGhpcy5xYyYmYi5hZHMmJihiLmFkcy5zdGF0ZXx8Yi5hZHMuX3N0YXRlKSYmKHRoaXMucWM9ITApO3JldHVybiB0aGlzLnFjfSxIYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuVmIoKTtpZihiKXt2YXIgYT0iYWRFcnJvciIsZz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYKKGc9Z29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQuVHlwZS5BRFNfTUFOQUdFUl9MT0FERUQpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGcsZnVuY3Rpb24oKXt0aGlzLmJlKCl9LmJpbmQodGhpcykpLGIuYWRkRXZlbnRMaXN0ZW5lcihkLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSkpfWVsc2UgdGhpcy5oYSgpfHwKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksMjApfSxiZTpmdW5jdGlvbigpe3RoaXMudGQ9ITA7dmFyIGI9dGhpcy5rZigpO2lmKGJ8fHRoaXMuaGEoKSl7dmFyIGE9ImFkRXJyb3IiLGc9ImxvZyI7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1ImJihhPWdvb2dsZS5pbWEuQWRFcnJvckV2ZW50LlR5cGUuQURfRVJST1IpO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGc9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihnLApmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMuVyghMCl9LmJpbmQodGhpcykpO3ZhciBkPSIiO2YuWGEoKSYmKGQ9Ik1fIik7Yi5hZGRFdmVudExpc3RlbmVyKCJzdGFydCIsZnVuY3Rpb24oKXtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJzdGFydCIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImZpcnN0cXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJmaXN0cXVhcnRpbGUiLCIiLCEwKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJtaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLk5iPSEwO2YuaWIoImNoaXAuZGUiKSYmZi50cmFjaygic3RhdHNfY3VzdF8iK2QrIm1pZHBvaW50IiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigidGhpcmRxdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLk5iPQohMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJ0aGlyZHF1YXJ0aWxlIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiY29tcGxldGUiLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJjb21wbGV0ZSIsIiIsITApfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoImltcHJlc3Npb24iLGZ1bmN0aW9uKCl7dGhpcy5OYj0hMDtmLmliKCJjaGlwLmRlIikmJmYudHJhY2soInN0YXRzX2N1c3RfIitkKyJpbXByZXNzaW9uIiwiIiwhMCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWxsQWRzQ29tcGxldGVkIixmdW5jdGlvbigpe3RoaXMuTmJ8fCh0aGlzLmwoImFkZXJyb3IiLCJub2FkZXZlbnQiKSx0aGlzLlcoKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhhKCl9LmJpbmQodGhpcyksCjIwKX0sanY6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyF0aGlzLlRlJiZiLmFkcyYmKHRoaXMuVGU9Yi5hZHMpO3JldHVybiB0aGlzLlRlfSxCbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5vbigiYWRzZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTNlcnJvciIsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMuVygpO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKX0uYmluZCh0aGlzKSk7Yi5vbigiaW1hM2FkZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpO2Iub24oImltYTMtYWQtZXJyb3IiLGZ1bmN0aW9uKGEpe3RoaXMuVihhKTt0aGlzLlcoKTt0aGlzLmwoImFkZXJyb3IiLHRoaXMuVSl9LmJpbmQodGhpcykpOwpiLm9uKCJhZHMtZmlyc3QtcXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCk7dGhpcy5SZCgpfS5iaW5kKHRoaXMpKX0sVmU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmtmKCk7YiYmYi5kZXN0cm95P2IuZGVzdHJveSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5WZSgpfS5iaW5kKHRoaXMpLDUwKX0sU2Y6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2lmKGIuaXNQbGF5aW5nKCkmJjA8Yi5jdXJyZW50VGltZSgpKWlmKHRoaXMuaXEoKSl7dmFyIGE9dGhpcy5TYSgpLGc9dGhpcy5WYigpO2EmJmcmJih0aGlzLlNhKCksdGhpcy5WYigpLHRoaXMudGR8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy50ZD90aGlzLm0oKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vQWRzTWFuYWdlciIsImFkc01hbmFnZXIiKSl9LmJpbmQodGhpcyksMkUzKSk7dGhpcy5TYSgpfWVsc2UgdGhpcy55Zj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3ZhciBhPQp0aGlzLlNhKCksYj10aGlzLlZiKCk7YSYmIWI/KHdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuU2EoKTt0aGlzLlZiKCl9LmJpbmQodGhpcyksMTAwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BX0FEU0xPQURFUiIpLHRoaXMuVygpKToodGhpcy5XKCEwKSx0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIikpfS5iaW5kKHRoaXMpLDEwMCk6dGhpcy55Zj0hMDtiLmlzUGxheWluZygpJiYxMDxiLmN1cnJlbnRUaW1lKCl8fHRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlNmKCl9LmJpbmQodGhpcyksNTApfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgZz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSlnPSEwO2d8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoZz0hMCk7Im51bWJlciI9PXR5cGVvZiBhJiYKKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LENuOmZ1bmN0aW9uKCl7dGhpcy5RYnx8KHRoaXMuUWI9InVua25vd24iKTt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOwppZihiLmFkcyl7aWYodGhpcy5RYiE9Yi5hZHMuc3RhdGUmJih0aGlzLlFiPWIuYWRzLnN0YXRlKSwiYWQtcGxheWJhY2siPT10aGlzLlFiKXt0aGlzLm0oImFkLXBsYXliYWNrIik7cmV0dXJufX1lbHNlIHRoaXMuUWI9Im5vLWFkcyI7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNuKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITA7dGhpcy5tKCJlbXB0eSB2YXN0Iil9LFc6ZnVuY3Rpb24oYil7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy5oYSgpfHwoYnx8KHRoaXMuemc9ITEpLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy53KHRoaXMuemcsZnVuY3Rpb24oKXt0aGlzLlZlKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKSl9LApIbjpmdW5jdGlvbigpe3RoaXMudHZ8fCgxMDx0aGlzLml1Pyh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGFhemEiKSx3aW5kb3cuc2V0VGltZW91dCh0aGlzLlcuYmluZCh0aGlzKSw1MDApKToodGhpcy5pdSsrLHRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkudnBFdmVudD90aGlzLnBzKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkhuKCl9LmJpbmQodGhpcyksNTApKSl9LHBzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLnZwRXZlbnQmJiF0aGlzLmp1KXt0aGlzLmp1PSEwO3ZhciBhPSIiO2IudnBFdmVudC5yYW5kb21UZXN0JiYoYT0iIik7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkcy1lcnJvciIrYSxmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsInZwOmFkcy1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1lcnJvciIrCmEsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiLCJ2cDphZC1lcnJvciIpO3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMuVy5iaW5kKHRoaXMpLDUwMCl9LmJpbmQodGhpcykpO2IudnBFdmVudC5hZGRFdmVudExpc3RlbmVyKCJ2cDphZC1yZWFkeSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWQtZW5kZWQiK2EsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7Yi52cEV2ZW50LmFkZEV2ZW50TGlzdGVuZXIoInZwOmFkc2xvdC1jb21wbGV0ZSIrYSxmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiLnZwRXZlbnQuYWRkRXZlbnRMaXN0ZW5lcigidnA6YWRzLXJlYWR5IithLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX19KX0pKGMpO3ZhciBBYT1jLklsfHxBYTsoZnVuY3Rpb24oYyl7Yy5LbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZighd2luZG93LmRlbW9QbGF5ZXIpe3ZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaWZyYW1lIiksYTthPXRoaXMubWcod2luZG93KTtmb3IodmFyIGc9MDtnPGIubGVuZ3RoO2crKyl0cnl7YT1hfHx0aGlzLm1nKGJbZ10pfWNhdGNoKGQpe310aGlzLkgoKX19LG1nOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2IudmlkZW9qcyYmYi52aWRlb2pzLmdldFBsYXllcnM/YT1iLnZpZGVvanMuZ2V0UGxheWVycygpOmIudmlkZW9qcyYmYi52aWRlb2pzLnBsYXllcnMmJihhPWIudmlkZW9qcy5wbGF5ZXJzKTtpZigwPGYuRGEoYSkpe2I9YTtmb3IodmFyIGcgaW4gYiliLmhhc093blByb3BlcnR5KGcpJiYoYT1uZXcgemEoYltnXSksYS5qYXx8dGhpcy5JKGEpfHwhMT09PWEuZ2V0UmF3UGxheWVyKCkuaXNSZWFkeV98fCh0aGlzLkwoYSksKG5ldyBBYShhLHRoaXMuQSkpLmIoKSkpO3JldHVybiEwfXJldHVybiExfSxIOmZ1bmN0aW9uKCl7dGhpcy5xYj13aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSx0aGlzLmFjKX19KX0pKGMpOwp2YXIgQmE9Yy5LbHx8QmEsQ2E9bmV3IEJhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk11PXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzZdfWMuU3M9YjtiLnByb3RvdHlwZT17THU6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLk11OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgRGE9Yy5Tc3x8RGEsUWM9bmV3IERhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UWMuTHUoNCk7KGZ1bmN0aW9uKGMpe2Mudmw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuZ2V0UGxheWVyKCkuaWQpOwpiLmdldFdyYXBwZXJFbGVtZW50JiYoYT1iLmdldFdyYXBwZXJFbGVtZW50KCkpO3RoaXMuTyhhKTsoYT1iLmdldFBsYXllcigpLmVsKXx8KGE9Yi5nZXRQbGF5ZXIoKSk7dGhpcy5SKGEpfSxlYTpmdW5jdGlvbigpe30scGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9Yi5nZXRDdXJyZW50VGltZSgpLGc9Yi5nZXREdXJhdGlvbigpO2EmJjA8YSYmZyYmMDxnJiZhPj1nLTImJnRoaXMuSiYmInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZCgpJiZ0aGlzLkooKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOyJmbGFzaCI9PWIucGxheWVyX3R5cGU/Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpOmIuaXNQYXVzZWQoKXx8Yi5nZXRQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLmlzUGF1c2VkKCk7ImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT9iLmdldFBsYXllcigpLnBsYXkoKToKYi5pc1BhdXNlZCgpJiYod2luZG93LnNldFRpbWVvdXQodGhpcy5wbGF5LmJpbmQodGhpcyksMCksYi5nZXRQbGF5ZXIoKS5wbGF5KCkpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuInRvbmxpbmUifSxXYTpmdW5jdGlvbigpe3ZhciBiPSExLGE9dGhpcy5wbGF5ZXIucGxheWVyO2EuaXNNdXRlZCYmYS5pc011dGVkKCkmJihiPSEwKTtyZXR1cm4gYn0sSGM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLnBsYXllci5wbGF5ZXIsYT0hMTtiLmdldFZvbHVtZSYmYi5nZXRWb2x1bWUoKSYmKGE9MTAwKmIuZ2V0Vm9sdW1lKCkpO3JldHVybiBhfX0pfSkoYyk7dmFyIEVhPWMudmx8fEVhOyhmdW5jdGlvbihjKXtjLnVsPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLnpiPW51bGw7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLmVjPSExO3RoaXMuYmcoKTtpZihiLmdldFBsYXllcigpLmFkX2Vycm9yfHxiLmdldFBsYXllcigpLmFkX2ZhaWxlZCl7dmFyIGE9CmIuZ2V0UGxheWVyKCkuYWRFcnJvckNvZGU7Yi5nZXRQbGF5ZXIoKS5hZF9lcnJvciYmIWEmJihhPSJhZF9lcnJvciIpO2IuZ2V0UGxheWVyKCkuYWRfZmFpbGVkJiYhYSYmKGE9ImFkX2ZhaWxlZCIpO2lmKDkwMT09YSl0aGlzLm0oKTtlbHNle2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKXRoaXMuZWM9ITAsdGhpcy5tKCk7dGhpcy5sKCJhZGVycm9yIixhKTtiLmdldFBsYXllcigpO2IuZ2V0UGxheWVyKCk7dGhpcy51YygpfX1lbHNlImZsYXNoIj09Yi5wbGF5ZXJfdHlwZT90aGlzLlFlKCk6dGhpcy5tKCl9LHVjOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmhhKCkpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTtpZigicGxheWluZyI9PWEuZ2V0UGxheWVyKCkuc3RhdGUpaWYoYS5nZXRQbGF5ZXIoKSxhLmdldFBsYXllcigpLGEuZ2V0UGxheWVyKCkuYWRfZXJyb3J8fGEuZ2V0UGxheWVyKCkuYWRfZmFpbGVkKXt2YXIgZz1hLmdldFBsYXllcigpLmFkRXJyb3JDb2RlOwphLmdldFBsYXllcigpLmFkX2Vycm9yJiYhZyYmKGc9ImFkX2Vycm9yIik7YS5nZXRQbGF5ZXIoKS5hZF9mYWlsZWQmJiFnJiYoZz0iYWRfZmFpbGVkIik7aWYoOTAxPT1nKXRoaXMubSgpO2Vsc2V7aWYoMTAwOT09Z3x8MzAzPT1nfHw0MDM9PWcpdGhpcy5lYz0hMCx0aGlzLm0oKTt0aGlzLmwoImFkZXJyb3IiLGcpO2EuZ2V0UGxheWVyKCk7YS5nZXRQbGF5ZXIoKTthLmdldFBsYXllcigpO3RoaXMuZWM/dGhpcy5uYSgpOmI/YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZT90aGlzLncoMTAxMiE9YS5nZXRQbGF5ZXIoKS5hZEVycm9yQ29kZSk6YS5nZXRQbGF5ZXIoKS5hZHNfbG9hZGVyP3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKTp0aGlzLncoITApOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy51YyghMCl9LmJpbmQodGhpcyksMTAwKX19ZWxzZSB0aGlzLm0oKTtlbHNlIGEuZ2V0UGxheWVyKCksd2luZG93LnNldFRpbWVvdXQodGhpcy51Yy5iaW5kKHRoaXMpLAoxMDApfX0sUWU6ZnVuY3Rpb24oKXtpZighdGhpcy5oYSgpKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyJhZExvYWRpbmdFbXB0eSI9PWIubGFzdF9mbGFzaF9ldmVudC5ldmVudCYmKHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy56YiksdGhpcy5tKCkpOyJmaXJzdFF1YXJ0aWxlIj09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7Im1pZHBvaW50Ij09Yi5sYXN0X2ZsYXNoX2V2ZW50LmV2ZW50JiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLnpiKSx0aGlzLm0oKSk7InRoaXJkUXVhcnRpbGUiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuemIpLHRoaXMubSgpKTsiYWRMb2FkaW5nRXJyb3IiPT1iLmxhc3RfZmxhc2hfZXZlbnQuZXZlbnQmJm51bGw9PXRoaXMuemImJih0aGlzLnpiPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lY3x8Cih0aGlzLmwoImFkZXJyb3IiLCJhZExvYWRpbmdFcnJvciIpLHRoaXMudygpKX0uYmluZCh0aGlzKSwyMDApKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLlFlLmJpbmQodGhpcyksNTApfX0sYmc6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLmdldFBsYXllcigpO2IuYWRzX2xvYWRlcj9iLmFkc19sb2FkZXImJmIuYWRzX2xvYWRlci5hZGRFdmVudExpc3RlbmVyJiZiLmFkc19sb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2EuZ2V0RXJyb3IoKTthPWEuZ2V0RXJyb3IoKTthLmdldEVycm9yQ29kZSgpO3RoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSk7aWYoMTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCkpdGhpcy5lYz0hMCx0aGlzLm0oKTs5MDE9PWEuZ2V0RXJyb3JDb2RlKCkmJgp0aGlzLm0oKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmJnKCl9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIEZhPWMudWx8fEZhOyhmdW5jdGlvbihjKXtjLndsPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy52aWRlbyYmdmlkZW8uZ2V0UGxheWVyJiZ2aWRlby5nZXRQbGF5ZXIoKSYmKHZpZGVvLmdldFBsYXllcigpLmVsfHwiZmxhc2giPT12aWRlby5wbGF5ZXJfdHlwZSkpe3ZhciBiPW5ldyBFYSh2aWRlbyk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgRmEoYix0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIEdhPWMud2x8fEdhLEhhPW5ldyBHYShxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX1jLmRyPQpiO2IucHJvdG90eXBlPXtiajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmNqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZzphfX19KShjKTt2YXIgSWE9Yy5kcnx8SWEsUmM9bmV3IElhKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9UmMuYmooNCk7KGZ1bmN0aW9uKGMpe2MueGg9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYik7dGhpcy5RZj1hfSxOOmZ1bmN0aW9uKCl7fSxMZDpmdW5jdGlvbihiKXt0aGlzLlFmPWI7Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlFmKS5wYXJlbnROb2RlO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSwKSzpmdW5jdGlvbigpe3JldHVybiJCQ0ZsYXNoT25seSJ9fSl9KShjKTt2YXIgSmE9Yy54aHx8SmE7KGZ1bmN0aW9uKGMpe2Mud2g9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhLGcpe3RoaXMuZXhwZXJpZW5jZT1nO3RoaXMuaShiLGEpfSxMZDpmdW5jdGlvbihiKXt0aGlzLmV4cGVyaWVuY2U9Yn0sYjpmdW5jdGlvbigpe3RoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkVYUEVSSUVOQ0UpO3ZhciBiPXRoaXMuZXhwZXJpZW5jZS5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpLGE9dGhpcy5leHBlcmllbmNlLmdldE1vZHVsZShBUElNb2R1bGVzLkFEVkVSVElTSU5HKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LkJFR0lOLGZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoQkNNZWRpYUV2ZW50LlBMQVksCmZ1bmN0aW9uKCl7dGhpcy5sKCJjb250ZW50cGxheSIpO3RoaXMudygpfS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoQkNBZHZlcnRpc2luZ0V2ZW50LkFEX1BST0dSRVNTLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfX0pfSkoYyk7dmFyIEthPWMud2h8fEthOyhmdW5jdGlvbihjKXtjLnloPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5icmlnaHRjb3ZlJiZ3aW5kb3cuYnJpZ2h0Y292ZS5leHBlcmllbmNlcyl7dmFyIGI9YnJpZ2h0Y292ZS5leHBlcmllbmNlcyxhO2ZvcihhIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGc9YnJpZ2h0Y292ZS5nZXRFeHBlcmllbmNlKGEpLGQ9ITE7ZyYmKGQ9Zy5nZXRNb2R1bGUoQVBJTW9kdWxlcy5WSURFT19QTEFZRVIpKTtpZihnJiZkJiZkLmlzUGxheWVyRGVmaW5lZCgpKWQ9bmV3IEphKGQsYSksdGhpcy5JKGQpfHwoZC5MZChhKSx0aGlzLkwoZCksCmQ9bmV3IEthKGQsdGhpcy5BLGcpLGQuTGQoZyksZC5iKCkpO2Vsc2V7dGhpcy5IKCk7cmV0dXJufX19dGhpcy5IKCl9fSl9KShjKTt2YXIgTGE9Yy55aHx8TGEsTWE9bmV3IExhKGNhKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5zaD10aGlzLmFbOF07dGhpcy5Sbz10aGlzLmFbNl07dGhpcy5MdD10aGlzLmFbMV07dGhpcy5Ecj10aGlzLmFbNV07dGhpcy5Qcj10aGlzLmFbNV07dGhpcy53aj10aGlzLmFbN107dGhpcy5qbD10aGlzLmFbOV07dGhpcy5GdT10aGlzLmFbNV07dGhpcy5Lbj10aGlzLmFbN107dGhpcy5nPXRoaXMuYVsyXX1jLmpoPWI7Yi5wcm90b3R5cGU9e3JoOmZ1bmN0aW9uKGEpe3JldHVybiAxPGE/dGhpcy5zaDp0aGlzLlFvKGEpfSxRbzpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuUm86dGhpcy5LdChhKX0sS3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT8KdGhpcy5MdDp0aGlzLkNyKGEpfSxDcjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuRHI6dGhpcy5PcihhKX0sT3I6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlByOnRoaXMudmooYSl9LHZqOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy53ajp0aGlzLmlsKGEpfSxpbDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuamw6dGhpcy5FdShhKX0sRXU6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5GdTp0aGlzLkpuKGEpfSxKbjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLktuOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZzphfX19KShjKTt2YXIgTmE9Yy5qaHx8TmEsU2M9bmV3IE5hKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9U2MucmgoNCk7KGZ1bmN0aW9uKGMpe2MuV2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSwKTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2FtZUNvbnRhaW5lclswXTt0aGlzLk8oYik7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLnZpZGVvVGFnLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKSxhPTA7YTxiLmxlbmd0aDthKyspYlthXS5kYXRhPSIiLGJbYV0uc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIn0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkubG9hZEdhbWUoKX0sWGE6ZnVuY3Rpb24oKXt2YXIgYj0hMTskJiYkKCJib2R5LmRldmljZV90YWJsZXQiKSYmMDwkKCJib2R5LmRldmljZV90YWJsZXQiKS5sZW5ndGgmJihiPSEwKTskJiYkKCJib2R5LmRldmljZV9tb2JpbGUiKSYmMDwkKCJib2R5LmRldmljZV9tb2JpbGUiKS5sZW5ndGgmJihiPSEwKTtyZXR1cm4gYn0sSzpmdW5jdGlvbigpe3JldHVybiJOaWNrR2FtZUxvYWRlciJ9fSl9KShjKTt2YXIgT2E9Yy5Xanx8T2E7KGZ1bmN0aW9uKGMpe2MuVmo9CnQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLlhhKCk/KCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidGFwIixmdW5jdGlvbigpe3RoaXMubGMoKX0uYmluZCh0aGlzKSksJCgiI2dhbWUtbGF1bmNoIC5sYXVuY2gtZ2FtZSIpLm9uKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpLCQoIiNnYW1lLWxhdW5jaCAubGF1bmNoLWdhbWUiKS5vbigidG91Y2hzdGFydCIsZnVuY3Rpb24oKXt0aGlzLmxjKCl9LmJpbmQodGhpcykpKTp0aGlzLmxjKCl9LGxjOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmFkRGF0YVJlY2VpdmVkP2IuYWRDb250ZXh0Ll9hZFJlc3BvbnNlP3RoaXMubSgpOih0aGlzLmwoImFkZXJyb3IiLCJub0FkUmVzcG9uc2UiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQodGhpcy5iLmJpbmQodGhpcyksMjAwKX19KX0pKGMpOwp2YXIgUGE9Yy5Wanx8UGE7KGZ1bmN0aW9uKGMpe2MuWGo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93Lk5JQ0smJk5JQ0suR2FtZUxvYWRlciYmTklDSy5HYW1lTG9hZGVyLmdhbWVDb250YWluZXIpe3ZhciBiPW5ldyBPYShOSUNLLkdhbWVMb2FkZXIpO3RoaXMuSShiKXx8KHRoaXMuTChiKSwobmV3IFBhKGIsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBRYT1jLlhqfHxRYSxSYT1uZXcgUWEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuTW09dGhpcy5hWzEwXTt0aGlzLmV0PXRoaXMuYVszXTt0aGlzLnFoPXRoaXMuYVsxXTt0aGlzLmlrPXRoaXMuYVszXTt0aGlzLlppPXRoaXMuYVs1XTt0aGlzLkhyPXRoaXMuYVs2XTt0aGlzLkxwPXRoaXMuYVs1XTt0aGlzLkJzPXRoaXMuYVsxMF07dGhpcy5uaj0KdGhpcy5hWzNdO3RoaXMuR289dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMl19Yy5CbD1iO2IucHJvdG90eXBlPXtMbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTW06dGhpcy5kdChhKX0sZHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmV0OnRoaXMucGgoYSl9LHBoOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucWg6dGhpcy5oayhhKX0saGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmlrOnRoaXMuWWkoYSl9LFlpOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5aaTp0aGlzLkdyKGEpfSxHcjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuSHI6dGhpcy5LcChhKX0sS3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkxwOnRoaXMuQXMoYSl9LEFzOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuQnM6dGhpcy5taihhKX0sbWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLm5qOnRoaXMuRm8oYSl9LEZvOmZ1bmN0aW9uKGEpe3JldHVybiA2PAphP3RoaXMuR286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBTYT1jLkJsfHxTYSxUYz1uZXcgU2EoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1UYy5MbSg0KTsoZnVuY3Rpb24oYyl7Yy5Baz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt0aGlzLlVkPTA7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPWIucGxheWVyQ29udGFpbmVyO2lmKCFhJiYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5pZCYmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJJbnN0YW5jZS5pZCkpJiYoYT1iLnBhcmVudE5vZGUpLCFhKSl7dGhpcy5kYSgpO3JldHVybn10aGlzLk8oYSk7KGI9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSl8fChiPQphLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yj90aGlzLlIoYik6dGhpcy5kYSgpfSxZcjpmdW5jdGlvbihiKXt2YXIgYT10aGlzLmdiLGc9dGhpcy5mYigpLGQ9IiI7Yi5tZW1vJiYoZD1iLm1lbW8udmlkZW9pZCk7ZCYmYSYmYS5ZYiYmKDA8PWcuaW5kZXhPZihkKXx8YS5UZCgpKX0scGF1c2U6ZnVuY3Rpb24oYil7Ynx8KHRoaXMuVWQ9MCk7Yj10aGlzLmdldFJhd1BsYXllcigpO2IucGxheWVySW5zdGFuY2UmJmIucGxheWVySW5zdGFuY2UucGF1c2U/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwYXVzZSIsIioiKSxiLnBsYXllckluc3RhbmNlLnBhdXNlKCkpOndpbmRvdy5vdlZpZGVvJiZ3aW5kb3cub3ZWaWRlby5zdG9wUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGF1c2UiLCIqIiksd2luZG93Lm92VmlkZW8uc3RvcFBsYXliYWNrKCkpfSxqYjpmdW5jdGlvbigpe3RoaXMuVWQrKztpZigxMDx0aGlzLlVkKXJldHVybiExO3RoaXMucGF1c2UoInBhdXNlUmVwZWF0T25BZERlbGl2ZXJ5Iik7CnJldHVybiEwfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtiLnBsYXllckluc3RhbmNlJiZiLnBsYXllckluc3RhbmNlLnBsYXk/KHdpbmRvdy5wb3N0TWVzc2FnZSgiaG9tYWRwbGF5IiwiKiIpLGIucGxheWVySW5zdGFuY2UucGxheSgpKTp3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8ucmVzdW1lUGxheWJhY2smJih3aW5kb3cucG9zdE1lc3NhZ2UoImhvbWFkcGxheSIsIioiKSx3aW5kb3cub3ZWaWRlby5yZXN1bWVQbGF5YmFjaygpKX0saXNQbGF5aW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0UmF3UGxheWVyKCkuaXNQbGF5aW5nfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZSlyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5jdXJyZW50VGltZTtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0Q3VycmVudFRpbWUpcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldEN1cnJlbnRUaW1lKCl9LApnZXREdXJhdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7aWYoYi5wbGF5ZXJJbnN0YW5jZSYmYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbilyZXR1cm4gYi5wbGF5ZXJJbnN0YW5jZS5kdXJhdGlvbjtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uZ2V0RHVyYXRpb24pcmV0dXJuIHdpbmRvdy5vdlZpZGVvLmdldER1cmF0aW9uKCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iT3ZWaWRlbyJ9LGVhOmZ1bmN0aW9uKCl7fSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiZ0aGlzLkomJnRoaXMuSigpfX0pfSkoYyk7dmFyIFRhPWMuQWt8fFRhOyhmdW5jdGlvbihjKXtjLnprPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LFZhOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8Cih0aGlzLmhiPTApLHRoaXMuZ2V0UGxheWVyKCkuaXNQbGF5aW5nKCkmJnRoaXMuaGIrKywxNTx0aGlzLmhiKXRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oITApO2Vsc2V7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtpZihiLmFkdmVydGlzaW5nKWlmKGI9Yi5hZHZlcnRpc2luZy5hZHNMb2FkZXIpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SJiYoYT1nb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSk7dGhpcy52YSgpfHwodGhpcy5sKCJhZGVycm9yIix0aGlzLlUpLHRoaXMubygpKX0uYmluZCh0aGlzKSl9ZWxzZSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuVmEoKX0uYmluZCh0aGlzKSwKMTApO2Vsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGc9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpZz0hMDtnfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8KGc9ITApOyJudW1iZXIiPT10eXBlb2YgYSYmKGIuVT1hLGIubCgiYWRlcnJvciIsYSkpfXJldHVybiBnfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGc9Yi5nZXRFcnJvcigpO2lmKGcuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgZy5nZXRFcnJvckNvZGUmJmEoZy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpOwpyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLlU9dGhpcy5VfHwhMTt0aGlzLlZhKCk7d2luZG93Lm92VmlkZW8mJndpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQmJiF0aGlzLkVvPyh3aW5kb3cub3ZWaWRlby5yZWdpc3RlckV2ZW50KHdpbmRvdy5vdlZpZGVvLk9OX1BMQVlFUl9BREVSUk9SLGZ1bmN0aW9uKCl7dGhpcy5sKCJhZGVycm9yIix0aGlzLlUpO3RoaXMubygpfS5iaW5kKHRoaXMpKSx0aGlzLkVvPSEwLHdpbmRvdy5vdlZpZGVvLnJlZ2lzdGVyRXZlbnQod2luZG93Lm92VmlkZW8uT05fUExBWUVSX1NUT1BQRUQsCmZ1bmN0aW9uKGEpe2IuWXIoYSl9LmJpbmQodGhpcykpKTpiLmlzUGxheWluZygpfHx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9LG86ZnVuY3Rpb24oYil7dGhpcy53KGIpfX0pfSkoYyk7dmFyIFVhPWMuemt8fFVhOyhmdW5jdGlvbihjKXtjLkJrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMud2E9MTUwMDt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cub3ZWaWRlbyYmd2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyJiZ3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllciYmMDx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGgpZm9yKHZhciBiPTA7Yjx3aW5kb3cub3ZWaWRlby5zeW5jaHJvbml6ZXIucmVnaXN0ZXJlZFBsYXllci5sZW5ndGg7YisrKXt2YXIgYT1uZXcgVGEod2luZG93Lm92VmlkZW8uc3luY2hyb25pemVyLnJlZ2lzdGVyZWRQbGF5ZXJbYl0pOwphLmphfHx0aGlzLkkoYSl8fCh0aGlzLkwoYSksKG5ldyBVYShhLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgVmE9Yy5Ca3x8VmEsV2E9bmV3IFZhKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLlF0PXRoaXMuYVs4XTt0aGlzLm5sPXRoaXMuYVs2XTt0aGlzLmppPXRoaXMuYVszXTt0aGlzLmd1PXRoaXMuYVs1XTt0aGlzLmc9dGhpcy5hWzFdfWMudXM9YjtiLnByb3RvdHlwZT17UHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlF0OnRoaXMubWwoYSl9LG1sOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5ubDp0aGlzLmlpKGEpfSxpaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuamk6dGhpcy5mdShhKX0sZnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLmd1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzoKYX19fSkoYyk7dmFyIFhhPWMudXN8fFhhLFVjPW5ldyBYYSgxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVVjLlB0KDQpOyhmdW5jdGlvbihjKXtjLk9pPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5PKGIuZWxlbWVudCk7dGhpcy5SKGIuZWxlbWVudCl9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZXBsYXllcigpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5maW5pc2goKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRSYXdQbGF5ZXIoKS5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJIaXRib3gifX0pfSkoYyk7dmFyIFlhPWMuT2l8fFlhOyhmdW5jdGlvbihjKXtjLk5pPQp0LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGRFdmVudCIsZnVuY3Rpb24oYil7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTtiLmRldGFpbCYmIjEwMTAiPT1iLmRldGFpbC5jb2RlJiZhLmltcHJlc3Npb24mJmEuaW1wcmVzc2lvbigpfS5iaW5kKHRoaXMpKTt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCl9fSl9KShjKTt2YXIgWmE9Yy5OaXx8WmE7KGZ1bmN0aW9uKGMpe2MuUGk9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhpdGJveC5hZGJsb2NrZXIiLGZ1bmN0aW9uKGIpe2I9bmV3IFlhKGIuZGV0YWlsKTtiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksKG5ldyBaYShiLHRoaXMuQSkpLmIoKSl9LmJpbmQodGhpcykpfX0pfSkoYyk7CnZhciAkYT1jLlBpfHwkYSxhYj1uZXcgJGEocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuVWc9dGhpcy5hWzNdO3RoaXMuWHA9dGhpcy5hWzhdO3RoaXMuS2g9dGhpcy5hWzZdO3RoaXMubGk9dGhpcy5hWzhdO3RoaXMuRGk9dGhpcy5hWzVdO3RoaXMub3I9dGhpcy5hWzhdO3RoaXMuS289dGhpcy5hWzZdO3RoaXMudmk9dGhpcy5hWzhdO3RoaXMuWmo9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbNl19Yy5IcD1iO2IucHJvdG90eXBlPXtUZzpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVWc6dGhpcy5XcChhKX0sV3A6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLlhwOnRoaXMuSmgoYSl9LEpoOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5LaDp0aGlzLmtpKGEpfSxraTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMubGk6dGhpcy5DaShhKX0sQ2k6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8CmE/dGhpcy5EaTp0aGlzLm5yKGEpfSxucjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMub3I6dGhpcy5KbyhhKX0sSm86ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLktvOnRoaXMudWkoYSl9LHVpOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy52aTp0aGlzLllqKGEpfSxZajpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlpqOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmc6YX19fSkoYyk7dmFyIGJiPWMuSHB8fGJiLFZjPW5ldyBiYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PVZjLlRnKDQpOyhmdW5jdGlvbihjKXtjLmtqPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT1mLmhmKGIsImVsZW1lbnRJRCIpO3RoaXMuWWY9Yi5wb3NpdGlvbmluZzsKdmFyIGc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Zy5zdHlsZS53aWR0aD1iLndpZHRoO2cuc3R5bGUubWluV2lkdGg9Yi53aWR0aDtnLnN0eWxlLm1heFdpZHRoPWIud2lkdGg7Zy5zdHlsZS5oZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5taW5IZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXhIZWlnaHQ9Yi5oZWlnaHQ7Zy5zdHlsZS5tYXJnaW5MZWZ0PSJhdXRvIjtnLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjsiYmVmb3JlIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYSk6ImFmdGVyIj09dGhpcy5ZZj9hLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGcsYS5uZXh0U2libGluZyk6YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChnLGEpO3RoaXMuTyhnKTt0aGlzLlIoZyk7dGhpcy5EYz1nfSxwYXVzZTpmdW5jdGlvbigpe30scGxheTpmdW5jdGlvbigpe3RoaXMuRGMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLkRjKX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCkduOmZ1bmN0aW9uKCl7Zi5EZih0aGlzLkRjKTtmLkVmKHRoaXMuRGMpO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5HbigpfS5iaW5kKHRoaXMpLDUwKX0sSzpmdW5jdGlvbigpe3JldHVybiJpbnJlYWQifSxIZDpmdW5jdGlvbigpe3JldHVybiEwfX0pfSkoYyk7dmFyIGNiPWMua2p8fGNiOyhmdW5jdGlvbihjKXtjLmpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmwoImV4dGVybmFsIik7dGhpcy53KCEwKX19KX0pKGMpO3ZhciBkYj1jLmpqfHxkYjsoZnVuY3Rpb24oYyl7Yy5saj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLndhPTE1MDA7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoayYmay5pbnJlYWQpe3ZhciBiPWsuaW5yZWFkLGE9Zi5oZihiLCJlbGVtZW50SUQiKTtmLkRmKGEpJiYoYj1uZXcgY2IoYiksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgZGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLnFiPQp3aW5kb3cuc2V0VGltZW91dCh0aGlzLmIuYmluZCh0aGlzKSwxMDApfWVsc2UgdGhpcy5xYj13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDEwMCl9fSl9KShjKTt2YXIgZWI9Yy5sanx8ZWIsZmI9bmV3IGViKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVoPXRoaXMuYVs2XTt0aGlzLmc9dGhpcy5hWzFdfWMuZ3M9YjtiLnByb3RvdHlwZT17ZGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmVoOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuZzphfX19KShjKTt2YXIgZ2I9Yy5nc3x8Z2IsV2M9bmV3IGdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9V2MuZGgoNCk7Yz1jfHwKe307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSl7dGhpcy51cmw9YTt0aGlzLm1ldGhvZD0iR0VUIjt0aGlzLmRhdGE9e319Yy5VaT1iO2IucHJvdG90eXBlPXtzZXREYXRhOmZ1bmN0aW9uKGEpe3RoaXMuZGF0YT1hfSxIczpmdW5jdGlvbihhKXt0aGlzLm1ldGhvZD1hfSxhcHBlbmREYXRhOmZ1bmN0aW9uKGEsYil7dGhpcy5kYXRhW2FdPWJ9LEJtOmZ1bmN0aW9uKGEpe3RyeXt0aGlzLmFwcGVuZERhdGEoImhvbWFkX21hY3JvcyIsSlNPTi5zdHJpbmdpZnkoYSkpfWNhdGNoKGIpe319fX0pKGMpO3ZhciB6PWMuVWl8fHo7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxnLGQsYyl7dGhpcy5JYT1hO3RoaXMuZGY9dGhpcy5LZz0hMTt0aGlzLlRmPWQ7dGhpcy5uZz0hMTsic3RyaW5nIj09PXR5cGVvZiBhJiYodGhpcy5JYT1uZXcgeihhKSk7dmFyIGY9dGhpcy5OYT1uZXcgWE1MSHR0cFJlcXVlc3Q7Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXshZ3x8NCE9Zi5yZWFkeVN0YXRlfHwKMjAwIT1mLnN0YXR1cyYmMjAxIT1mLnN0YXR1c3x8ZyhmKTtpZihkJiY0PT1mLnJlYWR5U3RhdGUmJjIwMCE9Zi5zdGF0dXMmJjIwMSE9Zi5zdGF0dXMpZChmKTtlbHNlIGlmKDQ9PWYucmVhZHlTdGF0ZSYmMD09Zi5zdGF0dXMmJm0mJm0uRmQodGhpcy5JYS51cmwpJiZtLmRkKXt2YXIgaD1uZXcgeihhLnVybCk7aC5IcygiUE9TVCIpO2guc2V0RGF0YSh7aG9tYWRfcGluZzoidHJ1ZSJ9KTsobmV3IGIoaCxmdW5jdGlvbihhKXt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEucmVzcG9uc2VUZXh0KX1jYXRjaChnKXtiPSExfWImJmIucGluZyYmInBvbmciPT1iLnBpbmcmJihiPSEwKTtifHxtLmdhKCJyZXF1ZXN0X2ZhaWxlZF9ub3BvbmcgIil9LGZ1bmN0aW9uKCl7bS5nYSgicmVxdWVzdF9mYWlsZWQiKX0pKS5sb2FkKCl9YyYmNCE9Zi5yZWFkeVN0YXRlJiZjKGYpfS5iaW5kKHRoaXMpfWMuVmk9YjtiLnByb3RvdHlwZT17bG9hZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuSWEuZGF0YTsKaWYoInN0cmluZyIhPXR5cGVvZiBhKXt2YXIgYj1hLGE9IiIsZDtmb3IoZCBpbiBiKWErPSImIitkKyI9IitlbmNvZGVVUklDb21wb25lbnQoYltkXSk7YT1hLnN1YnN0cigxKX10aGlzLmRmJiYoYSs9IiZob21hZF9mb2xsb3dfcmVkaXJlY3RzPXRydWUiKTt0cnl7dGhpcy5uZz90aGlzLk5hLm9wZW4odGhpcy5JYS5tZXRob2QsdGhpcy5JYS51cmwsITEpOnRoaXMuTmEub3Blbih0aGlzLklhLm1ldGhvZCx0aGlzLklhLnVybCwhMCksdGhpcy5LZ3x8KHRoaXMuTmEud2l0aENyZWRlbnRpYWxzPSEwKSwwPGEubGVuZ3RoJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLGsmJmsudnBhaWQmJm0mJm0uT2ModGhpcy5JYS51cmwpJiZ0aGlzLk5hLnNldFJlcXVlc3RIZWFkZXImJnRoaXMuTmEuc2V0UmVxdWVzdEhlYWRlcigiWC1Ib21hZC1Db21wYXRpYmxlLVZwYWlkIiwidHJ1ZSIpLHRoaXMuTmEuc2VuZChhKX1jYXRjaChjKXttJiYKbS5GZCh0aGlzLklhLnVybCk/bS5kZD9tLmdhKCJyZXF1ZXN0X2ZhaWxlZCIpOmYudHJhY2soImNoZWNrIiwicmVxdWVzdF9mYWlsZWQiLCEwKTptLkZkKHRoaXMuSWEudXJsKSx0aGlzLlRmJiZ0aGlzLlRmKCl9cmV0dXJuIHRoaXMuTmF9fX0pKGMpO3ZhciBoYj1jLlZpfHxoYjsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMub2E9ITE7dGhpcy5PYj0iIjt0aGlzLnVkPXRoaXMuZWI9bnVsbDt0aGlzLlZuPXRoaXMubmI9dGhpcy5MZj0hMTt0aGlzLnVhPSIiO3RoaXMuR2Y9ITE7dGhpcy56YT10aGlzLkpjPSIiO3RoaXMuQ2Y9dGhpcy5ZPXRoaXMuaXNFbmFibGVkPXRoaXMuWmQ9ITE7dGhpcy5NYT1bXTt0aGlzLnRmPXRoaXMuRmI9IiI7dGhpcy55ZD0hMTt0aGlzLmtlPTA7dGhpcy55ZT0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX1ZFUklGSUVEIjt0aGlzLndlPSJzdm1wbGF5ZXIuYWR2ZXJ0aXNpbmcuSE9NQURfQkxPQ0tFRCI7dGhpcy5zYj0ic3ZtcGxheWVyLmFkdmVydGlzaW5nLkhPTUFEX05PQkxPQ0tFUiI7CnRoaXMuaGM9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9BREJMT0NLRVIiO3RoaXMueGU9InN2bXBsYXllci5hZHZlcnRpc2luZy5IT01BRF9DT09LSUVCTE9DS0VSIjt0aGlzLkhiPSIiO3RoaXMub2I9W107dGhpcy5JYj1bXTt0aGlzLkdiPSIiO3RoaXMubGU9MDt0aGlzLnZpZGVvcGxhemE9e307dGhpcy5DZD0hMTt0aGlzLkluPXRoaXMuZWQ9bnVsbDt0aGlzLmZjPXRoaXMuQWc9dGhpcy5uZT10aGlzLmRkPXRoaXMudmQ9dGhpcy5qYz0hMTt0aGlzLlBhPXtnbG9iYWw6ITEsY2xpZW50OiExLGN1c3RvbWVyOiExfX1jLldpPWI7Yi5wcm90b3R5cGU9e2dldENvbmZpZzpmdW5jdGlvbigpe3JldHVybntpc0FjdGl2ZTp0aGlzLm9hLGFkdGFncGFyYW1ldGVyOnRoaXMuT2IsYWR0YWdtb2RpZmllcjp0aGlzLmViLGFkdGFncmVnZXg6dGhpcy51ZCxqc3BvcHVwczp0aGlzLkxmLHNpZGVsb2Fkczp0aGlzLm5iLGRpc2FibGV0ZXN0czp0aGlzLlZuLGhvbWFkQWxpYXM6dGhpcy51YSwKaXNJbml0aWFsaXplZDp0aGlzLkdmLGdsb2JhbENvbmZpZzp0aGlzLkpjLGNsaWVudENvbmZpZzp0aGlzLnphLGlzRW5hYmxlZDp0aGlzLmlzRW5hYmxlZCxpc1ZlcmlmaWVkOnRoaXMuWSxpc0Jsb2NrZWQ6dGhpcy5DZixzZXJ2ZXI6dGhpcy5NYSxzdm1Db25maWc6dGhpcy5GYixob21hZEFkcGF0aDp0aGlzLnRmLGRpc2FibGVDb29raWVUZXN0OnRoaXMueWQsdGVzdENvb2tpZUF0dGVtcHRzOnRoaXMua2UsSE9NQURfVkVSSUZJRUQ6dGhpcy55ZSxIT01BRF9CTE9DS0VEOnRoaXMud2UsSE9NQURfTk9CTE9DS0VSOnRoaXMuc2IsSE9NQURfQURCTE9DS0VSOnRoaXMuaGMsSE9NQURfQ09PS0lFQkxPQ0tFUjp0aGlzLnhlLHRlc3RIaWRlOnRoaXMuSGIsdGVzdFRhZ3M6dGhpcy5vYix0ZXN0VGFnc0pTOnRoaXMuSWIsdGVzdENvb2tpZTp0aGlzLkdiLHRocm90dGxlOnRoaXMubGUsdmlkZW9wbGF6YTp0aGlzLnZpZGVvcGxhemEsaG9tYWRUZXN0ZWQ6dGhpcy5DZCxjaGVja2VkSG9tYWRTdGF0dXNDYWxsYmFjazp0aGlzLkluLAphZEJsb2NrZXJEZXRlY3RlZDp0aGlzLmpjLGJsb2NrZWRXYXNDYWxsZWQ6dGhpcy52ZCx1c2VTdHJpY3RDaGVja3M6dGhpcy5kZCx1c2VTdHJpY3RDb25maWdDaGVja3M6dGhpcy5uZSxjb25maWdGYWlsdXJlczp0aGlzLlBhLHNpdGVDb25maWc6dGhpcy5FYixzZXJ2ZXJJZDp0aGlzLmZnLGVuYWJsZVF1YXJ0aWxlVHJhY2tpbmc6dGhpcy5TYix2cGFpZDp0aGlzLmZjfX0senA6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiO2ZvcihiIGluIHRoaXMuUGEpImJvb2xlYW4iPT10eXBlb2YgdGhpcy5QYVtiXSYmMT09dGhpcy5QYVtiXSYmKGE9ITApO3JldHVybiBhfSxjZTpmdW5jdGlvbihhKXt0aGlzLlBhW2FdPSEwfSxicDpmdW5jdGlvbigpe3ZhciBhPVtdLGI7Zm9yKGIgaW4gdGhpcy5QYSkiYm9vbGVhbiI9PXR5cGVvZiB0aGlzLlBhW2JdJiYxPT10aGlzLlBhW2JdJiZhLnB1c2goYik7cmV0dXJuIGF9LFpzOmZ1bmN0aW9uKGEpe2E9YXx8IiI7aWYoInN0cmluZyIhPXR5cGVvZiBhKXJldHVybiBhOwphPWEucmVwbGFjZSgiW3RpbWVdIixNYXRoLnJvdW5kKChuZXcgRGF0ZSkuZ2V0VGltZSgpLzFFMykpO2E9YS5yZXBsYWNlKCJbdGltZU1TXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbdGltZXN0YW1wXSIsKG5ldyBEYXRlKS5nZXRUaW1lKCkpO2E9YS5yZXBsYWNlKCJbcmFuZG9tXSIsdGhpcy5rYigxMCkudG9TdHJpbmcoKSk7YT1hLnJlcGxhY2UoIltkb2N1bWVudFVSTF0iLGRvY3VtZW50LlVSTCk7YT1hLnJlcGxhY2UoIltkb2N1bWVudEJhc2VVUkldIixkb2N1bWVudC5iYXNlVVJJKTtyZXR1cm4gYT1mLmxuKGEpfSxUYTpmdW5jdGlvbihhLGIsZCl7dmFyIGM9IiIsZj0iIixoPSIiLGs9IiI7aWYoIXRoaXMub2EmJiFiKXJldHVybiBuZXcgeihhKTtjPXRoaXMuT2MoYSk7Zj10aGlzLkthKGEpO2M/KHRoaXMuWmIoKT9oPWE6aD1mLnByb3RvY29sKyI6Ly8iK2YuYXV0aG9yaXR5KyIvIixrPWYucGF0aC5zdWJzdHIoMSkpOihoPXRoaXMuYWUoKSxrPWYucGF0aC5zdWJzdHIoMSkrCihmLnF1ZXJ5PyI/IitmLnF1ZXJ5OiIiKSk7ZCYmKHRoaXMuT2J8fHRoaXMuZWJ8fHRoaXMudWQpJiYoaz10aGlzLlNxKGspKTthPW5ldyB6KGgpO2EudXJsPWg7aD0iIjtoPWM/Zi5ob3N0LnNwbGl0KCIuIikuc2xpY2UoMSkuam9pbigiLSIpOnRoaXMuY3AoZi5ob3N0KTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz1oO2EuZGF0YS5ob21hZF91cmxfc3VmZml4PWs7YS5kYXRhLmhvbWFkX3VybF9zdWZmaXhfYmFzZTY0PXRoaXMud2Ioayk7YS5tZXRob2Q9IlBPU1QiO3JldHVybiBhfSxPYzpmdW5jdGlvbihhKXt2YXIgYj0hMSxkPW5ldyBSZWdFeHAoIl4oaHR0cHM/KTovLyhbYS1mMC05XXs0MH0pLj8oW3cuLV0qKTo/LiooWzAtOV0rKT8vPyhbYS1mMC05XXs0MH0pLz8kIiwiZyIpOyhkPWQuZXhlYyhhKSkmJihkWzJdfHxkWzVdKT9iPSEwOnRoaXMuWmIoKSYmKGQ9bmV3IFJlZ0V4cCgiXihodHRwcz8pOi8vKFt3Li1dKik6Py4qKFswLTldKyk/Lz8oW2EtZjAtOV17NDB9KS8/JCIsCiJnIiksKGQ9ZC5leGVjKGEpKSYmZFs0XSYmKGI9ITApKTtyZXR1cm4gYn0sWmI6ZnVuY3Rpb24oKXt2YXIgYT0hMSxiPSIiO3RoaXMuTWEmJnRoaXMuTWEubGVuZ3RoJiYwPHRoaXMuTWEubGVuZ3RoJiYoYj10aGlzLk1hWzBdLGI9Yi5yZXBsYWNlKCJodHRwczovLyIsIiIpLGI9Yi5yZXBsYWNlKCJodHRwOi8vIiwiIiksYj1iLnJlcGxhY2UoIi8vIiwiIiksYT0oYT1iLnNwbGl0KCIuIikpJiZhWzBdJiYiW2hhc2hdIj09YVswXT8hMTohMCk7cmV0dXJuIGF9LEZkOmZ1bmN0aW9uKGEpe3ZhciBiPSExLGQ9UmVnRXhwKCJeKGh0dHBzPyk6Ly8oW2EtZjAtOV17NDB9KS4/LioiLCJnIikuZXhlYyhhKTtkJiYoZFsyXXx8ZFs1XSk/Yj0hMDpiPXRoaXMuT2MoYSk7cmV0dXJuIGJ9LGNwOmZ1bmN0aW9uKGEpe3ZhciBiPSIiLGQ9IiI7aWYoInN0cmluZyI9PT10eXBlb2YgdGhpcy51YSYmMDx0aGlzLnVhLmxlbmd0aClyZXR1cm4gdGhpcy51YTtmb3IoZCBpbiB0aGlzLnVhKWlmKGI9dGhpcy51YVtkXSwKYi5oYXNPd25Qcm9wZXJ0eSgidXJsIikmJmIudXJsPT09YSlyZXR1cm4gYi5idjtyZXR1cm4ibm9uZSJ9LExjOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTWFbdGhpcy5mZ119LGFlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5MYygpLGI9dGhpcy5qZygobmV3IERhdGUpLmdldFRpbWUoKSsiIiksZD0iMWFiY2RmIi5zcGxpdCgiIik7cmV0dXJuIGEucmVwbGFjZSgiW2hhc2hdIixiLnNsaWNlKDAsLTEpKyIiK2RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKmQubGVuZ3RoKV0pfSxTcTpmdW5jdGlvbihhKXt0aGlzLk9iJiYoYSs9dGhpcy5PYik7aWYodGhpcy5lYilmb3IodmFyIGIgaW4gdGhpcy5lYil0aGlzLmViLmhhc093blByb3BlcnR5KGIpJiYoYT1hLnJlcGxhY2UoYix0aGlzLmViW2JdKSk7cmV0dXJuIGF9LGM6ZnVuY3Rpb24oYSxiLGQsYyxmLGgpe209dGhpczt0aGlzLkdmPSEwO3RoaXMuSmM9YTt0aGlzLnphPWI7dGhpcy5aZD1kO3RoaXMuZWQ9Yzt0aGlzLkJjPWY7dGhpcy5FYj0KaDt0aGlzLkZxKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLnphKXRoaXMuRHEoKTtlbHNlIHRyeXt0aGlzLnphPWIoKSx0aGlzLndjKCl9Y2F0Y2goayl7dGhpcy5nYSgibm9DbGllbnRDb25maWciKX19LFphOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7dHJ5e2I9bmV3IEV2ZW50KGEpfWNhdGNoKGQpe2I9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksYi5pbml0RXZlbnQoImN1c3RvbSIsITAsITEpfXJldHVybiBifSxGcTpmdW5jdGlvbigpe3RoaXMuRmEobmV3IHoodGhpcy5KYyt0aGlzLm9jKCJnbG9iYWwiKSksdGhpcy5zcC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiZ2xvYmFsIik7Im9iamVjdCI9PXR5cGVvZiBfY2xpZW50Q29uZmlnJiZ0aGlzLndjKCl9LmJpbmQodGhpcyksITApfSxEcTpmdW5jdGlvbigpe25ldyB6KHRoaXMuemErdGhpcy5vYygiY2xpZW50IikpO3RoaXMuRmEobmV3IHoodGhpcy56YSt0aGlzLm9jKCJjbGllbnQiKSksdGhpcy53Yy5iaW5kKHRoaXMpLApmdW5jdGlvbigpe3RoaXMuY2UoImNsaWVudCIpO3RoaXMuZ2EoImNsaWVudENvbmZpZ0NvdWxkTm90QmVMb2FkZWQiKX0uYmluZCh0aGlzKSwhMCl9LG9jOmZ1bmN0aW9uKGEpe3ZhciBiPSI/Y2FjaGU9Iit0aGlzLmtiKCk7dGhpcy5FYiYmdGhpcy5FYi5ub0NsaWVudENvbmZpZ0NhY2hlQnVzdGVyJiYiY2xpZW50Ij09YSYmKGI9IiIpO3RoaXMuRWImJnRoaXMuRWIubm9DYWNoZUJ1c3RlciYmKGI9IiIpO3JldHVybiBifSxnYTpmdW5jdGlvbihhKXtpZighdGhpcy52ZCl7dGhpcy52ZD0hMDt2YXIgYj1mdW5jdGlvbigpe2Zvcih2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKSxiPTA7YjxhLmxlbmd0aDtiKyspe2lmKGFbYl0mJmFbYl0ucGF1c2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBhW2JdLnBhdXNlKXRyeXthW2JdLnBhdXNlKCl9Y2F0Y2goZyl7fWFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKX1hPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKTsKZm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYVtiXSk7YT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJ2aWRlby13cmFwcGVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTthPWRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoInZpZGVvcGxheWVyIik7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylhW2JdJiZhW2JdLnBhcmVudE5vZGUmJmFbYl0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChhW2JdKTtpZih3aW5kb3cuc2VsZiE9d2luZG93LnRvcClmb3IoYT13aW5kb3cuZG9jdW1lbnQ7YS5oYXNDaGlsZE5vZGVzKCk7KWEucmVtb3ZlQ2hpbGQoYS5sYXN0Q2hpbGQpfTt0aGlzLkJjJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuQmM/dGhpcy5CYygpOihiKCksd2luZG93LnNldEludGVydmFsKGIsNTAwKSk7dGhpcy5ZPXRoaXMuQ2Y9CiEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLndlKSk7dGhpcy5yYigpO2YuVGIobC5Ocik7KGI9Zi5vZih0aGlzLkxjKCkpKXx8KGI9Zi5vZihkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSk7YXx8KGE9InVua293biIpO2YudHJhY2soInN0YXRzX2hkX3BlbmFsdHkiLGEsITApfX0sc3A6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhLnJlc3BvbnNlVGV4dCl9Y2F0Y2goYyl7Yi5lbmFibGVkPSJmYWxzZSJ9dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuWT0hdGhpcy5pc0VuYWJsZWQ7dGhpcy5pc0VuYWJsZWQ/Im9iamVjdCIhPXR5cGVvZiB0aGlzLnphfHx0aGlzLkZifHx0aGlzLnVhfHx0aGlzLndjKCk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX19LHdjOmZ1bmN0aW9uKGEpe3ZhciBiPQohMTthJiYoYj1hLnJlc3BvbnNlVGV4dCk7YT17fTtpZihiKXRyeXthPUpTT04ucGFyc2UoYil9Y2F0Y2goYyl7YT10aGlzLnphfWVsc2UgYT10aGlzLnphO3RoaXMuaXNFbmFibGVkPXRoaXMuSmIoYS5lbmFibGVkKTt0aGlzLlk9IXRoaXMuaXNFbmFibGVkO3RoaXMuTWE9YS5zZXJ2ZXJ8fFtdO3RoaXMuRmI9YS5jb25maWd8fCIiO3RoaXMudWE9YS5hbGlhc3x8bnVsbDt0aGlzLnRmPWEuYWRwYXRofHwiIjt0aGlzLnlkPWEuZGlzYWJsZWNvb2tpZXRlc3R8fCExO3RoaXMuZmc9TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKnRoaXMuTWEubGVuZ3RoKTt0aGlzLmlzRW5hYmxlZCYmdGhpcy5GYiYmdGhpcy51YSYmdGhpcy5NYS5sZW5ndGg/dGhpcy5RYyghMSk6KHRoaXMub2E9dGhpcy5pc0VuYWJsZWQ9ITEsdGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy5yYigpKX0sUWM6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuWSl7dmFyIGI9e307aWYoYSl7dmFyIGI9Cm5ldyB6KHRoaXMuYWUoKSksYz10aGlzLkthKHRoaXMuRmIpO2IuZGF0YS5ob21hZF91cmxfcHJlZml4X2FsaWFzPSJzM2hvbWFkZ2xvYmFsY29uZmlncyI7Yi5kYXRhLmhvbWFkX3VybF9zdWZmaXg9Yy5wYXRoLnN1YnN0cigxKS5yZXBsYWNlKCJob21hZC1nbG9iYWwtY29uZmlncy5zY2huZWV2b25tb3JnZW4uY29tLyIsIiIpO2IubWV0aG9kPSJQT1NUIn1lbHNlIGI9bmV3IHoodGhpcy5GYit0aGlzLm9jKCJjdXN0b21lciIpKTt0aGlzLkZhKGIsdGhpcy5hdC5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5jZSgiY3VzdG9tZXIiKTthP3RoaXMuYWw/dGhpcy5nYSgibm9TVk1Db25maWciKToodGhpcy5hbD0hMCx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUWMoITApfS5iaW5kKHRoaXMpLDEwMCkpOnRoaXMuUWMoITApfS5iaW5kKHRoaXMpLCEwKX19LGF0OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLlkpe2E9YS5yZXNwb25zZVRleHQ7dmFyIGI9e307dHJ5e2I9SlNPTi5wYXJzZShhKX1jYXRjaChjKXt9dGhpcy5kZD0KdGhpcy5KYihiLnN0cmljdCk7dGhpcy5uZT10aGlzLkpiKGIuc3RyaWN0X2NvbmZpZ19lbmFibGVkKTt0aGlzLkFnPWIuZHVyYXRpb25fY2hlY2tfZW5hYmxlZHx8ITE7dGhpcy5TYj10aGlzLkpiKGIuZW5hYmxlUXVhcnRpbGVUcmFja2luZyk7dGhpcy5pc0VuYWJsZWQ9dGhpcy5KYihiLmVuYWJsZWQpO3RoaXMuSGI9Yi50ZXN0aGlkZXx8IiI7dGhpcy5vYj1iLnRlc3RhZHRhZ3N8fFtdO3RoaXMuSWI9Yi50ZXN0YWR0YWdzanN8fGIudGVzdGFkdGFnc3x8W107dGhpcy5PYj1iLmFkdGFncGFyYW1ldGVyfHwiIjt0aGlzLmViPWIuYWR0YWdtb2RpZmllcnx8bnVsbDt0aGlzLnVkPWIuYWR0YWdyZWdleHx8bnVsbDt0aGlzLkxmPWIuanNwb3B1cHN8fCExO3RoaXMubmI9Yi5zaWRlbG9hZHN8fCExO3RoaXMuZmM9Yi52cGFpZHx8ITE7dGhpcy5FYi52cGFpZD10aGlzLmZjO3RoaXMuR2I9Yi50ZXN0M3JkcGFydHljb29raWUmJmIudGVzdDNyZHBhcnR5Y29va2llIGluc3RhbmNlb2YgQXJyYXk/CnRoaXMubXAoYi50ZXN0M3JkcGFydHljb29raWUpOmIudGVzdDNyZHBhcnR5Y29va2llfHwiIjt0aGlzLnlkJiYodGhpcy5HYj1udWxsKTt0aGlzLmxlPWIudGhyb3R0bGV8fDA7dGhpcy52aWRlb3BsYXphPWIudmlkZW9wbGF6YXx8e307IXRoaXMuQ2QmJnRoaXMuaXNFbmFibGVkPyh0aGlzLkNkPSEwLHRoaXMuUWMoITApKTp0aGlzLmlzRW5hYmxlZCYmIXRoaXMudHQoKSYmKHRoaXMuSGJ8fHRoaXMuSWJ8fHRoaXMub2J8fHRoaXMuR2IpP3RoaXMuWmQ/KHRoaXMub2E9dGhpcy5ZPSEwLGRvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSksdGhpcy53ZCgpLHRoaXMucmIoKSk6dGhpcy5qdCgpOih0aGlzLmlzRW5hYmxlZD0hMSx0aGlzLmt0KCkpfX0sanQ6ZnVuY3Rpb24oKXt0aGlzLml0KCl9LGt0OmZ1bmN0aW9uKCl7dGhpcy5ZPSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQodGhpcy5aYSh0aGlzLnNiKSk7dGhpcy5yYigpfSxjZDpmdW5jdGlvbihhKXt0aGlzLmpjPQohMDt0aGlzLll8fCh0aGlzLlk9dGhpcy5vYT0hMCxkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEoYSkpLHRoaXMucmIoKSx0aGlzLndkKCkpfSxpdDpmdW5jdGlvbigpe2lmKHRoaXMuSGIpe3ZhciBhPSExO3RyeXt2YXIgYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuSGIpO2Iuc2V0QXR0cmlidXRlKCJpZCIsdGhpcy5IYik7Yi5zZXRBdHRyaWJ1dGUoInN0eWxlIiwid2lkdGg6MXB4O2hlaWdodDoxcHg7bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweDtiYWNrZ3JvdW5kLWNvbG9yOiNmZjAwMDAiKTtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGIpO3ZhciBjPTA9PT1iLm9mZnNldFdpZHRofHwwPT09Yi5vZmZzZXRIZWlnaHQ7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTthPWN9Y2F0Y2goZSl7fWE/dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRIaWRlKCkgYWQgZWxlbWVudCB3YXMgaGlkZGVuIik6CnRoaXMucWcoKX1lbHNlIHRoaXMucWcoKX0scGc6ZnVuY3Rpb24oKXt2YXIgZTt2YXIgYztmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLHRoaXMua2IoKSk7dGhpcy5udChlLDA8Yy5sZW5ndGg/YS5iaW5kKHRoaXMpOnRoaXMuaWUuYmluZCh0aGlzKSxiLmJpbmQodGhpcykpfWZ1bmN0aW9uIGIoKXt0aGlzLmNkKHRoaXMuaGMsIm4gSG9tYWRVdGlsLnRlc3RBZENhbGwoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX10aGlzLm9iPW51bGwsdGhpcy5pZSgpfSxudDpmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZSgpe2YoKSYmYigpfWZ1bmN0aW9uIGYoKXtyZXR1cm4gaD8od2luZG93LmNsZWFyVGltZW91dChoKSwhMCk6ITF9dmFyIGg9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dGhpcy5GYShuZXcgeihhKSxlLGZ1bmN0aW9uKCl7ZigpJiZjKCl9KX0scWc6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7ZT1jLnNoaWZ0KCkucmVwbGFjZSgiW3JhbmRvbV0iLAp0aGlzLmtiKCkpO3RoaXMub3QoZSwwPGMubGVuZ3RoP2EuYmluZCh0aGlzKTp0aGlzLnBnLmJpbmQodGhpcyksYi5iaW5kKHRoaXMpKX1mdW5jdGlvbiBiKCl7dGhpcy5jZCh0aGlzLmhjLCJuIEhvbWFkVXRpbC50ZXN0QWRDYWxsSlMoKSBhZCBjYWxsIHRvICciK2UrIicgd2FzIGJsb2NrZWQiKX1pZih0aGlzLkliJiZ0aGlzLkliLmxlbmd0aCl7dmFyIGM9dGhpcy5JYi5zbGljZSgpLGU7YS5iaW5kKHRoaXMpKCl9ZWxzZSB0aGlzLnBnKCl9LG90OmZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBlKCl7aCgpJiZiKCl9ZnVuY3Rpb24gZigpe2goKSYmYygpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gaz8od2luZG93LmNsZWFyVGltZW91dChrKSwhMCk6ITF9dmFyIGs9d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlKCl9LDNFMyk7dHJ5e3dpbmRvdy5vbmVycm9yPWZ1bmN0aW9uKGIsYyl7Yz09YSYmaCgpJiZmKCl9O3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobCk7Cmwuc2V0QXR0cmlidXRlKCJhc3luYyIsImFzeW5jIik7bC5zZXRBdHRyaWJ1dGUoImRlZmVyIiwiZGVmZXIiKTtsLm9ubG9hZD1lO2wub25lcnJvcj1mO2wuc3JjPWE7bC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZil9Y2F0Y2gobSl7ZSgpfX0saWU6ZnVuY3Rpb24oKXt0aGlzLkdiPyh0aGlzLmtlKyssdGhpcy5GYShuZXcgeih0aGlzLkdiKSx0aGlzLmh0LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmplKCJDQ0MiKX0uYmluZCh0aGlzKSkpOnRoaXMub2coKX0samU6ZnVuY3Rpb24oYSl7dGhpcy5jZCh0aGlzLnhlLCJuIEhvbWFkVXRpbC50ZXN0M3JkUGFydHlDb29raWUoKSBjYW5ub3Qgc2V0IDNyZCBwYXJ0eSBjb29raWUgIithKX0saHQ6ZnVuY3Rpb24oYSl7YT1hLnJlc3BvbnNlVGV4dDt2YXIgYj0hMTt0cnl7Yj1KU09OLnBhcnNlKGEpfWNhdGNoKGMpe31iJiZiLnN0YXR1cz8idHJpZ2dlci1zZXQiPT1iLnN0YXR1cz8zPnRoaXMua2U/dGhpcy5pZSgpOnRoaXMuamUoIkJCQiIpOgoiYWxyZWFkeS1zZXQiPT1iLnN0YXR1cyYmdGhpcy5vZygpOnRoaXMuamUoIkFBQSIpfSxvZzpmdW5jdGlvbigpe3RoaXMuWT0hMDtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy5zYikpO3RoaXMucmIoKTt0aGlzLndkKCl9LHJiOmZ1bmN0aW9uKCl7dmFyIGE9IjAiLGI9IjAiO2YuWGEoKSYmKGE9IjEiKTt0aGlzLmpjJiYoYj0iMSIpO2YudHJhY2soInN0YXRzX2hkX21vYmlsZV9hYiIsYSsiIitiLCEwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KHRoaXMuWmEodGhpcy55ZSkpO3RoaXMuZWQmJiJmdW5jdGlvbiI9PT10eXBlb2YgdGhpcy5lZCYmdGhpcy5lZCgpfSxGbjpmdW5jdGlvbigpe2lmKHRoaXMubmUmJnRoaXMuenAoKSl7dmFyIGE9dGhpcy5icCgpO2EmJmEuam9pbiYmZi50cmFjaygiY29uZmlnX2ZhaWxlZCIsYS5qb2luKCJfIiksITApfX0sdGc6ZnVuY3Rpb24oYSl7YXx8KGE9IiIpO2lmKCJzdHJpbmciIT09dHlwZW9mIGEpdHJ5e2E9YS50b1N0cmluZygpfWNhdGNoKGIpe2E9CiJjb3VsZF9ub3RfY29udmVydF90b19zdHJpbmcifWE9YS50cmltKCk7Zi50cmFjaygic3RhdHNfaGRfYWN0aXZhdGVkIixhLCEwKX0sRmE6ZnVuY3Rpb24oYSxiLGMsZSxoLEljKXthPW5ldyBoYihhLGIsYyk7ZSYmKGEuS2c9ITApO2gmJmYubnEoKSYmKGEuZGY9ITApO0ljJiYoYS5uZz0hMCk7cmV0dXJuIGEubG9hZCgpfSxPZTpmdW5jdGlvbigpe2YuWGEoKXx8Zi5ZYSgiaHR0cDovL2QzNzk5NjRheW1leDJ4LmNsb3VkZnJvbnQubmV0L2NoZWNrLnhtbD9lbXB0eT10cnVlIiwiaG9tYWRzdGF0aWN2YXN0Iix7aG9tYWRfaGFzaF9ndWVzc2VkOiJ0cnVlIn0sZnVuY3Rpb24oYSl7dmFyIGI9bnVsbCxjPW51bGwsZT0iIjt0cnl7KGI9YS5yZXNwb25zZVhNTCl8fChiPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEucmVzcG9uc2VUZXh0LCJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZil7dGhpcy5nYSgibWVkaWFmaWxlX25veG1sIik7CnJldHVybn1pZihjKWlmKGE9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIikpaWYoYVswXSYmKGE9YVswXSksYSl7ZT0oYSYmYS5jaGlsZE5vZGVzJiZhLmNoaWxkTm9kZXNbMF0/YS5jaGlsZE5vZGVzWzBdLm5vZGVWYWx1ZToiIikucmVwbGFjZSgiY2hpcC5kZSIsImN1cmxvYy5jb20iKTt0aGlzLlpiKCl8fChhPXRoaXMuS2EoZSksZT1hLnByb3RvY29sKyI6Ly8iK2EuaG9zdCk7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKTtoLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbigpe2gubmV0d29ya1N0YXRlPT1oLk5FVFdPUktfTk9fU09VUkNFJiZ0aGlzLmdhKCJtZWRpYWZpbGUiKX0uYmluZCh0aGlzKSk7aC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzb3VyY2UiKSk7aC5zZXRBdHRyaWJ1dGUoInNyYyIsZSl9ZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9tZWRpYSIpO2Vsc2UgdGhpcy5nYSgibWVkaWFmaWxlX25vbWVkaWEiKTsKZWxzZSB0aGlzLmdhKCJtZWRpYWZpbGVfbm9hZCIpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5nYSgibWVkaWFmaWxlX3htbHJlcXVlc3QiKX0uYmluZCh0aGlzKSx0aGlzKX0sRW46ZnVuY3Rpb24oKXt0aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTt2YXIgYT10aGlzLlRhKCJodHRwOi8vZDM3OTk2NGF5bWV4MnguY2xvdWRmcm9udC5uZXQvY2hlY2sueG1sP2VtcHR5PXRydWUiLCEwKTthLmRhdGEuaG9tYWRfdXJsX3ByZWZpeF9hbGlhcz0iaG9tYWRzdGF0aWN2YXN0IjthLmRhdGEuaG9tYWRfaGFzaF9ndWVzc2VkPSJ0cnVlIjt0aGlzLkZhKGEsdGhpcy5WdC5iaW5kKHRoaXMpLHRoaXMuVXQuYmluZCh0aGlzKSl9LFZ0OmZ1bmN0aW9uKGEpe3ZhciBiPW51bGwsYz1udWxsO3RyeXsoYj1hLnJlc3BvbnNlWE1MKXx8KGI9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsCiJ0ZXh0L3htbCIpKSxjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkIilbMF19Y2F0Y2goZSl7cmV0dXJufWN8fHRoaXMuem8oKX0sVXQ6ZnVuY3Rpb24oKXt9LHpvOmZ1bmN0aW9uKCl7Zi5UYihsLnlvKTtmLnRyYWNrKCJmYWlsLWluaXQiLCIxMDEiKTt0aGlzLmdhKCJ2YXN0ZmlsZU1hbmlwdWxhdGlvbiIpfSx3ZDpmdW5jdGlvbigpe2lmKHRoaXMuaXNFbmFibGVkJiZ0aGlzLm5iLmxlbmd0aClmb3IodmFyIGE9MDthPHRoaXMubmIubGVuZ3RoO2ErKyl7dmFyIGI9dGhpcy5uYlthXTsicmVxdWVzdCI9PWIudHlwZSYmZi5ZYShiLnVybCxiLmFsaWFzLG51bGwsZnVuY3Rpb24oKXt9LGZ1bmN0aW9uKCl7fSx0aGlzKX19LHR0OmZ1bmN0aW9uKCl7cmV0dXJuIDEwMCpNYXRoLnJhbmRvbSgpPHRoaXMubGV9LG1wOmZ1bmN0aW9uKGEpe3JldHVybiBhW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSphLmxlbmd0aCldfSxrYjpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChNYXRoLnBvdygxMCwKYXx8MTApKiguODk5OTk5OTk5Kk1hdGgucmFuZG9tKCkrLjEpKX0scGE6ZnVuY3Rpb24oYSl7YT1hfHwxMDtmb3IodmFyIGI9IiIsYz0wO2M8YTtjKyspYis9U3RyaW5nLmZyb21DaGFyQ29kZSgoLjU+TWF0aC5yYW5kb20oKT82NTo5NykrTWF0aC5mbG9vcigyNipNYXRoLnJhbmRvbSgpKSk7cmV0dXJuIGJ9LEpiOmZ1bmN0aW9uKGEpe3JldHVybiJUcnVlIj09YXx8InRydWUiPT1hfHwxPT1hfHwiMSI9PWF8fDE9PWF9LHdiOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjLGUsZixoLGssbCxtPTA7bTxhLmxlbmd0aDspYz1hLmNoYXJDb2RlQXQobSsrKSxlPWEuY2hhckNvZGVBdChtKyspLGY9YS5jaGFyQ29kZUF0KG0rKyksaD1jPj4yLGM9KGMmMyk8PDR8ZT4+NCxrPShlJjE1KTw8MnxmPj42LGw9ZiY2Myxpc05hTihlKT9rPWw9NjQ6aXNOYU4oZikmJihsPTY0KSxiPWIrIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89Ii5jaGFyQXQoaCkrCiJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGMpKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGspKyJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvPSIuY2hhckF0KGwpO3JldHVybiBifSxLYTpmdW5jdGlvbihhKXt2YXIgYj0ic291cmNlIHByb3RvY29sIGF1dGhvcml0eSB1c2VySW5mbyB1c2VyIHBhc3N3b3JkIGhvc3QgcG9ydCByZWxhdGl2ZSBwYXRoIGRpcmVjdG9yeSBmaWxlIHF1ZXJ5IGFuY2hvciIuc3BsaXQoIiAiKTthPS9eKD86KD8hW146QF0rOlteOkBcL10qQCkoW146XC8/Iy5dKyk6KT8oPzpcL1wvKT8oKD86KChbXjpAXSopKD86OihbXjpAXSopKT8pP0ApPyhbXjpcLz8jXSopKD86OihcZCopKT8pKCgoXC8oPzpbXj8jXSg/IVtePyNcL10qXC5bXj8jXC8uXSsoPzpbPyNdfCQpKSkqXC8/KT8oW14/I1wvXSopKSg/Olw/KFteI10qKSk/KD86IyguKikpPykvLmV4ZWMoYSk7CmZvcih2YXIgYz17fSxlPTE0O2UtLTspY1tiW2VdXT1hW2VdfHwiIjtjLnF1ZXJ5S2V5PXt9O2NbYlsxMl1dLnJlcGxhY2UoLyg/Ol58JikoW14mPV0qKT0/KFteJl0qKS9nLGZ1bmN0aW9uKGEsYixnKXtiJiYoYy5xdWVyeUtleVtiXT1nKX0pO3JldHVybiBjfSxqZzpmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEpe3ZhciBjPSIiLGcsZDtmb3IoZz03OzA8PWc7Zy0tKWQ9YT4+PjQqZyYxNSxjKz1kLnRvU3RyaW5nKDE2KTtyZXR1cm4gY31mdW5jdGlvbiBjKGEsYil7cmV0dXJuIGE8PGJ8YT4+PjMyLWJ9dmFyIGUsZixoPUFycmF5KDgwKSxrPTE3MzI1ODQxOTMsbD00MDIzMjMzNDE3LG09MjU2MjM4MzEwMixxPTI3MTczMzg3OCxyPTMyODUzNzc1MjAsbixwLHcsdCx4O249YS5sZW5ndGg7dmFyIHk9W107Zm9yKGU9MDtlPG4tMztlKz00KWY9YS5jaGFyQ29kZUF0KGUpPDwyNHxhLmNoYXJDb2RlQXQoZSsxKTw8MTZ8YS5jaGFyQ29kZUF0KGUrMik8PDh8YS5jaGFyQ29kZUF0KGUrMykseS5wdXNoKGYpOwpzd2l0Y2gobiU0KXtjYXNlIDA6ZT0yMTQ3NDgzNjQ4O2JyZWFrO2Nhc2UgMTplPWEuY2hhckNvZGVBdChuLTEpPDwyNHw4Mzg4NjA4O2JyZWFrO2Nhc2UgMjplPWEuY2hhckNvZGVBdChuLTIpPDwyNHxhLmNoYXJDb2RlQXQobi0xKTw8MTZ8MzI3Njg7YnJlYWs7Y2FzZSAzOmU9YS5jaGFyQ29kZUF0KG4tMyk8PDI0fGEuY2hhckNvZGVBdChuLTIpPDwxNnxhLmNoYXJDb2RlQXQobi0xKTw8OHwxMjh9Zm9yKHkucHVzaChlKTsxNCE9eS5sZW5ndGglMTY7KXkucHVzaCgwKTt5LnB1c2gobj4+PjI5KTt5LnB1c2gobjw8MyY0Mjk0OTY3Mjk1KTtmb3IoYT0wO2E8eS5sZW5ndGg7YSs9MTYpe2ZvcihlPTA7MTY+ZTtlKyspaFtlXT15W2ErZV07Zm9yKGU9MTY7Nzk+PWU7ZSsrKWhbZV09YyhoW2UtM11eaFtlLThdXmhbZS0xNF1eaFtlLTE2XSwxKTtmPWs7bj1sO3A9bTt3PXE7dD1yO2ZvcihlPTA7MTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8fm4mdykrdCtoW2VdKzE1MTg1MDAyNDkmNDI5NDk2NzI5NSwKdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtmb3IoZT0yMDszOT49ZTtlKyspeD1jKGYsNSkrKG5ecF53KSt0K2hbZV0rMTg1OTc3NTM5MyY0Mjk0OTY3Mjk1LHQ9dyx3PXAscD1jKG4sMzApLG49ZixmPXg7Zm9yKGU9NDA7NTk+PWU7ZSsrKXg9YyhmLDUpKyhuJnB8biZ3fHAmdykrdCtoW2VdKzI0MDA5NTk3MDgmNDI5NDk2NzI5NSx0PXcsdz1wLHA9YyhuLDMwKSxuPWYsZj14O2ZvcihlPTYwOzc5Pj1lO2UrKyl4PWMoZiw1KSsobl5wXncpK3QraFtlXSszMzk1NDY5NzgyJjQyOTQ5NjcyOTUsdD13LHc9cCxwPWMobiwzMCksbj1mLGY9eDtrPWsrZiY0Mjk0OTY3Mjk1O2w9bCtuJjQyOTQ5NjcyOTU7bT1tK3AmNDI5NDk2NzI5NTtxPXErdyY0Mjk0OTY3Mjk1O3I9cit0JjQyOTQ5NjcyOTV9cmV0dXJuKGIoaykrYihsKStiKG0pK2IocSkrYihyKSkudG9Mb3dlckNhc2UoKX19fSkoYyk7dmFyIGliPWMuV2l8fGliLG09bmV3IGliO3dpbmRvdy5ndj1tO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5jaz10aGlzLmFbMTBdO3RoaXMuQXQ9dGhpcy5hWzJdO3RoaXMuRXA9dGhpcy5hWzRdO3RoaXMuYWs9dGhpcy5hWzJdO3RoaXMuT3Q9dGhpcy5hWzZdO3RoaXMuVnA9dGhpcy5hWzJdO3RoaXMuZz10aGlzLmFbNF19Yy5wcj1iO2IucHJvdG90eXBlPXtiazpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuY2s6dGhpcy56dChhKX0senQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLkF0OnRoaXMuRHAoYSl9LERwOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuRXA6dGhpcy4kaihhKX0sJGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLmFrOnRoaXMuTnQoYSl9LE50OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PdDp0aGlzLlVwKGEpfSxVcDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuVnA6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpOwp2YXIgamI9Yy5wcnx8amIsWGM9bmV3IGpiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WGMuYmsoNCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYihhLGIsYyl7dGhpcy5qPWE7YS51Lks/dGhpcy5MYT1hLnUuSygpOnRoaXMuTGE9IiI7dGhpcy5jb250YWluZXI9dGhpcy5qLlFhO3RoaXMucGxheWVyPXRoaXMuai51O3RoaXMucmM9ITE7dGhpcy5qbj0xRTM7dGhpcy5jYT1udWxsO3RoaXMuVD1iO3RoaXMucmE9e307dGhpcy52aWRlbz17fTt0aGlzLmJkPXt9O3RoaXMucGM9IldlcmJ1bmcgLSBbdGltZV0iO2MmJmMuYWRtZXNzYWdlJiYodGhpcy5wYz1jLmFkbWVzc2FnZSwiZnVuY3Rpb24iPT10eXBlb2YgYy5hZG1lc3NhZ2UmJigoYT10aGlzLmoudSkmJnRoaXMuai51LkImJihhPXRoaXMuai51LkIoKSksdGhpcy5wYz1jLmFkbWVzc2FnZShhKSkpOwpjJiYidHJ1ZSI9PVN0cmluZyhjLmFkanVzdEFkVm9sdW1lVG9Db250ZW50UGxheWVyKSYmKHRoaXMuSW09Yy5hZGp1c3RBZFZvbHVtZVRvQ29udGVudFBsYXllcik7dGhpcy5hZD0hMTt0aGlzLk5mPWMmJmMubWF4V3JhcHBlckRlcHRoP3BhcnNlSW50KGMubWF4V3JhcHBlckRlcHRoKToxNTt0aGlzLnM9e307dGhpcy5uYz0hMTt0aGlzLndnPS0xO3RoaXMuY29udHJvbHM9dGhpcy5jYXB0aW9uPXRoaXMuWWI9ITE7dGhpcy5Sbj1mLnBhKDEwKTt0aGlzLlRjPWYucGEoMTApO3RoaXMuUGQ9Zi5wYSgxMCk7dGhpcy5rZz1mLnBhKDEwKTt0aGlzLmNvbmY9e307dGhpcy5SYj10aGlzLkFiPSExO3RoaXMuemQ9bnVsbDt0aGlzLkFjPXRoaXMubGc9dGhpcy5VZj10aGlzLkVjPXRoaXMud3Q9dGhpcy5hYj0hMX1jLlFpPWI7Yi5wcm90b3R5cGU9e2dnOmZ1bmN0aW9uKGEpe3RoaXMuY29uZj1hfSx0YTpmdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbmZbYV07dGhpcy5jb25mW3RoaXMuTGFdJiYKdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSx1ZzpmdW5jdGlvbigpeyJwcmVyb2xsIj09Zi5FYSYmZi50cmFjaygic3RhdHNfaGRfYWN0aXZlIiwiIiwhMCk7dGhpcy5ULmpjP2YudHJhY2soImFkY2FsbCIsIjEiKTpmLnRyYWNrKCJhZGNhbGwiLCIwIik7Zi50cmFjaygic3RhdHNfaGRfYWRfY2FsbCIsIiIsITApO2YuRChsLnVtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSl9LEpkOmZ1bmN0aW9uKGEsYixjKXt0aGlzLmFiPWM7aWYodGhpcy5ULlkpdGhpcy5ULkZuKCksdGhpcy5ULm9hJiZ0aGlzLlQuaXNFbmFibGVkPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx1c2VBZFRhZ1BhcmFtZXRlcjohMCxlbXB0eToicmVzcG9uc2UuZW1wdHkiPT1hLHZwYWlkOnRoaXMuVC5mY30pKTpiPyh0aGlzLnVnKCksbmV3IFModGhpcyxhLHRoaXMuTmYse2ZpcnN0Q2FsbDohMCx2cGFpZDp0aGlzLlQuZmMsCnVzZUFkVGFnUGFyYW1ldGVyOiEwLGtlZXBVUkw6ITB9KSk6dGhpcy5BYSgpO2Vsc2V7dmFyIGU9dGhpcztzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5KZChhLGIsYyl9LDUwKX19LFZkOmZ1bmN0aW9uKGEpe3RoaXMuRWM9ITE7dGhpcy5zPWE7dGhpcy5Qcyh0aGlzLnMpO3RoaXMucGYoYSl9LHBmOmZ1bmN0aW9uKGEpe2EmJihhLm9yaWdpbiYmKGE9YS5vcmlnaW4pLGEucGFyZW50JiZhLnBhcmVudCBpbnN0YW5jZW9mIGImJih0aGlzLmJkPXRoaXMub3AoYSkpLHRoaXMucGYoYS5wYXJlbnQpKX0sb3A6ZnVuY3Rpb24oYSl7dmFyIGI9W10sYz1bXSxlPVtdLGY9W10saD0iIjtpZihhLmFhKXtiPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkltcHJlc3Npb24iKTtlPWEuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkNyZWF0aXZlIik7YS5hYS5nZXRBdHRyaWJ1dGUoImlkIikmJihoPWEuYWEuZ2V0QXR0cmlidXRlKCJpZCIpLGYucHVzaChoKSk7YS5hYS5nZXRBdHRyaWJ1dGUoImFkSUQiKSYmCihoPWEuYWEuZ2V0QXR0cmlidXRlKCJhZElEIiksZi5wdXNoKGgpKTtmb3IodmFyIGs9MDtrPGUubGVuZ3RoO2srKyllW2tdLmdldEF0dHJpYnV0ZSgiaWQiKSYmKGg9ZVtrXS5nZXRBdHRyaWJ1dGUoImlkIiksZi5wdXNoKGgpKSxlW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpJiYoaD1lW2tdLmdldEF0dHJpYnV0ZSgiYWRJRCIpLGYucHVzaChoKSk7Zm9yKGs9MDtrPGIubGVuZ3RoO2srKyljLnB1c2goYS55YihiW2tdKSl9cmV0dXJue2ltcHJlc3Npb25zOmMsYWRJZHM6ZixhZElkOmh9fSxmYTpmdW5jdGlvbihhKXt2YXIgYj0wLGM9InN0YXRzX2hkX2FkX2Vycm9yIjthJiYoYS5lcnJvciYmYS5lcnJvci5kZXRhaWwmJmEuZXJyb3IuZGV0YWlsLmNvZGUmJihiPWEuZXJyb3IuZGV0YWlsLmNvZGUpLGEuQ2MmJmEuQ2MuZXJyb3ImJmEuQ2MuZXJyb3IuY29kZSYmKGI9YS5DYy5lcnJvci5jb2RlKSk7c3dpdGNoKGEuZXJyb3IuY29kZSl7Y2FzZSB4LmdjLmNvZGU6Yj09Qy5qZC5jb2RlPwpmLkQobC5zdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpOihmLktkKCksYj09Qy5CZS5jb2RlJiZmLkQobC5acSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKTtmLkQobC54byx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2VtcHR5IjticmVhaztjYXNlIHguemUuY29kZTpmLkQobC5XdCx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3Zhc3Rsb2FkZmFpbGVkIjticmVhaztjYXNlIHguQ2UuY29kZTpmLnRyYWNrKCJ3cmFwcGVybGltaXQiLCIxMDYiKTtmLkQobC5CdSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO2M9InN0YXRzX2hkX2FkX2Vycm9yX3dyYXBwZXJsaW1pdCI7YnJlYWs7Y2FzZSB4LmtkLmNvZGU6Zi5EKGwuR3UsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTtjPSJzdGF0c19oZF9hZF9lcnJvcl94bWxwYXJzZSI7YnJlYWs7Y2FzZSB4LmhkLmNvZGU6Zi5EKGwuJHEsCnRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksZi50cmFjaygibm9tZWRpYSIsIjEwMiIpLGM9InN0YXRzX2hkX2FkX2Vycm9yX25vbWVkaWEiLHRoaXMuUmJ8fChmLnRyYWNrKCJub21lZGlhX25vZmxhc2giLCIxMDUiKSxjPSJzdGF0c19oZF9hZF9lcnJvcl9ub21lZGlhbm9mbGFzaCIpfSJzdGF0c19oZF9hZF9lcnJvciI9PWMmJmEuZXJyb3ImJmEuZXJyb3Iua2EmJihjKz0iXyIrYS5lcnJvci5rYSk7Zi50cmFjayhjLCIiLCEwKTt0aGlzLnhiKGEpO3RoaXMuQWEoKX0seGI6ZnVuY3Rpb24oYSl7dmFyIGI9OTAwO2EmJmEuZXJyb3ImJmEuZXJyb3IuY29kZSYmKGI9YS5lcnJvci5jb2RlLDkwMTxiJiYoYj05MDApKTtmb3IoYj17IltFUlJPUkNPREVdIjpifTthLnlhLmxlbmd0aDspdHJ5e3ZhciBjPWEueWEucG9wKCk7dGhpcy5JZChjLnVybCxjLnR5cGUsYil9Y2F0Y2goZSl7fX0sUHM6ZnVuY3Rpb24oYSl7dGhpcy5yYT10aGlzLmouRzt2YXIgYj05OTk5O3RoaXMuY29uZi56SW5kZXgmJgooYj10aGlzLmNvbmYuekluZGV4LTEpO3RoaXMucmEuekluZGV4PWI7Yj10aGlzLmouQztiLnp2PSJhdXRvIjt0aGlzLmNvbmZbInZpZGVvLnN0eWxlLnBvc2l0aW9uIl0mJihiLnN0eWxlLnBvc2l0aW9uPXRoaXMuY29uZlsidmlkZW8uc3R5bGUucG9zaXRpb24iXSk7dGhpcy5JbSYmdGhpcy5wbGF5ZXIuSGMoKSYmKGIudm9sdW1lPXRoaXMucGxheWVyLkhjKCkvMTAwKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2Zvcih2YXIgYz0wO2M8YS5NLmxlbmd0aDtjKyspYi5jYW5QbGF5VHlwZShhLk1bY10udHlwZSkmJnRoaXMuQ20oYixhLk1bY10udXJsKyIiLGEuTVtjXS50eXBlKTt0aGlzLnNnKGIpPyh0aGlzLkVtKGIpLGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiaW5uZXJXYXJwcGVyLnN0eWxlIl06YS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLAp0aGlzLmNhPXRoaXMucmEuYXBwZW5kQ2hpbGQoYSksdGhpcy52aWRlbz10aGlzLmNhLmFwcGVuZENoaWxkKGIpKTp0aGlzLnMuTW4oKT8oYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Euc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTphLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdGhpcy5jYT10aGlzLnJhLmFwcGVuZENoaWxkKGEpLHRoaXMudmlkZW89dGhpcy5jYS5hcHBlbmRDaGlsZChiKSx0aGlzLk5zKCkpOnRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5zLm9yaWdpbi4kZSh4LmhkKX0sTnM6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2E9YS5yZXBsYWNlKC8mYW1wOy9nLCImIik7YT1hLnJlcGxhY2UoLyZsdDsvZywiPCIpO2E9YS5yZXBsYWNlKC8mZ3Q7L2csIj4iKTtyZXR1cm4gYT1hLnJlcGxhY2UoLyZxdW90Oy9nLCciJyl9Zi5TZSgpO3RoaXMucyYmdGhpcy5zLm9yaWdpbiYmdGhpcy5zLm9yaWdpbi50ZSYmCmYuRm0odGhpcy5zLm9yaWdpbi50ZSk7Zi4kYSgic2V0VXBWcGFpZCIpO3ZhciBiPXRoaXMuai5DO3RoaXMuai5DPUIucG9wKCk7Yi5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0aGlzLmouQyxiKTt0aGlzLmouVmYoKTt0aGlzLmouY2MoKTtmb3IoYj10aGlzLmouRztiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKTtiLnBhcmVudHx8dGhpcy5qLmNjKCk7dGhpcy5YPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoIndpZHRoIiwiMTAwJSIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzY3JvbGxpbmciLCJubyIpO3RoaXMuWC5zZXRBdHRyaWJ1dGUoImFsbG93IiwiYXV0b3BsYXkiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJkZWxlZ2F0ZXN0aWNreXVzZXJhY3RpdmF0aW9uIiwibWVkaWEiKTt0aGlzLlguc2V0QXR0cmlidXRlKCJzdHlsZSIsImJvcmRlcjogMCBub25lO291dGxpbmU6IG5vbmU7Iik7CnRoaXMuai5HLmFwcGVuZENoaWxkKHRoaXMuWCk7dGhpcy5YLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBiPXRoaXMucy5xcCgpLGM9YSh0aGlzLnMuUC5PcmlnaW5hbEFkUGFyYW1ldGVycyksZz17aG9tYWQ6SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShtLmdldENvbmZpZygpKSksdnBhaWQ6e3VybDpiLnVybCx2aWV3bW9kZToibm9ybWFsIixkZXNpcmVkQml0cmF0ZTpiLmRlc2lyZWRCaXRyYXRlfHxiLmJpdHJhdGV8fDQwMCxhZFBhcmFtZXRlcnM6YyxjcmVhdGl2ZURhdGE6e0FkUGFyYW1ldGVyczpjfSxjb250ZW50cGxheWVyOnt3aWR0aDpwYXJzZUludCh0aGlzLmouRy5zdHlsZS53aWR0aCksaGVpZ2h0OnBhcnNlSW50KHRoaXMuai5HLnN0eWxlLmhlaWdodCl9fX07Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsCiJjb25maWciLGcpfS5iaW5kKHRoaXMpLDIwMCk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksNzAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDFFMyk7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtmLkdhKHRoaXMuWCwiY29uZmlnIixnKX0uYmluZCh0aGlzKSwxMjAwKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLGcpfS5iaW5kKHRoaXMpLDE1MDApO3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zi5HYSh0aGlzLlgsImNvbmZpZyIsZyl9LmJpbmQodGhpcyksMkUzKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe2YuR2EodGhpcy5YLCJjb25maWciLApnKX0uYmluZCh0aGlzKSw1RTMpfS5iaW5kKHRoaXMpO2I9Zi55bigiaHR0cHM6Ly9zMy5hbWF6b25hd3MuY29tL2hvbWFkLWdsb2JhbC1jb25maWdzLnNjaG5lZXZvbm1vcmdlbi5jb20vaWZyYW1lLmh0bWwiLHRoaXMuVCk7dGhpcy5YLnNyYz1iO2YucmQoInZwYWlkZXZlbnQiLGZ1bmN0aW9uKGEpe2EmJmEuZGF0YSYmYS5kYXRhLm5hbWUmJigiQWRJbXByZXNzaW9uIj09YS5kYXRhLm5hbWUmJnRoaXMubnUoKSwiQWRTdGFydGVkIj09YS5kYXRhLm5hbWUmJnRoaXMub3UoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb1N0YXJ0Ij09YS5kYXRhLm5hbWUmJnRoaXMuSGcoKSwiQWRWaWRlb0ZpcnN0UXVhcnRpbGUiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvTWlkcG9pbnQiPT1hLmRhdGEubmFtZSYmdGhpcy5HZygpLCJBZFZpZGVvVGhpcmRRdWFydGlsZSI9PWEuZGF0YS5uYW1lJiZ0aGlzLnJ1KCksIkFkVmlkZW9Db21wbGV0ZSI9PQphLmRhdGEubmFtZSYmdGhpcy5xdSgpLCJBZFN0b3BwZWQiPT1hLmRhdGEubmFtZSYmdGhpcy5wdSgpKX0uYmluZCh0aGlzKSk7Zi5yZCgidnBhaWRjb250aW51ZWNvbnRlbnQiLGZ1bmN0aW9uKCl7dGhpcy5BYSgpfS5iaW5kKHRoaXMpKTtmLnJkKCJ2cGFpZGVycm9zIixmdW5jdGlvbigpe3RoaXMuQWEoKX0uYmluZCh0aGlzKSl9LG91OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiY3JlYXRpdmVWaWV3Iil9LG51OmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiaW1wcmVzc2lvbiIpO2YuJGEoImltcHJlc3Npb24iKX0sSGc6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJzdGFydCIpO2YuJGEoInN0YXJ0Iil9LEdnOmZ1bmN0aW9uKCl7dGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpO2YuJGEoImZpcnN0UXVhcnRpbGUiKX0scnU6ZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJ0aGlyZFF1YXJ0aWxlIik7Zi4kYSgidGhpcmRRdWFydGlsZSIpfSxxdTpmdW5jdGlvbigpe3RoaXMudHJhY2soImNvbXBsZXRlIik7CmYuJGEoImNvbXBsZXRlIil9LHB1OmZ1bmN0aW9uKCl7Zi4kYSgiYWRzdG9wcGVkIik7dGhpcy5BYSgpfSxDbTpmdW5jdGlvbihhLGIpe3ZhciBjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpO3ZhciBlPWIsZj10aGlzLlQ7Zi5vYSYmZi5pc0VuYWJsZWQmJiFmLlpiKCk/KGU9Zi5LYShlKSxiPWUucHJvdG9jb2wrIjovLyIrZS5ob3N0KTpiPWU7Yy5zcmM9Yi5yZXBsYWNlKCJjaGlwLmRlIiwiY3VybG9jLmNvbSIpO2Mub25lcnJvcj10aGlzLmV1LmJpbmQodGhpcyk7YS5hcHBlbmRDaGlsZChjKX0sc2c6ZnVuY3Rpb24oYSl7cmV0dXJuIDA8YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgic291cmNlIikubGVuZ3RofSxFbTpmdW5jdGlvbihhKXthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsCnRoaXMucmUuYmluZCh0aGlzKSk7YS5hZGRFdmVudExpc3RlbmVyKCJlbmRlZCIsdGhpcy5wZS5iaW5kKHRoaXMpKTthLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIix0aGlzLmZkLmJpbmQodGhpcykpfSxYYzpmdW5jdGlvbihhKXthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRzdGFydCIsdGhpcy5GZy5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWRlZG1ldGFkYXRhIix0aGlzLnFlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsdGhpcy5yZS5iaW5kKHRoaXMpKTthLnJlbW92ZUV2ZW50TGlzdGVuZXIoImVuZGVkIix0aGlzLnBlLmJpbmQodGhpcykpO2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHRoaXMuZmQuYmluZCh0aGlzKSl9LEZnOmZ1bmN0aW9uKGEpe3RoaXMudmlkZW8uY29udHJvbHM9ITE7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnFlKGEpfS5iaW5kKHRoaXMpLHRoaXMuam4pfSxxZTpmdW5jdGlvbihhKXt0cnl7aWYoIWYuWGEoKSYmCnRoaXMuVC5BZyYmYS50YXJnZXQmJjU+PWEudGFyZ2V0LmR1cmF0aW9uJiY1PE1hdGguYWJzKHRoaXMucy5kdXJhdGlvbi1hLnRhcmdldC5kdXJhdGlvbikpe3RoaXMuQWJ8fCh0aGlzLkFiPSEwLHRoaXMuWGModGhpcy52aWRlbyksdGhpcy5ULmdhKCJ2aWRlby1ub29wIikpO3JldHVybn19Y2F0Y2goYil7fXRoaXMucmN8fCF0aGlzLnNnKHRoaXMudmlkZW8pfHx0aGlzLkFifHwodGhpcy5yYz0hMCx0aGlzLmR1KCksdGhpcy52aWRlby5jb250cm9scz0hMSx0aGlzLmouY2MoKSx0aGlzLkNnKCksdGhpcy5EZygpLHRoaXMuTWUoKSx0aGlzLmouVmYoKSx0aGlzLnZpZGVvLnBsYXkmJnRoaXMuaGUoKSl9LGhlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuQWMpaWYodGhpcy5jb25mLnByZUFkSWZyYW1lVXJsKXt2YXIgYT10aGlzLmNvbmYucHJlQWRJZnJhbWVVcmw7ImZ1bmN0aW9uIj09dHlwZW9mIGEmJihhPWEoZi5FYSkpO2lmKCJzdHJpbmciPT10eXBlb2YgYSYmYSl7dGhpcy5LYz1bXTtmb3IodmFyIGI9CnRoaXMuai5HLGM9MDtjPGIuY2hpbGRyZW4ubGVuZ3RoO2MrKyl0aGlzLktjLnB1c2goYi5jaGlsZHJlbltjXSksYi5jaGlsZHJlbltjXS5zdHlsZS5kaXNwbGF5PSJub25lIjtjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCl9KTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy5vZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTsKdmFyIGI9IiI7MTxhJiYoYj0iZ3QxIik7NTxhJiYoYj0iZ3Q1Iik7MTA8YSYmKGI9Imd0MTAiKTsyMDxhJiYoYj0iZ3QyMCIpO2YudHJhY2soInN0YXRzX2hkX3ByZUlmcmFtZUNsb3NlZCIsYiwhMCl9fS5iaW5kKHRoaXMpKTtmLnRyYWNrKCJzdGF0c19oZF9wcmVJZnJhbWVPcGVuZWQiLCIiLCEwKX1lbHNlIHRoaXMub2QoKX1lbHNlIHRoaXMub2QoKX0sb2Q6ZnVuY3Rpb24oKXtpZih0aGlzLktjKWZvcih2YXIgYT0wO2E8dGhpcy5LYy5sZW5ndGg7YSsrKXRoaXMuS2NbYV0uc3R5bGUuZGlzcGxheT0iYmxvY2siO2lmKChhPXRoaXMudmlkZW8ucGxheSgpKSYmYVsiY2F0Y2giXSlhWyJjYXRjaCJdKGZ1bmN0aW9uKCl7dGhpcy5BY3x8KHRoaXMuQWEoKSxmLnRyYWNrKCJzdGF0c19oZF9wbGF5UHJvbWlzZUZhaWxlZCIsIiIsITApKX0uYmluZCh0aGlzKSk7WT8od2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLHRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsCnRoaXMuQmIuYmluZCh0aGlzKSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuQmIuYmluZCh0aGlzKSkpOkg9ZnVuY3Rpb24oKXt0aGlzLm5jfHwodGhpcy52aWRlby5sb2FkKCksdGhpcy5oZSgpKX0uYmluZCh0aGlzKTt0aGlzLm5mKCkuaGcodGhpcyl9LHBlOmZ1bmN0aW9uKCl7dGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsImNvbXBsZXRlIiwhMCk7dGhpcy50cmFjaygiY29tcGxldGUiKTtmLkQobC5wbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMucy52Yj8odGhpcy5yYz0hMSx0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuY2EucmVtb3ZlQ2hpbGQodGhpcy52aWRlbyksdGhpcy5yYS5yZW1vdmVDaGlsZCh0aGlzLmNhKSx0aGlzLmNhcHRpb249dGhpcy5jb250cm9scz1udWxsLHRoaXMuYWQ9ITEsdGhpcy5qLnlnKCksdGhpcy5zLm9yaWdpbi5RZCgpKTp0aGlzLkFhKCl9LGV1OmZ1bmN0aW9uKGEpe2EudGFyZ2V0LnBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoYS50YXJnZXQpOwp0aGlzLnZpZGVvLm5ldHdvcmtTdGF0ZSYmdGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLlhjKHRoaXMudmlkZW8pLHRoaXMuRWQoKT90aGlzLmlnKCk6dGhpcy5mZChhKSl9LGZkOmZ1bmN0aW9uKGEpe2EmJmEudGFyZ2V0JiZhLnRhcmdldC5lcnJvciYmYS50YXJnZXQuZXJyb3IuY29kZXx8dGhpcy52aWRlby5uZXR3b3JrU3RhdGU9PXRoaXMudmlkZW8uTkVUV09SS19OT19TT1VSQ0UmJih0aGlzLkVkKCk/d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlJifHx0aGlzLlQuT2UoKX0uYmluZCh0aGlzKSwxRTMpOnRoaXMuVC5PZSgpKTt0aGlzLnMub3JpZ2luLiRlKHguaGQpfSxyZTpmdW5jdGlvbigpe2lmKHRoaXMud3QpdGhpcy5BYSgpO2Vsc2V7dGhpcy5ZYj0hMDt0aGlzLmoudS5qYiYmIXRoaXMubGcmJnRoaXMuai51LmpiKCkmJmYuRChsLnljLHRoaXMuai51LkIoKSx0aGlzLlMoKSk7dmFyIGE9TWF0aC5mbG9vcih0aGlzLnZpZGVvLmN1cnJlbnRUaW1lKTsKdGhpcy5CdChhKTt2YXIgYj0iIjtpZih0aGlzLnMuZ2Upe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMua2cpO2MmJihiPXRoaXMucy5nZS1hLDA8Yj9iPXRoaXMuY29uZi5za2lwYWJsZUJ1dHRvbi5yZXBsYWNlKCJbdGltZV0iLGIpOihiPXRoaXMuY29uZi5za2lwQnV0dG9uLnJlcGxhY2UoIlt0aW1lXSIsYiksdGhpcy5hZHx8KHRoaXMuYWQ9ITAsYy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXt0aGlzLnRyYWNrKCJza2lwIik7Zi5EKGwudm0sdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKTt0aGlzLnMudmI/KHRoaXMucmM9ITEsdGhpcy5YYyh0aGlzLnZpZGVvKSx0aGlzLmNhLnJlbW92ZUNoaWxkKHRoaXMudmlkZW8pLHRoaXMucmEucmVtb3ZlQ2hpbGQodGhpcy5jYSksdGhpcy5jYXB0aW9uPXRoaXMuY29udHJvbHM9bnVsbCx0aGlzLmFkPSExLHRoaXMuai55ZygpLHRoaXMucy5vcmlnaW4uUWQoKSk6dGhpcy5BYSgpfS5iaW5kKHRoaXMpKSkpLApjLmlubmVySFRNTD1iKX10aGlzLmNhcHRpb24mJih0aGlzLmNhcHRpb24uaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKHRoaXMucy5kdXJhdGlvbi1hKSkpO3RoaXMubmM9ITA7dGhpcy52aWRlby5jb250cm9scz0hMX19LGlnOmZ1bmN0aW9uKCl7dGhpcy5SYj0hMDt0aGlzLnJhPXRoaXMuai5HO3RoaXMucmEuaW5uZXJIVE1MPSIiO3ZhciBhPTk5OTk7dGhpcy5jb25mLnpJbmRleCYmKGE9dGhpcy5jb25mLnpJbmRleC0xKTt0aGlzLnJhLnpJbmRleD1hO2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib2JqZWN0Iik7YS5zZXRBdHRyaWJ1dGUoImRhdGEiLCJodHRwczovL3MzLmFtYXpvbmF3cy5jb20vaG9tYWQtZ2xvYmFsLWNvbmZpZ3Muc2NobmVldm9ubW9yZ2VuLmNvbS9ob21hZGpzZmxhc2hkaXNwbGF5LnN3ZiIpO2Euc2V0QXR0cmlidXRlKCJ3aWR0aCIsIjEwMCUiKTthLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IiwiMTAwJSIpO2Euc2V0QXR0cmlidXRlKCJ0eXBlIiwKImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIik7YS5zZXRBdHRyaWJ1dGUoImlkIiwiZGlzcG1haW4iKTthLnNldEF0dHJpYnV0ZSgibmFtZSIsImRpc3BtYWluIik7YS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwidmlzaWJpbGl0eTogdmlzaWJsZSIpO2Euc2V0QXR0cmlidXRlKCJGbGFzaFZhcnMiLCJkYXRhPSIrdGhpcy5pcCgpKTthLmlubmVySFRNTD0nPHBhcmFtIG5hbWU9ImFsbG93c2NyaXB0YWNjZXNzIiB2YWx1ZT0iYWx3YXlzIj48cGFyYW0gbmFtZT0iYWxsb3dGdWxsU2NyZWVuIiB2YWx1ZT0idHJ1ZSI+PHBhcmFtIG5hbWU9ImJnQ29sb3IiIHZhbHVlPSIjMDAwMDAwIj48cGFyYW0gbmFtZT0ib3BhcXVlIiB2YWx1ZT0iZGlyZWN0Ij4nO3RoaXMuai5DPWE7dmFyIGI9dGhpcy5qLkMsYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImlubmVyV2FycHBlci5zdHlsZSJdP2Muc3R5bGU9dGhpcy5jb25mWyJpbm5lcldhcnBwZXIuc3R5bGUiXTpjLnN0eWxlLnBvc2l0aW9uPQoiYWJzb2x1dGUiO3RoaXMuY2E9dGhpcy5yYS5hcHBlbmRDaGlsZChjKTt0aGlzLmouY2MoKTt0aGlzLnZpZGVvPXRoaXMuY2EuYXBwZW5kQ2hpbGQoYik7Yj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtiLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSI7Yi5zdHlsZS50b3A9IjBweCI7Yi5zdHlsZS53aWR0aD10aGlzLnJhLm9mZnNldFdpZHRoKyJweCI7Yi5zdHlsZS5oZWlnaHQ9dGhpcy5yYS5vZmZzZXRIZWlnaHQrInB4IjtiLnN0eWxlLmN1cnNvcj0icG9pbnRlciI7Yi5vbmNsaWNrPXRoaXMuRWcuYmluZCh0aGlzKTt0aGlzLmNhLmFwcGVuZENoaWxkKGIpO3RoaXMuQ2coKTt0aGlzLkRnKCk7dGhpcy56ZD1zZXRJbnRlcnZhbCh0aGlzLkRuLmJpbmQodGhpcyksMTAwKTtyZXR1cm4gYX0saXA6ZnVuY3Rpb24oKXtmb3IodmFyIGE9W10sYj17fSxjPTA7Yzx0aGlzLnMuTS5sZW5ndGg7YysrKXt2YXIgZT1iPXRoaXMucy5NW2NdLGY7Zj1iLnVybDt2YXIgaD10aGlzLlQ7aC5vYSYmCmguaXNFbmFibGVkJiYhaC5aYigpJiYoZj1oLkthKGYpLGY9Zi5wcm90b2NvbCsiOi8vIitmLmhvc3QpO2UudXJsPWY7YS5wdXNoKGIpfXJldHVybiBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoe21lZGlhZmlsZXM6YX0pKX0sRG46ZnVuY3Rpb24oKXt0cnl7dmFyIGE9dGhpcy52aWRlby5nZXRGbGFzaERpc3BsYXlTdGF0dXMoKTt0aGlzLnZpZGVvLnBhdXNlZD1hLnBhdXNlZDthLnRpbWU+PXRoaXMucy5kdXJhdGlvbj8oY2xlYXJJbnRlcnZhbCh0aGlzLnpkKSx0aGlzLnBlKCkpOigwPGEudGltZSYmKHRoaXMudmlkZW8uY3VycmVudFRpbWU9YS50aW1lLHRoaXMucmUoKSksImVycm9yIj09YS5zdGF0dXMmJihjbGVhckludGVydmFsKHRoaXMuemQpLHRoaXMuZmQoKSksdGhpcy52aWRlby5tdXRlZD90aGlzLnZpZGVvLm11dGUoKTp0aGlzLnZpZGVvLnVubXV0ZSgpKX1jYXRjaChiKXt9fSx2ZzpmdW5jdGlvbigpe3RoaXMuVWZ8fCh0aGlzLlVmPSEwLHRoaXMuRWN8fApmLnRyYWNrKCJzdGF0c19oZF9jbG9zZWRCZWZvcmUxc3RRdWFydGlsZSIsIiIsITApKX0sQnQ6ZnVuY3Rpb24oYSl7YT09dGhpcy53Z3x8dGhpcy5BYnx8KDA9PWEmJih0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKSx0aGlzLnRyYWNrKCJpbXByZXNzaW9uIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJlZm9yZXVubG9hZCIsZnVuY3Rpb24oKXt0aGlzLnZnKCl9LmJpbmQodGhpcykpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLGZ1bmN0aW9uKCl7dGhpcy52ZygpfS5iaW5kKHRoaXMpKSx0aGlzLlJiJiZmLnRyYWNrKCJzdGF0c19oZF9hZF9pbXByZXNzaW9uX2ZsYXNoIiwiIiwhMCksdGhpcy5BYnx8Zi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbiIsIiIsITApLGYuWGEoKSYmZi50cmFjaygic3RhdHNfaGRfYWRfaW1wcmVzc2lvbl9tb2JpbGUiLCIiLCEwKSx0aGlzLnRyYWNrKCJjcmVhdGl2ZVZpZXciKSx0aGlzLnRyYWNrKCJzdGFydCIpLApmLkQobC5ybSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpLGYuRChsLndtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy5SYiYmZi50cmFjaygicGxheWVkV2l0aEZsYXNoIiwiMTAzIikpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiYoZi50cmFjaygicXVhcnRpbGUiLCJmaXJzdFF1YXJ0aWxlIiwhMCksdGhpcy5FYz0hMCksdGhpcy50cmFjaygiZmlyc3RRdWFydGlsZSIpLGYuRChsLnFtLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGE9PU1hdGguZmxvb3IodGhpcy5zLmR1cmF0aW9uLzIpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsIm1pZHBvaW50IiwhMCksdGhpcy50cmFjaygibWlkcG9pbnQiKSxmLkQobC50bSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKSxhPT1NYXRoLmZsb29yKDMqdGhpcy5zLmR1cmF0aW9uLzQpJiYodGhpcy5ULlNiJiZmLnRyYWNrKCJxdWFydGlsZSIsCiJ0aGlyZFF1YXJ0aWxlIiwhMCksdGhpcy50cmFjaygidGhpcmRRdWFydGlsZSIpLGYuRChsLnltLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSkpLGYuRChsLnptLHRoaXMucy5QLHRoaXMuai51LkIoKSx0aGlzLlMoKSksdGhpcy53Zz1hKX0sdHJhY2s6ZnVuY3Rpb24oYSxiKXtpZighdGhpcy5BYil7aWYoIm11dGUiPT1hfHwidW5tdXRlIj09YXx8InBhdXNlIj09YXx8InJlc3VtZSI9PWEpe2lmKHRoaXNbYSsiSGFzQmVlblRyYWNrZWQiXSlyZXR1cm47dGhpc1thKyJIYXNCZWVuVHJhY2tlZCJdPSEwfWZvcih2YXIgYz10aGlzLnBwKHRoaXMucy55YSxhKTtjLmxlbmd0aDspdHJ5e3ZhciBlPWMucG9wKCk7ImltcHJlc3Npb24iPT1hJiZ0aGlzLmJkLmltcHJlc3Npb25zJiZmLmpxKGUudXJsLHRoaXMuYmQuaW1wcmVzc2lvbnMpP3RoaXMuSWQoZS51cmwsZS50eXBlLHt9LGZ1bmN0aW9uKGEpe3RyeXt2YXIgYj1hLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVVybCIpOwpmLkQobC5zbSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkse2FkSWQ6dGhpcy5iZC5hZElkLGltcHJlc3Npb25VUkw6Yn0pfWNhdGNoKGMpe319LmJpbmQodGhpcykpOnRoaXMuSWQoZS51cmwsZS50eXBlKX1jYXRjaChoKXt9Ynx8KHRoaXMucy55YT10aGlzLlRuKHRoaXMucy55YSxhKSl9fSxJZDpmdW5jdGlvbihhLGIsYyxlKXthJiYic3RyaW5nIj09dHlwZW9mIGEmJmEubGVuZ3RoJiYoYT10aGlzLlQuVGEoYSksYyYmYS5CbShjKSxlfHwoZT10aGlzLlplKSx0aGlzLlQuRmEoYSxlLHRoaXMuWmUsITEsITApKX0scHA6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEudHlwZT09Yn0pfSxUbjpmdW5jdGlvbihhLGIpe3JldHVybiBhLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS50eXBlIT09Yn0pfSxkdTpmdW5jdGlvbigpe3RoaXMudmlkZW8uc3R5bGUuY3Vyc29yPSJwb2ludGVyIjt0aGlzLnZpZGVvLm9uY2xpY2s9dGhpcy5FZy5iaW5kKHRoaXMpfSwKRWc6ZnVuY3Rpb24oKXtmLkQobC5Mbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMudHJhY2soImNsaWNrdHJhY2tpbmciKTshdGhpcy5FYyYmZi5YYSgpJiZmLnRyYWNrKCJzdGF0c19oZF9jbGlja3Rocm91Z2hCZWZvcmUxc3RRdWFydGlsZSIsZi5YbygpLCEwKTt0cnl7dmFyIGE9d2luZG93Lm9wZW4oIiIsdGhpcy5ULm9hPyJfdG9wIjoiX2JsYW5rIik7YS5kb2N1bWVudC5ib2R5LmlubmVySFRNTD0iPGRpdj48L2Rpdj4iO2EuZG9jdW1lbnQubG9jYXRpb24uaHJlZj10aGlzLnMudmN9Y2F0Y2goYil7d2luZG93Lm9wZW4odGhpcy5zLnZjLHRoaXMuVC5vYT8iX3RvcCI6Il9ibGFuayIpfX0sQ2c6ZnVuY3Rpb24oKXtpZighdGhpcy5jYXB0aW9uKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmNvbmZbImNhcHRpb24uc3R5bGUiXT9hLnN0eWxlPXRoaXMuY29uZlsiY2FwdGlvbi5zdHlsZSJdOihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsCmEuc3R5bGUud2lkdGg9IjEwMCUiLGEuc3R5bGUuYmFja2dyb3VuZD0ibGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjA1KSAwJSxyZ2JhKDAsMCwwLDAuMjUpIDEwMCUpIixhLnN0eWxlLnBhZGRpbmc9IjJweCIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5mb250U2l6ZT0iOXB4IixhLnN0eWxlLmNvbG9yPSIjZmZmZmZmIixhLnN0eWxlLnRleHRBbGlnbj0iY2VudGVyIixhLnN0eWxlLmJvdHRvbT0iMHB4IixhLnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCIpO2EuaW5uZXJIVE1MPXRoaXMucGMucmVwbGFjZSgiW3RpbWVdIixmLmVmKDApKTt0aGlzLmNhcHRpb249dGhpcy5jYS5hcHBlbmRDaGlsZChhKX19LERnOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY29udHJvbHMpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuaWQ9dGhpcy5Sbjt0aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl0/YS5zdHlsZT10aGlzLmNvbmZbImNvbnRyb2xzLnN0eWxlIl06CihhLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsYS5zdHlsZS53aWR0aD0iMTAwJSIsYS5zdHlsZS5mb250RmFtaWx5PSJBcmlhbCwgVmVyZGFuYSIsYS5zdHlsZS5jb2xvcj0iI2ZmZmZmZiIsYS5zdHlsZS50ZXh0QWxpZ249ImNlbnRlciIsYS5zdHlsZS5ib3R0b209IjBweCIpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJwbGF5UGF1c2Uuc3R5bGUiXT9iLnN0eWxlPXRoaXMuY29uZlsicGxheVBhdXNlLnN0eWxlIl06KGIuc2V0QXR0cmlidXRlKCJzdHlsZSIsImZsb2F0OmxlZnQiKSxiLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYi5zdHlsZVsiZmxvYXQiXT0ibGVmdCIsYi5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtiLmlkPXRoaXMuVGM7Yi5pbm5lckhUTUw9CnRoaXMuY29uZi5wYXVzZUJ1dHRvbjtiLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIix0aGlzLnl0LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJtdXRlLnN0eWxlIl0/Yy5zdHlsZT10aGlzLmNvbmZbIm11dGUuc3R5bGUiXTooYy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZmxvYXQ6cmlnaHQiKSxjLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsYy5zdHlsZVsiZmxvYXQiXT0icmlnaHQiLGMuc3R5bGUuY3Vyc29yPSJwb2ludGVyIik7Yy5pZD10aGlzLlBkO2MuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uO2MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLHRoaXMueHQuYmluZCh0aGlzKSk7Yy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLAp0aGlzLlpjLmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5jb25mWyJza2lwLnN0eWxlIl0/ZS5zdHlsZT10aGlzLmNvbmZbInNraXAuc3R5bGUiXTooZS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwicG9zaXRpb246YWJzb2x1dGU7dG9wOi01MHB4O3JpZ2h0OjBweCIpLGUuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLnN0eWxlLnRvcD0iLTUwcHgiLGUuc3R5bGUucmlnaHQ9IjBweCIsZS5zdHlsZS5jdXJzb3I9InBvaW50ZXIiKTtlLmlkPXRoaXMua2c7ZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7YSYmYVswXSYmKGFbMF0uc3R5bGUub3BhY2l0eT0xKX0pO2UuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLGZ1bmN0aW9uKCl7dmFyIGE9ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiZGl2Iik7CmEmJmFbMF0mJihhWzBdLnN0eWxlLm9wYWNpdHk9LjYpfSk7ZS5pbm5lckhUTUw9IiI7YS5hcHBlbmRDaGlsZChiKTt0aGlzLnMuZ2UmJmEuYXBwZW5kQ2hpbGQoZSk7YS5hcHBlbmRDaGlsZChjKTthLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdmVyIix0aGlzLlpjLmJpbmQodGhpcykpO3RoaXMuY2EuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VvdXQiLHRoaXMuV2IuYmluZCh0aGlzKSk7dGhpcy5jb250cm9scz10aGlzLmNhLmFwcGVuZENoaWxkKGEpO3RoaXMuai51LldhJiZ0aGlzLmoudS5XYSgpJiZ0aGlzLlZxKCk7dGhpcy5XYigpfX0sV2I6ZnVuY3Rpb24oKXt0aGlzLmNvbnRyb2xzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxaYzpmdW5jdGlvbigpe3RoaXMuY29udHJvbHMuc3R5bGUuZGlzcGxheT0iYmxvY2sifSx5dDpmdW5jdGlvbigpe3ZhciBhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuVGMpO3RoaXMuai5DLnBhdXNlZD8KKHRoaXMuai5DLnBsYXkoKSxhLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSk6KHRoaXMuai5DLnBhdXNlKCksYS5pbm5lckhUTUw9dGhpcy5jb25mLnBsYXlCdXR0b24sdGhpcy50cmFjaygicGF1c2UiLCEwKSxmLkQobC5IZSx0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpKX0sVGQ6ZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLlRjKTt0aGlzLmouQy5wYXVzZWR8fCh0aGlzLmouQy5wYXVzZSgpLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5wbGF5QnV0dG9uLHRoaXMudHJhY2soInBhdXNlIiwhMCksZi5EKGwuSGUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHNzOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5UYyk7dGhpcy5qLkMucGF1c2VkJiYodGhpcy5qLkMucGxheSgpLAphLmlubmVySFRNTD10aGlzLmNvbmYucGF1c2VCdXR0b24sdGhpcy50cmFjaygicmVzdW1lIiwhMCksZi5EKGwuSWUsdGhpcy5zLlAsdGhpcy5qLnUuQigpLHRoaXMuUygpKSl9LHh0OmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWQ/KHRoaXMuai5DLm11dGVkPSExLGEuaW5uZXJIVE1MPXRoaXMuY29uZi5tdXRlQnV0dG9uLHRoaXMudHJhY2soInVubXV0ZSIsITApLGYudHJhY2soInN0YXRzX2hkX3VubXV0ZWQiLCJ1c2VyIiwhMCkpOih0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLHRoaXMudHJhY2soIm11dGUiLCEwKSxmLnRyYWNrKCJzdGF0c19oZF9tdXRlZCIsInVzZXIiLCEwKSl9LFZxOmZ1bmN0aW9uKCl7dmFyIGE9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5QZCk7dGhpcy5qLkMubXV0ZWR8fCh0aGlzLmouQy5tdXRlZD0hMCxhLmlubmVySFRNTD10aGlzLmNvbmYudW5tdXRlQnV0dG9uLAp0aGlzLnRyYWNrKCJtdXRlIiwhMCksZi50cmFjaygic3RhdHNfaGRfbXV0ZWQiLCJjb250ZW50IiwhMCkpfSxCYjpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIix0aGlzLkJiKTt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsdGhpcy5CYik7dGhpcy5BY3x8dGhpcy5uY3x8KHRoaXMudmlkZW8ubG9hZCgpLHRoaXMuaGUoKSl9LEFhOmZ1bmN0aW9uKCl7dGhpcy5BYz0hMDt0aGlzLmFiJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLmFiKSx0aGlzLmFiPSExKTtpZigoInByZXJvbGwiPT1mLkVhJiZ0aGlzLm5jfHwicG9zdHJvbGwiPT1mLkVhKSYmdGhpcy5jb25mLnBvc3RBZElmcmFtZVVybCl7dmFyIGE9dGhpcy5jb25mLnBvc3RBZElmcmFtZVVybDsiZnVuY3Rpb24iPT10eXBlb2YgYSYmKGE9YShmLkVhKSk7aWYoInN0cmluZyI9PXR5cGVvZiBhJiYKYSl7Zm9yKHZhciBiPXRoaXMuai5HO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpO2IucGFyZW50fHx0aGlzLmouY2MoKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtjLnNldEF0dHJpYnV0ZSgic3JjIixhKTtjLnNldEF0dHJpYnV0ZSgid2lkdGgiLCIxMDAlIik7Yy5zZXRBdHRyaWJ1dGUoImhlaWdodCIsIjEwMCUiKTtjLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJib3JkZXI6IDAgbm9uZTtvdXRsaW5lOiBub25lOyIpO2IuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9KG5ldyBEYXRlKS5nZXRUaW1lKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGZ1bmN0aW9uKGEpe2lmKCJjb250aW51ZSI9PWEuZGF0YSl7dGhpcy54ZCgpO2E9TWF0aC5yb3VuZCgoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSkvMUUzKTt2YXIgYj0iIjsxPGEmJihiPSJndDEiKTs1PGEmJihiPSJndDUiKTsxMDxhJiYoYj0iZ3QxMCIpOzIwPGEmJihiPSJndDIwIik7CmYudHJhY2soInN0YXRzX2hkX3Bvc3RJZnJhbWVDbG9zZWQiLGIsITApfX0uYmluZCh0aGlzKSk7Zi50cmFjaygic3RhdHNfaGRfcG9zdElmcmFtZU9wZW5lZCIsIiIsITApfWVsc2UgdGhpcy54ZCgpfWVsc2UgdGhpcy54ZCgpfSx4ZDpmdW5jdGlvbigpe3RoaXMubGc9ITA7dGhpcy5qLnNmKCk7dGhpcy5qLnRzKCk7dGhpcy5ZYj0hMTtmLkQobC5Rbix0aGlzLnMuUCx0aGlzLmoudS5CKCksdGhpcy5TKCkpO3RoaXMubmYoKS5xcygpfSxuZjpmdW5jdGlvbigpe3ZhciBhPW51bGw7dGhpcy5qJiZ0aGlzLmoudSYmKGE9dGhpcy5qLnUpO3JldHVybiBhfSxFZDpmdW5jdGlvbigpe3ZhciBhPSExO3RyeXtuZXcgQWN0aXZlWE9iamVjdCgiU2hvY2t3YXZlRmxhc2guU2hvY2t3YXZlRmxhc2giKSYmKGE9ITApfWNhdGNoKGIpe25hdmlnYXRvci5taW1lVHlwZXMmJnZvaWQgMCE9bmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXSYmbmF2aWdhdG9yLm1pbWVUeXBlc1siYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giXS5lbmFibGVkUGx1Z2luJiYKKGE9ITApfXJldHVybiBhfSxNZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMudGEoIm1pblZpcyIpO2EmJihmLkVmKHRoaXMudmlkZW8sYSk/dGhpcy5zcygpOnRoaXMuVGQoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuTWUoKX0uYmluZCh0aGlzKSwxMDApKX0sUzpmdW5jdGlvbigpe3ZhciBhPXt9O3RoaXMucyYmKGEuY2xpY2t0aHJvdWdoPXRoaXMucy52YyxhLmR1cmF0aW9uPXRoaXMucy5kdXJhdGlvbixhLmFkUG9kPXRoaXMucy52Yix0aGlzLnZpZGVvJiZ0aGlzLnZpZGVvLmN1cnJlbnRUaW1lJiYoYS5jdXJyZW50VGltZT10aGlzLnZpZGVvLmN1cnJlbnRUaW1lKSk7cmV0dXJuIGF9LFplOmZ1bmN0aW9uKCl7fX19KSh0aGlzKTt2YXIgTz1jLlFpfHxPO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmVvPXRoaXMuYVs2XTt0aGlzLmtyPXRoaXMuYVs5XTt0aGlzLmFqPQp0aGlzLmFbOF07dGhpcy5hcz10aGlzLmFbN107dGhpcy5BbD10aGlzLmFbN107dGhpcy5Kaj10aGlzLmFbN107dGhpcy5QcD10aGlzLmFbNF07dGhpcy5paj10aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLndzPWI7Yi5wcm90b3R5cGU9e2NvOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5lbzp0aGlzLmpyKGEpfSxqcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMua3I6dGhpcy4kaShhKX0sJGk6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmFqOnRoaXMuJHIoYSl9LCRyOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5hczp0aGlzLnpsKGEpfSx6bDpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuQWw6dGhpcy5JaihhKX0sSWo6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLkpqOnRoaXMuT3AoYSl9LE9wOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5QcDp0aGlzLmhqKGEpfSxoajpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuaWo6dGhpcy5mKGEpfSwKZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIga2I9Yy53c3x8a2IsWWM9bmV3IGtiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9WWMuY28oNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5vcHRpb25zPWR8fHt9O2c9Yzt0aGlzLnBhcmVudD1hO3RoaXMudXJsPWI7dGhpcy5KYT1udWxsO3RoaXMuYmE9W107dGhpcy5hYT1udWxsO3RoaXMuTWI9ITE7dGhpcy50ZT0iIjt0aGlzLnNlPSExO2QmJmQuZW1wdHk/dGhpcy5KcSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48VkFTVCB2ZXJzaW9uPSIzLjAiPjwvVkFTVD4nKTp0aGlzLmxvYWQoKX12YXIgYT0wLGcsZD1bXTtjLkhsPWI7Yi5wcm90b3R5cGU9e2xvYWQ6ZnVuY3Rpb24oKXt2YXIgYT1mLldlKCksYjtiPXRoaXMub3B0aW9ucy5rZWVwVVJMPwpuZXcgeih0aGlzLnVybCk6bS5UYShtLlpzKHRoaXMudXJsKSwhMSx0aGlzLm9wdGlvbnMudXNlQWRUYWdQYXJhbWV0ZXIpO3RoaXMub3B0aW9ucy52cGFpZCYmKGEuaXNDaHJvbWV8fGEuaXNGaXJlZm94KSYmKGIuZGF0YS5ob21hZF9jb21wYXRpYmxlX3ZwYWlkPSJ0cnVlIik7bS5GYShiLHRoaXMuSXEuYmluZCh0aGlzKSx0aGlzLkVxLmJpbmQodGhpcykpfSxmZjpmdW5jdGlvbigpe3ZhciBhPTA8dGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpWQVNUQWREYXRhIikubGVuZ3RoP1tdOltdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWQiKSk7IlBsYXlsaXN0Ij09dGhpcy5KYS5maXJzdENoaWxkLm5vZGVOYW1lJiZhLmZvckVhY2goZnVuY3Rpb24oYSxiLGMpe2lmKDE9PWEuY2hpbGROb2Rlcy5sZW5ndGgpaWYoYS5wYXJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PWYuRWEpdHJ5e3ZhciBnPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKCc8QWQgc2VxdWVuY2U9IicrCihiKzEpKyciPjxXcmFwcGVyPjxWQVNUQWRUYWdVUkk+PCFbQ0RBVEFbJythLnRleHRDb250ZW50LnRyaW0oKSsiXV1ceDNlPC9WQVNUQWRUYWdVUkk+PC9XcmFwcGVyPjwvQWQ+IiwidGV4dC94bWwiKTtjW2JdPWcuZmlyc3RDaGlsZH1jYXRjaChlKXtjW2JdPXt9fWVsc2UgYy5zcGxpY2UoYiwxKX0pO3ZhciBiPVtdLnNsaWNlLmNhbGwodGhpcy5KYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZEJyZWFrIikpOzA+PWIubGVuZ3RoJiYoYj1bXS5zbGljZS5jYWxsKHRoaXMuSmEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkQnJlYWsiKSkpO2IuZm9yRWFjaChmdW5jdGlvbihhLGIsYyl7aWYoInN0YXJ0Ij09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInByZXJvbGwiPT1mLkVhfHwiZW5kIj09YS5nZXRBdHRyaWJ1dGUoInRpbWVPZmZzZXQiKSYmInBvc3Ryb2xsIj09Zi5FYSl0cnl7dmFyIGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidm1hcDpBZFRhZ1VSSSIpOzA+PQpnLmxlbmd0aCYmKGc9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQWRUYWdVUkkiKSk7dmFyIGU9KG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoJzxBZCBzZXF1ZW5jZT0iJysoYisxKSsnIj48V3JhcHBlcj48VkFTVEFkVGFnVVJJPjwhW0NEQVRBWycrZ1swXS50ZXh0Q29udGVudC50cmltKCkrIl1dXHgzZTwvVkFTVEFkVGFnVVJJPjwvV3JhcHBlcj48L0FkPiIsInRleHQveG1sIik7Y1tiXT1lLmZpcnN0Q2hpbGR9Y2F0Y2goZCl7fWVsc2UgYy5zcGxpY2UoYiwxKX0pO2E9YS5jb25jYXQoYik7YS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpP051bWJlcihhLmdldEF0dHJpYnV0ZSgic2VxdWVuY2UiKSk8TnVtYmVyKGIuZ2V0QXR0cmlidXRlKCJzZXF1ZW5jZSIpKT8tMToxOi0xfSk7cmV0dXJuIGF9LElxOmZ1bmN0aW9uKGEpe3RoaXMuanMoYSk7dHJ5e3RoaXMuSmE9YS5yZXNwb25zZVhNTCx0aGlzLkphfHwodGhpcy5KYT0KKG5ldyB3aW5kb3cuRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoYS5yZXNwb25zZVRleHQsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sSnE6ZnVuY3Rpb24oYSl7dHJ5e3RoaXMuSmF8fCh0aGlzLkphPShuZXcgd2luZG93LkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGEsInRleHQveG1sIikpfWNhdGNoKGIpe3RoaXMuZmEodGhpcy5CYSh4LmtkKSl9dGhpcy5iYT10aGlzLmZmKCk7dGhpcy5NYj10aGlzLnJnKCk7dGhpcy5iYS5sZW5ndGg/dGhpcy5SYygpOnRoaXMuZmEodGhpcy5CYSh4LmdjLHtlcnJvcjp0aGlzLnNlP0MuamQ6Qy5BZX0pKX0sRXE6ZnVuY3Rpb24oKXt0aGlzLmZhKHRoaXMuQmEoeC56ZSx7ZGVwdGg6YX0pKX0sUmM6ZnVuY3Rpb24oKXt0aGlzLmFhPQp0aGlzLmJhLnNoaWZ0KCk7dGhpcy5wcSgpP3RoaXMucHQoKT8oYSsrLG5ldyBiKHRoaXMsdGhpcy5xZigpLGcpKTp0aGlzLmZhKHRoaXMuQmEoeC5DZSkpOihhPTAsdGhpcy5TdCgpJiZ0aGlzLlZkKHRoaXMuU24oKSkpfSxRZDpmdW5jdGlvbigpe3RoaXMuTWI/KHRoaXMuTWI9MTx0aGlzLmJhLmxlbmd0aCx0aGlzLmJhLmxlbmd0aCYmdGhpcy5SYygpKTp0aGlzLnBhcmVudC5RZCgpfSxTdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm10KCk/dGhpcy5sdCgpPyEwOigtMSE9dGhpcy5VYigpP3RoaXMuZmEodGhpcy5CYSh4LnZlKSk6dGhpcy5mYSh0aGlzLkJhKHguTGgpKSwhMSk6KHRoaXMuZmEodGhpcy5CYSh4LmdjLEMuQmUpKSwhMSl9LFZkOmZ1bmN0aW9uKGEpe2EueWE9YS55YS5jb25jYXQodGhpcy5NZCgpKTthLnZiPWEudmI/YS52Yjp0aGlzLk1iO3RoaXMucGFyZW50LlZkKGEpfSxTbjpmdW5jdGlvbigpe3ZhciBhPW5ldyBsYjthLmR1cmF0aW9uPXRoaXMuVWIoKTthLk09dGhpcy5sZigpOwphLnZjPXRoaXMuWW8oKTthLm9yaWdpbj10aGlzO2EuUD10aGlzLlZvKCk7YS5nZT10aGlzLm5wKGEuZHVyYXRpb24pO3JldHVybiBhfSxmYTpmdW5jdGlvbihiKXt0aGlzLmFhJiYoYi55YT1iLmVycm9yLmNvZGUhPXgudmUuY29kZT9iLnlhLmNvbmNhdCh0aGlzLiRvKCkpOmIueWEuY29uY2F0KHRoaXMuZ3AoKSkpO3RoaXMuYmEubGVuZ3RoPyh0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQueGImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLnBhcmVudC54YiYmdGhpcy5wYXJlbnQueGIoYiksYT0wLHRoaXMuUmMoKSk6KHRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5mYSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMucGFyZW50LmZhJiZ0aGlzLnBhcmVudC5mYShiKSxhPTApfSx4YjpmdW5jdGlvbihhKXt0aGlzLnBhcmVudC54YihhKX0sJGU6ZnVuY3Rpb24oYSxiKXt0aGlzLmZhKHRoaXMuQmEoYSxiKSl9LEJhOmZ1bmN0aW9uKGEsYil7dmFyIGM9bmV3IG1iKGEsYik7Yy5vcmlnaW49dGhpczsKcmV0dXJuIGN9LHB0OmZ1bmN0aW9uKCl7cmV0dXJuIGE8Z30sbXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMDx0aGlzLmxmKCkubGVuZ3RofSxsdDpmdW5jdGlvbigpe3JldHVybiAxPHRoaXMuVWIoKX0scmc6ZnVuY3Rpb24oKXtyZXR1cm4gMTx0aGlzLmJhLmZpbHRlcihmdW5jdGlvbihhKXt2YXIgYj0hMTthLmdldEF0dHJpYnV0ZSYmKGI9MDxOdW1iZXIoYS5nZXRBdHRyaWJ1dGUoInNlcXVlbmNlIikpKTtyZXR1cm4gYn0pLmxlbmd0aH0sanM6ZnVuY3Rpb24oYSl7dHJ5e2QucHVzaCh0aGlzLnRlPWEuZ2V0UmVzcG9uc2VIZWFkZXIoIlgtSG9tYWQtVXJsIikpfWNhdGNoKGIpe310cnl7dGhpcy5zZT1hLmdldFJlc3BvbnNlSGVhZGVyJiZhLmdldFJlc3BvbnNlSGVhZGVyKCJYLUhvbWFkLVZwYWlkLUlnbm9yZWQiKX1jYXRjaChjKXt9fSxwcTpmdW5jdGlvbigpe3JldHVybiAwPHRoaXMucWYoKS5sZW5ndGh9LHFmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuanAodGhpcy5hYSwiVkFTVEFkVGFnVVJJIil9LApNZDpmdW5jdGlvbigpe2Zvcih2YXIgYT1bIkltcHJlc3Npb24iLCJUcmFja2luZyIsIkNsaWNrVHJhY2tpbmciLCJFcnJvciJdLGI9W10sYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZz1hW2NdO1tdLnNsaWNlLmNhbGwodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZShnKSkuZm9yRWFjaChmdW5jdGlvbihhKXtpZihhKXt2YXIgYz1hLmdldEF0dHJpYnV0ZSgiZXZlbnQiKXx8Zy50b0xvd2VyQ2FzZSgpO2IucHVzaCh7dHlwZTpjLHVybDp0aGlzLnliKGEpfSl9fS5iaW5kKHRoaXMpKX1yZXR1cm4gYn0sZ3A6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImltcHJlc3Npb24iPT1hLnR5cGV9KX0sJG86ZnVuY3Rpb24oKXt2YXIgYT10aGlzLk1kKCk7cmV0dXJuIGE9YS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuImVycm9yIj09YS50eXBlfSl9LFlvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueWIodGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiQ2xpY2tUaHJvdWdoIilbMF0pfSwKbGY6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTWVkaWFGaWxlIiksYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKHtpZDphW2NdLmdldEF0dHJpYnV0ZSgiaWQiKSx0eXBlOmFbY10uZ2V0QXR0cmlidXRlKCJ0eXBlIiksc2M6YVtjXS5nZXRBdHRyaWJ1dGUoImJpdHJhdGUiKSx3aWR0aDphW2NdLmdldEF0dHJpYnV0ZSgid2lkdGgiKSxoZWlnaHQ6YVtjXS5nZXRBdHRyaWJ1dGUoImhlaWdodCIpLGV2OmFbY10uZ2V0QXR0cmlidXRlKCJkZWxpdmVyeSIpLHVybDp0aGlzLnliKGFbY10pfSk7dHJ5e3ZhciBnPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xIT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIE1hdGguYWJzKDcwMC1hLnNjKS1NYXRoLmFicyg3MDAtYi5zYyl9KSxkPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybi0xPT1hLnR5cGUuaW5kZXhPZigibXA0Iil9KS5zb3J0KGZ1bmN0aW9uKGEsCmIpe3JldHVybiBNYXRoLmFicyg3MDAtYS5zYyktTWF0aC5hYnMoNzAwLWIuc2MpfSksYj1nLmNvbmNhdChkKX1jYXRjaChmKXt9cmV0dXJuIGJ9LFZvOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYWRQYXJhbWV0ZXJzIik7YSYmMCE9YS5sZW5ndGh8fChhPXRoaXMuYWEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIkFkUGFyYW1ldGVycyIpKTtmb3IodmFyIGI9IiIsYz0hMSxnPVtdLGI9ITEsZD0iIixmPVtdLGg9IiIsaD0wO2g8YS5sZW5ndGg7aCsrKXtkPWI9dGhpcy5yZihhW2hdKTt0cnl7Yz1KU09OLnBhcnNlKGIpfWNhdGNoKGspe2M9Yn1nLnB1c2goYyk7Zi5wdXNoKGQpfTE8YS5sZW5ndGg/KGI9ZyxoPWQpOihiPWMsaD1mKTtyZXR1cm57QWRQYXJhbWV0ZXJzOmIsT3JpZ2luYWxBZFBhcmFtZXRlcnM6aC50b1N0cmluZygpfX0sVWI6ZnVuY3Rpb24oKXt2YXIgYTt0cnl7cmV0dXJuIGE9dGhpcy55Yih0aGlzLmFhLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJEdXJhdGlvbiIpWzBdKSwKYT1hLnNwbGl0KCI6IiksYT0zNjAwKithWzBdKzYwKithWzFdKyArYVsyXSxpc05hTihhKT8tMTphfWNhdGNoKGIpe3JldHVybi0xfX0sbnA6ZnVuY3Rpb24oYSl7dmFyIGI9ITEsYz0hMSxnPSExO2lmKGsmJmsuc2tpcGFibGUpdHJ5e2M9dGhpcy5hYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiTGluZWFyIilbMF0sZz1jLmdldEF0dHJpYnV0ZSgic2tpcG9mZnNldCIpLGI9Zi5WcyhnLGEpLDA+YiYmKGI9ITEpfWNhdGNoKGQpe2I9ITF9cmV0dXJuIGJ9LGpwOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEmJiJvYmplY3QiPT10eXBlb2YgYSYmYS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKS5sZW5ndGg/dGhpcy55YihhLmdldEVsZW1lbnRzQnlUYWdOYW1lKGIpWzBdKToiIn0scnA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEuY2hpbGROb2RlcyYmYS5jaGlsZE5vZGVzWzBdP2EuY2hpbGROb2Rlc1swXS5ub2RlVmFsdWU6IiJ9LHliOmZ1bmN0aW9uKGEpe3JldHVybiBhP3RoaXMucmYoYSk6IiJ9LApyZjpmdW5jdGlvbihhKXt2YXIgYj10aGlzLnJwKGEpO2ImJihiPWIudHJpbSgpKTshYiYmYS50ZXh0Q29udGVudCYmKGI9YS50ZXh0Q29udGVudCxiPWIudHJpbSgpKTtyZXR1cm4gYn19fSkoYyk7dmFyIFM9Yy5IbHx8UztjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5kbT10aGlzLmFbMTBdO3RoaXMudm49dGhpcy5hWzldO3RoaXMuZWo9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbMl19Yy5RZz1iO2IucHJvdG90eXBlPXtjbTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuZG06dGhpcy51bihhKX0sdW46ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLnZuOnRoaXMuZGooYSl9LGRqOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5lajp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIG5iPWMuUWd8fG5iLFpjPW5ldyBuYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1aYy5jbSg0KTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuZHVyYXRpb249MDt0aGlzLnlhPVtdO3RoaXMuTT1bXTt0aGlzLnZjPSIiO3RoaXMuUD10aGlzLnZiPSExO3RoaXMub3JpZ2luPW51bGx9Yy5Naz1iO2IucHJvdG90eXBlPXtNbjpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPSEwO3JldHVybiBhfSxxcDpmdW5jdGlvbigpe2Zvcih2YXIgYT0hMSxiPTA7Yjx0aGlzLk0ubGVuZ3RoO2IrKylpZigwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigiYXBwbGljYXRpb24veC1lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpfHwKMDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC9lY21hc2NyaXB0Iil8fDA8PXRoaXMuTVtiXS50eXBlLmluZGV4T2YoInRleHQvamF2YXNjcmlwdCIpfHwwPD10aGlzLk1bYl0udHlwZS5pbmRleE9mKCJ0ZXh0L2pzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWVjbWFzY3JpcHQiKXx8MDw9dGhpcy5NW2JdLnR5cGUuaW5kZXhPZigidGV4dC94LWphdmFzY3JpcHQiKSlhPXRoaXMuTVtiXTtyZXR1cm4gYX19fSkoYyk7dmFyIGxiPWMuTWt8fGxiO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmduPXRoaXMuYVs2XTt0aGlzLnVwPXRoaXMuYVs4XTt0aGlzLmdoPXRoaXMuYVs1XTt0aGlzLmdqPXRoaXMuYVs0XTt0aGlzLmloPXRoaXMuYVs0XTt0aGlzLnlqPXRoaXMuYVszXTt0aGlzLnRpPXRoaXMuYVs5XTt0aGlzLlRwPXRoaXMuYVs2XTt0aGlzLkdsPQp0aGlzLmFbNV07dGhpcy5nPXRoaXMuYVsxXX1jLm1pPWI7Yi5wcm90b3R5cGU9e2ZuOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5nbjp0aGlzLnRwKGEpfSx0cDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMudXA6dGhpcy5maChhKX0sZmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLmdoOnRoaXMuZmooYSl9LGZqOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5najp0aGlzLmhoKGEpfSxoaDpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuaWg6dGhpcy54aihhKX0seGo6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLnlqOnRoaXMuc2koYSl9LHNpOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy50aTp0aGlzLlNwKGEpfSxTcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuVHA6dGhpcy5GbChhKX0sRmw6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLkdsOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuZzphfX19KShjKTsKdmFyIG9iPWMubWl8fG9iLCRjPW5ldyBvYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PSRjLmZuKDQpO3ZhciB4PXtrZDp7dHlwZToiZXJyb3IiLGNvZGU6MTAwLG1lc3NhZ2U6IlhNTCBwYXJzaW5nIGVycm9yIixrYToiWE1MX1BBUlNFX0VSUk9SIn0sTGg6e3R5cGU6ImVycm9yIixjb2RlOjIwMixtZXNzYWdlOiJWaWRlbyBwbGF5ZXIgZXhwZWN0aW5nIGRpZmZlcmVudCBkdXJhdGlvbi4iLGthOiJEVVJBVElPTl9FUlJPUiJ9LGdjOnt0eXBlOiJlcnJvciIsY29kZTozMDMsbWVzc2FnZToiTm8gYWRzIFZBU1QgcmVzcG9uc2UgYWZ0ZXIgb25lIG9yIG1vcmUgV3JhcHBlcnMuIEFsc28gaW5jbHVkZXMgbnVtYmVyIG9mIGVtcHR5IFZBU1QgcmVzcG9uc2VzIGZyb20gZmFsbGJhY2suIixrYToiRU1QVFlfVkFTVCJ9LENlOnt0eXBlOiJjcml0aWNhbCIsY29kZTozMDIsCm1lc3NhZ2U6IldyYXBwZXIgbGltaXQgcmVhY2hlZCwgYXMgZGVmaW5lZCBieSB0aGUgdmlkZW8gcGxheWVyLiBUb28gbWFueSBXcmFwcGVyIHJlc3BvbnNlcyBoYXZlIGJlZW4gcmVjZWl2ZWQgd2l0aCBubyBJbkxpbmUgcmVzcG9uc2UuIixrYToiV1JBUFBFUl9MSU1JVF9SRUFDSEVEIn0semU6e3R5cGU6ImVycm9yIixjb2RlOjMwMSxtZXNzYWdlOiJUaW1lb3V0IG9mIFZBU1QgVVJJIHByb3ZpZGVkIGluIFdyYXBwZXIgZWxlbWVudCwgb3Igb2YgVkFTVCBVUkkgcHJvdmlkZWQgaW4gYSBzdWJzZXF1ZW50IFdyYXBwZXIgZWxlbWVudC4gSW5jbHVkZXMgcmVxdWVzdCBlcnJvcnMgc3VjaCBhcyBpbnZhbGlkIFVSSSwgdW5yZWFjaGFibGUgb3IgcmVxdWVzdCB0aW1lb3V0IGZvciBVUkksIGFuZCBzZWN1cml0eSBvciBvdGhlciBleGNlcHRpb25zIHJlbGF0ZWQgdG8gcmVxdWVzdGluZyBhIFZBU1QgVVJJLiIsa2E6IkxPQURfRVJST1IifSxoZDp7dHlwZToiZXJyb3IiLGNvZGU6NDAzLAptZXNzYWdlOiJDb3VsZCBub3QgZmluZCBNZWRpYUZpbGUgdGhhdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyB2aWRlbyBwbGF5ZXIsIGJhc2VkIG9uIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBNZWRpYUZpbGUgZWxlbWVudC4iLGthOiJOT19QTEFZQUJMRV9TT1VSQ0VTIn0sVXU6e3R5cGU6ImVycm9yIixjb2RlOjQwNSxtZXNzYWdlOiJQcm9ibGVtIGRpc3BsYXlpbmcgTWVkaWFGaWxlLiIsa2E6Ik1FRElBRklMRV9FUlJPUiJ9LHZlOnt0eXBlOiJlcnJvciIsY29kZTo5OTksbWVzc2FnZToiMSBzZWMgZHVtbXkgYWQiLGthOiJEVU1NWV9BRCJ9fSxDPXtBZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMSxtZXNzYWdlOiJubyBhZHMiLGthOiJOT19BRFMifSxCZTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMixtZXNzYWdlOiJubyBtZWRpYWZpbGVzIHNwZWNpZmllZCIsa2E6Ik5PX01FRElBRklMRVMifSxXdTp7dHlwZToiZXJyb3IiLGNvZGU6MzAzMyxtZXNzYWdlOiJubyBwbGF5YWJsZSBtZWRpYWZpbGVzIiwKa2E6Ik5PX1BMQVlBQkxFX01FRElBRklMRVMifSxqZDp7dHlwZToiZXJyb3IiLGNvZGU6MzAzNCxtZXNzYWdlOiJ2cGFpZCBpZ25vcmVkIixrYToiVlBBSURfSUdOT1JFRCJ9fTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5WbT10aGlzLmFbM107dGhpcy5RdT10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVs1XX1jLlpnPWI7Yi5wcm90b3R5cGU9e1VtOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5WbTp0aGlzLlB1KGEpfSxQdTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlF1OnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuZzphfX19KShjKTt2YXIgcGI9Yy5aZ3x8cGIsYWQ9bmV3IHBiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9CmFkLlVtKDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKGEsYil7dGhpcy5lcnJvcj1hO3RoaXMuQ2M9Yjt0aGlzLnlhPVtdO3RoaXMub3JpZ2luPW51bGx9Yy53aT1iO2IucHJvdG90eXBlPXt9fSkoYyk7dmFyIG1iPWMud2l8fG1iO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLldrPXRoaXMuYVs5XTt0aGlzLmc9dGhpcy5hWzhdfWMuJGs9YjtiLnByb3RvdHlwZT17Vms6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLldrOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgcWI9Yy4ka3x8cWIsYmQ9bmV3IHFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9YmQuVmsoNCk7KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoYSwKYil7dGhpcy5jb25mPWJ8fHt9O3RoaXMudT1hO3RoaXMuUWE9YS5nZigpO3RoaXMuRz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLkcuaWQ9Zi5wYSgxMCk7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpO3RoaXMuUmE9e307dGhpcy5JZj0hMTt0aGlzLnZmPVtdfWMuUGg9YjtiLnByb3RvdHlwZT17bHA6ZnVuY3Rpb24oYSl7dmFyIGI9e30sYz0hMSxlPTAsYj0wLGY9e307YS5nZXRCb3VuZGluZ0NsaWVudFJlY3QmJihiPWEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksYz0iZml4ZWQiLGU9Yi5sZWZ0LGI9Yi50b3ApO2Y9e3g6ZSx5OmJ9O2YucG9zaXRpb249YztyZXR1cm4gZn0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oYSl7aWYodGhpcy5jb25mLnVzZUJvdW5kaW5nQ2xpZW50UmVjdClyZXR1cm4gdGhpcy5scChhKTsKZm9yKHZhciBiPTAsYz0wLGU9ITEsZj10aGlzLmhxKGEpLGg9e307YTspYis9YS5vZmZzZXRMZWZ0K2EuY2xpZW50TGVmdCxjKz1hLm9mZnNldFRvcCthLmNsaWVudFRvcCxhPWEub2Zmc2V0UGFyZW50O2YmJihhPXZvaWQgMCE9PXdpbmRvdy5wYWdlWU9mZnNldD93aW5kb3cucGFnZVlPZmZzZXQ6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8ZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlfHxkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3AsYis9dm9pZCAwIT09d2luZG93LnBhZ2VYT2Zmc2V0P3dpbmRvdy5wYWdlWE9mZnNldDooZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGV8fGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQsYys9YSx0aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkJiYoZT10aGlzLmNvbmYucG9zaXRpb25JZkZpeGVkKSk7aD17eDpiLHk6Y307ZSYmKGgucG9zaXRpb249ZSk7cmV0dXJuIGh9LCRzOmZ1bmN0aW9uKCl7dGhpcy5JZj0hMH0sCnlnOmZ1bmN0aW9uKCl7dGhpcy5DPUIucG9wKCk7dGhpcy5DfHwoZi50cmFjaygic3RhdHNfaGRfbm9WaWRlb1RhZ0xlZnQiLCIiLCEwKSx0aGlzLkM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmlkZW8iKSx0aGlzLkMuaWQ9ImFkWGRpc3BsYXkiLHRoaXMuQy5zdHlsZS5kaXNwbGF5PSJibG9jayIpfSxWZjpmdW5jdGlvbigpe3RoaXMudS5wYXVzZSgpO2YuRChsLnljLHRoaXMudS5CKCkpfSx0czpmdW5jdGlvbigpe3RoaXMuSWZ8fCh0aGlzLnUucGxheSgpLGYuRChsLnpjLHRoaXMudS5CKCkpKX0sY2M6ZnVuY3Rpb24oKXt2YXIgYT0yMTQ3NDgzNjQ3O3RoaXMuY29uZi56SW5kZXgmJihhPXRoaXMuY29uZi56SW5kZXgpO3RoaXMudS5wYXVzZSgpO3RoaXMuRy5zdHlsZS56SW5kZXg9YTt0aGlzLkcuc3R5bGUubWFyZ2luTGVmdD0iYXV0byI7dGhpcy5HLnN0eWxlLm1hcmdpblJpZ2h0PSJhdXRvIjt0aGlzLkcuc3R5bGUuYmFja2dyb3VuZENvbG9yPSIjMDAwMDAwIjt0aGlzLkcuc3R5bGUuYm94U2l6aW5nPQp0aGlzLlFhLnN0eWxlLmJveFNpemluZzt0aGlzLkcuc3R5bGUud2lkdGg9dGhpcy5RYS5vZmZzZXRXaWR0aCswKyJweCI7dGhpcy5HLnN0eWxlLmhlaWdodD10aGlzLlFhLm9mZnNldEhlaWdodCswKyJweCI7dGhpcy5DLnN0eWxlLndpZHRoPXRoaXMuUWEub2Zmc2V0V2lkdGgrMCsicHgiO3RoaXMuQy5zdHlsZS5oZWlnaHQ9dGhpcy5RYS5vZmZzZXRIZWlnaHQrMCsicHgiO3RoaXMuZ2V0UG9zaXRpb24odGhpcy5RYSk7dGhpcy51LkRiJiZ0aGlzLnUuRGIoKT90aGlzLnUuZ2YoKS5hcHBlbmRDaGlsZCh0aGlzLkcpOmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5HKTt3aW5kb3cuc2V0VGltZW91dCh0aGlzLnVmLmJpbmQodGhpcyksMTApfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpe3RoaXMudS5leGl0RnVsbHNjcmVlbigpfSxocTpmdW5jdGlvbihhKXtmb3IodmFyIGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUsYz0hMTthOyl7aWYoYS5zdHlsZSYmKCJmaXhlZCI9PWEuc3R5bGUucG9zaXRpb258fApiJiYiZml4ZWQiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5wb3NpdGlvbikpe2M9ITA7YnJlYWt9YT1hLnBhcmVudE5vZGV9cmV0dXJuIGN9LFpvOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oYSk7Yi5wb3NpdGlvbj9iLnBvc2l0aW9uPWIucG9zaXRpb246Yi5wb3NpdGlvbj0iYWJzb2x1dGUiO2Iud2lkdGg9YS5vZmZzZXRXaWR0aDtiLmhlaWdodD1hLm9mZnNldEhlaWdodDtyZXR1cm4gYn0sdWY6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5abyh0aGlzLlFhKTtpZihiLnghPXRoaXMuUmEueHx8Yi55IT10aGlzLlJhLnl8fGIucG9zaXRpb24hPXRoaXMuUmEucG9zaXRpb258fGIud2lkdGghPXRoaXMuUmEud2lkdGh8fGIuaGVpZ2h0IT10aGlzLlJhLmhlaWdodHx8YSl7aWYoMDx0aGlzLlJhLndpZHRoJiYwPHRoaXMuUmEuaGVpZ2h0JiYwPT1iLndpZHRoJiYwPT1iLmhlaWdodCl7dGhpcy5zZigpO3JldHVybn10aGlzLlJhPWI7dGhpcy51LkRiKCk/KHRoaXMuRy5zdHlsZS5sZWZ0PQoiMHB4Iix0aGlzLkcuc3R5bGUudG9wPSIwcHgiKToodGhpcy5HLnN0eWxlLmxlZnQ9Yi54KyJweCIsdGhpcy5HLnN0eWxlLnRvcD1iLnkrInB4Iik7dGhpcy5HLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkcuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7dGhpcy5HLnN0eWxlLnBvc2l0aW9uPWIucG9zaXRpb247dGhpcy5DLnN0eWxlLndpZHRoPWIud2lkdGgrInB4Ijt0aGlzLkMuc3R5bGUuaGVpZ2h0PWIuaGVpZ2h0KyJweCI7Zm9yKGE9MDthPHRoaXMudmYubGVuZ3RoO2ErKyl0aGlzLnZmW2FdKHt3aWR0aDpiLndpZHRoLGhlaWdodDpiLmhlaWdodH0pfXdpbmRvdy5zZXRUaW1lb3V0KHRoaXMudWYuYmluZCh0aGlzKSwxMCl9LHNmOmZ1bmN0aW9uKCl7dGhpcy5HJiZ0aGlzLkcucGFyZW50Tm9kZSYmdGhpcy5HLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQmJnRoaXMuRy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuRyk7dGhpcy5DJiZ0aGlzLkMucGF1c2UmJnRoaXMuQy5wYXVzZSgpfX19KShjKTsKZm9yKHZhciBOPWMuUGh8fE4sQj1bXSxyYj0wOzEwMD5yYjtyYisrKXt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2aWRlbyIpO0wuc3R5bGUuZGlzcGxheT0iYmxvY2siO0wuaWQ9Zi5wYSgxMCk7TC5jb250cm9scz0hMDtCLnB1c2goTCl9dmFyIEg9ITEsWT0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLEEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixBKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLEEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLmNuPXRoaXMuYVsxMF07dGhpcy51az10aGlzLmFbNF07dGhpcy5PbD10aGlzLmFbNV07dGhpcy5FaD10aGlzLmFbNl07dGhpcy5vaz10aGlzLmFbNV07dGhpcy5JaD10aGlzLmFbOV07dGhpcy5pcj10aGlzLmFbN107CnRoaXMuaGw9dGhpcy5hWzZdO3RoaXMuZz10aGlzLmFbN119Yy5NdD1iO2IucHJvdG90eXBlPXtibjpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuY246dGhpcy50ayhhKX0sdGs6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnVrOnRoaXMuTmwoYSl9LE5sOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuT2w6dGhpcy5EaChhKX0sRGg6ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLkVoOnRoaXMubmsoYSl9LG5rOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5vazp0aGlzLkhoKGEpfSxIaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuSWg6dGhpcy5ocihhKX0saHI6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmlyOnRoaXMuZ2woYSl9LGdsOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5obDp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyIHNiPWMuTXR8fHNiLGNkPW5ldyBzYigxLG5ldyBEYXRlLAoyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1jZC5ibig0KTsoZnVuY3Rpb24oYyl7Yy53az1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLmVsZW1lbnRJZCxhPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIpO2F8fChiPXRoaXMuZ2V0UmF3UGxheWVyKCkuZ2V0RWxlbWVudElkKCksYT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChiKSk7dGhpcy5PKGEpO3RoaXMuZmUoYik7dGhpcy5YZSgpfSxmZTpmdW5jdGlvbihiKXt0aGlzLmlkfHwodGhpcy5pZD1iKX0sWGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLkNhKCksYT10aGlzLnZpZGVvVGFnO2F8fCgoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pLGE/dGhpcy5SKGEpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuWGUoKX0uYmluZCh0aGlzKSwxMDApKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBhdXNlKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnBsYXkoKX0samI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuaXNQbGF5aW5nJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5pc1BsYXlpbmcmJmIuaXNQbGF5aW5nKCkmJnRoaXMucGF1c2UoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnBhcmFtZXRlcnMmJiExPT09Yi5wYXJhbWV0ZXJzLmF1dG9wbGF5PyExOiEwfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIk9veWFsYSJ9LEI6ZnVuY3Rpb24oKXt2YXIgYj17fSxhPXRoaXMudmlkZW9UYWcsYz10aGlzLkNhKCk7aWYoYi52aWRlb1RhZz1hKWIudmlkZW9UYWdJZD1hLmlkO2lmKGIuY29udGFpbmVyPWMpYi5jb250YWluZXJJZD0KYy5pZDtiLnBsYXllcj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBifX0pfSkoYyk7dmFyIHRiPWMud2t8fHRiOyhmdW5jdGlvbihjKXtjLnZrPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj1aKCk7dGhpcy51Yj10aGlzLnVifHwhMTt0aGlzLkdlPXRoaXMuSmU9dGhpcy56Zj10aGlzLmlhPXRoaXMubWU9ITE7dmFyIGE9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfRVJST1IsImV4YW1wbGUiLGZ1bmN0aW9uKGEsYil7dGhpcy5IbyhhLGIpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5BRFNfUExBWUVELCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMubWU9ITA7dGhpcy56ZiYmdGhpcy5SZSgpfS5iaW5kKHRoaXMpKTthLm1iLnN1YnNjcmliZShiLkVWRU5UUy5QTEFZSU5HLCJleGFtcGxlIixmdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZXRQbGF5ZXIoKS5nYjthJiZhLlliJiZ0aGlzLmdldFBsYXllcigpLnBhdXNlKCl9LmJpbmQodGhpcyksMTAwKX0uYmluZCh0aGlzKSk7YS5tYi5zdWJzY3JpYmUoYi5FVkVOVFMuSU5JVElBTF9QTEFZLCJleGFtcGxlIixmdW5jdGlvbigpe3RoaXMudGMoKTt0aGlzLnpmPSEwO3RoaXMuUmUoKX0uYmluZCh0aGlzKSk7dGhpcy5OZSgpfSxSZTpmdW5jdGlvbigpe2lmKCF0aGlzLnViKXt0aGlzLnRjKCk7aWYoIXRoaXMubWUmJiF0aGlzLnRjKCkpcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCksITA7dGhpcy5tZSYmdGhpcy5HZSYmIXRoaXMuSmUmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy54YygpfS5iaW5kKHRoaXMpLDEwMCl9fSx0YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMubWYoImFkTWFuYWdlckNvbnRyb2xsZXIiKTtyZXR1cm4gYiYmYi5hZE1hbmFnZXJzJiZiLmFkTWFuYWdlcnNbImdvb2dsZS1pbWEtYWRzLW1hbmFnZXIiXX0sCm1mOmZ1bmN0aW9uKGIpe2Zvcih2YXIgYT10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpLGM9MDtjPGEubW9kdWxlcy5sZW5ndGg7YysrKXt2YXIgZD1hLm1vZHVsZXNbY107aWYoZC5uYW1lPT09YilyZXR1cm4gZC5pbnN0YW5jZX19LE5lOmZ1bmN0aW9uKCl7aWYodGhpcy50YygpKXt2YXIgYj10aGlzLm1mKCJhZE1hbmFnZXJDb250cm9sbGVyIikuYWRNYW5hZ2Vyc1siZ29vZ2xlLWltYS1hZHMtbWFuYWdlciJdO3RoaXMuSmU9MDxiLmdldEN1cnJlbnRUaW1lKCk7dGhpcy5HZT1iLmF2fXRoaXMuaGEoKXx8d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLk5lKCl9LmJpbmQodGhpcyksMTAwKX0saHY6ZnVuY3Rpb24oYil7cmV0dXJuIGIuaXNBZFBsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzQWRQbGF5aW5nP2IudXYoKTohMX0sVWI6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0QWREdXJhdGlvbiYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0QWREdXJhdGlvbj8KYi5VYigpOi0xfSxocDpmdW5jdGlvbihiKXtyZXR1cm4gYi5pc1BsYXlpbmcmJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmlzUGxheWluZz9iLmlzUGxheWluZygpOi0xfSxIbzpmdW5jdGlvbihiLGEpe3RoaXMudWI9YS5tYXRjaCgvXGQrLyk/cGFyc2VJbnQoYS5tYXRjaCgvXGQrLylbMF0pOjA7MTAwOT09dGhpcy51Ynx8MzAyPT10aGlzLnViP3RoaXMuaWE9ITA6dGhpcy5sKCJhZGVycm9yIix0aGlzLnViKTt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfSx4YzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCk7dGhpcy5pYT8odGhpcy5tKCksdGhpcy5uYSgpKTpiLk5jKCk/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOnRoaXMuaHAoYik/KHRoaXMudygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5DYigpfS5iaW5kKHRoaXMpLDJFMykpOgp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMueGMoKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHViPWMudmt8fHViOyhmdW5jdGlvbihjKXtjLnhrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sb3E6ZnVuY3Rpb24oKXt3aW5kb3cuT08uUWsua20uaW0/d2luZG93Lk9PLlFrLmttLmltLlp1KGZ1bmN0aW9uKCl7fSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm9xKCl9LDEwMCl9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPTE1MDA7dmFyIGI9WigpO2lmKGImJmIuX19pbnRlcm5hbCYmYi5fX2ludGVybmFsLnBsYXllcnMmJjA8Zi5EYShiLl9faW50ZXJuYWwucGxheWVycykpZm9yKHZhciBhIGluIGIuX19pbnRlcm5hbC5wbGF5ZXJzKWlmKGIuX19pbnRlcm5hbC5wbGF5ZXJzLmhhc093blByb3BlcnR5KGEpKXt2YXIgYz1uZXcgdGIoYi5fX2ludGVybmFsLnBsYXllcnNbYV0pO3RoaXMuSShjKXx8KHRoaXMuTChjKSwobmV3IHViKGMsCnRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgdmI9Yy54a3x8dmIsd2I9bmV3IHZiKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpyPXRoaXMuYVsxXTt0aGlzLlNnPXRoaXMuYVszXTt0aGlzLkJvPXRoaXMuYVs2XTt0aGlzLkpwPXRoaXMuYVs2XTt0aGlzLktyPXRoaXMuYVs0XTt0aGlzLmc9dGhpcy5hWzVdfWMueHM9YjtiLnByb3RvdHlwZT17eXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy56cjp0aGlzLlJnKGEpfSxSZzpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMuU2c6dGhpcy5BbyhhKX0sQW86ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkJvOnRoaXMuSXAoYSl9LElwOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5KcDp0aGlzLkpyKGEpfSxKcjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuS3I6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAzPAphP3RoaXMuZzphfX19KShjKTt2YXIgeGI9Yy54c3x8eGIsZGQ9bmV3IHhiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZGQueXIoNCk7KGZ1bmN0aW9uKGMpe2Muc2w9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5nZXRSYXdQbGF5ZXIoKSk7dGhpcy5PKGIpO3ZhciBhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIilbMF07YXx8KGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgib2JqZWN0IilbMF0pO3RoaXMuUihhKX0scGF1c2U6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInBhdXNlIil9LHBsYXk6ZnVuY3Rpb24oKXt0Zm1zdWl0ZSgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkudGZtdmlkZW8oInJlc3VtZSIpfSwKRGI6ZnVuY3Rpb24oKXt2YXIgYj1rO3JldHVybiBiJiZiLnJ1bkluc2lkZUNvbnRhaW5lcj8hMDohMX0sSzpmdW5jdGlvbigpe3JldHVybiJURk1zdWl0ZSJ9fSl9KShjKTt2YXIgeWI9Yy5zbHx8eWI7KGZ1bmN0aW9uKGMpe2Mucmw9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7eS5xZCgiIyIrYiwib25BZHNNYW5hZ2VyTG9hZGVkIixmdW5jdGlvbigpe3dpbmRvdy5zZXRUaW1lb3V0KHRoaXMubS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsImFkc01hbmFnZXJMb2FkRmFpbCIsZnVuY3Rpb24oKXt3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubCgiYWRlcnJvciIsImFkc01hbmFnZXJMb2FkRmFpbCIpO3RoaXMudygpfS5iaW5kKHRoaXMpLDFFMyl9LmJpbmQodGhpcykpO3kucWQoIiMiK2IsIm9iamVjdCIsZnVuY3Rpb24oYSl7dGhpcy5lcihhKX0uYmluZCh0aGlzKSk7CnkueXAoKX0sZXI6ZnVuY3Rpb24oYil7dmFyIGE9IiIsYztmb3IoYyBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYykpe2E9aXNOYU4oYltjXSk/ITE6YltjXTtpZigxMDA5PT1iW2NdfHwxMDAxPT1iW2NdfHwzMDM9PWJbY118fDQwMz09YltjXSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn1mb3IodmFyIGQgaW4gYltjXSlpZihiW2NdLmhhc093blByb3BlcnR5KGQpJiYoYT1pc05hTihiW2NdW2RdKT8hMTpiW2NdW2RdLDEwMDk9PWJbY11bZF18fDEwMDE9PWJbY11bZF18fDMwMz09YltjXVtkXXx8NDAzPT1iW2NdW2RdKSl7dGhpcy5tKCk7dGhpcy5uYSgpO3JldHVybn19dGhpcy5sKCJhZGVycm9yIixhKTt0aGlzLncoKX19KX0pKGMpO3ZhciB6Yj1jLnJsfHx6YjsoZnVuY3Rpb24oYyl7Yy50bD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cudGZtc3VpdGUpe2Zvcih2YXIgYj1bXSxhPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpLApjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO2E9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpO2ZvcihjPTA7YzxhLmxlbmd0aDtjKyspYi5wdXNoKGFbY10pO3RoaXMuU2MmJihiPWYuVW4oYix0aGlzLlNjKSk7Zm9yKGE9MDthPGIubGVuZ3RoO2ErKylmb3IoYz1iW2FdO2MucGFyZW50RWxlbWVudDspe3ZhciBjPWMucGFyZW50RWxlbWVudCxkPWMuZ2V0QXR0cmlidXRlKCJpZCIpO2lmKGQpdHJ5e3RmbXN1aXRlKCIjIitkKS50Zm12aWRlbygicmVzdW1lIik7dGhpcy5TY3x8KHRoaXMuU2M9W10pO3RoaXMuU2MucHVzaChiW2FdKTt2YXIgZT1uZXcgeWIoZCk7dGhpcy5JKGUpfHwodGhpcy5MKGUpLChuZXcgemIoZSx0aGlzLkEpKS5iKCkpfWNhdGNoKGgpe319fXRoaXMuSCgpfSxxZDpmdW5jdGlvbihiLGEsYyl7dGhpcy5afHwodGhpcy5aPXt9KTt0aGlzLlpbYl18fCh0aGlzLlpbYl09e30pO3RoaXMuWltiXVthXXx8KHRoaXMuWltiXVthXT1bXSk7CnRoaXMuWltiXVthXS5wdXNoKGMpfSxxdDpmdW5jdGlvbihiKXt2YXIgYT1iLnNQbGF5ZXJTZWxlY3RvcjtpZihiKWlmKCF0aGlzLlp8fHRoaXMuWiYmIXRoaXMuWlthXSl0aGlzLiRifHwodGhpcy4kYj1bXSksdGhpcy4kYi5wdXNoKGIpLHRoaXMucnMoKSYmKHRoaXMuY2coKSx0aGlzLmIoKSk7ZWxzZXt2YXIgYz0ib2JqZWN0Ijsic3RyaW5nIj09PXR5cGVvZiBiLm9FdmVudFR5cGUmJihjPWIub0V2ZW50VHlwZSk7aWYodGhpcy5aW2FdW2NdJiYwPHRoaXMuWlthXVtjXS5sZW5ndGgpZm9yKHZhciBkPTA7ZDx0aGlzLlpbYV1bY10ubGVuZ3RoO2QrKyl0aGlzLlpbYV1bY11bZF0oYil9fSx5cDpmdW5jdGlvbigpe2lmKHRoaXMuJGIpZm9yKHZhciBiPTA7Yjx0aGlzLiRiLmxlbmd0aDtiKyspe3ZhciBhPXRoaXMuJGJbYl0sYz1hLnNQbGF5ZXJTZWxlY3RvcixkPSJvYmplY3QiOyJzdHJpbmciPT09dHlwZW9mIGEub0V2ZW50VHlwZSYmKGQ9YS5vRXZlbnRUeXBlKTtpZih0aGlzLlpbY11bZF0mJgowPHRoaXMuWltjXVtkXS5sZW5ndGgpZm9yKHZhciBlPTA7ZTx0aGlzLlpbY11bZF0ubGVuZ3RoO2UrKyl0aGlzLlpbY11bZF1bZV0oYSl9fSx2aWRlb3BrZ0ludGVyZmFjZTpmdW5jdGlvbihiKXsiYXV0b1Jlc2l6ZUNhbGxiYWNrQmVmb3JlIiE9Yi5vRXZlbnRUeXBlLmgmJiJhdXRvUmVzaXplQ2FsbGJhY2tBZnRlciIhPWIub0V2ZW50VHlwZS5oJiZ5LnF0KGIpfX0pfSkoYyk7dmFyIEFiPWMudGx8fEFiLHk9bmV3IEFiKHEpO1goKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5NaT10aGlzLmFbNV07dGhpcy56cT10aGlzLmFbM107dGhpcy5ncj10aGlzLmFbMV07dGhpcy51aj10aGlzLmFbMV07dGhpcy5zbz10aGlzLmFbMV07dGhpcy5jdT10aGlzLmFbN107dGhpcy5acD10aGlzLmFbNF07dGhpcy54cT10aGlzLmFbOF07dGhpcy5obz10aGlzLmFbN107dGhpcy5nPXRoaXMuYVs3XX0KYy5tbj1iO2IucHJvdG90eXBlPXtMaTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWk6dGhpcy55cShhKX0seXE6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpxOnRoaXMuZnIoYSl9LGZyOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ncjp0aGlzLnRqKGEpfSx0ajpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMudWo6dGhpcy5ybyhhKX0scm86ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnNvOnRoaXMuYnUoYSl9LGJ1OmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5jdTp0aGlzLllwKGEpfSxZcDpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWnA6dGhpcy53cShhKX0sd3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLnhxOnRoaXMuZm8oYSl9LGZvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5obzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLmc6YX19fSkoYyk7dmFyIEJiPWMubW58fEJiLGVkPW5ldyBCYigxLApuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1lZC5MaSg0KTsoZnVuY3Rpb24oYyl7Yy56aD1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLm11dGVkPSExO3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuZ2V0UmF3UGxheWVyKCkpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTt0aGlzLlIoYSl9LHBhdXNlOmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGF1c2UoKX0pfSxwbGF5OmZ1bmN0aW9uKCl7JCgiIyIrdGhpcy5nZXRSYXdQbGF5ZXIoKSkuZGF0YSgibWVkaWFwbGF5ZXIiKS50aGVuKGZ1bmN0aW9uKGIpe2IucGxheSgpfSl9LApqYjpmdW5jdGlvbigpeyQoIiMiK3RoaXMuZ2V0UmF3UGxheWVyKCkpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihiKXtiLmlzUGxheWluZygpJiZiLnBhdXNlKCl9KX0sV2E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tdXRlZH0sSzpmdW5jdGlvbigpe3JldHVybiJCaWxkTWVkaWFQbGF5ZXIifX0pfSkoYyk7dmFyIENiPWMuemh8fENiOyhmdW5jdGlvbihjKXtjLkFoPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyQoIiMiK2IpLmRhdGEoIm1lZGlhcGxheWVyIikudGhlbihmdW5jdGlvbihhKXt0aGlzLnBsYXllci5tdXRlZD1hLmRhdGEubXV0ZWQ7YS5vbigiZXJyb3IiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJFcnJvciIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2Eub24oInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5Xcnx8KHRoaXMuV3I9CiEwLHdpbmRvdy5TbWFydEFkU2VydmVyQVNNSXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJTbWFydEFkU2VydmVyIiksdGhpcy53KCkpKX0uYmluZCh0aGlzKSk7YS5vbigicGF1c2UiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJ3YWl0aW5nIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7YS5vbigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLncoKX0uYmluZCh0aGlzKSk7YS5vbigiQWRMb2FkZWQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKTthLm9uKCJBZFN0YXJ0ZWQiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2Eub24oIkFkVmlkZW9TdGFydCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRQbGF5aW5nIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTthLm9uKCJBZFZpZGVvRmlyc3RRdWFydGlsZSIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7CmEub24oIkFkVmlkZW9NaWRwb2ludCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSk7YS5vbigiQWRWaWRlb1RoaXJkUXVhcnRpbGUiLGZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX19KX0pKGMpO3ZhciBEYj1jLkFofHxEYjsoZnVuY3Rpb24oYyl7Yy5CaD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtZWRpYXBsYXllciIpO2lmKHdpbmRvdy5kZSYmd2luZG93LmRlLmJpbGQmJndpbmRvdy5kZS5iaWxkLm1lZGlhcGxheWVyJiZiJiYwPGIubGVuZ3RoKWZvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWJbYV0sZD0iIjt0cnl7ZD1jLmdldEF0dHJpYnV0ZSgiaWQiKX1jYXRjaChlKXtkPWMuaWR9aWYoZCYmJCgiIyIrZCkuZGF0YSgibWVkaWFwbGF5ZXIiKSl0cnl7dmFyIGY9bmV3IENiKGQpO3RoaXMuSShmKXx8Cih0aGlzLkwoZiksKG5ldyBEYihmLHRoaXMuQSkpLmIoKSl9Y2F0Y2goaCl7fX10aGlzLkgoKX0sSTpmdW5jdGlvbihiKXt2YXIgYT1iLmdldFJhd1BsYXllcigpOyQoIiMiK2EpO2Zvcih2YXIgYyBpbiB0aGlzLnhhKWlmKGE9PXRoaXMueGFbY10uZ2V0UmF3UGxheWVyKCkpcmV0dXJuITA7cmV0dXJuIHRoaXMueGFbYi5mYigpXT8hMDohMX19KX0pKGMpO3ZhciBFYj1jLkJofHxFYixGYj1uZXcgRWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuR2g9dGhpcy5hWzZdO3RoaXMuaG09dGhpcy5hWzEwXTt0aGlzLlptPXRoaXMuYVs3XTt0aGlzLmc9dGhpcy5hWzRdfWMuaG49YjtiLnByb3RvdHlwZT17Rmg6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkdoOnRoaXMuZ20oYSl9LGdtOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5obTp0aGlzLlltKGEpfSxZbTpmdW5jdGlvbihhKXtyZXR1cm4gNjwKYT90aGlzLlptOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuZzphfX19KShjKTt2YXIgR2I9Yy5obnx8R2IsZmQ9bmV3IEdiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9ZmQuRmgoNCk7KGZ1bmN0aW9uKGMpe2MuUWw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpO3RoaXMuaXNQbGF5aW5nPSExO2IuYWRkRXZlbnRMaXN0ZW5lcigidGltZXVwZGF0ZSIsZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMH0uYmluZCh0aGlzKSl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5KCl9LApnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmN1cnJlbnRUaW1lfSxnZXREdXJhdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFJhd1BsYXllcigpLmR1cmF0aW9ufSxlYTpmdW5jdGlvbigpezA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMS41PnRoaXMuZ2V0RHVyYXRpb24oKS10aGlzLmdldEN1cnJlbnRUaW1lKCkmJnRoaXMuSj8oMCx0aGlzLkopKCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmVhKCl9LmJpbmQodGhpcyksNDAwKX0sSzpmdW5jdGlvbigpe3JldHVybiJXRnY0In19KX0pKGMpO3ZhciBIYj1jLlFsfHxIYjsoZnVuY3Rpb24oYyl7Yy5QbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS52aWRlb1RhZy5uZXh0U2libGluZzt0aGlzLkxlfHx3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpfS5iaW5kKHRoaXMpLAoxMDApO3RoaXMuTm98fCh0aGlzLkFmKCksdGhpcy5Obz0hMCk7YiYmYi5pZCYmMDxiLmlkLmluZGV4T2YoImFkIik/dGhpcy5tKCk6dGhpcy5MZT8odGhpcy5sKCJhZGVycm9yIiwibm9Db250YWluZXIiKSx0aGlzLm8oKSk6KHRoaXMuTGU9ITAsd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MDApKX0sV286ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5pbWF9LEFmOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5XbygpO2I/YiYmYi5hZHNMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihnb29nbGUuaW1hLkFkRXJyb3JFdmVudC5UeXBlLkFEX0VSUk9SLGZ1bmN0aW9uKGEpe2E9YS5nZXRFcnJvcigpO2EuZ2V0RXJyb3JDb2RlKCk7MTAwOT09YS5nZXRFcnJvckNvZGUoKXx8MzAzPT1hLmdldEVycm9yQ29kZSgpfHw0MDM9PWEuZ2V0RXJyb3JDb2RlKCk/KHRoaXMuaWE9ITAsdGhpcy5tKCksdGhpcy5uYSgpKToKKHRoaXMubygpLHRoaXMubCgiYWRlcnJvciIsYS5nZXRFcnJvckNvZGUoKSkpfS5iaW5kKHRoaXMpKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQWYoKX0uYmluZCh0aGlzKSw1MCl9LHN2OmZ1bmN0aW9uKCl7cmV0dXJuITB9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz90aGlzLncoKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMubygpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBJYj1jLlBsfHxJYjsoZnVuY3Rpb24oYyl7Yy5SbD1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt0aGlzLndhPS0xO3ZhciBiPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpO2lmKHdpbmRvdy53ZnY0X2h0bWw1X3BsYXllciYmMDxiLmxlbmd0aClmb3IodmFyIGEgaW4gYil7dmFyIGM9bmV3IEhiKGIuaXRlbShhKSk7dGhpcy5JKGMpfHwtMT09Yy5pZC5zZWFyY2goInZpZGVvXyIpfHwKKHRoaXMuTChjKSwobmV3IEliKGMsdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBKYj1jLlJsfHxKYixLYj1uZXcgSmIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuS209dGhpcy5hWzFdO3RoaXMuTW89dGhpcy5hWzNdO3RoaXMuWWg9dGhpcy5hWzhdO3RoaXMuZz10aGlzLmFbMl19Yy5ocz1iO2IucHJvdG90eXBlPXtKbTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMuS206dGhpcy5MbyhhKX0sTG86ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Nbzp0aGlzLlhoKGEpfSxYaDpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuWWg6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBMYj1jLmhzfHxMYixnZD1uZXcgTGIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLAohMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9Z2QuSm0oNCk7KGZ1bmN0aW9uKGMpe2MuQWo9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKS5wYXJlbnROb2RlO3RoaXMuTyhiKTtiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5SKGIpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuc2VuZE5vdGlmaWNhdGlvbigiZG9QYXVzZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5zZW5kTm90aWZpY2F0aW9uKCJkb1BsYXkiKX0sZWE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuYWRkSnNMaXN0ZW5lcigicGxheWVyUGxheUVuZCIsZnVuY3Rpb24oKXt0aGlzLkomJigwLHRoaXMuSikoITApfS5iaW5kKHRoaXMpKTtiLmFkZEpzTGlzdGVuZXIoInBsYXlsaXN0UGxheU5leHQiLGZ1bmN0aW9uKCl7dGhpcy5KJiYKKDAsdGhpcy5KKSghMCl9LmJpbmQodGhpcykpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuImthbHR1cmEifX0pfSkoYyk7dmFyIE1iPWMuQWp8fE1iOyhmdW5jdGlvbihjKXtjLnpqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGxvZzpmdW5jdGlvbigpe30sYjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7Yi5hZGRKc0xpc3RlbmVyPyhiLmFkZEpzTGlzdGVuZXIoImFkRXJyb3JFdmVudCIsZnVuY3Rpb24oKXt0aGlzLklnKCl9LmJpbmQodGhpcykpLGIuYWRkSnNMaXN0ZW5lcigiYWRVcGRhdGVQbGF5aGVhZCIsZnVuY3Rpb24oKXt0aGlzLm0oKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJmaXJzdFBsYXkiLGZ1bmN0aW9uKCl7dGhpcy5jZigpfS5iaW5kKHRoaXMpKSxiLmFkZEpzTGlzdGVuZXIoInBsYXllclVwZGF0ZVBsYXloZWFkIixmdW5jdGlvbigpe3RoaXMuY2YoKX0uYmluZCh0aGlzKSksYi5hZGRKc0xpc3RlbmVyKCJhZFN0YXJ0IiwKZnVuY3Rpb24oKXt0aGlzLnhtKCl9LmJpbmQodGhpcykpLHRoaXMuSmc9ITEsdGhpcy50dT0xRTMsdGhpcy5YZj17ZG9uZTohMX0pOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5iKCl9LmJpbmQodGhpcyksMTAwKX0sY2Y6ZnVuY3Rpb24oKXt0aGlzLlhmLmRvbmV8fCh0aGlzLlhmLmRvbmU9ITAsdGhpcy5KZz13aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSWcoKX0uYmluZCh0aGlzKSx0aGlzLnR1KSl9LHhtOmZ1bmN0aW9uKCl7d2luZG93LmNsZWFyVGltZW91dCh0aGlzLkpnKTt0aGlzLm0oKX0sSWc6ZnVuY3Rpb24oKXt0aGlzLnZhKCk/KHRoaXMubSgpLHRoaXMubmEoKSk6KHRoaXMubCgiYWRlcnJvciIsIkFkU3RhcnRFdmVudFRpbWVvdXQiKSx0aGlzLncoKSl9LGpmOmZ1bmN0aW9uKGIpe3ZhciBhPVtdO2lmKGIpZm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGJbY10paWYoYltjXS5oYXNPd25Qcm9wZXJ0eShkKSYmYltjXVtkXSYmCmJbY11bZF0uZ2V0RXJyb3JDb2RlKXt2YXIgZT1iW2NdW2RdO2JbY11bZF0uZ2V0RXJyb3JDb2RlKCk7YltjXVtkXS5nZXRNZXNzYWdlKCk7YltjXVtkXS5nZXRUeXBlKCk7YltjXVtkXS5nZXRWYXN0RXJyb3JDb2RlKCk7YS5wdXNoKGUuZ2V0RXJyb3JDb2RlKCkpfXJldHVybiBhfSx2YTpmdW5jdGlvbigpe3ZhciBiPVtdO213JiZtdy5lcnJvckRlbGVnYXRlcz9iPXRoaXMuamYobXcuZXJyb3JEZWxlZ2F0ZXMpOnRvcCYmdG9wLndpbmRvdyYmdG9wLndpbmRvdy5lcnJvckRlbGVnYXRlcyYmKGI9dGhpcy5qZih0b3Aud2luZG93LmVycm9yRGVsZWdhdGVzKSk7Zm9yKHZhciBhPTA7YTxiLmxlbmd0aDthKyspaWYoMTAwOT09YlthXXx8MzAzPT1iW2FdfHw0MDM9PWJbYV0pcmV0dXJuITA7cmV0dXJuITF9fSl9KShjKTt2YXIgTmI9Yy56anx8TmI7KGZ1bmN0aW9uKGMpe2MuQmo9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYod2luZG93LmtXaWRnZXQmJgp3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzJiYwPGYuRGEod2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyl8fHdpbmRvdy5rV2lkZ2V0JiZ3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5yZWFkeVdpZGdldHMpKXt2YXIgYj1udWxsO3dpbmRvdy5rV2lkZ2V0LmlmcmFtZVVybHMmJjA8Zi5EYSh3aW5kb3cua1dpZGdldC5pZnJhbWVVcmxzKSYmKGI9d2luZG93LmtXaWRnZXQuaWZyYW1lVXJscyk7d2luZG93LmtXaWRnZXQmJndpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyYmMDxmLkRhKHdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cykmJihiPXdpbmRvdy5rV2lkZ2V0LnJlYWR5V2lkZ2V0cyk7aWYoIWIpcmV0dXJuO2Zvcih2YXIgYSBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciBjPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGEpO2MmJihjPW5ldyBNYihjKSx0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBOYihjLHRoaXMuQSkpLmIoKSkpfX10aGlzLkgoKX19KX0pKGMpOwp2YXIgT2I9Yy5Canx8T2IsUGI9bmV3IE9iKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLnpzPXRoaXMuYVszXTt0aGlzLkJxPXRoaXMuYVs2XTt0aGlzLnl1PXRoaXMuYVszXTt0aGlzLmc9dGhpcy5hWzldfWMuUnQ9YjtiLnByb3RvdHlwZT17eXM6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLnpzOnRoaXMuQXEoYSl9LEFxOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5CcTp0aGlzLnh1KGEpfSx4dTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMueXU6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMuZzphfX19KShjKTt2YXIgUWI9Yy5SdHx8UWIsaGQ9bmV3IFFiKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9aGQueXMoNCk7CihmdW5jdGlvbihjKXtjLnBsPXAuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sTjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCkucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxLOmZ1bmN0aW9uKCl7cmV0dXJuIlNpbXBsZVZpZGVvQW5kSW1hIn19KX0pKGMpO3ZhciBSYj1jLnBsfHxSYjsoZnVuY3Rpb24oYyl7Yy5vbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKS5hZGRFdmVudExpc3RlbmVyKCJhZEVycm9yIiwKZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLmdldEVycm9yPyhiPWIuZGV0YWlsLmdldEVycm9yKCkrIiIsYi5pbmRleE9mJiYwPGIuaW5kZXhPZigiMTAwOSIpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSkpOih0aGlzLmwoImFkZXJyb3IiKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpO3RoaXMuUGIoKX0sUGI6ZnVuY3Rpb24oKXt3aW5kb3cuaW1hJiZpbWEudmlkZW8mJmltYS52aWRlby5jbGllbnQ/dGhpcy5HZCgpJiZ3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuR2QoKSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LmJpbmQodGhpcyksNTAwKTp3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuUGIoKX0uYmluZCh0aGlzKSwxMCl9LEdkOmZ1bmN0aW9uKCl7cmV0dXJuIWltYS52aWRlby5jbGllbnQuanNUYWcmJiFpbWEudmlkZW8uY2xpZW50LnRhZ2dlZCYmIWltYS52aWRlby5jbGllbnQuZ2V0RURhdGF9LApvOmZ1bmN0aW9uKCl7dGhpcy5nZXRQbGF5ZXIoKS5pc1BsYXlpbmc/dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMCl9fSl9KShjKTt2YXIgU2I9Yy5vbHx8U2I7KGZ1bmN0aW9uKGMpe2MucWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxiOmZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9TSVRFJiYidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cuU09JX1NVQlNJVEUmJiJ1bmRlZmluZWQiIT09dHlwZW9mIHdpbmRvdy5TT0lfQ09OVEVOVCYmInVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93LlNPSV9XRVJCVU5HJiYxPT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKS5sZW5ndGgmJiF3aW5kb3cuX3BsYXkpe3ZhciBiPW5ldyBSYihkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgU2IoYiwKdGhpcy5BKSkuYigpKX10aGlzLkgoKX19KX0pKGMpO3ZhciBUYj1jLnFsfHxUYixVYj1uZXcgVGIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuWWc9dGhpcy5hWzldO3RoaXMuT209dGhpcy5hWzRdO3RoaXMubGw9dGhpcy5hWzVdO3RoaXMucnI9dGhpcy5hWzNdO3RoaXMubWs9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbMTBdfWMuV2g9YjtiLnByb3RvdHlwZT17WGc6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLllnOnRoaXMuTm0oYSl9LE5tOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5PbTp0aGlzLmtsKGEpfSxrbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMubGw6dGhpcy5xcihhKX0scXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDU8YT90aGlzLnJyOnRoaXMubGsoYSl9LGxrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5tazp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBWYj1jLldofHxWYixpZD1uZXcgVmIoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1pZC5YZyg0KTsoZnVuY3Rpb24oYyl7Yy5Zaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpWzBdO3RoaXMuTyhiKTt0aGlzLlIoYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXSk7dGhpcy5XZD0hMX0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpO3dpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe3RoaXMuWnIoKX0uYmluZCh0aGlzKSw1MDApfSxacjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UG9zaXRpb24oKSxhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPApiJiZhJiYwPGEmJmI+PWEtMSYmdGhpcy5KJiZ0aGlzLkooKX0sZ2V0RHVyYXRpb246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLGE9MDtiLnBsYXliYWNrLmdldER1cmF0aW9uJiYoYT1iLnBsYXliYWNrLmdldER1cmF0aW9uKCkpO3JldHVybiBhfSxnZXRQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0wO2IucGxheWJhY2suZ2V0UG9zaXRpb24mJihhPWIucGxheWJhY2suZ2V0UG9zaXRpb24oKSk7cmV0dXJuIGF9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5XZCYmd2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5XZCk7dGhpcy5nZXRSYXdQbGF5ZXIoKS5wbGF5YmFjay5wbGF5KCl9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuIGIucGxheWJhY2smJmIucGxheWJhY2suZ2V0UGxheVN0YXRlPwooYi5wbGF5YmFjay5nZXRQbGF5U3RhdGUoKSwicGxheWluZyI9PWIucGxheWJhY2suZ2V0UGxheVN0YXRlKCkpOiExfSxXczpmdW5jdGlvbigpe3RoaXMuV2Q9d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5wYXVzZSgpfS5iaW5kKHRoaXMpLDEwKX0sSzpmdW5jdGlvbigpe3JldHVybiJSb2NrZXJ5In19KX0pKGMpO3ZhciBXYj1jLllrfHxXYjsoZnVuY3Rpb24oYyl7Yy5Yaz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpO3RoaXMuS2I9MH0sYjpmdW5jdGlvbigpe3RoaXMuT3E9MTA7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKTt0aGlzLktifHwodGhpcy5LYj0wLGIuYWRkRXZlbnRMaXN0ZW5lcigiYWRFcnJvciIsZnVuY3Rpb24oKXt0aGlzLmwoImFkZXJyb3IiKTt0aGlzLm8oKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsZnVuY3Rpb24oKXt9KSk7d2luZG93LnZpZGVvcGxhemE/KHdpbmRvdy52aWRlb3BsYXphLmJ1aWxkRGF0ZXx8Cih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlPyh3aW5kb3cudmlkZW9wbGF6YS5jb3JlLkFkQ2FsbE1vZHVsZXx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUuVHJhY2tlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpLHdpbmRvdy52aWRlb3BsYXphLmNvcmUubW9kZWx8fCh0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSx3aW5kb3cudmlkZW9wbGF6YS5jb3JlLnBhcnNlfHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSksd2luZG93LnZpZGVvcGxhemEuY29yZS5yZXF1ZXN0fHwodGhpcy5sKCJub2ZyYW1ld29yayIsInZpZGVvcGxhemEiKSx0aGlzLm8oKSkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSwKd2luZG93LnZpZGVvcGxhemEudmVyc2lvbk51bWJlcnx8KHRoaXMubCgibm9mcmFtZXdvcmsiLCJ2aWRlb3BsYXphIiksdGhpcy5vKCkpKToodGhpcy5LYnx8dGhpcy5LYisrLHRoaXMuS2I8PXRoaXMuT3E/KHRoaXMuS2IrKyx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuYigpfS5iaW5kKHRoaXMpLDUwMCkpOih0aGlzLmwoIm5vZnJhbWV3b3JrIiwidmlkZW9wbGF6YSIpLHRoaXMubygpKSl9LG86ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZygpPyh0aGlzLmdldFBsYXllcigpLldzKCksdGhpcy53KCkpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKCl9LmJpbmQodGhpcyksMTAwKX19KX0pKGMpO3ZhciBYYj1jLlhrfHxYYjsoZnVuY3Rpb24oYyl7Yy5aaz1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdHYtcGxheWVyLWNvbnRhaW5lciIpLAphPSExO2ImJmJbMF0mJihhPWJbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZpZGVvIikpJiZhWzBdJiZ3aW5kb3cucGxheWVyQXBpJiZ3aW5kb3cucGxheWVyQXBpLnBsYXliYWNrJiZiJiYoYj1uZXcgV2Iod2luZG93LnBsYXllckFwaSksdGhpcy5JKGIpfHwodGhpcy5MKGIpLChuZXcgWGIoYix0aGlzLkEpKS5iKCkpKTt0aGlzLkgoKX19KX0pKGMpO3ZhciBZYj1jLlprfHxZYixaYj1uZXcgWWIocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMucW89dGhpcy5hWzZdO3RoaXMuSms9dGhpcy5hWzRdO3RoaXMuam89dGhpcy5hWzJdO3RoaXMueWk9dGhpcy5hWzddO3RoaXMudnI9dGhpcy5hWzddO3RoaXMuYm09dGhpcy5hWzEwXTt0aGlzLlRoPXRoaXMuYVszXTt0aGlzLm1tPXRoaXMuYVs4XTt0aGlzLkJyPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVs1XX1jLmtvPWI7Yi5wcm90b3R5cGU9CntwbzpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMucW86dGhpcy5JayhhKX0sSWs6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkprOnRoaXMuaW8oYSl9LGlvOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5qbzp0aGlzLnhpKGEpfSx4aTpmdW5jdGlvbihhKXtyZXR1cm4gMTxhP3RoaXMueWk6dGhpcy51cihhKX0sdXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnZyOnRoaXMuYW0oYSl9LGFtOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ibTp0aGlzLlNoKGEpfSxTaDpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVGg6dGhpcy5sbShhKX0sbG06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLm1tOnRoaXMuQXIoYSl9LEFyOmZ1bmN0aW9uKGEpe3JldHVybiA5PGE/dGhpcy5Ccjp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDY8YT90aGlzLmc6YX19fSkoYyk7dmFyICRiPWMua298fCRiLGpkPW5ldyAkYigxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwKInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1qZC5wbyg0KTsoZnVuY3Rpb24oYyl7Yy5Uaz1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBhcmVudE5vZGUucGFyZW50Tm9kZTt0aGlzLk8oYik7Yj10aGlzLmdldFJhd1BsYXllcigpO3RoaXMuUihiKTt0aGlzLmlzUGxheWluZz0hMTtiLmFkZEV2ZW50TGlzdGVuZXIoInRpbWV1cGRhdGUiLGZ1bmN0aW9uKCl7dGhpcy5pc1BsYXlpbmc9ITB9LmJpbmQodGhpcykpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGF1c2UoKX0scGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkucGxheSgpfSxnZXRDdXJyZW50VGltZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCksYT0iIjtiLmN1cnJlbnRUaW1lJiYoYT1iLmN1cnJlbnRUaW1lKTsKcmV0dXJuIGF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKSxhPTA7Yi5kdXJhdGlvbiYmKGE9Yi5kdXJhdGlvbik7cmV0dXJuIGF9LGVhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRDdXJyZW50VGltZSgpLGE9dGhpcy5nZXREdXJhdGlvbigpO2ImJmEmJjE+YS1iP3RoaXMuSigpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDIwMCl9LEs6ZnVuY3Rpb24oKXtyZXR1cm4iUmFkaWFudE1QIn19KX0pKGMpO3ZhciBhYz1jLlRrfHxhYzsoZnVuY3Rpb24oYyl7Yy5Taz10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5DYSgpO3RoaXMuZ2V0UGxheWVyKCk7Yi5hZGRFdmVudExpc3RlbmVyKCJwbGF5aW5nIixmdW5jdGlvbigpe3RoaXMuTm4oKX0uYmluZCh0aGlzKSk7Yi5hZGRFdmVudExpc3RlbmVyKCJhZGxvYWRlZCIsCmZ1bmN0aW9uKCl7dGhpcy5tKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcigiYWRzdGFydGVkIixmdW5jdGlvbigpe3RoaXMubSgpfS5iaW5kKHRoaXMpKTtiPXRoaXMuSWMoKTswPGIuZ2V0Q3VycmVudFRpbWUoKT90aGlzLkNxKCk6dGhpcy5QYigpO2IuYXV0b3BsYXkmJndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5GZSgpfHwodGhpcy5sKCJjb250ZW50cGxheSIpLHRoaXMubyghMCkpfS5iaW5kKHRoaXMpLDFFMyl9LE5uOmZ1bmN0aW9uKCl7dGhpcy5GZSgpfHx0aGlzLm8oITApfSxDcTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuSWMoKTshYi5tYSYmYi5iYSYmYi5ZdSYmYi4kdSYmKHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLm8oKSl9LFBiOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5JYygpO2IuYWRzTG9hZGVyP2IuYWRzTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUixmdW5jdGlvbihhKXt2YXIgYjsKYTp7YT1hLmdldEVycm9yKCk7Zm9yKGIgaW4gYSlpZigibnVtYmVyIj09dHlwZW9mIGFbYl0pe2I9YVtiXTticmVhayBhfWI9dm9pZCAwfTEwMDk9PWJ8fDMwMz09Ynx8NDAzPT1iPyh0aGlzLm0oKSx0aGlzLm5hKCkpOih0aGlzLmwoImFkZXJyb3IiLGIpLHRoaXMubygpKX0uYmluZCh0aGlzKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBiKCl9LmJpbmQodGhpcyksMTAwKX0sSWM6ZnVuY3Rpb24oKXtmb3IodmFyIGI9ay5wbGF5ZXJhcGkoKSxhPXRoaXMuZ2V0UGxheWVyKCkuQ2EoKS5pZCxjPTA7YzxiLmxlbmd0aDtjKyspaWYoYltjXS5pZD09YSlyZXR1cm4gYltjXTtyZXR1cm57fX0sR2Q6ZnVuY3Rpb24oKXtyZXR1cm4gd2luZG93LmltYT8haW1hLnZpZGVvLmNsaWVudC5qc1RhZyYmIWltYS52aWRlby5jbGllbnQudGFnZ2VkJiYhaW1hLnZpZGVvLmNsaWVudC5nZXRFRGF0YTohMX0sbzpmdW5jdGlvbihiKXt0aGlzLmdldFBsYXllcigpLmlzUGxheWluZz9iPwp0aGlzLkljKCkuYWRzTG9hZGVyP3RoaXMudyghMCk6dGhpcy53KCk6dGhpcy53KCk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIGJjPWMuU2t8fGJjOyhmdW5jdGlvbihjKXtjLlVrPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKGsmJmsucGxheWVyYXBpKWZvcih2YXIgYj1rLnBsYXllcmFwaSgpLGE9MDthPGIubGVuZ3RoO2ErKyl7dmFyIGM9bmV3IGFjKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGJbYV0uaWQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKTt0aGlzLkkoYyl8fCh0aGlzLkwoYyksKG5ldyBiYyhjLHRoaXMuQSkpLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgY2M9Yy5Va3x8Y2MsZGM9bmV3IGNjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKdGhpcy52aD10aGlzLmFbOV07dGhpcy5hcT10aGlzLmFbOV07dGhpcy5raz10aGlzLmFbN107dGhpcy5lcT10aGlzLmFbOF07dGhpcy5PdT10aGlzLmFbOV07dGhpcy5UbD10aGlzLmFbM107dGhpcy5ibz10aGlzLmFbNl07dGhpcy5nPXRoaXMuYVsxXX1jLlZsPWI7Yi5wcm90b3R5cGU9e3VoOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52aDp0aGlzLiRwKGEpfSwkcDpmdW5jdGlvbihhKXtyZXR1cm4gNzxhP3RoaXMuYXE6dGhpcy5qayhhKX0sams6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLmtrOnRoaXMuY3EoYSl9LGNxOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lcTp0aGlzLk51KGEpfSxOdTpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuT3U6dGhpcy5TbChhKX0sU2w6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLlRsOnRoaXMuYW8oYSl9LGFvOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5ibzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8CmE/dGhpcy5nOmF9fX0pKGMpO3ZhciBlYz1jLlZsfHxlYyxrZD1uZXcgZWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1rZC51aCg0KTsoZnVuY3Rpb24oYyl7Yy5Uaj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsYXllci5pZCk7RCYmKGI9Yi5maXJzdENoaWxkKTtpZihiKXt0aGlzLk8oYik7aWYoYi50YWdOYW1lKXt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKX1hP3RoaXMuUihhKTp0aGlzLmRhKCl9ZWxzZSB0aGlzLmRhKCl9LHBhdXNlOmZ1bmN0aW9uKCl7aWYoRCl7dmFyIGI9CnRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGF1c2UoYi5pZCl9ZWxzZSB3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5zZW5kQ29tbWFuZCgicGF1c2UiKX0scGxheTpmdW5jdGlvbigpe2lmKEQpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7d2luZG93Ll9wbGF5LmNvbnRyb2wuaW50ZXJhY3QucGxheShiLmlkKX1lbHNlIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNlbmRDb21tYW5kKCJwbGF5Iil9LEs6ZnVuY3Rpb24oKXtyZXR1cm4ibmV4dCJ9LERiOmZ1bmN0aW9uKCl7cmV0dXJuITB9LENhOmZ1bmN0aW9uKCl7dmFyIGI7RD8oYj10aGlzLmdldFJhd1BsYXllcigpLGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5pZCkuZmlyc3RDaGlsZCk6Yj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cuX3BsYXkuYWRkb25zLnN2bS5nZXRQbGF5ZXJDb250YWluZXIoKSk7YiE9dGhpcy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj1iKTsKcmV0dXJuIHRoaXMuY29udGFpbmVyfX0pfSkoYyk7dmFyIFQ9Yy5Uanx8VDsoZnVuY3Rpb24oYyl7Yy5Taj10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxiOmZ1bmN0aW9uKCl7dGhpcy5YZD0iIjt2YXIgYj10aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpO2ImJih0aGlzLlhkPWIuaWQpO0Q/d2luZG93Ll9wbGF5LmNvbmZpZy5hZGRBZGRvbkxpc3RlbmVyKGZ1bmN0aW9uKGEpe3ZhciBiPWEucGxheWVyQ29udGFpbmVyO2ImJnRoaXMuWGQmJmIhPXRoaXMuWGR8fCJhZGVycm9yIiE9YS5ldmVudHx8KGEuYWRVUkwmJihrLmFkVGFnPWEuYWRVUkwpLHRoaXMubCgiYWRlcnJvciIsYS53diksdGhpcy53KCksd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLkNiKCl9LmJpbmQodGhpcyksMTAwKSl9LmJpbmQodGhpcyksInN2bSIpOndpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLnNldExpc3RlbmVyKGZ1bmN0aW9uKGEpeyJhZGVycm9yIj09YSYmKHRoaXMubCgiYWRlcnJvciIpLAp0aGlzLncoKSx3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuQ2IoKX0uYmluZCh0aGlzKSwxMDApKX0uYmluZCh0aGlzKSl9fSl9KShjKTt2YXIgVT1jLlNqfHxVOyhmdW5jdGlvbihjKXtjLlVqPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe2lmKHdpbmRvdy5fcGxheSYmd2luZG93Ll9wbGF5LmFkZG9ucyYmd2luZG93Ll9wbGF5LmFkZG9ucy5zdm0pe0Q9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fcGxheS5hZGRvbnMuc3ZtLmdldFBsYXllckNvbnRhaW5lcj8hMTohMDt2YXIgYjtpZihEKWZvcih2YXIgYT13aW5kb3cuX3BsYXkuY29udHJvbC5nZXRJbnN0YW5jZXMoKSxjPWEubGVuZ3RoLGQ9MDtkPGM7ZCsrKXtpZihiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGFbZF0pKWI9bmV3IFQoYiksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFUoYix0aGlzLkEpLGIuYigpKX1lbHNlIGlmKGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQod2luZG93Ll9wbGF5LmFkZG9ucy5zdm0uZ2V0UGxheWVyQ29udGFpbmVyKCkpKWI9Cm5ldyBUKGIpLGIuamE/dGhpcy5jZygpOnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBVKGIsdGhpcy5BKSxiLmIoKSl9dGhpcy5IKCl9fSl9KShjKTt2YXIgRCxmYz1jLlVqfHxmYyxnYz1uZXcgZmMoZnVuY3Rpb24oYyxiKXtjLnBhdXNlKCk7aWYobS5uYi5sZW5ndGgpe3ZhciBhPW0ubmIuc2hpZnQoKTtpZigiYWRjYWxsIj09YS50eXBlKXt2YXIgZztnPWYuS3MoeyJbTE9BRFNDUklQVF0iOmYucGEoMTApLCJbVVRJTFNdIjpmLnBhKDEwKSwiW0NBTExCQUNLXSI6Zi5wYSgxMCl9KTt3aW5kb3dbZ1siW0xPQURTQ1JJUFRdIl1dPWYuTWYuYmluZChmKTt3aW5kb3dbZ1siW1VUSUxTXSJdXT1tO2Zvcih3aW5kb3dbZ1siW0NBTExCQUNLXSJdXT1mdW5jdGlvbihhKXtmb3IodmFyIGUgaW4gYSlrW2VdPWFbZV07cShjLGIpfTtnPWEuc2NyaXB0cy5zaGlmdCgpOylmLk1mKGcsZnVuY3Rpb24oKXtjb25zb2xlLmxvZygic2lkZWxvYWQgc3VjY2VzcyIpfSxmdW5jdGlvbigpe2NvbnNvbGUubG9nKCJzaWRlbG9hZCBmYWlsZWQiKX0sCm0pfWVsc2UgcShjLGIpfWVsc2UgcShjLGIpfSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSG09dGhpcy5hWzFdO3RoaXMuVnI9dGhpcy5hWzddO3RoaXMuUmo9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbOF19Yy5Jcj1iO2IucHJvdG90eXBlPXtHbTpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuSG06dGhpcy5VcihhKX0sVXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5Wcjp0aGlzLlFqKGEpfSxRajpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuUmo6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBoYz1jLklyfHxoYyxsZD1uZXcgaGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1sZC5HbSg0KTsKKGZ1bmN0aW9uKGMpe2MuRGw9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtpZihiLnZpZGVvTW9kZWwpe3ZhciBhPWIudmlkZW9Nb2RlbC5nZXQoInBsYXllckVsZW1lbnQiKTtpZihhKXt0aGlzLk8oYSk7dmFyIGM9YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTtjfHwoYz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7Yz8odGhpcy5SKGMpLGIudmlkZW9Nb2RlbC5vYnNlcnZlKCJwb3NpdGlvbiIsZnVuY3Rpb24oYSl7dGhpcy5ZcT1hfS5iaW5kKHRoaXMpKSxiLnZpZGVvTW9kZWwub2JzZXJ2ZSgiZHVyYXRpb24iLGZ1bmN0aW9uKGEpe3RoaXMuZHVyYXRpb249YX0uYmluZCh0aGlzKSkpOnRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX1lbHNlIHRoaXMuZGEoKX0sQ3M6ZnVuY3Rpb24oYil7dGhpcy5uZD1ifSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wYXVzZSgpfSwKcGxheTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkudmlkZW9Nb2RlbC5wbGF5KCl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWXF9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LEs6ZnVuY3Rpb24oKXtyZXR1cm4idHYyIn0sZWE6ZnVuY3Rpb24oKXt0aGlzLmdldFJhd1BsYXllcigpLnZpZGVvTW9kZWwub2JzZXJ2ZSgicG9zaXRpb24iLGZ1bmN0aW9uKGIpe3RoaXMucGIoYil9LmJpbmQodGhpcykpfSxwYjpmdW5jdGlvbihiKXt0aGlzLmdldFJhd1BsYXllcigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKT5iJiYoYj10aGlzLmdldEN1cnJlbnRUaW1lKCkpO3ZhciBhPXRoaXMuZ2V0RHVyYXRpb24oKTtiJiYwPGImJmEmJjA8YSYmYj49YS0xJiYodGhpcy5KJiZ0aGlzLkooKSx0aGlzLm5kJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5uZCYmKG5ldyBHKHRoaXMsdGhpcy5uZCkpLmIoKSl9fSl9KShjKTt2YXIgTT1jLkRsfHwKTTsoZnVuY3Rpb24oYyl7Yy5DbD10LmV4dGVuZCh7YzpmdW5jdGlvbihiLGEpe3RoaXMuaShiLGEpfSxWYTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoIXRoaXMuQWQpaWYodGhpcy5oYnx8KHRoaXMuaGI9MCksdGhpcy5oYisrLDE1PHRoaXMuaGIpe2lmKHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzJiZ3aW5kb3cuaW1hLmNvbW1vbi5nZXRWaWRlb01ldGFkYXRhJiZ3aW5kb3cuaW1hLmNvbW1vbi50cmlnZ2VyTWVhc3VyYWJsZUV2ZW50KXJldHVybiB0aGlzLk1zKCksITA7dGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpO2IudmlkZW9Nb2RlbC5nZXQoImFkVGFnVXJsIik/dGhpcy5vKCk6dGhpcy5vKCEwKX1lbHNlIGlmKGI9Yi52aWRlb01vZGVsLmdldCgiYWRzTG9hZGVyIikpe3RoaXMuQWQ9ITA7dmFyIGE9ImFkRXJyb3IiO3dpbmRvdy5nb29nbGUmJmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFcnJvckV2ZW50JiYKZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7Yi5hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7dGhpcy5WKGEpO3RoaXMudmEoKXx8KHRoaXMubCgiYWRlcnJvciIsdGhpcy5VKSx0aGlzLm8oKSl9LmJpbmQodGhpcykpfWVsc2Ugd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlZhKCl9LmJpbmQodGhpcyksMTApfSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxWOmZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGEoYSxiKXt2YXIgYz0hMTtpZihhKXtpZigxMDA5PT1hfHwzMDM9PWF8fDQwMz09YSljPSEwO2N8fCFhLmluZGV4T2Z8fC0xPT09YS5pbmRleE9mKCIxMDA5IikmJi0xPT09YS5pbmRleE9mKCIzMDMiKSYmLTE9PT1hLmluZGV4T2YoIjQwMyIpfHwoYz0hMCk7Im51bWJlciI9PXR5cGVvZiBhPyhiLlU9YSxiLmwoImFkZXJyb3IiLAphKSk6Yi5sKCJhZGVycm9yIil9cmV0dXJuIGN9Yi5vcmlnaW5hbEV2ZW50JiYoYj1iLm9yaWdpbmFsRXZlbnQpO2lmKGIuZ2V0RXJyb3ImJiJmdW5jdGlvbiI9PXR5cGVvZiBiLmdldEVycm9yKXt2YXIgYz1iLmdldEVycm9yKCk7aWYoYy5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjLmdldEVycm9yQ29kZSYmYShjLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7cmV0dXJufX1mb3IodmFyIGQgaW4gYilpZihiLmhhc093blByb3BlcnR5KGQpJiZiW2RdJiZiW2RdLmFkRXJyb3ImJmJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiZhKGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO2JyZWFrfX0sYjpmdW5jdGlvbigpe3RoaXMuVT10aGlzLlV8fCExO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5WYSgpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5U3RhdGUiLApmdW5jdGlvbihhKXsicGxheWluZyI9PWEmJih0aGlzLmlzUGxheWluZz0hMCl9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJwbGF5TW9kZSIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJjdXJyZW50QWRTZWdtZW50IixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImlzQWRzUGxheWluZyIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJhZEVycm9yIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzIixmdW5jdGlvbigpe30uYmluZCh0aGlzKSk7Yi52aWRlb01vZGVsLm9ic2VydmUoImFkRXJyb3JzWCIsZnVuY3Rpb24oKXt9LmJpbmQodGhpcykpO2IudmlkZW9Nb2RlbC5vYnNlcnZlKCJOT05fRVZFTlQiLGZ1bmN0aW9uKCl7fS5iaW5kKHRoaXMpKX0sbzpmdW5jdGlvbihiKXt0aGlzLmlzUGxheWluZz8KdGhpcy53KGIpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5vKGIpfS5iaW5kKHRoaXMpLDEwKX19KX0pKGMpO3ZhciBHPWMuQ2x8fEc7KGZ1bmN0aW9uKGMpe2MuRWw9ci5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpO3RoaXMud2E9LTF9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cuaW5zZXJ0ZWRQbGF5ZXIpe3ZhciBiPW5ldyBNKHdpbmRvdy5pbnNlcnRlZFBsYXllcik7Yi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IEcoYix0aGlzLkEpLGIuYigpKX1pZih3aW5kb3cuVFYyUGxheWVycyYmd2luZG93LlRWMlBsYXllcnMubGVuZ3RoKWZvcih2YXIgYT0wO2E8d2luZG93LlRWMlBsYXllcnMubGVuZ3RoO2ErKyliPW5ldyBNKHdpbmRvdy5UVjJQbGF5ZXJzW2FdKSxiLmphfHx0aGlzLkkoYil8fCh0aGlzLkwoYiksYj1uZXcgRyhiLHRoaXMuQSksYi5iKCkpO2Vsc2UgaWYod2luZG93LlRWMlBsYXllcnMpZm9yKGEgaW4gd2luZG93LlRWMlBsYXllcnMpd2luZG93LlRWMlBsYXllcnMuaGFzT3duUHJvcGVydHkoYSkmJgp3aW5kb3cuVFYyUGxheWVyc1thXS52aWRlb01vZGVsJiYoYj1uZXcgTSh3aW5kb3cuVFYyUGxheWVyc1thXSksYi5qYXx8dGhpcy5JKGIpfHwodGhpcy5MKGIpLGIuQ3ModGhpcy5BKSxiPW5ldyBHKGIsdGhpcy5BKSxiLmIoKSkpO3RoaXMuSCgpfX0pfSkoYyk7dmFyIGljPWMuRWx8fGljLGpjPW5ldyBpYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5tcj10aGlzLmFbOV07dGhpcy5UbT10aGlzLmFbMV07dGhpcy5tbz10aGlzLmFbMl07dGhpcy5naz10aGlzLmFbMl07dGhpcy5NbD10aGlzLmFbMV07dGhpcy5LdT10aGlzLmFbN107dGhpcy5xaz10aGlzLmFbMV07dGhpcy5RbT10aGlzLmFbMTBdO3RoaXMuTWc9dGhpcy5hWzNdO3RoaXMuZz10aGlzLmFbNF19Yy5adD1iO2IucHJvdG90eXBlPXtscjpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLm1yOnRoaXMuU20oYSl9LApTbTpmdW5jdGlvbihhKXtyZXR1cm4gMjxhP3RoaXMuVG06dGhpcy5sbyhhKX0sbG86ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLm1vOnRoaXMuZmsoYSl9LGZrOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5nazp0aGlzLkxsKGEpfSxMbDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuTWw6dGhpcy5KdShhKX0sSnU6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8YT90aGlzLkt1OnRoaXMucGsoYSl9LHBrOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5xazp0aGlzLlBtKGEpfSxQbTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLlFtOnRoaXMuTGcoYSl9LExnOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5NZzp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBrYz1jLlp0fHxrYyxtZD1uZXcga2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwKInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9bWQubHIoNCk7KGZ1bmN0aW9uKGMpe2MuT2o9cC5leHRlbmQoe2M6ZnVuY3Rpb24oYil7dGhpcy5pKGIpfSxOOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmR1cmF0aW9uPXRoaXMuVWU9MDtiPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGIuaWQpO3RoaXMuTyhiKTt2YXIgYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdO2F8fChhPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9iamVjdCIpWzBdKTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJlbWJlZCIpWzBdKTthP3RoaXMuUihhKTp0aGlzLmRhKCk7d2luZG93LnNldEludGVydmFsKGZ1bmN0aW9uKCl7dGhpcy5kYXRhKCl9LmJpbmQodGhpcyksNTAwKX0scGF1c2U6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUEFVU0UsCntpZDpiLmlkfSl9LHBsYXk6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2IuZmFjYWRlLnNlbmROb3RpZmljYXRpb24od2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuUkVTVU1FLHtpZDpiLmlkfSl9LGdldEN1cnJlbnRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVWV9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZHVyYXRpb259LGVhOmZ1bmN0aW9uKCl7dGhpcy5nZXREdXJhdGlvbigpO3RoaXMuZ2V0Q3VycmVudFRpbWUoKTt0aGlzLmdldER1cmF0aW9uKCk7dGhpcy5nZXRDdXJyZW50VGltZSgpOzA8dGhpcy5nZXREdXJhdGlvbigpJiYwPHRoaXMuZ2V0Q3VycmVudFRpbWUoKSYmMj50aGlzLmdldER1cmF0aW9uKCktdGhpcy5nZXRDdXJyZW50VGltZSgpJiZ0aGlzLko/KDAsdGhpcy5KKSgpOndpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5lYSgpfS5iaW5kKHRoaXMpLDQwMCl9LGRhdGE6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpOwpiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9USU1FLHt6bjpmdW5jdGlvbihhKXswPGEmJih0aGlzLlVlPWEpfS5iaW5kKHRoaXMpLGlkOmIuaWR9KTtiLmZhY2FkZS5zZW5kTm90aWZpY2F0aW9uKHdpbmRvdy5tdnAuUGxheWVyRmFjYWRlLkdFVF9EQVRBLHt6bjpmdW5jdGlvbihhKXswPGEuZHVyYXRpb24mJih0aGlzLmR1cmF0aW9uPWEuZHVyYXRpb24pfS5iaW5kKHRoaXMpLGlkOmIuaWR9KX0sSzpmdW5jdGlvbigpe3JldHVybiJtdnAifX0pfSkoYyk7dmFyIGxjPWMuT2p8fGxjOyhmdW5jdGlvbihjKXtjLk5qPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LEF2OmZ1bmN0aW9uKCl7fSxsczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCkuZmFjYWRlLGE7YT1uZXcgbXZwLnVlKG5ldyBmdW5jdGlvbigpe30pO2EuVnU9IkhPTUFEX01FRElBVE9SIjthPW5ldyBhO2IubHMoYSk7CndpbmRvdy5jdj1ifSxiOmZ1bmN0aW9uKCl7dGhpcy5rc3x8KHRoaXMua3M9ITApO3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7dGhpcy5EZHx8KHRoaXMuRGQ9MSk7aWYoMjA8dGhpcy5EZCl0aGlzLmwoIm5vZnJhbWV3b3JrIiwiSU1BIiksdGhpcy5vKCEwKTtlbHNle3ZhciBhPSExLGM9YT0hMTtpZihiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmKGE9Yi5mYWNhZGUucmV0cmlldmVNZWRpYXRvcigiVmlkZW9TY3JlZW5NZWRpYXRvcl8iK2IuaWQpKSYmYS5nZXRWaWV3Q29tcG9uZW50JiYoYT1hLmdldFZpZXdDb21wb25lbnQoKSkmJmEuX3NjcmVlbkNsaWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50JiZhLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hJiYoYz1hLl9zY3JlZW5DbGllbnQuX2VsZW1lbnQuaW1hLl9hZHNMb2FkZXIpKXt0aGlzLkhhKGMsYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSk7cmV0dXJufXRoaXMuRGQrKzsKd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmIoKX0uYmluZCh0aGlzKSw1MCl9fSxIYTpmdW5jdGlvbihiKXt2YXIgYT0iYWRFcnJvciIsYz0iYWRzTWFuYWdlckxvYWRlZCIsZD0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZHNNYW5hZ2VyTG9hZGVkRXZlbnQmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVEJiYoYz1nb29nbGUuaW1hLkFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlLkFEU19NQU5BR0VSX0xPQURFRCk7d2luZG93Lmdvb2dsZSYmCmdvb2dsZS5pbWEmJmdvb2dsZS5pbWEuQWRFdmVudCYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUmJmdvb2dsZS5pbWEuQWRFdmVudC5UeXBlLkxPRyYmKGQ9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtiLmFkZEV2ZW50TGlzdGVuZXIoYSxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCl9LmJpbmQodGhpcykpO2IuYWRkRXZlbnRMaXN0ZW5lcihjLGZ1bmN0aW9uKCl7dGhpcy5iZSgpfS5iaW5kKHRoaXMpKTtiLmFkZEV2ZW50TGlzdGVuZXIoZCxmdW5jdGlvbihhKXt0aGlzLlYoYSwhMCk7dGhpcy5XKCEwKX0uYmluZCh0aGlzKSl9LFY6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYShhLGIpe3ZhciBjPSExO2lmKGEpe2lmKDEwMDk9PWF8fDMwMz09YXx8NDAzPT1hKWM9ITA7Y3x8IWEuaW5kZXhPZnx8LTE9PT1hLmluZGV4T2YoIjEwMDkiKSYmLTE9PT1hLmluZGV4T2YoIjMwMyIpJiYtMT09PWEuaW5kZXhPZigiNDAzIil8fChjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJgpiLmwoImFkZXJyb3IiLGEpfXJldHVybiBjfWIub3JpZ2luYWxFdmVudCYmKGI9Yi5vcmlnaW5hbEV2ZW50KTtpZihiLmdldEVycm9yJiYiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXRFcnJvcil7dmFyIGM9Yi5nZXRFcnJvcigpO2lmKGMuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5nZXRFcnJvckNvZGUmJmEoYy5nZXRFcnJvckNvZGUoKSx0aGlzKSl7dGhpcy5xYSgpO3JldHVybn19Zm9yKHZhciBkIGluIGIpaWYoYi5oYXNPd25Qcm9wZXJ0eShkKSYmYltkXSYmYltkXS5hZEVycm9yJiZiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlJiYiZnVuY3Rpb24iPT10eXBlb2YgYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmYShiW2RdLmFkRXJyb3IuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTticmVha319LGJlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRQbGF5ZXIoKS5nZXRSYXdQbGF5ZXIoKSxhPSExLGM9YT0hMTtiLmZhY2FkZSYmYi5mYWNhZGUucmV0cmlldmVNZWRpYXRvciYmCihhPWIuZmFjYWRlLnJldHJpZXZlTWVkaWF0b3IoIlZpZGVvU2NyZWVuTWVkaWF0b3JfIitiLmlkKSkmJmEuZ2V0Vmlld0NvbXBvbmVudCYmKGE9YS5nZXRWaWV3Q29tcG9uZW50KCkpJiZhLl9zY3JlZW5DbGllbnQmJmEuX3NjcmVlbkNsaWVudC5fZWxlbWVudCYmYS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYSYmKGM9YS5fc2NyZWVuQ2xpZW50Ll9lbGVtZW50LmltYS5fYWRzTWFuYWdlcik7Yj0iYWRFcnJvciI7YT0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGI9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGE9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTtjLmFkZEV2ZW50TGlzdGVuZXIoYixmdW5jdGlvbihhKXt0aGlzLlYoYSl9LmJpbmQodGhpcykpO2MuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKX0sdmE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pYX0scWE6ZnVuY3Rpb24oKXt0aGlzLmlhPSEwfSxXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3RoaXMudyhiKX19KX0pKGMpO3ZhciBtYz1jLk5qfHxtYzsoZnVuY3Rpb24oYyl7Yy5Qaj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXtpZih3aW5kb3cubXZwJiZ3aW5kb3cubXZwLlBsYXllckZhY2FkZSYmd2luZG93Lm12cC5QbGF5ZXJGYWNhZGUuZ2V0SW5zdGFuY2UpZm9yKHZhciBiPQpkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJtdnAiKSxhPTA7YTxiLmxlbmd0aDthKyspaWYoYlthXS5pZCl7dmFyIGM9bmV3IGxjKHtpZDpiW2FdLmlkLGZhY2FkZTp3aW5kb3cubXZwLlBsYXllckZhY2FkZS5nZXRJbnN0YW5jZSgpfSk7Yy5qYXx8dGhpcy5JKGMpfHwodGhpcy5MKGMpLChuZXcgbWMoYyx0aGlzLkEpKS5iKCkpfXRoaXMuSCgpfX0pfSkoYyk7dmFyIG5jPWMuUGp8fG5jLG9jPW5ldyBuYyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5EdT10aGlzLmFbOV07dGhpcy55bD10aGlzLmFbN107dGhpcy5lbj10aGlzLmFbOF07dGhpcy5kaT10aGlzLmFbMV07dGhpcy5nPXRoaXMuYVsxXX1jLkFuPWI7Yi5wcm90b3R5cGU9e0N1OmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5EdTp0aGlzLnhsKGEpfSx4bDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMueWw6CnRoaXMuZG4oYSl9LGRuOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5lbjp0aGlzLmNpKGEpfSxjaTpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZGk6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBwYz1jLkFufHxwYyxuZD1uZXcgcGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1uZC5DdSg0KTsoZnVuY3Rpb24oYyl7Yy5Maj1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpLnBsYXllckNvbnRhaW5lcjt0aGlzLk8oYik7dmFyIGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidmlkZW8iKVswXTthfHwoYT1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJvYmplY3QiKVswXSk7dGhpcy5SKGEpO2EmJnRoaXMuTyhhLnBhcmVudE5vZGUpfSwKSzpmdW5jdGlvbigpe3JldHVybiJsYW9sYTEifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5hcGkucGxheSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuYXBpLnBhdXNlKCl9fSl9KShjKTt2YXIgVj1jLkxqfHxWOyhmdW5jdGlvbihjKXtjLktqPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLndmPTA7dGhpcy5VPXRoaXMuVXx8ITE7dGhpcy5nZXRQbGF5ZXIoKTt0aGlzLmlhPXRoaXMuWGI9dGhpcy5WYT10aGlzLnFjPSExO3RoaXMuYWc9Zi5rYigxMCk7dGhpcy5GZigpfSxGZjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7aWYoYi5zdWJQbGF5ZXImJmIuc3ViUGxheWVyLmFkc0ludGVyZmFjZSYmYi5zdWJQbGF5ZXIuYWRzSW50ZXJmYWNlLmFkc0xvYWRlcilyZXR1cm4gdGhpcy5tYT1iLnN1YlBsYXllci5hZHNJbnRlcmZhY2UuYWRzTG9hZGVyLAp0aGlzLkhhKCksITA7dGhpcy53ZisrO2lmKDEwPHRoaXMud2YpdGhpcy5sKCJub2ZyYW1ld29yayIsIklNQSIpLHdpbmRvdy5pbWEmJndpbmRvdy5pbWEuY29tbW9uJiZ3aW5kb3cuaW1hLkltYVNka1NldHRpbmdzP3RoaXMubyghMCk6dGhpcy5vKCk7ZWxzZSByZXR1cm4gd2luZG93LnNldFRpbWVvdXQodGhpcy5GZi5iaW5kKHRoaXMpLDEwMCksITF9LEhhOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5tYTtpZihiKXt2YXIgYT0iYWRFcnJvciIsYz0ibG9nIjt3aW5kb3cuZ29vZ2xlJiZnb29nbGUuaW1hJiZnb29nbGUuaW1hLkFkRXJyb3JFdmVudCYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUiYmKGE9Z29vZ2xlLmltYS5BZEVycm9yRXZlbnQuVHlwZS5BRF9FUlJPUik7d2luZG93Lmdvb2dsZSYmZ29vZ2xlLmltYSYmZ29vZ2xlLmltYS5BZEV2ZW50JiZnb29nbGUuaW1hLkFkRXZlbnQuVHlwZSYmZ29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HJiYKKGM9Z29vZ2xlLmltYS5BZEV2ZW50LlR5cGUuTE9HKTsiZnVuY3Rpb24iIT09dHlwZW9mIGIuYWRkRXZlbnRMaXN0ZW5lcj93aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuSGEoKX0uYmluZCh0aGlzKSwyMCk6KGIuYWRkRXZlbnRMaXN0ZW5lcihhLGZ1bmN0aW9uKGEpe3RoaXMuVihhLCEwKX0uYmluZCh0aGlzKSksYi5hZGRFdmVudExpc3RlbmVyKGMsZnVuY3Rpb24oYSl7dGhpcy5WKGEsITApO3RoaXMubCgiYWRlcnJvciIsdGhpcy5VKTt0aGlzLlcoITApfS5iaW5kKHRoaXMpKSl9ZWxzZSB0aGlzLmhhKCl8fHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5IYSgpfS5iaW5kKHRoaXMpLDIwKX0sVjpmdW5jdGlvbihiKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9ITE7aWYoYSl7aWYoMTAwOT09YXx8MzAzPT1hfHw0MDM9PWEpYz0hMDtjfHwhYS5pbmRleE9mfHwtMT09PWEuaW5kZXhPZigiMTAwOSIpJiYtMT09PWEuaW5kZXhPZigiMzAzIikmJi0xPT09YS5pbmRleE9mKCI0MDMiKXx8CihjPSEwKTsibnVtYmVyIj09dHlwZW9mIGEmJihiLlU9YSxiLmwoImFkZXJyb3IiLGEpKX1yZXR1cm4gY31iLm9yaWdpbmFsRXZlbnQmJihiPWIub3JpZ2luYWxFdmVudCk7aWYoYi5nZXRFcnJvciYmImZ1bmN0aW9uIj09dHlwZW9mIGIuZ2V0RXJyb3Ipe3ZhciBjPWIuZ2V0RXJyb3IoKTtpZihjLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGMuZ2V0RXJyb3JDb2RlJiZhKGMuZ2V0RXJyb3JDb2RlKCksdGhpcykpe3RoaXMucWEoKTtyZXR1cm59fWZvcih2YXIgZCBpbiBiKWlmKGIuaGFzT3duUHJvcGVydHkoZCkmJmJbZF0mJmJbZF0uYWRFcnJvciYmYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSYmImZ1bmN0aW9uIj09dHlwZW9mIGJbZF0uYWRFcnJvci5nZXRFcnJvckNvZGUmJmEoYltkXS5hZEVycm9yLmdldEVycm9yQ29kZSgpLHRoaXMpKXt0aGlzLnFhKCk7YnJlYWt9fSx2YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlhfSxxYTpmdW5jdGlvbigpe3RoaXMuaWE9ITB9LApXOmZ1bmN0aW9uKGIpe3dpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy52YSgpPyh0aGlzLm0oKSx0aGlzLm5hKCkpOnRoaXMubyhiKX0uYmluZCh0aGlzKSwxMDApfSxvOmZ1bmN0aW9uKGIpe3ZhciBhPXRoaXMuZ2V0UGxheWVyKCkuZ2V0UmF3UGxheWVyKCk7YS5hcGkucGxheWVkJiZhLmFwaS5wbGF5ZWQoKT90aGlzLncoYik6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oYil9LmJpbmQodGhpcyksMTApfX0pfSkoYyk7dmFyIFc9Yy5Lanx8VzsoZnVuY3Rpb24oYyl7Yy5Naj1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj0hMTtpZih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZSYmd2luZG93LmwxUGxheWVySW5zdGFuY2UubGVuZ3RoJiYwPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aClmb3IodmFyIGE9MDthPHdpbmRvdy5sMVBsYXllckluc3RhbmNlLmxlbmd0aDthKyspYj1uZXcgVih3aW5kb3cubDFQbGF5ZXJJbnN0YW5jZVswXSksCnRoaXMuSShiKXx8KHRoaXMuTChiKSxiPW5ldyBXKGIsdGhpcy5BKSxiLmIoKSk7ZWxzZSB3aW5kb3cucGxheWVyJiZ3aW5kb3cucGxheWVyLmFwaSYmd2luZG93LnBsYXllci5sMVBsYXllciYmKGI9bmV3IFYod2luZG93LnBsYXllciksdGhpcy5JKGIpfHwodGhpcy5MKGIpLGI9bmV3IFcoYix0aGlzLkEpLGIuYigpKSk7dGhpcy5IKCl9fSl9KShjKTt2YXIgcWM9Yy5Nanx8cWMscmM9bmV3IHFjKHEpO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTt0aGlzLk1yPXRoaXMuYVsxMF07dGhpcy5ZdD10aGlzLmFbOF07dGhpcy5Ebz10aGlzLmFbMTBdO3RoaXMuUmg9dGhpcy5hWzldO3RoaXMuRmo9dGhpcy5hWzZdO3RoaXMueG49dGhpcy5hWzddO3RoaXMuZz10aGlzLmFbOF19Yy5SbT1iO2IucHJvdG90eXBlPXtMcjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuTXI6dGhpcy5YdChhKX0sWHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIDI8CmE/dGhpcy5ZdDp0aGlzLkNvKGEpfSxDbzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuRG86dGhpcy5RaChhKX0sUWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDc8YT90aGlzLlJoOnRoaXMuRWooYSl9LEVqOmZ1bmN0aW9uKGEpe3JldHVybiA2PGE/dGhpcy5Gajp0aGlzLnduKGEpfSx3bjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMueG46dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiAyPGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBzYz1jLlJtfHxzYyxvZD1uZXcgc2MoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1vZC5Mcig0KTsoZnVuY3Rpb24oYyl7Yy5BaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO2I/KGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYi5wbGF5ZXJQcmVmaXgpKT8KKHRoaXMuTyhiKSwoYj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ2aWRlbyIpWzBdKT90aGlzLlIoYik6dGhpcy5kYSgpKTp0aGlzLmRhKCk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7dGhpcy5pc1BsYXlpbmcoKSYmYi5wYXVzZSgpfSxwbGF5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTt0aGlzLmlzUGxheWluZygpfHxiLnBsYXkoKX0sTmM6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmF1dG9wbGF5P2IuYXV0b3BsYXk6ITF9LGlzUGxheWluZzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0UmF3UGxheWVyKCk7cmV0dXJuInVuZGVmaW5lZCI9PT10eXBlb2YgYi5pc1BhdXNlZD8hMTpiLmlzUGF1c2VkPyExOiEwfSxpc0Z1bGxzY3JlZW46ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLmlzRnVsbHNjcmVlbj9iLmlzRnVsbHNjcmVlbjohMX0sCmdldER1cmF0aW9uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5nZXRSYXdQbGF5ZXIoKTtyZXR1cm4gYi52aWRlb2luZm8uZHVyYXRpb24/Yi52aWRlb2luZm8uZHVyYXRpb246MH0sZ2V0Q3VycmVudFRpbWU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFJhd1BsYXllcigpO3JldHVybiBiLnZpZGVvaW5mby5wbGF5aGVhZD9iLnZpZGVvaW5mby5wbGF5aGVhZDowfSxleGl0RnVsbHNjcmVlbjpmdW5jdGlvbigpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cudHBFeGl0RnVsbHNjcmVlbiYmd2luZG93LnRwRXhpdEZ1bGxzY3JlZW4oKX0sSzpmdW5jdGlvbigpe3JldHVybiJGT1hORU9QbGF5ZXIifX0pfSkoYyk7dmFyIHRjPWMuQWl8fHRjOyhmdW5jdGlvbihjKXtjLnppPXQuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIsYSl7dGhpcy5pKGIsYSl9LGI6ZnVuY3Rpb24oKXt0aGlzLmdldFBsYXllcigpLmdldFJhd1BsYXllcigpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhTG9hZFN0YXJ0IiwKZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0IixmdW5jdGlvbigpe30pOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsZnVuY3Rpb24oKXt9KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYUxvYWRTdGFydCIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25NZWRpYVN0YXJ0Iix0aGlzLnRlc3QpOyRwZGsuY29udHJvbGxlci5hZGRFdmVudExpc3RlbmVyKCJPbk1lZGlhUGxheWluZyIsdGhpcy50ZXN0KTskcGRrLmNvbnRyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigiT25DbGVhckN1cnJlbnRSZWxlYXNlIix0aGlzLnRlc3QpO3dpbmRvdy5GRE1fUGxheWVyX3ZhcnMuYWRwZGV0ZWN0ZWQmJih0aGlzLmwoImFkZXJyb3IiLCJ1c2luZ0FkQmxvY2tpbmdTb2Z0d2FyZSIpLHRoaXMubygpKX0sdGVzdDpmdW5jdGlvbigpe30sCm86ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldFBsYXllcigpO2IuaXNQbGF5aW5nKCk/KGIucGF1c2UoKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLm8oKX0uYmluZCh0aGlzKSwxMDApfX0pfSkoYyk7dmFyIHVjPWMueml8fHVjOyhmdW5jdGlvbihjKXtjLkJpPXIuZXh0ZW5kKHtjOmZ1bmN0aW9uKGIpe3RoaXMuaShiKX0sYjpmdW5jdGlvbigpe3RoaXMud2E9MTUwMDtpZih3aW5kb3cuRk9YTkVPX1BsYXllciYmd2luZG93LkZPWE5FT19QbGF5ZXIucGxheWVycyYmMDxmLkRhKHdpbmRvdy5GT1hORU9fUGxheWVyLnBsYXllcnMpKWZvcih2YXIgYj13aW5kb3cuRk9YTkVPX1BsYXllci5wbGF5ZXJzLGE9Yi5sZW5ndGgsYz0wO2M8YTtjKyspe3ZhciBkPWJbY107aWYoZC52YXJzLmlzUmVhZHkpZD1uZXcgdGMoZCksZC5qYXx8dGhpcy5JKGQpfHwodGhpcy5MKGQpLChuZXcgdWMoZCx0aGlzLkEpKS5iKCkpO2Vsc2UgYnJlYWt9dGhpcy5IKCl9fSl9KShjKTsKdmFyIHZjPWMuQml8fHZjLHdjPW5ldyB2YyhxKTtjPWN8fHt9OyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5hPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5Iaj10aGlzLmFbMTBdO3RoaXMuUnA9dGhpcy5hWzddO3RoaXMucnE9dGhpcy5hWzldO3RoaXMuZmw9dGhpcy5hWzldO3RoaXMuS2k9dGhpcy5hWzRdO3RoaXMuSnQ9dGhpcy5hWzFdO3RoaXMuZz10aGlzLmFbOF19Yy5SdT1iO2IucHJvdG90eXBlPXtHajpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuSGo6dGhpcy5RcChhKX0sUXA6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlJwOnRoaXMucXEoYSl9LHFxOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5ycTp0aGlzLmRsKGEpfSxkbDpmdW5jdGlvbihhKXtyZXR1cm4gOTxhP3RoaXMuZmw6dGhpcy5KaShhKX0sSmk6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLktpOnRoaXMuSXQoYSl9LEl0OmZ1bmN0aW9uKGEpe3JldHVybiAxPAphP3RoaXMuSnQ6dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA1PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciB4Yz1jLlJ1fHx4YyxwZD1uZXcgeGMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1wZC5Haig0KTsoZnVuY3Rpb24oYyl7Yy5IaT1wLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LE46ZnVuY3Rpb24oKXt2YXIgYj0hMSxhPSExO3RyeXtiPXRoaXMuZ2V0UmF3UGxheWVyKClbMF0ucGFyZW50Tm9kZSxhPXRoaXMuZ2V0UmF3UGxheWVyKClbMF19Y2F0Y2goYyl7fWImJmE/KHRoaXMuTyhiKSx0aGlzLlIoYSksdGhpcy5nZXRSYXdQbGF5ZXIoKSk6dGhpcy5kYSgpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuZ2V0UmF3UGxheWVyKCkuY3NzKCJkaXNwbGF5Iiwibm9uZSIpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5nZXRSYXdQbGF5ZXIoKS5jc3MoImRpc3BsYXkiLAoiYmxvY2siKX0sSzpmdW5jdGlvbigpe3JldHVybiJHQU5WaWRlbyJ9fSl9KShjKTt2YXIgeWM9Yy5IaXx8eWM7KGZ1bmN0aW9uKGMpe2MuR2k9dC5leHRlbmQoe2M6ZnVuY3Rpb24oYixhKXt0aGlzLmkoYixhKX0sYjpmdW5jdGlvbigpe3RoaXMuUGUoKX0sUGU6ZnVuY3Rpb24oYil7d2luZG93LkdBTl9WaWRlb3x8KGI/KHRoaXMubCgibm9mcmFtZXdvcmsiLCJJTUEiKSx0aGlzLncoKSk6d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLlBlKCEwKX0uYmluZCh0aGlzKSwxMDApKX19KX0pKGMpO3ZhciB6Yz1jLkdpfHx6YzsoZnVuY3Rpb24oYyl7Yy5JaT1yLmV4dGVuZCh7YzpmdW5jdGlvbihiKXt0aGlzLmkoYil9LGI6ZnVuY3Rpb24oKXt2YXIgYj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZ2FtZSIpO2lmKGImJiJESVYiPT1iLm5vZGVOYW1lJiZ3aW5kb3cudmlkZW9hZF9nYW5fc3RhcnQmJndpbmRvdy4kJiZ3aW5kb3cuJCgiZGl2I2dhbWUiKSl7Yj1uZXcgeWMod2luZG93LiQoImRpdiNnYW1lIikpOwppZihiLmphKXt0aGlzLkgoKTtyZXR1cm59aWYoIXRoaXMuSShiKSl7dGhpcy5MKGIpOyhuZXcgemMoYix0aGlzLkEpKS5iKCk7dGhpcy5IKCk7cmV0dXJufX10aGlzLkgoKX19KX0pKGMpO3ZhciBBYz1jLklpfHxBYyxCYz1uZXcgQWMocSk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuSHQ9dGhpcy5hWzZdO3RoaXMuZm09dGhpcy5hWzRdO3RoaXMud289dGhpcy5hWzRdO3RoaXMucGo9dGhpcy5hWzldO3RoaXMuRms9dGhpcy5hWzFdO3RoaXMuY2w9dGhpcy5hWzZdO3RoaXMuVmg9dGhpcy5hWzZdO3RoaXMuWG49dGhpcy5hWzNdO3RoaXMuYmk9dGhpcy5hWzRdO3RoaXMuZz10aGlzLmFbNV19Yy5YaT1iO2IucHJvdG90eXBlPXtHdDpmdW5jdGlvbihhKXtyZXR1cm4gMzxhP3RoaXMuSHQ6dGhpcy5lbShhKX0sZW06ZnVuY3Rpb24oYSl7cmV0dXJuIDM8YT90aGlzLmZtOnRoaXMudm8oYSl9LAp2bzpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMud286dGhpcy5vaihhKX0sb2o6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLnBqOnRoaXMuRWsoYSl9LEVrOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Gazp0aGlzLmJsKGEpfSxibDpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuY2w6dGhpcy5VaChhKX0sVWg6ZnVuY3Rpb24oYSl7cmV0dXJuIDg8YT90aGlzLlZoOnRoaXMuV24oYSl9LFduOmZ1bmN0aW9uKGEpe3JldHVybiAzPGE/dGhpcy5Ybjp0aGlzLmFpKGEpfSxhaTpmdW5jdGlvbihhKXtyZXR1cm4gMTA8YT90aGlzLmJpOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMuZzphfX19KShjKTt2YXIgQ2M9Yy5YaXx8Q2MscWQ9bmV3IENjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsImwta2V5IiwhMSxNYXRoLmFicygtMSksInRmIiwiWihUVERaVFJSIik7d2luZG93LnY9cWQuR3QoNCk7Yz1jfHx7fTsKKGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLkhmPXRoaXMuS2Y9dGhpcy5KZj0hMTt0aGlzLlVjPVtdO3RoaXMuJGQ9e0dBTlZpZGVvOiJ1bmRlZmluZWQiPT09dHlwZW9mIEJjP251bGw6QmMsbGFvbGExUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHJjP251bGw6cmMsdG9ubGluZToidW5kZWZpbmVkIj09PXR5cGVvZiBIYT9udWxsOkhhLFZpZGVvSlM6InVuZGVmaW5lZCI9PT10eXBlb2YgQ2E/bnVsbDpDYSxiaXRtb3ZpbjoidW5kZWZpbmVkIj09PXR5cGVvZiBCaXRtb3ZpbkRldGVjdGlvbj9udWxsOkJpdG1vdmluRGV0ZWN0aW9uLE5pY2tHYW1lTG9hZGVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIFJhP251bGw6UmEsb3ZWaWRlbzoidW5kZWZpbmVkIj09PXR5cGVvZiBXYT9udWxsOldhLFJhZGlhbnRNUDoidW5kZWZpbmVkIj09PXR5cGVvZiBkYz9udWxsOmRjLGp3OiJ1bmRlZmluZWQiPT09dHlwZW9mIHNhP251bGw6c2EsdHYyOiJ1bmRlZmluZWQiPT09dHlwZW9mIGpjPwpudWxsOmpjLHRmbXN1aXRlUGxheWVyOiJ1bmRlZmluZWQiPT09dHlwZW9mIHk/bnVsbDp5LG5leHRQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgZ2M/bnVsbDpnYyxiaWxkTWVkaWFQbGF5ZXI6InVuZGVmaW5lZCI9PT10eXBlb2YgRmI/bnVsbDpGYixTaW1wbGVWaWRlb0FuZEltYToidW5kZWZpbmVkIj09PXR5cGVvZiBVYj9udWxsOlViLG12cDoidW5kZWZpbmVkIj09PXR5cGVvZiBvYz9udWxsOm9jLE9veWFsYToidW5kZWZpbmVkIj09PXR5cGVvZiB3Yj9udWxsOndiLEZPWE5FT1BsYXllcjoidW5kZWZpbmVkIj09PXR5cGVvZiB3Yz9udWxsOndjLFJvY2tlcnk6InVuZGVmaW5lZCI9PT10eXBlb2YgWmI/bnVsbDpaYixoaXRib3g6InVuZGVmaW5lZCI9PT10eXBlb2YgYWI/bnVsbDphYixpblJlYWQ6InVuZGVmaW5lZCI9PT10eXBlb2YgZmI/bnVsbDpmYixLYWx0dXJhOiJ1bmRlZmluZWQiPT09dHlwZW9mIFBiP251bGw6UGIsd2Z2NDoidW5kZWZpbmVkIj09PXR5cGVvZiBLYj8KbnVsbDpLYixYT1pDT006InVuZGVmaW5lZCI9PT10eXBlb2YgeGE/bnVsbDp4YSxCQ0ZsYXNoT25seToidW5kZWZpbmVkIj09PXR5cGVvZiBNYT9udWxsOk1hLERlbW9WaWRlb0pTOiJ1bmRlZmluZWQiPT09dHlwZW9mIG5hP251bGw6bmF9fWMuT2s9YjtiLnByb3RvdHlwZT17YjpmdW5jdGlvbigpe3ZhciBhPVtdLGE9YS5sZW5ndGg/dGhpcy5rcChhKTpbXSxiO3RoaXMuS2Y9ITA7aWYoYS5sZW5ndGgpe3RoaXMuSmY9ITA7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYj1hW2NdLHRoaXMuZGcoYil9ZWxzZSBmb3IoYyBpbiB0aGlzLiRkKXtpZih0aGlzLkhmKWJyZWFrO2I9dGhpcy4kZFtjXTt0aGlzLm9lKGIpJiYodGhpcy5VYy5wdXNoKGIpLHRoaXMuZGcoYikpfX0sb2U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEgaW5zdGFuY2VvZiByPyEwOiExfSxrcDpmdW5jdGlvbihhKXt2YXIgYj1bXSxjO2lmKCFhfHwhYS5sZW5ndGgpcmV0dXJuIGI7Zm9yKHZhciBlPTA7ZTxhLmxlbmd0aDtlKyspYz0KYVtlXSxjPXRoaXMuJGRbY10sdGhpcy5vZShjKSYmYi5wdXNoKGMpO3JldHVybiBifSxkZzpmdW5jdGlvbihhKXt0aGlzLm9lKGEpJiZhLmIoKX0sWXM6ZnVuY3Rpb24oYSl7aWYoYSYmYSBpbnN0YW5jZW9mIHAmJiF0aGlzLkpmKWZvcih0aGlzLkhmPSEwLGE9MDthPHRoaXMuVWMubGVuZ3RoO2ErKyl0aGlzLlVjW2FdLnFiJiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuVWNbYV0ucWIpfX19KShjKTt2YXIgRGM9Yy5Pa3x8RGMsSz1uZXcgRGM7Sy5iKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuUnI9dGhpcy5hWzZdO3RoaXMuTnA9dGhpcy5hWzEwXTt0aGlzLlpuPXRoaXMuYVszXTt0aGlzLlhxPXRoaXMuYVsxXTt0aGlzLkRrPXRoaXMuYVs4XTt0aGlzLm9vPXRoaXMuYVsxMF07dGhpcy5nPXRoaXMuYVsxMF19Yy50aD1iO2IucHJvdG90eXBlPXtRcjpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLlJyOnRoaXMuTXAoYSl9LE1wOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5OcDp0aGlzLlluKGEpfSxZbjpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMuWm46dGhpcy5XcShhKX0sV3E6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLlhxOnRoaXMuQ2soYSl9LENrOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy5Eazp0aGlzLm5vKGEpfSxubzpmdW5jdGlvbihhKXtyZXR1cm4gNDxhP3RoaXMub286dGhpcy5mKGEpfSxmOmZ1bmN0aW9uKGEpe3JldHVybiA0PGE/dGhpcy5nOmF9fX0pKGMpO3ZhciBFYz1jLnRofHxFYyxyZD1uZXcgRWMoMSxuZXcgRGF0ZSwyLE1hdGgucmFuZG9tKCksInRydWUiLG5hdmlnYXRvciwibC1rZXkiLCExLE1hdGguYWJzKC0xKSwidGYiLCJaKFRURFpUUlIiKTt3aW5kb3cudj1yZC5Rcig0KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLGZ1bmN0aW9uKGMpe2lmKGMuZXJyb3IgaW5zdGFuY2VvZiBSZWZlcmVuY2VFcnJvcil7dmFyIGI9CmMuZmlsZW5hbWU/Yy5maWxlbmFtZToiIjtpZigtMSE9Yi5pbmRleE9mKCJob21hZCIpfHwtMSE9Yi5pbmRleE9mKCJoZC1tYWluIikpYj1jLm1lc3NhZ2U/Yy5tZXNzYWdlOiIiLGM9Yy5lcnJvci5zdGFjaz9jLmVycm9yLnN0YWNrOiIiLC0xIT1iLmluZGV4T2YoImlzIG5vdCBkZWZpbmVkIik/KGM9Yi5zdWJzdHJpbmcoYi5pbmRleE9mKCI6IikrMSxiLmluZGV4T2YoImlzIG5vdCIpLTEpLGYuVGIobC5UdCksZi50cmFjaygic3RhdHNfaGRfdmFyZGVsZXRlZCIsYywhMCkpOi0xIT1jLmluZGV4T2YoInNldEAiKSYmKGYuVGIobC5hciksZi50cmFjaygic3RhdHNfaGRfdmFybm90c2V0IiwiIiwhMCkpfX0pO3ZhciBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO0Uud2lkdGg9MTtFLmhlaWdodD0xO0Uuc3R5bGUuZGlzcGxheT0ibm9uZSI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChFKTt2YXIgc2Q9RS5jb250ZW50V2luZG93LnNldEludGVydmFsLmJpbmQod2luZG93KSwKYmE9RS5jb250ZW50V2luZG93LnNldFRpbWVvdXQuYmluZCh3aW5kb3cpO2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoRSk7dmFyIEY9bmV3IGdhLGs9ITE7Ri5NYygpO0YuQmYoKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihGLk1jKCksZnVuY3Rpb24oYyl7a3x8KGs9Yy5kZXRhaWwpfSwhMSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRi5CZigpLGZ1bmN0aW9uKGMpe2t8fChrPWMuZGV0YWlsKX0sITEpO0YuTWMoKTt2YXIgdGQ9c2QoZnVuY3Rpb24oKXtmLmZpcmVFdmVudCh3aW5kb3csRi5icSgpLHtpZDp0ZH0pfSw1MDApO2FhKCk7Yz1jfHx7fTsoZnVuY3Rpb24oYyl7ZnVuY3Rpb24gYigpe3RoaXMuYT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMuYXU9dGhpcy5hWzJdO3RoaXMudnE9dGhpcy5hWzJdO3RoaXMub2k9dGhpcy5hWzVdO3RoaXMuVXE9dGhpcy5hWzVdO3RoaXMuZz10aGlzLmFbMl19Yy51dD1iO2IucHJvdG90eXBlPXskdDpmdW5jdGlvbihhKXtyZXR1cm4gNDwKYT90aGlzLmF1OnRoaXMudXEoYSl9LHVxOmZ1bmN0aW9uKGEpe3JldHVybiA3PGE/dGhpcy52cTp0aGlzLm5pKGEpfSxuaTpmdW5jdGlvbihhKXtyZXR1cm4gODxhP3RoaXMub2k6dGhpcy5UcShhKX0sVHE6ZnVuY3Rpb24oYSl7cmV0dXJuIDEwPGE/dGhpcy5VcTp0aGlzLmYoYSl9LGY6ZnVuY3Rpb24oYSl7cmV0dXJuIDk8YT90aGlzLmc6YX19fSkoYyk7dmFyIEZjPWMudXR8fEZjLHVkPW5ldyBGYygxLG5ldyBEYXRlLDIsTWF0aC5yYW5kb20oKSwidHJ1ZSIsbmF2aWdhdG9yLCJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXVkLiR0KDQpOyhmdW5jdGlvbihjKXtmdW5jdGlvbiBiKCl7dGhpcy5aZj10aGlzLmNvbmY9dGhpcy5VYT10aGlzLnBsYXllcj1udWxsO3RoaXMuUGM9MDt0aGlzLkxhPSIiO3RoaXMuVmM9W107dGhpcy5XYz0wO3RoaXMuJGY9ITE7dGhpcy5ZZD1bXX1jLk5nPWI7Yi5wcm90b3R5cGU9e0pzOmZ1bmN0aW9uKGEpe3RoaXMuWmY9CmF9LFljOmZ1bmN0aW9uKGEpe3RoaXMucGxheWVyPWE7dGhpcy5MYT10aGlzLnBsYXllci5LKCl9LGdldFBsYXllcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXllcn0sRXM6ZnVuY3Rpb24oYSl7dGhpcy5VYT1hfSxEczpmdW5jdGlvbihhKXt0aGlzLmNvbmY9YX0sdGE6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcy5jb25mW2FdO3RoaXMuY29uZlt0aGlzLkxhXSYmdGhpcy5jb25mW3RoaXMuTGFdW2FdJiYoYj10aGlzLmNvbmZbdGhpcy5MYV1bYV0pO3JldHVybiBifSxiYzpmdW5jdGlvbihhLGIpe2YuaWIoIndlbHQuZGUiKSYmZi5ZYSgiaHR0cHM6Ly9hc3YubnVnZ2FkLm5ldC9iaz9udWdnbj0xNTY5OTA1MTAyJm51Z2dzaWQ9MTk4MjIxNzU1MCZudWdncmlkPSIrZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uLmhyZWYpKyImbnVnZ2w9aHR0cHMlM0ElMkYlMkZ3dzI1MS5zbWFydGFkc2VydmVyLmNvbSUyRnRyYWNrJTJGY29tcC5hc3AlM0ZrZXl3b3JkJTNETlVHR1ZBUlMlMjZzaXRlJTNEODUxNDUiLAoibmV0bnVnZ2FkYXN2Iix7fSxmdW5jdGlvbigpe30sZnVuY3Rpb24oKXt9LHRoaXMuVWEpO3ZhciBjPSExLGU9ITE7aWYodGhpcy5mcSgpKXRoaXMuVWEuYyh0aGlzLlVhLkpjLHRoaXMuVWEuemEsdGhpcy5VYS5aZCxmdW5jdGlvbigpe3RoaXMuYmMoYSxiKX0uYmluZCh0aGlzKSx0aGlzLlVhLkJjKTtlbHNlIGlmKHRoaXMuQXAoKSl0aGlzLnZzKGZ1bmN0aW9uKCl7dGhpcy5iYyhhLGIpfS5iaW5kKHRoaXMpKTtlbHNle3RoaXMucGxheWVyLnBhdXNlKCk7Zi5EKGwueWMsdGhpcy5wbGF5ZXIuQigpKTt2YXIgaD10aGlzLmNvbmYsaz1uZXcgTih0aGlzLmdldFBsYXllcigpLGgpO2ImJmsuJHMoKTtrLmV4aXRGdWxsc2NyZWVuKCk7UT1rPW5ldyBPKGssdGhpcy5VYSxoKTtrLmdnKHRoaXMuY29uZik7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBhKXt2YXIgbT0hMTt0aGlzLnBsYXllci5nZXRSYXdQbGF5ZXImJihtPXRoaXMucGxheWVyLmdldFJhd1BsYXllcigpKTthPWEobSl9YT10aGlzLk5xKGEpOwoiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5wbGF5ZXIuSGQmJihjPXRoaXMucGxheWVyLkhkKCkpO2guYWRTdGFydFRpbWVvdXQmJihlPXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7fSxoLmFkU3RhcnRUaW1lb3V0fHw1RTQpKTtrLkpkKGEsYyxlKTt0aGlzLnBsYXllci5oZyhrKX19LGZxOmZ1bmN0aW9uKCl7dmFyIGE9bmV3IERhdGUsYj0wO2lmKHRoaXMuUGMpcmV0dXJuIGI9YS5nZXRUaW1lKCktdGhpcy5QYy5nZXRUaW1lKCksdGhpcy5QYz1hLDNFNTxiPyEwOiExO3RoaXMuUGM9YTtyZXR1cm4hMX0sUnM6ZnVuY3Rpb24oKXtmLmVlKCJwcmVyb2xsIik7dmFyIGE9dGhpcy50YSgiYWRUYWciKTt0aGlzLnRhKCJwcmVyb2xsQWRUYWciKSYmKGE9dGhpcy50YSgicHJlcm9sbEFkVGFnIikpOyhhPXRoaXMuYWYoYSkpP3RoaXMuYmMoYSk6KHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLnBsYXllci5wbGF5KCl9LmJpbmQodGhpcyksMCksZi5EKGwuemMsdGhpcy5wbGF5ZXIuQigpKSl9LApRczpmdW5jdGlvbihhKXtmLmVlKCJwb3N0cm9sbCIpO2lmKCF0aGlzLlpmKXt0aGlzLkpzKCEwKTt2YXIgYj10aGlzLmNvbmYsYz10aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoInBvc3Ryb2xsQWRUYWciKSYmKGM9dGhpcy50YSgicG9zdHJvbGxBZFRhZyIpKTsoYz10aGlzLmFmKGMpKT90aGlzLmJjKGMsYi5wb3N0cm9sbFVzZUNvbXBsZXRlRXZlbnQ/ITA6YSk6KHRoaXMucGxheWVyLnBsYXkoKSxmLkQobC56Yyx0aGlzLnBsYXllci5CKCkpKX19LGFmOmZ1bmN0aW9uKGEpe2lmKCJmdW5jdGlvbiI9PT10eXBlb2YgYSl7dmFyIGI9ITE7dGhpcy5wbGF5ZXIuZ2V0UmF3UGxheWVyJiYoYj10aGlzLnBsYXllci5nZXRSYXdQbGF5ZXIoKSk7YT1hKGIpfXJldHVybiBhfSxuczpmdW5jdGlvbigpe3RoaXMucGxheWVyLk9zKHRoaXMuUXMuYmluZCh0aGlzKSk7dGhpcy5wbGF5ZXIuZWEoKX0sJGM6ZnVuY3Rpb24oYSl7Zi5lZSgibWlkcm9sbCIpO2lmKCF0aGlzLk9mKXt0aGlzLk9mPSEwO3ZhciBiPQp0aGlzLnRhKCJhZFRhZyIpO3RoaXMudGEoIm1pZHJvbGxBZFRhZyIpJiYoYj10aGlzLnRhKCJtaWRyb2xsQWRUYWciKSk7Yj8odGhpcy5iYyhiLGEpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5PZj0hMX0uYmluZCh0aGlzKSwxRTMpKToodGhpcy5wbGF5ZXIucGxheSgpLGYuRChsLnpjLHRoaXMucGxheWVyLkIoKSkpfX0sbXM6ZnVuY3Rpb24oKXt0aGlzLnBsYXllci5Jcyh0aGlzLiRjLmJpbmQodGhpcykpO3RoaXMucGxheWVyLk5kKCl9LGI6ZnVuY3Rpb24oKXt0aGlzLlJzKCk7dGhpcy5wbGF5ZXIuTmQmJnRoaXMubXMoKTt0aGlzLm5zKCl9LG9zOmZ1bmN0aW9uKCl7dmFyIGE9W107aWYodGhpcy5jb25mLnlpZWxkbGFiKXt0aGlzLmNvbmYueWllbGRsYWJbMF0/YT10aGlzLmNvbmYueWllbGRsYWI6YVswXT10aGlzLmNvbmYueWllbGRsYWI7Zm9yKHZhciBiPTA7YjxhLmxlbmd0aDtiKyspKGZ1bmN0aW9uKGEsYixjLGcpe3RoaXMuVmMucHVzaCh7ImZ1bmN0aW9uIjpmdW5jdGlvbihmKXt0aGlzLkl1KGEsCmIsYyxnLGYpfS5iaW5kKGYpfSl9KS5jYWxsKHRoaXMsYVtiXS51cmwsYVtiXS5wbGFjZWhvbGRlcixhW2JdLmFsaWFzLGFbYl0ubWFjcm8pfXRoaXMuV2M9dGhpcy5WYy5sZW5ndGh9LEFwOmZ1bmN0aW9uKCl7dmFyIGE9ITE7MDx0aGlzLldjJiYoYT0hMCk7cmV0dXJuIGF9LHZzOmZ1bmN0aW9uKGEpe3RoaXMuJGY9YTtmb3IoYT0wO2E8dGhpcy5WYy5sZW5ndGg7YSsrKXRoaXMuVmNbYV1bImZ1bmN0aW9uIl0odGhpcy5kcy5iaW5kKHRoaXMpKX0sZHM6ZnVuY3Rpb24oYSl7dGhpcy5XYy0tO2EmJnRoaXMuWWQucHVzaChhKTswPj10aGlzLldjJiZ0aGlzLiRmKCl9LE5xOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7Yzx0aGlzLllkLmxlbmd0aDtjKyspYj10aGlzLllkW2NdLGE9YS5yZXBsYWNlKGIubWFjcm8sYi5wbGFjZWhvbGRlcik7cmV0dXJuIGF9fX0pKGMpO3ZhciBkYT1jLk5nfHxkYSxRPSExLGphPSExO2M9Y3x8e307KGZ1bmN0aW9uKGMpe2Z1bmN0aW9uIGIoKXt0aGlzLmE9CkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7dGhpcy5ybj10aGlzLmFbNV07dGhpcy5Vcz10aGlzLmFbNV07dGhpcy5hbj10aGlzLmFbMl07dGhpcy5vbT10aGlzLmFbNl07dGhpcy5Gcj10aGlzLmFbNF07dGhpcy5nPXRoaXMuYVs4XX1jLnRuPWI7Yi5wcm90b3R5cGU9e3FuOmZ1bmN0aW9uKGEpe3JldHVybiAxMDxhP3RoaXMucm46dGhpcy5UcyhhKX0sVHM6ZnVuY3Rpb24oYSl7cmV0dXJuIDQ8YT90aGlzLlVzOnRoaXMuJG0oYSl9LCRtOmZ1bmN0aW9uKGEpe3JldHVybiA4PGE/dGhpcy5hbjp0aGlzLm5tKGEpfSxubTpmdW5jdGlvbihhKXtyZXR1cm4gNjxhP3RoaXMub206dGhpcy5FcihhKX0sRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIDE8YT90aGlzLkZyOnRoaXMuZihhKX0sZjpmdW5jdGlvbihhKXtyZXR1cm4gNTxhP3RoaXMuZzphfX19KShjKTt2YXIgR2M9Yy50bnx8R2MsdmQ9bmV3IEdjKDEsbmV3IERhdGUsMixNYXRoLnJhbmRvbSgpLCJ0cnVlIixuYXZpZ2F0b3IsCiJsLWtleSIsITEsTWF0aC5hYnMoLTEpLCJ0ZiIsIlooVFREWlRSUiIpO3dpbmRvdy52PXZkLnFuKDQpfSkuY2FsbChQaWV4dXVwaGVoYXBob2hWLFBpZXh1dXBoZWhhcGhvaFYpOwo=
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
188.40.138.133 , Germany, ASN24940 (HETZNER-AS, DE),
Reverse DNS
static.133.138.40.188.clients.your-server.de
Software
TornadoServer/4.5.3 /
Resource Hash
9326b813f05efe1ac285085eef770b1036f77bdbbedf69f79eb83b35a121040c

Request headers

Pragma
no-cache
Origin
https://www.golem.de
Accept-Encoding
gzip, deflate
Host
ssl.1.damoh.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-type
application/x-www-form-urlencoded
Accept
*/*
Cache-Control
no-cache
Referer
https://www.golem.de/
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CMCMID%7C15357430983173705843568274022634328354%7CMCAAMLH-1534012601%7C9%7CMCAAMB-1534012601%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1533415001s%7CNONE%7CMCSYNCSOP%7C411-17755%7CvVersion%7C3.2.0
Connection
keep-alive
Content-Length
371
Referer
https://www.golem.de/
Origin
https://www.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Content-type
application/x-www-form-urlencoded

Response headers

Date
Sat, 04 Aug 2018 18:36:41 GMT
Server
TornadoServer/4.5.3
Vary
Accept-Encoding
Access-Control-Allow-Methods
GET, POST, OPTIONS
Content-Type
application/json; charset=UTF-8
Access-Control-Allow-Origin
https://www.golem.de
Access-Control-Expose-Headers
X-Homad-Instance, X-Homad-Long-Ad-Ignored, X-Homad-Sig, X-Homad-Url, X-Homad-Vpaid-Ignored, X-Homad-Ad-Id
Access-Control-Allow-Credentials
true
Connection
keep-alive
Access-Control-Allow-Headers
X-Homad-Compatible-Vpaid, X-Homad-Post, X-Homad-Url
Content-Length
110
osd_listener.js
tpc.googlesyndication.com/pagead/js/r20180801/r20110914/activeview/ Frame 2E52
71 KB
26 KB
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/js/r20180801/r20110914/activeview/osd_listener.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
Protocol
SPDY
Server
2a00:1450:4001:81c::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
40e8db13f44571762fa6e5704ca8bb1a73c2cce35e83603e9ac131ab8127db7e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Wed, 01 Aug 2018 14:08:34 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
275287
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=":443"; ma=2592000; v="44,43,39,35"
content-length
26366
x-xss-protection
1; mode=block
server
cafe
etag
17113453447230713914
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Wed, 15 Aug 2018 14:08:34 GMT
desktop-banner-728.shtml
video.golem.de/bannertest/golem/ Frame B0CF
1 KB
887 B
Document
General
Full URL
https://video.golem.de/bannertest/golem/desktop-banner-728.shtml
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5c7586d2259032c3d81eed9123bbb07b176f5e6b0a4e7cf80f2455bd2eec0097

Request headers

Host
video.golem.de
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer
https://www.golem.de/
Accept-Encoding
gzip, deflate
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CMCMID%7C15357430983173705843568274022634328354%7CMCAAMLH-1534012601%7C9%7CMCAAMB-1534012601%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1533415001s%7CNONE%7CMCSYNCSOP%7C411-17755%7CvVersion%7C3.2.0; __gads=ID=bc0bf1e8264cf1e7:T=1533407801:S=ALNI_MayqfpFuTzsjAhgBzNEz70hljtT9Q
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
X-DevTools-Emulate-Network-Conditions-Client-Id
C8E5367B20A50A4DC6DF33589CB7A061
Referer
https://www.golem.de/

Response headers

Server
nginx
Date
Sat, 04 Aug 2018 18:36:41 GMT
Content-Type
text/html
Last-Modified
Tue, 24 Jan 2017 21:19:24 GMT
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Vary
Accept-Encoding
ETag
W/"5887c4dc-47c"
X-UPSTREAM
hybrid2.golem.de
Content-Encoding
gzip
view
securepubads.g.doubleclick.net/pcs/ Frame 2E52
0
57 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsslVJDvUofXoO4FfdIw4WwPYOKKBfjeuxPRtB--worrizF8G2wxpWUjZLwAY07BEXhAH2IxZSB7-fBw4PumB99cItOVuRBqdUuiuRNo4AUi_Deevc4X6dg8gKViwZAd4sFfesJ1SZyXwRvxpm3ptbHd0qL-wHhVWFnTg_L-27Aef8tUU615xxWA6Tz3QUQHN3HSh-gSQlBa2rBkNGD4nKnjN9HqLKVhs0LoqVkfU9ridejQ2LupfA&sai=AMfl-YR8LLgkmGrzjBSI0KrY5SsdqTXx8ZxDCIAlbtw62RiLVB7W7huyUvJ9L5twaEHRalN57HsWVhMNWVqYJEXoqZQgfE7sEJAMSneBkX6I7INsRcEULBM6ApNOh1WT&sig=Cg0ArKJSzEItKr2Ac3NkEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Server
172.217.22.66 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

cache-control
private
content-type
text/html; charset=UTF-8
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=43&t=1533407800532&de=250316664204&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatDfpSlotId=iqadtile1&zMoatRendered=1&zMoatSlotTargetingLoaded=1&zMoatSlotTargetingSet=1&zMoatPageDataTargetingSet=1&zMoatSafetyTargetingSet=1&zMoatEmptySlot=0&zMoatNadoDataLoadTime=189&zMoatAllDataLoadTime=189&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=189&zMoat_YI3=189&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=687884070&cs=0
Protocol
HTTP/1.1
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

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

Response headers

Pragma
no-cache
Date
Sat, 04 Aug 2018 18:36:41 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Sat, 04 Aug 2018 18:36:41 GMT
imgad
pagead2.googlesyndication.com/pagead/
2 KB
3 KB
Image
General
Full URL
https://pagead2.googlesyndication.com/pagead/imgad?id=CICAgIDQ04jCzgEQARgBKAEyCLeTE4Yu5hvQQMa81o0F
Protocol
SPDY
Server
2a00:1450:4001:81f::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
5b54ebb2ed254f7922b3af74610d4487b245899ac8e4178f4c6553b6781da60a
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Sat, 04 Aug 2018 08:07:37 GMT
x-content-type-options
nosniff
server
cafe
age
37744
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
content-type
image/png
status
200
cache-control
public, max-age=604800
content-disposition
attachment; filename="image.png"
timing-allow-origin
*
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
2437
x-xss-protection
1; mode=block
expires
Sat, 11 Aug 2018 08:07:37 GMT
moatad.js
z.moatads.com/iqdigital277772407506/ Frame 2E52
254 KB
79 KB
Script
General
Full URL
https://z.moatads.com/iqdigital277772407506/moatad.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
258a019314c79345b039975a75e58ab901ebfdf6cd423a86994bd39db7f118ac

Request headers

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

Response headers

Date
Sat, 04 Aug 2018 18:36:41 GMT
Content-Encoding
gzip
Last-Modified
Thu, 02 Aug 2018 20:39:48 GMT
Server
AmazonS3
x-amz-request-id
29C3C4B4115B27D7
ETag
"ca74917e8dc36af8d77b52d4fff2029b"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=15957
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
80048
x-amz-id-2
FHN2/G8MbqFH6kIDb7M4WN80y+ZsM5Y1gPFxUh+/yPe9x0O4r+VvMTrz/cnwLXDzIQ1DS1aQRAk=
truncated
/ Frame 2E52
220 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
ae9603eb7dd2b6b372036ea18de672039e9b47285e0554d3a83abf009c389cc4

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/png
font-face-1.0.4.css
video.golem.de/staticrl/styles/ Frame B0CF
2 KB
765 B
Stylesheet
General
Full URL
https://video.golem.de/staticrl/styles/font-face-1.0.4.css
Requested by
Host: video.golem.de
URL: https://video.golem.de/bannertest/golem/desktop-banner-728.shtml
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
54311a38f2adee0f66be493e6785f0f4a93887f7127796a2721492d8c7fa1f9f

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/css,*/*;q=0.1
Referer
https://video.golem.de/bannertest/golem/desktop-banner-728.shtml
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CMCMID%7C15357430983173705843568274022634328354%7CMCAAMLH-1534012601%7C9%7CMCAAMB-1534012601%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1533415001s%7CNONE%7CMCSYNCSOP%7C411-17755%7CvVersion%7C3.2.0; __gads=ID=bc0bf1e8264cf1e7:T=1533407801:S=ALNI_MayqfpFuTzsjAhgBzNEz70hljtT9Q
Connection
keep-alive
Cache-Control
no-cache
Referer
https://video.golem.de/bannertest/golem/desktop-banner-728.shtml
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:41 GMT
Content-Encoding
gzip
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
W/"5b0d91ca-9fa"
Vary
Accept-Encoding
Content-Type
text/css
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Tue, 04 Sep 2018 18:36:41 GMT
accountpromo-desktop7.css
video.golem.de/bannertest/golem/ Frame B0CF
2 KB
1 KB
Stylesheet
General
Full URL
https://video.golem.de/bannertest/golem/accountpromo-desktop7.css
Requested by
Host: video.golem.de
URL: https://video.golem.de/bannertest/golem/desktop-banner-728.shtml
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
c34642860a30666336cb4b9fc3df36eaebc6424ee8c75d869679054008b7cd79

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
text/css,*/*;q=0.1
Referer
https://video.golem.de/bannertest/golem/desktop-banner-728.shtml
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CMCMID%7C15357430983173705843568274022634328354%7CMCAAMLH-1534012601%7C9%7CMCAAMB-1534012601%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1533415001s%7CNONE%7CMCSYNCSOP%7C411-17755%7CvVersion%7C3.2.0; __gads=ID=bc0bf1e8264cf1e7:T=1533407801:S=ALNI_MayqfpFuTzsjAhgBzNEz70hljtT9Q
Connection
keep-alive
Cache-Control
no-cache
Referer
https://video.golem.de/bannertest/golem/desktop-banner-728.shtml
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:41 GMT
Content-Encoding
gzip
Last-Modified
Tue, 21 Jul 2015 17:06:56 GMT
Server
nginx
ETag
W/"55ae7c30-9af"
Vary
Accept-Encoding
Content-Type
text/css
X-UPSTREAM
hybrid1.golem.de
Cache-Control
max-age=2678400
Transfer-Encoding
chunked
Connection
keep-alive
Keep-Alive
timeout=3
Expires
Tue, 04 Sep 2018 18:36:41 GMT
gif
cpxl.golem.de/ Frame B0CF
43 B
292 B
Image
General
Full URL
https://cpxl.golem.de/gif?u=http%3A%2F%2Fwww.golem.de%2Fnews%2F&d=1440&f=ev&v=d&t=ad%2Fgolempur2015kw25%2Ffallback
Requested by
Host: video.golem.de
URL: https://video.golem.de/bannertest/golem/desktop-banner-728.shtml
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:181 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
/ Express
Resource Hash
98b3d9d20e032f90aca49e9b116225d539ff6fbdb7e42c3c363f63896ac03d2a

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
cpxl.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://video.golem.de/bannertest/golem/desktop-banner-728.shtml
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CMCMID%7C15357430983173705843568274022634328354%7CMCAAMLH-1534012601%7C9%7CMCAAMB-1534012601%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1533415001s%7CNONE%7CMCSYNCSOP%7C411-17755%7CvVersion%7C3.2.0; __gads=ID=bc0bf1e8264cf1e7:T=1533407801:S=ALNI_MayqfpFuTzsjAhgBzNEz70hljtT9Q
Connection
keep-alive
Cache-Control
no-cache
Referer
https://video.golem.de/bannertest/golem/desktop-banner-728.shtml
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:41 GMT
X-Powered-By
Express
Vary
X-HTTP-Method-Override
Content-Type
image/gif
X-RateLimit-Remaining
744
Transfer-Encoding
chunked
X-RateLimit-Limit
800
Connection
keep-alive
display-ohne-werbung2.png
video.golem.de/bannertest/golem/img/ Frame B0CF
5 KB
5 KB
Image
General
Full URL
https://video.golem.de/bannertest/golem/img/display-ohne-werbung2.png
Requested by
Host: video.golem.de
URL: https://video.golem.de/bannertest/golem/desktop-banner-728.shtml
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
5d83db90a68d83e188b78e4930cb541dbf8e1b974fe945299ac2832c0651d746

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://video.golem.de/bannertest/golem/accountpromo-desktop7.css
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CMCMID%7C15357430983173705843568274022634328354%7CMCAAMLH-1534012601%7C9%7CMCAAMB-1534012601%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1533415001s%7CNONE%7CMCSYNCSOP%7C411-17755%7CvVersion%7C3.2.0; __gads=ID=bc0bf1e8264cf1e7:T=1533407801:S=ALNI_MayqfpFuTzsjAhgBzNEz70hljtT9Q
Connection
keep-alive
Cache-Control
no-cache
Referer
https://video.golem.de/bannertest/golem/accountpromo-desktop7.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:41 GMT
Last-Modified
Tue, 23 Feb 2016 17:05:30 GMT
Server
nginx
ETag
"56cc915a-1281"
Content-Type
image/png
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
4737
Expires
Tue, 04 Sep 2018 18:36:41 GMT
display-mit-werbung2.png
video.golem.de/bannertest/golem/img/ Frame B0CF
4 KB
5 KB
Image
General
Full URL
https://video.golem.de/bannertest/golem/img/display-mit-werbung2.png
Requested by
Host: video.golem.de
URL: https://video.golem.de/bannertest/golem/desktop-banner-728.shtml
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
c50e9977531a9ae2a156ab2a1333c0e6a161d38a893b964219b78c3dceafc0e1

Request headers

Pragma
no-cache
Accept-Encoding
gzip, deflate
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
image/webp,image/apng,image/*,*/*;q=0.8
Referer
https://video.golem.de/bannertest/golem/accountpromo-desktop7.css
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CMCMID%7C15357430983173705843568274022634328354%7CMCAAMLH-1534012601%7C9%7CMCAAMB-1534012601%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1533415001s%7CNONE%7CMCSYNCSOP%7C411-17755%7CvVersion%7C3.2.0; __gads=ID=bc0bf1e8264cf1e7:T=1533407801:S=ALNI_MayqfpFuTzsjAhgBzNEz70hljtT9Q
Connection
keep-alive
Cache-Control
no-cache
Referer
https://video.golem.de/bannertest/golem/accountpromo-desktop7.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36

Response headers

Date
Sat, 04 Aug 2018 18:36:41 GMT
Last-Modified
Tue, 23 Feb 2016 17:05:29 GMT
Server
nginx
ETag
"56cc9159-1194"
Content-Type
image/png
X-UPSTREAM
hybrid3.golem.de
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
4500
Expires
Tue, 04 Sep 2018 18:36:41 GMT
DroidSans-Bold.woff2
video.golem.de/staticrl/fonts/droidsans/ Frame B0CF
22 KB
22 KB
Font
General
Full URL
https://video.golem.de/staticrl/fonts/droidsans/DroidSans-Bold.woff2
Requested by
Host: video.golem.de
URL: https://video.golem.de/bannertest/golem/desktop-banner-728.shtml
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
e94712bd5679e91d66469fac2cbf6322a706e4e8f25fe37c762b8167391a7c2c

Request headers

Pragma
no-cache
Origin
https://video.golem.de
Accept-Encoding
gzip, deflate
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://video.golem.de/staticrl/styles/font-face-1.0.4.css
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CMCMID%7C15357430983173705843568274022634328354%7CMCAAMLH-1534012601%7C9%7CMCAAMB-1534012601%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1533415001s%7CNONE%7CMCSYNCSOP%7C411-17755%7CvVersion%7C3.2.0; __gads=ID=bc0bf1e8264cf1e7:T=1533407801:S=ALNI_MayqfpFuTzsjAhgBzNEz70hljtT9Q
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://video.golem.de/staticrl/styles/font-face-1.0.4.css
Origin
https://video.golem.de

Response headers

Date
Sat, 04 Aug 2018 18:36:41 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-57f4"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
22516
Expires
Tue, 04 Sep 2018 18:36:41 GMT
DroidSans.woff2
video.golem.de/staticrl/fonts/droidsans/ Frame B0CF
21 KB
21 KB
Font
General
Full URL
https://video.golem.de/staticrl/fonts/droidsans/DroidSans.woff2
Requested by
Host: video.golem.de
URL: https://video.golem.de/bannertest/golem/desktop-banner-728.shtml
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
2a00:13c8:f5::f:4b3d:175 , Germany, ASN25291 (SYSELEVEN SysEleven GmbH, DE),
Reverse DNS
Software
nginx /
Resource Hash
d5ea92e80113829e1cc60cb096ac79b4cf7c30c836991667ca7c6605f181bb13

Request headers

Pragma
no-cache
Origin
https://video.golem.de
Accept-Encoding
gzip, deflate
Host
video.golem.de
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept
*/*
Referer
https://video.golem.de/staticrl/styles/font-face-1.0.4.css
Cookie
golem_viewauto=desktop%3Agoogle_chrome_67; __utma=21769261.108889994.1533407801.1533407801.1533407801.1; __utmc=21769261; __utmz=21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmt=1; __utmb=21769261.1.10.1533407801; golem_us=b8f24f47; golem_uv=b8f24f47; golem_uz=b8f24f47; AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg=1; AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg=-306458230%7CMCIDTS%7C17748%7CMCMID%7C15357430983173705843568274022634328354%7CMCAAMLH-1534012601%7C9%7CMCAAMB-1534012601%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1533415001s%7CNONE%7CMCSYNCSOP%7C411-17755%7CvVersion%7C3.2.0; __gads=ID=bc0bf1e8264cf1e7:T=1533407801:S=ALNI_MayqfpFuTzsjAhgBzNEz70hljtT9Q
Connection
keep-alive
Cache-Control
no-cache
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
Referer
https://video.golem.de/staticrl/styles/font-face-1.0.4.css
Origin
https://video.golem.de

Response headers

Date
Sat, 04 Aug 2018 18:36:41 GMT
Last-Modified
Tue, 29 May 2018 17:45:46 GMT
Server
nginx
ETag
"5b0d91ca-53c8"
Content-Type
application/octet-stream
Access-Control-Allow-Origin
*
Cache-Control
max-age=2678400
Connection
keep-alive
Accept-Ranges
bytes
Keep-Alive
timeout=3
Content-Length
21448
Expires
Tue, 04 Sep 2018 18:36:41 GMT
container.html
tpc.googlesyndication.com/safeframe/1-0-29/html/ Frame 7684
0
0
Document
General
Full URL
https://tpc.googlesyndication.com/safeframe/1-0-29/html/container.html
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_rendering_237.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a00:1450:4001:81c::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

:method
GET
:authority
tpc.googlesyndication.com
:scheme
https
:path
/safeframe/1-0-29/html/container.html
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.golem.de/
accept-encoding
gzip, deflate
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
X-DevTools-Emulate-Network-Conditions-Client-Id
C8E5367B20A50A4DC6DF33589CB7A061
Referer
https://www.golem.de/

Response headers

status
200
accept-ranges
bytes
vary
Accept-Encoding
content-encoding
gzip
content-type
text/html
timing-allow-origin
*
content-length
1479
date
Tue, 31 Jul 2018 00:10:56 GMT
expires
Wed, 31 Jul 2019 00:10:56 GMT
last-modified
Mon, 11 Jun 2018 14:38:59 GMT
x-content-type-options
nosniff
server
sffe
x-xss-protection
1; mode=block
cache-control
public, immutable, max-age=31536000
age
411946
alt-svc
quic=":443"; ma=2592000; v="44,43,39,35"
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=43&t=1533407800532&de=250316664204&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatDfpSlotId=iqadtile3&zMoatRendered=2&zMoatSlotTargetingLoaded=2&zMoatSlotTargetingSet=2&zMoatPageDataTargetingSet=2&zMoatSafetyTargetingSet=2&zMoatEmptySlot=0&zMoatNadoDataLoadTime=189&zMoatAllDataLoadTime=189&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=189&zMoat_YI3=189&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=2034290169&cs=0
Protocol
HTTP/1.1
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

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

Response headers

Pragma
no-cache
Date
Sat, 04 Aug 2018 18:36:42 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Sat, 04 Aug 2018 18:36:42 GMT
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/ Frame DB9A
74 KB
27 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
Protocol
SPDY
Server
2a00:1450:4001:81f::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
dc4ebc15ba0d09ed863adb0bddf3f578bc5365aaaed89d20f879ac56bee92508
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Sat, 04 Aug 2018 18:36:42 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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
27678
x-xss-protection
1; mode=block
server
cafe
etag
2274637023386634109
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Sat, 04 Aug 2018 18:36:42 GMT
osd_listener.js
tpc.googlesyndication.com/pagead/js/r20180801/r20110914/activeview/ Frame DB9A
71 KB
0
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/js/r20180801/r20110914/activeview/osd_listener.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
Protocol
SPDY
Server
2a00:1450:4001:81c::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
40e8db13f44571762fa6e5704ca8bb1a73c2cce35e83603e9ac131ab8127db7e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Wed, 01 Aug 2018 14:08:34 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
275287
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=":443"; ma=2592000; v="44,43,39,35"
content-length
26366
x-xss-protection
1; mode=block
server
cafe
etag
17113453447230713914
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Wed, 15 Aug 2018 14:08:34 GMT
moatad.js
z.moatads.com/iqdigital277772407506/ Frame DB9A
254 KB
0
Script
General
Full URL
https://z.moatads.com/iqdigital277772407506/moatad.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
258a019314c79345b039975a75e58ab901ebfdf6cd423a86994bd39db7f118ac

Request headers

Response headers

Date
Sat, 04 Aug 2018 18:36:41 GMT
Content-Encoding
gzip
Last-Modified
Thu, 02 Aug 2018 20:39:48 GMT
Server
AmazonS3
x-amz-request-id
29C3C4B4115B27D7
ETag
"ca74917e8dc36af8d77b52d4fff2029b"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=15957
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
80048
x-amz-id-2
FHN2/G8MbqFH6kIDb7M4WN80y+ZsM5Y1gPFxUh+/yPe9x0O4r+VvMTrz/cnwLXDzIQ1DS1aQRAk=
truncated
/ Frame DB9A
211 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
37f02b3555f52b83bebdc88b57d12ddb6a1e8d7615033667beb4db087e50fc22

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/png
view
securepubads.g.doubleclick.net/pcs/ Frame DB9A
0
60 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjste7r7PSnnIPiXR529ELsAK8ZSiGKcI-iH2PU4oHpYdeM9DxLvrMVpXJyAe-rItftY_TcUJVoawIFeeBug8L07l1zu-5CyBNdjR2btr_VplqPTvsBPdHj_52q4SLMcIewT3RH6CVMoNWLjQrV5IEa_x5SFRdE-arZtbNBaWim-ELzS_OI7lNIbktU-29SQATtkybA239jECQ_a33HMzag56eHNvJe-M7fpBCknhE5BLW3vxf9p5nLZxhIE&sai=AMfl-YQiB3ZOwP-PzAOkZIcbaHvu7z90-PRmr7_aP4CMwjwdBdgX63Sv64We_VZGmuNnyvPr4pBR3YXnVT5W666OvptF6etLXyNFCQZbFVEC3yg1zkgKeOKbjyGkfuk&sig=Cg0ArKJSzKyjllxGvDPREAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Server
172.217.22.66 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

cache-control
private
content-type
text/html; charset=UTF-8
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=43&t=1533407800532&de=250316664204&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatDfpSlotId=iqadtile9&zMoatRendered=3&zMoatSlotTargetingLoaded=3&zMoatSlotTargetingSet=3&zMoatPageDataTargetingSet=3&zMoatSafetyTargetingSet=3&zMoatEmptySlot=0&zMoatNadoDataLoadTime=189&zMoatAllDataLoadTime=189&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=189&zMoat_YI3=189&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=1637727332&cs=0
Protocol
HTTP/1.1
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

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

Response headers

Pragma
no-cache
Date
Sat, 04 Aug 2018 18:36:42 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Sat, 04 Aug 2018 18:36:42 GMT
integrator.js
adservice.google.de/adsid/ Frame DB9A
109 B
171 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.js?domain=www.golem.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Server
2a00:1450:4001:81e::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

timing-allow-origin
*
date
Sat, 04 Aug 2018 18:36:42 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
104
x-xss-protection
1; mode=block
integrator.js
adservice.google.com/adsid/ Frame DB9A
109 B
171 B
Script
General
Full URL
https://adservice.google.com/adsid/integrator.js?domain=www.golem.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Server
2a00:1450:4001:824::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

timing-allow-origin
*
date
Sat, 04 Aug 2018 18:36:42 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
104
x-xss-protection
1; mode=block
ca-pub-6583763995580712.js
pagead2.googlesyndication.com/pub-config/r20160913/ Frame DB9A
68 B
179 B
Script
General
Full URL
https://pagead2.googlesyndication.com/pub-config/r20160913/ca-pub-6583763995580712.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Server
2a00:1450:4001:81f::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
8ba131a677ea1357ae7fdc95d6a5c67c3b02d171bb286f6c9ec6bce3cef5c211
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Sat, 04 Aug 2018 17:19:03 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
age
4659
content-type
text/javascript
status
200
cache-control
public, max-age=43200
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
88
x-xss-protection
1; mode=block
expires
Sun, 05 Aug 2018 05:19:03 GMT
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/ Frame E2F1
186 KB
0
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Server
2a00:1450:4001:81f::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
6fce4c31ae850b2040455bce806118643449d95394856d93a96e1711c48bcd89
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Sat, 04 Aug 2018 18:36:40 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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
70600
x-xss-protection
1; mode=block
server
cafe
etag
2033713322655698268
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Sat, 04 Aug 2018 18:36:40 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame 4E7B
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-6583763995580712&output=html&h=250&slotname=3923427907&adk=825103508&adf=2162829632&w=300&guci=1.2.0.0.2.2.0&format=300x250&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&avail_w=0&wgl=1&dt=1533407802351&bpp=7&bdt=634&fdt=7&idt=9&shv=r20180801&cbv=r20180604&saldr=aa&correlator=410721347715&frm=23&ife=4&pv=2&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=1895738927&ga_fc=1&iag=3&icsg=2728&nhd=1&dssz=14&mdo=0&mso=0&u_tz=0&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=993&ady=4144&biw=1585&bih=1200&isw=300&ish=250&ifk=1933803164&scr_x=0&scr_y=0&eid=21060853%2C21062171%2C368226400&oid=3&rx=0&eae=2&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C300%2C250&vis=1&rsz=o%7Co%7CeEbr%7C&abl=NS&ppjl=u&pfx=0&fu=20&bc=7&osw_key=606431463&ifi=1&fsb=1&dtd=17
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/show_ads_impl.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:81e::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-6583763995580712&output=html&h=250&slotname=3923427907&adk=825103508&adf=2162829632&w=300&guci=1.2.0.0.2.2.0&format=300x250&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&avail_w=0&wgl=1&dt=1533407802351&bpp=7&bdt=634&fdt=7&idt=9&shv=r20180801&cbv=r20180604&saldr=aa&correlator=410721347715&frm=23&ife=4&pv=2&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=1895738927&ga_fc=1&iag=3&icsg=2728&nhd=1&dssz=14&mdo=0&mso=0&u_tz=0&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=993&ady=4144&biw=1585&bih=1200&isw=300&ish=250&ifk=1933803164&scr_x=0&scr_y=0&eid=21060853%2C21062171%2C368226400&oid=3&rx=0&eae=2&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C300%2C250&vis=1&rsz=o%7Co%7CeEbr%7C&abl=NS&ppjl=u&pfx=0&fu=20&bc=7&osw_key=606431463&ifi=1&fsb=1&dtd=17
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.golem.de/
accept-encoding
gzip, deflate
cookie
IDE=AHWqTUkwNfglb6gP4gZvISfLn0ztjaagLftaDzHWuXEQPpF7G-HxkS7IYRa7-6oe; DSID=NO_DATA
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
X-DevTools-Emulate-Network-Conditions-Client-Id
C8E5367B20A50A4DC6DF33589CB7A061
Referer
https://www.golem.de/

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
gzip
date
Sat, 04 Aug 2018 18:36:42 GMT
server
cafe
cache-control
private
content-length
22204
x-xss-protection
1; mode=block
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
osd.js
pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/ Frame DB9A
70 KB
26 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/osd.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/show_ads_impl.js
Protocol
SPDY
Server
2a00:1450:4001:81f::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
6546ea7bd057a25d0198ff233e30008c8c8f99bcef163ff487a255db68577007
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Wed, 01 Aug 2018 14:14:45 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
274917
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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
26269
x-xss-protection
1; mode=block
server
cafe
etag
15748226983099521862
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Wed, 15 Aug 2018 14:14:45 GMT
adsbygoogle.js
pagead2.googlesyndication.com/pagead/js/ Frame 162F
74 KB
27 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
Protocol
SPDY
Server
2a00:1450:4001:81f::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
dc4ebc15ba0d09ed863adb0bddf3f578bc5365aaaed89d20f879ac56bee92508
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Sat, 04 Aug 2018 18:36:42 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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
27678
x-xss-protection
1; mode=block
server
cafe
etag
2274637023386634109
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Sat, 04 Aug 2018 18:36:42 GMT
osd_listener.js
tpc.googlesyndication.com/pagead/js/r20180801/r20110914/activeview/ Frame 162F
71 KB
0
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/js/r20180801/r20110914/activeview/osd_listener.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
Protocol
SPDY
Server
2a00:1450:4001:81c::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
40e8db13f44571762fa6e5704ca8bb1a73c2cce35e83603e9ac131ab8127db7e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Wed, 01 Aug 2018 14:08:34 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
275287
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=":443"; ma=2592000; v="44,43,39,35"
content-length
26366
x-xss-protection
1; mode=block
server
cafe
etag
17113453447230713914
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Wed, 15 Aug 2018 14:08:34 GMT
moatad.js
z.moatads.com/iqdigital277772407506/ Frame 162F
254 KB
79 KB
Script
General
Full URL
https://z.moatads.com/iqdigital277772407506/moatad.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
258a019314c79345b039975a75e58ab901ebfdf6cd423a86994bd39db7f118ac

Request headers

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

Response headers

Date
Sat, 04 Aug 2018 18:36:42 GMT
Content-Encoding
gzip
Last-Modified
Thu, 02 Aug 2018 20:39:48 GMT
Server
AmazonS3
x-amz-request-id
29C3C4B4115B27D7
ETag
"ca74917e8dc36af8d77b52d4fff2029b"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=15956
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
80048
x-amz-id-2
FHN2/G8MbqFH6kIDb7M4WN80y+ZsM5Y1gPFxUh+/yPe9x0O4r+VvMTrz/cnwLXDzIQ1DS1aQRAk=
truncated
/ Frame 162F
210 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
c349d122e6ba65cdd31c45c66b9ba479622d8466a6a856b2c293d549c01daafc

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/png
view
securepubads.g.doubleclick.net/pcs/ Frame 162F
0
61 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstiv3cGE6c6YmE9CPNPxKJ2aSMF4c5O7ac-N8w4ubiymOVh_1i_7RcmtWpnq5OdQqI0l7a-FmkihBEdEIHx6q8dB722EUfrdtKZcGTdOoyRh4OInuE6S7lvSxdXYjrAalC41unSOYILgBiFCh4CFaw1uqOMF65L4rFh6aYPi7ZYLjRlpzHY7nloidb5rBYBS_ZjCgutDTChs0qc98K-ly56gEmH2j4qfWeHsy7Fltv4NNfFizvay8HPuIE&sai=AMfl-YTe_3f91bsp-QhqpnWGFhtoh4fk5NxHe-r5dh4chllNo5FF375Qqo8DcAGB0ps8YgUF0DlFCKsn56da_J9wQUKLl2miEJntlcpWIpHtMH3EQd1bW50TB23TdwOJ&sig=Cg0ArKJSzMtasxbN0oBYEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Server
172.217.22.66 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

cache-control
private
content-type
text/html; charset=UTF-8
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=43&t=1533407800532&de=250316664204&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatDfpSlotId=iqadtile16&zMoatRendered=4&zMoatSlotTargetingLoaded=4&zMoatSlotTargetingSet=3&zMoatPageDataTargetingSet=4&zMoatSafetyTargetingSet=4&zMoatEmptySlot=0&zMoatNadoDataLoadTime=189&zMoatAllDataLoadTime=189&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=189&zMoat_YI3=189&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=1136241934&cs=0
Protocol
HTTP/1.1
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

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

Response headers

Pragma
no-cache
Date
Sat, 04 Aug 2018 18:36:42 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Sat, 04 Aug 2018 18:36:42 GMT
integrator.js
adservice.google.de/adsid/ Frame 162F
109 B
171 B
Script
General
Full URL
https://adservice.google.de/adsid/integrator.js?domain=www.golem.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Server
2a00:1450:4001:81e::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

timing-allow-origin
*
date
Sat, 04 Aug 2018 18:36:42 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
104
x-xss-protection
1; mode=block
integrator.js
adservice.google.com/adsid/ Frame 162F
109 B
171 B
Script
General
Full URL
https://adservice.google.com/adsid/integrator.js?domain=www.golem.de
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Server
2a00:1450:4001:824::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

timing-allow-origin
*
date
Sat, 04 Aug 2018 18:36:42 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
p3p
CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657 for more info."
status
200
cache-control
private, no-cache, no-store
content-disposition
attachment; filename="f.txt"
content-type
application/javascript; charset=UTF-8
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
104
x-xss-protection
1; mode=block
ca-pub-6583763995580712.js
pagead2.googlesyndication.com/pub-config/r20160913/ Frame 162F
68 B
152 B
Script
General
Full URL
https://pagead2.googlesyndication.com/pub-config/r20160913/ca-pub-6583763995580712.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Server
2a00:1450:4001:81f::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
sffe /
Resource Hash
8ba131a677ea1357ae7fdc95d6a5c67c3b02d171bb286f6c9ec6bce3cef5c211
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Sat, 04 Aug 2018 17:19:03 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
sffe
age
4659
content-type
text/javascript
status
200
cache-control
public, max-age=43200
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
88
x-xss-protection
1; mode=block
expires
Sun, 05 Aug 2018 05:19:03 GMT
show_ads_impl.js
pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/ Frame 2CDD
186 KB
0
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/show_ads_impl.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js
Protocol
SPDY
Server
2a00:1450:4001:81f::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
6fce4c31ae850b2040455bce806118643449d95394856d93a96e1711c48bcd89
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Sat, 04 Aug 2018 18:36:40 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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
70600
x-xss-protection
1; mode=block
server
cafe
etag
2033713322655698268
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=1209600
timing-allow-origin
*
expires
Sat, 04 Aug 2018 18:36:40 GMT
ads
googleads.g.doubleclick.net/pagead/ Frame B507
0
0
Document
General
Full URL
https://googleads.g.doubleclick.net/pagead/ads?client=ca-pub-6583763995580712&output=html&h=250&slotname=9888525209&adk=1110963404&adf=4205041376&w=800&guci=1.2.0.0.2.2.0&format=800x250&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&wgl=1&dt=1533407802541&bpp=4&bdt=821&fdt=5&idt=6&shv=r20180801&cbv=r20180604&saldr=aa&correlator=410721347715&frm=23&ife=4&pv=1&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=646917476&ga_fc=1&iag=3&icsg=2728&nhd=1&dssz=14&mdo=0&mso=0&u_tz=0&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=393&ady=11315&biw=1585&bih=1200&isw=800&ish=250&ifk=539073182&scr_x=0&scr_y=0&eid=21060853%2C21062171%2C368226400&oid=3&rx=0&eae=2&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C800%2C250&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=20&bc=7&osw_key=2012678058&ifi=1&fsb=1&dtd=13
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/show_ads_impl.js
Protocol
H2
Security
TLS 1.2, ECDHE_ECDSA, AES_128_GCM
Server
2a00:1450:4001:81e::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

:method
GET
:authority
googleads.g.doubleclick.net
:scheme
https
:path
/pagead/ads?client=ca-pub-6583763995580712&output=html&h=250&slotname=9888525209&adk=1110963404&adf=4205041376&w=800&guci=1.2.0.0.2.2.0&format=800x250&url=https%3A%2F%2Fwww.golem.de%2F&ea=0&flash=0&wgl=1&dt=1533407802541&bpp=4&bdt=821&fdt=5&idt=6&shv=r20180801&cbv=r20180604&saldr=aa&correlator=410721347715&frm=23&ife=4&pv=1&ga_vid=108889994.1533407801&ga_sid=1533407801&ga_hid=646917476&ga_fc=1&iag=3&icsg=2728&nhd=1&dssz=14&mdo=0&mso=0&u_tz=0&u_his=2&u_java=0&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_nplug=0&u_nmime=0&adx=393&ady=11315&biw=1585&bih=1200&isw=800&ish=250&ifk=539073182&scr_x=0&scr_y=0&eid=21060853%2C21062171%2C368226400&oid=3&rx=0&eae=2&fc=528&brdim=0%2C0%2C0%2C0%2C1600%2C0%2C1600%2C1200%2C800%2C250&vis=1&rsz=%7C%7CeEbr%7C&abl=CS&ppjl=u&pfx=0&fu=20&bc=7&osw_key=2012678058&ifi=1&fsb=1&dtd=13
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.golem.de/
accept-encoding
gzip, deflate
cookie
IDE=AHWqTUkwNfglb6gP4gZvISfLn0ztjaagLftaDzHWuXEQPpF7G-HxkS7IYRa7-6oe; DSID=NO_DATA
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
X-DevTools-Emulate-Network-Conditions-Client-Id
C8E5367B20A50A4DC6DF33589CB7A061
Referer
https://www.golem.de/

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
gzip
date
Sat, 04 Aug 2018 18:36:42 GMT
server
cafe
cache-control
private
content-length
8145
x-xss-protection
1; mode=block
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
osd.js
pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/ Frame 162F
70 KB
26 KB
Script
General
Full URL
https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/osd.js
Requested by
Host: pagead2.googlesyndication.com
URL: https://pagead2.googlesyndication.com/pagead/js/r20180801/r20180604/show_ads_impl.js
Protocol
SPDY
Server
2a00:1450:4001:81f::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
6546ea7bd057a25d0198ff233e30008c8c8f99bcef163ff487a255db68577007
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

date
Wed, 01 Aug 2018 14:14:45 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
274917
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="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
26269
x-xss-protection
1; mode=block
server
cafe
etag
15748226983099521862
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Wed, 15 Aug 2018 14:14:45 GMT
/
golem.whitepaperdb.de/ Frame 9C2E
0
0
Document
General
Full URL
https://golem.whitepaperdb.de/?tag=golem
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
62.138.242.228 , Germany, ASN61157 (PLUSSERVER-ASN1, DE),
Reverse DNS
mail.whitepaperdb.de
Software
nginx / PHP/7.0.31 PleskLin
Resource Hash

Request headers

:method
GET
:authority
golem.whitepaperdb.de
:scheme
https
:path
/?tag=golem
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
referer
https://www.golem.de/
accept-encoding
gzip, deflate
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36
X-DevTools-Emulate-Network-Conditions-Client-Id
C8E5367B20A50A4DC6DF33589CB7A061
Referer
https://www.golem.de/

Response headers

status
200
server
nginx
date
Sat, 04 Aug 2018 18:36:42 GMT
content-type
text/html; charset=UTF-8
vary
Accept-Encoding
x-powered-by
PHP/7.0.31 PleskLin
set-cookie
WIDS=3715
content-encoding
gzip
osd_listener.js
tpc.googlesyndication.com/pagead/js/r20180801/r20110914/activeview/ Frame ADBD
71 KB
0
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/js/r20180801/r20110914/activeview/osd_listener.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
Protocol
SPDY
Server
2a00:1450:4001:81c::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
40e8db13f44571762fa6e5704ca8bb1a73c2cce35e83603e9ac131ab8127db7e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Wed, 01 Aug 2018 14:08:34 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
275287
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=":443"; ma=2592000; v="44,43,39,35"
content-length
26366
x-xss-protection
1; mode=block
server
cafe
etag
17113453447230713914
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Wed, 15 Aug 2018 14:08:34 GMT
moatad.js
z.moatads.com/iqdigital277772407506/ Frame ADBD
254 KB
0
Script
General
Full URL
https://z.moatads.com/iqdigital277772407506/moatad.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
258a019314c79345b039975a75e58ab901ebfdf6cd423a86994bd39db7f118ac

Request headers

Response headers

Date
Sat, 04 Aug 2018 18:36:42 GMT
Content-Encoding
gzip
Last-Modified
Thu, 02 Aug 2018 20:39:48 GMT
Server
AmazonS3
x-amz-request-id
29C3C4B4115B27D7
ETag
"ca74917e8dc36af8d77b52d4fff2029b"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=15956
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
80048
x-amz-id-2
FHN2/G8MbqFH6kIDb7M4WN80y+ZsM5Y1gPFxUh+/yPe9x0O4r+VvMTrz/cnwLXDzIQ1DS1aQRAk=
truncated
/ Frame ADBD
216 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
0f05efd00f422e2ed99ad3012187c25859aa09b6a1757634279106a8a27bb7e0

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/png
view
securepubads.g.doubleclick.net/pcs/ Frame ADBD
0
61 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjstAkf4eXhDeF0u_QiA_hZ6p7yvCOZw5cl_pu21cjC-gAR4yQiQw98hVzHHsBPljRIuEwFEqYvdBBdMUGz27tBKIRfbiY_yGrzdO7XvZB7AIj7g643NRntZR7kCbeMqp-XSyz5SaGuUuzAeZ082LEDjjZ4GlN70a2BWaKuOTwFczlNavpI3ia7L2p7Yk_YyqtU4MHqCM6-LDsTQToqkRlg2RSkSeKeJu6kTThhqnGDJBQfaPJo1iAyRhYEsUSdKDvgaeoFl-DNWt_Q&sai=AMfl-YQtqf_NiEGqV2_JmyIwUmUN2hmaeA8f4z3yvXYkN1YInkYZD6sXQxAIt2RQJgV1lvYn9QHVkxav9rtU207DkLvIgcYK1ty64n1KCGCDRNwlmeCTo5oxuCvJVXY&sig=Cg0ArKJSzFX3sXE1TboEEAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Server
172.217.22.66 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

cache-control
private
content-type
text/html; charset=UTF-8
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=43&t=1533407800532&de=250316664204&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatDfpSlotId=iqadtile8&zMoatRendered=5&zMoatSlotTargetingLoaded=5&zMoatSlotTargetingSet=4&zMoatPageDataTargetingSet=5&zMoatSafetyTargetingSet=5&zMoatEmptySlot=0&zMoatNadoDataLoadTime=189&zMoatAllDataLoadTime=189&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=189&zMoat_YI3=189&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=193575350&cs=0
Protocol
HTTP/1.1
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

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

Response headers

Pragma
no-cache
Date
Sat, 04 Aug 2018 18:36:42 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Sat, 04 Aug 2018 18:36:42 GMT
osd_listener.js
tpc.googlesyndication.com/pagead/js/r20180801/r20110914/activeview/ Frame 2F6D
71 KB
0
Script
General
Full URL
https://tpc.googlesyndication.com/pagead/js/r20180801/r20110914/activeview/osd_listener.js
Requested by
Host: securepubads.g.doubleclick.net
URL: https://securepubads.g.doubleclick.net/gpt/pubads_impl_237.js
Protocol
SPDY
Server
2a00:1450:4001:81c::2001 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
40e8db13f44571762fa6e5704ca8bb1a73c2cce35e83603e9ac131ab8127db7e
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

Response headers

date
Wed, 01 Aug 2018 14:08:34 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
275287
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=":443"; ma=2592000; v="44,43,39,35"
content-length
26366
x-xss-protection
1; mode=block
server
cafe
etag
17113453447230713914
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
public, max-age=1209600
timing-allow-origin
*
expires
Wed, 15 Aug 2018 14:08:34 GMT
moatad.js
z.moatads.com/iqdigital277772407506/ Frame 2F6D
254 KB
0
Script
General
Full URL
https://z.moatads.com/iqdigital277772407506/moatad.js
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
HTTP/1.1
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
AmazonS3 /
Resource Hash
258a019314c79345b039975a75e58ab901ebfdf6cd423a86994bd39db7f118ac

Request headers

Response headers

Date
Sat, 04 Aug 2018 18:36:42 GMT
Content-Encoding
gzip
Last-Modified
Thu, 02 Aug 2018 20:39:48 GMT
Server
AmazonS3
x-amz-request-id
29C3C4B4115B27D7
ETag
"ca74917e8dc36af8d77b52d4fff2029b"
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
max-age=15956
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
80048
x-amz-id-2
FHN2/G8MbqFH6kIDb7M4WN80y+ZsM5Y1gPFxUh+/yPe9x0O4r+VvMTrz/cnwLXDzIQ1DS1aQRAk=
truncated
/ Frame 2F6D
217 B
0
Image
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
205e1e6ec9316680e390071927d9aa472f363942376fe5c1c3814707d979cb83

Request headers

Response headers

Access-Control-Allow-Origin
*
Content-Type
image/png
view
securepubads.g.doubleclick.net/pcs/ Frame 2F6D
0
52 B
Image
General
Full URL
https://securepubads.g.doubleclick.net/pcs/view?xai=AKAOjsvAAGoDF0peBFyu1QBzkEmSHQGcdaCnOYi_olBR_1jtWJsJcyKAfv_39x8CAV5o8GRw4qKSg3n3QQp21XvKTIHJkGmed0HtVR1hPXMuEVuZyzRGKqWNJTtNz06qk3ypCpVneGQyR2169Vh83yTZCRGqNxDc-SCA-QtVigqgMIY15TDIeeK1bbmsUbq2rEw2dXsBaNwBR1PJV0xbhPEzbmRX-zxuo_5ntAtr0FssDVBeOjjJme6Fbw&sai=AMfl-YSPWlQqt6-s0kkwLt3qrtavC0b9ksGn0z4NsnJpUvKv9Jf6GqWuWvbrEEy05br9OevRONdg5SDaRnBnEeb_kG7jki5ysn4VklMz5BWnQIBWfwKwYxef07da2Xk&sig=Cg0ArKJSzGXeC1bDj6u3EAE&urlfix=1&adurl=
Requested by
Host: www.golem.de
URL: https://www.golem.de/
Protocol
SPDY
Server
172.217.22.66 Mountain View, United States, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
fra15s17-in-f66.1e100.net
Software
/
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

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

Response headers

cache-control
private
content-type
text/html; charset=UTF-8
pixel.gif
px.moatads.com/
43 B
409 B
Image
General
Full URL
https://px.moatads.com/pixel.gif?e=43&t=1533407800532&de=250316664204&d=IQDIGITALDFP_PREBID_HEADER1%3ADesktop%3A-%3A-&i=YIELD_INTELLIGENCE_INTERNAL1&ar=e249bb570d-clean&zMoatDfpSlotId=iqadtile4&zMoatRendered=6&zMoatSlotTargetingLoaded=6&zMoatSlotTargetingSet=5&zMoatPageDataTargetingSet=6&zMoatSafetyTargetingSet=6&zMoatEmptySlot=0&zMoatNadoDataLoadTime=189&zMoatAllDataLoadTime=189&bo=golem.de&bd=golem.de&ac=1&bq=11&f=0&zn=1&zMoat_YI1=0&zMoat_YI2=189&zMoat_YI3=189&zMoat_YIL0T=IQDIGITALDFP_PREBID_HEADER1&na=1769618959&cs=0
Protocol
HTTP/1.1
Server
2.18.235.40 , European Union, ASN16625 (AKAMAI-AS - Akamai Technologies, Inc., US),
Reverse DNS
a2-18-235-40.deploy.static.akamaitechnologies.com
Software
Apache /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

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

Response headers

Pragma
no-cache
Date
Sat, 04 Aug 2018 18:36:42 GMT
Last-Modified
Fri, 20 May 2016 15:16:00 GMT
Server
Apache
ETag
"ad4b0f606e0f8465bc4c4c170b37e1a3:1463757360"
Content-Type
image/gif
Cache-Control
max-age=0, no-cache, no-store
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
43
Expires
Sat, 04 Aug 2018 18:36:42 GMT
activeview
pagead2.googlesyndication.com/pcs/ Frame 2E52
42 B
122 B
Image
General
Full URL
https://pagead2.googlesyndication.com/pcs/activeview?xai=AKAOjstzOpo50IQOGgtDcsdxQKZNTRpEP2BbkGMXpq712l4a-DrqoubILj65UuUeX8HGEwk5YT5p06FlRColdQbYkavF2h9Be5lLF8A&sig=Cg0ArKJSzGpiKax7-cbcEAE&adk=1018996689&tt=1091&bs=1585,1200&mtos=1068,1068,1068,1068,1068&tos=1068,0,0,0,0&p=20,293,110,1021&mcvt=1068&rs=3&ht=0&tfs=824&tls=1892&mc=1&lte=1&bas=0&bac=0&avms=geo&rst=1533407801868&rpt=0&bos=1600,1200&ps=1585,11570&ss=1600,1200&pt=803&deb=1-3-9-25-19-3-348-9&tvt=1868&op=1&r=v&id=osdim&ti=1&uc=54&tgt=DIV&cl=1&cec=8&clc=1&cac=0&cd=728x90&v=r20180801
Protocol
SPDY
Server
2a00:1450:4001:81f::2002 , Ireland, ASN15169 (GOOGLE - Google LLC, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 1; mode=block

Request headers

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

Response headers

pragma
no-cache
date
Sat, 04 Aug 2018 18:36:42 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
status
200
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
access-control-allow-origin
*
cache-control
no-cache, must-revalidate
content-type
image/gif
alt-svc
quic="googleads.g.doubleclick.net:443"; ma=2592000; v="44,43,39,35",quic=":443"; ma=2592000; v="44,43,39,35"
content-length
42
x-xss-protection
1; mode=block
expires
Fri, 01 Jan 1990 00:00:00 GMT

Verdicts & Comments Add Verdict or Comment

190 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| Golem object| _gcpx string| gafc_rubrik string| gafc_zone number| ord boolean| _golem_html5ads_enable string| IVW string| n_pbt boolean| gzipEnabled object| _gafccsi string| iqd_mode object| IQD object| AdController undefined| _ object| AdControllerContainer string| _ADC_VERSION object| regexMatcher object| googletag boolean| isConsent function| setConsentBehaviour function| setMoatPrebidData function| iqDefineHeaderBids object| pbjs boolean| deliveringAds string| adblocktest string| src_xplosion string| src_contentplatform string| src_iqhbprebid string| src_yield string| level2 string| handle object| inViewConfInfos object| toRenderAds object| isRenderAds string| adTile function| createIQLabel function| setIQCreativeSpace object| IQD_varPack function| limitHeaderBids function| setIQTile string| iqVisClass string| iqdCI string| iqdCIs undefined| iqLoggerSrc object| IQDAO string| iqYlSite boolean| iqYlNew object| adaYlFormatId object| tmYlFormatId object| iqYlCs object| iqYlObj string| src_yieldlab string| src_yieldlabTM object| googleToken object| googleIMState object| google_js_reporting_queue function| processGoogleToken object| yl function| _h object| _adexc object| adex object| _satellite boolean| __satelliteLoaded function| Visitor object| s_c_il number| s_c_in function| DIL undefined| ct undefined| et undefined| hourElapsed undefined| msg undefined| pixelDomain undefined| pxSrc undefined| px object| Moat#G26 object| MoatSuperV26 object| MoatNadoAllJsonpRequest_27277248 boolean| Moat#EVA object| moatPrebidApi function| pbjsChunk object| core object| __core-js_shared__ string| ac_varL1 string| ac_varL2 object| Criteo object| extData function| $ function| jQuery object| iAbo function| golemAcceptCookies object| IQDComplete object| GPT_jstiming object| closure_memoize_cache_ boolean| google_measure_js_timing boolean| subDomainCheckVar function| UABPdd object| uabpFlags string| uabpRnd string| szmvars object| OEWA object| iom object| iam_data string| disableStr object| _gaq string| cat undefined| subcat string| adc_cat string| adc_cat2 boolean| uabpdl boolean| uabpdln string| uabpdgenat string| uabpdsthash boolean| uabpforceimp boolean| uabpnewinject object| adsbygoogle boolean| google_noFetch boolean| google_DisableInitialLoad number| __google_ad_urls_id object| criteo_pubtag object| _EQLService object| _EQPScript boolean| uabBody boolean| uabDetect object| uabpd1 object| uabpd2 number| uabpd3 object| uabpd4 object| uabpd5 boolean| uabpij object| _gat object| gaGlobal object| google_ad_modifications object| google_reactive_ads_global_state function| google_spfd number| google_unique_id object| google_sv_map object| google_t12n_vars object| google_jobrunner object| google_iframe_oncopy function| Swiper object| rmp3pi function| SwfVideo object| exportz object| google_persistent_state_async object| google_pub_config object| __google_ad_urls number| google_global_correlator object| google_prev_clients object| ampInaboxIframes object| ampInaboxPendingMessages function| Goog_AdSense_getAdAdapterInstance boolean| google_osd_loaded boolean| google_onload_fired object| _EQPService object| _emqYL string| ada_publisher object| _adrtx object| _emqAdexGif object| _emqConImpact object| uabpMobile function| Goog_Osd_UnloadAdBlock function| Goog_Osd_UpdateElementToMeasure object| rmpGlobals function| RadiantMP function| FuckAdBlock object| fuckAdBlock object| _emtriqIDImg object| PiexuuphehaphohV string| v object| fv object| gv function| videopkgInterface string| delayedData function| Goog_AdSense_Lidar_sendVastEvent function| Goog_AdSense_Lidar_getViewability function| Goog_AdSense_Lidar_getUrlSignalsArray function| Goog_AdSense_Lidar_getUrlSignalsList object| ima function| onYouTubeIframeAPIReady object| google object| closure_lm_988759 string| arg object| iqd_gpt_slots object| closure_lm_236920 function| Goog_AdSense_OsdAdapter function| google_osd_amcb string| hic_qos object| IQCreatives object| iqMoatIdCollector object| t4ftPlacement

16 Cookies

Domain/Path Name / Value
.doubleclick.net/ Name: IDE
Value: AHWqTUkwNfglb6gP4gZvISfLn0ztjaagLftaDzHWuXEQPpF7G-HxkS7IYRa7-6oe
.demdex.net/ Name: dextp
Value: 269-1-1533407801579|358-1-1533407801680
.www.golem.de/ Name: AAMC_iqdigital_0
Value: REGION%7C6
.golem.de/ Name: AMCVS_41833DF75A550B4B0A495DA6%40AdobeOrg
Value: 1
.golem.de/ Name: AMCV_41833DF75A550B4B0A495DA6%40AdobeOrg
Value: -306458230%7CMCIDTS%7C17748%7CMCMID%7C15357430983173705843568274022634328354%7CMCAAMLH-1534012601%7C9%7CMCAAMB-1534012601%7C6G1ynYcLPuiQxYZrsz_pkqfLG9yMXBpb2zX5dvJdYQJzPXImdj0y%7CMCOPTOUT-1533415001s%7CNONE%7CMCSYNCSOP%7C411-17755%7CvVersion%7C3.2.0
.golem.de/ Name: golem_uv
Value: b8f24f47
.golem.de/ Name: golem_us
Value: b8f24f47
.golem.de/ Name: golem_uz
Value: b8f24f47
.golem.de/ Name: __utmb
Value: 21769261.1.10.1533407801
.golem.de/ Name: __utmt
Value: 1
.golem.de/ Name: __utmz
Value: 21769261.1533407801.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
.demdex.net/ Name: demdex
Value: 64046142864768518129162640840116317301
.golem.de/ Name: __utma
Value: 21769261.108889994.1533407801.1533407801.1533407801.1
www.golem.de/ Name: adp_segs
Value: e0
.golem.de/ Name: golem_viewauto
Value: desktop%3Agoogle_chrome_67
.golem.de/ Name: __utmc
Value: 21769261

12 Console Messages

Source Level URL
Text
console-api log (Line 20)
Message:
gdpr - query_string
console-api log (Line 1)
Message:
gdpr_header-bidding.js
console-api log (Line 1)
Message:
gdpr_global.js
console-api log (Line 1)
Message:
gdpr_yieldlab.js
console-api log URL: https://www.golem.de/staticrl/scripts/golem_main_114-min.js(Line 14)
Message:
JQMIGRATE: Migrate is installed, version 1.4.1
console-api log (Line 34)
Message:
gdpr_examine_consent.js
console-api log (Line 129)
Message:
IQDAIF ready
console-api log (Line 319)
Message:
Standard Banner :: (IFRAME Tag) :: LineItem-ID-4686089258, Creative-ID-138235269571, tile = 1
console-api log (Line 319)
Message:
Standard Banner :: (3rdPARTY Tag) :: LineItem-ID-4643513462, Creative-ID-138230737471, tile = 9
console-api log (Line 319)
Message:
Standard Banner :: (3rdPARTY Tag) :: LineItem-ID-4751801668, Creative-ID-138234601636, tile = 16
console-api log (Line 99)
Message:
3rd-Party Redirect :: LineItem-ID-4550222765, Creative-ID-85376452645, tile = 8
console-api log (Line 20)
Message:
Ausbuchung 1x1 Reichweite :: LineItem-ID-4686089258, Creative-ID-138235188476, tile = 4

Security Headers

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

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

Indicators

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

ad.yieldlab.net
ads.golem.de
adservice.google.com
adservice.google.de
adstax-match.adrtx.net
assets.adobedtm.com
bidder.criteo.com
cdn.adrtx.net
cdn.emetriq.de
cdn.radiantmediatechs.com
cm.everesttech.net
cpx.golem.de
cpxl.golem.de
d.df-srv.de
d1pywvbolq0b04.cloudfront.net
de.ioam.de
dmp.theadex.com
dpm.demdex.net
dsp.adfarm1.adition.com
dx6ctphzljkf1.cloudfront.net
dyn.emetriq.de
golem.whitepaperdb.de
googleads.g.doubleclick.net
hgc-cf-cache-1.svonm.com
ib.adnxs.com
imasdk.googleapis.com
iqdigital.demdex.net
iqdtms.golem.de
mb.moatads.com
p.yieldlab.net
pagead2.googlesyndication.com
px.moatads.com
s0.2mdn.net
s3.amazonaws.com
script.ioam.de
securepubads.g.doubleclick.net
ssl.1.damoh.golem.de
ssl.google-analytics.com
static.criteo.net
stats.g.doubleclick.net
tpc.googlesyndication.com
ups.xplosion.de
video.golem.de
www.golem.de
www.google-analytics.com
www.googletagservices.com
xpl.theadex.com
z.moatads.com
172.217.22.66
176.9.101.100
176.9.3.108
178.250.2.130
178.250.2.89
185.33.223.216
188.40.138.133
2.18.232.23
2.18.232.233
2.18.235.40
2001:16e0:10a:1::c1:1
2001:16e0:10a:1::c2:1
2400:cb00:2048:1::6818:6724
2600:9000:2047:2400:1c:9fd1:6d00:21
2600:9000:2047:a000:1c:8c89:a300:93a1
2600:9000:2047:e00:1:9777:c740:21
2a00:13c8:f5::f:4b3d:175
2a00:13c8:f5::f:4b3d:17a
2a00:13c8:f5::f:4b3d:181
2a00:13c8:f5::f:4b3d:182
2a00:1450:4001:810::200a
2a00:1450:4001:81c::2001
2a00:1450:4001:81c::2006
2a00:1450:4001:81c::200e
2a00:1450:4001:81e::2002
2a00:1450:4001:81f::2002
2a00:1450:4001:81f::2008
2a00:1450:4001:824::2002
2a00:1450:4001:825::2002
2a00:1450:400c:c07::9a
35.165.133.163
52.17.80.93
52.19.206.103
52.216.1.195
52.222.150.128
52.222.150.179
52.49.47.75
52.56.240.94
54.72.140.158
54.77.222.97
62.138.242.228
66.117.28.86
77.247.84.128
77.247.84.129
85.114.144.198
85.114.159.93
89.163.159.116
89.163.159.126
91.215.100.39
91.215.100.40
0151c5c63c1b0c1fd982c15b016482e8c06045b37de25a0df79fb36808f17a5b
01ac0b96663800a7bdc3b993afacce59001fd838ef971566fd795a06009eaa8f
03f56c523e42f36e912b7109c0a97e43703d78c0884f59c07ff115e590e9fd7f
0482a98d09daebc18a0d2e1ed8f748da5b0179e61223ed541101df1f4699f073
068d9a40a218198cbda9912d38b759e1cf2f1713984d654856519ab451b98089
098d6450c44fcac4f25e3dfc639711a12d80f5d7ee6d262f4b475eb0693b4ddd
0bdda96858933db76979b062926fc3adcf1108a88fdec7602567b0b412740bd8
0f05efd00f422e2ed99ad3012187c25859aa09b6a1757634279106a8a27bb7e0
100e170273ad8c9607749895a8769d960f7cdda4f8907ef0386e5fc2756a4081
11bff00987c994f5ec78a5864e686c4b449879905328b5927a2c7a5b8e307312
1259ea99bd76596239bfd3102c679eb0a5052578dc526b0452f4d42f8bcdd45f
14aa86542caf98951b0a6e5cdcefee98efe6c7c167fb1d0c5f1c38ba90d16b42
17537145b679ff12e66022957073c236b926e6938fb38da82f034e53f95f2776
1883a7179fb0b411b16737f59f9b99ee2ef51c102731ea55217a838430b430c4
1a5d7b696ec9b6bd762889b3fa0328e5fc6affd8882a934228d8fa56fdfb5185
1fbd2c22d6f321559e81dd8af4a9b243f1f43cb81a9562a0f5de66757e9ed66b
205e1e6ec9316680e390071927d9aa472f363942376fe5c1c3814707d979cb83
208b975a401cac12224ab9aa61d73bb5e9d75f4561ae756896e2c59be6074ba9
2127e9cb02c99bec78195c5cd25cc9759d50a1018d982604b137b3cba56a36b8
237e4b6c429f6541b6a99c0e2d9181a15cec70caf07d79f3ac3722a7ace1caa2
23faf11c5252eff54a4691b009ccb47879962ffdae366328496c282d2366915d
24489edaab8622c869b52085b7d0a9c8dcd4108951be7c4c655af011ba2ff85e
258a019314c79345b039975a75e58ab901ebfdf6cd423a86994bd39db7f118ac
25d819bf5e7ae2c998690015c6e8958ddceb44dac2497783eb70680c777a7406
2bdb9058c86c9b82b28d52d721fb75df307033cac39891be256b4f74bbb1b083
334edfbf00ad918aebbf33d4ea9365ce1f41afc3346c9f2ba7edd127d6b30f6c
33a615b30f0b0648a299b0d7e7f57e6c5a1b52cfcc831b3572c1f6ff77c1e2b1
34815dfa238f8c0e9c2f0c533e27feb0c872d20ee404deb6feb781175c033f31
352c699a724df4758e0005476752014202d4156ce13cbf91f9f948f676488088
37f02b3555f52b83bebdc88b57d12ddb6a1e8d7615033667beb4db087e50fc22
3d19ec539a1a6b7e6400fbadc83e61a61a442fc840750004df6201d384b6ecd0
3e253b66056519aa065b00a453bac37ac5ed8f3e6fe7b542e93a9dcdcc11d0bc
3e9458a6670521726551a40d3c22d3935ce1b050e7fe68b9a3f04eb73e6901c9
3eac381fd296094c158c1fe2690efd8ec90c4065a681597f57f35855a3c4a98d
3f7b4aea2fdb1d4289fd00e783d62f7ceb8c688f4630e0c19ad588ff1a29dfef
40e8db13f44571762fa6e5704ca8bb1a73c2cce35e83603e9ac131ab8127db7e
4163d60123d5517bc229ba591dcf009f18842d219847455e9ab154ed6751fd5e
42bb877744c06037d98b964f68c3e5d4794968c0915fef531db5137a39b3b0c5
431ced6916a2a21a156e38701afe55bbd7f88969fbbfc56d7fe099d47f265460
4377f1167496d3c32e39f8c5c10b77db13f0460f2648afb46d23052406b2a6b7
43814f576ca8f07d79b059fc167caf849855e567ff76c5a0078bc229222f671d
4498c3ecab477e09bdc4e8b1a6aeca352448cbd50b3db9bedc23d655aad906b3
45661a3e6863d0c77529828a7bd5bc802d65fb7dbce6d7fde4df6d05f3394954
48e540075547b37df71fb60e3cea8b1c0da7f27038fea83e43b7026780278e31
4d131d092f6a1d44397026f1bf84f5d43382aaa32db44deb0d9226ed826f27b2
4e8d6e3b35948e5fb1b6d570acce30f0b1560ed00ec1f300793389f19c967dff
50e4207d414884b31a535e76afbf2a67f80e990ae1497c11c72a4c857509953a
54311a38f2adee0f66be493e6785f0f4a93887f7127796a2721492d8c7fa1f9f
54a5c9011a4eec01cb0af8620d0ce3dd3bba04b167b7f674b074428eeb06e020
58d691bab385679733ace3e3897224239ec3f2550c6e747003cc6fbb8b612ca8
5a9398a248087d6325690b856480f340f7d32645f436a794a730e9c801543e24
5b54ebb2ed254f7922b3af74610d4487b245899ac8e4178f4c6553b6781da60a
5c53c39018b0b497f2aa2e27114075534e637621a37383bcfa38bcbfff734418
5c7586d2259032c3d81eed9123bbb07b176f5e6b0a4e7cf80f2455bd2eec0097
5d83db90a68d83e188b78e4930cb541dbf8e1b974fe945299ac2832c0651d746
5f5016d4491699bfccc0ae0906b21a4b7c427f58ae24265e46cb6aecfc4612ca
60fde9a3d1231076ddc27b729fb0f13218efa59200b0a562d3ebc77e84155d6f
62d79df14cd7c855ebdc917e294b9e303ddd2a0c18a598bb8dc23fed081a0b36
62f2eeec7851ae0d5e322062cf40092478236d4a4fc5a2cfd87b257739104147
6546ea7bd057a25d0198ff233e30008c8c8f99bcef163ff487a255db68577007
65a942306bd489ce6f7e9a200a578e3144d344fbf78b567217f7a6b30892b0a9
6ce443467d94e55a6b2b941a556f75f30145dcf47dfa7f993d38613f365b7c7d
6ce9b19b20765d6af57db7cbfd3b1948c96affe4a54866b6832283cb180ffef2
6fce4c31ae850b2040455bce806118643449d95394856d93a96e1711c48bcd89
7029e5ae6be4b0c21655d2269a96f553c8721c4012ab8fee483acf10e50e603f
70df84d6d9c505a4a0e012fcca28acb82d7f74b5939a433e3b789623740f3410
714b111098ec8f8a5521c4698585d0ca59efc6e450351c5770f01f2c0794a6e3
71615fc82cdbb28aa6e3b296cc214a504e6139a3b7b441878bdf0c499cbf1529
760e4b5d62fd40555e5378e6216c0d4bec64c26bd39d3418b59e14c46ad0aa08
7984292f8c57a537016e4e88ab90ef2bf63982f9b76a0d7bd66cf2012b574ccc
7e7fa886d5d75c745d95be4fc3c5bfb4c988019b3f643c669734612345e1b8c8
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
8372653a80b960d6c20b63c9579e60b63c3235ab7a41ee1c23b547057fed6b63
83b8cb33a2dc75c2e9f36d30a83096d1b01fbfd72d9abd18b1d7c23b5afda507
841aa5512f19637e5282324602a3c50df33b534efacff2591a8f3e2a5b338482
841e51f02812313861d79651021e1bfdcb966aaa484871437158e58350dd2364
8a5ebf17c751099d2f751d23dd57cd262691ccc803fc6f8fa1712922a86a8a8d
8ba131a677ea1357ae7fdc95d6a5c67c3b02d171bb286f6c9ec6bce3cef5c211
8bc02857898a0eb9d2d93d339c917f081a5cd1d509736b41cbc506791e080612
8cccd4f61058a5068c3e3391580e38565fbbcacb286b802e6db362fa9e48d52e
9326b813f05efe1ac285085eef770b1036f77bdbbedf69f79eb83b35a121040c
9655762a829d7bfcb524c4c1ed77ae3a8eca3326fe70411a6c7e333a4b3fcbe5
984d6c047a051a122d2ad6f9a807c98ff8347921b053ab2062f2d56aba372ff8
98b3d9d20e032f90aca49e9b116225d539ff6fbdb7e42c3c363f63896ac03d2a
9cb0d8ca23e85c573020bb10fd0c1dc4dd49ef1cc52dba24a386b90dfa03f242
9d02d662da8a47fb5fb610b545007507b6017028043dbb63cd09ec897d3b9627
9e62630fe5b68c1a7ec5cd05c3e283faa7a50fd59224caeb094ab127ba357147
a09039b257b8f42b4eb51b238e69cafb461843c2d9a983e9fe38a223157de92e
a16d97b255903274b8c390ca7cc0da0940acbae6f9ca5de5d7760ba84b0317be
a5af499ea50451b9b3cf1a8a315a7123737ca8763742c2797175234c6aba5cfd
a62f5daff85d4695d52eb94efef62aea68deb1eb2baaa3c6463d6f95dadbb240
a9c3dccc596ea428ef624a1e0d182aeaba5d31ebd85555c055725c475ac79180
adfa0c7de03bc3bea3de80b4a4514881c8b6296568f43a5acd5cd7a16fffd1c9
ae8f9dd465ab424d0dd4f81f7ba9ec5029f6736e090c3f33b5f0fa0c0ecc47dc
ae9603eb7dd2b6b372036ea18de672039e9b47285e0554d3a83abf009c389cc4
aeaf2087d22fbd527fbcab06ff6081c164cc1e41feb7c718c2d9592455b16432
afe0dcfca292a0fae8bce08a48c14d3e59c9d82c6052ab6d48a22ecc6c48f277
b0b3c8f57bae0e0f2240b410e306fef853b90d73d16eef0e28d6be3d8810e589
b2c78c910f5ea29e3a9d223dabc203c055c8708b1fe7d83788b490638126db4d
b38b0e3eff73eeb3a5a6280427497a4356db8e352facac5e6ec48f96dddb6598
b526b37334371d31e1d10fbf239d21e98de6d2de57d12f654550ac0a0158c04f
b6e89b196dba23b546bd19d80743af51191cd3a844f664c8e07cd29bfd9f2778
b86dbaf33aed868e17e2be26b2b79b3f608227993089419ec4c298e57544b17f
be349e4a81c1b5b8a11915a8537a9b73e24d8a583a60e02cf5681cdddcacb67a
c34642860a30666336cb4b9fc3df36eaebc6424ee8c75d869679054008b7cd79
c349d122e6ba65cdd31c45c66b9ba479622d8466a6a856b2c293d549c01daafc
c50e9977531a9ae2a156ab2a1333c0e6a161d38a893b964219b78c3dceafc0e1
c5302497f6664f4f5e3aa7541aebf2f49b9f4d2a52ae4e2cc5d130ed84c2a468
c60846aed56a26eafbf8d3f328d625369a1a203bf94668e35d24fc1d1968069f
c96cce85dd167f83c9f83421911804fe0e6779dd5f2e916d57ed16f12dfca6c4
ca45c62be33cfe9a0a2f13b2d136f1df1cb7215691403038825639da75afbf3f
cb16ea669bb13941fc86a8c6d8e8318154b531c3e81f8161c2958dfbeeeca26e
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
cfd906b7da0a689f73ffec765f41b30ee93374980ca9613d7950e1ecb73e1f22
d0022240da09ad3c144bc9e93f1834a7ddbf085af4772bcfe831483aef5b4a6d
d2042f11d6be3b4a1c4d5cbb8c0edf0d8857a9de215c29d8e4d38ba354991966
d250260787efed78dd06a1f30ef3503b52ce8271cc22a08b891adaf21eefabc1
d26219502db4341b143487b9d86a786920a11c69c3bab275d4ecbbbb41c40361
d5ea92e80113829e1cc60cb096ac79b4cf7c30c836991667ca7c6605f181bb13
d811dc88d585ffb20a2d37cd6dbe20e3f62025359c59bed17e3a865d33fe98b6
da8bee83ba5ce5cb5c51c9c871a3893541127f06d069e145d59366462c57d694
dc4ebc15ba0d09ed863adb0bddf3f578bc5365aaaed89d20f879ac56bee92508
dff33a67b61fc44fb90cd3d8dcede66b087afeb992b3338e8ffecaac478f246e
e0da4b1ee9e976b49dc9386f3566116a912ab17c4a1c70cb21d293b52d5580e0
e192dd8b901bad10acc59606190d742e67dc587f9d3334c609ab030fe12ed52e
e2d8cbfea0973cd587c24331f4e4a3860f3304dbe615387546e6d6d18bc13fce
e3164f36e9232deb3418aa5597704cece8e3a5f29d47e32434e4e244eac69bc6
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e3e6c93defad2cf35199cb4a925b7ddd47efa939786ca22038d4d3b5ef4ea14c
e63c19432c52962af286557eff528b01b61c8bf5b7247f00b393c16418f9630a
e72acd75e28308144c191955763a907264b850d4e8e2960d724f273e4934e34d
e94712bd5679e91d66469fac2cbf6322a706e4e8f25fe37c762b8167391a7c2c
e968b471fa7b2768c0e4b827d941766b635115a3b610cce0fdb1d098ba6e8e66
ec3943468e660a13879ad7ea484da73199fd5220d765a1163c045294fbc1c546
ec734c8897764322b10b819d78cc8933f050ba27cc3f971ee23ea91b9fdc958e
ee52a10d40743de74b0423fe5545236523d63452b157deea7c6cdfa27385a336
eebd6f2e5a80bb5d11966fd2446842888fcefdc5b18a36a619aa6fa0756e9376
ef17b586a6d93ed703c8f3c1886787ffeee59b66420c382951201361c6779b02
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f1379a9c047773af19ec6c4f9a465e0147cbabc785342c01110b43304179196a
f5fb8f9665297597414c1d5fb85126edf1667aa7d603bd6756d7d54b582d7ef9
f68e85f197e649cbbad2544598485f7a5a5b1c2c4391bce3ce2edd1fcfeeb0f4
f6909127fd4c3efa17cc2c29ad497ca29a8522dd0009cca8d0d6cd508c75ee54
f88e118eda8f80290c8a8c66e75ba47e9b96188892b054e44ceb50c6a08537c1
f9419c8665c921f8c9e31bfa93744613721289a9c3b45a0ace0507fa54813da0
f9bdcab450e855bce8221fca51b8e74ee0efefbe9329b2da090a3df6f1e709c8
fb5fde7ad48f0e3be65777054634282f3bb40f1ab4b228194465ab30f590af6e
fcca3b2893a95fe263221d949f650ebbae88f3465c4ec87e17900ea6df0d58f3
fe8d5bc5ff7f1e75941480d428134e3acd978c865accb77d110cc55e3b120d4d
fec4969577c947a272b6be6924b17ca584660dccaa35d17dd05471b0f0b3e548
ff4b8e8962f23810dfba6084bd82cc367d9aa3b49bfe0612bb2a98bc592eb1fe