Submitted URL: https://t.co/EQWgQUtcoG
Effective URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Submission: On March 02 via manual from JP

Summary

This website contacted 36 IPs in 5 countries across 28 domains to perform 156 HTTP transactions. The main IP is 133.130.50.172, located in Japan and belongs to INTERQ GMO Internet,Inc, JP. The main domain is tower.jp.
TLS certificate: Issued by Cybertrust Japan SureServer EV CA G3 on February 25th 2020. Valid for: a year.
This is the only time tower.jp was scanned on urlscan.io!

urlscan.io Verdict: No classification

Domain & IP information

IP Address AS Autonomous System
4 104.244.42.133 13414 (TWITTER)
46 133.130.50.172 7506 (INTERQ GM...)
1 23.111.9.35 33438 (HIGHWINDS2)
1 2a00:1450:400... 15169 (GOOGLE)
1 202.79.240.62 24253 (J-STREAM ...)
3 18.140.152.123 16509 (AMAZON-02)
45 65.9.58.52 16509 (AMAZON-02)
2 65.9.58.40 16509 (AMAZON-02)
1 4 2a00:1450:400... 15169 (GOOGLE)
1 151.101.12.157 54113 (FASTLY)
1 142.250.185.66 15169 (GOOGLE)
1 2a00:1450:400... 15169 (GOOGLE)
1 2 54.199.47.219 16509 (AMAZON-02)
3 2a03:2880:f01... 32934 (FACEBOOK)
2 183.79.249.252 24572 (YAHOO-JP-...)
4 13.225.74.64 16509 (AMAZON-02)
1 184.30.25.99 16625 (AKAMAI-AS)
1 2a00:1450:400... 15169 (GOOGLE)
2 2a00:1450:400... 15169 (GOOGLE)
4 2a00:1450:400... 15169 (GOOGLE)
2 203.104.153.77 38631 (LINE LINE...)
1 183.79.255.12 24572 (YAHOO-JP-...)
4 2a03:2880:f11... 32934 (FACEBOOK)
4 2a00:1450:400... 15169 (GOOGLE)
4 2a00:1450:400... 15169 (GOOGLE)
1 54.150.94.100 16509 (AMAZON-02)
3 104.244.42.3 13414 (TWITTER)
1 2a04:4e42:1b:... 54113 (FASTLY)
1 210.140.252.195 4694 (IDCF IDC ...)
1 65.9.187.79 16509 (AMAZON-02)
1 13.225.74.33 16509 (AMAZON-02)
1 151.101.114.110 54113 (FASTLY)
1 52.68.230.127 16509 (AMAZON-02)
2 13.32.24.99 16509 (AMAZON-02)
2 162.247.243.146 13335 (CLOUDFLAR...)
156 36
Domain Requested by
46 tower.jp t.co
tower.jp
ajax.googleapis.com
45 cdfront.tower.jp tower.jp
4 www.google.de tower.jp
4 www.google.com tower.jp
4 www.facebook.com tower.jp
4 googleads.g.doubleclick.net www.googleadservices.com
4 checkout-api.worldshopping.jp www.googletagmanager.com
checkout-api.worldshopping.jp
checkout-js.worldshopping.jp
4 t.co tower.jp
3 analytics.twitter.com static.ads-twitter.com
3 connect.facebook.net t.co
connect.facebook.net
2 bam-cell.nr-data.net js-agent.newrelic.com
2 api.locize.io text
2 www.pages07.net
2 ssl.google-analytics.com 1 redirects tower.jp
2 tr.line.me tower.jp
2 stats.g.doubleclick.net www.google-analytics.com
tower.jp
2 s.yimg.jp www.googletagmanager.com
2 ec-concier.com 1 redirects tower.jp
2 www.google-analytics.com www.googletagmanager.com
www.google-analytics.com
2 www.googletagmanager.com tower.jp
www.googletagmanager.com
2 cdn.tower.jp tower.jp
1 api.mdb.tower.jp tower.jp
1 js-agent.newrelic.com tower.jp
1 checkout-js.worldshopping.jp checkout-api.worldshopping.jp
1 resource.buyee.jp tower.jp
1 a.imgvc.com tower.jp
1 trj.valuecommerce.com www.googletagmanager.com
1 banner.buyee.jp tower.jp
1 b97.yahoo.co.jp tower.jp
1 d.line-scdn.net t.co
1 www.googleadservices.com www.googletagmanager.com
1 static.ads-twitter.com www.googletagmanager.com
1 www.sc.pages07.net tower.jp
1 web-cache.chocomaru.com tower.jp
1 ajax.googleapis.com tower.jp
1 use.fontawesome.com tower.jp
156 36
Subject Issuer Validity Valid
t.co
DigiCert TLS RSA SHA256 2020 CA1
2021-02-05 -
2022-02-04
a year crt.sh
tower.jp
Cybertrust Japan SureServer EV CA G3
2020-02-25 -
2021-03-31
a year crt.sh
*.fontawesome.com
DigiCert TLS RSA SHA256 2020 CA1
2020-11-13 -
2021-12-14
a year crt.sh
upload.video.google.com
GTS CA 1O1
2021-01-26 -
2021-04-20
3 months crt.sh
web-cache.chocomaru.com
GlobalSign GCC R3 DV TLS CA 2020
2020-12-09 -
2022-01-10
a year crt.sh
*.engage7.silverpop.com
DigiCert TLS RSA SHA256 2020 CA1
2020-11-09 -
2021-11-16
a year crt.sh
cdfront.tower.jp
Cybertrust Japan SureServer EV CA G3
2020-11-02 -
2021-11-30
a year crt.sh
cdn.tower.jp
Cybertrust Japan SureServer EV CA G3
2020-02-25 -
2021-03-31
a year crt.sh
*.google-analytics.com
GTS CA 1O1
2021-01-26 -
2021-04-20
3 months crt.sh
ads-twitter.com
DigiCert SHA2 High Assurance Server CA
2020-08-14 -
2021-08-19
a year crt.sh
www.googleadservices.com
GTS CA 1O1
2021-01-26 -
2021-04-20
3 months crt.sh
ec-concier.com
DigiCert SHA2 Extended Validation Server CA
2020-01-29 -
2021-04-18
a year crt.sh
*.facebook.com
DigiCert SHA2 High Assurance Server CA
2021-02-10 -
2021-05-10
3 months crt.sh
edge01.yahoo.co.jp
Cybertrust Japan SureServer CA G4
2021-02-10 -
2022-03-09
a year crt.sh
*.worldshopping.jp
Amazon
2020-07-03 -
2021-08-03
a year crt.sh
line-apps.com
DigiCert SHA2 Secure Server CA
2021-01-14 -
2022-01-18
a year crt.sh
*.g.doubleclick.net
GTS CA 1O1
2021-01-26 -
2021-04-20
3 months crt.sh
*.line.me
GlobalSign RSA OV SSL CA 2018
2020-06-17 -
2022-09-05
2 years crt.sh
mscedge01.yahoo.co.jp
Cybertrust Japan SureServer CA G4
2020-08-04 -
2021-09-03
a year crt.sh
www.google.com
GTS CA 1O1
2021-01-26 -
2021-04-20
3 months crt.sh
www.google.de
GTS CA 1O1
2021-01-26 -
2021-04-20
3 months crt.sh
*.google.com
GTS CA 1O1
2021-01-26 -
2021-04-20
3 months crt.sh
*.buyee.jp
Starfield Secure Certificate Authority - G2
2020-08-21 -
2021-10-26
a year crt.sh
*.twitter.com
DigiCert TLS RSA SHA256 2020 CA1
2021-02-05 -
2022-02-04
a year crt.sh
*.valuecommerce.com
DigiCert SHA2 Secure Server CA
2020-09-28 -
2021-10-06
a year crt.sh
*.imgvc.com
DigiCert SHA2 Secure Server CA
2020-08-31 -
2021-10-01
a year crt.sh
f4.shared.global.fastly.net
GlobalSign CloudSSL CA - SHA256 - G3
2020-12-28 -
2021-05-07
4 months crt.sh
api.mdb.tower.jp
Amazon
2020-09-25 -
2021-10-25
a year crt.sh
*.locize.app
Amazon
2020-12-09 -
2022-01-07
a year crt.sh
*.nr-data.net
DigiCert SHA2 Secure Server CA
2020-02-05 -
2022-02-08
2 years crt.sh

This page contains 1 frames:

Primary Page: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Frame ID: C4129B0F8453BA4D60ACF95FC6DF22EB
Requests: 156 HTTP requests in this frame

Screenshot


Page URL History Show full URLs

  1. https://t.co/EQWgQUtcoG Page URL
  2. https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483 Page URL

Page Statistics

156
Requests

100 %
HTTPS

31 %
IPv6

28
Domains

36
Subdomains

36
IPs

5
Countries

1682 kB
Transfer

4902 kB
Size

20
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. https://t.co/EQWgQUtcoG Page URL
  2. https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483 Page URL

Redirected requests

There were HTTP redirect chains for the following requests:

Request Chain 74
  • https://ec-concier.com/0168cd9aadcd65e1/analytics.js HTTP 302
  • https://ec-concier.com/webpack/analytics.js?3dfb56a20cbebce37074cdfdbe425f67ab096d306d3e449dd16c24da13adb847
Request Chain 119
  • https://ssl.google-analytics.com/r/__utm.gif?utmwv=5.7.2&utms=1&utmn=1833220584&utmhn=tower.jp&utmcs=UTF-8&utmsr=1600x1200&utmvp=1600x1200&utmsc=24-bit&utmul=en-us&utmje=0&utmfl=-&utmdt=TOWER%20RECORDS%20ONLINE&utmhid=685202172&utmr=https%3A%2F%2Ft.co%2FEQWgQUtcoG&utmp=%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%25257C4562494353483&utmht=1614676132805&utmac=UA-1590191-2&utmcc=__utma%3D144181808.2007558036.1614676131.1614676133.1614676133.1%3B%2B__utmz%3D144181808.1614676133.1.1.utmcsr%3Dt.co%7Cutmccn%3D(referral)%7Cutmcmd%3Dreferral%7Cutmcct%3D%2FEQWgQUtcoG%3B&utmjid=1107790623&utmredir=1&utmu=DAAAAAAAAAAAAAAAAAABAAAE~ HTTP 302
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-1590191-2&cid=2007558036.1614676131&jid=1107790623&_v=5.7.2&z=1833220584

156 HTTP transactions

Resource
Path
Size
x-fer
Type
MIME-Type
EQWgQUtcoG
t.co/
392 B
451 B
Document
General
Full URL
https://t.co/EQWgQUtcoG
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.42.133 , United States, ASN13414 (TWITTER, US),
Reverse DNS
Software
tsa_o /
Resource Hash
e62dfc396b9f02438f76fb05e0d771bf13512d6e227fdec2a033b857718336a8
Security Headers
Name Value
Strict-Transport-Security max-age=0
X-Xss-Protection 0

Request headers

:method
GET
:authority
t.co
:scheme
https
:path
/EQWgQUtcoG
pragma
no-cache
cache-control
no-cache
upgrade-insecure-requests
1
user-agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-fetch-site
none
sec-fetch-mode
navigate
sec-fetch-user
?1
sec-fetch-dest
document
accept-encoding
gzip, deflate, br
accept-language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

cache-control
private,max-age=300
content-encoding
gzip
content-length
223
content-type
text/html; charset=utf-8
date
Tue, 02 Mar 2021 09:08:44 GMT
expires
Tue, 02 Mar 2021 09:13:44 GMT
server
tsa_o
set-cookie
muc=c58c8afc-6fe7-4702-83e8-00b3e1a27e32; Max-Age=63072000; Expires=Thu, 02 Mar 2023 09:08:44 GMT; Domain=t.co; Secure; SameSite=None
strict-transport-security
max-age=0
vary
Origin
x-connection-hash
a39b14d7f37ee4570f252997f3b380e3
x-response-time
121
x-xss-protection
0
Primary Request Cookie set search
tower.jp/search/advanced/item/
74 KB
22 KB
Document
General
Full URL
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Requested by
Host: t.co
URL: https://t.co/EQWgQUtcoG
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
3c19fa6f93526627aab799788fb2bfbb1aaa425903d3f293ba310a41665ffcd2

Request headers

Host
tower.jp
Connection
keep-alive
Pragma
no-cache
Cache-Control
no-cache
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Accept
text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site
cross-site
Sec-Fetch-Mode
navigate
Sec-Fetch-Dest
document
Referer
https://t.co/EQWgQUtcoG
Accept-Encoding
gzip, deflate, br
Accept-Language
en-US
Upgrade-Insecure-Requests
1
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Referer
https://t.co/EQWgQUtcoG

Response headers

Cache-Control
no-cache, no-store, max-age=0, private
Content-Encoding
gzip
Content-Type
text/html; charset=utf-8
Date
Tue, 02 Mar 2021 09:08:47 GMT
Expires
-1
Pragma
no-cache
Set-Cookie
tracking2=ca7f897f04de444b9bc8a0c12da7ef13; domain=.tower.jp; expires=Sun, 02-Mar-2031 09:08:46 GMT; path=/; SameSite=None; secure ASP.NET_SessionId=2woufk0xgiqkgg11l2tkzcfp; path=/; secure; HttpOnly SC_ANALYTICS_GLOBAL_COOKIE=d88609099a73408eb9baa9f94b5322e7|False; expires=Fri, 28-Feb-2031 09:08:46 GMT; path=/; secure; HttpOnly prev_page=https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483; path=/; SameSite=None; secure
Vary
Accept-Encoding
Content-Length
22183
Connection
keep-alive
Server
Scutum
all.css
use.fontawesome.com/releases/v5.6.3/css/
52 KB
13 KB
Stylesheet
General
Full URL
https://use.fontawesome.com/releases/v5.6.3/css/all.css
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
23.111.9.35 , United States, ASN33438 (HIGHWINDS2, US),
Reverse DNS
Software
NetDNA-cache/2.2 /
Resource Hash
481a0574246e281316ffa0e15399bf5388bb81ae550ce0401a0353b6bb2d1e5a

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Tue, 02 Mar 2021 09:08:47 GMT
content-encoding
gzip
last-modified
Thu, 20 Dec 2018 17:45:13 GMT
server
NetDNA-cache/2.2
etag
W/"dc93d584e41f8417f6b7163320d34329"
vary
Access-Control-Request-Headers, Access-Control-Request-Method, Accept-Encoding
access-control-allow-methods
GET
content-type
text/css
access-control-allow-origin
*
access-control-max-age
3000
cache-control
max-age=31556926
x-cache
HIT
09common.css
tower.jp/style/
160 KB
26 KB
Stylesheet
General
Full URL
https://tower.jp/style/09common.css?202011251900
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
a5232f9b282afe0a361288029ccc96669844229080bf190dc50fca53abcbf73c

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:47 GMT
Content-Encoding
gzip
Last-Modified
Thu, 04 Feb 2021 06:44:46 GMT
Server
Scutum
ETag
"083d639c1fad61:0"
Vary
Accept-Encoding
Content-Type
text/css
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
26016
12common.css
tower.jp/style/
69 KB
11 KB
Stylesheet
General
Full URL
https://tower.jp/style/12common.css?202006200000
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
c483acfc0b19eec9a41f91605b7b51f17b84da8c11d344ec6ca7696af14bfb8d

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:48 GMT
Content-Encoding
gzip
Last-Modified
Thu, 04 Feb 2021 06:52:05 GMT
Server
Scutum
ETag
"8098803fc2fad61:0"
Vary
Accept-Encoding
Content-Type
text/css
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
10487
lab.css
tower.jp/style/
16 KB
3 KB
Stylesheet
General
Full URL
https://tower.jp/style/lab.css
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
5aed7482ac5ee80931b3b0e2e5ee5824d7a71fa8d6693cc411079baf638a68cd

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:48 GMT
Content-Encoding
gzip
Last-Modified
Thu, 04 Feb 2021 06:28:12 GMT
Server
Scutum
ETag
"0265ee9befad61:0"
Vary
Accept-Encoding
Content-Type
text/css
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
3132
jquery.min.js
ajax.googleapis.com/ajax/libs/jquery/1.7.2/
93 KB
33 KB
Script
General
Full URL
https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:809::200a Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
sffe /
Resource Hash
47b68dce8cb6805ad5b3ea4d27af92a241f4e29a5c12a274c852e4346a0500b4
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Sat, 27 Feb 2021 09:21:42 GMT
content-encoding
gzip
x-content-type-options
nosniff
age
258425
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
33845
x-xss-protection
0
last-modified
Tue, 03 Mar 2020 19:15:00 GMT
server
sffe
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
access-control-allow-origin
*
cache-control
public, max-age=31536000, stale-while-revalidate=2592000
accept-ranges
bytes
timing-allow-origin
*
expires
Sun, 27 Feb 2022 09:21:42 GMT
jquery-1.7.2.js
tower.jp/javascript/
257 KB
73 KB
Script
General
Full URL
https://tower.jp/javascript/jquery-1.7.2.js
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
2d641afda5e68dd8ab7c4bdf4a232b08536f584fe200241876d068a07a35a72c

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:48 GMT
Content-Encoding
gzip
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
ETag
"0de91f621f9d61:0"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
74707
common.js
tower.jp/javascript/
7 KB
2 KB
Script
General
Full URL
https://tower.jp/javascript/common.js?201305092000
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
bab57a635cd38fdf5da8488c2ba1bc55d7a99221d631e97cc24cf7d153c0d221

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:48 GMT
Content-Encoding
gzip
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
ETag
"0de91f621f9d61:0"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1872
dayChecker.js
tower.jp/javascript/
5 KB
1 KB
Script
General
Full URL
https://tower.jp/javascript/dayChecker.js
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
3d893878229b2ced3cc5e4d3e75917f3b6b5035489e515dfbd422c643f373ca7

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:48 GMT
Content-Encoding
gzip
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
ETag
"0de91f621f9d61:0"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
908
towerrecords.js
tower.jp/javascript/
63 KB
15 KB
Script
General
Full URL
https://tower.jp/javascript/towerrecords.js?201903220000
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
30a5849c126dd8e55195496e99d4d21fea1c8a7182a3a996267f93e6c02db523

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:48 GMT
Content-Encoding
gzip
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
ETag
"0de91f621f9d61:0"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
14646
jquery.lightbox-0.5.min.js
tower.jp/javascript/
10 KB
3 KB
Script
General
Full URL
https://tower.jp/javascript/jquery.lightbox-0.5.min.js
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
07e181c68275ce643e2c11eac0f8b4886d031e7b3eca2da4a92e1c11516c9534

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:48 GMT
Content-Encoding
gzip
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
ETag
"0de91f621f9d61:0"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
2643
jplayer.js
web-cache.chocomaru.com/
2 KB
2 KB
Script
General
Full URL
https://web-cache.chocomaru.com/jplayer.js
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
202.79.240.62 Kasukabe, Japan, ASN24253 (J-STREAM J-Stream Inc., JP),
Reverse DNS
Software
/
Resource Hash
7af2a8c4fd6668804a86734010789407d157bf886b41af9b613b3fd3645f00c0

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Tue, 02 Mar 2021 09:08:48 GMT
via
JSTCDN
last-modified
Tue, 20 Feb 2018 01:59:27 GMT
x-origin-date
Tue, 02 Mar 2021 09:05:18 GMT
x-cache-age
210/300
content-type
application/x-javascript
x-cache
HIT/F
accept-ranges
bytes
content-length
2147
heightLine.js
tower.jp/javascript/
15 KB
2 KB
Script
General
Full URL
https://tower.jp/javascript/heightLine.js
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
4149b40a748cdec2c87a959885e3fbd374e033f0513ebc5e7bbbf384cc5244c0

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:48 GMT
Content-Encoding
gzip
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
ETag
"0de91f621f9d61:0"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1349
iMAWebCookie.js
www.sc.pages07.net/lp/static/js/
14 KB
14 KB
Script
General
Full URL
https://www.sc.pages07.net/lp/static/js/iMAWebCookie.js?3149a537-159a5c4d96d-3a49a1d67881ef16e3bf2f68bd600905&h=www.pages07.net
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.140.152.123 Singapore, Singapore, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-18-140-152-123.ap-southeast-1.compute.amazonaws.com
Software
Apache /
Resource Hash
27a1e80167055f562f0ddda38620ec1f5a354c5ab795c75da16874f4095520f3
Security Headers
Name Value
Strict-Transport-Security max-age=16070400; includeSubDomains; preload

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:48 GMT
Last-Modified
Tue, 16 Feb 2021 18:15:13 GMT
Server
Apache
ETag
"3772-5bb7815721cae"
Strict-Transport-Security
max-age=16070400; includeSubDomains; preload
Content-Type
application/javascript
Connection
close
Accept-Ranges
bytes
Content-Length
14194
navigationContents.js
tower.jp/javascript/
1 KB
1013 B
Script
General
Full URL
https://tower.jp/javascript/navigationContents.js?201712130000
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
1ac48d9af345dd28af1303b3f410527f21596c518b1b21d869b233a494e7945a

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:49 GMT
Content-Encoding
gzip
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
ETag
"0de91f621f9d61:0"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
693
search.css
tower.jp/style/
55 KB
10 KB
Stylesheet
General
Full URL
https://tower.jp/style/search.css
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
7aef2b67926d92a069eff1a28eb3c454825aa3cb2419054a0e3a43df945b51b7

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:48 GMT
Content-Encoding
gzip
Last-Modified
Thu, 04 Feb 2021 06:44:46 GMT
Server
Scutum
ETag
"083d639c1fad61:0"
Vary
Accept-Encoding
Content-Type
text/css
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
9687
osusume.js
tower.jp/javascript/
3 KB
1 KB
Script
General
Full URL
https://tower.jp/javascript/osusume.js
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
57131295389f99b9db459b9d7b857ebe2458f4c4ac2530c9cd72b7e45ba6eb02

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:49 GMT
Content-Encoding
gzip
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
ETag
"0de91f621f9d61:0"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1096
right_navi_btn.js
tower.jp/javascript/
1 KB
1 KB
Script
General
Full URL
https://tower.jp/javascript/right_navi_btn.js
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
c09a4ac86d24db52cd3382f681d858442fda8132ef701a5607b64e62e5b4e3b1

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:49 GMT
Content-Encoding
gzip
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
ETag
"0de91f621f9d61:0"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
867
helptab.js
tower.jp/javascript/
562 B
595 B
Script
General
Full URL
https://tower.jp/javascript/helptab.js
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
26f106635b241c3880235dca8b3a655f031b1ea065d69f029a5314000cb9431b

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:49 GMT
Content-Encoding
gzip
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
ETag
"0de91f621f9d61:0"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
275
search.js
tower.jp/javascript/
2 KB
971 B
Script
General
Full URL
https://tower.jp/javascript/search.js
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
8df801a08f3c5e999e78ee5284bbc456be85304cb1365d277c1f83470fd7ba0e

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:49 GMT
Content-Encoding
gzip
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
ETag
"0de91f621f9d61:0"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
651
jPages.js
tower.jp/javascript/
22 KB
5 KB
Script
General
Full URL
https://tower.jp/javascript/jPages.js
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
727c18e271d7da217503f74f7b937ee4af0b4f59ba8581d885474dae33d6903e

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:49 GMT
Content-Encoding
gzip
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
ETag
"0de91f621f9d61:0"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
4534
jquery.readmore.js
tower.jp/javascript/
2 KB
1 KB
Script
General
Full URL
https://tower.jp/javascript/jquery.readmore.js?201309061400
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
4ef6d36ec28aa5135b09a68f294cf8cc4f165c26782e95e70d161e912a417d59

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:49 GMT
Content-Encoding
gzip
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
ETag
"0de91f621f9d61:0"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
871
jquery.readmoreDetail.js
tower.jp/javascript/
15 KB
5 KB
Script
General
Full URL
https://tower.jp/javascript/jquery.readmoreDetail.js?201309061400
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
b40c65e2db05b2a8a3cbb59cd41e8f5d14bbb91a7ea2a24c9e99817c1a1be12c

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:49 GMT
Content-Encoding
gzip
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
ETag
"0de91f621f9d61:0"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
5203
VisitorIdentification.js
tower.jp/layouts/system/
2 KB
1 KB
Script
General
Full URL
https://tower.jp/layouts/system/VisitorIdentification.js
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
126b381f32f601d12e517bff52589bd007f815ec05a422e22c118f6497a2abfc

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:50 GMT
Content-Encoding
gzip
Last-Modified
Thu, 20 Jul 2017 04:22:46 GMT
Server
Scutum
ETag
"06f93d6f1d31:0"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=2592000
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
922
headerNav_logo_01.gif
cdfront.tower.jp/img12/common/
4 KB
5 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/common/headerNav_logo_01.gif
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
6bc0ce7ce61d95c25daf4e610b1581263d997546d7df6ed373fb3db7d89dbe78

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:51 GMT
Via
1.1 673c96d1f19de21216629aa48d90ac92.cloudfront.net (CloudFront)
Last-Modified
Tue, 02 Feb 2021 05:12:10 GMT
Server
Scutum
X-Amz-Cf-Pop
FRA56-C1
ETag
"0b160f521f9d61:0"
X-Cache
Hit from cloudfront
Content-Type
image/gif
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
4494
X-Amz-Cf-Id
AJA5IxDYWH-IKreM-F4cx3uhXlz4p0d60Ew0gfmPhDVSgicEQ7MnOA==
suggest.css
tower.jp/style/
9 KB
2 KB
Stylesheet
General
Full URL
https://tower.jp/style/suggest.css
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
0eb552152f6305ec644c355ae495a267467f1d0896c2613860290be7c52039eb

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:50 GMT
Content-Encoding
gzip
Last-Modified
Thu, 04 Feb 2021 06:37:11 GMT
Server
Scutum
ETag
"805a32ac0fad61:0"
Vary
Accept-Encoding
Content-Type
text/css
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1547
suggest.js
tower.jp/javascript/
18 KB
3 KB
Script
General
Full URL
https://tower.jp/javascript/suggest.js
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
8711600b9da5d151e0e5c013cfd991cca6080128c995304ed0a1de71961d6d11

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:50 GMT
Content-Encoding
gzip
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
ETag
"0de91f621f9d61:0"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
3241
suggest_search.js
tower.jp/javascript/
26 KB
4 KB
Script
General
Full URL
https://tower.jp/javascript/suggest_search.js
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
120e68bad5d24b0c40973ca2fee9d14110cadcb0a5eac012edcb8613aa22ba05

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:50 GMT
Content-Encoding
gzip
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
ETag
"0de91f621f9d61:0"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
4129
headerNav_bt_12.png
cdfront.tower.jp/img12/common/
3 KB
3 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/common/headerNav_bt_12.png
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
37a654f49298dc0a8748544e6c24a8dd4fceb700daab715f799d67986e4e2287

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 08:30:59 GMT
Via
1.1 5ab5e654a3dc7079aad7ac64ec697d82.cloudfront.net (CloudFront)
Connection
keep-alive
Last-Modified
Tue, 02 Feb 2021 05:12:10 GMT
Server
Scutum
Age
6250
ETag
"0b160f521f9d61:0"
X-Cache
Hit from cloudfront
Content-Type
image/png
Cache-Control
public
X-Amz-Cf-Pop
FRA56-C1
Accept-Ranges
bytes
Content-Length
2939
X-Amz-Cf-Id
-GtEi6qCdeES0DyjEK_2Tbpo8ZaShLRsf_CocZqqKmBZan43a8vV-g==
headerNav_bt_13.png
cdfront.tower.jp/img12/common/
3 KB
4 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/common/headerNav_bt_13.png
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
dc7665f524b201d6fc55e28649f1d19557b5612530869be6a500b3d69532b777

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Mon, 01 Mar 2021 10:41:06 GMT
Via
1.1 35a6ad9a7597ea2f4dacbdb5dc66a66c.cloudfront.net (CloudFront)
Connection
keep-alive
Last-Modified
Tue, 02 Feb 2021 05:12:10 GMT
Server
Scutum
Age
80864
ETag
"0b160f521f9d61:0"
X-Cache
Hit from cloudfront
Content-Type
image/png
Cache-Control
public
X-Amz-Cf-Pop
FRA56-C1
Accept-Ranges
bytes
Content-Length
3423
X-Amz-Cf-Id
krXEPgqdTtcDBOnlFbg1IPtIzm3u5dVZtmHrYi10oiA5Ajzl23N8vg==
close_btn.jpg
tower.jp/img12/search/common/
840 B
1 KB
Image
General
Full URL
https://tower.jp/img12/search/common/close_btn.jpg
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
9a8279b6f428826ee42f582a1894eb29d17bd4acef46a3ae87d310974cefd6a7

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:52 GMT
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
ETag
"0de91f621f9d61:0"
Content-Type
image/jpeg
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
840
bt_01_a.png
cdfront.tower.jp/img12/common/
5 KB
6 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/common/bt_01_a.png
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
c8112c38ab6471835615b6188a847011200491cdbdd29d4dff89ae449105eb51

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:06:14 GMT
Via
1.1 a618edcb8ddcdae59a3a61a6c82ff54d.cloudfront.net (CloudFront)
Connection
keep-alive
Last-Modified
Tue, 02 Feb 2021 05:12:10 GMT
Server
Scutum
Age
156
ETag
"0b160f521f9d61:0"
X-Cache
Hit from cloudfront
Content-Type
image/png
Cache-Control
public,max-age=600
X-Amz-Cf-Pop
FRA56-C1
Accept-Ranges
bytes
Content-Length
5453
X-Amz-Cf-Id
5-xcQH4keU7t9rroeIi5QDp2ST84FHtdRzgA2UNKBXzVNlccGTSadg==
WebResource.axd
tower.jp/
23 KB
6 KB
Script
General
Full URL
https://tower.jp/WebResource.axd?d=pynGkmcFUV13He1Qd6_TZC2eVEzyIKAAN2eLqBbkVDwp7OUJg9pKWjSaamCkTpXVhhbhcZx3G25MSCkLYeQJig2&t=636935209199995647
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
40732e9dcfa704cf615e4691bb07aecfd1cc5e063220a46e4a7ff6560c77f5db

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:50 GMT
Content-Encoding
gzip
Last-Modified
Wed, 15 May 2019 03:41:59 GMT
Server
Scutum
Vary
Accept-Encoding
Content-Type
application/x-javascript
Cache-Control
public
Connection
keep-alive
Content-Length
6007
Expires
Wed, 02 Mar 2022 03:00:44 GMT
ScriptResource.axd
tower.jp/
27 KB
5 KB
Script
General
Full URL
https://tower.jp/ScriptResource.axd?d=zvkqIRNUspAvS1yKeFhMbzMCZ0ef4utNXfjY_89w17IbYCJbt9FU7OJnWq44QsbEdpJIhSCOwqcPhE3uRbbJk3TdAcKyJ2eedlKSnUnckqxYpMY1iEftu1Bu0PSd3jZF2uqJGO5BrWe2xYSOBY5qmg2&t=4e518d44
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
b9703df5640cd1d2fccb85ef4187702dfab9ab4b54f9ad1f18d3e292c482476e

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:50 GMT
Content-Encoding
gzip
Last-Modified
Mon, 01 Mar 2021 22:36:44 GMT
Server
Scutum
Content-Type
application/x-javascript
Cache-Control
public
Connection
keep-alive
Content-Length
4828
Expires
Tue, 01 Mar 2022 22:36:44 GMT
ScriptResource.axd
tower.jp/
86 KB
27 KB
Script
General
Full URL
https://tower.jp/ScriptResource.axd?d=x6wALODbMJK5e0eRC_p1Lb30FVm1CvLNcBDxl6oHfeGSj0_tmFGuxxQqKpDOuCQsXQpWJCN-qgtH9FMFWI65qbMf0Z6axN9BlCTVi8NxcROH21WW75Nq92VyxUOXLHP40&t=734d43f5
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
f1d2a34f883d83fe764db7fa3b17845cfd31f81ccd1426129111cde47437ad0a

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:50 GMT
Content-Encoding
gzip
Last-Modified
Tue, 02 Mar 2021 08:15:47 GMT
Server
Scutum
Content-Type
application/x-javascript
Cache-Control
public
Connection
keep-alive
Content-Length
27417
Expires
Wed, 02 Mar 2022 08:15:47 GMT
ScriptResource.axd
tower.jp/
36 KB
10 KB
Script
General
Full URL
https://tower.jp/ScriptResource.axd?d=P5lTttoqSeZXoYRLQMIScDaU9IRj5VY-vUQCuWLybnAcZ3DlFWP5oZuj1h5Zs5FzNBs5rTvLJFXPzEKQV6zb-oSEd3s2t6YoZYRTf6f-7YmmOfKiBxl2bxA_vzLbwEIj0&t=734d43f5
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
3842b063705286e729befd4832755eb4aa7df42d505201c7ea76b19517b46ac9

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:51 GMT
Content-Encoding
gzip
Last-Modified
Mon, 01 Mar 2021 23:08:02 GMT
Server
Scutum
Content-Type
application/x-javascript
Cache-Control
public
Connection
keep-alive
Content-Length
9859
Expires
Tue, 01 Mar 2022 23:08:02 GMT
mdb_search.js
tower.jp/javascript/
10 KB
2 KB
Script
General
Full URL
https://tower.jp/javascript/mdb_search.js?20201210
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
712ee50dad1b20364445bf525020dd27fa1b955a52607ce6dafa9de0918a50ee

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:51 GMT
Content-Encoding
gzip
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
ETag
"0de91f621f9d61:0"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
2138
mdb_search_parts.css
tower.jp/style/
1 KB
1 KB
Stylesheet
General
Full URL
https://tower.jp/style/mdb_search_parts.css
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
55cd1edaa9a74ccd29537484c801462c417fd96e46640182f7baf14a044ec423

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:51 GMT
Content-Encoding
gzip
Last-Modified
Tue, 02 Feb 2021 05:12:14 GMT
Server
Scutum
ETag
"0bc3f721f9d61:0"
Vary
Accept-Encoding
Content-Type
text/css
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
744
mainLeft_h2_01.gif
tower.jp/img12/search/common/
2 KB
2 KB
Image
General
Full URL
https://tower.jp/img12/search/common/mainLeft_h2_01.gif
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
d44b09ffb577b57e6ce2e752f490a0e591b491e276f1eaae0dfd8281e6478945

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:51 GMT
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
ETag
"0de91f621f9d61:0"
Content-Type
image/gif
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
2256
15.jpg
cdfront.tower.jp/~/media/Images/Tol/pc/article/campaign/2021/067/
26 KB
27 KB
Image
General
Full URL
https://cdfront.tower.jp/~/media/Images/Tol/pc/article/campaign/2021/067/15.jpg
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
2d30b6fbb1e3c1ef16cce11496e43b32b9b8f6782208684fe63c48a47dd7c4df

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:52 GMT
Via
1.1 fdd677a35b242f0199586a71e2f6859f.cloudfront.net (CloudFront)
X-Amz-Cf-Pop
FRA56-C1
X-Cache
RefreshHit from cloudfront
Content-Disposition
inline; filename="15.jpg"
Connection
keep-alive
Content-Length
26599
Last-Modified
Tue, 16 Feb 2021 04:12:16 GMT
Server
Scutum
ETag
fb2cddc2fec948659d971681ecd291cc
Access-Control-Allow-Methods
GET,PUT,POST,DELETE,OPTIONS
Content-Type
image/jpeg
Access-Control-Allow-Origin
*
Cache-Control
public, max-age=600
Accept-Ranges
bytes
Access-Control-Allow-Headers
Content-Type
X-Amz-Cf-Id
klmbVwyDos7qRcwWsuDyXY9VIYN0pVkFPrzz0NCxRi2IsA7VZCxFVw==
Expires
Tue, 02 Mar 2021 09:18:52 GMT
107.jpg
cdfront.tower.jp/~/media/Images/Tol/pc/bnr/genre/books/192x69/
50 KB
51 KB
Image
General
Full URL
https://cdfront.tower.jp/~/media/Images/Tol/pc/bnr/genre/books/192x69/107.jpg
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
bc0bb941ff4d0254e4776285401b9d22a976711f3bbbdc9e0c83420a6e46d640

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:53 GMT
Via
1.1 673c96d1f19de21216629aa48d90ac92.cloudfront.net (CloudFront)
X-Amz-Cf-Pop
FRA56-C1
X-Cache
RefreshHit from cloudfront
Content-Disposition
inline; filename="107.jpg"
Connection
keep-alive
Content-Length
51655
Last-Modified
Fri, 27 Nov 2020 09:49:02 GMT
Server
Scutum
ETag
8e15e074c95b4e7696bdc9fc8ff4d582
Access-Control-Allow-Methods
GET,PUT,POST,DELETE,OPTIONS
Content-Type
image/jpeg
Access-Control-Allow-Origin
*
Cache-Control
public, max-age=600
Accept-Ranges
bytes
Access-Control-Allow-Headers
Content-Type
X-Amz-Cf-Id
IRTt-P-HDUHqhcnzPj89mTh5Cs-XGckxv7hmtR6OSrq43JPFQ2wBtg==
Expires
Tue, 02 Mar 2021 09:18:53 GMT
15.jpg
cdfront.tower.jp/~/media/Images/Tol/pc/article/campaign/2020/252/
20 KB
21 KB
Image
General
Full URL
https://cdfront.tower.jp/~/media/Images/Tol/pc/article/campaign/2020/252/15.jpg
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
73194afbca60b2564c4247a66a6fcaee5ad8ebe033c412f014b52edbd5d6c057

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:53 GMT
Via
1.1 35a6ad9a7597ea2f4dacbdb5dc66a66c.cloudfront.net (CloudFront)
X-Amz-Cf-Pop
FRA56-C1
X-Cache
RefreshHit from cloudfront
Content-Disposition
inline; filename="15.jpg"
Connection
keep-alive
Content-Length
20872
Last-Modified
Fri, 12 Feb 2021 07:25:46 GMT
Server
Scutum
ETag
191d654a76794670a535fb2f94083932
Access-Control-Allow-Methods
GET,PUT,POST,DELETE,OPTIONS
Content-Type
image/jpeg
Access-Control-Allow-Origin
*
Cache-Control
public, max-age=600
Accept-Ranges
bytes
Access-Control-Allow-Headers
Content-Type
X-Amz-Cf-Id
Zd0xrqbPE7eSuZj3iVw6tbGgANQFsv0hb6YzjlElDvWRcvMsMRGXFA==
Expires
Tue, 02 Mar 2021 09:18:53 GMT
15.jpg
cdfront.tower.jp/~/media/Images/Tol/pc/article/campaign/2020/387/
43 KB
43 KB
Image
General
Full URL
https://cdfront.tower.jp/~/media/Images/Tol/pc/article/campaign/2020/387/15.jpg
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
8903ee493612b4f22a87354d5fb77c4463fb987872f16cb49d1bd127be436910

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:54 GMT
Via
1.1 a618edcb8ddcdae59a3a61a6c82ff54d.cloudfront.net (CloudFront)
X-Amz-Cf-Pop
FRA56-C1
X-Cache
RefreshHit from cloudfront
Content-Disposition
inline; filename="15.jpg"
Connection
keep-alive
Content-Length
43751
Last-Modified
Tue, 26 Jan 2021 09:14:54 GMT
Server
Scutum
ETag
3cacb73c37c54b5c82e8cebffbc04b17
Access-Control-Allow-Methods
GET,PUT,POST,DELETE,OPTIONS
Content-Type
image/jpeg
Access-Control-Allow-Origin
*
Cache-Control
public, max-age=600
Accept-Ranges
bytes
Access-Control-Allow-Headers
Content-Type
X-Amz-Cf-Id
54Z3adCxEABDJ21Fb0U30p1Dm9u5UTCEKtG1ykQAlDKoxVHH3RhM5Q==
Expires
Tue, 02 Mar 2021 09:18:53 GMT
15.gif
cdfront.tower.jp/~/media/Images/Tol/pc/article/campaign/2021/001/
30 KB
31 KB
Image
General
Full URL
https://cdfront.tower.jp/~/media/Images/Tol/pc/article/campaign/2021/001/15.gif
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
5657567a1698adebc9687013b75f3285a7e84eb94dcc2d7c226889c3419229b5

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:53 GMT
Via
1.1 6b38a2e1db230db568190464ab7177db.cloudfront.net (CloudFront)
X-Amz-Cf-Pop
FRA56-C1
X-Cache
RefreshHit from cloudfront
Content-Disposition
inline; filename="15.gif"
Connection
keep-alive
Content-Length
30551
Last-Modified
Thu, 07 Jan 2021 02:43:18 GMT
Server
Scutum
ETag
07b506d86a3841f784c2dbb583409fdf
Access-Control-Allow-Methods
GET,PUT,POST,DELETE,OPTIONS
Content-Type
image/gif
Access-Control-Allow-Origin
*
Cache-Control
public, max-age=600
Accept-Ranges
bytes
Access-Control-Allow-Headers
Content-Type
X-Amz-Cf-Id
Onbia8i3h2pC_G6kRe4pmHdWucSLIqnfhF6i48C6qtQ3CIdBnqXARQ==
Expires
Tue, 02 Mar 2021 09:18:53 GMT
15.jpg
cdfront.tower.jp/~/media/Images/Tol/pc/article/campaign/2020/114/
29 KB
29 KB
Image
General
Full URL
https://cdfront.tower.jp/~/media/Images/Tol/pc/article/campaign/2020/114/15.jpg
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
05053f4b39cd121307a7287d67fec3c2f7ff69cf8cfc09d985ee44430134939a

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:54 GMT
Via
1.1 6b38a2e1db230db568190464ab7177db.cloudfront.net (CloudFront)
X-Amz-Cf-Pop
FRA56-C1
X-Cache
RefreshHit from cloudfront
Content-Disposition
inline; filename="15.jpg"
Connection
keep-alive
Content-Length
29472
Last-Modified
Tue, 19 May 2020 05:08:08 GMT
Server
Scutum
ETag
52b51f4db26b49a9b433ef8191d42d09
Access-Control-Allow-Methods
GET,PUT,POST,DELETE,OPTIONS
Content-Type
image/jpeg
Access-Control-Allow-Origin
*
Cache-Control
public, max-age=600
Accept-Ranges
bytes
Access-Control-Allow-Headers
Content-Type
X-Amz-Cf-Id
5C5CzvgLV29OXVproJs0lF4AIbycMhmZZp9e4t82MfEBDaauB7jmAg==
Expires
Tue, 02 Mar 2021 09:18:54 GMT
tab.js
tower.jp/javascript/
1 KB
811 B
Script
General
Full URL
https://tower.jp/javascript/tab.js
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
299b1a906b7ed7379b4a7e5355474ba1ce2a1e79d53dad46475825f6eba58b6c

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:51 GMT
Content-Encoding
gzip
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
ETag
"0de91f621f9d61:0"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
491
jqueryAutoHeight.js
tower.jp/javascript/
2 KB
1 KB
Script
General
Full URL
https://tower.jp/javascript/jqueryAutoHeight.js
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
5b73d1b6af9b17dbbb10d4e2090307fbf2a7d60d8cd99a47b37fb58ce8e2edaf

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:51 GMT
Content-Encoding
gzip
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
ETag
"0de91f621f9d61:0"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1182
jquery.query.js
tower.jp/javascript/
4 KB
2 KB
Script
General
Full URL
https://tower.jp/javascript/jquery.query.js
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
243fec92049b8f9af69bfcbebf5bd9c0cc323c5396f8a09470c9cb5f37ef22e5

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:51 GMT
Content-Encoding
gzip
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
ETag
"0de91f621f9d61:0"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1671
jQselectable.js
tower.jp/javascript/
14 KB
4 KB
Script
General
Full URL
https://tower.jp/javascript/jQselectable.js
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
6dd30a7f7f46120ffd1dc8c0f94c519040d23c8fef05a58581ee1e2c62d99334

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:51 GMT
Content-Encoding
gzip
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
ETag
"0de91f621f9d61:0"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
3577
jquery-ui-1.9.1.custom.min.js
tower.jp/javascript/
41 KB
13 KB
Script
General
Full URL
https://tower.jp/javascript/jquery-ui-1.9.1.custom.min.js
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
ddae5c6cc15dc98df04b30e9e5a02b462098edff362e951826c5da8fc8dec6a9

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:51 GMT
Content-Encoding
gzip
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
ETag
"0de91f621f9d61:0"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
12705
jquery.ui.datepicker-ja.min.js
tower.jp/javascript/
869 B
961 B
Script
General
Full URL
https://tower.jp/javascript/jquery.ui.datepicker-ja.min.js
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
55862b159f4e2a50e32d0bc422077bfdcc51d5da4b95229c01c4bd34f3053c1f

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:51 GMT
Content-Encoding
gzip
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
ETag
"0de91f621f9d61:0"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
641
jquery-ui-1.9.1.custom.min.css
tower.jp/style/
19 KB
4 KB
Stylesheet
General
Full URL
https://tower.jp/style/jquery-ui-1.9.1.custom.min.css
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
b77aed29b410f38c6d49e00d5720cc0ed6ac8b283111ab85dbc464bba5a7f040

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:52 GMT
Content-Encoding
gzip
Last-Modified
Tue, 02 Feb 2021 05:12:14 GMT
Server
Scutum
ETag
"0bc3f721f9d61:0"
Vary
Accept-Encoding
Content-Type
text/css
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
3684
4562494353476.jpg
cdn.tower.jp/za/m/76/
21 KB
22 KB
Image
General
Full URL
https://cdn.tower.jp/za/m/76/4562494353476.jpg
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.40 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
f7aa4d4290e0978864d4f316665f8fb0deddf45c62df62fbffd2a1710bbd295c

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:53 GMT
Via
1.1 7e513424eee237ee26467e8fd5656ec1.cloudfront.net (CloudFront)
Last-Modified
Fri, 22 Jan 2021 03:35:19 GMT
Server
AmazonS3
X-Amz-Cf-Pop
FRA56-C1
ETag
"4e3734e70964d9dca756422335f44524"
X-Cache
Miss from cloudfront
Content-Type
image/jpeg
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
21909
X-Amz-Cf-Id
G8qpzDoZ6mLd-U3KFDX4c56fhn-g0QI694oDxYY5GbFiA-GkCi2GLQ==
ico_jpop_01.gif
tower.jp/img12/common/
1 KB
2 KB
Image
General
Full URL
https://tower.jp/img12/common/ico_jpop_01.gif
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
a7667631a0c021d3c969677848b99aedb6106bb7088aeda812a1ae4769beeb69

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:52 GMT
Last-Modified
Tue, 02 Feb 2021 05:12:10 GMT
Server
Scutum
ETag
"0b160f521f9d61:0"
Content-Type
image/gif
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1440
ico_benefits_01.gif
cdfront.tower.jp/img12/common/
1 KB
2 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/common/ico_benefits_01.gif
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
8e152b29ad8668f5a58cba6556590926ec7e826d042e4e6d37c47f74851ddcdf

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:54 GMT
Via
1.1 fdd677a35b242f0199586a71e2f6859f.cloudfront.net (CloudFront)
Last-Modified
Tue, 02 Feb 2021 05:12:10 GMT
Server
Scutum
X-Amz-Cf-Pop
FRA56-C1
ETag
"0b160f521f9d61:0"
X-Cache
RefreshHit from cloudfront
Content-Type
image/gif
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1503
X-Amz-Cf-Id
hJv5JeLenvnEmEQp2-49gDCm5soNEe27MlTpNqS58_44GxW8FmxDsA==
bt_10_s2.png
cdfront.tower.jp/img12/common/
3 KB
3 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/common/bt_10_s2.png
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
9704e7b52ce2c04a7ce9fd2f49e3c5f2e997500ed0a7caa2a7ba30f31ef5f70c

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:53 GMT
Via
1.1 35a6ad9a7597ea2f4dacbdb5dc66a66c.cloudfront.net (CloudFront)
Last-Modified
Tue, 02 Feb 2021 05:12:10 GMT
Server
Scutum
X-Amz-Cf-Pop
FRA56-C1
ETag
"0b160f521f9d61:0"
X-Cache
RefreshHit from cloudfront
Content-Type
image/png
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
2643
X-Amz-Cf-Id
sBOhHVc7Xg8OWjkEDqGVD0f6uNyEUXvx7Tg_sQocTZ7W3H6NBxYtSw==
bt_02_s2.png
cdfront.tower.jp/img12/common/
3 KB
3 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/common/bt_02_s2.png
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
917e761400a493d3513481fc67e9a040d51a58521aaba28876660cfb962b728c

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:54 GMT
Via
1.1 5ab5e654a3dc7079aad7ac64ec697d82.cloudfront.net (CloudFront)
Last-Modified
Tue, 02 Feb 2021 05:12:10 GMT
Server
Scutum
X-Amz-Cf-Pop
FRA56-C1
ETag
"0b160f521f9d61:0"
X-Cache
RefreshHit from cloudfront
Content-Type
image/png
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
2972
X-Amz-Cf-Id
cnmGwk3uLxD4H2dBBMBon4USjFcWi5jeNuFqBhemWK6uvT3fxPb0Ug==
zaP2_G6437501W.JPG
cdn.tower.jp/za/m/1W/
24 KB
25 KB
Image
General
Full URL
https://cdn.tower.jp/za/m/1W/zaP2_G6437501W.JPG
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.40 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
8a31934b218f21b0e3fdc40ee7252e47b8ce54fb3e045caf759f9973a5df0ef3

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:53 GMT
Via
1.1 98997c223299d9efd138e7fb9a08a072.cloudfront.net (CloudFront)
Last-Modified
Mon, 25 Jan 2021 18:50:41 GMT
Server
AmazonS3
X-Amz-Cf-Pop
FRA56-C1
ETag
"afbea5e51fb77fec04de231f18ed951e"
X-Cache
RefreshHit from cloudfront
Content-Type
image/jpeg
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
24917
X-Amz-Cf-Id
Xa-uEmRHTpkEYWTF2uwCIgjB0x46ucZBlRsKgUuaSZh1wLnZJ6eUmQ==
mainLeft_btn_02_off.gif
cdfront.tower.jp/img12/search/common/
4 KB
4 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/search/common/mainLeft_btn_02_off.gif
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
e0b8e517bce461bbaca9359727d48121510064f2f2ce2d799f76fad6a5e1f1fd

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:53 GMT
Via
1.1 6b38a2e1db230db568190464ab7177db.cloudfront.net (CloudFront)
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
X-Amz-Cf-Pop
FRA56-C1
ETag
"0de91f621f9d61:0"
X-Cache
RefreshHit from cloudfront
Content-Type
image/gif
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
3879
X-Amz-Cf-Id
2Aph3nIjU0UwvLCAJ8tCqI0q41XElSaRVNCXlRuUywB_8mZuvnwrSw==
mainLeft_btn_03_off.gif
cdfront.tower.jp/img12/search/common/
4 KB
4 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/search/common/mainLeft_btn_03_off.gif
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
2db557f36acbceb3973d2290e445ec7e4197d5e2fa2af2bfff9036604aef9ec6

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:54 GMT
Via
1.1 35a6ad9a7597ea2f4dacbdb5dc66a66c.cloudfront.net (CloudFront)
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
X-Amz-Cf-Pop
FRA56-C1
ETag
"0de91f621f9d61:0"
X-Cache
RefreshHit from cloudfront
Content-Type
image/gif
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
3852
X-Amz-Cf-Id
rlJ55WxyxESzPtqSgsZRC31T6F6Jw3-LLerQ2Rqqb2C6aRMIGaGelA==
newslide.js
tower.jp/javascript/
7 KB
1 KB
Script
General
Full URL
https://tower.jp/javascript/newslide.js
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
20031c19cc62ac4ed1dbb90075cd5e172de796fab9a1b976edeb53f0d545de5c

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:52 GMT
Content-Encoding
gzip
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
ETag
"0de91f621f9d61:0"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1129
recommend.js
tower.jp/javascript/
67 KB
12 KB
Script
General
Full URL
https://tower.jp/javascript/recommend.js
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
7d88f50f0bf1b32a0f7c1e1cf4151190524a1ae1849d70d76c232b5599952cef

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:52 GMT
Content-Encoding
gzip
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
ETag
"0de91f621f9d61:0"
Vary
Accept-Encoding
Content-Type
text/javascript
Cache-Control
max-age=604800
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
11469
gtm.js
www.googletagmanager.com/
186 KB
56 KB
Script
General
Full URL
https://www.googletagmanager.com/gtm.js?id=GTM-SZF9
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:827::2008 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Google Tag Manager /
Resource Hash
6cca693443c1c05612007832e0cc54efa2e92e111c985a2f654ccadee916b095
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains
X-Xss-Protection 0

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Tue, 02 Mar 2021 09:08:51 GMT
content-encoding
br
server
Google Tag Manager
access-control-allow-headers
Cache-Control
vary
Accept-Encoding
content-type
application/javascript; charset=UTF-8
access-control-allow-origin
*
cache-control
private, max-age=900
access-control-allow-credentials
true
cross-origin-resource-policy
cross-origin
strict-transport-security
max-age=31536000; includeSubDomains
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
57335
x-xss-protection
0
expires
Tue, 02 Mar 2021 09:08:51 GMT
headerContents
tower.jp/ajax/
749 B
1 KB
XHR
General
Full URL
https://tower.jp/ajax/headerContents?isSp=false
Requested by
Host: tower.jp
URL: https://tower.jp/javascript/jquery-1.7.2.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
15f052cbf5af9b865ea0fb08e5279acb2fd591accf5edf38a2fa2f82663ed12c

Request headers

Accept
*/*
Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
X-Requested-With
XMLHttpRequest
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 02 Mar 2021 09:08:51 GMT
Content-Encoding
gzip
Server
Scutum
Vary
Accept-Encoding
Content-Type
text/html; charset=utf-8
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, max-age=0, private
Connection
keep-alive
Content-Length
591
Expires
-1
headerNav_bg_01.gif
cdfront.tower.jp/img12/common/
2 KB
3 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/common/headerNav_bg_01.gif
Requested by
Host: tower.jp
URL: https://tower.jp/style/12common.css?202006200000
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
703bd02f2d6aaadee95a856d7bf5cc7b7cebdd126834322d563a4167cc64aad2

Request headers

Referer
https://tower.jp/style/12common.css?202006200000
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:51 GMT
Via
1.1 35a6ad9a7597ea2f4dacbdb5dc66a66c.cloudfront.net (CloudFront)
Last-Modified
Tue, 02 Feb 2021 05:12:10 GMT
Server
Scutum
X-Amz-Cf-Pop
FRA56-C1
ETag
"0b160f521f9d61:0"
X-Cache
Hit from cloudfront
Content-Type
image/gif
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
2376
X-Amz-Cf-Id
xsDlaWVNiIqepo553A5Bw0_kMPCXmoFSzqtsDOMPktIa2yYsoIDJzw==
headerNav_bg_10.gif
cdfront.tower.jp/img12/common/
1 KB
2 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/common/headerNav_bg_10.gif
Requested by
Host: tower.jp
URL: https://tower.jp/style/12common.css?202006200000
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
20497eb2f6ed4b23034eba93f73f36272b9ace6ddb8091a7cd780ea4eebdb732

Request headers

Referer
https://tower.jp/style/12common.css?202006200000
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:06:15 GMT
Via
1.1 673c96d1f19de21216629aa48d90ac92.cloudfront.net (CloudFront)
Connection
keep-alive
Last-Modified
Tue, 02 Feb 2021 05:12:10 GMT
Server
Scutum
Age
156
ETag
"0b160f521f9d61:0"
X-Cache
Hit from cloudfront
Content-Type
image/gif
Cache-Control
public,max-age=600
X-Amz-Cf-Pop
FRA56-C1
Accept-Ranges
bytes
Content-Length
1222
X-Amz-Cf-Id
QR0tRWmtgIQjCt7AuILITXXptyTiri8SX9eKx3Cw-laLtjFtr91Ogg==
headerNav_ic_03.gif
cdfront.tower.jp/img12/common/
1 KB
2 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/common/headerNav_ic_03.gif
Requested by
Host: tower.jp
URL: https://tower.jp/style/12common.css?202006200000
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
d0ceccf41628171f0701230fc8b03c1cfe9227fff85ebb2029562fadded116ad

Request headers

Referer
https://tower.jp/style/12common.css?202006200000
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:54 GMT
Via
1.1 a618edcb8ddcdae59a3a61a6c82ff54d.cloudfront.net (CloudFront)
Last-Modified
Tue, 02 Feb 2021 05:12:10 GMT
Server
Scutum
X-Amz-Cf-Pop
FRA56-C1
ETag
"0b160f521f9d61:0"
X-Cache
Hit from cloudfront
Content-Type
image/gif
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1195
X-Amz-Cf-Id
FGse1DiPZUUgSwUAqSFLZb5aQ7sqZ06wAKq8GEWytgIaVwHgv4rSjg==
icon-online.png
cdfront.tower.jp/img12/common/
2 KB
3 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/common/icon-online.png
Requested by
Host: tower.jp
URL: https://tower.jp/style/12common.css?202006200000
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
a22a5657f089797bd3cf4c6c8932606f3fd77e90543c916cff2f6e420d93bc3a

Request headers

Referer
https://tower.jp/style/12common.css?202006200000
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:06:16 GMT
Via
1.1 fdd677a35b242f0199586a71e2f6859f.cloudfront.net (CloudFront)
Connection
keep-alive
Last-Modified
Tue, 02 Feb 2021 05:12:10 GMT
Server
Scutum
Age
155
ETag
"0b160f521f9d61:0"
X-Cache
Hit from cloudfront
Content-Type
image/png
Cache-Control
public,max-age=600
X-Amz-Cf-Pop
FRA56-C1
Accept-Ranges
bytes
Content-Length
2383
X-Amz-Cf-Id
ckGv_brX0OtaH4mVwDETp28YZigRiQSIO4nKMr7FASFJ-EQXsBuGWg==
icon-music_black.png
cdfront.tower.jp/img12/common/
2 KB
3 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/common/icon-music_black.png
Requested by
Host: tower.jp
URL: https://tower.jp/style/12common.css?202006200000
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
d3fc632ef626f766ed7955dcbf7f3510e5d228f97ae700c8f5bbe9fd97cc5bf3

Request headers

Referer
https://tower.jp/style/12common.css?202006200000
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:51 GMT
Via
1.1 a618edcb8ddcdae59a3a61a6c82ff54d.cloudfront.net (CloudFront)
Last-Modified
Tue, 02 Feb 2021 05:12:10 GMT
Server
Scutum
X-Amz-Cf-Pop
FRA56-C1
ETag
"0b160f521f9d61:0"
X-Cache
Hit from cloudfront
Content-Type
image/png
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
2344
X-Amz-Cf-Id
RyW4VxnhpOmGtypfprinvHRX_qcIrRDwr5qT1Kx5Hoc_VNc-qA6RVQ==
icon-tenpo_black.png
cdfront.tower.jp/img12/common/
2 KB
3 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/common/icon-tenpo_black.png
Requested by
Host: tower.jp
URL: https://tower.jp/style/12common.css?202006200000
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
497f110ecc33b4518fedf5b68fc843c2e08a76fd45e75ae01c35c193c8e91cca

Request headers

Referer
https://tower.jp/style/12common.css?202006200000
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:51 GMT
Via
1.1 5ab5e654a3dc7079aad7ac64ec697d82.cloudfront.net (CloudFront)
Last-Modified
Tue, 02 Feb 2021 05:12:10 GMT
Server
Scutum
X-Amz-Cf-Pop
FRA56-C1
ETag
"0b160f521f9d61:0"
X-Cache
Hit from cloudfront
Content-Type
image/png
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
2132
X-Amz-Cf-Id
Pej7t-xdf18rPa-O-kDouYCyiYw3o9OxeiePcPTG6E0SzjwFgRPChA==
headerNav_bg_03.gif
cdfront.tower.jp/img12/common/
3 KB
3 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/common/headerNav_bg_03.gif
Requested by
Host: tower.jp
URL: https://tower.jp/style/12common.css?202006200000
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
eb39067ad7f064d9fbf8a44a316336cf4ed1321ef1e7b7f6650f6ab19ff524b6

Request headers

Referer
https://tower.jp/style/12common.css?202006200000
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:51 GMT
Via
1.1 6b38a2e1db230db568190464ab7177db.cloudfront.net (CloudFront)
Last-Modified
Tue, 02 Feb 2021 05:12:10 GMT
Server
Scutum
X-Amz-Cf-Pop
FRA56-C1
ETag
"0b160f521f9d61:0"
X-Cache
Hit from cloudfront
Content-Type
image/gif
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
2902
X-Amz-Cf-Id
bzUA3TjSvIkFKcXd37854ezn_jvrGWhf35TywPhGq21eYL5tCwvOqQ==
uwt.js
static.ads-twitter.com/
5 KB
2 KB
Script
General
Full URL
https://static.ads-twitter.com/uwt.js
Requested by
Host: www.googletagmanager.com
URL: https://www.googletagmanager.com/gtm.js?id=GTM-SZF9
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.12.157 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
/
Resource Hash
4cf52cc73734aa71f26f6a10be9aeec89602af45bf0f9abd5c8445a076c1ae1a

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Tue, 02 Mar 2021 09:08:51 GMT
via
1.1 varnish
last-modified
Fri, 04 Dec 2020 00:21:46 GMT
age
32997
etag
"cbc512946c8abb461c6215ed5b454e5f+gzip"
vary
Accept-Encoding,Host
x-cache
HIT
p3p
CP="CAO DSP LAW CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR BUS IND UNI COM NAV INT"
content-encoding
gzip
cache-control
no-cache
accept-ranges
bytes
content-type
application/javascript; charset=utf-8
content-length
1957
x-timer
S1614676131.245548,VS0,VE0
x-served-by
cache-fra19162-FRA
conversion_async.js
www.googleadservices.com/pagead/
31 KB
13 KB
Script
General
Full URL
https://www.googleadservices.com/pagead/conversion_async.js
Requested by
Host: www.googletagmanager.com
URL: https://www.googletagmanager.com/gtm.js?id=GTM-SZF9
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
142.250.185.66 , United States, ASN15169 (GOOGLE, US),
Reverse DNS
fra16s48-in-f2.1e100.net
Software
cafe /
Resource Hash
b4ceacee581031a4014c658e33aa47874612b4c25c1aed8ef682cada98b99d6d
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Tue, 02 Mar 2021 09:08:51 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"
cross-origin-resource-policy
cross-origin
content-disposition
attachment; filename="f.txt"
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
12348
x-xss-protection
0
server
cafe
etag
7672817363517198860
vary
Accept-Encoding
content-type
text/javascript; charset=UTF-8
cache-control
private, max-age=3600
timing-allow-origin
*
expires
Tue, 02 Mar 2021 09:08:51 GMT
analytics.js
www.google-analytics.com/
46 KB
19 KB
Script
General
Full URL
https://www.google-analytics.com/analytics.js
Requested by
Host: www.googletagmanager.com
URL: https://www.googletagmanager.com/gtm.js?id=GTM-SZF9
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:803::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
0f3be44690ae9914ae3e47b7752e1bdea316f09938e9094f99e0de19ccd8987a
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

strict-transport-security
max-age=10886400; includeSubDomains; preload
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Fri, 05 Feb 2021 21:33:27 GMT
server
Golfe2
age
4894
date
Tue, 02 Mar 2021 07:47:17 GMT
vary
Accept-Encoding
content-type
text/javascript
cache-control
public, max-age=7200
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
18980
expires
Tue, 02 Mar 2021 09:47:17 GMT
analytics.js
ec-concier.com/webpack/
Redirect Chain
  • https://ec-concier.com/0168cd9aadcd65e1/analytics.js
  • https://ec-concier.com/webpack/analytics.js?3dfb56a20cbebce37074cdfdbe425f67ab096d306d3e449dd16c24da13adb847
0
152 B
Script
General
Full URL
https://ec-concier.com/webpack/analytics.js?3dfb56a20cbebce37074cdfdbe425f67ab096d306d3e449dd16c24da13adb847
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.199.47.219 Tokyo, Japan, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-54-199-47-219.ap-northeast-1.compute.amazonaws.com
Software
nginx /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:52 GMT
Server
nginx
Connection
keep-alive
Content-Length
0
Content-Type
application/javascript

Redirect headers

Date
Tue, 02 Mar 2021 09:08:52 GMT
X-Content-Type-Options
nosniff
Server
nginx
X-Frame-Options
SAMEORIGIN
Content-Type
text/html; charset=utf-8
Location
https://ec-concier.com/webpack/analytics.js?3dfb56a20cbebce37074cdfdbe425f67ab096d306d3e449dd16c24da13adb847
Cache-Control
no-cache
Connection
keep-alive
Content-Length
174
X-XSS-Protection
1; mode=block
X-Request-Id
4a4ba4c2-8c4d-4dc6-a20f-b20b1a954da5
fbevents.js
connect.facebook.net/en_US/
91 KB
24 KB
Script
General
Full URL
https://connect.facebook.net/en_US/fbevents.js
Requested by
Host: t.co
URL: https://t.co/EQWgQUtcoG
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f01c:8012:face:b00c:0:3 , United States, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
/
Resource Hash
9e7ea2b4ba8e2bcc4a964d6192e4671dc5f6863a1c7e35b52b229a3c1e67a68d
Security Headers
Name Value
Content-Security-Policy default-src facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com data: blob: 'self';script-src *.fbcdn.net *.facebook.net 'unsafe-inline' 'unsafe-eval' blob: data: 'self';style-src data: blob: 'unsafe-inline' facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com;connect-src *.fbcdn.net *.facebook.net attachment.fbsbx.com blob: 'self';block-all-mixed-content;upgrade-insecure-requests;report-uri https://www.facebook.com/csp/reporting/?m=c;
Strict-Transport-Security max-age=31536000; preload; includeSubDomains
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-Xss-Protection 0

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

content-security-policy
default-src facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com data: blob: 'self';script-src *.fbcdn.net *.facebook.net 'unsafe-inline' 'unsafe-eval' blob: data: 'self';style-src data: blob: 'unsafe-inline' facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com;connect-src *.fbcdn.net *.facebook.net attachment.fbsbx.com blob: 'self';block-all-mixed-content;upgrade-insecure-requests;report-uri https://www.facebook.com/csp/reporting/?m=c;
content-encoding
gzip
x-content-type-options
nosniff
x-xss-protection
0
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=3600,h3-27=":443"; ma=3600
content-length
23762
x-fb-rlafr
0
pragma
public
x-fb-debug
t6yLQ/lAUQsPYd09IJeqeN+Dx3OwvZyAjT5ANIdT8nJi0EHBN8RSjJRyq+4K24F6lQXeiQJPJhf2BFpBlby2oA==
x-fb-trip-id
686109401
x-frame-options
DENY
date
Tue, 02 Mar 2021 09:08:51 GMT
strict-transport-security
max-age=31536000; preload; includeSubDomains
content-type
application/x-javascript; charset=utf-8
vary
Accept-Encoding
cache-control
public, max-age=1200
expires
Sat, 01 Jan 2000 00:00:00 GMT
conversion.js
s.yimg.jp/images/listing/tool/cv/
6 KB
2 KB
Script
General
Full URL
https://s.yimg.jp/images/listing/tool/cv/conversion.js
Requested by
Host: www.googletagmanager.com
URL: https://www.googletagmanager.com/gtm.js?id=GTM-SZF9
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
183.79.249.252 , Japan, ASN24572 (YAHOO-JP-AS-AP Yahoo Japan, JP),
Reverse DNS
Software
ATS /
Resource Hash
9e3a9103c80346b1b39bea3de46f44a462b3f594fa45e7206252bc41d7e3e855

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

ats-carp-promotion
1
date
Tue, 02 Mar 2021 09:07:06 GMT
content-encoding
gzip
last-modified
Wed, 30 Sep 2020 06:06:44 GMT
server
ATS
age
105
vary
Accept-Encoding
p3p
policyref="http://privacy.yahoo.co.jp/w3c/p3p_jp.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
via
http/1.1 edge2344.img.kth.yahoo.co.jp (ApacheTrafficServer [cRs f ]), http/1.1 edge2367.img.kth.yahoo.co.jp (ApacheTrafficServer [cRs f ]), http/1.1 edge2308.img.kth.yahoo.co.jp (ApacheTrafficServer [cRs f ])
cache-control
public, max-age=600
accept-ranges
bytes
content-type
application/javascript
content-length
1997
expires
Tue, 02 Mar 2021 09:17:06 GMT
js
www.googletagmanager.com/gtag/
98 KB
39 KB
Script
General
Full URL
https://www.googletagmanager.com/gtag/js?id=DC-9586676
Requested by
Host: www.googletagmanager.com
URL: https://www.googletagmanager.com/gtm.js?id=GTM-SZF9
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:827::2008 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Google Tag Manager /
Resource Hash
8478774a31eee46e8089d73a9cd59744947149f2b25062ae533ddb700763cdc6
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains
X-Xss-Protection 0

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Tue, 02 Mar 2021 09:08:51 GMT
content-encoding
br
server
Google Tag Manager
access-control-allow-headers
Cache-Control
vary
Accept-Encoding
content-type
application/javascript; charset=UTF-8
access-control-allow-origin
*
cache-control
private, max-age=900
access-control-allow-credentials
true
cross-origin-resource-policy
cross-origin
strict-transport-security
max-age=31536000; includeSubDomains
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
39484
x-xss-protection
0
expires
Tue, 02 Mar 2021 09:08:51 GMT
script
checkout-api.worldshopping.jp/v1/
343 KB
121 KB
Script
General
Full URL
https://checkout-api.worldshopping.jp/v1/script?token=tower_jp
Requested by
Host: www.googletagmanager.com
URL: https://www.googletagmanager.com/gtm.js?id=GTM-SZF9
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
13.225.74.64 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-13-225-74-64.fra2.r.cloudfront.net
Software
/
Resource Hash
8719e209842c8174e2890bace740a28aa6345d17b9dc44973caca8ccd31855b2

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Tue, 02 Mar 2021 09:08:51 GMT
via
1.1 48d48000b22cc0a73550fdae51ee2662.cloudfront.net (CloudFront), 1.1 6fa33d47af6f4da7007689083cfe9b9c.cloudfront.net (CloudFront)
x-amz-cf-pop
MUC51-C1, FRA2-C2
x-amzn-requestid
bfbe3c3f-237c-4def-9664-aa77f5b90e0d
vary
Accept-Encoding
x-cache
Miss from cloudfront
content-type
application/javascript; charset=utf-8
access-control-allow-origin
*
cache-control
private, no-store, no-cache, must-revalidate
x-amzn-trace-id
Root=1-603e00a3-2702a07f06bcb4f059332559
content-encoding
gzip
x-amz-apigw-id
bjUJkH4FtjMFTiQ=
x-amz-cf-id
5lYbDD9IiGUvIqLFQi94iLNlRurda_s-y9G0Ki2miF3efUPHf0Lxcw==
lt.js
d.line-scdn.net/n/line_tag/public/release/v1/
32 KB
10 KB
Script
General
Full URL
https://d.line-scdn.net/n/line_tag/public/release/v1/lt.js
Requested by
Host: t.co
URL: https://t.co/EQWgQUtcoG
Protocol
H2
Security
TLS 1.3, , AES_256_GCM
Server
184.30.25.99 Frankfurt am Main, Germany, ASN16625 (AKAMAI-AS, US),
Reverse DNS
a184-30-25-99.deploy.static.akamaitechnologies.com
Software
nginx /
Resource Hash
261595338fd9066332abdbde9ab8f2cf826985e226e2d03904777799e54c9665

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Tue, 02 Mar 2021 09:08:51 GMT
content-encoding
gzip
last-modified
Tue, 10 Nov 2020 06:15:35 GMT
server
nginx
vary
Accept-Encoding
access-control-allow-methods
GET
content-type
application/javascript
access-control-allow-origin
*
cache-control
max-age=424
accept-ranges
bytes
content-length
9865
expires
Tue, 02 Mar 2021 09:15:55 GMT
ytag.js
s.yimg.jp/images/listing/tool/cv/
23 KB
7 KB
Script
General
Full URL
https://s.yimg.jp/images/listing/tool/cv/ytag.js
Requested by
Host: www.googletagmanager.com
URL: https://www.googletagmanager.com/gtm.js?id=GTM-SZF9
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
183.79.249.252 , Japan, ASN24572 (YAHOO-JP-AS-AP Yahoo Japan, JP),
Reverse DNS
Software
ATS /
Resource Hash
fcb5ee7a8fcec48a11b7adf420332a9ff2cf49f99558795d6b7b810618573e35

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

ats-carp-promotion
1
date
Tue, 02 Mar 2021 09:08:34 GMT
content-encoding
gzip
last-modified
Wed, 30 Sep 2020 06:06:44 GMT
server
ATS
age
17
vary
Accept-Encoding
p3p
policyref="http://privacy.yahoo.co.jp/w3c/p3p_jp.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
via
http/1.1 edge2308.img.kth.yahoo.co.jp (ApacheTrafficServer [cRs f ]), http/1.1 edge2379.img.kth.yahoo.co.jp (ApacheTrafficServer [cRs f ]), http/1.1 edge2308.img.kth.yahoo.co.jp (ApacheTrafficServer [cRs f ])
cache-control
public, max-age=600
accept-ranges
bytes
content-type
application/javascript
content-length
6746
expires
Tue, 02 Mar 2021 09:18:34 GMT
collect
www.google-analytics.com/j/
2 B
383 B
XHR
General
Full URL
https://www.google-analytics.com/j/collect?v=1&_v=j88&a=685202172&t=pageview&_s=1&dl=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&dr=https%3A%2F%2Ft.co%2FEQWgQUtcoG&ul=en-us&de=UTF-8&dt=TOWER%20RECORDS%20ONLINE&sd=24-bit&sr=1600x1200&vp=1600x1200&je=0&_u=YEBAAAABAAAAAC~&jid=2048484347&gjid=954539988&cid=2007558036.1614676131&tid=UA-21926253-1&_gid=579042794.1614676131&_r=1&gtm=2wg2h0SZF9&z=1997254046
Requested by
Host: www.google-analytics.com
URL: https://www.google-analytics.com/analytics.js
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:827::200e Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
de3246094525b21a870fc7d2a67490d0132535c6fa5993755c549f1a9d1bd8af
Security Headers
Name Value
X-Content-Type-Options nosniff

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Content-Type
text/plain

Response headers

pragma
no-cache
date
Tue, 02 Mar 2021 09:08:51 GMT
x-content-type-options
nosniff
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
content-type
text/plain
access-control-allow-origin
https://tower.jp
cache-control
no-cache, no-store, must-revalidate
access-control-allow-credentials
true
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
2
expires
Fri, 01 Jan 1990 00:00:00 GMT
1355596731207630
connect.facebook.net/signals/config/
241 KB
69 KB
Script
General
Full URL
https://connect.facebook.net/signals/config/1355596731207630?v=2.9.33&r=stable
Requested by
Host: connect.facebook.net
URL: https://connect.facebook.net/en_US/fbevents.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f01c:8012:face:b00c:0:3 , United States, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
/
Resource Hash
ab068cd65d308fdedddf83bad40970dd445a32bdcdb0d3f3ccc5c2e718a0d8ce
Security Headers
Name Value
Content-Security-Policy default-src facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com data: blob: 'self';script-src *.fbcdn.net *.facebook.net 'unsafe-inline' 'unsafe-eval' blob: data: 'self';style-src data: blob: 'unsafe-inline' facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com;connect-src *.fbcdn.net *.facebook.net attachment.fbsbx.com blob: 'self' chrome-extension://boadgeojelhgndaghljhdicfkmllpafd chrome-extension://dliochdbjfkdbacpmhlcpmleaejidimm;block-all-mixed-content;upgrade-insecure-requests;report-uri https://www.facebook.com/csp/reporting/?m=c;
Strict-Transport-Security max-age=31536000; preload; includeSubDomains
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-Xss-Protection 0

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

content-security-policy
default-src facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com data: blob: 'self';script-src *.fbcdn.net *.facebook.net 'unsafe-inline' 'unsafe-eval' blob: data: 'self';style-src data: blob: 'unsafe-inline' facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com;connect-src *.fbcdn.net *.facebook.net attachment.fbsbx.com blob: 'self' chrome-extension://boadgeojelhgndaghljhdicfkmllpafd chrome-extension://dliochdbjfkdbacpmhlcpmleaejidimm;block-all-mixed-content;upgrade-insecure-requests;report-uri https://www.facebook.com/csp/reporting/?m=c;
content-encoding
gzip
x-content-type-options
nosniff
x-xss-protection
0
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=3600,h3-27=":443"; ma=3600
x-fb-rlafr
0
pragma
public
x-fb-debug
TKxifsKOXC8s2YkZaTxhZdYJ3c5kpZ1iDSQcnVEWe3p3p/D0Z7UDpcHnBi94CBtKLnv9xkDek7auWncjA+ubBQ==
x-fb-trip-id
686109401
x-frame-options
DENY
cross-origin-embedder-policy-report-only
require-corp;report-to="coep_report"
date
Tue, 02 Mar 2021 09:08:52 GMT
strict-transport-security
max-age=31536000; preload; includeSubDomains
report-to
{"group":"coep_report","max_age":86400,"endpoints":[{"url":"https:\/\/www.facebook.com\/browser_reporting\/"}]}
content-type
application/x-javascript; charset=utf-8
vary
Accept-Encoding
cache-control
public, max-age=1200
expires
Sat, 01 Jan 2000 00:00:00 GMT
adsct
t.co/i/
43 B
171 B
Image
General
Full URL
https://t.co/i/adsct?type=javascript&version=1.1.1&p_id=Twitter&p_user_id=0&txn_id=o062f&events=%5B%5B%22pageview%22%2Cnull%5D%5D&tw_sale_amount=0&tw_order_quantity=0&tw_iframe_status=0&tw_document_href=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.42.133 , United States, ASN13414 (TWITTER, US),
Reverse DNS
Software
tsa_o /
Resource Hash
ac8778041fdb7f2e08ceb574c9a766247ea26f1a7d90fa854c4efcf4b361a957
Security Headers
Name Value
Strict-Transport-Security max-age=0
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 0

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Tue, 02 Mar 2021 09:08:52 GMT
content-encoding
gzip
x-content-type-options
nosniff
status
200 OK
x-twitter-response-tags
BouncerCompliant
content-length
65
x-xss-protection
0
x-response-time
104
pragma
no-cache
last-modified
Tue, 02 Mar 2021 09:08:52 GMT
server
tsa_o
x-frame-options
SAMEORIGIN
strict-transport-security
max-age=0
content-type
image/gif;charset=utf-8
cache-control
no-cache, no-store, must-revalidate, pre-check=0, post-check=0
x-connection-hash
a39b14d7f37ee4570f252997f3b380e3
x-transaction
0053f5d90033221b
expires
Tue, 31 Mar 1981 05:00:00 GMT
adsct
t.co/i/
43 B
125 B
Image
General
Full URL
https://t.co/i/adsct?type=javascript&version=1.1.1&p_id=Twitter&p_user_id=0&txn_id=nywsr&events=%5B%5B%22pageview%22%2Cnull%5D%5D&tw_sale_amount=0&tw_order_quantity=0&tw_iframe_status=0&tw_document_href=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.42.133 , United States, ASN13414 (TWITTER, US),
Reverse DNS
Software
tsa_o /
Resource Hash
ac8778041fdb7f2e08ceb574c9a766247ea26f1a7d90fa854c4efcf4b361a957
Security Headers
Name Value
Strict-Transport-Security max-age=0
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 0

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Tue, 02 Mar 2021 09:08:52 GMT
content-encoding
gzip
x-content-type-options
nosniff
status
200 OK
x-twitter-response-tags
BouncerCompliant
content-length
65
x-xss-protection
0
x-response-time
118
pragma
no-cache
last-modified
Tue, 02 Mar 2021 09:08:52 GMT
server
tsa_o
x-frame-options
SAMEORIGIN
strict-transport-security
max-age=0
content-type
image/gif;charset=utf-8
cache-control
no-cache, no-store, must-revalidate, pre-check=0, post-check=0
x-connection-hash
a39b14d7f37ee4570f252997f3b380e3
x-transaction
0053dfc30008a8b9
expires
Tue, 31 Mar 1981 05:00:00 GMT
adsct
t.co/i/
43 B
119 B
Image
General
Full URL
https://t.co/i/adsct?type=javascript&version=1.1.1&p_id=Twitter&p_user_id=0&txn_id=o2vlh&events=%5B%5B%22pageview%22%2Cnull%5D%5D&tw_sale_amount=0&tw_order_quantity=0&tw_iframe_status=0&tw_document_href=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.42.133 , United States, ASN13414 (TWITTER, US),
Reverse DNS
Software
tsa_o /
Resource Hash
ac8778041fdb7f2e08ceb574c9a766247ea26f1a7d90fa854c4efcf4b361a957
Security Headers
Name Value
Strict-Transport-Security max-age=0
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 0

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Tue, 02 Mar 2021 09:08:52 GMT
content-encoding
gzip
x-content-type-options
nosniff
status
200 OK
x-twitter-response-tags
BouncerCompliant
content-length
65
x-xss-protection
0
x-response-time
118
pragma
no-cache
last-modified
Tue, 02 Mar 2021 09:08:52 GMT
server
tsa_o
x-frame-options
SAMEORIGIN
strict-transport-security
max-age=0
content-type
image/gif;charset=utf-8
cache-control
no-cache, no-store, must-revalidate, pre-check=0, post-check=0
x-connection-hash
a39b14d7f37ee4570f252997f3b380e3
x-transaction
001bd1c200a97a61
expires
Tue, 31 Mar 1981 05:00:00 GMT
collect
stats.g.doubleclick.net/j/
1 B
80 B
XHR
General
Full URL
https://stats.g.doubleclick.net/j/collect?t=dc&aip=1&_r=3&v=1&_v=j88&tid=UA-21926253-1&cid=2007558036.1614676131&jid=2048484347&gjid=954539988&_gid=579042794.1614676131&_u=YEBAAAAAAAAAAC~&z=1688662348
Requested by
Host: www.google-analytics.com
URL: https://www.google-analytics.com/analytics.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:400c:c0c::9b Brussels, Belgium, ASN15169 (GOOGLE, US),
Reverse DNS
Software
Golfe2 /
Resource Hash
6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b
Security Headers
Name Value
Strict-Transport-Security max-age=10886400; includeSubDomains; preload
X-Content-Type-Options nosniff

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Content-Type
text/plain

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
Tue, 02 Mar 2021 09:08:51 GMT
content-type
text/plain
access-control-allow-origin
https://tower.jp
cache-control
no-cache, no-store, must-revalidate
access-control-allow-credentials
true
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
1
expires
Fri, 01 Jan 1990 00:00:00 GMT
/
googleads.g.doubleclick.net/pagead/viewthroughconversion/987250729/
2 KB
2 KB
Script
General
Full URL
https://googleads.g.doubleclick.net/pagead/viewthroughconversion/987250729/?random=1614676131397&cv=9&fst=1614676131397&num=1&label=eK3pCLfKjwIQqYDh1gM&guid=ON&resp=GooglemKTybQhCsO&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0&gtm=2wg2h0&sendb=1&ig=1&frm=0&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&ref=https%3A%2F%2Ft.co%2FEQWgQUtcoG&tiba=TOWER%20RECORDS%20ONLINE&hn=www.googleadservices.com&async=1&rfmt=3&fmt=4
Requested by
Host: www.googleadservices.com
URL: https://www.googleadservices.com/pagead/conversion_async.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:802::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
f9d8cdaa185d8136a468eb5e09ae0d05d092eb1935b9fdf25fa22431a7216517
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 02 Mar 2021 09:08:52 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
cache-control
no-cache, must-revalidate
cross-origin-resource-policy
cross-origin
content-disposition
attachment; filename="f.txt"
content-type
text/javascript; charset=UTF-8
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
1108
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
/
googleads.g.doubleclick.net/pagead/viewthroughconversion/987250729/
2 KB
1 KB
Script
General
Full URL
https://googleads.g.doubleclick.net/pagead/viewthroughconversion/987250729/?random=1614676131400&cv=9&fst=1614676131400&num=1&label=va_2CKfnqgUQqYDh1gM&guid=ON&resp=GooglemKTybQhCsO&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0&gtm=2wg2h0&sendb=1&ig=1&frm=0&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&ref=https%3A%2F%2Ft.co%2FEQWgQUtcoG&tiba=TOWER%20RECORDS%20ONLINE&hn=www.googleadservices.com&async=1&rfmt=3&fmt=4
Requested by
Host: www.googleadservices.com
URL: https://www.googleadservices.com/pagead/conversion_async.js
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:802::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
625706d3aacbb5929db21ef012a3aae739195adde128b239275640c757ba54d6
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 02 Mar 2021 09:08:52 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
cache-control
no-cache, must-revalidate
cross-origin-resource-policy
cross-origin
content-disposition
attachment; filename="f.txt"
content-type
text/javascript; charset=UTF-8
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
1111
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
/
googleads.g.doubleclick.net/pagead/viewthroughconversion/813460921/
2 KB
1 KB
Script
General
Full URL
https://googleads.g.doubleclick.net/pagead/viewthroughconversion/813460921/?random=1614676131401&cv=9&fst=1614676131401&num=1&label=v5DCOqugH8QudvxgwM&guid=ON&resp=GooglemKTybQhCsO&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0&gtm=2wg2h0&sendb=1&ig=1&frm=0&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&ref=https%3A%2F%2Ft.co%2FEQWgQUtcoG&tiba=TOWER%20RECORDS%20ONLINE&hn=www.googleadservices.com&async=1&rfmt=3&fmt=4
Requested by
Host: www.googleadservices.com
URL: https://www.googleadservices.com/pagead/conversion_async.js
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:802::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
d9e52a6b5467b869b3574bef4ba8fef8a33123cc8f4c4d986d738731679ef742
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 02 Mar 2021 09:08:52 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
cache-control
no-cache, must-revalidate
cross-origin-resource-policy
cross-origin
content-disposition
attachment; filename="f.txt"
content-type
text/javascript; charset=UTF-8
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
1164
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
/
googleads.g.doubleclick.net/pagead/viewthroughconversion/987250729/
2 KB
2 KB
Script
General
Full URL
https://googleads.g.doubleclick.net/pagead/viewthroughconversion/987250729/?random=1614676131401&cv=9&fst=1614676131401&num=1&label=fctTCJfpqgUQqYDh1gM&guid=ON&resp=GooglemKTybQhCsO&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0&gtm=2wg2h0&sendb=1&ig=1&frm=0&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&ref=https%3A%2F%2Ft.co%2FEQWgQUtcoG&tiba=TOWER%20RECORDS%20ONLINE&hn=www.googleadservices.com&async=1&rfmt=3&fmt=4
Requested by
Host: www.googleadservices.com
URL: https://www.googleadservices.com/pagead/conversion_async.js
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:802::2002 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
49733e2668cc34cc3e2274f581ea30985edb82f1c9cccb643391fad2d76e8fa8
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 02 Mar 2021 09:08:52 GMT
content-encoding
gzip
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"
cache-control
no-cache, must-revalidate
cross-origin-resource-policy
cross-origin
content-disposition
attachment; filename="f.txt"
content-type
text/javascript; charset=UTF-8
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
1110
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
24.jpg
cdfront.tower.jp/~/media/Images/Tol/pc/article/campaign/common/092/
6 KB
6 KB
Image
General
Full URL
https://cdfront.tower.jp/~/media/Images/Tol/pc/article/campaign/common/092/24.jpg?la=ja-JP
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
5ebe52be539f4c1b0c3a17949ec2d918a67b060c6a2e75aac85da427d541802e

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:00:10 GMT
Via
1.1 35a6ad9a7597ea2f4dacbdb5dc66a66c.cloudfront.net (CloudFront)
Age
546
X-Cache
Hit from cloudfront
Content-Disposition
inline; filename="24.jpg"
Connection
keep-alive
Content-Length
5938
Last-Modified
Wed, 03 Apr 2019 10:41:15 GMT
Server
Scutum
ETag
102e687f7acd4bc4aa91fa6a0c65c7c0
Access-Control-Allow-Methods
GET,PUT,POST,DELETE,OPTIONS
Content-Type
image/jpeg
Access-Control-Allow-Origin
*
Cache-Control
public, max-age=600
X-Amz-Cf-Pop
FRA56-C1
Accept-Ranges
bytes
Access-Control-Allow-Headers
Content-Type
X-Amz-Cf-Id
l1-6-auIws50yhetQ6acZdMKsHKEVNgonO-XsQDTno7Lq3xJ4P6gTA==
Expires
Tue, 02 Mar 2021 09:09:45 GMT
header_186x30-5.jpg
cdfront.tower.jp/~/media/Images/Tol/pc/bnr/header_right/2018/
11 KB
12 KB
Image
General
Full URL
https://cdfront.tower.jp/~/media/Images/Tol/pc/bnr/header_right/2018/header_186x30-5.jpg?h=30&la=ja-JP&w=186
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
0fd20e0376bd50d74139c7af594bbd96dc7b74c5a01726dd5e882876800c6d6b

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:51 GMT
Via
1.1 a618edcb8ddcdae59a3a61a6c82ff54d.cloudfront.net (CloudFront)
X-Amz-Cf-Pop
FRA56-C1
X-Cache
Hit from cloudfront
Content-Disposition
inline; filename="header_186x30-5.jpg"
Connection
keep-alive
Content-Length
11186
Last-Modified
Tue, 25 Dec 2018 09:44:10 GMT
Server
Scutum
ETag
37f6b33282e64c4b87c92f943333c845
Access-Control-Allow-Methods
GET,PUT,POST,DELETE,OPTIONS
Content-Type
image/jpeg
Access-Control-Allow-Origin
*
Cache-Control
public, max-age=600
Accept-Ranges
bytes
Access-Control-Allow-Headers
Content-Type
X-Amz-Cf-Id
iYQajCGm_ffSapNafVRtqHC_cL6fvtZP09wMI7510BzM7rMFM_Cqnw==
Expires
Tue, 02 Mar 2021 09:16:17 GMT
tag.gif
tr.line.me/
43 B
425 B
Image
General
Full URL
https://tr.line.me/tag.gif?b_id=559a7db4-eb53-491c-ba7f-bfb11edcf614&b_u=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&b_d=tower.jp&b_p=%2Fsearch%2Fadvanced%2Fitem%2Fsearch&b_q=%3Fjan%3D4562494353476%257C4562494353483&b_t=TOWER%20RECORDS%20ONLINE&b_r=https%3A%2F%2Ft.co%2FEQWgQUtcoG&c_t=lap&t_id=50a69175-5137-4d94-8945-a8b2b03a6601&s_id=db26c999-2dd8eb5f&x4=1&e=pv&v=3.0.0&_t=1614676131553
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
203.104.153.77 , Japan, ASN38631 (LINE LINE Corporation, JP),
Reverse DNS
Software
nginx /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:53 GMT
Cache-Control
private, no-store, no-cache, must-revalidate
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
nginx
Connection
keep-alive
Content-Length
43
Content-Type
image/gif
mainOneColumn_bg_04.gif
cdfront.tower.jp/img12/common/
1 KB
2 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/common/mainOneColumn_bg_04.gif
Requested by
Host: tower.jp
URL: https://tower.jp/style/12common.css?202006200000
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
376a682120dd600b49f1ef1af899a4920d3174515d363eac9bf956a70ec5e3f2

Request headers

Referer
https://tower.jp/style/12common.css?202006200000
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:52 GMT
Via
1.1 a618edcb8ddcdae59a3a61a6c82ff54d.cloudfront.net (CloudFront)
Last-Modified
Tue, 02 Feb 2021 05:12:10 GMT
Server
Scutum
X-Amz-Cf-Pop
FRA56-C1
ETag
"0b160f521f9d61:0"
X-Cache
RefreshHit from cloudfront
Content-Type
image/gif
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1312
X-Amz-Cf-Id
zMJjnrRXu0nx2flFUbroOFuopSHNwkzEs29AVba6FCJh1bTuztsUkA==
mainOneColumn_bg_03.gif
cdfront.tower.jp/img12/common/
2 KB
2 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/common/mainOneColumn_bg_03.gif
Requested by
Host: tower.jp
URL: https://tower.jp/style/12common.css?202006200000
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
68cbf9a96110e6129e60d52fa68132e789b41f46eca56be6194e9256095c35bf

Request headers

Referer
https://tower.jp/style/12common.css?202006200000
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:52 GMT
Via
1.1 35a6ad9a7597ea2f4dacbdb5dc66a66c.cloudfront.net (CloudFront)
Last-Modified
Tue, 02 Feb 2021 05:12:10 GMT
Server
Scutum
X-Amz-Cf-Pop
FRA56-C1
ETag
"0b160f521f9d61:0"
X-Cache
RefreshHit from cloudfront
Content-Type
image/gif
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1659
X-Amz-Cf-Id
Zn9dPZdrKe98bEg6MRxdlFXRsCAxkfb3_hw8fHl5zTVfG1D3TLleyA==
mainLeft_bg_01.gif
cdfront.tower.jp/img12/search/common/
1 KB
2 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/search/common/mainLeft_bg_01.gif
Requested by
Host: tower.jp
URL: https://tower.jp/style/search.css
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
19e6639dff4ff6cbc70b8855a5e1bb974adf97c58828c67d0b9de8ee67d73f8a

Request headers

Referer
https://tower.jp/style/search.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:52 GMT
Via
1.1 a618edcb8ddcdae59a3a61a6c82ff54d.cloudfront.net (CloudFront)
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
X-Amz-Cf-Pop
FRA56-C1
ETag
"0de91f621f9d61:0"
X-Cache
RefreshHit from cloudfront
Content-Type
image/gif
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1174
X-Amz-Cf-Id
bfDj4Ny3Jxmmjld1KQCIH1Km1vCTncg9lQ7gX1qjDzRpx1NZ7ic0CQ==
mainLeft_bg_02.gif
cdfront.tower.jp/img12/search/common/
2 KB
2 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/search/common/mainLeft_bg_02.gif
Requested by
Host: tower.jp
URL: https://tower.jp/style/search.css
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
c24f800cc531b63e5613ea0ccf746a98c9c0747412fd547991f62c00b4c8c49c

Request headers

Referer
https://tower.jp/style/search.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:52 GMT
Via
1.1 35a6ad9a7597ea2f4dacbdb5dc66a66c.cloudfront.net (CloudFront)
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
X-Amz-Cf-Pop
FRA56-C1
ETag
"0de91f621f9d61:0"
X-Cache
RefreshHit from cloudfront
Content-Type
image/gif
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1659
X-Amz-Cf-Id
eVr1zmg3MvFHoss1AZq3Jf9hz-ugjhxCR7ImCcX_F2RdUxIAMLvQ1Q==
mainLeft_bg_03.gif
cdfront.tower.jp/img12/search/common/
1 KB
2 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/search/common/mainLeft_bg_03.gif
Requested by
Host: tower.jp
URL: https://tower.jp/style/search.css
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
c9ea5f4268368b289f2430830708cbdf080fcaaca156da67bff62ea15746e8ed

Request headers

Referer
https://tower.jp/style/search.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:52 GMT
Via
1.1 5ab5e654a3dc7079aad7ac64ec697d82.cloudfront.net (CloudFront)
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
X-Amz-Cf-Pop
FRA56-C1
ETag
"0de91f621f9d61:0"
X-Cache
RefreshHit from cloudfront
Content-Type
image/gif
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1260
X-Amz-Cf-Id
sXaRFiDQaxO5BJrpAX8rPWxCC6PheILXM-k_d-t0Vj0oehoETIjtTQ==
mainLeft_bg_04.gif
cdfront.tower.jp/img12/search/common/
2 KB
2 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/search/common/mainLeft_bg_04.gif
Requested by
Host: tower.jp
URL: https://tower.jp/style/search.css
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
121795731a7c99074d2b64aa2d893107082f9adea424638a0101bb89fe023074

Request headers

Referer
https://tower.jp/style/search.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:52 GMT
Via
1.1 673c96d1f19de21216629aa48d90ac92.cloudfront.net (CloudFront)
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
X-Amz-Cf-Pop
FRA56-C1
ETag
"0de91f621f9d61:0"
X-Cache
RefreshHit from cloudfront
Content-Type
image/gif
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1719
X-Amz-Cf-Id
_tQQuUXDcCa08_KBKZw2sGmyH_pbVHC8Ldrrtzgl8av3uGoffn7ZGA==
mainLeft_bg_05.gif
cdfront.tower.jp/img12/search/common/
1 KB
2 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/search/common/mainLeft_bg_05.gif
Requested by
Host: tower.jp
URL: https://tower.jp/style/search.css
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
e8f1e845fb07301d06e8b03e21325d6a4532ba2ddee8b06222d8667f9b16a179

Request headers

Referer
https://tower.jp/style/search.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:52 GMT
Via
1.1 fdd677a35b242f0199586a71e2f6859f.cloudfront.net (CloudFront)
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
X-Amz-Cf-Pop
FRA56-C1
ETag
"0de91f621f9d61:0"
X-Cache
RefreshHit from cloudfront
Content-Type
image/gif
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1318
X-Amz-Cf-Id
jkf8gqy8bqh930O_swmjZNLvJY1c3jrKHWTB3GzlSzHdikYsT4vgSA==
ico_accordion_01.gif
cdfront.tower.jp/img12/common/
2 KB
3 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/common/ico_accordion_01.gif
Requested by
Host: tower.jp
URL: https://tower.jp/style/search.css
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
3c72f2cf1c4c96d2cfb5d80101d27048cf55cba821ec7243dcf459fe55a2f44a

Request headers

Referer
https://tower.jp/style/search.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:52 GMT
Via
1.1 6b38a2e1db230db568190464ab7177db.cloudfront.net (CloudFront)
Last-Modified
Tue, 02 Feb 2021 05:12:10 GMT
Server
Scutum
X-Amz-Cf-Pop
FRA56-C1
ETag
"0b160f521f9d61:0"
X-Cache
RefreshHit from cloudfront
Content-Type
image/gif
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
2223
X-Amz-Cf-Id
79qN4ANWH6PfQ_lqC0aKPwKyxFf32OSY7XwqidebfdZkMFb0yYShpg==
mainLeft_arrow_04.gif
cdfront.tower.jp/img12/search/common/
1 KB
2 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/search/common/mainLeft_arrow_04.gif
Requested by
Host: tower.jp
URL: https://tower.jp/style/search.css
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
ad7400d346ea8550094e6b201601691ba0ea4f5451c64d336527c12e1c5c2392

Request headers

Referer
https://tower.jp/style/search.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:52 GMT
Via
1.1 5ab5e654a3dc7079aad7ac64ec697d82.cloudfront.net (CloudFront)
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
X-Amz-Cf-Pop
FRA56-C1
ETag
"0de91f621f9d61:0"
X-Cache
RefreshHit from cloudfront
Content-Type
image/gif
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1170
X-Amz-Cf-Id
IhZkIxq3axG0UTx9N2GXk8SvyDeBXBk-jL_FLeYacs_RDJqhgHYEpQ==
/
b97.yahoo.co.jp/pagead/conversion/1000425119/
42 B
1021 B
Image
General
Full URL
https://b97.yahoo.co.jp/pagead/conversion/1000425119/?random=1614676132111&cv=9&fst=1614676132111&num=1&fmt=3&guid=ON&disvt=false&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0&sendb=1&ig=1&frm=0&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&ref=https%3A%2F%2Ft.co%2FEQWgQUtcoG&tiba=TOWER%20RECORDS%20ONLINE&hn=www.googleadservices.com&async=1
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
183.79.255.12 , Japan, ASN24572 (YAHOO-JP-AS-AP Yahoo Japan, JP),
Reverse DNS
Software
ATS /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
Content-Security-Policy script-src 'none'; object-src 'none'
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:53 GMT
Via
http/1.1 mscedge2002.img.djm.yahoo.co.jp (ApacheTrafficServer [c sSf ])
X-Content-Type-Options
nosniff
Age
0
P3P
policyref="http://privacy.yahoo.co.jp/w3c/p3p_jp.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Cross-Origin-Resource-Policy
cross-origin
Connection
close
Content-Length
42
X-XSS-Protection
0
Pragma
no-cache
Server
ATS
Content-Type
image/gif
Cache-Control
no-cache, no-store, must-revalidate, private
Content-Security-Policy
script-src 'none'; object-src 'none'
Timing-Allow-Origin
*
Expires
Fri, 01 Jan 1990 00:00:00 GMT
759186491225452
connect.facebook.net/signals/config/
241 KB
69 KB
Script
General
Full URL
https://connect.facebook.net/signals/config/759186491225452?v=2.9.33&r=stable
Requested by
Host: connect.facebook.net
URL: https://connect.facebook.net/en_US/fbevents.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f01c:8012:face:b00c:0:3 , United States, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
/
Resource Hash
f706e977b49ea16c21a58411ede0be44de71692c02ed10c4695a0acd3e0f0d03
Security Headers
Name Value
Content-Security-Policy default-src facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com data: blob: 'self';script-src *.fbcdn.net *.facebook.net 'unsafe-inline' 'unsafe-eval' blob: data: 'self';style-src data: blob: 'unsafe-inline' facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com;connect-src *.fbcdn.net *.facebook.net attachment.fbsbx.com blob: 'self' chrome-extension://boadgeojelhgndaghljhdicfkmllpafd chrome-extension://dliochdbjfkdbacpmhlcpmleaejidimm;block-all-mixed-content;upgrade-insecure-requests;report-uri https://www.facebook.com/csp/reporting/?m=c;
Strict-Transport-Security max-age=31536000; preload; includeSubDomains
X-Content-Type-Options nosniff
X-Frame-Options DENY
X-Xss-Protection 0

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

content-security-policy
default-src facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com data: blob: 'self';script-src *.fbcdn.net *.facebook.net 'unsafe-inline' 'unsafe-eval' blob: data: 'self';style-src data: blob: 'unsafe-inline' facebook.net *.facebook.net fbcdn.net *.fbcdn.net fbsbx.com *.fbsbx.com;connect-src *.fbcdn.net *.facebook.net attachment.fbsbx.com blob: 'self' chrome-extension://boadgeojelhgndaghljhdicfkmllpafd chrome-extension://dliochdbjfkdbacpmhlcpmleaejidimm;block-all-mixed-content;upgrade-insecure-requests;report-uri https://www.facebook.com/csp/reporting/?m=c;
content-encoding
gzip
x-content-type-options
nosniff
x-xss-protection
0
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=3600,h3-27=":443"; ma=3600
x-fb-rlafr
0
pragma
public
x-fb-debug
DuuX2siQ0OgffYmyuyNa4E32Ss1rLHGnhh5ilLM7S5qgV6UO0wgigs6nWbIzGP+8GyHkz++UHKXHrBB6g42yaA==
x-fb-trip-id
686109401
x-frame-options
DENY
cross-origin-embedder-policy-report-only
require-corp;report-to="coep_report"
date
Tue, 02 Mar 2021 09:08:52 GMT
strict-transport-security
max-age=31536000; preload; includeSubDomains
report-to
{"group":"coep_report","max_age":86400,"endpoints":[{"url":"https:\/\/www.facebook.com\/browser_reporting\/"}]}
content-type
application/x-javascript; charset=utf-8
vary
Accept-Encoding
cache-control
public, max-age=1200
expires
Sat, 01 Jan 2000 00:00:00 GMT
/
www.facebook.com/tr/
44 B
259 B
Image
General
Full URL
https://www.facebook.com/tr/?id=1355596731207630&ev=PageView&dl=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&rl=https%3A%2F%2Ft.co%2FEQWgQUtcoG&if=false&ts=1614676132239&sw=1600&sh=1200&v=2.9.33&r=stable&ec=0&o=30&fbp=fb.1.1614676132238.1716865323&it=1614676131264&coo=false&rqm=GET
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f11c:8183:face:b00c:0:25de , United States, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
proxygen-bolt /
Resource Hash
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Tue, 02 Mar 2021 09:08:52 GMT
last-modified
Fri, 21 Dec 2012 00:00:01 GMT
server
proxygen-bolt
strict-transport-security
max-age=31536000; includeSubDomains
content-type
image/gif
cache-control
no-cache, must-revalidate, max-age=0
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=3600,h3-27=":443"; ma=3600
content-length
44
expires
Tue, 02 Mar 2021 09:08:52 GMT
/
www.google.com/pagead/1p-user-list/987250729/
42 B
552 B
Image
General
Full URL
https://www.google.com/pagead/1p-user-list/987250729/?random=1614676131397&cv=9&fst=1614675600000&num=1&label=eK3pCLfKjwIQqYDh1gM&guid=ON&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0&gtm=2wg2h0&sendb=1&frm=0&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&ref=https%3A%2F%2Ft.co%2FEQWgQUtcoG&tiba=TOWER%20RECORDS%20ONLINE&async=1&fmt=3&is_vtc=1&random=920400909&resp=GooglemKTybQhCsO&rmt_tld=0&ipr=y
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:82a::2004 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
Content-Security-Policy script-src 'none'; object-src 'none'
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 02 Mar 2021 09:08:52 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
cache-control
no-cache, no-store, must-revalidate
cross-origin-resource-policy
cross-origin
content-security-policy
script-src 'none'; object-src 'none'
content-type
image/gif
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
/
www.google.de/pagead/1p-user-list/987250729/
42 B
552 B
Image
General
Full URL
https://www.google.de/pagead/1p-user-list/987250729/?random=1614676131397&cv=9&fst=1614675600000&num=1&label=eK3pCLfKjwIQqYDh1gM&guid=ON&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0&gtm=2wg2h0&sendb=1&frm=0&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&ref=https%3A%2F%2Ft.co%2FEQWgQUtcoG&tiba=TOWER%20RECORDS%20ONLINE&async=1&fmt=3&is_vtc=1&random=920400909&resp=GooglemKTybQhCsO&rmt_tld=1&ipr=y
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:812::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
Content-Security-Policy script-src 'none'; object-src 'none'
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 02 Mar 2021 09:08:52 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
cache-control
no-cache, no-store, must-revalidate
cross-origin-resource-policy
cross-origin
content-security-policy
script-src 'none'; object-src 'none'
content-type
image/gif
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
/
www.google.com/pagead/1p-user-list/987250729/
42 B
66 B
Image
General
Full URL
https://www.google.com/pagead/1p-user-list/987250729/?random=1614676131401&cv=9&fst=1614675600000&num=1&label=fctTCJfpqgUQqYDh1gM&guid=ON&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0&gtm=2wg2h0&sendb=1&frm=0&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&ref=https%3A%2F%2Ft.co%2FEQWgQUtcoG&tiba=TOWER%20RECORDS%20ONLINE&async=1&fmt=3&is_vtc=1&random=1554846340&resp=GooglemKTybQhCsO&rmt_tld=0&ipr=y
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:82a::2004 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
Content-Security-Policy script-src 'none'; object-src 'none'
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 02 Mar 2021 09:08:52 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
cache-control
no-cache, no-store, must-revalidate
cross-origin-resource-policy
cross-origin
content-security-policy
script-src 'none'; object-src 'none'
content-type
image/gif
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
/
www.google.de/pagead/1p-user-list/987250729/
42 B
108 B
Image
General
Full URL
https://www.google.de/pagead/1p-user-list/987250729/?random=1614676131401&cv=9&fst=1614675600000&num=1&label=fctTCJfpqgUQqYDh1gM&guid=ON&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0&gtm=2wg2h0&sendb=1&frm=0&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&ref=https%3A%2F%2Ft.co%2FEQWgQUtcoG&tiba=TOWER%20RECORDS%20ONLINE&async=1&fmt=3&is_vtc=1&random=1554846340&resp=GooglemKTybQhCsO&rmt_tld=1&ipr=y
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:812::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
Content-Security-Policy script-src 'none'; object-src 'none'
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 02 Mar 2021 09:08:52 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
cache-control
no-cache, no-store, must-revalidate
cross-origin-resource-policy
cross-origin
content-security-policy
script-src 'none'; object-src 'none'
content-type
image/gif
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
/
www.google.com/pagead/1p-user-list/987250729/
42 B
530 B
Image
General
Full URL
https://www.google.com/pagead/1p-user-list/987250729/?random=1614676131400&cv=9&fst=1614675600000&num=1&label=va_2CKfnqgUQqYDh1gM&guid=ON&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0&gtm=2wg2h0&sendb=1&frm=0&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&ref=https%3A%2F%2Ft.co%2FEQWgQUtcoG&tiba=TOWER%20RECORDS%20ONLINE&async=1&fmt=3&is_vtc=1&random=3938589166&resp=GooglemKTybQhCsO&rmt_tld=0&ipr=y
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:82a::2004 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
Content-Security-Policy script-src 'none'; object-src 'none'
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 02 Mar 2021 09:08:52 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
cache-control
no-cache, no-store, must-revalidate
cross-origin-resource-policy
cross-origin
content-security-policy
script-src 'none'; object-src 'none'
content-type
image/gif
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
/
www.google.de/pagead/1p-user-list/987250729/
42 B
108 B
Image
General
Full URL
https://www.google.de/pagead/1p-user-list/987250729/?random=1614676131400&cv=9&fst=1614675600000&num=1&label=va_2CKfnqgUQqYDh1gM&guid=ON&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0&gtm=2wg2h0&sendb=1&frm=0&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&ref=https%3A%2F%2Ft.co%2FEQWgQUtcoG&tiba=TOWER%20RECORDS%20ONLINE&async=1&fmt=3&is_vtc=1&random=3938589166&resp=GooglemKTybQhCsO&rmt_tld=1&ipr=y
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:812::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
Content-Security-Policy script-src 'none'; object-src 'none'
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 02 Mar 2021 09:08:52 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
cache-control
no-cache, no-store, must-revalidate
cross-origin-resource-policy
cross-origin
content-security-policy
script-src 'none'; object-src 'none'
content-type
image/gif
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
/
www.google.com/pagead/1p-user-list/813460921/
42 B
66 B
Image
General
Full URL
https://www.google.com/pagead/1p-user-list/813460921/?random=1614676131401&cv=9&fst=1614675600000&num=1&label=v5DCOqugH8QudvxgwM&guid=ON&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0&gtm=2wg2h0&sendb=1&frm=0&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&ref=https%3A%2F%2Ft.co%2FEQWgQUtcoG&tiba=TOWER%20RECORDS%20ONLINE&async=1&fmt=3&is_vtc=1&cid=CAQSKQCNIrLMXeVYjxcpBBHTWZsW6j8Yxi-CZB3CcRNmH60ON_tM2mdF0lbp&random=2102106470&resp=GooglemKTybQhCsO&rmt_tld=0&ipr=y
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:4001:82a::2004 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
Content-Security-Policy script-src 'none'; object-src 'none'
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 02 Mar 2021 09:08:52 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
cache-control
no-cache, no-store, must-revalidate
cross-origin-resource-policy
cross-origin
content-security-policy
script-src 'none'; object-src 'none'
content-type
image/gif
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
/
www.google.de/pagead/1p-user-list/813460921/
42 B
108 B
Image
General
Full URL
https://www.google.de/pagead/1p-user-list/813460921/?random=1614676131401&cv=9&fst=1614675600000&num=1&label=v5DCOqugH8QudvxgwM&guid=ON&u_h=1200&u_w=1600&u_ah=1200&u_aw=1600&u_cd=24&u_his=2&u_tz=60&u_java=false&u_nplug=0&u_nmime=0&gtm=2wg2h0&sendb=1&frm=0&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&ref=https%3A%2F%2Ft.co%2FEQWgQUtcoG&tiba=TOWER%20RECORDS%20ONLINE&async=1&fmt=3&is_vtc=1&cid=CAQSKQCNIrLMXeVYjxcpBBHTWZsW6j8Yxi-CZB3CcRNmH60ON_tM2mdF0lbp&random=2102106470&resp=GooglemKTybQhCsO&rmt_tld=1&ipr=y
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:812::2003 Frankfurt am Main, Germany, ASN15169 (GOOGLE, US),
Reverse DNS
Software
cafe /
Resource Hash
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
Security Headers
Name Value
Content-Security-Policy script-src 'none'; object-src 'none'
X-Content-Type-Options nosniff
X-Xss-Protection 0

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

pragma
no-cache
date
Tue, 02 Mar 2021 09:08:52 GMT
x-content-type-options
nosniff
server
cafe
timing-allow-origin
*
p3p
policyref="https://www.googleadservices.com/pagead/p3p.xml", CP="NOI DEV PSA PSD IVA IVD OTP OUR OTR IND OTC"
cache-control
no-cache, no-store, must-revalidate
cross-origin-resource-policy
cross-origin
content-security-policy
script-src 'none'; object-src 'none'
content-type
image/gif
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
42
x-xss-protection
0
expires
Fri, 01 Jan 1990 00:00:00 GMT
/
www.facebook.com/tr/
44 B
101 B
Image
General
Full URL
https://www.facebook.com/tr/?id=759186491225452&ev=PageView&dl=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&rl=https%3A%2F%2Ft.co%2FEQWgQUtcoG&if=false&ts=1614676132681&sw=1600&sh=1200&v=2.9.33&r=stable&ec=0&o=30&fbp=fb.1.1614676132238.1716865323&it=1614676131264&coo=false&rqm=GET
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f11c:8183:face:b00c:0:25de , United States, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
proxygen-bolt /
Resource Hash
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Tue, 02 Mar 2021 09:08:52 GMT
last-modified
Fri, 21 Dec 2012 00:00:01 GMT
server
proxygen-bolt
strict-transport-security
max-age=31536000; includeSubDomains
content-type
image/gif
cache-control
no-cache, must-revalidate, max-age=0
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=3600,h3-27=":443"; ma=3600
content-length
44
expires
Tue, 02 Mar 2021 09:08:52 GMT
footerContents
tower.jp/ajax/
8 KB
4 KB
XHR
General
Full URL
https://tower.jp/ajax/footerContents?isSp=false
Requested by
Host: tower.jp
URL: https://tower.jp/javascript/jquery-1.7.2.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
93f9aa31b40a84bf9792367470e4460cf50914d11c5afdc3cf3bb6e1a8241c97

Request headers

Accept
*/*
Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
X-Requested-With
XMLHttpRequest
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 02 Mar 2021 09:08:52 GMT
Content-Encoding
gzip
Server
Scutum
Vary
Accept-Encoding
Content-Type
text/html; charset=utf-8
Access-Control-Allow-Origin
*
Cache-Control
no-cache, no-store, max-age=0, private
Connection
keep-alive
Content-Length
3335
Expires
-1
ga.js
ssl.google-analytics.com/
45 KB
17 KB
Script
General
Full URL
https://ssl.google-analytics.com/ga.js
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a00:1450:4001:827::2008 Frankfurt am Main, Germany, ASN15169 (GOOGLE, 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://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Intervention
<https://www.chromestatus.com/feature/5718547946799104>; level="warning"

Response headers

strict-transport-security
max-age=10886400; includeSubDomains; preload
content-encoding
gzip
x-content-type-options
nosniff
last-modified
Fri, 05 Feb 2021 21:33:27 GMT
server
Golfe2
age
12
date
Tue, 02 Mar 2021 09:08:40 GMT
vary
Accept-Encoding
content-type
text/javascript
cache-control
public, max-age=7200
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
17168
expires
Tue, 02 Mar 2021 11:08:40 GMT
truncated
/
253 KB
0
Script
General
Full URL
data:truncated
Protocol
DATA
Server
-, , ASN (),
Reverse DNS
Software
/
Resource Hash
3928ea8524f38f4324a4278c6be669dfeaadd92350668ac918db090f8b2b103f

Request headers

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

Response headers

Content-Type
text/javascript
geolocation
checkout-api.worldshopping.jp/v1/
44 B
487 B
XHR
General
Full URL
https://checkout-api.worldshopping.jp/v1/geolocation
Requested by
Host: checkout-api.worldshopping.jp
URL: https://checkout-api.worldshopping.jp/v1/script?token=tower_jp
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
13.225.74.64 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-13-225-74-64.fra2.r.cloudfront.net
Software
/
Resource Hash
4e9e987e00635d9c1c3b883806da3e8a1c225663d98d94ec5653107c9b637e6f

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Tue, 02 Mar 2021 09:08:53 GMT
via
1.1 cc763905c39a59494c951c09271b0422.cloudfront.net (CloudFront), 1.1 d6b9c7bad28b271f1e800a50d49ab8a4.cloudfront.net (CloudFront)
x-amz-cf-pop
FRA56-C1, FRA2-C2
x-amzn-requestid
7b9a1fc3-b115-4b6c-af46-0b7c9d6be438
x-cache
Miss from cloudfront
content-type
application/json; charset=utf-8
access-control-allow-origin
*
x-amzn-trace-id
Root=1-603e00a5-09d99b7517f9966b6b9d331e;Sampled=0
x-amz-apigw-id
bjUJ4HILNjMFURg=
content-length
44
x-amz-cf-id
j140EdmJqiJ5WPSr8Gad-hXsYpiTtFWm2QPGUxxi6tIsKAjmFoaRiw==
collect
stats.g.doubleclick.net/r/
Redirect Chain
  • https://ssl.google-analytics.com/r/__utm.gif?utmwv=5.7.2&utms=1&utmn=1833220584&utmhn=tower.jp&utmcs=UTF-8&utmsr=1600x1200&utmvp=1600x1200&utmsc=24-bit&utmul=en-us&utmje=0&utmfl=-&utmdt=TOWER%20REC...
  • https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-1590191-2&cid=2007558036.1614676131&jid=1107790623&_v=5.7.2&z=1833220584
35 B
412 B
Image
General
Full URL
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-1590191-2&cid=2007558036.1614676131&jid=1107790623&_v=5.7.2&z=1833220584
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
H3-Q050
Security
QUIC, , AES_128_GCM
Server
2a00:1450:400c:c0c::9b Brussels, Belgium, ASN15169 (GOOGLE, 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://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 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
Tue, 02 Mar 2021 09:08:52 GMT
content-type
image/gif
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
35
expires
Fri, 01 Jan 1990 00:00:00 GMT

Redirect headers

pragma
no-cache
date
Tue, 02 Mar 2021 09:08:52 GMT
last-modified
Sun, 17 May 1998 03:00:00 GMT
server
Golfe2
location
https://stats.g.doubleclick.net/r/collect?v=1&aip=1&t=dc&_r=3&tid=UA-1590191-2&cid=2007558036.1614676131&jid=1107790623&_v=5.7.2&z=1833220584
content-type
text/html; charset=UTF-8
access-control-allow-origin
*
cache-control
no-cache, no-store, must-revalidate
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
content-length
370
expires
Fri, 01 Jan 1990 00:00:00 GMT
a2b-tower-to-page.js
banner.buyee.jp/script/
2 KB
1 KB
Script
General
Full URL
https://banner.buyee.jp/script/a2b-tower-to-page.js?v=1614676132949
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
54.150.94.100 Tokyo, Japan, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-54-150-94-100.ap-northeast-1.compute.amazonaws.com
Software
nginx /
Resource Hash
d7b5c7bb06dad5cc4f51aeecb8f4315a970df31fa72e0fc8ba66167450a2d08c
Security Headers
Name Value
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 1; mode=block

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

x-runtime
0.015626
date
Tue, 02 Mar 2021 09:08:53 GMT
content-encoding
gzip
referrer-policy
strict-origin-when-cross-origin
server
nginx
etag
W/"d7b5c7bb06dad5cc4f51aeecb8f4315a"
x-download-options
noopen
x-frame-options
SAMEORIGIN
content-type
text/javascript; charset=utf-8
x-permitted-cross-domain-policies
none
cache-control
max-age=0, private, must-revalidate
vary
Accept-Encoding
x-xss-protection
1; mode=block
x-content-type-options
nosniff
x-request-id
b843c628-919e-432b-93ea-96264ab5d89a
GetDispCustomerNoticeList
tower.jp/ec/Customer/
0
590 B
XHR
General
Full URL
https://tower.jp/ec/Customer/GetDispCustomerNoticeList?offset=0
Requested by
Host: ajax.googleapis.com
URL: https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Request headers

Accept
*/*
Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
X-Requested-With
XMLHttpRequest
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:53 GMT
Cache-Control
private
X-AspNetMvc-Version
5.2
Server
Scutum
Connection
keep-alive
Content-Length
0
GetDispCustomerNoticeCount
tower.jp/ec/Customer/
1 B
631 B
XHR
General
Full URL
https://tower.jp/ec/Customer/GetDispCustomerNoticeCount
Requested by
Host: ajax.googleapis.com
URL: https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
5feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e9

Request headers

Accept
*/*
Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
X-Requested-With
XMLHttpRequest
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:53 GMT
Cache-Control
private
X-AspNetMvc-Version
5.2
Server
Scutum
Connection
keep-alive
Content-Length
1
Content-Type
text/html; charset=utf-8
/
tower.jp/rcm/RcmWebSvc.svc/
184 B
372 B
XHR
General
Full URL
https://tower.jp/rcm/RcmWebSvc.svc/?tracking_id=9b5a5ab4841a4aad92f0ab814a090a61&frame_id=15&param=jan%3D4562494353476%257C4562494353483&page_no=1&mobile_yn=n&_=1614676132963
Requested by
Host: ajax.googleapis.com
URL: https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
133.130.50.172 , Japan, ASN7506 (INTERQ GMO Internet,Inc, JP),
Reverse DNS
v133-130-50-172.b003.g.tyo1.static.conoha.io
Software
Scutum /
Resource Hash
b9b90683e07e9ea08c7e8f44a47f6e21ea1abc724030696353bcedf5b29dba2a

Request headers

Accept
application/json, text/javascript, */*; q=0.01
Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
X-Requested-With
XMLHttpRequest
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:53 GMT
Cache-Control
private
Server
Scutum
Connection
keep-alive
Content-Length
184
Content-Type
application/json; charset=utf-8
bg_selectbox_01.gif
cdfront.tower.jp/img12/ec/common/
1 KB
2 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/ec/common/bg_selectbox_01.gif
Requested by
Host: tower.jp
URL: https://tower.jp/style/search.css
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
4a25feaeae8304fa73bd4dbc32b87dbe2fff302fe547eac7f5f41aac408ae5c7

Request headers

Referer
https://tower.jp/style/search.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:53 GMT
Via
1.1 6b38a2e1db230db568190464ab7177db.cloudfront.net (CloudFront)
Last-Modified
Tue, 02 Feb 2021 05:12:10 GMT
Server
Scutum
X-Amz-Cf-Pop
FRA56-C1
ETag
"0b160f521f9d61:0"
X-Cache
RefreshHit from cloudfront
Content-Type
image/gif
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1460
X-Amz-Cf-Id
VFIyt18zRJxjnb2KQ5kh1WAnXiXKphvG9eLn1wYDmi_wfh6f__wBLA==
ico_selectbox_01.gif
cdfront.tower.jp/img12/ec/common/
1 KB
2 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/ec/common/ico_selectbox_01.gif
Requested by
Host: tower.jp
URL: https://tower.jp/style/search.css
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
b2f0eb78e760793aa88df7683c138159b89a40b6bae150e750ce9b3db204d10a

Request headers

Referer
https://tower.jp/style/search.css
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:54 GMT
Via
1.1 673c96d1f19de21216629aa48d90ac92.cloudfront.net (CloudFront)
Last-Modified
Tue, 02 Feb 2021 05:12:12 GMT
Server
Scutum
X-Amz-Cf-Pop
FRA56-C1
ETag
"0de91f621f9d61:0"
X-Cache
RefreshHit from cloudfront
Content-Type
image/gif
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1496
X-Amz-Cf-Id
OPDK2asHzjjB2Anf4HMvBYIYhyT3xgM6z1QZmQ1EsAGLTi4oiu12UA==
adsct
analytics.twitter.com/i/
31 B
232 B
Script
General
Full URL
https://analytics.twitter.com/i/adsct?type=javascript&version=1.1.1&p_id=Twitter&p_user_id=0&txn_id=o062f&events=%5B%5B%22pageview%22%2Cnull%5D%5D&tw_sale_amount=0&tw_order_quantity=0&tw_iframe_status=0&tpx_cb=twttr.conversion.loadPixels&tw_document_href=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483
Requested by
Host: static.ads-twitter.com
URL: https://static.ads-twitter.com/uwt.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.42.3 , United States, ASN13414 (TWITTER, US),
Reverse DNS
Software
tsa_o /
Resource Hash
df3e003cc30e9bdd0313100e8ee5d468070b4b34d11ad355f276a356d4b9c7bf
Security Headers
Name Value
Strict-Transport-Security max-age=631138519
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 0

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Tue, 02 Mar 2021 09:08:53 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
CP="CAO DSP LAW CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR BUS IND UNI COM NAV INT"
status
200 OK
x-twitter-response-tags
BouncerCompliant
content-length
57
x-xss-protection
0
x-response-time
121
pragma
no-cache
last-modified
Tue, 02 Mar 2021 09:08:53 GMT
server
tsa_o
x-frame-options
SAMEORIGIN
strict-transport-security
max-age=631138519
content-type
application/javascript;charset=utf-8
cache-control
no-cache, no-store, must-revalidate, pre-check=0, post-check=0
x-connection-hash
a41ac597cbb6f7837bbe7c8f99852278
x-transaction
0071840500d1a6d9
expires
Tue, 31 Mar 1981 05:00:00 GMT
adsct
analytics.twitter.com/i/
31 B
285 B
Script
General
Full URL
https://analytics.twitter.com/i/adsct?type=javascript&version=1.1.1&p_id=Twitter&p_user_id=0&txn_id=nywsr&events=%5B%5B%22pageview%22%2Cnull%5D%5D&tw_sale_amount=0&tw_order_quantity=0&tw_iframe_status=0&tpx_cb=twttr.conversion.loadPixels&tw_document_href=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483
Requested by
Host: static.ads-twitter.com
URL: https://static.ads-twitter.com/uwt.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.42.3 , United States, ASN13414 (TWITTER, US),
Reverse DNS
Software
tsa_o /
Resource Hash
df3e003cc30e9bdd0313100e8ee5d468070b4b34d11ad355f276a356d4b9c7bf
Security Headers
Name Value
Strict-Transport-Security max-age=631138519
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 0

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Tue, 02 Mar 2021 09:08:53 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
CP="CAO DSP LAW CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR BUS IND UNI COM NAV INT"
status
200 OK
x-twitter-response-tags
BouncerCompliant
content-length
57
x-xss-protection
0
x-response-time
120
pragma
no-cache
last-modified
Tue, 02 Mar 2021 09:08:53 GMT
server
tsa_o
x-frame-options
SAMEORIGIN
strict-transport-security
max-age=631138519
content-type
application/javascript;charset=utf-8
cache-control
no-cache, no-store, must-revalidate, pre-check=0, post-check=0
x-connection-hash
a41ac597cbb6f7837bbe7c8f99852278
x-transaction
0079678b008b150c
expires
Tue, 31 Mar 1981 05:00:00 GMT
adsct
analytics.twitter.com/i/
31 B
234 B
Script
General
Full URL
https://analytics.twitter.com/i/adsct?type=javascript&version=1.1.1&p_id=Twitter&p_user_id=0&txn_id=o2vlh&events=%5B%5B%22pageview%22%2Cnull%5D%5D&tw_sale_amount=0&tw_order_quantity=0&tw_iframe_status=0&tpx_cb=twttr.conversion.loadPixels&tw_document_href=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483
Requested by
Host: static.ads-twitter.com
URL: https://static.ads-twitter.com/uwt.js
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
104.244.42.3 , United States, ASN13414 (TWITTER, US),
Reverse DNS
Software
tsa_o /
Resource Hash
df3e003cc30e9bdd0313100e8ee5d468070b4b34d11ad355f276a356d4b9c7bf
Security Headers
Name Value
Strict-Transport-Security max-age=631138519
X-Content-Type-Options nosniff
X-Frame-Options SAMEORIGIN
X-Xss-Protection 0

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Tue, 02 Mar 2021 09:08:53 GMT
content-encoding
gzip
x-content-type-options
nosniff
p3p
CP="CAO DSP LAW CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR BUS IND UNI COM NAV INT"
status
200 OK
x-twitter-response-tags
BouncerCompliant
content-length
57
x-xss-protection
0
x-response-time
120
pragma
no-cache
last-modified
Tue, 02 Mar 2021 09:08:53 GMT
server
tsa_o
x-frame-options
SAMEORIGIN
strict-transport-security
max-age=631138519
content-type
application/javascript;charset=utf-8
cache-control
no-cache, no-store, must-revalidate, pre-check=0, post-check=0
x-connection-hash
a41ac597cbb6f7837bbe7c8f99852278
x-transaction
00845103001f51f5
expires
Tue, 31 Mar 1981 05:00:00 GMT
vclp.js
trj.valuecommerce.com/
3 KB
4 KB
Script
General
Full URL
https://trj.valuecommerce.com/vclp.js
Requested by
Host: www.googletagmanager.com
URL: https://www.googletagmanager.com/gtm.js?id=GTM-SZF9
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
2a04:4e42:1b::737 , United States, ASN54113 (FASTLY, US),
Reverse DNS
Software
UploadServer /
Resource Hash
fd32b817b9db7ee1ad4f6e051a654ed386ce679cc0acf79c549eee587bc79c06

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Tue, 02 Mar 2021 09:08:53 GMT
via
1.1 varnish
age
178
x-guploader-uploadid
ABg5-UwX-p0c6Sfy13uKIl45COwZOU9-McfcmMC7G4cKg5IX4Rg1HEFpPQGwy5xGsk_UxkISLs6Ni8vAjQ3__NaYXAU
x-cache
HIT
x-goog-storage-class
REGIONAL
x-goog-metageneration
1
x-goog-stored-content-encoding
identity
content-length
3134
x-served-by
cache-hhn4027-HHN
expires
Thu, 11 Feb 2021 02:37:41 GMT
last-modified
Fri, 22 Jan 2021 02:57:15 GMT
server
UploadServer
x-timer
S1614676133.016155,VS0,VE0
etag
"f163455869c3d88e0c311dea00b87581"
x-goog-hash
crc32c=vvCSag==, md5=8WNFWGnD2I4MMR3qALh1gQ==
x-goog-generation
1611284235945926
access-control-allow-origin
*
access-control-expose-headers
Content-Type, Content-Range, x-goog-resumable
cache-control
max-age=300
x-goog-stored-content-length
3134
accept-ranges
bytes
content-type
application/javascript
x-cache-hits
1
bf.png
a.imgvc.com/i/
107 B
405 B
Image
General
Full URL
https://a.imgvc.com/i/bf.png?v=1
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
210.140.252.195 , Japan, ASN4694 (IDCF IDC Frontier Inc., JP),
Reverse DNS
Software
nginx /
Resource Hash
98b2ea6cc6772cdf8797c77892f643b1fe14b6f4529bdd30a9c349b1f56b9515

Request headers

Origin
https://tower.jp
Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:54 GMT
Last-Modified
Wed, 09 May 2018 15:00:00 GMT
Server
nginx
Front-End-Https
on
Content-Type
image/png
Access-Control-Allow-Origin
*
Cache-Control
max-age=63072000, private
Content-Length
107
Expires
Thu, 02 Mar 2023 09:08:54 GMT
tag.gif
tr.line.me/
43 B
425 B
Image
General
Full URL
https://tr.line.me/tag.gif?b_id=559a7db4-eb53-491c-ba7f-bfb11edcf614&b_u=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&b_d=tower.jp&b_p=%2Fsearch%2Fadvanced%2Fitem%2Fsearch&b_q=%3Fjan%3D4562494353476%257C4562494353483&b_t=TOWER%20RECORDS%20ONLINE&b_r=https%3A%2F%2Ft.co%2FEQWgQUtcoG&c_t=lap&t_id=3dceb858-0925-48f7-87cc-85250cc75db7&s_id=db26c999-2dd8eb5f&x4=2&e=pv&v=3.0.0&_t=1614676133026
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_256_GCM
Server
203.104.153.77 , Japan, ASN38631 (LINE LINE Corporation, JP),
Reverse DNS
Software
nginx /
Resource Hash
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:53 GMT
Cache-Control
private, no-store, no-cache, must-revalidate
Last-Modified
Mon, 28 Sep 1970 06:00:00 GMT
Server
nginx
Connection
keep-alive
Content-Length
43
Content-Type
image/gif
bg_top_01.png
cdfront.tower.jp/img12/common/
1 KB
2 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/common/bg_top_01.png
Requested by
Host: tower.jp
URL: https://tower.jp/style/12common.css?202006200000
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
381ce07936af3f4b50e3b6baef995b0ce48316c424e691a9f973938e45cd4943

Request headers

Referer
https://tower.jp/style/12common.css?202006200000
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:54 GMT
Via
1.1 a618edcb8ddcdae59a3a61a6c82ff54d.cloudfront.net (CloudFront)
Last-Modified
Tue, 02 Feb 2021 05:12:10 GMT
Server
Scutum
X-Amz-Cf-Pop
FRA56-C1
ETag
"0b160f521f9d61:0"
X-Cache
Hit from cloudfront
Content-Type
image/png
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1083
X-Amz-Cf-Id
8LbtwT24CG8HqYTNY42zdUkDhceEwq_vD2_Jyn5YIOa6JBgpAifCmQ==
bottomNav_bg_02.gif
cdfront.tower.jp/img12/common/
6 KB
6 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/common/bottomNav_bg_02.gif
Requested by
Host: tower.jp
URL: https://tower.jp/style/12common.css?202006200000
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
6e4c349cac91bab883e88b656bc8a782af4f99af7009f9f6e6b4ff0b425b10ed

Request headers

Referer
https://tower.jp/style/12common.css?202006200000
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:54 GMT
Via
1.1 673c96d1f19de21216629aa48d90ac92.cloudfront.net (CloudFront)
Last-Modified
Tue, 02 Feb 2021 05:12:10 GMT
Server
Scutum
X-Amz-Cf-Pop
FRA56-C1
ETag
"0b160f521f9d61:0"
X-Cache
Hit from cloudfront
Content-Type
image/gif
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
6028
X-Amz-Cf-Id
_qwLNMlxkF_Kyjq0MUlRzfErLncUgj8hLP5zofin2Ga6yjX_YS6tjw==
bottomNav_ico_01.gif
cdfront.tower.jp/img12/common/
1 KB
2 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/common/bottomNav_ico_01.gif
Requested by
Host: tower.jp
URL: https://tower.jp/style/12common.css?202006200000
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
ec8c3b41fc8e1d256e7ef233c5c4700341ca2656fa9e41522d1a13730421310e

Request headers

Referer
https://tower.jp/style/12common.css?202006200000
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:54 GMT
Via
1.1 5ab5e654a3dc7079aad7ac64ec697d82.cloudfront.net (CloudFront)
Last-Modified
Tue, 02 Feb 2021 05:12:10 GMT
Server
Scutum
X-Amz-Cf-Pop
FRA56-C1
ETag
"0b160f521f9d61:0"
X-Cache
Hit from cloudfront
Content-Type
image/gif
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
1185
X-Amz-Cf-Id
n-rVWKdrfVdNDrtivGkkMkJLgWX4kIu7wYj58vhEDpHw96zOma6EdA==
bt_top_01.png
cdfront.tower.jp/~/media/Images/Online/Common/
2 KB
3 KB
Image
General
Full URL
https://cdfront.tower.jp/~/media/Images/Online/Common/bt_top_01.png?la=ja-JP
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
b667e13f9583b98d8a1f3a1c373975f9c698708bb350a8f59eafe8877983b6ec

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:54 GMT
Via
1.1 fdd677a35b242f0199586a71e2f6859f.cloudfront.net (CloudFront)
X-Amz-Cf-Pop
FRA56-C1
X-Cache
Hit from cloudfront
Content-Disposition
inline; filename="bt_top_01.png"
Connection
keep-alive
Content-Length
2165
Last-Modified
Mon, 04 Dec 2017 06:33:38 GMT
Server
Scutum
ETag
551cf4274608477fb98c715831d5a76b
Access-Control-Allow-Methods
GET,PUT,POST,DELETE,OPTIONS
Content-Type
image/png
Access-Control-Allow-Origin
*
Cache-Control
public, max-age=600
Accept-Ranges
bytes
Access-Control-Allow-Headers
Content-Type
X-Amz-Cf-Id
7WJkvYuewxqN3qu_MobMx6nNZK0CF7F6UdbHRCZL1b0hW8ZM2Bko6g==
Expires
Tue, 02 Mar 2021 09:16:17 GMT
bottomNav_copyright_01_l.gif
cdfront.tower.jp/~/media/Images/Online/Common/
2 KB
3 KB
Image
General
Full URL
https://cdfront.tower.jp/~/media/Images/Online/Common/bottomNav_copyright_01_l.gif?la=ja-JP
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
fa569f9784ea95f9264f89a90e49cd802adacf572a2d983c6522a0496569acdb

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:54 GMT
Via
1.1 a618edcb8ddcdae59a3a61a6c82ff54d.cloudfront.net (CloudFront)
X-Amz-Cf-Pop
FRA56-C1
X-Cache
Hit from cloudfront
Content-Disposition
inline; filename="bottomNav_copyright_01_l.gif"
Connection
keep-alive
Content-Length
1976
Last-Modified
Thu, 07 Jan 2021 07:25:37 GMT
Server
Scutum
ETag
403ec0012ec44b21a4bb9210cb846c65
Access-Control-Allow-Methods
GET,PUT,POST,DELETE,OPTIONS
Content-Type
image/gif
Access-Control-Allow-Origin
*
Cache-Control
public, max-age=600
Accept-Ranges
bytes
Access-Control-Allow-Headers
Content-Type
X-Amz-Cf-Id
m27CrNghKqCN0pvTu-yQOJMQvSp_U04yK6_3H2DgnZ6q_KciBuHnYg==
Expires
Tue, 02 Mar 2021 09:18:21 GMT
/
www.facebook.com/tr/
44 B
147 B
Image
General
Full URL
https://www.facebook.com/tr/?id=1355596731207630&ev=Microdata&dl=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&rl=https%3A%2F%2Ft.co%2FEQWgQUtcoG&if=false&ts=1614676133760&cd[DataLayer]=%5B%5D&cd[Meta]=%7B%22title%22%3A%22%5Cn%5CtTOWER%20RECORDS%20ONLINE%5Cn%22%2C%22meta%3Adescription%22%3A%22%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0%E8%A9%B3%E7%B4%B0%E6%A4%9C%E7%B4%A2%22%2C%22meta%3Akeywords%22%3A%22CD%2CDVD%2C%E9%9F%B3%E6%A5%BD%E3%82%BD%E3%83%95%E3%83%88%2C%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%2C%E3%82%BF%E3%83%AF%E3%83%BC%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%2C%E3%82%BF%E3%83%AF%E3%83%AC%E3%82%B3%2CTOWER%20RECORDS%22%7D&cd[OpenGraph]=%7B%7D&cd[Schema.org]=%5B%5D&cd[JSON-LD]=%5B%5D&sw=1600&sh=1200&v=2.9.33&r=stable&ec=1&o=30&fbp=fb.1.1614676132238.1716865323&it=1614676131264&coo=false&es=automatic&tm=3&rqm=GET
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f11c:8183:face:b00c:0:25de , United States, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
proxygen-bolt /
Resource Hash
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Tue, 02 Mar 2021 09:08:53 GMT
last-modified
Fri, 21 Dec 2012 00:00:01 GMT
server
proxygen-bolt
strict-transport-security
max-age=31536000; includeSubDomains
content-type
image/gif
cache-control
no-cache, must-revalidate, max-age=0
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=3600,h3-27=":443"; ma=3600
content-length
44
expires
Tue, 02 Mar 2021 09:08:53 GMT
banner_red.gif
resource.buyee.jp/store/default/tower/
49 B
405 B
Image
General
Full URL
https://resource.buyee.jp/store/default/tower/banner_red.gif
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
65.9.187.79 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
207baadced99f2868b604e6bae6ad9ddb2ffe5d2f0742a5279121e3cdef4324e

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

x-amz-version-id
NzyDFNyK5GPIe.kWMgBu68LZw2du_ies
via
1.1 c25bc16c1238c23c74267a81302a62f8.cloudfront.net (CloudFront)
last-modified
Wed, 14 Oct 2020 01:14:46 GMT
server
AmazonS3
x-amz-cf-pop
ZAG50-C1
etag
"22ddcfa816b6846c4552e8f676f80c6e"
x-cache
Hit from cloudfront
content-type
image/gif
date
Tue, 02 Mar 2021 09:08:54 GMT
accept-ranges
bytes
content-length
49
x-amz-cf-id
cQqRlzVO9e-8WnmL1SKyz-VaeG6yyia8RiXcSGm74_4vYOnuXhm3HA==
checkout-3_2_26.js
checkout-js.worldshopping.jp/
1 MB
464 KB
Script
General
Full URL
https://checkout-js.worldshopping.jp/checkout-3_2_26.js
Requested by
Host: checkout-api.worldshopping.jp
URL: https://checkout-api.worldshopping.jp/v1/script?token=tower_jp
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
13.225.74.33 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-13-225-74-33.fra2.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
df270600155499b4aa53dbd8fa83bc7bf03be72cbc593a4c7d3d5b969f244b89

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

x-amz-version-id
xyllmgPDW9Az6r6lAv8BmpwvQh3QCCHk
content-encoding
gzip
last-modified
Tue, 02 Mar 2021 00:47:11 GMT
server
AmazonS3
x-amz-cf-pop
FRA2-C2
etag
W/"3df5612c02173f1c286d77e479ce0424"
vary
Accept-Encoding
x-cache
RefreshHit from cloudfront
content-type
application/javascript
via
1.1 c7015d60d4f8f2170aaaa75e69e40618.cloudfront.net (CloudFront)
date
Tue, 02 Mar 2021 09:08:55 GMT
x-amz-cf-id
8nLKthcKK_tPyuOHNaLrnx-COfKM9qCCIX3njeZGmXBGpOvG3nWdrg==
/
www.facebook.com/tr/
44 B
147 B
Image
General
Full URL
https://www.facebook.com/tr/?id=759186491225452&ev=Microdata&dl=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&rl=https%3A%2F%2Ft.co%2FEQWgQUtcoG&if=false&ts=1614676134183&cd[DataLayer]=%5B%5D&cd[Meta]=%7B%22title%22%3A%22%5Cn%5CtTOWER%20RECORDS%20ONLINE%5Cn%22%2C%22meta%3Adescription%22%3A%22%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0%E8%A9%B3%E7%B4%B0%E6%A4%9C%E7%B4%A2%22%2C%22meta%3Akeywords%22%3A%22CD%2CDVD%2C%E9%9F%B3%E6%A5%BD%E3%82%BD%E3%83%95%E3%83%88%2C%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0%2C%E3%82%BF%E3%83%AF%E3%83%BC%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89%2C%E3%82%BF%E3%83%AF%E3%83%AC%E3%82%B3%2CTOWER%20RECORDS%22%7D&cd[OpenGraph]=%7B%7D&cd[Schema.org]=%5B%5D&cd[JSON-LD]=%5B%5D&sw=1600&sh=1200&v=2.9.33&r=stable&ec=1&o=30&fbp=fb.1.1614676132238.1716865323&it=1614676131264&coo=false&es=automatic&tm=3&rqm=GET
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
2a03:2880:f11c:8183:face:b00c:0:25de , United States, ASN32934 (FACEBOOK, US),
Reverse DNS
Software
proxygen-bolt /
Resource Hash
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
Security Headers
Name Value
Strict-Transport-Security max-age=31536000; includeSubDomains

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Tue, 02 Mar 2021 09:08:54 GMT
last-modified
Fri, 21 Dec 2012 00:00:01 GMT
server
proxygen-bolt
strict-transport-security
max-age=31536000; includeSubDomains
content-type
image/gif
cache-control
no-cache, must-revalidate, max-age=0
cross-origin-resource-policy
cross-origin
alt-svc
h3-29=":443"; ma=3600,h3-27=":443"; ma=3600
content-length
44
expires
Tue, 02 Mar 2021 09:08:54 GMT
nr-1198.min.js
js-agent.newrelic.com/
27 KB
11 KB
Script
General
Full URL
https://js-agent.newrelic.com/nr-1198.min.js
Requested by
Host: tower.jp
URL: https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
151.101.114.110 Frankfurt am Main, Germany, ASN54113 (FASTLY, US),
Reverse DNS
Software
AmazonS3 /
Resource Hash
39893061747f88b837a34d0395d05fca83e7cd5bbf2d582d181a73c5c9a174c6

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Tue, 02 Mar 2021 09:08:55 GMT
content-encoding
gzip
x-amz-request-id
6G7N8SBZFWDP9P9M
x-cache
HIT
content-length
10682
x-amz-id-2
0UGCO4Mhlfex45xXj/8DAFadaQ6I71xHRyRaRgwDh98IVodQV5SoRghdxpscDq1FfJKXoBas7qw=
x-served-by
cache-hhn4053-HHN
last-modified
Fri, 29 Jan 2021 19:19:08 GMT
server
AmazonS3
x-timer
S1614676136.501127,VS0,VE0
etag
"59c98195ba35e0b45cbe2e5beebd1ac8"
vary
Accept-Encoding
content-type
application/javascript
via
1.1 varnish
cache-control
public, max-age=7200, stale-if-error=604800
accept-ranges
bytes
x-cache-hits
43888
bt_01_a_on.png
cdfront.tower.jp/img12/common/
5 KB
5 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/common/bt_01_a_on.png
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
166b2a97d5792d9db46ac2027c31e558307a8bc101bf819b2f7759d1bb97c1ce

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:55 GMT
Via
1.1 35a6ad9a7597ea2f4dacbdb5dc66a66c.cloudfront.net (CloudFront)
Last-Modified
Tue, 02 Feb 2021 05:12:10 GMT
Server
Scutum
X-Amz-Cf-Pop
FRA56-C1
ETag
"0b160f521f9d61:0"
X-Cache
Hit from cloudfront
Content-Type
image/png
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
5118
X-Amz-Cf-Id
W17kITb7eH9X0ntq3NLOBwBw74ZGaOpT4ohz0USlX0RfhbahBk7bow==
bt_10_s2_on.png
cdfront.tower.jp/img12/common/
3 KB
3 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/common/bt_10_s2_on.png
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
af829d43dbe5ab264b0e658bc2b8742d347d77ee8c386758885b348f937b3557

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:55 GMT
Via
1.1 6b38a2e1db230db568190464ab7177db.cloudfront.net (CloudFront)
Last-Modified
Tue, 02 Feb 2021 05:12:10 GMT
Server
Scutum
X-Amz-Cf-Pop
FRA56-C1
ETag
"0b160f521f9d61:0"
X-Cache
RefreshHit from cloudfront
Content-Type
image/png
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
2909
X-Amz-Cf-Id
ZqXc2yxMEAeS0ESIqbWXx7X1iGkYNnlah1Srm2Two9XVRaOJJqmYaA==
bt_02_s2_on.png
cdfront.tower.jp/img12/common/
3 KB
3 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/common/bt_02_s2_on.png
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
d7fdcdea5a606aa1629a6cdf4c6002407958ed7a772342ca8aad6655480b8859

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:55 GMT
Via
1.1 a618edcb8ddcdae59a3a61a6c82ff54d.cloudfront.net (CloudFront)
Last-Modified
Tue, 02 Feb 2021 05:12:10 GMT
Server
Scutum
X-Amz-Cf-Pop
FRA56-C1
ETag
"0b160f521f9d61:0"
X-Cache
RefreshHit from cloudfront
Content-Type
image/png
Cache-Control
public,max-age=600
Connection
keep-alive
Accept-Ranges
bytes
Content-Length
2981
X-Amz-Cf-Id
K3pzwibDcBvF8FGkSB61tpjV0ujIl02dVjh5is_9G7oaqr-PG9ndug==
headerNav_bt_12_on.png
cdfront.tower.jp/img12/common/
3 KB
3 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/common/headerNav_bt_12_on.png
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
57d19dc26ae8b463ad08380997f5b9949d7160fcf58fa085a9dbe1b54f28a74b

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 08:31:04 GMT
Via
1.1 fdd677a35b242f0199586a71e2f6859f.cloudfront.net (CloudFront)
Connection
keep-alive
Last-Modified
Tue, 02 Feb 2021 05:12:10 GMT
Server
Scutum
Age
17661
ETag
"0b160f521f9d61:0"
X-Cache
Hit from cloudfront
Content-Type
image/png
Cache-Control
public
X-Amz-Cf-Pop
FRA56-C1
Accept-Ranges
bytes
Content-Length
2808
X-Amz-Cf-Id
Wg8OS7IptMv2kNgRhabptts7U_R896I_mmKFO_7pBTO6qfYOo0tCLA==
headerNav_bt_13_on.png
cdfront.tower.jp/img12/common/
3 KB
4 KB
Image
General
Full URL
https://cdfront.tower.jp/img12/common/headerNav_bt_13_on.png
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
65.9.58.52 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
Scutum /
Resource Hash
8076f0762435df3c7cb817689080d4111426e693efcffc168795ece3330d59af

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 08:31:04 GMT
Via
1.1 5ab5e654a3dc7079aad7ac64ec697d82.cloudfront.net (CloudFront)
Connection
keep-alive
Last-Modified
Tue, 02 Feb 2021 05:12:10 GMT
Server
Scutum
Age
7216
ETag
"0b160f521f9d61:0"
X-Cache
Hit from cloudfront
Content-Type
image/png
Cache-Control
public
X-Amz-Cf-Pop
FRA56-C1
Accept-Ranges
bytes
Content-Length
3217
X-Amz-Cf-Id
8mJWalfXIe_tBA39OFY1e1s_kzEAl3EJ1amM1roqeATiP5TyIX8sVg==
event.jpeg
www.pages07.net/WTS/
0
458 B
Image
General
Full URL
https://www.pages07.net/WTS/event.jpeg?accesskey=3149a537-159a5c4d96d-3a49a1d67881ef16e3bf2f68bd600905&v=1.31&isNewSession=1&type=pageview&isNewVisitor=1&sessionGUID=ea781eb1-44cd-7994-8281-c5849200c565&webSyncID=68d96710-b7e3-697e-a850-dea1d2c07574&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&newSiteVisit=1&referringURL=https%3A%2F%2Ft.co%2FEQWgQUtcoG&hostname=tower.jp&pathname=%2Fsearch%2Fadvanced%2Fitem%2Fsearch&newPageVisit=1&eventKey=8315377d-b105-a82d-3b6d-3a4734b7d07e
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.140.152.123 Singapore, Singapore, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-18-140-152-123.ap-southeast-1.compute.amazonaws.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=16070400; includeSubDomains; preload

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 02 Mar 2021 09:08:56 GMT
Server
Apache
Strict-Transport-Security
max-age=16070400; includeSubDomains; preload
p3p
CP="CAO PSA OUR"
Cache-Control
no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Connection
close
Content-Type
image/jpeg
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:00 GMT
v1
api.mdb.tower.jp/mdb/search/media/
2 B
243 B
Fetch
General
Full URL
https://api.mdb.tower.jp/mdb/search/media/v1?keyword=
Requested by
Host: tower.jp
URL: https://tower.jp/javascript/mdb_search.js?20201210
Protocol
H2
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
52.68.230.127 Tokyo, Japan, ASN16509 (AMAZON-02, US),
Reverse DNS
Software
/
Resource Hash
4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

date
Tue, 02 Mar 2021 09:08:56 GMT
content-encoding
gzip
x-amzn-requestid
e3c613a6-69d0-43d5-830c-fef87bf30d22
content-type
application/json
access-control-allow-origin
*
x-amzn-trace-id
Root=1-603e00a8-7d8875ac68ca12750f4cb4c7
x-amz-apigw-id
bjUKSGy3tjMFT1Q=
content-length
22
event.jpeg
www.pages07.net/WTS/
0
458 B
Image
General
Full URL
https://www.pages07.net/WTS/event.jpeg?accesskey=3149a537-159a5c4d96d-3a49a1d67881ef16e3bf2f68bd600905&v=1.31&isNewSession=1&type=pageview&isNewVisitor=0&sessionGUID=12260585-8d4c-4ee2-5713-210b0cbc2e6c&webSyncID=68d96710-b7e3-697e-a850-dea1d2c07574&url=https%3A%2F%2Ftower.jp%2Fsearch%2Fadvanced%2Fitem%2Fsearch%3Fjan%3D4562494353476%257C4562494353483&newSiteVisit=1&referringURL=https%3A%2F%2Ft.co%2FEQWgQUtcoG&hostname=tower.jp&pathname=%2Fsearch%2Fadvanced%2Fitem%2Fsearch&newPageVisit=1&eventKey=44c17413-cab7-7229-73da-e41a0161d56c
Protocol
HTTP/1.1
Security
TLS 1.2, ECDHE_RSA, AES_128_GCM
Server
18.140.152.123 Singapore, Singapore, ASN16509 (AMAZON-02, US),
Reverse DNS
ec2-18-140-152-123.ap-southeast-1.compute.amazonaws.com
Software
Apache /
Resource Hash
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Security Headers
Name Value
Strict-Transport-Security max-age=16070400; includeSubDomains; preload

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Pragma
no-cache
Date
Tue, 02 Mar 2021 09:08:56 GMT
Server
Apache
Strict-Transport-Security
max-age=16070400; includeSubDomains; preload
p3p
CP="CAO PSA OUR"
Cache-Control
no-cache, no-store, must-revalidate, max-age=0, proxy-revalidate, s-maxage=0
Connection
close
Content-Type
image/jpeg
Content-Length
0
Expires
Thu, 01 Jan 1970 00:00:00 GMT
default
api.locize.io/60ff8224-bbcc-4802-8d59-c8983deae8d0/production/en-US/
3 B
595 B
XHR
General
Full URL
https://api.locize.io/60ff8224-bbcc-4802-8d59-c8983deae8d0/production/en-US/default
Requested by
Host: text
URL: data:text/javascript;base64,ZnVuY3Rpb24gb25Mb2FkWmlnWmFnKCl7IWZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIG4ocil7aWYoZVtyXSlyZXR1cm4gZVtyXS5leHBvcnRzO3ZhciBvPWVbcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiB0W3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLG4pLG8ubD0hMCxvLmV4cG9ydHN9bi5tPXQsbi5jPWUsbi5kPWZ1bmN0aW9uKHQsZSxyKXtuLm8odCxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7ZW51bWVyYWJsZTohMCxnZXQ6cn0pfSxuLnI9ZnVuY3Rpb24odCl7InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKHQsZSl7aWYoMSZlJiYodD1uKHQpKSw4JmUpcmV0dXJuIHQ7aWYoNCZlJiYib2JqZWN0Ij09dHlwZW9mIHQmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkociwiZGVmYXVsdCIse2VudW1lcmFibGU6ITAsdmFsdWU6dH0pLDImZSYmInN0cmluZyIhPXR5cGVvZiB0KWZvcih2YXIgbyBpbiB0KW4uZChyLG8sZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19LmJpbmQobnVsbCxvKSk7cmV0dXJuIHJ9LG4ubj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0Ll9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gbi5kKGUsImEiLGUpLGV9LG4ubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sbi5wPSIvIixuKG4ucz0zMDIpfShbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDUpLG89big0NSkuZixpPW4oODcpLGE9bigxKSxzPW4oMzIpLHU9bigxNyksYz1uKDE0KSxsPWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKGUsbixyKXtpZih0aGlzIGluc3RhbmNlb2YgdCl7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHQ7Y2FzZSAxOnJldHVybiBuZXcgdChlKTtjYXNlIDI6cmV0dXJuIG5ldyB0KGUsbil9cmV0dXJuIG5ldyB0KGUsbixyKX1yZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3JldHVybiBlLnByb3RvdHlwZT10LnByb3RvdHlwZSxlfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbixmLHAsaCxkLGcsdix5LG09dC50YXJnZXQsYj10Lmdsb2JhbCx4PXQuc3RhdCx3PXQucHJvdG8saz1iP3I6eD9yW21dOihyW21dfHx7fSkucHJvdG90eXBlLFM9Yj9hOmFbbV18fChhW21dPXt9KSxFPVMucHJvdG90eXBlO2ZvcihwIGluIGUpbj0haShiP3A6bSsoeD8iLiI6IiMiKStwLHQuZm9yY2VkKSYmayYmYyhrLHApLGQ9U1twXSxuJiYoZz10Lm5vVGFyZ2V0R2V0Pyh5PW8oayxwKSkmJnkudmFsdWU6a1twXSksaD1uJiZnP2c6ZVtwXSxuJiZ0eXBlb2YgZD09dHlwZW9mIGh8fCh2PXQuYmluZCYmbj9zKGgscik6dC53cmFwJiZuP2woaCk6dyYmImZ1bmN0aW9uIj09dHlwZW9mIGg/cyhGdW5jdGlvbi5jYWxsLGgpOmgsKHQuc2hhbXx8aCYmaC5zaGFtfHxkJiZkLnNoYW0pJiZ1KHYsInNoYW0iLCEwKSxTW3BdPXYsdyYmKGMoYSxmPW0rIlByb3RvdHlwZSIpfHx1KGEsZix7fSksYVtmXVtwXT1oLHQucmVhbCYmRSYmIUVbcF0mJnUoRSxwLGgpKSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSksbz1uKDU4KSxpPW4oNzApLGE9big5NSkscz1yLlN5bWJvbCx1PW8oIndrcyIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdVt0XXx8KHVbdF09YSYmc1t0XXx8KGE/czppKSgiU3ltYm9sLiIrdCkpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE0Nyl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEpLG89bigxNCksaT1uKDc1KSxhPW4oMjMpLmY7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXIuU3ltYm9sfHwoci5TeW1ib2w9e30pO28oZSx0KXx8YShlLHQse3ZhbHVlOmkuZih0KX0pfX0sZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbihlKXt2YXIgbj0ib2JqZWN0IixyPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lk1hdGg9PU1hdGgmJnR9O3QuZXhwb3J0cz1yKHR5cGVvZiBnbG9iYWxUaGlzPT1uJiZnbG9iYWxUaGlzKXx8cih0eXBlb2Ygd2luZG93PT1uJiZ3aW5kb3cpfHxyKHR5cGVvZiBzZWxmPT1uJiZzZWxmKXx8cih0eXBlb2YgZT09biYmZSl8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9KS5jYWxsKHRoaXMsbig4NSkpfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXt0cnl7cmV0dXJuISF0KCl9Y2F0Y2godCl7cmV0dXJuITB9fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0P251bGwhPT10OiJmdW5jdGlvbiI9PXR5cGVvZiB0fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMzYpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjEzKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCFyKHQpKXRocm93IFR5cGVFcnJvcihTdHJpbmcodCkrIiBpcyBub3QgYW4gb2JqZWN0Iik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNTQpO2Z1bmN0aW9uIG8odCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIG89ZVtuXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLHIodCxvLmtleSxvKX19dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZSYmbyh0LnByb3RvdHlwZSxlKSxuJiZvKHQsbiksdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpO3QuZXhwb3J0cz0hcihmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSl9LGZ1bmN0aW9uKHQsZSl7dmFyIG49e30uaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4uY2FsbCh0LGUpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTY3KSxvPW4oOTcpO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIHQuZXhwb3J0cz1pPW8/cjpmdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX198fHIodCl9LGkoZSl9dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMTcpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMyksbz1uKDIzKSxpPW4oMzEpO3QuZXhwb3J0cz1yP2Z1bmN0aW9uKHQsZSxuKXtyZXR1cm4gby5mKHQsZSxpKDEsbikpfTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHRbZV09bix0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiByW3QrIlByb3RvdHlwZSJdfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTc1KSxvPW4oMTc5KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTt0LnByb3RvdHlwZT1yKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmbyh0LGUpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE1MCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDY1KSxvPW4oNDYpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcihvKHQpKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IFR5cGVFcnJvcihTdHJpbmcodCkrIiBpcyBub3QgYSBmdW5jdGlvbiIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTMpLG89big4NiksaT1uKDExKSxhPW4oNTQpLHM9T2JqZWN0LmRlZmluZVByb3BlcnR5O2UuZj1yP3M6ZnVuY3Rpb24odCxlLG4pe2lmKGkodCksZT1hKGUsITApLGkobiksbyl0cnl7cmV0dXJuIHModCxlLG4pfWNhdGNoKHQpe31pZigiZ2V0ImluIG58fCJzZXQiaW4gbil0aHJvdyBUeXBlRXJyb3IoIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIik7cmV0dXJuInZhbHVlImluIG4mJih0W2VdPW4udmFsdWUpLHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0Nik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3Qocih0KSl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNjEpLG89bi5uKHIpO2Z1bmN0aW9uIGkodCl7dmFyIGU9d2luZG93LnppZ3phZztlJiZlLnV0aWxzLmRlYnVnTG9nZ2VyKCkobygpKHQpKX1lLmE9e2RlYnVnOmksZXJyb3I6ZnVuY3Rpb24odCl7dmFyIGU9d2luZG93LnppZ3phZztlJiZlLnV0aWxzJiZlLnV0aWxzLmVycm9yTG9nZ2VyJiZlLnV0aWxzLmVycm9yTG9nZ2VyKCkodCksaSh0KX19fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTQzKX0sZnVuY3Rpb24odCxlKXt2YXIgbj17fS50b1N0cmluZzt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG4uY2FsbCh0KS5zbGljZSg4LC0xKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPSEwfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMykuZixvPW4oMTcpLGk9bigxNCksYT1uKDE4Nykscz1uKDIpKCJ0b1N0cmluZ1RhZyIpLHU9YSE9PXt9LnRvU3RyaW5nO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixjKXtpZih0KXt2YXIgbD1uP3Q6dC5wcm90b3R5cGU7aShsLHMpfHxyKGwscyx7Y29uZmlndXJhYmxlOiEwLHZhbHVlOmV9KSxjJiZ1JiZvKGwsInRvU3RyaW5nIixhKX19fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm57ZW51bWVyYWJsZTohKDEmdCksY29uZmlndXJhYmxlOiEoMiZ0KSx3cml0YWJsZTohKDQmdCksdmFsdWU6ZX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtpZihyKHQpLHZvaWQgMD09PWUpcmV0dXJuIHQ7c3dpdGNoKG4pe2Nhc2UgMDpyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5jYWxsKGUpfTtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0LmNhbGwoZSxuKX07Y2FzZSAyOnJldHVybiBmdW5jdGlvbihuLHIpe3JldHVybiB0LmNhbGwoZSxuLHIpfTtjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKG4scixvKXtyZXR1cm4gdC5jYWxsKGUsbixyLG8pfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShlLGFyZ3VtZW50cyl9fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMSksbz1uKDUpLGk9ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp2b2lkIDB9O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/aShyW3RdKXx8aShvW3RdKTpyW3RdJiZyW3RdW2VdfHxvW3RdJiZvW3RdW2VdfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNjgpLG89TWF0aC5taW47dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0PjA/byhyKHQpLDkwMDcxOTkyNTQ3NDA5OTEpOjB9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTg0KS5jaGFyQXQsbz1uKDUwKSxpPW4oOTkpLGE9by5zZXQscz1vLmdldHRlckZvcigiU3RyaW5nIEl0ZXJhdG9yIik7aShTdHJpbmcsIlN0cmluZyIsZnVuY3Rpb24odCl7YSh0aGlzLHt0eXBlOiJTdHJpbmcgSXRlcmF0b3IiLHN0cmluZzpTdHJpbmcodCksaW5kZXg6MH0pfSxmdW5jdGlvbigpe3ZhciB0LGU9cyh0aGlzKSxuPWUuc3RyaW5nLG89ZS5pbmRleDtyZXR1cm4gbz49bi5sZW5ndGg/e3ZhbHVlOnZvaWQgMCxkb25lOiEwfToodD1yKG4sbyksZS5pbmRleCs9dC5sZW5ndGgse3ZhbHVlOnQsZG9uZTohMX0pfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sbyl7byYmby5lbnVtZXJhYmxlP3RbZV09bjpyKHQsZSxuKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE4MCksbz1uKDIxMik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIWV8fCJvYmplY3QiIT09cihlKSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU/byh0KTplfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIyNil9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMjcpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjI5KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIzMCl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMzEpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjM0KX0sZnVuY3Rpb24odCl7dC5leHBvcnRzPUpTT04ucGFyc2UoJ3sibG9jaXplIjp7InByb2R1Y3RJZCI6IjYwZmY4MjI0LWJiY2MtNDgwMi04ZDU5LWM4OTgzZGVhZThkMCIsImFwaUtleSI6IjczOTZlNzc4LTA5MDMtNGU3ZS04MjgyLWU2NzE1ODU4YmI4YyIsInZlcnNpb24iOiJwcm9kdWN0aW9uIn0sImludGVncmF0aW9ucyI6eyJjb2xvcm1lQXBwIjp7ImFwaSI6eyJwcm9kdWN0IjoiaHR0cHM6Ly9jb2xvcm1lLndvcmxkc2hvcHBpbmcuanAvdjEvcHJvZHVjdCJ9fSwic2hvcGlmeUFwcCI6eyJhcGkiOnsicHJvZHVjdCI6Imh0dHBzOi8vYXBwLXMud29ybGRzaG9wcGluZy5qcC92MS9wcm9kdWN0In19fSwibGFtYmRhIjp7ImNyZWF0ZSI6InNob3AtZGF0YS1wcm9kLWNyZWF0ZSIsImNsZWFyIjoic2hvcC1kYXRhLXByb2QtY2xlYXIifSwic2ZkYyI6eyJjb25uZWN0aW9uU2V0dGluZ3NQYXRoIjoiL3NmZGMvcHJvZC9hcGkifSwiZGVidWdIb3N0cyI6WyJzaG9wLWRhc2hib2FyZC53b3JsZHNob3BwaW5nLmJpeiIsInNob3AtZGFzaGJvYXJkLWRldi53b3JsZHNob3BwaW5nLmJpeiIsInNob3AtZGFzaGJvYXJkLWxvY2FsLndvcmxkc2hvcHBpbmcuYml6Il19Jyl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEzKSxvPW4oNjQpLGk9bigzMSksYT1uKDIxKSxzPW4oNTQpLHU9bigxNCksYz1uKDg2KSxsPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7ZS5mPXI/bDpmdW5jdGlvbih0LGUpe2lmKHQ9YSh0KSxlPXMoZSwhMCksYyl0cnl7cmV0dXJuIGwodCxlKX1jYXRjaCh0KXt9aWYodSh0LGUpKXJldHVybiBpKCFvLmYuY2FsbCh0LGUpLHRbZV0pfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYobnVsbD09dCl0aHJvdyBUeXBlRXJyb3IoIkNhbid0IGNhbGwgbWV0aG9kIG9uICIrdCk7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMSksbz1uKDEzOSksaT1uKDY5KSxhPW4oNTYpLHM9big5MCksdT1uKDY2KSxjPW4oNTcpKCJJRV9QUk9UTyIpLGw9ZnVuY3Rpb24oKXt9LGY9ZnVuY3Rpb24oKXt2YXIgdCxlPXUoImlmcmFtZSIpLG49aS5sZW5ndGg7Zm9yKGUuc3R5bGUuZGlzcGxheT0ibm9uZSIscy5hcHBlbmRDaGlsZChlKSxlLnNyYz1TdHJpbmcoImphdmFzY3JpcHQ6IiksKHQ9ZS5jb250ZW50V2luZG93LmRvY3VtZW50KS5vcGVuKCksdC53cml0ZSgiPHNjcmlwdD5kb2N1bWVudC5GPU9iamVjdDxcL3NjcmlwdD4iKSx0LmNsb3NlKCksZj10LkY7bi0tOylkZWxldGUgZi5wcm90b3R5cGVbaVtuXV07cmV0dXJuIGYoKX07dC5leHBvcnRzPU9iamVjdC5jcmVhdGV8fGZ1bmN0aW9uKHQsZSl7dmFyIG47cmV0dXJuIG51bGwhPT10PyhsLnByb3RvdHlwZT1yKHQpLG49bmV3IGwsbC5wcm90b3R5cGU9bnVsbCxuW2NdPXQpOm49ZigpLHZvaWQgMD09PWU/bjpvKG4sZSl9LGFbY109ITB9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI3KTt0LmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24odCl7cmV0dXJuIkFycmF5Ij09cih0KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0KSxvPW4oMjQpLGk9big1NyksYT1uKDk2KSxzPWkoIklFX1BST1RPIiksdT1PYmplY3QucHJvdG90eXBlO3QuZXhwb3J0cz1hP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbih0KXtyZXR1cm4gdD1vKHQpLHIodCxzKT90W3NdOiJmdW5jdGlvbiI9PXR5cGVvZiB0LmNvbnN0cnVjdG9yJiZ0IGluc3RhbmNlb2YgdC5jb25zdHJ1Y3Rvcj90LmNvbnN0cnVjdG9yLnByb3RvdHlwZTp0IGluc3RhbmNlb2YgT2JqZWN0P3U6bnVsbH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGksYT1uKDE4NSkscz1uKDUpLHU9big3KSxjPW4oMTcpLGw9bigxNCksZj1uKDU3KSxwPW4oNTYpLGg9cy5XZWFrTWFwO2lmKGEpe3ZhciBkPW5ldyBoLGc9ZC5nZXQsdj1kLmhhcyx5PWQuc2V0O3I9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS5jYWxsKGQsdCxlKSxlfSxvPWZ1bmN0aW9uKHQpe3JldHVybiBnLmNhbGwoZCx0KXx8e319LGk9ZnVuY3Rpb24odCl7cmV0dXJuIHYuY2FsbChkLHQpfX1lbHNle3ZhciBtPWYoInN0YXRlIik7cFttXT0hMCxyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGModCxtLGUpLGV9LG89ZnVuY3Rpb24odCl7cmV0dXJuIGwodCxtKT90W21dOnt9fSxpPWZ1bmN0aW9uKHQpe3JldHVybiBsKHQsbSl9fXQuZXhwb3J0cz17c2V0OnIsZ2V0Om8saGFzOmksZW5mb3JjZTpmdW5jdGlvbih0KXtyZXR1cm4gaSh0KT9vKHQpOnIodCx7fSl9LGdldHRlckZvcjpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG47aWYoIXUoZSl8fChuPW8oZSkpLnR5cGUhPT10KXRocm93IFR5cGVFcnJvcigiSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAiK3QrIiByZXF1aXJlZCIpO3JldHVybiBufX19fSxmdW5jdGlvbih0LGUsbil7bigxMDIpO3ZhciByPW4oMTg4KSxvPW4oNSksaT1uKDE3KSxhPW4oMzApLHM9bigyKSgidG9TdHJpbmdUYWciKTtmb3IodmFyIHUgaW4gcil7dmFyIGM9b1t1XSxsPWMmJmMucHJvdG90eXBlO2wmJiFsW3NdJiZpKGwscyx1KSxhW3VdPWEuQXJyYXl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big3Niksbz1uKDMwKSxpPW4oMikoIml0ZXJhdG9yIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKG51bGwhPXQpcmV0dXJuIHRbaV18fHRbIkBAaXRlcmF0b3IiXXx8b1tyKHQpXX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyMiksbz1mdW5jdGlvbih0KXt2YXIgZSxuO3RoaXMucHJvbWlzZT1uZXcgdChmdW5jdGlvbih0LHIpe2lmKHZvaWQgMCE9PWV8fHZvaWQgMCE9PW4pdGhyb3cgVHlwZUVycm9yKCJCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvciIpO2U9dCxuPXJ9KSx0aGlzLnJlc29sdmU9cihlKSx0aGlzLnJlamVjdD1yKG4pfTt0LmV4cG9ydHMuZj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IG8odCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZighcih0KSlyZXR1cm4gdDt2YXIgbixvO2lmKGUmJiJmdW5jdGlvbiI9PXR5cGVvZihuPXQudG9TdHJpbmcpJiYhcihvPW4uY2FsbCh0KSkpcmV0dXJuIG87aWYoImZ1bmN0aW9uIj09dHlwZW9mKG49dC52YWx1ZU9mKSYmIXIobz1uLmNhbGwodCkpKXJldHVybiBvO2lmKCFlJiYiZnVuY3Rpb24iPT10eXBlb2Yobj10LnRvU3RyaW5nKSYmIXIobz1uLmNhbGwodCkpKXJldHVybiBvO3Rocm93IFR5cGVFcnJvcigiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIil9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big4OCksbz1uKDY5KTt0LmV4cG9ydHM9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKHQpe3JldHVybiByKHQsbyl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNTgpLG89big3MCksaT1yKCJrZXlzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpW3RdfHwoaVt0XT1vKHQpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpLG89bigxNDApLGk9bigyOCksYT1yWyJfX2NvcmUtanNfc2hhcmVkX18iXXx8bygiX19jb3JlLWpzX3NoYXJlZF9fIix7fSk7KHQuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBhW3RdfHwoYVt0XT12b2lkIDAhPT1lP2U6e30pfSkoInZlcnNpb25zIixbXSkucHVzaCh7dmVyc2lvbjoiMy4yLjAiLG1vZGU6aT8icHVyZSI6Imdsb2JhbCIsY29weXJpZ2h0OiLCqSAyMDE5IERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpIn0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMSksbz1uKDExMiksaT1uKDM0KSxhPW4oMzIpLHM9big1MiksdT1uKDExMSksYz1mdW5jdGlvbih0LGUpe3RoaXMuc3RvcHBlZD10LHRoaXMucmVzdWx0PWV9Oyh0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sbCxmKXt2YXIgcCxoLGQsZyx2LHksbT1hKGUsbixsPzI6MSk7aWYoZilwPXQ7ZWxzZXtpZigiZnVuY3Rpb24iIT10eXBlb2YoaD1zKHQpKSl0aHJvdyBUeXBlRXJyb3IoIlRhcmdldCBpcyBub3QgaXRlcmFibGUiKTtpZihvKGgpKXtmb3IoZD0wLGc9aSh0Lmxlbmd0aCk7Zz5kO2QrKylpZigodj1sP20ocih5PXRbZF0pWzBdLHlbMV0pOm0odFtkXSkpJiZ2IGluc3RhbmNlb2YgYylyZXR1cm4gdjtyZXR1cm4gbmV3IGMoITEpfXA9aC5jYWxsKHQpfWZvcig7ISh5PXAubmV4dCgpKS5kb25lOylpZigodj11KHAsbSx5LnZhbHVlLGwpKSYmdiBpbnN0YW5jZW9mIGMpcmV0dXJuIHY7cmV0dXJuIG5ldyBjKCExKX0pLnN0b3A9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBjKCEwLHQpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybntlcnJvcjohMSx2YWx1ZTp0KCl9fWNhdGNoKHQpe3JldHVybntlcnJvcjohMCx2YWx1ZTp0fX19fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTQxKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIzNyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyODUpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPXt9LnByb3BlcnR5SXNFbnVtZXJhYmxlLG89T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixpPW8mJiFyLmNhbGwoezE6Mn0sMSk7ZS5mPWk/ZnVuY3Rpb24odCl7dmFyIGU9byh0aGlzLHQpO3JldHVybiEhZSYmZS5lbnVtZXJhYmxlfTpyfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2KSxvPW4oMjcpLGk9IiIuc3BsaXQ7dC5leHBvcnRzPXIoZnVuY3Rpb24oKXtyZXR1cm4hT2JqZWN0KCJ6IikucHJvcGVydHlJc0VudW1lcmFibGUoMCl9KT9mdW5jdGlvbih0KXtyZXR1cm4iU3RyaW5nIj09byh0KT9pLmNhbGwodCwiIik6T2JqZWN0KHQpfTpPYmplY3R9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpLG89big3KSxpPXIuZG9jdW1lbnQsYT1vKGkpJiZvKGkuY3JlYXRlRWxlbWVudCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBhP2kuY3JlYXRlRWxlbWVudCh0KTp7fX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIxKSxvPW4oMzQpLGk9big4OSksYT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLGEpe3ZhciBzLHU9cihlKSxjPW8odS5sZW5ndGgpLGw9aShhLGMpO2lmKHQmJm4hPW4pe2Zvcig7Yz5sOylpZigocz11W2wrK10pIT1zKXJldHVybiEwfWVsc2UgZm9yKDtjPmw7bCsrKWlmKCh0fHxsIGluIHUpJiZ1W2xdPT09bilyZXR1cm4gdHx8bHx8MDtyZXR1cm4hdCYmLTF9fTt0LmV4cG9ydHM9e2luY2x1ZGVzOmEoITApLGluZGV4T2Y6YSghMSl9fSxmdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguY2VpbCxyPU1hdGguZmxvb3I7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpc05hTih0PSt0KT8wOih0PjA/cjpuKSh0KX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPVsiY29uc3RydWN0b3IiLCJoYXNPd25Qcm9wZXJ0eSIsImlzUHJvdG90eXBlT2YiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInRvTG9jYWxlU3RyaW5nIiwidG9TdHJpbmciLCJ2YWx1ZU9mIl19LGZ1bmN0aW9uKHQsZSl7dmFyIG49MCxyPU1hdGgucmFuZG9tKCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiJTeW1ib2woIitTdHJpbmcodm9pZCAwPT09dD8iIjp0KSsiKV8iKygrK24rcikudG9TdHJpbmcoMzYpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDU0KSxvPW4oMjMpLGk9bigzMSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgYT1yKGUpO2EgaW4gdD9vLmYodCxhLGkoMCxuKSk6dFthXT1ufX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNiksbz1uKDIpKCJzcGVjaWVzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiFyKGZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuKGUuY29uc3RydWN0b3I9e30pW29dPWZ1bmN0aW9uKCl7cmV0dXJue2ZvbzoxfX0sMSE9PWVbdF0oQm9vbGVhbikuZm9vfSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzMiksbz1uKDY1KSxpPW4oMjQpLGE9bigzNCkscz1uKDk0KSx1PVtdLnB1c2gsYz1mdW5jdGlvbih0KXt2YXIgZT0xPT10LG49Mj09dCxjPTM9PXQsbD00PT10LGY9Nj09dCxwPTU9PXR8fGY7cmV0dXJuIGZ1bmN0aW9uKGgsZCxnLHYpe2Zvcih2YXIgeSxtLGI9aShoKSx4PW8oYiksdz1yKGQsZywzKSxrPWEoeC5sZW5ndGgpLFM9MCxFPXZ8fHMsaj1lP0UoaCxrKTpuP0UoaCwwKTp2b2lkIDA7az5TO1MrKylpZigocHx8UyBpbiB4KSYmKG09dyh5PXhbU10sUyxiKSx0KSlpZihlKWpbU109bTtlbHNlIGlmKG0pc3dpdGNoKHQpe2Nhc2UgMzpyZXR1cm4hMDtjYXNlIDU6cmV0dXJuIHk7Y2FzZSA2OnJldHVybiBTO2Nhc2UgMjp1LmNhbGwoaix5KX1lbHNlIGlmKGwpcmV0dXJuITE7cmV0dXJuIGY/LTE6Y3x8bD9sOmp9fTt0LmV4cG9ydHM9e2ZvckVhY2g6YygwKSxtYXA6YygxKSxmaWx0ZXI6YygyKSxzb21lOmMoMyksZXZlcnk6Yyg0KSxmaW5kOmMoNSksZmluZEluZGV4OmMoNil9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMSksbz1uKDE3NCk7dC5leHBvcnRzPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8KCJfX3Byb3RvX18iaW57fT9mdW5jdGlvbigpe3ZhciB0LGU9ITEsbj17fTt0cnl7KHQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QucHJvdG90eXBlLCJfX3Byb3RvX18iKS5zZXQpLmNhbGwobixbXSksZT1uIGluc3RhbmNlb2YgQXJyYXl9Y2F0Y2godCl7fXJldHVybiBmdW5jdGlvbihuLGkpe3JldHVybiByKG4pLG8oaSksZT90LmNhbGwobixpKTpuLl9fcHJvdG9fXz1pLG59fSgpOnZvaWQgMCl9LGZ1bmN0aW9uKHQsZSxuKXtlLmY9bigyKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjcpLG89bigyKSgidG9TdHJpbmdUYWciKSxpPSJBcmd1bWVudHMiPT1yKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlLG4sYTtyZXR1cm4gdm9pZCAwPT09dD8iVW5kZWZpbmVkIjpudWxsPT09dD8iTnVsbCI6InN0cmluZyI9PXR5cGVvZihuPWZ1bmN0aW9uKHQsZSl7dHJ5e3JldHVybiB0W2VdfWNhdGNoKHQpe319KGU9T2JqZWN0KHQpLG8pKT9uOmk/cihlKToiT2JqZWN0Ij09KGE9cihlKSkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNhbGxlZT8iQXJndW1lbnRzIjphfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz0iXHRcblx2XGZcciDCoOGagOKAgOKAgeKAguKAg+KAhOKAheKAhuKAh+KAiOKAieKAiuKAr+KBn+OAgFx1MjAyOFx1MjAyOVx1ZmVmZiJ9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDMzKTt0LmV4cG9ydHM9cigibmF2aWdhdG9yIiwidXNlckFnZW50Iil8fCIifSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjIyKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0Nyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNjMpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNzMpLG89bigyNzYpLGk9bigyODEpLGE9bigyODQpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcih0KXx8byh0KXx8aSh0KXx8YSgpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjsoZnVuY3Rpb24odCl7bi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIFJ9KSxuLmQoZSwiYiIsZnVuY3Rpb24oKXtyZXR1cm4gUH0pO3ZhciByPW4oMzgpLG89bi5uKHIpLGk9bigzOSksYT1uLm4oaSkscz1uKDQwKSx1PW4ubihzKSxjPW4oNDEpLGw9bi5uKGMpLGY9big0MikscD1uLm4oZiksaD1uKDQzKSxkPW4ubihoKSxnPW4oMTM0KSx2PW4ubihnKSx5PW4oNjMpLG09bi5uKHkpLGI9bigxNikseD1uLm4oYiksdz1uKDgpLGs9bi5uKHcpLFM9bigxMiksRT1uLm4oUyksaj1uKDEzNSksVD1uLm4oaiksTz1uKDI1KSxBPW4oNDQpO2Z1bmN0aW9uIEModCxlKXt2YXIgbjtpZih2b2lkIDA9PT1sLmF8fG51bGw9PXUoKSh0KSl7aWYoYSgpKHQpfHwobj1mdW5jdGlvbih0LGUpe3ZhciBuO2lmKCF0KXJldHVybjtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIEwodCxlKTt2YXIgcj1kKCkobj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpLmNhbGwobiw4LC0xKTsiT2JqZWN0Ij09PXImJnQuY29uc3RydWN0b3ImJihyPXQuY29uc3RydWN0b3IubmFtZSk7aWYoIk1hcCI9PT1yfHwiU2V0Ij09PXIpcmV0dXJuIHAoKSh0KTtpZigiQXJndW1lbnRzIj09PXJ8fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHIpKXJldHVybiBMKHQsZSl9KHQpKXx8ZSYmdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCl7biYmKHQ9bik7dmFyIHI9MCxpPWZ1bmN0aW9uKCl7fTtyZXR1cm57czppLG46ZnVuY3Rpb24oKXtyZXR1cm4gcj49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbcisrXX19LGU6ZnVuY3Rpb24odCl7dGhyb3cgdH0sZjppfX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIHMsYz0hMCxmPSExO3JldHVybntzOmZ1bmN0aW9uKCl7bj1vKCkodCl9LG46ZnVuY3Rpb24oKXt2YXIgdD1uLm5leHQoKTtyZXR1cm4gYz10LmRvbmUsdH0sZTpmdW5jdGlvbih0KXtmPSEwLHM9dH0sZjpmdW5jdGlvbigpe3RyeXtjfHxudWxsPT1uLnJldHVybnx8bi5yZXR1cm4oKX1maW5hbGx5e2lmKGYpdGhyb3cgc319fX1mdW5jdGlvbiBMKHQsZSl7KG51bGw9PWV8fGU+dC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkoZSk7bjxlO24rKylyW25dPXRbbl07cmV0dXJuIHJ9dmFyIFI9e2NvZGU6Ik5PTkUifSxQPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXt2YXIgbj10aGlzLHI9dC5zY3JhcGVyUmVzdWx0LG89dC5sb2NhdGlvbixpPXQuZGF0YTtrKCkodGhpcyxlKSx0aGlzLmV4Y2x1ZGVCeVNjcmFwZXJFcnJvcj1mdW5jdGlvbigpe3ZhciB0PW4uc2NyYXBlclJlc3VsdDtyZXR1cm4gdC5lcnJvcj97Y29kZToiRVJST1IiLG1lc3NhZ2U6ImV4Y2x1ZGVCeVNjcmFwZXJFcnJvcjogIi5jb25jYXQodC5lcnJvcil9OnQuaXRlbT8odC5za3VSb3dzfHwodC5za3VSb3dzPVtdKSxSKTp7Y29kZToiRVJST1IiLG1lc3NhZ2U6ImV4Y2x1ZGVCeVNjcmFwZXJFcnJvcjogbm8gaXRlbSJ9fSx0aGlzLmV4Y2x1ZGVCeU5vdFB1cmNoYXNhYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIG4uc2NyYXBlclJlc3VsdC5wdXJjaGFzYWJsZT9SOntjb2RlOiJOT1RfUFVSQ0hBU0FCTEUiLG1lc3NhZ2U6ImV4Y2x1ZGVCeU5vdFB1cmNoYXNhYmxlIn19LHRoaXMuZXhjbHVkZUJ5U2t1WmVybz1mdW5jdGlvbigpe3JldHVybiBuLnNjcmFwZXJSZXN1bHQuc2t1Um93cyYmMD09PW4uc2NyYXBlclJlc3VsdC5za3VSb3dzLmxlbmd0aD97Y29kZToiTk9UX1BVUkNIQVNBQkxFIixtZXNzYWdlOiJleGNsdWRlQnlTa3VaZXJvIn06Un0sdGhpcy5leGNsdWRlQnlVcmw9ZnVuY3Rpb24oKXtpZigwPT09bi5ieVVybC5sZW5ndGgpcmV0dXJuIFI7dmFyIHQ9ZS53aW5kb3dMb2NhdGlvbkhyZWY7cmV0dXJuIG4uZXhjbHVkZShuLmJ5VXJsLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIG5ldyBSZWdFeHAoIl4iLmNvbmNhdChUKCkoeCgpKG49ZS51cmwpLmNhbGwobikpKSkudGVzdCh0KX0pfSx0aGlzLmV4Y2x1ZGVCeUl0ZW1OYW1lPWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlJdGVtTmFtZS5sZW5ndGgpcmV0dXJuIFI7dmFyIHQ9bi5zY3JhcGVyUmVzdWx0Lml0ZW0mJm4uc2NyYXBlclJlc3VsdC5pdGVtLm5hbWV8fCIiO3JldHVybiBuLmV4Y2x1ZGUobi5ieUl0ZW1OYW1lLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIG5ldyBSZWdFeHAoIl4iLmNvbmNhdCh4KCkobj1lLml0ZW1OYW1lKS5jYWxsKG4pKSkudGVzdCh0KX0pfSx0aGlzLmV4Y2x1ZGVCeUl0ZW1Db2RlPWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlJdGVtQ29kZS5sZW5ndGgpcmV0dXJuIFI7dmFyIHQ9bi5zY3JhcGVyUmVzdWx0Lml0ZW0mJm4uc2NyYXBlclJlc3VsdC5pdGVtLmNvZGV8fCIiO3JldHVybiBuLmV4Y2x1ZGUobi5ieUl0ZW1Db2RlLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIHgoKShuPWUuaXRlbUNvZGUpLmNhbGwobik9PT10fSl9LHRoaXMuZXhjbHVkZUJ5Q2F0ZWdvcnk9ZnVuY3Rpb24oKXtpZigwPT09bi5ieUNhdGVnb3J5Lmxlbmd0aClyZXR1cm4gUjt2YXIgdD1uLnNjcmFwZXJSZXN1bHQuaXRlbSYmbi5zY3JhcGVyUmVzdWx0Lml0ZW0uY2F0ZWdvcnl8fCIiO3JldHVybiBuLmV4Y2x1ZGUobi5ieUNhdGVnb3J5LHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIHgoKShuPWUuY2F0ZWdvcnkpLmNhbGwobik9PT10fSl9LHRoaXMuZXhjbHVkZUJ5SXRlbURlc2NyaXB0aW9uPWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlJdGVtRGVzY3JpcHRpb24ubGVuZ3RoKXJldHVybiBSO3ZhciB0PW4uc2NyYXBlclJlc3VsdC5pdGVtJiZuLnNjcmFwZXJSZXN1bHQuaXRlbS5kZXNjcmlwdGlvbnx8IiI7cmV0dXJuIG4uZXhjbHVkZShuLmJ5SXRlbURlc2NyaXB0aW9uLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIG5ldyBSZWdFeHAoIiIuY29uY2F0KHgoKShuPWUudGV4dCkuY2FsbChuKSkpLnRlc3QodCl9KX0sdGhpcy5leGVjdXRlPWZ1bmN0aW9uKCl7dmFyIHQ9ITEsZT1bXSxyPW4uZXhjbHVkZUJ5U2NyYXBlckVycm9yKCk7aWYoIk5PTkUiIT09ci5jb2RlKXJldHVybntpc0V4Y2x1ZGVkOiEwLHJlYXNvbnM6W3JdfTsiTk9ORSIhPT0ocj1uLmV4Y2x1ZGVCeU5vdFB1cmNoYXNhYmxlKCkpLmNvZGUmJih0PSEwLGUucHVzaChyKSk7dmFyIG8saT1DKG4uY29uZmlndXJlRXhjbHVzaW9uTWV0aG9kcyhbbi5leGNsdWRlQnlVcmwsbi5leGNsdWRlQnlJdGVtTmFtZSxuLmV4Y2x1ZGVCeUl0ZW1Db2RlLG4uZXhjbHVkZUJ5Q2F0ZWdvcnksbi5leGNsdWRlQnlJdGVtRGVzY3JpcHRpb25dKSk7dHJ5e2ZvcihpLnMoKTshKG89aS5uKCkpLmRvbmU7KXt2YXIgYT0oMCxvLnZhbHVlKSgpO2lmKCJOT05FIiE9PWEuY29kZSYmKHQ9ITAsZS5wdXNoKGEpKSwiRVJST1IiPT09YS5jb2RlKWJyZWFrfX1jYXRjaCh0KXtpLmUodCl9ZmluYWxseXtpLmYoKX1yZXR1cm57aXNFeGNsdWRlZDp0LHJlYXNvbnM6ZX19LHRoaXMuc2NyYXBlclJlc3VsdD1yLHRoaXMubG9jYXRpb249byx0aGlzLmRhdGE9aSx0aGlzLmJ5VXJsPWkuYnlVcmwsdGhpcy5ieUl0ZW1OYW1lPWkuYnlJdGVtTmFtZSx0aGlzLmJ5SXRlbUNvZGU9aS5ieUl0ZW1Db2RlLHRoaXMuYnlDYXRlZ29yeT1pLmJ5Q2F0ZWdvcnksdGhpcy5ieUl0ZW1EZXNjcmlwdGlvbj1pLmJ5SXRlbURlc2NyaXB0aW9ufXJldHVybiBFKCkoZSxbe2tleToiY29uZmlndXJlRXhjbHVzaW9uTWV0aG9kcyIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHR9fSx7a2V5OiJleGNsdWRlIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIFJ9fV0sW3trZXk6IndpbmRvd0xvY2F0aW9uSHJlZiIsZ2V0OmZ1bmN0aW9uKCl7dmFyIGUsbj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUscj13aW5kb3cubG9jYXRpb24uaHJlZjtpZihtKCkoZT1BLmRlYnVnSG9zdHMpLmNhbGwoZSxuKSl7dmFyIG89bmV3IHYuYSh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoInp6dXJsIik7aWYobyl0cnl7cj10LmZyb20obywiYmFzZTY0IikudG9TdHJpbmcoInV0Zi04Iil9Y2F0Y2godCl7Ty5hLmVycm9yKHQpfX1yZXR1cm4gcn19XSksZX0oKX0pLmNhbGwodGhpcyxuKDI5NCkuQnVmZmVyKX0sZnVuY3Rpb24odCxlKXt2YXIgbjtuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCk7dHJ5e249bnx8bmV3IEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9Y2F0Y2godCl7Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJihuPXdpbmRvdyl9dC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEzKSxvPW4oNiksaT1uKDY2KTt0LmV4cG9ydHM9IXImJiFvKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eShpKCJkaXYiKSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmF9KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNiksbz0vI3xcLnByb3RvdHlwZVwuLyxpPWZ1bmN0aW9uKHQsZSl7dmFyIG49c1thKHQpXTtyZXR1cm4gbj09Y3x8biE9dSYmKCJmdW5jdGlvbiI9PXR5cGVvZiBlP3IoZSk6ISFlKX0sYT1pLm5vcm1hbGl6ZT1mdW5jdGlvbih0KXtyZXR1cm4gU3RyaW5nKHQpLnJlcGxhY2UobywiLiIpLnRvTG93ZXJDYXNlKCl9LHM9aS5kYXRhPXt9LHU9aS5OQVRJVkU9Ik4iLGM9aS5QT0xZRklMTD0iUCI7dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0KSxvPW4oMjEpLGk9big2NykuaW5kZXhPZixhPW4oNTYpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuLHM9byh0KSx1PTAsYz1bXTtmb3IobiBpbiBzKSFyKGEsbikmJnIocyxuKSYmYy5wdXNoKG4pO2Zvcig7ZS5sZW5ndGg+dTspcihzLG49ZVt1KytdKSYmKH5pKGMsbil8fGMucHVzaChuKSk7cmV0dXJuIGN9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2OCksbz1NYXRoLm1heCxpPU1hdGgubWluO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPXIodCk7cmV0dXJuIG48MD9vKG4rZSwwKTppKG4sZSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzMyk7dC5leHBvcnRzPXIoImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50Iil9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyMiksbz1uKDcpLGk9W10uc2xpY2UsYT17fSxzPWZ1bmN0aW9uKHQsZSxuKXtpZighKGUgaW4gYSkpe2Zvcih2YXIgcj1bXSxvPTA7bzxlO28rKylyW29dPSJhWyIrbysiXSI7YVtlXT1GdW5jdGlvbigiQyxhIiwicmV0dXJuIG5ldyBDKCIrci5qb2luKCIsIikrIikiKX1yZXR1cm4gYVtlXSh0LG4pfTt0LmV4cG9ydHM9RnVuY3Rpb24uYmluZHx8ZnVuY3Rpb24odCl7dmFyIGU9cih0aGlzKSxuPWkuY2FsbChhcmd1bWVudHMsMSksYT1mdW5jdGlvbigpe3ZhciByPW4uY29uY2F0KGkuY2FsbChhcmd1bWVudHMpKTtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGE/cyhlLHIubGVuZ3RoLHIpOmUuYXBwbHkodCxyKX07cmV0dXJuIG8oZS5wcm90b3R5cGUpJiYoYS5wcm90b3R5cGU9ZS5wcm90b3R5cGUpLGF9fSxmdW5jdGlvbih0LGUpe2UuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDYpLGk9big0OCksYT1uKDcpLHM9bigyNCksdT1uKDM0KSxjPW4oNzEpLGw9big5NCksZj1uKDcyKSxwPW4oMikoImlzQ29uY2F0U3ByZWFkYWJsZSIpLGg9IW8oZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdFtwXT0hMSx0LmNvbmNhdCgpWzBdIT09dH0pLGQ9ZigiY29uY2F0IiksZz1mdW5jdGlvbih0KXtpZighYSh0KSlyZXR1cm4hMTt2YXIgZT10W3BdO3JldHVybiB2b2lkIDAhPT1lPyEhZTppKHQpfTtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6IWh8fCFkfSx7Y29uY2F0OmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYT1zKHRoaXMpLGY9bChhLDApLHA9MDtmb3IoZT0tMSxyPWFyZ3VtZW50cy5sZW5ndGg7ZTxyO2UrKylpZihpPS0xPT09ZT9hOmFyZ3VtZW50c1tlXSxnKGkpKXtpZihwKyhvPXUoaS5sZW5ndGgpKT45MDA3MTk5MjU0NzQwOTkxKXRocm93IFR5cGVFcnJvcigiTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkIik7Zm9yKG49MDtuPG87bisrLHArKyluIGluIGkmJmMoZixwLGlbbl0pfWVsc2V7aWYocD49OTAwNzE5OTI1NDc0MDk5MSl0aHJvdyBUeXBlRXJyb3IoIk1heGltdW0gYWxsb3dlZCBpbmRleCBleGNlZWRlZCIpO2MoZixwKyssaSl9cmV0dXJuIGYubGVuZ3RoPXAsZn19KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNyksbz1uKDQ4KSxpPW4oMikoInNwZWNpZXMiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4gbyh0KSYmKCJmdW5jdGlvbiIhPXR5cGVvZihuPXQuY29uc3RydWN0b3IpfHxuIT09QXJyYXkmJiFvKG4ucHJvdG90eXBlKT9yKG4pJiZudWxsPT09KG49bltpXSkmJihuPXZvaWQgMCk6bj12b2lkIDApLG5ldyh2b2lkIDA9PT1uP0FycmF5Om4pKDA9PT1lPzA6ZSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2KTt0LmV4cG9ydHM9ISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzJiYhcihmdW5jdGlvbigpe3JldHVybiFTdHJpbmcoU3ltYm9sKCkpfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpO3QuZXhwb3J0cz0hcihmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPW51bGwsT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyB0KSE9PXQucHJvdG90eXBlfSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNzEpfSxmdW5jdGlvbih0LGUsbil7big0KSgiaXRlcmF0b3IiKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89bigxMDApLGk9big0OSksYT1uKDc0KSxzPW4oMjkpLHU9bigxNyksYz1uKDM2KSxsPW4oMiksZj1uKDI4KSxwPW4oMzApLGg9bigxMDEpLGQ9aC5JdGVyYXRvclByb3RvdHlwZSxnPWguQlVHR1lfU0FGQVJJX0lURVJBVE9SUyx2PWwoIml0ZXJhdG9yIikseT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sbCxoLG0sYil7byhuLGUsbCk7dmFyIHgsdyxrLFM9ZnVuY3Rpb24odCl7aWYodD09PWgmJkEpcmV0dXJuIEE7aWYoIWcmJnQgaW4gVClyZXR1cm4gVFt0XTtzd2l0Y2godCl7Y2FzZSJrZXlzIjpjYXNlInZhbHVlcyI6Y2FzZSJlbnRyaWVzIjpyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcyx0KX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMpfX0sRT1lKyIgSXRlcmF0b3IiLGo9ITEsVD10LnByb3RvdHlwZSxPPVRbdl18fFRbIkBAaXRlcmF0b3IiXXx8aCYmVFtoXSxBPSFnJiZPfHxTKGgpLEM9IkFycmF5Ij09ZSYmVC5lbnRyaWVzfHxPO2lmKEMmJih4PWkoQy5jYWxsKG5ldyB0KSksZCE9PU9iamVjdC5wcm90b3R5cGUmJngubmV4dCYmKGZ8fGkoeCk9PT1kfHwoYT9hKHgsZCk6ImZ1bmN0aW9uIiE9dHlwZW9mIHhbdl0mJnUoeCx2LHkpKSxzKHgsRSwhMCwhMCksZiYmKHBbRV09eSkpKSwidmFsdWVzIj09aCYmTyYmInZhbHVlcyIhPT1PLm5hbWUmJihqPSEwLEE9ZnVuY3Rpb24oKXtyZXR1cm4gTy5jYWxsKHRoaXMpfSksZiYmIWJ8fFRbdl09PT1BfHx1KFQsdixBKSxwW2VdPUEsaClpZih3PXt2YWx1ZXM6UygidmFsdWVzIiksa2V5czptP0E6Uygia2V5cyIpLGVudHJpZXM6UygiZW50cmllcyIpfSxiKWZvcihrIGluIHcpIWcmJiFqJiZrIGluIFR8fGMoVCxrLHdba10pO2Vsc2Ugcih7dGFyZ2V0OmUscHJvdG86ITAsZm9yY2VkOmd8fGp9LHcpO3JldHVybiB3fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDEwMSkuSXRlcmF0b3JQcm90b3R5cGUsbz1uKDQ3KSxpPW4oMzEpLGE9bigyOSkscz1uKDMwKSx1PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7dmFyIGM9ZSsiIEl0ZXJhdG9yIjtyZXR1cm4gdC5wcm90b3R5cGU9byhyLHtuZXh0OmkoMSxuKX0pLGEodCxjLCExLCEwKSxzW2NdPXUsdH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHIsbyxpLGE9big0OSkscz1uKDE3KSx1PW4oMTQpLGM9bigyKSxsPW4oMjgpLGY9YygiaXRlcmF0b3IiKSxwPSExO1tdLmtleXMmJigibmV4dCJpbihpPVtdLmtleXMoKSk/KG89YShhKGkpKSkhPT1PYmplY3QucHJvdG90eXBlJiYocj1vKTpwPSEwKSxudWxsPT1yJiYocj17fSksbHx8dShyLGYpfHxzKHIsZixmdW5jdGlvbigpe3JldHVybiB0aGlzfSksdC5leHBvcnRzPXtJdGVyYXRvclByb3RvdHlwZTpyLEJVR0dZX1NBRkFSSV9JVEVSQVRPUlM6cH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyMSksbz1uKDc3KSxpPW4oMzApLGE9big1MCkscz1uKDk5KSx1PWEuc2V0LGM9YS5nZXR0ZXJGb3IoIkFycmF5IEl0ZXJhdG9yIik7dC5leHBvcnRzPXMoQXJyYXksIkFycmF5IixmdW5jdGlvbih0LGUpe3UodGhpcyx7dHlwZToiQXJyYXkgSXRlcmF0b3IiLHRhcmdldDpyKHQpLGluZGV4OjAsa2luZDplfSl9LGZ1bmN0aW9uKCl7dmFyIHQ9Yyh0aGlzKSxlPXQudGFyZ2V0LG49dC5raW5kLHI9dC5pbmRleCsrO3JldHVybiFlfHxyPj1lLmxlbmd0aD8odC50YXJnZXQ9dm9pZCAwLHt2YWx1ZTp2b2lkIDAsZG9uZTohMH0pOiJrZXlzIj09bj97dmFsdWU6cixkb25lOiExfToidmFsdWVzIj09bj97dmFsdWU6ZVtyXSxkb25lOiExfTp7dmFsdWU6W3IsZVtyXV0sZG9uZTohMX19LCJ2YWx1ZXMiKSxpLkFyZ3VtZW50cz1pLkFycmF5LG8oImtleXMiKSxvKCJ2YWx1ZXMiKSxvKCJlbnRyaWVzIil9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxODkpfSxmdW5jdGlvbih0LGUsbil7big5MyksbigxMDUpLG4oMTkwKSxuKDE5MiksbigxOTMpLG4oMTk0KSxuKDE5NSksbig5OCksbigxOTYpLG4oMTk3KSxuKDE5OCksbigxOTkpLG4oMjAwKSxuKDIwMSksbigyMDIpLG4oMjAzKSxuKDIwNCksbigyMDUpLG4oMjA2KTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLlN5bWJvbH0sZnVuY3Rpb24odCxlKXt9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDg4KSxvPW4oNjkpLmNvbmNhdCgibGVuZ3RoIiwicHJvdG90eXBlIik7ZS5mPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzfHxmdW5jdGlvbih0KXtyZXR1cm4gcih0LG8pfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDYpLG89IlsiK24oNzgpKyJdIixpPVJlZ0V4cCgiXiIrbytvKyIqIiksYT1SZWdFeHAobytvKyIqJCIpLHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPVN0cmluZyhyKGUpKTtyZXR1cm4gMSZ0JiYobj1uLnJlcGxhY2UoaSwiIikpLDImdCYmKG49bi5yZXBsYWNlKGEsIiIpKSxufX07dC5leHBvcnRzPXtzdGFydDpzKDEpLGVuZDpzKDIpLHRyaW06cygzKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDExKSxvPW4oNTIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT1vKHQpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IFR5cGVFcnJvcihTdHJpbmcodCkrIiBpcyBub3QgaXRlcmFibGUiKTtyZXR1cm4gcihlLmNhbGwodCkpfX0sZnVuY3Rpb24odCxlLG4pe24oMjI4KTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLkFycmF5LmlzQXJyYXl9LGZ1bmN0aW9uKHQsZSxuKXtuKDM1KSxuKDIzMik7dmFyIHI9bigxKTt0LmV4cG9ydHM9ci5BcnJheS5mcm9tfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLG8pe3RyeXtyZXR1cm4gbz9lKHIobilbMF0sblsxXSk6ZShuKX1jYXRjaChlKXt2YXIgaT10LnJldHVybjt0aHJvdyB2b2lkIDAhPT1pJiZyKGkuY2FsbCh0KSksZX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyKSxvPW4oMzApLGk9cigiaXRlcmF0b3IiKSxhPUFycmF5LnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXQmJihvLkFycmF5PT09dHx8YVtpXT09PXQpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMikoIml0ZXJhdG9yIiksbz0hMTt0cnl7dmFyIGk9MCxhPXtuZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6ISFpKyt9fSxyZXR1cm46ZnVuY3Rpb24oKXtvPSEwfX07YVtyXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxBcnJheS5mcm9tKGEsZnVuY3Rpb24oKXt0aHJvdyAyfSl9Y2F0Y2godCl7fXQuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKCFlJiYhbylyZXR1cm4hMTt2YXIgbj0hMTt0cnl7dmFyIGk9e307aVtyXT1mdW5jdGlvbigpe3JldHVybntuZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6bj0hMH19fX0sdChpKX1jYXRjaCh0KXt9cmV0dXJuIG59fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMzUpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LnNsaWNlO3JldHVybiB0PT09b3x8dCBpbnN0YW5jZW9mIEFycmF5JiZlPT09by5zbGljZT9yOmV9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKSxvPW4oNSksaT1uKDc5KSxhPVtdLnNsaWNlLHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4yLG89cj9hLmNhbGwoYXJndW1lbnRzLDIpOnZvaWQgMDtyZXR1cm4gdChyP2Z1bmN0aW9uKCl7KCJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6RnVuY3Rpb24oZSkpLmFwcGx5KHRoaXMsbyl9OmUsbil9fTtyKHtnbG9iYWw6ITAsYmluZDohMCxmb3JjZWQ6L01TSUUgLlwuLy50ZXN0KGkpfSx7c2V0VGltZW91dDpzKG8uc2V0VGltZW91dCksc2V0SW50ZXJ2YWw6cyhvLnNldEludGVydmFsKX0pfSxmdW5jdGlvbih0LGUsbil7bigxMDUpLG4oMzUpLG4oNTEpLG4oMjU0KSxuKDEyMyksbigyNTgpO3ZhciByPW4oMSk7dC5leHBvcnRzPXIuUHJvbWlzZX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSk7dC5leHBvcnRzPXIuUHJvbWlzZX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzYpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciBvIGluIGUpbiYmbi51bnNhZmUmJnRbb10/dFtvXT1lW29dOnIodCxvLGVbb10sbik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgVHlwZUVycm9yKCJJbmNvcnJlY3QgIisobj9uKyIgIjoiIikrImludm9jYXRpb24iKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDExKSxvPW4oMjIpLGk9bigyKSgic3BlY2llcyIpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuLGE9cih0KS5jb25zdHJ1Y3RvcjtyZXR1cm4gdm9pZCAwPT09YXx8bnVsbD09KG49cihhKVtpXSk/ZTpvKG4pfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saSxhPW4oNSkscz1uKDYpLHU9bigyNyksYz1uKDMyKSxsPW4oOTApLGY9big2NikscD1hLmxvY2F0aW9uLGg9YS5zZXRJbW1lZGlhdGUsZD1hLmNsZWFySW1tZWRpYXRlLGc9YS5wcm9jZXNzLHY9YS5NZXNzYWdlQ2hhbm5lbCx5PWEuRGlzcGF0Y2gsbT0wLGI9e30seD1mdW5jdGlvbih0KXtpZihiLmhhc093blByb3BlcnR5KHQpKXt2YXIgZT1iW3RdO2RlbGV0ZSBiW3RdLGUoKX19LHc9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7eCh0KX19LGs9ZnVuY3Rpb24odCl7eCh0LmRhdGEpfSxTPWZ1bmN0aW9uKHQpe2EucG9zdE1lc3NhZ2UodCsiIixwLnByb3RvY29sKyIvLyIrcC5ob3N0KX07aCYmZHx8KGg9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MTthcmd1bWVudHMubGVuZ3RoPm47KWUucHVzaChhcmd1bWVudHNbbisrXSk7cmV0dXJuIGJbKyttXT1mdW5jdGlvbigpeygiZnVuY3Rpb24iPT10eXBlb2YgdD90OkZ1bmN0aW9uKHQpKS5hcHBseSh2b2lkIDAsZSl9LHIobSksbX0sZD1mdW5jdGlvbih0KXtkZWxldGUgYlt0XX0sInByb2Nlc3MiPT11KGcpP3I9ZnVuY3Rpb24odCl7Zy5uZXh0VGljayh3KHQpKX06eSYmeS5ub3c/cj1mdW5jdGlvbih0KXt5Lm5vdyh3KHQpKX06dj8oaT0obz1uZXcgdikucG9ydDIsby5wb3J0MS5vbm1lc3NhZ2U9ayxyPWMoaS5wb3N0TWVzc2FnZSxpLDEpKTohYS5hZGRFdmVudExpc3RlbmVyfHwiZnVuY3Rpb24iIT10eXBlb2YgcG9zdE1lc3NhZ2V8fGEuaW1wb3J0U2NyaXB0c3x8cyhTKT9yPSJvbnJlYWR5c3RhdGVjaGFuZ2UiaW4gZigic2NyaXB0Iik/ZnVuY3Rpb24odCl7bC5hcHBlbmRDaGlsZChmKCJzY3JpcHQiKSkub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7bC5yZW1vdmVDaGlsZCh0aGlzKSx4KHQpfX06ZnVuY3Rpb24odCl7c2V0VGltZW91dCh3KHQpLDApfToocj1TLGEuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsaywhMSkpKSx0LmV4cG9ydHM9e3NldDpoLGNsZWFyOmR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMSksbz1uKDcpLGk9big1Myk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7aWYocih0KSxvKGUpJiZlLmNvbnN0cnVjdG9yPT09dClyZXR1cm4gZTt2YXIgbj1pLmYodCk7cmV0dXJuKDAsbi5yZXNvbHZlKShlKSxuLnByb21pc2V9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDIyKSxpPW4oNTMpLGE9big2MCkscz1uKDU5KTtyKHt0YXJnZXQ6IlByb21pc2UiLHN0YXQ6ITB9LHthbGxTZXR0bGVkOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1pLmYoZSkscj1uLnJlc29sdmUsdT1uLnJlamVjdCxjPWEoZnVuY3Rpb24oKXt2YXIgbj1vKGUucmVzb2x2ZSksaT1bXSxhPTAsdT0xO3ModCxmdW5jdGlvbih0KXt2YXIgbz1hKysscz0hMTtpLnB1c2godm9pZCAwKSx1Kyssbi5jYWxsKGUsdCkudGhlbihmdW5jdGlvbih0KXtzfHwocz0hMCxpW29dPXtzdGF0dXM6ImZ1bGZpbGxlZCIsdmFsdWU6dH0sLS11fHxyKGkpKX0sZnVuY3Rpb24odCl7c3x8KHM9ITAsaVtvXT17c3RhdHVzOiJyZWplY3RlZCIscmVhc29uOnR9LC0tdXx8cihpKSl9KX0pLC0tdXx8cihpKX0pO3JldHVybiBjLmVycm9yJiZ1KGMudmFsdWUpLG4ucHJvbWlzZX19KX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXsobnVsbD09ZXx8ZT50Lmxlbmd0aCkmJihlPXQubGVuZ3RoKTtmb3IodmFyIG49MCxyPW5ldyBBcnJheShlKTtuPGU7bisrKXJbbl09dFtuXTtyZXR1cm4gcn19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNzcpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNTgpLG89bigxNjIpLGk9bigxNjYpO2Z1bmN0aW9uIGEoZSxuLHMpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgUmVmbGVjdCYmbz90LmV4cG9ydHM9YT1vOnQuZXhwb3J0cz1hPWZ1bmN0aW9uKHQsZSxuKXt2YXIgbz1pKHQsZSk7aWYobyl7dmFyIGE9cihvLGUpO3JldHVybiBhLmdldD9hLmdldC5jYWxsKG4pOmEudmFsdWV9fSxhKGUsbixzfHxlKX10LmV4cG9ydHM9YX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0MCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcjsKLyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjMuNC4xCiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS8KICoKICogSW5jbHVkZXMgU2l6emxlLmpzCiAqIGh0dHBzOi8vc2l6emxlanMuY29tLwogKgogKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwczovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBEYXRlOiAyMDE5LTA1LTAxVDIxOjA0WgogKi8KLyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjMuNC4xCiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS8KICoKICogSW5jbHVkZXMgU2l6emxlLmpzCiAqIGh0dHBzOi8vc2l6emxlanMuY29tLwogKgogKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwczovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBEYXRlOiAyMDE5LTA1LTAxVDIxOjA0WgogKi8KIWZ1bmN0aW9uKGUsbil7InVzZSBzdHJpY3QiOyJvYmplY3QiPT10eXBlb2YgdC5leHBvcnRzP3QuZXhwb3J0cz1lLmRvY3VtZW50P24oZSwhMCk6ZnVuY3Rpb24odCl7aWYoIXQuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50Iik7cmV0dXJuIG4odCl9Om4oZSl9KCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp0aGlzLGZ1bmN0aW9uKG4sbyl7InVzZSBzdHJpY3QiO3ZhciBpPVtdLGE9bi5kb2N1bWVudCxzPU9iamVjdC5nZXRQcm90b3R5cGVPZix1PWkuc2xpY2UsYz1pLmNvbmNhdCxsPWkucHVzaCxmPWkuaW5kZXhPZixwPXt9LGg9cC50b1N0cmluZyxkPXAuaGFzT3duUHJvcGVydHksZz1kLnRvU3RyaW5nLHY9Zy5jYWxsKE9iamVjdCkseT17fSxtPWZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYibnVtYmVyIiE9dHlwZW9mIHQubm9kZVR5cGV9LGI9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJnQ9PT10LndpbmRvd30seD17dHlwZTohMCxzcmM6ITAsbm9uY2U6ITAsbm9Nb2R1bGU6ITB9O2Z1bmN0aW9uIHcodCxlLG4pe3ZhciByLG8saT0obj1ufHxhKS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtpZihpLnRleHQ9dCxlKWZvcihyIGluIHgpKG89ZVtyXXx8ZS5nZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKHIpKSYmaS5zZXRBdHRyaWJ1dGUocixvKTtuLmhlYWQuYXBwZW5kQ2hpbGQoaSkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChpKX1mdW5jdGlvbiBrKHQpe3JldHVybiBudWxsPT10P3QrIiI6Im9iamVjdCI9PXR5cGVvZiB0fHwiZnVuY3Rpb24iPT10eXBlb2YgdD9wW2guY2FsbCh0KV18fCJvYmplY3QiOnR5cGVvZiB0fXZhciBTPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBTLmZuLmluaXQodCxlKX0sRT0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2c7ZnVuY3Rpb24gaih0KXt2YXIgZT0hIXQmJiJsZW5ndGgiaW4gdCYmdC5sZW5ndGgsbj1rKHQpO3JldHVybiFtKHQpJiYhYih0KSYmKCJhcnJheSI9PT1ufHwwPT09ZXx8Im51bWJlciI9PXR5cGVvZiBlJiZlPjAmJmUtMSBpbiB0KX1TLmZuPVMucHJvdG90eXBlPXtqcXVlcnk6IjMuNC4xIixjb25zdHJ1Y3RvcjpTLGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdS5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dS5jYWxsKHRoaXMpOnQ8MD90aGlzW3QrdGhpcy5sZW5ndGhdOnRoaXNbdF19LHB1c2hTdGFjazpmdW5jdGlvbih0KXt2YXIgZT1TLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSx0KTtyZXR1cm4gZS5wcmV2T2JqZWN0PXRoaXMsZX0sZWFjaDpmdW5jdGlvbih0KXtyZXR1cm4gUy5lYWNoKHRoaXMsdCl9LG1hcDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUy5tYXAodGhpcyxmdW5jdGlvbihlLG4pe3JldHVybiB0LmNhbGwoZSxuLGUpfSkpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayh1LmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LGVxOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubGVuZ3RoLG49K3QrKHQ8MD9lOjApO3JldHVybiB0aGlzLnB1c2hTdGFjayhuPj0wJiZuPGU/W3RoaXNbbl1dOltdKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcigpfSxwdXNoOmwsc29ydDppLnNvcnQsc3BsaWNlOmkuc3BsaWNlfSxTLmV4dGVuZD1TLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciB0LGUsbixyLG8saSxhPWFyZ3VtZW50c1swXXx8e30scz0xLHU9YXJndW1lbnRzLmxlbmd0aCxjPSExO2ZvcigiYm9vbGVhbiI9PXR5cGVvZiBhJiYoYz1hLGE9YXJndW1lbnRzW3NdfHx7fSxzKyspLCJvYmplY3QiPT10eXBlb2YgYXx8bShhKXx8KGE9e30pLHM9PT11JiYoYT10aGlzLHMtLSk7czx1O3MrKylpZihudWxsIT0odD1hcmd1bWVudHNbc10pKWZvcihlIGluIHQpcj10W2VdLCJfX3Byb3RvX18iIT09ZSYmYSE9PXImJihjJiZyJiYoUy5pc1BsYWluT2JqZWN0KHIpfHwobz1BcnJheS5pc0FycmF5KHIpKSk/KG49YVtlXSxpPW8mJiFBcnJheS5pc0FycmF5KG4pP1tdOm98fFMuaXNQbGFpbk9iamVjdChuKT9uOnt9LG89ITEsYVtlXT1TLmV4dGVuZChjLGkscikpOnZvaWQgMCE9PXImJihhW2VdPXIpKTtyZXR1cm4gYX0sUy5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKCIzLjQuMSIrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IodCl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24odCl7dmFyIGUsbjtyZXR1cm4hKCF0fHwiW29iamVjdCBPYmplY3RdIiE9PWguY2FsbCh0KSkmJighKGU9cyh0KSl8fCJmdW5jdGlvbiI9PXR5cGVvZihuPWQuY2FsbChlLCJjb25zdHJ1Y3RvciIpJiZlLmNvbnN0cnVjdG9yKSYmZy5jYWxsKG4pPT09dil9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24odCl7dmFyIGU7Zm9yKGUgaW4gdClyZXR1cm4hMTtyZXR1cm4hMH0sZ2xvYmFsRXZhbDpmdW5jdGlvbih0LGUpe3codCx7bm9uY2U6ZSYmZS5ub25jZX0pfSxlYWNoOmZ1bmN0aW9uKHQsZSl7dmFyIG4scj0wO2lmKGoodCkpZm9yKG49dC5sZW5ndGg7cjxuJiYhMSE9PWUuY2FsbCh0W3JdLHIsdFtyXSk7cisrKTtlbHNlIGZvcihyIGluIHQpaWYoITE9PT1lLmNhbGwodFtyXSxyLHRbcl0pKWJyZWFrO3JldHVybiB0fSx0cmltOmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10PyIiOih0KyIiKS5yZXBsYWNlKEUsIiIpfSxtYWtlQXJyYXk6ZnVuY3Rpb24odCxlKXt2YXIgbj1lfHxbXTtyZXR1cm4gbnVsbCE9dCYmKGooT2JqZWN0KHQpKT9TLm1lcmdlKG4sInN0cmluZyI9PXR5cGVvZiB0P1t0XTp0KTpsLmNhbGwobix0KSksbn0saW5BcnJheTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIG51bGw9PWU/LTE6Zi5jYWxsKGUsdCxuKX0sbWVyZ2U6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49K2UubGVuZ3RoLHI9MCxvPXQubGVuZ3RoO3I8bjtyKyspdFtvKytdPWVbcl07cmV0dXJuIHQubGVuZ3RoPW8sdH0sZ3JlcDpmdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPVtdLG89MCxpPXQubGVuZ3RoLGE9IW47bzxpO28rKykhZSh0W29dLG8pIT09YSYmci5wdXNoKHRbb10pO3JldHVybiByfSxtYXA6ZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saT0wLGE9W107aWYoaih0KSlmb3Iocj10Lmxlbmd0aDtpPHI7aSsrKW51bGwhPShvPWUodFtpXSxpLG4pKSYmYS5wdXNoKG8pO2Vsc2UgZm9yKGkgaW4gdCludWxsIT0obz1lKHRbaV0saSxuKSkmJmEucHVzaChvKTtyZXR1cm4gYy5hcHBseShbXSxhKX0sZ3VpZDoxLHN1cHBvcnQ6eX0pLCJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJihTLmZuW1N5bWJvbC5pdGVyYXRvcl09aVtTeW1ib2wuaXRlcmF0b3JdKSxTLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IgU3ltYm9sIi5zcGxpdCgiICIpLGZ1bmN0aW9uKHQsZSl7cFsiW29iamVjdCAiK2UrIl0iXT1lLnRvTG93ZXJDYXNlKCl9KTt2YXIgVD0KLyohCiAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5naW5lIHYyLjMuNAogKiBodHRwczovL3NpenpsZWpzLmNvbS8KICoKICogQ29weXJpZ2h0IEpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UKICogaHR0cHM6Ly9qcy5mb3VuZGF0aW9uLwogKgogKiBEYXRlOiAyMDE5LTA0LTA4CiAqLwpmdW5jdGlvbih0KXt2YXIgZSxuLHIsbyxpLGEscyx1LGMsbCxmLHAsaCxkLGcsdix5LG0sYix4PSJzaXp6bGUiKzEqbmV3IERhdGUsdz10LmRvY3VtZW50LGs9MCxTPTAsRT11dCgpLGo9dXQoKSxUPXV0KCksTz11dCgpLEE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWUmJihmPSEwKSwwfSxDPXt9Lmhhc093blByb3BlcnR5LEw9W10sUj1MLnBvcCxQPUwucHVzaCxOPUwucHVzaCxJPUwuc2xpY2UsXz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLHI9dC5sZW5ndGg7bjxyO24rKylpZih0W25dPT09ZSlyZXR1cm4gbjtyZXR1cm4tMX0sRD0iY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLE09IltcXHgyMFxcdFxcclxcblxcZl0iLFU9Iig/OlxcXFwufFtcXHctXXxbXlwwLVxceGEwXSkrIixCPSJcXFsiK00rIiooIitVKyIpKD86IitNKyIqKFsqXiR8IX5dPz0pIitNKyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrVSsiKSl8KSIrTSsiKlxcXSIscT0iOigiK1UrIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK0IrIikqKXwuKilcXCl8KSIsRj1uZXcgUmVnRXhwKE0rIisiLCJnIiksSD1uZXcgUmVnRXhwKCJeIitNKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK00rIiskIiwiZyIpLHo9bmV3IFJlZ0V4cCgiXiIrTSsiKiwiK00rIioiKSxXPW5ldyBSZWdFeHAoIl4iK00rIiooWz4rfl18IitNKyIpIitNKyIqIiksJD1uZXcgUmVnRXhwKE0rInw+IiksWT1uZXcgUmVnRXhwKHEpLFY9bmV3IFJlZ0V4cCgiXiIrVSsiJCIpLEc9e0lEOm5ldyBSZWdFeHAoIl4jKCIrVSsiKSIpLENMQVNTOm5ldyBSZWdFeHAoIl5cXC4oIitVKyIpIiksVEFHOm5ldyBSZWdFeHAoIl4oIitVKyJ8WypdKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIrQiksUFNFVURPOm5ldyBSZWdFeHAoIl4iK3EpLENISUxEOm5ldyBSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrTSsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrTSsiKig/OihbKy1dfCkiK00rIiooXFxkKyl8KSkiK00rIipcXCl8KSIsImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK0QrIikkIiwiaSIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKCJeIitNKyIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK00rIiooKD86LVxcZCk/XFxkKikiK00rIipcXCl8KSg/PVteLV18JCkiLCJpIil9LEs9L0hUTUwkL2ksWD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLEo9L15oXGQkL2ksUT0vXltee10rXHtccypcW25hdGl2ZSBcdy8sWj0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLHR0PS9bK35dLyxldD1uZXcgUmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK00rIj98KCIrTSsiKXwuKSIsImlnIiksbnQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPSIweCIrZS02NTUzNjtyZXR1cm4gciE9cnx8bj9lOnI8MD9TdHJpbmcuZnJvbUNoYXJDb2RlKHIrNjU1MzYpOlN0cmluZy5mcm9tQ2hhckNvZGUocj4+MTB8NTUyOTYsMTAyMyZyfDU2MzIwKX0scnQ9LyhbXDAtXHgxZlx4N2ZdfF4tP1xkKXxeLSR8W15cMC1ceDFmXHg3Zi1cdUZGRkZcdy1dL2csb3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT8iXDAiPT09dD8i77+9Ijp0LnNsaWNlKDAsLTEpKyJcXCIrdC5jaGFyQ29kZUF0KHQubGVuZ3RoLTEpLnRvU3RyaW5nKDE2KSsiICI6IlxcIit0fSxpdD1mdW5jdGlvbigpe3AoKX0sYXQ9eHQoZnVuY3Rpb24odCl7cmV0dXJuITA9PT10LmRpc2FibGVkJiYiZmllbGRzZXQiPT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpfSx7ZGlyOiJwYXJlbnROb2RlIixuZXh0OiJsZWdlbmQifSk7dHJ5e04uYXBwbHkoTD1JLmNhbGwody5jaGlsZE5vZGVzKSx3LmNoaWxkTm9kZXMpLExbdy5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2godCl7Tj17YXBwbHk6TC5sZW5ndGg/ZnVuY3Rpb24odCxlKXtQLmFwcGx5KHQsSS5jYWxsKGUpKX06ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5sZW5ndGgscj0wO3RbbisrXT1lW3IrK107KTt0Lmxlbmd0aD1uLTF9fX1mdW5jdGlvbiBzdCh0LGUscixvKXt2YXIgaSxzLGMsbCxmLGQseSxtPWUmJmUub3duZXJEb2N1bWVudCxrPWU/ZS5ub2RlVHlwZTo5O2lmKHI9cnx8W10sInN0cmluZyIhPXR5cGVvZiB0fHwhdHx8MSE9PWsmJjkhPT1rJiYxMSE9PWspcmV0dXJuIHI7aWYoIW8mJigoZT9lLm93bmVyRG9jdW1lbnR8fGU6dykhPT1oJiZwKGUpLGU9ZXx8aCxnKSl7aWYoMTEhPT1rJiYoZj1aLmV4ZWModCkpKWlmKGk9ZlsxXSl7aWYoOT09PWspe2lmKCEoYz1lLmdldEVsZW1lbnRCeUlkKGkpKSlyZXR1cm4gcjtpZihjLmlkPT09aSlyZXR1cm4gci5wdXNoKGMpLHJ9ZWxzZSBpZihtJiYoYz1tLmdldEVsZW1lbnRCeUlkKGkpKSYmYihlLGMpJiZjLmlkPT09aSlyZXR1cm4gci5wdXNoKGMpLHJ9ZWxzZXtpZihmWzJdKXJldHVybiBOLmFwcGx5KHIsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KSkscjtpZigoaT1mWzNdKSYmbi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIE4uYXBwbHkocixlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaSkpLHJ9aWYobi5xc2EmJiFPW3QrIiAiXSYmKCF2fHwhdi50ZXN0KHQpKSYmKDEhPT1rfHwib2JqZWN0IiE9PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpe2lmKHk9dCxtPWUsMT09PWsmJiQudGVzdCh0KSl7Zm9yKChsPWUuZ2V0QXR0cmlidXRlKCJpZCIpKT9sPWwucmVwbGFjZShydCxvdCk6ZS5zZXRBdHRyaWJ1dGUoImlkIixsPXgpLHM9KGQ9YSh0KSkubGVuZ3RoO3MtLTspZFtzXT0iIyIrbCsiICIrYnQoZFtzXSk7eT1kLmpvaW4oIiwiKSxtPXR0LnRlc3QodCkmJnl0KGUucGFyZW50Tm9kZSl8fGV9dHJ5e3JldHVybiBOLmFwcGx5KHIsbS5xdWVyeVNlbGVjdG9yQWxsKHkpKSxyfWNhdGNoKGUpe08odCwhMCl9ZmluYWxseXtsPT09eCYmZS5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4gdSh0LnJlcGxhY2UoSCwiJDEiKSxlLHIsbyl9ZnVuY3Rpb24gdXQoKXt2YXIgdD1bXTtyZXR1cm4gZnVuY3Rpb24gZShuLG8pe3JldHVybiB0LnB1c2gobisiICIpPnIuY2FjaGVMZW5ndGgmJmRlbGV0ZSBlW3Quc2hpZnQoKV0sZVtuKyIgIl09b319ZnVuY3Rpb24gY3QodCl7cmV0dXJuIHRbeF09ITAsdH1mdW5jdGlvbiBsdCh0KXt2YXIgZT1oLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0Iik7dHJ5e3JldHVybiEhdChlKX1jYXRjaCh0KXtyZXR1cm4hMX1maW5hbGx5e2UucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpLGU9bnVsbH19ZnVuY3Rpb24gZnQodCxlKXtmb3IodmFyIG49dC5zcGxpdCgifCIpLG89bi5sZW5ndGg7by0tOylyLmF0dHJIYW5kbGVbbltvXV09ZX1mdW5jdGlvbiBwdCh0LGUpe3ZhciBuPWUmJnQscj1uJiYxPT09dC5ub2RlVHlwZSYmMT09PWUubm9kZVR5cGUmJnQuc291cmNlSW5kZXgtZS5zb3VyY2VJbmRleDtpZihyKXJldHVybiByO2lmKG4pZm9yKDtuPW4ubmV4dFNpYmxpbmc7KWlmKG49PT1lKXJldHVybi0xO3JldHVybiB0PzE6LTF9ZnVuY3Rpb24gaHQodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiJpbnB1dCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJmUudHlwZT09PXR9fWZ1bmN0aW9uIGR0KHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1ufHwiYnV0dG9uIj09PW4pJiZlLnR5cGU9PT10fX1mdW5jdGlvbiBndCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuImZvcm0iaW4gZT9lLnBhcmVudE5vZGUmJiExPT09ZS5kaXNhYmxlZD8ibGFiZWwiaW4gZT8ibGFiZWwiaW4gZS5wYXJlbnROb2RlP2UucGFyZW50Tm9kZS5kaXNhYmxlZD09PXQ6ZS5kaXNhYmxlZD09PXQ6ZS5pc0Rpc2FibGVkPT09dHx8ZS5pc0Rpc2FibGVkIT09IXQmJmF0KGUpPT09dDplLmRpc2FibGVkPT09dDoibGFiZWwiaW4gZSYmZS5kaXNhYmxlZD09PXR9fWZ1bmN0aW9uIHZ0KHQpe3JldHVybiBjdChmdW5jdGlvbihlKXtyZXR1cm4gZT0rZSxjdChmdW5jdGlvbihuLHIpe2Zvcih2YXIgbyxpPXQoW10sbi5sZW5ndGgsZSksYT1pLmxlbmd0aDthLS07KW5bbz1pW2FdXSYmKG5bb109IShyW29dPW5bb10pKX0pfSl9ZnVuY3Rpb24geXQodCl7cmV0dXJuIHQmJnZvaWQgMCE9PXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUmJnR9Zm9yKGUgaW4gbj1zdC5zdXBwb3J0PXt9LGk9c3QuaXNYTUw9ZnVuY3Rpb24odCl7dmFyIGU9dC5uYW1lc3BhY2VVUkksbj0odC5vd25lckRvY3VtZW50fHx0KS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIUsudGVzdChlfHxuJiZuLm5vZGVOYW1lfHwiSFRNTCIpfSxwPXN0LnNldERvY3VtZW50PWZ1bmN0aW9uKHQpe3ZhciBlLG8sYT10P3Qub3duZXJEb2N1bWVudHx8dDp3O3JldHVybiBhIT09aCYmOT09PWEubm9kZVR5cGUmJmEuZG9jdW1lbnRFbGVtZW50PyhkPShoPWEpLmRvY3VtZW50RWxlbWVudCxnPSFpKGgpLHchPT1oJiYobz1oLmRlZmF1bHRWaWV3KSYmby50b3AhPT1vJiYoby5hZGRFdmVudExpc3RlbmVyP28uYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixpdCwhMSk6by5hdHRhY2hFdmVudCYmby5hdHRhY2hFdmVudCgib251bmxvYWQiLGl0KSksbi5hdHRyaWJ1dGVzPWx0KGZ1bmN0aW9uKHQpe3JldHVybiB0LmNsYXNzTmFtZT0iaSIsIXQuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKX0pLG4uZ2V0RWxlbWVudHNCeVRhZ05hbWU9bHQoZnVuY3Rpb24odCl7cmV0dXJuIHQuYXBwZW5kQ2hpbGQoaC5jcmVhdGVDb21tZW50KCIiKSksIXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGh9KSxuLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9US50ZXN0KGguZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSksbi5nZXRCeUlkPWx0KGZ1bmN0aW9uKHQpe3JldHVybiBkLmFwcGVuZENoaWxkKHQpLmlkPXgsIWguZ2V0RWxlbWVudHNCeU5hbWV8fCFoLmdldEVsZW1lbnRzQnlOYW1lKHgpLmxlbmd0aH0pLG4uZ2V0QnlJZD8oci5maWx0ZXIuSUQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5yZXBsYWNlKGV0LG50KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0QXR0cmlidXRlKCJpZCIpPT09ZX19LHIuZmluZC5JRD1mdW5jdGlvbih0LGUpe2lmKHZvaWQgMCE9PWUuZ2V0RWxlbWVudEJ5SWQmJmcpe3ZhciBuPWUuZ2V0RWxlbWVudEJ5SWQodCk7cmV0dXJuIG4/W25dOltdfX0pOihyLmZpbHRlci5JRD1mdW5jdGlvbih0KXt2YXIgZT10LnJlcGxhY2UoZXQsbnQpO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj12b2lkIDAhPT10LmdldEF0dHJpYnV0ZU5vZGUmJnQuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gbiYmbi52YWx1ZT09PWV9fSxyLmZpbmQuSUQ9ZnVuY3Rpb24odCxlKXtpZih2b2lkIDAhPT1lLmdldEVsZW1lbnRCeUlkJiZnKXt2YXIgbixyLG8saT1lLmdldEVsZW1lbnRCeUlkKHQpO2lmKGkpe2lmKChuPWkuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKSkmJm4udmFsdWU9PT10KXJldHVybltpXTtmb3Iobz1lLmdldEVsZW1lbnRzQnlOYW1lKHQpLHI9MDtpPW9bcisrXTspaWYoKG49aS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSYmbi52YWx1ZT09PXQpcmV0dXJuW2ldfXJldHVybltdfX0pLHIuZmluZC5UQUc9bi5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDAhPT1lLmdldEVsZW1lbnRzQnlUYWdOYW1lP2UuZ2V0RWxlbWVudHNCeVRhZ05hbWUodCk6bi5xc2E/ZS5xdWVyeVNlbGVjdG9yQWxsKHQpOnZvaWQgMH06ZnVuY3Rpb24odCxlKXt2YXIgbixyPVtdLG89MCxpPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUodCk7aWYoIioiPT09dCl7Zm9yKDtuPWlbbysrXTspMT09PW4ubm9kZVR5cGUmJnIucHVzaChuKTtyZXR1cm4gcn1yZXR1cm4gaX0sci5maW5kLkNMQVNTPW4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24odCxlKXtpZih2b2lkIDAhPT1lLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmcpcmV0dXJuIGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSh0KX0seT1bXSx2PVtdLChuLnFzYT1RLnRlc3QoaC5xdWVyeVNlbGVjdG9yQWxsKSkmJihsdChmdW5jdGlvbih0KXtkLmFwcGVuZENoaWxkKHQpLmlubmVySFRNTD0iPGEgaWQ9JyIreCsiJz48L2E+PHNlbGVjdCBpZD0nIit4KyItXHJcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLHQucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJnYucHVzaCgiWypeJF09IitNKyIqKD86Jyd8XCJcIikiKSx0LnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fHYucHVzaCgiXFxbIitNKyIqKD86dmFsdWV8IitEKyIpIiksdC5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIreCsiLV0iKS5sZW5ndGh8fHYucHVzaCgifj0iKSx0LnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHx2LnB1c2goIjpjaGVja2VkIiksdC5xdWVyeVNlbGVjdG9yQWxsKCJhIyIreCsiKyoiKS5sZW5ndGh8fHYucHVzaCgiLiMuK1srfl0iKX0pLGx0KGZ1bmN0aW9uKHQpe3QuaW5uZXJIVE1MPSI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD4iO3ZhciBlPWguY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtlLnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLHQuYXBwZW5kQ2hpbGQoZSkuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLHQucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJnYucHVzaCgibmFtZSIrTSsiKlsqXiR8IX5dPz0iKSwyIT09dC5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aCYmdi5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLGQuYXBwZW5kQ2hpbGQodCkuZGlzYWJsZWQ9ITAsMiE9PXQucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoJiZ2LnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksdC5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4Iiksdi5wdXNoKCIsLio6Iil9KSksKG4ubWF0Y2hlc1NlbGVjdG9yPVEudGVzdChtPWQubWF0Y2hlc3x8ZC53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fGQubW96TWF0Y2hlc1NlbGVjdG9yfHxkLm9NYXRjaGVzU2VsZWN0b3J8fGQubXNNYXRjaGVzU2VsZWN0b3IpKSYmbHQoZnVuY3Rpb24odCl7bi5kaXNjb25uZWN0ZWRNYXRjaD1tLmNhbGwodCwiKiIpLG0uY2FsbCh0LCJbcyE9JyddOngiKSx5LnB1c2goIiE9IixxKX0pLHY9di5sZW5ndGgmJm5ldyBSZWdFeHAodi5qb2luKCJ8IikpLHk9eS5sZW5ndGgmJm5ldyBSZWdFeHAoeS5qb2luKCJ8IikpLGU9US50ZXN0KGQuY29tcGFyZURvY3VtZW50UG9zaXRpb24pLGI9ZXx8US50ZXN0KGQuY29udGFpbnMpP2Z1bmN0aW9uKHQsZSl7dmFyIG49OT09PXQubm9kZVR5cGU/dC5kb2N1bWVudEVsZW1lbnQ6dCxyPWUmJmUucGFyZW50Tm9kZTtyZXR1cm4gdD09PXJ8fCEoIXJ8fDEhPT1yLm5vZGVUeXBlfHwhKG4uY29udGFpbnM/bi5jb250YWlucyhyKTp0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYxNiZ0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHIpKSl9OmZ1bmN0aW9uKHQsZSl7aWYoZSlmb3IoO2U9ZS5wYXJlbnROb2RlOylpZihlPT09dClyZXR1cm4hMDtyZXR1cm4hMX0sQT1lP2Z1bmN0aW9uKHQsZSl7aWYodD09PWUpcmV0dXJuIGY9ITAsMDt2YXIgcj0hdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbi0hZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtyZXR1cm4gcnx8KDEmKHI9KHQub3duZXJEb2N1bWVudHx8dCk9PT0oZS5vd25lckRvY3VtZW50fHxlKT90LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGUpOjEpfHwhbi5zb3J0RGV0YWNoZWQmJmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCk9PT1yP3Q9PT1ofHx0Lm93bmVyRG9jdW1lbnQ9PT13JiZiKHcsdCk/LTE6ZT09PWh8fGUub3duZXJEb2N1bWVudD09PXcmJmIodyxlKT8xOmw/XyhsLHQpLV8obCxlKTowOjQmcj8tMToxKX06ZnVuY3Rpb24odCxlKXtpZih0PT09ZSlyZXR1cm4gZj0hMCwwO3ZhciBuLHI9MCxvPXQucGFyZW50Tm9kZSxpPWUucGFyZW50Tm9kZSxhPVt0XSxzPVtlXTtpZighb3x8IWkpcmV0dXJuIHQ9PT1oPy0xOmU9PT1oPzE6bz8tMTppPzE6bD9fKGwsdCktXyhsLGUpOjA7aWYobz09PWkpcmV0dXJuIHB0KHQsZSk7Zm9yKG49dDtuPW4ucGFyZW50Tm9kZTspYS51bnNoaWZ0KG4pO2ZvcihuPWU7bj1uLnBhcmVudE5vZGU7KXMudW5zaGlmdChuKTtmb3IoO2Fbcl09PT1zW3JdOylyKys7cmV0dXJuIHI/cHQoYVtyXSxzW3JdKTphW3JdPT09dz8tMTpzW3JdPT09dz8xOjB9LGgpOmh9LHN0Lm1hdGNoZXM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gc3QodCxudWxsLG51bGwsZSl9LHN0Lm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbih0LGUpe2lmKCh0Lm93bmVyRG9jdW1lbnR8fHQpIT09aCYmcCh0KSxuLm1hdGNoZXNTZWxlY3RvciYmZyYmIU9bZSsiICJdJiYoIXl8fCF5LnRlc3QoZSkpJiYoIXZ8fCF2LnRlc3QoZSkpKXRyeXt2YXIgcj1tLmNhbGwodCxlKTtpZihyfHxuLmRpc2Nvbm5lY3RlZE1hdGNofHx0LmRvY3VtZW50JiYxMSE9PXQuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIHJ9Y2F0Y2godCl7TyhlLCEwKX1yZXR1cm4gc3QoZSxoLG51bGwsW3RdKS5sZW5ndGg+MH0sc3QuY29udGFpbnM9ZnVuY3Rpb24odCxlKXtyZXR1cm4odC5vd25lckRvY3VtZW50fHx0KSE9PWgmJnAodCksYih0LGUpfSxzdC5hdHRyPWZ1bmN0aW9uKHQsZSl7KHQub3duZXJEb2N1bWVudHx8dCkhPT1oJiZwKHQpO3ZhciBvPXIuYXR0ckhhbmRsZVtlLnRvTG93ZXJDYXNlKCldLGk9byYmQy5jYWxsKHIuYXR0ckhhbmRsZSxlLnRvTG93ZXJDYXNlKCkpP28odCxlLCFnKTp2b2lkIDA7cmV0dXJuIHZvaWQgMCE9PWk/aTpuLmF0dHJpYnV0ZXN8fCFnP3QuZ2V0QXR0cmlidXRlKGUpOihpPXQuZ2V0QXR0cmlidXRlTm9kZShlKSkmJmkuc3BlY2lmaWVkP2kudmFsdWU6bnVsbH0sc3QuZXNjYXBlPWZ1bmN0aW9uKHQpe3JldHVybih0KyIiKS5yZXBsYWNlKHJ0LG90KX0sc3QuZXJyb3I9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK3QpfSxzdC51bmlxdWVTb3J0PWZ1bmN0aW9uKHQpe3ZhciBlLHI9W10sbz0wLGk9MDtpZihmPSFuLmRldGVjdER1cGxpY2F0ZXMsbD0hbi5zb3J0U3RhYmxlJiZ0LnNsaWNlKDApLHQuc29ydChBKSxmKXtmb3IoO2U9dFtpKytdOyllPT09dFtpXSYmKG89ci5wdXNoKGkpKTtmb3IoO28tLTspdC5zcGxpY2UocltvXSwxKX1yZXR1cm4gbD1udWxsLHR9LG89c3QuZ2V0VGV4dD1mdW5jdGlvbih0KXt2YXIgZSxuPSIiLHI9MCxpPXQubm9kZVR5cGU7aWYoaSl7aWYoMT09PWl8fDk9PT1pfHwxMT09PWkpe2lmKCJzdHJpbmciPT10eXBlb2YgdC50ZXh0Q29udGVudClyZXR1cm4gdC50ZXh0Q29udGVudDtmb3IodD10LmZpcnN0Q2hpbGQ7dDt0PXQubmV4dFNpYmxpbmcpbis9byh0KX1lbHNlIGlmKDM9PT1pfHw0PT09aSlyZXR1cm4gdC5ub2RlVmFsdWV9ZWxzZSBmb3IoO2U9dFtyKytdOyluKz1vKGUpO3JldHVybiBufSwocj1zdC5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpjdCxtYXRjaDpHLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbih0KXtyZXR1cm4gdFsxXT10WzFdLnJlcGxhY2UoZXQsbnQpLHRbM109KHRbM118fHRbNF18fHRbNV18fCIiKS5yZXBsYWNlKGV0LG50KSwifj0iPT09dFsyXSYmKHRbM109IiAiK3RbM10rIiAiKSx0LnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKHQpe3JldHVybiB0WzFdPXRbMV0udG9Mb3dlckNhc2UoKSwibnRoIj09PXRbMV0uc2xpY2UoMCwzKT8odFszXXx8c3QuZXJyb3IodFswXSksdFs0XT0rKHRbNF0/dFs1XSsodFs2XXx8MSk6MiooImV2ZW4iPT09dFszXXx8Im9kZCI9PT10WzNdKSksdFs1XT0rKHRbN10rdFs4XXx8Im9kZCI9PT10WzNdKSk6dFszXSYmc3QuZXJyb3IodFswXSksdH0sUFNFVURPOmZ1bmN0aW9uKHQpe3ZhciBlLG49IXRbNl0mJnRbMl07cmV0dXJuIEcuQ0hJTEQudGVzdCh0WzBdKT9udWxsOih0WzNdP3RbMl09dFs0XXx8dFs1XXx8IiI6biYmWS50ZXN0KG4pJiYoZT1hKG4sITApKSYmKGU9bi5pbmRleE9mKCIpIixuLmxlbmd0aC1lKS1uLmxlbmd0aCkmJih0WzBdPXRbMF0uc2xpY2UoMCxlKSx0WzJdPW4uc2xpY2UoMCxlKSksdC5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKHQpe3ZhciBlPXQucmVwbGFjZShldCxudCkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT10P2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKHQpe3JldHVybiB0Lm5vZGVOYW1lJiZ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1lfX0sQ0xBU1M6ZnVuY3Rpb24odCl7dmFyIGU9RVt0KyIgIl07cmV0dXJuIGV8fChlPW5ldyBSZWdFeHAoIihefCIrTSsiKSIrdCsiKCIrTSsifCQpIikpJiZFKHQsZnVuY3Rpb24odCl7cmV0dXJuIGUudGVzdCgic3RyaW5nIj09dHlwZW9mIHQuY2xhc3NOYW1lJiZ0LmNsYXNzTmFtZXx8dm9pZCAwIT09dC5nZXRBdHRyaWJ1dGUmJnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbih0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKHIpe3ZhciBvPXN0LmF0dHIocix0KTtyZXR1cm4gbnVsbD09bz8iIT0iPT09ZTohZXx8KG8rPSIiLCI9Ij09PWU/bz09PW46IiE9Ij09PWU/byE9PW46Il49Ij09PWU/biYmMD09PW8uaW5kZXhPZihuKToiKj0iPT09ZT9uJiZvLmluZGV4T2Yobik+LTE6IiQ9Ij09PWU/biYmby5zbGljZSgtbi5sZW5ndGgpPT09bjoifj0iPT09ZT8oIiAiK28ucmVwbGFjZShGLCIgIikrIiAiKS5pbmRleE9mKG4pPi0xOiJ8PSI9PT1lJiYobz09PW58fG8uc2xpY2UoMCxuLmxlbmd0aCsxKT09PW4rIi0iKSl9fSxDSElMRDpmdW5jdGlvbih0LGUsbixyLG8pe3ZhciBpPSJudGgiIT09dC5zbGljZSgwLDMpLGE9Imxhc3QiIT09dC5zbGljZSgtNCkscz0ib2YtdHlwZSI9PT1lO3JldHVybiAxPT09ciYmMD09PW8/ZnVuY3Rpb24odCl7cmV0dXJuISF0LnBhcmVudE5vZGV9OmZ1bmN0aW9uKGUsbix1KXt2YXIgYyxsLGYscCxoLGQsZz1pIT09YT8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLHY9ZS5wYXJlbnROb2RlLHk9cyYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLG09IXUmJiFzLGI9ITE7aWYodil7aWYoaSl7Zm9yKDtnOyl7Zm9yKHA9ZTtwPXBbZ107KWlmKHM/cC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09eToxPT09cC5ub2RlVHlwZSlyZXR1cm4hMTtkPWc9Im9ubHkiPT09dCYmIWQmJiJuZXh0U2libGluZyJ9cmV0dXJuITB9aWYoZD1bYT92LmZpcnN0Q2hpbGQ6di5sYXN0Q2hpbGRdLGEmJm0pe2ZvcihiPShoPShjPShsPShmPShwPXYpW3hdfHwocFt4XT17fSkpW3AudW5pcXVlSURdfHwoZltwLnVuaXF1ZUlEXT17fSkpW3RdfHxbXSlbMF09PT1rJiZjWzFdKSYmY1syXSxwPWgmJnYuY2hpbGROb2Rlc1toXTtwPSsraCYmcCYmcFtnXXx8KGI9aD0wKXx8ZC5wb3AoKTspaWYoMT09PXAubm9kZVR5cGUmJisrYiYmcD09PWUpe2xbdF09W2ssaCxiXTticmVha319ZWxzZSBpZihtJiYoYj1oPShjPShsPShmPShwPWUpW3hdfHwocFt4XT17fSkpW3AudW5pcXVlSURdfHwoZltwLnVuaXF1ZUlEXT17fSkpW3RdfHxbXSlbMF09PT1rJiZjWzFdKSwhMT09PWIpZm9yKDsocD0rK2gmJnAmJnBbZ118fChiPWg9MCl8fGQucG9wKCkpJiYoKHM/cC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09eToxIT09cC5ub2RlVHlwZSl8fCErK2J8fChtJiYoKGw9KGY9cFt4XXx8KHBbeF09e30pKVtwLnVuaXF1ZUlEXXx8KGZbcC51bmlxdWVJRF09e30pKVt0XT1bayxiXSkscCE9PWUpKTspO3JldHVybihiLT1vKT09PXJ8fGIlcj09MCYmYi9yPj0wfX19LFBTRVVETzpmdW5jdGlvbih0LGUpe3ZhciBuLG89ci5wc2V1ZG9zW3RdfHxyLnNldEZpbHRlcnNbdC50b0xvd2VyQ2FzZSgpXXx8c3QuZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIit0KTtyZXR1cm4gb1t4XT9vKGUpOm8ubGVuZ3RoPjE/KG49W3QsdCwiIixlXSxyLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkodC50b0xvd2VyQ2FzZSgpKT9jdChmdW5jdGlvbih0LG4pe2Zvcih2YXIgcixpPW8odCxlKSxhPWkubGVuZ3RoO2EtLTspdFtyPV8odCxpW2FdKV09IShuW3JdPWlbYV0pfSk6ZnVuY3Rpb24odCl7cmV0dXJuIG8odCwwLG4pfSk6b319LHBzZXVkb3M6e25vdDpjdChmdW5jdGlvbih0KXt2YXIgZT1bXSxuPVtdLHI9cyh0LnJlcGxhY2UoSCwiJDEiKSk7cmV0dXJuIHJbeF0/Y3QoZnVuY3Rpb24odCxlLG4sbyl7Zm9yKHZhciBpLGE9cih0LG51bGwsbyxbXSkscz10Lmxlbmd0aDtzLS07KShpPWFbc10pJiYodFtzXT0hKGVbc109aSkpfSk6ZnVuY3Rpb24odCxvLGkpe3JldHVybiBlWzBdPXQscihlLG51bGwsaSxuKSxlWzBdPW51bGwsIW4ucG9wKCl9fSksaGFzOmN0KGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gc3QodCxlKS5sZW5ndGg+MH19KSxjb250YWluczpjdChmdW5jdGlvbih0KXtyZXR1cm4gdD10LnJlcGxhY2UoZXQsbnQpLGZ1bmN0aW9uKGUpe3JldHVybihlLnRleHRDb250ZW50fHxvKGUpKS5pbmRleE9mKHQpPi0xfX0pLGxhbmc6Y3QoZnVuY3Rpb24odCl7cmV0dXJuIFYudGVzdCh0fHwiIil8fHN0LmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK3QpLHQ9dC5yZXBsYWNlKGV0LG50KS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKGUpe3ZhciBuO2Rve2lmKG49Zz9lLmxhbmc6ZS5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIil8fGUuZ2V0QXR0cmlidXRlKCJsYW5nIikpcmV0dXJuKG49bi50b0xvd2VyQ2FzZSgpKT09PXR8fDA9PT1uLmluZGV4T2YodCsiLSIpfXdoaWxlKChlPWUucGFyZW50Tm9kZSkmJjE9PT1lLm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oZSl7dmFyIG49dC5sb2NhdGlvbiYmdC5sb2NhdGlvbi5oYXNoO3JldHVybiBuJiZuLnNsaWNlKDEpPT09ZS5pZH0scm9vdDpmdW5jdGlvbih0KXtyZXR1cm4gdD09PWR9LGZvY3VzOmZ1bmN0aW9uKHQpe3JldHVybiB0PT09aC5hY3RpdmVFbGVtZW50JiYoIWguaGFzRm9jdXN8fGguaGFzRm9jdXMoKSkmJiEhKHQudHlwZXx8dC5ocmVmfHx+dC50YWJJbmRleCl9LGVuYWJsZWQ6Z3QoITEpLGRpc2FibGVkOmd0KCEwKSxjaGVja2VkOmZ1bmN0aW9uKHQpe3ZhciBlPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09ZSYmISF0LmNoZWNrZWR8fCJvcHRpb24iPT09ZSYmISF0LnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbih0KXtyZXR1cm4gdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCwhMD09PXQuc2VsZWN0ZWR9LGVtcHR5OmZ1bmN0aW9uKHQpe2Zvcih0PXQuZmlyc3RDaGlsZDt0O3Q9dC5uZXh0U2libGluZylpZih0Lm5vZGVUeXBlPDYpcmV0dXJuITE7cmV0dXJuITB9LHBhcmVudDpmdW5jdGlvbih0KXtyZXR1cm4hci5wc2V1ZG9zLmVtcHR5KHQpfSxoZWFkZXI6ZnVuY3Rpb24odCl7cmV0dXJuIEoudGVzdCh0Lm5vZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIFgudGVzdCh0Lm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKHQpe3ZhciBlPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09ZSYmImJ1dHRvbiI9PT10LnR5cGV8fCJidXR0b24iPT09ZX0sdGV4dDpmdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4iaW5wdXQiPT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4dCI9PT10LnR5cGUmJihudWxsPT0oZT10LmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8InRleHQiPT09ZS50b0xvd2VyQ2FzZSgpKX0sZmlyc3Q6dnQoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0OnZ0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuW2UtMV19KSxlcTp2dChmdW5jdGlvbih0LGUsbil7cmV0dXJuW248MD9uK2U6bl19KSxldmVuOnZ0KGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjxlO24rPTIpdC5wdXNoKG4pO3JldHVybiB0fSksb2RkOnZ0KGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTE7bjxlO24rPTIpdC5wdXNoKG4pO3JldHVybiB0fSksbHQ6dnQoZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1uPDA/bitlOm4+ZT9lOm47LS1yPj0wOyl0LnB1c2gocik7cmV0dXJuIHR9KSxndDp2dChmdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPW48MD9uK2U6bjsrK3I8ZTspdC5wdXNoKHIpO3JldHVybiB0fSl9fSkucHNldWRvcy5udGg9ci5wc2V1ZG9zLmVxLHtyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSlyLnBzZXVkb3NbZV09aHQoZSk7Zm9yKGUgaW57c3VibWl0OiEwLHJlc2V0OiEwfSlyLnBzZXVkb3NbZV09ZHQoZSk7ZnVuY3Rpb24gbXQoKXt9ZnVuY3Rpb24gYnQodCl7Zm9yKHZhciBlPTAsbj10Lmxlbmd0aCxyPSIiO2U8bjtlKyspcis9dFtlXS52YWx1ZTtyZXR1cm4gcn1mdW5jdGlvbiB4dCh0LGUsbil7dmFyIHI9ZS5kaXIsbz1lLm5leHQsaT1vfHxyLGE9biYmInBhcmVudE5vZGUiPT09aSxzPVMrKztyZXR1cm4gZS5maXJzdD9mdW5jdGlvbihlLG4sbyl7Zm9yKDtlPWVbcl07KWlmKDE9PT1lLm5vZGVUeXBlfHxhKXJldHVybiB0KGUsbixvKTtyZXR1cm4hMX06ZnVuY3Rpb24oZSxuLHUpe3ZhciBjLGwsZixwPVtrLHNdO2lmKHUpe2Zvcig7ZT1lW3JdOylpZigoMT09PWUubm9kZVR5cGV8fGEpJiZ0KGUsbix1KSlyZXR1cm4hMH1lbHNlIGZvcig7ZT1lW3JdOylpZigxPT09ZS5ub2RlVHlwZXx8YSlpZihsPShmPWVbeF18fChlW3hdPXt9KSlbZS51bmlxdWVJRF18fChmW2UudW5pcXVlSURdPXt9KSxvJiZvPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKWU9ZVtyXXx8ZTtlbHNle2lmKChjPWxbaV0pJiZjWzBdPT09ayYmY1sxXT09PXMpcmV0dXJuIHBbMl09Y1syXTtpZihsW2ldPXAscFsyXT10KGUsbix1KSlyZXR1cm4hMH1yZXR1cm4hMX19ZnVuY3Rpb24gd3QodCl7cmV0dXJuIHQubGVuZ3RoPjE/ZnVuY3Rpb24oZSxuLHIpe2Zvcih2YXIgbz10Lmxlbmd0aDtvLS07KWlmKCF0W29dKGUsbixyKSlyZXR1cm4hMTtyZXR1cm4hMH06dFswXX1mdW5jdGlvbiBrdCh0LGUsbixyLG8pe2Zvcih2YXIgaSxhPVtdLHM9MCx1PXQubGVuZ3RoLGM9bnVsbCE9ZTtzPHU7cysrKShpPXRbc10pJiYobiYmIW4oaSxyLG8pfHwoYS5wdXNoKGkpLGMmJmUucHVzaChzKSkpO3JldHVybiBhfWZ1bmN0aW9uIFN0KHQsZSxuLHIsbyxpKXtyZXR1cm4gciYmIXJbeF0mJihyPVN0KHIpKSxvJiYhb1t4XSYmKG89U3QobyxpKSksY3QoZnVuY3Rpb24oaSxhLHMsdSl7dmFyIGMsbCxmLHA9W10saD1bXSxkPWEubGVuZ3RoLGc9aXx8ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj0wLG89ZS5sZW5ndGg7cjxvO3IrKylzdCh0LGVbcl0sbik7cmV0dXJuIG59KGV8fCIqIixzLm5vZGVUeXBlP1tzXTpzLFtdKSx2PSF0fHwhaSYmZT9nOmt0KGcscCx0LHMsdSkseT1uP298fChpP3Q6ZHx8cik/W106YTp2O2lmKG4mJm4odix5LHMsdSkscilmb3IoYz1rdCh5LGgpLHIoYyxbXSxzLHUpLGw9Yy5sZW5ndGg7bC0tOykoZj1jW2xdKSYmKHlbaFtsXV09ISh2W2hbbF1dPWYpKTtpZihpKXtpZihvfHx0KXtpZihvKXtmb3IoYz1bXSxsPXkubGVuZ3RoO2wtLTspKGY9eVtsXSkmJmMucHVzaCh2W2xdPWYpO28obnVsbCx5PVtdLGMsdSl9Zm9yKGw9eS5sZW5ndGg7bC0tOykoZj15W2xdKSYmKGM9bz9fKGksZik6cFtsXSk+LTEmJihpW2NdPSEoYVtjXT1mKSl9fWVsc2UgeT1rdCh5PT09YT95LnNwbGljZShkLHkubGVuZ3RoKTp5KSxvP28obnVsbCxhLHksdSk6Ti5hcHBseShhLHkpfSl9ZnVuY3Rpb24gRXQodCl7Zm9yKHZhciBlLG4sbyxpPXQubGVuZ3RoLGE9ci5yZWxhdGl2ZVt0WzBdLnR5cGVdLHM9YXx8ci5yZWxhdGl2ZVsiICJdLHU9YT8xOjAsbD14dChmdW5jdGlvbih0KXtyZXR1cm4gdD09PWV9LHMsITApLGY9eHQoZnVuY3Rpb24odCl7cmV0dXJuIF8oZSx0KT4tMX0scywhMCkscD1bZnVuY3Rpb24odCxuLHIpe3ZhciBvPSFhJiYocnx8biE9PWMpfHwoKGU9bikubm9kZVR5cGU/bCh0LG4scik6Zih0LG4scikpO3JldHVybiBlPW51bGwsb31dO3U8aTt1KyspaWYobj1yLnJlbGF0aXZlW3RbdV0udHlwZV0pcD1beHQod3QocCksbildO2Vsc2V7aWYoKG49ci5maWx0ZXJbdFt1XS50eXBlXS5hcHBseShudWxsLHRbdV0ubWF0Y2hlcykpW3hdKXtmb3Iobz0rK3U7bzxpJiYhci5yZWxhdGl2ZVt0W29dLnR5cGVdO28rKyk7cmV0dXJuIFN0KHU+MSYmd3QocCksdT4xJiZidCh0LnNsaWNlKDAsdS0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PXRbdS0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKEgsIiQxIiksbix1PG8mJkV0KHQuc2xpY2UodSxvKSksbzxpJiZFdCh0PXQuc2xpY2UobykpLG88aSYmYnQodCkpfXAucHVzaChuKX1yZXR1cm4gd3QocCl9cmV0dXJuIG10LnByb3RvdHlwZT1yLmZpbHRlcnM9ci5wc2V1ZG9zLHIuc2V0RmlsdGVycz1uZXcgbXQsYT1zdC50b2tlbml6ZT1mdW5jdGlvbih0LGUpe3ZhciBuLG8saSxhLHMsdSxjLGw9alt0KyIgIl07aWYobClyZXR1cm4gZT8wOmwuc2xpY2UoMCk7Zm9yKHM9dCx1PVtdLGM9ci5wcmVGaWx0ZXI7czspe2ZvcihhIGluIG4mJiEobz16LmV4ZWMocykpfHwobyYmKHM9cy5zbGljZShvWzBdLmxlbmd0aCl8fHMpLHUucHVzaChpPVtdKSksbj0hMSwobz1XLmV4ZWMocykpJiYobj1vLnNoaWZ0KCksaS5wdXNoKHt2YWx1ZTpuLHR5cGU6b1swXS5yZXBsYWNlKEgsIiAiKX0pLHM9cy5zbGljZShuLmxlbmd0aCkpLHIuZmlsdGVyKSEobz1HW2FdLmV4ZWMocykpfHxjW2FdJiYhKG89Y1thXShvKSl8fChuPW8uc2hpZnQoKSxpLnB1c2goe3ZhbHVlOm4sdHlwZTphLG1hdGNoZXM6b30pLHM9cy5zbGljZShuLmxlbmd0aCkpO2lmKCFuKWJyZWFrfXJldHVybiBlP3MubGVuZ3RoOnM/c3QuZXJyb3IodCk6aih0LHUpLnNsaWNlKDApfSxzPXN0LmNvbXBpbGU9ZnVuY3Rpb24odCxlKXt2YXIgbixvPVtdLGk9W10scz1UW3QrIiAiXTtpZighcyl7Zm9yKGV8fChlPWEodCkpLG49ZS5sZW5ndGg7bi0tOykocz1FdChlW25dKSlbeF0/by5wdXNoKHMpOmkucHVzaChzKTsocz1UKHQsZnVuY3Rpb24odCxlKXt2YXIgbj1lLmxlbmd0aD4wLG89dC5sZW5ndGg+MCxpPWZ1bmN0aW9uKGksYSxzLHUsbCl7dmFyIGYsZCx2LHk9MCxtPSIwIixiPWkmJltdLHg9W10sdz1jLFM9aXx8byYmci5maW5kLlRBRygiKiIsbCksRT1rKz1udWxsPT13PzE6TWF0aC5yYW5kb20oKXx8LjEsaj1TLmxlbmd0aDtmb3IobCYmKGM9YT09PWh8fGF8fGwpO20hPT1qJiZudWxsIT0oZj1TW21dKTttKyspe2lmKG8mJmYpe2ZvcihkPTAsYXx8Zi5vd25lckRvY3VtZW50PT09aHx8KHAoZikscz0hZyk7dj10W2QrK107KWlmKHYoZixhfHxoLHMpKXt1LnB1c2goZik7YnJlYWt9bCYmKGs9RSl9biYmKChmPSF2JiZmKSYmeS0tLGkmJmIucHVzaChmKSl9aWYoeSs9bSxuJiZtIT09eSl7Zm9yKGQ9MDt2PWVbZCsrXTspdihiLHgsYSxzKTtpZihpKXtpZih5PjApZm9yKDttLS07KWJbbV18fHhbbV18fCh4W21dPVIuY2FsbCh1KSk7eD1rdCh4KX1OLmFwcGx5KHUseCksbCYmIWkmJngubGVuZ3RoPjAmJnkrZS5sZW5ndGg+MSYmc3QudW5pcXVlU29ydCh1KX1yZXR1cm4gbCYmKGs9RSxjPXcpLGJ9O3JldHVybiBuP2N0KGkpOml9KGksbykpKS5zZWxlY3Rvcj10fXJldHVybiBzfSx1PXN0LnNlbGVjdD1mdW5jdGlvbih0LGUsbixvKXt2YXIgaSx1LGMsbCxmLHA9ImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQsaD0hbyYmYSh0PXAuc2VsZWN0b3J8fHQpO2lmKG49bnx8W10sMT09PWgubGVuZ3RoKXtpZigodT1oWzBdPWhbMF0uc2xpY2UoMCkpLmxlbmd0aD4yJiYiSUQiPT09KGM9dVswXSkudHlwZSYmOT09PWUubm9kZVR5cGUmJmcmJnIucmVsYXRpdmVbdVsxXS50eXBlXSl7aWYoIShlPShyLmZpbmQuSUQoYy5tYXRjaGVzWzBdLnJlcGxhY2UoZXQsbnQpLGUpfHxbXSlbMF0pKXJldHVybiBuO3AmJihlPWUucGFyZW50Tm9kZSksdD10LnNsaWNlKHUuc2hpZnQoKS52YWx1ZS5sZW5ndGgpfWZvcihpPUcubmVlZHNDb250ZXh0LnRlc3QodCk/MDp1Lmxlbmd0aDtpLS0mJihjPXVbaV0sIXIucmVsYXRpdmVbbD1jLnR5cGVdKTspaWYoKGY9ci5maW5kW2xdKSYmKG89ZihjLm1hdGNoZXNbMF0ucmVwbGFjZShldCxudCksdHQudGVzdCh1WzBdLnR5cGUpJiZ5dChlLnBhcmVudE5vZGUpfHxlKSkpe2lmKHUuc3BsaWNlKGksMSksISh0PW8ubGVuZ3RoJiZidCh1KSkpcmV0dXJuIE4uYXBwbHkobixvKSxuO2JyZWFrfX1yZXR1cm4ocHx8cyh0LGgpKShvLGUsIWcsbiwhZXx8dHQudGVzdCh0KSYmeXQoZS5wYXJlbnROb2RlKXx8ZSksbn0sbi5zb3J0U3RhYmxlPXguc3BsaXQoIiIpLnNvcnQoQSkuam9pbigiIik9PT14LG4uZGV0ZWN0RHVwbGljYXRlcz0hIWYscCgpLG4uc29ydERldGFjaGVkPWx0KGZ1bmN0aW9uKHQpe3JldHVybiAxJnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oaC5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpKX0pLGx0KGZ1bmN0aW9uKHQpe3JldHVybiB0LmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09dC5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGZ0KCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbih0LGUsbil7aWYoIW4pcmV0dXJuIHQuZ2V0QXR0cmlidXRlKGUsInR5cGUiPT09ZS50b0xvd2VyQ2FzZSgpPzE6Mil9KSxuLmF0dHJpYnV0ZXMmJmx0KGZ1bmN0aW9uKHQpe3JldHVybiB0LmlubmVySFRNTD0iPGlucHV0Lz4iLHQuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT10LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGZ0KCJ2YWx1ZSIsZnVuY3Rpb24odCxlLG4pe2lmKCFuJiYiaW5wdXQiPT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXJldHVybiB0LmRlZmF1bHRWYWx1ZX0pLGx0KGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10LmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxmdChELGZ1bmN0aW9uKHQsZSxuKXt2YXIgcjtpZighbilyZXR1cm4hMD09PXRbZV0/ZS50b0xvd2VyQ2FzZSgpOihyPXQuZ2V0QXR0cmlidXRlTm9kZShlKSkmJnIuc3BlY2lmaWVkP3IudmFsdWU6bnVsbH0pLHN0fShuKTtTLmZpbmQ9VCxTLmV4cHI9VC5zZWxlY3RvcnMsUy5leHByWyI6Il09Uy5leHByLnBzZXVkb3MsUy51bmlxdWVTb3J0PVMudW5pcXVlPVQudW5pcXVlU29ydCxTLnRleHQ9VC5nZXRUZXh0LFMuaXNYTUxEb2M9VC5pc1hNTCxTLmNvbnRhaW5zPVQuY29udGFpbnMsUy5lc2NhcGVTZWxlY3Rvcj1ULmVzY2FwZTt2YXIgTz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPVtdLG89dm9pZCAwIT09bjsodD10W2VdKSYmOSE9PXQubm9kZVR5cGU7KWlmKDE9PT10Lm5vZGVUeXBlKXtpZihvJiZTKHQpLmlzKG4pKWJyZWFrO3IucHVzaCh0KX1yZXR1cm4gcn0sQT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1bXTt0O3Q9dC5uZXh0U2libGluZykxPT09dC5ub2RlVHlwZSYmdCE9PWUmJm4ucHVzaCh0KTtyZXR1cm4gbn0sQz1TLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O2Z1bmN0aW9uIEwodCxlKXtyZXR1cm4gdC5ub2RlTmFtZSYmdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ZS50b0xvd2VyQ2FzZSgpfXZhciBSPS9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pO2Z1bmN0aW9uIFAodCxlLG4pe3JldHVybiBtKGUpP1MuZ3JlcCh0LGZ1bmN0aW9uKHQscil7cmV0dXJuISFlLmNhbGwodCxyLHQpIT09bn0pOmUubm9kZVR5cGU/Uy5ncmVwKHQsZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1lIT09bn0pOiJzdHJpbmciIT10eXBlb2YgZT9TLmdyZXAodCxmdW5jdGlvbih0KXtyZXR1cm4gZi5jYWxsKGUsdCk+LTEhPT1ufSk6Uy5maWx0ZXIoZSx0LG4pfVMuZmlsdGVyPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1lWzBdO3JldHVybiBuJiYodD0iOm5vdCgiK3QrIikiKSwxPT09ZS5sZW5ndGgmJjE9PT1yLm5vZGVUeXBlP1MuZmluZC5tYXRjaGVzU2VsZWN0b3Iocix0KT9bcl06W106Uy5maW5kLm1hdGNoZXModCxTLmdyZXAoZSxmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQubm9kZVR5cGV9KSl9LFMuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKHQpe3ZhciBlLG4scj10aGlzLmxlbmd0aCxvPXRoaXM7aWYoInN0cmluZyIhPXR5cGVvZiB0KXJldHVybiB0aGlzLnB1c2hTdGFjayhTKHQpLmZpbHRlcihmdW5jdGlvbigpe2ZvcihlPTA7ZTxyO2UrKylpZihTLmNvbnRhaW5zKG9bZV0sdGhpcykpcmV0dXJuITB9KSk7Zm9yKG49dGhpcy5wdXNoU3RhY2soW10pLGU9MDtlPHI7ZSsrKVMuZmluZCh0LG9bZV0sbik7cmV0dXJuIHI+MT9TLnVuaXF1ZVNvcnQobik6bn0sZmlsdGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayhQKHRoaXMsdHx8W10sITEpKX0sbm90OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayhQKHRoaXMsdHx8W10sITApKX0saXM6ZnVuY3Rpb24odCl7cmV0dXJuISFQKHRoaXMsInN0cmluZyI9PXR5cGVvZiB0JiZDLnRlc3QodCk/Uyh0KTp0fHxbXSwhMSkubGVuZ3RofX0pO3ZhciBOLEk9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLzsoUy5mbi5pbml0PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvO2lmKCF0KXJldHVybiB0aGlzO2lmKG49bnx8Tiwic3RyaW5nIj09dHlwZW9mIHQpe2lmKCEocj0iPCI9PT10WzBdJiYiPiI9PT10W3QubGVuZ3RoLTFdJiZ0Lmxlbmd0aD49Mz9bbnVsbCx0LG51bGxdOkkuZXhlYyh0KSl8fCFyWzFdJiZlKXJldHVybiFlfHxlLmpxdWVyeT8oZXx8bikuZmluZCh0KTp0aGlzLmNvbnN0cnVjdG9yKGUpLmZpbmQodCk7aWYoclsxXSl7aWYoZT1lIGluc3RhbmNlb2YgUz9lWzBdOmUsUy5tZXJnZSh0aGlzLFMucGFyc2VIVE1MKHJbMV0sZSYmZS5ub2RlVHlwZT9lLm93bmVyRG9jdW1lbnR8fGU6YSwhMCkpLFIudGVzdChyWzFdKSYmUy5pc1BsYWluT2JqZWN0KGUpKWZvcihyIGluIGUpbSh0aGlzW3JdKT90aGlzW3JdKGVbcl0pOnRoaXMuYXR0cihyLGVbcl0pO3JldHVybiB0aGlzfXJldHVybihvPWEuZ2V0RWxlbWVudEJ5SWQoclsyXSkpJiYodGhpc1swXT1vLHRoaXMubGVuZ3RoPTEpLHRoaXN9cmV0dXJuIHQubm9kZVR5cGU/KHRoaXNbMF09dCx0aGlzLmxlbmd0aD0xLHRoaXMpOm0odCk/dm9pZCAwIT09bi5yZWFkeT9uLnJlYWR5KHQpOnQoUyk6Uy5tYWtlQXJyYXkodCx0aGlzKX0pLnByb3RvdHlwZT1TLmZuLE49UyhhKTt2YXIgXz0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxEPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2Z1bmN0aW9uIE0odCxlKXtmb3IoOyh0PXRbZV0pJiYxIT09dC5ub2RlVHlwZTspO3JldHVybiB0fVMuZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24odCl7dmFyIGU9Uyh0LHRoaXMpLG49ZS5sZW5ndGg7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDxuO3QrKylpZihTLmNvbnRhaW5zKHRoaXMsZVt0XSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbih0LGUpe3ZhciBuLHI9MCxvPXRoaXMubGVuZ3RoLGk9W10sYT0ic3RyaW5nIiE9dHlwZW9mIHQmJlModCk7aWYoIUMudGVzdCh0KSlmb3IoO3I8bztyKyspZm9yKG49dGhpc1tyXTtuJiZuIT09ZTtuPW4ucGFyZW50Tm9kZSlpZihuLm5vZGVUeXBlPDExJiYoYT9hLmluZGV4KG4pPi0xOjE9PT1uLm5vZGVUeXBlJiZTLmZpbmQubWF0Y2hlc1NlbGVjdG9yKG4sdCkpKXtpLnB1c2gobik7YnJlYWt9cmV0dXJuIHRoaXMucHVzaFN0YWNrKGkubGVuZ3RoPjE/Uy51bmlxdWVTb3J0KGkpOmkpfSxpbmRleDpmdW5jdGlvbih0KXtyZXR1cm4gdD8ic3RyaW5nIj09dHlwZW9mIHQ/Zi5jYWxsKFModCksdGhpc1swXSk6Zi5jYWxsKHRoaXMsdC5qcXVlcnk/dFswXTp0KTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhTLnVuaXF1ZVNvcnQoUy5tZXJnZSh0aGlzLmdldCgpLFModCxlKSkpKX0sYWRkQmFjazpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hZGQobnVsbD09dD90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcih0KSl9fSksUy5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24odCl7dmFyIGU9dC5wYXJlbnROb2RlO3JldHVybiBlJiYxMSE9PWUubm9kZVR5cGU/ZTpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKHQpe3JldHVybiBPKHQsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTyh0LCJwYXJlbnROb2RlIixuKX0sbmV4dDpmdW5jdGlvbih0KXtyZXR1cm4gTSh0LCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKHQpe3JldHVybiBNKHQsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKHQpe3JldHVybiBPKHQsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24odCl7cmV0dXJuIE8odCwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbih0LGUsbil7cmV0dXJuIE8odCwibmV4dFNpYmxpbmciLG4pfSxwcmV2VW50aWw6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBPKHQsInByZXZpb3VzU2libGluZyIsbil9LHNpYmxpbmdzOmZ1bmN0aW9uKHQpe3JldHVybiBBKCh0LnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLHQpfSxjaGlsZHJlbjpmdW5jdGlvbih0KXtyZXR1cm4gQSh0LmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwIT09dC5jb250ZW50RG9jdW1lbnQ/dC5jb250ZW50RG9jdW1lbnQ6KEwodCwidGVtcGxhdGUiKSYmKHQ9dC5jb250ZW50fHx0KSxTLm1lcmdlKFtdLHQuY2hpbGROb2RlcykpfX0sZnVuY3Rpb24odCxlKXtTLmZuW3RdPWZ1bmN0aW9uKG4scil7dmFyIG89Uy5tYXAodGhpcyxlLG4pO3JldHVybiJVbnRpbCIhPT10LnNsaWNlKC01KSYmKHI9biksciYmInN0cmluZyI9PXR5cGVvZiByJiYobz1TLmZpbHRlcihyLG8pKSx0aGlzLmxlbmd0aD4xJiYoRFt0XXx8Uy51bmlxdWVTb3J0KG8pLF8udGVzdCh0KSYmby5yZXZlcnNlKCkpLHRoaXMucHVzaFN0YWNrKG8pfX0pO3ZhciBVPS9bXlx4MjBcdFxyXG5cZl0rL2c7ZnVuY3Rpb24gQih0KXtyZXR1cm4gdH1mdW5jdGlvbiBxKHQpe3Rocm93IHR9ZnVuY3Rpb24gRih0LGUsbixyKXt2YXIgbzt0cnl7dCYmbShvPXQucHJvbWlzZSk/by5jYWxsKHQpLmRvbmUoZSkuZmFpbChuKTp0JiZtKG89dC50aGVuKT9vLmNhbGwodCxlLG4pOmUuYXBwbHkodm9pZCAwLFt0XS5zbGljZShyKSl9Y2F0Y2godCl7bi5hcHBseSh2b2lkIDAsW3RdKX19Uy5DYWxsYmFja3M9ZnVuY3Rpb24odCl7dD0ic3RyaW5nIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCl7dmFyIGU9e307cmV0dXJuIFMuZWFjaCh0Lm1hdGNoKFUpfHxbXSxmdW5jdGlvbih0LG4pe2Vbbl09ITB9KSxlfSh0KTpTLmV4dGVuZCh7fSx0KTt2YXIgZSxuLHIsbyxpPVtdLGE9W10scz0tMSx1PWZ1bmN0aW9uKCl7Zm9yKG89b3x8dC5vbmNlLHI9ZT0hMDthLmxlbmd0aDtzPS0xKWZvcihuPWEuc2hpZnQoKTsrK3M8aS5sZW5ndGg7KSExPT09aVtzXS5hcHBseShuWzBdLG5bMV0pJiZ0LnN0b3BPbkZhbHNlJiYocz1pLmxlbmd0aCxuPSExKTt0Lm1lbW9yeXx8KG49ITEpLGU9ITEsbyYmKGk9bj9bXToiIil9LGM9e2FkZDpmdW5jdGlvbigpe3JldHVybiBpJiYobiYmIWUmJihzPWkubGVuZ3RoLTEsYS5wdXNoKG4pKSxmdW5jdGlvbiBlKG4pe1MuZWFjaChuLGZ1bmN0aW9uKG4scil7bShyKT90LnVuaXF1ZSYmYy5oYXMocil8fGkucHVzaChyKTpyJiZyLmxlbmd0aCYmInN0cmluZyIhPT1rKHIpJiZlKHIpfSl9KGFyZ3VtZW50cyksbiYmIWUmJnUoKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIFMuZWFjaChhcmd1bWVudHMsZnVuY3Rpb24odCxlKXtmb3IodmFyIG47KG49Uy5pbkFycmF5KGUsaSxuKSk+LTE7KWkuc3BsaWNlKG4sMSksbjw9cyYmcy0tfSksdGhpc30saGFzOmZ1bmN0aW9uKHQpe3JldHVybiB0P1MuaW5BcnJheSh0LGkpPi0xOmkubGVuZ3RoPjB9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIGkmJihpPVtdKSx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIG89YT1bXSxpPW49IiIsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4haX0sbG9jazpmdW5jdGlvbigpe3JldHVybiBvPWE9W10sbnx8ZXx8KGk9bj0iIiksdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuISFvfSxmaXJlV2l0aDpmdW5jdGlvbih0LG4pe3JldHVybiBvfHwobj1bdCwobj1ufHxbXSkuc2xpY2U/bi5zbGljZSgpOm5dLGEucHVzaChuKSxlfHx1KCkpLHRoaXN9LGZpcmU6ZnVuY3Rpb24oKXtyZXR1cm4gYy5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyksdGhpc30sZmlyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXJ9fTtyZXR1cm4gY30sUy5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKHQpe3ZhciBlPVtbIm5vdGlmeSIsInByb2dyZXNzIixTLkNhbGxiYWNrcygibWVtb3J5IiksUy5DYWxsYmFja3MoIm1lbW9yeSIpLDJdLFsicmVzb2x2ZSIsImRvbmUiLFMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLFMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDAsInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIixTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwxLCJyZWplY3RlZCJdXSxyPSJwZW5kaW5nIixvPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiByfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gaS5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LGNhdGNoOmZ1bmN0aW9uKHQpe3JldHVybiBvLnRoZW4obnVsbCx0KX0scGlwZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cztyZXR1cm4gUy5EZWZlcnJlZChmdW5jdGlvbihuKXtTLmVhY2goZSxmdW5jdGlvbihlLHIpe3ZhciBvPW0odFtyWzRdXSkmJnRbcls0XV07aVtyWzFdXShmdW5jdGlvbigpe3ZhciB0PW8mJm8uYXBwbHkodGhpcyxhcmd1bWVudHMpO3QmJm0odC5wcm9taXNlKT90LnByb21pc2UoKS5wcm9ncmVzcyhuLm5vdGlmeSkuZG9uZShuLnJlc29sdmUpLmZhaWwobi5yZWplY3QpOm5bclswXSsiV2l0aCJdKHRoaXMsbz9bdF06YXJndW1lbnRzKX0pfSksdD1udWxsfSkucHJvbWlzZSgpfSx0aGVuOmZ1bmN0aW9uKHQscixvKXt2YXIgaT0wO2Z1bmN0aW9uIGEodCxlLHIsbyl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHM9dGhpcyx1PWFyZ3VtZW50cyxjPWZ1bmN0aW9uKCl7dmFyIG4sYztpZighKHQ8aSkpe2lmKChuPXIuYXBwbHkocyx1KSk9PT1lLnByb21pc2UoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iKTtjPW4mJigib2JqZWN0Ij09dHlwZW9mIG58fCJmdW5jdGlvbiI9PXR5cGVvZiBuKSYmbi50aGVuLG0oYyk/bz9jLmNhbGwobixhKGksZSxCLG8pLGEoaSxlLHEsbykpOihpKyssYy5jYWxsKG4sYShpLGUsQixvKSxhKGksZSxxLG8pLGEoaSxlLEIsZS5ub3RpZnlXaXRoKSkpOihyIT09QiYmKHM9dm9pZCAwLHU9W25dKSwob3x8ZS5yZXNvbHZlV2l0aCkocyx1KSl9fSxsPW8/YzpmdW5jdGlvbigpe3RyeXtjKCl9Y2F0Y2gobil7Uy5EZWZlcnJlZC5leGNlcHRpb25Ib29rJiZTLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2sobixsLnN0YWNrVHJhY2UpLHQrMT49aSYmKHIhPT1xJiYocz12b2lkIDAsdT1bbl0pLGUucmVqZWN0V2l0aChzLHUpKX19O3Q/bCgpOihTLkRlZmVycmVkLmdldFN0YWNrSG9vayYmKGwuc3RhY2tUcmFjZT1TLkRlZmVycmVkLmdldFN0YWNrSG9vaygpKSxuLnNldFRpbWVvdXQobCkpfX1yZXR1cm4gUy5EZWZlcnJlZChmdW5jdGlvbihuKXtlWzBdWzNdLmFkZChhKDAsbixtKG8pP286QixuLm5vdGlmeVdpdGgpKSxlWzFdWzNdLmFkZChhKDAsbixtKHQpP3Q6QikpLGVbMl1bM10uYWRkKGEoMCxuLG0ocik/cjpxKSl9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQ/Uy5leHRlbmQodCxvKTpvfX0saT17fTtyZXR1cm4gUy5lYWNoKGUsZnVuY3Rpb24odCxuKXt2YXIgYT1uWzJdLHM9bls1XTtvW25bMV1dPWEuYWRkLHMmJmEuYWRkKGZ1bmN0aW9uKCl7cj1zfSxlWzMtdF1bMl0uZGlzYWJsZSxlWzMtdF1bM10uZGlzYWJsZSxlWzBdWzJdLmxvY2ssZVswXVszXS5sb2NrKSxhLmFkZChuWzNdLmZpcmUpLGlbblswXV09ZnVuY3Rpb24oKXtyZXR1cm4gaVtuWzBdKyJXaXRoIl0odGhpcz09PWk/dm9pZCAwOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxpW25bMF0rIldpdGgiXT1hLmZpcmVXaXRofSksby5wcm9taXNlKGkpLHQmJnQuY2FsbChpLGkpLGl9LHdoZW46ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aCxuPWUscj1BcnJheShuKSxvPXUuY2FsbChhcmd1bWVudHMpLGk9Uy5EZWZlcnJlZCgpLGE9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JbdF09dGhpcyxvW3RdPWFyZ3VtZW50cy5sZW5ndGg+MT91LmNhbGwoYXJndW1lbnRzKTpuLC0tZXx8aS5yZXNvbHZlV2l0aChyLG8pfX07aWYoZTw9MSYmKEYodCxpLmRvbmUoYShuKSkucmVzb2x2ZSxpLnJlamVjdCwhZSksInBlbmRpbmciPT09aS5zdGF0ZSgpfHxtKG9bbl0mJm9bbl0udGhlbikpKXJldHVybiBpLnRoZW4oKTtmb3IoO24tLTspRihvW25dLGEobiksaS5yZWplY3QpO3JldHVybiBpLnByb21pc2UoKX19KTt2YXIgSD0vXihFdmFsfEludGVybmFsfFJhbmdlfFJlZmVyZW5jZXxTeW50YXh8VHlwZXxVUkkpRXJyb3IkLztTLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2s9ZnVuY3Rpb24odCxlKXtuLmNvbnNvbGUmJm4uY29uc29sZS53YXJuJiZ0JiZILnRlc3QodC5uYW1lKSYmbi5jb25zb2xlLndhcm4oImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246ICIrdC5tZXNzYWdlLHQuc3RhY2ssZSl9LFMucmVhZHlFeGNlcHRpb249ZnVuY3Rpb24odCl7bi5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgdH0pfTt2YXIgej1TLkRlZmVycmVkKCk7ZnVuY3Rpb24gVygpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsVyksbi5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixXKSxTLnJlYWR5KCl9Uy5mbi5yZWFkeT1mdW5jdGlvbih0KXtyZXR1cm4gei50aGVuKHQpLmNhdGNoKGZ1bmN0aW9uKHQpe1MucmVhZHlFeGNlcHRpb24odCl9KSx0aGlzfSxTLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxyZWFkeTpmdW5jdGlvbih0KXsoITA9PT10Py0tUy5yZWFkeVdhaXQ6Uy5pc1JlYWR5KXx8KFMuaXNSZWFkeT0hMCwhMCE9PXQmJi0tUy5yZWFkeVdhaXQ+MHx8ei5yZXNvbHZlV2l0aChhLFtTXSkpfX0pLFMucmVhZHkudGhlbj16LnRoZW4sImNvbXBsZXRlIj09PWEucmVhZHlTdGF0ZXx8ImxvYWRpbmciIT09YS5yZWFkeVN0YXRlJiYhYS5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGw/bi5zZXRUaW1lb3V0KFMucmVhZHkpOihhLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLFcpLG4uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsVykpO3ZhciAkPWZ1bmN0aW9uKHQsZSxuLHIsbyxpLGEpe3ZhciBzPTAsdT10Lmxlbmd0aCxjPW51bGw9PW47aWYoIm9iamVjdCI9PT1rKG4pKWZvcihzIGluIG89ITAsbikkKHQsZSxzLG5bc10sITAsaSxhKTtlbHNlIGlmKHZvaWQgMCE9PXImJihvPSEwLG0ocil8fChhPSEwKSxjJiYoYT8oZS5jYWxsKHQsciksZT1udWxsKTooYz1lLGU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBjLmNhbGwoUyh0KSxuKX0pKSxlKSlmb3IoO3M8dTtzKyspZSh0W3NdLG4sYT9yOnIuY2FsbCh0W3NdLHMsZSh0W3NdLG4pKSk7cmV0dXJuIG8/dDpjP2UuY2FsbCh0KTp1P2UodFswXSxuKTppfSxZPS9eLW1zLS8sVj0vLShbYS16XSkvZztmdW5jdGlvbiBHKHQsZSl7cmV0dXJuIGUudG9VcHBlckNhc2UoKX1mdW5jdGlvbiBLKHQpe3JldHVybiB0LnJlcGxhY2UoWSwibXMtIikucmVwbGFjZShWLEcpfXZhciBYPWZ1bmN0aW9uKHQpe3JldHVybiAxPT09dC5ub2RlVHlwZXx8OT09PXQubm9kZVR5cGV8fCErdC5ub2RlVHlwZX07ZnVuY3Rpb24gSigpe3RoaXMuZXhwYW5kbz1TLmV4cGFuZG8rSi51aWQrK31KLnVpZD0xLEoucHJvdG90eXBlPXtjYWNoZTpmdW5jdGlvbih0KXt2YXIgZT10W3RoaXMuZXhwYW5kb107cmV0dXJuIGV8fChlPXt9LFgodCkmJih0Lm5vZGVUeXBlP3RbdGhpcy5leHBhbmRvXT1lOk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHRoaXMuZXhwYW5kbyx7dmFsdWU6ZSxjb25maWd1cmFibGU6ITB9KSkpLGV9LHNldDpmdW5jdGlvbih0LGUsbil7dmFyIHIsbz10aGlzLmNhY2hlKHQpO2lmKCJzdHJpbmciPT10eXBlb2YgZSlvW0soZSldPW47ZWxzZSBmb3IociBpbiBlKW9bSyhyKV09ZVtyXTtyZXR1cm4gb30sZ2V0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMD09PWU/dGhpcy5jYWNoZSh0KTp0W3RoaXMuZXhwYW5kb10mJnRbdGhpcy5leHBhbmRvXVtLKGUpXX0sYWNjZXNzOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09ZXx8ZSYmInN0cmluZyI9PXR5cGVvZiBlJiZ2b2lkIDA9PT1uP3RoaXMuZ2V0KHQsZSk6KHRoaXMuc2V0KHQsZSxuKSx2b2lkIDAhPT1uP246ZSl9LHJlbW92ZTpmdW5jdGlvbih0LGUpe3ZhciBuLHI9dFt0aGlzLmV4cGFuZG9dO2lmKHZvaWQgMCE9PXIpe2lmKHZvaWQgMCE9PWUpe249KGU9QXJyYXkuaXNBcnJheShlKT9lLm1hcChLKTooZT1LKGUpKWluIHI/W2VdOmUubWF0Y2goVSl8fFtdKS5sZW5ndGg7Zm9yKDtuLS07KWRlbGV0ZSByW2Vbbl1dfSh2b2lkIDA9PT1lfHxTLmlzRW1wdHlPYmplY3QocikpJiYodC5ub2RlVHlwZT90W3RoaXMuZXhwYW5kb109dm9pZCAwOmRlbGV0ZSB0W3RoaXMuZXhwYW5kb10pfX0saGFzRGF0YTpmdW5jdGlvbih0KXt2YXIgZT10W3RoaXMuZXhwYW5kb107cmV0dXJuIHZvaWQgMCE9PWUmJiFTLmlzRW1wdHlPYmplY3QoZSl9fTt2YXIgUT1uZXcgSixaPW5ldyBKLHR0PS9eKD86XHtbXHdcV10qXH18XFtbXHdcV10qXF0pJC8sZXQ9L1tBLVpdL2c7ZnVuY3Rpb24gbnQodCxlLG4pe3ZhciByO2lmKHZvaWQgMD09PW4mJjE9PT10Lm5vZGVUeXBlKWlmKHI9ImRhdGEtIitlLnJlcGxhY2UoZXQsIi0kJiIpLnRvTG93ZXJDYXNlKCksInN0cmluZyI9PXR5cGVvZihuPXQuZ2V0QXR0cmlidXRlKHIpKSl7dHJ5e249ZnVuY3Rpb24odCl7cmV0dXJuInRydWUiPT09dHx8ImZhbHNlIiE9PXQmJigibnVsbCI9PT10P251bGw6dD09PSt0KyIiPyt0OnR0LnRlc3QodCk/SlNPTi5wYXJzZSh0KTp0KX0obil9Y2F0Y2godCl7fVouc2V0KHQsZSxuKX1lbHNlIG49dm9pZCAwO3JldHVybiBufVMuZXh0ZW5kKHtoYXNEYXRhOmZ1bmN0aW9uKHQpe3JldHVybiBaLmhhc0RhdGEodCl8fFEuaGFzRGF0YSh0KX0sZGF0YTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIFouYWNjZXNzKHQsZSxuKX0scmVtb3ZlRGF0YTpmdW5jdGlvbih0LGUpe1oucmVtb3ZlKHQsZSl9LF9kYXRhOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gUS5hY2Nlc3ModCxlLG4pfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbih0LGUpe1EucmVtb3ZlKHQsZSl9fSksUy5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24odCxlKXt2YXIgbixyLG8saT10aGlzWzBdLGE9aSYmaS5hdHRyaWJ1dGVzO2lmKHZvaWQgMD09PXQpe2lmKHRoaXMubGVuZ3RoJiYobz1aLmdldChpKSwxPT09aS5ub2RlVHlwZSYmIVEuZ2V0KGksImhhc0RhdGFBdHRycyIpKSl7Zm9yKG49YS5sZW5ndGg7bi0tOylhW25dJiYwPT09KHI9YVtuXS5uYW1lKS5pbmRleE9mKCJkYXRhLSIpJiYocj1LKHIuc2xpY2UoNSkpLG50KGkscixvW3JdKSk7US5zZXQoaSwiaGFzRGF0YUF0dHJzIiwhMCl9cmV0dXJuIG99cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0P3RoaXMuZWFjaChmdW5jdGlvbigpe1ouc2V0KHRoaXMsdCl9KTokKHRoaXMsZnVuY3Rpb24oZSl7dmFyIG47aWYoaSYmdm9pZCAwPT09ZSlyZXR1cm4gdm9pZCAwIT09KG49Wi5nZXQoaSx0KSk/bjp2b2lkIDAhPT0obj1udChpLHQpKT9uOnZvaWQgMDt0aGlzLmVhY2goZnVuY3Rpb24oKXtaLnNldCh0aGlzLHQsZSl9KX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGg+MSxudWxsLCEwKX0scmVtb3ZlRGF0YTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Wi5yZW1vdmUodGhpcyx0KX0pfX0pLFMuZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI7aWYodClyZXR1cm4gZT0oZXx8ImZ4IikrInF1ZXVlIixyPVEuZ2V0KHQsZSksbiYmKCFyfHxBcnJheS5pc0FycmF5KG4pP3I9US5hY2Nlc3ModCxlLFMubWFrZUFycmF5KG4pKTpyLnB1c2gobikpLHJ8fFtdfSxkZXF1ZXVlOmZ1bmN0aW9uKHQsZSl7ZT1lfHwiZngiO3ZhciBuPVMucXVldWUodCxlKSxyPW4ubGVuZ3RoLG89bi5zaGlmdCgpLGk9Uy5fcXVldWVIb29rcyh0LGUpOyJpbnByb2dyZXNzIj09PW8mJihvPW4uc2hpZnQoKSxyLS0pLG8mJigiZngiPT09ZSYmbi51bnNoaWZ0KCJpbnByb2dyZXNzIiksZGVsZXRlIGkuc3RvcCxvLmNhbGwodCxmdW5jdGlvbigpe1MuZGVxdWV1ZSh0LGUpfSxpKSksIXImJmkmJmkuZW1wdHkuZmlyZSgpfSxfcXVldWVIb29rczpmdW5jdGlvbih0LGUpe3ZhciBuPWUrInF1ZXVlSG9va3MiO3JldHVybiBRLmdldCh0LG4pfHxRLmFjY2Vzcyh0LG4se2VtcHR5OlMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpe1EucmVtb3ZlKHQsW2UrInF1ZXVlIixuXSl9KX0pfX0pLFMuZm4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPTI7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0JiYoZT10LHQ9ImZ4IixuLS0pLGFyZ3VtZW50cy5sZW5ndGg8bj9TLnF1ZXVlKHRoaXNbMF0sdCk6dm9pZCAwPT09ZT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBuPVMucXVldWUodGhpcyx0LGUpO1MuX3F1ZXVlSG9va3ModGhpcyx0KSwiZngiPT09dCYmImlucHJvZ3Jlc3MiIT09blswXSYmUy5kZXF1ZXVlKHRoaXMsdCl9KX0sZGVxdWV1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Uy5kZXF1ZXVlKHRoaXMsdCl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5xdWV1ZSh0fHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbih0LGUpe3ZhciBuLHI9MSxvPVMuRGVmZXJyZWQoKSxpPXRoaXMsYT10aGlzLmxlbmd0aCxzPWZ1bmN0aW9uKCl7LS1yfHxvLnJlc29sdmVXaXRoKGksW2ldKX07Zm9yKCJzdHJpbmciIT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksdD10fHwiZngiO2EtLTspKG49US5nZXQoaVthXSx0KyJxdWV1ZUhvb2tzIikpJiZuLmVtcHR5JiYocisrLG4uZW1wdHkuYWRkKHMpKTtyZXR1cm4gcygpLG8ucHJvbWlzZShlKX19KTt2YXIgcnQ9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2Usb3Q9bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK3J0KyIpKFthLXolXSopJCIsImkiKSxpdD1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLGF0PWEuZG9jdW1lbnRFbGVtZW50LHN0PWZ1bmN0aW9uKHQpe3JldHVybiBTLmNvbnRhaW5zKHQub3duZXJEb2N1bWVudCx0KX0sdXQ9e2NvbXBvc2VkOiEwfTthdC5nZXRSb290Tm9kZSYmKHN0PWZ1bmN0aW9uKHQpe3JldHVybiBTLmNvbnRhaW5zKHQub3duZXJEb2N1bWVudCx0KXx8dC5nZXRSb290Tm9kZSh1dCk9PT10Lm93bmVyRG9jdW1lbnR9KTt2YXIgY3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4ibm9uZSI9PT0odD1lfHx0KS5zdHlsZS5kaXNwbGF5fHwiIj09PXQuc3R5bGUuZGlzcGxheSYmc3QodCkmJiJub25lIj09PVMuY3NzKHQsImRpc3BsYXkiKX0sbHQ9ZnVuY3Rpb24odCxlLG4scil7dmFyIG8saSxhPXt9O2ZvcihpIGluIGUpYVtpXT10LnN0eWxlW2ldLHQuc3R5bGVbaV09ZVtpXTtmb3IoaSBpbiBvPW4uYXBwbHkodCxyfHxbXSksZSl0LnN0eWxlW2ldPWFbaV07cmV0dXJuIG99O2Z1bmN0aW9uIGZ0KHQsZSxuLHIpe3ZhciBvLGksYT0yMCxzPXI/ZnVuY3Rpb24oKXtyZXR1cm4gci5jdXIoKX06ZnVuY3Rpb24oKXtyZXR1cm4gUy5jc3ModCxlLCIiKX0sdT1zKCksYz1uJiZuWzNdfHwoUy5jc3NOdW1iZXJbZV0/IiI6InB4IiksbD10Lm5vZGVUeXBlJiYoUy5jc3NOdW1iZXJbZV18fCJweCIhPT1jJiYrdSkmJm90LmV4ZWMoUy5jc3ModCxlKSk7aWYobCYmbFszXSE9PWMpe2Zvcih1Lz0yLGM9Y3x8bFszXSxsPSt1fHwxO2EtLTspUy5zdHlsZSh0LGUsbCtjKSwoMS1pKSooMS0oaT1zKCkvdXx8LjUpKTw9MCYmKGE9MCksbC89aTtsKj0yLFMuc3R5bGUodCxlLGwrYyksbj1ufHxbXX1yZXR1cm4gbiYmKGw9K2x8fCt1fHwwLG89blsxXT9sKyhuWzFdKzEpKm5bMl06K25bMl0sciYmKHIudW5pdD1jLHIuc3RhcnQ9bCxyLmVuZD1vKSksb312YXIgcHQ9e307ZnVuY3Rpb24gaHQodCl7dmFyIGUsbj10Lm93bmVyRG9jdW1lbnQscj10Lm5vZGVOYW1lLG89cHRbcl07cmV0dXJuIG98fChlPW4uYm9keS5hcHBlbmRDaGlsZChuLmNyZWF0ZUVsZW1lbnQocikpLG89Uy5jc3MoZSwiZGlzcGxheSIpLGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSwibm9uZSI9PT1vJiYobz0iYmxvY2siKSxwdFtyXT1vLG8pfWZ1bmN0aW9uIGR0KHQsZSl7Zm9yKHZhciBuLHIsbz1bXSxpPTAsYT10Lmxlbmd0aDtpPGE7aSsrKShyPXRbaV0pLnN0eWxlJiYobj1yLnN0eWxlLmRpc3BsYXksZT8oIm5vbmUiPT09biYmKG9baV09US5nZXQociwiZGlzcGxheSIpfHxudWxsLG9baV18fChyLnN0eWxlLmRpc3BsYXk9IiIpKSwiIj09PXIuc3R5bGUuZGlzcGxheSYmY3QocikmJihvW2ldPWh0KHIpKSk6Im5vbmUiIT09biYmKG9baV09Im5vbmUiLFEuc2V0KHIsImRpc3BsYXkiLG4pKSk7Zm9yKGk9MDtpPGE7aSsrKW51bGwhPW9baV0mJih0W2ldLnN0eWxlLmRpc3BsYXk9b1tpXSk7cmV0dXJuIHR9Uy5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oKXtyZXR1cm4gZHQodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gZHQodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbih0KXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0P3Q/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7Y3QodGhpcyk/Uyh0aGlzKS5zaG93KCk6Uyh0aGlzKS5oaWRlKCl9KX19KTt2YXIgZ3Q9L14oPzpjaGVja2JveHxyYWRpbykkL2ksdnQ9LzwoW2Etel1bXlwvXDA+XHgyMFx0XHJcblxmXSopL2kseXQ9L14kfF5tb2R1bGUkfFwvKD86amF2YXxlY21hKXNjcmlwdC9pLG10PXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLF9kZWZhdWx0OlswLCIiLCIiXX07ZnVuY3Rpb24gYnQodCxlKXt2YXIgbjtyZXR1cm4gbj12b2lkIDAhPT10LmdldEVsZW1lbnRzQnlUYWdOYW1lP3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZXx8IioiKTp2b2lkIDAhPT10LnF1ZXJ5U2VsZWN0b3JBbGw/dC5xdWVyeVNlbGVjdG9yQWxsKGV8fCIqIik6W10sdm9pZCAwPT09ZXx8ZSYmTCh0LGUpP1MubWVyZ2UoW3RdLG4pOm59ZnVuY3Rpb24geHQodCxlKXtmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjtuKyspUS5zZXQodFtuXSwiZ2xvYmFsRXZhbCIsIWV8fFEuZ2V0KGVbbl0sImdsb2JhbEV2YWwiKSl9bXQub3B0Z3JvdXA9bXQub3B0aW9uLG10LnRib2R5PW10LnRmb290PW10LmNvbGdyb3VwPW10LmNhcHRpb249bXQudGhlYWQsbXQudGg9bXQudGQ7dmFyIHd0LGt0LFN0PS88fCYjP1x3KzsvO2Z1bmN0aW9uIEV0KHQsZSxuLHIsbyl7Zm9yKHZhciBpLGEscyx1LGMsbCxmPWUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLHA9W10saD0wLGQ9dC5sZW5ndGg7aDxkO2grKylpZigoaT10W2hdKXx8MD09PWkpaWYoIm9iamVjdCI9PT1rKGkpKVMubWVyZ2UocCxpLm5vZGVUeXBlP1tpXTppKTtlbHNlIGlmKFN0LnRlc3QoaSkpe2ZvcihhPWF8fGYuYXBwZW5kQ2hpbGQoZS5jcmVhdGVFbGVtZW50KCJkaXYiKSkscz0odnQuZXhlYyhpKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSx1PW10W3NdfHxtdC5fZGVmYXVsdCxhLmlubmVySFRNTD11WzFdK1MuaHRtbFByZWZpbHRlcihpKSt1WzJdLGw9dVswXTtsLS07KWE9YS5sYXN0Q2hpbGQ7Uy5tZXJnZShwLGEuY2hpbGROb2RlcyksKGE9Zi5maXJzdENoaWxkKS50ZXh0Q29udGVudD0iIn1lbHNlIHAucHVzaChlLmNyZWF0ZVRleHROb2RlKGkpKTtmb3IoZi50ZXh0Q29udGVudD0iIixoPTA7aT1wW2grK107KWlmKHImJlMuaW5BcnJheShpLHIpPi0xKW8mJm8ucHVzaChpKTtlbHNlIGlmKGM9c3QoaSksYT1idChmLmFwcGVuZENoaWxkKGkpLCJzY3JpcHQiKSxjJiZ4dChhKSxuKWZvcihsPTA7aT1hW2wrK107KXl0LnRlc3QoaS50eXBlfHwiIikmJm4ucHVzaChpKTtyZXR1cm4gZn13dD1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKS5hcHBlbmRDaGlsZChhLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSwoa3Q9YS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGt0LnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSxrdC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0Iiksd3QuYXBwZW5kQ2hpbGQoa3QpLHkuY2hlY2tDbG9uZT13dC5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsd3QuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+Iix5Lm5vQ2xvbmVDaGVja2VkPSEhd3QuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlO3ZhciBqdD0vXmtleS8sVHQ9L14oPzptb3VzZXxwb2ludGVyfGNvbnRleHRtZW51fGRyYWd8ZHJvcCl8Y2xpY2svLE90PS9eKFteLl0qKSg/OlwuKC4rKXwpLztmdW5jdGlvbiBBdCgpe3JldHVybiEwfWZ1bmN0aW9uIEN0KCl7cmV0dXJuITF9ZnVuY3Rpb24gTHQodCxlKXtyZXR1cm4gdD09PWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBhLmFjdGl2ZUVsZW1lbnR9Y2F0Y2godCl7fX0oKT09KCJmb2N1cyI9PT1lKX1mdW5jdGlvbiBSdCh0LGUsbixyLG8saSl7dmFyIGEscztpZigib2JqZWN0Ij09dHlwZW9mIGUpe2ZvcihzIGluInN0cmluZyIhPXR5cGVvZiBuJiYocj1yfHxuLG49dm9pZCAwKSxlKVJ0KHQscyxuLHIsZVtzXSxpKTtyZXR1cm4gdH1pZihudWxsPT1yJiZudWxsPT1vPyhvPW4scj1uPXZvaWQgMCk6bnVsbD09byYmKCJzdHJpbmciPT10eXBlb2Ygbj8obz1yLHI9dm9pZCAwKToobz1yLHI9bixuPXZvaWQgMCkpLCExPT09bylvPUN0O2Vsc2UgaWYoIW8pcmV0dXJuIHQ7cmV0dXJuIDE9PT1pJiYoYT1vLChvPWZ1bmN0aW9uKHQpe3JldHVybiBTKCkub2ZmKHQpLGEuYXBwbHkodGhpcyxhcmd1bWVudHMpfSkuZ3VpZD1hLmd1aWR8fChhLmd1aWQ9Uy5ndWlkKyspKSx0LmVhY2goZnVuY3Rpb24oKXtTLmV2ZW50LmFkZCh0aGlzLGUsbyxyLG4pfSl9ZnVuY3Rpb24gUHQodCxlLG4pe24/KFEuc2V0KHQsZSwhMSksUy5ldmVudC5hZGQodCxlLHtuYW1lc3BhY2U6ITEsaGFuZGxlcjpmdW5jdGlvbih0KXt2YXIgcixvLGk9US5nZXQodGhpcyxlKTtpZigxJnQuaXNUcmlnZ2VyJiZ0aGlzW2VdKXtpZihpLmxlbmd0aCkoUy5ldmVudC5zcGVjaWFsW2VdfHx7fSkuZGVsZWdhdGVUeXBlJiZ0LnN0b3BQcm9wYWdhdGlvbigpO2Vsc2UgaWYoaT11LmNhbGwoYXJndW1lbnRzKSxRLnNldCh0aGlzLGUsaSkscj1uKHRoaXMsZSksdGhpc1tlXSgpLGkhPT0obz1RLmdldCh0aGlzLGUpKXx8cj9RLnNldCh0aGlzLGUsITEpOm89e30saSE9PW8pcmV0dXJuIHQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdC5wcmV2ZW50RGVmYXVsdCgpLG8udmFsdWV9ZWxzZSBpLmxlbmd0aCYmKFEuc2V0KHRoaXMsZSx7dmFsdWU6Uy5ldmVudC50cmlnZ2VyKFMuZXh0ZW5kKGlbMF0sUy5FdmVudC5wcm90b3R5cGUpLGkuc2xpY2UoMSksdGhpcyl9KSx0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpKX19KSk6dm9pZCAwPT09US5nZXQodCxlKSYmUy5ldmVudC5hZGQodCxlLEF0KX1TLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGksYSxzLHUsYyxsLGYscCxoLGQsZyx2PVEuZ2V0KHQpO2lmKHYpZm9yKG4uaGFuZGxlciYmKG49KGk9bikuaGFuZGxlcixvPWkuc2VsZWN0b3IpLG8mJlMuZmluZC5tYXRjaGVzU2VsZWN0b3IoYXQsbyksbi5ndWlkfHwobi5ndWlkPVMuZ3VpZCsrKSwodT12LmV2ZW50cyl8fCh1PXYuZXZlbnRzPXt9KSwoYT12LmhhbmRsZSl8fChhPXYuaGFuZGxlPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDAhPT1TJiZTLmV2ZW50LnRyaWdnZXJlZCE9PWUudHlwZT9TLmV2ZW50LmRpc3BhdGNoLmFwcGx5KHQsYXJndW1lbnRzKTp2b2lkIDB9KSxjPShlPShlfHwiIikubWF0Y2goVSl8fFsiIl0pLmxlbmd0aDtjLS07KWg9Zz0ocz1PdC5leGVjKGVbY10pfHxbXSlbMV0sZD0oc1syXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLGgmJihmPVMuZXZlbnQuc3BlY2lhbFtoXXx8e30saD0obz9mLmRlbGVnYXRlVHlwZTpmLmJpbmRUeXBlKXx8aCxmPVMuZXZlbnQuc3BlY2lhbFtoXXx8e30sbD1TLmV4dGVuZCh7dHlwZTpoLG9yaWdUeXBlOmcsZGF0YTpyLGhhbmRsZXI6bixndWlkOm4uZ3VpZCxzZWxlY3RvcjpvLG5lZWRzQ29udGV4dDpvJiZTLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QobyksbmFtZXNwYWNlOmQuam9pbigiLiIpfSxpKSwocD11W2hdKXx8KChwPXVbaF09W10pLmRlbGVnYXRlQ291bnQ9MCxmLnNldHVwJiYhMSE9PWYuc2V0dXAuY2FsbCh0LHIsZCxhKXx8dC5hZGRFdmVudExpc3RlbmVyJiZ0LmFkZEV2ZW50TGlzdGVuZXIoaCxhKSksZi5hZGQmJihmLmFkZC5jYWxsKHQsbCksbC5oYW5kbGVyLmd1aWR8fChsLmhhbmRsZXIuZ3VpZD1uLmd1aWQpKSxvP3Auc3BsaWNlKHAuZGVsZWdhdGVDb3VudCsrLDAsbCk6cC5wdXNoKGwpLFMuZXZlbnQuZ2xvYmFsW2hdPSEwKX0scmVtb3ZlOmZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGksYSxzLHUsYyxsLGYscCxoLGQsZyx2PVEuaGFzRGF0YSh0KSYmUS5nZXQodCk7aWYodiYmKHU9di5ldmVudHMpKXtmb3IoYz0oZT0oZXx8IiIpLm1hdGNoKFUpfHxbIiJdKS5sZW5ndGg7Yy0tOylpZihoPWc9KHM9T3QuZXhlYyhlW2NdKXx8W10pWzFdLGQ9KHNbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxoKXtmb3IoZj1TLmV2ZW50LnNwZWNpYWxbaF18fHt9LHA9dVtoPShyP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxoXXx8W10scz1zWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitkLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLGE9aT1wLmxlbmd0aDtpLS07KWw9cFtpXSwhbyYmZyE9PWwub3JpZ1R5cGV8fG4mJm4uZ3VpZCE9PWwuZ3VpZHx8cyYmIXMudGVzdChsLm5hbWVzcGFjZSl8fHImJnIhPT1sLnNlbGVjdG9yJiYoIioqIiE9PXJ8fCFsLnNlbGVjdG9yKXx8KHAuc3BsaWNlKGksMSksbC5zZWxlY3RvciYmcC5kZWxlZ2F0ZUNvdW50LS0sZi5yZW1vdmUmJmYucmVtb3ZlLmNhbGwodCxsKSk7YSYmIXAubGVuZ3RoJiYoZi50ZWFyZG93biYmITEhPT1mLnRlYXJkb3duLmNhbGwodCxkLHYuaGFuZGxlKXx8Uy5yZW1vdmVFdmVudCh0LGgsdi5oYW5kbGUpLGRlbGV0ZSB1W2hdKX1lbHNlIGZvcihoIGluIHUpUy5ldmVudC5yZW1vdmUodCxoK2VbY10sbixyLCEwKTtTLmlzRW1wdHlPYmplY3QodSkmJlEucmVtb3ZlKHQsImhhbmRsZSBldmVudHMiKX19LGRpc3BhdGNoOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYSxzPVMuZXZlbnQuZml4KHQpLHU9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpLGM9KFEuZ2V0KHRoaXMsImV2ZW50cyIpfHx7fSlbcy50eXBlXXx8W10sbD1TLmV2ZW50LnNwZWNpYWxbcy50eXBlXXx8e307Zm9yKHVbMF09cyxlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl1W2VdPWFyZ3VtZW50c1tlXTtpZihzLmRlbGVnYXRlVGFyZ2V0PXRoaXMsIWwucHJlRGlzcGF0Y2h8fCExIT09bC5wcmVEaXNwYXRjaC5jYWxsKHRoaXMscykpe2ZvcihhPVMuZXZlbnQuaGFuZGxlcnMuY2FsbCh0aGlzLHMsYyksZT0wOyhvPWFbZSsrXSkmJiFzLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7KWZvcihzLmN1cnJlbnRUYXJnZXQ9by5lbGVtLG49MDsoaT1vLmhhbmRsZXJzW24rK10pJiYhcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpOylzLnJuYW1lc3BhY2UmJiExIT09aS5uYW1lc3BhY2UmJiFzLnJuYW1lc3BhY2UudGVzdChpLm5hbWVzcGFjZSl8fChzLmhhbmRsZU9iaj1pLHMuZGF0YT1pLmRhdGEsdm9pZCAwIT09KHI9KChTLmV2ZW50LnNwZWNpYWxbaS5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fGkuaGFuZGxlcikuYXBwbHkoby5lbGVtLHUpKSYmITE9PT0ocy5yZXN1bHQ9cikmJihzLnByZXZlbnREZWZhdWx0KCkscy5zdG9wUHJvcGFnYXRpb24oKSkpO3JldHVybiBsLnBvc3REaXNwYXRjaCYmbC5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLHMpLHMucmVzdWx0fX0saGFuZGxlcnM6ZnVuY3Rpb24odCxlKXt2YXIgbixyLG8saSxhLHM9W10sdT1lLmRlbGVnYXRlQ291bnQsYz10LnRhcmdldDtpZih1JiZjLm5vZGVUeXBlJiYhKCJjbGljayI9PT10LnR5cGUmJnQuYnV0dG9uPj0xKSlmb3IoO2MhPT10aGlzO2M9Yy5wYXJlbnROb2RlfHx0aGlzKWlmKDE9PT1jLm5vZGVUeXBlJiYoImNsaWNrIiE9PXQudHlwZXx8ITAhPT1jLmRpc2FibGVkKSl7Zm9yKGk9W10sYT17fSxuPTA7bjx1O24rKyl2b2lkIDA9PT1hW289KHI9ZVtuXSkuc2VsZWN0b3IrIiAiXSYmKGFbb109ci5uZWVkc0NvbnRleHQ/UyhvLHRoaXMpLmluZGV4KGMpPi0xOlMuZmluZChvLHRoaXMsbnVsbCxbY10pLmxlbmd0aCksYVtvXSYmaS5wdXNoKHIpO2kubGVuZ3RoJiZzLnB1c2goe2VsZW06YyxoYW5kbGVyczppfSl9cmV0dXJuIGM9dGhpcyx1PGUubGVuZ3RoJiZzLnB1c2goe2VsZW06YyxoYW5kbGVyczplLnNsaWNlKHUpfSksc30sYWRkUHJvcDpmdW5jdGlvbih0LGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShTLkV2ZW50LnByb3RvdHlwZSx0LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6bShlKT9mdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gZSh0aGlzLm9yaWdpbmFsRXZlbnQpfTpmdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gdGhpcy5vcmlnaW5hbEV2ZW50W3RdfSxzZXQ6ZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZX0pfX0pfSxmaXg6ZnVuY3Rpb24odCl7cmV0dXJuIHRbUy5leHBhbmRvXT90Om5ldyBTLkV2ZW50KHQpfSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sY2xpY2s6e3NldHVwOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXN8fHQ7cmV0dXJuIGd0LnRlc3QoZS50eXBlKSYmZS5jbGljayYmTChlLCJpbnB1dCIpJiZQdChlLCJjbGljayIsQXQpLCExfSx0cmlnZ2VyOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXN8fHQ7cmV0dXJuIGd0LnRlc3QoZS50eXBlKSYmZS5jbGljayYmTChlLCJpbnB1dCIpJiZQdChlLCJjbGljayIpLCEwfSxfZGVmYXVsdDpmdW5jdGlvbih0KXt2YXIgZT10LnRhcmdldDtyZXR1cm4gZ3QudGVzdChlLnR5cGUpJiZlLmNsaWNrJiZMKGUsImlucHV0IikmJlEuZ2V0KGUsImNsaWNrIil8fEwoZSwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24odCl7dm9pZCAwIT09dC5yZXN1bHQmJnQub3JpZ2luYWxFdmVudCYmKHQub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT10LnJlc3VsdCl9fX19LFMucmVtb3ZlRXZlbnQ9ZnVuY3Rpb24odCxlLG4pe3QucmVtb3ZlRXZlbnRMaXN0ZW5lciYmdC5yZW1vdmVFdmVudExpc3RlbmVyKGUsbil9LFMuRXZlbnQ9ZnVuY3Rpb24odCxlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBTLkV2ZW50KSlyZXR1cm4gbmV3IFMuRXZlbnQodCxlKTt0JiZ0LnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD10LHRoaXMudHlwZT10LnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9dC5kZWZhdWx0UHJldmVudGVkfHx2b2lkIDA9PT10LmRlZmF1bHRQcmV2ZW50ZWQmJiExPT09dC5yZXR1cm5WYWx1ZT9BdDpDdCx0aGlzLnRhcmdldD10LnRhcmdldCYmMz09PXQudGFyZ2V0Lm5vZGVUeXBlP3QudGFyZ2V0LnBhcmVudE5vZGU6dC50YXJnZXQsdGhpcy5jdXJyZW50VGFyZ2V0PXQuY3VycmVudFRhcmdldCx0aGlzLnJlbGF0ZWRUYXJnZXQ9dC5yZWxhdGVkVGFyZ2V0KTp0aGlzLnR5cGU9dCxlJiZTLmV4dGVuZCh0aGlzLGUpLHRoaXMudGltZVN0YW1wPXQmJnQudGltZVN0YW1wfHxEYXRlLm5vdygpLHRoaXNbUy5leHBhbmRvXT0hMH0sUy5FdmVudC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlMuRXZlbnQsaXNEZWZhdWx0UHJldmVudGVkOkN0LGlzUHJvcGFnYXRpb25TdG9wcGVkOkN0LGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOkN0LGlzU2ltdWxhdGVkOiExLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPUF0LHQmJiF0aGlzLmlzU2ltdWxhdGVkJiZ0LnByZXZlbnREZWZhdWx0KCl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPUF0LHQmJiF0aGlzLmlzU2ltdWxhdGVkJiZ0LnN0b3BQcm9wYWdhdGlvbigpfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1BdCx0JiYhdGhpcy5pc1NpbXVsYXRlZCYmdC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0sUy5lYWNoKHthbHRLZXk6ITAsYnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNoYW5nZWRUb3VjaGVzOiEwLGN0cmxLZXk6ITAsZGV0YWlsOiEwLGV2ZW50UGhhc2U6ITAsbWV0YUtleTohMCxwYWdlWDohMCxwYWdlWTohMCxzaGlmdEtleTohMCx2aWV3OiEwLGNoYXI6ITAsY29kZTohMCxjaGFyQ29kZTohMCxrZXk6ITAsa2V5Q29kZTohMCxidXR0b246ITAsYnV0dG9uczohMCxjbGllbnRYOiEwLGNsaWVudFk6ITAsb2Zmc2V0WDohMCxvZmZzZXRZOiEwLHBvaW50ZXJJZDohMCxwb2ludGVyVHlwZTohMCxzY3JlZW5YOiEwLHNjcmVlblk6ITAsdGFyZ2V0VG91Y2hlczohMCx0b0VsZW1lbnQ6ITAsdG91Y2hlczohMCx3aGljaDpmdW5jdGlvbih0KXt2YXIgZT10LmJ1dHRvbjtyZXR1cm4gbnVsbD09dC53aGljaCYmanQudGVzdCh0LnR5cGUpP251bGwhPXQuY2hhckNvZGU/dC5jaGFyQ29kZTp0LmtleUNvZGU6IXQud2hpY2gmJnZvaWQgMCE9PWUmJlR0LnRlc3QodC50eXBlKT8xJmU/MToyJmU/Mzo0JmU/MjowOnQud2hpY2h9fSxTLmV2ZW50LmFkZFByb3ApLFMuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24odCxlKXtTLmV2ZW50LnNwZWNpYWxbdF09e3NldHVwOmZ1bmN0aW9uKCl7cmV0dXJuIFB0KHRoaXMsdCxMdCksITF9LHRyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gUHQodGhpcyx0KSwhMH0sZGVsZWdhdGVUeXBlOmV9fSksUy5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0Iixwb2ludGVyZW50ZXI6InBvaW50ZXJvdmVyIixwb2ludGVybGVhdmU6InBvaW50ZXJvdXQifSxmdW5jdGlvbih0LGUpe1MuZXZlbnQuc3BlY2lhbFt0XT17ZGVsZWdhdGVUeXBlOmUsYmluZFR5cGU6ZSxoYW5kbGU6ZnVuY3Rpb24odCl7dmFyIG4scj10aGlzLG89dC5yZWxhdGVkVGFyZ2V0LGk9dC5oYW5kbGVPYmo7cmV0dXJuIG8mJihvPT09cnx8Uy5jb250YWlucyhyLG8pKXx8KHQudHlwZT1pLm9yaWdUeXBlLG49aS5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0LnR5cGU9ZSksbn19fSksUy5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBSdCh0aGlzLHQsZSxuLHIpfSxvbmU6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIFJ0KHRoaXMsdCxlLG4sciwxKX0sb2ZmOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvO2lmKHQmJnQucHJldmVudERlZmF1bHQmJnQuaGFuZGxlT2JqKXJldHVybiByPXQuaGFuZGxlT2JqLFModC5kZWxlZ2F0ZVRhcmdldCkub2ZmKHIubmFtZXNwYWNlP3Iub3JpZ1R5cGUrIi4iK3IubmFtZXNwYWNlOnIub3JpZ1R5cGUsci5zZWxlY3RvcixyLmhhbmRsZXIpLHRoaXM7aWYoIm9iamVjdCI9PXR5cGVvZiB0KXtmb3IobyBpbiB0KXRoaXMub2ZmKG8sZSx0W29dKTtyZXR1cm4gdGhpc31yZXR1cm4hMSE9PWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlfHwobj1lLGU9dm9pZCAwKSwhMT09PW4mJihuPUN0KSx0aGlzLmVhY2goZnVuY3Rpb24oKXtTLmV2ZW50LnJlbW92ZSh0aGlzLHQsbixlKX0pfX0pO3ZhciBOdD0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKilbXj5dKilcLz4vZ2ksSXQ9LzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksX3Q9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksRHQ9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nO2Z1bmN0aW9uIE10KHQsZSl7cmV0dXJuIEwodCwidGFibGUiKSYmTCgxMSE9PWUubm9kZVR5cGU/ZTplLmZpcnN0Q2hpbGQsInRyIikmJlModCkuY2hpbGRyZW4oInRib2R5IilbMF18fHR9ZnVuY3Rpb24gVXQodCl7cmV0dXJuIHQudHlwZT0obnVsbCE9PXQuZ2V0QXR0cmlidXRlKCJ0eXBlIikpKyIvIit0LnR5cGUsdH1mdW5jdGlvbiBCdCh0KXtyZXR1cm4idHJ1ZS8iPT09KHQudHlwZXx8IiIpLnNsaWNlKDAsNSk/dC50eXBlPXQudHlwZS5zbGljZSg1KTp0LnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpLHR9ZnVuY3Rpb24gcXQodCxlKXt2YXIgbixyLG8saSxhLHMsdSxjO2lmKDE9PT1lLm5vZGVUeXBlKXtpZihRLmhhc0RhdGEodCkmJihpPVEuYWNjZXNzKHQpLGE9US5zZXQoZSxpKSxjPWkuZXZlbnRzKSlmb3IobyBpbiBkZWxldGUgYS5oYW5kbGUsYS5ldmVudHM9e30sYylmb3Iobj0wLHI9Y1tvXS5sZW5ndGg7bjxyO24rKylTLmV2ZW50LmFkZChlLG8sY1tvXVtuXSk7Wi5oYXNEYXRhKHQpJiYocz1aLmFjY2Vzcyh0KSx1PVMuZXh0ZW5kKHt9LHMpLFouc2V0KGUsdSkpfX1mdW5jdGlvbiBGdCh0LGUpe3ZhciBuPWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsiaW5wdXQiPT09biYmZ3QudGVzdCh0LnR5cGUpP2UuY2hlY2tlZD10LmNoZWNrZWQ6ImlucHV0IiE9PW4mJiJ0ZXh0YXJlYSIhPT1ufHwoZS5kZWZhdWx0VmFsdWU9dC5kZWZhdWx0VmFsdWUpfWZ1bmN0aW9uIEh0KHQsZSxuLHIpe2U9Yy5hcHBseShbXSxlKTt2YXIgbyxpLGEscyx1LGwsZj0wLHA9dC5sZW5ndGgsaD1wLTEsZD1lWzBdLGc9bShkKTtpZihnfHxwPjEmJiJzdHJpbmciPT10eXBlb2YgZCYmIXkuY2hlY2tDbG9uZSYmX3QudGVzdChkKSlyZXR1cm4gdC5lYWNoKGZ1bmN0aW9uKG8pe3ZhciBpPXQuZXEobyk7ZyYmKGVbMF09ZC5jYWxsKHRoaXMsbyxpLmh0bWwoKSkpLEh0KGksZSxuLHIpfSk7aWYocCYmKGk9KG89RXQoZSx0WzBdLm93bmVyRG9jdW1lbnQsITEsdCxyKSkuZmlyc3RDaGlsZCwxPT09by5jaGlsZE5vZGVzLmxlbmd0aCYmKG89aSksaXx8cikpe2ZvcihzPShhPVMubWFwKGJ0KG8sInNjcmlwdCIpLFV0KSkubGVuZ3RoO2Y8cDtmKyspdT1vLGYhPT1oJiYodT1TLmNsb25lKHUsITAsITApLHMmJlMubWVyZ2UoYSxidCh1LCJzY3JpcHQiKSkpLG4uY2FsbCh0W2ZdLHUsZik7aWYocylmb3IobD1hW2EubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQsUy5tYXAoYSxCdCksZj0wO2Y8cztmKyspdT1hW2ZdLHl0LnRlc3QodS50eXBlfHwiIikmJiFRLmFjY2Vzcyh1LCJnbG9iYWxFdmFsIikmJlMuY29udGFpbnMobCx1KSYmKHUuc3JjJiYibW9kdWxlIiE9PSh1LnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpP1MuX2V2YWxVcmwmJiF1Lm5vTW9kdWxlJiZTLl9ldmFsVXJsKHUuc3JjLHtub25jZTp1Lm5vbmNlfHx1LmdldEF0dHJpYnV0ZSgibm9uY2UiKX0pOncodS50ZXh0Q29udGVudC5yZXBsYWNlKER0LCIiKSx1LGwpKX1yZXR1cm4gdH1mdW5jdGlvbiB6dCh0LGUsbil7Zm9yKHZhciByLG89ZT9TLmZpbHRlcihlLHQpOnQsaT0wO251bGwhPShyPW9baV0pO2krKylufHwxIT09ci5ub2RlVHlwZXx8Uy5jbGVhbkRhdGEoYnQocikpLHIucGFyZW50Tm9kZSYmKG4mJnN0KHIpJiZ4dChidChyLCJzY3JpcHQiKSksci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHIpKTtyZXR1cm4gdH1TLmV4dGVuZCh7aHRtbFByZWZpbHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdC5yZXBsYWNlKE50LCI8JDE+PC8kMj4iKX0sY2xvbmU6ZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saSxhLHM9dC5jbG9uZU5vZGUoITApLHU9c3QodCk7aWYoISh5Lm5vQ2xvbmVDaGVja2VkfHwxIT09dC5ub2RlVHlwZSYmMTEhPT10Lm5vZGVUeXBlfHxTLmlzWE1MRG9jKHQpKSlmb3IoYT1idChzKSxyPTAsbz0oaT1idCh0KSkubGVuZ3RoO3I8bztyKyspRnQoaVtyXSxhW3JdKTtpZihlKWlmKG4pZm9yKGk9aXx8YnQodCksYT1hfHxidChzKSxyPTAsbz1pLmxlbmd0aDtyPG87cisrKXF0KGlbcl0sYVtyXSk7ZWxzZSBxdCh0LHMpO3JldHVybihhPWJ0KHMsInNjcmlwdCIpKS5sZW5ndGg+MCYmeHQoYSwhdSYmYnQodCwic2NyaXB0IikpLHN9LGNsZWFuRGF0YTpmdW5jdGlvbih0KXtmb3IodmFyIGUsbixyLG89Uy5ldmVudC5zcGVjaWFsLGk9MDt2b2lkIDAhPT0obj10W2ldKTtpKyspaWYoWChuKSl7aWYoZT1uW1EuZXhwYW5kb10pe2lmKGUuZXZlbnRzKWZvcihyIGluIGUuZXZlbnRzKW9bcl0/Uy5ldmVudC5yZW1vdmUobixyKTpTLnJlbW92ZUV2ZW50KG4scixlLmhhbmRsZSk7bltRLmV4cGFuZG9dPXZvaWQgMH1uW1ouZXhwYW5kb10mJihuW1ouZXhwYW5kb109dm9pZCAwKX19fSksUy5mbi5leHRlbmQoe2RldGFjaDpmdW5jdGlvbih0KXtyZXR1cm4genQodGhpcyx0LCEwKX0scmVtb3ZlOmZ1bmN0aW9uKHQpe3JldHVybiB6dCh0aGlzLHQpfSx0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiAkKHRoaXMsZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQ/Uy50ZXh0KHRoaXMpOnRoaXMuZW1wdHkoKS5lYWNoKGZ1bmN0aW9uKCl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fCh0aGlzLnRleHRDb250ZW50PXQpfSl9LG51bGwsdCxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIEh0KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKHQpezEhPT10aGlzLm5vZGVUeXBlJiYxMSE9PXRoaXMubm9kZVR5cGUmJjkhPT10aGlzLm5vZGVUeXBlfHxNdCh0aGlzLHQpLmFwcGVuZENoaWxkKHQpfSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gSHQodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24odCl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBlPU10KHRoaXMsdCk7ZS5pbnNlcnRCZWZvcmUodCxlLmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gSHQodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24odCl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHQsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gSHQodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24odCl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHQsdGhpcy5uZXh0U2libGluZyl9KX0sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIHQsZT0wO251bGwhPSh0PXRoaXNbZV0pO2UrKykxPT09dC5ub2RlVHlwZSYmKFMuY2xlYW5EYXRhKGJ0KHQsITEpKSx0LnRleHRDb250ZW50PSIiKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD1udWxsIT10JiZ0LGU9bnVsbD09ZT90OmUsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gUy5jbG9uZSh0aGlzLHQsZSl9KX0saHRtbDpmdW5jdGlvbih0KXtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXNbMF18fHt9LG49MCxyPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PXQmJjE9PT1lLm5vZGVUeXBlKXJldHVybiBlLmlubmVySFRNTDtpZigic3RyaW5nIj09dHlwZW9mIHQmJiFJdC50ZXN0KHQpJiYhbXRbKHZ0LmV4ZWModCl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKXt0PVMuaHRtbFByZWZpbHRlcih0KTt0cnl7Zm9yKDtuPHI7bisrKTE9PT0oZT10aGlzW25dfHx7fSkubm9kZVR5cGUmJihTLmNsZWFuRGF0YShidChlLCExKSksZS5pbm5lckhUTUw9dCk7ZT0wfWNhdGNoKHQpe319ZSYmdGhpcy5lbXB0eSgpLmFwcGVuZCh0KX0sbnVsbCx0LGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiBIdCh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt2YXIgbj10aGlzLnBhcmVudE5vZGU7Uy5pbkFycmF5KHRoaXMsdCk8MCYmKFMuY2xlYW5EYXRhKGJ0KHRoaXMpKSxuJiZuLnJlcGxhY2VDaGlsZChlLHRoaXMpKX0sdCl9fSksUy5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24odCxlKXtTLmZuW3RdPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixyPVtdLG89Uyh0KSxpPW8ubGVuZ3RoLTEsYT0wO2E8PWk7YSsrKW49YT09PWk/dGhpczp0aGlzLmNsb25lKCEwKSxTKG9bYV0pW2VdKG4pLGwuYXBwbHkocixuLmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2socil9fSk7dmFyIFd0PW5ldyBSZWdFeHAoIl4oIitydCsiKSg/IXB4KVthLXolXSskIiwiaSIpLCR0PWZ1bmN0aW9uKHQpe3ZhciBlPXQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztyZXR1cm4gZSYmZS5vcGVuZXJ8fChlPW4pLGUuZ2V0Q29tcHV0ZWRTdHlsZSh0KX0sWXQ9bmV3IFJlZ0V4cChpdC5qb2luKCJ8IiksImkiKTtmdW5jdGlvbiBWdCh0LGUsbil7dmFyIHIsbyxpLGEscz10LnN0eWxlO3JldHVybihuPW58fCR0KHQpKSYmKCIiIT09KGE9bi5nZXRQcm9wZXJ0eVZhbHVlKGUpfHxuW2VdKXx8c3QodCl8fChhPVMuc3R5bGUodCxlKSksIXkucGl4ZWxCb3hTdHlsZXMoKSYmV3QudGVzdChhKSYmWXQudGVzdChlKSYmKHI9cy53aWR0aCxvPXMubWluV2lkdGgsaT1zLm1heFdpZHRoLHMubWluV2lkdGg9cy5tYXhXaWR0aD1zLndpZHRoPWEsYT1uLndpZHRoLHMud2lkdGg9cixzLm1pbldpZHRoPW8scy5tYXhXaWR0aD1pKSksdm9pZCAwIT09YT9hKyIiOmF9ZnVuY3Rpb24gR3QodCxlKXtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7aWYoIXQoKSlyZXR1cm4odGhpcy5nZXQ9ZSkuYXBwbHkodGhpcyxhcmd1bWVudHMpO2RlbGV0ZSB0aGlzLmdldH19fSFmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtpZihsKXtjLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7d2lkdGg6NjBweDttYXJnaW4tdG9wOjFweDtwYWRkaW5nOjA7Ym9yZGVyOjAiLGwuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6c2Nyb2xsO21hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7d2lkdGg6NjAlO3RvcDoxJSIsYXQuYXBwZW5kQ2hpbGQoYykuYXBwZW5kQ2hpbGQobCk7dmFyIHQ9bi5nZXRDb21wdXRlZFN0eWxlKGwpO3I9IjElIiE9PXQudG9wLHU9MTI9PT1lKHQubWFyZ2luTGVmdCksbC5zdHlsZS5yaWdodD0iNjAlIixzPTM2PT09ZSh0LnJpZ2h0KSxvPTM2PT09ZSh0LndpZHRoKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaT0xMj09PWUobC5vZmZzZXRXaWR0aC8zKSxhdC5yZW1vdmVDaGlsZChjKSxsPW51bGx9fWZ1bmN0aW9uIGUodCl7cmV0dXJuIE1hdGgucm91bmQocGFyc2VGbG9hdCh0KSl9dmFyIHIsbyxpLHMsdSxjPWEuY3JlYXRlRWxlbWVudCgiZGl2IiksbD1hLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2wuc3R5bGUmJihsLnN0eWxlLmJhY2tncm91bmRDbGlwPSJjb250ZW50LWJveCIsbC5jbG9uZU5vZGUoITApLnN0eWxlLmJhY2tncm91bmRDbGlwPSIiLHkuY2xlYXJDbG9uZVN0eWxlPSJjb250ZW50LWJveCI9PT1sLnN0eWxlLmJhY2tncm91bmRDbGlwLFMuZXh0ZW5kKHkse2JveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHQoKSxvfSxwaXhlbEJveFN0eWxlczpmdW5jdGlvbigpe3JldHVybiB0KCksc30scGl4ZWxQb3NpdGlvbjpmdW5jdGlvbigpe3JldHVybiB0KCkscn0scmVsaWFibGVNYXJnaW5MZWZ0OmZ1bmN0aW9uKCl7cmV0dXJuIHQoKSx1fSxzY3JvbGxib3hTaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHQoKSxpfX0pKX0oKTt2YXIgS3Q9WyJXZWJraXQiLCJNb3oiLCJtcyJdLFh0PWEuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUsSnQ9e307ZnVuY3Rpb24gUXQodCl7dmFyIGU9Uy5jc3NQcm9wc1t0XXx8SnRbdF07cmV0dXJuIGV8fCh0IGluIFh0P3Q6SnRbdF09ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpLG49S3QubGVuZ3RoO24tLTspaWYoKHQ9S3Rbbl0rZSlpbiBYdClyZXR1cm4gdH0odCl8fHQpfXZhciBadD0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sdGU9L14tLS8sZWU9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LG5lPXtsZXR0ZXJTcGFjaW5nOiIwIixmb250V2VpZ2h0OiI0MDAifTtmdW5jdGlvbiByZSh0LGUsbil7dmFyIHI9b3QuZXhlYyhlKTtyZXR1cm4gcj9NYXRoLm1heCgwLHJbMl0tKG58fDApKSsoclszXXx8InB4Iik6ZX1mdW5jdGlvbiBvZSh0LGUsbixyLG8saSl7dmFyIGE9IndpZHRoIj09PWU/MTowLHM9MCx1PTA7aWYobj09PShyPyJib3JkZXIiOiJjb250ZW50IikpcmV0dXJuIDA7Zm9yKDthPDQ7YSs9MikibWFyZ2luIj09PW4mJih1Kz1TLmNzcyh0LG4raXRbYV0sITAsbykpLHI/KCJjb250ZW50Ij09PW4mJih1LT1TLmNzcyh0LCJwYWRkaW5nIitpdFthXSwhMCxvKSksIm1hcmdpbiIhPT1uJiYodS09Uy5jc3ModCwiYm9yZGVyIitpdFthXSsiV2lkdGgiLCEwLG8pKSk6KHUrPVMuY3NzKHQsInBhZGRpbmciK2l0W2FdLCEwLG8pLCJwYWRkaW5nIiE9PW4/dSs9Uy5jc3ModCwiYm9yZGVyIitpdFthXSsiV2lkdGgiLCEwLG8pOnMrPVMuY3NzKHQsImJvcmRlciIraXRbYV0rIldpZHRoIiwhMCxvKSk7cmV0dXJuIXImJmk+PTAmJih1Kz1NYXRoLm1heCgwLE1hdGguY2VpbCh0WyJvZmZzZXQiK2VbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpXS1pLXUtcy0uNSkpfHwwKSx1fWZ1bmN0aW9uIGllKHQsZSxuKXt2YXIgcj0kdCh0KSxvPSgheS5ib3hTaXppbmdSZWxpYWJsZSgpfHxuKSYmImJvcmRlci1ib3giPT09Uy5jc3ModCwiYm94U2l6aW5nIiwhMSxyKSxpPW8sYT1WdCh0LGUscikscz0ib2Zmc2V0IitlWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKTtpZihXdC50ZXN0KGEpKXtpZighbilyZXR1cm4gYTthPSJhdXRvIn1yZXR1cm4oIXkuYm94U2l6aW5nUmVsaWFibGUoKSYmb3x8ImF1dG8iPT09YXx8IXBhcnNlRmxvYXQoYSkmJiJpbmxpbmUiPT09Uy5jc3ModCwiZGlzcGxheSIsITEscikpJiZ0LmdldENsaWVudFJlY3RzKCkubGVuZ3RoJiYobz0iYm9yZGVyLWJveCI9PT1TLmNzcyh0LCJib3hTaXppbmciLCExLHIpLChpPXMgaW4gdCkmJihhPXRbc10pKSwoYT1wYXJzZUZsb2F0KGEpfHwwKStvZSh0LGUsbnx8KG8/ImJvcmRlciI6ImNvbnRlbnQiKSxpLHIsYSkrInB4In1mdW5jdGlvbiBhZSh0LGUsbixyLG8pe3JldHVybiBuZXcgYWUucHJvdG90eXBlLmluaXQodCxlLG4scixvKX1TLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbih0LGUpe2lmKGUpe3ZhciBuPVZ0KHQsIm9wYWNpdHkiKTtyZXR1cm4iIj09PW4/IjEiOm59fX19LGNzc051bWJlcjp7YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsY29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGdyaWRBcmVhOiEwLGdyaWRDb2x1bW46ITAsZ3JpZENvbHVtbkVuZDohMCxncmlkQ29sdW1uU3RhcnQ6ITAsZ3JpZFJvdzohMCxncmlkUm93RW5kOiEwLGdyaWRSb3dTdGFydDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnt9LHN0eWxlOmZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQmJjMhPT10Lm5vZGVUeXBlJiY4IT09dC5ub2RlVHlwZSYmdC5zdHlsZSl7dmFyIG8saSxhLHM9SyhlKSx1PXRlLnRlc3QoZSksYz10LnN0eWxlO2lmKHV8fChlPVF0KHMpKSxhPVMuY3NzSG9va3NbZV18fFMuY3NzSG9va3Nbc10sdm9pZCAwPT09bilyZXR1cm4gYSYmImdldCJpbiBhJiZ2b2lkIDAhPT0obz1hLmdldCh0LCExLHIpKT9vOmNbZV07InN0cmluZyI9PT0oaT10eXBlb2YgbikmJihvPW90LmV4ZWMobikpJiZvWzFdJiYobj1mdCh0LGUsbyksaT0ibnVtYmVyIiksbnVsbCE9biYmbj09biYmKCJudW1iZXIiIT09aXx8dXx8KG4rPW8mJm9bM118fChTLmNzc051bWJlcltzXT8iIjoicHgiKSkseS5jbGVhckNsb25lU3R5bGV8fCIiIT09bnx8MCE9PWUuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoY1tlXT0iaW5oZXJpdCIpLGEmJiJzZXQiaW4gYSYmdm9pZCAwPT09KG49YS5zZXQodCxuLHIpKXx8KHU/Yy5zZXRQcm9wZXJ0eShlLG4pOmNbZV09bikpfX0sY3NzOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvLGksYSxzPUsoZSk7cmV0dXJuIHRlLnRlc3QoZSl8fChlPVF0KHMpKSwoYT1TLmNzc0hvb2tzW2VdfHxTLmNzc0hvb2tzW3NdKSYmImdldCJpbiBhJiYobz1hLmdldCh0LCEwLG4pKSx2b2lkIDA9PT1vJiYobz1WdCh0LGUscikpLCJub3JtYWwiPT09byYmZSBpbiBuZSYmKG89bmVbZV0pLCIiPT09bnx8bj8oaT1wYXJzZUZsb2F0KG8pLCEwPT09bnx8aXNGaW5pdGUoaSk/aXx8MDpvKTpvfX0pLFMuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24odCxlKXtTLmNzc0hvb2tzW2VdPXtnZXQ6ZnVuY3Rpb24odCxuLHIpe2lmKG4pcmV0dXJuIVp0LnRlc3QoUy5jc3ModCwiZGlzcGxheSIpKXx8dC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCYmdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aD9pZSh0LGUscik6bHQodCxlZSxmdW5jdGlvbigpe3JldHVybiBpZSh0LGUscil9KX0sc2V0OmZ1bmN0aW9uKHQsbixyKXt2YXIgbyxpPSR0KHQpLGE9IXkuc2Nyb2xsYm94U2l6ZSgpJiYiYWJzb2x1dGUiPT09aS5wb3NpdGlvbixzPShhfHxyKSYmImJvcmRlci1ib3giPT09Uy5jc3ModCwiYm94U2l6aW5nIiwhMSxpKSx1PXI/b2UodCxlLHIscyxpKTowO3JldHVybiBzJiZhJiYodS09TWF0aC5jZWlsKHRbIm9mZnNldCIrZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSldLXBhcnNlRmxvYXQoaVtlXSktb2UodCxlLCJib3JkZXIiLCExLGkpLS41KSksdSYmKG89b3QuZXhlYyhuKSkmJiJweCIhPT0ob1szXXx8InB4IikmJih0LnN0eWxlW2VdPW4sbj1TLmNzcyh0LGUpKSxyZSgwLG4sdSl9fX0pLFMuY3NzSG9va3MubWFyZ2luTGVmdD1HdCh5LnJlbGlhYmxlTWFyZ2luTGVmdCxmdW5jdGlvbih0LGUpe2lmKGUpcmV0dXJuKHBhcnNlRmxvYXQoVnQodCwibWFyZ2luTGVmdCIpKXx8dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0LWx0KHQse21hcmdpbkxlZnQ6MH0sZnVuY3Rpb24oKXtyZXR1cm4gdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0fSkpKyJweCJ9KSxTLmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbih0LGUpe1MuY3NzSG9va3NbdCtlXT17ZXhwYW5kOmZ1bmN0aW9uKG4pe2Zvcih2YXIgcj0wLG89e30saT0ic3RyaW5nIj09dHlwZW9mIG4/bi5zcGxpdCgiICIpOltuXTtyPDQ7cisrKW9bdCtpdFtyXStlXT1pW3JdfHxpW3ItMl18fGlbMF07cmV0dXJuIG99fSwibWFyZ2luIiE9PXQmJihTLmNzc0hvb2tzW3QrZV0uc2V0PXJlKX0pLFMuZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24odCxlKXtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGk9e30sYT0wO2lmKEFycmF5LmlzQXJyYXkoZSkpe2ZvcihyPSR0KHQpLG89ZS5sZW5ndGg7YTxvO2ErKylpW2VbYV1dPVMuY3NzKHQsZVthXSwhMSxyKTtyZXR1cm4gaX1yZXR1cm4gdm9pZCAwIT09bj9TLnN0eWxlKHQsZSxuKTpTLmNzcyh0LGUpfSx0LGUsYXJndW1lbnRzLmxlbmd0aD4xKX19KSxTLlR3ZWVuPWFlLGFlLnByb3RvdHlwZT17Y29uc3RydWN0b3I6YWUsaW5pdDpmdW5jdGlvbih0LGUsbixyLG8saSl7dGhpcy5lbGVtPXQsdGhpcy5wcm9wPW4sdGhpcy5lYXNpbmc9b3x8Uy5lYXNpbmcuX2RlZmF1bHQsdGhpcy5vcHRpb25zPWUsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPXIsdGhpcy51bml0PWl8fChTLmNzc051bWJlcltuXT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIHQ9YWUucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHQmJnQuZ2V0P3QuZ2V0KHRoaXMpOmFlLnByb3BIb29rcy5fZGVmYXVsdC5nZXQodGhpcyl9LHJ1bjpmdW5jdGlvbih0KXt2YXIgZSxuPWFlLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0aGlzLm9wdGlvbnMuZHVyYXRpb24/dGhpcy5wb3M9ZT1TLmVhc2luZ1t0aGlzLmVhc2luZ10odCx0aGlzLm9wdGlvbnMuZHVyYXRpb24qdCwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTp0aGlzLnBvcz1lPXQsdGhpcy5ub3c9KHRoaXMuZW5kLXRoaXMuc3RhcnQpKmUrdGhpcy5zdGFydCx0aGlzLm9wdGlvbnMuc3RlcCYmdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyksbiYmbi5zZXQ/bi5zZXQodGhpcyk6YWUucHJvcEhvb2tzLl9kZWZhdWx0LnNldCh0aGlzKSx0aGlzfX0sYWUucHJvdG90eXBlLmluaXQucHJvdG90eXBlPWFlLnByb3RvdHlwZSxhZS5wcm9wSG9va3M9e19kZWZhdWx0OntnZXQ6ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIDEhPT10LmVsZW0ubm9kZVR5cGV8fG51bGwhPXQuZWxlbVt0LnByb3BdJiZudWxsPT10LmVsZW0uc3R5bGVbdC5wcm9wXT90LmVsZW1bdC5wcm9wXTooZT1TLmNzcyh0LmVsZW0sdC5wcm9wLCIiKSkmJiJhdXRvIiE9PWU/ZTowfSxzZXQ6ZnVuY3Rpb24odCl7Uy5meC5zdGVwW3QucHJvcF0/Uy5meC5zdGVwW3QucHJvcF0odCk6MSE9PXQuZWxlbS5ub2RlVHlwZXx8IVMuY3NzSG9va3NbdC5wcm9wXSYmbnVsbD09dC5lbGVtLnN0eWxlW1F0KHQucHJvcCldP3QuZWxlbVt0LnByb3BdPXQubm93OlMuc3R5bGUodC5lbGVtLHQucHJvcCx0Lm5vdyt0LnVuaXQpfX19LGFlLnByb3BIb29rcy5zY3JvbGxUb3A9YWUucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbih0KXt0LmVsZW0ubm9kZVR5cGUmJnQuZWxlbS5wYXJlbnROb2RlJiYodC5lbGVtW3QucHJvcF09dC5ub3cpfX0sUy5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbih0KXtyZXR1cm4gdH0sc3dpbmc6ZnVuY3Rpb24odCl7cmV0dXJuLjUtTWF0aC5jb3ModCpNYXRoLlBJKS8yfSxfZGVmYXVsdDoic3dpbmcifSxTLmZ4PWFlLnByb3RvdHlwZS5pbml0LFMuZnguc3RlcD17fTt2YXIgc2UsdWUsY2U9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLGxlPS9xdWV1ZUhvb2tzJC87ZnVuY3Rpb24gZmUoKXt1ZSYmKCExPT09YS5oaWRkZW4mJm4ucmVxdWVzdEFuaW1hdGlvbkZyYW1lP24ucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZlKTpuLnNldFRpbWVvdXQoZmUsUy5meC5pbnRlcnZhbCksUy5meC50aWNrKCkpfWZ1bmN0aW9uIHBlKCl7cmV0dXJuIG4uc2V0VGltZW91dChmdW5jdGlvbigpe3NlPXZvaWQgMH0pLHNlPURhdGUubm93KCl9ZnVuY3Rpb24gaGUodCxlKXt2YXIgbixyPTAsbz17aGVpZ2h0OnR9O2ZvcihlPWU/MTowO3I8NDtyKz0yLWUpb1sibWFyZ2luIisobj1pdFtyXSldPW9bInBhZGRpbmciK25dPXQ7cmV0dXJuIGUmJihvLm9wYWNpdHk9by53aWR0aD10KSxvfWZ1bmN0aW9uIGRlKHQsZSxuKXtmb3IodmFyIHIsbz0oZ2UudHdlZW5lcnNbZV18fFtdKS5jb25jYXQoZ2UudHdlZW5lcnNbIioiXSksaT0wLGE9by5sZW5ndGg7aTxhO2krKylpZihyPW9baV0uY2FsbChuLGUsdCkpcmV0dXJuIHJ9ZnVuY3Rpb24gZ2UodCxlLG4pe3ZhciByLG8saT0wLGE9Z2UucHJlZmlsdGVycy5sZW5ndGgscz1TLkRlZmVycmVkKCkuYWx3YXlzKGZ1bmN0aW9uKCl7ZGVsZXRlIHUuZWxlbX0pLHU9ZnVuY3Rpb24oKXtpZihvKXJldHVybiExO2Zvcih2YXIgZT1zZXx8cGUoKSxuPU1hdGgubWF4KDAsYy5zdGFydFRpbWUrYy5kdXJhdGlvbi1lKSxyPTEtKG4vYy5kdXJhdGlvbnx8MCksaT0wLGE9Yy50d2VlbnMubGVuZ3RoO2k8YTtpKyspYy50d2VlbnNbaV0ucnVuKHIpO3JldHVybiBzLm5vdGlmeVdpdGgodCxbYyxyLG5dKSxyPDEmJmE/bjooYXx8cy5ub3RpZnlXaXRoKHQsW2MsMSwwXSkscy5yZXNvbHZlV2l0aCh0LFtjXSksITEpfSxjPXMucHJvbWlzZSh7ZWxlbTp0LHByb3BzOlMuZXh0ZW5kKHt9LGUpLG9wdHM6Uy5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e30sZWFzaW5nOlMuZWFzaW5nLl9kZWZhdWx0fSxuKSxvcmlnaW5hbFByb3BlcnRpZXM6ZSxvcmlnaW5hbE9wdGlvbnM6bixzdGFydFRpbWU6c2V8fHBlKCksZHVyYXRpb246bi5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24oZSxuKXt2YXIgcj1TLlR3ZWVuKHQsYy5vcHRzLGUsbixjLm9wdHMuc3BlY2lhbEVhc2luZ1tlXXx8Yy5vcHRzLmVhc2luZyk7cmV0dXJuIGMudHdlZW5zLnB1c2gocikscn0sc3RvcDpmdW5jdGlvbihlKXt2YXIgbj0wLHI9ZT9jLnR3ZWVucy5sZW5ndGg6MDtpZihvKXJldHVybiB0aGlzO2ZvcihvPSEwO248cjtuKyspYy50d2VlbnNbbl0ucnVuKDEpO3JldHVybiBlPyhzLm5vdGlmeVdpdGgodCxbYywxLDBdKSxzLnJlc29sdmVXaXRoKHQsW2MsZV0pKTpzLnJlamVjdFdpdGgodCxbYyxlXSksdGhpc319KSxsPWMucHJvcHM7Zm9yKCFmdW5jdGlvbih0LGUpe3ZhciBuLHIsbyxpLGE7Zm9yKG4gaW4gdClpZihvPWVbcj1LKG4pXSxpPXRbbl0sQXJyYXkuaXNBcnJheShpKSYmKG89aVsxXSxpPXRbbl09aVswXSksbiE9PXImJih0W3JdPWksZGVsZXRlIHRbbl0pLChhPVMuY3NzSG9va3Nbcl0pJiYiZXhwYW5kImluIGEpZm9yKG4gaW4gaT1hLmV4cGFuZChpKSxkZWxldGUgdFtyXSxpKW4gaW4gdHx8KHRbbl09aVtuXSxlW25dPW8pO2Vsc2UgZVtyXT1vfShsLGMub3B0cy5zcGVjaWFsRWFzaW5nKTtpPGE7aSsrKWlmKHI9Z2UucHJlZmlsdGVyc1tpXS5jYWxsKGMsdCxsLGMub3B0cykpcmV0dXJuIG0oci5zdG9wKSYmKFMuX3F1ZXVlSG9va3MoYy5lbGVtLGMub3B0cy5xdWV1ZSkuc3RvcD1yLnN0b3AuYmluZChyKSkscjtyZXR1cm4gUy5tYXAobCxkZSxjKSxtKGMub3B0cy5zdGFydCkmJmMub3B0cy5zdGFydC5jYWxsKHQsYyksYy5wcm9ncmVzcyhjLm9wdHMucHJvZ3Jlc3MpLmRvbmUoYy5vcHRzLmRvbmUsYy5vcHRzLmNvbXBsZXRlKS5mYWlsKGMub3B0cy5mYWlsKS5hbHdheXMoYy5vcHRzLmFsd2F5cyksUy5meC50aW1lcihTLmV4dGVuZCh1LHtlbGVtOnQsYW5pbTpjLHF1ZXVlOmMub3B0cy5xdWV1ZX0pKSxjfVMuQW5pbWF0aW9uPVMuZXh0ZW5kKGdlLHt0d2VlbmVyczp7IioiOltmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuY3JlYXRlVHdlZW4odCxlKTtyZXR1cm4gZnQobi5lbGVtLHQsb3QuZXhlYyhlKSxuKSxufV19LHR3ZWVuZXI6ZnVuY3Rpb24odCxlKXttKHQpPyhlPXQsdD1bIioiXSk6dD10Lm1hdGNoKFUpO2Zvcih2YXIgbixyPTAsbz10Lmxlbmd0aDtyPG87cisrKW49dFtyXSxnZS50d2VlbmVyc1tuXT1nZS50d2VlbmVyc1tuXXx8W10sZ2UudHdlZW5lcnNbbl0udW5zaGlmdChlKX0scHJlZmlsdGVyczpbZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saSxhLHMsdSxjLGwsZj0id2lkdGgiaW4gZXx8ImhlaWdodCJpbiBlLHA9dGhpcyxoPXt9LGQ9dC5zdHlsZSxnPXQubm9kZVR5cGUmJmN0KHQpLHY9US5nZXQodCwiZnhzaG93Iik7Zm9yKHIgaW4gbi5xdWV1ZXx8KG51bGw9PShhPVMuX3F1ZXVlSG9va3ModCwiZngiKSkudW5xdWV1ZWQmJihhLnVucXVldWVkPTAscz1hLmVtcHR5LmZpcmUsYS5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7YS51bnF1ZXVlZHx8cygpfSksYS51bnF1ZXVlZCsrLHAuYWx3YXlzKGZ1bmN0aW9uKCl7cC5hbHdheXMoZnVuY3Rpb24oKXthLnVucXVldWVkLS0sUy5xdWV1ZSh0LCJmeCIpLmxlbmd0aHx8YS5lbXB0eS5maXJlKCl9KX0pKSxlKWlmKG89ZVtyXSxjZS50ZXN0KG8pKXtpZihkZWxldGUgZVtyXSxpPWl8fCJ0b2dnbGUiPT09byxvPT09KGc/ImhpZGUiOiJzaG93Iikpe2lmKCJzaG93IiE9PW98fCF2fHx2b2lkIDA9PT12W3JdKWNvbnRpbnVlO2c9ITB9aFtyXT12JiZ2W3JdfHxTLnN0eWxlKHQscil9aWYoKHU9IVMuaXNFbXB0eU9iamVjdChlKSl8fCFTLmlzRW1wdHlPYmplY3QoaCkpZm9yKHIgaW4gZiYmMT09PXQubm9kZVR5cGUmJihuLm92ZXJmbG93PVtkLm92ZXJmbG93LGQub3ZlcmZsb3dYLGQub3ZlcmZsb3dZXSxudWxsPT0oYz12JiZ2LmRpc3BsYXkpJiYoYz1RLmdldCh0LCJkaXNwbGF5IikpLCJub25lIj09PShsPVMuY3NzKHQsImRpc3BsYXkiKSkmJihjP2w9YzooZHQoW3RdLCEwKSxjPXQuc3R5bGUuZGlzcGxheXx8YyxsPVMuY3NzKHQsImRpc3BsYXkiKSxkdChbdF0pKSksKCJpbmxpbmUiPT09bHx8ImlubGluZS1ibG9jayI9PT1sJiZudWxsIT1jKSYmIm5vbmUiPT09Uy5jc3ModCwiZmxvYXQiKSYmKHV8fChwLmRvbmUoZnVuY3Rpb24oKXtkLmRpc3BsYXk9Y30pLG51bGw9PWMmJihsPWQuZGlzcGxheSxjPSJub25lIj09PWw/IiI6bCkpLGQuZGlzcGxheT0iaW5saW5lLWJsb2NrIikpLG4ub3ZlcmZsb3cmJihkLm92ZXJmbG93PSJoaWRkZW4iLHAuYWx3YXlzKGZ1bmN0aW9uKCl7ZC5vdmVyZmxvdz1uLm92ZXJmbG93WzBdLGQub3ZlcmZsb3dYPW4ub3ZlcmZsb3dbMV0sZC5vdmVyZmxvd1k9bi5vdmVyZmxvd1syXX0pKSx1PSExLGgpdXx8KHY/ImhpZGRlbiJpbiB2JiYoZz12LmhpZGRlbik6dj1RLmFjY2Vzcyh0LCJmeHNob3ciLHtkaXNwbGF5OmN9KSxpJiYodi5oaWRkZW49IWcpLGcmJmR0KFt0XSwhMCkscC5kb25lKGZ1bmN0aW9uKCl7Zm9yKHIgaW4gZ3x8ZHQoW3RdKSxRLnJlbW92ZSh0LCJmeHNob3ciKSxoKVMuc3R5bGUodCxyLGhbcl0pfSkpLHU9ZGUoZz92W3JdOjAscixwKSxyIGluIHZ8fCh2W3JdPXUuc3RhcnQsZyYmKHUuZW5kPXUuc3RhcnQsdS5zdGFydD0wKSl9XSxwcmVmaWx0ZXI6ZnVuY3Rpb24odCxlKXtlP2dlLnByZWZpbHRlcnMudW5zaGlmdCh0KTpnZS5wcmVmaWx0ZXJzLnB1c2godCl9fSksUy5zcGVlZD1mdW5jdGlvbih0LGUsbil7dmFyIHI9dCYmIm9iamVjdCI9PXR5cGVvZiB0P1MuZXh0ZW5kKHt9LHQpOntjb21wbGV0ZTpufHwhbiYmZXx8bSh0KSYmdCxkdXJhdGlvbjp0LGVhc2luZzpuJiZlfHxlJiYhbShlKSYmZX07cmV0dXJuIFMuZngub2ZmP3IuZHVyYXRpb249MDoibnVtYmVyIiE9dHlwZW9mIHIuZHVyYXRpb24mJihyLmR1cmF0aW9uIGluIFMuZnguc3BlZWRzP3IuZHVyYXRpb249Uy5meC5zcGVlZHNbci5kdXJhdGlvbl06ci5kdXJhdGlvbj1TLmZ4LnNwZWVkcy5fZGVmYXVsdCksbnVsbCE9ci5xdWV1ZSYmITAhPT1yLnF1ZXVlfHwoci5xdWV1ZT0iZngiKSxyLm9sZD1yLmNvbXBsZXRlLHIuY29tcGxldGU9ZnVuY3Rpb24oKXttKHIub2xkKSYmci5vbGQuY2FsbCh0aGlzKSxyLnF1ZXVlJiZTLmRlcXVldWUodGhpcyxyLnF1ZXVlKX0scn0sUy5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gdGhpcy5maWx0ZXIoY3QpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6ZX0sdCxuLHIpfSxhbmltYXRlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPVMuaXNFbXB0eU9iamVjdCh0KSxpPVMuc3BlZWQoZSxuLHIpLGE9ZnVuY3Rpb24oKXt2YXIgZT1nZSh0aGlzLFMuZXh0ZW5kKHt9LHQpLGkpOyhvfHxRLmdldCh0aGlzLCJmaW5pc2giKSkmJmUuc3RvcCghMCl9O3JldHVybiBhLmZpbmlzaD1hLG98fCExPT09aS5xdWV1ZT90aGlzLmVhY2goYSk6dGhpcy5xdWV1ZShpLnF1ZXVlLGEpfSxzdG9wOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1mdW5jdGlvbih0KXt2YXIgZT10LnN0b3A7ZGVsZXRlIHQuc3RvcCxlKG4pfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQmJihuPWUsZT10LHQ9dm9pZCAwKSxlJiYhMSE9PXQmJnRoaXMucXVldWUodHx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9ITAsbz1udWxsIT10JiZ0KyJxdWV1ZUhvb2tzIixpPVMudGltZXJzLGE9US5nZXQodGhpcyk7aWYobylhW29dJiZhW29dLnN0b3AmJnIoYVtvXSk7ZWxzZSBmb3IobyBpbiBhKWFbb10mJmFbb10uc3RvcCYmbGUudGVzdChvKSYmcihhW29dKTtmb3Iobz1pLmxlbmd0aDtvLS07KWlbb10uZWxlbSE9PXRoaXN8fG51bGwhPXQmJmlbb10ucXVldWUhPT10fHwoaVtvXS5hbmltLnN0b3AobiksZT0hMSxpLnNwbGljZShvLDEpKTshZSYmbnx8Uy5kZXF1ZXVlKHRoaXMsdCl9KX0sZmluaXNoOmZ1bmN0aW9uKHQpe3JldHVybiExIT09dCYmKHQ9dHx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGUsbj1RLmdldCh0aGlzKSxyPW5bdCsicXVldWUiXSxvPW5bdCsicXVldWVIb29rcyJdLGk9Uy50aW1lcnMsYT1yP3IubGVuZ3RoOjA7Zm9yKG4uZmluaXNoPSEwLFMucXVldWUodGhpcyx0LFtdKSxvJiZvLnN0b3AmJm8uc3RvcC5jYWxsKHRoaXMsITApLGU9aS5sZW5ndGg7ZS0tOylpW2VdLmVsZW09PT10aGlzJiZpW2VdLnF1ZXVlPT09dCYmKGlbZV0uYW5pbS5zdG9wKCEwKSxpLnNwbGljZShlLDEpKTtmb3IoZT0wO2U8YTtlKyspcltlXSYmcltlXS5maW5pc2gmJnJbZV0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIG4uZmluaXNofSl9fSksUy5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbih0LGUpe3ZhciBuPVMuZm5bZV07Uy5mbltlXT1mdW5jdGlvbih0LHIsbyl7cmV0dXJuIG51bGw9PXR8fCJib29sZWFuIj09dHlwZW9mIHQ/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKGhlKGUsITApLHQscixvKX19KSxTLmVhY2goe3NsaWRlRG93bjpoZSgic2hvdyIpLHNsaWRlVXA6aGUoImhpZGUiKSxzbGlkZVRvZ2dsZTpoZSgidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbih0LGUpe1MuZm5bdF09ZnVuY3Rpb24odCxuLHIpe3JldHVybiB0aGlzLmFuaW1hdGUoZSx0LG4scil9fSksUy50aW1lcnM9W10sUy5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIHQsZT0wLG49Uy50aW1lcnM7Zm9yKHNlPURhdGUubm93KCk7ZTxuLmxlbmd0aDtlKyspKHQ9bltlXSkoKXx8bltlXSE9PXR8fG4uc3BsaWNlKGUtLSwxKTtuLmxlbmd0aHx8Uy5meC5zdG9wKCksc2U9dm9pZCAwfSxTLmZ4LnRpbWVyPWZ1bmN0aW9uKHQpe1MudGltZXJzLnB1c2godCksUy5meC5zdGFydCgpfSxTLmZ4LmludGVydmFsPTEzLFMuZnguc3RhcnQ9ZnVuY3Rpb24oKXt1ZXx8KHVlPSEwLGZlKCkpfSxTLmZ4LnN0b3A9ZnVuY3Rpb24oKXt1ZT1udWxsfSxTLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxTLmZuLmRlbGF5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9Uy5meCYmUy5meC5zcGVlZHNbdF18fHQsZT1lfHwiZngiLHRoaXMucXVldWUoZSxmdW5jdGlvbihlLHIpe3ZhciBvPW4uc2V0VGltZW91dChlLHQpO3Iuc3RvcD1mdW5jdGlvbigpe24uY2xlYXJUaW1lb3V0KG8pfX0pfSxmdW5jdGlvbigpe3ZhciB0PWEuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxlPWEuY3JlYXRlRWxlbWVudCgic2VsZWN0IikuYXBwZW5kQ2hpbGQoYS5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSk7dC50eXBlPSJjaGVja2JveCIseS5jaGVja09uPSIiIT09dC52YWx1ZSx5Lm9wdFNlbGVjdGVkPWUuc2VsZWN0ZWQsKHQ9YS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS52YWx1ZT0idCIsdC50eXBlPSJyYWRpbyIseS5yYWRpb1ZhbHVlPSJ0Ij09PXQudmFsdWV9KCk7dmFyIHZlLHllPVMuZXhwci5hdHRySGFuZGxlO1MuZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuICQodGhpcyxTLmF0dHIsdCxlLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe1MucmVtb3ZlQXR0cih0aGlzLHQpfSl9fSksUy5leHRlbmQoe2F0dHI6ZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saT10Lm5vZGVUeXBlO2lmKDMhPT1pJiY4IT09aSYmMiE9PWkpcmV0dXJuIHZvaWQgMD09PXQuZ2V0QXR0cmlidXRlP1MucHJvcCh0LGUsbik6KDE9PT1pJiZTLmlzWE1MRG9jKHQpfHwobz1TLmF0dHJIb29rc1tlLnRvTG93ZXJDYXNlKCldfHwoUy5leHByLm1hdGNoLmJvb2wudGVzdChlKT92ZTp2b2lkIDApKSx2b2lkIDAhPT1uP251bGw9PT1uP3ZvaWQgUy5yZW1vdmVBdHRyKHQsZSk6byYmInNldCJpbiBvJiZ2b2lkIDAhPT0ocj1vLnNldCh0LG4sZSkpP3I6KHQuc2V0QXR0cmlidXRlKGUsbisiIiksbik6byYmImdldCJpbiBvJiZudWxsIT09KHI9by5nZXQodCxlKSk/cjpudWxsPT0ocj1TLmZpbmQuYXR0cih0LGUpKT92b2lkIDA6cil9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKHQsZSl7aWYoIXkucmFkaW9WYWx1ZSYmInJhZGlvIj09PWUmJkwodCwiaW5wdXQiKSl7dmFyIG49dC52YWx1ZTtyZXR1cm4gdC5zZXRBdHRyaWJ1dGUoInR5cGUiLGUpLG4mJih0LnZhbHVlPW4pLGV9fX19LHJlbW92ZUF0dHI6ZnVuY3Rpb24odCxlKXt2YXIgbixyPTAsbz1lJiZlLm1hdGNoKFUpO2lmKG8mJjE9PT10Lm5vZGVUeXBlKWZvcig7bj1vW3IrK107KXQucmVtb3ZlQXR0cmlidXRlKG4pfX0pLHZlPXtzZXQ6ZnVuY3Rpb24odCxlLG4pe3JldHVybiExPT09ZT9TLnJlbW92ZUF0dHIodCxuKTp0LnNldEF0dHJpYnV0ZShuLG4pLG59fSxTLmVhY2goUy5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKC9cdysvZyksZnVuY3Rpb24odCxlKXt2YXIgbj15ZVtlXXx8Uy5maW5kLmF0dHI7eWVbZV09ZnVuY3Rpb24odCxlLHIpe3ZhciBvLGksYT1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHJ8fChpPXllW2FdLHllW2FdPW8sbz1udWxsIT1uKHQsZSxyKT9hOm51bGwseWVbYV09aSksb319KTt2YXIgbWU9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxiZT0vXig/OmF8YXJlYSkkL2k7ZnVuY3Rpb24geGUodCl7cmV0dXJuKHQubWF0Y2goVSl8fFtdKS5qb2luKCIgIil9ZnVuY3Rpb24gd2UodCl7cmV0dXJuIHQuZ2V0QXR0cmlidXRlJiZ0LmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiJ9ZnVuY3Rpb24ga2UodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dDoic3RyaW5nIj09dHlwZW9mIHQmJnQubWF0Y2goVSl8fFtdfVMuZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKHQsZSl7cmV0dXJuICQodGhpcyxTLnByb3AsdCxlLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW1MucHJvcEZpeFt0XXx8dF19KX19KSxTLmV4dGVuZCh7cHJvcDpmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpPXQubm9kZVR5cGU7aWYoMyE9PWkmJjghPT1pJiYyIT09aSlyZXR1cm4gMT09PWkmJlMuaXNYTUxEb2ModCl8fChlPVMucHJvcEZpeFtlXXx8ZSxvPVMucHJvcEhvb2tzW2VdKSx2b2lkIDAhPT1uP28mJiJzZXQiaW4gbyYmdm9pZCAwIT09KHI9by5zZXQodCxuLGUpKT9yOnRbZV09bjpvJiYiZ2V0ImluIG8mJm51bGwhPT0ocj1vLmdldCh0LGUpKT9yOnRbZV19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbih0KXt2YXIgZT1TLmZpbmQuYXR0cih0LCJ0YWJpbmRleCIpO3JldHVybiBlP3BhcnNlSW50KGUsMTApOm1lLnRlc3QodC5ub2RlTmFtZSl8fGJlLnRlc3QodC5ub2RlTmFtZSkmJnQuaHJlZj8wOi0xfX19LHByb3BGaXg6e2ZvcjoiaHRtbEZvciIsY2xhc3M6ImNsYXNzTmFtZSJ9fSkseS5vcHRTZWxlY3RlZHx8KFMucHJvcEhvb2tzLnNlbGVjdGVkPXtnZXQ6ZnVuY3Rpb24odCl7dmFyIGU9dC5wYXJlbnROb2RlO3JldHVybiBlJiZlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LG51bGx9LHNldDpmdW5jdGlvbih0KXt2YXIgZT10LnBhcmVudE5vZGU7ZSYmKGUuc2VsZWN0ZWRJbmRleCxlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KX19KSxTLmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe1MucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KSxTLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixyLG8saSxhLHMsdT0wO2lmKG0odCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLmFkZENsYXNzKHQuY2FsbCh0aGlzLGUsd2UodGhpcykpKX0pO2lmKChlPWtlKHQpKS5sZW5ndGgpZm9yKDtuPXRoaXNbdSsrXTspaWYobz13ZShuKSxyPTE9PT1uLm5vZGVUeXBlJiYiICIreGUobykrIiAiKXtmb3IoYT0wO2k9ZVthKytdOylyLmluZGV4T2YoIiAiK2krIiAiKTwwJiYocis9aSsiICIpO28hPT0ocz14ZShyKSkmJm4uc2V0QXR0cmlidXRlKCJjbGFzcyIscyl9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYSxzLHU9MDtpZihtKHQpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7Uyh0aGlzKS5yZW1vdmVDbGFzcyh0LmNhbGwodGhpcyxlLHdlKHRoaXMpKSl9KTtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5hdHRyKCJjbGFzcyIsIiIpO2lmKChlPWtlKHQpKS5sZW5ndGgpZm9yKDtuPXRoaXNbdSsrXTspaWYobz13ZShuKSxyPTE9PT1uLm5vZGVUeXBlJiYiICIreGUobykrIiAiKXtmb3IoYT0wO2k9ZVthKytdOylmb3IoO3IuaW5kZXhPZigiICIraSsiICIpPi0xOylyPXIucmVwbGFjZSgiICIraSsiICIsIiAiKTtvIT09KHM9eGUocikpJiZuLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHMpfXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbih0LGUpe3ZhciBuPXR5cGVvZiB0LHI9InN0cmluZyI9PT1ufHxBcnJheS5pc0FycmF5KHQpO3JldHVybiJib29sZWFuIj09dHlwZW9mIGUmJnI/ZT90aGlzLmFkZENsYXNzKHQpOnRoaXMucmVtb3ZlQ2xhc3ModCk6bSh0KT90aGlzLmVhY2goZnVuY3Rpb24obil7Uyh0aGlzKS50b2dnbGVDbGFzcyh0LmNhbGwodGhpcyxuLHdlKHRoaXMpLGUpLGUpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGUsbyxpLGE7aWYocilmb3Iobz0wLGk9Uyh0aGlzKSxhPWtlKHQpO2U9YVtvKytdOylpLmhhc0NsYXNzKGUpP2kucmVtb3ZlQ2xhc3MoZSk6aS5hZGRDbGFzcyhlKTtlbHNlIHZvaWQgMCE9PXQmJiJib29sZWFuIiE9PW58fCgoZT13ZSh0aGlzKSkmJlEuc2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iLGUpLHRoaXMuc2V0QXR0cmlidXRlJiZ0aGlzLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGV8fCExPT09dD8iIjpRLmdldCh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKSl9KX0saGFzQ2xhc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixyPTA7Zm9yKGU9IiAiK3QrIiAiO249dGhpc1tyKytdOylpZigxPT09bi5ub2RlVHlwZSYmKCIgIit4ZSh3ZShuKSkrIiAiKS5pbmRleE9mKGUpPi0xKXJldHVybiEwO3JldHVybiExfX0pO3ZhciBTZT0vXHIvZztTLmZuLmV4dGVuZCh7dmFsOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvPXRoaXNbMF07cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bSh0KSx0aGlzLmVhY2goZnVuY3Rpb24obil7dmFyIG87MT09PXRoaXMubm9kZVR5cGUmJihudWxsPT0obz1yP3QuY2FsbCh0aGlzLG4sUyh0aGlzKS52YWwoKSk6dCk/bz0iIjoibnVtYmVyIj09dHlwZW9mIG8/bys9IiI6QXJyYXkuaXNBcnJheShvKSYmKG89Uy5tYXAobyxmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD8iIjp0KyIifSkpLChlPVMudmFsSG9va3NbdGhpcy50eXBlXXx8Uy52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmInNldCJpbiBlJiZ2b2lkIDAhPT1lLnNldCh0aGlzLG8sInZhbHVlIil8fCh0aGlzLnZhbHVlPW8pKX0pKTpvPyhlPVMudmFsSG9va3Nbby50eXBlXXx8Uy52YWxIb29rc1tvLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmImdldCJpbiBlJiZ2b2lkIDAhPT0obj1lLmdldChvLCJ2YWx1ZSIpKT9uOiJzdHJpbmciPT10eXBlb2Yobj1vLnZhbHVlKT9uLnJlcGxhY2UoU2UsIiIpOm51bGw9PW4/IiI6bjp2b2lkIDB9fSksUy5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbih0KXt2YXIgZT1TLmZpbmQuYXR0cih0LCJ2YWx1ZSIpO3JldHVybiBudWxsIT1lP2U6eGUoUy50ZXh0KHQpKX19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvPXQub3B0aW9ucyxpPXQuc2VsZWN0ZWRJbmRleCxhPSJzZWxlY3Qtb25lIj09PXQudHlwZSxzPWE/bnVsbDpbXSx1PWE/aSsxOm8ubGVuZ3RoO2ZvcihyPWk8MD91OmE/aTowO3I8dTtyKyspaWYoKChuPW9bcl0pLnNlbGVjdGVkfHxyPT09aSkmJiFuLmRpc2FibGVkJiYoIW4ucGFyZW50Tm9kZS5kaXNhYmxlZHx8IUwobi5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYoZT1TKG4pLnZhbCgpLGEpcmV0dXJuIGU7cy5wdXNoKGUpfXJldHVybiBzfSxzZXQ6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4scixvPXQub3B0aW9ucyxpPVMubWFrZUFycmF5KGUpLGE9by5sZW5ndGg7YS0tOykoKHI9b1thXSkuc2VsZWN0ZWQ9Uy5pbkFycmF5KFMudmFsSG9va3Mub3B0aW9uLmdldChyKSxpKT4tMSkmJihuPSEwKTtyZXR1cm4gbnx8KHQuc2VsZWN0ZWRJbmRleD0tMSksaX19fX0pLFMuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe1MudmFsSG9va3NbdGhpc109e3NldDpmdW5jdGlvbih0LGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIHQuY2hlY2tlZD1TLmluQXJyYXkoUyh0KS52YWwoKSxlKT4tMX19LHkuY2hlY2tPbnx8KFMudmFsSG9va3NbdGhpc10uZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dC5nZXRBdHRyaWJ1dGUoInZhbHVlIik/Im9uIjp0LnZhbHVlfSl9KSx5LmZvY3VzaW49Im9uZm9jdXNpbiJpbiBuO3ZhciBFZT0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8samU9ZnVuY3Rpb24odCl7dC5zdG9wUHJvcGFnYXRpb24oKX07Uy5leHRlbmQoUy5ldmVudCx7dHJpZ2dlcjpmdW5jdGlvbih0LGUscixvKXt2YXIgaSxzLHUsYyxsLGYscCxoLGc9W3J8fGFdLHY9ZC5jYWxsKHQsInR5cGUiKT90LnR5cGU6dCx5PWQuY2FsbCh0LCJuYW1lc3BhY2UiKT90Lm5hbWVzcGFjZS5zcGxpdCgiLiIpOltdO2lmKHM9aD11PXI9cnx8YSwzIT09ci5ub2RlVHlwZSYmOCE9PXIubm9kZVR5cGUmJiFFZS50ZXN0KHYrUy5ldmVudC50cmlnZ2VyZWQpJiYodi5pbmRleE9mKCIuIik+LTEmJih5PXYuc3BsaXQoIi4iKSx2PXkuc2hpZnQoKSx5LnNvcnQoKSksbD12LmluZGV4T2YoIjoiKTwwJiYib24iK3YsKHQ9dFtTLmV4cGFuZG9dP3Q6bmV3IFMuRXZlbnQodiwib2JqZWN0Ij09dHlwZW9mIHQmJnQpKS5pc1RyaWdnZXI9bz8yOjMsdC5uYW1lc3BhY2U9eS5qb2luKCIuIiksdC5ybmFtZXNwYWNlPXQubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK3kuam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCx0LnJlc3VsdD12b2lkIDAsdC50YXJnZXR8fCh0LnRhcmdldD1yKSxlPW51bGw9PWU/W3RdOlMubWFrZUFycmF5KGUsW3RdKSxwPVMuZXZlbnQuc3BlY2lhbFt2XXx8e30sb3x8IXAudHJpZ2dlcnx8ITEhPT1wLnRyaWdnZXIuYXBwbHkocixlKSkpe2lmKCFvJiYhcC5ub0J1YmJsZSYmIWIocikpe2ZvcihjPXAuZGVsZWdhdGVUeXBlfHx2LEVlLnRlc3QoYyt2KXx8KHM9cy5wYXJlbnROb2RlKTtzO3M9cy5wYXJlbnROb2RlKWcucHVzaChzKSx1PXM7dT09PShyLm93bmVyRG9jdW1lbnR8fGEpJiZnLnB1c2godS5kZWZhdWx0Vmlld3x8dS5wYXJlbnRXaW5kb3d8fG4pfWZvcihpPTA7KHM9Z1tpKytdKSYmIXQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTspaD1zLHQudHlwZT1pPjE/YzpwLmJpbmRUeXBlfHx2LChmPShRLmdldChzLCJldmVudHMiKXx8e30pW3QudHlwZV0mJlEuZ2V0KHMsImhhbmRsZSIpKSYmZi5hcHBseShzLGUpLChmPWwmJnNbbF0pJiZmLmFwcGx5JiZYKHMpJiYodC5yZXN1bHQ9Zi5hcHBseShzLGUpLCExPT09dC5yZXN1bHQmJnQucHJldmVudERlZmF1bHQoKSk7cmV0dXJuIHQudHlwZT12LG98fHQuaXNEZWZhdWx0UHJldmVudGVkKCl8fHAuX2RlZmF1bHQmJiExIT09cC5fZGVmYXVsdC5hcHBseShnLnBvcCgpLGUpfHwhWChyKXx8bCYmbShyW3ZdKSYmIWIocikmJigodT1yW2xdKSYmKHJbbF09bnVsbCksUy5ldmVudC50cmlnZ2VyZWQ9dix0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmguYWRkRXZlbnRMaXN0ZW5lcih2LGplKSxyW3ZdKCksdC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpJiZoLnJlbW92ZUV2ZW50TGlzdGVuZXIodixqZSksUy5ldmVudC50cmlnZ2VyZWQ9dm9pZCAwLHUmJihyW2xdPXUpKSx0LnJlc3VsdH19LHNpbXVsYXRlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1TLmV4dGVuZChuZXcgUy5FdmVudCxuLHt0eXBlOnQsaXNTaW11bGF0ZWQ6ITB9KTtTLmV2ZW50LnRyaWdnZXIocixudWxsLGUpfX0pLFMuZm4uZXh0ZW5kKHt0cmlnZ2VyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe1MuZXZlbnQudHJpZ2dlcih0LGUsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzWzBdO2lmKG4pcmV0dXJuIFMuZXZlbnQudHJpZ2dlcih0LGUsbiwhMCl9fSkseS5mb2N1c2lufHxTLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKHQsZSl7dmFyIG49ZnVuY3Rpb24odCl7Uy5ldmVudC5zaW11bGF0ZShlLHQudGFyZ2V0LFMuZXZlbnQuZml4KHQpKX07Uy5ldmVudC5zcGVjaWFsW2VdPXtzZXR1cDpmdW5jdGlvbigpe3ZhciByPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxvPVEuYWNjZXNzKHIsZSk7b3x8ci5hZGRFdmVudExpc3RlbmVyKHQsbiwhMCksUS5hY2Nlc3MocixlLChvfHwwKSsxKX0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgcj10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsbz1RLmFjY2VzcyhyLGUpLTE7bz9RLmFjY2VzcyhyLGUsbyk6KHIucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4sITApLFEucmVtb3ZlKHIsZSkpfX19KTt2YXIgVGU9bi5sb2NhdGlvbixPZT1EYXRlLm5vdygpLEFlPS9cPy87Uy5wYXJzZVhNTD1mdW5jdGlvbih0KXt2YXIgZTtpZighdHx8InN0cmluZyIhPXR5cGVvZiB0KXJldHVybiBudWxsO3RyeXtlPShuZXcgbi5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyh0LCJ0ZXh0L3htbCIpfWNhdGNoKHQpe2U9dm9pZCAwfXJldHVybiBlJiYhZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGh8fFMuZXJyb3IoIkludmFsaWQgWE1MOiAiK3QpLGV9O3ZhciBDZT0vXFtcXSQvLExlPS9ccj9cbi9nLFJlPS9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSxQZT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7ZnVuY3Rpb24gTmUodCxlLG4scil7dmFyIG87aWYoQXJyYXkuaXNBcnJheShlKSlTLmVhY2goZSxmdW5jdGlvbihlLG8pe258fENlLnRlc3QodCk/cih0LG8pOk5lKHQrIlsiKygib2JqZWN0Ij09dHlwZW9mIG8mJm51bGwhPW8/ZToiIikrIl0iLG8sbixyKX0pO2Vsc2UgaWYobnx8Im9iamVjdCIhPT1rKGUpKXIodCxlKTtlbHNlIGZvcihvIGluIGUpTmUodCsiWyIrbysiXSIsZVtvXSxuLHIpfVMucGFyYW09ZnVuY3Rpb24odCxlKXt2YXIgbixyPVtdLG89ZnVuY3Rpb24odCxlKXt2YXIgbj1tKGUpP2UoKTplO3Jbci5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudCh0KSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KG51bGw9PW4/IiI6bil9O2lmKG51bGw9PXQpcmV0dXJuIiI7aWYoQXJyYXkuaXNBcnJheSh0KXx8dC5qcXVlcnkmJiFTLmlzUGxhaW5PYmplY3QodCkpUy5lYWNoKHQsZnVuY3Rpb24oKXtvKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKG4gaW4gdClOZShuLHRbbl0sZSxvKTtyZXR1cm4gci5qb2luKCImIil9LFMuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gUy5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciB0PVMucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiB0P1MubWFrZUFycmF5KHQpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgdD10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIVModGhpcykuaXMoIjpkaXNhYmxlZCIpJiZQZS50ZXN0KHRoaXMubm9kZU5hbWUpJiYhUmUudGVzdCh0KSYmKHRoaXMuY2hlY2tlZHx8IWd0LnRlc3QodCkpfSkubWFwKGZ1bmN0aW9uKHQsZSl7dmFyIG49Uyh0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09bj9udWxsOkFycmF5LmlzQXJyYXkobik/Uy5tYXAobixmdW5jdGlvbih0KXtyZXR1cm57bmFtZTplLm5hbWUsdmFsdWU6dC5yZXBsYWNlKExlLCJcclxuIil9fSk6e25hbWU6ZS5uYW1lLHZhbHVlOm4ucmVwbGFjZShMZSwiXHJcbiIpfX0pLmdldCgpfX0pO3ZhciBJZT0vJTIwL2csX2U9LyMuKiQvLERlPS8oWz8mXSlfPVteJl0qLyxNZT0vXiguKj8pOlsgXHRdKihbXlxyXG5dKikkL2dtLFVlPS9eKD86R0VUfEhFQUQpJC8sQmU9L15cL1wvLyxxZT17fSxGZT17fSxIZT0iKi8iLmNvbmNhdCgiKiIpLHplPWEuY3JlYXRlRWxlbWVudCgiYSIpO2Z1bmN0aW9uIFdlKHQpe3JldHVybiBmdW5jdGlvbihlLG4peyJzdHJpbmciIT10eXBlb2YgZSYmKG49ZSxlPSIqIik7dmFyIHIsbz0wLGk9ZS50b0xvd2VyQ2FzZSgpLm1hdGNoKFUpfHxbXTtpZihtKG4pKWZvcig7cj1pW28rK107KSIrIj09PXJbMF0/KHI9ci5zbGljZSgxKXx8IioiLCh0W3JdPXRbcl18fFtdKS51bnNoaWZ0KG4pKToodFtyXT10W3JdfHxbXSkucHVzaChuKX19ZnVuY3Rpb24gJGUodCxlLG4scil7dmFyIG89e30saT10PT09RmU7ZnVuY3Rpb24gYShzKXt2YXIgdTtyZXR1cm4gb1tzXT0hMCxTLmVhY2godFtzXXx8W10sZnVuY3Rpb24odCxzKXt2YXIgYz1zKGUsbixyKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGN8fGl8fG9bY10/aT8hKHU9Yyk6dm9pZCAwOihlLmRhdGFUeXBlcy51bnNoaWZ0KGMpLGEoYyksITEpfSksdX1yZXR1cm4gYShlLmRhdGFUeXBlc1swXSl8fCFvWyIqIl0mJmEoIioiKX1mdW5jdGlvbiBZZSh0LGUpe3ZhciBuLHIsbz1TLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKG4gaW4gZSl2b2lkIDAhPT1lW25dJiYoKG9bbl0/dDpyfHwocj17fSkpW25dPWVbbl0pO3JldHVybiByJiZTLmV4dGVuZCghMCx0LHIpLHR9emUuaHJlZj1UZS5ocmVmLFMuZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fSxhamF4U2V0dGluZ3M6e3VybDpUZS5ocmVmLHR5cGU6IkdFVCIsaXNMb2NhbDovXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLy50ZXN0KFRlLnByb3RvY29sKSxnbG9iYWw6ITAscHJvY2Vzc0RhdGE6ITAsYXN5bmM6ITAsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsYWNjZXB0czp7IioiOkhlLHRleHQ6InRleHQvcGxhaW4iLGh0bWw6InRleHQvaHRtbCIseG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQifSxjb250ZW50czp7eG1sOi9cYnhtbFxiLyxodG1sOi9cYmh0bWwvLGpzb246L1xianNvblxiL30scmVzcG9uc2VGaWVsZHM6e3htbDoicmVzcG9uc2VYTUwiLHRleHQ6InJlc3BvbnNlVGV4dCIsanNvbjoicmVzcG9uc2VKU09OIn0sY29udmVydGVyczp7IiogdGV4dCI6U3RyaW5nLCJ0ZXh0IGh0bWwiOiEwLCJ0ZXh0IGpzb24iOkpTT04ucGFyc2UsInRleHQgeG1sIjpTLnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7dXJsOiEwLGNvbnRleHQ6ITB9fSxhamF4U2V0dXA6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT9ZZShZZSh0LFMuYWpheFNldHRpbmdzKSxlKTpZZShTLmFqYXhTZXR0aW5ncyx0KX0sYWpheFByZWZpbHRlcjpXZShxZSksYWpheFRyYW5zcG9ydDpXZShGZSksYWpheDpmdW5jdGlvbih0LGUpeyJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksZT1lfHx7fTt2YXIgcixvLGkscyx1LGMsbCxmLHAsaCxkPVMuYWpheFNldHVwKHt9LGUpLGc9ZC5jb250ZXh0fHxkLHY9ZC5jb250ZXh0JiYoZy5ub2RlVHlwZXx8Zy5qcXVlcnkpP1MoZyk6Uy5ldmVudCx5PVMuRGVmZXJyZWQoKSxtPVMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGI9ZC5zdGF0dXNDb2RlfHx7fSx4PXt9LHc9e30saz0iY2FuY2VsZWQiLEU9e3JlYWR5U3RhdGU6MCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbih0KXt2YXIgZTtpZihsKXtpZighcylmb3Iocz17fTtlPU1lLmV4ZWMoaSk7KXNbZVsxXS50b0xvd2VyQ2FzZSgpKyIgIl09KHNbZVsxXS50b0xvd2VyQ2FzZSgpKyIgIl18fFtdKS5jb25jYXQoZVsyXSk7ZT1zW3QudG9Mb3dlckNhc2UoKSsiICJdfXJldHVybiBudWxsPT1lP251bGw6ZS5qb2luKCIsICIpfSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gbD9pOm51bGx9LHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09bCYmKHQ9d1t0LnRvTG93ZXJDYXNlKCldPXdbdC50b0xvd2VyQ2FzZSgpXXx8dCx4W3RdPWUpLHRoaXN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PWwmJihkLm1pbWVUeXBlPXQpLHRoaXN9LHN0YXR1c0NvZGU6ZnVuY3Rpb24odCl7dmFyIGU7aWYodClpZihsKUUuYWx3YXlzKHRbRS5zdGF0dXNdKTtlbHNlIGZvcihlIGluIHQpYltlXT1bYltlXSx0W2VdXTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24odCl7dmFyIGU9dHx8aztyZXR1cm4gciYmci5hYm9ydChlKSxqKDAsZSksdGhpc319O2lmKHkucHJvbWlzZShFKSxkLnVybD0oKHR8fGQudXJsfHxUZS5ocmVmKSsiIikucmVwbGFjZShCZSxUZS5wcm90b2NvbCsiLy8iKSxkLnR5cGU9ZS5tZXRob2R8fGUudHlwZXx8ZC5tZXRob2R8fGQudHlwZSxkLmRhdGFUeXBlcz0oZC5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLm1hdGNoKFUpfHxbIiJdLG51bGw9PWQuY3Jvc3NEb21haW4pe2M9YS5jcmVhdGVFbGVtZW50KCJhIik7dHJ5e2MuaHJlZj1kLnVybCxjLmhyZWY9Yy5ocmVmLGQuY3Jvc3NEb21haW49emUucHJvdG9jb2wrIi8vIit6ZS5ob3N0IT1jLnByb3RvY29sKyIvLyIrYy5ob3N0fWNhdGNoKHQpe2QuY3Jvc3NEb21haW49ITB9fWlmKGQuZGF0YSYmZC5wcm9jZXNzRGF0YSYmInN0cmluZyIhPXR5cGVvZiBkLmRhdGEmJihkLmRhdGE9Uy5wYXJhbShkLmRhdGEsZC50cmFkaXRpb25hbCkpLCRlKHFlLGQsZSxFKSxsKXJldHVybiBFO2ZvcihwIGluKGY9Uy5ldmVudCYmZC5nbG9iYWwpJiYwPT1TLmFjdGl2ZSsrJiZTLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLGQudHlwZT1kLnR5cGUudG9VcHBlckNhc2UoKSxkLmhhc0NvbnRlbnQ9IVVlLnRlc3QoZC50eXBlKSxvPWQudXJsLnJlcGxhY2UoX2UsIiIpLGQuaGFzQ29udGVudD9kLmRhdGEmJmQucHJvY2Vzc0RhdGEmJjA9PT0oZC5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiYoZC5kYXRhPWQuZGF0YS5yZXBsYWNlKEllLCIrIikpOihoPWQudXJsLnNsaWNlKG8ubGVuZ3RoKSxkLmRhdGEmJihkLnByb2Nlc3NEYXRhfHwic3RyaW5nIj09dHlwZW9mIGQuZGF0YSkmJihvKz0oQWUudGVzdChvKT8iJiI6Ij8iKStkLmRhdGEsZGVsZXRlIGQuZGF0YSksITE9PT1kLmNhY2hlJiYobz1vLnJlcGxhY2UoRGUsIiQxIiksaD0oQWUudGVzdChvKT8iJiI6Ij8iKSsiXz0iK09lKysraCksZC51cmw9bytoKSxkLmlmTW9kaWZpZWQmJihTLmxhc3RNb2RpZmllZFtvXSYmRS5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsUy5sYXN0TW9kaWZpZWRbb10pLFMuZXRhZ1tvXSYmRS5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixTLmV0YWdbb10pKSwoZC5kYXRhJiZkLmhhc0NvbnRlbnQmJiExIT09ZC5jb250ZW50VHlwZXx8ZS5jb250ZW50VHlwZSkmJkUuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixkLmNvbnRlbnRUeXBlKSxFLnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsZC5kYXRhVHlwZXNbMF0mJmQuYWNjZXB0c1tkLmRhdGFUeXBlc1swXV0/ZC5hY2NlcHRzW2QuZGF0YVR5cGVzWzBdXSsoIioiIT09ZC5kYXRhVHlwZXNbMF0/IiwgIitIZSsiOyBxPTAuMDEiOiIiKTpkLmFjY2VwdHNbIioiXSksZC5oZWFkZXJzKUUuc2V0UmVxdWVzdEhlYWRlcihwLGQuaGVhZGVyc1twXSk7aWYoZC5iZWZvcmVTZW5kJiYoITE9PT1kLmJlZm9yZVNlbmQuY2FsbChnLEUsZCl8fGwpKXJldHVybiBFLmFib3J0KCk7aWYoaz0iYWJvcnQiLG0uYWRkKGQuY29tcGxldGUpLEUuZG9uZShkLnN1Y2Nlc3MpLEUuZmFpbChkLmVycm9yKSxyPSRlKEZlLGQsZSxFKSl7aWYoRS5yZWFkeVN0YXRlPTEsZiYmdi50cmlnZ2VyKCJhamF4U2VuZCIsW0UsZF0pLGwpcmV0dXJuIEU7ZC5hc3luYyYmZC50aW1lb3V0PjAmJih1PW4uc2V0VGltZW91dChmdW5jdGlvbigpe0UuYWJvcnQoInRpbWVvdXQiKX0sZC50aW1lb3V0KSk7dHJ5e2w9ITEsci5zZW5kKHgsail9Y2F0Y2godCl7aWYobCl0aHJvdyB0O2ooLTEsdCl9fWVsc2UgaigtMSwiTm8gVHJhbnNwb3J0Iik7ZnVuY3Rpb24gaih0LGUsYSxzKXt2YXIgYyxwLGgseCx3LGs9ZTtsfHwobD0hMCx1JiZuLmNsZWFyVGltZW91dCh1KSxyPXZvaWQgMCxpPXN8fCIiLEUucmVhZHlTdGF0ZT10PjA/NDowLGM9dD49MjAwJiZ0PDMwMHx8MzA0PT09dCxhJiYoeD1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByLG8saSxhLHM9dC5jb250ZW50cyx1PXQuZGF0YVR5cGVzOyIqIj09PXVbMF07KXUuc2hpZnQoKSx2b2lkIDA9PT1yJiYocj10Lm1pbWVUeXBlfHxlLmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKSk7aWYocilmb3IobyBpbiBzKWlmKHNbb10mJnNbb10udGVzdChyKSl7dS51bnNoaWZ0KG8pO2JyZWFrfWlmKHVbMF1pbiBuKWk9dVswXTtlbHNle2ZvcihvIGluIG4pe2lmKCF1WzBdfHx0LmNvbnZlcnRlcnNbbysiICIrdVswXV0pe2k9bzticmVha31hfHwoYT1vKX1pPWl8fGF9aWYoaSlyZXR1cm4gaSE9PXVbMF0mJnUudW5zaGlmdChpKSxuW2ldfShkLEUsYSkpLHg9ZnVuY3Rpb24odCxlLG4scil7dmFyIG8saSxhLHMsdSxjPXt9LGw9dC5kYXRhVHlwZXMuc2xpY2UoKTtpZihsWzFdKWZvcihhIGluIHQuY29udmVydGVycyljW2EudG9Mb3dlckNhc2UoKV09dC5jb252ZXJ0ZXJzW2FdO2ZvcihpPWwuc2hpZnQoKTtpOylpZih0LnJlc3BvbnNlRmllbGRzW2ldJiYoblt0LnJlc3BvbnNlRmllbGRzW2ldXT1lKSwhdSYmciYmdC5kYXRhRmlsdGVyJiYoZT10LmRhdGFGaWx0ZXIoZSx0LmRhdGFUeXBlKSksdT1pLGk9bC5zaGlmdCgpKWlmKCIqIj09PWkpaT11O2Vsc2UgaWYoIioiIT09dSYmdSE9PWkpe2lmKCEoYT1jW3UrIiAiK2ldfHxjWyIqICIraV0pKWZvcihvIGluIGMpaWYoKHM9by5zcGxpdCgiICIpKVsxXT09PWkmJihhPWNbdSsiICIrc1swXV18fGNbIiogIitzWzBdXSkpeyEwPT09YT9hPWNbb106ITAhPT1jW29dJiYoaT1zWzBdLGwudW5zaGlmdChzWzFdKSk7YnJlYWt9aWYoITAhPT1hKWlmKGEmJnQudGhyb3dzKWU9YShlKTtlbHNlIHRyeXtlPWEoZSl9Y2F0Y2godCl7cmV0dXJue3N0YXRlOiJwYXJzZXJlcnJvciIsZXJyb3I6YT90OiJObyBjb252ZXJzaW9uIGZyb20gIit1KyIgdG8gIitpfX19cmV0dXJue3N0YXRlOiJzdWNjZXNzIixkYXRhOmV9fShkLHgsRSxjKSxjPyhkLmlmTW9kaWZpZWQmJigodz1FLmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIikpJiYoUy5sYXN0TW9kaWZpZWRbb109dyksKHc9RS5nZXRSZXNwb25zZUhlYWRlcigiZXRhZyIpKSYmKFMuZXRhZ1tvXT13KSksMjA0PT09dHx8IkhFQUQiPT09ZC50eXBlP2s9Im5vY29udGVudCI6MzA0PT09dD9rPSJub3Rtb2RpZmllZCI6KGs9eC5zdGF0ZSxwPXguZGF0YSxjPSEoaD14LmVycm9yKSkpOihoPWssIXQmJmt8fChrPSJlcnJvciIsdDwwJiYodD0wKSkpLEUuc3RhdHVzPXQsRS5zdGF0dXNUZXh0PShlfHxrKSsiIixjP3kucmVzb2x2ZVdpdGgoZyxbcCxrLEVdKTp5LnJlamVjdFdpdGgoZyxbRSxrLGhdKSxFLnN0YXR1c0NvZGUoYiksYj12b2lkIDAsZiYmdi50cmlnZ2VyKGM/ImFqYXhTdWNjZXNzIjoiYWpheEVycm9yIixbRSxkLGM/cDpoXSksbS5maXJlV2l0aChnLFtFLGtdKSxmJiYodi50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFtFLGRdKSwtLVMuYWN0aXZlfHxTLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpKX1yZXR1cm4gRX0sZ2V0SlNPTjpmdW5jdGlvbih0LGUsbil7cmV0dXJuIFMuZ2V0KHQsZSxuLCJqc29uIil9LGdldFNjcmlwdDpmdW5jdGlvbih0LGUpe3JldHVybiBTLmdldCh0LHZvaWQgMCxlLCJzY3JpcHQiKX19KSxTLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24odCxlKXtTW2VdPWZ1bmN0aW9uKHQsbixyLG8pe3JldHVybiBtKG4pJiYobz1vfHxyLHI9bixuPXZvaWQgMCksUy5hamF4KFMuZXh0ZW5kKHt1cmw6dCx0eXBlOmUsZGF0YVR5cGU6byxkYXRhOm4sc3VjY2VzczpyfSxTLmlzUGxhaW5PYmplY3QodCkmJnQpKX19KSxTLl9ldmFsVXJsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFMuYWpheCh7dXJsOnQsdHlwZToiR0VUIixkYXRhVHlwZToic2NyaXB0IixjYWNoZTohMCxhc3luYzohMSxnbG9iYWw6ITEsY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbigpe319LGRhdGFGaWx0ZXI6ZnVuY3Rpb24odCl7Uy5nbG9iYWxFdmFsKHQsZSl9fSl9LFMuZm4uZXh0ZW5kKHt3cmFwQWxsOmZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiB0aGlzWzBdJiYobSh0KSYmKHQ9dC5jYWxsKHRoaXNbMF0pKSxlPVModCx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSx0aGlzWzBdLnBhcmVudE5vZGUmJmUuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGUubWFwKGZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXM7dC5maXJzdEVsZW1lbnRDaGlsZDspdD10LmZpcnN0RWxlbWVudENoaWxkO3JldHVybiB0fSkuYXBwZW5kKHRoaXMpKSx0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG0odCk/dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe1ModGhpcykud3JhcElubmVyKHQuY2FsbCh0aGlzLGUpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlPVModGhpcyksbj1lLmNvbnRlbnRzKCk7bi5sZW5ndGg/bi53cmFwQWxsKHQpOmUuYXBwZW5kKHQpfSl9LHdyYXA6ZnVuY3Rpb24odCl7dmFyIGU9bSh0KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe1ModGhpcykud3JhcEFsbChlP3QuY2FsbCh0aGlzLG4pOnQpfSl9LHVud3JhcDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wYXJlbnQodCkubm90KCJib2R5IikuZWFjaChmdW5jdGlvbigpe1ModGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLHRoaXN9fSksUy5leHByLnBzZXVkb3MuaGlkZGVuPWZ1bmN0aW9uKHQpe3JldHVybiFTLmV4cHIucHNldWRvcy52aXNpYmxlKHQpfSxTLmV4cHIucHNldWRvcy52aXNpYmxlPWZ1bmN0aW9uKHQpe3JldHVybiEhKHQub2Zmc2V0V2lkdGh8fHQub2Zmc2V0SGVpZ2h0fHx0LmdldENsaWVudFJlY3RzKCkubGVuZ3RoKX0sUy5hamF4U2V0dGluZ3MueGhyPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBuZXcgbi5YTUxIdHRwUmVxdWVzdH1jYXRjaCh0KXt9fTt2YXIgVmU9ezA6MjAwLDEyMjM6MjA0fSxHZT1TLmFqYXhTZXR0aW5ncy54aHIoKTt5LmNvcnM9ISFHZSYmIndpdGhDcmVkZW50aWFscyJpbiBHZSx5LmFqYXg9R2U9ISFHZSxTLmFqYXhUcmFuc3BvcnQoZnVuY3Rpb24odCl7dmFyIGUscjtpZih5LmNvcnN8fEdlJiYhdC5jcm9zc0RvbWFpbilyZXR1cm57c2VuZDpmdW5jdGlvbihvLGkpe3ZhciBhLHM9dC54aHIoKTtpZihzLm9wZW4odC50eXBlLHQudXJsLHQuYXN5bmMsdC51c2VybmFtZSx0LnBhc3N3b3JkKSx0LnhockZpZWxkcylmb3IoYSBpbiB0LnhockZpZWxkcylzW2FdPXQueGhyRmllbGRzW2FdO2ZvcihhIGluIHQubWltZVR5cGUmJnMub3ZlcnJpZGVNaW1lVHlwZSYmcy5vdmVycmlkZU1pbWVUeXBlKHQubWltZVR5cGUpLHQuY3Jvc3NEb21haW58fG9bIlgtUmVxdWVzdGVkLVdpdGgiXXx8KG9bIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKSxvKXMuc2V0UmVxdWVzdEhlYWRlcihhLG9bYV0pO2U9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7ZSYmKGU9cj1zLm9ubG9hZD1zLm9uZXJyb3I9cy5vbmFib3J0PXMub250aW1lb3V0PXMub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsImFib3J0Ij09PXQ/cy5hYm9ydCgpOiJlcnJvciI9PT10PyJudW1iZXIiIT10eXBlb2Ygcy5zdGF0dXM/aSgwLCJlcnJvciIpOmkocy5zdGF0dXMscy5zdGF0dXNUZXh0KTppKFZlW3Muc3RhdHVzXXx8cy5zdGF0dXMscy5zdGF0dXNUZXh0LCJ0ZXh0IiE9PShzLnJlc3BvbnNlVHlwZXx8InRleHQiKXx8InN0cmluZyIhPXR5cGVvZiBzLnJlc3BvbnNlVGV4dD97YmluYXJ5OnMucmVzcG9uc2V9Ont0ZXh0OnMucmVzcG9uc2VUZXh0fSxzLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSl9fSxzLm9ubG9hZD1lKCkscj1zLm9uZXJyb3I9cy5vbnRpbWVvdXQ9ZSgiZXJyb3IiKSx2b2lkIDAhPT1zLm9uYWJvcnQ/cy5vbmFib3J0PXI6cy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXs0PT09cy5yZWFkeVN0YXRlJiZuLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlJiZyKCl9KX0sZT1lKCJhYm9ydCIpO3RyeXtzLnNlbmQodC5oYXNDb250ZW50JiZ0LmRhdGF8fG51bGwpfWNhdGNoKHQpe2lmKGUpdGhyb3cgdH19LGFib3J0OmZ1bmN0aW9uKCl7ZSYmZSgpfX19KSxTLmFqYXhQcmVmaWx0ZXIoZnVuY3Rpb24odCl7dC5jcm9zc0RvbWFpbiYmKHQuY29udGVudHMuc2NyaXB0PSExKX0pLFMuYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovXGIoPzpqYXZhfGVjbWEpc2NyaXB0XGIvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKHQpe3JldHVybiBTLmdsb2JhbEV2YWwodCksdH19fSksUy5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKHQpe3ZvaWQgMD09PXQuY2FjaGUmJih0LmNhY2hlPSExKSx0LmNyb3NzRG9tYWluJiYodC50eXBlPSJHRVQiKX0pLFMuYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbih0KXt2YXIgZSxuO2lmKHQuY3Jvc3NEb21haW58fHQuc2NyaXB0QXR0cnMpcmV0dXJue3NlbmQ6ZnVuY3Rpb24ocixvKXtlPVMoIjxzY3JpcHQ+IikuYXR0cih0LnNjcmlwdEF0dHJzfHx7fSkucHJvcCh7Y2hhcnNldDp0LnNjcmlwdENoYXJzZXQsc3JjOnQudXJsfSkub24oImxvYWQgZXJyb3IiLG49ZnVuY3Rpb24odCl7ZS5yZW1vdmUoKSxuPW51bGwsdCYmbygiZXJyb3IiPT09dC50eXBlPzQwNDoyMDAsdC50eXBlKX0pLGEuaGVhZC5hcHBlbmRDaGlsZChlWzBdKX0sYWJvcnQ6ZnVuY3Rpb24oKXtuJiZuKCl9fX0pO3ZhciBLZSxYZT1bXSxKZT0vKD0pXD8oPz0mfCQpfFw/XD8vO1MuYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXt2YXIgdD1YZS5wb3AoKXx8Uy5leHBhbmRvKyJfIitPZSsrO3JldHVybiB0aGlzW3RdPSEwLHR9fSksUy5hamF4UHJlZmlsdGVyKCJqc29uIGpzb25wIixmdW5jdGlvbih0LGUscil7dmFyIG8saSxhLHM9ITEhPT10Lmpzb25wJiYoSmUudGVzdCh0LnVybCk/InVybCI6InN0cmluZyI9PXR5cGVvZiB0LmRhdGEmJjA9PT0odC5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiZKZS50ZXN0KHQuZGF0YSkmJiJkYXRhIik7aWYoc3x8Impzb25wIj09PXQuZGF0YVR5cGVzWzBdKXJldHVybiBvPXQuanNvbnBDYWxsYmFjaz1tKHQuanNvbnBDYWxsYmFjayk/dC5qc29ucENhbGxiYWNrKCk6dC5qc29ucENhbGxiYWNrLHM/dFtzXT10W3NdLnJlcGxhY2UoSmUsIiQxIitvKTohMSE9PXQuanNvbnAmJih0LnVybCs9KEFlLnRlc3QodC51cmwpPyImIjoiPyIpK3QuanNvbnArIj0iK28pLHQuY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe3JldHVybiBhfHxTLmVycm9yKG8rIiB3YXMgbm90IGNhbGxlZCIpLGFbMF19LHQuZGF0YVR5cGVzWzBdPSJqc29uIixpPW5bb10sbltvXT1mdW5jdGlvbigpe2E9YXJndW1lbnRzfSxyLmFsd2F5cyhmdW5jdGlvbigpe3ZvaWQgMD09PWk/UyhuKS5yZW1vdmVQcm9wKG8pOm5bb109aSx0W29dJiYodC5qc29ucENhbGxiYWNrPWUuanNvbnBDYWxsYmFjayxYZS5wdXNoKG8pKSxhJiZtKGkpJiZpKGFbMF0pLGE9aT12b2lkIDB9KSwic2NyaXB0In0pLHkuY3JlYXRlSFRNTERvY3VtZW50PSgoS2U9YS5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpLmJvZHkpLmlubmVySFRNTD0iPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT4iLDI9PT1LZS5jaGlsZE5vZGVzLmxlbmd0aCksUy5wYXJzZUhUTUw9ZnVuY3Rpb24odCxlLG4pe3JldHVybiJzdHJpbmciIT10eXBlb2YgdD9bXTooImJvb2xlYW4iPT10eXBlb2YgZSYmKG49ZSxlPSExKSxlfHwoeS5jcmVhdGVIVE1MRG9jdW1lbnQ/KChyPShlPWEuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKSkuY3JlYXRlRWxlbWVudCgiYmFzZSIpKS5ocmVmPWEubG9jYXRpb24uaHJlZixlLmhlYWQuYXBwZW5kQ2hpbGQocikpOmU9YSksaT0hbiYmW10sKG89Ui5leGVjKHQpKT9bZS5jcmVhdGVFbGVtZW50KG9bMV0pXToobz1FdChbdF0sZSxpKSxpJiZpLmxlbmd0aCYmUyhpKS5yZW1vdmUoKSxTLm1lcmdlKFtdLG8uY2hpbGROb2RlcykpKTt2YXIgcixvLGl9LFMuZm4ubG9hZD1mdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGE9dGhpcyxzPXQuaW5kZXhPZigiICIpO3JldHVybiBzPi0xJiYocj14ZSh0LnNsaWNlKHMpKSx0PXQuc2xpY2UoMCxzKSksbShlKT8obj1lLGU9dm9pZCAwKTplJiYib2JqZWN0Ij09dHlwZW9mIGUmJihvPSJQT1NUIiksYS5sZW5ndGg+MCYmUy5hamF4KHt1cmw6dCx0eXBlOm98fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOmV9KS5kb25lKGZ1bmN0aW9uKHQpe2k9YXJndW1lbnRzLGEuaHRtbChyP1MoIjxkaXY+IikuYXBwZW5kKFMucGFyc2VIVE1MKHQpKS5maW5kKHIpOnQpfSkuYWx3YXlzKG4mJmZ1bmN0aW9uKHQsZSl7YS5lYWNoKGZ1bmN0aW9uKCl7bi5hcHBseSh0aGlzLGl8fFt0LnJlc3BvbnNlVGV4dCxlLHRdKX0pfSksdGhpc30sUy5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24odCxlKXtTLmZuW2VdPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9uKGUsdCl9fSksUy5leHByLnBzZXVkb3MuYW5pbWF0ZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIFMuZ3JlcChTLnRpbWVycyxmdW5jdGlvbihlKXtyZXR1cm4gdD09PWUuZWxlbX0pLmxlbmd0aH0sUy5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGEscyx1LGM9Uy5jc3ModCwicG9zaXRpb24iKSxsPVModCksZj17fTsic3RhdGljIj09PWMmJih0LnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpLHM9bC5vZmZzZXQoKSxpPVMuY3NzKHQsInRvcCIpLHU9Uy5jc3ModCwibGVmdCIpLCgiYWJzb2x1dGUiPT09Y3x8ImZpeGVkIj09PWMpJiYoaSt1KS5pbmRleE9mKCJhdXRvIik+LTE/KGE9KHI9bC5wb3NpdGlvbigpKS50b3Asbz1yLmxlZnQpOihhPXBhcnNlRmxvYXQoaSl8fDAsbz1wYXJzZUZsb2F0KHUpfHwwKSxtKGUpJiYoZT1lLmNhbGwodCxuLFMuZXh0ZW5kKHt9LHMpKSksbnVsbCE9ZS50b3AmJihmLnRvcD1lLnRvcC1zLnRvcCthKSxudWxsIT1lLmxlZnQmJihmLmxlZnQ9ZS5sZWZ0LXMubGVmdCtvKSwidXNpbmciaW4gZT9lLnVzaW5nLmNhbGwodCxmKTpsLmNzcyhmKX19LFMuZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24odCl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09dD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihlKXtTLm9mZnNldC5zZXRPZmZzZXQodGhpcyx0LGUpfSk7dmFyIGUsbixyPXRoaXNbMF07cmV0dXJuIHI/ci5nZXRDbGllbnRSZWN0cygpLmxlbmd0aD8oZT1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49ci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LHt0b3A6ZS50b3Arbi5wYWdlWU9mZnNldCxsZWZ0OmUubGVmdCtuLnBhZ2VYT2Zmc2V0fSk6e3RvcDowLGxlZnQ6MH06dm9pZCAwfSxwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciB0LGUsbixyPXRoaXNbMF0sbz17dG9wOjAsbGVmdDowfTtpZigiZml4ZWQiPT09Uy5jc3MociwicG9zaXRpb24iKSllPXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7ZWxzZXtmb3IoZT10aGlzLm9mZnNldCgpLG49ci5vd25lckRvY3VtZW50LHQ9ci5vZmZzZXRQYXJlbnR8fG4uZG9jdW1lbnRFbGVtZW50O3QmJih0PT09bi5ib2R5fHx0PT09bi5kb2N1bWVudEVsZW1lbnQpJiYic3RhdGljIj09PVMuY3NzKHQsInBvc2l0aW9uIik7KXQ9dC5wYXJlbnROb2RlO3QmJnQhPT1yJiYxPT09dC5ub2RlVHlwZSYmKChvPVModCkub2Zmc2V0KCkpLnRvcCs9Uy5jc3ModCwiYm9yZGVyVG9wV2lkdGgiLCEwKSxvLmxlZnQrPVMuY3NzKHQsImJvcmRlckxlZnRXaWR0aCIsITApKX1yZXR1cm57dG9wOmUudG9wLW8udG9wLVMuY3NzKHIsIm1hcmdpblRvcCIsITApLGxlZnQ6ZS5sZWZ0LW8ubGVmdC1TLmNzcyhyLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMub2Zmc2V0UGFyZW50O3QmJiJzdGF0aWMiPT09Uy5jc3ModCwicG9zaXRpb24iKTspdD10Lm9mZnNldFBhcmVudDtyZXR1cm4gdHx8YXR9KX19KSxTLmVhY2goe3Njcm9sbExlZnQ6InBhZ2VYT2Zmc2V0IixzY3JvbGxUb3A6InBhZ2VZT2Zmc2V0In0sZnVuY3Rpb24odCxlKXt2YXIgbj0icGFnZVlPZmZzZXQiPT09ZTtTLmZuW3RdPWZ1bmN0aW9uKHIpe3JldHVybiAkKHRoaXMsZnVuY3Rpb24odCxyLG8pe3ZhciBpO2lmKGIodCk/aT10Ojk9PT10Lm5vZGVUeXBlJiYoaT10LmRlZmF1bHRWaWV3KSx2b2lkIDA9PT1vKXJldHVybiBpP2lbZV06dFtyXTtpP2kuc2Nyb2xsVG8obj9pLnBhZ2VYT2Zmc2V0Om8sbj9vOmkucGFnZVlPZmZzZXQpOnRbcl09b30sdCxyLGFyZ3VtZW50cy5sZW5ndGgpfX0pLFMuZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbih0LGUpe1MuY3NzSG9va3NbZV09R3QoeS5waXhlbFBvc2l0aW9uLGZ1bmN0aW9uKHQsbil7aWYobilyZXR1cm4gbj1WdCh0LGUpLFd0LnRlc3Qobik/Uyh0KS5wb3NpdGlvbigpW2VdKyJweCI6bn0pfSksUy5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24odCxlKXtTLmVhY2goe3BhZGRpbmc6ImlubmVyIit0LGNvbnRlbnQ6ZSwiIjoib3V0ZXIiK3R9LGZ1bmN0aW9uKG4scil7Uy5mbltyXT1mdW5jdGlvbihvLGkpe3ZhciBhPWFyZ3VtZW50cy5sZW5ndGgmJihufHwiYm9vbGVhbiIhPXR5cGVvZiBvKSxzPW58fCghMD09PW98fCEwPT09aT8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuICQodGhpcyxmdW5jdGlvbihlLG4sbyl7dmFyIGk7cmV0dXJuIGIoZSk/MD09PXIuaW5kZXhPZigib3V0ZXIiKT9lWyJpbm5lciIrdF06ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrdF06OT09PWUubm9kZVR5cGU/KGk9ZS5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoZS5ib2R5WyJzY3JvbGwiK3RdLGlbInNjcm9sbCIrdF0sZS5ib2R5WyJvZmZzZXQiK3RdLGlbIm9mZnNldCIrdF0saVsiY2xpZW50Iit0XSkpOnZvaWQgMD09PW8/Uy5jc3MoZSxuLHMpOlMuc3R5bGUoZSxuLG8scyl9LGUsYT9vOnZvaWQgMCxhKX19KX0pLFMuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbih0LGUpe1MuZm5bZV09ZnVuY3Rpb24odCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24oZSxudWxsLHQsbik6dGhpcy50cmlnZ2VyKGUpfX0pLFMuZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIodCkubW91c2VsZWF2ZShlfHx0KX19KSxTLmZuLmV4dGVuZCh7YmluZDpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMub24odCxudWxsLGUsbil9LHVuYmluZDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLm9mZih0LG51bGwsZSl9LGRlbGVnYXRlOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0aGlzLm9uKGUsdCxuLHIpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYodCwiKioiKTp0aGlzLm9mZihlLHR8fCIqKiIsbil9fSksUy5wcm94eT1mdW5jdGlvbih0LGUpe3ZhciBuLHIsbztpZigic3RyaW5nIj09dHlwZW9mIGUmJihuPXRbZV0sZT10LHQ9biksbSh0KSlyZXR1cm4gcj11LmNhbGwoYXJndW1lbnRzLDIpLChvPWZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkoZXx8dGhpcyxyLmNvbmNhdCh1LmNhbGwoYXJndW1lbnRzKSkpfSkuZ3VpZD10Lmd1aWQ9dC5ndWlkfHxTLmd1aWQrKyxvfSxTLmhvbGRSZWFkeT1mdW5jdGlvbih0KXt0P1MucmVhZHlXYWl0Kys6Uy5yZWFkeSghMCl9LFMuaXNBcnJheT1BcnJheS5pc0FycmF5LFMucGFyc2VKU09OPUpTT04ucGFyc2UsUy5ub2RlTmFtZT1MLFMuaXNGdW5jdGlvbj1tLFMuaXNXaW5kb3c9YixTLmNhbWVsQ2FzZT1LLFMudHlwZT1rLFMubm93PURhdGUubm93LFMuaXNOdW1lcmljPWZ1bmN0aW9uKHQpe3ZhciBlPVMudHlwZSh0KTtyZXR1cm4oIm51bWJlciI9PT1lfHwic3RyaW5nIj09PWUpJiYhaXNOYU4odC1wYXJzZUZsb2F0KHQpKX0sdm9pZCAwPT09KHI9ZnVuY3Rpb24oKXtyZXR1cm4gU30uYXBwbHkoZSxbXSkpfHwodC5leHBvcnRzPXIpO3ZhciBRZT1uLmpRdWVyeSxaZT1uLiQ7cmV0dXJuIFMubm9Db25mbGljdD1mdW5jdGlvbih0KXtyZXR1cm4gbi4kPT09UyYmKG4uJD1aZSksdCYmbi5qUXVlcnk9PT1TJiYobi5qUXVlcnk9UWUpLFN9LG98fChuLmpRdWVyeT1uLiQ9UyksU30pfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjQ1KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0Nil9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNDgpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNTIpO2Z1bmN0aW9uIG8odCxlLG4sbyxpLGEscyl7dHJ5e3ZhciB1PXRbYV0ocyksYz11LnZhbHVlfWNhdGNoKHQpe3JldHVybiB2b2lkIG4odCl9dS5kb25lP2UoYyk6ci5yZXNvbHZlKGMpLnRoZW4obyxpKX10LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPWFyZ3VtZW50cztyZXR1cm4gbmV3IHIoZnVuY3Rpb24ocixpKXt2YXIgYT10LmFwcGx5KGUsbik7ZnVuY3Rpb24gcyh0KXtvKGEscixpLHMsdSwibmV4dCIsdCl9ZnVuY3Rpb24gdSh0KXtvKGEscixpLHMsdSwidGhyb3ciLHQpfXModm9pZCAwKX0pfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI2NCkuZGVmYXVsdDt0LmV4cG9ydHM9cix0LmV4cG9ydHMuZGVmYXVsdD1yfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjk4KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKHQpe3JldHVybiB0LnJlcGxhY2UoL1tcLVxbXF1cL1x7XH1cKFwpXCpcK1w/XC5cXFxeXCRcfF0vZywiXFwkJiIpfXIucHJvdG89ZnVuY3Rpb24oKXtyZXR1cm4gUmVnRXhwLmVzY2FwZT1yLHJ9LHQuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTM3KX0sZnVuY3Rpb24odCxlLG4pe24oMTM4KTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLlJlZmxlY3QuY29uc3RydWN0fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKSxvPW4oMzMpLGk9bigyMiksYT1uKDExKSxzPW4oNyksdT1uKDQ3KSxjPW4oOTEpLGw9big2KSxmPW8oIlJlZmxlY3QiLCJjb25zdHJ1Y3QiKSxwPWwoZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiEoZihmdW5jdGlvbigpe30sW10sdClpbnN0YW5jZW9mIHQpfSksaD0hbChmdW5jdGlvbigpe2YoZnVuY3Rpb24oKXt9KX0pLGQ9cHx8aDtyKHt0YXJnZXQ6IlJlZmxlY3QiLHN0YXQ6ITAsZm9yY2VkOmQsc2hhbTpkfSx7Y29uc3RydWN0OmZ1bmN0aW9uKHQsZSl7aSh0KSxhKGUpO3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg8Mz90OmkoYXJndW1lbnRzWzJdKTtpZihoJiYhcClyZXR1cm4gZih0LGUsbik7aWYodD09bil7c3dpdGNoKGUubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIG5ldyB0O2Nhc2UgMTpyZXR1cm4gbmV3IHQoZVswXSk7Y2FzZSAyOnJldHVybiBuZXcgdChlWzBdLGVbMV0pO2Nhc2UgMzpyZXR1cm4gbmV3IHQoZVswXSxlWzFdLGVbMl0pO2Nhc2UgNDpyZXR1cm4gbmV3IHQoZVswXSxlWzFdLGVbMl0sZVszXSl9dmFyIHI9W251bGxdO3JldHVybiByLnB1c2guYXBwbHkocixlKSxuZXcoYy5hcHBseSh0LHIpKX12YXIgbz1uLnByb3RvdHlwZSxsPXUocyhvKT9vOk9iamVjdC5wcm90b3R5cGUpLGQ9RnVuY3Rpb24uYXBwbHkuY2FsbCh0LGwsZSk7cmV0dXJuIHMoZCk/ZDpsfX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMyksbz1uKDIzKSxpPW4oMTEpLGE9big1NSk7dC5leHBvcnRzPXI/T2JqZWN0LmRlZmluZVByb3BlcnRpZXM6ZnVuY3Rpb24odCxlKXtpKHQpO2Zvcih2YXIgbixyPWEoZSkscz1yLmxlbmd0aCx1PTA7cz51OylvLmYodCxuPXJbdSsrXSxlW25dKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpLG89bigxNyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dHJ5e28ocix0LGUpfWNhdGNoKG4pe3JbdF09ZX1yZXR1cm4gZX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNDIpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxKSxvPXIuSlNPTnx8KHIuSlNPTj17c3RyaW5naWZ5OkpTT04uc3RyaW5naWZ5fSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBvLnN0cmluZ2lmeS5hcHBseShvLGFyZ3VtZW50cyl9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTQ0KX0sZnVuY3Rpb24odCxlLG4pe24oMTQ1KTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLk9iamVjdC5hc3NpZ259LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89bigxNDYpO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpPYmplY3QuYXNzaWduIT09b30se2Fzc2lnbjpvfSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxMyksbz1uKDYpLGk9big1NSksYT1uKDkyKSxzPW4oNjQpLHU9bigyNCksYz1uKDY1KSxsPU9iamVjdC5hc3NpZ247dC5leHBvcnRzPSFsfHxvKGZ1bmN0aW9uKCl7dmFyIHQ9e30sZT17fSxuPVN5bWJvbCgpO3JldHVybiB0W25dPTcsImFiY2RlZmdoaWprbG1ub3BxcnN0Ii5zcGxpdCgiIikuZm9yRWFjaChmdW5jdGlvbih0KXtlW3RdPXR9KSw3IT1sKHt9LHQpW25dfHwiYWJjZGVmZ2hpamtsbW5vcHFyc3QiIT1pKGwoe30sZSkpLmpvaW4oIiIpfSk/ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dSh0KSxvPWFyZ3VtZW50cy5sZW5ndGgsbD0xLGY9YS5mLHA9cy5mO28+bDspZm9yKHZhciBoLGQ9Yyhhcmd1bWVudHNbbCsrXSksZz1mP2koZCkuY29uY2F0KGYoZCkpOmkoZCksdj1nLmxlbmd0aCx5PTA7dj55OyloPWdbeSsrXSxyJiYhcC5jYWxsKGQsaCl8fChuW2hdPWRbaF0pO3JldHVybiBufTpsfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTQ4KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQ5KSxvPUFycmF5LnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5jb25jYXQ7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1vLmNvbmNhdD9yOmV9fSxmdW5jdGlvbih0LGUsbil7big5Myk7dmFyIHI9bigxOCk7dC5leHBvcnRzPXIoIkFycmF5IikuY29uY2F0fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTUxKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTUyKSxvPUFycmF5LnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5tYXA7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1vLm1hcD9yOmV9fSxmdW5jdGlvbih0LGUsbil7bigxNTMpO3ZhciByPW4oMTgpO3QuZXhwb3J0cz1yKCJBcnJheSIpLm1hcH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89big3MykubWFwO3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDohbig3MikoIm1hcCIpfSx7bWFwOmZ1bmN0aW9uKHQpe3JldHVybiBvKHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNTUpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTU2KX0sZnVuY3Rpb24odCxlLG4pe24oMTU3KTt2YXIgcj1uKDEpLk9iamVjdCxvPXQuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHIuZGVmaW5lUHJvcGVydHkodCxlLG4pfTtyLmRlZmluZVByb3BlcnR5LnNoYW0mJihvLnNoYW09ITApfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKSxvPW4oMTMpO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDohbyxzaGFtOiFvfSx7ZGVmaW5lUHJvcGVydHk6bigyMykuZn0pfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTU5KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE2MCl9LGZ1bmN0aW9uKHQsZSxuKXtuKDE2MSk7dmFyIHI9bigxKS5PYmplY3Qsbz10LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxlKX07ci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iuc2hhbSYmKG8uc2hhbT0hMCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89big2KSxpPW4oMjEpLGE9big0NSkuZixzPW4oMTMpLHU9byhmdW5jdGlvbigpe2EoMSl9KTtyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXN8fHUsc2hhbTohc30se2dldE93blByb3BlcnR5RGVzY3JpcHRvcjpmdW5jdGlvbih0LGUpe3JldHVybiBhKGkodCksZSl9fSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNjMpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTY0KX0sZnVuY3Rpb24odCxlLG4pe24oMTY1KTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLlJlZmxlY3QuZ2V0fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKSxvPW4oNyksaT1uKDExKSxhPW4oMTQpLHM9big0NSksdT1uKDQ5KTtyKHt0YXJnZXQ6IlJlZmxlY3QiLHN0YXQ6ITB9LHtnZXQ6ZnVuY3Rpb24gdChlLG4pe3ZhciByLGMsbD1hcmd1bWVudHMubGVuZ3RoPDM/ZTphcmd1bWVudHNbMl07cmV0dXJuIGkoZSk9PT1sP2Vbbl06KHI9cy5mKGUsbikpP2EociwidmFsdWUiKT9yLnZhbHVlOnZvaWQgMD09PXIuZ2V0P3ZvaWQgMDpyLmdldC5jYWxsKGwpOm8oYz11KGUpKT90KGMsbixsKTp2b2lkIDB9fSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtmb3IoOyFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKSYmbnVsbCE9PSh0PXIodCkpOyk7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTY4KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE2OSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDE3MCk7dmFyIHI9bigxKTt0LmV4cG9ydHM9ci5PYmplY3QuZ2V0UHJvdG90eXBlT2Z9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89big2KSxpPW4oMjQpLGE9big0OSkscz1uKDk2KTtyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6byhmdW5jdGlvbigpe2EoMSl9KSxzaGFtOiFzfSx7Z2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24odCl7cmV0dXJuIGEoaSh0KSl9fSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNzIpfSxmdW5jdGlvbih0LGUsbil7bigxNzMpO3ZhciByPW4oMSk7dC5leHBvcnRzPXIuT2JqZWN0LnNldFByb3RvdHlwZU9mfSxmdW5jdGlvbih0LGUsbil7bigwKSh7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITB9LHtzZXRQcm90b3R5cGVPZjpuKDc0KX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoIXIodCkmJm51bGwhPT10KXRocm93IFR5cGVFcnJvcigiQ2FuJ3Qgc2V0ICIrU3RyaW5nKHQpKyIgYXMgYSBwcm90b3R5cGUiKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNzYpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTc3KX0sZnVuY3Rpb24odCxlLG4pe24oMTc4KTt2YXIgcj1uKDEpLk9iamVjdDt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gci5jcmVhdGUodCxlKX19LGZ1bmN0aW9uKHQsZSxuKXtuKDApKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxzaGFtOiFuKDEzKX0se2NyZWF0ZTpuKDQ3KX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big5Nyk7ZnVuY3Rpb24gbyhlLG4pe3JldHVybiB0LmV4cG9ydHM9bz1yfHxmdW5jdGlvbih0LGUpe3JldHVybiB0Ll9fcHJvdG9fXz1lLHR9LG8oZSxuKX10LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTgxKSxvPW4oMTAzKTtmdW5jdGlvbiBpKGUpe3JldHVybiB0LmV4cG9ydHM9aT0iZnVuY3Rpb24iPT10eXBlb2YgbyYmInN5bWJvbCI9PXR5cGVvZiByP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBvJiZ0LmNvbnN0cnVjdG9yPT09byYmdCE9PW8ucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSxpKGUpfXQuZXhwb3J0cz1pfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTgyKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE4Myl9LGZ1bmN0aW9uKHQsZSxuKXtuKDk4KSxuKDM1KSxuKDUxKTt2YXIgcj1uKDc1KTt0LmV4cG9ydHM9ci5mKCJpdGVyYXRvciIpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2OCksbz1uKDQ2KSxpPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3ZhciBpLGEscz1TdHJpbmcobyhlKSksdT1yKG4pLGM9cy5sZW5ndGg7cmV0dXJuIHU8MHx8dT49Yz90PyIiOnZvaWQgMDooaT1zLmNoYXJDb2RlQXQodSkpPDU1Mjk2fHxpPjU2MzE5fHx1KzE9PT1jfHwoYT1zLmNoYXJDb2RlQXQodSsxKSk8NTYzMjB8fGE+NTczNDM/dD9zLmNoYXJBdCh1KTppOnQ/cy5zbGljZSh1LHUrMik6YS01NjMyMCsoaS01NTI5Njw8MTApKzY1NTM2fX07dC5leHBvcnRzPXtjb2RlQXQ6aSghMSksY2hhckF0OmkoITApfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSksbz1uKDE4NiksaT1yLldlYWtNYXA7dC5leHBvcnRzPSJmdW5jdGlvbiI9PXR5cGVvZiBpJiYvbmF0aXZlIGNvZGUvLnRlc3Qoby5jYWxsKGkpKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNTgpO3QuZXhwb3J0cz1yKCJuYXRpdmUtZnVuY3Rpb24tdG8tc3RyaW5nIixGdW5jdGlvbi50b1N0cmluZyl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big3Niksbz17fTtvW24oMikoInRvU3RyaW5nVGFnIildPSJ6Iix0LmV4cG9ydHM9IltvYmplY3Qgel0iIT09U3RyaW5nKG8pP2Z1bmN0aW9uKCl7cmV0dXJuIltvYmplY3QgIityKHRoaXMpKyJdIn06by50b1N0cmluZ30sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9e0NTU1J1bGVMaXN0OjAsQ1NTU3R5bGVEZWNsYXJhdGlvbjowLENTU1ZhbHVlTGlzdDowLENsaWVudFJlY3RMaXN0OjAsRE9NUmVjdExpc3Q6MCxET01TdHJpbmdMaXN0OjAsRE9NVG9rZW5MaXN0OjEsRGF0YVRyYW5zZmVySXRlbUxpc3Q6MCxGaWxlTGlzdDowLEhUTUxBbGxDb2xsZWN0aW9uOjAsSFRNTENvbGxlY3Rpb246MCxIVE1MRm9ybUVsZW1lbnQ6MCxIVE1MU2VsZWN0RWxlbWVudDowLE1lZGlhTGlzdDowLE1pbWVUeXBlQXJyYXk6MCxOYW1lZE5vZGVNYXA6MCxOb2RlTGlzdDoxLFBhaW50UmVxdWVzdExpc3Q6MCxQbHVnaW46MCxQbHVnaW5BcnJheTowLFNWR0xlbmd0aExpc3Q6MCxTVkdOdW1iZXJMaXN0OjAsU1ZHUGF0aFNlZ0xpc3Q6MCxTVkdQb2ludExpc3Q6MCxTVkdTdHJpbmdMaXN0OjAsU1ZHVHJhbnNmb3JtTGlzdDowLFNvdXJjZUJ1ZmZlckxpc3Q6MCxTdHlsZVNoZWV0TGlzdDowLFRleHRUcmFja0N1ZUxpc3Q6MCxUZXh0VHJhY2tMaXN0OjAsVG91Y2hMaXN0OjB9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTA0KSxuKDIwNyksbigyMDgpLG4oMjA5KSxuKDIxMCksbigyMTEpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDUpLGk9bigyOCksYT1uKDEzKSxzPW4oOTUpLHU9big2KSxjPW4oMTQpLGw9big0OCksZj1uKDcpLHA9bigxMSksaD1uKDI0KSxkPW4oMjEpLGc9big1NCksdj1uKDMxKSx5PW4oNDcpLG09big1NSksYj1uKDEwNikseD1uKDE5MSksdz1uKDkyKSxrPW4oNDUpLFM9bigyMyksRT1uKDY0KSxqPW4oMTcpLFQ9bigzNiksTz1uKDU4KSxBPW4oNTcpLEM9big1NiksTD1uKDcwKSxSPW4oMiksUD1uKDc1KSxOPW4oNCksST1uKDI5KSxfPW4oNTApLEQ9big3MykuZm9yRWFjaCxNPUEoImhpZGRlbiIpLFU9UigidG9QcmltaXRpdmUiKSxCPV8uc2V0LHE9Xy5nZXR0ZXJGb3IoIlN5bWJvbCIpLEY9T2JqZWN0LnByb3RvdHlwZSxIPW8uU3ltYm9sLHo9by5KU09OLFc9eiYmei5zdHJpbmdpZnksJD1rLmYsWT1TLmYsVj14LmYsRz1FLmYsSz1PKCJzeW1ib2xzIiksWD1PKCJvcC1zeW1ib2xzIiksSj1PKCJzdHJpbmctdG8tc3ltYm9sLXJlZ2lzdHJ5IiksUT1PKCJzeW1ib2wtdG8tc3RyaW5nLXJlZ2lzdHJ5IiksWj1PKCJ3a3MiKSx0dD1vLlFPYmplY3QsZXQ9IXR0fHwhdHQucHJvdG90eXBlfHwhdHQucHJvdG90eXBlLmZpbmRDaGlsZCxudD1hJiZ1KGZ1bmN0aW9uKCl7cmV0dXJuIDchPXkoWSh7fSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiBZKHRoaXMsImEiLHt2YWx1ZTo3fSkuYX19KSkuYX0pP2Z1bmN0aW9uKHQsZSxuKXt2YXIgcj0kKEYsZSk7ciYmZGVsZXRlIEZbZV0sWSh0LGUsbiksciYmdCE9PUYmJlkoRixlLHIpfTpZLHJ0PWZ1bmN0aW9uKHQsZSl7dmFyIG49S1t0XT15KEgucHJvdG90eXBlKTtyZXR1cm4gQihuLHt0eXBlOiJTeW1ib2wiLHRhZzp0LGRlc2NyaXB0aW9uOmV9KSxhfHwobi5kZXNjcmlwdGlvbj1lKSxufSxvdD1zJiYic3ltYm9sIj09dHlwZW9mIEguaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KHQpaW5zdGFuY2VvZiBIfSxpdD1mdW5jdGlvbih0LGUsbil7dD09PUYmJml0KFgsZSxuKSxwKHQpO3ZhciByPWcoZSwhMCk7cmV0dXJuIHAobiksYyhLLHIpPyhuLmVudW1lcmFibGU/KGModCxNKSYmdFtNXVtyXSYmKHRbTV1bcl09ITEpLG49eShuLHtlbnVtZXJhYmxlOnYoMCwhMSl9KSk6KGModCxNKXx8WSh0LE0sdigxLHt9KSksdFtNXVtyXT0hMCksbnQodCxyLG4pKTpZKHQscixuKX0sYXQ9ZnVuY3Rpb24odCxlKXtwKHQpO3ZhciBuPWQoZSkscj1tKG4pLmNvbmNhdChsdChuKSk7cmV0dXJuIEQocixmdW5jdGlvbihlKXthJiYhc3QuY2FsbChuLGUpfHxpdCh0LGUsbltlXSl9KSx0fSxzdD1mdW5jdGlvbih0KXt2YXIgZT1nKHQsITApLG49Ry5jYWxsKHRoaXMsZSk7cmV0dXJuISh0aGlzPT09RiYmYyhLLGUpJiYhYyhYLGUpKSYmKCEobnx8IWModGhpcyxlKXx8IWMoSyxlKXx8Yyh0aGlzLE0pJiZ0aGlzW01dW2VdKXx8bil9LHV0PWZ1bmN0aW9uKHQsZSl7dmFyIG49ZCh0KSxyPWcoZSwhMCk7aWYobiE9PUZ8fCFjKEsscil8fGMoWCxyKSl7dmFyIG89JChuLHIpO3JldHVybiFvfHwhYyhLLHIpfHxjKG4sTSkmJm5bTV1bcl18fChvLmVudW1lcmFibGU9ITApLG99fSxjdD1mdW5jdGlvbih0KXt2YXIgZT1WKGQodCkpLG49W107cmV0dXJuIEQoZSxmdW5jdGlvbih0KXtjKEssdCl8fGMoQyx0KXx8bi5wdXNoKHQpfSksbn0sbHQ9ZnVuY3Rpb24odCl7dmFyIGU9dD09PUYsbj1WKGU/WDpkKHQpKSxyPVtdO3JldHVybiBEKG4sZnVuY3Rpb24odCl7IWMoSyx0KXx8ZSYmIWMoRix0KXx8ci5wdXNoKEtbdF0pfSkscn07c3x8KFQoKEg9ZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2YgSCl0aHJvdyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3ZhciB0PWFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9TdHJpbmcoYXJndW1lbnRzWzBdKTp2b2lkIDAsZT1MKHQpLG49ZnVuY3Rpb24odCl7dGhpcz09PUYmJm4uY2FsbChYLHQpLGModGhpcyxNKSYmYyh0aGlzW01dLGUpJiYodGhpc1tNXVtlXT0hMSksbnQodGhpcyxlLHYoMSx0KSl9O3JldHVybiBhJiZldCYmbnQoRixlLHtjb25maWd1cmFibGU6ITAsc2V0Om59KSxydChlLHQpfSkucHJvdG90eXBlLCJ0b1N0cmluZyIsZnVuY3Rpb24oKXtyZXR1cm4gcSh0aGlzKS50YWd9KSxFLmY9c3QsUy5mPWl0LGsuZj11dCxiLmY9eC5mPWN0LHcuZj1sdCxhJiYoWShILnByb3RvdHlwZSwiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHEodGhpcykuZGVzY3JpcHRpb259fSksaXx8VChGLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsc3Qse3Vuc2FmZTohMH0pKSxQLmY9ZnVuY3Rpb24odCl7cmV0dXJuIHJ0KFIodCksdCl9KSxyKHtnbG9iYWw6ITAsd3JhcDohMCxmb3JjZWQ6IXMsc2hhbTohc30se1N5bWJvbDpIfSksRChtKFopLGZ1bmN0aW9uKHQpe04odCl9KSxyKHt0YXJnZXQ6IlN5bWJvbCIsc3RhdDohMCxmb3JjZWQ6IXN9LHtmb3I6ZnVuY3Rpb24odCl7dmFyIGU9U3RyaW5nKHQpO2lmKGMoSixlKSlyZXR1cm4gSltlXTt2YXIgbj1IKGUpO3JldHVybiBKW2VdPW4sUVtuXT1lLG59LGtleUZvcjpmdW5jdGlvbih0KXtpZighb3QodCkpdGhyb3cgVHlwZUVycm9yKHQrIiBpcyBub3QgYSBzeW1ib2wiKTtpZihjKFEsdCkpcmV0dXJuIFFbdF19LHVzZVNldHRlcjpmdW5jdGlvbigpe2V0PSEwfSx1c2VTaW1wbGU6ZnVuY3Rpb24oKXtldD0hMX19KSxyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXMsc2hhbTohYX0se2NyZWF0ZTpmdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lP3kodCk6YXQoeSh0KSxlKX0sZGVmaW5lUHJvcGVydHk6aXQsZGVmaW5lUHJvcGVydGllczphdCxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6dXR9KSxyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXN9LHtnZXRPd25Qcm9wZXJ0eU5hbWVzOmN0LGdldE93blByb3BlcnR5U3ltYm9sczpsdH0pLHIoe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDp1KGZ1bmN0aW9uKCl7dy5mKDEpfSl9LHtnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ZnVuY3Rpb24odCl7cmV0dXJuIHcuZihoKHQpKX19KSx6JiZyKHt0YXJnZXQ6IkpTT04iLHN0YXQ6ITAsZm9yY2VkOiFzfHx1KGZ1bmN0aW9uKCl7dmFyIHQ9SCgpO3JldHVybiJbbnVsbF0iIT1XKFt0XSl8fCJ7fSIhPVcoe2E6dH0pfHwie30iIT1XKE9iamVjdCh0KSl9KX0se3N0cmluZ2lmeTpmdW5jdGlvbih0KXtmb3IodmFyIGUsbixyPVt0XSxvPTE7YXJndW1lbnRzLmxlbmd0aD5vOylyLnB1c2goYXJndW1lbnRzW28rK10pO2lmKG49ZT1yWzFdLChmKGUpfHx2b2lkIDAhPT10KSYmIW90KHQpKXJldHVybiBsKGUpfHwoZT1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuJiYoZT1uLmNhbGwodGhpcyx0LGUpKSwhb3QoZSkpcmV0dXJuIGV9KSxyWzFdPWUsVy5hcHBseSh6LHIpfX0pLEgucHJvdG90eXBlW1VdfHxqKEgucHJvdG90eXBlLFUsSC5wcm90b3R5cGUudmFsdWVPZiksSShILCJTeW1ib2wiKSxDW01dPSEwfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMSksbz1uKDEwNikuZixpPXt9LnRvU3RyaW5nLGE9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdyYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM/T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KTpbXTt0LmV4cG9ydHMuZj1mdW5jdGlvbih0KXtyZXR1cm4gYSYmIltvYmplY3QgV2luZG93XSI9PWkuY2FsbCh0KT9mdW5jdGlvbih0KXt0cnl7cmV0dXJuIG8odCl9Y2F0Y2godCl7cmV0dXJuIGEuc2xpY2UoKX19KHQpOm8ocih0KSl9fSxmdW5jdGlvbih0LGUsbil7big0KSgiYXN5bmNJdGVyYXRvciIpfSxmdW5jdGlvbih0LGUpe30sZnVuY3Rpb24odCxlLG4pe24oNCkoImhhc0luc3RhbmNlIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJpc0NvbmNhdFNwcmVhZGFibGUiKX0sZnVuY3Rpb24odCxlLG4pe24oNCkoIm1hdGNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJtYXRjaEFsbCIpfSxmdW5jdGlvbih0LGUsbil7big0KSgicmVwbGFjZSIpfSxmdW5jdGlvbih0LGUsbil7big0KSgic2VhcmNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJzcGVjaWVzIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJzcGxpdCIpfSxmdW5jdGlvbih0LGUsbil7big0KSgidG9QcmltaXRpdmUiKX0sZnVuY3Rpb24odCxlLG4pe24oNCkoInRvU3RyaW5nVGFnIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJ1bnNjb3BhYmxlcyIpfSxmdW5jdGlvbih0LGUsbil7bigyOSkoTWF0aCwiTWF0aCIsITApfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KTtuKDI5KShyLkpTT04sIkpTT04iLCEwKX0sZnVuY3Rpb24odCxlLG4pe24oNCkoImFzeW5jRGlzcG9zZSIpfSxmdW5jdGlvbih0LGUsbil7big0KSgiZGlzcG9zZSIpfSxmdW5jdGlvbih0LGUsbil7big0KSgib2JzZXJ2YWJsZSIpfSxmdW5jdGlvbih0LGUsbil7big0KSgicGF0dGVybk1hdGNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJyZXBsYWNlQWxsIil9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMTQpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMTUpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmZpbmQ7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1vLmZpbmQ/cjplfX0sZnVuY3Rpb24odCxlLG4pe24oMjE2KTt2YXIgcj1uKDE4KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5maW5kfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDczKS5maW5kLGk9big3NyksYT0hMDsiZmluZCJpbltdJiZBcnJheSgxKS5maW5kKGZ1bmN0aW9uKCl7YT0hMX0pLHIoe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDphfSx7ZmluZDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pLGkoImZpbmQiKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIxOCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIxOSksbz1TdHJpbmcucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LnRyaW07cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fHx0PT09b3x8dCBpbnN0YW5jZW9mIFN0cmluZyYmZT09PW8udHJpbT9yOmV9fSxmdW5jdGlvbih0LGUsbil7bigyMjApO3ZhciByPW4oMTgpO3QuZXhwb3J0cz1yKCJTdHJpbmciKS50cmltfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDEwNykudHJpbTtyKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITAsZm9yY2VkOm4oMjIxKSgidHJpbSIpfSx7dHJpbTpmdW5jdGlvbigpe3JldHVybiBvKHRoaXMpfX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2KSxvPW4oNzgpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcihmdW5jdGlvbigpe3JldHVybiEhb1t0XSgpfHwi4oCLwoXhoI4iIT0i4oCLwoXhoI4iW3RdKCl8fG9bdF0ubmFtZSE9PXR9KX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMjMpfSxmdW5jdGlvbih0LGUsbil7bigyMjQpO3ZhciByPW4oMSk7dC5leHBvcnRzPXIucGFyc2VJbnR9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89bigyMjUpO3Ioe2dsb2JhbDohMCxmb3JjZWQ6cGFyc2VJbnQhPW99LHtwYXJzZUludDpvfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpLG89bigxMDcpLnRyaW0saT1uKDc4KSxhPXIucGFyc2VJbnQscz0vXlsrLV0/MFtYeF0vLHU9OCE9PWEoaSsiMDgiKXx8MjIhPT1hKGkrIjB4MTYiKTt0LmV4cG9ydHM9dT9mdW5jdGlvbih0LGUpe3ZhciBuPW8oU3RyaW5nKHQpKTtyZXR1cm4gYShuLGU+Pj4wfHwocy50ZXN0KG4pPzE2OjEwKSl9OmF9LGZ1bmN0aW9uKHQsZSxuKXtuKDUxKSxuKDM1KSx0LmV4cG9ydHM9bigxMDgpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTA5KX0sZnVuY3Rpb24odCxlLG4pe24oMCkoe3RhcmdldDoiQXJyYXkiLHN0YXQ6ITB9LHtpc0FycmF5Om4oNDgpfSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDUxKSxuKDM1KSx0LmV4cG9ydHM9big1Mil9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMDQpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTEwKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDIzMyk7cih7dGFyZ2V0OiJBcnJheSIsc3RhdDohMCxmb3JjZWQ6IW4oMTEzKShmdW5jdGlvbih0KXtBcnJheS5mcm9tKHQpfSl9LHtmcm9tOm99KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMyKSxvPW4oMjQpLGk9bigxMTEpLGE9bigxMTIpLHM9bigzNCksdT1uKDcxKSxjPW4oNTIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZSxuLGwsZixwPW8odCksaD0iZnVuY3Rpb24iPT10eXBlb2YgdGhpcz90aGlzOkFycmF5LGQ9YXJndW1lbnRzLmxlbmd0aCxnPWQ+MT9hcmd1bWVudHNbMV06dm9pZCAwLHY9dm9pZCAwIT09Zyx5PTAsbT1jKHApO2lmKHYmJihnPXIoZyxkPjI/YXJndW1lbnRzWzJdOnZvaWQgMCwyKSksbnVsbD09bXx8aD09QXJyYXkmJmEobSkpZm9yKG49bmV3IGgoZT1zKHAubGVuZ3RoKSk7ZT55O3krKyl1KG4seSx2P2cocFt5XSx5KTpwW3ldKTtlbHNlIGZvcihmPW0uY2FsbChwKSxuPW5ldyBoOyEobD1mLm5leHQoKSkuZG9uZTt5KyspdShuLHksdj9pKGYsZyxbbC52YWx1ZSx5XSwhMCk6bC52YWx1ZSk7cmV0dXJuIG4ubGVuZ3RoPXksbn19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMTQpfSxmdW5jdGlvbih0LGUsbil7bigyMzYpO3ZhciByPW4oMTgpO3QuZXhwb3J0cz1yKCJBcnJheSIpLnNsaWNlfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDcpLGk9big0OCksYT1uKDg5KSxzPW4oMzQpLHU9bigyMSksYz1uKDcxKSxsPW4oNzIpLGY9bigyKSgic3BlY2llcyIpLHA9W10uc2xpY2UsaD1NYXRoLm1heDtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6IWwoInNsaWNlIil9LHtzbGljZTpmdW5jdGlvbih0LGUpe3ZhciBuLHIsbCxkPXUodGhpcyksZz1zKGQubGVuZ3RoKSx2PWEodCxnKSx5PWEodm9pZCAwPT09ZT9nOmUsZyk7aWYoaShkKSYmKCJmdW5jdGlvbiIhPXR5cGVvZihuPWQuY29uc3RydWN0b3IpfHxuIT09QXJyYXkmJiFpKG4ucHJvdG90eXBlKT9vKG4pJiZudWxsPT09KG49bltmXSkmJihuPXZvaWQgMCk6bj12b2lkIDAsbj09PUFycmF5fHx2b2lkIDA9PT1uKSlyZXR1cm4gcC5jYWxsKGQsdix5KTtmb3Iocj1uZXcodm9pZCAwPT09bj9BcnJheTpuKShoKHktdiwwKSksbD0wO3Y8eTt2KyssbCsrKXYgaW4gZCYmYyhyLGwsZFt2XSk7cmV0dXJuIHIubGVuZ3RoPWwscn19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIzOCl9LGZ1bmN0aW9uKHQsZSxuKXtuKDIzOSk7dmFyIHI9bigxKTt0LmV4cG9ydHM9ci5PYmplY3Qua2V5c30sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDI0KSxpPW4oNTUpO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpuKDYpKGZ1bmN0aW9uKCl7aSgxKX0pfSx7a2V5czpmdW5jdGlvbih0KXtyZXR1cm4gaShvKHQpKX19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0MSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI0Miksbz1BcnJheS5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuaW5kZXhPZjtyZXR1cm4gdD09PW98fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PW8uaW5kZXhPZj9yOmV9fSxmdW5jdGlvbih0LGUsbil7bigyNDMpO3ZhciByPW4oMTgpO3QuZXhwb3J0cz1yKCJBcnJheSIpLmluZGV4T2Z9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oNjcpLmluZGV4T2YsaT1uKDI0NCksYT1bXS5pbmRleE9mLHM9ISFhJiYxL1sxXS5pbmRleE9mKDEsLTApPDAsdT1pKCJpbmRleE9mIik7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOnN8fHV9LHtpbmRleE9mOmZ1bmN0aW9uKHQpe3JldHVybiBzP2EuYXBwbHkodGhpcyxhcmd1bWVudHMpfHwwOm8odGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDYpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPVtdW3RdO3JldHVybiFufHwhcihmdW5jdGlvbigpe24uY2FsbChudWxsLGV8fGZ1bmN0aW9uKCl7dGhyb3cgMX0sMSl9KX19LGZ1bmN0aW9uKHQsZSxuKXtuKDExNSksdC5leHBvcnRzPW4oMSkuc2V0VGltZW91dH0sZnVuY3Rpb24odCxlLG4pe24oMTE1KSx0LmV4cG9ydHM9bigxKS5zZXRJbnRlcnZhbH0sZnVuY3Rpb24odCxlLG4pe3ZhciByPWZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZSxuPU9iamVjdC5wcm90b3R5cGUscj1uLmhhc093blByb3BlcnR5LG89ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbD9TeW1ib2w6e30saT1vLml0ZXJhdG9yfHwiQEBpdGVyYXRvciIsYT1vLmFzeW5jSXRlcmF0b3J8fCJAQGFzeW5jSXRlcmF0b3IiLHM9by50b1N0cmluZ1RhZ3x8IkBAdG9TdHJpbmdUYWciO2Z1bmN0aW9uIHUodCxlLG4pe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSksdFtlXX10cnl7dSh7fSwiIil9Y2F0Y2godCl7dT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHRbZV09bn19ZnVuY3Rpb24gYyh0LGUsbixyKXt2YXIgbz1lJiZlLnByb3RvdHlwZSBpbnN0YW5jZW9mIHY/ZTp2LGk9T2JqZWN0LmNyZWF0ZShvLnByb3RvdHlwZSksYT1uZXcgQShyfHxbXSk7cmV0dXJuIGkuX2ludm9rZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9ZjtyZXR1cm4gZnVuY3Rpb24obyxpKXtpZihyPT09aCl0aHJvdyBuZXcgRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmciKTtpZihyPT09ZCl7aWYoInRocm93Ij09PW8pdGhyb3cgaTtyZXR1cm4gTCgpfWZvcihuLm1ldGhvZD1vLG4uYXJnPWk7Oyl7dmFyIGE9bi5kZWxlZ2F0ZTtpZihhKXt2YXIgcz1qKGEsbik7aWYocyl7aWYocz09PWcpY29udGludWU7cmV0dXJuIHN9fWlmKCJuZXh0Ij09PW4ubWV0aG9kKW4uc2VudD1uLl9zZW50PW4uYXJnO2Vsc2UgaWYoInRocm93Ij09PW4ubWV0aG9kKXtpZihyPT09Zil0aHJvdyByPWQsbi5hcmc7bi5kaXNwYXRjaEV4Y2VwdGlvbihuLmFyZyl9ZWxzZSJyZXR1cm4iPT09bi5tZXRob2QmJm4uYWJydXB0KCJyZXR1cm4iLG4uYXJnKTtyPWg7dmFyIHU9bCh0LGUsbik7aWYoIm5vcm1hbCI9PT11LnR5cGUpe2lmKHI9bi5kb25lP2Q6cCx1LmFyZz09PWcpY29udGludWU7cmV0dXJue3ZhbHVlOnUuYXJnLGRvbmU6bi5kb25lfX0idGhyb3ciPT09dS50eXBlJiYocj1kLG4ubWV0aG9kPSJ0aHJvdyIsbi5hcmc9dS5hcmcpfX19KHQsbixhKSxpfWZ1bmN0aW9uIGwodCxlLG4pe3RyeXtyZXR1cm57dHlwZToibm9ybWFsIixhcmc6dC5jYWxsKGUsbil9fWNhdGNoKHQpe3JldHVybnt0eXBlOiJ0aHJvdyIsYXJnOnR9fX10LndyYXA9Yzt2YXIgZj0ic3VzcGVuZGVkU3RhcnQiLHA9InN1c3BlbmRlZFlpZWxkIixoPSJleGVjdXRpbmciLGQ9ImNvbXBsZXRlZCIsZz17fTtmdW5jdGlvbiB2KCl7fWZ1bmN0aW9uIHkoKXt9ZnVuY3Rpb24gbSgpe312YXIgYj17fTtiW2ldPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3ZhciB4PU9iamVjdC5nZXRQcm90b3R5cGVPZix3PXgmJngoeChDKFtdKSkpO3cmJnchPT1uJiZyLmNhbGwodyxpKSYmKGI9dyk7dmFyIGs9bS5wcm90b3R5cGU9di5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShiKTtmdW5jdGlvbiBTKHQpe1sibmV4dCIsInRocm93IiwicmV0dXJuIl0uZm9yRWFjaChmdW5jdGlvbihlKXt1KHQsZSxmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faW52b2tlKGUsdCl9KX0pfWZ1bmN0aW9uIEUodCxlKXt2YXIgbjt0aGlzLl9pbnZva2U9ZnVuY3Rpb24obyxpKXtmdW5jdGlvbiBhKCl7cmV0dXJuIG5ldyBlKGZ1bmN0aW9uKG4sYSl7IWZ1bmN0aW9uIG4obyxpLGEscyl7dmFyIHU9bCh0W29dLHQsaSk7aWYoInRocm93IiE9PXUudHlwZSl7dmFyIGM9dS5hcmcsZj1jLnZhbHVlO3JldHVybiBmJiYib2JqZWN0Ij09dHlwZW9mIGYmJnIuY2FsbChmLCJfX2F3YWl0Iik/ZS5yZXNvbHZlKGYuX19hd2FpdCkudGhlbihmdW5jdGlvbih0KXtuKCJuZXh0Iix0LGEscyl9LGZ1bmN0aW9uKHQpe24oInRocm93Iix0LGEscyl9KTplLnJlc29sdmUoZikudGhlbihmdW5jdGlvbih0KXtjLnZhbHVlPXQsYShjKX0sZnVuY3Rpb24odCl7cmV0dXJuIG4oInRocm93Iix0LGEscyl9KX1zKHUuYXJnKX0obyxpLG4sYSl9KX1yZXR1cm4gbj1uP24udGhlbihhLGEpOmEoKX19ZnVuY3Rpb24gaih0LG4pe3ZhciByPXQuaXRlcmF0b3Jbbi5tZXRob2RdO2lmKHI9PT1lKXtpZihuLmRlbGVnYXRlPW51bGwsInRocm93Ij09PW4ubWV0aG9kKXtpZih0Lml0ZXJhdG9yLnJldHVybiYmKG4ubWV0aG9kPSJyZXR1cm4iLG4uYXJnPWUsaih0LG4pLCJ0aHJvdyI9PT1uLm1ldGhvZCkpcmV0dXJuIGc7bi5tZXRob2Q9InRocm93IixuLmFyZz1uZXcgVHlwZUVycm9yKCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kIil9cmV0dXJuIGd9dmFyIG89bChyLHQuaXRlcmF0b3Isbi5hcmcpO2lmKCJ0aHJvdyI9PT1vLnR5cGUpcmV0dXJuIG4ubWV0aG9kPSJ0aHJvdyIsbi5hcmc9by5hcmcsbi5kZWxlZ2F0ZT1udWxsLGc7dmFyIGk9by5hcmc7cmV0dXJuIGk/aS5kb25lPyhuW3QucmVzdWx0TmFtZV09aS52YWx1ZSxuLm5leHQ9dC5uZXh0TG9jLCJyZXR1cm4iIT09bi5tZXRob2QmJihuLm1ldGhvZD0ibmV4dCIsbi5hcmc9ZSksbi5kZWxlZ2F0ZT1udWxsLGcpOmk6KG4ubWV0aG9kPSJ0aHJvdyIsbi5hcmc9bmV3IFR5cGVFcnJvcigiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3QiKSxuLmRlbGVnYXRlPW51bGwsZyl9ZnVuY3Rpb24gVCh0KXt2YXIgZT17dHJ5TG9jOnRbMF19OzEgaW4gdCYmKGUuY2F0Y2hMb2M9dFsxXSksMiBpbiB0JiYoZS5maW5hbGx5TG9jPXRbMl0sZS5hZnRlckxvYz10WzNdKSx0aGlzLnRyeUVudHJpZXMucHVzaChlKX1mdW5jdGlvbiBPKHQpe3ZhciBlPXQuY29tcGxldGlvbnx8e307ZS50eXBlPSJub3JtYWwiLGRlbGV0ZSBlLmFyZyx0LmNvbXBsZXRpb249ZX1mdW5jdGlvbiBBKHQpe3RoaXMudHJ5RW50cmllcz1be3RyeUxvYzoicm9vdCJ9XSx0LmZvckVhY2goVCx0aGlzKSx0aGlzLnJlc2V0KCEwKX1mdW5jdGlvbiBDKHQpe2lmKHQpe3ZhciBuPXRbaV07aWYobilyZXR1cm4gbi5jYWxsKHQpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0Lm5leHQpcmV0dXJuIHQ7aWYoIWlzTmFOKHQubGVuZ3RoKSl7dmFyIG89LTEsYT1mdW5jdGlvbiBuKCl7Zm9yKDsrK288dC5sZW5ndGg7KWlmKHIuY2FsbCh0LG8pKXJldHVybiBuLnZhbHVlPXRbb10sbi5kb25lPSExLG47cmV0dXJuIG4udmFsdWU9ZSxuLmRvbmU9ITAsbn07cmV0dXJuIGEubmV4dD1hfX1yZXR1cm57bmV4dDpMfX1mdW5jdGlvbiBMKCl7cmV0dXJue3ZhbHVlOmUsZG9uZTohMH19cmV0dXJuIHkucHJvdG90eXBlPWsuY29uc3RydWN0b3I9bSxtLmNvbnN0cnVjdG9yPXkseS5kaXNwbGF5TmFtZT11KG0scywiR2VuZXJhdG9yRnVuY3Rpb24iKSx0LmlzR2VuZXJhdG9yRnVuY3Rpb249ZnVuY3Rpb24odCl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQuY29uc3RydWN0b3I7cmV0dXJuISFlJiYoZT09PXl8fCJHZW5lcmF0b3JGdW5jdGlvbiI9PT0oZS5kaXNwbGF5TmFtZXx8ZS5uYW1lKSl9LHQubWFyaz1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0LG0pOih0Ll9fcHJvdG9fXz1tLHUodCxzLCJHZW5lcmF0b3JGdW5jdGlvbiIpKSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGspLHR9LHQuYXdyYXA9ZnVuY3Rpb24odCl7cmV0dXJue19fYXdhaXQ6dH19LFMoRS5wcm90b3R5cGUpLEUucHJvdG90eXBlW2FdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LHQuQXN5bmNJdGVyYXRvcj1FLHQuYXN5bmM9ZnVuY3Rpb24oZSxuLHIsbyxpKXt2b2lkIDA9PT1pJiYoaT1Qcm9taXNlKTt2YXIgYT1uZXcgRShjKGUsbixyLG8pLGkpO3JldHVybiB0LmlzR2VuZXJhdG9yRnVuY3Rpb24obik/YTphLm5leHQoKS50aGVuKGZ1bmN0aW9uKHQpe3JldHVybiB0LmRvbmU/dC52YWx1ZTphLm5leHQoKX0pfSxTKGspLHUoayxzLCJHZW5lcmF0b3IiKSxrW2ldPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGsudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iW29iamVjdCBHZW5lcmF0b3JdIn0sdC5rZXlzPWZ1bmN0aW9uKHQpe3ZhciBlPVtdO2Zvcih2YXIgbiBpbiB0KWUucHVzaChuKTtyZXR1cm4gZS5yZXZlcnNlKCksZnVuY3Rpb24gbigpe2Zvcig7ZS5sZW5ndGg7KXt2YXIgcj1lLnBvcCgpO2lmKHIgaW4gdClyZXR1cm4gbi52YWx1ZT1yLG4uZG9uZT0hMSxufXJldHVybiBuLmRvbmU9ITAsbn19LHQudmFsdWVzPUMsQS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkEscmVzZXQ6ZnVuY3Rpb24odCl7aWYodGhpcy5wcmV2PTAsdGhpcy5uZXh0PTAsdGhpcy5zZW50PXRoaXMuX3NlbnQ9ZSx0aGlzLmRvbmU9ITEsdGhpcy5kZWxlZ2F0ZT1udWxsLHRoaXMubWV0aG9kPSJuZXh0Iix0aGlzLmFyZz1lLHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKE8pLCF0KWZvcih2YXIgbiBpbiB0aGlzKSJ0Ij09PW4uY2hhckF0KDApJiZyLmNhbGwodGhpcyxuKSYmIWlzTmFOKCtuLnNsaWNlKDEpKSYmKHRoaXNbbl09ZSl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLmRvbmU9ITA7dmFyIHQ9dGhpcy50cnlFbnRyaWVzWzBdLmNvbXBsZXRpb247aWYoInRocm93Ij09PXQudHlwZSl0aHJvdyB0LmFyZztyZXR1cm4gdGhpcy5ydmFsfSxkaXNwYXRjaEV4Y2VwdGlvbjpmdW5jdGlvbih0KXtpZih0aGlzLmRvbmUpdGhyb3cgdDt2YXIgbj10aGlzO2Z1bmN0aW9uIG8ocixvKXtyZXR1cm4gcy50eXBlPSJ0aHJvdyIscy5hcmc9dCxuLm5leHQ9cixvJiYobi5tZXRob2Q9Im5leHQiLG4uYXJnPWUpLCEhb31mb3IodmFyIGk9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO2k+PTA7LS1pKXt2YXIgYT10aGlzLnRyeUVudHJpZXNbaV0scz1hLmNvbXBsZXRpb247aWYoInJvb3QiPT09YS50cnlMb2MpcmV0dXJuIG8oImVuZCIpO2lmKGEudHJ5TG9jPD10aGlzLnByZXYpe3ZhciB1PXIuY2FsbChhLCJjYXRjaExvYyIpLGM9ci5jYWxsKGEsImZpbmFsbHlMb2MiKTtpZih1JiZjKXtpZih0aGlzLnByZXY8YS5jYXRjaExvYylyZXR1cm4gbyhhLmNhdGNoTG9jLCEwKTtpZih0aGlzLnByZXY8YS5maW5hbGx5TG9jKXJldHVybiBvKGEuZmluYWxseUxvYyl9ZWxzZSBpZih1KXtpZih0aGlzLnByZXY8YS5jYXRjaExvYylyZXR1cm4gbyhhLmNhdGNoTG9jLCEwKX1lbHNle2lmKCFjKXRocm93IG5ldyBFcnJvcigidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHkiKTtpZih0aGlzLnByZXY8YS5maW5hbGx5TG9jKXJldHVybiBvKGEuZmluYWxseUxvYyl9fX19LGFicnVwdDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7bj49MDstLW4pe3ZhciBvPXRoaXMudHJ5RW50cmllc1tuXTtpZihvLnRyeUxvYzw9dGhpcy5wcmV2JiZyLmNhbGwobywiZmluYWxseUxvYyIpJiZ0aGlzLnByZXY8by5maW5hbGx5TG9jKXt2YXIgaT1vO2JyZWFrfX1pJiYoImJyZWFrIj09PXR8fCJjb250aW51ZSI9PT10KSYmaS50cnlMb2M8PWUmJmU8PWkuZmluYWxseUxvYyYmKGk9bnVsbCk7dmFyIGE9aT9pLmNvbXBsZXRpb246e307cmV0dXJuIGEudHlwZT10LGEuYXJnPWUsaT8odGhpcy5tZXRob2Q9Im5leHQiLHRoaXMubmV4dD1pLmZpbmFsbHlMb2MsZyk6dGhpcy5jb21wbGV0ZShhKX0sY29tcGxldGU6ZnVuY3Rpb24odCxlKXtpZigidGhyb3ciPT09dC50eXBlKXRocm93IHQuYXJnO3JldHVybiJicmVhayI9PT10LnR5cGV8fCJjb250aW51ZSI9PT10LnR5cGU/dGhpcy5uZXh0PXQuYXJnOiJyZXR1cm4iPT09dC50eXBlPyh0aGlzLnJ2YWw9dGhpcy5hcmc9dC5hcmcsdGhpcy5tZXRob2Q9InJldHVybiIsdGhpcy5uZXh0PSJlbmQiKToibm9ybWFsIj09PXQudHlwZSYmZSYmKHRoaXMubmV4dD1lKSxnfSxmaW5pc2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtlPj0wOy0tZSl7dmFyIG49dGhpcy50cnlFbnRyaWVzW2VdO2lmKG4uZmluYWxseUxvYz09PXQpcmV0dXJuIHRoaXMuY29tcGxldGUobi5jb21wbGV0aW9uLG4uYWZ0ZXJMb2MpLE8obiksZ319LGNhdGNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7ZT49MDstLWUpe3ZhciBuPXRoaXMudHJ5RW50cmllc1tlXTtpZihuLnRyeUxvYz09PXQpe3ZhciByPW4uY29tcGxldGlvbjtpZigidGhyb3ciPT09ci50eXBlKXt2YXIgbz1yLmFyZztPKG4pfXJldHVybiBvfX10aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdCIpfSxkZWxlZ2F0ZVlpZWxkOmZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdGhpcy5kZWxlZ2F0ZT17aXRlcmF0b3I6Qyh0KSxyZXN1bHROYW1lOm4sbmV4dExvYzpyfSwibmV4dCI9PT10aGlzLm1ldGhvZCYmKHRoaXMuYXJnPWUpLGd9fSx0fSh0LmV4cG9ydHMpO3RyeXtyZWdlbmVyYXRvclJ1bnRpbWU9cn1jYXRjaCh0KXtGdW5jdGlvbigiciIsInJlZ2VuZXJhdG9yUnVudGltZSA9IHIiKShyKX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNDkpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNTApLG89RnVuY3Rpb24ucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmJpbmQ7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgRnVuY3Rpb24mJmU9PT1vLmJpbmQ/cjplfX0sZnVuY3Rpb24odCxlLG4pe24oMjUxKTt2YXIgcj1uKDE4KTt0LmV4cG9ydHM9cigiRnVuY3Rpb24iKS5iaW5kfSxmdW5jdGlvbih0LGUsbil7bigwKSh7dGFyZ2V0OiJGdW5jdGlvbiIscHJvdG86ITB9LHtiaW5kOm4oOTEpfSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNTMpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTE2KSxuKDI1OSksbigyNjApLG4oMjYxKSxuKDI2Mil9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHIsbyxpLGEscz1uKDApLHU9bigyOCksYz1uKDUpLGw9bigxKSxmPW4oMTE3KSxwPW4oMzYpLGg9bigxMTgpLGQ9bigyOSksZz1uKDI1NSksdj1uKDcpLHk9bigyMiksbT1uKDExOSksYj1uKDI3KSx4PW4oNTkpLHc9bigxMTMpLGs9bigxMjApLFM9bigxMjEpLnNldCxFPW4oMjU2KSxqPW4oMTIyKSxUPW4oMjU3KSxPPW4oNTMpLEE9big2MCksQz1uKDc5KSxMPW4oNTApLFI9big4NyksUD1uKDIpKCJzcGVjaWVzIiksTj0iUHJvbWlzZSIsST1MLmdldCxfPUwuc2V0LEQ9TC5nZXR0ZXJGb3IoTiksTT1mLFU9Yy5UeXBlRXJyb3IsQj1jLmRvY3VtZW50LHE9Yy5wcm9jZXNzLEY9Yy5mZXRjaCxIPXEmJnEudmVyc2lvbnMsej1IJiZILnY4fHwiIixXPU8uZiwkPVcsWT0icHJvY2VzcyI9PWIocSksVj0hIShCJiZCLmNyZWF0ZUV2ZW50JiZjLmRpc3BhdGNoRXZlbnQpLEc9UihOLGZ1bmN0aW9uKCl7dmFyIHQ9TS5yZXNvbHZlKDEpLGU9ZnVuY3Rpb24oKXt9LG49KHQuY29uc3RydWN0b3I9e30pW1BdPWZ1bmN0aW9uKHQpe3QoZSxlKX07cmV0dXJuISgoWXx8ImZ1bmN0aW9uIj09dHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCkmJighdXx8dC5maW5hbGx5KSYmdC50aGVuKGUpaW5zdGFuY2VvZiBuJiYwIT09ei5pbmRleE9mKCI2LjYiKSYmLTE9PT1DLmluZGV4T2YoIkNocm9tZS82NiIpKX0pLEs9R3x8IXcoZnVuY3Rpb24odCl7TS5hbGwodCkuY2F0Y2goZnVuY3Rpb24oKXt9KX0pLFg9ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuISghdih0KXx8ImZ1bmN0aW9uIiE9dHlwZW9mKGU9dC50aGVuKSkmJmV9LEo9ZnVuY3Rpb24odCxlLG4pe2lmKCFlLm5vdGlmaWVkKXtlLm5vdGlmaWVkPSEwO3ZhciByPWUucmVhY3Rpb25zO0UoZnVuY3Rpb24oKXtmb3IodmFyIG89ZS52YWx1ZSxpPTE9PWUuc3RhdGUsYT0wO3IubGVuZ3RoPmE7KXt2YXIgcyx1LGMsbD1yW2ErK10sZj1pP2wub2s6bC5mYWlsLHA9bC5yZXNvbHZlLGg9bC5yZWplY3QsZD1sLmRvbWFpbjt0cnl7Zj8oaXx8KDI9PT1lLnJlamVjdGlvbiYmZXQodCxlKSxlLnJlamVjdGlvbj0xKSwhMD09PWY/cz1vOihkJiZkLmVudGVyKCkscz1mKG8pLGQmJihkLmV4aXQoKSxjPSEwKSkscz09PWwucHJvbWlzZT9oKFUoIlByb21pc2UtY2hhaW4gY3ljbGUiKSk6KHU9WChzKSk/dS5jYWxsKHMscCxoKTpwKHMpKTpoKG8pfWNhdGNoKHQpe2QmJiFjJiZkLmV4aXQoKSxoKHQpfX1lLnJlYWN0aW9ucz1bXSxlLm5vdGlmaWVkPSExLG4mJiFlLnJlamVjdGlvbiYmWih0LGUpfSl9fSxRPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvO1Y/KChyPUIuY3JlYXRlRXZlbnQoIkV2ZW50IikpLnByb21pc2U9ZSxyLnJlYXNvbj1uLHIuaW5pdEV2ZW50KHQsITEsITApLGMuZGlzcGF0Y2hFdmVudChyKSk6cj17cHJvbWlzZTplLHJlYXNvbjpufSwobz1jWyJvbiIrdF0pP28ocik6InVuaGFuZGxlZHJlamVjdGlvbiI9PT10JiZUKCJVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24iLG4pfSxaPWZ1bmN0aW9uKHQsZSl7Uy5jYWxsKGMsZnVuY3Rpb24oKXt2YXIgbixyPWUudmFsdWU7aWYodHQoZSkmJihuPUEoZnVuY3Rpb24oKXtZP3EuZW1pdCgidW5oYW5kbGVkUmVqZWN0aW9uIixyLHQpOlEoInVuaGFuZGxlZHJlamVjdGlvbiIsdCxyKX0pLGUucmVqZWN0aW9uPVl8fHR0KGUpPzI6MSxuLmVycm9yKSl0aHJvdyBuLnZhbHVlfSl9LHR0PWZ1bmN0aW9uKHQpe3JldHVybiAxIT09dC5yZWplY3Rpb24mJiF0LnBhcmVudH0sZXQ9ZnVuY3Rpb24odCxlKXtTLmNhbGwoYyxmdW5jdGlvbigpe1k/cS5lbWl0KCJyZWplY3Rpb25IYW5kbGVkIix0KTpRKCJyZWplY3Rpb25oYW5kbGVkIix0LGUudmFsdWUpfSl9LG50PWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBmdW5jdGlvbihvKXt0KGUsbixvLHIpfX0scnQ9ZnVuY3Rpb24odCxlLG4scil7ZS5kb25lfHwoZS5kb25lPSEwLHImJihlPXIpLGUudmFsdWU9bixlLnN0YXRlPTIsSih0LGUsITApKX0sb3Q9ZnVuY3Rpb24odCxlLG4scil7aWYoIWUuZG9uZSl7ZS5kb25lPSEwLHImJihlPXIpO3RyeXtpZih0PT09bil0aHJvdyBVKCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZiIpO3ZhciBvPVgobik7bz9FKGZ1bmN0aW9uKCl7dmFyIHI9e2RvbmU6ITF9O3RyeXtvLmNhbGwobixudChvdCx0LHIsZSksbnQocnQsdCxyLGUpKX1jYXRjaChuKXtydCh0LHIsbixlKX19KTooZS52YWx1ZT1uLGUuc3RhdGU9MSxKKHQsZSwhMSkpfWNhdGNoKG4pe3J0KHQse2RvbmU6ITF9LG4sZSl9fX07RyYmKE09ZnVuY3Rpb24odCl7bSh0aGlzLE0sTikseSh0KSxyLmNhbGwodGhpcyk7dmFyIGU9SSh0aGlzKTt0cnl7dChudChvdCx0aGlzLGUpLG50KHJ0LHRoaXMsZSkpfWNhdGNoKHQpe3J0KHRoaXMsZSx0KX19LChyPWZ1bmN0aW9uKHQpe18odGhpcyx7dHlwZTpOLGRvbmU6ITEsbm90aWZpZWQ6ITEscGFyZW50OiExLHJlYWN0aW9uczpbXSxyZWplY3Rpb246ITEsc3RhdGU6MCx2YWx1ZTp2b2lkIDB9KX0pLnByb3RvdHlwZT1oKE0ucHJvdG90eXBlLHt0aGVuOmZ1bmN0aW9uKHQsZSl7dmFyIG49RCh0aGlzKSxyPVcoayh0aGlzLE0pKTtyZXR1cm4gci5vaz0iZnVuY3Rpb24iIT10eXBlb2YgdHx8dCxyLmZhaWw9ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUsci5kb21haW49WT9xLmRvbWFpbjp2b2lkIDAsbi5wYXJlbnQ9ITAsbi5yZWFjdGlvbnMucHVzaChyKSwwIT1uLnN0YXRlJiZKKHRoaXMsbiwhMSksci5wcm9taXNlfSxjYXRjaDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aGVuKHZvaWQgMCx0KX19KSxvPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IHIsZT1JKHQpO3RoaXMucHJvbWlzZT10LHRoaXMucmVzb2x2ZT1udChvdCx0LGUpLHRoaXMucmVqZWN0PW50KHJ0LHQsZSl9LE8uZj1XPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09TXx8dD09PWk/bmV3IG8odCk6JCh0KX0sdXx8ImZ1bmN0aW9uIiE9dHlwZW9mIGZ8fChhPWYucHJvdG90eXBlLnRoZW4scChmLnByb3RvdHlwZSwidGhlbiIsZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3JldHVybiBuZXcgTShmdW5jdGlvbih0LGUpe2EuY2FsbChuLHQsZSl9KS50aGVuKHQsZSl9KSwiZnVuY3Rpb24iPT10eXBlb2YgRiYmcyh7Z2xvYmFsOiEwLGVudW1lcmFibGU6ITAsZm9yY2VkOiEwfSx7ZmV0Y2g6ZnVuY3Rpb24odCl7cmV0dXJuIGooTSxGLmFwcGx5KGMsYXJndW1lbnRzKSl9fSkpKSxzKHtnbG9iYWw6ITAsd3JhcDohMCxmb3JjZWQ6R30se1Byb21pc2U6TX0pLGQoTSxOLCExLCEwKSxnKE4pLGk9bC5Qcm9taXNlLHMoe3RhcmdldDpOLHN0YXQ6ITAsZm9yY2VkOkd9LHtyZWplY3Q6ZnVuY3Rpb24odCl7dmFyIGU9Vyh0aGlzKTtyZXR1cm4gZS5yZWplY3QuY2FsbCh2b2lkIDAsdCksZS5wcm9taXNlfX0pLHMoe3RhcmdldDpOLHN0YXQ6ITAsZm9yY2VkOnV8fEd9LHtyZXNvbHZlOmZ1bmN0aW9uKHQpe3JldHVybiBqKHUmJnRoaXM9PT1pP006dGhpcyx0KX19KSxzKHt0YXJnZXQ6TixzdGF0OiEwLGZvcmNlZDpLfSx7YWxsOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1XKGUpLHI9bi5yZXNvbHZlLG89bi5yZWplY3QsaT1BKGZ1bmN0aW9uKCl7dmFyIG49eShlLnJlc29sdmUpLGk9W10sYT0wLHM9MTt4KHQsZnVuY3Rpb24odCl7dmFyIHU9YSsrLGM9ITE7aS5wdXNoKHZvaWQgMCkscysrLG4uY2FsbChlLHQpLnRoZW4oZnVuY3Rpb24odCl7Y3x8KGM9ITAsaVt1XT10LC0tc3x8cihpKSl9LG8pfSksLS1zfHxyKGkpfSk7cmV0dXJuIGkuZXJyb3ImJm8oaS52YWx1ZSksbi5wcm9taXNlfSxyYWNlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1XKGUpLHI9bi5yZWplY3Qsbz1BKGZ1bmN0aW9uKCl7dmFyIG89eShlLnJlc29sdmUpO3godCxmdW5jdGlvbih0KXtvLmNhbGwoZSx0KS50aGVuKG4ucmVzb2x2ZSxyKX0pfSk7cmV0dXJuIG8uZXJyb3ImJnIoby52YWx1ZSksbi5wcm9taXNlfX0pfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzMpLG89bigyMyksaT1uKDIpLGE9bigxMykscz1pKCJzcGVjaWVzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXIodCksbj1vLmY7YSYmZSYmIWVbc10mJm4oZSxzLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9fSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGEscyx1LGMsbD1uKDUpLGY9big0NSkuZixwPW4oMjcpLGg9bigxMjEpLnNldCxkPW4oNzkpLGc9bC5NdXRhdGlvbk9ic2VydmVyfHxsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXIsdj1sLnByb2Nlc3MseT1sLlByb21pc2UsbT0icHJvY2VzcyI9PXAodiksYj1mKGwsInF1ZXVlTWljcm90YXNrIikseD1iJiZiLnZhbHVlO3h8fChyPWZ1bmN0aW9uKCl7dmFyIHQsZTtmb3IobSYmKHQ9di5kb21haW4pJiZ0LmV4aXQoKTtvOyl7ZT1vLmZuLG89by5uZXh0O3RyeXtlKCl9Y2F0Y2godCl7dGhyb3cgbz9hKCk6aT12b2lkIDAsdH19aT12b2lkIDAsdCYmdC5lbnRlcigpfSxtP2E9ZnVuY3Rpb24oKXt2Lm5leHRUaWNrKHIpfTpnJiYhLyhpcGhvbmV8aXBvZHxpcGFkKS4qYXBwbGV3ZWJraXQvaS50ZXN0KGQpPyhzPSEwLHU9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiIpLG5ldyBnKHIpLm9ic2VydmUodSx7Y2hhcmFjdGVyRGF0YTohMH0pLGE9ZnVuY3Rpb24oKXt1LmRhdGE9cz0hc30pOnkmJnkucmVzb2x2ZT8oYz15LnJlc29sdmUodm9pZCAwKSxhPWZ1bmN0aW9uKCl7Yy50aGVuKHIpfSk6YT1mdW5jdGlvbigpe2guY2FsbChsLHIpfSksdC5leHBvcnRzPXh8fGZ1bmN0aW9uKHQpe3ZhciBlPXtmbjp0LG5leHQ6dm9pZCAwfTtpJiYoaS5uZXh0PWUpLG98fChvPWUsYSgpKSxpPWV9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbj1yLmNvbnNvbGU7biYmbi5lcnJvciYmKDE9PT1hcmd1bWVudHMubGVuZ3RoP24uZXJyb3IodCk6bi5lcnJvcih0LGUpKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oMjgpLGk9bigxMTcpLGE9bigzMykscz1uKDEyMCksdT1uKDEyMiksYz1uKDM2KTtyKHt0YXJnZXQ6IlByb21pc2UiLHByb3RvOiEwLHJlYWw6ITB9LHtmaW5hbGx5OmZ1bmN0aW9uKHQpe3ZhciBlPXModGhpcyxhKCJQcm9taXNlIikpLG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ7cmV0dXJuIHRoaXMudGhlbihuP2Z1bmN0aW9uKG4pe3JldHVybiB1KGUsdCgpKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIG59KX06dCxuP2Z1bmN0aW9uKG4pe3JldHVybiB1KGUsdCgpKS50aGVuKGZ1bmN0aW9uKCl7dGhyb3cgbn0pfTp0KX19KSxvfHwiZnVuY3Rpb24iIT10eXBlb2YgaXx8aS5wcm90b3R5cGUuZmluYWxseXx8YyhpLnByb3RvdHlwZSwiZmluYWxseSIsYSgiUHJvbWlzZSIpLnByb3RvdHlwZS5maW5hbGx5KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDQ5KSxpPW4oNzQpLGE9big0Nykscz1uKDMxKSx1PW4oNTkpLGM9bigxNyksbD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7aWYoIShuIGluc3RhbmNlb2YgbCkpcmV0dXJuIG5ldyBsKHQsZSk7aSYmKG49aShuZXcgRXJyb3IoZSksbyhuKSkpO3ZhciByPVtdO3JldHVybiB1KHQsci5wdXNoLHIpLGMobiwiZXJyb3JzIixyKSx2b2lkIDAhPT1lJiZjKG4sIm1lc3NhZ2UiLFN0cmluZyhlKSksbn07bC5wcm90b3R5cGU9YShFcnJvci5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnMoNSxsKSxuYW1lOnMoNSwiQWdncmVnYXRlRXJyb3IiKX0pLHIoe2dsb2JhbDohMH0se0FnZ3JlZ2F0ZUVycm9yOmx9KX0sZnVuY3Rpb24odCxlLG4pe24oMTIzKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89big1MyksaT1uKDYwKTtyKHt0YXJnZXQ6IlByb21pc2UiLHN0YXQ6ITB9LHt0cnk6ZnVuY3Rpb24odCl7dmFyIGU9by5mKHRoaXMpLG49aSh0KTtyZXR1cm4obi5lcnJvcj9lLnJlamVjdDplLnJlc29sdmUpKG4udmFsdWUpLGUucHJvbWlzZX19KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89bigyMiksaT1uKDMzKSxhPW4oNTMpLHM9big2MCksdT1uKDU5KTtyKHt0YXJnZXQ6IlByb21pc2UiLHN0YXQ6ITB9LHthbnk6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWEuZihlKSxyPW4ucmVzb2x2ZSxjPW4ucmVqZWN0LGw9cyhmdW5jdGlvbigpe3ZhciBuPW8oZS5yZXNvbHZlKSxhPVtdLHM9MCxsPTEsZj0hMTt1KHQsZnVuY3Rpb24odCl7dmFyIG89cysrLHU9ITE7YS5wdXNoKHZvaWQgMCksbCsrLG4uY2FsbChlLHQpLnRoZW4oZnVuY3Rpb24odCl7dXx8Znx8KGY9ITAscih0KSl9LGZ1bmN0aW9uKHQpe3V8fGZ8fCh1PSEwLGFbb109dCwtLWx8fGMobmV3KGkoIkFnZ3JlZ2F0ZUVycm9yIikpKGEsIk5vIG9uZSBwcm9taXNlIHJlc29sdmVkIikpKX0pfSksLS1sfHxjKG5ldyhpKCJBZ2dyZWdhdGVFcnJvciIpKShhLCJObyBvbmUgcHJvbWlzZSByZXNvbHZlZCIpKX0pO3JldHVybiBsLmVycm9yJiZjKGwudmFsdWUpLG4ucHJvbWlzZX19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDExNil9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsci5rZXkscil9fXJldHVybiBmdW5jdGlvbihlLG4scil7cmV0dXJuIG4mJnQoZS5wcm90b3R5cGUsbiksciYmdChlLHIpLGV9fSgpLG89ZnVuY3Rpb24odCl7aWYodCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBlPXt9O2lmKG51bGwhPXQpZm9yKHZhciBuIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbikmJihlW25dPXRbbl0pO3JldHVybiBlLmRlZmF1bHQ9dCxlfShuKDI2NSkpLGk9cChuKDI2NikpLGE9cChuKDI2NykpLHM9cChuKDI2OCkpLHU9cChuKDI2OSkpLGM9cChuKDI3MCkpLGw9cChuKDI3MSkpLGY9cChuKDI3MikpO2Z1bmN0aW9uIHAodCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fXZhciBoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307IWZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsdCksdGhpcy50eXBlPSJsYW5ndWFnZURldGVjdG9yIix0aGlzLmRldGVjdG9ycz17fSx0aGlzLmluaXQoZSxuKX1yZXR1cm4gcih0LFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e30sbj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e307dGhpcy5zZXJ2aWNlcz10LHRoaXMub3B0aW9ucz1vLmRlZmF1bHRzKGUsdGhpcy5vcHRpb25zfHx7fSx7b3JkZXI6WyJxdWVyeXN0cmluZyIsImNvb2tpZSIsImxvY2FsU3RvcmFnZSIsIm5hdmlnYXRvciIsImh0bWxUYWciXSxsb29rdXBRdWVyeXN0cmluZzoibG5nIixsb29rdXBDb29raWU6ImkxOG5leHQiLGxvb2t1cExvY2FsU3RvcmFnZToiaTE4bmV4dExuZyIsY2FjaGVzOlsibG9jYWxTdG9yYWdlIl0sZXhjbHVkZUNhY2hlRm9yOlsiY2ltb2RlIl19KSx0aGlzLm9wdGlvbnMubG9va3VwRnJvbVVybEluZGV4JiYodGhpcy5vcHRpb25zLmxvb2t1cEZyb21QYXRoSW5kZXg9dGhpcy5vcHRpb25zLmxvb2t1cEZyb21VcmxJbmRleCksdGhpcy5pMThuT3B0aW9ucz1uLHRoaXMuYWRkRGV0ZWN0b3IoaS5kZWZhdWx0KSx0aGlzLmFkZERldGVjdG9yKGEuZGVmYXVsdCksdGhpcy5hZGREZXRlY3RvcihzLmRlZmF1bHQpLHRoaXMuYWRkRGV0ZWN0b3IodS5kZWZhdWx0KSx0aGlzLmFkZERldGVjdG9yKGMuZGVmYXVsdCksdGhpcy5hZGREZXRlY3RvcihsLmRlZmF1bHQpLHRoaXMuYWRkRGV0ZWN0b3IoZi5kZWZhdWx0KX19LHtrZXk6ImFkZERldGVjdG9yIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLmRldGVjdG9yc1t0Lm5hbWVdPXR9fSx7a2V5OiJkZXRlY3QiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dHx8KHQ9dGhpcy5vcHRpb25zLm9yZGVyKTt2YXIgbj1bXTt0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoZS5kZXRlY3RvcnNbdF0pe3ZhciByPWUuZGV0ZWN0b3JzW3RdLmxvb2t1cChlLm9wdGlvbnMpO3ImJiJzdHJpbmciPT10eXBlb2YgciYmKHI9W3JdKSxyJiYobj1uLmNvbmNhdChyKSl9fSk7dmFyIHI9dm9pZCAwO2lmKG4uZm9yRWFjaChmdW5jdGlvbih0KXtpZighcil7dmFyIG49ZS5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmZvcm1hdExhbmd1YWdlQ29kZSh0KTtlLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuaXNXaGl0ZWxpc3RlZChuKSYmKHI9bil9fSksIXIpe3ZhciBvPXRoaXMuaTE4bk9wdGlvbnMuZmFsbGJhY2tMbmc7InN0cmluZyI9PXR5cGVvZiBvJiYobz1bb10pLG98fChvPVtdKSxyPSJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KG8pP29bMF06b1swXXx8by5kZWZhdWx0JiZvLmRlZmF1bHRbMF19cmV0dXJuIHJ9fSx7a2V5OiJjYWNoZVVzZXJMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO2V8fChlPXRoaXMub3B0aW9ucy5jYWNoZXMpLGUmJih0aGlzLm9wdGlvbnMuZXhjbHVkZUNhY2hlRm9yJiZ0aGlzLm9wdGlvbnMuZXhjbHVkZUNhY2hlRm9yLmluZGV4T2YodCk+LTF8fGUuZm9yRWFjaChmdW5jdGlvbihlKXtuLmRldGVjdG9yc1tlXSYmbi5kZXRlY3RvcnNbZV0uY2FjaGVVc2VyTGFuZ3VhZ2UodCxuLm9wdGlvbnMpfSkpfX1dKSx0fSgpO2gudHlwZT0ibGFuZ3VhZ2VEZXRlY3RvciIsZS5kZWZhdWx0PWh9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZGVmYXVsdHM9ZnVuY3Rpb24odCl7cmV0dXJuIG8uY2FsbChpLmNhbGwoYXJndW1lbnRzLDEpLGZ1bmN0aW9uKGUpe2lmKGUpZm9yKHZhciBuIGluIGUpdm9pZCAwPT09dFtuXSYmKHRbbl09ZVtuXSl9KSx0fSxlLmV4dGVuZD1mdW5jdGlvbih0KXtyZXR1cm4gby5jYWxsKGkuY2FsbChhcmd1bWVudHMsMSksZnVuY3Rpb24oZSl7aWYoZSlmb3IodmFyIG4gaW4gZSl0W25dPWVbbl19KSx0fTt2YXIgcj1bXSxvPXIuZm9yRWFjaCxpPXIuc2xpY2V9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPXZvaWQgMDtpZihuKXt2YXIgaT1uZXcgRGF0ZTtpLnNldFRpbWUoaS5nZXRUaW1lKCkrNjAqbioxZTMpLG89IjsgZXhwaXJlcz0iK2kudG9HTVRTdHJpbmcoKX1lbHNlIG89IiI7cj1yPyJkb21haW49IityKyI7IjoiIixkb2N1bWVudC5jb29raWU9dCsiPSIrZStvKyI7IityKyJwYXRoPS8ifSxvPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10KyI9IixuPWRvY3VtZW50LmNvb2tpZS5zcGxpdCgiOyIpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7Zm9yKHZhciBvPW5bcl07IiAiPT09by5jaGFyQXQoMCk7KW89by5zdWJzdHJpbmcoMSxvLmxlbmd0aCk7aWYoMD09PW8uaW5kZXhPZihlKSlyZXR1cm4gby5zdWJzdHJpbmcoZS5sZW5ndGgsby5sZW5ndGgpfXJldHVybiBudWxsfTtlLmRlZmF1bHQ9e25hbWU6ImNvb2tpZSIsbG9va3VwOmZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMDtpZih0Lmxvb2t1cENvb2tpZSYmInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCl7dmFyIG49byh0Lmxvb2t1cENvb2tpZSk7biYmKGU9bil9cmV0dXJuIGV9LGNhY2hlVXNlckxhbmd1YWdlOmZ1bmN0aW9uKHQsZSl7ZS5sb29rdXBDb29raWUmJiJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJnIoZS5sb29rdXBDb29raWUsdCxlLmNvb2tpZU1pbnV0ZXMsZS5jb29raWVEb21haW4pfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZGVmYXVsdD17bmFtZToicXVlcnlzdHJpbmciLGxvb2t1cDpmdW5jdGlvbih0KXt2YXIgZT12b2lkIDA7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cpZm9yKHZhciBuPXdpbmRvdy5sb2NhdGlvbi5zZWFyY2guc3Vic3RyaW5nKDEpLnNwbGl0KCImIikscj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgbz1uW3JdLmluZGV4T2YoIj0iKTtpZihvPjApbltyXS5zdWJzdHJpbmcoMCxvKT09PXQubG9va3VwUXVlcnlzdHJpbmcmJihlPW5bcl0uc3Vic3RyaW5nKG8rMSkpfXJldHVybiBlfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPXZvaWQgMDt0cnl7cj0idW5kZWZpbmVkIiE9PXdpbmRvdyYmbnVsbCE9PXdpbmRvdy5sb2NhbFN0b3JhZ2U7d2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKCJpMThuZXh0LnRyYW5zbGF0ZS5ib28iLCJmb28iKSx3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oImkxOG5leHQudHJhbnNsYXRlLmJvbyIpfWNhdGNoKHQpe3I9ITF9ZS5kZWZhdWx0PXtuYW1lOiJsb2NhbFN0b3JhZ2UiLGxvb2t1cDpmdW5jdGlvbih0KXt2YXIgZT12b2lkIDA7aWYodC5sb29rdXBMb2NhbFN0b3JhZ2UmJnIpe3ZhciBuPXdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0Lmxvb2t1cExvY2FsU3RvcmFnZSk7biYmKGU9bil9cmV0dXJuIGV9LGNhY2hlVXNlckxhbmd1YWdlOmZ1bmN0aW9uKHQsZSl7ZS5sb29rdXBMb2NhbFN0b3JhZ2UmJnImJndpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShlLmxvb2t1cExvY2FsU3RvcmFnZSx0KX19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmRlZmF1bHQ9e25hbWU6Im5hdmlnYXRvciIsbG9va3VwOmZ1bmN0aW9uKHQpe3ZhciBlPVtdO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgbmF2aWdhdG9yKXtpZihuYXZpZ2F0b3IubGFuZ3VhZ2VzKWZvcih2YXIgbj0wO248bmF2aWdhdG9yLmxhbmd1YWdlcy5sZW5ndGg7bisrKWUucHVzaChuYXZpZ2F0b3IubGFuZ3VhZ2VzW25dKTtuYXZpZ2F0b3IudXNlckxhbmd1YWdlJiZlLnB1c2gobmF2aWdhdG9yLnVzZXJMYW5ndWFnZSksbmF2aWdhdG9yLmxhbmd1YWdlJiZlLnB1c2gobmF2aWdhdG9yLmxhbmd1YWdlKX1yZXR1cm4gZS5sZW5ndGg+MD9lOnZvaWQgMH19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmRlZmF1bHQ9e25hbWU6Imh0bWxUYWciLGxvb2t1cDpmdW5jdGlvbih0KXt2YXIgZT12b2lkIDAsbj10Lmh0bWxUYWd8fCgidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50P2RvY3VtZW50LmRvY3VtZW50RWxlbWVudDpudWxsKTtyZXR1cm4gbiYmImZ1bmN0aW9uIj09dHlwZW9mIG4uZ2V0QXR0cmlidXRlJiYoZT1uLmdldEF0dHJpYnV0ZSgibGFuZyIpKSxlfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZGVmYXVsdD17bmFtZToicGF0aCIsbG9va3VwOmZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyl7dmFyIG49d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLm1hdGNoKC9cLyhbYS16QS1aLV0qKS9nKTtpZihuIGluc3RhbmNlb2YgQXJyYXkpaWYoIm51bWJlciI9PXR5cGVvZiB0Lmxvb2t1cEZyb21QYXRoSW5kZXgpe2lmKCJzdHJpbmciIT10eXBlb2Ygblt0Lmxvb2t1cEZyb21QYXRoSW5kZXhdKXJldHVybjtlPW5bdC5sb29rdXBGcm9tUGF0aEluZGV4XS5yZXBsYWNlKCIvIiwiIil9ZWxzZSBlPW5bMF0ucmVwbGFjZSgiLyIsIiIpfXJldHVybiBlfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZGVmYXVsdD17bmFtZToic3ViZG9tYWluIixsb29rdXA6ZnVuY3Rpb24odCl7dmFyIGU9dm9pZCAwO2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93KXt2YXIgbj13aW5kb3cubG9jYXRpb24uaHJlZi5tYXRjaCgvKD86aHR0cFtzXSpcOlwvXC8pKiguKj8pXC4oPz1bXlwvXSpcLi57Miw1fSkvZ2kpO24gaW5zdGFuY2VvZiBBcnJheSYmKGU9Im51bWJlciI9PXR5cGVvZiB0Lmxvb2t1cEZyb21TdWJkb21haW5JbmRleD9uW3QubG9va3VwRnJvbVN1YmRvbWFpbkluZGV4XS5yZXBsYWNlKCJodHRwOi8vIiwiIikucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKS5yZXBsYWNlKCIuIiwiIik6blswXS5yZXBsYWNlKCJodHRwOi8vIiwiIikucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKS5yZXBsYWNlKCIuIiwiIikpfXJldHVybiBlfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI3NCksbz1uKDEyNCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHIodCkpcmV0dXJuIG8odCl9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjc1KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDEwOSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEyNSksbz1uKDI3OCksaT1uKDEwMyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PWkmJm8oT2JqZWN0KHQpKSlyZXR1cm4gcih0KX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMTApfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjc5KX0sZnVuY3Rpb24odCxlLG4pe24oNTEpLG4oMzUpLHQuZXhwb3J0cz1uKDI4MCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDc2KSxvPW4oMiksaT1uKDMwKSxhPW8oIml0ZXJhdG9yIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPU9iamVjdCh0KTtyZXR1cm4gdm9pZCAwIT09ZVthXXx8IkBAaXRlcmF0b3IiaW4gZXx8aS5oYXNPd25Qcm9wZXJ0eShyKGUpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEyNSksbz1uKDI4MiksaT1uKDEyNCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG47aWYodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBpKHQsZSk7dmFyIGE9byhuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSkuY2FsbChuLDgsLTEpO3JldHVybiJPYmplY3QiPT09YSYmdC5jb25zdHJ1Y3RvciYmKGE9dC5jb25zdHJ1Y3Rvci5uYW1lKSwiTWFwIj09PWF8fCJTZXQiPT09YT9yKHQpOiJBcmd1bWVudHMiPT09YXx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QoYSk/aSh0LGUpOnZvaWQgMH19fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjgzKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDExNCl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjg2KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjg3KSxvPW4oMjg5KSxpPUFycmF5LnByb3RvdHlwZSxhPVN0cmluZy5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuaW5jbHVkZXM7cmV0dXJuIHQ9PT1pfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1pLmluY2x1ZGVzP3I6InN0cmluZyI9PXR5cGVvZiB0fHx0PT09YXx8dCBpbnN0YW5jZW9mIFN0cmluZyYmZT09PWEuaW5jbHVkZXM/bzplfX0sZnVuY3Rpb24odCxlLG4pe24oMjg4KTt2YXIgcj1uKDE4KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5pbmNsdWRlc30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89big2NykuaW5jbHVkZXMsaT1uKDc3KTtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMH0se2luY2x1ZGVzOmZ1bmN0aW9uKHQpe3JldHVybiBvKHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSksaSgiaW5jbHVkZXMiKX0sZnVuY3Rpb24odCxlLG4pe24oMjkwKTt2YXIgcj1uKDE4KTt0LmV4cG9ydHM9cigiU3RyaW5nIikuaW5jbHVkZXN9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oMjkxKSxpPW4oNDYpO3Ioe3RhcmdldDoiU3RyaW5nIixwcm90bzohMCxmb3JjZWQ6IW4oMjkzKSgiaW5jbHVkZXMiKX0se2luY2x1ZGVzOmZ1bmN0aW9uKHQpe3JldHVybiEhflN0cmluZyhpKHRoaXMpKS5pbmRleE9mKG8odCksYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyOTIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZihyKHQpKXRocm93IFR5cGVFcnJvcigiVGhlIG1ldGhvZCBkb2Vzbid0IGFjY2VwdCByZWd1bGFyIGV4cHJlc3Npb25zIik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big3KSxvPW4oMjcpLGk9bigyKSgibWF0Y2giKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIHIodCkmJih2b2lkIDAhPT0oZT10W2ldKT8hIWU6IlJlZ0V4cCI9PW8odCkpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMikoIm1hdGNoIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPS8uLzt0cnl7Ii8uLyJbdF0oZSl9Y2F0Y2gobil7dHJ5e3JldHVybiBlW3JdPSExLCIvLi8iW3RdKGUpfWNhdGNoKHQpe319cmV0dXJuITF9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiOyhmdW5jdGlvbih0KXsKLyohCiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLgogKgogKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz4KICogQGxpY2Vuc2UgIE1JVAogKi8KdmFyIHI9bigyOTUpLG89bigyOTYpLGk9bigyOTcpO2Z1bmN0aW9uIGEoKXtyZXR1cm4gdS5UWVBFRF9BUlJBWV9TVVBQT1JUPzIxNDc0ODM2NDc6MTA3Mzc0MTgyM31mdW5jdGlvbiBzKHQsZSl7aWYoYSgpPGUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoIik7cmV0dXJuIHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odD1uZXcgVWludDhBcnJheShlKSkuX19wcm90b19fPXUucHJvdG90eXBlOihudWxsPT09dCYmKHQ9bmV3IHUoZSkpLHQubGVuZ3RoPWUpLHR9ZnVuY3Rpb24gdSh0LGUsbil7aWYoISh1LlRZUEVEX0FSUkFZX1NVUFBPUlR8fHRoaXMgaW5zdGFuY2VvZiB1KSlyZXR1cm4gbmV3IHUodCxlLG4pO2lmKCJudW1iZXIiPT10eXBlb2YgdCl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigiSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmciKTtyZXR1cm4gZih0aGlzLHQpfXJldHVybiBjKHRoaXMsdCxlLG4pfWZ1bmN0aW9uIGModCxlLG4scil7aWYoIm51bWJlciI9PXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/ZnVuY3Rpb24odCxlLG4scil7aWYoZS5ieXRlTGVuZ3RoLG48MHx8ZS5ieXRlTGVuZ3RoPG4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidvZmZzZXQnIGlzIG91dCBvZiBib3VuZHMiKTtpZihlLmJ5dGVMZW5ndGg8bisocnx8MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidsZW5ndGgnIGlzIG91dCBvZiBib3VuZHMiKTtlPXZvaWQgMD09PW4mJnZvaWQgMD09PXI/bmV3IFVpbnQ4QXJyYXkoZSk6dm9pZCAwPT09cj9uZXcgVWludDhBcnJheShlLG4pOm5ldyBVaW50OEFycmF5KGUsbixyKTt1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHQ9ZSkuX19wcm90b19fPXUucHJvdG90eXBlOnQ9cCh0LGUpO3JldHVybiB0fSh0LGUsbixyKToic3RyaW5nIj09dHlwZW9mIGU/ZnVuY3Rpb24odCxlLG4peyJzdHJpbmciPT10eXBlb2YgbiYmIiIhPT1ufHwobj0idXRmOCIpO2lmKCF1LmlzRW5jb2RpbmcobikpdGhyb3cgbmV3IFR5cGVFcnJvcignImVuY29kaW5nIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJyk7dmFyIHI9MHxkKGUsbiksbz0odD1zKHQscikpLndyaXRlKGUsbik7byE9PXImJih0PXQuc2xpY2UoMCxvKSk7cmV0dXJuIHR9KHQsZSxuKTpmdW5jdGlvbih0LGUpe2lmKHUuaXNCdWZmZXIoZSkpe3ZhciBuPTB8aChlLmxlbmd0aCk7cmV0dXJuIDA9PT0odD1zKHQsbikpLmxlbmd0aD90OihlLmNvcHkodCwwLDAsbiksdCl9aWYoZSl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmZS5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8Imxlbmd0aCJpbiBlKXJldHVybiJudW1iZXIiIT10eXBlb2YgZS5sZW5ndGh8fChyPWUubGVuZ3RoKSE9cj9zKHQsMCk6cCh0LGUpO2lmKCJCdWZmZXIiPT09ZS50eXBlJiZpKGUuZGF0YSkpcmV0dXJuIHAodCxlLmRhdGEpfXZhciByO3Rocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4iKX0odCxlKX1mdW5jdGlvbiBsKHQpe2lmKCJudW1iZXIiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJyl9ZnVuY3Rpb24gZih0LGUpe2lmKGwoZSksdD1zKHQsZTwwPzA6MHxoKGUpKSwhdS5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcih2YXIgbj0wO248ZTsrK24pdFtuXT0wO3JldHVybiB0fWZ1bmN0aW9uIHAodCxlKXt2YXIgbj1lLmxlbmd0aDwwPzA6MHxoKGUubGVuZ3RoKTt0PXModCxuKTtmb3IodmFyIHI9MDtyPG47cis9MSl0W3JdPTI1NSZlW3JdO3JldHVybiB0fWZ1bmN0aW9uIGgodCl7aWYodD49YSgpKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtIHNpemU6IDB4IithKCkudG9TdHJpbmcoMTYpKyIgYnl0ZXMiKTtyZXR1cm4gMHx0fWZ1bmN0aW9uIGQodCxlKXtpZih1LmlzQnVmZmVyKHQpKXJldHVybiB0Lmxlbmd0aDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiYiZnVuY3Rpb24iPT10eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3JiYoQXJyYXlCdWZmZXIuaXNWaWV3KHQpfHx0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXJldHVybiB0LmJ5dGVMZW5ndGg7InN0cmluZyIhPXR5cGVvZiB0JiYodD0iIit0KTt2YXIgbj10Lmxlbmd0aDtpZigwPT09bilyZXR1cm4gMDtmb3IodmFyIHI9ITE7Oylzd2l0Y2goZSl7Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gbjtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2Ugdm9pZCAwOnJldHVybiBGKHQpLmxlbmd0aDtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIDIqbjtjYXNlImhleCI6cmV0dXJuIG4+Pj4xO2Nhc2UiYmFzZTY0IjpyZXR1cm4gSCh0KS5sZW5ndGg7ZGVmYXVsdDppZihyKXJldHVybiBGKHQpLmxlbmd0aDtlPSgiIitlKS50b0xvd2VyQ2FzZSgpLHI9ITB9fWZ1bmN0aW9uIGcodCxlLG4pe3ZhciByPSExO2lmKCh2b2lkIDA9PT1lfHxlPDApJiYoZT0wKSxlPnRoaXMubGVuZ3RoKXJldHVybiIiO2lmKCh2b2lkIDA9PT1ufHxuPnRoaXMubGVuZ3RoKSYmKG49dGhpcy5sZW5ndGgpLG48PTApcmV0dXJuIiI7aWYoKG4+Pj49MCk8PShlPj4+PTApKXJldHVybiIiO2Zvcih0fHwodD0idXRmOCIpOzspc3dpdGNoKHQpe2Nhc2UiaGV4IjpyZXR1cm4gTCh0aGlzLGUsbik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gVCh0aGlzLGUsbik7Y2FzZSJhc2NpaSI6cmV0dXJuIEEodGhpcyxlLG4pO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIEModGhpcyxlLG4pO2Nhc2UiYmFzZTY0IjpyZXR1cm4gaih0aGlzLGUsbik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBSKHRoaXMsZSxuKTtkZWZhdWx0OmlmKHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KTt0PSh0KyIiKS50b0xvd2VyQ2FzZSgpLHI9ITB9fWZ1bmN0aW9uIHYodCxlLG4pe3ZhciByPXRbZV07dFtlXT10W25dLHRbbl09cn1mdW5jdGlvbiB5KHQsZSxuLHIsbyl7aWYoMD09PXQubGVuZ3RoKXJldHVybi0xO2lmKCJzdHJpbmciPT10eXBlb2Ygbj8ocj1uLG49MCk6bj4yMTQ3NDgzNjQ3P249MjE0NzQ4MzY0NzpuPC0yMTQ3NDgzNjQ4JiYobj0tMjE0NzQ4MzY0OCksbj0rbixpc05hTihuKSYmKG49bz8wOnQubGVuZ3RoLTEpLG48MCYmKG49dC5sZW5ndGgrbiksbj49dC5sZW5ndGgpe2lmKG8pcmV0dXJuLTE7bj10Lmxlbmd0aC0xfWVsc2UgaWYobjwwKXtpZighbylyZXR1cm4tMTtuPTB9aWYoInN0cmluZyI9PXR5cGVvZiBlJiYoZT11LmZyb20oZSxyKSksdS5pc0J1ZmZlcihlKSlyZXR1cm4gMD09PWUubGVuZ3RoPy0xOm0odCxlLG4scixvKTtpZigibnVtYmVyIj09dHlwZW9mIGUpcmV0dXJuIGUmPTI1NSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQmJiJmdW5jdGlvbiI9PXR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mP28/VWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHQsZSxuKTpVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKHQsZSxuKTptKHQsW2VdLG4scixvKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJ2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXIiKX1mdW5jdGlvbiBtKHQsZSxuLHIsbyl7dmFyIGksYT0xLHM9dC5sZW5ndGgsdT1lLmxlbmd0aDtpZih2b2lkIDAhPT1yJiYoInVjczIiPT09KHI9U3RyaW5nKHIpLnRvTG93ZXJDYXNlKCkpfHwidWNzLTIiPT09cnx8InV0ZjE2bGUiPT09cnx8InV0Zi0xNmxlIj09PXIpKXtpZih0Lmxlbmd0aDwyfHxlLmxlbmd0aDwyKXJldHVybi0xO2E9MixzLz0yLHUvPTIsbi89Mn1mdW5jdGlvbiBjKHQsZSl7cmV0dXJuIDE9PT1hP3RbZV06dC5yZWFkVUludDE2QkUoZSphKX1pZihvKXt2YXIgbD0tMTtmb3IoaT1uO2k8cztpKyspaWYoYyh0LGkpPT09YyhlLC0xPT09bD8wOmktbCkpe2lmKC0xPT09bCYmKGw9aSksaS1sKzE9PT11KXJldHVybiBsKmF9ZWxzZS0xIT09bCYmKGktPWktbCksbD0tMX1lbHNlIGZvcihuK3U+cyYmKG49cy11KSxpPW47aT49MDtpLS0pe2Zvcih2YXIgZj0hMCxwPTA7cDx1O3ArKylpZihjKHQsaStwKSE9PWMoZSxwKSl7Zj0hMTticmVha31pZihmKXJldHVybiBpfXJldHVybi0xfWZ1bmN0aW9uIGIodCxlLG4scil7bj1OdW1iZXIobil8fDA7dmFyIG89dC5sZW5ndGgtbjtyPyhyPU51bWJlcihyKSk+byYmKHI9byk6cj1vO3ZhciBpPWUubGVuZ3RoO2lmKGklMiE9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGhleCBzdHJpbmciKTtyPmkvMiYmKHI9aS8yKTtmb3IodmFyIGE9MDthPHI7KythKXt2YXIgcz1wYXJzZUludChlLnN1YnN0cigyKmEsMiksMTYpO2lmKGlzTmFOKHMpKXJldHVybiBhO3RbbithXT1zfXJldHVybiBhfWZ1bmN0aW9uIHgodCxlLG4scil7cmV0dXJuIHooRihlLHQubGVuZ3RoLW4pLHQsbixyKX1mdW5jdGlvbiB3KHQsZSxuLHIpe3JldHVybiB6KGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTA7bjx0Lmxlbmd0aDsrK24pZS5wdXNoKDI1NSZ0LmNoYXJDb2RlQXQobikpO3JldHVybiBlfShlKSx0LG4scil9ZnVuY3Rpb24gayh0LGUsbixyKXtyZXR1cm4gdyh0LGUsbixyKX1mdW5jdGlvbiBTKHQsZSxuLHIpe3JldHVybiB6KEgoZSksdCxuLHIpfWZ1bmN0aW9uIEUodCxlLG4scil7cmV0dXJuIHooZnVuY3Rpb24odCxlKXtmb3IodmFyIG4scixvLGk9W10sYT0wO2E8dC5sZW5ndGgmJiEoKGUtPTIpPDApOysrYSluPXQuY2hhckNvZGVBdChhKSxyPW4+Pjgsbz1uJTI1NixpLnB1c2gobyksaS5wdXNoKHIpO3JldHVybiBpfShlLHQubGVuZ3RoLW4pLHQsbixyKX1mdW5jdGlvbiBqKHQsZSxuKXtyZXR1cm4gMD09PWUmJm49PT10Lmxlbmd0aD9yLmZyb21CeXRlQXJyYXkodCk6ci5mcm9tQnl0ZUFycmF5KHQuc2xpY2UoZSxuKSl9ZnVuY3Rpb24gVCh0LGUsbil7bj1NYXRoLm1pbih0Lmxlbmd0aCxuKTtmb3IodmFyIHI9W10sbz1lO288bjspe3ZhciBpLGEscyx1LGM9dFtvXSxsPW51bGwsZj1jPjIzOT80OmM+MjIzPzM6Yz4xOTE/MjoxO2lmKG8rZjw9bilzd2l0Y2goZil7Y2FzZSAxOmM8MTI4JiYobD1jKTticmVhaztjYXNlIDI6MTI4PT0oMTkyJihpPXRbbysxXSkpJiYodT0oMzEmYyk8PDZ8NjMmaSk+MTI3JiYobD11KTticmVhaztjYXNlIDM6aT10W28rMV0sYT10W28rMl0sMTI4PT0oMTkyJmkpJiYxMjg9PSgxOTImYSkmJih1PSgxNSZjKTw8MTJ8KDYzJmkpPDw2fDYzJmEpPjIwNDcmJih1PDU1Mjk2fHx1PjU3MzQzKSYmKGw9dSk7YnJlYWs7Y2FzZSA0Omk9dFtvKzFdLGE9dFtvKzJdLHM9dFtvKzNdLDEyOD09KDE5MiZpKSYmMTI4PT0oMTkyJmEpJiYxMjg9PSgxOTImcykmJih1PSgxNSZjKTw8MTh8KDYzJmkpPDwxMnwoNjMmYSk8PDZ8NjMmcyk+NjU1MzUmJnU8MTExNDExMiYmKGw9dSl9bnVsbD09PWw/KGw9NjU1MzMsZj0xKTpsPjY1NTM1JiYobC09NjU1MzYsci5wdXNoKGw+Pj4xMCYxMDIzfDU1Mjk2KSxsPTU2MzIwfDEwMjMmbCksci5wdXNoKGwpLG8rPWZ9cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGU8PU8pcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHQpO3ZhciBuPSIiLHI9MDtmb3IoO3I8ZTspbis9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsdC5zbGljZShyLHIrPU8pKTtyZXR1cm4gbn0ocil9ZS5CdWZmZXI9dSxlLlNsb3dCdWZmZXI9ZnVuY3Rpb24odCl7K3QhPXQmJih0PTApO3JldHVybiB1LmFsbG9jKCt0KX0sZS5JTlNQRUNUX01BWF9CWVRFUz01MCx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ9dm9pZCAwIT09dC5UWVBFRF9BUlJBWV9TVVBQT1JUP3QuVFlQRURfQVJSQVlfU1VQUE9SVDpmdW5jdGlvbigpe3RyeXt2YXIgdD1uZXcgVWludDhBcnJheSgxKTtyZXR1cm4gdC5fX3Byb3RvX189e19fcHJvdG9fXzpVaW50OEFycmF5LnByb3RvdHlwZSxmb286ZnVuY3Rpb24oKXtyZXR1cm4gNDJ9fSw0Mj09PXQuZm9vKCkmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnN1YmFycmF5JiYwPT09dC5zdWJhcnJheSgxLDEpLmJ5dGVMZW5ndGh9Y2F0Y2godCl7cmV0dXJuITF9fSgpLGUua01heExlbmd0aD1hKCksdS5wb29sU2l6ZT04MTkyLHUuX2F1Z21lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19wcm90b19fPXUucHJvdG90eXBlLHR9LHUuZnJvbT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGMobnVsbCx0LGUsbil9LHUuVFlQRURfQVJSQVlfU1VQUE9SVCYmKHUucHJvdG90eXBlLl9fcHJvdG9fXz1VaW50OEFycmF5LnByb3RvdHlwZSx1Ll9fcHJvdG9fXz1VaW50OEFycmF5LCJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuc3BlY2llcyYmdVtTeW1ib2wuc3BlY2llc109PT11JiZPYmplY3QuZGVmaW5lUHJvcGVydHkodSxTeW1ib2wuc3BlY2llcyx7dmFsdWU6bnVsbCxjb25maWd1cmFibGU6ITB9KSksdS5hbGxvYz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBsKGUpLGU8PTA/cyh0LGUpOnZvaWQgMCE9PW4/InN0cmluZyI9PXR5cGVvZiByP3ModCxlKS5maWxsKG4scik6cyh0LGUpLmZpbGwobik6cyh0LGUpfShudWxsLHQsZSxuKX0sdS5hbGxvY1Vuc2FmZT1mdW5jdGlvbih0KXtyZXR1cm4gZihudWxsLHQpfSx1LmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbih0KXtyZXR1cm4gZihudWxsLHQpfSx1LmlzQnVmZmVyPWZ1bmN0aW9uKHQpe3JldHVybiEobnVsbD09dHx8IXQuX2lzQnVmZmVyKX0sdS5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7aWYoIXUuaXNCdWZmZXIodCl8fCF1LmlzQnVmZmVyKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMiKTtpZih0PT09ZSlyZXR1cm4gMDtmb3IodmFyIG49dC5sZW5ndGgscj1lLmxlbmd0aCxvPTAsaT1NYXRoLm1pbihuLHIpO288aTsrK28paWYodFtvXSE9PWVbb10pe249dFtvXSxyPWVbb107YnJlYWt9cmV0dXJuIG48cj8tMTpyPG4/MTowfSx1LmlzRW5jb2Rpbmc9ZnVuY3Rpb24odCl7c3dpdGNoKFN0cmluZyh0KS50b0xvd2VyQ2FzZSgpKXtjYXNlImhleCI6Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19LHUuY29uY2F0PWZ1bmN0aW9uKHQsZSl7aWYoIWkodCkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2lmKDA9PT10Lmxlbmd0aClyZXR1cm4gdS5hbGxvYygwKTt2YXIgbjtpZih2b2lkIDA9PT1lKWZvcihlPTAsbj0wO248dC5sZW5ndGg7KytuKWUrPXRbbl0ubGVuZ3RoO3ZhciByPXUuYWxsb2NVbnNhZmUoZSksbz0wO2ZvcihuPTA7bjx0Lmxlbmd0aDsrK24pe3ZhciBhPXRbbl07aWYoIXUuaXNCdWZmZXIoYSkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2EuY29weShyLG8pLG8rPWEubGVuZ3RofXJldHVybiByfSx1LmJ5dGVMZW5ndGg9ZCx1LnByb3RvdHlwZS5faXNCdWZmZXI9ITAsdS5wcm90b3R5cGUuc3dhcDE2PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCUyIT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz0yKXYodGhpcyxlLGUrMSk7cmV0dXJuIHRoaXN9LHUucHJvdG90eXBlLnN3YXAzMj1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlNCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9NCl2KHRoaXMsZSxlKzMpLHYodGhpcyxlKzEsZSsyKTtyZXR1cm4gdGhpc30sdS5wcm90b3R5cGUuc3dhcDY0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCU4IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz04KXYodGhpcyxlLGUrNyksdih0aGlzLGUrMSxlKzYpLHYodGhpcyxlKzIsZSs1KSx2KHRoaXMsZSszLGUrNCk7cmV0dXJuIHRoaXN9LHUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9MHx0aGlzLmxlbmd0aDtyZXR1cm4gMD09PXQ/IiI6MD09PWFyZ3VtZW50cy5sZW5ndGg/VCh0aGlzLDAsdCk6Zy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHUucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtpZighdS5pc0J1ZmZlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7cmV0dXJuIHRoaXM9PT10fHwwPT09dS5jb21wYXJlKHRoaXMsdCl9LHUucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXt2YXIgdD0iIixuPWUuSU5TUEVDVF9NQVhfQllURVM7cmV0dXJuIHRoaXMubGVuZ3RoPjAmJih0PXRoaXMudG9TdHJpbmcoImhleCIsMCxuKS5tYXRjaCgvLnsyfS9nKS5qb2luKCIgIiksdGhpcy5sZW5ndGg+biYmKHQrPSIgLi4uICIpKSwiPEJ1ZmZlciAiK3QrIj4ifSx1LnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKHQsZSxuLHIsbyl7aWYoIXUuaXNCdWZmZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PW4mJihuPXQ/dC5sZW5ndGg6MCksdm9pZCAwPT09ciYmKHI9MCksdm9pZCAwPT09byYmKG89dGhpcy5sZW5ndGgpLGU8MHx8bj50Lmxlbmd0aHx8cjwwfHxvPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihyPj1vJiZlPj1uKXJldHVybiAwO2lmKHI+PW8pcmV0dXJuLTE7aWYoZT49bilyZXR1cm4gMTtpZih0aGlzPT09dClyZXR1cm4gMDtmb3IodmFyIGk9KG8+Pj49MCktKHI+Pj49MCksYT0obj4+Pj0wKS0oZT4+Pj0wKSxzPU1hdGgubWluKGksYSksYz10aGlzLnNsaWNlKHIsbyksbD10LnNsaWNlKGUsbiksZj0wO2Y8czsrK2YpaWYoY1tmXSE9PWxbZl0pe2k9Y1tmXSxhPWxbZl07YnJlYWt9cmV0dXJuIGk8YT8tMTphPGk/MTowfSx1LnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbih0LGUsbil7cmV0dXJuLTEhPT10aGlzLmluZGV4T2YodCxlLG4pfSx1LnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geSh0aGlzLHQsZSxuLCEwKX0sdS5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5KHRoaXMsdCxlLG4sITEpfSx1LnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0LGUsbixyKXtpZih2b2lkIDA9PT1lKXI9InV0ZjgiLG49dGhpcy5sZW5ndGgsZT0wO2Vsc2UgaWYodm9pZCAwPT09biYmInN0cmluZyI9PXR5cGVvZiBlKXI9ZSxuPXRoaXMubGVuZ3RoLGU9MDtlbHNle2lmKCFpc0Zpbml0ZShlKSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7ZXw9MCxpc0Zpbml0ZShuKT8obnw9MCx2b2lkIDA9PT1yJiYocj0idXRmOCIpKToocj1uLG49dm9pZCAwKX12YXIgbz10aGlzLmxlbmd0aC1lO2lmKCh2b2lkIDA9PT1ufHxuPm8pJiYobj1vKSx0Lmxlbmd0aD4wJiYobjwwfHxlPDApfHxlPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO3J8fChyPSJ1dGY4Iik7Zm9yKHZhciBpPSExOzspc3dpdGNoKHIpe2Nhc2UiaGV4IjpyZXR1cm4gYih0aGlzLHQsZSxuKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiB4KHRoaXMsdCxlLG4pO2Nhc2UiYXNjaWkiOnJldHVybiB3KHRoaXMsdCxlLG4pO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIGsodGhpcyx0LGUsbik7Y2FzZSJiYXNlNjQiOnJldHVybiBTKHRoaXMsdCxlLG4pO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gRSh0aGlzLHQsZSxuKTtkZWZhdWx0OmlmKGkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIityKTtyPSgiIityKS50b0xvd2VyQ2FzZSgpLGk9ITB9fSx1LnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiQnVmZmVyIixkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2Fycnx8dGhpcywwKX19O3ZhciBPPTQwOTY7ZnVuY3Rpb24gQSh0LGUsbil7dmFyIHI9IiI7bj1NYXRoLm1pbih0Lmxlbmd0aCxuKTtmb3IodmFyIG89ZTtvPG47KytvKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI3JnRbb10pO3JldHVybiByfWZ1bmN0aW9uIEModCxlLG4pe3ZhciByPSIiO249TWF0aC5taW4odC5sZW5ndGgsbik7Zm9yKHZhciBvPWU7bzxuOysrbylyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHRbb10pO3JldHVybiByfWZ1bmN0aW9uIEwodCxlLG4pe3ZhciByPXQubGVuZ3RoOyghZXx8ZTwwKSYmKGU9MCksKCFufHxuPDB8fG4+cikmJihuPXIpO2Zvcih2YXIgbz0iIixpPWU7aTxuOysraSlvKz1xKHRbaV0pO3JldHVybiBvfWZ1bmN0aW9uIFIodCxlLG4pe2Zvcih2YXIgcj10LnNsaWNlKGUsbiksbz0iIixpPTA7aTxyLmxlbmd0aDtpKz0yKW8rPVN0cmluZy5mcm9tQ2hhckNvZGUocltpXSsyNTYqcltpKzFdKTtyZXR1cm4gb31mdW5jdGlvbiBQKHQsZSxuKXtpZih0JTEhPTB8fHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib2Zmc2V0IGlzIG5vdCB1aW50Iik7aWYodCtlPm4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlRyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgiKX1mdW5jdGlvbiBOKHQsZSxuLHIsbyxpKXtpZighdS5pc0J1ZmZlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCciYnVmZmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJyk7aWYoZT5vfHxlPGkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpO2lmKG4rcj50Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gSSh0LGUsbixyKXtlPDAmJihlPTY1NTM1K2UrMSk7Zm9yKHZhciBvPTAsaT1NYXRoLm1pbih0Lmxlbmd0aC1uLDIpO288aTsrK28pdFtuK29dPShlJjI1NTw8OCoocj9vOjEtbykpPj4+OCoocj9vOjEtbyl9ZnVuY3Rpb24gXyh0LGUsbixyKXtlPDAmJihlPTQyOTQ5NjcyOTUrZSsxKTtmb3IodmFyIG89MCxpPU1hdGgubWluKHQubGVuZ3RoLW4sNCk7bzxpOysrbyl0W24rb109ZT4+PjgqKHI/bzozLW8pJjI1NX1mdW5jdGlvbiBEKHQsZSxuLHIsbyxpKXtpZihuK3I+dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpO2lmKG48MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gTSh0LGUsbixyLGkpe3JldHVybiBpfHxEKHQsMCxuLDQpLG8ud3JpdGUodCxlLG4sciwyMyw0KSxuKzR9ZnVuY3Rpb24gVSh0LGUsbixyLGkpe3JldHVybiBpfHxEKHQsMCxuLDgpLG8ud3JpdGUodCxlLG4sciw1Miw4KSxuKzh9dS5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24odCxlKXt2YXIgbixyPXRoaXMubGVuZ3RoO2lmKCh0PX5+dCk8MD8odCs9cik8MCYmKHQ9MCk6dD5yJiYodD1yKSwoZT12b2lkIDA9PT1lP3I6fn5lKTwwPyhlKz1yKTwwJiYoZT0wKTplPnImJihlPXIpLGU8dCYmKGU9dCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUKShuPXRoaXMuc3ViYXJyYXkodCxlKSkuX19wcm90b19fPXUucHJvdG90eXBlO2Vsc2V7dmFyIG89ZS10O249bmV3IHUobyx2b2lkIDApO2Zvcih2YXIgaT0wO2k8bzsrK2kpbltpXT10aGlzW2krdF19cmV0dXJuIG59LHUucHJvdG90eXBlLnJlYWRVSW50TEU9ZnVuY3Rpb24odCxlLG4pe3R8PTAsZXw9MCxufHxQKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXRoaXNbdF0sbz0xLGk9MDsrK2k8ZSYmKG8qPTI1Nik7KXIrPXRoaXNbdCtpXSpvO3JldHVybiByfSx1LnByb3RvdHlwZS5yZWFkVUludEJFPWZ1bmN0aW9uKHQsZSxuKXt0fD0wLGV8PTAsbnx8UCh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW3QrLS1lXSxvPTE7ZT4wJiYobyo9MjU2KTspcis9dGhpc1t0Ky0tZV0qbztyZXR1cm4gcn0sdS5wcm90b3R5cGUucmVhZFVJbnQ4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCwxLHRoaXMubGVuZ3RoKSx0aGlzW3RdfSx1LnByb3RvdHlwZS5yZWFkVUludDE2TEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8UCh0LDIsdGhpcy5sZW5ndGgpLHRoaXNbdF18dGhpc1t0KzFdPDw4fSx1LnByb3RvdHlwZS5yZWFkVUludDE2QkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8UCh0LDIsdGhpcy5sZW5ndGgpLHRoaXNbdF08PDh8dGhpc1t0KzFdfSx1LnByb3RvdHlwZS5yZWFkVUludDMyTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8UCh0LDQsdGhpcy5sZW5ndGgpLCh0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2KSsxNjc3NzIxNip0aGlzW3QrM119LHUucHJvdG90eXBlLnJlYWRVSW50MzJCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxQKHQsNCx0aGlzLmxlbmd0aCksMTY3NzcyMTYqdGhpc1t0XSsodGhpc1t0KzFdPDwxNnx0aGlzW3QrMl08PDh8dGhpc1t0KzNdKX0sdS5wcm90b3R5cGUucmVhZEludExFPWZ1bmN0aW9uKHQsZSxuKXt0fD0wLGV8PTAsbnx8UCh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW3RdLG89MSxpPTA7KytpPGUmJihvKj0yNTYpOylyKz10aGlzW3QraV0qbztyZXR1cm4gcj49KG8qPTEyOCkmJihyLT1NYXRoLnBvdygyLDgqZSkpLHJ9LHUucHJvdG90eXBlLnJlYWRJbnRCRT1mdW5jdGlvbih0LGUsbil7dHw9MCxlfD0wLG58fFAodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9ZSxvPTEsaT10aGlzW3QrLS1yXTtyPjAmJihvKj0yNTYpOylpKz10aGlzW3QrLS1yXSpvO3JldHVybiBpPj0obyo9MTI4KSYmKGktPU1hdGgucG93KDIsOCplKSksaX0sdS5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8UCh0LDEsdGhpcy5sZW5ndGgpLDEyOCZ0aGlzW3RdPy0xKigyNTUtdGhpc1t0XSsxKTp0aGlzW3RdfSx1LnByb3RvdHlwZS5yZWFkSW50MTZMRT1mdW5jdGlvbih0LGUpe2V8fFAodCwyLHRoaXMubGVuZ3RoKTt2YXIgbj10aGlzW3RdfHRoaXNbdCsxXTw8ODtyZXR1cm4gMzI3Njgmbj80Mjk0OTAxNzYwfG46bn0sdS5wcm90b3R5cGUucmVhZEludDE2QkU9ZnVuY3Rpb24odCxlKXtlfHxQKHQsMix0aGlzLmxlbmd0aCk7dmFyIG49dGhpc1t0KzFdfHRoaXNbdF08PDg7cmV0dXJuIDMyNzY4Jm4/NDI5NDkwMTc2MHxuOm59LHUucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCw0LHRoaXMubGVuZ3RoKSx0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2fHRoaXNbdCszXTw8MjR9LHUucHJvdG90eXBlLnJlYWRJbnQzMkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCw0LHRoaXMubGVuZ3RoKSx0aGlzW3RdPDwyNHx0aGlzW3QrMV08PDE2fHRoaXNbdCsyXTw8OHx0aGlzW3QrM119LHUucHJvdG90eXBlLnJlYWRGbG9hdExFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCw0LHRoaXMubGVuZ3RoKSxvLnJlYWQodGhpcyx0LCEwLDIzLDQpfSx1LnByb3RvdHlwZS5yZWFkRmxvYXRCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxQKHQsNCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsdCwhMSwyMyw0KX0sdS5wcm90b3R5cGUucmVhZERvdWJsZUxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCw4LHRoaXMubGVuZ3RoKSxvLnJlYWQodGhpcyx0LCEwLDUyLDgpfSx1LnByb3RvdHlwZS5yZWFkRG91YmxlQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8UCh0LDgsdGhpcy5sZW5ndGgpLG8ucmVhZCh0aGlzLHQsITEsNTIsOCl9LHUucHJvdG90eXBlLndyaXRlVUludExFPWZ1bmN0aW9uKHQsZSxuLHIpeyh0PSt0LGV8PTAsbnw9MCxyKXx8Tih0aGlzLHQsZSxuLE1hdGgucG93KDIsOCpuKS0xLDApO3ZhciBvPTEsaT0wO2Zvcih0aGlzW2VdPTI1NSZ0OysraTxuJiYobyo9MjU2KTspdGhpc1tlK2ldPXQvbyYyNTU7cmV0dXJuIGUrbn0sdS5wcm90b3R5cGUud3JpdGVVSW50QkU9ZnVuY3Rpb24odCxlLG4scil7KHQ9K3QsZXw9MCxufD0wLHIpfHxOKHRoaXMsdCxlLG4sTWF0aC5wb3coMiw4Km4pLTEsMCk7dmFyIG89bi0xLGk9MTtmb3IodGhpc1tlK29dPTI1NSZ0Oy0tbz49MCYmKGkqPTI1Nik7KXRoaXNbZStvXT10L2kmMjU1O3JldHVybiBlK259LHUucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSwxLDI1NSwwKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlR8fCh0PU1hdGguZmxvb3IodCkpLHRoaXNbZV09MjU1JnQsZSsxfSx1LnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsMiw2NTUzNSwwKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44KTpJKHRoaXMsdCxlLCEwKSxlKzJ9LHUucHJvdG90eXBlLndyaXRlVUludDE2QkU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSwyLDY1NTM1LDApLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+OCx0aGlzW2UrMV09MjU1JnQpOkkodGhpcyx0LGUsITEpLGUrMn0sdS5wcm90b3R5cGUud3JpdGVVSW50MzJMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDQsNDI5NDk2NzI5NSwwKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZSszXT10Pj4+MjQsdGhpc1tlKzJdPXQ+Pj4xNix0aGlzW2UrMV09dD4+PjgsdGhpc1tlXT0yNTUmdCk6Xyh0aGlzLHQsZSwhMCksZSs0fSx1LnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsNCw0Mjk0OTY3Mjk1LDApLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+MjQsdGhpc1tlKzFdPXQ+Pj4xNix0aGlzW2UrMl09dD4+PjgsdGhpc1tlKzNdPTI1NSZ0KTpfKHRoaXMsdCxlLCExKSxlKzR9LHUucHJvdG90eXBlLndyaXRlSW50TEU9ZnVuY3Rpb24odCxlLG4scil7aWYodD0rdCxlfD0wLCFyKXt2YXIgbz1NYXRoLnBvdygyLDgqbi0xKTtOKHRoaXMsdCxlLG4sby0xLC1vKX12YXIgaT0wLGE9MSxzPTA7Zm9yKHRoaXNbZV09MjU1JnQ7KytpPG4mJihhKj0yNTYpOyl0PDAmJjA9PT1zJiYwIT09dGhpc1tlK2ktMV0mJihzPTEpLHRoaXNbZStpXT0odC9hPj4wKS1zJjI1NTtyZXR1cm4gZStufSx1LnByb3RvdHlwZS53cml0ZUludEJFPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQ9K3QsZXw9MCwhcil7dmFyIG89TWF0aC5wb3coMiw4Km4tMSk7Tih0aGlzLHQsZSxuLG8tMSwtbyl9dmFyIGk9bi0xLGE9MSxzPTA7Zm9yKHRoaXNbZStpXT0yNTUmdDstLWk+PTAmJihhKj0yNTYpOyl0PDAmJjA9PT1zJiYwIT09dGhpc1tlK2krMV0mJihzPTEpLHRoaXNbZStpXT0odC9hPj4wKS1zJjI1NTtyZXR1cm4gZStufSx1LnByb3RvdHlwZS53cml0ZUludDg9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSwxLDEyNywtMTI4KSx1LlRZUEVEX0FSUkFZX1NVUFBPUlR8fCh0PU1hdGguZmxvb3IodCkpLHQ8MCYmKHQ9MjU1K3QrMSksdGhpc1tlXT0yNTUmdCxlKzF9LHUucHJvdG90eXBlLndyaXRlSW50MTZMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDIsMzI3NjcsLTMyNzY4KSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44KTpJKHRoaXMsdCxlLCEwKSxlKzJ9LHUucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDIsMzI3NjcsLTMyNzY4KSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjgsdGhpc1tlKzFdPTI1NSZ0KTpJKHRoaXMsdCxlLCExKSxlKzJ9LHUucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCx0aGlzW2UrMl09dD4+PjE2LHRoaXNbZSszXT10Pj4+MjQpOl8odGhpcyx0LGUsITApLGUrNH0sdS5wcm90b3R5cGUud3JpdGVJbnQzMkJFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSx0PDAmJih0PTQyOTQ5NjcyOTUrdCsxKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjI0LHRoaXNbZSsxXT10Pj4+MTYsdGhpc1tlKzJdPXQ+Pj44LHRoaXNbZSszXT0yNTUmdCk6Xyh0aGlzLHQsZSwhMSksZSs0fSx1LnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBNKHRoaXMsdCxlLCEwLG4pfSx1LnByb3RvdHlwZS53cml0ZUZsb2F0QkU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBNKHRoaXMsdCxlLCExLG4pfSx1LnByb3RvdHlwZS53cml0ZURvdWJsZUxFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gVSh0aGlzLHQsZSwhMCxuKX0sdS5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIFUodGhpcyx0LGUsITEsbil9LHUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24odCxlLG4scil7aWYobnx8KG49MCkscnx8MD09PXJ8fChyPXRoaXMubGVuZ3RoKSxlPj10Lmxlbmd0aCYmKGU9dC5sZW5ndGgpLGV8fChlPTApLHI+MCYmcjxuJiYocj1uKSxyPT09bilyZXR1cm4gMDtpZigwPT09dC5sZW5ndGh8fDA9PT10aGlzLmxlbmd0aClyZXR1cm4gMDtpZihlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihuPDB8fG4+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzIik7aWYocjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcyIpO3I+dGhpcy5sZW5ndGgmJihyPXRoaXMubGVuZ3RoKSx0Lmxlbmd0aC1lPHItbiYmKHI9dC5sZW5ndGgtZStuKTt2YXIgbyxpPXItbjtpZih0aGlzPT09dCYmbjxlJiZlPHIpZm9yKG89aS0xO28+PTA7LS1vKXRbbytlXT10aGlzW28rbl07ZWxzZSBpZihpPDFlM3x8IXUuVFlQRURfQVJSQVlfU1VQUE9SVClmb3Iobz0wO288aTsrK28pdFtvK2VdPXRoaXNbbytuXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKHQsdGhpcy5zdWJhcnJheShuLG4raSksZSk7cmV0dXJuIGl9LHUucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24odCxlLG4scil7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZigic3RyaW5nIj09dHlwZW9mIGU/KHI9ZSxlPTAsbj10aGlzLmxlbmd0aCk6InN0cmluZyI9PXR5cGVvZiBuJiYocj1uLG49dGhpcy5sZW5ndGgpLDE9PT10Lmxlbmd0aCl7dmFyIG89dC5jaGFyQ29kZUF0KDApO288MjU2JiYodD1vKX1pZih2b2lkIDAhPT1yJiYic3RyaW5nIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyIpO2lmKCJzdHJpbmciPT10eXBlb2YgciYmIXUuaXNFbmNvZGluZyhyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3IpfWVsc2UibnVtYmVyIj09dHlwZW9mIHQmJih0Jj0yNTUpO2lmKGU8MHx8dGhpcy5sZW5ndGg8ZXx8dGhpcy5sZW5ndGg8bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiT3V0IG9mIHJhbmdlIGluZGV4Iik7aWYobjw9ZSlyZXR1cm4gdGhpczt2YXIgaTtpZihlPj4+PTAsbj12b2lkIDA9PT1uP3RoaXMubGVuZ3RoOm4+Pj4wLHR8fCh0PTApLCJudW1iZXIiPT10eXBlb2YgdClmb3IoaT1lO2k8bjsrK2kpdGhpc1tpXT10O2Vsc2V7dmFyIGE9dS5pc0J1ZmZlcih0KT90OkYobmV3IHUodCxyKS50b1N0cmluZygpKSxzPWEubGVuZ3RoO2ZvcihpPTA7aTxuLWU7KytpKXRoaXNbaStlXT1hW2klc119cmV0dXJuIHRoaXN9O3ZhciBCPS9bXitcLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIHEodCl7cmV0dXJuIHQ8MTY/IjAiK3QudG9TdHJpbmcoMTYpOnQudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIEYodCxlKXt2YXIgbjtlPWV8fDEvMDtmb3IodmFyIHI9dC5sZW5ndGgsbz1udWxsLGk9W10sYT0wO2E8cjsrK2Epe2lmKChuPXQuY2hhckNvZGVBdChhKSk+NTUyOTUmJm48NTczNDQpe2lmKCFvKXtpZihuPjU2MzE5KXsoZS09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aWYoYSsxPT09cil7KGUtPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfW89bjtjb250aW51ZX1pZihuPDU2MzIwKXsoZS09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSksbz1uO2NvbnRpbnVlfW49NjU1MzYrKG8tNTUyOTY8PDEwfG4tNTYzMjApfWVsc2UgbyYmKGUtPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpO2lmKG89bnVsbCxuPDEyOCl7aWYoKGUtPTEpPDApYnJlYWs7aS5wdXNoKG4pfWVsc2UgaWYobjwyMDQ4KXtpZigoZS09Mik8MClicmVhaztpLnB1c2gobj4+NnwxOTIsNjMmbnwxMjgpfWVsc2UgaWYobjw2NTUzNil7aWYoKGUtPTMpPDApYnJlYWs7aS5wdXNoKG4+PjEyfDIyNCxuPj42JjYzfDEyOCw2MyZufDEyOCl9ZWxzZXtpZighKG48MTExNDExMikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvZGUgcG9pbnQiKTtpZigoZS09NCk8MClicmVhaztpLnB1c2gobj4+MTh8MjQwLG4+PjEyJjYzfDEyOCxuPj42JjYzfDEyOCw2MyZufDEyOCl9fXJldHVybiBpfWZ1bmN0aW9uIEgodCl7cmV0dXJuIHIudG9CeXRlQXJyYXkoZnVuY3Rpb24odCl7aWYoKHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQudHJpbT90LnRyaW0oKTp0LnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0odCkucmVwbGFjZShCLCIiKSkubGVuZ3RoPDIpcmV0dXJuIiI7Zm9yKDt0Lmxlbmd0aCU0IT0wOyl0Kz0iPSI7cmV0dXJuIHR9KHQpKX1mdW5jdGlvbiB6KHQsZSxuLHIpe2Zvcih2YXIgbz0wO288ciYmIShvK24+PWUubGVuZ3RofHxvPj10Lmxlbmd0aCk7KytvKWVbbytuXT10W29dO3JldHVybiBvfX0pLmNhbGwodGhpcyxuKDg1KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZS5ieXRlTGVuZ3RoPWZ1bmN0aW9uKHQpe3ZhciBlPWModCksbj1lWzBdLHI9ZVsxXTtyZXR1cm4gMyoobityKS80LXJ9LGUudG9CeXRlQXJyYXk9ZnVuY3Rpb24odCl7dmFyIGUsbixyPWModCksYT1yWzBdLHM9clsxXSx1PW5ldyBpKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gMyooZStuKS80LW59KDAsYSxzKSksbD0wLGY9cz4wP2EtNDphO2ZvcihuPTA7bjxmO24rPTQpZT1vW3QuY2hhckNvZGVBdChuKV08PDE4fG9bdC5jaGFyQ29kZUF0KG4rMSldPDwxMnxvW3QuY2hhckNvZGVBdChuKzIpXTw8NnxvW3QuY2hhckNvZGVBdChuKzMpXSx1W2wrK109ZT4+MTYmMjU1LHVbbCsrXT1lPj44JjI1NSx1W2wrK109MjU1JmU7Mj09PXMmJihlPW9bdC5jaGFyQ29kZUF0KG4pXTw8MnxvW3QuY2hhckNvZGVBdChuKzEpXT4+NCx1W2wrK109MjU1JmUpOzE9PT1zJiYoZT1vW3QuY2hhckNvZGVBdChuKV08PDEwfG9bdC5jaGFyQ29kZUF0KG4rMSldPDw0fG9bdC5jaGFyQ29kZUF0KG4rMildPj4yLHVbbCsrXT1lPj44JjI1NSx1W2wrK109MjU1JmUpO3JldHVybiB1fSxlLmZyb21CeXRlQXJyYXk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49dC5sZW5ndGgsbz1uJTMsaT1bXSxhPTAscz1uLW87YTxzO2ErPTE2MzgzKWkucHVzaChsKHQsYSxhKzE2MzgzPnM/czphKzE2MzgzKSk7MT09PW8/KGU9dFtuLTFdLGkucHVzaChyW2U+PjJdK3JbZTw8NCY2M10rIj09IikpOjI9PT1vJiYoZT0odFtuLTJdPDw4KSt0W24tMV0saS5wdXNoKHJbZT4+MTBdK3JbZT4+NCY2M10rcltlPDwyJjYzXSsiPSIpKTtyZXR1cm4gaS5qb2luKCIiKX07Zm9yKHZhciByPVtdLG89W10saT0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXk/VWludDhBcnJheTpBcnJheSxhPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIixzPTAsdT1hLmxlbmd0aDtzPHU7KytzKXJbc109YVtzXSxvW2EuY2hhckNvZGVBdChzKV09cztmdW5jdGlvbiBjKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGUlND4wKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIpO3ZhciBuPXQuaW5kZXhPZigiPSIpO3JldHVybi0xPT09biYmKG49ZSksW24sbj09PWU/MDo0LW4lNF19ZnVuY3Rpb24gbCh0LGUsbil7Zm9yKHZhciBvLGksYT1bXSxzPWU7czxuO3MrPTMpbz0odFtzXTw8MTYmMTY3MTE2ODApKyh0W3MrMV08PDgmNjUyODApKygyNTUmdFtzKzJdKSxhLnB1c2goclsoaT1vKT4+MTgmNjNdK3JbaT4+MTImNjNdK3JbaT4+NiY2M10rcls2MyZpXSk7cmV0dXJuIGEuam9pbigiIil9b1siLSIuY2hhckNvZGVBdCgwKV09NjIsb1siXyIuY2hhckNvZGVBdCgwKV09NjN9LGZ1bmN0aW9uKHQsZSl7ZS5yZWFkPWZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGksYSxzPTgqby1yLTEsdT0oMTw8cyktMSxjPXU+PjEsbD0tNyxmPW4/by0xOjAscD1uPy0xOjEsaD10W2UrZl07Zm9yKGYrPXAsaT1oJigxPDwtbCktMSxoPj49LWwsbCs9cztsPjA7aT0yNTYqaSt0W2UrZl0sZis9cCxsLT04KTtmb3IoYT1pJigxPDwtbCktMSxpPj49LWwsbCs9cjtsPjA7YT0yNTYqYSt0W2UrZl0sZis9cCxsLT04KTtpZigwPT09aSlpPTEtYztlbHNle2lmKGk9PT11KXJldHVybiBhP05hTjoxLzAqKGg/LTE6MSk7YSs9TWF0aC5wb3coMixyKSxpLT1jfXJldHVybihoPy0xOjEpKmEqTWF0aC5wb3coMixpLXIpfSxlLndyaXRlPWZ1bmN0aW9uKHQsZSxuLHIsbyxpKXt2YXIgYSxzLHUsYz04Kmktby0xLGw9KDE8PGMpLTEsZj1sPj4xLHA9MjM9PT1vP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxoPXI/MDppLTEsZD1yPzE6LTEsZz1lPDB8fDA9PT1lJiYxL2U8MD8xOjA7Zm9yKGU9TWF0aC5hYnMoZSksaXNOYU4oZSl8fGU9PT0xLzA/KHM9aXNOYU4oZSk/MTowLGE9bCk6KGE9TWF0aC5mbG9vcihNYXRoLmxvZyhlKS9NYXRoLkxOMiksZSoodT1NYXRoLnBvdygyLC1hKSk8MSYmKGEtLSx1Kj0yKSwoZSs9YStmPj0xP3AvdTpwKk1hdGgucG93KDIsMS1mKSkqdT49MiYmKGErKyx1Lz0yKSxhK2Y+PWw/KHM9MCxhPWwpOmErZj49MT8ocz0oZSp1LTEpKk1hdGgucG93KDIsbyksYSs9Zik6KHM9ZSpNYXRoLnBvdygyLGYtMSkqTWF0aC5wb3coMixvKSxhPTApKTtvPj04O3RbbitoXT0yNTUmcyxoKz1kLHMvPTI1NixvLT04KTtmb3IoYT1hPDxvfHMsYys9bztjPjA7dFtuK2hdPTI1NSZhLGgrPWQsYS89MjU2LGMtPTgpO3RbbitoLWRdfD0xMjgqZ319LGZ1bmN0aW9uKHQsZSl7dmFyIG49e30udG9TdHJpbmc7dC5leHBvcnRzPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PW4uY2FsbCh0KX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyOTkpfSxmdW5jdGlvbih0LGUsbil7bigzMDApO3ZhciByPW4oMSk7dC5leHBvcnRzPXIuVVJMU2VhcmNoUGFyYW1zfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24oMTAyKTt2YXIgcj1uKDApLG89bigzMDEpLGk9bigzNiksYT1uKDExOCkscz1uKDI5KSx1PW4oMTAwKSxjPW4oNTApLGw9bigxMTkpLGY9bigxNCkscD1uKDMyKSxoPW4oMTEpLGQ9big3KSxnPW4oMTA4KSx2PW4oNTIpLHk9bigyKSgiaXRlcmF0b3IiKSxtPWMuc2V0LGI9Yy5nZXR0ZXJGb3IoIlVSTFNlYXJjaFBhcmFtcyIpLHg9Yy5nZXR0ZXJGb3IoIlVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yIiksdz0vXCsvZyxrPUFycmF5KDQpLFM9ZnVuY3Rpb24odCl7cmV0dXJuIGtbdC0xXXx8KGtbdC0xXT1SZWdFeHAoIigoPzolW1xcZGEtZl17Mn0peyIrdCsifSkiLCJnaSIpKX0sRT1mdW5jdGlvbih0KXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh0KX1jYXRjaChlKXtyZXR1cm4gdH19LGo9ZnVuY3Rpb24odCl7dmFyIGU9dC5yZXBsYWNlKHcsIiAiKSxuPTQ7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZSl9Y2F0Y2godCl7Zm9yKDtuOyllPWUucmVwbGFjZShTKG4tLSksRSk7cmV0dXJuIGV9fSxUPS9bIScoKX5dfCUyMC9nLE89eyIhIjoiJTIxIiwiJyI6IiUyNyIsIigiOiIlMjgiLCIpIjoiJTI5IiwifiI6IiU3RSIsIiUyMCI6IisifSxBPWZ1bmN0aW9uKHQpe3JldHVybiBPW3RdfSxDPWZ1bmN0aW9uKHQpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQodCkucmVwbGFjZShULEEpfSxMPWZ1bmN0aW9uKHQsZSl7aWYoZSlmb3IodmFyIG4scixvPWUuc3BsaXQoIiYiKSxpPTA7aTxvLmxlbmd0aDspKG49b1tpKytdKS5sZW5ndGgmJihyPW4uc3BsaXQoIj0iKSx0LnB1c2goe2tleTpqKHIuc2hpZnQoKSksdmFsdWU6aihyLmpvaW4oIj0iKSl9KSl9LFI9ZnVuY3Rpb24odCl7dGhpcy5lbnRyaWVzLmxlbmd0aD0wLEwodGhpcy5lbnRyaWVzLHQpfSxQPWZ1bmN0aW9uKHQsZSl7aWYodDxlKXRocm93IFR5cGVFcnJvcigiTm90IGVub3VnaCBhcmd1bWVudHMiKX0sTj11KGZ1bmN0aW9uKHQsZSl7bSh0aGlzLHt0eXBlOiJVUkxTZWFyY2hQYXJhbXNJdGVyYXRvciIsaXRlcmF0b3I6ZyhiKHQpLmVudHJpZXMpLGtpbmQ6ZX0pfSwiSXRlcmF0b3IiLGZ1bmN0aW9uKCl7dmFyIHQ9eCh0aGlzKSxlPXQua2luZCxuPXQuaXRlcmF0b3IubmV4dCgpLHI9bi52YWx1ZTtyZXR1cm4gbi5kb25lfHwobi52YWx1ZT0ia2V5cyI9PT1lP3Iua2V5OiJ2YWx1ZXMiPT09ZT9yLnZhbHVlOltyLmtleSxyLnZhbHVlXSksbn0pLEk9ZnVuY3Rpb24oKXtsKHRoaXMsSSwiVVJMU2VhcmNoUGFyYW1zIik7dmFyIHQsZSxuLHIsbyxpLGEscz1hcmd1bWVudHMubGVuZ3RoPjA/YXJndW1lbnRzWzBdOnZvaWQgMCx1PXRoaXMsYz1bXTtpZihtKHUse3R5cGU6IlVSTFNlYXJjaFBhcmFtcyIsZW50cmllczpjLHVwZGF0ZVVSTDpmdW5jdGlvbigpe30sdXBkYXRlU2VhcmNoUGFyYW1zOlJ9KSx2b2lkIDAhPT1zKWlmKGQocykpaWYoImZ1bmN0aW9uIj09dHlwZW9mKHQ9dihzKSkpZm9yKGU9dC5jYWxsKHMpOyEobj1lLm5leHQoKSkuZG9uZTspe2lmKChvPShyPWcoaChuLnZhbHVlKSkpLm5leHQoKSkuZG9uZXx8KGk9ci5uZXh0KCkpLmRvbmV8fCFyLm5leHQoKS5kb25lKXRocm93IFR5cGVFcnJvcigiRXhwZWN0ZWQgc2VxdWVuY2Ugd2l0aCBsZW5ndGggMiIpO2MucHVzaCh7a2V5Om8udmFsdWUrIiIsdmFsdWU6aS52YWx1ZSsiIn0pfWVsc2UgZm9yKGEgaW4gcylmKHMsYSkmJmMucHVzaCh7a2V5OmEsdmFsdWU6c1thXSsiIn0pO2Vsc2UgTChjLCJzdHJpbmciPT10eXBlb2Ygcz8iPyI9PT1zLmNoYXJBdCgwKT9zLnNsaWNlKDEpOnM6cysiIil9LF89SS5wcm90b3R5cGU7YShfLHthcHBlbmQ6ZnVuY3Rpb24odCxlKXtQKGFyZ3VtZW50cy5sZW5ndGgsMik7dmFyIG49Yih0aGlzKTtuLmVudHJpZXMucHVzaCh7a2V5OnQrIiIsdmFsdWU6ZSsiIn0pLG4udXBkYXRlVVJMKCl9LGRlbGV0ZTpmdW5jdGlvbih0KXtQKGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciBlPWIodGhpcyksbj1lLmVudHJpZXMscj10KyIiLG89MDtvPG4ubGVuZ3RoOyluW29dLmtleT09PXI/bi5zcGxpY2UobywxKTpvKys7ZS51cGRhdGVVUkwoKX0sZ2V0OmZ1bmN0aW9uKHQpe1AoYXJndW1lbnRzLmxlbmd0aCwxKTtmb3IodmFyIGU9Yih0aGlzKS5lbnRyaWVzLG49dCsiIixyPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXS5rZXk9PT1uKXJldHVybiBlW3JdLnZhbHVlO3JldHVybiBudWxsfSxnZXRBbGw6ZnVuY3Rpb24odCl7UChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgZT1iKHRoaXMpLmVudHJpZXMsbj10KyIiLHI9W10sbz0wO288ZS5sZW5ndGg7bysrKWVbb10ua2V5PT09biYmci5wdXNoKGVbb10udmFsdWUpO3JldHVybiByfSxoYXM6ZnVuY3Rpb24odCl7UChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgZT1iKHRoaXMpLmVudHJpZXMsbj10KyIiLHI9MDtyPGUubGVuZ3RoOylpZihlW3IrK10ua2V5PT09bilyZXR1cm4hMDtyZXR1cm4hMX0sc2V0OmZ1bmN0aW9uKHQsZSl7UChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgbixyPWIodGhpcyksbz1yLmVudHJpZXMsaT0hMSxhPXQrIiIscz1lKyIiLHU9MDt1PG8ubGVuZ3RoO3UrKykobj1vW3VdKS5rZXk9PT1hJiYoaT9vLnNwbGljZSh1LS0sMSk6KGk9ITAsbi52YWx1ZT1zKSk7aXx8by5wdXNoKHtrZXk6YSx2YWx1ZTpzfSksci51cGRhdGVVUkwoKX0sc29ydDpmdW5jdGlvbigpe3ZhciB0LGUsbixyPWIodGhpcyksbz1yLmVudHJpZXMsaT1vLnNsaWNlKCk7Zm9yKG8ubGVuZ3RoPTAsbj0wO248aS5sZW5ndGg7bisrKXtmb3IodD1pW25dLGU9MDtlPG47ZSsrKWlmKG9bZV0ua2V5PnQua2V5KXtvLnNwbGljZShlLDAsdCk7YnJlYWt9ZT09PW4mJm8ucHVzaCh0KX1yLnVwZGF0ZVVSTCgpfSxmb3JFYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPWIodGhpcykuZW50cmllcyxyPXAodCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCwzKSxvPTA7bzxuLmxlbmd0aDspcigoZT1uW28rK10pLnZhbHVlLGUua2V5LHRoaXMpfSxrZXlzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKHRoaXMsImtleXMiKX0sdmFsdWVzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKHRoaXMsInZhbHVlcyIpfSxlbnRyaWVzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKHRoaXMsImVudHJpZXMiKX19LHtlbnVtZXJhYmxlOiEwfSksaShfLHksXy5lbnRyaWVzKSxpKF8sInRvU3RyaW5nIixmdW5jdGlvbigpe2Zvcih2YXIgdCxlPWIodGhpcykuZW50cmllcyxuPVtdLHI9MDtyPGUubGVuZ3RoOyl0PWVbcisrXSxuLnB1c2goQyh0LmtleSkrIj0iK0ModC52YWx1ZSkpO3JldHVybiBuLmpvaW4oIiYiKX0se2VudW1lcmFibGU6ITB9KSxzKEksIlVSTFNlYXJjaFBhcmFtcyIpLHIoe2dsb2JhbDohMCxmb3JjZWQ6IW99LHtVUkxTZWFyY2hQYXJhbXM6SX0pLHQuZXhwb3J0cz17VVJMU2VhcmNoUGFyYW1zOkksZ2V0U3RhdGU6Yn19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpLG89bigyKSxpPW4oMjgpLGE9bygiaXRlcmF0b3IiKTt0LmV4cG9ydHM9IXIoZnVuY3Rpb24oKXt2YXIgdD1uZXcgVVJMKCJiP2U9MSIsImh0dHA6Ly9hIiksZT10LnNlYXJjaFBhcmFtcztyZXR1cm4gdC5wYXRobmFtZT0iYyUyMGQiLGkmJiF0LnRvSlNPTnx8IWUuc29ydHx8Imh0dHA6Ly9hL2MlMjBkP2U9MSIhPT10LmhyZWZ8fCIxIiE9PWUuZ2V0KCJlIil8fCJhPTEiIT09U3RyaW5nKG5ldyBVUkxTZWFyY2hQYXJhbXMoIj9hPTEiKSl8fCFlW2FdfHwiYSIhPT1uZXcgVVJMKCJodHRwczovL2FAYiIpLnVzZXJuYW1lfHwiYiIhPT1uZXcgVVJMU2VhcmNoUGFyYW1zKG5ldyBVUkxTZWFyY2hQYXJhbXMoImE9YiIpKS5nZXQoImEiKXx8InhuLS1lMWF5YmMiIT09bmV3IFVSTCgiaHR0cDovL9GC0LXRgdGCIikuaG9zdHx8IiMlRDAlQjEiIT09bmV3IFVSTCgiaHR0cDovL2Ej0LEiKS5oYXNofSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5yKGUpO3ZhciByPW4oOSksbz1uLm4ociksaT1uKDYxKSxhPW4ubihpKSxzPW4oMjYpLHU9bi5uKHMpLGM9bigzKSxsPW4ubihjKSxmPW4oMjApLHA9bi5uKGYpLGg9big4KSxkPW4ubihoKSxnPW4oMTIpLHY9bi5uKGcpLHk9bigxMjYpLG09bi5uKHkpLGI9bigxOSkseD1uLm4oYiksdz1uKDM3KSxrPW4ubih3KSxTPW4oMTUpLEU9bi5uKFMpLGo9bigxMCksVD1uLm4oaiksTz0obigxNiksbig4MCkpLEE9bi5uKE8pO2Z1bmN0aW9uIEModCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjAsbj1BKCkodC5yZXBsYWNlKC9bXjAtOV0vZ2ksIiIpLDEwKTtyZXR1cm4gbnx8ZX1mdW5jdGlvbiBMKHQpe3ZhciBlPSIiLG49dC5jb250ZW50cygpO2lmKG4ubGVuZ3RoPjApZm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKz0xKXt2YXIgbz1uLmdldChyKTszPT09by5ub2RlVHlwZSYmby5kYXRhJiYoZSs9by5kYXRhKX1yZXR1cm4gZX1mdW5jdGlvbiBSKHQsZSl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJzZWxlY3RvciByZXF1aXJlZCIpO3JldHVybiB0KGUpLmxlbmd0aD4wJiYiaW1nIj09PXQoZSkucHJvcCgidGFnTmFtZSIpLnRvTG93ZXJDYXNlKCk/dChlKS5hdHRyKCJhbHQiKXx8IiI6dChlKS50ZXh0KCkucmVwbGFjZSgvXG4vLCIiKX1mdW5jdGlvbiBQKHQsZSl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJzZWxlY3RvciByZXF1aXJlZCIpO3ZhciBuPSIiO2lmKHQoZSkubGVuZ3RoPjApe3ZhciByPXQoZSkucHJvcCgidGFnTmFtZSIpLnRvTG93ZXJDYXNlKCk7bj0iaW5wdXQiPT09cj90KGUpLnZhbCgpOiJtZXRhIj09PXI/dChlKS5hdHRyKCJjb250ZW50Iil8fCIiOkwodChlKSl9cmV0dXJuIG49bi5yZXBsYWNlKC9bXjAtOV0vZywiIiksQSgpKG4sMTApfXZhciBOPW4oMzgpLEk9bi5uKE4pLF89bigzOSksRD1uLm4oXyksTT1uKDQwKSxVPW4ubihNKSxCPW4oNDEpLHE9bi5uKEIpLEY9big0MiksSD1uLm4oRiksej1uKDQzKSxXPW4ubih6KSwkPW4oNjIpLFk9bi5uKCQpO2Z1bmN0aW9uIFYodCxlKXt2YXIgbjtpZih2b2lkIDA9PT1xLmF8fG51bGw9PVUoKSh0KSl7aWYoRCgpKHQpfHwobj1mdW5jdGlvbih0LGUpe3ZhciBuO2lmKCF0KXJldHVybjtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIEcodCxlKTt2YXIgcj1XKCkobj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpLmNhbGwobiw4LC0xKTsiT2JqZWN0Ij09PXImJnQuY29uc3RydWN0b3ImJihyPXQuY29uc3RydWN0b3IubmFtZSk7aWYoIk1hcCI9PT1yfHwiU2V0Ij09PXIpcmV0dXJuIEgoKSh0KTtpZigiQXJndW1lbnRzIj09PXJ8fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHIpKXJldHVybiBHKHQsZSl9KHQpKXx8ZSYmdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCl7biYmKHQ9bik7dmFyIHI9MCxvPWZ1bmN0aW9uKCl7fTtyZXR1cm57czpvLG46ZnVuY3Rpb24oKXtyZXR1cm4gcj49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbcisrXX19LGU6ZnVuY3Rpb24odCl7dGhyb3cgdH0sZjpvfX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIGksYT0hMCxzPSExO3JldHVybntzOmZ1bmN0aW9uKCl7bj1JKCkodCl9LG46ZnVuY3Rpb24oKXt2YXIgdD1uLm5leHQoKTtyZXR1cm4gYT10LmRvbmUsdH0sZTpmdW5jdGlvbih0KXtzPSEwLGk9dH0sZjpmdW5jdGlvbigpe3RyeXthfHxudWxsPT1uLnJldHVybnx8bi5yZXR1cm4oKX1maW5hbGx5e2lmKHMpdGhyb3cgaX19fX1mdW5jdGlvbiBHKHQsZSl7KG51bGw9PWV8fGU+dC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkoZSk7bjxlO24rKylyW25dPXRbbl07cmV0dXJuIHJ9ZnVuY3Rpb24gSyh0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoIlNLVeOBjOS4jeato+OBp+OBmSIpO2lmKDA9PT1ZKCkodCkubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiU0tV6aCF55uu5pWw44GM5LiN5q2j44Gn44GZIil9dmFyIFg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ZhciBuPWUuJCxyPWUubmFtZSxvPWUucHJpY2U7ZCgpKHRoaXMsdCksdGhpcy4kPW4sdGhpcy5uYW1lU2VsZWN0b3I9cnx8IiIsdGhpcy5wcmljZVNlbGVjdG9yPW98fCIifXJldHVybiB2KCkodCxbe2tleToiZ2V0UHVyY2hhc2FibGUiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiEwfX0se2tleToiZXhlY3V0ZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdCxlLG4scj0hMDt0cnl7cmV0dXJuIHQ9dGhpcy5nZXRJdGVtKCksZT10aGlzLmdldFNrdVJvd3ModCkscj10aGlzLmdldFB1cmNoYXNhYmxlKHtpdGVtOnQsc2t1Um93czplfSksZnVuY3Rpb24odCl7dmFyIGU9dC5pdGVtLG49dC5za3VSb3dzO2lmKCFlKXRocm93IG5ldyBFcnJvcigi44Ki44Kk44OG44Og44GM5LiN5q2j44Gn44GZIik7aWYoIWUubmFtZSl0aHJvdyBuZXcgRXJyb3IoIuOCouOCpOODhuODoOWQjeWJjeOBjOS4jeato+OBp+OBmSIpO2lmKCEobiYmMCE9PW4ubGVuZ3RofHxlLnByaWNlKSl0aHJvdyBuZXcgRXJyb3IoIuOCouOCpOODhuODoOmHkemhjeOBjOS4jeato+OBp+OBmSIpO2lmKG4pe3ZhciByLG89VihuKTt0cnl7Zm9yKG8ucygpOyEocj1vLm4oKSkuZG9uZTspe0soci52YWx1ZSl9fWNhdGNoKHQpe28uZSh0KX1maW5hbGx5e28uZigpfX19KHtpdGVtOnQsc2t1Um93czplfSkse2l0ZW06dCxza3VSb3dzOmUscHVyY2hhc2FibGU6cn19Y2F0Y2godCl7bj10fXZhciBvPXtwdXJjaGFzYWJsZTpyfTtyZXR1cm4gdCYmKG8uaXRlbT10KSxlJiYoby5za3VSb3dzPWUpLG4mJihvLmVycm9yPW4pLG99fSx7a2V5OiJnZXRJdGVtIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXtuYW1lOiIiLHByaWNlOjB9O3RoaXMubmFtZVNlbGVjdG9yP3QubmFtZT10aGlzLmdldEl0ZW1OYW1lKFIodGhpcy4kLHRoaXMubmFtZVNlbGVjdG9yKSk6dC5uYW1lPXRoaXMuZ2V0SXRlbU5hbWUoKSx0aGlzLnByaWNlU2VsZWN0b3I/dC5wcmljZT10aGlzLmdldEl0ZW1QcmljZShQKHRoaXMuJCx0aGlzLnByaWNlU2VsZWN0b3IpKTp0LnByaWNlPXRoaXMuZ2V0SXRlbVByaWNlKCk7dmFyIGU9dGhpcy5nZXRJdGVtQ29kZSgpO3JldHVybiBlJiYodC5jb2RlPWUpLHR9fSx7a2V5OiJnZXRJdGVtTmFtZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06IiI7cmV0dXJuIHRoaXMubmFtZVNlbGVjdG9yP1IodGhpcy4kLHRoaXMubmFtZVNlbGVjdG9yKTp0fX0se2tleToiZ2V0SXRlbVByaWNlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTowO3JldHVybiB0aGlzLnByaWNlU2VsZWN0b3I/UCh0aGlzLiQsdGhpcy5wcmljZVNlbGVjdG9yKTp0fX0se2tleToiZ2V0SXRlbUNvZGUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9fSx7a2V5OiJnZXRTa3VSb3dzIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm5bXX19XSksdH0oKSxKPW4oMTI3KSxRPW4ubihKKSxaPW4oMTI4KTtmdW5jdGlvbiB0dCgpe3JldHVybiB3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlcyYmd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXNbMF18fHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2V8fHdpbmRvdy5uYXZpZ2F0b3IudXNlckxhbmd1YWdlfHx3aW5kb3cubmF2aWdhdG9yLmJyb3dzZXJMYW5ndWFnZX12YXIgZXQ9bigxMjkpLG50PW4ubihldCkscnQ9bigxMzApLG90PW4ubihydCksaXQ9InppZ3phZyI7dmFyIGF0PW4oMjUpLHN0PSJ1c2FnZSIsdXQ9InppZ3phZy1mbG93LWNvbnRyb2xsZWQiO2Z1bmN0aW9uIGN0KHQsZSl7d2luZG93LiQmJmZ1bmN0aW9uKG4pe3ZhciByPW4odCk7aWYociYmci5sZW5ndGg+MClmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rPTEpe3ZhciBpPXIuZ2V0KG8pO2kuaGFzQXR0cmlidXRlKHV0KXx8KCJjbGljayI9PT1lP2kub25jbGljaz1udWxsOiJzdWJtaXQiPT09ZSYmKGkub25zdWJtaXQ9bnVsbCksIm9mZiJpbiBuKGkpP24oaSkub2ZmKGUpOiJ1bmJpbmQiaW4gbihpKSYmbihpKS51bmJpbmQoZSkpfX0od2luZG93LiQpfXZhciBsdD17cHJlc2VydmVPcmlnaW5hbEV2ZW50OiExLGRpc2FibGVQb2ludGVyRXZlbnQ6ITEsZGlzYWJsZVJlcG9ydDohMX07dmFyIGZ0PXtkaXNhYmxlUmVwb3J0OiExfTtmdW5jdGlvbiBwdCh0KXt2YXIgZT1vdCgpKGZ1bmN0aW9uKCl7dmFyIG4scixvPXdpbmRvdy56aWd6YWc7ImRlYWN0aXZhdGVkIj09PShuPXN0LHI9d2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGl0KSxKU09OLnBhcnNlKHI/ZGVjb2RlVVJJQ29tcG9uZW50KGF0b2IocikpOiJ7fSIpW25dKXx8by5pc0RlbmllZHx8KHQoKSxjbGVhckludGVydmFsKGUpKX0sNTAwKX1mdW5jdGlvbiBodCh0LGUpe3ZhciBuPXdpbmRvdy56aWd6YWc7bnQoKShmdW5jdGlvbigpey9DaHJvbWUvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpJiYwPT09dChlKS5sZW5ndGgmJm4mJiJpdGVtIj09PW4uZGlzY292ZXJ5U3RhdHVzJiZhdC5hLmVycm9yKCIiLmNvbmNhdChlLCI6IOOCouOCpOODhuODoOODmuODvOOCuOOBp+ipsuW9k+OBmeOCi+ODleODreODvOWItuW+oeeUqOOBruimgee0oOOBjOimi+OBpOOBi+OCiuOBvuOBm+OCkyIpKX0sNWUzKX12YXIgZHQ9e29uQ2hhbmdlc1JlYWR5OmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpbImphIl07Qm9vbGVhbihUKCkoZSkuY2FsbChlLGZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybi0xIT09USgpKGU9dHQoKSkuY2FsbChlLHQpfSkpfHxwdChmdW5jdGlvbigpe3QoWil9KX0sb3ZlcnJpZGVDbGlja0V2ZW50OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106bHQ7aWYoKHI9dSgpKHUoKSh7fSxsdCkscikpLmRpc2FibGVSZXBvcnR8fGh0KHQsZSksci5kaXNhYmxlUG9pbnRlckV2ZW50KXtpZih3aW5kb3cuZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUodXQpKXJldHVybjt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO28uaW5uZXJIVE1MPSJcbiAgICAiLmNvbmNhdChlLCIge1xuICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgfSIpO3ZhciBpPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdCIpO3JldHVybiBpJiZpLnBhcmVudE5vZGUmJmkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobyxpKSx0KGRvY3VtZW50KS5vbigiY2xpY2siLGZ1bmN0aW9uKHIpe3IudGFyZ2V0JiZ0KHIudGFyZ2V0KS5jbG9zZXN0KHQoZSkucGFyZW50KCkpLmxlbmd0aD4wJiZuKHIpfSksdm9pZCB3aW5kb3cuZG9jdW1lbnQuYm9keS5zZXRBdHRyaWJ1dGUodXQsIjEiKX1yLnByZXNlcnZlT3JpZ2luYWxFdmVudHx8Y3QoZSwiY2xpY2siKTtmb3IodmFyIGE9dChlKSxzPTA7czxhLmxlbmd0aDtzKz0xKXt2YXIgYz1hLmdldChzKTtjLmhhc0F0dHJpYnV0ZSh1dCl8fChjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbih0KXtyLnByZXNlcnZlT3JpZ2luYWxFdmVudHx8KHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpKSxuKHQpfSwhMCksYy5zZXRBdHRyaWJ1dGUodXQsIjEiKSl9fSxvdmVycmlkZVN1Ym1pdEV2ZW50OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106ZnQ7KHI9dSgpKHUoKSh7fSxmdCkscikpLmRpc2FibGVSZXBvcnR8fGh0KHQsZSksY3QoZSwic3VibWl0Iik7dmFyIG89dChlKTtpZihvJiZvLmxlbmd0aD4wKWZvcih2YXIgaT0wO2k8by5sZW5ndGg7aSs9MSl7dmFyIGE9by5nZXQoaSk7YS5oYXNBdHRyaWJ1dGUodXQpfHwodChhKS5vbigic3VibWl0IixuKSxhLnNldEF0dHJpYnV0ZSh1dCwiMSIpKX19LHVuYmluZE9yaWdpbmFsSlF1ZXJ5RXZlbnRzOmN0fTt2YXIgZ3Q9big4MSksdnQ9bi5uKGd0KSx5dD1uKDEzMSksbXQ9bi5uKHl0KSxidD1uKDEzMikseHQ9bi5uKGJ0KSx3dD1uKDgyKSxrdD1uLm4od3QpO2Z1bmN0aW9uIFN0KHQpe3JldHVybihTdD0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgdH0pKHQpfWZ1bmN0aW9uIEV0KHQsZSxuKXtyZXR1cm4gZSBpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPW4sdH1mdW5jdGlvbiBqdCh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/T2JqZWN0KGFyZ3VtZW50c1tlXSk6e30scj1PYmplY3Qua2V5cyhuKTsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyYmKHI9ci5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhuKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix0KS5lbnVtZXJhYmxlfSkpKSxyLmZvckVhY2goZnVuY3Rpb24oZSl7RXQodCxlLG5bZV0pfSl9cmV0dXJuIHR9ZnVuY3Rpb24gVHQodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBPdCh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsci5rZXkscil9fWZ1bmN0aW9uIEF0KHQsZSxuKXtyZXR1cm4gZSYmT3QodC5wcm90b3R5cGUsZSksbiYmT3QodCxuKSx0fWZ1bmN0aW9uIEN0KHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH1mdW5jdGlvbiBMdCh0LGUpe3JldHVybiFlfHwib2JqZWN0IiE9PVN0KGUpJiYiZnVuY3Rpb24iIT10eXBlb2YgZT9DdCh0KTplfWZ1bmN0aW9uIFJ0KHQpe3JldHVybihSdD1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfSkodCl9ZnVuY3Rpb24gUHQodCxlKXtyZXR1cm4oUHQ9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbih0LGUpe3JldHVybiB0Ll9fcHJvdG9fXz1lLHR9KSh0LGUpfWZ1bmN0aW9uIE50KHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJlB0KHQsZSl9dmFyIEl0PXt0eXBlOiJsb2dnZXIiLGxvZzpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgibG9nIix0KX0sd2FybjpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgid2FybiIsdCl9LGVycm9yOmZ1bmN0aW9uKHQpe3RoaXMub3V0cHV0KCJlcnJvciIsdCl9LG91dHB1dDpmdW5jdGlvbih0LGUpe2NvbnNvbGUmJmNvbnNvbGVbdF0mJmNvbnNvbGVbdF0uYXBwbHkoY29uc29sZSxlKX19LF90PW5ldyhmdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O1R0KHRoaXMsdCksdGhpcy5pbml0KGUsbil9cmV0dXJuIEF0KHQsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTt0aGlzLnByZWZpeD1lLnByZWZpeHx8ImkxOG5leHQ6Iix0aGlzLmxvZ2dlcj10fHxJdCx0aGlzLm9wdGlvbnM9ZSx0aGlzLmRlYnVnPWUuZGVidWd9fSx7a2V5OiJzZXREZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5kZWJ1Zz10fX0se2tleToibG9nIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwibG9nIiwiIiwhMCl9fSx7a2V5OiJ3YXJuIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwid2FybiIsIiIsITApfX0se2tleToiZXJyb3IiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsZT1uZXcgQXJyYXkodCksbj0wO248dDtuKyspZVtuXT1hcmd1bWVudHNbbl07cmV0dXJuIHRoaXMuZm9yd2FyZChlLCJlcnJvciIsIiIpfX0se2tleToiZGVwcmVjYXRlIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwid2FybiIsIldBUk5JTkcgREVQUkVDQVRFRDogIiwhMCl9fSx7a2V5OiJmb3J3YXJkIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gciYmIXRoaXMuZGVidWc/bnVsbDooInN0cmluZyI9PXR5cGVvZiB0WzBdJiYodFswXT0iIi5jb25jYXQobikuY29uY2F0KHRoaXMucHJlZml4LCIgIikuY29uY2F0KHRbMF0pKSx0aGlzLmxvZ2dlcltlXSh0KSl9fSx7a2V5OiJjcmVhdGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdCh0aGlzLmxvZ2dlcixqdCh7fSx7cHJlZml4OiIiLmNvbmNhdCh0aGlzLnByZWZpeCwiOiIpLmNvbmNhdChlLCI6Iil9LHRoaXMub3B0aW9ucykpfX1dKSx0fSgpKSxEdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtUdCh0aGlzLHQpLHRoaXMub2JzZXJ2ZXJzPXt9fXJldHVybiBBdCh0LFt7a2V5OiJvbiIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3JldHVybiB0LnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbih0KXtuLm9ic2VydmVyc1t0XT1uLm9ic2VydmVyc1t0XXx8W10sbi5vYnNlcnZlcnNbdF0ucHVzaChlKX0pLHRoaXN9fSx7a2V5OiJvZmYiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5vYnNlcnZlcnNbdF0mJihlP3RoaXMub2JzZXJ2ZXJzW3RdPXRoaXMub2JzZXJ2ZXJzW3RdLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdCE9PWV9KTpkZWxldGUgdGhpcy5vYnNlcnZlcnNbdF0pfX0se2tleToiZW1pdCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkoZT4xP2UtMTowKSxyPTE7cjxlO3IrKyluW3ItMV09YXJndW1lbnRzW3JdO2lmKHRoaXMub2JzZXJ2ZXJzW3RdKXt2YXIgbz1bXS5jb25jYXQodGhpcy5vYnNlcnZlcnNbdF0pO28uZm9yRWFjaChmdW5jdGlvbih0KXt0LmFwcGx5KHZvaWQgMCxuKX0pfWlmKHRoaXMub2JzZXJ2ZXJzWyIqIl0pe3ZhciBpPVtdLmNvbmNhdCh0aGlzLm9ic2VydmVyc1siKiJdKTtpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5hcHBseShlLFt0XS5jb25jYXQobikpfSl9fX1dKSx0fSgpO2Z1bmN0aW9uIE10KCl7dmFyIHQsZSxuPW5ldyBQcm9taXNlKGZ1bmN0aW9uKG4scil7dD1uLGU9cn0pO3JldHVybiBuLnJlc29sdmU9dCxuLnJlamVjdD1lLG59ZnVuY3Rpb24gVXQodCl7cmV0dXJuIG51bGw9PXQ/IiI6IiIrdH1mdW5jdGlvbiBCdCh0LGUsbil7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5pbmRleE9mKCIjIyMiKT4tMT90LnJlcGxhY2UoLyMjIy9nLCIuIik6dH1mdW5jdGlvbiBvKCl7cmV0dXJuIXR8fCJzdHJpbmciPT10eXBlb2YgdH1mb3IodmFyIGk9InN0cmluZyIhPXR5cGVvZiBlP1tdLmNvbmNhdChlKTplLnNwbGl0KCIuIik7aS5sZW5ndGg+MTspe2lmKG8oKSlyZXR1cm57fTt2YXIgYT1yKGkuc2hpZnQoKSk7IXRbYV0mJm4mJih0W2FdPW5ldyBuKSx0PXRbYV19cmV0dXJuIG8oKT97fTp7b2JqOnQsazpyKGkuc2hpZnQoKSl9fWZ1bmN0aW9uIHF0KHQsZSxuKXt2YXIgcj1CdCh0LGUsT2JqZWN0KTtyLm9ialtyLmtdPW59ZnVuY3Rpb24gRnQodCxlKXt2YXIgbj1CdCh0LGUpLHI9bi5vYmosbz1uLms7aWYocilyZXR1cm4gcltvXX1mdW5jdGlvbiBIdCh0LGUsbil7dmFyIHI9RnQodCxuKTtyZXR1cm4gdm9pZCAwIT09cj9yOkZ0KGUsbil9ZnVuY3Rpb24genQodCxlLG4pe2Zvcih2YXIgciBpbiBlKSJfX3Byb3RvX18iIT09ciYmImNvbnN0cnVjdG9yIiE9PXImJihyIGluIHQ/InN0cmluZyI9PXR5cGVvZiB0W3JdfHx0W3JdaW5zdGFuY2VvZiBTdHJpbmd8fCJzdHJpbmciPT10eXBlb2YgZVtyXXx8ZVtyXWluc3RhbmNlb2YgU3RyaW5nP24mJih0W3JdPWVbcl0pOnp0KHRbcl0sZVtyXSxuKTp0W3JdPWVbcl0pO3JldHVybiB0fWZ1bmN0aW9uIFd0KHQpe3JldHVybiB0LnJlcGxhY2UoL1tcLVxbXF1cL1x7XH1cKFwpXCpcK1w/XC5cXFxeXCRcfF0vZywiXFwkJiIpfXZhciAkdD17IiYiOiImYW1wOyIsIjwiOiImbHQ7IiwiPiI6IiZndDsiLCciJzoiJnF1b3Q7IiwiJyI6IiYjMzk7IiwiLyI6IiYjeDJGOyJ9O2Z1bmN0aW9uIFl0KHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD90LnJlcGxhY2UoL1smPD4iJ1wvXS9nLGZ1bmN0aW9uKHQpe3JldHVybiAkdFt0XX0pOnR9dmFyIFZ0PSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cubmF2aWdhdG9yJiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCYmd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpPi0xLEd0PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCl7dmFyIG4scj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e25zOlsidHJhbnNsYXRpb24iXSxkZWZhdWx0TlM6InRyYW5zbGF0aW9uIn07cmV0dXJuIFR0KHRoaXMsZSksbj1MdCh0aGlzLFJ0KGUpLmNhbGwodGhpcykpLFZ0JiZEdC5jYWxsKEN0KG4pKSxuLmRhdGE9dHx8e30sbi5vcHRpb25zPXIsdm9pZCAwPT09bi5vcHRpb25zLmtleVNlcGFyYXRvciYmKG4ub3B0aW9ucy5rZXlTZXBhcmF0b3I9Ii4iKSxufXJldHVybiBOdChlLER0KSxBdChlLFt7a2V5OiJhZGROYW1lc3BhY2VzIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnMubnMuaW5kZXhPZih0KTwwJiZ0aGlzLm9wdGlvbnMubnMucHVzaCh0KX19LHtrZXk6InJlbW92ZU5hbWVzcGFjZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9ucy5ucy5pbmRleE9mKHQpO2U+LTEmJnRoaXMub3B0aW9ucy5ucy5zcGxpY2UoZSwxKX19LHtrZXk6ImdldFJlc291cmNlIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOnt9LG89dm9pZCAwIT09ci5rZXlTZXBhcmF0b3I/ci5rZXlTZXBhcmF0b3I6dGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcixpPVt0LGVdO3JldHVybiBuJiYic3RyaW5nIiE9dHlwZW9mIG4mJihpPWkuY29uY2F0KG4pKSxuJiYic3RyaW5nIj09dHlwZW9mIG4mJihpPWkuY29uY2F0KG8/bi5zcGxpdChvKTpuKSksdC5pbmRleE9mKCIuIik+LTEmJihpPXQuc3BsaXQoIi4iKSksRnQodGhpcy5kYXRhLGkpfX0se2tleToiYWRkUmVzb3VyY2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XTp7c2lsZW50OiExfSxpPXRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3I7dm9pZCAwPT09aSYmKGk9Ii4iKTt2YXIgYT1bdCxlXTtuJiYoYT1hLmNvbmNhdChpP24uc3BsaXQoaSk6bikpLHQuaW5kZXhPZigiLiIpPi0xJiYocj1lLGU9KGE9dC5zcGxpdCgiLiIpKVsxXSksdGhpcy5hZGROYW1lc3BhY2VzKGUpLHF0KHRoaXMuZGF0YSxhLHIpLG8uc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIix0LGUsbixyKX19LHtrZXk6ImFkZFJlc291cmNlcyIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7c2lsZW50OiExfTtmb3IodmFyIG8gaW4gbikic3RyaW5nIiE9dHlwZW9mIG5bb10mJiJbb2JqZWN0IEFycmF5XSIhPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KG5bb10pfHx0aGlzLmFkZFJlc291cmNlKHQsZSxvLG5bb10se3NpbGVudDohMH0pO3Iuc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIix0LGUsbil9fSx7a2V5OiJhZGRSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjUmJnZvaWQgMCE9PWFyZ3VtZW50c1s1XT9hcmd1bWVudHNbNV06e3NpbGVudDohMX0sYT1bdCxlXTt0LmluZGV4T2YoIi4iKT4tMSYmKHI9bixuPWUsZT0oYT10LnNwbGl0KCIuIikpWzFdKSx0aGlzLmFkZE5hbWVzcGFjZXMoZSk7dmFyIHM9RnQodGhpcy5kYXRhLGEpfHx7fTtyP3p0KHMsbixvKTpzPWp0KHt9LHMsbikscXQodGhpcy5kYXRhLGEscyksaS5zaWxlbnR8fHRoaXMuZW1pdCgiYWRkZWQiLHQsZSxuKX19LHtrZXk6InJlbW92ZVJlc291cmNlQnVuZGxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMuaGFzUmVzb3VyY2VCdW5kbGUodCxlKSYmZGVsZXRlIHRoaXMuZGF0YVt0XVtlXSx0aGlzLnJlbW92ZU5hbWVzcGFjZXMoZSksdGhpcy5lbWl0KCJyZW1vdmVkIix0LGUpfX0se2tleToiaGFzUmVzb3VyY2VCdW5kbGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuZ2V0UmVzb3VyY2UodCxlKX19LHtrZXk6ImdldFJlc291cmNlQnVuZGxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiBlfHwoZT10aGlzLm9wdGlvbnMuZGVmYXVsdE5TKSwidjEiPT09dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEk/anQoe30se30sdGhpcy5nZXRSZXNvdXJjZSh0LGUpKTp0aGlzLmdldFJlc291cmNlKHQsZSl9fSx7a2V5OiJnZXREYXRhQnlMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGF0YVt0XX19LHtrZXk6InRvSlNPTiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhfX1dKSxlfSgpLEt0PXtwcm9jZXNzb3JzOnt9LGFkZFBvc3RQcm9jZXNzb3I6ZnVuY3Rpb24odCl7dGhpcy5wcm9jZXNzb3JzW3QubmFtZV09dH0saGFuZGxlOmZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGk9dGhpcztyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2kucHJvY2Vzc29yc1t0XSYmKGU9aS5wcm9jZXNzb3JzW3RdLnByb2Nlc3MoZSxuLHIsbykpfSksZX19LFh0PXt9LEp0PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCl7dmFyIG4scixvLGksYT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307cmV0dXJuIFR0KHRoaXMsZSksbj1MdCh0aGlzLFJ0KGUpLmNhbGwodGhpcykpLFZ0JiZEdC5jYWxsKEN0KG4pKSxyPVsicmVzb3VyY2VTdG9yZSIsImxhbmd1YWdlVXRpbHMiLCJwbHVyYWxSZXNvbHZlciIsImludGVycG9sYXRvciIsImJhY2tlbmRDb25uZWN0b3IiLCJpMThuRm9ybWF0IiwidXRpbHMiXSxvPXQsaT1DdChuKSxyLmZvckVhY2goZnVuY3Rpb24odCl7b1t0XSYmKGlbdF09b1t0XSl9KSxuLm9wdGlvbnM9YSx2b2lkIDA9PT1uLm9wdGlvbnMua2V5U2VwYXJhdG9yJiYobi5vcHRpb25zLmtleVNlcGFyYXRvcj0iLiIpLG4ubG9nZ2VyPV90LmNyZWF0ZSgidHJhbnNsYXRvciIpLG59cmV0dXJuIE50KGUsRHQpLEF0KGUsW3trZXk6ImNoYW5nZUxhbmd1YWdlIix2YWx1ZTpmdW5jdGlvbih0KXt0JiYodGhpcy5sYW5ndWFnZT10KX19LHtrZXk6ImV4aXN0cyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOntpbnRlcnBvbGF0aW9uOnt9fSxuPXRoaXMucmVzb2x2ZSh0LGUpO3JldHVybiBuJiZ2b2lkIDAhPT1uLnJlc319LHtrZXk6ImV4dHJhY3RGcm9tS2V5Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXZvaWQgMCE9PWUubnNTZXBhcmF0b3I/ZS5uc1NlcGFyYXRvcjp0aGlzLm9wdGlvbnMubnNTZXBhcmF0b3I7dm9pZCAwPT09biYmKG49IjoiKTt2YXIgcj12b2lkIDAhPT1lLmtleVNlcGFyYXRvcj9lLmtleVNlcGFyYXRvcjp0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLG89ZS5uc3x8dGhpcy5vcHRpb25zLmRlZmF1bHROUztpZihuJiZ0LmluZGV4T2Yobik+LTEpe3ZhciBpPXQubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7aWYoaSYmaS5sZW5ndGg+MClyZXR1cm57a2V5OnQsbmFtZXNwYWNlczpvfTt2YXIgYT10LnNwbGl0KG4pOyhuIT09cnx8bj09PXImJnRoaXMub3B0aW9ucy5ucy5pbmRleE9mKGFbMF0pPi0xKSYmKG89YS5zaGlmdCgpKSx0PWEuam9pbihyKX1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIG8mJihvPVtvXSkse2tleTp0LG5hbWVzcGFjZXM6b319fSx7a2V5OiJ0cmFuc2xhdGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzO2lmKCJvYmplY3QiIT09U3QoZSkmJnRoaXMub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlciYmKGU9dGhpcy5vcHRpb25zLm92ZXJsb2FkVHJhbnNsYXRpb25PcHRpb25IYW5kbGVyKGFyZ3VtZW50cykpLGV8fChlPXt9KSxudWxsPT10KXJldHVybiIiO0FycmF5LmlzQXJyYXkodCl8fCh0PVtTdHJpbmcodCldKTt2YXIgbz12b2lkIDAhPT1lLmtleVNlcGFyYXRvcj9lLmtleVNlcGFyYXRvcjp0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLGk9dGhpcy5leHRyYWN0RnJvbUtleSh0W3QubGVuZ3RoLTFdLGUpLGE9aS5rZXkscz1pLm5hbWVzcGFjZXMsdT1zW3MubGVuZ3RoLTFdLGM9ZS5sbmd8fHRoaXMubGFuZ3VhZ2UsbD1lLmFwcGVuZE5hbWVzcGFjZVRvQ0lNb2RlfHx0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU7aWYoYyYmImNpbW9kZSI9PT1jLnRvTG93ZXJDYXNlKCkpe2lmKGwpe3ZhciBmPWUubnNTZXBhcmF0b3J8fHRoaXMub3B0aW9ucy5uc1NlcGFyYXRvcjtyZXR1cm4gdStmK2F9cmV0dXJuIGF9dmFyIHA9dGhpcy5yZXNvbHZlKHQsZSksaD1wJiZwLnJlcyxkPXAmJnAudXNlZEtleXx8YSxnPXAmJnAuZXhhY3RVc2VkS2V5fHxhLHY9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShoKSx5PVsiW29iamVjdCBOdW1iZXJdIiwiW29iamVjdCBGdW5jdGlvbl0iLCJbb2JqZWN0IFJlZ0V4cF0iXSxtPXZvaWQgMCE9PWUuam9pbkFycmF5cz9lLmpvaW5BcnJheXM6dGhpcy5vcHRpb25zLmpvaW5BcnJheXMsYj0hdGhpcy5pMThuRm9ybWF0fHx0aGlzLmkxOG5Gb3JtYXQuaGFuZGxlQXNPYmplY3QseD0ic3RyaW5nIiE9dHlwZW9mIGgmJiJib29sZWFuIiE9dHlwZW9mIGgmJiJudW1iZXIiIT10eXBlb2YgaDtpZihiJiZoJiZ4JiZ5LmluZGV4T2Yodik8MCYmKCJzdHJpbmciIT10eXBlb2YgbXx8IltvYmplY3QgQXJyYXldIiE9PXYpKXtpZighZS5yZXR1cm5PYmplY3RzJiYhdGhpcy5vcHRpb25zLnJldHVybk9iamVjdHMpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImFjY2Vzc2luZyBhbiBvYmplY3QgLSBidXQgcmV0dXJuT2JqZWN0cyBvcHRpb25zIGlzIG5vdCBlbmFibGVkISIpLHRoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXI/dGhpcy5vcHRpb25zLnJldHVybmVkT2JqZWN0SGFuZGxlcihkLGgsZSk6ImtleSAnIi5jb25jYXQoYSwiICgiKS5jb25jYXQodGhpcy5sYW5ndWFnZSwiKScgcmV0dXJuZWQgYW4gb2JqZWN0IGluc3RlYWQgb2Ygc3RyaW5nLiIpO2lmKG8pe3ZhciB3PSJbb2JqZWN0IEFycmF5XSI9PT12LGs9dz9bXTp7fSxTPXc/ZzpkO2Zvcih2YXIgRSBpbiBoKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChoLEUpKXt2YXIgaj0iIi5jb25jYXQoUykuY29uY2F0KG8pLmNvbmNhdChFKTtrW0VdPXRoaXMudHJhbnNsYXRlKGosanQoe30sZSx7am9pbkFycmF5czohMSxuczpzfSkpLGtbRV09PT1qJiYoa1tFXT1oW0VdKX1oPWt9fWVsc2UgaWYoYiYmInN0cmluZyI9PXR5cGVvZiBtJiYiW29iamVjdCBBcnJheV0iPT09dikoaD1oLmpvaW4obSkpJiYoaD10aGlzLmV4dGVuZFRyYW5zbGF0aW9uKGgsdCxlLG4pKTtlbHNle3ZhciBUPSExLE89ITE7aWYoIXRoaXMuaXNWYWxpZExvb2t1cChoKSYmdm9pZCAwIT09ZS5kZWZhdWx0VmFsdWUpe2lmKFQ9ITAsdm9pZCAwIT09ZS5jb3VudCl7dmFyIEE9dGhpcy5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXgoYyxlLmNvdW50KTtoPWVbImRlZmF1bHRWYWx1ZSIuY29uY2F0KEEpXX1ofHwoaD1lLmRlZmF1bHRWYWx1ZSl9dGhpcy5pc1ZhbGlkTG9va3VwKGgpfHwoTz0hMCxoPWEpO3ZhciBDPWUuZGVmYXVsdFZhbHVlJiZlLmRlZmF1bHRWYWx1ZSE9PWgmJnRoaXMub3B0aW9ucy51cGRhdGVNaXNzaW5nO2lmKE98fFR8fEMpe2lmKHRoaXMubG9nZ2VyLmxvZyhDPyJ1cGRhdGVLZXkiOiJtaXNzaW5nS2V5IixjLHUsYSxDP2UuZGVmYXVsdFZhbHVlOmgpLG8pe3ZhciBMPXRoaXMucmVzb2x2ZShhLGp0KHt9LGUse2tleVNlcGFyYXRvcjohMX0pKTtMJiZMLnJlcyYmdGhpcy5sb2dnZXIud2FybigiU2VlbXMgdGhlIGxvYWRlZCB0cmFuc2xhdGlvbnMgd2VyZSBpbiBmbGF0IEpTT04gZm9ybWF0IGluc3RlYWQgb2YgbmVzdGVkLiBFaXRoZXIgc2V0IGtleVNlcGFyYXRvcjogZmFsc2Ugb24gaW5pdCBvciBtYWtlIHN1cmUgeW91ciB0cmFuc2xhdGlvbnMgYXJlIHB1Ymxpc2hlZCBpbiBuZXN0ZWQgZm9ybWF0LiIpfXZhciBSPVtdLFA9dGhpcy5sYW5ndWFnZVV0aWxzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nLGUubG5nfHx0aGlzLmxhbmd1YWdlKTtpZigiZmFsbGJhY2siPT09dGhpcy5vcHRpb25zLnNhdmVNaXNzaW5nVG8mJlAmJlBbMF0pZm9yKHZhciBOPTA7TjxQLmxlbmd0aDtOKyspUi5wdXNoKFBbTl0pO2Vsc2UiYWxsIj09PXRoaXMub3B0aW9ucy5zYXZlTWlzc2luZ1RvP1I9dGhpcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShlLmxuZ3x8dGhpcy5sYW5ndWFnZSk6Ui5wdXNoKGUubG5nfHx0aGlzLmxhbmd1YWdlKTt2YXIgST1mdW5jdGlvbih0LG4pe3Iub3B0aW9ucy5taXNzaW5nS2V5SGFuZGxlcj9yLm9wdGlvbnMubWlzc2luZ0tleUhhbmRsZXIodCx1LG4sQz9lLmRlZmF1bHRWYWx1ZTpoLEMsZSk6ci5iYWNrZW5kQ29ubmVjdG9yJiZyLmJhY2tlbmRDb25uZWN0b3Iuc2F2ZU1pc3NpbmcmJnIuYmFja2VuZENvbm5lY3Rvci5zYXZlTWlzc2luZyh0LHUsbixDP2UuZGVmYXVsdFZhbHVlOmgsQyxlKSxyLmVtaXQoIm1pc3NpbmdLZXkiLHQsdSxuLGgpfTtpZih0aGlzLm9wdGlvbnMuc2F2ZU1pc3Npbmcpe3ZhciBfPXZvaWQgMCE9PWUuY291bnQmJiJzdHJpbmciIT10eXBlb2YgZS5jb3VudDt0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdQbHVyYWxzJiZfP1IuZm9yRWFjaChmdW5jdGlvbih0KXtyLnBsdXJhbFJlc29sdmVyLmdldFBsdXJhbEZvcm1zT2ZLZXkodCxhKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBJKFt0XSxlKX0pfSk6SShSLGEpfX1oPXRoaXMuZXh0ZW5kVHJhbnNsYXRpb24oaCx0LGUscCxuKSxPJiZoPT09YSYmdGhpcy5vcHRpb25zLmFwcGVuZE5hbWVzcGFjZVRvTWlzc2luZ0tleSYmKGg9IiIuY29uY2F0KHUsIjoiKS5jb25jYXQoYSkpLE8mJnRoaXMub3B0aW9ucy5wYXJzZU1pc3NpbmdLZXlIYW5kbGVyJiYoaD10aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlcihoKSl9cmV0dXJuIGh9fSx7a2V5OiJleHRlbmRUcmFuc2xhdGlvbiIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaT10aGlzO2lmKHRoaXMuaTE4bkZvcm1hdCYmdGhpcy5pMThuRm9ybWF0LnBhcnNlKXQ9dGhpcy5pMThuRm9ybWF0LnBhcnNlKHQsbixyLnVzZWRMbmcsci51c2VkTlMsci51c2VkS2V5LHtyZXNvbHZlZDpyfSk7ZWxzZSBpZighbi5za2lwSW50ZXJwb2xhdGlvbil7bi5pbnRlcnBvbGF0aW9uJiZ0aGlzLmludGVycG9sYXRvci5pbml0KGp0KHt9LG4se2ludGVycG9sYXRpb246anQoe30sdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24sbi5pbnRlcnBvbGF0aW9uKX0pKTt2YXIgYSxzPW4uaW50ZXJwb2xhdGlvbiYmbi5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlc3x8dGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzO2lmKHMpe3ZhciB1PXQubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7YT11JiZ1Lmxlbmd0aH12YXIgYz1uLnJlcGxhY2UmJiJzdHJpbmciIT10eXBlb2Ygbi5yZXBsYWNlP24ucmVwbGFjZTpuO2lmKHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMmJihjPWp0KHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMsYykpLHQ9dGhpcy5pbnRlcnBvbGF0b3IuaW50ZXJwb2xhdGUodCxjLG4ubG5nfHx0aGlzLmxhbmd1YWdlLG4pLHMpe3ZhciBsPXQubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7YTwobCYmbC5sZW5ndGgpJiYobi5uZXN0PSExKX0hMSE9PW4ubmVzdCYmKHQ9dGhpcy5pbnRlcnBvbGF0b3IubmVzdCh0LGZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkodCksYT0wO2E8dDthKyspclthXT1hcmd1bWVudHNbYV07cmV0dXJuIG8mJm9bMF09PT1yWzBdJiYhbi5jb250ZXh0PyhpLmxvZ2dlci53YXJuKCJJdCBzZWVtcyB5b3UgYXJlIG5lc3RpbmcgcmVjdXJzaXZlbHkga2V5OiAiLmNvbmNhdChyWzBdLCIgaW4ga2V5OiAiKS5jb25jYXQoZVswXSkpLG51bGwpOmkudHJhbnNsYXRlLmFwcGx5KGksci5jb25jYXQoW2VdKSl9LG4pKSxuLmludGVycG9sYXRpb24mJnRoaXMuaW50ZXJwb2xhdG9yLnJlc2V0KCl9dmFyIGY9bi5wb3N0UHJvY2Vzc3x8dGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzLHA9InN0cmluZyI9PXR5cGVvZiBmP1tmXTpmO3JldHVybiBudWxsIT10JiZwJiZwLmxlbmd0aCYmITEhPT1uLmFwcGx5UG9zdFByb2Nlc3NvciYmKHQ9S3QuaGFuZGxlKHAsdCxlLHRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzUGFzc1Jlc29sdmVkP2p0KHtpMThuUmVzb2x2ZWQ6cn0sbik6bix0aGlzKSksdH19LHtrZXk6InJlc29sdmUiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYT10aGlzLHM9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmKHQ9W3RdKSx0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoIWEuaXNWYWxpZExvb2t1cChlKSl7dmFyIHU9YS5leHRyYWN0RnJvbUtleSh0LHMpLGM9dS5rZXk7bj1jO3ZhciBsPXUubmFtZXNwYWNlczthLm9wdGlvbnMuZmFsbGJhY2tOUyYmKGw9bC5jb25jYXQoYS5vcHRpb25zLmZhbGxiYWNrTlMpKTt2YXIgZj12b2lkIDAhPT1zLmNvdW50JiYic3RyaW5nIiE9dHlwZW9mIHMuY291bnQscD12b2lkIDAhPT1zLmNvbnRleHQmJiJzdHJpbmciPT10eXBlb2Ygcy5jb250ZXh0JiYiIiE9PXMuY29udGV4dCxoPXMubG5ncz9zLmxuZ3M6YS5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShzLmxuZ3x8YS5sYW5ndWFnZSxzLmZhbGxiYWNrTG5nKTtsLmZvckVhY2goZnVuY3Rpb24odCl7YS5pc1ZhbGlkTG9va3VwKGUpfHwoaT10LCFYdFsiIi5jb25jYXQoaFswXSwiLSIpLmNvbmNhdCh0KV0mJmEudXRpbHMmJmEudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlJiYhYS51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UoaSkmJihYdFsiIi5jb25jYXQoaFswXSwiLSIpLmNvbmNhdCh0KV09ITAsYS5sb2dnZXIud2Fybigna2V5ICInLmNvbmNhdChuLCciIGZvciBsYW5ndWFnZXMgIicpLmNvbmNhdChoLmpvaW4oIiwgIiksJyIgd29uXCd0IGdldCByZXNvbHZlZCBhcyBuYW1lc3BhY2UgIicpLmNvbmNhdChpLCciIHdhcyBub3QgeWV0IGxvYWRlZCcpLCJUaGlzIG1lYW5zIHNvbWV0aGluZyBJUyBXUk9ORyBpbiB5b3VyIHNldHVwLiBZb3UgYWNjZXNzIHRoZSB0IGZ1bmN0aW9uIGJlZm9yZSBpMThuZXh0LmluaXQgLyBpMThuZXh0LmxvYWROYW1lc3BhY2UgLyBpMThuZXh0LmNoYW5nZUxhbmd1YWdlIHdhcyBkb25lLiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgb3IgUHJvbWlzZSB0byByZXNvbHZlIGJlZm9yZSBhY2Nlc3NpbmcgaXQhISEiKSksaC5mb3JFYWNoKGZ1bmN0aW9uKG4pe2lmKCFhLmlzVmFsaWRMb29rdXAoZSkpe289bjt2YXIgaSx1LGw9YyxoPVtsXTtpZihhLmkxOG5Gb3JtYXQmJmEuaTE4bkZvcm1hdC5hZGRMb29rdXBLZXlzKWEuaTE4bkZvcm1hdC5hZGRMb29rdXBLZXlzKGgsYyxuLHQscyk7ZWxzZSBmJiYoaT1hLnBsdXJhbFJlc29sdmVyLmdldFN1ZmZpeChuLHMuY291bnQpKSxmJiZwJiZoLnB1c2gobCtpKSxwJiZoLnB1c2gobCs9IiIuY29uY2F0KGEub3B0aW9ucy5jb250ZXh0U2VwYXJhdG9yKS5jb25jYXQocy5jb250ZXh0KSksZiYmaC5wdXNoKGwrPWkpO2Zvcig7dT1oLnBvcCgpOylhLmlzVmFsaWRMb29rdXAoZSl8fChyPXUsZT1hLmdldFJlc291cmNlKG4sdCx1LHMpKX19KSl9KX19KSx7cmVzOmUsdXNlZEtleTpuLGV4YWN0VXNlZEtleTpyLHVzZWRMbmc6byx1c2VkTlM6aX19fSx7a2V5OiJpc1ZhbGlkTG9va3VwIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4hKHZvaWQgMD09PXR8fCF0aGlzLm9wdGlvbnMucmV0dXJuTnVsbCYmbnVsbD09PXR8fCF0aGlzLm9wdGlvbnMucmV0dXJuRW1wdHlTdHJpbmcmJiIiPT09dCl9fSx7a2V5OiJnZXRSZXNvdXJjZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fTtyZXR1cm4gdGhpcy5pMThuRm9ybWF0JiZ0aGlzLmkxOG5Gb3JtYXQuZ2V0UmVzb3VyY2U/dGhpcy5pMThuRm9ybWF0LmdldFJlc291cmNlKHQsZSxuLHIpOnRoaXMucmVzb3VyY2VTdG9yZS5nZXRSZXNvdXJjZSh0LGUsbixyKX19XSksZX0oKTtmdW5jdGlvbiBRdCh0KXtyZXR1cm4gdC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpfXZhciBadD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7VHQodGhpcyx0KSx0aGlzLm9wdGlvbnM9ZSx0aGlzLndoaXRlbGlzdD10aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5nc3x8ITEsdGhpcy5zdXBwb3J0ZWRMbmdzPXRoaXMub3B0aW9ucy5zdXBwb3J0ZWRMbmdzfHwhMSx0aGlzLmxvZ2dlcj1fdC5jcmVhdGUoImxhbmd1YWdlVXRpbHMiKX1yZXR1cm4gQXQodCxbe2tleToiZ2V0U2NyaXB0UGFydEZyb21Db2RlIix2YWx1ZTpmdW5jdGlvbih0KXtpZighdHx8dC5pbmRleE9mKCItIik8MClyZXR1cm4gbnVsbDt2YXIgZT10LnNwbGl0KCItIik7cmV0dXJuIDI9PT1lLmxlbmd0aD9udWxsOihlLnBvcCgpLCJ4Ij09PWVbZS5sZW5ndGgtMV0udG9Mb3dlckNhc2UoKT9udWxsOnRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKGUuam9pbigiLSIpKSl9fSx7a2V5OiJnZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXR8fHQuaW5kZXhPZigiLSIpPDApcmV0dXJuIHQ7dmFyIGU9dC5zcGxpdCgiLSIpO3JldHVybiB0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlWzBdKX19LHtrZXk6ImZvcm1hdExhbmd1YWdlQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0JiZ0LmluZGV4T2YoIi0iKT4tMSl7dmFyIGU9WyJoYW5zIiwiaGFudCIsImxhdG4iLCJjeXJsIiwiY2FucyIsIm1vbmciLCJhcmFiIl0sbj10LnNwbGl0KCItIik7cmV0dXJuIHRoaXMub3B0aW9ucy5sb3dlckNhc2VMbmc/bj1uLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC50b0xvd2VyQ2FzZSgpfSk6Mj09PW4ubGVuZ3RoPyhuWzBdPW5bMF0udG9Mb3dlckNhc2UoKSxuWzFdPW5bMV0udG9VcHBlckNhc2UoKSxlLmluZGV4T2YoblsxXS50b0xvd2VyQ2FzZSgpKT4tMSYmKG5bMV09UXQoblsxXS50b0xvd2VyQ2FzZSgpKSkpOjM9PT1uLmxlbmd0aCYmKG5bMF09blswXS50b0xvd2VyQ2FzZSgpLDI9PT1uWzFdLmxlbmd0aCYmKG5bMV09blsxXS50b1VwcGVyQ2FzZSgpKSwic2duIiE9PW5bMF0mJjI9PT1uWzJdLmxlbmd0aCYmKG5bMl09blsyXS50b1VwcGVyQ2FzZSgpKSxlLmluZGV4T2YoblsxXS50b0xvd2VyQ2FzZSgpKT4tMSYmKG5bMV09UXQoblsxXS50b0xvd2VyQ2FzZSgpKSksZS5pbmRleE9mKG5bMl0udG9Mb3dlckNhc2UoKSk+LTEmJihuWzJdPVF0KG5bMl0udG9Mb3dlckNhc2UoKSkpKSxuLmpvaW4oIi0iKX1yZXR1cm4gdGhpcy5vcHRpb25zLmNsZWFuQ29kZXx8dGhpcy5vcHRpb25zLmxvd2VyQ2FzZUxuZz90LnRvTG93ZXJDYXNlKCk6dH19LHtrZXk6ImlzV2hpdGVsaXN0ZWQiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxvZ2dlci5kZXByZWNhdGUoImxhbmd1YWdlVXRpbHMuaXNXaGl0ZWxpc3RlZCIsJ2Z1bmN0aW9uICJpc1doaXRlbGlzdGVkIiB3aWxsIGJlIHJlbmFtZWQgdG8gImlzU3VwcG9ydGVkQ29kZSIgaW4gdGhlIG5leHQgbWFqb3IgLSBwbGVhc2UgbWFrZSBzdXJlIHRvIHJlbmFtZSBpdFwncyB1c2FnZSBhc2FwLicpLHRoaXMuaXNTdXBwb3J0ZWRDb2RlKHQpfX0se2tleToiaXNTdXBwb3J0ZWRDb2RlIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4oImxhbmd1YWdlT25seSI9PT10aGlzLm9wdGlvbnMubG9hZHx8dGhpcy5vcHRpb25zLm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncykmJih0PXRoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUodCkpLCF0aGlzLnN1cHBvcnRlZExuZ3N8fCF0aGlzLnN1cHBvcnRlZExuZ3MubGVuZ3RofHx0aGlzLnN1cHBvcnRlZExuZ3MuaW5kZXhPZih0KT4tMX19LHtrZXk6ImdldEJlc3RNYXRjaEZyb21Db2RlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzO3JldHVybiB0Pyh0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoIWUpe3ZhciByPW4uZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpO24ub3B0aW9ucy5zdXBwb3J0ZWRMbmdzJiYhbi5pc1N1cHBvcnRlZENvZGUocil8fChlPXIpfX0pLCFlJiZ0aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5ncyYmdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKCFlKXt2YXIgcj1uLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpO2lmKG4uaXNTdXBwb3J0ZWRDb2RlKHIpKXJldHVybiBlPXI7ZT1uLm9wdGlvbnMuc3VwcG9ydGVkTG5ncy5maW5kKGZ1bmN0aW9uKHQpe2lmKDA9PT10LmluZGV4T2YocikpcmV0dXJuIHR9KX19KSxlfHwoZT10aGlzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nKVswXSksZSk6bnVsbH19LHtrZXk6ImdldEZhbGxiYWNrQ29kZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYoIXQpcmV0dXJuW107aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PXQoZSkpLCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9W3RdKSwiW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseSh0KSlyZXR1cm4gdDtpZighZSlyZXR1cm4gdC5kZWZhdWx0fHxbXTt2YXIgbj10W2VdO3JldHVybiBufHwobj10W3RoaXMuZ2V0U2NyaXB0UGFydEZyb21Db2RlKGUpXSksbnx8KG49dFt0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlKV0pLG58fChuPXRbdGhpcy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZShlKV0pLG58fChuPXQuZGVmYXVsdCksbnx8W119fSx7a2V5OiJ0b1Jlc29sdmVIaWVyYXJjaHkiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPXRoaXMuZ2V0RmFsbGJhY2tDb2RlcyhlfHx0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmd8fFtdLHQpLG89W10saT1mdW5jdGlvbih0KXt0JiYobi5pc1N1cHBvcnRlZENvZGUodCk/by5wdXNoKHQpOm4ubG9nZ2VyLndhcm4oInJlamVjdGluZyBsYW5ndWFnZSBjb2RlIG5vdCBmb3VuZCBpbiBzdXBwb3J0ZWRMbmdzOiAiLmNvbmNhdCh0KSkpfTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJnQuaW5kZXhPZigiLSIpPi0xPygibGFuZ3VhZ2VPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiZpKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKSwibGFuZ3VhZ2VPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiYiY3VycmVudE9ubHkiIT09dGhpcy5vcHRpb25zLmxvYWQmJmkodGhpcy5nZXRTY3JpcHRQYXJ0RnJvbUNvZGUodCkpLCJjdXJyZW50T25seSIhPT10aGlzLm9wdGlvbnMubG9hZCYmaSh0aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpKSk6InN0cmluZyI9PXR5cGVvZiB0JiZpKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKSxyLmZvckVhY2goZnVuY3Rpb24odCl7by5pbmRleE9mKHQpPDAmJmkobi5mb3JtYXRMYW5ndWFnZUNvZGUodCkpfSksb319XSksdH0oKSx0ZT1be2xuZ3M6WyJhY2giLCJhayIsImFtIiwiYXJuIiwiYnIiLCJmaWwiLCJndW4iLCJsbiIsIm1mZSIsIm1nIiwibWkiLCJvYyIsInB0IiwicHQtQlIiLCJ0ZyIsInRpIiwidHIiLCJ1eiIsIndhIl0sbnI6WzEsMl0sZmM6MX0se2xuZ3M6WyJhZiIsImFuIiwiYXN0IiwiYXoiLCJiZyIsImJuIiwiY2EiLCJkYSIsImRlIiwiZGV2IiwiZWwiLCJlbiIsImVvIiwiZXMiLCJldCIsImV1IiwiZmkiLCJmbyIsImZ1ciIsImZ5IiwiZ2wiLCJndSIsImhhIiwiaGkiLCJodSIsImh5IiwiaWEiLCJpdCIsImtuIiwia3UiLCJsYiIsIm1haSIsIm1sIiwibW4iLCJtciIsIm5haCIsIm5hcCIsIm5iIiwibmUiLCJubCIsIm5uIiwibm8iLCJuc28iLCJwYSIsInBhcCIsInBtcyIsInBzIiwicHQtUFQiLCJybSIsInNjbyIsInNlIiwic2kiLCJzbyIsInNvbiIsInNxIiwic3YiLCJzdyIsInRhIiwidGUiLCJ0ayIsInVyIiwieW8iXSxucjpbMSwyXSxmYzoyfSx7bG5nczpbImF5IiwiYm8iLCJjZ2ciLCJmYSIsImh0IiwiaWQiLCJqYSIsImpibyIsImthIiwia2siLCJrbSIsImtvIiwia3kiLCJsbyIsIm1zIiwic2FoIiwic3UiLCJ0aCIsInR0IiwidWciLCJ2aSIsIndvIiwiemgiXSxucjpbMV0sZmM6M30se2xuZ3M6WyJiZSIsImJzIiwiY25yIiwiZHoiLCJociIsInJ1Iiwic3IiLCJ1ayJdLG5yOlsxLDIsNV0sZmM6NH0se2xuZ3M6WyJhciJdLG5yOlswLDEsMiwzLDExLDEwMF0sZmM6NX0se2xuZ3M6WyJjcyIsInNrIl0sbnI6WzEsMiw1XSxmYzo2fSx7bG5nczpbImNzYiIsInBsIl0sbnI6WzEsMiw1XSxmYzo3fSx7bG5nczpbImN5Il0sbnI6WzEsMiwzLDhdLGZjOjh9LHtsbmdzOlsiZnIiXSxucjpbMSwyXSxmYzo5fSx7bG5nczpbImdhIl0sbnI6WzEsMiwzLDcsMTFdLGZjOjEwfSx7bG5nczpbImdkIl0sbnI6WzEsMiwzLDIwXSxmYzoxMX0se2xuZ3M6WyJpcyJdLG5yOlsxLDJdLGZjOjEyfSx7bG5nczpbImp2Il0sbnI6WzAsMV0sZmM6MTN9LHtsbmdzOlsia3ciXSxucjpbMSwyLDMsNF0sZmM6MTR9LHtsbmdzOlsibHQiXSxucjpbMSwyLDEwXSxmYzoxNX0se2xuZ3M6WyJsdiJdLG5yOlsxLDIsMF0sZmM6MTZ9LHtsbmdzOlsibWsiXSxucjpbMSwyXSxmYzoxN30se2xuZ3M6WyJtbmsiXSxucjpbMCwxLDJdLGZjOjE4fSx7bG5nczpbIm10Il0sbnI6WzEsMiwxMSwyMF0sZmM6MTl9LHtsbmdzOlsib3IiXSxucjpbMiwxXSxmYzoyfSx7bG5nczpbInJvIl0sbnI6WzEsMiwyMF0sZmM6MjB9LHtsbmdzOlsic2wiXSxucjpbNSwxLDIsM10sZmM6MjF9LHtsbmdzOlsiaGUiLCJpdyJdLG5yOlsxLDIsMjAsMjFdLGZjOjIyfV0sZWU9ezE6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0PjEpfSwyOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMSE9dCl9LDM6ZnVuY3Rpb24odCl7cmV0dXJuIDB9LDQ6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwPT0xJiZ0JTEwMCE9MTE/MDp0JTEwPj0yJiZ0JTEwPD00JiYodCUxMDA8MTB8fHQlMTAwPj0yMCk/MToyKX0sNTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDA9PXQ/MDoxPT10PzE6Mj09dD8yOnQlMTAwPj0zJiZ0JTEwMDw9MTA/Mzp0JTEwMD49MTE/NDo1KX0sNjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDp0Pj0yJiZ0PD00PzE6Mil9LDc6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6dCUxMD49MiYmdCUxMDw9NCYmKHQlMTAwPDEwfHx0JTEwMD49MjApPzE6Mil9LDg6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6Mj09dD8xOjghPXQmJjExIT10PzI6Myl9LDk6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0Pj0yKX0sMTA6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6Mj09dD8xOnQ8Nz8yOnQ8MTE/Mzo0KX0sMTE6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10fHwxMT09dD8wOjI9PXR8fDEyPT10PzE6dD4yJiZ0PDIwPzI6Myl9LDEyOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMCE9MXx8dCUxMDA9PTExKX0sMTM6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigwIT09dCl9LDE0OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOjI9PXQ/MTozPT10PzI6Myl9LDE1OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMD09MSYmdCUxMDAhPTExPzA6dCUxMD49MiYmKHQlMTAwPDEwfHx0JTEwMD49MjApPzE6Mil9LDE2OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMD09MSYmdCUxMDAhPTExPzA6MCE9PXQ/MToyKX0sMTc6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10fHx0JTEwPT0xJiZ0JTEwMCE9MTE/MDoxKX0sMTg6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigwPT10PzA6MT09dD8xOjIpfSwxOTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDowPT10fHx0JTEwMD4xJiZ0JTEwMDwxMT8xOnQlMTAwPjEwJiZ0JTEwMDwyMD8yOjMpfSwyMDpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDowPT10fHx0JTEwMD4wJiZ0JTEwMDwyMD8xOjIpfSwyMTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTAwPT0xPzE6dCUxMDA9PTI/Mjp0JTEwMD09M3x8dCUxMDA9PTQ/MzowKX0sMjI6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6Mj09dD8xOih0PDB8fHQ+MTApJiZ0JTEwPT0wPzI6Myl9fTt2YXIgbmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ZhciBuLHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O1R0KHRoaXMsdCksdGhpcy5sYW5ndWFnZVV0aWxzPWUsdGhpcy5vcHRpb25zPXIsdGhpcy5sb2dnZXI9X3QuY3JlYXRlKCJwbHVyYWxSZXNvbHZlciIpLHRoaXMucnVsZXM9KG49e30sdGUuZm9yRWFjaChmdW5jdGlvbih0KXt0LmxuZ3MuZm9yRWFjaChmdW5jdGlvbihlKXtuW2VdPXtudW1iZXJzOnQubnIscGx1cmFsczplZVt0LmZjXX19KX0pLG4pfXJldHVybiBBdCh0LFt7a2V5OiJhZGRSdWxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMucnVsZXNbdF09ZX19LHtrZXk6ImdldFJ1bGUiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJ1bGVzW3RdfHx0aGlzLnJ1bGVzW3RoaXMubGFuZ3VhZ2VVdGlscy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSh0KV19fSx7a2V5OiJuZWVkc1BsdXJhbCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRSdWxlKHQpO3JldHVybiBlJiZlLm51bWJlcnMubGVuZ3RoPjF9fSx7a2V5OiJnZXRQbHVyYWxGb3Jtc09mS2V5Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj1bXSxvPXRoaXMuZ2V0UnVsZSh0KTtyZXR1cm4gbz8oby5udW1iZXJzLmZvckVhY2goZnVuY3Rpb24obyl7dmFyIGk9bi5nZXRTdWZmaXgodCxvKTtyLnB1c2goIiIuY29uY2F0KGUpLmNvbmNhdChpKSl9KSxyKTpyfX0se2tleToiZ2V0U3VmZml4Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj10aGlzLmdldFJ1bGUodCk7aWYocil7dmFyIG89ci5ub0Ficz9yLnBsdXJhbHMoZSk6ci5wbHVyYWxzKE1hdGguYWJzKGUpKSxpPXIubnVtYmVyc1tvXTt0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXgmJjI9PT1yLm51bWJlcnMubGVuZ3RoJiYxPT09ci5udW1iZXJzWzBdJiYoMj09PWk/aT0icGx1cmFsIjoxPT09aSYmKGk9IiIpKTt2YXIgYT1mdW5jdGlvbigpe3JldHVybiBuLm9wdGlvbnMucHJlcGVuZCYmaS50b1N0cmluZygpP24ub3B0aW9ucy5wcmVwZW5kK2kudG9TdHJpbmcoKTppLnRvU3RyaW5nKCl9O3JldHVybiJ2MSI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04/MT09PWk/IiI6Im51bWJlciI9PXR5cGVvZiBpPyJfcGx1cmFsXyIuY29uY2F0KGkudG9TdHJpbmcoKSk6YSgpOiJ2MiI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04/YSgpOnRoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeCYmMj09PXIubnVtYmVycy5sZW5ndGgmJjE9PT1yLm51bWJlcnNbMF0/YSgpOnRoaXMub3B0aW9ucy5wcmVwZW5kJiZvLnRvU3RyaW5nKCk/dGhpcy5vcHRpb25zLnByZXBlbmQrby50b1N0cmluZygpOm8udG9TdHJpbmcoKX1yZXR1cm4gdGhpcy5sb2dnZXIud2Fybigibm8gcGx1cmFsIHJ1bGUgZm91bmQgZm9yOiAiLmNvbmNhdCh0KSksIiJ9fV0pLHR9KCkscmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O1R0KHRoaXMsdCksdGhpcy5sb2dnZXI9X3QuY3JlYXRlKCJpbnRlcnBvbGF0b3IiKSx0aGlzLm9wdGlvbnM9ZSx0aGlzLmZvcm1hdD1lLmludGVycG9sYXRpb24mJmUuaW50ZXJwb2xhdGlvbi5mb3JtYXR8fGZ1bmN0aW9uKHQpe3JldHVybiB0fSx0aGlzLmluaXQoZSl9cmV0dXJuIEF0KHQsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O3QuaW50ZXJwb2xhdGlvbnx8KHQuaW50ZXJwb2xhdGlvbj17ZXNjYXBlVmFsdWU6ITB9KTt2YXIgZT10LmludGVycG9sYXRpb247dGhpcy5lc2NhcGU9dm9pZCAwIT09ZS5lc2NhcGU/ZS5lc2NhcGU6WXQsdGhpcy5lc2NhcGVWYWx1ZT12b2lkIDA9PT1lLmVzY2FwZVZhbHVlfHxlLmVzY2FwZVZhbHVlLHRoaXMudXNlUmF3VmFsdWVUb0VzY2FwZT12b2lkIDAhPT1lLnVzZVJhd1ZhbHVlVG9Fc2NhcGUmJmUudXNlUmF3VmFsdWVUb0VzY2FwZSx0aGlzLnByZWZpeD1lLnByZWZpeD9XdChlLnByZWZpeCk6ZS5wcmVmaXhFc2NhcGVkfHwie3siLHRoaXMuc3VmZml4PWUuc3VmZml4P1d0KGUuc3VmZml4KTplLnN1ZmZpeEVzY2FwZWR8fCJ9fSIsdGhpcy5mb3JtYXRTZXBhcmF0b3I9ZS5mb3JtYXRTZXBhcmF0b3I/ZS5mb3JtYXRTZXBhcmF0b3I6ZS5mb3JtYXRTZXBhcmF0b3J8fCIsIix0aGlzLnVuZXNjYXBlUHJlZml4PWUudW5lc2NhcGVTdWZmaXg/IiI6ZS51bmVzY2FwZVByZWZpeHx8Ii0iLHRoaXMudW5lc2NhcGVTdWZmaXg9dGhpcy51bmVzY2FwZVByZWZpeD8iIjplLnVuZXNjYXBlU3VmZml4fHwiIix0aGlzLm5lc3RpbmdQcmVmaXg9ZS5uZXN0aW5nUHJlZml4P1d0KGUubmVzdGluZ1ByZWZpeCk6ZS5uZXN0aW5nUHJlZml4RXNjYXBlZHx8V3QoIiR0KCIpLHRoaXMubmVzdGluZ1N1ZmZpeD1lLm5lc3RpbmdTdWZmaXg/V3QoZS5uZXN0aW5nU3VmZml4KTplLm5lc3RpbmdTdWZmaXhFc2NhcGVkfHxXdCgiKSIpLHRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I9ZS5uZXN0aW5nT3B0aW9uc1NlcGFyYXRvcj9lLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yOmUubmVzdGluZ09wdGlvbnNTZXBhcmF0b3J8fCIsIix0aGlzLm1heFJlcGxhY2VzPWUubWF4UmVwbGFjZXM/ZS5tYXhSZXBsYWNlczoxZTMsdGhpcy5hbHdheXNGb3JtYXQ9dm9pZCAwIT09ZS5hbHdheXNGb3JtYXQmJmUuYWx3YXlzRm9ybWF0LHRoaXMucmVzZXRSZWdFeHAoKX19LHtrZXk6InJlc2V0Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucyYmdGhpcy5pbml0KHRoaXMub3B0aW9ucyl9fSx7a2V5OiJyZXNldFJlZ0V4cCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0iIi5jb25jYXQodGhpcy5wcmVmaXgsIiguKz8pIikuY29uY2F0KHRoaXMuc3VmZml4KTt0aGlzLnJlZ2V4cD1uZXcgUmVnRXhwKHQsImciKTt2YXIgZT0iIi5jb25jYXQodGhpcy5wcmVmaXgpLmNvbmNhdCh0aGlzLnVuZXNjYXBlUHJlZml4LCIoLis/KSIpLmNvbmNhdCh0aGlzLnVuZXNjYXBlU3VmZml4KS5jb25jYXQodGhpcy5zdWZmaXgpO3RoaXMucmVnZXhwVW5lc2NhcGU9bmV3IFJlZ0V4cChlLCJnIik7dmFyIG49IiIuY29uY2F0KHRoaXMubmVzdGluZ1ByZWZpeCwiKC4rPykiKS5jb25jYXQodGhpcy5uZXN0aW5nU3VmZml4KTt0aGlzLm5lc3RpbmdSZWdleHA9bmV3IFJlZ0V4cChuLCJnIil9fSx7a2V5OiJpbnRlcnBvbGF0ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scil7dmFyIG8saSxhLHM9dGhpcyx1PXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24mJnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXN8fHt9O2Z1bmN0aW9uIGModCl7cmV0dXJuIHQucmVwbGFjZSgvXCQvZywiJCQkJCIpfXZhciBsPWZ1bmN0aW9uKHQpe2lmKHQuaW5kZXhPZihzLmZvcm1hdFNlcGFyYXRvcik8MCl7dmFyIG89SHQoZSx1LHQpO3JldHVybiBzLmFsd2F5c0Zvcm1hdD9zLmZvcm1hdChvLHZvaWQgMCxuKTpvfXZhciBpPXQuc3BsaXQocy5mb3JtYXRTZXBhcmF0b3IpLGE9aS5zaGlmdCgpLnRyaW0oKSxjPWkuam9pbihzLmZvcm1hdFNlcGFyYXRvcikudHJpbSgpO3JldHVybiBzLmZvcm1hdChIdChlLHUsYSksYyxuLHIpfTt0aGlzLnJlc2V0UmVnRXhwKCk7dmFyIGY9ciYmci5taXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXJ8fHRoaXMub3B0aW9ucy5taXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXIscD1yJiZyLmludGVycG9sYXRpb24mJnIuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXN8fHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcztyZXR1cm5be3JlZ2V4OnRoaXMucmVnZXhwVW5lc2NhcGUsc2FmZVZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBjKHQpfX0se3JlZ2V4OnRoaXMucmVnZXhwLHNhZmVWYWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gcy5lc2NhcGVWYWx1ZT9jKHMuZXNjYXBlKHQpKTpjKHQpfX1dLmZvckVhY2goZnVuY3Rpb24oZSl7Zm9yKGE9MDtvPWUucmVnZXguZXhlYyh0KTspe2lmKHZvaWQgMD09PShpPWwob1sxXS50cmltKCkpKSlpZigiZnVuY3Rpb24iPT10eXBlb2YgZil7dmFyIG49Zih0LG8scik7aT0ic3RyaW5nIj09dHlwZW9mIG4/bjoiIn1lbHNle2lmKHApe2k9b1swXTtjb250aW51ZX1zLmxvZ2dlci53YXJuKCJtaXNzZWQgdG8gcGFzcyBpbiB2YXJpYWJsZSAiLmNvbmNhdChvWzFdLCIgZm9yIGludGVycG9sYXRpbmcgIikuY29uY2F0KHQpKSxpPSIifWVsc2Uic3RyaW5nIj09dHlwZW9mIGl8fHMudXNlUmF3VmFsdWVUb0VzY2FwZXx8KGk9VXQoaSkpO2lmKHQ9dC5yZXBsYWNlKG9bMF0sZS5zYWZlVmFsdWUoaSkpLGUucmVnZXgubGFzdEluZGV4PTAsKythPj1zLm1heFJlcGxhY2VzKWJyZWFrfX0pLHR9fSx7a2V5OiJuZXN0Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuLHIsbz10aGlzLGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LGE9anQoe30saSk7ZnVuY3Rpb24gcyh0LGUpe3ZhciBuPXRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I7aWYodC5pbmRleE9mKG4pPDApcmV0dXJuIHQ7dmFyIHI9dC5zcGxpdChuZXcgUmVnRXhwKCIiLmNvbmNhdChuLCJbIF0qeyIpKSksbz0ieyIuY29uY2F0KHJbMV0pO3Q9clswXSxvPShvPXRoaXMuaW50ZXJwb2xhdGUobyxhKSkucmVwbGFjZSgvJy9nLCciJyk7dHJ5e2E9SlNPTi5wYXJzZShvKSxlJiYoYT1qdCh7fSxlLGEpKX1jYXRjaChlKXtyZXR1cm4gdGhpcy5sb2dnZXIud2FybigiZmFpbGVkIHBhcnNpbmcgb3B0aW9ucyBzdHJpbmcgaW4gbmVzdGluZyBmb3Iga2V5ICIuY29uY2F0KHQpLGUpLCIiLmNvbmNhdCh0KS5jb25jYXQobikuY29uY2F0KG8pfXJldHVybiBkZWxldGUgYS5kZWZhdWx0VmFsdWUsdH1mb3IoYS5hcHBseVBvc3RQcm9jZXNzb3I9ITEsZGVsZXRlIGEuZGVmYXVsdFZhbHVlO249dGhpcy5uZXN0aW5nUmVnZXhwLmV4ZWModCk7KXt2YXIgdT1bXSxjPSExO2lmKG5bMF0uaW5jbHVkZXModGhpcy5mb3JtYXRTZXBhcmF0b3IpJiYhL3suKn0vLnRlc3QoblsxXSkpe3ZhciBsPW5bMV0uc3BsaXQodGhpcy5mb3JtYXRTZXBhcmF0b3IpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC50cmltKCl9KTtuWzFdPWwuc2hpZnQoKSx1PWwsYz0hMH1pZigocj1lKHMuY2FsbCh0aGlzLG5bMV0udHJpbSgpLGEpLGEpKSYmblswXT09PXQmJiJzdHJpbmciIT10eXBlb2YgcilyZXR1cm4gcjsic3RyaW5nIiE9dHlwZW9mIHImJihyPVV0KHIpKSxyfHwodGhpcy5sb2dnZXIud2FybigibWlzc2VkIHRvIHJlc29sdmUgIi5jb25jYXQoblsxXSwiIGZvciBuZXN0aW5nICIpLmNvbmNhdCh0KSkscj0iIiksYyYmKHI9dS5yZWR1Y2UoZnVuY3Rpb24odCxlKXtyZXR1cm4gby5mb3JtYXQodCxlLGkubG5nLGkpfSxyLnRyaW0oKSkpLHQ9dC5yZXBsYWNlKG5bMF0sciksdGhpcy5yZWdleHAubGFzdEluZGV4PTB9cmV0dXJuIHR9fV0pLHR9KCk7dmFyIG9lPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxuLHIpe3ZhciBvLGk9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOnt9O3JldHVybiBUdCh0aGlzLGUpLG89THQodGhpcyxSdChlKS5jYWxsKHRoaXMpKSxWdCYmRHQuY2FsbChDdChvKSksby5iYWNrZW5kPXQsby5zdG9yZT1uLG8uc2VydmljZXM9cixvLmxhbmd1YWdlVXRpbHM9ci5sYW5ndWFnZVV0aWxzLG8ub3B0aW9ucz1pLG8ubG9nZ2VyPV90LmNyZWF0ZSgiYmFja2VuZENvbm5lY3RvciIpLG8uc3RhdGU9e30sby5xdWV1ZT1bXSxvLmJhY2tlbmQmJm8uYmFja2VuZC5pbml0JiZvLmJhY2tlbmQuaW5pdChyLGkuYmFja2VuZCxpKSxvfXJldHVybiBOdChlLER0KSxBdChlLFt7a2V5OiJxdWV1ZUxvYWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPXRoaXMsaT1bXSxhPVtdLHM9W10sdT1bXTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciByPSEwO2UuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgcz0iIi5jb25jYXQodCwifCIpLmNvbmNhdChlKTshbi5yZWxvYWQmJm8uc3RvcmUuaGFzUmVzb3VyY2VCdW5kbGUodCxlKT9vLnN0YXRlW3NdPTI6by5zdGF0ZVtzXTwwfHwoMT09PW8uc3RhdGVbc10/YS5pbmRleE9mKHMpPDAmJmEucHVzaChzKTooby5zdGF0ZVtzXT0xLHI9ITEsYS5pbmRleE9mKHMpPDAmJmEucHVzaChzKSxpLmluZGV4T2Yocyk8MCYmaS5wdXNoKHMpLHUuaW5kZXhPZihlKTwwJiZ1LnB1c2goZSkpKX0pLHJ8fHMucHVzaCh0KX0pLChpLmxlbmd0aHx8YS5sZW5ndGgpJiZ0aGlzLnF1ZXVlLnB1c2goe3BlbmRpbmc6YSxsb2FkZWQ6e30sZXJyb3JzOltdLGNhbGxiYWNrOnJ9KSx7dG9Mb2FkOmkscGVuZGluZzphLHRvTG9hZExhbmd1YWdlczpzLHRvTG9hZE5hbWVzcGFjZXM6dX19fSx7a2V5OiJsb2FkZWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LnNwbGl0KCJ8Iiksbz1yWzBdLGk9clsxXTtlJiZ0aGlzLmVtaXQoImZhaWxlZExvYWRpbmciLG8saSxlKSxuJiZ0aGlzLnN0b3JlLmFkZFJlc291cmNlQnVuZGxlKG8saSxuKSx0aGlzLnN0YXRlW3RdPWU/LTE6Mjt2YXIgYT17fTt0aGlzLnF1ZXVlLmZvckVhY2goZnVuY3Rpb24obil7IWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPUJ0KHQsZSxPYmplY3QpLGk9by5vYmosYT1vLms7aVthXT1pW2FdfHxbXSxyJiYoaVthXT1pW2FdLmNvbmNhdChuKSkscnx8aVthXS5wdXNoKG4pfShuLmxvYWRlZCxbb10saSksZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5pbmRleE9mKGUpOy0xIT09bjspdC5zcGxpY2UobiwxKSxuPXQuaW5kZXhPZihlKX0obi5wZW5kaW5nLHQpLGUmJm4uZXJyb3JzLnB1c2goZSksMCE9PW4ucGVuZGluZy5sZW5ndGh8fG4uZG9uZXx8KE9iamVjdC5rZXlzKG4ubG9hZGVkKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2FbdF18fChhW3RdPVtdKSxuLmxvYWRlZFt0XS5sZW5ndGgmJm4ubG9hZGVkW3RdLmZvckVhY2goZnVuY3Rpb24oZSl7YVt0XS5pbmRleE9mKGUpPDAmJmFbdF0ucHVzaChlKX0pfSksbi5kb25lPSEwLG4uZXJyb3JzLmxlbmd0aD9uLmNhbGxiYWNrKG4uZXJyb3JzKTpuLmNhbGxiYWNrKCkpfSksdGhpcy5lbWl0KCJsb2FkZWQiLGEpLHRoaXMucXVldWU9dGhpcy5xdWV1ZS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIXQuZG9uZX0pfX0se2tleToicmVhZCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMsbz1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106MCxpPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XTozNTAsYT1hcmd1bWVudHMubGVuZ3RoPjU/YXJndW1lbnRzWzVdOnZvaWQgMDtyZXR1cm4gdC5sZW5ndGg/dGhpcy5iYWNrZW5kW25dKHQsZSxmdW5jdGlvbihzLHUpe3MmJnUmJm88NT9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5yZWFkLmNhbGwocix0LGUsbixvKzEsMippLGEpfSxpKTphKHMsdSl9KTphKG51bGwse30pfX0se2tleToicHJlcGFyZUxvYWRpbmciLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp7fSxvPWFyZ3VtZW50cy5sZW5ndGg+Mz9hcmd1bWVudHNbM106dm9pZCAwO2lmKCF0aGlzLmJhY2tlbmQpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oIk5vIGJhY2tlbmQgd2FzIGFkZGVkIHZpYSBpMThuZXh0LnVzZS4gV2lsbCBub3QgbG9hZCByZXNvdXJjZXMuIiksbyYmbygpOyJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dGhpcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeSh0KSksInN0cmluZyI9PXR5cGVvZiBlJiYoZT1bZV0pO3ZhciBpPXRoaXMucXVldWVMb2FkKHQsZSxyLG8pO2lmKCFpLnRvTG9hZC5sZW5ndGgpcmV0dXJuIGkucGVuZGluZy5sZW5ndGh8fG8oKSxudWxsO2kudG9Mb2FkLmZvckVhY2goZnVuY3Rpb24odCl7bi5sb2FkT25lKHQpfSl9fSx7a2V5OiJsb2FkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dGhpcy5wcmVwYXJlTG9hZGluZyh0LGUse30sbil9fSx7a2V5OiJyZWxvYWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt0aGlzLnByZXBhcmVMb2FkaW5nKHQsZSx7cmVsb2FkOiEwfSxuKX19LHtrZXk6ImxvYWRPbmUiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06IiIscj10LnNwbGl0KCJ8Iiksbz1yWzBdLGk9clsxXTt0aGlzLnJlYWQobyxpLCJyZWFkIix2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKHIsYSl7ciYmZS5sb2dnZXIud2FybigiIi5jb25jYXQobiwibG9hZGluZyBuYW1lc3BhY2UgIikuY29uY2F0KGksIiBmb3IgbGFuZ3VhZ2UgIikuY29uY2F0KG8sIiBmYWlsZWQiKSxyKSwhciYmYSYmZS5sb2dnZXIubG9nKCIiLmNvbmNhdChuLCJsb2FkZWQgbmFtZXNwYWNlICIpLmNvbmNhdChpLCIgZm9yIGxhbmd1YWdlICIpLmNvbmNhdChvKSxhKSxlLmxvYWRlZCh0LHIsYSl9KX19LHtrZXk6InNhdmVNaXNzaW5nIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLG8pe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+NSYmdm9pZCAwIT09YXJndW1lbnRzWzVdP2FyZ3VtZW50c1s1XTp7fTt0aGlzLnNlcnZpY2VzLnV0aWxzJiZ0aGlzLnNlcnZpY2VzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZSYmIXRoaXMuc2VydmljZXMudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlKGUpP3RoaXMubG9nZ2VyLndhcm4oJ2RpZCBub3Qgc2F2ZSBrZXkgIicuY29uY2F0KG4sJyIgYXMgdGhlIG5hbWVzcGFjZSAiJykuY29uY2F0KGUsJyIgd2FzIG5vdCB5ZXQgbG9hZGVkJyksIlRoaXMgbWVhbnMgc29tZXRoaW5nIElTIFdST05HIGluIHlvdXIgc2V0dXAuIFlvdSBhY2Nlc3MgdGhlIHQgZnVuY3Rpb24gYmVmb3JlIGkxOG5leHQuaW5pdCAvIGkxOG5leHQubG9hZE5hbWVzcGFjZSAvIGkxOG5leHQuY2hhbmdlTGFuZ3VhZ2Ugd2FzIGRvbmUuIFdhaXQgZm9yIHRoZSBjYWxsYmFjayBvciBQcm9taXNlIHRvIHJlc29sdmUgYmVmb3JlIGFjY2Vzc2luZyBpdCEhISIpOm51bGwhPW4mJiIiIT09biYmKHRoaXMuYmFja2VuZCYmdGhpcy5iYWNrZW5kLmNyZWF0ZSYmdGhpcy5iYWNrZW5kLmNyZWF0ZSh0LGUsbixyLG51bGwsanQoe30saSx7aXNVcGRhdGU6b30pKSx0JiZ0WzBdJiZ0aGlzLnN0b3JlLmFkZFJlc291cmNlKHRbMF0sZSxuLHIpKX19XSksZX0oKTtmdW5jdGlvbiBpZSgpe3JldHVybntkZWJ1ZzohMSxpbml0SW1tZWRpYXRlOiEwLG5zOlsidHJhbnNsYXRpb24iXSxkZWZhdWx0TlM6WyJ0cmFuc2xhdGlvbiJdLGZhbGxiYWNrTG5nOlsiZGV2Il0sZmFsbGJhY2tOUzohMSx3aGl0ZWxpc3Q6ITEsbm9uRXhwbGljaXRXaGl0ZWxpc3Q6ITEsc3VwcG9ydGVkTG5nczohMSxub25FeHBsaWNpdFN1cHBvcnRlZExuZ3M6ITEsbG9hZDoiYWxsIixwcmVsb2FkOiExLHNpbXBsaWZ5UGx1cmFsU3VmZml4OiEwLGtleVNlcGFyYXRvcjoiLiIsbnNTZXBhcmF0b3I6IjoiLHBsdXJhbFNlcGFyYXRvcjoiXyIsY29udGV4dFNlcGFyYXRvcjoiXyIscGFydGlhbEJ1bmRsZWRMYW5ndWFnZXM6ITEsc2F2ZU1pc3Npbmc6ITEsdXBkYXRlTWlzc2luZzohMSxzYXZlTWlzc2luZ1RvOiJmYWxsYmFjayIsc2F2ZU1pc3NpbmdQbHVyYWxzOiEwLG1pc3NpbmdLZXlIYW5kbGVyOiExLG1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlcjohMSxwb3N0UHJvY2VzczohMSxwb3N0UHJvY2Vzc1Bhc3NSZXNvbHZlZDohMSxyZXR1cm5OdWxsOiEwLHJldHVybkVtcHR5U3RyaW5nOiEwLHJldHVybk9iamVjdHM6ITEsam9pbkFycmF5czohMSxyZXR1cm5lZE9iamVjdEhhbmRsZXI6ITEscGFyc2VNaXNzaW5nS2V5SGFuZGxlcjohMSxhcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXk6ITEsYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU6ITEsb3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIGU9e307aWYoIm9iamVjdCI9PT1TdCh0WzFdKSYmKGU9dFsxXSksInN0cmluZyI9PXR5cGVvZiB0WzFdJiYoZS5kZWZhdWx0VmFsdWU9dFsxXSksInN0cmluZyI9PXR5cGVvZiB0WzJdJiYoZS50RGVzY3JpcHRpb249dFsyXSksIm9iamVjdCI9PT1TdCh0WzJdKXx8Im9iamVjdCI9PT1TdCh0WzNdKSl7dmFyIG49dFszXXx8dFsyXTtPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbdF09blt0XX0pfXJldHVybiBlfSxpbnRlcnBvbGF0aW9uOntlc2NhcGVWYWx1ZTohMCxmb3JtYXQ6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHR9LHByZWZpeDoie3siLHN1ZmZpeDoifX0iLGZvcm1hdFNlcGFyYXRvcjoiLCIsdW5lc2NhcGVQcmVmaXg6Ii0iLG5lc3RpbmdQcmVmaXg6IiR0KCIsbmVzdGluZ1N1ZmZpeDoiKSIsbmVzdGluZ09wdGlvbnNTZXBhcmF0b3I6IiwiLG1heFJlcGxhY2VzOjFlMyxza2lwT25WYXJpYWJsZXM6ITF9fX1mdW5jdGlvbiBhZSh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQubnMmJih0Lm5zPVt0Lm5zXSksInN0cmluZyI9PXR5cGVvZiB0LmZhbGxiYWNrTG5nJiYodC5mYWxsYmFja0xuZz1bdC5mYWxsYmFja0xuZ10pLCJzdHJpbmciPT10eXBlb2YgdC5mYWxsYmFja05TJiYodC5mYWxsYmFja05TPVt0LmZhbGxiYWNrTlNdKSx0LndoaXRlbGlzdCYmKHQud2hpdGVsaXN0JiZ0LndoaXRlbGlzdC5pbmRleE9mKCJjaW1vZGUiKTwwJiYodC53aGl0ZWxpc3Q9dC53aGl0ZWxpc3QuY29uY2F0KFsiY2ltb2RlIl0pKSx0LnN1cHBvcnRlZExuZ3M9dC53aGl0ZWxpc3QpLHQubm9uRXhwbGljaXRXaGl0ZWxpc3QmJih0Lm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncz10Lm5vbkV4cGxpY2l0V2hpdGVsaXN0KSx0LnN1cHBvcnRlZExuZ3MmJnQuc3VwcG9ydGVkTG5ncy5pbmRleE9mKCJjaW1vZGUiKTwwJiYodC5zdXBwb3J0ZWRMbmdzPXQuc3VwcG9ydGVkTG5ncy5jb25jYXQoWyJjaW1vZGUiXSkpLHR9ZnVuY3Rpb24gc2UoKXt9dmFyIHVlPW5ldyhmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIHQsbj1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30scj1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDtpZihUdCh0aGlzLGUpLHQ9THQodGhpcyxSdChlKS5jYWxsKHRoaXMpKSxWdCYmRHQuY2FsbChDdCh0KSksdC5vcHRpb25zPWFlKG4pLHQuc2VydmljZXM9e30sdC5sb2dnZXI9X3QsdC5tb2R1bGVzPXtleHRlcm5hbDpbXX0sciYmIXQuaXNJbml0aWFsaXplZCYmIW4uaXNDbG9uZSl7aWYoIXQub3B0aW9ucy5pbml0SW1tZWRpYXRlKXJldHVybiB0LmluaXQobixyKSxMdCh0LEN0KHQpKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5pbml0KG4scil9LDApfXJldHVybiB0fXJldHVybiBOdChlLER0KSxBdChlLFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30sbj1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDtmdW5jdGlvbiByKHQpe3JldHVybiB0PyJmdW5jdGlvbiI9PXR5cGVvZiB0P25ldyB0OnQ6bnVsbH1pZigiZnVuY3Rpb24iPT10eXBlb2YgZSYmKG49ZSxlPXt9KSxlLndoaXRlbGlzdCYmIWUuc3VwcG9ydGVkTG5ncyYmdGhpcy5sb2dnZXIuZGVwcmVjYXRlKCJ3aGl0ZWxpc3QiLCdvcHRpb24gIndoaXRlbGlzdCIgd2lsbCBiZSByZW5hbWVkIHRvICJzdXBwb3J0ZWRMbmdzIiBpbiB0aGUgbmV4dCBtYWpvciAtIHBsZWFzZSBtYWtlIHN1cmUgdG8gcmVuYW1lIHRoaXMgb3B0aW9uIGFzYXAuJyksZS5ub25FeHBsaWNpdFdoaXRlbGlzdCYmIWUubm9uRXhwbGljaXRTdXBwb3J0ZWRMbmdzJiZ0aGlzLmxvZ2dlci5kZXByZWNhdGUoIndoaXRlbGlzdCIsJ29wdGlvbnMgIm5vbkV4cGxpY2l0V2hpdGVsaXN0IiB3aWxsIGJlIHJlbmFtZWQgdG8gIm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncyIgaW4gdGhlIG5leHQgbWFqb3IgLSBwbGVhc2UgbWFrZSBzdXJlIHRvIHJlbmFtZSB0aGlzIG9wdGlvbiBhc2FwLicpLHRoaXMub3B0aW9ucz1qdCh7fSxpZSgpLHRoaXMub3B0aW9ucyxhZShlKSksdGhpcy5mb3JtYXQ9dGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0LG58fChuPXNlKSwhdGhpcy5vcHRpb25zLmlzQ2xvbmUpe3RoaXMubW9kdWxlcy5sb2dnZXI/X3QuaW5pdChyKHRoaXMubW9kdWxlcy5sb2dnZXIpLHRoaXMub3B0aW9ucyk6X3QuaW5pdChudWxsLHRoaXMub3B0aW9ucyk7dmFyIG89bmV3IFp0KHRoaXMub3B0aW9ucyk7dGhpcy5zdG9yZT1uZXcgR3QodGhpcy5vcHRpb25zLnJlc291cmNlcyx0aGlzLm9wdGlvbnMpO3ZhciBpPXRoaXMuc2VydmljZXM7aS5sb2dnZXI9X3QsaS5yZXNvdXJjZVN0b3JlPXRoaXMuc3RvcmUsaS5sYW5ndWFnZVV0aWxzPW8saS5wbHVyYWxSZXNvbHZlcj1uZXcgbmUobyx7cHJlcGVuZDp0aGlzLm9wdGlvbnMucGx1cmFsU2VwYXJhdG9yLGNvbXBhdGliaWxpdHlKU09OOnRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTixzaW1wbGlmeVBsdXJhbFN1ZmZpeDp0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXh9KSxpLmludGVycG9sYXRvcj1uZXcgcmUodGhpcy5vcHRpb25zKSxpLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6dGhpcy5oYXNMb2FkZWROYW1lc3BhY2UuYmluZCh0aGlzKX0saS5iYWNrZW5kQ29ubmVjdG9yPW5ldyBvZShyKHRoaXMubW9kdWxlcy5iYWNrZW5kKSxpLnJlc291cmNlU3RvcmUsaSx0aGlzLm9wdGlvbnMpLGkuYmFja2VuZENvbm5lY3Rvci5vbigiKiIsZnVuY3Rpb24oZSl7Zm9yKHZhciBuPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkobj4xP24tMTowKSxvPTE7bzxuO28rKylyW28tMV09YXJndW1lbnRzW29dO3QuZW1pdC5hcHBseSh0LFtlXS5jb25jYXQocikpfSksdGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3ImJihpLmxhbmd1YWdlRGV0ZWN0b3I9cih0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3RvciksaS5sYW5ndWFnZURldGVjdG9yLmluaXQoaSx0aGlzLm9wdGlvbnMuZGV0ZWN0aW9uLHRoaXMub3B0aW9ucykpLHRoaXMubW9kdWxlcy5pMThuRm9ybWF0JiYoaS5pMThuRm9ybWF0PXIodGhpcy5tb2R1bGVzLmkxOG5Gb3JtYXQpLGkuaTE4bkZvcm1hdC5pbml0JiZpLmkxOG5Gb3JtYXQuaW5pdCh0aGlzKSksdGhpcy50cmFuc2xhdG9yPW5ldyBKdCh0aGlzLnNlcnZpY2VzLHRoaXMub3B0aW9ucyksdGhpcy50cmFuc2xhdG9yLm9uKCIqIixmdW5jdGlvbihlKXtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheShuPjE/bi0xOjApLG89MTtvPG47bysrKXJbby0xXT1hcmd1bWVudHNbb107dC5lbWl0LmFwcGx5KHQsW2VdLmNvbmNhdChyKSl9KSx0aGlzLm1vZHVsZXMuZXh0ZXJuYWwuZm9yRWFjaChmdW5jdGlvbihlKXtlLmluaXQmJmUuaW5pdCh0KX0pfXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvcnx8dGhpcy5vcHRpb25zLmxuZ3x8dGhpcy5sb2dnZXIud2FybigiaW5pdDogbm8gbGFuZ3VhZ2VEZXRlY3RvciBpcyB1c2VkIGFuZCBubyBsbmcgaXMgZGVmaW5lZCIpO3ZhciBhPVsiZ2V0UmVzb3VyY2UiLCJoYXNSZXNvdXJjZUJ1bmRsZSIsImdldFJlc291cmNlQnVuZGxlIiwiZ2V0RGF0YUJ5TGFuZ3VhZ2UiXTthLmZvckVhY2goZnVuY3Rpb24oZSl7dFtlXT1mdW5jdGlvbigpe3ZhciBuO3JldHVybihuPXQuc3RvcmUpW2VdLmFwcGx5KG4sYXJndW1lbnRzKX19KTt2YXIgcz1bImFkZFJlc291cmNlIiwiYWRkUmVzb3VyY2VzIiwiYWRkUmVzb3VyY2VCdW5kbGUiLCJyZW1vdmVSZXNvdXJjZUJ1bmRsZSJdO3MuZm9yRWFjaChmdW5jdGlvbihlKXt0W2VdPWZ1bmN0aW9uKCl7dmFyIG47cmV0dXJuKG49dC5zdG9yZSlbZV0uYXBwbHkobixhcmd1bWVudHMpLHR9fSk7dmFyIHU9TXQoKSxjPWZ1bmN0aW9uKCl7dC5jaGFuZ2VMYW5ndWFnZSh0Lm9wdGlvbnMubG5nLGZ1bmN0aW9uKGUscil7dC5pc0luaXRpYWxpemVkPSEwLHQub3B0aW9ucy5pc0Nsb25lfHx0LmxvZ2dlci5sb2coImluaXRpYWxpemVkIix0Lm9wdGlvbnMpLHQuZW1pdCgiaW5pdGlhbGl6ZWQiLHQub3B0aW9ucyksdS5yZXNvbHZlKHIpLG4oZSxyKX0pfTtyZXR1cm4gdGhpcy5vcHRpb25zLnJlc291cmNlc3x8IXRoaXMub3B0aW9ucy5pbml0SW1tZWRpYXRlP2MoKTpzZXRUaW1lb3V0KGMsMCksdX19LHtrZXk6ImxvYWRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06c2Uscj1uLG89InN0cmluZyI9PXR5cGVvZiB0P3Q6dGhpcy5sYW5ndWFnZTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHI9dCksIXRoaXMub3B0aW9ucy5yZXNvdXJjZXN8fHRoaXMub3B0aW9ucy5wYXJ0aWFsQnVuZGxlZExhbmd1YWdlcyl7aWYobyYmImNpbW9kZSI9PT1vLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHIoKTt2YXIgaT1bXSxhPWZ1bmN0aW9uKHQpe3QmJmUuc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkodCkuZm9yRWFjaChmdW5jdGlvbih0KXtpLmluZGV4T2YodCk8MCYmaS5wdXNoKHQpfSl9O2lmKG8pYShvKTtlbHNle3ZhciBzPXRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyk7cy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBhKHQpfSl9dGhpcy5vcHRpb25zLnByZWxvYWQmJnRoaXMub3B0aW9ucy5wcmVsb2FkLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIGEodCl9KSx0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IubG9hZChpLHRoaXMub3B0aW9ucy5ucyxyKX1lbHNlIHIobnVsbCl9fSx7a2V5OiJyZWxvYWRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1NdCgpO3JldHVybiB0fHwodD10aGlzLmxhbmd1YWdlcyksZXx8KGU9dGhpcy5vcHRpb25zLm5zKSxufHwobj1zZSksdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLnJlbG9hZCh0LGUsZnVuY3Rpb24odCl7ci5yZXNvbHZlKCksbih0KX0pLHJ9fSx7a2V5OiJ1c2UiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCF0KXRocm93IG5ldyBFcnJvcigiWW91IGFyZSBwYXNzaW5nIGFuIHVuZGVmaW5lZCBtb2R1bGUhIFBsZWFzZSBjaGVjayB0aGUgb2JqZWN0IHlvdSBhcmUgcGFzc2luZyB0byBpMThuZXh0LnVzZSgpIik7aWYoIXQudHlwZSl0aHJvdyBuZXcgRXJyb3IoIllvdSBhcmUgcGFzc2luZyBhIHdyb25nIG1vZHVsZSEgUGxlYXNlIGNoZWNrIHRoZSBvYmplY3QgeW91IGFyZSBwYXNzaW5nIHRvIGkxOG5leHQudXNlKCkiKTtyZXR1cm4iYmFja2VuZCI9PT10LnR5cGUmJih0aGlzLm1vZHVsZXMuYmFja2VuZD10KSwoImxvZ2dlciI9PT10LnR5cGV8fHQubG9nJiZ0Lndhcm4mJnQuZXJyb3IpJiYodGhpcy5tb2R1bGVzLmxvZ2dlcj10KSwibGFuZ3VhZ2VEZXRlY3RvciI9PT10LnR5cGUmJih0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3Rvcj10KSwiaTE4bkZvcm1hdCI9PT10LnR5cGUmJih0aGlzLm1vZHVsZXMuaTE4bkZvcm1hdD10KSwicG9zdFByb2Nlc3NvciI9PT10LnR5cGUmJkt0LmFkZFBvc3RQcm9jZXNzb3IodCksIjNyZFBhcnR5Ij09PXQudHlwZSYmdGhpcy5tb2R1bGVzLmV4dGVybmFsLnB1c2godCksdGhpc319LHtrZXk6ImNoYW5nZUxhbmd1YWdlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7dGhpcy5pc0xhbmd1YWdlQ2hhbmdpbmdUbz10O3ZhciByPU10KCk7dGhpcy5lbWl0KCJsYW5ndWFnZUNoYW5naW5nIix0KTt2YXIgbz1mdW5jdGlvbih0KXt2YXIgbz0ic3RyaW5nIj09dHlwZW9mIHQ/dDpuLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuZ2V0QmVzdE1hdGNoRnJvbUNvZGVzKHQpO28mJihuLmxhbmd1YWdlfHwobi5sYW5ndWFnZT1vLG4ubGFuZ3VhZ2VzPW4uc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkobykpLG4udHJhbnNsYXRvci5sYW5ndWFnZXx8bi50cmFuc2xhdG9yLmNoYW5nZUxhbmd1YWdlKG8pLG4uc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmbi5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmNhY2hlVXNlckxhbmd1YWdlKG8pKSxuLmxvYWRSZXNvdXJjZXMobyxmdW5jdGlvbih0KXshZnVuY3Rpb24odCxvKXtvPyhuLmxhbmd1YWdlPW8sbi5sYW5ndWFnZXM9bi5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShvKSxuLnRyYW5zbGF0b3IuY2hhbmdlTGFuZ3VhZ2Uobyksbi5pc0xhbmd1YWdlQ2hhbmdpbmdUbz12b2lkIDAsbi5lbWl0KCJsYW5ndWFnZUNoYW5nZWQiLG8pLG4ubG9nZ2VyLmxvZygibGFuZ3VhZ2VDaGFuZ2VkIixvKSk6bi5pc0xhbmd1YWdlQ2hhbmdpbmdUbz12b2lkIDAsci5yZXNvbHZlKGZ1bmN0aW9uKCl7cmV0dXJuIG4udC5hcHBseShuLGFyZ3VtZW50cyl9KSxlJiZlKHQsZnVuY3Rpb24oKXtyZXR1cm4gbi50LmFwcGx5KG4sYXJndW1lbnRzKX0pfSh0LG8pfSl9O3JldHVybiB0fHwhdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yfHx0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuYXN5bmM/IXQmJnRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmFzeW5jP3RoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5kZXRlY3Qobyk6byh0KTpvKHRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5kZXRlY3QoKSkscn19LHtrZXk6ImdldEZpeGVkVCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9ZnVuY3Rpb24gdChlLHIpe3ZhciBvO2lmKCJvYmplY3QiIT09U3Qocikpe2Zvcih2YXIgaT1hcmd1bWVudHMubGVuZ3RoLGE9bmV3IEFycmF5KGk+Mj9pLTI6MCkscz0yO3M8aTtzKyspYVtzLTJdPWFyZ3VtZW50c1tzXTtvPW4ub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcihbZSxyXS5jb25jYXQoYSkpfWVsc2Ugbz1qdCh7fSxyKTtyZXR1cm4gby5sbmc9by5sbmd8fHQubG5nLG8ubG5ncz1vLmxuZ3N8fHQubG5ncyxvLm5zPW8ubnN8fHQubnMsbi50KGUsbyl9O3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9yLmxuZz10OnIubG5ncz10LHIubnM9ZSxyfX0se2tleToidCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdGhpcy50cmFuc2xhdG9yJiYodD10aGlzLnRyYW5zbGF0b3IpLnRyYW5zbGF0ZS5hcHBseSh0LGFyZ3VtZW50cyl9fSx7a2V5OiJleGlzdHMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIHRoaXMudHJhbnNsYXRvciYmKHQ9dGhpcy50cmFuc2xhdG9yKS5leGlzdHMuYXBwbHkodCxhcmd1bWVudHMpfX0se2tleToic2V0RGVmYXVsdE5hbWVzcGFjZSIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLmRlZmF1bHROUz10fX0se2tleToiaGFzTG9hZGVkTmFtZXNwYWNlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2lmKCF0aGlzLmlzSW5pdGlhbGl6ZWQpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImhhc0xvYWRlZE5hbWVzcGFjZTogaTE4bmV4dCB3YXMgbm90IGluaXRpYWxpemVkIix0aGlzLmxhbmd1YWdlcyksITE7aWYoIXRoaXMubGFuZ3VhZ2VzfHwhdGhpcy5sYW5ndWFnZXMubGVuZ3RoKXJldHVybiB0aGlzLmxvZ2dlci53YXJuKCJoYXNMb2FkZWROYW1lc3BhY2U6IGkxOG4ubGFuZ3VhZ2VzIHdlcmUgdW5kZWZpbmVkIG9yIGVtcHR5Iix0aGlzLmxhbmd1YWdlcyksITE7dmFyIHI9dGhpcy5sYW5ndWFnZXNbMF0sbz0hIXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nLGk9dGhpcy5sYW5ndWFnZXNbdGhpcy5sYW5ndWFnZXMubGVuZ3RoLTFdO2lmKCJjaW1vZGUiPT09ci50b0xvd2VyQ2FzZSgpKXJldHVybiEwO3ZhciBhPWZ1bmN0aW9uKHQsbil7dmFyIHI9ZS5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLnN0YXRlWyIiLmNvbmNhdCh0LCJ8IikuY29uY2F0KG4pXTtyZXR1cm4tMT09PXJ8fDI9PT1yfTtpZihuLnByZWNoZWNrKXt2YXIgcz1uLnByZWNoZWNrKHRoaXMsYSk7aWYodm9pZCAwIT09cylyZXR1cm4gc31yZXR1cm4hIXRoaXMuaGFzUmVzb3VyY2VCdW5kbGUocix0KXx8KCF0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IuYmFja2VuZHx8ISghYShyLHQpfHxvJiYhYShpLHQpKSl9fSx7a2V5OiJsb2FkTmFtZXNwYWNlcyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9TXQoKTtyZXR1cm4gdGhpcy5vcHRpb25zLm5zPygic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe24ub3B0aW9ucy5ucy5pbmRleE9mKHQpPDAmJm4ub3B0aW9ucy5ucy5wdXNoKHQpfSksdGhpcy5sb2FkUmVzb3VyY2VzKGZ1bmN0aW9uKHQpe3IucmVzb2x2ZSgpLGUmJmUodCl9KSxyKTooZSYmZSgpLFByb21pc2UucmVzb2x2ZSgpKX19LHtrZXk6ImxvYWRMYW5ndWFnZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49TXQoKTsic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSk7dmFyIHI9dGhpcy5vcHRpb25zLnByZWxvYWR8fFtdLG89dC5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHIuaW5kZXhPZih0KTwwfSk7cmV0dXJuIG8ubGVuZ3RoPyh0aGlzLm9wdGlvbnMucHJlbG9hZD1yLmNvbmNhdChvKSx0aGlzLmxvYWRSZXNvdXJjZXMoZnVuY3Rpb24odCl7bi5yZXNvbHZlKCksZSYmZSh0KX0pLG4pOihlJiZlKCksUHJvbWlzZS5yZXNvbHZlKCkpfX0se2tleToiZGlyIix2YWx1ZTpmdW5jdGlvbih0KXtpZih0fHwodD10aGlzLmxhbmd1YWdlcyYmdGhpcy5sYW5ndWFnZXMubGVuZ3RoPjA/dGhpcy5sYW5ndWFnZXNbMF06dGhpcy5sYW5ndWFnZSksIXQpcmV0dXJuInJ0bCI7cmV0dXJuWyJhciIsInNodSIsInNxciIsInNzaCIsInhhYSIsInloZCIsInl1ZCIsImFhbyIsImFiaCIsImFidiIsImFjbSIsImFjcSIsImFjdyIsImFjeCIsImFjeSIsImFkZiIsImFkcyIsImFlYiIsImFlYyIsImFmYiIsImFqcCIsImFwYyIsImFwZCIsImFyYiIsImFycSIsImFycyIsImFyeSIsImFyeiIsImF1eiIsImF2bCIsImF5aCIsImF5bCIsImF5biIsImF5cCIsImJieiIsInBnYSIsImhlIiwiaXciLCJwcyIsInBidCIsInBidSIsInBzdCIsInBycCIsInByZCIsInVnIiwidXIiLCJ5ZGQiLCJ5ZHMiLCJ5aWgiLCJqaSIsInlpIiwiaGJvIiwibWVuIiwieG1uIiwiZmEiLCJqcHIiLCJwZW8iLCJwZXMiLCJwcnMiLCJkdiIsInNhbSJdLmluZGV4T2YodGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpKT49MD8icnRsIjoibHRyIn19LHtrZXk6ImNyZWF0ZUluc3RhbmNlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fSxuPWFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwO3JldHVybiBuZXcgZSh0LG4pfX0se2tleToiY2xvbmVJbnN0YW5jZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9LHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnNlLG89anQoe30sdGhpcy5vcHRpb25zLG4se2lzQ2xvbmU6ITB9KSxpPW5ldyBlKG8pLGE9WyJzdG9yZSIsInNlcnZpY2VzIiwibGFuZ3VhZ2UiXTtyZXR1cm4gYS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lbZV09dFtlXX0pLGkuc2VydmljZXM9anQoe30sdGhpcy5zZXJ2aWNlcyksaS5zZXJ2aWNlcy51dGlscz17aGFzTG9hZGVkTmFtZXNwYWNlOmkuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQoaSl9LGkudHJhbnNsYXRvcj1uZXcgSnQoaS5zZXJ2aWNlcyxpLm9wdGlvbnMpLGkudHJhbnNsYXRvci5vbigiKiIsZnVuY3Rpb24odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkoZT4xP2UtMTowKSxyPTE7cjxlO3IrKyluW3ItMV09YXJndW1lbnRzW3JdO2kuZW1pdC5hcHBseShpLFt0XS5jb25jYXQobikpfSksaS5pbml0KG8sciksaS50cmFuc2xhdG9yLm9wdGlvbnM9aS5vcHRpb25zLGkudHJhbnNsYXRvci5iYWNrZW5kQ29ubmVjdG9yLnNlcnZpY2VzLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6aS5oYXNMb2FkZWROYW1lc3BhY2UuYmluZChpKX0saX19XSksZX0oKSksY2U9bigxMzMpLGxlPW4ubihjZSk7ZnVuY3Rpb24gZmUodCxlLG4pe3JldHVybiBlIGluIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnRbZV09bix0fWZ1bmN0aW9uIHBlKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPW51bGwhPWFyZ3VtZW50c1tlXT9hcmd1bWVudHNbZV06e30scj1PYmplY3Qua2V5cyhuKTsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyYmKHI9ci5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhuKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix0KS5lbnVtZXJhYmxlfSkpKSxyLmZvckVhY2goZnVuY3Rpb24oZSl7ZmUodCxlLG5bZV0pfSl9cmV0dXJuIHR9ZnVuY3Rpb24gaGUodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX1mdW5jdGlvbiBkZSh0LGUsbil7dmFyIHI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89dGhpcyxpPWFyZ3VtZW50cyxhPWZ1bmN0aW9uKCl7cj1udWxsLG58fHQuYXBwbHkobyxpKX0scz1uJiYhcjtjbGVhclRpbWVvdXQocikscj1zZXRUaW1lb3V0KGEsZSkscyYmdC5hcHBseShvLGkpfX1mdW5jdGlvbiBnZSh0LGUsbil7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5pbmRleE9mKCIjIyMiKT4tMT90LnJlcGxhY2UoLyMjIy9nLCIuIik6dH1mb3IodmFyIG89InN0cmluZyIhPXR5cGVvZiBlP1tdLmNvbmNhdChlKTplLnNwbGl0KCIuIik7by5sZW5ndGg+MTspe2lmKCF0KXJldHVybnt9O3ZhciBpPXIoby5zaGlmdCgpKTshdFtpXSYmbiYmKHRbaV09bmV3IG4pLHQ9dFtpXX1yZXR1cm4gdD97b2JqOnQsazpyKG8uc2hpZnQoKSl9Ont9fWZ1bmN0aW9uIHZlKHQsZSxuKXt2YXIgcj1nZSh0LGUsT2JqZWN0KTtyLm9ialtyLmtdPW59ZnVuY3Rpb24geWUodCxlKXt2YXIgbj1nZSh0LGUpLHI9bi5vYmosbz1uLms7aWYocilyZXR1cm4gcltvXX12YXIgbWU9bmV3IFJlZ0V4cCgie3soLis/KX19IiwiZyIpO2Z1bmN0aW9uIGJlKHQsZSxuKXt2YXIgcixvLGk7Zm9yKDtyPW1lLmV4ZWModCk7KSJzdHJpbmciIT10eXBlb2Yobz1yWzFdLnRyaW0oKSkmJihvPW51bGw9PShpPW8pPyIiOiIiK2kpLG98fChvPSIiKSxvPW8ucmVwbGFjZSgvXCQvZywiJCQkJCIpLHQ9dC5yZXBsYWNlKHJbMF0sZVtvXXx8byksbWUubGFzdEluZGV4PTA7cmV0dXJuIHR9ZnVuY3Rpb24geGUodCxlLG4scixvKXt0cnl7dmFyIGk9bmV3KFhNTEh0dHBSZXF1ZXN0fHxBY3RpdmVYT2JqZWN0KSgiTVNYTUwyLlhNTEhUVFAuMy4wIik7aS5vcGVuKHI/IlBPU1QiOiJHRVQiLHQsMSksZS5jcm9zc0RvbWFpbnx8aS5zZXRSZXF1ZXN0SGVhZGVyKCJYLVJlcXVlc3RlZC1XaXRoIiwiWE1MSHR0cFJlcXVlc3QiKSxlLmF1dGhvcml6ZSYmZS5hcGlLZXkmJmkuc2V0UmVxdWVzdEhlYWRlcigiQXV0aG9yaXphdGlvbiIsZS5hcGlLZXkpLChyfHxlLnNldENvbnRlbnRUeXBlSlNPTikmJmkuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24vanNvbiIpLGkub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aS5yZWFkeVN0YXRlPjMmJm4mJm4oaS5yZXNwb25zZVRleHQsaSl9LGkuc2VuZChKU09OLnN0cmluZ2lmeShyKSl9Y2F0Y2godCl7d2luZG93LmNvbnNvbGUmJmNvbnNvbGUubG9nKHQpfX12YXIgd2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsbixyKXshZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyx0KSxlJiZlLnByb2plY3RJZD90aGlzLmluaXQobnVsbCxlLHt9LG4pOnRoaXMuaW5pdChudWxsLG4se30sciksdGhpcy50eXBlPSJiYWNrZW5kIn12YXIgZSxuLHI7cmV0dXJuIGU9dCwobj1be2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fSxyPWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwLG89YXJndW1lbnRzLmxlbmd0aD4zP2FyZ3VtZW50c1szXTp2b2lkIDA7dGhpcy5vcHRpb25zPXBlKHt9LHtsb2FkUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL3t7cHJvamVjdElkfX0ve3t2ZXJzaW9ufX0ve3tsbmd9fS97e25zfX0iLHByaXZhdGVQYXRoOiJodHRwczovL2FwaS5sb2NpemUuaW8vcHJpdmF0ZS97e3Byb2plY3RJZH19L3t7dmVyc2lvbn19L3t7bG5nfX0ve3tuc319IixwdWxsUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL3B1bGwve3twcm9qZWN0SWR9fS97e3ZlcnNpb259fS97e2xuZ319L3t7bnN9fSIsZ2V0TGFuZ3VhZ2VzUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL2xhbmd1YWdlcy97e3Byb2plY3RJZH19IixhZGRQYXRoOiJodHRwczovL2FwaS5sb2NpemUuaW8vbWlzc2luZy97e3Byb2plY3RJZH19L3t7dmVyc2lvbn19L3t7bG5nfX0ve3tuc319Iix1cGRhdGVQYXRoOiJodHRwczovL2FwaS5sb2NpemUuaW8vdXBkYXRlL3t7cHJvamVjdElkfX0ve3t2ZXJzaW9ufX0ve3tsbmd9fS97e25zfX0iLHJlZmVyZW5jZUxuZzoiZW4iLGNyb3NzRG9tYWluOiEwLHNldENvbnRlbnRUeXBlSlNPTjohMSx2ZXJzaW9uOiJsYXRlc3QiLHB1bGw6ITEscHJpdmF0ZTohMSx3aGl0ZWxpc3RUaHJlc2hvbGQ6LjksZmFpbExvYWRpbmdPbkVtcHR5SlNPTjohMSxhbGxvd2VkQWRkT3JVcGRhdGVIb3N0czpbImxvY2FsaG9zdCJdfSx0aGlzLm9wdGlvbnMsbiksdGhpcy5zZXJ2aWNlcz10LHRoaXMub3B0aW9ucy5wdWxsJiZjb25zb2xlLndhcm4oImRlcHJlY2F0ZWQ6IHB1bGwgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBhbmQgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggbG9jaXplIHByaXZhdGUgdmVyc2lvbnMiKTt2YXIgaT13aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZTtpPyh0aGlzLmlzQWRkT3JVcGRhdGVBbGxvd2VkPXRoaXMub3B0aW9ucy5hbGxvd2VkQWRkT3JVcGRhdGVIb3N0cy5pbmRleE9mKGkpPi0xLHIuc2F2ZU1pc3NpbmcmJiF0aGlzLmlzQWRkT3JVcGRhdGVBbGxvd2VkJiZ0JiZ0LmxvZ2dlciYmdC5sb2dnZXIud2FybignbG9jaXplLWJhY2tlbmQ6IHdpbGwgbm90IHNhdmUgbWlzc2luZ3MgYmVjYXVzZSB0aGUgaG9zdCAiJy5jb25jYXQoaSwnIiB3YXMgbm90IGluIHRoZSBsaXN0IG9mIGFsbG93ZWRBZGRPclVwZGF0ZUhvc3RzOiAnKS5jb25jYXQodGhpcy5vcHRpb25zLmFsbG93ZWRBZGRPclVwZGF0ZUhvc3RzLmpvaW4oIiwgIiksIiAobWF0Y2hlcyBuZWVkIHRvIGJlIGV4YWN0KS4iKSkpOnRoaXMuaXNBZGRPclVwZGF0ZUFsbG93ZWQ9ITAsImZ1bmN0aW9uIj09dHlwZW9mIG8mJnRoaXMuZ2V0T3B0aW9ucyhmdW5jdGlvbih0LHIpe2lmKHQpcmV0dXJuIG8odCk7ZS5vcHRpb25zLnJlZmVyZW5jZUxuZz1uLnJlZmVyZW5jZUxuZ3x8ci5yZWZlcmVuY2VMbmd8fGUub3B0aW9ucy5yZWZlcmVuY2VMbmcsbyhudWxsLHIpfSksdGhpcy5xdWV1ZWRXcml0ZXM9e30sdGhpcy5kZWJvdW5jZWRQcm9jZXNzPWRlKHRoaXMucHJvY2VzcywxZTQpfX0se2tleToiZ2V0TGFuZ3VhZ2VzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1iZSh0aGlzLm9wdGlvbnMuZ2V0TGFuZ3VhZ2VzUGF0aCx7cHJvamVjdElkOnRoaXMub3B0aW9ucy5wcm9qZWN0SWR9KTt0aGlzLmxvYWRVcmwoZSx7fSx0KX19LHtrZXk6ImdldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy5nZXRMYW5ndWFnZXMoZnVuY3Rpb24obixyKXtpZihuKXJldHVybiB0KG4pO3ZhciBvPU9iamVjdC5rZXlzKHIpO2lmKCFvLmxlbmd0aClyZXR1cm4gdChuZXcgRXJyb3IoIndhcyB1bmFibGUgdG8gbG9hZCBsYW5ndWFnZXMgdmlhIEFQSSIpKTt2YXIgaT1vLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiByW2VdLmlzUmVmZXJlbmNlTGFuZ3VhZ2UmJih0PWUpLHR9LCIiKSxhPW8ucmVkdWNlKGZ1bmN0aW9uKHQsbil7dmFyIG89cltuXTtyZXR1cm4gby50cmFuc2xhdGVkW2Uub3B0aW9ucy52ZXJzaW9uXSYmby50cmFuc2xhdGVkW2Uub3B0aW9ucy52ZXJzaW9uXT49ZS5vcHRpb25zLndoaXRlbGlzdFRocmVzaG9sZCYmdC5wdXNoKG4pLHR9LFtdKSxzPW8ucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuaW5kZXhPZigiLSIpPi0xfHx0fSwhMSk7dChudWxsLHtmYWxsYmFja0xuZzppLHJlZmVyZW5jZUxuZzppLHdoaXRlbGlzdDphLGxvYWQ6cz8iYWxsIjoibGFuZ3VhZ2VPbmx5In0pfSl9fSx7a2V5OiJyZWFkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHIsbz17fTt0aGlzLm9wdGlvbnMucHJpdmF0ZT8ocj1iZSh0aGlzLm9wdGlvbnMucHJpdmF0ZVBhdGgse2xuZzp0LG5zOmUscHJvamVjdElkOnRoaXMub3B0aW9ucy5wcm9qZWN0SWQsdmVyc2lvbjp0aGlzLm9wdGlvbnMudmVyc2lvbn0pLG89e2F1dGhvcml6ZTohMH0pOnRoaXMub3B0aW9ucy5wdWxsPyhyPWJlKHRoaXMub3B0aW9ucy5wdWxsUGF0aCx7bG5nOnQsbnM6ZSxwcm9qZWN0SWQ6dGhpcy5vcHRpb25zLnByb2plY3RJZCx2ZXJzaW9uOnRoaXMub3B0aW9ucy52ZXJzaW9ufSksbz17YXV0aG9yaXplOiEwfSk6cj1iZSh0aGlzLm9wdGlvbnMubG9hZFBhdGgse2xuZzp0LG5zOmUscHJvamVjdElkOnRoaXMub3B0aW9ucy5wcm9qZWN0SWQsdmVyc2lvbjp0aGlzLm9wdGlvbnMudmVyc2lvbn0pLHRoaXMubG9hZFVybChyLG8sbil9fSx7a2V5OiJsb2FkVXJsIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpczt4ZSh0LHBlKHt9LHRoaXMub3B0aW9ucyxlKSxmdW5jdGlvbihlLG8pe2lmKG8uc3RhdHVzPj01MDAmJm8uc3RhdHVzPDYwMClyZXR1cm4gbigiZmFpbGVkIGxvYWRpbmcgIit0LCEwKTtpZihvLnN0YXR1cz49NDAwJiZvLnN0YXR1czw1MDApcmV0dXJuIG4oImZhaWxlZCBsb2FkaW5nICIrdCwhMSk7dmFyIGksYTt0cnl7aT1KU09OLnBhcnNlKGUpfWNhdGNoKGUpe2E9ImZhaWxlZCBwYXJzaW5nICIrdCsiIHRvIGpzb24ifXJldHVybiBhP24oYSwhMSk6ci5vcHRpb25zLmZhaWxMb2FkaW5nT25FbXB0eUpTT04mJiFPYmplY3Qua2V5cyhpKS5sZW5ndGg/bigibG9hZGVkIHJlc3VsdCBlbXB0eSBmb3IgIit0LCExKTp2b2lkIG4obnVsbCxpKX0pfX0se2tleToiY3JlYXRlIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLG8saSl7dmFyIGE9dGhpcztpZihvfHwobz1mdW5jdGlvbigpe30pLCF0aGlzLmlzQWRkT3JVcGRhdGVBbGxvd2VkKXJldHVybiBvKCJob3N0IGlzIG5vdCBhbGxvd2VkIHRvIGNyZWF0ZSBrZXkuIik7InN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLHQuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0PT09YS5vcHRpb25zLnJlZmVyZW5jZUxuZ30pLmxlbmd0aDwxJiZ0aGlzLnNlcnZpY2VzJiZ0aGlzLnNlcnZpY2VzLmxvZ2dlciYmdGhpcy5zZXJ2aWNlcy5sb2dnZXIud2FybignbG9jaXplLWJhY2tlbmQ6IHdpbGwgbm90IHNhdmUgbWlzc2luZ3MgYmVjYXVzZSB0aGUgcmVmZXJlbmNlIGxhbmd1YWdlICInLmNvbmNhdCh0aGlzLm9wdGlvbnMucmVmZXJlbmNlTG5nLCciIHdhcyBub3QgaW4gdGhlIGxpc3Qgb2YgdG8gc2F2ZSBsYW5ndWFnZXM6ICcpLmNvbmNhdCh0LmpvaW4oIiwgIiksIiAob3BlbiB5b3VyIHNpdGUgaW4gdGhlIHJlZmVyZW5jZSBsYW5ndWFnZSB0byBzYXZlIG1pc3NpbmdzKS4iKSksdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Q9PT1hLm9wdGlvbnMucmVmZXJlbmNlTG5nJiZhLnF1ZXVlLmNhbGwoYSxhLm9wdGlvbnMucmVmZXJlbmNlTG5nLGUsbixyLG8saSl9KX19LHtrZXk6InVwZGF0ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvLGkpe3ZhciBhPXRoaXM7aWYob3x8KG89ZnVuY3Rpb24oKXt9KSwhdGhpcy5pc0FkZE9yVXBkYXRlQWxsb3dlZClyZXR1cm4gbygiaG9zdCBpcyBub3QgYWxsb3dlZCB0byB1cGRhdGUga2V5LiIpO2l8fChpPXt9KSwic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksaS5pc1VwZGF0ZT0hMCx0LmZvckVhY2goZnVuY3Rpb24odCl7dD09PWEub3B0aW9ucy5yZWZlcmVuY2VMbmcmJmEucXVldWUuY2FsbChhLGEub3B0aW9ucy5yZWZlcmVuY2VMbmcsZSxuLHIsbyxpKX0pfX0se2tleToid3JpdGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztpZigheWUodGhpcy5xdWV1ZWRXcml0ZXMsWyJsb2NrcyIsdCxlXSkpe3ZhciByPWJlKHRoaXMub3B0aW9ucy5hZGRQYXRoLHtsbmc6dCxuczplLHByb2plY3RJZDp0aGlzLm9wdGlvbnMucHJvamVjdElkLHZlcnNpb246dGhpcy5vcHRpb25zLnZlcnNpb259KSxvPWJlKHRoaXMub3B0aW9ucy51cGRhdGVQYXRoLHtsbmc6dCxuczplLHByb2plY3RJZDp0aGlzLm9wdGlvbnMucHJvamVjdElkLHZlcnNpb246dGhpcy5vcHRpb25zLnZlcnNpb259KSxpPXllKHRoaXMucXVldWVkV3JpdGVzLFt0LGVdKTtpZih2ZSh0aGlzLnF1ZXVlZFdyaXRlcyxbdCxlXSxbXSksaS5sZW5ndGgpe3ZlKHRoaXMucXVldWVkV3JpdGVzLFsibG9ja3MiLHQsZV0sITApO3ZhciBhPSExLHM9ITEsdT17fSxjPXt9O2kuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT10Lm9wdGlvbnMmJnQub3B0aW9ucy50RGVzY3JpcHRpb24/e3ZhbHVlOnQuZmFsbGJhY2tWYWx1ZXx8IiIsY29udGV4dDp7dGV4dDp0Lm9wdGlvbnMudERlc2NyaXB0aW9ufX06dC5mYWxsYmFja1ZhbHVlfHwiIjt0Lm9wdGlvbnMmJnQub3B0aW9ucy5pc1VwZGF0ZT8oc3x8KHM9ITApLGNbdC5rZXldPWUpOihhfHwoYT0hMCksdVt0LmtleV09ZSl9KTt2YXIgbD0wO2EmJmwrKyxzJiZsKys7dmFyIGY9ZnVuY3Rpb24oKXstLWx8fCh2ZShuLnF1ZXVlZFdyaXRlcyxbImxvY2tzIix0LGVdLCExKSxpLmZvckVhY2goZnVuY3Rpb24odCl7dC5jYWxsYmFjayYmdC5jYWxsYmFjaygpfSksbi5kZWJvdW5jZWRQcm9jZXNzKHQsZSkpfTtsfHxmKCksYSYmeGUocixwZSh7fSx7YXV0aG9yaXplOiEwfSx0aGlzLm9wdGlvbnMpLGZ1bmN0aW9uKHQsZSl7ZigpfSx1KSxzJiZ4ZShvLHBlKHt9LHthdXRob3JpemU6ITB9LHRoaXMub3B0aW9ucyksZnVuY3Rpb24odCxlKXtmKCl9LGMpfX19fSx7a2V5OiJwcm9jZXNzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7T2JqZWN0LmtleXModGhpcy5xdWV1ZWRXcml0ZXMpLmZvckVhY2goZnVuY3Rpb24oZSl7ImxvY2tzIiE9PWUmJk9iamVjdC5rZXlzKHQucXVldWVkV3JpdGVzW2VdKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3QucXVldWVkV3JpdGVzW2VdW25dLmxlbmd0aCYmdC53cml0ZShlLG4pfSl9KX19LHtrZXk6InF1ZXVlIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLG8saSl7IWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPWdlKHQsZSxPYmplY3QpLGk9by5vYmosYT1vLms7aVthXT1pW2FdfHxbXSxyJiYoaVthXT1pW2FdLmNvbmNhdChuKSkscnx8aVthXS5wdXNoKG4pfSh0aGlzLnF1ZXVlZFdyaXRlcyxbdCxlXSx7a2V5Om4sZmFsbGJhY2tWYWx1ZTpyfHwiIixjYWxsYmFjazpvLG9wdGlvbnM6aX0pLHRoaXMuZGVib3VuY2VkUHJvY2VzcygpfX1dKSYmaGUoZS5wcm90b3R5cGUsbiksciYmaGUoZSxyKSx0fSgpO3dlLnR5cGU9ImJhY2tlbmQiO3ZhciBrZT13ZSxTZT1uKDQ0KTtmdW5jdGlvbiBFZSgpe3JldHVybihFZT14dCgpKHZ0LmEubWFyayhmdW5jdGlvbiB0KGUpe3JldHVybiB2dC5hLndyYXAoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQuYWJydXB0KCJyZXR1cm4iLG5ldyBrdC5hKGZ1bmN0aW9uKHQpe3VlLmNoYW5nZUxhbmd1YWdlKGUsZnVuY3Rpb24oKXt0KHZvaWQgMCl9KX0pKTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19LHQpfSkpKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gamUoKXt2YXIgdDtyZXR1cm4gbXQoKSh0PXVlLnQpLmNhbGwodCx1ZSl9dmFyIFRlPXtpbml0aWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBrdC5hKGZ1bmN0aW9uKHQsZSl7dWUudXNlKG5ldyBsZS5hKG51bGwse29yZGVyOlsibmF2aWdhdG9yIl19KSkudXNlKGtlKS5pbml0KHtmYWxsYmFja0xuZzoiZW4iLG5zOlsiZGVmYXVsdCJdLGRlZmF1bHROUzoiZGVmYXVsdCIsYmFja2VuZDp7cHJvamVjdElkOlNlLmxvY2l6ZS5wcm9kdWN0SWQsdmVyc2lvbjpTZS5sb2NpemUudmVyc2lvbixhcGlLZXk6U2UubG9jaXplLmFwaUtleSxyZWZlcmVuY2VMbmc6ImVuIn19LGZ1bmN0aW9uKG4scil7cmV0dXJuIG4/ZShuKTp0KHIpfSl9KX0sY2hhbmdlTGFuZ3VhZ2U6ZnVuY3Rpb24odCl7cmV0dXJuIEVlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZ2V0TGFuZ3VhZ2U6ZnVuY3Rpb24oKXtyZXR1cm4gdWUubGFuZ3VhZ2V9LGdldFQ6amV9LE9lPW4oODMpLEFlPW4ubihPZSksQ2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ZhciBuPWUuZGF0YTtkKCkodGhpcyx0KSx0aGlzLmRhdGE9bn1yZXR1cm4gdigpKHQsbnVsbCxbe2tleToiY29udmVydEdvb2dsZVNwcmVhZHNoZWV0QXBpUmF3RGF0YSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W10scj0xO3I8ZS5sZW5ndGg7cis9MSl7Zm9yKHZhciBvPXt9LGk9MDtpPHQubGVuZ3RoO2krPTEpb1t0W2ldXT1lW3JdW2ldO24ucHVzaChvKX1yZXR1cm4gbn19LHtrZXk6InNwbGl0Q291bnRyaWVzIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdD8iIj09PXR8fCIsIj09PXQ/W106dC5zcGxpdCgiLCIpOltdfX0se2tleToibm9ybWFsaXplUmF3RGF0YSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W10scj0wLG89WSgpKHQpO3I8by5sZW5ndGg7cisrKXt2YXIgaSxhPXRbb1tyXV07YS5zaGlmdCgpLG49bCgpKGk9W10pLmNhbGwoaSxBZSgpKG4pLEFlKCkoYSkpfXJldHVybiBuLnVuc2hpZnQoZSkse2RhdGE6bn19fV0pLHR9KCk7ZnVuY3Rpb24gTGUodCl7dmFyIGU9ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIFJlZmxlY3R8fCFvLmEpcmV0dXJuITE7aWYoby5hLnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKCkoRGF0ZSxbXSxmdW5jdGlvbigpe30pKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1FKCkodCk7aWYoZSl7dmFyIGk9RSgpKHRoaXMpLmNvbnN0cnVjdG9yO249bygpKHIsYXJndW1lbnRzLGkpfWVsc2Ugbj1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gaygpKHRoaXMsbil9fXZhciBSZT17YnlVcmw6e25hbWU6ImJ5VXJsIixjb2x1bW5zOlsidXJsIiwiY291bnRyaWVzIl19LGJ5SXRlbU5hbWU6e25hbWU6ImJ5SXRlbU5hbWUiLGNvbHVtbnM6WyJpdGVtTmFtZSIsImNvdW50cmllcyJdfSxieUl0ZW1Db2RlOntuYW1lOiJieUl0ZW1Db2RlIixjb2x1bW5zOlsiaXRlbUNvZGUiLCJjb3VudHJpZXMiXX0sYnlDYXRlZ29yeTp7bmFtZToiYnlDYXRlZ29yeSIsY29sdW1uczpbImNhdGVnb3J5IiwiY291bnRyaWVzIl19LGJ5SXRlbURlc2NyaXB0aW9uOntuYW1lOiJieUl0ZW1EZXNjcmlwdGlvbiIsY29sdW1uczpbInRleHQiLCJjb3VudHJpZXMiXX19LFBlPWZ1bmN0aW9uKHQpe3goKShuLHQpO3ZhciBlPUxlKG4pO2Z1bmN0aW9uIG4odCl7dmFyIHI7cmV0dXJuIGQoKSh0aGlzLG4pLChyPWUuY2FsbCh0aGlzLHQpKS5kYXRhPXQuZGF0YSxyLnNoZWV0VHlwZT10LnNoZWV0VHlwZXx8UmUscn1yZXR1cm4gdigpKG4sW3trZXk6ImJ5VXJsIix2YWx1ZTpmdW5jdGlvbigpe2lmKCF0aGlzLnNoZWV0VHlwZS5ieVVybClyZXR1cm5bXTt2YXIgdD10aGlzLnNoZWV0VHlwZS5ieVVybDtpZighdGhpcy5kYXRhW3QubmFtZV0pcmV0dXJuW107dmFyIGU9Q2UuY29udmVydEdvb2dsZVNwcmVhZHNoZWV0QXBpUmF3RGF0YSh0LmNvbHVtbnMsdGhpcy5kYXRhW3QubmFtZV0pO3JldHVybiBwKCkoZSkuY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciBuPWVbdC5jb2x1bW5zWzFdXTtyZXR1cm57dXJsOmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6Q2Uuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiYnlJdGVtTmFtZSIsdmFsdWU6ZnVuY3Rpb24oKXtpZighdGhpcy5zaGVldFR5cGUuYnlJdGVtTmFtZSlyZXR1cm5bXTt2YXIgdD10aGlzLnNoZWV0VHlwZS5ieUl0ZW1OYW1lO2lmKCF0aGlzLmRhdGFbdC5uYW1lXSlyZXR1cm5bXTt2YXIgZT1DZS5jb252ZXJ0R29vZ2xlU3ByZWFkc2hlZXRBcGlSYXdEYXRhKHQuY29sdW1ucyx0aGlzLmRhdGFbdC5uYW1lXSk7cmV0dXJuIHAoKShlKS5jYWxsKGUsZnVuY3Rpb24oZSl7dmFyIG49ZVt0LmNvbHVtbnNbMV1dO3JldHVybntpdGVtTmFtZTplW3QuY29sdW1uc1swXV0sY291bnRyaWVzOkNlLnNwbGl0Q291bnRyaWVzKG4pLGlzQWxsOiJBTEwiPT09bn19KX19LHtrZXk6ImJ5SXRlbUNvZGUiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2hlZXRUeXBlLmJ5SXRlbUNvZGUpcmV0dXJuW107dmFyIHQ9dGhpcy5zaGVldFR5cGUuYnlJdGVtQ29kZTtpZighdGhpcy5kYXRhW3QubmFtZV0pcmV0dXJuW107dmFyIGU9Q2UuY29udmVydEdvb2dsZVNwcmVhZHNoZWV0QXBpUmF3RGF0YSh0LmNvbHVtbnMsdGhpcy5kYXRhW3QubmFtZV0pO3JldHVybiBwKCkoZSkuY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciBuPWVbdC5jb2x1bW5zWzFdXTtyZXR1cm57aXRlbUNvZGU6ZVt0LmNvbHVtbnNbMF1dLGNvdW50cmllczpDZS5zcGxpdENvdW50cmllcyhuKSxpc0FsbDoiQUxMIj09PW59fSl9fSx7a2V5OiJieUNhdGVnb3J5Iix2YWx1ZTpmdW5jdGlvbigpe2lmKCF0aGlzLnNoZWV0VHlwZS5ieUNhdGVnb3J5KXJldHVybltdO3ZhciB0PXRoaXMuc2hlZXRUeXBlLmJ5Q2F0ZWdvcnk7aWYoIXRoaXMuZGF0YVt0Lm5hbWVdKXJldHVybltdO3ZhciBlPUNlLmNvbnZlcnRHb29nbGVTcHJlYWRzaGVldEFwaVJhd0RhdGEodC5jb2x1bW5zLHRoaXMuZGF0YVt0Lm5hbWVdKTtyZXR1cm4gcCgpKGUpLmNhbGwoZSxmdW5jdGlvbihlKXt2YXIgbj1lW3QuY29sdW1uc1sxXV07cmV0dXJue2NhdGVnb3J5OmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6Q2Uuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiYnlJdGVtRGVzY3JpcHRpb24iLHZhbHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2hlZXRUeXBlLmJ5SXRlbURlc2NyaXB0aW9uKXJldHVybltdO3ZhciB0PXRoaXMuc2hlZXRUeXBlLmJ5SXRlbURlc2NyaXB0aW9uO2lmKCF0aGlzLmRhdGFbdC5uYW1lXSlyZXR1cm5bXTt2YXIgZT1DZS5jb252ZXJ0R29vZ2xlU3ByZWFkc2hlZXRBcGlSYXdEYXRhKHQuY29sdW1ucyx0aGlzLmRhdGFbdC5uYW1lXSk7cmV0dXJuIHAoKShlKS5jYWxsKGUsZnVuY3Rpb24oZSl7dmFyIG49ZVt0LmNvbHVtbnNbMV1dO3JldHVybnt0ZXh0OmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6Q2Uuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiZXhlY3V0ZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57ZXhjbHVzaW9uOntieVVybDp0aGlzLmJ5VXJsKCksYnlJdGVtTmFtZTp0aGlzLmJ5SXRlbU5hbWUoKSxieUl0ZW1Db2RlOnRoaXMuYnlJdGVtQ29kZSgpLGJ5Q2F0ZWdvcnk6dGhpcy5ieUNhdGVnb3J5KCksYnlJdGVtRGVzY3JpcHRpb246dGhpcy5ieUl0ZW1EZXNjcmlwdGlvbigpfX19fV0pLG59KENlKSxOZT1uKDYzKSxJZT1uLm4oTmUpLF9lPW4oODQpO2Z1bmN0aW9uIERlKHQsZSl7dmFyIG47aWYodm9pZCAwPT09cS5hfHxudWxsPT1VKCkodCkpe2lmKEQoKSh0KXx8KG49ZnVuY3Rpb24odCxlKXt2YXIgbjtpZighdClyZXR1cm47aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBNZSh0LGUpO3ZhciByPVcoKShuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSkuY2FsbChuLDgsLTEpOyJPYmplY3QiPT09ciYmdC5jb25zdHJ1Y3RvciYmKHI9dC5jb25zdHJ1Y3Rvci5uYW1lKTtpZigiTWFwIj09PXJ8fCJTZXQiPT09cilyZXR1cm4gSCgpKHQpO2lmKCJBcmd1bWVudHMiPT09cnx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QocikpcmV0dXJuIE1lKHQsZSl9KHQpKXx8ZSYmdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCl7biYmKHQ9bik7dmFyIHI9MCxvPWZ1bmN0aW9uKCl7fTtyZXR1cm57czpvLG46ZnVuY3Rpb24oKXtyZXR1cm4gcj49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbcisrXX19LGU6ZnVuY3Rpb24odCl7dGhyb3cgdH0sZjpvfX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIGksYT0hMCxzPSExO3JldHVybntzOmZ1bmN0aW9uKCl7bj1JKCkodCl9LG46ZnVuY3Rpb24oKXt2YXIgdD1uLm5leHQoKTtyZXR1cm4gYT10LmRvbmUsdH0sZTpmdW5jdGlvbih0KXtzPSEwLGk9dH0sZjpmdW5jdGlvbigpe3RyeXthfHxudWxsPT1uLnJldHVybnx8bi5yZXR1cm4oKX1maW5hbGx5e2lmKHMpdGhyb3cgaX19fX1mdW5jdGlvbiBNZSh0LGUpeyhudWxsPT1lfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KGUpO248ZTtuKyspcltuXT10W25dO3JldHVybiByfWZ1bmN0aW9uIFVlKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhby5hKXJldHVybiExO2lmKG8uYS5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobygpKERhdGUsW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9RSgpKHQpO2lmKGUpe3ZhciBpPUUoKSh0aGlzKS5jb25zdHJ1Y3RvcjtuPW8oKShyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGsoKSh0aGlzLG4pfX12YXIgQmU9ZnVuY3Rpb24odCl7eCgpKG4sdCk7dmFyIGU9VWUobik7ZnVuY3Rpb24gbigpe3JldHVybiBkKCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gdigpKG4sW3trZXk6ImV4Y2x1ZGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxyKXt2YXIgbyxpLGEscz0hMSx1PXRoaXMubG9jYXRpb24uY291bnRyeSxjPURlKHQpO3RyeXtmb3IoYy5zKCk7IShvPWMubigpKS5kb25lOyl7dmFyIGY9by52YWx1ZTtpZihyKGYpKXtzPW4ubWF0Y2hDb3VudHJ5KGYsdSk7YnJlYWt9fX1jYXRjaCh0KXtjLmUodCl9ZmluYWxseXtjLmYoKX1yZXR1cm4gcz8oYXQuYS5kZWJ1ZyhsKCkoaT0iRVhDTFVERUQgQlkgU1BSRUFEU0hFRVQ6ICIuY29uY2F0KGUsIiwgIikpLmNhbGwoaSx1KSkse2NvZGU6IkVYQ0xVREVEX0JZX0JMQUNLTElTVCIsbWVzc2FnZTpsKCkoYT0iIi5jb25jYXQoZSwiLCAiKSkuY2FsbChhLHUsIiDjgavoqbLlvZPjgZfjgZ/jgZ/jgoHpmaTlpJYiKSxwYXJhbXM6e3ZhbHVlOmUsY291bnRyeTp1fX0pOl9lLmF9fV0sW3trZXk6Im1hdGNoQ291bnRyeSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4hKCF0LmlzQWxsJiYwIT09dC5jb3VudHJpZXMubGVuZ3RoKXx8SWUoKShuPXQuY291bnRyaWVzKS5jYWxsKG4sZSl9fV0pLG59KF9lLmIpO2Z1bmN0aW9uIHFlKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhby5hKXJldHVybiExO2lmKG8uYS5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobygpKERhdGUsW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9RSgpKHQpO2lmKGUpe3ZhciBpPUUoKSh0aGlzKS5jb25zdHJ1Y3RvcjtuPW8oKShyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGsoKSh0aGlzLG4pfX12YXIgRmU9d2luZG93LnppZ3phZyxIZT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJidG4tbmF2IikubGVuZ3RoPjAsemU9L1wvaXRlbVwvXGQrLy50ZXN0KHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtkdC5vbkNoYW5nZXNSZWFkeShmdW5jdGlvbih0KXsvdG93ZXJcLmpwXC8vLnRlc3Qod2luZG93LmxvY2F0aW9uLmhyZWYpJiYoSGU/KHplJiYoZHQub3ZlcnJpZGVDbGlja0V2ZW50KHQsIi5pdGVtLWluZm8tbWFpbiAubWFpbi1jYXJ0aW4tYnRuLCAjRmxvYXRpbmdDYXJ0SW4gLm1haW4tY2FydGluLWJ0biIsZnVuY3Rpb24oKXtGZS5wYWdlVG8oIml0ZW0iKX0pLHQoJ1tpZCo9IlJlbGF0aW9uR3JvdXBJdGVtc18iXScpLmxlbmd0aD4wJiZkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwiLmNhcnRpbi1idG4ucmVsZWFzZWQtYnRuIixmdW5jdGlvbihlKXtpZihlLnRhcmdldCl7dmFyIG4scj10KGUudGFyZ2V0KTtpZihyLmNsb3Nlc3QoIi5yZWxhdGlvbi1ncm91cC1pdGVtLXJvdyIpLmxlbmd0aD4wKXdpbmRvdy5sb2NhdGlvbi5ocmVmPVQoKShuPXIuY2xvc2VzdCgiLnJlbGF0aW9uLWdyb3VwLWl0ZW0tcm93IikpLmNhbGwobiwiLml0ZW0taW5mby1ibG9jayA+IGEiKS5hdHRyKCJocmVmIil8fCIifX0pKSxkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwnYVtocmVmJD0iL2VjL1Nob3BwaW5nQmFnL0l0ZW1MaXN0Il0nLGZ1bmN0aW9uKCl7RmUucGFnZVRvKCJjYXJ0Iil9KSx0KCIuYm94LnNlY3Rpb24sIC50ZXh0LWhvbGRlciIpLmxlbmd0aD4wJiZkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwnYVtocmVmKj0iYWN0aW9uPWNhcnRpbiJdJyxmdW5jdGlvbihlKXtpZihlLnRhcmdldCl7dmFyIG49dChlLnRhcmdldCk7aWYobi5jbG9zZXN0KCIuZXZlbi1pdGVtIikubGVuZ3RoPjApe3ZhciByPW4uY2xvc2VzdCgiLmV2ZW4taXRlbSIpO1QoKShyKS5jYWxsKHIsIi5zdWItdGl0bGUiKS5sZW5ndGg+MD93aW5kb3cubG9jYXRpb24uaHJlZj1UKCkocikuY2FsbChyLCIuc3ViLXRpdGxlID4gYSIpLmF0dHIoImhyZWYiKXx8IiI6VCgpKHIpLmNhbGwociwiLndyYXBwLXRleHQiKS5sZW5ndGg+MCYmKHdpbmRvdy5sb2NhdGlvbi5ocmVmPVQoKShyKS5jYWxsKHIsIi53cmFwcC10ZXh0IGE6Zmlyc3Qtb2YtdHlwZSIpLmF0dHIoImhyZWYiKXx8IiIpfX19KSk6KHplJiYoZHQub3ZlcnJpZGVDbGlja0V2ZW50KHQsIi5wcmljZS1pbmZvLW1haW4gLmNhcnRpbi1hcmVhLW5vd29uc2FsZSwgLnByaWNlLWluZm8tbWFpbiAuY2FydGluLWFyZWEtcmVzZXJ2ZSIsZnVuY3Rpb24oKXtGZS5wYWdlVG8oIml0ZW0iKX0pLHQoJ1tpZCo9IlJlbGF0aW9uR3JvdXBJdGVtc18iXScpLmxlbmd0aD4wJiZkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwiLmNhcnRpbi1idG4ucmVsZWFzZWQtYnRuIixmdW5jdGlvbihlKXtpZihlLnRhcmdldCl7dmFyIG4scj10KGUudGFyZ2V0KTtpZihyLmNsb3Nlc3QoIi5yZWxhdGlvbi1ncm91cC1pdGVtLXJvdyIpLmxlbmd0aD4wKXdpbmRvdy5sb2NhdGlvbi5ocmVmPVQoKShuPXIuY2xvc2VzdCgiLml0ZW0tYmxvY2siKSkuY2FsbChuLCIuaXRlbS1pbmZvLWJsb2NrID4gYSIpLmF0dHIoImhyZWYiKXx8IiJ9fSkpLGR0Lm92ZXJyaWRlQ2xpY2tFdmVudCh0LCdhW2hyZWYkPSIvZWMvU2hvcHBpbmdCYWcvSXRlbUxpc3QiXScsZnVuY3Rpb24oKXtGZS5wYWdlVG8oImNhcnQiKX0pLHQoIi50b3BNb2R1bGVCb3gsIC5hcnRpc3RNYWluT25lQ29sdW1uLCAuc2VhcmNoTGlzdFRhYmxlIikubGVuZ3RoPjAmJmR0Lm92ZXJyaWRlQ2xpY2tFdmVudCh0LCdhW2hyZWYqPSJhY3Rpb249Y2FydGluIl0nLGZ1bmN0aW9uKGUpe2lmKGUudGFyZ2V0KXt2YXIgbixyPXQoZS50YXJnZXQpO2lmKHIuY2xvc2VzdCgiLmZlYXR1cmVJdGVtQ2FydFdyYXAwMSIpLmxlbmd0aD4wKXdpbmRvdy5sb2NhdGlvbi5ocmVmPVQoKShuPXIuY2xvc2VzdCgiLmZlYXR1cmVJdGVtQ2FydFdyYXAwMSIpKS5jYWxsKG4sIi5uYW1lOmZpcnN0LW9mLXR5cGUgPiBhIikuYXR0cigiaHJlZiIpfHwiIjtlbHNlIGlmKHIuY2xvc2VzdCgiLmFydGlzdFNlY3Rpb25MaW5lMDEiKS5sZW5ndGg+MCl7dmFyIG87d2luZG93LmxvY2F0aW9uLmhyZWY9VCgpKG89ci5jbG9zZXN0KCJsaSIpKS5jYWxsKG8sIi50aXRsZSA+IGEiKS5hdHRyKCJocmVmIil8fCIifWVsc2UgaWYoci5jbG9zZXN0KCIuaW5NZGwtZmVhdHVyZUl0ZW1DZWxsLCAuZGlzY29ncmFwaHlMaW5ldXBUYWJsZTAxIikubGVuZ3RoPjApe3ZhciBpO3dpbmRvdy5sb2NhdGlvbi5ocmVmPVQoKShpPXIuY2xvc2VzdCgiLmluTWRsLWZlYXR1cmVJdGVtQ2VsbCwgLmRpc2NvZ3JhcGh5TGluZXVwVGFibGUwMSIpKS5jYWxsKGksIi50aXRsZSA+IGEiKS5hdHRyKCJocmVmIil8fCIifWVsc2UgaWYoci5jbG9zZXN0KCIuZmVhdHVyZUl0ZW1PdGhlckxpc3QwMSIpLmxlbmd0aD4wKXt2YXIgYTt3aW5kb3cubG9jYXRpb24uaHJlZj1UKCkoYT1yLmNsb3Nlc3QoImxpIikpLmNhbGwoYSwiLmltZyA+IHAgPiBhIikuYXR0cigiaHJlZiIpfHwiIn1lbHNlIGlmKHIuY2xvc2VzdCgiLmluTWRsLWF0Y2xJdGVtUm93IikubGVuZ3RoPjApe3ZhciBzO3dpbmRvdy5sb2NhdGlvbi5ocmVmPVQoKShzPXIuY2xvc2VzdCgibGkiKSkuY2FsbChzLCIudGl0bGUgPiBhIikuYXR0cigiaHJlZiIpfHwiIn19fSx7ZGlzYWJsZVBvaW50ZXJFdmVudDohMH0pKSl9KTt2YXIgV2U9ZnVuY3Rpb24odCl7eCgpKG4sdCk7dmFyIGU9cWUobik7ZnVuY3Rpb24gbigpe3JldHVybiBkKCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gdigpKG4sW3trZXk6ImdldEl0ZW0iLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQsZSxyPXRoaXMsbz1tKCkoRSgpKG4ucHJvdG90eXBlKSwiZ2V0SXRlbSIsdGhpcykuY2FsbCh0aGlzKTtIZT9vLmltYWdlcz1wKCkodD10aGlzLiQoIiNqYWNrZXRQaG90b1N3aXBlciAubWFpbi1qYWNrZXQgaW1nIikuZ2V0KCkpLmNhbGwodCxmdW5jdGlvbih0KXtyZXR1cm4gci4kKHQpLmF0dHIoInNyYyIpfHwiIn0pOm8uaW1hZ2VzPXAoKShlPXRoaXMuJCgiI21haW4taW1hZ2UiKS5nZXQoKSkuY2FsbChlLGZ1bmN0aW9uKHQpe3JldHVybiByLiQodCkuYXR0cigic3JjIil8fCIifSk7cmV0dXJuIG99fSx7a2V5OiJnZXRJdGVtTmFtZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06IiI7cmV0dXJuIHRoaXMuJCgiI1ByaXZpbGVnZUFyZWEiKS5sZW5ndGg+MD90KyLvvIjnibnlhbjjgYLjgorvvIkiOnR9fSx7a2V5OiJnZXRJdGVtUHJpY2UiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOjAsZT10LG49dGhpcy4kKCIuc2FsZS1wcmljZS12YWx1ZSIpLHI9dGhpcy4kKCIubXVsdGlidXktcHJpY2UtbGFiZWwiKS50ZXh0KCk7cmV0dXJuIG4ubGVuZ3RoPjAmJigv44G+44Go44KB44Gm44Kq44OV5L6h5qC8Ly50ZXN0KHIpfHwoZT1DKG4udGV4dCgpKSkpLGV9fSx7a2V5OiJnZXRQdXJjaGFzYWJsZSIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIDAhPT10aGlzLiQoJy5jYXJ0aW4tYXJlYS1ub3dvbnNhbGVbb25jbGljayo9IkNhcnRJbiJdLCAuY2FydGluLWFyZWEtcmVzZXJ2ZVtvbmNsaWNrKj0iQ2FydEluIl0nKS5sZW5ndGh8fChhdC5hLmRlYnVnKCLjgqvjg7zjg4jjg5zjgr/jg7PjgYznhKHjgYTjgZ/jgoHjgIHos7zlhaXkuI3lj68iKSwhMSl9fV0pLG59KFgpLCRlPWZ1bmN0aW9uKHQpe3goKShuLHQpO3ZhciBlPXFlKG4pO2Z1bmN0aW9uIG4oKXtyZXR1cm4gZCgpKHRoaXMsbiksZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIG59KFdlKSxZZT1mdW5jdGlvbih0KXt4KCkobix0KTt2YXIgZT1xZShuKTtmdW5jdGlvbiBuKCl7cmV0dXJuIGQoKSh0aGlzLG4pLGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBufShXZSksVmU9ZnVuY3Rpb24odCl7eCgpKG4sdCk7dmFyIGU9cWUobik7ZnVuY3Rpb24gbigpe3JldHVybiBkKCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gbn0oQmUpO0ZlLmRpc2NvdmVyeShmdW5jdGlvbih0KXt2YXIgZT10LmNhbGxiYWNrLG49dC5sb2NhdGlvbjshZnVuY3Rpb24odCxlKXt2YXIgbj13aW5kb3cuemlnemFnO24mJm4udXRpbHMuZmV0Y2hIdG1sKHQsZSl9KGZ1bmN0aW9uKHQpe3RyeXtpZighemUpcmV0dXJuIGUoKTt2YXIgcixvPW5ldyBQZSh7ZGF0YTpGZS5zaG9wRGF0YXx8e319KS5leGVjdXRlKCk7aWYoSGUpe3I9bmV3ICRlKHskOnQsbmFtZToiLml0ZW0tamFja2V0LXRpdGxlIC5wcm9kdWN0LXRpdGxlIixwcmljZToiLml0ZW0taW5mbyAucHJpY2UtdmFsdWUifSkuZXhlY3V0ZSgpfWVsc2V7cj1uZXcgWWUoeyQ6dCxuYW1lOiIuaXRlbS1pbmZvIC5wcm9kdWN0LXRpdGxlIixwcmljZToiLnByaWNlLWluZm8tbWFpbiAucHJpY2UtdmFsdWUifSkuZXhlY3V0ZSgpfXZhciBpPW5ldyBWZSh7bG9jYXRpb246bixzY3JhcGVyUmVzdWx0OnIsZGF0YTpvLmV4Y2x1c2lvbn0pLmV4ZWN1dGUoKTtyZXR1cm4gZShudWxsLHtpdGVtOnIuaXRlbSxza3VSb3dzOnIuc2t1Um93cyxleGNsdXNpb246aX0pfWNhdGNoKHQpe3JldHVybiBlKHQpfX0pfSk7dmFyIEdlPW5ldyBEYXRlKCJNb24gRmViIDEgMjAyMSAwMDowMDowMCBHTVQrMDgwMCIpLEtlPW5ldyBEYXRlKCJTdW4gRmViIDI4IDIwMjEgMjM6NTk6NTkgR01UKzA4MDAiKSxYZT1uZXcgRGF0ZSgiTW9uIEZlYiAxIDIwMjEgMDA6MDA6MDAgR01UKzA4MDAiKSxKZT1uZXcgRGF0ZSgiU3VuIEZlYiAxNCAyMDIxIDIzOjU5OjU5IEdNVCswODAwIiksUWU9bmV3IERhdGUsWmU9UWUuZ2V0VGltZSgpPj1HZS5nZXRUaW1lKCkmJlFlLmdldFRpbWUoKTw9S2UuZ2V0VGltZSgpLHRuPVFlLmdldFRpbWUoKT49WGUuZ2V0VGltZSgpJiZRZS5nZXRUaW1lKCk8PUplLmdldFRpbWUoKSxlbj0vXnpoL2kudGVzdCh0dCgpKTtpZihaZSYmZW4/KEZlLmNhcnRNb2RhbChmdW5jdGlvbigpe3ZhciB0LGUsbixyPWplKCk7cmV0dXJue2JvdHRvbTp7aHRtbDpsKCkodD1sKCkoZT1sKCkobj0nXG4gICAgPGRpdiBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuMyAhaW1wb3J0YW50OyI+XG4gICAgPHAgc3R5bGU9ImNvbG9yOiByZWQgIWltcG9ydGFudDtmb250LXNpemU6IDAuN2VtICFpbXBvcnRhbnQ7bWFyZ2luOiAwICFpbXBvcnRhbnQ7Ij4nLmNvbmNhdChyKCJ0b3dlcl9qcC5jYXJ0LmJvdHRvbS50ZXh0MS5hbGVydCIpLCc8L3A+XG4gICAgPHVsIHN0eWxlPSJtYXJnaW46IDAuNGVtIDAgIWltcG9ydGFudDsiPlxuICAgIDxsaSBzdHlsZT0iZm9udC1zaXplOiAwLjdlbSAhaW1wb3J0YW50O3BhZGRpbmc6IDAgIWltcG9ydGFudDsiPicpKS5jYWxsKG4scigidG93ZXJfanAuY2FydC5ib3R0b20ubGluZTEiKSwnPC9saT5cbiAgICA8bGkgc3R5bGU9ImZvbnQtc2l6ZTogMC43ZW0gIWltcG9ydGFudDtwYWRkaW5nOiAwICFpbXBvcnRhbnQ7Ij4nKSkuY2FsbChlLHIoInRvd2VyX2pwLmNhcnQuYm90dG9tLmxpbmUyIiksJzwvbGk+XG4gICAgPC91bD5cbiAgICA8cCBzdHlsZT0iY29sb3I6IHJlZCAhaW1wb3J0YW50O2ZvbnQtc2l6ZTogMC43ZW0gIWltcG9ydGFudDttYXJnaW46IDAgIWltcG9ydGFudDsiPicpKS5jYWxsKHQscigidG93ZXJfanAuY2FydC5ib3R0b20udGV4dDIuYWxlcnQiKSwiIDwvcD5cbiAgICA8L2Rpdj5cbiAgICAiKX0sbWlkZGxlOntodG1sOidcbiAgICA8ZGl2IHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmUgIWltcG9ydGFudDsgbWFyZ2luOiAtMTZweCAwIDBweCAhaW1wb3J0YW50OyI+XG4gICAgPHNwYW4gc3R5bGU9IlxuICAgIGNvbnRlbnQ6IFwnXCcgIWltcG9ydGFudDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDtcbiAgICByaWdodDogMTNweCAhaW1wb3J0YW50O1xuICAgIHRvcDogLTExcHggIWltcG9ydGFudDtcbiAgICB3aWR0aDogMHB4ICFpbXBvcnRhbnQ7XG4gICAgaGVpZ2h0OiAwcHggIWltcG9ydGFudDtcbiAgICBtYXJnaW46IGF1dG8gIWltcG9ydGFudDtcbiAgICBib3JkZXItc3R5bGU6IHNvbGlkICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyOiA2cHggc29saWQgdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcbiAgICBib3JkZXItYm90dG9tOiA2cHggc29saWQgI2UzMzczOCAhaW1wb3J0YW50OyI+PC9zcGFuPlxuICAgIDxwIHN0eWxlPSJcbiAgICBmb250LXNpemU6IDEycHggIWltcG9ydGFudDtcbiAgICBjb2xvcjogI2RhNDg0OCAhaW1wb3J0YW50O1xuICAgIGxpbmUtaGVpZ2h0OiAxLjUgIWltcG9ydGFudDtcbiAgICBmb250LXdlaWdodDogYm9sZCAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDNweCAhaW1wb3J0YW50O1xuICAgIGJhY2tncm91bmQ6ICNmZmZlZmMgIWltcG9ydGFudDtcbiAgICBib3JkZXI6IHNvbGlkIDFweCAjZGE0ODQ4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZzogNHB4IDFlbSAhaW1wb3J0YW50O1xuICAgIHdoaXRlLXNwYWNlOiBwcmUtbGluZSAhaW1wb3J0YW50OyI+Jy5jb25jYXQocigidG93ZXJfanAuY2FydE1vZGFsLm1pZGRsZSIpLCI8L3A+XG4gICAgPC9kaXY+XG4gICAgIil9fX0pLEZlLmNoYXJnZXMoZnVuY3Rpb24odCl7dmFyIGU9dC5kZWZhdWx0Q2hhcmdlcztyZXR1cm4gdSgpKHUoKSh7fSxlKSx7cHVyY2hhc2VTZXJ2aWNlRmVlOjB9KX0pKTpGZS5jYXJ0TW9kYWwoZnVuY3Rpb24oKXt2YXIgdCxlLG4scj1qZSgpO3JldHVybntib3R0b206e2h0bWw6bCgpKHQ9bCgpKGU9bCgpKG49J1xuICA8ZGl2IHN0eWxlPSJsaW5lLWhlaWdodDogMS4zICFpbXBvcnRhbnQ7Ij5cbiAgPHAgc3R5bGU9ImNvbG9yOiByZWQgIWltcG9ydGFudDtmb250LXNpemU6IDAuN2VtICFpbXBvcnRhbnQ7bWFyZ2luOiAwICFpbXBvcnRhbnQ7Ij4nLmNvbmNhdChyKCJ0b3dlcl9qcC5jYXJ0LmJvdHRvbS50ZXh0MS5hbGVydCIpLCc8L3A+XG4gIDx1bCBzdHlsZT0ibWFyZ2luOiAwLjRlbSAwICFpbXBvcnRhbnQ7Ij5cbiAgPGxpIHN0eWxlPSJmb250LXNpemU6IDAuN2VtICFpbXBvcnRhbnQ7cGFkZGluZzogMCAhaW1wb3J0YW50OyI+JykpLmNhbGwobixyKCJ0b3dlcl9qcC5jYXJ0LmJvdHRvbS5saW5lMSIpLCc8L2xpPlxuICA8bGkgc3R5bGU9ImZvbnQtc2l6ZTogMC43ZW0gIWltcG9ydGFudDtwYWRkaW5nOiAwICFpbXBvcnRhbnQ7Ij4nKSkuY2FsbChlLHIoInRvd2VyX2pwLmNhcnQuYm90dG9tLmxpbmUyIiksJzwvbGk+XG4gIDwvdWw+XG4gIDxwIHN0eWxlPSJjb2xvcjogcmVkICFpbXBvcnRhbnQ7Zm9udC1zaXplOiAwLjdlbSAhaW1wb3J0YW50O21hcmdpbjogMCAhaW1wb3J0YW50OyI+JykpLmNhbGwodCxyKCJ0b3dlcl9qcC5jYXJ0LmJvdHRvbS50ZXh0Mi5hbGVydCIpLCIgPC9wPlxuICA8L2Rpdj5cbiAgIil9fX0pLHRuJiZlbil7aWYoRmUubm90aWNlTW9kYWwoZnVuY3Rpb24oKXt2YXIgdCxlLG4scixvPWplKCk7cmV0dXJuIEhlP3tqdW1ib3Ryb246e2h0bWw6bCgpKHQ9bCgpKGU9J1xuICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luOiA2cHggMCAwICFpbXBvcnRhbnQ7Ij5cbiAgICAgIDxkaXY+XG4gICAgICA8c3BhbiBzdHlsZT0ibWFyZ2luOiAzNHB4IDAgMCAhaW1wb3J0YW50OyBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyI+PGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvbm90aWNlTW9kYWxfbG9nby5wbmciIGFsdD0iV29ybGRTaG9wcGluZ8OXVE9XRVIgUkVDT1JEUyIgc3R5bGU9Im1heC13aWR0aDogNDAwcHggIWltcG9ydGFudDsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsiPjwvc3Bhbj5cbiAgICAgIDxoMSBzdHlsZT0iZm9udC1zaXplOiAyLjlyZW0gIWltcG9ydGFudDsiPicuY29uY2F0KG8oImNvbW1vbi5ub3RpY2VNb2RhbC5qdW1ib3Ryb24uaDEiKSwnPC9oMT5cbiAgICAgIDxoMiBzdHlsZT0iZm9udC1zaXplOiAxLjRyZW0gIWltcG9ydGFudDsiPicpKS5jYWxsKGUsbygiY29tbW9uLm5vdGljZU1vZGFsLmp1bWJvdHJvbi5oMiIpLCc8L2gyPlxuICAgICAgPGEgaHJlZj0iYWxpcGF5czovL3BsYXRmb3JtYXBpL3N0YXJ0YXBwP2FwcElkPTIwMTkxMDE3Njg0MTg3NTUiPlxuICAgICAgPGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvY2FtcGFpZ24tYmFubmVyLXNwXzIwMjEwMTIyLnBuZyIgc3R5bGU9IndpZHRoOiAxMDAlICFpbXBvcnRhbnQ7Ij5cbiAgICAgIDwvYT5cbiAgICAgIDxhIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsgY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7IiBocmVmPSJodHRwczovL3Rvd2VyLmpwL3NpdGUvaG93dG8vZm9yaW50ZXJuYXRpb25hbGN1c3RvbWVyIj5cbiAgICAgIDxzcGFuIHN0eWxlPSJkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICAgICAgICAgIGZvbnQtc2l6ZTogMS42cmVtICFpbXBvcnRhbnQ7XG4gICAgICAgICAgbWFyZ2luOiAxcmVtIGF1dG8gIWltcG9ydGFudDtcbiAgICAgICAgICBwYWRkaW5nOiAxcmVtICFpbXBvcnRhbnQ7XG4gICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQgIWltcG9ydGFudDtcbiAgICAgICAgICBtYXgtd2lkdGg6IDUwMHB4ICFpbXBvcnRhbnQ7XG4gICAgICAgICAgYm9yZGVyOiBzb2xpZCAjZmZjYTAwICFpbXBvcnRhbnQ7XG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmY2EwMCAhaW1wb3J0YW50O1xuICAgICAgICAgIGNvbG9yOiAjMDAwMDAwICFpbXBvcnRhbnQ7Ij4nKSkuY2FsbCh0LG8oInRvd2VyX2pwLm5vdGljZU1vZGFsLmp1bWJvdHJvbi50ZXh0IiksIjwvc3Bhbj5cbiAgICAgIDwvYT5cbiAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICAiKX19OntqdW1ib3Ryb246e2h0bWw6bCgpKG49bCgpKHI9J1xuICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luOiA2cHggMCAwICFpbXBvcnRhbnQ7Ij5cbiAgICAgIDxkaXY+XG4gICAgICA8c3BhbiBzdHlsZT0ibWFyZ2luOiAzNHB4IDAgMCAhaW1wb3J0YW50OyBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyI+PGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvbm90aWNlTW9kYWxfbG9nby5wbmciIGFsdD0iV29ybGRTaG9wcGluZ8OXVE9XRVIgUkVDT1JEUyIgc3R5bGU9Im1heC13aWR0aDogNDAwcHggIWltcG9ydGFudDsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsiPjwvc3Bhbj5cbiAgICAgIDxoMSBzdHlsZT0iZm9udC1zaXplOiAyLjlyZW0gIWltcG9ydGFudDsiPicuY29uY2F0KG8oImNvbW1vbi5ub3RpY2VNb2RhbC5qdW1ib3Ryb24uaDEiKSwnPC9oMT5cbiAgICAgIDxoMiBzdHlsZT0iZm9udC1zaXplOiAxLjRyZW0gIWltcG9ydGFudDsiPicpKS5jYWxsKHIsbygiY29tbW9uLm5vdGljZU1vZGFsLmp1bWJvdHJvbi5oMiIpLCc8L2gyPlxuICAgICAgPGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvY2FtcGFpZ24tYmFubmVyLXBjXzIwMjEwMTIyLnBuZyIgc3R5bGU9IndpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IG1heC13aWR0aDogMzgwcHggIWltcG9ydGFudDsiPlxuICAgICAgPGEgc3R5bGU9InRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50OyBjb2xvcjogYmxhY2sgIWltcG9ydGFudDsiIGhyZWY9Imh0dHBzOi8vdG93ZXIuanAvc2l0ZS9ob3d0by9mb3JpbnRlcm5hdGlvbmFsY3VzdG9tZXIiPlxuICAgICAgPHNwYW4gc3R5bGU9ImRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gICAgICAgIGZvbnQtc2l6ZTogMS42cmVtICFpbXBvcnRhbnQ7XG4gICAgICAgIG1hcmdpbjogMXJlbSBhdXRvICFpbXBvcnRhbnQ7XG4gICAgICAgIHBhZGRpbmc6IDFyZW0gIWltcG9ydGFudDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQgIWltcG9ydGFudDtcbiAgICAgICAgbWF4LXdpZHRoOiA1MDBweCAhaW1wb3J0YW50O1xuICAgICAgICBib3JkZXI6IHNvbGlkICNmZmNhMDAgIWltcG9ydGFudDtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmY2EwMCAhaW1wb3J0YW50O1xuICAgICAgICBjb2xvcjogIzAwMDAwMCAhaW1wb3J0YW50OyI+JykpLmNhbGwobixvKCJ0b3dlcl9qcC5ub3RpY2VNb2RhbC5qdW1ib3Ryb24udGV4dCIpLCI8L3NwYW4+XG4gICAgICA8L2E+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgIil9fX0pLHplKWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pdGVtLWluZm8tbWFpbiAuc3RvY2stc3RhdHVzIikubGVuZ3RoPjAmJiLjgYrlj5bjgorlr4TjgZsiPT09ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLml0ZW0taW5mby1tYWluIC5zdG9jay1zdGF0dXMiKVswXS50ZXh0Q29udGVudD9GZS5pdGVtTW9kYWwoZnVuY3Rpb24oKXt2YXIgdCxlLG49amUoKTtyZXR1cm4gSGU/e2JvdHRvbTp7aHRtbDpsKCkodD0nXG4gICAgICA8ZGl2PlxuICAgICAgPHAgc3R5bGU9ImNvbG9yOiByZWQgIWltcG9ydGFudDtcbiAgICAgICAgICBmb250LXNpemU6IDEycHggIWltcG9ydGFudDtcbiAgICAgICAgICBmb250LXdlaWdodDogYm9sZCAhaW1wb3J0YW50O1xuICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxICFpbXBvcnRhbnQ7XG4gICAgICAgICAgbWFyZ2luOiAwLjRlbSAwICFpbXBvcnRhbnQ7Ij4nLmNvbmNhdChuKCJ0b3dlcl9qcC5pdGVtLmJvdHRvbS50aXRsZSIpLCc8L3A+XG4gICAgICA8cCBzdHlsZT0iZm9udC1zaXplOiAxMXB4ICFpbXBvcnRhbnQ7XG4gICAgICAgICAgd2hpdGUtc3BhY2U6IHByZS1saW5lICFpbXBvcnRhbnQ7XG4gICAgICAgICAgbGluZS1oZWlnaHQ6IDEuMiAhaW1wb3J0YW50O1xuICAgICAgICAgIHBhZGRpbmctYm90dG9tOiAwLjJlbSAhaW1wb3J0YW50OyI+JykpLmNhbGwodCxuKCJ0b3dlcl9qcC5pdGVtLmJvdHRvbS50ZXh0IiksJzwvcD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGEgaHJlZj0iYWxpcGF5czovL3BsYXRmb3JtYXBpL3N0YXJ0YXBwP2FwcElkPTIwMTkxMDE3Njg0MTg3NTUiPlxuICAgICAgPGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvY2FtcGFpZ24tYmFubmVyLXNwXzIwMjEwMTIyLnBuZyIgc3R5bGU9IndpZHRoOiAxMDAlICFpbXBvcnRhbnQ7Ij5cbiAgICAgIDwvYT5cbiAgICAgICcpfX06e2JvdHRvbTp7aHRtbDpsKCkoZT0nXG4gICAgICA8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiAtMTVweCFpbXBvcnRhbnQ7Ij5cbiAgICAgIDxwIHN0eWxlPSJjb2xvcjogcmVkICFpbXBvcnRhbnQ7XG4gICAgICAgICAgZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7XG4gICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQgIWltcG9ydGFudDtcbiAgICAgICAgICBsaW5lLWhlaWdodDogMSAhaW1wb3J0YW50O1xuICAgICAgICAgIG1hcmdpbjogMC4xZW0gMCAhaW1wb3J0YW50OyI+Jy5jb25jYXQobigidG93ZXJfanAuaXRlbS5ib3R0b20udGl0bGUiKSwnPC9wPlxuICAgICAgPHAgc3R5bGU9ImZvbnQtc2l6ZTogMTBweCAhaW1wb3J0YW50O1xuICAgICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtbGluZSAhaW1wb3J0YW50O1xuICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxICFpbXBvcnRhbnQ7Ij4nKSkuY2FsbChlLG4oInRvd2VyX2pwLml0ZW0uYm90dG9tLnRleHQiKSwnPC9wPlxuICAgICAgPC9kaXY+XG4gICAgICA8aW1nIHNyYz0iaHR0cHM6Ly9zdGF0aWMtY29udGVudHMud29ybGRzaG9wcGluZy5qcC9zaG9wcy90b3dlcl9qcC9jYW1wYWlnbi1iYW5uZXItcGNfMjAyMTAxMjIucG5nIiBzdHlsZT0id2lkdGg6IDg1JSAhaW1wb3J0YW50OyBtYXgtd2lkdGg6IDI0MHB4ICFpbXBvcnRhbnQ7IG1hcmdpbi1ib3R0b206IC0xNXB4IWltcG9ydGFudDsiPlxuICAgICAgJyl9fX0pOkZlLml0ZW1Nb2RhbChmdW5jdGlvbigpe3JldHVybiBIZT97Ym90dG9tOntodG1sOidcbiAgICAgICAgICA8YSBocmVmPSJhbGlwYXlzOi8vcGxhdGZvcm1hcGkvc3RhcnRhcHA/YXBwSWQ9MjAxOTEwMTc2ODQxODc1NSI+XG4gICAgICAgICAgPGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvY2FtcGFpZ24tYmFubmVyLXNwXzIwMjEwMTIyLnBuZyIgc3R5bGU9IndpZHRoOiAxMDAlICFpbXBvcnRhbnQ7Ij5cbiAgICAgICAgICA8L2E+XG4gICAgICAgICAgJ319Ontib3R0b206e2h0bWw6J1xuICAgICAgICAgIDxpbWcgc3JjPSJodHRwczovL3N0YXRpYy1jb250ZW50cy53b3JsZHNob3BwaW5nLmpwL3Nob3BzL3Rvd2VyX2pwL2NhbXBhaWduLWJhbm5lci1wY18yMDIxMDEyMi5wbmciIHN0eWxlPSJ3aWR0aDogMTAwJSAhaW1wb3J0YW50OyBtYXgtd2lkdGg6IDQ4MHB4ICFpbXBvcnRhbnQ7Ij5cbiAgICAgICAgICAnfX19KTtGZS5sYXVuY2goZnVuY3Rpb24oKXt2YXIgdD0hc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgiU1RPUkFHRV9LRVlfcmFndGFnX2pwIik7cmV0dXJuIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oIlNUT1JBR0VfS0VZX3JhZ3RhZ19qcCIsYSgpKCEwKSksdD8ibm90aWNlIjpudWxsfSl9ZWxzZXtpZihGZS5ub3RpY2VNb2RhbChmdW5jdGlvbigpe3ZhciB0LGUsbj1qZSgpO3JldHVybntqdW1ib3Ryb246e2h0bWw6bCgpKHQ9bCgpKGU9J1xuICA8ZGl2IHN0eWxlPSJtYXJnaW46IDZweCAwIDAgIWltcG9ydGFudDsiPlxuICA8ZGl2PlxuICA8c3BhbiBzdHlsZT0ibWFyZ2luOiAzNHB4IDAgMCAhaW1wb3J0YW50OyBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyI+PGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvbm90aWNlTW9kYWxfbG9nby5wbmciIGFsdD0iV29ybGRTaG9wcGluZ8OXVE9XRVIgUkVDT1JEUyIgc3R5bGU9Im1heC13aWR0aDogNDAwcHggIWltcG9ydGFudDsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsiPjwvc3Bhbj5cbiAgPGgxIHN0eWxlPSJmb250LXNpemU6IDIuOXJlbSAhaW1wb3J0YW50OyI+Jy5jb25jYXQobigiY29tbW9uLm5vdGljZU1vZGFsLmp1bWJvdHJvbi5oMSIpLCc8L2gxPlxuICA8aDIgc3R5bGU9ImZvbnQtc2l6ZTogMS40cmVtICFpbXBvcnRhbnQ7Ij4nKSkuY2FsbChlLG4oImNvbW1vbi5ub3RpY2VNb2RhbC5qdW1ib3Ryb24uaDIiKSwnPC9oMj5cbiAgPGEgc3R5bGU9InRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50OyBjb2xvcjogYmxhY2sgIWltcG9ydGFudDsiIGhyZWY9Imh0dHBzOi8vdG93ZXIuanAvc2l0ZS9ob3d0by9mb3JpbnRlcm5hdGlvbmFsY3VzdG9tZXIiPlxuICA8c3BhbiBzdHlsZT0iZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgICAgIGZvbnQtc2l6ZTogMS42cmVtICFpbXBvcnRhbnQ7XG4gICAgICBtYXJnaW46IDFyZW0gYXV0byAhaW1wb3J0YW50O1xuICAgICAgcGFkZGluZzogMXJlbSAhaW1wb3J0YW50O1xuICAgICAgZm9udC13ZWlnaHQ6IGJvbGQgIWltcG9ydGFudDtcbiAgICAgIG1heC13aWR0aDogNTAwcHggIWltcG9ydGFudDtcbiAgICAgIGJvcmRlcjogc29saWQgI2ZmY2EwMCAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmY2EwMCAhaW1wb3J0YW50O1xuICAgICAgY29sb3I6ICMwMDAwMDAgIWltcG9ydGFudDsiPicpKS5jYWxsKHQsbigidG93ZXJfanAubm90aWNlTW9kYWwuanVtYm90cm9uLnRleHQiKSwiPC9zcGFuPlxuICA8L2E+XG4gIDwvZGl2PlxuICA8L2Rpdj5cbiAgIil9fX0pLHplKWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pdGVtLWluZm8tbWFpbiAuc3RvY2stc3RhdHVzIikubGVuZ3RoPjAmJiLjgYrlj5bjgorlr4TjgZsiPT09ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLml0ZW0taW5mby1tYWluIC5zdG9jay1zdGF0dXMiKVswXS50ZXh0Q29udGVudCYmRmUuaXRlbU1vZGFsKGZ1bmN0aW9uKCl7dmFyIHQsZT1qZSgpO3JldHVybntib3R0b206e2h0bWw6bCgpKHQ9J1xuICA8ZGl2PlxuICA8cCBzdHlsZT0iY29sb3I6IHJlZCAhaW1wb3J0YW50O1xuICAgICAgZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7XG4gICAgICBmb250LXdlaWdodDogYm9sZCAhaW1wb3J0YW50O1xuICAgICAgbGluZS1oZWlnaHQ6IDEgIWltcG9ydGFudDtcbiAgICAgIG1hcmdpbjogMC40ZW0gMCAhaW1wb3J0YW50OyI+Jy5jb25jYXQoZSgidG93ZXJfanAuaXRlbS5ib3R0b20udGl0bGUiKSwnPC9wPlxuICA8cCBzdHlsZT0iZm9udC1zaXplOiAxMXB4ICFpbXBvcnRhbnQ7XG4gICAgICB3aGl0ZS1zcGFjZTogcHJlLWxpbmUgIWltcG9ydGFudDtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxLjIgIWltcG9ydGFudDtcbiAgICAgIHBhZGRpbmctYm90dG9tOiAwLjJlbSAhaW1wb3J0YW50OyI+JykpLmNhbGwodCxlKCJ0b3dlcl9qcC5pdGVtLmJvdHRvbS50ZXh0IiksIjwvcD5cbiAgPC9kaXY+XG4gICIpfX19KX0vdG93ZXJzaGlidXlhXC5qcFwva3BvcC8udGVzdCh3aW5kb3cubG9jYXRpb24uaHJlZik/KEZlLmxhdW5jaChmdW5jdGlvbigpe3JldHVybiJiYW5uZXItaGlkZGVuIn0pLEZlLmJhbm5lcihmdW5jdGlvbigpe3JldHVybntoaWRkZW46e2h0bWw6J1xuPGEgaHJlZj0iaHR0cHM6Ly9iaXQubHkvMllVbEtUZCI+XG48ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiAjNjQ2NTY3ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZzogNHB4IDRweCAwICFpbXBvcnRhbnQ7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyICFpbXBvcnRhbnQ7XG4gICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XG4gICAgYm90dG9tOiAwICFpbXBvcnRhbnQ7XG4gICAgcmlnaHQ6IDEwcHggIWltcG9ydGFudDtcbiAgICBsZWZ0OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogMTBweCAxMHB4IDAgMCAhaW1wb3J0YW50OyI+XG4gICAgPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgICB3aWR0aDogNTBweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDZweCA3cHggNXB4IDdweCAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDZweCA2cHggMCAwICFpbXBvcnRhbnQ7Ij5cbiAgICA8aW1nIHNyYz0iaHR0cHM6Ly9jaGVja291dC1zdGF0aWMud29ybGRzaG9wcGluZy5qcC9pbWFnZXMvY29tbW9uL2Jhbm5lcl9oaWRkZW5faWNvbl9lbi5zdmciIGFsdD0iR2xvYmFsIFNoaXBwaW5nIiBzdHlsZT0id2lkdGg6IDUycHggIWltcG9ydGFudDsiPlxuICAgIDwvc3Bhbj5cbjwvZGl2PlxuPC9hPlxuJ319fSkpOi8odG93ZXJzaGlidXlhXC5qcCkvLnRlc3Qod2luZG93LmxvY2F0aW9uLmhyZWYpJiYoRmUubGF1bmNoKGZ1bmN0aW9uKCl7cmV0dXJuImJhbm5lci1oaWRkZW4ifSksRmUuYmFubmVyKGZ1bmN0aW9uKCl7cmV0dXJue2hpZGRlbjp7aHRtbDonXG48YSBocmVmPSJodHRwczovL2JpdC5seS8zZ0x1NHVBIj5cbjxkaXYgc3R5bGU9ImJhY2tncm91bmQ6ICM2NDY1NjcgIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiA0cHggNHB4IDAgIWltcG9ydGFudDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXIgIWltcG9ydGFudDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDtcbiAgICBib3R0b206IDAgIWltcG9ydGFudDtcbiAgICByaWdodDogMTBweCAhaW1wb3J0YW50O1xuICAgIGxlZnQ6IGF1dG8gIWltcG9ydGFudDtcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4IDEwcHggMCAwICFpbXBvcnRhbnQ7Ij5cbiAgICA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogd2hpdGUgIWltcG9ydGFudDtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICAgIHdpZHRoOiA1MHB4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZzogNnB4IDdweCA1cHggN3B4ICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogNnB4IDZweCAwIDAgIWltcG9ydGFudDsiPlxuICAgIDxpbWcgc3JjPSJodHRwczovL2NoZWNrb3V0LXN0YXRpYy53b3JsZHNob3BwaW5nLmpwL2ltYWdlcy9jb21tb24vYmFubmVyX2hpZGRlbl9pY29uX2VuLnN2ZyIgYWx0PSJHbG9iYWwgU2hpcHBpbmciIHN0eWxlPSJ3aWR0aDogNTJweCAhaW1wb3J0YW50OyI+XG4gICAgPC9zcGFuPlxuPC9kaXY+XG48L2E+XG4nfX19KSksLyhtaWtpa2lcLnRva3lvXC5qcFwvKS8udGVzdCh3aW5kb3cubG9jYXRpb24uaHJlZikmJihGZS5sYXVuY2goZnVuY3Rpb24oKXtyZXR1cm4iYmFubmVyLWhpZGRlbiJ9KSxGZS5iYW5uZXIoZnVuY3Rpb24oKXtyZXR1cm57aGlkZGVuOntodG1sOidcbjxhIGhyZWY9Imh0dHBzOi8vYml0Lmx5LzMxSU56MkwiPlxuPGRpdiBzdHlsZT0iYmFja2dyb3VuZDogIzY0NjU2NyAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDRweCA0cHggIWltcG9ydGFudDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXIgIWltcG9ydGFudDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDtcbiAgICBib3R0b206IDEzMHB4ICFpbXBvcnRhbnQ7XG4gICAgcmlnaHQ6IC0yM3B4ICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogMTBweCAwIDAgMTBweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctcmlnaHQ6IDAgIWltcG9ydGFudDsiPlxuICAgIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50O1xuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gICAgd2lkdGg6IDUwcHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiA2cHggMjBweCA2cHggN3B4ICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogNnB4IDAgMCA2cHggIWltcG9ydGFudDsiPlxuICAgIDxpbWcgc3JjPSJodHRwczovL2NoZWNrb3V0LXN0YXRpYy53b3JsZHNob3BwaW5nLmpwL2ltYWdlcy9jb21tb24vYmFubmVyX2hpZGRlbl9pY29uX2VuLnN2ZyIgYWx0PSJHbG9iYWwgU2hpcHBpbmciIHN0eWxlPSJ3aWR0aDogNTJweCAhaW1wb3J0YW50OyBib3JkZXItcmFkaXVzOiA2cHggMCAwIDZweCAhaW1wb3J0YW50OyI+XG4gICAgPC9zcGFuPlxuPC9kaXY+XG48L2E+XG4nfX19KSksLyh0b3dlclwuanBcL3x0b3dlcnNoaWJ1eWFcLmpwXC98bWlraWtpXC50b2t5b1wuanBcLykvLnRlc3Qod2luZG93LmxvY2F0aW9uLmhyZWYpJiZUZS5pbml0aWFsaXplKCkudGhlbihmdW5jdGlvbigpe3JldHVybiBGZS5ydW4oKX0pfV0pO30=
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
13.32.24.99 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-13-32-24-99.fra56.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
ca3d163bab055381827226140568f3bef7eaac187cebd76878e0b63e9e442356

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

x-amz-version-id
LP99qA9EAMLqCMMRUwJOQ5lo4sldS.Jg
via
1.1 ef4ff53b101ef123a46ec560b6c94cb8.cloudfront.net (CloudFront)
etag
"8a80554c91d9fca8acb82f023de02f11"
x-amz-cf-pop
FRA56-C2
x-cache
Error from cloudfront
access-control-max-age
300
x-amz-replication-status
COMPLETED
content-length
3
last-modified
Wed, 08 Apr 2020 15:53:18 GMT
server
AmazonS3
date
Tue, 02 Mar 2021 09:08:56 GMT
vary
Access-Control-Request-Headers,Access-Control-Request-Method
access-control-allow-methods
GET, HEAD
content-type
application/json
access-control-allow-origin
*
access-control-expose-headers
x-cache
cache-control
public, must-revalidate, proxy-revalidate, max-age=0
accept-ranges
bytes
x-amz-cf-id
AlC4IdydvaXq9VDPObS1pbkDOumMvKF0mjkfByQlSEFbqbMCZdJE9w==
default
api.locize.io/60ff8224-bbcc-4802-8d59-c8983deae8d0/production/en/
11 KB
3 KB
XHR
General
Full URL
https://api.locize.io/60ff8224-bbcc-4802-8d59-c8983deae8d0/production/en/default
Requested by
Host: text
URL: data:text/javascript;base64,ZnVuY3Rpb24gb25Mb2FkWmlnWmFnKCl7IWZ1bmN0aW9uKHQpe3ZhciBlPXt9O2Z1bmN0aW9uIG4ocil7aWYoZVtyXSlyZXR1cm4gZVtyXS5leHBvcnRzO3ZhciBvPWVbcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiB0W3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLG4pLG8ubD0hMCxvLmV4cG9ydHN9bi5tPXQsbi5jPWUsbi5kPWZ1bmN0aW9uKHQsZSxyKXtuLm8odCxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7ZW51bWVyYWJsZTohMCxnZXQ6cn0pfSxuLnI9ZnVuY3Rpb24odCl7InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKHQsZSl7aWYoMSZlJiYodD1uKHQpKSw4JmUpcmV0dXJuIHQ7aWYoNCZlJiYib2JqZWN0Ij09dHlwZW9mIHQmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkociwiZGVmYXVsdCIse2VudW1lcmFibGU6ITAsdmFsdWU6dH0pLDImZSYmInN0cmluZyIhPXR5cGVvZiB0KWZvcih2YXIgbyBpbiB0KW4uZChyLG8sZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19LmJpbmQobnVsbCxvKSk7cmV0dXJuIHJ9LG4ubj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0Ll9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gbi5kKGUsImEiLGUpLGV9LG4ubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sbi5wPSIvIixuKG4ucz0zMDIpfShbZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDUpLG89big0NSkuZixpPW4oODcpLGE9bigxKSxzPW4oMzIpLHU9bigxNyksYz1uKDE0KSxsPWZ1bmN0aW9uKHQpe3ZhciBlPWZ1bmN0aW9uKGUsbixyKXtpZih0aGlzIGluc3RhbmNlb2YgdCl7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHQ7Y2FzZSAxOnJldHVybiBuZXcgdChlKTtjYXNlIDI6cmV0dXJuIG5ldyB0KGUsbil9cmV0dXJuIG5ldyB0KGUsbixyKX1yZXR1cm4gdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3JldHVybiBlLnByb3RvdHlwZT10LnByb3RvdHlwZSxlfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbixmLHAsaCxkLGcsdix5LG09dC50YXJnZXQsYj10Lmdsb2JhbCx4PXQuc3RhdCx3PXQucHJvdG8saz1iP3I6eD9yW21dOihyW21dfHx7fSkucHJvdG90eXBlLFM9Yj9hOmFbbV18fChhW21dPXt9KSxFPVMucHJvdG90eXBlO2ZvcihwIGluIGUpbj0haShiP3A6bSsoeD8iLiI6IiMiKStwLHQuZm9yY2VkKSYmayYmYyhrLHApLGQ9U1twXSxuJiYoZz10Lm5vVGFyZ2V0R2V0Pyh5PW8oayxwKSkmJnkudmFsdWU6a1twXSksaD1uJiZnP2c6ZVtwXSxuJiZ0eXBlb2YgZD09dHlwZW9mIGh8fCh2PXQuYmluZCYmbj9zKGgscik6dC53cmFwJiZuP2woaCk6dyYmImZ1bmN0aW9uIj09dHlwZW9mIGg/cyhGdW5jdGlvbi5jYWxsLGgpOmgsKHQuc2hhbXx8aCYmaC5zaGFtfHxkJiZkLnNoYW0pJiZ1KHYsInNoYW0iLCEwKSxTW3BdPXYsdyYmKGMoYSxmPW0rIlByb3RvdHlwZSIpfHx1KGEsZix7fSksYVtmXVtwXT1oLHQucmVhbCYmRSYmIUVbcF0mJnUoRSxwLGgpKSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSksbz1uKDU4KSxpPW4oNzApLGE9big5NSkscz1yLlN5bWJvbCx1PW8oIndrcyIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdVt0XXx8KHVbdF09YSYmc1t0XXx8KGE/czppKSgiU3ltYm9sLiIrdCkpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE0Nyl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEpLG89bigxNCksaT1uKDc1KSxhPW4oMjMpLmY7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXIuU3ltYm9sfHwoci5TeW1ib2w9e30pO28oZSx0KXx8YShlLHQse3ZhbHVlOmkuZih0KX0pfX0sZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbihlKXt2YXIgbj0ib2JqZWN0IixyPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Lk1hdGg9PU1hdGgmJnR9O3QuZXhwb3J0cz1yKHR5cGVvZiBnbG9iYWxUaGlzPT1uJiZnbG9iYWxUaGlzKXx8cih0eXBlb2Ygd2luZG93PT1uJiZ3aW5kb3cpfHxyKHR5cGVvZiBzZWxmPT1uJiZzZWxmKXx8cih0eXBlb2YgZT09biYmZSl8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9KS5jYWxsKHRoaXMsbig4NSkpfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXt0cnl7cmV0dXJuISF0KCl9Y2F0Y2godCl7cmV0dXJuITB9fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0P251bGwhPT10OiJmdW5jdGlvbiI9PXR5cGVvZiB0fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMzYpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjEzKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCFyKHQpKXRocm93IFR5cGVFcnJvcihTdHJpbmcodCkrIiBpcyBub3QgYW4gb2JqZWN0Iik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNTQpO2Z1bmN0aW9uIG8odCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIG89ZVtuXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLHIodCxvLmtleSxvKX19dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZSYmbyh0LnByb3RvdHlwZSxlKSxuJiZvKHQsbiksdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpO3QuZXhwb3J0cz0hcihmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSl9LGZ1bmN0aW9uKHQsZSl7dmFyIG49e30uaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4uY2FsbCh0LGUpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTY3KSxvPW4oOTcpO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIHQuZXhwb3J0cz1pPW8/cjpmdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX198fHIodCl9LGkoZSl9dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMTcpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMyksbz1uKDIzKSxpPW4oMzEpO3QuZXhwb3J0cz1yP2Z1bmN0aW9uKHQsZSxuKXtyZXR1cm4gby5mKHQsZSxpKDEsbikpfTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHRbZV09bix0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiByW3QrIlByb3RvdHlwZSJdfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTc1KSxvPW4oMTc5KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9PWUpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTt0LnByb3RvdHlwZT1yKGUmJmUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksZSYmbyh0LGUpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE1MCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDY1KSxvPW4oNDYpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcihvKHQpKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IFR5cGVFcnJvcihTdHJpbmcodCkrIiBpcyBub3QgYSBmdW5jdGlvbiIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTMpLG89big4NiksaT1uKDExKSxhPW4oNTQpLHM9T2JqZWN0LmRlZmluZVByb3BlcnR5O2UuZj1yP3M6ZnVuY3Rpb24odCxlLG4pe2lmKGkodCksZT1hKGUsITApLGkobiksbyl0cnl7cmV0dXJuIHModCxlLG4pfWNhdGNoKHQpe31pZigiZ2V0ImluIG58fCJzZXQiaW4gbil0aHJvdyBUeXBlRXJyb3IoIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIik7cmV0dXJuInZhbHVlImluIG4mJih0W2VdPW4udmFsdWUpLHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0Nik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3Qocih0KSl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNjEpLG89bi5uKHIpO2Z1bmN0aW9uIGkodCl7dmFyIGU9d2luZG93LnppZ3phZztlJiZlLnV0aWxzLmRlYnVnTG9nZ2VyKCkobygpKHQpKX1lLmE9e2RlYnVnOmksZXJyb3I6ZnVuY3Rpb24odCl7dmFyIGU9d2luZG93LnppZ3phZztlJiZlLnV0aWxzJiZlLnV0aWxzLmVycm9yTG9nZ2VyJiZlLnV0aWxzLmVycm9yTG9nZ2VyKCkodCksaSh0KX19fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTQzKX0sZnVuY3Rpb24odCxlKXt2YXIgbj17fS50b1N0cmluZzt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG4uY2FsbCh0KS5zbGljZSg4LC0xKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPSEwfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMykuZixvPW4oMTcpLGk9bigxNCksYT1uKDE4Nykscz1uKDIpKCJ0b1N0cmluZ1RhZyIpLHU9YSE9PXt9LnRvU3RyaW5nO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixjKXtpZih0KXt2YXIgbD1uP3Q6dC5wcm90b3R5cGU7aShsLHMpfHxyKGwscyx7Y29uZmlndXJhYmxlOiEwLHZhbHVlOmV9KSxjJiZ1JiZvKGwsInRvU3RyaW5nIixhKX19fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm57ZW51bWVyYWJsZTohKDEmdCksY29uZmlndXJhYmxlOiEoMiZ0KSx3cml0YWJsZTohKDQmdCksdmFsdWU6ZX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtpZihyKHQpLHZvaWQgMD09PWUpcmV0dXJuIHQ7c3dpdGNoKG4pe2Nhc2UgMDpyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5jYWxsKGUpfTtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0LmNhbGwoZSxuKX07Y2FzZSAyOnJldHVybiBmdW5jdGlvbihuLHIpe3JldHVybiB0LmNhbGwoZSxuLHIpfTtjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKG4scixvKXtyZXR1cm4gdC5jYWxsKGUsbixyLG8pfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShlLGFyZ3VtZW50cyl9fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMSksbz1uKDUpLGk9ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp2b2lkIDB9O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/aShyW3RdKXx8aShvW3RdKTpyW3RdJiZyW3RdW2VdfHxvW3RdJiZvW3RdW2VdfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNjgpLG89TWF0aC5taW47dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0PjA/byhyKHQpLDkwMDcxOTkyNTQ3NDA5OTEpOjB9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTg0KS5jaGFyQXQsbz1uKDUwKSxpPW4oOTkpLGE9by5zZXQscz1vLmdldHRlckZvcigiU3RyaW5nIEl0ZXJhdG9yIik7aShTdHJpbmcsIlN0cmluZyIsZnVuY3Rpb24odCl7YSh0aGlzLHt0eXBlOiJTdHJpbmcgSXRlcmF0b3IiLHN0cmluZzpTdHJpbmcodCksaW5kZXg6MH0pfSxmdW5jdGlvbigpe3ZhciB0LGU9cyh0aGlzKSxuPWUuc3RyaW5nLG89ZS5pbmRleDtyZXR1cm4gbz49bi5sZW5ndGg/e3ZhbHVlOnZvaWQgMCxkb25lOiEwfToodD1yKG4sbyksZS5pbmRleCs9dC5sZW5ndGgse3ZhbHVlOnQsZG9uZTohMX0pfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sbyl7byYmby5lbnVtZXJhYmxlP3RbZV09bjpyKHQsZSxuKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE4MCksbz1uKDIxMik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIWV8fCJvYmplY3QiIT09cihlKSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU/byh0KTplfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIyNil9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMjcpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjI5KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIzMCl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMzEpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjM0KX0sZnVuY3Rpb24odCl7dC5leHBvcnRzPUpTT04ucGFyc2UoJ3sibG9jaXplIjp7InByb2R1Y3RJZCI6IjYwZmY4MjI0LWJiY2MtNDgwMi04ZDU5LWM4OTgzZGVhZThkMCIsImFwaUtleSI6IjczOTZlNzc4LTA5MDMtNGU3ZS04MjgyLWU2NzE1ODU4YmI4YyIsInZlcnNpb24iOiJwcm9kdWN0aW9uIn0sImludGVncmF0aW9ucyI6eyJjb2xvcm1lQXBwIjp7ImFwaSI6eyJwcm9kdWN0IjoiaHR0cHM6Ly9jb2xvcm1lLndvcmxkc2hvcHBpbmcuanAvdjEvcHJvZHVjdCJ9fSwic2hvcGlmeUFwcCI6eyJhcGkiOnsicHJvZHVjdCI6Imh0dHBzOi8vYXBwLXMud29ybGRzaG9wcGluZy5qcC92MS9wcm9kdWN0In19fSwibGFtYmRhIjp7ImNyZWF0ZSI6InNob3AtZGF0YS1wcm9kLWNyZWF0ZSIsImNsZWFyIjoic2hvcC1kYXRhLXByb2QtY2xlYXIifSwic2ZkYyI6eyJjb25uZWN0aW9uU2V0dGluZ3NQYXRoIjoiL3NmZGMvcHJvZC9hcGkifSwiZGVidWdIb3N0cyI6WyJzaG9wLWRhc2hib2FyZC53b3JsZHNob3BwaW5nLmJpeiIsInNob3AtZGFzaGJvYXJkLWRldi53b3JsZHNob3BwaW5nLmJpeiIsInNob3AtZGFzaGJvYXJkLWxvY2FsLndvcmxkc2hvcHBpbmcuYml6Il19Jyl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEzKSxvPW4oNjQpLGk9bigzMSksYT1uKDIxKSxzPW4oNTQpLHU9bigxNCksYz1uKDg2KSxsPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7ZS5mPXI/bDpmdW5jdGlvbih0LGUpe2lmKHQ9YSh0KSxlPXMoZSwhMCksYyl0cnl7cmV0dXJuIGwodCxlKX1jYXRjaCh0KXt9aWYodSh0LGUpKXJldHVybiBpKCFvLmYuY2FsbCh0LGUpLHRbZV0pfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYobnVsbD09dCl0aHJvdyBUeXBlRXJyb3IoIkNhbid0IGNhbGwgbWV0aG9kIG9uICIrdCk7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMSksbz1uKDEzOSksaT1uKDY5KSxhPW4oNTYpLHM9big5MCksdT1uKDY2KSxjPW4oNTcpKCJJRV9QUk9UTyIpLGw9ZnVuY3Rpb24oKXt9LGY9ZnVuY3Rpb24oKXt2YXIgdCxlPXUoImlmcmFtZSIpLG49aS5sZW5ndGg7Zm9yKGUuc3R5bGUuZGlzcGxheT0ibm9uZSIscy5hcHBlbmRDaGlsZChlKSxlLnNyYz1TdHJpbmcoImphdmFzY3JpcHQ6IiksKHQ9ZS5jb250ZW50V2luZG93LmRvY3VtZW50KS5vcGVuKCksdC53cml0ZSgiPHNjcmlwdD5kb2N1bWVudC5GPU9iamVjdDxcL3NjcmlwdD4iKSx0LmNsb3NlKCksZj10LkY7bi0tOylkZWxldGUgZi5wcm90b3R5cGVbaVtuXV07cmV0dXJuIGYoKX07dC5leHBvcnRzPU9iamVjdC5jcmVhdGV8fGZ1bmN0aW9uKHQsZSl7dmFyIG47cmV0dXJuIG51bGwhPT10PyhsLnByb3RvdHlwZT1yKHQpLG49bmV3IGwsbC5wcm90b3R5cGU9bnVsbCxuW2NdPXQpOm49ZigpLHZvaWQgMD09PWU/bjpvKG4sZSl9LGFbY109ITB9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI3KTt0LmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24odCl7cmV0dXJuIkFycmF5Ij09cih0KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0KSxvPW4oMjQpLGk9big1NyksYT1uKDk2KSxzPWkoIklFX1BST1RPIiksdT1PYmplY3QucHJvdG90eXBlO3QuZXhwb3J0cz1hP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbih0KXtyZXR1cm4gdD1vKHQpLHIodCxzKT90W3NdOiJmdW5jdGlvbiI9PXR5cGVvZiB0LmNvbnN0cnVjdG9yJiZ0IGluc3RhbmNlb2YgdC5jb25zdHJ1Y3Rvcj90LmNvbnN0cnVjdG9yLnByb3RvdHlwZTp0IGluc3RhbmNlb2YgT2JqZWN0P3U6bnVsbH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGksYT1uKDE4NSkscz1uKDUpLHU9big3KSxjPW4oMTcpLGw9bigxNCksZj1uKDU3KSxwPW4oNTYpLGg9cy5XZWFrTWFwO2lmKGEpe3ZhciBkPW5ldyBoLGc9ZC5nZXQsdj1kLmhhcyx5PWQuc2V0O3I9ZnVuY3Rpb24odCxlKXtyZXR1cm4geS5jYWxsKGQsdCxlKSxlfSxvPWZ1bmN0aW9uKHQpe3JldHVybiBnLmNhbGwoZCx0KXx8e319LGk9ZnVuY3Rpb24odCl7cmV0dXJuIHYuY2FsbChkLHQpfX1lbHNle3ZhciBtPWYoInN0YXRlIik7cFttXT0hMCxyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGModCxtLGUpLGV9LG89ZnVuY3Rpb24odCl7cmV0dXJuIGwodCxtKT90W21dOnt9fSxpPWZ1bmN0aW9uKHQpe3JldHVybiBsKHQsbSl9fXQuZXhwb3J0cz17c2V0OnIsZ2V0Om8saGFzOmksZW5mb3JjZTpmdW5jdGlvbih0KXtyZXR1cm4gaSh0KT9vKHQpOnIodCx7fSl9LGdldHRlckZvcjpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG47aWYoIXUoZSl8fChuPW8oZSkpLnR5cGUhPT10KXRocm93IFR5cGVFcnJvcigiSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAiK3QrIiByZXF1aXJlZCIpO3JldHVybiBufX19fSxmdW5jdGlvbih0LGUsbil7bigxMDIpO3ZhciByPW4oMTg4KSxvPW4oNSksaT1uKDE3KSxhPW4oMzApLHM9bigyKSgidG9TdHJpbmdUYWciKTtmb3IodmFyIHUgaW4gcil7dmFyIGM9b1t1XSxsPWMmJmMucHJvdG90eXBlO2wmJiFsW3NdJiZpKGwscyx1KSxhW3VdPWEuQXJyYXl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big3Niksbz1uKDMwKSxpPW4oMikoIml0ZXJhdG9yIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKG51bGwhPXQpcmV0dXJuIHRbaV18fHRbIkBAaXRlcmF0b3IiXXx8b1tyKHQpXX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyMiksbz1mdW5jdGlvbih0KXt2YXIgZSxuO3RoaXMucHJvbWlzZT1uZXcgdChmdW5jdGlvbih0LHIpe2lmKHZvaWQgMCE9PWV8fHZvaWQgMCE9PW4pdGhyb3cgVHlwZUVycm9yKCJCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvciIpO2U9dCxuPXJ9KSx0aGlzLnJlc29sdmU9cihlKSx0aGlzLnJlamVjdD1yKG4pfTt0LmV4cG9ydHMuZj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IG8odCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZighcih0KSlyZXR1cm4gdDt2YXIgbixvO2lmKGUmJiJmdW5jdGlvbiI9PXR5cGVvZihuPXQudG9TdHJpbmcpJiYhcihvPW4uY2FsbCh0KSkpcmV0dXJuIG87aWYoImZ1bmN0aW9uIj09dHlwZW9mKG49dC52YWx1ZU9mKSYmIXIobz1uLmNhbGwodCkpKXJldHVybiBvO2lmKCFlJiYiZnVuY3Rpb24iPT10eXBlb2Yobj10LnRvU3RyaW5nKSYmIXIobz1uLmNhbGwodCkpKXJldHVybiBvO3Rocm93IFR5cGVFcnJvcigiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIil9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big4OCksbz1uKDY5KTt0LmV4cG9ydHM9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKHQpe3JldHVybiByKHQsbyl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNTgpLG89big3MCksaT1yKCJrZXlzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpW3RdfHwoaVt0XT1vKHQpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpLG89bigxNDApLGk9bigyOCksYT1yWyJfX2NvcmUtanNfc2hhcmVkX18iXXx8bygiX19jb3JlLWpzX3NoYXJlZF9fIix7fSk7KHQuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBhW3RdfHwoYVt0XT12b2lkIDAhPT1lP2U6e30pfSkoInZlcnNpb25zIixbXSkucHVzaCh7dmVyc2lvbjoiMy4yLjAiLG1vZGU6aT8icHVyZSI6Imdsb2JhbCIsY29weXJpZ2h0OiLCqSAyMDE5IERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpIn0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMSksbz1uKDExMiksaT1uKDM0KSxhPW4oMzIpLHM9big1MiksdT1uKDExMSksYz1mdW5jdGlvbih0LGUpe3RoaXMuc3RvcHBlZD10LHRoaXMucmVzdWx0PWV9Oyh0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sbCxmKXt2YXIgcCxoLGQsZyx2LHksbT1hKGUsbixsPzI6MSk7aWYoZilwPXQ7ZWxzZXtpZigiZnVuY3Rpb24iIT10eXBlb2YoaD1zKHQpKSl0aHJvdyBUeXBlRXJyb3IoIlRhcmdldCBpcyBub3QgaXRlcmFibGUiKTtpZihvKGgpKXtmb3IoZD0wLGc9aSh0Lmxlbmd0aCk7Zz5kO2QrKylpZigodj1sP20ocih5PXRbZF0pWzBdLHlbMV0pOm0odFtkXSkpJiZ2IGluc3RhbmNlb2YgYylyZXR1cm4gdjtyZXR1cm4gbmV3IGMoITEpfXA9aC5jYWxsKHQpfWZvcig7ISh5PXAubmV4dCgpKS5kb25lOylpZigodj11KHAsbSx5LnZhbHVlLGwpKSYmdiBpbnN0YW5jZW9mIGMpcmV0dXJuIHY7cmV0dXJuIG5ldyBjKCExKX0pLnN0b3A9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBjKCEwLHQpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybntlcnJvcjohMSx2YWx1ZTp0KCl9fWNhdGNoKHQpe3JldHVybntlcnJvcjohMCx2YWx1ZTp0fX19fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTQxKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIzNyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyODUpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPXt9LnByb3BlcnR5SXNFbnVtZXJhYmxlLG89T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixpPW8mJiFyLmNhbGwoezE6Mn0sMSk7ZS5mPWk/ZnVuY3Rpb24odCl7dmFyIGU9byh0aGlzLHQpO3JldHVybiEhZSYmZS5lbnVtZXJhYmxlfTpyfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2KSxvPW4oMjcpLGk9IiIuc3BsaXQ7dC5leHBvcnRzPXIoZnVuY3Rpb24oKXtyZXR1cm4hT2JqZWN0KCJ6IikucHJvcGVydHlJc0VudW1lcmFibGUoMCl9KT9mdW5jdGlvbih0KXtyZXR1cm4iU3RyaW5nIj09byh0KT9pLmNhbGwodCwiIik6T2JqZWN0KHQpfTpPYmplY3R9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpLG89big3KSxpPXIuZG9jdW1lbnQsYT1vKGkpJiZvKGkuY3JlYXRlRWxlbWVudCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBhP2kuY3JlYXRlRWxlbWVudCh0KTp7fX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIxKSxvPW4oMzQpLGk9big4OSksYT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLGEpe3ZhciBzLHU9cihlKSxjPW8odS5sZW5ndGgpLGw9aShhLGMpO2lmKHQmJm4hPW4pe2Zvcig7Yz5sOylpZigocz11W2wrK10pIT1zKXJldHVybiEwfWVsc2UgZm9yKDtjPmw7bCsrKWlmKCh0fHxsIGluIHUpJiZ1W2xdPT09bilyZXR1cm4gdHx8bHx8MDtyZXR1cm4hdCYmLTF9fTt0LmV4cG9ydHM9e2luY2x1ZGVzOmEoITApLGluZGV4T2Y6YSghMSl9fSxmdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguY2VpbCxyPU1hdGguZmxvb3I7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpc05hTih0PSt0KT8wOih0PjA/cjpuKSh0KX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPVsiY29uc3RydWN0b3IiLCJoYXNPd25Qcm9wZXJ0eSIsImlzUHJvdG90eXBlT2YiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInRvTG9jYWxlU3RyaW5nIiwidG9TdHJpbmciLCJ2YWx1ZU9mIl19LGZ1bmN0aW9uKHQsZSl7dmFyIG49MCxyPU1hdGgucmFuZG9tKCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiJTeW1ib2woIitTdHJpbmcodm9pZCAwPT09dD8iIjp0KSsiKV8iKygrK24rcikudG9TdHJpbmcoMzYpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDU0KSxvPW4oMjMpLGk9bigzMSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgYT1yKGUpO2EgaW4gdD9vLmYodCxhLGkoMCxuKSk6dFthXT1ufX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNiksbz1uKDIpKCJzcGVjaWVzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiFyKGZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuKGUuY29uc3RydWN0b3I9e30pW29dPWZ1bmN0aW9uKCl7cmV0dXJue2ZvbzoxfX0sMSE9PWVbdF0oQm9vbGVhbikuZm9vfSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzMiksbz1uKDY1KSxpPW4oMjQpLGE9bigzNCkscz1uKDk0KSx1PVtdLnB1c2gsYz1mdW5jdGlvbih0KXt2YXIgZT0xPT10LG49Mj09dCxjPTM9PXQsbD00PT10LGY9Nj09dCxwPTU9PXR8fGY7cmV0dXJuIGZ1bmN0aW9uKGgsZCxnLHYpe2Zvcih2YXIgeSxtLGI9aShoKSx4PW8oYiksdz1yKGQsZywzKSxrPWEoeC5sZW5ndGgpLFM9MCxFPXZ8fHMsaj1lP0UoaCxrKTpuP0UoaCwwKTp2b2lkIDA7az5TO1MrKylpZigocHx8UyBpbiB4KSYmKG09dyh5PXhbU10sUyxiKSx0KSlpZihlKWpbU109bTtlbHNlIGlmKG0pc3dpdGNoKHQpe2Nhc2UgMzpyZXR1cm4hMDtjYXNlIDU6cmV0dXJuIHk7Y2FzZSA2OnJldHVybiBTO2Nhc2UgMjp1LmNhbGwoaix5KX1lbHNlIGlmKGwpcmV0dXJuITE7cmV0dXJuIGY/LTE6Y3x8bD9sOmp9fTt0LmV4cG9ydHM9e2ZvckVhY2g6YygwKSxtYXA6YygxKSxmaWx0ZXI6YygyKSxzb21lOmMoMyksZXZlcnk6Yyg0KSxmaW5kOmMoNSksZmluZEluZGV4OmMoNil9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMSksbz1uKDE3NCk7dC5leHBvcnRzPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8KCJfX3Byb3RvX18iaW57fT9mdW5jdGlvbigpe3ZhciB0LGU9ITEsbj17fTt0cnl7KHQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QucHJvdG90eXBlLCJfX3Byb3RvX18iKS5zZXQpLmNhbGwobixbXSksZT1uIGluc3RhbmNlb2YgQXJyYXl9Y2F0Y2godCl7fXJldHVybiBmdW5jdGlvbihuLGkpe3JldHVybiByKG4pLG8oaSksZT90LmNhbGwobixpKTpuLl9fcHJvdG9fXz1pLG59fSgpOnZvaWQgMCl9LGZ1bmN0aW9uKHQsZSxuKXtlLmY9bigyKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjcpLG89bigyKSgidG9TdHJpbmdUYWciKSxpPSJBcmd1bWVudHMiPT1yKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlLG4sYTtyZXR1cm4gdm9pZCAwPT09dD8iVW5kZWZpbmVkIjpudWxsPT09dD8iTnVsbCI6InN0cmluZyI9PXR5cGVvZihuPWZ1bmN0aW9uKHQsZSl7dHJ5e3JldHVybiB0W2VdfWNhdGNoKHQpe319KGU9T2JqZWN0KHQpLG8pKT9uOmk/cihlKToiT2JqZWN0Ij09KGE9cihlKSkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNhbGxlZT8iQXJndW1lbnRzIjphfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz0iXHRcblx2XGZcciDCoOGagOKAgOKAgeKAguKAg+KAhOKAheKAhuKAh+KAiOKAieKAiuKAr+KBn+OAgFx1MjAyOFx1MjAyOVx1ZmVmZiJ9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDMzKTt0LmV4cG9ydHM9cigibmF2aWdhdG9yIiwidXNlckFnZW50Iil8fCIifSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjIyKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0Nyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNjMpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNzMpLG89bigyNzYpLGk9bigyODEpLGE9bigyODQpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcih0KXx8byh0KXx8aSh0KXx8YSgpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjsoZnVuY3Rpb24odCl7bi5kKGUsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIFJ9KSxuLmQoZSwiYiIsZnVuY3Rpb24oKXtyZXR1cm4gUH0pO3ZhciByPW4oMzgpLG89bi5uKHIpLGk9bigzOSksYT1uLm4oaSkscz1uKDQwKSx1PW4ubihzKSxjPW4oNDEpLGw9bi5uKGMpLGY9big0MikscD1uLm4oZiksaD1uKDQzKSxkPW4ubihoKSxnPW4oMTM0KSx2PW4ubihnKSx5PW4oNjMpLG09bi5uKHkpLGI9bigxNikseD1uLm4oYiksdz1uKDgpLGs9bi5uKHcpLFM9bigxMiksRT1uLm4oUyksaj1uKDEzNSksVD1uLm4oaiksTz1uKDI1KSxBPW4oNDQpO2Z1bmN0aW9uIEModCxlKXt2YXIgbjtpZih2b2lkIDA9PT1sLmF8fG51bGw9PXUoKSh0KSl7aWYoYSgpKHQpfHwobj1mdW5jdGlvbih0LGUpe3ZhciBuO2lmKCF0KXJldHVybjtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIEwodCxlKTt2YXIgcj1kKCkobj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpLmNhbGwobiw4LC0xKTsiT2JqZWN0Ij09PXImJnQuY29uc3RydWN0b3ImJihyPXQuY29uc3RydWN0b3IubmFtZSk7aWYoIk1hcCI9PT1yfHwiU2V0Ij09PXIpcmV0dXJuIHAoKSh0KTtpZigiQXJndW1lbnRzIj09PXJ8fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHIpKXJldHVybiBMKHQsZSl9KHQpKXx8ZSYmdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCl7biYmKHQ9bik7dmFyIHI9MCxpPWZ1bmN0aW9uKCl7fTtyZXR1cm57czppLG46ZnVuY3Rpb24oKXtyZXR1cm4gcj49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbcisrXX19LGU6ZnVuY3Rpb24odCl7dGhyb3cgdH0sZjppfX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIHMsYz0hMCxmPSExO3JldHVybntzOmZ1bmN0aW9uKCl7bj1vKCkodCl9LG46ZnVuY3Rpb24oKXt2YXIgdD1uLm5leHQoKTtyZXR1cm4gYz10LmRvbmUsdH0sZTpmdW5jdGlvbih0KXtmPSEwLHM9dH0sZjpmdW5jdGlvbigpe3RyeXtjfHxudWxsPT1uLnJldHVybnx8bi5yZXR1cm4oKX1maW5hbGx5e2lmKGYpdGhyb3cgc319fX1mdW5jdGlvbiBMKHQsZSl7KG51bGw9PWV8fGU+dC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkoZSk7bjxlO24rKylyW25dPXRbbl07cmV0dXJuIHJ9dmFyIFI9e2NvZGU6Ik5PTkUifSxQPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXt2YXIgbj10aGlzLHI9dC5zY3JhcGVyUmVzdWx0LG89dC5sb2NhdGlvbixpPXQuZGF0YTtrKCkodGhpcyxlKSx0aGlzLmV4Y2x1ZGVCeVNjcmFwZXJFcnJvcj1mdW5jdGlvbigpe3ZhciB0PW4uc2NyYXBlclJlc3VsdDtyZXR1cm4gdC5lcnJvcj97Y29kZToiRVJST1IiLG1lc3NhZ2U6ImV4Y2x1ZGVCeVNjcmFwZXJFcnJvcjogIi5jb25jYXQodC5lcnJvcil9OnQuaXRlbT8odC5za3VSb3dzfHwodC5za3VSb3dzPVtdKSxSKTp7Y29kZToiRVJST1IiLG1lc3NhZ2U6ImV4Y2x1ZGVCeVNjcmFwZXJFcnJvcjogbm8gaXRlbSJ9fSx0aGlzLmV4Y2x1ZGVCeU5vdFB1cmNoYXNhYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIG4uc2NyYXBlclJlc3VsdC5wdXJjaGFzYWJsZT9SOntjb2RlOiJOT1RfUFVSQ0hBU0FCTEUiLG1lc3NhZ2U6ImV4Y2x1ZGVCeU5vdFB1cmNoYXNhYmxlIn19LHRoaXMuZXhjbHVkZUJ5U2t1WmVybz1mdW5jdGlvbigpe3JldHVybiBuLnNjcmFwZXJSZXN1bHQuc2t1Um93cyYmMD09PW4uc2NyYXBlclJlc3VsdC5za3VSb3dzLmxlbmd0aD97Y29kZToiTk9UX1BVUkNIQVNBQkxFIixtZXNzYWdlOiJleGNsdWRlQnlTa3VaZXJvIn06Un0sdGhpcy5leGNsdWRlQnlVcmw9ZnVuY3Rpb24oKXtpZigwPT09bi5ieVVybC5sZW5ndGgpcmV0dXJuIFI7dmFyIHQ9ZS53aW5kb3dMb2NhdGlvbkhyZWY7cmV0dXJuIG4uZXhjbHVkZShuLmJ5VXJsLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIG5ldyBSZWdFeHAoIl4iLmNvbmNhdChUKCkoeCgpKG49ZS51cmwpLmNhbGwobikpKSkudGVzdCh0KX0pfSx0aGlzLmV4Y2x1ZGVCeUl0ZW1OYW1lPWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlJdGVtTmFtZS5sZW5ndGgpcmV0dXJuIFI7dmFyIHQ9bi5zY3JhcGVyUmVzdWx0Lml0ZW0mJm4uc2NyYXBlclJlc3VsdC5pdGVtLm5hbWV8fCIiO3JldHVybiBuLmV4Y2x1ZGUobi5ieUl0ZW1OYW1lLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIG5ldyBSZWdFeHAoIl4iLmNvbmNhdCh4KCkobj1lLml0ZW1OYW1lKS5jYWxsKG4pKSkudGVzdCh0KX0pfSx0aGlzLmV4Y2x1ZGVCeUl0ZW1Db2RlPWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlJdGVtQ29kZS5sZW5ndGgpcmV0dXJuIFI7dmFyIHQ9bi5zY3JhcGVyUmVzdWx0Lml0ZW0mJm4uc2NyYXBlclJlc3VsdC5pdGVtLmNvZGV8fCIiO3JldHVybiBuLmV4Y2x1ZGUobi5ieUl0ZW1Db2RlLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIHgoKShuPWUuaXRlbUNvZGUpLmNhbGwobik9PT10fSl9LHRoaXMuZXhjbHVkZUJ5Q2F0ZWdvcnk9ZnVuY3Rpb24oKXtpZigwPT09bi5ieUNhdGVnb3J5Lmxlbmd0aClyZXR1cm4gUjt2YXIgdD1uLnNjcmFwZXJSZXN1bHQuaXRlbSYmbi5zY3JhcGVyUmVzdWx0Lml0ZW0uY2F0ZWdvcnl8fCIiO3JldHVybiBuLmV4Y2x1ZGUobi5ieUNhdGVnb3J5LHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIHgoKShuPWUuY2F0ZWdvcnkpLmNhbGwobik9PT10fSl9LHRoaXMuZXhjbHVkZUJ5SXRlbURlc2NyaXB0aW9uPWZ1bmN0aW9uKCl7aWYoMD09PW4uYnlJdGVtRGVzY3JpcHRpb24ubGVuZ3RoKXJldHVybiBSO3ZhciB0PW4uc2NyYXBlclJlc3VsdC5pdGVtJiZuLnNjcmFwZXJSZXN1bHQuaXRlbS5kZXNjcmlwdGlvbnx8IiI7cmV0dXJuIG4uZXhjbHVkZShuLmJ5SXRlbURlc2NyaXB0aW9uLHQsZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIG5ldyBSZWdFeHAoIiIuY29uY2F0KHgoKShuPWUudGV4dCkuY2FsbChuKSkpLnRlc3QodCl9KX0sdGhpcy5leGVjdXRlPWZ1bmN0aW9uKCl7dmFyIHQ9ITEsZT1bXSxyPW4uZXhjbHVkZUJ5U2NyYXBlckVycm9yKCk7aWYoIk5PTkUiIT09ci5jb2RlKXJldHVybntpc0V4Y2x1ZGVkOiEwLHJlYXNvbnM6W3JdfTsiTk9ORSIhPT0ocj1uLmV4Y2x1ZGVCeU5vdFB1cmNoYXNhYmxlKCkpLmNvZGUmJih0PSEwLGUucHVzaChyKSk7dmFyIG8saT1DKG4uY29uZmlndXJlRXhjbHVzaW9uTWV0aG9kcyhbbi5leGNsdWRlQnlVcmwsbi5leGNsdWRlQnlJdGVtTmFtZSxuLmV4Y2x1ZGVCeUl0ZW1Db2RlLG4uZXhjbHVkZUJ5Q2F0ZWdvcnksbi5leGNsdWRlQnlJdGVtRGVzY3JpcHRpb25dKSk7dHJ5e2ZvcihpLnMoKTshKG89aS5uKCkpLmRvbmU7KXt2YXIgYT0oMCxvLnZhbHVlKSgpO2lmKCJOT05FIiE9PWEuY29kZSYmKHQ9ITAsZS5wdXNoKGEpKSwiRVJST1IiPT09YS5jb2RlKWJyZWFrfX1jYXRjaCh0KXtpLmUodCl9ZmluYWxseXtpLmYoKX1yZXR1cm57aXNFeGNsdWRlZDp0LHJlYXNvbnM6ZX19LHRoaXMuc2NyYXBlclJlc3VsdD1yLHRoaXMubG9jYXRpb249byx0aGlzLmRhdGE9aSx0aGlzLmJ5VXJsPWkuYnlVcmwsdGhpcy5ieUl0ZW1OYW1lPWkuYnlJdGVtTmFtZSx0aGlzLmJ5SXRlbUNvZGU9aS5ieUl0ZW1Db2RlLHRoaXMuYnlDYXRlZ29yeT1pLmJ5Q2F0ZWdvcnksdGhpcy5ieUl0ZW1EZXNjcmlwdGlvbj1pLmJ5SXRlbURlc2NyaXB0aW9ufXJldHVybiBFKCkoZSxbe2tleToiY29uZmlndXJlRXhjbHVzaW9uTWV0aG9kcyIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHR9fSx7a2V5OiJleGNsdWRlIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIFJ9fV0sW3trZXk6IndpbmRvd0xvY2F0aW9uSHJlZiIsZ2V0OmZ1bmN0aW9uKCl7dmFyIGUsbj13aW5kb3cubG9jYXRpb24uaG9zdG5hbWUscj13aW5kb3cubG9jYXRpb24uaHJlZjtpZihtKCkoZT1BLmRlYnVnSG9zdHMpLmNhbGwoZSxuKSl7dmFyIG89bmV3IHYuYSh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoInp6dXJsIik7aWYobyl0cnl7cj10LmZyb20obywiYmFzZTY0IikudG9TdHJpbmcoInV0Zi04Iil9Y2F0Y2godCl7Ty5hLmVycm9yKHQpfX1yZXR1cm4gcn19XSksZX0oKX0pLmNhbGwodGhpcyxuKDI5NCkuQnVmZmVyKX0sZnVuY3Rpb24odCxlKXt2YXIgbjtuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCk7dHJ5e249bnx8bmV3IEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9Y2F0Y2godCl7Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJihuPXdpbmRvdyl9dC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEzKSxvPW4oNiksaT1uKDY2KTt0LmV4cG9ydHM9IXImJiFvKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eShpKCJkaXYiKSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmF9KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNiksbz0vI3xcLnByb3RvdHlwZVwuLyxpPWZ1bmN0aW9uKHQsZSl7dmFyIG49c1thKHQpXTtyZXR1cm4gbj09Y3x8biE9dSYmKCJmdW5jdGlvbiI9PXR5cGVvZiBlP3IoZSk6ISFlKX0sYT1pLm5vcm1hbGl6ZT1mdW5jdGlvbih0KXtyZXR1cm4gU3RyaW5nKHQpLnJlcGxhY2UobywiLiIpLnRvTG93ZXJDYXNlKCl9LHM9aS5kYXRhPXt9LHU9aS5OQVRJVkU9Ik4iLGM9aS5QT0xZRklMTD0iUCI7dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0KSxvPW4oMjEpLGk9big2NykuaW5kZXhPZixhPW4oNTYpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuLHM9byh0KSx1PTAsYz1bXTtmb3IobiBpbiBzKSFyKGEsbikmJnIocyxuKSYmYy5wdXNoKG4pO2Zvcig7ZS5sZW5ndGg+dTspcihzLG49ZVt1KytdKSYmKH5pKGMsbil8fGMucHVzaChuKSk7cmV0dXJuIGN9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2OCksbz1NYXRoLm1heCxpPU1hdGgubWluO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPXIodCk7cmV0dXJuIG48MD9vKG4rZSwwKTppKG4sZSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzMyk7dC5leHBvcnRzPXIoImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50Iil9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyMiksbz1uKDcpLGk9W10uc2xpY2UsYT17fSxzPWZ1bmN0aW9uKHQsZSxuKXtpZighKGUgaW4gYSkpe2Zvcih2YXIgcj1bXSxvPTA7bzxlO28rKylyW29dPSJhWyIrbysiXSI7YVtlXT1GdW5jdGlvbigiQyxhIiwicmV0dXJuIG5ldyBDKCIrci5qb2luKCIsIikrIikiKX1yZXR1cm4gYVtlXSh0LG4pfTt0LmV4cG9ydHM9RnVuY3Rpb24uYmluZHx8ZnVuY3Rpb24odCl7dmFyIGU9cih0aGlzKSxuPWkuY2FsbChhcmd1bWVudHMsMSksYT1mdW5jdGlvbigpe3ZhciByPW4uY29uY2F0KGkuY2FsbChhcmd1bWVudHMpKTtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGE/cyhlLHIubGVuZ3RoLHIpOmUuYXBwbHkodCxyKX07cmV0dXJuIG8oZS5wcm90b3R5cGUpJiYoYS5wcm90b3R5cGU9ZS5wcm90b3R5cGUpLGF9fSxmdW5jdGlvbih0LGUpe2UuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDYpLGk9big0OCksYT1uKDcpLHM9bigyNCksdT1uKDM0KSxjPW4oNzEpLGw9big5NCksZj1uKDcyKSxwPW4oMikoImlzQ29uY2F0U3ByZWFkYWJsZSIpLGg9IW8oZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdFtwXT0hMSx0LmNvbmNhdCgpWzBdIT09dH0pLGQ9ZigiY29uY2F0IiksZz1mdW5jdGlvbih0KXtpZighYSh0KSlyZXR1cm4hMTt2YXIgZT10W3BdO3JldHVybiB2b2lkIDAhPT1lPyEhZTppKHQpfTtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6IWh8fCFkfSx7Y29uY2F0OmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYT1zKHRoaXMpLGY9bChhLDApLHA9MDtmb3IoZT0tMSxyPWFyZ3VtZW50cy5sZW5ndGg7ZTxyO2UrKylpZihpPS0xPT09ZT9hOmFyZ3VtZW50c1tlXSxnKGkpKXtpZihwKyhvPXUoaS5sZW5ndGgpKT45MDA3MTk5MjU0NzQwOTkxKXRocm93IFR5cGVFcnJvcigiTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkIik7Zm9yKG49MDtuPG87bisrLHArKyluIGluIGkmJmMoZixwLGlbbl0pfWVsc2V7aWYocD49OTAwNzE5OTI1NDc0MDk5MSl0aHJvdyBUeXBlRXJyb3IoIk1heGltdW0gYWxsb3dlZCBpbmRleCBleGNlZWRlZCIpO2MoZixwKyssaSl9cmV0dXJuIGYubGVuZ3RoPXAsZn19KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNyksbz1uKDQ4KSxpPW4oMikoInNwZWNpZXMiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4gbyh0KSYmKCJmdW5jdGlvbiIhPXR5cGVvZihuPXQuY29uc3RydWN0b3IpfHxuIT09QXJyYXkmJiFvKG4ucHJvdG90eXBlKT9yKG4pJiZudWxsPT09KG49bltpXSkmJihuPXZvaWQgMCk6bj12b2lkIDApLG5ldyh2b2lkIDA9PT1uP0FycmF5Om4pKDA9PT1lPzA6ZSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2KTt0LmV4cG9ydHM9ISFPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzJiYhcihmdW5jdGlvbigpe3JldHVybiFTdHJpbmcoU3ltYm9sKCkpfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpO3QuZXhwb3J0cz0hcihmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPW51bGwsT2JqZWN0LmdldFByb3RvdHlwZU9mKG5ldyB0KSE9PXQucHJvdG90eXBlfSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNzEpfSxmdW5jdGlvbih0LGUsbil7big0KSgiaXRlcmF0b3IiKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89bigxMDApLGk9big0OSksYT1uKDc0KSxzPW4oMjkpLHU9bigxNyksYz1uKDM2KSxsPW4oMiksZj1uKDI4KSxwPW4oMzApLGg9bigxMDEpLGQ9aC5JdGVyYXRvclByb3RvdHlwZSxnPWguQlVHR1lfU0FGQVJJX0lURVJBVE9SUyx2PWwoIml0ZXJhdG9yIikseT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sbCxoLG0sYil7byhuLGUsbCk7dmFyIHgsdyxrLFM9ZnVuY3Rpb24odCl7aWYodD09PWgmJkEpcmV0dXJuIEE7aWYoIWcmJnQgaW4gVClyZXR1cm4gVFt0XTtzd2l0Y2godCl7Y2FzZSJrZXlzIjpjYXNlInZhbHVlcyI6Y2FzZSJlbnRyaWVzIjpyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcyx0KX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMpfX0sRT1lKyIgSXRlcmF0b3IiLGo9ITEsVD10LnByb3RvdHlwZSxPPVRbdl18fFRbIkBAaXRlcmF0b3IiXXx8aCYmVFtoXSxBPSFnJiZPfHxTKGgpLEM9IkFycmF5Ij09ZSYmVC5lbnRyaWVzfHxPO2lmKEMmJih4PWkoQy5jYWxsKG5ldyB0KSksZCE9PU9iamVjdC5wcm90b3R5cGUmJngubmV4dCYmKGZ8fGkoeCk9PT1kfHwoYT9hKHgsZCk6ImZ1bmN0aW9uIiE9dHlwZW9mIHhbdl0mJnUoeCx2LHkpKSxzKHgsRSwhMCwhMCksZiYmKHBbRV09eSkpKSwidmFsdWVzIj09aCYmTyYmInZhbHVlcyIhPT1PLm5hbWUmJihqPSEwLEE9ZnVuY3Rpb24oKXtyZXR1cm4gTy5jYWxsKHRoaXMpfSksZiYmIWJ8fFRbdl09PT1BfHx1KFQsdixBKSxwW2VdPUEsaClpZih3PXt2YWx1ZXM6UygidmFsdWVzIiksa2V5czptP0E6Uygia2V5cyIpLGVudHJpZXM6UygiZW50cmllcyIpfSxiKWZvcihrIGluIHcpIWcmJiFqJiZrIGluIFR8fGMoVCxrLHdba10pO2Vsc2Ugcih7dGFyZ2V0OmUscHJvdG86ITAsZm9yY2VkOmd8fGp9LHcpO3JldHVybiB3fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDEwMSkuSXRlcmF0b3JQcm90b3R5cGUsbz1uKDQ3KSxpPW4oMzEpLGE9bigyOSkscz1uKDMwKSx1PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7dmFyIGM9ZSsiIEl0ZXJhdG9yIjtyZXR1cm4gdC5wcm90b3R5cGU9byhyLHtuZXh0OmkoMSxuKX0pLGEodCxjLCExLCEwKSxzW2NdPXUsdH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHIsbyxpLGE9big0OSkscz1uKDE3KSx1PW4oMTQpLGM9bigyKSxsPW4oMjgpLGY9YygiaXRlcmF0b3IiKSxwPSExO1tdLmtleXMmJigibmV4dCJpbihpPVtdLmtleXMoKSk/KG89YShhKGkpKSkhPT1PYmplY3QucHJvdG90eXBlJiYocj1vKTpwPSEwKSxudWxsPT1yJiYocj17fSksbHx8dShyLGYpfHxzKHIsZixmdW5jdGlvbigpe3JldHVybiB0aGlzfSksdC5leHBvcnRzPXtJdGVyYXRvclByb3RvdHlwZTpyLEJVR0dZX1NBRkFSSV9JVEVSQVRPUlM6cH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyMSksbz1uKDc3KSxpPW4oMzApLGE9big1MCkscz1uKDk5KSx1PWEuc2V0LGM9YS5nZXR0ZXJGb3IoIkFycmF5IEl0ZXJhdG9yIik7dC5leHBvcnRzPXMoQXJyYXksIkFycmF5IixmdW5jdGlvbih0LGUpe3UodGhpcyx7dHlwZToiQXJyYXkgSXRlcmF0b3IiLHRhcmdldDpyKHQpLGluZGV4OjAsa2luZDplfSl9LGZ1bmN0aW9uKCl7dmFyIHQ9Yyh0aGlzKSxlPXQudGFyZ2V0LG49dC5raW5kLHI9dC5pbmRleCsrO3JldHVybiFlfHxyPj1lLmxlbmd0aD8odC50YXJnZXQ9dm9pZCAwLHt2YWx1ZTp2b2lkIDAsZG9uZTohMH0pOiJrZXlzIj09bj97dmFsdWU6cixkb25lOiExfToidmFsdWVzIj09bj97dmFsdWU6ZVtyXSxkb25lOiExfTp7dmFsdWU6W3IsZVtyXV0sZG9uZTohMX19LCJ2YWx1ZXMiKSxpLkFyZ3VtZW50cz1pLkFycmF5LG8oImtleXMiKSxvKCJ2YWx1ZXMiKSxvKCJlbnRyaWVzIil9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxODkpfSxmdW5jdGlvbih0LGUsbil7big5MyksbigxMDUpLG4oMTkwKSxuKDE5MiksbigxOTMpLG4oMTk0KSxuKDE5NSksbig5OCksbigxOTYpLG4oMTk3KSxuKDE5OCksbigxOTkpLG4oMjAwKSxuKDIwMSksbigyMDIpLG4oMjAzKSxuKDIwNCksbigyMDUpLG4oMjA2KTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLlN5bWJvbH0sZnVuY3Rpb24odCxlKXt9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDg4KSxvPW4oNjkpLmNvbmNhdCgibGVuZ3RoIiwicHJvdG90eXBlIik7ZS5mPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzfHxmdW5jdGlvbih0KXtyZXR1cm4gcih0LG8pfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDYpLG89IlsiK24oNzgpKyJdIixpPVJlZ0V4cCgiXiIrbytvKyIqIiksYT1SZWdFeHAobytvKyIqJCIpLHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPVN0cmluZyhyKGUpKTtyZXR1cm4gMSZ0JiYobj1uLnJlcGxhY2UoaSwiIikpLDImdCYmKG49bi5yZXBsYWNlKGEsIiIpKSxufX07dC5leHBvcnRzPXtzdGFydDpzKDEpLGVuZDpzKDIpLHRyaW06cygzKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDExKSxvPW4oNTIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT1vKHQpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IFR5cGVFcnJvcihTdHJpbmcodCkrIiBpcyBub3QgaXRlcmFibGUiKTtyZXR1cm4gcihlLmNhbGwodCkpfX0sZnVuY3Rpb24odCxlLG4pe24oMjI4KTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLkFycmF5LmlzQXJyYXl9LGZ1bmN0aW9uKHQsZSxuKXtuKDM1KSxuKDIzMik7dmFyIHI9bigxKTt0LmV4cG9ydHM9ci5BcnJheS5mcm9tfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLG8pe3RyeXtyZXR1cm4gbz9lKHIobilbMF0sblsxXSk6ZShuKX1jYXRjaChlKXt2YXIgaT10LnJldHVybjt0aHJvdyB2b2lkIDAhPT1pJiZyKGkuY2FsbCh0KSksZX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyKSxvPW4oMzApLGk9cigiaXRlcmF0b3IiKSxhPUFycmF5LnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXQmJihvLkFycmF5PT09dHx8YVtpXT09PXQpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMikoIml0ZXJhdG9yIiksbz0hMTt0cnl7dmFyIGk9MCxhPXtuZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6ISFpKyt9fSxyZXR1cm46ZnVuY3Rpb24oKXtvPSEwfX07YVtyXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxBcnJheS5mcm9tKGEsZnVuY3Rpb24oKXt0aHJvdyAyfSl9Y2F0Y2godCl7fXQuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKCFlJiYhbylyZXR1cm4hMTt2YXIgbj0hMTt0cnl7dmFyIGk9e307aVtyXT1mdW5jdGlvbigpe3JldHVybntuZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6bj0hMH19fX0sdChpKX1jYXRjaCh0KXt9cmV0dXJuIG59fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMzUpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LnNsaWNlO3JldHVybiB0PT09b3x8dCBpbnN0YW5jZW9mIEFycmF5JiZlPT09by5zbGljZT9yOmV9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKSxvPW4oNSksaT1uKDc5KSxhPVtdLnNsaWNlLHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4yLG89cj9hLmNhbGwoYXJndW1lbnRzLDIpOnZvaWQgMDtyZXR1cm4gdChyP2Z1bmN0aW9uKCl7KCJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6RnVuY3Rpb24oZSkpLmFwcGx5KHRoaXMsbyl9OmUsbil9fTtyKHtnbG9iYWw6ITAsYmluZDohMCxmb3JjZWQ6L01TSUUgLlwuLy50ZXN0KGkpfSx7c2V0VGltZW91dDpzKG8uc2V0VGltZW91dCksc2V0SW50ZXJ2YWw6cyhvLnNldEludGVydmFsKX0pfSxmdW5jdGlvbih0LGUsbil7bigxMDUpLG4oMzUpLG4oNTEpLG4oMjU0KSxuKDEyMyksbigyNTgpO3ZhciByPW4oMSk7dC5leHBvcnRzPXIuUHJvbWlzZX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSk7dC5leHBvcnRzPXIuUHJvbWlzZX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzYpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciBvIGluIGUpbiYmbi51bnNhZmUmJnRbb10/dFtvXT1lW29dOnIodCxvLGVbb10sbik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgVHlwZUVycm9yKCJJbmNvcnJlY3QgIisobj9uKyIgIjoiIikrImludm9jYXRpb24iKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDExKSxvPW4oMjIpLGk9bigyKSgic3BlY2llcyIpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuLGE9cih0KS5jb25zdHJ1Y3RvcjtyZXR1cm4gdm9pZCAwPT09YXx8bnVsbD09KG49cihhKVtpXSk/ZTpvKG4pfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saSxhPW4oNSkscz1uKDYpLHU9bigyNyksYz1uKDMyKSxsPW4oOTApLGY9big2NikscD1hLmxvY2F0aW9uLGg9YS5zZXRJbW1lZGlhdGUsZD1hLmNsZWFySW1tZWRpYXRlLGc9YS5wcm9jZXNzLHY9YS5NZXNzYWdlQ2hhbm5lbCx5PWEuRGlzcGF0Y2gsbT0wLGI9e30seD1mdW5jdGlvbih0KXtpZihiLmhhc093blByb3BlcnR5KHQpKXt2YXIgZT1iW3RdO2RlbGV0ZSBiW3RdLGUoKX19LHc9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7eCh0KX19LGs9ZnVuY3Rpb24odCl7eCh0LmRhdGEpfSxTPWZ1bmN0aW9uKHQpe2EucG9zdE1lc3NhZ2UodCsiIixwLnByb3RvY29sKyIvLyIrcC5ob3N0KX07aCYmZHx8KGg9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLG49MTthcmd1bWVudHMubGVuZ3RoPm47KWUucHVzaChhcmd1bWVudHNbbisrXSk7cmV0dXJuIGJbKyttXT1mdW5jdGlvbigpeygiZnVuY3Rpb24iPT10eXBlb2YgdD90OkZ1bmN0aW9uKHQpKS5hcHBseSh2b2lkIDAsZSl9LHIobSksbX0sZD1mdW5jdGlvbih0KXtkZWxldGUgYlt0XX0sInByb2Nlc3MiPT11KGcpP3I9ZnVuY3Rpb24odCl7Zy5uZXh0VGljayh3KHQpKX06eSYmeS5ub3c/cj1mdW5jdGlvbih0KXt5Lm5vdyh3KHQpKX06dj8oaT0obz1uZXcgdikucG9ydDIsby5wb3J0MS5vbm1lc3NhZ2U9ayxyPWMoaS5wb3N0TWVzc2FnZSxpLDEpKTohYS5hZGRFdmVudExpc3RlbmVyfHwiZnVuY3Rpb24iIT10eXBlb2YgcG9zdE1lc3NhZ2V8fGEuaW1wb3J0U2NyaXB0c3x8cyhTKT9yPSJvbnJlYWR5c3RhdGVjaGFuZ2UiaW4gZigic2NyaXB0Iik/ZnVuY3Rpb24odCl7bC5hcHBlbmRDaGlsZChmKCJzY3JpcHQiKSkub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7bC5yZW1vdmVDaGlsZCh0aGlzKSx4KHQpfX06ZnVuY3Rpb24odCl7c2V0VGltZW91dCh3KHQpLDApfToocj1TLGEuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsaywhMSkpKSx0LmV4cG9ydHM9e3NldDpoLGNsZWFyOmR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMSksbz1uKDcpLGk9big1Myk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7aWYocih0KSxvKGUpJiZlLmNvbnN0cnVjdG9yPT09dClyZXR1cm4gZTt2YXIgbj1pLmYodCk7cmV0dXJuKDAsbi5yZXNvbHZlKShlKSxuLnByb21pc2V9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDIyKSxpPW4oNTMpLGE9big2MCkscz1uKDU5KTtyKHt0YXJnZXQ6IlByb21pc2UiLHN0YXQ6ITB9LHthbGxTZXR0bGVkOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1pLmYoZSkscj1uLnJlc29sdmUsdT1uLnJlamVjdCxjPWEoZnVuY3Rpb24oKXt2YXIgbj1vKGUucmVzb2x2ZSksaT1bXSxhPTAsdT0xO3ModCxmdW5jdGlvbih0KXt2YXIgbz1hKysscz0hMTtpLnB1c2godm9pZCAwKSx1Kyssbi5jYWxsKGUsdCkudGhlbihmdW5jdGlvbih0KXtzfHwocz0hMCxpW29dPXtzdGF0dXM6ImZ1bGZpbGxlZCIsdmFsdWU6dH0sLS11fHxyKGkpKX0sZnVuY3Rpb24odCl7c3x8KHM9ITAsaVtvXT17c3RhdHVzOiJyZWplY3RlZCIscmVhc29uOnR9LC0tdXx8cihpKSl9KX0pLC0tdXx8cihpKX0pO3JldHVybiBjLmVycm9yJiZ1KGMudmFsdWUpLG4ucHJvbWlzZX19KX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXsobnVsbD09ZXx8ZT50Lmxlbmd0aCkmJihlPXQubGVuZ3RoKTtmb3IodmFyIG49MCxyPW5ldyBBcnJheShlKTtuPGU7bisrKXJbbl09dFtuXTtyZXR1cm4gcn19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNzcpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNTgpLG89bigxNjIpLGk9bigxNjYpO2Z1bmN0aW9uIGEoZSxuLHMpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgUmVmbGVjdCYmbz90LmV4cG9ydHM9YT1vOnQuZXhwb3J0cz1hPWZ1bmN0aW9uKHQsZSxuKXt2YXIgbz1pKHQsZSk7aWYobyl7dmFyIGE9cihvLGUpO3JldHVybiBhLmdldD9hLmdldC5jYWxsKG4pOmEudmFsdWV9fSxhKGUsbixzfHxlKX10LmV4cG9ydHM9YX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0MCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcjsKLyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjMuNC4xCiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS8KICoKICogSW5jbHVkZXMgU2l6emxlLmpzCiAqIGh0dHBzOi8vc2l6emxlanMuY29tLwogKgogKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwczovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBEYXRlOiAyMDE5LTA1LTAxVDIxOjA0WgogKi8KLyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjMuNC4xCiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS8KICoKICogSW5jbHVkZXMgU2l6emxlLmpzCiAqIGh0dHBzOi8vc2l6emxlanMuY29tLwogKgogKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwczovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBEYXRlOiAyMDE5LTA1LTAxVDIxOjA0WgogKi8KIWZ1bmN0aW9uKGUsbil7InVzZSBzdHJpY3QiOyJvYmplY3QiPT10eXBlb2YgdC5leHBvcnRzP3QuZXhwb3J0cz1lLmRvY3VtZW50P24oZSwhMCk6ZnVuY3Rpb24odCl7aWYoIXQuZG9jdW1lbnQpdGhyb3cgbmV3IEVycm9yKCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50Iik7cmV0dXJuIG4odCl9Om4oZSl9KCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp0aGlzLGZ1bmN0aW9uKG4sbyl7InVzZSBzdHJpY3QiO3ZhciBpPVtdLGE9bi5kb2N1bWVudCxzPU9iamVjdC5nZXRQcm90b3R5cGVPZix1PWkuc2xpY2UsYz1pLmNvbmNhdCxsPWkucHVzaCxmPWkuaW5kZXhPZixwPXt9LGg9cC50b1N0cmluZyxkPXAuaGFzT3duUHJvcGVydHksZz1kLnRvU3RyaW5nLHY9Zy5jYWxsKE9iamVjdCkseT17fSxtPWZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYibnVtYmVyIiE9dHlwZW9mIHQubm9kZVR5cGV9LGI9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJnQ9PT10LndpbmRvd30seD17dHlwZTohMCxzcmM6ITAsbm9uY2U6ITAsbm9Nb2R1bGU6ITB9O2Z1bmN0aW9uIHcodCxlLG4pe3ZhciByLG8saT0obj1ufHxhKS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtpZihpLnRleHQ9dCxlKWZvcihyIGluIHgpKG89ZVtyXXx8ZS5nZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKHIpKSYmaS5zZXRBdHRyaWJ1dGUocixvKTtuLmhlYWQuYXBwZW5kQ2hpbGQoaSkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChpKX1mdW5jdGlvbiBrKHQpe3JldHVybiBudWxsPT10P3QrIiI6Im9iamVjdCI9PXR5cGVvZiB0fHwiZnVuY3Rpb24iPT10eXBlb2YgdD9wW2guY2FsbCh0KV18fCJvYmplY3QiOnR5cGVvZiB0fXZhciBTPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBTLmZuLmluaXQodCxlKX0sRT0vXltcc1x1RkVGRlx4QTBdK3xbXHNcdUZFRkZceEEwXSskL2c7ZnVuY3Rpb24gaih0KXt2YXIgZT0hIXQmJiJsZW5ndGgiaW4gdCYmdC5sZW5ndGgsbj1rKHQpO3JldHVybiFtKHQpJiYhYih0KSYmKCJhcnJheSI9PT1ufHwwPT09ZXx8Im51bWJlciI9PXR5cGVvZiBlJiZlPjAmJmUtMSBpbiB0KX1TLmZuPVMucHJvdG90eXBlPXtqcXVlcnk6IjMuNC4xIixjb25zdHJ1Y3RvcjpTLGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdS5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dS5jYWxsKHRoaXMpOnQ8MD90aGlzW3QrdGhpcy5sZW5ndGhdOnRoaXNbdF19LHB1c2hTdGFjazpmdW5jdGlvbih0KXt2YXIgZT1TLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSx0KTtyZXR1cm4gZS5wcmV2T2JqZWN0PXRoaXMsZX0sZWFjaDpmdW5jdGlvbih0KXtyZXR1cm4gUy5lYWNoKHRoaXMsdCl9LG1hcDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soUy5tYXAodGhpcyxmdW5jdGlvbihlLG4pe3JldHVybiB0LmNhbGwoZSxuLGUpfSkpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayh1LmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LGVxOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubGVuZ3RoLG49K3QrKHQ8MD9lOjApO3JldHVybiB0aGlzLnB1c2hTdGFjayhuPj0wJiZuPGU/W3RoaXNbbl1dOltdKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcigpfSxwdXNoOmwsc29ydDppLnNvcnQsc3BsaWNlOmkuc3BsaWNlfSxTLmV4dGVuZD1TLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciB0LGUsbixyLG8saSxhPWFyZ3VtZW50c1swXXx8e30scz0xLHU9YXJndW1lbnRzLmxlbmd0aCxjPSExO2ZvcigiYm9vbGVhbiI9PXR5cGVvZiBhJiYoYz1hLGE9YXJndW1lbnRzW3NdfHx7fSxzKyspLCJvYmplY3QiPT10eXBlb2YgYXx8bShhKXx8KGE9e30pLHM9PT11JiYoYT10aGlzLHMtLSk7czx1O3MrKylpZihudWxsIT0odD1hcmd1bWVudHNbc10pKWZvcihlIGluIHQpcj10W2VdLCJfX3Byb3RvX18iIT09ZSYmYSE9PXImJihjJiZyJiYoUy5pc1BsYWluT2JqZWN0KHIpfHwobz1BcnJheS5pc0FycmF5KHIpKSk/KG49YVtlXSxpPW8mJiFBcnJheS5pc0FycmF5KG4pP1tdOm98fFMuaXNQbGFpbk9iamVjdChuKT9uOnt9LG89ITEsYVtlXT1TLmV4dGVuZChjLGkscikpOnZvaWQgMCE9PXImJihhW2VdPXIpKTtyZXR1cm4gYX0sUy5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKCIzLjQuMSIrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IodCl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzUGxhaW5PYmplY3Q6ZnVuY3Rpb24odCl7dmFyIGUsbjtyZXR1cm4hKCF0fHwiW29iamVjdCBPYmplY3RdIiE9PWguY2FsbCh0KSkmJighKGU9cyh0KSl8fCJmdW5jdGlvbiI9PXR5cGVvZihuPWQuY2FsbChlLCJjb25zdHJ1Y3RvciIpJiZlLmNvbnN0cnVjdG9yKSYmZy5jYWxsKG4pPT09dil9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24odCl7dmFyIGU7Zm9yKGUgaW4gdClyZXR1cm4hMTtyZXR1cm4hMH0sZ2xvYmFsRXZhbDpmdW5jdGlvbih0LGUpe3codCx7bm9uY2U6ZSYmZS5ub25jZX0pfSxlYWNoOmZ1bmN0aW9uKHQsZSl7dmFyIG4scj0wO2lmKGoodCkpZm9yKG49dC5sZW5ndGg7cjxuJiYhMSE9PWUuY2FsbCh0W3JdLHIsdFtyXSk7cisrKTtlbHNlIGZvcihyIGluIHQpaWYoITE9PT1lLmNhbGwodFtyXSxyLHRbcl0pKWJyZWFrO3JldHVybiB0fSx0cmltOmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10PyIiOih0KyIiKS5yZXBsYWNlKEUsIiIpfSxtYWtlQXJyYXk6ZnVuY3Rpb24odCxlKXt2YXIgbj1lfHxbXTtyZXR1cm4gbnVsbCE9dCYmKGooT2JqZWN0KHQpKT9TLm1lcmdlKG4sInN0cmluZyI9PXR5cGVvZiB0P1t0XTp0KTpsLmNhbGwobix0KSksbn0saW5BcnJheTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIG51bGw9PWU/LTE6Zi5jYWxsKGUsdCxuKX0sbWVyZ2U6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49K2UubGVuZ3RoLHI9MCxvPXQubGVuZ3RoO3I8bjtyKyspdFtvKytdPWVbcl07cmV0dXJuIHQubGVuZ3RoPW8sdH0sZ3JlcDpmdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPVtdLG89MCxpPXQubGVuZ3RoLGE9IW47bzxpO28rKykhZSh0W29dLG8pIT09YSYmci5wdXNoKHRbb10pO3JldHVybiByfSxtYXA6ZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saT0wLGE9W107aWYoaih0KSlmb3Iocj10Lmxlbmd0aDtpPHI7aSsrKW51bGwhPShvPWUodFtpXSxpLG4pKSYmYS5wdXNoKG8pO2Vsc2UgZm9yKGkgaW4gdCludWxsIT0obz1lKHRbaV0saSxuKSkmJmEucHVzaChvKTtyZXR1cm4gYy5hcHBseShbXSxhKX0sZ3VpZDoxLHN1cHBvcnQ6eX0pLCJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJihTLmZuW1N5bWJvbC5pdGVyYXRvcl09aVtTeW1ib2wuaXRlcmF0b3JdKSxTLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IgU3ltYm9sIi5zcGxpdCgiICIpLGZ1bmN0aW9uKHQsZSl7cFsiW29iamVjdCAiK2UrIl0iXT1lLnRvTG93ZXJDYXNlKCl9KTt2YXIgVD0KLyohCiAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5naW5lIHYyLjMuNAogKiBodHRwczovL3NpenpsZWpzLmNvbS8KICoKICogQ29weXJpZ2h0IEpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UKICogaHR0cHM6Ly9qcy5mb3VuZGF0aW9uLwogKgogKiBEYXRlOiAyMDE5LTA0LTA4CiAqLwpmdW5jdGlvbih0KXt2YXIgZSxuLHIsbyxpLGEscyx1LGMsbCxmLHAsaCxkLGcsdix5LG0sYix4PSJzaXp6bGUiKzEqbmV3IERhdGUsdz10LmRvY3VtZW50LGs9MCxTPTAsRT11dCgpLGo9dXQoKSxUPXV0KCksTz11dCgpLEE9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD09PWUmJihmPSEwKSwwfSxDPXt9Lmhhc093blByb3BlcnR5LEw9W10sUj1MLnBvcCxQPUwucHVzaCxOPUwucHVzaCxJPUwuc2xpY2UsXz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0wLHI9dC5sZW5ndGg7bjxyO24rKylpZih0W25dPT09ZSlyZXR1cm4gbjtyZXR1cm4tMX0sRD0iY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLE09IltcXHgyMFxcdFxcclxcblxcZl0iLFU9Iig/OlxcXFwufFtcXHctXXxbXlwwLVxceGEwXSkrIixCPSJcXFsiK00rIiooIitVKyIpKD86IitNKyIqKFsqXiR8IX5dPz0pIitNKyIqKD86JygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCJ8KCIrVSsiKSl8KSIrTSsiKlxcXSIscT0iOigiK1UrIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK0IrIikqKXwuKilcXCl8KSIsRj1uZXcgUmVnRXhwKE0rIisiLCJnIiksSD1uZXcgUmVnRXhwKCJeIitNKyIrfCgoPzpefFteXFxcXF0pKD86XFxcXC4pKikiK00rIiskIiwiZyIpLHo9bmV3IFJlZ0V4cCgiXiIrTSsiKiwiK00rIioiKSxXPW5ldyBSZWdFeHAoIl4iK00rIiooWz4rfl18IitNKyIpIitNKyIqIiksJD1uZXcgUmVnRXhwKE0rInw+IiksWT1uZXcgUmVnRXhwKHEpLFY9bmV3IFJlZ0V4cCgiXiIrVSsiJCIpLEc9e0lEOm5ldyBSZWdFeHAoIl4jKCIrVSsiKSIpLENMQVNTOm5ldyBSZWdFeHAoIl5cXC4oIitVKyIpIiksVEFHOm5ldyBSZWdFeHAoIl4oIitVKyJ8WypdKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIrQiksUFNFVURPOm5ldyBSZWdFeHAoIl4iK3EpLENISUxEOm5ldyBSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrTSsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrTSsiKig/OihbKy1dfCkiK00rIiooXFxkKyl8KSkiK00rIipcXCl8KSIsImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK0QrIikkIiwiaSIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKCJeIitNKyIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK00rIiooKD86LVxcZCk/XFxkKikiK00rIipcXCl8KSg/PVteLV18JCkiLCJpIil9LEs9L0hUTUwkL2ksWD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLEo9L15oXGQkL2ksUT0vXltee10rXHtccypcW25hdGl2ZSBcdy8sWj0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLHR0PS9bK35dLyxldD1uZXcgUmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK00rIj98KCIrTSsiKXwuKSIsImlnIiksbnQ9ZnVuY3Rpb24odCxlLG4pe3ZhciByPSIweCIrZS02NTUzNjtyZXR1cm4gciE9cnx8bj9lOnI8MD9TdHJpbmcuZnJvbUNoYXJDb2RlKHIrNjU1MzYpOlN0cmluZy5mcm9tQ2hhckNvZGUocj4+MTB8NTUyOTYsMTAyMyZyfDU2MzIwKX0scnQ9LyhbXDAtXHgxZlx4N2ZdfF4tP1xkKXxeLSR8W15cMC1ceDFmXHg3Zi1cdUZGRkZcdy1dL2csb3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT8iXDAiPT09dD8i77+9Ijp0LnNsaWNlKDAsLTEpKyJcXCIrdC5jaGFyQ29kZUF0KHQubGVuZ3RoLTEpLnRvU3RyaW5nKDE2KSsiICI6IlxcIit0fSxpdD1mdW5jdGlvbigpe3AoKX0sYXQ9eHQoZnVuY3Rpb24odCl7cmV0dXJuITA9PT10LmRpc2FibGVkJiYiZmllbGRzZXQiPT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpfSx7ZGlyOiJwYXJlbnROb2RlIixuZXh0OiJsZWdlbmQifSk7dHJ5e04uYXBwbHkoTD1JLmNhbGwody5jaGlsZE5vZGVzKSx3LmNoaWxkTm9kZXMpLExbdy5jaGlsZE5vZGVzLmxlbmd0aF0ubm9kZVR5cGV9Y2F0Y2godCl7Tj17YXBwbHk6TC5sZW5ndGg/ZnVuY3Rpb24odCxlKXtQLmFwcGx5KHQsSS5jYWxsKGUpKX06ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5sZW5ndGgscj0wO3RbbisrXT1lW3IrK107KTt0Lmxlbmd0aD1uLTF9fX1mdW5jdGlvbiBzdCh0LGUscixvKXt2YXIgaSxzLGMsbCxmLGQseSxtPWUmJmUub3duZXJEb2N1bWVudCxrPWU/ZS5ub2RlVHlwZTo5O2lmKHI9cnx8W10sInN0cmluZyIhPXR5cGVvZiB0fHwhdHx8MSE9PWsmJjkhPT1rJiYxMSE9PWspcmV0dXJuIHI7aWYoIW8mJigoZT9lLm93bmVyRG9jdW1lbnR8fGU6dykhPT1oJiZwKGUpLGU9ZXx8aCxnKSl7aWYoMTEhPT1rJiYoZj1aLmV4ZWModCkpKWlmKGk9ZlsxXSl7aWYoOT09PWspe2lmKCEoYz1lLmdldEVsZW1lbnRCeUlkKGkpKSlyZXR1cm4gcjtpZihjLmlkPT09aSlyZXR1cm4gci5wdXNoKGMpLHJ9ZWxzZSBpZihtJiYoYz1tLmdldEVsZW1lbnRCeUlkKGkpKSYmYihlLGMpJiZjLmlkPT09aSlyZXR1cm4gci5wdXNoKGMpLHJ9ZWxzZXtpZihmWzJdKXJldHVybiBOLmFwcGx5KHIsZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KSkscjtpZigoaT1mWzNdKSYmbi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIE4uYXBwbHkocixlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaSkpLHJ9aWYobi5xc2EmJiFPW3QrIiAiXSYmKCF2fHwhdi50ZXN0KHQpKSYmKDEhPT1rfHwib2JqZWN0IiE9PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpe2lmKHk9dCxtPWUsMT09PWsmJiQudGVzdCh0KSl7Zm9yKChsPWUuZ2V0QXR0cmlidXRlKCJpZCIpKT9sPWwucmVwbGFjZShydCxvdCk6ZS5zZXRBdHRyaWJ1dGUoImlkIixsPXgpLHM9KGQ9YSh0KSkubGVuZ3RoO3MtLTspZFtzXT0iIyIrbCsiICIrYnQoZFtzXSk7eT1kLmpvaW4oIiwiKSxtPXR0LnRlc3QodCkmJnl0KGUucGFyZW50Tm9kZSl8fGV9dHJ5e3JldHVybiBOLmFwcGx5KHIsbS5xdWVyeVNlbGVjdG9yQWxsKHkpKSxyfWNhdGNoKGUpe08odCwhMCl9ZmluYWxseXtsPT09eCYmZS5yZW1vdmVBdHRyaWJ1dGUoImlkIil9fX1yZXR1cm4gdSh0LnJlcGxhY2UoSCwiJDEiKSxlLHIsbyl9ZnVuY3Rpb24gdXQoKXt2YXIgdD1bXTtyZXR1cm4gZnVuY3Rpb24gZShuLG8pe3JldHVybiB0LnB1c2gobisiICIpPnIuY2FjaGVMZW5ndGgmJmRlbGV0ZSBlW3Quc2hpZnQoKV0sZVtuKyIgIl09b319ZnVuY3Rpb24gY3QodCl7cmV0dXJuIHRbeF09ITAsdH1mdW5jdGlvbiBsdCh0KXt2YXIgZT1oLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0Iik7dHJ5e3JldHVybiEhdChlKX1jYXRjaCh0KXtyZXR1cm4hMX1maW5hbGx5e2UucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpLGU9bnVsbH19ZnVuY3Rpb24gZnQodCxlKXtmb3IodmFyIG49dC5zcGxpdCgifCIpLG89bi5sZW5ndGg7by0tOylyLmF0dHJIYW5kbGVbbltvXV09ZX1mdW5jdGlvbiBwdCh0LGUpe3ZhciBuPWUmJnQscj1uJiYxPT09dC5ub2RlVHlwZSYmMT09PWUubm9kZVR5cGUmJnQuc291cmNlSW5kZXgtZS5zb3VyY2VJbmRleDtpZihyKXJldHVybiByO2lmKG4pZm9yKDtuPW4ubmV4dFNpYmxpbmc7KWlmKG49PT1lKXJldHVybi0xO3JldHVybiB0PzE6LTF9ZnVuY3Rpb24gaHQodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiJpbnB1dCI9PT1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkmJmUudHlwZT09PXR9fWZ1bmN0aW9uIGR0KHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1ufHwiYnV0dG9uIj09PW4pJiZlLnR5cGU9PT10fX1mdW5jdGlvbiBndCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuImZvcm0iaW4gZT9lLnBhcmVudE5vZGUmJiExPT09ZS5kaXNhYmxlZD8ibGFiZWwiaW4gZT8ibGFiZWwiaW4gZS5wYXJlbnROb2RlP2UucGFyZW50Tm9kZS5kaXNhYmxlZD09PXQ6ZS5kaXNhYmxlZD09PXQ6ZS5pc0Rpc2FibGVkPT09dHx8ZS5pc0Rpc2FibGVkIT09IXQmJmF0KGUpPT09dDplLmRpc2FibGVkPT09dDoibGFiZWwiaW4gZSYmZS5kaXNhYmxlZD09PXR9fWZ1bmN0aW9uIHZ0KHQpe3JldHVybiBjdChmdW5jdGlvbihlKXtyZXR1cm4gZT0rZSxjdChmdW5jdGlvbihuLHIpe2Zvcih2YXIgbyxpPXQoW10sbi5sZW5ndGgsZSksYT1pLmxlbmd0aDthLS07KW5bbz1pW2FdXSYmKG5bb109IShyW29dPW5bb10pKX0pfSl9ZnVuY3Rpb24geXQodCl7cmV0dXJuIHQmJnZvaWQgMCE9PXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUmJnR9Zm9yKGUgaW4gbj1zdC5zdXBwb3J0PXt9LGk9c3QuaXNYTUw9ZnVuY3Rpb24odCl7dmFyIGU9dC5uYW1lc3BhY2VVUkksbj0odC5vd25lckRvY3VtZW50fHx0KS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuIUsudGVzdChlfHxuJiZuLm5vZGVOYW1lfHwiSFRNTCIpfSxwPXN0LnNldERvY3VtZW50PWZ1bmN0aW9uKHQpe3ZhciBlLG8sYT10P3Qub3duZXJEb2N1bWVudHx8dDp3O3JldHVybiBhIT09aCYmOT09PWEubm9kZVR5cGUmJmEuZG9jdW1lbnRFbGVtZW50PyhkPShoPWEpLmRvY3VtZW50RWxlbWVudCxnPSFpKGgpLHchPT1oJiYobz1oLmRlZmF1bHRWaWV3KSYmby50b3AhPT1vJiYoby5hZGRFdmVudExpc3RlbmVyP28uYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixpdCwhMSk6by5hdHRhY2hFdmVudCYmby5hdHRhY2hFdmVudCgib251bmxvYWQiLGl0KSksbi5hdHRyaWJ1dGVzPWx0KGZ1bmN0aW9uKHQpe3JldHVybiB0LmNsYXNzTmFtZT0iaSIsIXQuZ2V0QXR0cmlidXRlKCJjbGFzc05hbWUiKX0pLG4uZ2V0RWxlbWVudHNCeVRhZ05hbWU9bHQoZnVuY3Rpb24odCl7cmV0dXJuIHQuYXBwZW5kQ2hpbGQoaC5jcmVhdGVDb21tZW50KCIiKSksIXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGh9KSxuLmdldEVsZW1lbnRzQnlDbGFzc05hbWU9US50ZXN0KGguZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSksbi5nZXRCeUlkPWx0KGZ1bmN0aW9uKHQpe3JldHVybiBkLmFwcGVuZENoaWxkKHQpLmlkPXgsIWguZ2V0RWxlbWVudHNCeU5hbWV8fCFoLmdldEVsZW1lbnRzQnlOYW1lKHgpLmxlbmd0aH0pLG4uZ2V0QnlJZD8oci5maWx0ZXIuSUQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5yZXBsYWNlKGV0LG50KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0QXR0cmlidXRlKCJpZCIpPT09ZX19LHIuZmluZC5JRD1mdW5jdGlvbih0LGUpe2lmKHZvaWQgMCE9PWUuZ2V0RWxlbWVudEJ5SWQmJmcpe3ZhciBuPWUuZ2V0RWxlbWVudEJ5SWQodCk7cmV0dXJuIG4/W25dOltdfX0pOihyLmZpbHRlci5JRD1mdW5jdGlvbih0KXt2YXIgZT10LnJlcGxhY2UoZXQsbnQpO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj12b2lkIDAhPT10LmdldEF0dHJpYnV0ZU5vZGUmJnQuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gbiYmbi52YWx1ZT09PWV9fSxyLmZpbmQuSUQ9ZnVuY3Rpb24odCxlKXtpZih2b2lkIDAhPT1lLmdldEVsZW1lbnRCeUlkJiZnKXt2YXIgbixyLG8saT1lLmdldEVsZW1lbnRCeUlkKHQpO2lmKGkpe2lmKChuPWkuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKSkmJm4udmFsdWU9PT10KXJldHVybltpXTtmb3Iobz1lLmdldEVsZW1lbnRzQnlOYW1lKHQpLHI9MDtpPW9bcisrXTspaWYoKG49aS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSYmbi52YWx1ZT09PXQpcmV0dXJuW2ldfXJldHVybltdfX0pLHIuZmluZC5UQUc9bi5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDAhPT1lLmdldEVsZW1lbnRzQnlUYWdOYW1lP2UuZ2V0RWxlbWVudHNCeVRhZ05hbWUodCk6bi5xc2E/ZS5xdWVyeVNlbGVjdG9yQWxsKHQpOnZvaWQgMH06ZnVuY3Rpb24odCxlKXt2YXIgbixyPVtdLG89MCxpPWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUodCk7aWYoIioiPT09dCl7Zm9yKDtuPWlbbysrXTspMT09PW4ubm9kZVR5cGUmJnIucHVzaChuKTtyZXR1cm4gcn1yZXR1cm4gaX0sci5maW5kLkNMQVNTPW4uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24odCxlKXtpZih2b2lkIDAhPT1lLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmcpcmV0dXJuIGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSh0KX0seT1bXSx2PVtdLChuLnFzYT1RLnRlc3QoaC5xdWVyeVNlbGVjdG9yQWxsKSkmJihsdChmdW5jdGlvbih0KXtkLmFwcGVuZENoaWxkKHQpLmlubmVySFRNTD0iPGEgaWQ9JyIreCsiJz48L2E+PHNlbGVjdCBpZD0nIit4KyItXHJcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLHQucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJnYucHVzaCgiWypeJF09IitNKyIqKD86Jyd8XCJcIikiKSx0LnF1ZXJ5U2VsZWN0b3JBbGwoIltzZWxlY3RlZF0iKS5sZW5ndGh8fHYucHVzaCgiXFxbIitNKyIqKD86dmFsdWV8IitEKyIpIiksdC5xdWVyeVNlbGVjdG9yQWxsKCJbaWR+PSIreCsiLV0iKS5sZW5ndGh8fHYucHVzaCgifj0iKSx0LnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHx2LnB1c2goIjpjaGVja2VkIiksdC5xdWVyeVNlbGVjdG9yQWxsKCJhIyIreCsiKyoiKS5sZW5ndGh8fHYucHVzaCgiLiMuK1srfl0iKX0pLGx0KGZ1bmN0aW9uKHQpe3QuaW5uZXJIVE1MPSI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD4iO3ZhciBlPWguY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtlLnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLHQuYXBwZW5kQ2hpbGQoZSkuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLHQucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJnYucHVzaCgibmFtZSIrTSsiKlsqXiR8IX5dPz0iKSwyIT09dC5xdWVyeVNlbGVjdG9yQWxsKCI6ZW5hYmxlZCIpLmxlbmd0aCYmdi5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLGQuYXBwZW5kQ2hpbGQodCkuZGlzYWJsZWQ9ITAsMiE9PXQucXVlcnlTZWxlY3RvckFsbCgiOmRpc2FibGVkIikubGVuZ3RoJiZ2LnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksdC5xdWVyeVNlbGVjdG9yQWxsKCIqLDp4Iiksdi5wdXNoKCIsLio6Iil9KSksKG4ubWF0Y2hlc1NlbGVjdG9yPVEudGVzdChtPWQubWF0Y2hlc3x8ZC53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fGQubW96TWF0Y2hlc1NlbGVjdG9yfHxkLm9NYXRjaGVzU2VsZWN0b3J8fGQubXNNYXRjaGVzU2VsZWN0b3IpKSYmbHQoZnVuY3Rpb24odCl7bi5kaXNjb25uZWN0ZWRNYXRjaD1tLmNhbGwodCwiKiIpLG0uY2FsbCh0LCJbcyE9JyddOngiKSx5LnB1c2goIiE9IixxKX0pLHY9di5sZW5ndGgmJm5ldyBSZWdFeHAodi5qb2luKCJ8IikpLHk9eS5sZW5ndGgmJm5ldyBSZWdFeHAoeS5qb2luKCJ8IikpLGU9US50ZXN0KGQuY29tcGFyZURvY3VtZW50UG9zaXRpb24pLGI9ZXx8US50ZXN0KGQuY29udGFpbnMpP2Z1bmN0aW9uKHQsZSl7dmFyIG49OT09PXQubm9kZVR5cGU/dC5kb2N1bWVudEVsZW1lbnQ6dCxyPWUmJmUucGFyZW50Tm9kZTtyZXR1cm4gdD09PXJ8fCEoIXJ8fDEhPT1yLm5vZGVUeXBlfHwhKG4uY29udGFpbnM/bi5jb250YWlucyhyKTp0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uJiYxNiZ0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHIpKSl9OmZ1bmN0aW9uKHQsZSl7aWYoZSlmb3IoO2U9ZS5wYXJlbnROb2RlOylpZihlPT09dClyZXR1cm4hMDtyZXR1cm4hMX0sQT1lP2Z1bmN0aW9uKHQsZSl7aWYodD09PWUpcmV0dXJuIGY9ITAsMDt2YXIgcj0hdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbi0hZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtyZXR1cm4gcnx8KDEmKHI9KHQub3duZXJEb2N1bWVudHx8dCk9PT0oZS5vd25lckRvY3VtZW50fHxlKT90LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGUpOjEpfHwhbi5zb3J0RGV0YWNoZWQmJmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCk9PT1yP3Q9PT1ofHx0Lm93bmVyRG9jdW1lbnQ9PT13JiZiKHcsdCk/LTE6ZT09PWh8fGUub3duZXJEb2N1bWVudD09PXcmJmIodyxlKT8xOmw/XyhsLHQpLV8obCxlKTowOjQmcj8tMToxKX06ZnVuY3Rpb24odCxlKXtpZih0PT09ZSlyZXR1cm4gZj0hMCwwO3ZhciBuLHI9MCxvPXQucGFyZW50Tm9kZSxpPWUucGFyZW50Tm9kZSxhPVt0XSxzPVtlXTtpZighb3x8IWkpcmV0dXJuIHQ9PT1oPy0xOmU9PT1oPzE6bz8tMTppPzE6bD9fKGwsdCktXyhsLGUpOjA7aWYobz09PWkpcmV0dXJuIHB0KHQsZSk7Zm9yKG49dDtuPW4ucGFyZW50Tm9kZTspYS51bnNoaWZ0KG4pO2ZvcihuPWU7bj1uLnBhcmVudE5vZGU7KXMudW5zaGlmdChuKTtmb3IoO2Fbcl09PT1zW3JdOylyKys7cmV0dXJuIHI/cHQoYVtyXSxzW3JdKTphW3JdPT09dz8tMTpzW3JdPT09dz8xOjB9LGgpOmh9LHN0Lm1hdGNoZXM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gc3QodCxudWxsLG51bGwsZSl9LHN0Lm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbih0LGUpe2lmKCh0Lm93bmVyRG9jdW1lbnR8fHQpIT09aCYmcCh0KSxuLm1hdGNoZXNTZWxlY3RvciYmZyYmIU9bZSsiICJdJiYoIXl8fCF5LnRlc3QoZSkpJiYoIXZ8fCF2LnRlc3QoZSkpKXRyeXt2YXIgcj1tLmNhbGwodCxlKTtpZihyfHxuLmRpc2Nvbm5lY3RlZE1hdGNofHx0LmRvY3VtZW50JiYxMSE9PXQuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIHJ9Y2F0Y2godCl7TyhlLCEwKX1yZXR1cm4gc3QoZSxoLG51bGwsW3RdKS5sZW5ndGg+MH0sc3QuY29udGFpbnM9ZnVuY3Rpb24odCxlKXtyZXR1cm4odC5vd25lckRvY3VtZW50fHx0KSE9PWgmJnAodCksYih0LGUpfSxzdC5hdHRyPWZ1bmN0aW9uKHQsZSl7KHQub3duZXJEb2N1bWVudHx8dCkhPT1oJiZwKHQpO3ZhciBvPXIuYXR0ckhhbmRsZVtlLnRvTG93ZXJDYXNlKCldLGk9byYmQy5jYWxsKHIuYXR0ckhhbmRsZSxlLnRvTG93ZXJDYXNlKCkpP28odCxlLCFnKTp2b2lkIDA7cmV0dXJuIHZvaWQgMCE9PWk/aTpuLmF0dHJpYnV0ZXN8fCFnP3QuZ2V0QXR0cmlidXRlKGUpOihpPXQuZ2V0QXR0cmlidXRlTm9kZShlKSkmJmkuc3BlY2lmaWVkP2kudmFsdWU6bnVsbH0sc3QuZXNjYXBlPWZ1bmN0aW9uKHQpe3JldHVybih0KyIiKS5yZXBsYWNlKHJ0LG90KX0sc3QuZXJyb3I9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK3QpfSxzdC51bmlxdWVTb3J0PWZ1bmN0aW9uKHQpe3ZhciBlLHI9W10sbz0wLGk9MDtpZihmPSFuLmRldGVjdER1cGxpY2F0ZXMsbD0hbi5zb3J0U3RhYmxlJiZ0LnNsaWNlKDApLHQuc29ydChBKSxmKXtmb3IoO2U9dFtpKytdOyllPT09dFtpXSYmKG89ci5wdXNoKGkpKTtmb3IoO28tLTspdC5zcGxpY2UocltvXSwxKX1yZXR1cm4gbD1udWxsLHR9LG89c3QuZ2V0VGV4dD1mdW5jdGlvbih0KXt2YXIgZSxuPSIiLHI9MCxpPXQubm9kZVR5cGU7aWYoaSl7aWYoMT09PWl8fDk9PT1pfHwxMT09PWkpe2lmKCJzdHJpbmciPT10eXBlb2YgdC50ZXh0Q29udGVudClyZXR1cm4gdC50ZXh0Q29udGVudDtmb3IodD10LmZpcnN0Q2hpbGQ7dDt0PXQubmV4dFNpYmxpbmcpbis9byh0KX1lbHNlIGlmKDM9PT1pfHw0PT09aSlyZXR1cm4gdC5ub2RlVmFsdWV9ZWxzZSBmb3IoO2U9dFtyKytdOyluKz1vKGUpO3JldHVybiBufSwocj1zdC5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpjdCxtYXRjaDpHLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbih0KXtyZXR1cm4gdFsxXT10WzFdLnJlcGxhY2UoZXQsbnQpLHRbM109KHRbM118fHRbNF18fHRbNV18fCIiKS5yZXBsYWNlKGV0LG50KSwifj0iPT09dFsyXSYmKHRbM109IiAiK3RbM10rIiAiKSx0LnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKHQpe3JldHVybiB0WzFdPXRbMV0udG9Mb3dlckNhc2UoKSwibnRoIj09PXRbMV0uc2xpY2UoMCwzKT8odFszXXx8c3QuZXJyb3IodFswXSksdFs0XT0rKHRbNF0/dFs1XSsodFs2XXx8MSk6MiooImV2ZW4iPT09dFszXXx8Im9kZCI9PT10WzNdKSksdFs1XT0rKHRbN10rdFs4XXx8Im9kZCI9PT10WzNdKSk6dFszXSYmc3QuZXJyb3IodFswXSksdH0sUFNFVURPOmZ1bmN0aW9uKHQpe3ZhciBlLG49IXRbNl0mJnRbMl07cmV0dXJuIEcuQ0hJTEQudGVzdCh0WzBdKT9udWxsOih0WzNdP3RbMl09dFs0XXx8dFs1XXx8IiI6biYmWS50ZXN0KG4pJiYoZT1hKG4sITApKSYmKGU9bi5pbmRleE9mKCIpIixuLmxlbmd0aC1lKS1uLmxlbmd0aCkmJih0WzBdPXRbMF0uc2xpY2UoMCxlKSx0WzJdPW4uc2xpY2UoMCxlKSksdC5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKHQpe3ZhciBlPXQucmVwbGFjZShldCxudCkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT10P2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKHQpe3JldHVybiB0Lm5vZGVOYW1lJiZ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1lfX0sQ0xBU1M6ZnVuY3Rpb24odCl7dmFyIGU9RVt0KyIgIl07cmV0dXJuIGV8fChlPW5ldyBSZWdFeHAoIihefCIrTSsiKSIrdCsiKCIrTSsifCQpIikpJiZFKHQsZnVuY3Rpb24odCl7cmV0dXJuIGUudGVzdCgic3RyaW5nIj09dHlwZW9mIHQuY2xhc3NOYW1lJiZ0LmNsYXNzTmFtZXx8dm9pZCAwIT09dC5nZXRBdHRyaWJ1dGUmJnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbih0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKHIpe3ZhciBvPXN0LmF0dHIocix0KTtyZXR1cm4gbnVsbD09bz8iIT0iPT09ZTohZXx8KG8rPSIiLCI9Ij09PWU/bz09PW46IiE9Ij09PWU/byE9PW46Il49Ij09PWU/biYmMD09PW8uaW5kZXhPZihuKToiKj0iPT09ZT9uJiZvLmluZGV4T2Yobik+LTE6IiQ9Ij09PWU/biYmby5zbGljZSgtbi5sZW5ndGgpPT09bjoifj0iPT09ZT8oIiAiK28ucmVwbGFjZShGLCIgIikrIiAiKS5pbmRleE9mKG4pPi0xOiJ8PSI9PT1lJiYobz09PW58fG8uc2xpY2UoMCxuLmxlbmd0aCsxKT09PW4rIi0iKSl9fSxDSElMRDpmdW5jdGlvbih0LGUsbixyLG8pe3ZhciBpPSJudGgiIT09dC5zbGljZSgwLDMpLGE9Imxhc3QiIT09dC5zbGljZSgtNCkscz0ib2YtdHlwZSI9PT1lO3JldHVybiAxPT09ciYmMD09PW8/ZnVuY3Rpb24odCl7cmV0dXJuISF0LnBhcmVudE5vZGV9OmZ1bmN0aW9uKGUsbix1KXt2YXIgYyxsLGYscCxoLGQsZz1pIT09YT8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLHY9ZS5wYXJlbnROb2RlLHk9cyYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLG09IXUmJiFzLGI9ITE7aWYodil7aWYoaSl7Zm9yKDtnOyl7Zm9yKHA9ZTtwPXBbZ107KWlmKHM/cC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09eToxPT09cC5ub2RlVHlwZSlyZXR1cm4hMTtkPWc9Im9ubHkiPT09dCYmIWQmJiJuZXh0U2libGluZyJ9cmV0dXJuITB9aWYoZD1bYT92LmZpcnN0Q2hpbGQ6di5sYXN0Q2hpbGRdLGEmJm0pe2ZvcihiPShoPShjPShsPShmPShwPXYpW3hdfHwocFt4XT17fSkpW3AudW5pcXVlSURdfHwoZltwLnVuaXF1ZUlEXT17fSkpW3RdfHxbXSlbMF09PT1rJiZjWzFdKSYmY1syXSxwPWgmJnYuY2hpbGROb2Rlc1toXTtwPSsraCYmcCYmcFtnXXx8KGI9aD0wKXx8ZC5wb3AoKTspaWYoMT09PXAubm9kZVR5cGUmJisrYiYmcD09PWUpe2xbdF09W2ssaCxiXTticmVha319ZWxzZSBpZihtJiYoYj1oPShjPShsPShmPShwPWUpW3hdfHwocFt4XT17fSkpW3AudW5pcXVlSURdfHwoZltwLnVuaXF1ZUlEXT17fSkpW3RdfHxbXSlbMF09PT1rJiZjWzFdKSwhMT09PWIpZm9yKDsocD0rK2gmJnAmJnBbZ118fChiPWg9MCl8fGQucG9wKCkpJiYoKHM/cC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09eToxIT09cC5ub2RlVHlwZSl8fCErK2J8fChtJiYoKGw9KGY9cFt4XXx8KHBbeF09e30pKVtwLnVuaXF1ZUlEXXx8KGZbcC51bmlxdWVJRF09e30pKVt0XT1bayxiXSkscCE9PWUpKTspO3JldHVybihiLT1vKT09PXJ8fGIlcj09MCYmYi9yPj0wfX19LFBTRVVETzpmdW5jdGlvbih0LGUpe3ZhciBuLG89ci5wc2V1ZG9zW3RdfHxyLnNldEZpbHRlcnNbdC50b0xvd2VyQ2FzZSgpXXx8c3QuZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIit0KTtyZXR1cm4gb1t4XT9vKGUpOm8ubGVuZ3RoPjE/KG49W3QsdCwiIixlXSxyLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkodC50b0xvd2VyQ2FzZSgpKT9jdChmdW5jdGlvbih0LG4pe2Zvcih2YXIgcixpPW8odCxlKSxhPWkubGVuZ3RoO2EtLTspdFtyPV8odCxpW2FdKV09IShuW3JdPWlbYV0pfSk6ZnVuY3Rpb24odCl7cmV0dXJuIG8odCwwLG4pfSk6b319LHBzZXVkb3M6e25vdDpjdChmdW5jdGlvbih0KXt2YXIgZT1bXSxuPVtdLHI9cyh0LnJlcGxhY2UoSCwiJDEiKSk7cmV0dXJuIHJbeF0/Y3QoZnVuY3Rpb24odCxlLG4sbyl7Zm9yKHZhciBpLGE9cih0LG51bGwsbyxbXSkscz10Lmxlbmd0aDtzLS07KShpPWFbc10pJiYodFtzXT0hKGVbc109aSkpfSk6ZnVuY3Rpb24odCxvLGkpe3JldHVybiBlWzBdPXQscihlLG51bGwsaSxuKSxlWzBdPW51bGwsIW4ucG9wKCl9fSksaGFzOmN0KGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gc3QodCxlKS5sZW5ndGg+MH19KSxjb250YWluczpjdChmdW5jdGlvbih0KXtyZXR1cm4gdD10LnJlcGxhY2UoZXQsbnQpLGZ1bmN0aW9uKGUpe3JldHVybihlLnRleHRDb250ZW50fHxvKGUpKS5pbmRleE9mKHQpPi0xfX0pLGxhbmc6Y3QoZnVuY3Rpb24odCl7cmV0dXJuIFYudGVzdCh0fHwiIil8fHN0LmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK3QpLHQ9dC5yZXBsYWNlKGV0LG50KS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKGUpe3ZhciBuO2Rve2lmKG49Zz9lLmxhbmc6ZS5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIil8fGUuZ2V0QXR0cmlidXRlKCJsYW5nIikpcmV0dXJuKG49bi50b0xvd2VyQ2FzZSgpKT09PXR8fDA9PT1uLmluZGV4T2YodCsiLSIpfXdoaWxlKChlPWUucGFyZW50Tm9kZSkmJjE9PT1lLm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oZSl7dmFyIG49dC5sb2NhdGlvbiYmdC5sb2NhdGlvbi5oYXNoO3JldHVybiBuJiZuLnNsaWNlKDEpPT09ZS5pZH0scm9vdDpmdW5jdGlvbih0KXtyZXR1cm4gdD09PWR9LGZvY3VzOmZ1bmN0aW9uKHQpe3JldHVybiB0PT09aC5hY3RpdmVFbGVtZW50JiYoIWguaGFzRm9jdXN8fGguaGFzRm9jdXMoKSkmJiEhKHQudHlwZXx8dC5ocmVmfHx+dC50YWJJbmRleCl9LGVuYWJsZWQ6Z3QoITEpLGRpc2FibGVkOmd0KCEwKSxjaGVja2VkOmZ1bmN0aW9uKHQpe3ZhciBlPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09ZSYmISF0LmNoZWNrZWR8fCJvcHRpb24iPT09ZSYmISF0LnNlbGVjdGVkfSxzZWxlY3RlZDpmdW5jdGlvbih0KXtyZXR1cm4gdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCwhMD09PXQuc2VsZWN0ZWR9LGVtcHR5OmZ1bmN0aW9uKHQpe2Zvcih0PXQuZmlyc3RDaGlsZDt0O3Q9dC5uZXh0U2libGluZylpZih0Lm5vZGVUeXBlPDYpcmV0dXJuITE7cmV0dXJuITB9LHBhcmVudDpmdW5jdGlvbih0KXtyZXR1cm4hci5wc2V1ZG9zLmVtcHR5KHQpfSxoZWFkZXI6ZnVuY3Rpb24odCl7cmV0dXJuIEoudGVzdCh0Lm5vZGVOYW1lKX0saW5wdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIFgudGVzdCh0Lm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKHQpe3ZhciBlPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09ZSYmImJ1dHRvbiI9PT10LnR5cGV8fCJidXR0b24iPT09ZX0sdGV4dDpmdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4iaW5wdXQiPT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4dCI9PT10LnR5cGUmJihudWxsPT0oZT10LmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8InRleHQiPT09ZS50b0xvd2VyQ2FzZSgpKX0sZmlyc3Q6dnQoZnVuY3Rpb24oKXtyZXR1cm5bMF19KSxsYXN0OnZ0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuW2UtMV19KSxlcTp2dChmdW5jdGlvbih0LGUsbil7cmV0dXJuW248MD9uK2U6bl19KSxldmVuOnZ0KGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjxlO24rPTIpdC5wdXNoKG4pO3JldHVybiB0fSksb2RkOnZ0KGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTE7bjxlO24rPTIpdC5wdXNoKG4pO3JldHVybiB0fSksbHQ6dnQoZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj1uPDA/bitlOm4+ZT9lOm47LS1yPj0wOyl0LnB1c2gocik7cmV0dXJuIHR9KSxndDp2dChmdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPW48MD9uK2U6bjsrK3I8ZTspdC5wdXNoKHIpO3JldHVybiB0fSl9fSkucHNldWRvcy5udGg9ci5wc2V1ZG9zLmVxLHtyYWRpbzohMCxjaGVja2JveDohMCxmaWxlOiEwLHBhc3N3b3JkOiEwLGltYWdlOiEwfSlyLnBzZXVkb3NbZV09aHQoZSk7Zm9yKGUgaW57c3VibWl0OiEwLHJlc2V0OiEwfSlyLnBzZXVkb3NbZV09ZHQoZSk7ZnVuY3Rpb24gbXQoKXt9ZnVuY3Rpb24gYnQodCl7Zm9yKHZhciBlPTAsbj10Lmxlbmd0aCxyPSIiO2U8bjtlKyspcis9dFtlXS52YWx1ZTtyZXR1cm4gcn1mdW5jdGlvbiB4dCh0LGUsbil7dmFyIHI9ZS5kaXIsbz1lLm5leHQsaT1vfHxyLGE9biYmInBhcmVudE5vZGUiPT09aSxzPVMrKztyZXR1cm4gZS5maXJzdD9mdW5jdGlvbihlLG4sbyl7Zm9yKDtlPWVbcl07KWlmKDE9PT1lLm5vZGVUeXBlfHxhKXJldHVybiB0KGUsbixvKTtyZXR1cm4hMX06ZnVuY3Rpb24oZSxuLHUpe3ZhciBjLGwsZixwPVtrLHNdO2lmKHUpe2Zvcig7ZT1lW3JdOylpZigoMT09PWUubm9kZVR5cGV8fGEpJiZ0KGUsbix1KSlyZXR1cm4hMH1lbHNlIGZvcig7ZT1lW3JdOylpZigxPT09ZS5ub2RlVHlwZXx8YSlpZihsPShmPWVbeF18fChlW3hdPXt9KSlbZS51bmlxdWVJRF18fChmW2UudW5pcXVlSURdPXt9KSxvJiZvPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKWU9ZVtyXXx8ZTtlbHNle2lmKChjPWxbaV0pJiZjWzBdPT09ayYmY1sxXT09PXMpcmV0dXJuIHBbMl09Y1syXTtpZihsW2ldPXAscFsyXT10KGUsbix1KSlyZXR1cm4hMH1yZXR1cm4hMX19ZnVuY3Rpb24gd3QodCl7cmV0dXJuIHQubGVuZ3RoPjE/ZnVuY3Rpb24oZSxuLHIpe2Zvcih2YXIgbz10Lmxlbmd0aDtvLS07KWlmKCF0W29dKGUsbixyKSlyZXR1cm4hMTtyZXR1cm4hMH06dFswXX1mdW5jdGlvbiBrdCh0LGUsbixyLG8pe2Zvcih2YXIgaSxhPVtdLHM9MCx1PXQubGVuZ3RoLGM9bnVsbCE9ZTtzPHU7cysrKShpPXRbc10pJiYobiYmIW4oaSxyLG8pfHwoYS5wdXNoKGkpLGMmJmUucHVzaChzKSkpO3JldHVybiBhfWZ1bmN0aW9uIFN0KHQsZSxuLHIsbyxpKXtyZXR1cm4gciYmIXJbeF0mJihyPVN0KHIpKSxvJiYhb1t4XSYmKG89U3QobyxpKSksY3QoZnVuY3Rpb24oaSxhLHMsdSl7dmFyIGMsbCxmLHA9W10saD1bXSxkPWEubGVuZ3RoLGc9aXx8ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgcj0wLG89ZS5sZW5ndGg7cjxvO3IrKylzdCh0LGVbcl0sbik7cmV0dXJuIG59KGV8fCIqIixzLm5vZGVUeXBlP1tzXTpzLFtdKSx2PSF0fHwhaSYmZT9nOmt0KGcscCx0LHMsdSkseT1uP298fChpP3Q6ZHx8cik/W106YTp2O2lmKG4mJm4odix5LHMsdSkscilmb3IoYz1rdCh5LGgpLHIoYyxbXSxzLHUpLGw9Yy5sZW5ndGg7bC0tOykoZj1jW2xdKSYmKHlbaFtsXV09ISh2W2hbbF1dPWYpKTtpZihpKXtpZihvfHx0KXtpZihvKXtmb3IoYz1bXSxsPXkubGVuZ3RoO2wtLTspKGY9eVtsXSkmJmMucHVzaCh2W2xdPWYpO28obnVsbCx5PVtdLGMsdSl9Zm9yKGw9eS5sZW5ndGg7bC0tOykoZj15W2xdKSYmKGM9bz9fKGksZik6cFtsXSk+LTEmJihpW2NdPSEoYVtjXT1mKSl9fWVsc2UgeT1rdCh5PT09YT95LnNwbGljZShkLHkubGVuZ3RoKTp5KSxvP28obnVsbCxhLHksdSk6Ti5hcHBseShhLHkpfSl9ZnVuY3Rpb24gRXQodCl7Zm9yKHZhciBlLG4sbyxpPXQubGVuZ3RoLGE9ci5yZWxhdGl2ZVt0WzBdLnR5cGVdLHM9YXx8ci5yZWxhdGl2ZVsiICJdLHU9YT8xOjAsbD14dChmdW5jdGlvbih0KXtyZXR1cm4gdD09PWV9LHMsITApLGY9eHQoZnVuY3Rpb24odCl7cmV0dXJuIF8oZSx0KT4tMX0scywhMCkscD1bZnVuY3Rpb24odCxuLHIpe3ZhciBvPSFhJiYocnx8biE9PWMpfHwoKGU9bikubm9kZVR5cGU/bCh0LG4scik6Zih0LG4scikpO3JldHVybiBlPW51bGwsb31dO3U8aTt1KyspaWYobj1yLnJlbGF0aXZlW3RbdV0udHlwZV0pcD1beHQod3QocCksbildO2Vsc2V7aWYoKG49ci5maWx0ZXJbdFt1XS50eXBlXS5hcHBseShudWxsLHRbdV0ubWF0Y2hlcykpW3hdKXtmb3Iobz0rK3U7bzxpJiYhci5yZWxhdGl2ZVt0W29dLnR5cGVdO28rKyk7cmV0dXJuIFN0KHU+MSYmd3QocCksdT4xJiZidCh0LnNsaWNlKDAsdS0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PXRbdS0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKEgsIiQxIiksbix1PG8mJkV0KHQuc2xpY2UodSxvKSksbzxpJiZFdCh0PXQuc2xpY2UobykpLG88aSYmYnQodCkpfXAucHVzaChuKX1yZXR1cm4gd3QocCl9cmV0dXJuIG10LnByb3RvdHlwZT1yLmZpbHRlcnM9ci5wc2V1ZG9zLHIuc2V0RmlsdGVycz1uZXcgbXQsYT1zdC50b2tlbml6ZT1mdW5jdGlvbih0LGUpe3ZhciBuLG8saSxhLHMsdSxjLGw9alt0KyIgIl07aWYobClyZXR1cm4gZT8wOmwuc2xpY2UoMCk7Zm9yKHM9dCx1PVtdLGM9ci5wcmVGaWx0ZXI7czspe2ZvcihhIGluIG4mJiEobz16LmV4ZWMocykpfHwobyYmKHM9cy5zbGljZShvWzBdLmxlbmd0aCl8fHMpLHUucHVzaChpPVtdKSksbj0hMSwobz1XLmV4ZWMocykpJiYobj1vLnNoaWZ0KCksaS5wdXNoKHt2YWx1ZTpuLHR5cGU6b1swXS5yZXBsYWNlKEgsIiAiKX0pLHM9cy5zbGljZShuLmxlbmd0aCkpLHIuZmlsdGVyKSEobz1HW2FdLmV4ZWMocykpfHxjW2FdJiYhKG89Y1thXShvKSl8fChuPW8uc2hpZnQoKSxpLnB1c2goe3ZhbHVlOm4sdHlwZTphLG1hdGNoZXM6b30pLHM9cy5zbGljZShuLmxlbmd0aCkpO2lmKCFuKWJyZWFrfXJldHVybiBlP3MubGVuZ3RoOnM/c3QuZXJyb3IodCk6aih0LHUpLnNsaWNlKDApfSxzPXN0LmNvbXBpbGU9ZnVuY3Rpb24odCxlKXt2YXIgbixvPVtdLGk9W10scz1UW3QrIiAiXTtpZighcyl7Zm9yKGV8fChlPWEodCkpLG49ZS5sZW5ndGg7bi0tOykocz1FdChlW25dKSlbeF0/by5wdXNoKHMpOmkucHVzaChzKTsocz1UKHQsZnVuY3Rpb24odCxlKXt2YXIgbj1lLmxlbmd0aD4wLG89dC5sZW5ndGg+MCxpPWZ1bmN0aW9uKGksYSxzLHUsbCl7dmFyIGYsZCx2LHk9MCxtPSIwIixiPWkmJltdLHg9W10sdz1jLFM9aXx8byYmci5maW5kLlRBRygiKiIsbCksRT1rKz1udWxsPT13PzE6TWF0aC5yYW5kb20oKXx8LjEsaj1TLmxlbmd0aDtmb3IobCYmKGM9YT09PWh8fGF8fGwpO20hPT1qJiZudWxsIT0oZj1TW21dKTttKyspe2lmKG8mJmYpe2ZvcihkPTAsYXx8Zi5vd25lckRvY3VtZW50PT09aHx8KHAoZikscz0hZyk7dj10W2QrK107KWlmKHYoZixhfHxoLHMpKXt1LnB1c2goZik7YnJlYWt9bCYmKGs9RSl9biYmKChmPSF2JiZmKSYmeS0tLGkmJmIucHVzaChmKSl9aWYoeSs9bSxuJiZtIT09eSl7Zm9yKGQ9MDt2PWVbZCsrXTspdihiLHgsYSxzKTtpZihpKXtpZih5PjApZm9yKDttLS07KWJbbV18fHhbbV18fCh4W21dPVIuY2FsbCh1KSk7eD1rdCh4KX1OLmFwcGx5KHUseCksbCYmIWkmJngubGVuZ3RoPjAmJnkrZS5sZW5ndGg+MSYmc3QudW5pcXVlU29ydCh1KX1yZXR1cm4gbCYmKGs9RSxjPXcpLGJ9O3JldHVybiBuP2N0KGkpOml9KGksbykpKS5zZWxlY3Rvcj10fXJldHVybiBzfSx1PXN0LnNlbGVjdD1mdW5jdGlvbih0LGUsbixvKXt2YXIgaSx1LGMsbCxmLHA9ImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQsaD0hbyYmYSh0PXAuc2VsZWN0b3J8fHQpO2lmKG49bnx8W10sMT09PWgubGVuZ3RoKXtpZigodT1oWzBdPWhbMF0uc2xpY2UoMCkpLmxlbmd0aD4yJiYiSUQiPT09KGM9dVswXSkudHlwZSYmOT09PWUubm9kZVR5cGUmJmcmJnIucmVsYXRpdmVbdVsxXS50eXBlXSl7aWYoIShlPShyLmZpbmQuSUQoYy5tYXRjaGVzWzBdLnJlcGxhY2UoZXQsbnQpLGUpfHxbXSlbMF0pKXJldHVybiBuO3AmJihlPWUucGFyZW50Tm9kZSksdD10LnNsaWNlKHUuc2hpZnQoKS52YWx1ZS5sZW5ndGgpfWZvcihpPUcubmVlZHNDb250ZXh0LnRlc3QodCk/MDp1Lmxlbmd0aDtpLS0mJihjPXVbaV0sIXIucmVsYXRpdmVbbD1jLnR5cGVdKTspaWYoKGY9ci5maW5kW2xdKSYmKG89ZihjLm1hdGNoZXNbMF0ucmVwbGFjZShldCxudCksdHQudGVzdCh1WzBdLnR5cGUpJiZ5dChlLnBhcmVudE5vZGUpfHxlKSkpe2lmKHUuc3BsaWNlKGksMSksISh0PW8ubGVuZ3RoJiZidCh1KSkpcmV0dXJuIE4uYXBwbHkobixvKSxuO2JyZWFrfX1yZXR1cm4ocHx8cyh0LGgpKShvLGUsIWcsbiwhZXx8dHQudGVzdCh0KSYmeXQoZS5wYXJlbnROb2RlKXx8ZSksbn0sbi5zb3J0U3RhYmxlPXguc3BsaXQoIiIpLnNvcnQoQSkuam9pbigiIik9PT14LG4uZGV0ZWN0RHVwbGljYXRlcz0hIWYscCgpLG4uc29ydERldGFjaGVkPWx0KGZ1bmN0aW9uKHQpe3JldHVybiAxJnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oaC5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpKX0pLGx0KGZ1bmN0aW9uKHQpe3JldHVybiB0LmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09dC5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGZ0KCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoIixmdW5jdGlvbih0LGUsbil7aWYoIW4pcmV0dXJuIHQuZ2V0QXR0cmlidXRlKGUsInR5cGUiPT09ZS50b0xvd2VyQ2FzZSgpPzE6Mil9KSxuLmF0dHJpYnV0ZXMmJmx0KGZ1bmN0aW9uKHQpe3JldHVybiB0LmlubmVySFRNTD0iPGlucHV0Lz4iLHQuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIiksIiI9PT10LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpfSl8fGZ0KCJ2YWx1ZSIsZnVuY3Rpb24odCxlLG4pe2lmKCFuJiYiaW5wdXQiPT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXJldHVybiB0LmRlZmF1bHRWYWx1ZX0pLGx0KGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10LmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKX0pfHxmdChELGZ1bmN0aW9uKHQsZSxuKXt2YXIgcjtpZighbilyZXR1cm4hMD09PXRbZV0/ZS50b0xvd2VyQ2FzZSgpOihyPXQuZ2V0QXR0cmlidXRlTm9kZShlKSkmJnIuc3BlY2lmaWVkP3IudmFsdWU6bnVsbH0pLHN0fShuKTtTLmZpbmQ9VCxTLmV4cHI9VC5zZWxlY3RvcnMsUy5leHByWyI6Il09Uy5leHByLnBzZXVkb3MsUy51bmlxdWVTb3J0PVMudW5pcXVlPVQudW5pcXVlU29ydCxTLnRleHQ9VC5nZXRUZXh0LFMuaXNYTUxEb2M9VC5pc1hNTCxTLmNvbnRhaW5zPVQuY29udGFpbnMsUy5lc2NhcGVTZWxlY3Rvcj1ULmVzY2FwZTt2YXIgTz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByPVtdLG89dm9pZCAwIT09bjsodD10W2VdKSYmOSE9PXQubm9kZVR5cGU7KWlmKDE9PT10Lm5vZGVUeXBlKXtpZihvJiZTKHQpLmlzKG4pKWJyZWFrO3IucHVzaCh0KX1yZXR1cm4gcn0sQT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1bXTt0O3Q9dC5uZXh0U2libGluZykxPT09dC5ub2RlVHlwZSYmdCE9PWUmJm4ucHVzaCh0KTtyZXR1cm4gbn0sQz1TLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O2Z1bmN0aW9uIEwodCxlKXtyZXR1cm4gdC5ub2RlTmFtZSYmdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09ZS50b0xvd2VyQ2FzZSgpfXZhciBSPS9ePChbYS16XVteXC9cMD46XHgyMFx0XHJcblxmXSopW1x4MjBcdFxyXG5cZl0qXC8/Pig/OjxcL1wxPnwpJC9pO2Z1bmN0aW9uIFAodCxlLG4pe3JldHVybiBtKGUpP1MuZ3JlcCh0LGZ1bmN0aW9uKHQscil7cmV0dXJuISFlLmNhbGwodCxyLHQpIT09bn0pOmUubm9kZVR5cGU/Uy5ncmVwKHQsZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1lIT09bn0pOiJzdHJpbmciIT10eXBlb2YgZT9TLmdyZXAodCxmdW5jdGlvbih0KXtyZXR1cm4gZi5jYWxsKGUsdCk+LTEhPT1ufSk6Uy5maWx0ZXIoZSx0LG4pfVMuZmlsdGVyPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1lWzBdO3JldHVybiBuJiYodD0iOm5vdCgiK3QrIikiKSwxPT09ZS5sZW5ndGgmJjE9PT1yLm5vZGVUeXBlP1MuZmluZC5tYXRjaGVzU2VsZWN0b3Iocix0KT9bcl06W106Uy5maW5kLm1hdGNoZXModCxTLmdyZXAoZSxmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQubm9kZVR5cGV9KSl9LFMuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKHQpe3ZhciBlLG4scj10aGlzLmxlbmd0aCxvPXRoaXM7aWYoInN0cmluZyIhPXR5cGVvZiB0KXJldHVybiB0aGlzLnB1c2hTdGFjayhTKHQpLmZpbHRlcihmdW5jdGlvbigpe2ZvcihlPTA7ZTxyO2UrKylpZihTLmNvbnRhaW5zKG9bZV0sdGhpcykpcmV0dXJuITB9KSk7Zm9yKG49dGhpcy5wdXNoU3RhY2soW10pLGU9MDtlPHI7ZSsrKVMuZmluZCh0LG9bZV0sbik7cmV0dXJuIHI+MT9TLnVuaXF1ZVNvcnQobik6bn0sZmlsdGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayhQKHRoaXMsdHx8W10sITEpKX0sbm90OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayhQKHRoaXMsdHx8W10sITApKX0saXM6ZnVuY3Rpb24odCl7cmV0dXJuISFQKHRoaXMsInN0cmluZyI9PXR5cGVvZiB0JiZDLnRlc3QodCk/Uyh0KTp0fHxbXSwhMSkubGVuZ3RofX0pO3ZhciBOLEk9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLzsoUy5mbi5pbml0PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvO2lmKCF0KXJldHVybiB0aGlzO2lmKG49bnx8Tiwic3RyaW5nIj09dHlwZW9mIHQpe2lmKCEocj0iPCI9PT10WzBdJiYiPiI9PT10W3QubGVuZ3RoLTFdJiZ0Lmxlbmd0aD49Mz9bbnVsbCx0LG51bGxdOkkuZXhlYyh0KSl8fCFyWzFdJiZlKXJldHVybiFlfHxlLmpxdWVyeT8oZXx8bikuZmluZCh0KTp0aGlzLmNvbnN0cnVjdG9yKGUpLmZpbmQodCk7aWYoclsxXSl7aWYoZT1lIGluc3RhbmNlb2YgUz9lWzBdOmUsUy5tZXJnZSh0aGlzLFMucGFyc2VIVE1MKHJbMV0sZSYmZS5ub2RlVHlwZT9lLm93bmVyRG9jdW1lbnR8fGU6YSwhMCkpLFIudGVzdChyWzFdKSYmUy5pc1BsYWluT2JqZWN0KGUpKWZvcihyIGluIGUpbSh0aGlzW3JdKT90aGlzW3JdKGVbcl0pOnRoaXMuYXR0cihyLGVbcl0pO3JldHVybiB0aGlzfXJldHVybihvPWEuZ2V0RWxlbWVudEJ5SWQoclsyXSkpJiYodGhpc1swXT1vLHRoaXMubGVuZ3RoPTEpLHRoaXN9cmV0dXJuIHQubm9kZVR5cGU/KHRoaXNbMF09dCx0aGlzLmxlbmd0aD0xLHRoaXMpOm0odCk/dm9pZCAwIT09bi5yZWFkeT9uLnJlYWR5KHQpOnQoUyk6Uy5tYWtlQXJyYXkodCx0aGlzKX0pLnByb3RvdHlwZT1TLmZuLE49UyhhKTt2YXIgXz0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxEPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2Z1bmN0aW9uIE0odCxlKXtmb3IoOyh0PXRbZV0pJiYxIT09dC5ub2RlVHlwZTspO3JldHVybiB0fVMuZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24odCl7dmFyIGU9Uyh0LHRoaXMpLG49ZS5sZW5ndGg7cmV0dXJuIHRoaXMuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDxuO3QrKylpZihTLmNvbnRhaW5zKHRoaXMsZVt0XSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbih0LGUpe3ZhciBuLHI9MCxvPXRoaXMubGVuZ3RoLGk9W10sYT0ic3RyaW5nIiE9dHlwZW9mIHQmJlModCk7aWYoIUMudGVzdCh0KSlmb3IoO3I8bztyKyspZm9yKG49dGhpc1tyXTtuJiZuIT09ZTtuPW4ucGFyZW50Tm9kZSlpZihuLm5vZGVUeXBlPDExJiYoYT9hLmluZGV4KG4pPi0xOjE9PT1uLm5vZGVUeXBlJiZTLmZpbmQubWF0Y2hlc1NlbGVjdG9yKG4sdCkpKXtpLnB1c2gobik7YnJlYWt9cmV0dXJuIHRoaXMucHVzaFN0YWNrKGkubGVuZ3RoPjE/Uy51bmlxdWVTb3J0KGkpOmkpfSxpbmRleDpmdW5jdGlvbih0KXtyZXR1cm4gdD8ic3RyaW5nIj09dHlwZW9mIHQ/Zi5jYWxsKFModCksdGhpc1swXSk6Zi5jYWxsKHRoaXMsdC5qcXVlcnk/dFswXTp0KTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnB1c2hTdGFjayhTLnVuaXF1ZVNvcnQoUy5tZXJnZSh0aGlzLmdldCgpLFModCxlKSkpKX0sYWRkQmFjazpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5hZGQobnVsbD09dD90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcih0KSl9fSksUy5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24odCl7dmFyIGU9dC5wYXJlbnROb2RlO3JldHVybiBlJiYxMSE9PWUubm9kZVR5cGU/ZTpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKHQpe3JldHVybiBPKHQsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gTyh0LCJwYXJlbnROb2RlIixuKX0sbmV4dDpmdW5jdGlvbih0KXtyZXR1cm4gTSh0LCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKHQpe3JldHVybiBNKHQsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKHQpe3JldHVybiBPKHQsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24odCl7cmV0dXJuIE8odCwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbih0LGUsbil7cmV0dXJuIE8odCwibmV4dFNpYmxpbmciLG4pfSxwcmV2VW50aWw6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBPKHQsInByZXZpb3VzU2libGluZyIsbil9LHNpYmxpbmdzOmZ1bmN0aW9uKHQpe3JldHVybiBBKCh0LnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLHQpfSxjaGlsZHJlbjpmdW5jdGlvbih0KXtyZXR1cm4gQSh0LmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwIT09dC5jb250ZW50RG9jdW1lbnQ/dC5jb250ZW50RG9jdW1lbnQ6KEwodCwidGVtcGxhdGUiKSYmKHQ9dC5jb250ZW50fHx0KSxTLm1lcmdlKFtdLHQuY2hpbGROb2RlcykpfX0sZnVuY3Rpb24odCxlKXtTLmZuW3RdPWZ1bmN0aW9uKG4scil7dmFyIG89Uy5tYXAodGhpcyxlLG4pO3JldHVybiJVbnRpbCIhPT10LnNsaWNlKC01KSYmKHI9biksciYmInN0cmluZyI9PXR5cGVvZiByJiYobz1TLmZpbHRlcihyLG8pKSx0aGlzLmxlbmd0aD4xJiYoRFt0XXx8Uy51bmlxdWVTb3J0KG8pLF8udGVzdCh0KSYmby5yZXZlcnNlKCkpLHRoaXMucHVzaFN0YWNrKG8pfX0pO3ZhciBVPS9bXlx4MjBcdFxyXG5cZl0rL2c7ZnVuY3Rpb24gQih0KXtyZXR1cm4gdH1mdW5jdGlvbiBxKHQpe3Rocm93IHR9ZnVuY3Rpb24gRih0LGUsbixyKXt2YXIgbzt0cnl7dCYmbShvPXQucHJvbWlzZSk/by5jYWxsKHQpLmRvbmUoZSkuZmFpbChuKTp0JiZtKG89dC50aGVuKT9vLmNhbGwodCxlLG4pOmUuYXBwbHkodm9pZCAwLFt0XS5zbGljZShyKSl9Y2F0Y2godCl7bi5hcHBseSh2b2lkIDAsW3RdKX19Uy5DYWxsYmFja3M9ZnVuY3Rpb24odCl7dD0ic3RyaW5nIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCl7dmFyIGU9e307cmV0dXJuIFMuZWFjaCh0Lm1hdGNoKFUpfHxbXSxmdW5jdGlvbih0LG4pe2Vbbl09ITB9KSxlfSh0KTpTLmV4dGVuZCh7fSx0KTt2YXIgZSxuLHIsbyxpPVtdLGE9W10scz0tMSx1PWZ1bmN0aW9uKCl7Zm9yKG89b3x8dC5vbmNlLHI9ZT0hMDthLmxlbmd0aDtzPS0xKWZvcihuPWEuc2hpZnQoKTsrK3M8aS5sZW5ndGg7KSExPT09aVtzXS5hcHBseShuWzBdLG5bMV0pJiZ0LnN0b3BPbkZhbHNlJiYocz1pLmxlbmd0aCxuPSExKTt0Lm1lbW9yeXx8KG49ITEpLGU9ITEsbyYmKGk9bj9bXToiIil9LGM9e2FkZDpmdW5jdGlvbigpe3JldHVybiBpJiYobiYmIWUmJihzPWkubGVuZ3RoLTEsYS5wdXNoKG4pKSxmdW5jdGlvbiBlKG4pe1MuZWFjaChuLGZ1bmN0aW9uKG4scil7bShyKT90LnVuaXF1ZSYmYy5oYXMocil8fGkucHVzaChyKTpyJiZyLmxlbmd0aCYmInN0cmluZyIhPT1rKHIpJiZlKHIpfSl9KGFyZ3VtZW50cyksbiYmIWUmJnUoKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIFMuZWFjaChhcmd1bWVudHMsZnVuY3Rpb24odCxlKXtmb3IodmFyIG47KG49Uy5pbkFycmF5KGUsaSxuKSk+LTE7KWkuc3BsaWNlKG4sMSksbjw9cyYmcy0tfSksdGhpc30saGFzOmZ1bmN0aW9uKHQpe3JldHVybiB0P1MuaW5BcnJheSh0LGkpPi0xOmkubGVuZ3RoPjB9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIGkmJihpPVtdKSx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIG89YT1bXSxpPW49IiIsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4haX0sbG9jazpmdW5jdGlvbigpe3JldHVybiBvPWE9W10sbnx8ZXx8KGk9bj0iIiksdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuISFvfSxmaXJlV2l0aDpmdW5jdGlvbih0LG4pe3JldHVybiBvfHwobj1bdCwobj1ufHxbXSkuc2xpY2U/bi5zbGljZSgpOm5dLGEucHVzaChuKSxlfHx1KCkpLHRoaXN9LGZpcmU6ZnVuY3Rpb24oKXtyZXR1cm4gYy5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyksdGhpc30sZmlyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXJ9fTtyZXR1cm4gY30sUy5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKHQpe3ZhciBlPVtbIm5vdGlmeSIsInByb2dyZXNzIixTLkNhbGxiYWNrcygibWVtb3J5IiksUy5DYWxsYmFja3MoIm1lbW9yeSIpLDJdLFsicmVzb2x2ZSIsImRvbmUiLFMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLFMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLDAsInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIixTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxTLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwxLCJyZWplY3RlZCJdXSxyPSJwZW5kaW5nIixvPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiByfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gaS5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LGNhdGNoOmZ1bmN0aW9uKHQpe3JldHVybiBvLnRoZW4obnVsbCx0KX0scGlwZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cztyZXR1cm4gUy5EZWZlcnJlZChmdW5jdGlvbihuKXtTLmVhY2goZSxmdW5jdGlvbihlLHIpe3ZhciBvPW0odFtyWzRdXSkmJnRbcls0XV07aVtyWzFdXShmdW5jdGlvbigpe3ZhciB0PW8mJm8uYXBwbHkodGhpcyxhcmd1bWVudHMpO3QmJm0odC5wcm9taXNlKT90LnByb21pc2UoKS5wcm9ncmVzcyhuLm5vdGlmeSkuZG9uZShuLnJlc29sdmUpLmZhaWwobi5yZWplY3QpOm5bclswXSsiV2l0aCJdKHRoaXMsbz9bdF06YXJndW1lbnRzKX0pfSksdD1udWxsfSkucHJvbWlzZSgpfSx0aGVuOmZ1bmN0aW9uKHQscixvKXt2YXIgaT0wO2Z1bmN0aW9uIGEodCxlLHIsbyl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHM9dGhpcyx1PWFyZ3VtZW50cyxjPWZ1bmN0aW9uKCl7dmFyIG4sYztpZighKHQ8aSkpe2lmKChuPXIuYXBwbHkocyx1KSk9PT1lLnByb21pc2UoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iKTtjPW4mJigib2JqZWN0Ij09dHlwZW9mIG58fCJmdW5jdGlvbiI9PXR5cGVvZiBuKSYmbi50aGVuLG0oYyk/bz9jLmNhbGwobixhKGksZSxCLG8pLGEoaSxlLHEsbykpOihpKyssYy5jYWxsKG4sYShpLGUsQixvKSxhKGksZSxxLG8pLGEoaSxlLEIsZS5ub3RpZnlXaXRoKSkpOihyIT09QiYmKHM9dm9pZCAwLHU9W25dKSwob3x8ZS5yZXNvbHZlV2l0aCkocyx1KSl9fSxsPW8/YzpmdW5jdGlvbigpe3RyeXtjKCl9Y2F0Y2gobil7Uy5EZWZlcnJlZC5leGNlcHRpb25Ib29rJiZTLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2sobixsLnN0YWNrVHJhY2UpLHQrMT49aSYmKHIhPT1xJiYocz12b2lkIDAsdT1bbl0pLGUucmVqZWN0V2l0aChzLHUpKX19O3Q/bCgpOihTLkRlZmVycmVkLmdldFN0YWNrSG9vayYmKGwuc3RhY2tUcmFjZT1TLkRlZmVycmVkLmdldFN0YWNrSG9vaygpKSxuLnNldFRpbWVvdXQobCkpfX1yZXR1cm4gUy5EZWZlcnJlZChmdW5jdGlvbihuKXtlWzBdWzNdLmFkZChhKDAsbixtKG8pP286QixuLm5vdGlmeVdpdGgpKSxlWzFdWzNdLmFkZChhKDAsbixtKHQpP3Q6QikpLGVbMl1bM10uYWRkKGEoMCxuLG0ocik/cjpxKSl9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQ/Uy5leHRlbmQodCxvKTpvfX0saT17fTtyZXR1cm4gUy5lYWNoKGUsZnVuY3Rpb24odCxuKXt2YXIgYT1uWzJdLHM9bls1XTtvW25bMV1dPWEuYWRkLHMmJmEuYWRkKGZ1bmN0aW9uKCl7cj1zfSxlWzMtdF1bMl0uZGlzYWJsZSxlWzMtdF1bM10uZGlzYWJsZSxlWzBdWzJdLmxvY2ssZVswXVszXS5sb2NrKSxhLmFkZChuWzNdLmZpcmUpLGlbblswXV09ZnVuY3Rpb24oKXtyZXR1cm4gaVtuWzBdKyJXaXRoIl0odGhpcz09PWk/dm9pZCAwOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxpW25bMF0rIldpdGgiXT1hLmZpcmVXaXRofSksby5wcm9taXNlKGkpLHQmJnQuY2FsbChpLGkpLGl9LHdoZW46ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aCxuPWUscj1BcnJheShuKSxvPXUuY2FsbChhcmd1bWVudHMpLGk9Uy5EZWZlcnJlZCgpLGE9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JbdF09dGhpcyxvW3RdPWFyZ3VtZW50cy5sZW5ndGg+MT91LmNhbGwoYXJndW1lbnRzKTpuLC0tZXx8aS5yZXNvbHZlV2l0aChyLG8pfX07aWYoZTw9MSYmKEYodCxpLmRvbmUoYShuKSkucmVzb2x2ZSxpLnJlamVjdCwhZSksInBlbmRpbmciPT09aS5zdGF0ZSgpfHxtKG9bbl0mJm9bbl0udGhlbikpKXJldHVybiBpLnRoZW4oKTtmb3IoO24tLTspRihvW25dLGEobiksaS5yZWplY3QpO3JldHVybiBpLnByb21pc2UoKX19KTt2YXIgSD0vXihFdmFsfEludGVybmFsfFJhbmdlfFJlZmVyZW5jZXxTeW50YXh8VHlwZXxVUkkpRXJyb3IkLztTLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2s9ZnVuY3Rpb24odCxlKXtuLmNvbnNvbGUmJm4uY29uc29sZS53YXJuJiZ0JiZILnRlc3QodC5uYW1lKSYmbi5jb25zb2xlLndhcm4oImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246ICIrdC5tZXNzYWdlLHQuc3RhY2ssZSl9LFMucmVhZHlFeGNlcHRpb249ZnVuY3Rpb24odCl7bi5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgdH0pfTt2YXIgej1TLkRlZmVycmVkKCk7ZnVuY3Rpb24gVygpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsVyksbi5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixXKSxTLnJlYWR5KCl9Uy5mbi5yZWFkeT1mdW5jdGlvbih0KXtyZXR1cm4gei50aGVuKHQpLmNhdGNoKGZ1bmN0aW9uKHQpe1MucmVhZHlFeGNlcHRpb24odCl9KSx0aGlzfSxTLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxyZWFkeTpmdW5jdGlvbih0KXsoITA9PT10Py0tUy5yZWFkeVdhaXQ6Uy5pc1JlYWR5KXx8KFMuaXNSZWFkeT0hMCwhMCE9PXQmJi0tUy5yZWFkeVdhaXQ+MHx8ei5yZXNvbHZlV2l0aChhLFtTXSkpfX0pLFMucmVhZHkudGhlbj16LnRoZW4sImNvbXBsZXRlIj09PWEucmVhZHlTdGF0ZXx8ImxvYWRpbmciIT09YS5yZWFkeVN0YXRlJiYhYS5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGw/bi5zZXRUaW1lb3V0KFMucmVhZHkpOihhLmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLFcpLG4uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsVykpO3ZhciAkPWZ1bmN0aW9uKHQsZSxuLHIsbyxpLGEpe3ZhciBzPTAsdT10Lmxlbmd0aCxjPW51bGw9PW47aWYoIm9iamVjdCI9PT1rKG4pKWZvcihzIGluIG89ITAsbikkKHQsZSxzLG5bc10sITAsaSxhKTtlbHNlIGlmKHZvaWQgMCE9PXImJihvPSEwLG0ocil8fChhPSEwKSxjJiYoYT8oZS5jYWxsKHQsciksZT1udWxsKTooYz1lLGU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBjLmNhbGwoUyh0KSxuKX0pKSxlKSlmb3IoO3M8dTtzKyspZSh0W3NdLG4sYT9yOnIuY2FsbCh0W3NdLHMsZSh0W3NdLG4pKSk7cmV0dXJuIG8/dDpjP2UuY2FsbCh0KTp1P2UodFswXSxuKTppfSxZPS9eLW1zLS8sVj0vLShbYS16XSkvZztmdW5jdGlvbiBHKHQsZSl7cmV0dXJuIGUudG9VcHBlckNhc2UoKX1mdW5jdGlvbiBLKHQpe3JldHVybiB0LnJlcGxhY2UoWSwibXMtIikucmVwbGFjZShWLEcpfXZhciBYPWZ1bmN0aW9uKHQpe3JldHVybiAxPT09dC5ub2RlVHlwZXx8OT09PXQubm9kZVR5cGV8fCErdC5ub2RlVHlwZX07ZnVuY3Rpb24gSigpe3RoaXMuZXhwYW5kbz1TLmV4cGFuZG8rSi51aWQrK31KLnVpZD0xLEoucHJvdG90eXBlPXtjYWNoZTpmdW5jdGlvbih0KXt2YXIgZT10W3RoaXMuZXhwYW5kb107cmV0dXJuIGV8fChlPXt9LFgodCkmJih0Lm5vZGVUeXBlP3RbdGhpcy5leHBhbmRvXT1lOk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHRoaXMuZXhwYW5kbyx7dmFsdWU6ZSxjb25maWd1cmFibGU6ITB9KSkpLGV9LHNldDpmdW5jdGlvbih0LGUsbil7dmFyIHIsbz10aGlzLmNhY2hlKHQpO2lmKCJzdHJpbmciPT10eXBlb2YgZSlvW0soZSldPW47ZWxzZSBmb3IociBpbiBlKW9bSyhyKV09ZVtyXTtyZXR1cm4gb30sZ2V0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMD09PWU/dGhpcy5jYWNoZSh0KTp0W3RoaXMuZXhwYW5kb10mJnRbdGhpcy5leHBhbmRvXVtLKGUpXX0sYWNjZXNzOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09ZXx8ZSYmInN0cmluZyI9PXR5cGVvZiBlJiZ2b2lkIDA9PT1uP3RoaXMuZ2V0KHQsZSk6KHRoaXMuc2V0KHQsZSxuKSx2b2lkIDAhPT1uP246ZSl9LHJlbW92ZTpmdW5jdGlvbih0LGUpe3ZhciBuLHI9dFt0aGlzLmV4cGFuZG9dO2lmKHZvaWQgMCE9PXIpe2lmKHZvaWQgMCE9PWUpe249KGU9QXJyYXkuaXNBcnJheShlKT9lLm1hcChLKTooZT1LKGUpKWluIHI/W2VdOmUubWF0Y2goVSl8fFtdKS5sZW5ndGg7Zm9yKDtuLS07KWRlbGV0ZSByW2Vbbl1dfSh2b2lkIDA9PT1lfHxTLmlzRW1wdHlPYmplY3QocikpJiYodC5ub2RlVHlwZT90W3RoaXMuZXhwYW5kb109dm9pZCAwOmRlbGV0ZSB0W3RoaXMuZXhwYW5kb10pfX0saGFzRGF0YTpmdW5jdGlvbih0KXt2YXIgZT10W3RoaXMuZXhwYW5kb107cmV0dXJuIHZvaWQgMCE9PWUmJiFTLmlzRW1wdHlPYmplY3QoZSl9fTt2YXIgUT1uZXcgSixaPW5ldyBKLHR0PS9eKD86XHtbXHdcV10qXH18XFtbXHdcV10qXF0pJC8sZXQ9L1tBLVpdL2c7ZnVuY3Rpb24gbnQodCxlLG4pe3ZhciByO2lmKHZvaWQgMD09PW4mJjE9PT10Lm5vZGVUeXBlKWlmKHI9ImRhdGEtIitlLnJlcGxhY2UoZXQsIi0kJiIpLnRvTG93ZXJDYXNlKCksInN0cmluZyI9PXR5cGVvZihuPXQuZ2V0QXR0cmlidXRlKHIpKSl7dHJ5e249ZnVuY3Rpb24odCl7cmV0dXJuInRydWUiPT09dHx8ImZhbHNlIiE9PXQmJigibnVsbCI9PT10P251bGw6dD09PSt0KyIiPyt0OnR0LnRlc3QodCk/SlNPTi5wYXJzZSh0KTp0KX0obil9Y2F0Y2godCl7fVouc2V0KHQsZSxuKX1lbHNlIG49dm9pZCAwO3JldHVybiBufVMuZXh0ZW5kKHtoYXNEYXRhOmZ1bmN0aW9uKHQpe3JldHVybiBaLmhhc0RhdGEodCl8fFEuaGFzRGF0YSh0KX0sZGF0YTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIFouYWNjZXNzKHQsZSxuKX0scmVtb3ZlRGF0YTpmdW5jdGlvbih0LGUpe1oucmVtb3ZlKHQsZSl9LF9kYXRhOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gUS5hY2Nlc3ModCxlLG4pfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbih0LGUpe1EucmVtb3ZlKHQsZSl9fSksUy5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24odCxlKXt2YXIgbixyLG8saT10aGlzWzBdLGE9aSYmaS5hdHRyaWJ1dGVzO2lmKHZvaWQgMD09PXQpe2lmKHRoaXMubGVuZ3RoJiYobz1aLmdldChpKSwxPT09aS5ub2RlVHlwZSYmIVEuZ2V0KGksImhhc0RhdGFBdHRycyIpKSl7Zm9yKG49YS5sZW5ndGg7bi0tOylhW25dJiYwPT09KHI9YVtuXS5uYW1lKS5pbmRleE9mKCJkYXRhLSIpJiYocj1LKHIuc2xpY2UoNSkpLG50KGkscixvW3JdKSk7US5zZXQoaSwiaGFzRGF0YUF0dHJzIiwhMCl9cmV0dXJuIG99cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0P3RoaXMuZWFjaChmdW5jdGlvbigpe1ouc2V0KHRoaXMsdCl9KTokKHRoaXMsZnVuY3Rpb24oZSl7dmFyIG47aWYoaSYmdm9pZCAwPT09ZSlyZXR1cm4gdm9pZCAwIT09KG49Wi5nZXQoaSx0KSk/bjp2b2lkIDAhPT0obj1udChpLHQpKT9uOnZvaWQgMDt0aGlzLmVhY2goZnVuY3Rpb24oKXtaLnNldCh0aGlzLHQsZSl9KX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGg+MSxudWxsLCEwKX0scmVtb3ZlRGF0YTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Wi5yZW1vdmUodGhpcyx0KX0pfX0pLFMuZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI7aWYodClyZXR1cm4gZT0oZXx8ImZ4IikrInF1ZXVlIixyPVEuZ2V0KHQsZSksbiYmKCFyfHxBcnJheS5pc0FycmF5KG4pP3I9US5hY2Nlc3ModCxlLFMubWFrZUFycmF5KG4pKTpyLnB1c2gobikpLHJ8fFtdfSxkZXF1ZXVlOmZ1bmN0aW9uKHQsZSl7ZT1lfHwiZngiO3ZhciBuPVMucXVldWUodCxlKSxyPW4ubGVuZ3RoLG89bi5zaGlmdCgpLGk9Uy5fcXVldWVIb29rcyh0LGUpOyJpbnByb2dyZXNzIj09PW8mJihvPW4uc2hpZnQoKSxyLS0pLG8mJigiZngiPT09ZSYmbi51bnNoaWZ0KCJpbnByb2dyZXNzIiksZGVsZXRlIGkuc3RvcCxvLmNhbGwodCxmdW5jdGlvbigpe1MuZGVxdWV1ZSh0LGUpfSxpKSksIXImJmkmJmkuZW1wdHkuZmlyZSgpfSxfcXVldWVIb29rczpmdW5jdGlvbih0LGUpe3ZhciBuPWUrInF1ZXVlSG9va3MiO3JldHVybiBRLmdldCh0LG4pfHxRLmFjY2Vzcyh0LG4se2VtcHR5OlMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpe1EucmVtb3ZlKHQsW2UrInF1ZXVlIixuXSl9KX0pfX0pLFMuZm4uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPTI7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0JiYoZT10LHQ9ImZ4IixuLS0pLGFyZ3VtZW50cy5sZW5ndGg8bj9TLnF1ZXVlKHRoaXNbMF0sdCk6dm9pZCAwPT09ZT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBuPVMucXVldWUodGhpcyx0LGUpO1MuX3F1ZXVlSG9va3ModGhpcyx0KSwiZngiPT09dCYmImlucHJvZ3Jlc3MiIT09blswXSYmUy5kZXF1ZXVlKHRoaXMsdCl9KX0sZGVxdWV1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Uy5kZXF1ZXVlKHRoaXMsdCl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5xdWV1ZSh0fHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbih0LGUpe3ZhciBuLHI9MSxvPVMuRGVmZXJyZWQoKSxpPXRoaXMsYT10aGlzLmxlbmd0aCxzPWZ1bmN0aW9uKCl7LS1yfHxvLnJlc29sdmVXaXRoKGksW2ldKX07Zm9yKCJzdHJpbmciIT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksdD10fHwiZngiO2EtLTspKG49US5nZXQoaVthXSx0KyJxdWV1ZUhvb2tzIikpJiZuLmVtcHR5JiYocisrLG4uZW1wdHkuYWRkKHMpKTtyZXR1cm4gcygpLG8ucHJvbWlzZShlKX19KTt2YXIgcnQ9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2Usb3Q9bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK3J0KyIpKFthLXolXSopJCIsImkiKSxpdD1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLGF0PWEuZG9jdW1lbnRFbGVtZW50LHN0PWZ1bmN0aW9uKHQpe3JldHVybiBTLmNvbnRhaW5zKHQub3duZXJEb2N1bWVudCx0KX0sdXQ9e2NvbXBvc2VkOiEwfTthdC5nZXRSb290Tm9kZSYmKHN0PWZ1bmN0aW9uKHQpe3JldHVybiBTLmNvbnRhaW5zKHQub3duZXJEb2N1bWVudCx0KXx8dC5nZXRSb290Tm9kZSh1dCk9PT10Lm93bmVyRG9jdW1lbnR9KTt2YXIgY3Q9ZnVuY3Rpb24odCxlKXtyZXR1cm4ibm9uZSI9PT0odD1lfHx0KS5zdHlsZS5kaXNwbGF5fHwiIj09PXQuc3R5bGUuZGlzcGxheSYmc3QodCkmJiJub25lIj09PVMuY3NzKHQsImRpc3BsYXkiKX0sbHQ9ZnVuY3Rpb24odCxlLG4scil7dmFyIG8saSxhPXt9O2ZvcihpIGluIGUpYVtpXT10LnN0eWxlW2ldLHQuc3R5bGVbaV09ZVtpXTtmb3IoaSBpbiBvPW4uYXBwbHkodCxyfHxbXSksZSl0LnN0eWxlW2ldPWFbaV07cmV0dXJuIG99O2Z1bmN0aW9uIGZ0KHQsZSxuLHIpe3ZhciBvLGksYT0yMCxzPXI/ZnVuY3Rpb24oKXtyZXR1cm4gci5jdXIoKX06ZnVuY3Rpb24oKXtyZXR1cm4gUy5jc3ModCxlLCIiKX0sdT1zKCksYz1uJiZuWzNdfHwoUy5jc3NOdW1iZXJbZV0/IiI6InB4IiksbD10Lm5vZGVUeXBlJiYoUy5jc3NOdW1iZXJbZV18fCJweCIhPT1jJiYrdSkmJm90LmV4ZWMoUy5jc3ModCxlKSk7aWYobCYmbFszXSE9PWMpe2Zvcih1Lz0yLGM9Y3x8bFszXSxsPSt1fHwxO2EtLTspUy5zdHlsZSh0LGUsbCtjKSwoMS1pKSooMS0oaT1zKCkvdXx8LjUpKTw9MCYmKGE9MCksbC89aTtsKj0yLFMuc3R5bGUodCxlLGwrYyksbj1ufHxbXX1yZXR1cm4gbiYmKGw9K2x8fCt1fHwwLG89blsxXT9sKyhuWzFdKzEpKm5bMl06K25bMl0sciYmKHIudW5pdD1jLHIuc3RhcnQ9bCxyLmVuZD1vKSksb312YXIgcHQ9e307ZnVuY3Rpb24gaHQodCl7dmFyIGUsbj10Lm93bmVyRG9jdW1lbnQscj10Lm5vZGVOYW1lLG89cHRbcl07cmV0dXJuIG98fChlPW4uYm9keS5hcHBlbmRDaGlsZChuLmNyZWF0ZUVsZW1lbnQocikpLG89Uy5jc3MoZSwiZGlzcGxheSIpLGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSwibm9uZSI9PT1vJiYobz0iYmxvY2siKSxwdFtyXT1vLG8pfWZ1bmN0aW9uIGR0KHQsZSl7Zm9yKHZhciBuLHIsbz1bXSxpPTAsYT10Lmxlbmd0aDtpPGE7aSsrKShyPXRbaV0pLnN0eWxlJiYobj1yLnN0eWxlLmRpc3BsYXksZT8oIm5vbmUiPT09biYmKG9baV09US5nZXQociwiZGlzcGxheSIpfHxudWxsLG9baV18fChyLnN0eWxlLmRpc3BsYXk9IiIpKSwiIj09PXIuc3R5bGUuZGlzcGxheSYmY3QocikmJihvW2ldPWh0KHIpKSk6Im5vbmUiIT09biYmKG9baV09Im5vbmUiLFEuc2V0KHIsImRpc3BsYXkiLG4pKSk7Zm9yKGk9MDtpPGE7aSsrKW51bGwhPW9baV0mJih0W2ldLnN0eWxlLmRpc3BsYXk9b1tpXSk7cmV0dXJuIHR9Uy5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oKXtyZXR1cm4gZHQodGhpcywhMCl9LGhpZGU6ZnVuY3Rpb24oKXtyZXR1cm4gZHQodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbih0KXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0P3Q/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7Y3QodGhpcyk/Uyh0aGlzKS5zaG93KCk6Uyh0aGlzKS5oaWRlKCl9KX19KTt2YXIgZ3Q9L14oPzpjaGVja2JveHxyYWRpbykkL2ksdnQ9LzwoW2Etel1bXlwvXDA+XHgyMFx0XHJcblxmXSopL2kseXQ9L14kfF5tb2R1bGUkfFwvKD86amF2YXxlY21hKXNjcmlwdC9pLG10PXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLF9kZWZhdWx0OlswLCIiLCIiXX07ZnVuY3Rpb24gYnQodCxlKXt2YXIgbjtyZXR1cm4gbj12b2lkIDAhPT10LmdldEVsZW1lbnRzQnlUYWdOYW1lP3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZXx8IioiKTp2b2lkIDAhPT10LnF1ZXJ5U2VsZWN0b3JBbGw/dC5xdWVyeVNlbGVjdG9yQWxsKGV8fCIqIik6W10sdm9pZCAwPT09ZXx8ZSYmTCh0LGUpP1MubWVyZ2UoW3RdLG4pOm59ZnVuY3Rpb24geHQodCxlKXtmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjtuKyspUS5zZXQodFtuXSwiZ2xvYmFsRXZhbCIsIWV8fFEuZ2V0KGVbbl0sImdsb2JhbEV2YWwiKSl9bXQub3B0Z3JvdXA9bXQub3B0aW9uLG10LnRib2R5PW10LnRmb290PW10LmNvbGdyb3VwPW10LmNhcHRpb249bXQudGhlYWQsbXQudGg9bXQudGQ7dmFyIHd0LGt0LFN0PS88fCYjP1x3KzsvO2Z1bmN0aW9uIEV0KHQsZSxuLHIsbyl7Zm9yKHZhciBpLGEscyx1LGMsbCxmPWUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLHA9W10saD0wLGQ9dC5sZW5ndGg7aDxkO2grKylpZigoaT10W2hdKXx8MD09PWkpaWYoIm9iamVjdCI9PT1rKGkpKVMubWVyZ2UocCxpLm5vZGVUeXBlP1tpXTppKTtlbHNlIGlmKFN0LnRlc3QoaSkpe2ZvcihhPWF8fGYuYXBwZW5kQ2hpbGQoZS5jcmVhdGVFbGVtZW50KCJkaXYiKSkscz0odnQuZXhlYyhpKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSx1PW10W3NdfHxtdC5fZGVmYXVsdCxhLmlubmVySFRNTD11WzFdK1MuaHRtbFByZWZpbHRlcihpKSt1WzJdLGw9dVswXTtsLS07KWE9YS5sYXN0Q2hpbGQ7Uy5tZXJnZShwLGEuY2hpbGROb2RlcyksKGE9Zi5maXJzdENoaWxkKS50ZXh0Q29udGVudD0iIn1lbHNlIHAucHVzaChlLmNyZWF0ZVRleHROb2RlKGkpKTtmb3IoZi50ZXh0Q29udGVudD0iIixoPTA7aT1wW2grK107KWlmKHImJlMuaW5BcnJheShpLHIpPi0xKW8mJm8ucHVzaChpKTtlbHNlIGlmKGM9c3QoaSksYT1idChmLmFwcGVuZENoaWxkKGkpLCJzY3JpcHQiKSxjJiZ4dChhKSxuKWZvcihsPTA7aT1hW2wrK107KXl0LnRlc3QoaS50eXBlfHwiIikmJm4ucHVzaChpKTtyZXR1cm4gZn13dD1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKS5hcHBlbmRDaGlsZChhLmNyZWF0ZUVsZW1lbnQoImRpdiIpKSwoa3Q9YS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGt0LnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSxrdC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0Iiksd3QuYXBwZW5kQ2hpbGQoa3QpLHkuY2hlY2tDbG9uZT13dC5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsd3QuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+Iix5Lm5vQ2xvbmVDaGVja2VkPSEhd3QuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlO3ZhciBqdD0vXmtleS8sVHQ9L14oPzptb3VzZXxwb2ludGVyfGNvbnRleHRtZW51fGRyYWd8ZHJvcCl8Y2xpY2svLE90PS9eKFteLl0qKSg/OlwuKC4rKXwpLztmdW5jdGlvbiBBdCgpe3JldHVybiEwfWZ1bmN0aW9uIEN0KCl7cmV0dXJuITF9ZnVuY3Rpb24gTHQodCxlKXtyZXR1cm4gdD09PWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBhLmFjdGl2ZUVsZW1lbnR9Y2F0Y2godCl7fX0oKT09KCJmb2N1cyI9PT1lKX1mdW5jdGlvbiBSdCh0LGUsbixyLG8saSl7dmFyIGEscztpZigib2JqZWN0Ij09dHlwZW9mIGUpe2ZvcihzIGluInN0cmluZyIhPXR5cGVvZiBuJiYocj1yfHxuLG49dm9pZCAwKSxlKVJ0KHQscyxuLHIsZVtzXSxpKTtyZXR1cm4gdH1pZihudWxsPT1yJiZudWxsPT1vPyhvPW4scj1uPXZvaWQgMCk6bnVsbD09byYmKCJzdHJpbmciPT10eXBlb2Ygbj8obz1yLHI9dm9pZCAwKToobz1yLHI9bixuPXZvaWQgMCkpLCExPT09bylvPUN0O2Vsc2UgaWYoIW8pcmV0dXJuIHQ7cmV0dXJuIDE9PT1pJiYoYT1vLChvPWZ1bmN0aW9uKHQpe3JldHVybiBTKCkub2ZmKHQpLGEuYXBwbHkodGhpcyxhcmd1bWVudHMpfSkuZ3VpZD1hLmd1aWR8fChhLmd1aWQ9Uy5ndWlkKyspKSx0LmVhY2goZnVuY3Rpb24oKXtTLmV2ZW50LmFkZCh0aGlzLGUsbyxyLG4pfSl9ZnVuY3Rpb24gUHQodCxlLG4pe24/KFEuc2V0KHQsZSwhMSksUy5ldmVudC5hZGQodCxlLHtuYW1lc3BhY2U6ITEsaGFuZGxlcjpmdW5jdGlvbih0KXt2YXIgcixvLGk9US5nZXQodGhpcyxlKTtpZigxJnQuaXNUcmlnZ2VyJiZ0aGlzW2VdKXtpZihpLmxlbmd0aCkoUy5ldmVudC5zcGVjaWFsW2VdfHx7fSkuZGVsZWdhdGVUeXBlJiZ0LnN0b3BQcm9wYWdhdGlvbigpO2Vsc2UgaWYoaT11LmNhbGwoYXJndW1lbnRzKSxRLnNldCh0aGlzLGUsaSkscj1uKHRoaXMsZSksdGhpc1tlXSgpLGkhPT0obz1RLmdldCh0aGlzLGUpKXx8cj9RLnNldCh0aGlzLGUsITEpOm89e30saSE9PW8pcmV0dXJuIHQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdC5wcmV2ZW50RGVmYXVsdCgpLG8udmFsdWV9ZWxzZSBpLmxlbmd0aCYmKFEuc2V0KHRoaXMsZSx7dmFsdWU6Uy5ldmVudC50cmlnZ2VyKFMuZXh0ZW5kKGlbMF0sUy5FdmVudC5wcm90b3R5cGUpLGkuc2xpY2UoMSksdGhpcyl9KSx0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpKX19KSk6dm9pZCAwPT09US5nZXQodCxlKSYmUy5ldmVudC5hZGQodCxlLEF0KX1TLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGksYSxzLHUsYyxsLGYscCxoLGQsZyx2PVEuZ2V0KHQpO2lmKHYpZm9yKG4uaGFuZGxlciYmKG49KGk9bikuaGFuZGxlcixvPWkuc2VsZWN0b3IpLG8mJlMuZmluZC5tYXRjaGVzU2VsZWN0b3IoYXQsbyksbi5ndWlkfHwobi5ndWlkPVMuZ3VpZCsrKSwodT12LmV2ZW50cyl8fCh1PXYuZXZlbnRzPXt9KSwoYT12LmhhbmRsZSl8fChhPXYuaGFuZGxlPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDAhPT1TJiZTLmV2ZW50LnRyaWdnZXJlZCE9PWUudHlwZT9TLmV2ZW50LmRpc3BhdGNoLmFwcGx5KHQsYXJndW1lbnRzKTp2b2lkIDB9KSxjPShlPShlfHwiIikubWF0Y2goVSl8fFsiIl0pLmxlbmd0aDtjLS07KWg9Zz0ocz1PdC5leGVjKGVbY10pfHxbXSlbMV0sZD0oc1syXXx8IiIpLnNwbGl0KCIuIikuc29ydCgpLGgmJihmPVMuZXZlbnQuc3BlY2lhbFtoXXx8e30saD0obz9mLmRlbGVnYXRlVHlwZTpmLmJpbmRUeXBlKXx8aCxmPVMuZXZlbnQuc3BlY2lhbFtoXXx8e30sbD1TLmV4dGVuZCh7dHlwZTpoLG9yaWdUeXBlOmcsZGF0YTpyLGhhbmRsZXI6bixndWlkOm4uZ3VpZCxzZWxlY3RvcjpvLG5lZWRzQ29udGV4dDpvJiZTLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QobyksbmFtZXNwYWNlOmQuam9pbigiLiIpfSxpKSwocD11W2hdKXx8KChwPXVbaF09W10pLmRlbGVnYXRlQ291bnQ9MCxmLnNldHVwJiYhMSE9PWYuc2V0dXAuY2FsbCh0LHIsZCxhKXx8dC5hZGRFdmVudExpc3RlbmVyJiZ0LmFkZEV2ZW50TGlzdGVuZXIoaCxhKSksZi5hZGQmJihmLmFkZC5jYWxsKHQsbCksbC5oYW5kbGVyLmd1aWR8fChsLmhhbmRsZXIuZ3VpZD1uLmd1aWQpKSxvP3Auc3BsaWNlKHAuZGVsZWdhdGVDb3VudCsrLDAsbCk6cC5wdXNoKGwpLFMuZXZlbnQuZ2xvYmFsW2hdPSEwKX0scmVtb3ZlOmZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGksYSxzLHUsYyxsLGYscCxoLGQsZyx2PVEuaGFzRGF0YSh0KSYmUS5nZXQodCk7aWYodiYmKHU9di5ldmVudHMpKXtmb3IoYz0oZT0oZXx8IiIpLm1hdGNoKFUpfHxbIiJdKS5sZW5ndGg7Yy0tOylpZihoPWc9KHM9T3QuZXhlYyhlW2NdKXx8W10pWzFdLGQ9KHNbMl18fCIiKS5zcGxpdCgiLiIpLnNvcnQoKSxoKXtmb3IoZj1TLmV2ZW50LnNwZWNpYWxbaF18fHt9LHA9dVtoPShyP2YuZGVsZWdhdGVUeXBlOmYuYmluZFR5cGUpfHxoXXx8W10scz1zWzJdJiZuZXcgUmVnRXhwKCIoXnxcXC4pIitkLmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpLGE9aT1wLmxlbmd0aDtpLS07KWw9cFtpXSwhbyYmZyE9PWwub3JpZ1R5cGV8fG4mJm4uZ3VpZCE9PWwuZ3VpZHx8cyYmIXMudGVzdChsLm5hbWVzcGFjZSl8fHImJnIhPT1sLnNlbGVjdG9yJiYoIioqIiE9PXJ8fCFsLnNlbGVjdG9yKXx8KHAuc3BsaWNlKGksMSksbC5zZWxlY3RvciYmcC5kZWxlZ2F0ZUNvdW50LS0sZi5yZW1vdmUmJmYucmVtb3ZlLmNhbGwodCxsKSk7YSYmIXAubGVuZ3RoJiYoZi50ZWFyZG93biYmITEhPT1mLnRlYXJkb3duLmNhbGwodCxkLHYuaGFuZGxlKXx8Uy5yZW1vdmVFdmVudCh0LGgsdi5oYW5kbGUpLGRlbGV0ZSB1W2hdKX1lbHNlIGZvcihoIGluIHUpUy5ldmVudC5yZW1vdmUodCxoK2VbY10sbixyLCEwKTtTLmlzRW1wdHlPYmplY3QodSkmJlEucmVtb3ZlKHQsImhhbmRsZSBldmVudHMiKX19LGRpc3BhdGNoOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYSxzPVMuZXZlbnQuZml4KHQpLHU9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpLGM9KFEuZ2V0KHRoaXMsImV2ZW50cyIpfHx7fSlbcy50eXBlXXx8W10sbD1TLmV2ZW50LnNwZWNpYWxbcy50eXBlXXx8e307Zm9yKHVbMF09cyxlPTE7ZTxhcmd1bWVudHMubGVuZ3RoO2UrKyl1W2VdPWFyZ3VtZW50c1tlXTtpZihzLmRlbGVnYXRlVGFyZ2V0PXRoaXMsIWwucHJlRGlzcGF0Y2h8fCExIT09bC5wcmVEaXNwYXRjaC5jYWxsKHRoaXMscykpe2ZvcihhPVMuZXZlbnQuaGFuZGxlcnMuY2FsbCh0aGlzLHMsYyksZT0wOyhvPWFbZSsrXSkmJiFzLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7KWZvcihzLmN1cnJlbnRUYXJnZXQ9by5lbGVtLG49MDsoaT1vLmhhbmRsZXJzW24rK10pJiYhcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpOylzLnJuYW1lc3BhY2UmJiExIT09aS5uYW1lc3BhY2UmJiFzLnJuYW1lc3BhY2UudGVzdChpLm5hbWVzcGFjZSl8fChzLmhhbmRsZU9iaj1pLHMuZGF0YT1pLmRhdGEsdm9pZCAwIT09KHI9KChTLmV2ZW50LnNwZWNpYWxbaS5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fGkuaGFuZGxlcikuYXBwbHkoby5lbGVtLHUpKSYmITE9PT0ocy5yZXN1bHQ9cikmJihzLnByZXZlbnREZWZhdWx0KCkscy5zdG9wUHJvcGFnYXRpb24oKSkpO3JldHVybiBsLnBvc3REaXNwYXRjaCYmbC5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLHMpLHMucmVzdWx0fX0saGFuZGxlcnM6ZnVuY3Rpb24odCxlKXt2YXIgbixyLG8saSxhLHM9W10sdT1lLmRlbGVnYXRlQ291bnQsYz10LnRhcmdldDtpZih1JiZjLm5vZGVUeXBlJiYhKCJjbGljayI9PT10LnR5cGUmJnQuYnV0dG9uPj0xKSlmb3IoO2MhPT10aGlzO2M9Yy5wYXJlbnROb2RlfHx0aGlzKWlmKDE9PT1jLm5vZGVUeXBlJiYoImNsaWNrIiE9PXQudHlwZXx8ITAhPT1jLmRpc2FibGVkKSl7Zm9yKGk9W10sYT17fSxuPTA7bjx1O24rKyl2b2lkIDA9PT1hW289KHI9ZVtuXSkuc2VsZWN0b3IrIiAiXSYmKGFbb109ci5uZWVkc0NvbnRleHQ/UyhvLHRoaXMpLmluZGV4KGMpPi0xOlMuZmluZChvLHRoaXMsbnVsbCxbY10pLmxlbmd0aCksYVtvXSYmaS5wdXNoKHIpO2kubGVuZ3RoJiZzLnB1c2goe2VsZW06YyxoYW5kbGVyczppfSl9cmV0dXJuIGM9dGhpcyx1PGUubGVuZ3RoJiZzLnB1c2goe2VsZW06YyxoYW5kbGVyczplLnNsaWNlKHUpfSksc30sYWRkUHJvcDpmdW5jdGlvbih0LGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShTLkV2ZW50LnByb3RvdHlwZSx0LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6bShlKT9mdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gZSh0aGlzLm9yaWdpbmFsRXZlbnQpfTpmdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gdGhpcy5vcmlnaW5hbEV2ZW50W3RdfSxzZXQ6ZnVuY3Rpb24oZSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6ZX0pfX0pfSxmaXg6ZnVuY3Rpb24odCl7cmV0dXJuIHRbUy5leHBhbmRvXT90Om5ldyBTLkV2ZW50KHQpfSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sY2xpY2s6e3NldHVwOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXN8fHQ7cmV0dXJuIGd0LnRlc3QoZS50eXBlKSYmZS5jbGljayYmTChlLCJpbnB1dCIpJiZQdChlLCJjbGljayIsQXQpLCExfSx0cmlnZ2VyOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXN8fHQ7cmV0dXJuIGd0LnRlc3QoZS50eXBlKSYmZS5jbGljayYmTChlLCJpbnB1dCIpJiZQdChlLCJjbGljayIpLCEwfSxfZGVmYXVsdDpmdW5jdGlvbih0KXt2YXIgZT10LnRhcmdldDtyZXR1cm4gZ3QudGVzdChlLnR5cGUpJiZlLmNsaWNrJiZMKGUsImlucHV0IikmJlEuZ2V0KGUsImNsaWNrIil8fEwoZSwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24odCl7dm9pZCAwIT09dC5yZXN1bHQmJnQub3JpZ2luYWxFdmVudCYmKHQub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT10LnJlc3VsdCl9fX19LFMucmVtb3ZlRXZlbnQ9ZnVuY3Rpb24odCxlLG4pe3QucmVtb3ZlRXZlbnRMaXN0ZW5lciYmdC5yZW1vdmVFdmVudExpc3RlbmVyKGUsbil9LFMuRXZlbnQ9ZnVuY3Rpb24odCxlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBTLkV2ZW50KSlyZXR1cm4gbmV3IFMuRXZlbnQodCxlKTt0JiZ0LnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD10LHRoaXMudHlwZT10LnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9dC5kZWZhdWx0UHJldmVudGVkfHx2b2lkIDA9PT10LmRlZmF1bHRQcmV2ZW50ZWQmJiExPT09dC5yZXR1cm5WYWx1ZT9BdDpDdCx0aGlzLnRhcmdldD10LnRhcmdldCYmMz09PXQudGFyZ2V0Lm5vZGVUeXBlP3QudGFyZ2V0LnBhcmVudE5vZGU6dC50YXJnZXQsdGhpcy5jdXJyZW50VGFyZ2V0PXQuY3VycmVudFRhcmdldCx0aGlzLnJlbGF0ZWRUYXJnZXQ9dC5yZWxhdGVkVGFyZ2V0KTp0aGlzLnR5cGU9dCxlJiZTLmV4dGVuZCh0aGlzLGUpLHRoaXMudGltZVN0YW1wPXQmJnQudGltZVN0YW1wfHxEYXRlLm5vdygpLHRoaXNbUy5leHBhbmRvXT0hMH0sUy5FdmVudC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlMuRXZlbnQsaXNEZWZhdWx0UHJldmVudGVkOkN0LGlzUHJvcGFnYXRpb25TdG9wcGVkOkN0LGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOkN0LGlzU2ltdWxhdGVkOiExLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPUF0LHQmJiF0aGlzLmlzU2ltdWxhdGVkJiZ0LnByZXZlbnREZWZhdWx0KCl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPUF0LHQmJiF0aGlzLmlzU2ltdWxhdGVkJiZ0LnN0b3BQcm9wYWdhdGlvbigpfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9yaWdpbmFsRXZlbnQ7dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZD1BdCx0JiYhdGhpcy5pc1NpbXVsYXRlZCYmdC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0sUy5lYWNoKHthbHRLZXk6ITAsYnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNoYW5nZWRUb3VjaGVzOiEwLGN0cmxLZXk6ITAsZGV0YWlsOiEwLGV2ZW50UGhhc2U6ITAsbWV0YUtleTohMCxwYWdlWDohMCxwYWdlWTohMCxzaGlmdEtleTohMCx2aWV3OiEwLGNoYXI6ITAsY29kZTohMCxjaGFyQ29kZTohMCxrZXk6ITAsa2V5Q29kZTohMCxidXR0b246ITAsYnV0dG9uczohMCxjbGllbnRYOiEwLGNsaWVudFk6ITAsb2Zmc2V0WDohMCxvZmZzZXRZOiEwLHBvaW50ZXJJZDohMCxwb2ludGVyVHlwZTohMCxzY3JlZW5YOiEwLHNjcmVlblk6ITAsdGFyZ2V0VG91Y2hlczohMCx0b0VsZW1lbnQ6ITAsdG91Y2hlczohMCx3aGljaDpmdW5jdGlvbih0KXt2YXIgZT10LmJ1dHRvbjtyZXR1cm4gbnVsbD09dC53aGljaCYmanQudGVzdCh0LnR5cGUpP251bGwhPXQuY2hhckNvZGU/dC5jaGFyQ29kZTp0LmtleUNvZGU6IXQud2hpY2gmJnZvaWQgMCE9PWUmJlR0LnRlc3QodC50eXBlKT8xJmU/MToyJmU/Mzo0JmU/MjowOnQud2hpY2h9fSxTLmV2ZW50LmFkZFByb3ApLFMuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24odCxlKXtTLmV2ZW50LnNwZWNpYWxbdF09e3NldHVwOmZ1bmN0aW9uKCl7cmV0dXJuIFB0KHRoaXMsdCxMdCksITF9LHRyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gUHQodGhpcyx0KSwhMH0sZGVsZWdhdGVUeXBlOmV9fSksUy5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0Iixwb2ludGVyZW50ZXI6InBvaW50ZXJvdmVyIixwb2ludGVybGVhdmU6InBvaW50ZXJvdXQifSxmdW5jdGlvbih0LGUpe1MuZXZlbnQuc3BlY2lhbFt0XT17ZGVsZWdhdGVUeXBlOmUsYmluZFR5cGU6ZSxoYW5kbGU6ZnVuY3Rpb24odCl7dmFyIG4scj10aGlzLG89dC5yZWxhdGVkVGFyZ2V0LGk9dC5oYW5kbGVPYmo7cmV0dXJuIG8mJihvPT09cnx8Uy5jb250YWlucyhyLG8pKXx8KHQudHlwZT1pLm9yaWdUeXBlLG49aS5oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0LnR5cGU9ZSksbn19fSksUy5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBSdCh0aGlzLHQsZSxuLHIpfSxvbmU6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIFJ0KHRoaXMsdCxlLG4sciwxKX0sb2ZmOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvO2lmKHQmJnQucHJldmVudERlZmF1bHQmJnQuaGFuZGxlT2JqKXJldHVybiByPXQuaGFuZGxlT2JqLFModC5kZWxlZ2F0ZVRhcmdldCkub2ZmKHIubmFtZXNwYWNlP3Iub3JpZ1R5cGUrIi4iK3IubmFtZXNwYWNlOnIub3JpZ1R5cGUsci5zZWxlY3RvcixyLmhhbmRsZXIpLHRoaXM7aWYoIm9iamVjdCI9PXR5cGVvZiB0KXtmb3IobyBpbiB0KXRoaXMub2ZmKG8sZSx0W29dKTtyZXR1cm4gdGhpc31yZXR1cm4hMSE9PWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlfHwobj1lLGU9dm9pZCAwKSwhMT09PW4mJihuPUN0KSx0aGlzLmVhY2goZnVuY3Rpb24oKXtTLmV2ZW50LnJlbW92ZSh0aGlzLHQsbixlKX0pfX0pO3ZhciBOdD0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKilbXj5dKilcLz4vZ2ksSXQ9LzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksX3Q9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksRHQ9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nO2Z1bmN0aW9uIE10KHQsZSl7cmV0dXJuIEwodCwidGFibGUiKSYmTCgxMSE9PWUubm9kZVR5cGU/ZTplLmZpcnN0Q2hpbGQsInRyIikmJlModCkuY2hpbGRyZW4oInRib2R5IilbMF18fHR9ZnVuY3Rpb24gVXQodCl7cmV0dXJuIHQudHlwZT0obnVsbCE9PXQuZ2V0QXR0cmlidXRlKCJ0eXBlIikpKyIvIit0LnR5cGUsdH1mdW5jdGlvbiBCdCh0KXtyZXR1cm4idHJ1ZS8iPT09KHQudHlwZXx8IiIpLnNsaWNlKDAsNSk/dC50eXBlPXQudHlwZS5zbGljZSg1KTp0LnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpLHR9ZnVuY3Rpb24gcXQodCxlKXt2YXIgbixyLG8saSxhLHMsdSxjO2lmKDE9PT1lLm5vZGVUeXBlKXtpZihRLmhhc0RhdGEodCkmJihpPVEuYWNjZXNzKHQpLGE9US5zZXQoZSxpKSxjPWkuZXZlbnRzKSlmb3IobyBpbiBkZWxldGUgYS5oYW5kbGUsYS5ldmVudHM9e30sYylmb3Iobj0wLHI9Y1tvXS5sZW5ndGg7bjxyO24rKylTLmV2ZW50LmFkZChlLG8sY1tvXVtuXSk7Wi5oYXNEYXRhKHQpJiYocz1aLmFjY2Vzcyh0KSx1PVMuZXh0ZW5kKHt9LHMpLFouc2V0KGUsdSkpfX1mdW5jdGlvbiBGdCh0LGUpe3ZhciBuPWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsiaW5wdXQiPT09biYmZ3QudGVzdCh0LnR5cGUpP2UuY2hlY2tlZD10LmNoZWNrZWQ6ImlucHV0IiE9PW4mJiJ0ZXh0YXJlYSIhPT1ufHwoZS5kZWZhdWx0VmFsdWU9dC5kZWZhdWx0VmFsdWUpfWZ1bmN0aW9uIEh0KHQsZSxuLHIpe2U9Yy5hcHBseShbXSxlKTt2YXIgbyxpLGEscyx1LGwsZj0wLHA9dC5sZW5ndGgsaD1wLTEsZD1lWzBdLGc9bShkKTtpZihnfHxwPjEmJiJzdHJpbmciPT10eXBlb2YgZCYmIXkuY2hlY2tDbG9uZSYmX3QudGVzdChkKSlyZXR1cm4gdC5lYWNoKGZ1bmN0aW9uKG8pe3ZhciBpPXQuZXEobyk7ZyYmKGVbMF09ZC5jYWxsKHRoaXMsbyxpLmh0bWwoKSkpLEh0KGksZSxuLHIpfSk7aWYocCYmKGk9KG89RXQoZSx0WzBdLm93bmVyRG9jdW1lbnQsITEsdCxyKSkuZmlyc3RDaGlsZCwxPT09by5jaGlsZE5vZGVzLmxlbmd0aCYmKG89aSksaXx8cikpe2ZvcihzPShhPVMubWFwKGJ0KG8sInNjcmlwdCIpLFV0KSkubGVuZ3RoO2Y8cDtmKyspdT1vLGYhPT1oJiYodT1TLmNsb25lKHUsITAsITApLHMmJlMubWVyZ2UoYSxidCh1LCJzY3JpcHQiKSkpLG4uY2FsbCh0W2ZdLHUsZik7aWYocylmb3IobD1hW2EubGVuZ3RoLTFdLm93bmVyRG9jdW1lbnQsUy5tYXAoYSxCdCksZj0wO2Y8cztmKyspdT1hW2ZdLHl0LnRlc3QodS50eXBlfHwiIikmJiFRLmFjY2Vzcyh1LCJnbG9iYWxFdmFsIikmJlMuY29udGFpbnMobCx1KSYmKHUuc3JjJiYibW9kdWxlIiE9PSh1LnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpP1MuX2V2YWxVcmwmJiF1Lm5vTW9kdWxlJiZTLl9ldmFsVXJsKHUuc3JjLHtub25jZTp1Lm5vbmNlfHx1LmdldEF0dHJpYnV0ZSgibm9uY2UiKX0pOncodS50ZXh0Q29udGVudC5yZXBsYWNlKER0LCIiKSx1LGwpKX1yZXR1cm4gdH1mdW5jdGlvbiB6dCh0LGUsbil7Zm9yKHZhciByLG89ZT9TLmZpbHRlcihlLHQpOnQsaT0wO251bGwhPShyPW9baV0pO2krKylufHwxIT09ci5ub2RlVHlwZXx8Uy5jbGVhbkRhdGEoYnQocikpLHIucGFyZW50Tm9kZSYmKG4mJnN0KHIpJiZ4dChidChyLCJzY3JpcHQiKSksci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHIpKTtyZXR1cm4gdH1TLmV4dGVuZCh7aHRtbFByZWZpbHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdC5yZXBsYWNlKE50LCI8JDE+PC8kMj4iKX0sY2xvbmU6ZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saSxhLHM9dC5jbG9uZU5vZGUoITApLHU9c3QodCk7aWYoISh5Lm5vQ2xvbmVDaGVja2VkfHwxIT09dC5ub2RlVHlwZSYmMTEhPT10Lm5vZGVUeXBlfHxTLmlzWE1MRG9jKHQpKSlmb3IoYT1idChzKSxyPTAsbz0oaT1idCh0KSkubGVuZ3RoO3I8bztyKyspRnQoaVtyXSxhW3JdKTtpZihlKWlmKG4pZm9yKGk9aXx8YnQodCksYT1hfHxidChzKSxyPTAsbz1pLmxlbmd0aDtyPG87cisrKXF0KGlbcl0sYVtyXSk7ZWxzZSBxdCh0LHMpO3JldHVybihhPWJ0KHMsInNjcmlwdCIpKS5sZW5ndGg+MCYmeHQoYSwhdSYmYnQodCwic2NyaXB0IikpLHN9LGNsZWFuRGF0YTpmdW5jdGlvbih0KXtmb3IodmFyIGUsbixyLG89Uy5ldmVudC5zcGVjaWFsLGk9MDt2b2lkIDAhPT0obj10W2ldKTtpKyspaWYoWChuKSl7aWYoZT1uW1EuZXhwYW5kb10pe2lmKGUuZXZlbnRzKWZvcihyIGluIGUuZXZlbnRzKW9bcl0/Uy5ldmVudC5yZW1vdmUobixyKTpTLnJlbW92ZUV2ZW50KG4scixlLmhhbmRsZSk7bltRLmV4cGFuZG9dPXZvaWQgMH1uW1ouZXhwYW5kb10mJihuW1ouZXhwYW5kb109dm9pZCAwKX19fSksUy5mbi5leHRlbmQoe2RldGFjaDpmdW5jdGlvbih0KXtyZXR1cm4genQodGhpcyx0LCEwKX0scmVtb3ZlOmZ1bmN0aW9uKHQpe3JldHVybiB6dCh0aGlzLHQpfSx0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiAkKHRoaXMsZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQ/Uy50ZXh0KHRoaXMpOnRoaXMuZW1wdHkoKS5lYWNoKGZ1bmN0aW9uKCl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fCh0aGlzLnRleHRDb250ZW50PXQpfSl9LG51bGwsdCxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIEh0KHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKHQpezEhPT10aGlzLm5vZGVUeXBlJiYxMSE9PXRoaXMubm9kZVR5cGUmJjkhPT10aGlzLm5vZGVUeXBlfHxNdCh0aGlzLHQpLmFwcGVuZENoaWxkKHQpfSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gSHQodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24odCl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBlPU10KHRoaXMsdCk7ZS5pbnNlcnRCZWZvcmUodCxlLmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gSHQodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24odCl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHQsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gSHQodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24odCl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHQsdGhpcy5uZXh0U2libGluZyl9KX0sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIHQsZT0wO251bGwhPSh0PXRoaXNbZV0pO2UrKykxPT09dC5ub2RlVHlwZSYmKFMuY2xlYW5EYXRhKGJ0KHQsITEpKSx0LnRleHRDb250ZW50PSIiKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD1udWxsIT10JiZ0LGU9bnVsbD09ZT90OmUsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gUy5jbG9uZSh0aGlzLHQsZSl9KX0saHRtbDpmdW5jdGlvbih0KXtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXNbMF18fHt9LG49MCxyPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PXQmJjE9PT1lLm5vZGVUeXBlKXJldHVybiBlLmlubmVySFRNTDtpZigic3RyaW5nIj09dHlwZW9mIHQmJiFJdC50ZXN0KHQpJiYhbXRbKHZ0LmV4ZWModCl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKXt0PVMuaHRtbFByZWZpbHRlcih0KTt0cnl7Zm9yKDtuPHI7bisrKTE9PT0oZT10aGlzW25dfHx7fSkubm9kZVR5cGUmJihTLmNsZWFuRGF0YShidChlLCExKSksZS5pbm5lckhUTUw9dCk7ZT0wfWNhdGNoKHQpe319ZSYmdGhpcy5lbXB0eSgpLmFwcGVuZCh0KX0sbnVsbCx0LGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiBIdCh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt2YXIgbj10aGlzLnBhcmVudE5vZGU7Uy5pbkFycmF5KHRoaXMsdCk8MCYmKFMuY2xlYW5EYXRhKGJ0KHRoaXMpKSxuJiZuLnJlcGxhY2VDaGlsZChlLHRoaXMpKX0sdCl9fSksUy5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24odCxlKXtTLmZuW3RdPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixyPVtdLG89Uyh0KSxpPW8ubGVuZ3RoLTEsYT0wO2E8PWk7YSsrKW49YT09PWk/dGhpczp0aGlzLmNsb25lKCEwKSxTKG9bYV0pW2VdKG4pLGwuYXBwbHkocixuLmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2socil9fSk7dmFyIFd0PW5ldyBSZWdFeHAoIl4oIitydCsiKSg/IXB4KVthLXolXSskIiwiaSIpLCR0PWZ1bmN0aW9uKHQpe3ZhciBlPXQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztyZXR1cm4gZSYmZS5vcGVuZXJ8fChlPW4pLGUuZ2V0Q29tcHV0ZWRTdHlsZSh0KX0sWXQ9bmV3IFJlZ0V4cChpdC5qb2luKCJ8IiksImkiKTtmdW5jdGlvbiBWdCh0LGUsbil7dmFyIHIsbyxpLGEscz10LnN0eWxlO3JldHVybihuPW58fCR0KHQpKSYmKCIiIT09KGE9bi5nZXRQcm9wZXJ0eVZhbHVlKGUpfHxuW2VdKXx8c3QodCl8fChhPVMuc3R5bGUodCxlKSksIXkucGl4ZWxCb3hTdHlsZXMoKSYmV3QudGVzdChhKSYmWXQudGVzdChlKSYmKHI9cy53aWR0aCxvPXMubWluV2lkdGgsaT1zLm1heFdpZHRoLHMubWluV2lkdGg9cy5tYXhXaWR0aD1zLndpZHRoPWEsYT1uLndpZHRoLHMud2lkdGg9cixzLm1pbldpZHRoPW8scy5tYXhXaWR0aD1pKSksdm9pZCAwIT09YT9hKyIiOmF9ZnVuY3Rpb24gR3QodCxlKXtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7aWYoIXQoKSlyZXR1cm4odGhpcy5nZXQ9ZSkuYXBwbHkodGhpcyxhcmd1bWVudHMpO2RlbGV0ZSB0aGlzLmdldH19fSFmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtpZihsKXtjLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7d2lkdGg6NjBweDttYXJnaW4tdG9wOjFweDtwYWRkaW5nOjA7Ym9yZGVyOjAiLGwuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6c2Nyb2xsO21hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7d2lkdGg6NjAlO3RvcDoxJSIsYXQuYXBwZW5kQ2hpbGQoYykuYXBwZW5kQ2hpbGQobCk7dmFyIHQ9bi5nZXRDb21wdXRlZFN0eWxlKGwpO3I9IjElIiE9PXQudG9wLHU9MTI9PT1lKHQubWFyZ2luTGVmdCksbC5zdHlsZS5yaWdodD0iNjAlIixzPTM2PT09ZSh0LnJpZ2h0KSxvPTM2PT09ZSh0LndpZHRoKSxsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaT0xMj09PWUobC5vZmZzZXRXaWR0aC8zKSxhdC5yZW1vdmVDaGlsZChjKSxsPW51bGx9fWZ1bmN0aW9uIGUodCl7cmV0dXJuIE1hdGgucm91bmQocGFyc2VGbG9hdCh0KSl9dmFyIHIsbyxpLHMsdSxjPWEuY3JlYXRlRWxlbWVudCgiZGl2IiksbD1hLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2wuc3R5bGUmJihsLnN0eWxlLmJhY2tncm91bmRDbGlwPSJjb250ZW50LWJveCIsbC5jbG9uZU5vZGUoITApLnN0eWxlLmJhY2tncm91bmRDbGlwPSIiLHkuY2xlYXJDbG9uZVN0eWxlPSJjb250ZW50LWJveCI9PT1sLnN0eWxlLmJhY2tncm91bmRDbGlwLFMuZXh0ZW5kKHkse2JveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHQoKSxvfSxwaXhlbEJveFN0eWxlczpmdW5jdGlvbigpe3JldHVybiB0KCksc30scGl4ZWxQb3NpdGlvbjpmdW5jdGlvbigpe3JldHVybiB0KCkscn0scmVsaWFibGVNYXJnaW5MZWZ0OmZ1bmN0aW9uKCl7cmV0dXJuIHQoKSx1fSxzY3JvbGxib3hTaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHQoKSxpfX0pKX0oKTt2YXIgS3Q9WyJXZWJraXQiLCJNb3oiLCJtcyJdLFh0PWEuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUsSnQ9e307ZnVuY3Rpb24gUXQodCl7dmFyIGU9Uy5jc3NQcm9wc1t0XXx8SnRbdF07cmV0dXJuIGV8fCh0IGluIFh0P3Q6SnRbdF09ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpLG49S3QubGVuZ3RoO24tLTspaWYoKHQ9S3Rbbl0rZSlpbiBYdClyZXR1cm4gdH0odCl8fHQpfXZhciBadD0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sdGU9L14tLS8sZWU9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LG5lPXtsZXR0ZXJTcGFjaW5nOiIwIixmb250V2VpZ2h0OiI0MDAifTtmdW5jdGlvbiByZSh0LGUsbil7dmFyIHI9b3QuZXhlYyhlKTtyZXR1cm4gcj9NYXRoLm1heCgwLHJbMl0tKG58fDApKSsoclszXXx8InB4Iik6ZX1mdW5jdGlvbiBvZSh0LGUsbixyLG8saSl7dmFyIGE9IndpZHRoIj09PWU/MTowLHM9MCx1PTA7aWYobj09PShyPyJib3JkZXIiOiJjb250ZW50IikpcmV0dXJuIDA7Zm9yKDthPDQ7YSs9MikibWFyZ2luIj09PW4mJih1Kz1TLmNzcyh0LG4raXRbYV0sITAsbykpLHI/KCJjb250ZW50Ij09PW4mJih1LT1TLmNzcyh0LCJwYWRkaW5nIitpdFthXSwhMCxvKSksIm1hcmdpbiIhPT1uJiYodS09Uy5jc3ModCwiYm9yZGVyIitpdFthXSsiV2lkdGgiLCEwLG8pKSk6KHUrPVMuY3NzKHQsInBhZGRpbmciK2l0W2FdLCEwLG8pLCJwYWRkaW5nIiE9PW4/dSs9Uy5jc3ModCwiYm9yZGVyIitpdFthXSsiV2lkdGgiLCEwLG8pOnMrPVMuY3NzKHQsImJvcmRlciIraXRbYV0rIldpZHRoIiwhMCxvKSk7cmV0dXJuIXImJmk+PTAmJih1Kz1NYXRoLm1heCgwLE1hdGguY2VpbCh0WyJvZmZzZXQiK2VbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpXS1pLXUtcy0uNSkpfHwwKSx1fWZ1bmN0aW9uIGllKHQsZSxuKXt2YXIgcj0kdCh0KSxvPSgheS5ib3hTaXppbmdSZWxpYWJsZSgpfHxuKSYmImJvcmRlci1ib3giPT09Uy5jc3ModCwiYm94U2l6aW5nIiwhMSxyKSxpPW8sYT1WdCh0LGUscikscz0ib2Zmc2V0IitlWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKTtpZihXdC50ZXN0KGEpKXtpZighbilyZXR1cm4gYTthPSJhdXRvIn1yZXR1cm4oIXkuYm94U2l6aW5nUmVsaWFibGUoKSYmb3x8ImF1dG8iPT09YXx8IXBhcnNlRmxvYXQoYSkmJiJpbmxpbmUiPT09Uy5jc3ModCwiZGlzcGxheSIsITEscikpJiZ0LmdldENsaWVudFJlY3RzKCkubGVuZ3RoJiYobz0iYm9yZGVyLWJveCI9PT1TLmNzcyh0LCJib3hTaXppbmciLCExLHIpLChpPXMgaW4gdCkmJihhPXRbc10pKSwoYT1wYXJzZUZsb2F0KGEpfHwwKStvZSh0LGUsbnx8KG8/ImJvcmRlciI6ImNvbnRlbnQiKSxpLHIsYSkrInB4In1mdW5jdGlvbiBhZSh0LGUsbixyLG8pe3JldHVybiBuZXcgYWUucHJvdG90eXBlLmluaXQodCxlLG4scixvKX1TLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbih0LGUpe2lmKGUpe3ZhciBuPVZ0KHQsIm9wYWNpdHkiKTtyZXR1cm4iIj09PW4/IjEiOm59fX19LGNzc051bWJlcjp7YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsY29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGdyaWRBcmVhOiEwLGdyaWRDb2x1bW46ITAsZ3JpZENvbHVtbkVuZDohMCxncmlkQ29sdW1uU3RhcnQ6ITAsZ3JpZFJvdzohMCxncmlkUm93RW5kOiEwLGdyaWRSb3dTdGFydDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnt9LHN0eWxlOmZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQmJjMhPT10Lm5vZGVUeXBlJiY4IT09dC5ub2RlVHlwZSYmdC5zdHlsZSl7dmFyIG8saSxhLHM9SyhlKSx1PXRlLnRlc3QoZSksYz10LnN0eWxlO2lmKHV8fChlPVF0KHMpKSxhPVMuY3NzSG9va3NbZV18fFMuY3NzSG9va3Nbc10sdm9pZCAwPT09bilyZXR1cm4gYSYmImdldCJpbiBhJiZ2b2lkIDAhPT0obz1hLmdldCh0LCExLHIpKT9vOmNbZV07InN0cmluZyI9PT0oaT10eXBlb2YgbikmJihvPW90LmV4ZWMobikpJiZvWzFdJiYobj1mdCh0LGUsbyksaT0ibnVtYmVyIiksbnVsbCE9biYmbj09biYmKCJudW1iZXIiIT09aXx8dXx8KG4rPW8mJm9bM118fChTLmNzc051bWJlcltzXT8iIjoicHgiKSkseS5jbGVhckNsb25lU3R5bGV8fCIiIT09bnx8MCE9PWUuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoY1tlXT0iaW5oZXJpdCIpLGEmJiJzZXQiaW4gYSYmdm9pZCAwPT09KG49YS5zZXQodCxuLHIpKXx8KHU/Yy5zZXRQcm9wZXJ0eShlLG4pOmNbZV09bikpfX0sY3NzOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvLGksYSxzPUsoZSk7cmV0dXJuIHRlLnRlc3QoZSl8fChlPVF0KHMpKSwoYT1TLmNzc0hvb2tzW2VdfHxTLmNzc0hvb2tzW3NdKSYmImdldCJpbiBhJiYobz1hLmdldCh0LCEwLG4pKSx2b2lkIDA9PT1vJiYobz1WdCh0LGUscikpLCJub3JtYWwiPT09byYmZSBpbiBuZSYmKG89bmVbZV0pLCIiPT09bnx8bj8oaT1wYXJzZUZsb2F0KG8pLCEwPT09bnx8aXNGaW5pdGUoaSk/aXx8MDpvKTpvfX0pLFMuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24odCxlKXtTLmNzc0hvb2tzW2VdPXtnZXQ6ZnVuY3Rpb24odCxuLHIpe2lmKG4pcmV0dXJuIVp0LnRlc3QoUy5jc3ModCwiZGlzcGxheSIpKXx8dC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCYmdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aD9pZSh0LGUscik6bHQodCxlZSxmdW5jdGlvbigpe3JldHVybiBpZSh0LGUscil9KX0sc2V0OmZ1bmN0aW9uKHQsbixyKXt2YXIgbyxpPSR0KHQpLGE9IXkuc2Nyb2xsYm94U2l6ZSgpJiYiYWJzb2x1dGUiPT09aS5wb3NpdGlvbixzPShhfHxyKSYmImJvcmRlci1ib3giPT09Uy5jc3ModCwiYm94U2l6aW5nIiwhMSxpKSx1PXI/b2UodCxlLHIscyxpKTowO3JldHVybiBzJiZhJiYodS09TWF0aC5jZWlsKHRbIm9mZnNldCIrZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSldLXBhcnNlRmxvYXQoaVtlXSktb2UodCxlLCJib3JkZXIiLCExLGkpLS41KSksdSYmKG89b3QuZXhlYyhuKSkmJiJweCIhPT0ob1szXXx8InB4IikmJih0LnN0eWxlW2VdPW4sbj1TLmNzcyh0LGUpKSxyZSgwLG4sdSl9fX0pLFMuY3NzSG9va3MubWFyZ2luTGVmdD1HdCh5LnJlbGlhYmxlTWFyZ2luTGVmdCxmdW5jdGlvbih0LGUpe2lmKGUpcmV0dXJuKHBhcnNlRmxvYXQoVnQodCwibWFyZ2luTGVmdCIpKXx8dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0LWx0KHQse21hcmdpbkxlZnQ6MH0sZnVuY3Rpb24oKXtyZXR1cm4gdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0fSkpKyJweCJ9KSxTLmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbih0LGUpe1MuY3NzSG9va3NbdCtlXT17ZXhwYW5kOmZ1bmN0aW9uKG4pe2Zvcih2YXIgcj0wLG89e30saT0ic3RyaW5nIj09dHlwZW9mIG4/bi5zcGxpdCgiICIpOltuXTtyPDQ7cisrKW9bdCtpdFtyXStlXT1pW3JdfHxpW3ItMl18fGlbMF07cmV0dXJuIG99fSwibWFyZ2luIiE9PXQmJihTLmNzc0hvb2tzW3QrZV0uc2V0PXJlKX0pLFMuZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24odCxlKXtyZXR1cm4gJCh0aGlzLGZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvLGk9e30sYT0wO2lmKEFycmF5LmlzQXJyYXkoZSkpe2ZvcihyPSR0KHQpLG89ZS5sZW5ndGg7YTxvO2ErKylpW2VbYV1dPVMuY3NzKHQsZVthXSwhMSxyKTtyZXR1cm4gaX1yZXR1cm4gdm9pZCAwIT09bj9TLnN0eWxlKHQsZSxuKTpTLmNzcyh0LGUpfSx0LGUsYXJndW1lbnRzLmxlbmd0aD4xKX19KSxTLlR3ZWVuPWFlLGFlLnByb3RvdHlwZT17Y29uc3RydWN0b3I6YWUsaW5pdDpmdW5jdGlvbih0LGUsbixyLG8saSl7dGhpcy5lbGVtPXQsdGhpcy5wcm9wPW4sdGhpcy5lYXNpbmc9b3x8Uy5lYXNpbmcuX2RlZmF1bHQsdGhpcy5vcHRpb25zPWUsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPXIsdGhpcy51bml0PWl8fChTLmNzc051bWJlcltuXT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIHQ9YWUucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIHQmJnQuZ2V0P3QuZ2V0KHRoaXMpOmFlLnByb3BIb29rcy5fZGVmYXVsdC5nZXQodGhpcyl9LHJ1bjpmdW5jdGlvbih0KXt2YXIgZSxuPWFlLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0aGlzLm9wdGlvbnMuZHVyYXRpb24/dGhpcy5wb3M9ZT1TLmVhc2luZ1t0aGlzLmVhc2luZ10odCx0aGlzLm9wdGlvbnMuZHVyYXRpb24qdCwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTp0aGlzLnBvcz1lPXQsdGhpcy5ub3c9KHRoaXMuZW5kLXRoaXMuc3RhcnQpKmUrdGhpcy5zdGFydCx0aGlzLm9wdGlvbnMuc3RlcCYmdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyksbiYmbi5zZXQ/bi5zZXQodGhpcyk6YWUucHJvcEhvb2tzLl9kZWZhdWx0LnNldCh0aGlzKSx0aGlzfX0sYWUucHJvdG90eXBlLmluaXQucHJvdG90eXBlPWFlLnByb3RvdHlwZSxhZS5wcm9wSG9va3M9e19kZWZhdWx0OntnZXQ6ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIDEhPT10LmVsZW0ubm9kZVR5cGV8fG51bGwhPXQuZWxlbVt0LnByb3BdJiZudWxsPT10LmVsZW0uc3R5bGVbdC5wcm9wXT90LmVsZW1bdC5wcm9wXTooZT1TLmNzcyh0LmVsZW0sdC5wcm9wLCIiKSkmJiJhdXRvIiE9PWU/ZTowfSxzZXQ6ZnVuY3Rpb24odCl7Uy5meC5zdGVwW3QucHJvcF0/Uy5meC5zdGVwW3QucHJvcF0odCk6MSE9PXQuZWxlbS5ub2RlVHlwZXx8IVMuY3NzSG9va3NbdC5wcm9wXSYmbnVsbD09dC5lbGVtLnN0eWxlW1F0KHQucHJvcCldP3QuZWxlbVt0LnByb3BdPXQubm93OlMuc3R5bGUodC5lbGVtLHQucHJvcCx0Lm5vdyt0LnVuaXQpfX19LGFlLnByb3BIb29rcy5zY3JvbGxUb3A9YWUucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbih0KXt0LmVsZW0ubm9kZVR5cGUmJnQuZWxlbS5wYXJlbnROb2RlJiYodC5lbGVtW3QucHJvcF09dC5ub3cpfX0sUy5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbih0KXtyZXR1cm4gdH0sc3dpbmc6ZnVuY3Rpb24odCl7cmV0dXJuLjUtTWF0aC5jb3ModCpNYXRoLlBJKS8yfSxfZGVmYXVsdDoic3dpbmcifSxTLmZ4PWFlLnByb3RvdHlwZS5pbml0LFMuZnguc3RlcD17fTt2YXIgc2UsdWUsY2U9L14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLGxlPS9xdWV1ZUhvb2tzJC87ZnVuY3Rpb24gZmUoKXt1ZSYmKCExPT09YS5oaWRkZW4mJm4ucmVxdWVzdEFuaW1hdGlvbkZyYW1lP24ucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZlKTpuLnNldFRpbWVvdXQoZmUsUy5meC5pbnRlcnZhbCksUy5meC50aWNrKCkpfWZ1bmN0aW9uIHBlKCl7cmV0dXJuIG4uc2V0VGltZW91dChmdW5jdGlvbigpe3NlPXZvaWQgMH0pLHNlPURhdGUubm93KCl9ZnVuY3Rpb24gaGUodCxlKXt2YXIgbixyPTAsbz17aGVpZ2h0OnR9O2ZvcihlPWU/MTowO3I8NDtyKz0yLWUpb1sibWFyZ2luIisobj1pdFtyXSldPW9bInBhZGRpbmciK25dPXQ7cmV0dXJuIGUmJihvLm9wYWNpdHk9by53aWR0aD10KSxvfWZ1bmN0aW9uIGRlKHQsZSxuKXtmb3IodmFyIHIsbz0oZ2UudHdlZW5lcnNbZV18fFtdKS5jb25jYXQoZ2UudHdlZW5lcnNbIioiXSksaT0wLGE9by5sZW5ndGg7aTxhO2krKylpZihyPW9baV0uY2FsbChuLGUsdCkpcmV0dXJuIHJ9ZnVuY3Rpb24gZ2UodCxlLG4pe3ZhciByLG8saT0wLGE9Z2UucHJlZmlsdGVycy5sZW5ndGgscz1TLkRlZmVycmVkKCkuYWx3YXlzKGZ1bmN0aW9uKCl7ZGVsZXRlIHUuZWxlbX0pLHU9ZnVuY3Rpb24oKXtpZihvKXJldHVybiExO2Zvcih2YXIgZT1zZXx8cGUoKSxuPU1hdGgubWF4KDAsYy5zdGFydFRpbWUrYy5kdXJhdGlvbi1lKSxyPTEtKG4vYy5kdXJhdGlvbnx8MCksaT0wLGE9Yy50d2VlbnMubGVuZ3RoO2k8YTtpKyspYy50d2VlbnNbaV0ucnVuKHIpO3JldHVybiBzLm5vdGlmeVdpdGgodCxbYyxyLG5dKSxyPDEmJmE/bjooYXx8cy5ub3RpZnlXaXRoKHQsW2MsMSwwXSkscy5yZXNvbHZlV2l0aCh0LFtjXSksITEpfSxjPXMucHJvbWlzZSh7ZWxlbTp0LHByb3BzOlMuZXh0ZW5kKHt9LGUpLG9wdHM6Uy5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e30sZWFzaW5nOlMuZWFzaW5nLl9kZWZhdWx0fSxuKSxvcmlnaW5hbFByb3BlcnRpZXM6ZSxvcmlnaW5hbE9wdGlvbnM6bixzdGFydFRpbWU6c2V8fHBlKCksZHVyYXRpb246bi5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24oZSxuKXt2YXIgcj1TLlR3ZWVuKHQsYy5vcHRzLGUsbixjLm9wdHMuc3BlY2lhbEVhc2luZ1tlXXx8Yy5vcHRzLmVhc2luZyk7cmV0dXJuIGMudHdlZW5zLnB1c2gocikscn0sc3RvcDpmdW5jdGlvbihlKXt2YXIgbj0wLHI9ZT9jLnR3ZWVucy5sZW5ndGg6MDtpZihvKXJldHVybiB0aGlzO2ZvcihvPSEwO248cjtuKyspYy50d2VlbnNbbl0ucnVuKDEpO3JldHVybiBlPyhzLm5vdGlmeVdpdGgodCxbYywxLDBdKSxzLnJlc29sdmVXaXRoKHQsW2MsZV0pKTpzLnJlamVjdFdpdGgodCxbYyxlXSksdGhpc319KSxsPWMucHJvcHM7Zm9yKCFmdW5jdGlvbih0LGUpe3ZhciBuLHIsbyxpLGE7Zm9yKG4gaW4gdClpZihvPWVbcj1LKG4pXSxpPXRbbl0sQXJyYXkuaXNBcnJheShpKSYmKG89aVsxXSxpPXRbbl09aVswXSksbiE9PXImJih0W3JdPWksZGVsZXRlIHRbbl0pLChhPVMuY3NzSG9va3Nbcl0pJiYiZXhwYW5kImluIGEpZm9yKG4gaW4gaT1hLmV4cGFuZChpKSxkZWxldGUgdFtyXSxpKW4gaW4gdHx8KHRbbl09aVtuXSxlW25dPW8pO2Vsc2UgZVtyXT1vfShsLGMub3B0cy5zcGVjaWFsRWFzaW5nKTtpPGE7aSsrKWlmKHI9Z2UucHJlZmlsdGVyc1tpXS5jYWxsKGMsdCxsLGMub3B0cykpcmV0dXJuIG0oci5zdG9wKSYmKFMuX3F1ZXVlSG9va3MoYy5lbGVtLGMub3B0cy5xdWV1ZSkuc3RvcD1yLnN0b3AuYmluZChyKSkscjtyZXR1cm4gUy5tYXAobCxkZSxjKSxtKGMub3B0cy5zdGFydCkmJmMub3B0cy5zdGFydC5jYWxsKHQsYyksYy5wcm9ncmVzcyhjLm9wdHMucHJvZ3Jlc3MpLmRvbmUoYy5vcHRzLmRvbmUsYy5vcHRzLmNvbXBsZXRlKS5mYWlsKGMub3B0cy5mYWlsKS5hbHdheXMoYy5vcHRzLmFsd2F5cyksUy5meC50aW1lcihTLmV4dGVuZCh1LHtlbGVtOnQsYW5pbTpjLHF1ZXVlOmMub3B0cy5xdWV1ZX0pKSxjfVMuQW5pbWF0aW9uPVMuZXh0ZW5kKGdlLHt0d2VlbmVyczp7IioiOltmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuY3JlYXRlVHdlZW4odCxlKTtyZXR1cm4gZnQobi5lbGVtLHQsb3QuZXhlYyhlKSxuKSxufV19LHR3ZWVuZXI6ZnVuY3Rpb24odCxlKXttKHQpPyhlPXQsdD1bIioiXSk6dD10Lm1hdGNoKFUpO2Zvcih2YXIgbixyPTAsbz10Lmxlbmd0aDtyPG87cisrKW49dFtyXSxnZS50d2VlbmVyc1tuXT1nZS50d2VlbmVyc1tuXXx8W10sZ2UudHdlZW5lcnNbbl0udW5zaGlmdChlKX0scHJlZmlsdGVyczpbZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saSxhLHMsdSxjLGwsZj0id2lkdGgiaW4gZXx8ImhlaWdodCJpbiBlLHA9dGhpcyxoPXt9LGQ9dC5zdHlsZSxnPXQubm9kZVR5cGUmJmN0KHQpLHY9US5nZXQodCwiZnhzaG93Iik7Zm9yKHIgaW4gbi5xdWV1ZXx8KG51bGw9PShhPVMuX3F1ZXVlSG9va3ModCwiZngiKSkudW5xdWV1ZWQmJihhLnVucXVldWVkPTAscz1hLmVtcHR5LmZpcmUsYS5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7YS51bnF1ZXVlZHx8cygpfSksYS51bnF1ZXVlZCsrLHAuYWx3YXlzKGZ1bmN0aW9uKCl7cC5hbHdheXMoZnVuY3Rpb24oKXthLnVucXVldWVkLS0sUy5xdWV1ZSh0LCJmeCIpLmxlbmd0aHx8YS5lbXB0eS5maXJlKCl9KX0pKSxlKWlmKG89ZVtyXSxjZS50ZXN0KG8pKXtpZihkZWxldGUgZVtyXSxpPWl8fCJ0b2dnbGUiPT09byxvPT09KGc/ImhpZGUiOiJzaG93Iikpe2lmKCJzaG93IiE9PW98fCF2fHx2b2lkIDA9PT12W3JdKWNvbnRpbnVlO2c9ITB9aFtyXT12JiZ2W3JdfHxTLnN0eWxlKHQscil9aWYoKHU9IVMuaXNFbXB0eU9iamVjdChlKSl8fCFTLmlzRW1wdHlPYmplY3QoaCkpZm9yKHIgaW4gZiYmMT09PXQubm9kZVR5cGUmJihuLm92ZXJmbG93PVtkLm92ZXJmbG93LGQub3ZlcmZsb3dYLGQub3ZlcmZsb3dZXSxudWxsPT0oYz12JiZ2LmRpc3BsYXkpJiYoYz1RLmdldCh0LCJkaXNwbGF5IikpLCJub25lIj09PShsPVMuY3NzKHQsImRpc3BsYXkiKSkmJihjP2w9YzooZHQoW3RdLCEwKSxjPXQuc3R5bGUuZGlzcGxheXx8YyxsPVMuY3NzKHQsImRpc3BsYXkiKSxkdChbdF0pKSksKCJpbmxpbmUiPT09bHx8ImlubGluZS1ibG9jayI9PT1sJiZudWxsIT1jKSYmIm5vbmUiPT09Uy5jc3ModCwiZmxvYXQiKSYmKHV8fChwLmRvbmUoZnVuY3Rpb24oKXtkLmRpc3BsYXk9Y30pLG51bGw9PWMmJihsPWQuZGlzcGxheSxjPSJub25lIj09PWw/IiI6bCkpLGQuZGlzcGxheT0iaW5saW5lLWJsb2NrIikpLG4ub3ZlcmZsb3cmJihkLm92ZXJmbG93PSJoaWRkZW4iLHAuYWx3YXlzKGZ1bmN0aW9uKCl7ZC5vdmVyZmxvdz1uLm92ZXJmbG93WzBdLGQub3ZlcmZsb3dYPW4ub3ZlcmZsb3dbMV0sZC5vdmVyZmxvd1k9bi5vdmVyZmxvd1syXX0pKSx1PSExLGgpdXx8KHY/ImhpZGRlbiJpbiB2JiYoZz12LmhpZGRlbik6dj1RLmFjY2Vzcyh0LCJmeHNob3ciLHtkaXNwbGF5OmN9KSxpJiYodi5oaWRkZW49IWcpLGcmJmR0KFt0XSwhMCkscC5kb25lKGZ1bmN0aW9uKCl7Zm9yKHIgaW4gZ3x8ZHQoW3RdKSxRLnJlbW92ZSh0LCJmeHNob3ciKSxoKVMuc3R5bGUodCxyLGhbcl0pfSkpLHU9ZGUoZz92W3JdOjAscixwKSxyIGluIHZ8fCh2W3JdPXUuc3RhcnQsZyYmKHUuZW5kPXUuc3RhcnQsdS5zdGFydD0wKSl9XSxwcmVmaWx0ZXI6ZnVuY3Rpb24odCxlKXtlP2dlLnByZWZpbHRlcnMudW5zaGlmdCh0KTpnZS5wcmVmaWx0ZXJzLnB1c2godCl9fSksUy5zcGVlZD1mdW5jdGlvbih0LGUsbil7dmFyIHI9dCYmIm9iamVjdCI9PXR5cGVvZiB0P1MuZXh0ZW5kKHt9LHQpOntjb21wbGV0ZTpufHwhbiYmZXx8bSh0KSYmdCxkdXJhdGlvbjp0LGVhc2luZzpuJiZlfHxlJiYhbShlKSYmZX07cmV0dXJuIFMuZngub2ZmP3IuZHVyYXRpb249MDoibnVtYmVyIiE9dHlwZW9mIHIuZHVyYXRpb24mJihyLmR1cmF0aW9uIGluIFMuZnguc3BlZWRzP3IuZHVyYXRpb249Uy5meC5zcGVlZHNbci5kdXJhdGlvbl06ci5kdXJhdGlvbj1TLmZ4LnNwZWVkcy5fZGVmYXVsdCksbnVsbCE9ci5xdWV1ZSYmITAhPT1yLnF1ZXVlfHwoci5xdWV1ZT0iZngiKSxyLm9sZD1yLmNvbXBsZXRlLHIuY29tcGxldGU9ZnVuY3Rpb24oKXttKHIub2xkKSYmci5vbGQuY2FsbCh0aGlzKSxyLnF1ZXVlJiZTLmRlcXVldWUodGhpcyxyLnF1ZXVlKX0scn0sUy5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gdGhpcy5maWx0ZXIoY3QpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6ZX0sdCxuLHIpfSxhbmltYXRlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPVMuaXNFbXB0eU9iamVjdCh0KSxpPVMuc3BlZWQoZSxuLHIpLGE9ZnVuY3Rpb24oKXt2YXIgZT1nZSh0aGlzLFMuZXh0ZW5kKHt9LHQpLGkpOyhvfHxRLmdldCh0aGlzLCJmaW5pc2giKSkmJmUuc3RvcCghMCl9O3JldHVybiBhLmZpbmlzaD1hLG98fCExPT09aS5xdWV1ZT90aGlzLmVhY2goYSk6dGhpcy5xdWV1ZShpLnF1ZXVlLGEpfSxzdG9wOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1mdW5jdGlvbih0KXt2YXIgZT10LnN0b3A7ZGVsZXRlIHQuc3RvcCxlKG4pfTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQmJihuPWUsZT10LHQ9dm9pZCAwKSxlJiYhMSE9PXQmJnRoaXMucXVldWUodHx8ImZ4IixbXSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9ITAsbz1udWxsIT10JiZ0KyJxdWV1ZUhvb2tzIixpPVMudGltZXJzLGE9US5nZXQodGhpcyk7aWYobylhW29dJiZhW29dLnN0b3AmJnIoYVtvXSk7ZWxzZSBmb3IobyBpbiBhKWFbb10mJmFbb10uc3RvcCYmbGUudGVzdChvKSYmcihhW29dKTtmb3Iobz1pLmxlbmd0aDtvLS07KWlbb10uZWxlbSE9PXRoaXN8fG51bGwhPXQmJmlbb10ucXVldWUhPT10fHwoaVtvXS5hbmltLnN0b3AobiksZT0hMSxpLnNwbGljZShvLDEpKTshZSYmbnx8Uy5kZXF1ZXVlKHRoaXMsdCl9KX0sZmluaXNoOmZ1bmN0aW9uKHQpe3JldHVybiExIT09dCYmKHQ9dHx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGUsbj1RLmdldCh0aGlzKSxyPW5bdCsicXVldWUiXSxvPW5bdCsicXVldWVIb29rcyJdLGk9Uy50aW1lcnMsYT1yP3IubGVuZ3RoOjA7Zm9yKG4uZmluaXNoPSEwLFMucXVldWUodGhpcyx0LFtdKSxvJiZvLnN0b3AmJm8uc3RvcC5jYWxsKHRoaXMsITApLGU9aS5sZW5ndGg7ZS0tOylpW2VdLmVsZW09PT10aGlzJiZpW2VdLnF1ZXVlPT09dCYmKGlbZV0uYW5pbS5zdG9wKCEwKSxpLnNwbGljZShlLDEpKTtmb3IoZT0wO2U8YTtlKyspcltlXSYmcltlXS5maW5pc2gmJnJbZV0uZmluaXNoLmNhbGwodGhpcyk7ZGVsZXRlIG4uZmluaXNofSl9fSksUy5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbih0LGUpe3ZhciBuPVMuZm5bZV07Uy5mbltlXT1mdW5jdGlvbih0LHIsbyl7cmV0dXJuIG51bGw9PXR8fCJib29sZWFuIj09dHlwZW9mIHQ/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dGhpcy5hbmltYXRlKGhlKGUsITApLHQscixvKX19KSxTLmVhY2goe3NsaWRlRG93bjpoZSgic2hvdyIpLHNsaWRlVXA6aGUoImhpZGUiKSxzbGlkZVRvZ2dsZTpoZSgidG9nZ2xlIiksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbih0LGUpe1MuZm5bdF09ZnVuY3Rpb24odCxuLHIpe3JldHVybiB0aGlzLmFuaW1hdGUoZSx0LG4scil9fSksUy50aW1lcnM9W10sUy5meC50aWNrPWZ1bmN0aW9uKCl7dmFyIHQsZT0wLG49Uy50aW1lcnM7Zm9yKHNlPURhdGUubm93KCk7ZTxuLmxlbmd0aDtlKyspKHQ9bltlXSkoKXx8bltlXSE9PXR8fG4uc3BsaWNlKGUtLSwxKTtuLmxlbmd0aHx8Uy5meC5zdG9wKCksc2U9dm9pZCAwfSxTLmZ4LnRpbWVyPWZ1bmN0aW9uKHQpe1MudGltZXJzLnB1c2godCksUy5meC5zdGFydCgpfSxTLmZ4LmludGVydmFsPTEzLFMuZnguc3RhcnQ9ZnVuY3Rpb24oKXt1ZXx8KHVlPSEwLGZlKCkpfSxTLmZ4LnN0b3A9ZnVuY3Rpb24oKXt1ZT1udWxsfSxTLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxTLmZuLmRlbGF5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9Uy5meCYmUy5meC5zcGVlZHNbdF18fHQsZT1lfHwiZngiLHRoaXMucXVldWUoZSxmdW5jdGlvbihlLHIpe3ZhciBvPW4uc2V0VGltZW91dChlLHQpO3Iuc3RvcD1mdW5jdGlvbigpe24uY2xlYXJUaW1lb3V0KG8pfX0pfSxmdW5jdGlvbigpe3ZhciB0PWEuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxlPWEuY3JlYXRlRWxlbWVudCgic2VsZWN0IikuYXBwZW5kQ2hpbGQoYS5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSk7dC50eXBlPSJjaGVja2JveCIseS5jaGVja09uPSIiIT09dC52YWx1ZSx5Lm9wdFNlbGVjdGVkPWUuc2VsZWN0ZWQsKHQ9YS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpKS52YWx1ZT0idCIsdC50eXBlPSJyYWRpbyIseS5yYWRpb1ZhbHVlPSJ0Ij09PXQudmFsdWV9KCk7dmFyIHZlLHllPVMuZXhwci5hdHRySGFuZGxlO1MuZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuICQodGhpcyxTLmF0dHIsdCxlLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe1MucmVtb3ZlQXR0cih0aGlzLHQpfSl9fSksUy5leHRlbmQoe2F0dHI6ZnVuY3Rpb24odCxlLG4pe3ZhciByLG8saT10Lm5vZGVUeXBlO2lmKDMhPT1pJiY4IT09aSYmMiE9PWkpcmV0dXJuIHZvaWQgMD09PXQuZ2V0QXR0cmlidXRlP1MucHJvcCh0LGUsbik6KDE9PT1pJiZTLmlzWE1MRG9jKHQpfHwobz1TLmF0dHJIb29rc1tlLnRvTG93ZXJDYXNlKCldfHwoUy5leHByLm1hdGNoLmJvb2wudGVzdChlKT92ZTp2b2lkIDApKSx2b2lkIDAhPT1uP251bGw9PT1uP3ZvaWQgUy5yZW1vdmVBdHRyKHQsZSk6byYmInNldCJpbiBvJiZ2b2lkIDAhPT0ocj1vLnNldCh0LG4sZSkpP3I6KHQuc2V0QXR0cmlidXRlKGUsbisiIiksbik6byYmImdldCJpbiBvJiZudWxsIT09KHI9by5nZXQodCxlKSk/cjpudWxsPT0ocj1TLmZpbmQuYXR0cih0LGUpKT92b2lkIDA6cil9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKHQsZSl7aWYoIXkucmFkaW9WYWx1ZSYmInJhZGlvIj09PWUmJkwodCwiaW5wdXQiKSl7dmFyIG49dC52YWx1ZTtyZXR1cm4gdC5zZXRBdHRyaWJ1dGUoInR5cGUiLGUpLG4mJih0LnZhbHVlPW4pLGV9fX19LHJlbW92ZUF0dHI6ZnVuY3Rpb24odCxlKXt2YXIgbixyPTAsbz1lJiZlLm1hdGNoKFUpO2lmKG8mJjE9PT10Lm5vZGVUeXBlKWZvcig7bj1vW3IrK107KXQucmVtb3ZlQXR0cmlidXRlKG4pfX0pLHZlPXtzZXQ6ZnVuY3Rpb24odCxlLG4pe3JldHVybiExPT09ZT9TLnJlbW92ZUF0dHIodCxuKTp0LnNldEF0dHJpYnV0ZShuLG4pLG59fSxTLmVhY2goUy5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKC9cdysvZyksZnVuY3Rpb24odCxlKXt2YXIgbj15ZVtlXXx8Uy5maW5kLmF0dHI7eWVbZV09ZnVuY3Rpb24odCxlLHIpe3ZhciBvLGksYT1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHJ8fChpPXllW2FdLHllW2FdPW8sbz1udWxsIT1uKHQsZSxyKT9hOm51bGwseWVbYV09aSksb319KTt2YXIgbWU9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxiZT0vXig/OmF8YXJlYSkkL2k7ZnVuY3Rpb24geGUodCl7cmV0dXJuKHQubWF0Y2goVSl8fFtdKS5qb2luKCIgIil9ZnVuY3Rpb24gd2UodCl7cmV0dXJuIHQuZ2V0QXR0cmlidXRlJiZ0LmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiJ9ZnVuY3Rpb24ga2UodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dDoic3RyaW5nIj09dHlwZW9mIHQmJnQubWF0Y2goVSl8fFtdfVMuZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKHQsZSl7cmV0dXJuICQodGhpcyxTLnByb3AsdCxlLGFyZ3VtZW50cy5sZW5ndGg+MSl9LHJlbW92ZVByb3A6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2RlbGV0ZSB0aGlzW1MucHJvcEZpeFt0XXx8dF19KX19KSxTLmV4dGVuZCh7cHJvcDpmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpPXQubm9kZVR5cGU7aWYoMyE9PWkmJjghPT1pJiYyIT09aSlyZXR1cm4gMT09PWkmJlMuaXNYTUxEb2ModCl8fChlPVMucHJvcEZpeFtlXXx8ZSxvPVMucHJvcEhvb2tzW2VdKSx2b2lkIDAhPT1uP28mJiJzZXQiaW4gbyYmdm9pZCAwIT09KHI9by5zZXQodCxuLGUpKT9yOnRbZV09bjpvJiYiZ2V0ImluIG8mJm51bGwhPT0ocj1vLmdldCh0LGUpKT9yOnRbZV19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbih0KXt2YXIgZT1TLmZpbmQuYXR0cih0LCJ0YWJpbmRleCIpO3JldHVybiBlP3BhcnNlSW50KGUsMTApOm1lLnRlc3QodC5ub2RlTmFtZSl8fGJlLnRlc3QodC5ub2RlTmFtZSkmJnQuaHJlZj8wOi0xfX19LHByb3BGaXg6e2ZvcjoiaHRtbEZvciIsY2xhc3M6ImNsYXNzTmFtZSJ9fSkseS5vcHRTZWxlY3RlZHx8KFMucHJvcEhvb2tzLnNlbGVjdGVkPXtnZXQ6ZnVuY3Rpb24odCl7dmFyIGU9dC5wYXJlbnROb2RlO3JldHVybiBlJiZlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LG51bGx9LHNldDpmdW5jdGlvbih0KXt2YXIgZT10LnBhcmVudE5vZGU7ZSYmKGUuc2VsZWN0ZWRJbmRleCxlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KX19KSxTLmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe1MucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KSxTLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixyLG8saSxhLHMsdT0wO2lmKG0odCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihlKXtTKHRoaXMpLmFkZENsYXNzKHQuY2FsbCh0aGlzLGUsd2UodGhpcykpKX0pO2lmKChlPWtlKHQpKS5sZW5ndGgpZm9yKDtuPXRoaXNbdSsrXTspaWYobz13ZShuKSxyPTE9PT1uLm5vZGVUeXBlJiYiICIreGUobykrIiAiKXtmb3IoYT0wO2k9ZVthKytdOylyLmluZGV4T2YoIiAiK2krIiAiKTwwJiYocis9aSsiICIpO28hPT0ocz14ZShyKSkmJm4uc2V0QXR0cmlidXRlKCJjbGFzcyIscyl9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYSxzLHU9MDtpZihtKHQpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oZSl7Uyh0aGlzKS5yZW1vdmVDbGFzcyh0LmNhbGwodGhpcyxlLHdlKHRoaXMpKSl9KTtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdGhpcy5hdHRyKCJjbGFzcyIsIiIpO2lmKChlPWtlKHQpKS5sZW5ndGgpZm9yKDtuPXRoaXNbdSsrXTspaWYobz13ZShuKSxyPTE9PT1uLm5vZGVUeXBlJiYiICIreGUobykrIiAiKXtmb3IoYT0wO2k9ZVthKytdOylmb3IoO3IuaW5kZXhPZigiICIraSsiICIpPi0xOylyPXIucmVwbGFjZSgiICIraSsiICIsIiAiKTtvIT09KHM9eGUocikpJiZuLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHMpfXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbih0LGUpe3ZhciBuPXR5cGVvZiB0LHI9InN0cmluZyI9PT1ufHxBcnJheS5pc0FycmF5KHQpO3JldHVybiJib29sZWFuIj09dHlwZW9mIGUmJnI/ZT90aGlzLmFkZENsYXNzKHQpOnRoaXMucmVtb3ZlQ2xhc3ModCk6bSh0KT90aGlzLmVhY2goZnVuY3Rpb24obil7Uyh0aGlzKS50b2dnbGVDbGFzcyh0LmNhbGwodGhpcyxuLHdlKHRoaXMpLGUpLGUpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGUsbyxpLGE7aWYocilmb3Iobz0wLGk9Uyh0aGlzKSxhPWtlKHQpO2U9YVtvKytdOylpLmhhc0NsYXNzKGUpP2kucmVtb3ZlQ2xhc3MoZSk6aS5hZGRDbGFzcyhlKTtlbHNlIHZvaWQgMCE9PXQmJiJib29sZWFuIiE9PW58fCgoZT13ZSh0aGlzKSkmJlEuc2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iLGUpLHRoaXMuc2V0QXR0cmlidXRlJiZ0aGlzLnNldEF0dHJpYnV0ZSgiY2xhc3MiLGV8fCExPT09dD8iIjpRLmdldCh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKSl9KX0saGFzQ2xhc3M6ZnVuY3Rpb24odCl7dmFyIGUsbixyPTA7Zm9yKGU9IiAiK3QrIiAiO249dGhpc1tyKytdOylpZigxPT09bi5ub2RlVHlwZSYmKCIgIit4ZSh3ZShuKSkrIiAiKS5pbmRleE9mKGUpPi0xKXJldHVybiEwO3JldHVybiExfX0pO3ZhciBTZT0vXHIvZztTLmZuLmV4dGVuZCh7dmFsOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvPXRoaXNbMF07cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bSh0KSx0aGlzLmVhY2goZnVuY3Rpb24obil7dmFyIG87MT09PXRoaXMubm9kZVR5cGUmJihudWxsPT0obz1yP3QuY2FsbCh0aGlzLG4sUyh0aGlzKS52YWwoKSk6dCk/bz0iIjoibnVtYmVyIj09dHlwZW9mIG8/bys9IiI6QXJyYXkuaXNBcnJheShvKSYmKG89Uy5tYXAobyxmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD8iIjp0KyIifSkpLChlPVMudmFsSG9va3NbdGhpcy50eXBlXXx8Uy52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmInNldCJpbiBlJiZ2b2lkIDAhPT1lLnNldCh0aGlzLG8sInZhbHVlIil8fCh0aGlzLnZhbHVlPW8pKX0pKTpvPyhlPVMudmFsSG9va3Nbby50eXBlXXx8Uy52YWxIb29rc1tvLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmImdldCJpbiBlJiZ2b2lkIDAhPT0obj1lLmdldChvLCJ2YWx1ZSIpKT9uOiJzdHJpbmciPT10eXBlb2Yobj1vLnZhbHVlKT9uLnJlcGxhY2UoU2UsIiIpOm51bGw9PW4/IiI6bjp2b2lkIDB9fSksUy5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbih0KXt2YXIgZT1TLmZpbmQuYXR0cih0LCJ2YWx1ZSIpO3JldHVybiBudWxsIT1lP2U6eGUoUy50ZXh0KHQpKX19LHNlbGVjdDp7Z2V0OmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvPXQub3B0aW9ucyxpPXQuc2VsZWN0ZWRJbmRleCxhPSJzZWxlY3Qtb25lIj09PXQudHlwZSxzPWE/bnVsbDpbXSx1PWE/aSsxOm8ubGVuZ3RoO2ZvcihyPWk8MD91OmE/aTowO3I8dTtyKyspaWYoKChuPW9bcl0pLnNlbGVjdGVkfHxyPT09aSkmJiFuLmRpc2FibGVkJiYoIW4ucGFyZW50Tm9kZS5kaXNhYmxlZHx8IUwobi5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7aWYoZT1TKG4pLnZhbCgpLGEpcmV0dXJuIGU7cy5wdXNoKGUpfXJldHVybiBzfSxzZXQ6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4scixvPXQub3B0aW9ucyxpPVMubWFrZUFycmF5KGUpLGE9by5sZW5ndGg7YS0tOykoKHI9b1thXSkuc2VsZWN0ZWQ9Uy5pbkFycmF5KFMudmFsSG9va3Mub3B0aW9uLmdldChyKSxpKT4tMSkmJihuPSEwKTtyZXR1cm4gbnx8KHQuc2VsZWN0ZWRJbmRleD0tMSksaX19fX0pLFMuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe1MudmFsSG9va3NbdGhpc109e3NldDpmdW5jdGlvbih0LGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIHQuY2hlY2tlZD1TLmluQXJyYXkoUyh0KS52YWwoKSxlKT4tMX19LHkuY2hlY2tPbnx8KFMudmFsSG9va3NbdGhpc10uZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dC5nZXRBdHRyaWJ1dGUoInZhbHVlIik/Im9uIjp0LnZhbHVlfSl9KSx5LmZvY3VzaW49Im9uZm9jdXNpbiJpbiBuO3ZhciBFZT0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8samU9ZnVuY3Rpb24odCl7dC5zdG9wUHJvcGFnYXRpb24oKX07Uy5leHRlbmQoUy5ldmVudCx7dHJpZ2dlcjpmdW5jdGlvbih0LGUscixvKXt2YXIgaSxzLHUsYyxsLGYscCxoLGc9W3J8fGFdLHY9ZC5jYWxsKHQsInR5cGUiKT90LnR5cGU6dCx5PWQuY2FsbCh0LCJuYW1lc3BhY2UiKT90Lm5hbWVzcGFjZS5zcGxpdCgiLiIpOltdO2lmKHM9aD11PXI9cnx8YSwzIT09ci5ub2RlVHlwZSYmOCE9PXIubm9kZVR5cGUmJiFFZS50ZXN0KHYrUy5ldmVudC50cmlnZ2VyZWQpJiYodi5pbmRleE9mKCIuIik+LTEmJih5PXYuc3BsaXQoIi4iKSx2PXkuc2hpZnQoKSx5LnNvcnQoKSksbD12LmluZGV4T2YoIjoiKTwwJiYib24iK3YsKHQ9dFtTLmV4cGFuZG9dP3Q6bmV3IFMuRXZlbnQodiwib2JqZWN0Ij09dHlwZW9mIHQmJnQpKS5pc1RyaWdnZXI9bz8yOjMsdC5uYW1lc3BhY2U9eS5qb2luKCIuIiksdC5ybmFtZXNwYWNlPXQubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK3kuam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCx0LnJlc3VsdD12b2lkIDAsdC50YXJnZXR8fCh0LnRhcmdldD1yKSxlPW51bGw9PWU/W3RdOlMubWFrZUFycmF5KGUsW3RdKSxwPVMuZXZlbnQuc3BlY2lhbFt2XXx8e30sb3x8IXAudHJpZ2dlcnx8ITEhPT1wLnRyaWdnZXIuYXBwbHkocixlKSkpe2lmKCFvJiYhcC5ub0J1YmJsZSYmIWIocikpe2ZvcihjPXAuZGVsZWdhdGVUeXBlfHx2LEVlLnRlc3QoYyt2KXx8KHM9cy5wYXJlbnROb2RlKTtzO3M9cy5wYXJlbnROb2RlKWcucHVzaChzKSx1PXM7dT09PShyLm93bmVyRG9jdW1lbnR8fGEpJiZnLnB1c2godS5kZWZhdWx0Vmlld3x8dS5wYXJlbnRXaW5kb3d8fG4pfWZvcihpPTA7KHM9Z1tpKytdKSYmIXQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTspaD1zLHQudHlwZT1pPjE/YzpwLmJpbmRUeXBlfHx2LChmPShRLmdldChzLCJldmVudHMiKXx8e30pW3QudHlwZV0mJlEuZ2V0KHMsImhhbmRsZSIpKSYmZi5hcHBseShzLGUpLChmPWwmJnNbbF0pJiZmLmFwcGx5JiZYKHMpJiYodC5yZXN1bHQ9Zi5hcHBseShzLGUpLCExPT09dC5yZXN1bHQmJnQucHJldmVudERlZmF1bHQoKSk7cmV0dXJuIHQudHlwZT12LG98fHQuaXNEZWZhdWx0UHJldmVudGVkKCl8fHAuX2RlZmF1bHQmJiExIT09cC5fZGVmYXVsdC5hcHBseShnLnBvcCgpLGUpfHwhWChyKXx8bCYmbShyW3ZdKSYmIWIocikmJigodT1yW2xdKSYmKHJbbF09bnVsbCksUy5ldmVudC50cmlnZ2VyZWQ9dix0LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJmguYWRkRXZlbnRMaXN0ZW5lcih2LGplKSxyW3ZdKCksdC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpJiZoLnJlbW92ZUV2ZW50TGlzdGVuZXIodixqZSksUy5ldmVudC50cmlnZ2VyZWQ9dm9pZCAwLHUmJihyW2xdPXUpKSx0LnJlc3VsdH19LHNpbXVsYXRlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1TLmV4dGVuZChuZXcgUy5FdmVudCxuLHt0eXBlOnQsaXNTaW11bGF0ZWQ6ITB9KTtTLmV2ZW50LnRyaWdnZXIocixudWxsLGUpfX0pLFMuZm4uZXh0ZW5kKHt0cmlnZ2VyOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe1MuZXZlbnQudHJpZ2dlcih0LGUsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzWzBdO2lmKG4pcmV0dXJuIFMuZXZlbnQudHJpZ2dlcih0LGUsbiwhMCl9fSkseS5mb2N1c2lufHxTLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKHQsZSl7dmFyIG49ZnVuY3Rpb24odCl7Uy5ldmVudC5zaW11bGF0ZShlLHQudGFyZ2V0LFMuZXZlbnQuZml4KHQpKX07Uy5ldmVudC5zcGVjaWFsW2VdPXtzZXR1cDpmdW5jdGlvbigpe3ZhciByPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxvPVEuYWNjZXNzKHIsZSk7b3x8ci5hZGRFdmVudExpc3RlbmVyKHQsbiwhMCksUS5hY2Nlc3MocixlLChvfHwwKSsxKX0sdGVhcmRvd246ZnVuY3Rpb24oKXt2YXIgcj10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsbz1RLmFjY2VzcyhyLGUpLTE7bz9RLmFjY2VzcyhyLGUsbyk6KHIucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4sITApLFEucmVtb3ZlKHIsZSkpfX19KTt2YXIgVGU9bi5sb2NhdGlvbixPZT1EYXRlLm5vdygpLEFlPS9cPy87Uy5wYXJzZVhNTD1mdW5jdGlvbih0KXt2YXIgZTtpZighdHx8InN0cmluZyIhPXR5cGVvZiB0KXJldHVybiBudWxsO3RyeXtlPShuZXcgbi5ET01QYXJzZXIpLnBhcnNlRnJvbVN0cmluZyh0LCJ0ZXh0L3htbCIpfWNhdGNoKHQpe2U9dm9pZCAwfXJldHVybiBlJiYhZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGh8fFMuZXJyb3IoIkludmFsaWQgWE1MOiAiK3QpLGV9O3ZhciBDZT0vXFtcXSQvLExlPS9ccj9cbi9nLFJlPS9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSxQZT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7ZnVuY3Rpb24gTmUodCxlLG4scil7dmFyIG87aWYoQXJyYXkuaXNBcnJheShlKSlTLmVhY2goZSxmdW5jdGlvbihlLG8pe258fENlLnRlc3QodCk/cih0LG8pOk5lKHQrIlsiKygib2JqZWN0Ij09dHlwZW9mIG8mJm51bGwhPW8/ZToiIikrIl0iLG8sbixyKX0pO2Vsc2UgaWYobnx8Im9iamVjdCIhPT1rKGUpKXIodCxlKTtlbHNlIGZvcihvIGluIGUpTmUodCsiWyIrbysiXSIsZVtvXSxuLHIpfVMucGFyYW09ZnVuY3Rpb24odCxlKXt2YXIgbixyPVtdLG89ZnVuY3Rpb24odCxlKXt2YXIgbj1tKGUpP2UoKTplO3Jbci5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudCh0KSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KG51bGw9PW4/IiI6bil9O2lmKG51bGw9PXQpcmV0dXJuIiI7aWYoQXJyYXkuaXNBcnJheSh0KXx8dC5qcXVlcnkmJiFTLmlzUGxhaW5PYmplY3QodCkpUy5lYWNoKHQsZnVuY3Rpb24oKXtvKHRoaXMubmFtZSx0aGlzLnZhbHVlKX0pO2Vsc2UgZm9yKG4gaW4gdClOZShuLHRbbl0sZSxvKTtyZXR1cm4gci5qb2luKCImIil9LFMuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gUy5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciB0PVMucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiB0P1MubWFrZUFycmF5KHQpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgdD10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIVModGhpcykuaXMoIjpkaXNhYmxlZCIpJiZQZS50ZXN0KHRoaXMubm9kZU5hbWUpJiYhUmUudGVzdCh0KSYmKHRoaXMuY2hlY2tlZHx8IWd0LnRlc3QodCkpfSkubWFwKGZ1bmN0aW9uKHQsZSl7dmFyIG49Uyh0aGlzKS52YWwoKTtyZXR1cm4gbnVsbD09bj9udWxsOkFycmF5LmlzQXJyYXkobik/Uy5tYXAobixmdW5jdGlvbih0KXtyZXR1cm57bmFtZTplLm5hbWUsdmFsdWU6dC5yZXBsYWNlKExlLCJcclxuIil9fSk6e25hbWU6ZS5uYW1lLHZhbHVlOm4ucmVwbGFjZShMZSwiXHJcbiIpfX0pLmdldCgpfX0pO3ZhciBJZT0vJTIwL2csX2U9LyMuKiQvLERlPS8oWz8mXSlfPVteJl0qLyxNZT0vXiguKj8pOlsgXHRdKihbXlxyXG5dKikkL2dtLFVlPS9eKD86R0VUfEhFQUQpJC8sQmU9L15cL1wvLyxxZT17fSxGZT17fSxIZT0iKi8iLmNvbmNhdCgiKiIpLHplPWEuY3JlYXRlRWxlbWVudCgiYSIpO2Z1bmN0aW9uIFdlKHQpe3JldHVybiBmdW5jdGlvbihlLG4peyJzdHJpbmciIT10eXBlb2YgZSYmKG49ZSxlPSIqIik7dmFyIHIsbz0wLGk9ZS50b0xvd2VyQ2FzZSgpLm1hdGNoKFUpfHxbXTtpZihtKG4pKWZvcig7cj1pW28rK107KSIrIj09PXJbMF0/KHI9ci5zbGljZSgxKXx8IioiLCh0W3JdPXRbcl18fFtdKS51bnNoaWZ0KG4pKToodFtyXT10W3JdfHxbXSkucHVzaChuKX19ZnVuY3Rpb24gJGUodCxlLG4scil7dmFyIG89e30saT10PT09RmU7ZnVuY3Rpb24gYShzKXt2YXIgdTtyZXR1cm4gb1tzXT0hMCxTLmVhY2godFtzXXx8W10sZnVuY3Rpb24odCxzKXt2YXIgYz1zKGUsbixyKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGN8fGl8fG9bY10/aT8hKHU9Yyk6dm9pZCAwOihlLmRhdGFUeXBlcy51bnNoaWZ0KGMpLGEoYyksITEpfSksdX1yZXR1cm4gYShlLmRhdGFUeXBlc1swXSl8fCFvWyIqIl0mJmEoIioiKX1mdW5jdGlvbiBZZSh0LGUpe3ZhciBuLHIsbz1TLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKG4gaW4gZSl2b2lkIDAhPT1lW25dJiYoKG9bbl0/dDpyfHwocj17fSkpW25dPWVbbl0pO3JldHVybiByJiZTLmV4dGVuZCghMCx0LHIpLHR9emUuaHJlZj1UZS5ocmVmLFMuZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fSxhamF4U2V0dGluZ3M6e3VybDpUZS5ocmVmLHR5cGU6IkdFVCIsaXNMb2NhbDovXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLy50ZXN0KFRlLnByb3RvY29sKSxnbG9iYWw6ITAscHJvY2Vzc0RhdGE6ITAsYXN5bmM6ITAsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsYWNjZXB0czp7IioiOkhlLHRleHQ6InRleHQvcGxhaW4iLGh0bWw6InRleHQvaHRtbCIseG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQifSxjb250ZW50czp7eG1sOi9cYnhtbFxiLyxodG1sOi9cYmh0bWwvLGpzb246L1xianNvblxiL30scmVzcG9uc2VGaWVsZHM6e3htbDoicmVzcG9uc2VYTUwiLHRleHQ6InJlc3BvbnNlVGV4dCIsanNvbjoicmVzcG9uc2VKU09OIn0sY29udmVydGVyczp7IiogdGV4dCI6U3RyaW5nLCJ0ZXh0IGh0bWwiOiEwLCJ0ZXh0IGpzb24iOkpTT04ucGFyc2UsInRleHQgeG1sIjpTLnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7dXJsOiEwLGNvbnRleHQ6ITB9fSxhamF4U2V0dXA6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT9ZZShZZSh0LFMuYWpheFNldHRpbmdzKSxlKTpZZShTLmFqYXhTZXR0aW5ncyx0KX0sYWpheFByZWZpbHRlcjpXZShxZSksYWpheFRyYW5zcG9ydDpXZShGZSksYWpheDpmdW5jdGlvbih0LGUpeyJvYmplY3QiPT10eXBlb2YgdCYmKGU9dCx0PXZvaWQgMCksZT1lfHx7fTt2YXIgcixvLGkscyx1LGMsbCxmLHAsaCxkPVMuYWpheFNldHVwKHt9LGUpLGc9ZC5jb250ZXh0fHxkLHY9ZC5jb250ZXh0JiYoZy5ub2RlVHlwZXx8Zy5qcXVlcnkpP1MoZyk6Uy5ldmVudCx5PVMuRGVmZXJyZWQoKSxtPVMuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGI9ZC5zdGF0dXNDb2RlfHx7fSx4PXt9LHc9e30saz0iY2FuY2VsZWQiLEU9e3JlYWR5U3RhdGU6MCxnZXRSZXNwb25zZUhlYWRlcjpmdW5jdGlvbih0KXt2YXIgZTtpZihsKXtpZighcylmb3Iocz17fTtlPU1lLmV4ZWMoaSk7KXNbZVsxXS50b0xvd2VyQ2FzZSgpKyIgIl09KHNbZVsxXS50b0xvd2VyQ2FzZSgpKyIgIl18fFtdKS5jb25jYXQoZVsyXSk7ZT1zW3QudG9Mb3dlckNhc2UoKSsiICJdfXJldHVybiBudWxsPT1lP251bGw6ZS5qb2luKCIsICIpfSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gbD9pOm51bGx9LHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09bCYmKHQ9d1t0LnRvTG93ZXJDYXNlKCldPXdbdC50b0xvd2VyQ2FzZSgpXXx8dCx4W3RdPWUpLHRoaXN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PWwmJihkLm1pbWVUeXBlPXQpLHRoaXN9LHN0YXR1c0NvZGU6ZnVuY3Rpb24odCl7dmFyIGU7aWYodClpZihsKUUuYWx3YXlzKHRbRS5zdGF0dXNdKTtlbHNlIGZvcihlIGluIHQpYltlXT1bYltlXSx0W2VdXTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24odCl7dmFyIGU9dHx8aztyZXR1cm4gciYmci5hYm9ydChlKSxqKDAsZSksdGhpc319O2lmKHkucHJvbWlzZShFKSxkLnVybD0oKHR8fGQudXJsfHxUZS5ocmVmKSsiIikucmVwbGFjZShCZSxUZS5wcm90b2NvbCsiLy8iKSxkLnR5cGU9ZS5tZXRob2R8fGUudHlwZXx8ZC5tZXRob2R8fGQudHlwZSxkLmRhdGFUeXBlcz0oZC5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLm1hdGNoKFUpfHxbIiJdLG51bGw9PWQuY3Jvc3NEb21haW4pe2M9YS5jcmVhdGVFbGVtZW50KCJhIik7dHJ5e2MuaHJlZj1kLnVybCxjLmhyZWY9Yy5ocmVmLGQuY3Jvc3NEb21haW49emUucHJvdG9jb2wrIi8vIit6ZS5ob3N0IT1jLnByb3RvY29sKyIvLyIrYy5ob3N0fWNhdGNoKHQpe2QuY3Jvc3NEb21haW49ITB9fWlmKGQuZGF0YSYmZC5wcm9jZXNzRGF0YSYmInN0cmluZyIhPXR5cGVvZiBkLmRhdGEmJihkLmRhdGE9Uy5wYXJhbShkLmRhdGEsZC50cmFkaXRpb25hbCkpLCRlKHFlLGQsZSxFKSxsKXJldHVybiBFO2ZvcihwIGluKGY9Uy5ldmVudCYmZC5nbG9iYWwpJiYwPT1TLmFjdGl2ZSsrJiZTLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpLGQudHlwZT1kLnR5cGUudG9VcHBlckNhc2UoKSxkLmhhc0NvbnRlbnQ9IVVlLnRlc3QoZC50eXBlKSxvPWQudXJsLnJlcGxhY2UoX2UsIiIpLGQuaGFzQ29udGVudD9kLmRhdGEmJmQucHJvY2Vzc0RhdGEmJjA9PT0oZC5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiYoZC5kYXRhPWQuZGF0YS5yZXBsYWNlKEllLCIrIikpOihoPWQudXJsLnNsaWNlKG8ubGVuZ3RoKSxkLmRhdGEmJihkLnByb2Nlc3NEYXRhfHwic3RyaW5nIj09dHlwZW9mIGQuZGF0YSkmJihvKz0oQWUudGVzdChvKT8iJiI6Ij8iKStkLmRhdGEsZGVsZXRlIGQuZGF0YSksITE9PT1kLmNhY2hlJiYobz1vLnJlcGxhY2UoRGUsIiQxIiksaD0oQWUudGVzdChvKT8iJiI6Ij8iKSsiXz0iK09lKysraCksZC51cmw9bytoKSxkLmlmTW9kaWZpZWQmJihTLmxhc3RNb2RpZmllZFtvXSYmRS5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsUy5sYXN0TW9kaWZpZWRbb10pLFMuZXRhZ1tvXSYmRS5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixTLmV0YWdbb10pKSwoZC5kYXRhJiZkLmhhc0NvbnRlbnQmJiExIT09ZC5jb250ZW50VHlwZXx8ZS5jb250ZW50VHlwZSkmJkUuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIixkLmNvbnRlbnRUeXBlKSxFLnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsZC5kYXRhVHlwZXNbMF0mJmQuYWNjZXB0c1tkLmRhdGFUeXBlc1swXV0/ZC5hY2NlcHRzW2QuZGF0YVR5cGVzWzBdXSsoIioiIT09ZC5kYXRhVHlwZXNbMF0/IiwgIitIZSsiOyBxPTAuMDEiOiIiKTpkLmFjY2VwdHNbIioiXSksZC5oZWFkZXJzKUUuc2V0UmVxdWVzdEhlYWRlcihwLGQuaGVhZGVyc1twXSk7aWYoZC5iZWZvcmVTZW5kJiYoITE9PT1kLmJlZm9yZVNlbmQuY2FsbChnLEUsZCl8fGwpKXJldHVybiBFLmFib3J0KCk7aWYoaz0iYWJvcnQiLG0uYWRkKGQuY29tcGxldGUpLEUuZG9uZShkLnN1Y2Nlc3MpLEUuZmFpbChkLmVycm9yKSxyPSRlKEZlLGQsZSxFKSl7aWYoRS5yZWFkeVN0YXRlPTEsZiYmdi50cmlnZ2VyKCJhamF4U2VuZCIsW0UsZF0pLGwpcmV0dXJuIEU7ZC5hc3luYyYmZC50aW1lb3V0PjAmJih1PW4uc2V0VGltZW91dChmdW5jdGlvbigpe0UuYWJvcnQoInRpbWVvdXQiKX0sZC50aW1lb3V0KSk7dHJ5e2w9ITEsci5zZW5kKHgsail9Y2F0Y2godCl7aWYobCl0aHJvdyB0O2ooLTEsdCl9fWVsc2UgaigtMSwiTm8gVHJhbnNwb3J0Iik7ZnVuY3Rpb24gaih0LGUsYSxzKXt2YXIgYyxwLGgseCx3LGs9ZTtsfHwobD0hMCx1JiZuLmNsZWFyVGltZW91dCh1KSxyPXZvaWQgMCxpPXN8fCIiLEUucmVhZHlTdGF0ZT10PjA/NDowLGM9dD49MjAwJiZ0PDMwMHx8MzA0PT09dCxhJiYoeD1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciByLG8saSxhLHM9dC5jb250ZW50cyx1PXQuZGF0YVR5cGVzOyIqIj09PXVbMF07KXUuc2hpZnQoKSx2b2lkIDA9PT1yJiYocj10Lm1pbWVUeXBlfHxlLmdldFJlc3BvbnNlSGVhZGVyKCJDb250ZW50LVR5cGUiKSk7aWYocilmb3IobyBpbiBzKWlmKHNbb10mJnNbb10udGVzdChyKSl7dS51bnNoaWZ0KG8pO2JyZWFrfWlmKHVbMF1pbiBuKWk9dVswXTtlbHNle2ZvcihvIGluIG4pe2lmKCF1WzBdfHx0LmNvbnZlcnRlcnNbbysiICIrdVswXV0pe2k9bzticmVha31hfHwoYT1vKX1pPWl8fGF9aWYoaSlyZXR1cm4gaSE9PXVbMF0mJnUudW5zaGlmdChpKSxuW2ldfShkLEUsYSkpLHg9ZnVuY3Rpb24odCxlLG4scil7dmFyIG8saSxhLHMsdSxjPXt9LGw9dC5kYXRhVHlwZXMuc2xpY2UoKTtpZihsWzFdKWZvcihhIGluIHQuY29udmVydGVycyljW2EudG9Mb3dlckNhc2UoKV09dC5jb252ZXJ0ZXJzW2FdO2ZvcihpPWwuc2hpZnQoKTtpOylpZih0LnJlc3BvbnNlRmllbGRzW2ldJiYoblt0LnJlc3BvbnNlRmllbGRzW2ldXT1lKSwhdSYmciYmdC5kYXRhRmlsdGVyJiYoZT10LmRhdGFGaWx0ZXIoZSx0LmRhdGFUeXBlKSksdT1pLGk9bC5zaGlmdCgpKWlmKCIqIj09PWkpaT11O2Vsc2UgaWYoIioiIT09dSYmdSE9PWkpe2lmKCEoYT1jW3UrIiAiK2ldfHxjWyIqICIraV0pKWZvcihvIGluIGMpaWYoKHM9by5zcGxpdCgiICIpKVsxXT09PWkmJihhPWNbdSsiICIrc1swXV18fGNbIiogIitzWzBdXSkpeyEwPT09YT9hPWNbb106ITAhPT1jW29dJiYoaT1zWzBdLGwudW5zaGlmdChzWzFdKSk7YnJlYWt9aWYoITAhPT1hKWlmKGEmJnQudGhyb3dzKWU9YShlKTtlbHNlIHRyeXtlPWEoZSl9Y2F0Y2godCl7cmV0dXJue3N0YXRlOiJwYXJzZXJlcnJvciIsZXJyb3I6YT90OiJObyBjb252ZXJzaW9uIGZyb20gIit1KyIgdG8gIitpfX19cmV0dXJue3N0YXRlOiJzdWNjZXNzIixkYXRhOmV9fShkLHgsRSxjKSxjPyhkLmlmTW9kaWZpZWQmJigodz1FLmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIikpJiYoUy5sYXN0TW9kaWZpZWRbb109dyksKHc9RS5nZXRSZXNwb25zZUhlYWRlcigiZXRhZyIpKSYmKFMuZXRhZ1tvXT13KSksMjA0PT09dHx8IkhFQUQiPT09ZC50eXBlP2s9Im5vY29udGVudCI6MzA0PT09dD9rPSJub3Rtb2RpZmllZCI6KGs9eC5zdGF0ZSxwPXguZGF0YSxjPSEoaD14LmVycm9yKSkpOihoPWssIXQmJmt8fChrPSJlcnJvciIsdDwwJiYodD0wKSkpLEUuc3RhdHVzPXQsRS5zdGF0dXNUZXh0PShlfHxrKSsiIixjP3kucmVzb2x2ZVdpdGgoZyxbcCxrLEVdKTp5LnJlamVjdFdpdGgoZyxbRSxrLGhdKSxFLnN0YXR1c0NvZGUoYiksYj12b2lkIDAsZiYmdi50cmlnZ2VyKGM/ImFqYXhTdWNjZXNzIjoiYWpheEVycm9yIixbRSxkLGM/cDpoXSksbS5maXJlV2l0aChnLFtFLGtdKSxmJiYodi50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFtFLGRdKSwtLVMuYWN0aXZlfHxTLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpKX1yZXR1cm4gRX0sZ2V0SlNPTjpmdW5jdGlvbih0LGUsbil7cmV0dXJuIFMuZ2V0KHQsZSxuLCJqc29uIil9LGdldFNjcmlwdDpmdW5jdGlvbih0LGUpe3JldHVybiBTLmdldCh0LHZvaWQgMCxlLCJzY3JpcHQiKX19KSxTLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24odCxlKXtTW2VdPWZ1bmN0aW9uKHQsbixyLG8pe3JldHVybiBtKG4pJiYobz1vfHxyLHI9bixuPXZvaWQgMCksUy5hamF4KFMuZXh0ZW5kKHt1cmw6dCx0eXBlOmUsZGF0YVR5cGU6byxkYXRhOm4sc3VjY2VzczpyfSxTLmlzUGxhaW5PYmplY3QodCkmJnQpKX19KSxTLl9ldmFsVXJsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFMuYWpheCh7dXJsOnQsdHlwZToiR0VUIixkYXRhVHlwZToic2NyaXB0IixjYWNoZTohMCxhc3luYzohMSxnbG9iYWw6ITEsY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbigpe319LGRhdGFGaWx0ZXI6ZnVuY3Rpb24odCl7Uy5nbG9iYWxFdmFsKHQsZSl9fSl9LFMuZm4uZXh0ZW5kKHt3cmFwQWxsOmZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiB0aGlzWzBdJiYobSh0KSYmKHQ9dC5jYWxsKHRoaXNbMF0pKSxlPVModCx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSx0aGlzWzBdLnBhcmVudE5vZGUmJmUuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGUubWFwKGZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXM7dC5maXJzdEVsZW1lbnRDaGlsZDspdD10LmZpcnN0RWxlbWVudENoaWxkO3JldHVybiB0fSkuYXBwZW5kKHRoaXMpKSx0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG0odCk/dGhpcy5lYWNoKGZ1bmN0aW9uKGUpe1ModGhpcykud3JhcElubmVyKHQuY2FsbCh0aGlzLGUpKX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBlPVModGhpcyksbj1lLmNvbnRlbnRzKCk7bi5sZW5ndGg/bi53cmFwQWxsKHQpOmUuYXBwZW5kKHQpfSl9LHdyYXA6ZnVuY3Rpb24odCl7dmFyIGU9bSh0KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe1ModGhpcykud3JhcEFsbChlP3QuY2FsbCh0aGlzLG4pOnQpfSl9LHVud3JhcDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5wYXJlbnQodCkubm90KCJib2R5IikuZWFjaChmdW5jdGlvbigpe1ModGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLHRoaXN9fSksUy5leHByLnBzZXVkb3MuaGlkZGVuPWZ1bmN0aW9uKHQpe3JldHVybiFTLmV4cHIucHNldWRvcy52aXNpYmxlKHQpfSxTLmV4cHIucHNldWRvcy52aXNpYmxlPWZ1bmN0aW9uKHQpe3JldHVybiEhKHQub2Zmc2V0V2lkdGh8fHQub2Zmc2V0SGVpZ2h0fHx0LmdldENsaWVudFJlY3RzKCkubGVuZ3RoKX0sUy5hamF4U2V0dGluZ3MueGhyPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBuZXcgbi5YTUxIdHRwUmVxdWVzdH1jYXRjaCh0KXt9fTt2YXIgVmU9ezA6MjAwLDEyMjM6MjA0fSxHZT1TLmFqYXhTZXR0aW5ncy54aHIoKTt5LmNvcnM9ISFHZSYmIndpdGhDcmVkZW50aWFscyJpbiBHZSx5LmFqYXg9R2U9ISFHZSxTLmFqYXhUcmFuc3BvcnQoZnVuY3Rpb24odCl7dmFyIGUscjtpZih5LmNvcnN8fEdlJiYhdC5jcm9zc0RvbWFpbilyZXR1cm57c2VuZDpmdW5jdGlvbihvLGkpe3ZhciBhLHM9dC54aHIoKTtpZihzLm9wZW4odC50eXBlLHQudXJsLHQuYXN5bmMsdC51c2VybmFtZSx0LnBhc3N3b3JkKSx0LnhockZpZWxkcylmb3IoYSBpbiB0LnhockZpZWxkcylzW2FdPXQueGhyRmllbGRzW2FdO2ZvcihhIGluIHQubWltZVR5cGUmJnMub3ZlcnJpZGVNaW1lVHlwZSYmcy5vdmVycmlkZU1pbWVUeXBlKHQubWltZVR5cGUpLHQuY3Jvc3NEb21haW58fG9bIlgtUmVxdWVzdGVkLVdpdGgiXXx8KG9bIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKSxvKXMuc2V0UmVxdWVzdEhlYWRlcihhLG9bYV0pO2U9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7ZSYmKGU9cj1zLm9ubG9hZD1zLm9uZXJyb3I9cy5vbmFib3J0PXMub250aW1lb3V0PXMub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsImFib3J0Ij09PXQ/cy5hYm9ydCgpOiJlcnJvciI9PT10PyJudW1iZXIiIT10eXBlb2Ygcy5zdGF0dXM/aSgwLCJlcnJvciIpOmkocy5zdGF0dXMscy5zdGF0dXNUZXh0KTppKFZlW3Muc3RhdHVzXXx8cy5zdGF0dXMscy5zdGF0dXNUZXh0LCJ0ZXh0IiE9PShzLnJlc3BvbnNlVHlwZXx8InRleHQiKXx8InN0cmluZyIhPXR5cGVvZiBzLnJlc3BvbnNlVGV4dD97YmluYXJ5OnMucmVzcG9uc2V9Ont0ZXh0OnMucmVzcG9uc2VUZXh0fSxzLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSl9fSxzLm9ubG9hZD1lKCkscj1zLm9uZXJyb3I9cy5vbnRpbWVvdXQ9ZSgiZXJyb3IiKSx2b2lkIDAhPT1zLm9uYWJvcnQ/cy5vbmFib3J0PXI6cy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXs0PT09cy5yZWFkeVN0YXRlJiZuLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtlJiZyKCl9KX0sZT1lKCJhYm9ydCIpO3RyeXtzLnNlbmQodC5oYXNDb250ZW50JiZ0LmRhdGF8fG51bGwpfWNhdGNoKHQpe2lmKGUpdGhyb3cgdH19LGFib3J0OmZ1bmN0aW9uKCl7ZSYmZSgpfX19KSxTLmFqYXhQcmVmaWx0ZXIoZnVuY3Rpb24odCl7dC5jcm9zc0RvbWFpbiYmKHQuY29udGVudHMuc2NyaXB0PSExKX0pLFMuYWpheFNldHVwKHthY2NlcHRzOntzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0In0sY29udGVudHM6e3NjcmlwdDovXGIoPzpqYXZhfGVjbWEpc2NyaXB0XGIvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKHQpe3JldHVybiBTLmdsb2JhbEV2YWwodCksdH19fSksUy5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKHQpe3ZvaWQgMD09PXQuY2FjaGUmJih0LmNhY2hlPSExKSx0LmNyb3NzRG9tYWluJiYodC50eXBlPSJHRVQiKX0pLFMuYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbih0KXt2YXIgZSxuO2lmKHQuY3Jvc3NEb21haW58fHQuc2NyaXB0QXR0cnMpcmV0dXJue3NlbmQ6ZnVuY3Rpb24ocixvKXtlPVMoIjxzY3JpcHQ+IikuYXR0cih0LnNjcmlwdEF0dHJzfHx7fSkucHJvcCh7Y2hhcnNldDp0LnNjcmlwdENoYXJzZXQsc3JjOnQudXJsfSkub24oImxvYWQgZXJyb3IiLG49ZnVuY3Rpb24odCl7ZS5yZW1vdmUoKSxuPW51bGwsdCYmbygiZXJyb3IiPT09dC50eXBlPzQwNDoyMDAsdC50eXBlKX0pLGEuaGVhZC5hcHBlbmRDaGlsZChlWzBdKX0sYWJvcnQ6ZnVuY3Rpb24oKXtuJiZuKCl9fX0pO3ZhciBLZSxYZT1bXSxKZT0vKD0pXD8oPz0mfCQpfFw/XD8vO1MuYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXt2YXIgdD1YZS5wb3AoKXx8Uy5leHBhbmRvKyJfIitPZSsrO3JldHVybiB0aGlzW3RdPSEwLHR9fSksUy5hamF4UHJlZmlsdGVyKCJqc29uIGpzb25wIixmdW5jdGlvbih0LGUscil7dmFyIG8saSxhLHM9ITEhPT10Lmpzb25wJiYoSmUudGVzdCh0LnVybCk/InVybCI6InN0cmluZyI9PXR5cGVvZiB0LmRhdGEmJjA9PT0odC5jb250ZW50VHlwZXx8IiIpLmluZGV4T2YoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpJiZKZS50ZXN0KHQuZGF0YSkmJiJkYXRhIik7aWYoc3x8Impzb25wIj09PXQuZGF0YVR5cGVzWzBdKXJldHVybiBvPXQuanNvbnBDYWxsYmFjaz1tKHQuanNvbnBDYWxsYmFjayk/dC5qc29ucENhbGxiYWNrKCk6dC5qc29ucENhbGxiYWNrLHM/dFtzXT10W3NdLnJlcGxhY2UoSmUsIiQxIitvKTohMSE9PXQuanNvbnAmJih0LnVybCs9KEFlLnRlc3QodC51cmwpPyImIjoiPyIpK3QuanNvbnArIj0iK28pLHQuY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe3JldHVybiBhfHxTLmVycm9yKG8rIiB3YXMgbm90IGNhbGxlZCIpLGFbMF19LHQuZGF0YVR5cGVzWzBdPSJqc29uIixpPW5bb10sbltvXT1mdW5jdGlvbigpe2E9YXJndW1lbnRzfSxyLmFsd2F5cyhmdW5jdGlvbigpe3ZvaWQgMD09PWk/UyhuKS5yZW1vdmVQcm9wKG8pOm5bb109aSx0W29dJiYodC5qc29ucENhbGxiYWNrPWUuanNvbnBDYWxsYmFjayxYZS5wdXNoKG8pKSxhJiZtKGkpJiZpKGFbMF0pLGE9aT12b2lkIDB9KSwic2NyaXB0In0pLHkuY3JlYXRlSFRNTERvY3VtZW50PSgoS2U9YS5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpLmJvZHkpLmlubmVySFRNTD0iPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT4iLDI9PT1LZS5jaGlsZE5vZGVzLmxlbmd0aCksUy5wYXJzZUhUTUw9ZnVuY3Rpb24odCxlLG4pe3JldHVybiJzdHJpbmciIT10eXBlb2YgdD9bXTooImJvb2xlYW4iPT10eXBlb2YgZSYmKG49ZSxlPSExKSxlfHwoeS5jcmVhdGVIVE1MRG9jdW1lbnQ/KChyPShlPWEuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCIiKSkuY3JlYXRlRWxlbWVudCgiYmFzZSIpKS5ocmVmPWEubG9jYXRpb24uaHJlZixlLmhlYWQuYXBwZW5kQ2hpbGQocikpOmU9YSksaT0hbiYmW10sKG89Ui5leGVjKHQpKT9bZS5jcmVhdGVFbGVtZW50KG9bMV0pXToobz1FdChbdF0sZSxpKSxpJiZpLmxlbmd0aCYmUyhpKS5yZW1vdmUoKSxTLm1lcmdlKFtdLG8uY2hpbGROb2RlcykpKTt2YXIgcixvLGl9LFMuZm4ubG9hZD1mdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGE9dGhpcyxzPXQuaW5kZXhPZigiICIpO3JldHVybiBzPi0xJiYocj14ZSh0LnNsaWNlKHMpKSx0PXQuc2xpY2UoMCxzKSksbShlKT8obj1lLGU9dm9pZCAwKTplJiYib2JqZWN0Ij09dHlwZW9mIGUmJihvPSJQT1NUIiksYS5sZW5ndGg+MCYmUy5hamF4KHt1cmw6dCx0eXBlOm98fCJHRVQiLGRhdGFUeXBlOiJodG1sIixkYXRhOmV9KS5kb25lKGZ1bmN0aW9uKHQpe2k9YXJndW1lbnRzLGEuaHRtbChyP1MoIjxkaXY+IikuYXBwZW5kKFMucGFyc2VIVE1MKHQpKS5maW5kKHIpOnQpfSkuYWx3YXlzKG4mJmZ1bmN0aW9uKHQsZSl7YS5lYWNoKGZ1bmN0aW9uKCl7bi5hcHBseSh0aGlzLGl8fFt0LnJlc3BvbnNlVGV4dCxlLHRdKX0pfSksdGhpc30sUy5lYWNoKFsiYWpheFN0YXJ0IiwiYWpheFN0b3AiLCJhamF4Q29tcGxldGUiLCJhamF4RXJyb3IiLCJhamF4U3VjY2VzcyIsImFqYXhTZW5kIl0sZnVuY3Rpb24odCxlKXtTLmZuW2VdPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9uKGUsdCl9fSksUy5leHByLnBzZXVkb3MuYW5pbWF0ZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIFMuZ3JlcChTLnRpbWVycyxmdW5jdGlvbihlKXtyZXR1cm4gdD09PWUuZWxlbX0pLmxlbmd0aH0sUy5vZmZzZXQ9e3NldE9mZnNldDpmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGEscyx1LGM9Uy5jc3ModCwicG9zaXRpb24iKSxsPVModCksZj17fTsic3RhdGljIj09PWMmJih0LnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpLHM9bC5vZmZzZXQoKSxpPVMuY3NzKHQsInRvcCIpLHU9Uy5jc3ModCwibGVmdCIpLCgiYWJzb2x1dGUiPT09Y3x8ImZpeGVkIj09PWMpJiYoaSt1KS5pbmRleE9mKCJhdXRvIik+LTE/KGE9KHI9bC5wb3NpdGlvbigpKS50b3Asbz1yLmxlZnQpOihhPXBhcnNlRmxvYXQoaSl8fDAsbz1wYXJzZUZsb2F0KHUpfHwwKSxtKGUpJiYoZT1lLmNhbGwodCxuLFMuZXh0ZW5kKHt9LHMpKSksbnVsbCE9ZS50b3AmJihmLnRvcD1lLnRvcC1zLnRvcCthKSxudWxsIT1lLmxlZnQmJihmLmxlZnQ9ZS5sZWZ0LXMubGVmdCtvKSwidXNpbmciaW4gZT9lLnVzaW5nLmNhbGwodCxmKTpsLmNzcyhmKX19LFMuZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24odCl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09dD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbihlKXtTLm9mZnNldC5zZXRPZmZzZXQodGhpcyx0LGUpfSk7dmFyIGUsbixyPXRoaXNbMF07cmV0dXJuIHI/ci5nZXRDbGllbnRSZWN0cygpLmxlbmd0aD8oZT1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49ci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LHt0b3A6ZS50b3Arbi5wYWdlWU9mZnNldCxsZWZ0OmUubGVmdCtuLnBhZ2VYT2Zmc2V0fSk6e3RvcDowLGxlZnQ6MH06dm9pZCAwfSxwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciB0LGUsbixyPXRoaXNbMF0sbz17dG9wOjAsbGVmdDowfTtpZigiZml4ZWQiPT09Uy5jc3MociwicG9zaXRpb24iKSllPXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7ZWxzZXtmb3IoZT10aGlzLm9mZnNldCgpLG49ci5vd25lckRvY3VtZW50LHQ9ci5vZmZzZXRQYXJlbnR8fG4uZG9jdW1lbnRFbGVtZW50O3QmJih0PT09bi5ib2R5fHx0PT09bi5kb2N1bWVudEVsZW1lbnQpJiYic3RhdGljIj09PVMuY3NzKHQsInBvc2l0aW9uIik7KXQ9dC5wYXJlbnROb2RlO3QmJnQhPT1yJiYxPT09dC5ub2RlVHlwZSYmKChvPVModCkub2Zmc2V0KCkpLnRvcCs9Uy5jc3ModCwiYm9yZGVyVG9wV2lkdGgiLCEwKSxvLmxlZnQrPVMuY3NzKHQsImJvcmRlckxlZnRXaWR0aCIsITApKX1yZXR1cm57dG9wOmUudG9wLW8udG9wLVMuY3NzKHIsIm1hcmdpblRvcCIsITApLGxlZnQ6ZS5sZWZ0LW8ubGVmdC1TLmNzcyhyLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMub2Zmc2V0UGFyZW50O3QmJiJzdGF0aWMiPT09Uy5jc3ModCwicG9zaXRpb24iKTspdD10Lm9mZnNldFBhcmVudDtyZXR1cm4gdHx8YXR9KX19KSxTLmVhY2goe3Njcm9sbExlZnQ6InBhZ2VYT2Zmc2V0IixzY3JvbGxUb3A6InBhZ2VZT2Zmc2V0In0sZnVuY3Rpb24odCxlKXt2YXIgbj0icGFnZVlPZmZzZXQiPT09ZTtTLmZuW3RdPWZ1bmN0aW9uKHIpe3JldHVybiAkKHRoaXMsZnVuY3Rpb24odCxyLG8pe3ZhciBpO2lmKGIodCk/aT10Ojk9PT10Lm5vZGVUeXBlJiYoaT10LmRlZmF1bHRWaWV3KSx2b2lkIDA9PT1vKXJldHVybiBpP2lbZV06dFtyXTtpP2kuc2Nyb2xsVG8obj9pLnBhZ2VYT2Zmc2V0Om8sbj9vOmkucGFnZVlPZmZzZXQpOnRbcl09b30sdCxyLGFyZ3VtZW50cy5sZW5ndGgpfX0pLFMuZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbih0LGUpe1MuY3NzSG9va3NbZV09R3QoeS5waXhlbFBvc2l0aW9uLGZ1bmN0aW9uKHQsbil7aWYobilyZXR1cm4gbj1WdCh0LGUpLFd0LnRlc3Qobik/Uyh0KS5wb3NpdGlvbigpW2VdKyJweCI6bn0pfSksUy5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24odCxlKXtTLmVhY2goe3BhZGRpbmc6ImlubmVyIit0LGNvbnRlbnQ6ZSwiIjoib3V0ZXIiK3R9LGZ1bmN0aW9uKG4scil7Uy5mbltyXT1mdW5jdGlvbihvLGkpe3ZhciBhPWFyZ3VtZW50cy5sZW5ndGgmJihufHwiYm9vbGVhbiIhPXR5cGVvZiBvKSxzPW58fCghMD09PW98fCEwPT09aT8ibWFyZ2luIjoiYm9yZGVyIik7cmV0dXJuICQodGhpcyxmdW5jdGlvbihlLG4sbyl7dmFyIGk7cmV0dXJuIGIoZSk/MD09PXIuaW5kZXhPZigib3V0ZXIiKT9lWyJpbm5lciIrdF06ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrdF06OT09PWUubm9kZVR5cGU/KGk9ZS5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgoZS5ib2R5WyJzY3JvbGwiK3RdLGlbInNjcm9sbCIrdF0sZS5ib2R5WyJvZmZzZXQiK3RdLGlbIm9mZnNldCIrdF0saVsiY2xpZW50Iit0XSkpOnZvaWQgMD09PW8/Uy5jc3MoZSxuLHMpOlMuc3R5bGUoZSxuLG8scyl9LGUsYT9vOnZvaWQgMCxhKX19KX0pLFMuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbih0LGUpe1MuZm5bZV09ZnVuY3Rpb24odCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24oZSxudWxsLHQsbik6dGhpcy50cmlnZ2VyKGUpfX0pLFMuZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIodCkubW91c2VsZWF2ZShlfHx0KX19KSxTLmZuLmV4dGVuZCh7YmluZDpmdW5jdGlvbih0LGUsbil7cmV0dXJuIHRoaXMub24odCxudWxsLGUsbil9LHVuYmluZDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLm9mZih0LG51bGwsZSl9LGRlbGVnYXRlOmZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiB0aGlzLm9uKGUsdCxuLHIpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYodCwiKioiKTp0aGlzLm9mZihlLHR8fCIqKiIsbil9fSksUy5wcm94eT1mdW5jdGlvbih0LGUpe3ZhciBuLHIsbztpZigic3RyaW5nIj09dHlwZW9mIGUmJihuPXRbZV0sZT10LHQ9biksbSh0KSlyZXR1cm4gcj11LmNhbGwoYXJndW1lbnRzLDIpLChvPWZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkoZXx8dGhpcyxyLmNvbmNhdCh1LmNhbGwoYXJndW1lbnRzKSkpfSkuZ3VpZD10Lmd1aWQ9dC5ndWlkfHxTLmd1aWQrKyxvfSxTLmhvbGRSZWFkeT1mdW5jdGlvbih0KXt0P1MucmVhZHlXYWl0Kys6Uy5yZWFkeSghMCl9LFMuaXNBcnJheT1BcnJheS5pc0FycmF5LFMucGFyc2VKU09OPUpTT04ucGFyc2UsUy5ub2RlTmFtZT1MLFMuaXNGdW5jdGlvbj1tLFMuaXNXaW5kb3c9YixTLmNhbWVsQ2FzZT1LLFMudHlwZT1rLFMubm93PURhdGUubm93LFMuaXNOdW1lcmljPWZ1bmN0aW9uKHQpe3ZhciBlPVMudHlwZSh0KTtyZXR1cm4oIm51bWJlciI9PT1lfHwic3RyaW5nIj09PWUpJiYhaXNOYU4odC1wYXJzZUZsb2F0KHQpKX0sdm9pZCAwPT09KHI9ZnVuY3Rpb24oKXtyZXR1cm4gU30uYXBwbHkoZSxbXSkpfHwodC5leHBvcnRzPXIpO3ZhciBRZT1uLmpRdWVyeSxaZT1uLiQ7cmV0dXJuIFMubm9Db25mbGljdD1mdW5jdGlvbih0KXtyZXR1cm4gbi4kPT09UyYmKG4uJD1aZSksdCYmbi5qUXVlcnk9PT1TJiYobi5qUXVlcnk9UWUpLFN9LG98fChuLmpRdWVyeT1uLiQ9UyksU30pfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjQ1KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0Nil9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNDgpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNTIpO2Z1bmN0aW9uIG8odCxlLG4sbyxpLGEscyl7dHJ5e3ZhciB1PXRbYV0ocyksYz11LnZhbHVlfWNhdGNoKHQpe3JldHVybiB2b2lkIG4odCl9dS5kb25lP2UoYyk6ci5yZXNvbHZlKGMpLnRoZW4obyxpKX10LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPWFyZ3VtZW50cztyZXR1cm4gbmV3IHIoZnVuY3Rpb24ocixpKXt2YXIgYT10LmFwcGx5KGUsbik7ZnVuY3Rpb24gcyh0KXtvKGEscixpLHMsdSwibmV4dCIsdCl9ZnVuY3Rpb24gdSh0KXtvKGEscixpLHMsdSwidGhyb3ciLHQpfXModm9pZCAwKX0pfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI2NCkuZGVmYXVsdDt0LmV4cG9ydHM9cix0LmV4cG9ydHMuZGVmYXVsdD1yfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjk4KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKHQpe3JldHVybiB0LnJlcGxhY2UoL1tcLVxbXF1cL1x7XH1cKFwpXCpcK1w/XC5cXFxeXCRcfF0vZywiXFwkJiIpfXIucHJvdG89ZnVuY3Rpb24oKXtyZXR1cm4gUmVnRXhwLmVzY2FwZT1yLHJ9LHQuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTM3KX0sZnVuY3Rpb24odCxlLG4pe24oMTM4KTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLlJlZmxlY3QuY29uc3RydWN0fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKSxvPW4oMzMpLGk9bigyMiksYT1uKDExKSxzPW4oNyksdT1uKDQ3KSxjPW4oOTEpLGw9big2KSxmPW8oIlJlZmxlY3QiLCJjb25zdHJ1Y3QiKSxwPWwoZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiEoZihmdW5jdGlvbigpe30sW10sdClpbnN0YW5jZW9mIHQpfSksaD0hbChmdW5jdGlvbigpe2YoZnVuY3Rpb24oKXt9KX0pLGQ9cHx8aDtyKHt0YXJnZXQ6IlJlZmxlY3QiLHN0YXQ6ITAsZm9yY2VkOmQsc2hhbTpkfSx7Y29uc3RydWN0OmZ1bmN0aW9uKHQsZSl7aSh0KSxhKGUpO3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg8Mz90OmkoYXJndW1lbnRzWzJdKTtpZihoJiYhcClyZXR1cm4gZih0LGUsbik7aWYodD09bil7c3dpdGNoKGUubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIG5ldyB0O2Nhc2UgMTpyZXR1cm4gbmV3IHQoZVswXSk7Y2FzZSAyOnJldHVybiBuZXcgdChlWzBdLGVbMV0pO2Nhc2UgMzpyZXR1cm4gbmV3IHQoZVswXSxlWzFdLGVbMl0pO2Nhc2UgNDpyZXR1cm4gbmV3IHQoZVswXSxlWzFdLGVbMl0sZVszXSl9dmFyIHI9W251bGxdO3JldHVybiByLnB1c2guYXBwbHkocixlKSxuZXcoYy5hcHBseSh0LHIpKX12YXIgbz1uLnByb3RvdHlwZSxsPXUocyhvKT9vOk9iamVjdC5wcm90b3R5cGUpLGQ9RnVuY3Rpb24uYXBwbHkuY2FsbCh0LGwsZSk7cmV0dXJuIHMoZCk/ZDpsfX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMyksbz1uKDIzKSxpPW4oMTEpLGE9big1NSk7dC5leHBvcnRzPXI/T2JqZWN0LmRlZmluZVByb3BlcnRpZXM6ZnVuY3Rpb24odCxlKXtpKHQpO2Zvcih2YXIgbixyPWEoZSkscz1yLmxlbmd0aCx1PTA7cz51OylvLmYodCxuPXJbdSsrXSxlW25dKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpLG89bigxNyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dHJ5e28ocix0LGUpfWNhdGNoKG4pe3JbdF09ZX1yZXR1cm4gZX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNDIpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxKSxvPXIuSlNPTnx8KHIuSlNPTj17c3RyaW5naWZ5OkpTT04uc3RyaW5naWZ5fSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBvLnN0cmluZ2lmeS5hcHBseShvLGFyZ3VtZW50cyl9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTQ0KX0sZnVuY3Rpb24odCxlLG4pe24oMTQ1KTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLk9iamVjdC5hc3NpZ259LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89bigxNDYpO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpPYmplY3QuYXNzaWduIT09b30se2Fzc2lnbjpvfSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxMyksbz1uKDYpLGk9big1NSksYT1uKDkyKSxzPW4oNjQpLHU9bigyNCksYz1uKDY1KSxsPU9iamVjdC5hc3NpZ247dC5leHBvcnRzPSFsfHxvKGZ1bmN0aW9uKCl7dmFyIHQ9e30sZT17fSxuPVN5bWJvbCgpO3JldHVybiB0W25dPTcsImFiY2RlZmdoaWprbG1ub3BxcnN0Ii5zcGxpdCgiIikuZm9yRWFjaChmdW5jdGlvbih0KXtlW3RdPXR9KSw3IT1sKHt9LHQpW25dfHwiYWJjZGVmZ2hpamtsbW5vcHFyc3QiIT1pKGwoe30sZSkpLmpvaW4oIiIpfSk/ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dSh0KSxvPWFyZ3VtZW50cy5sZW5ndGgsbD0xLGY9YS5mLHA9cy5mO28+bDspZm9yKHZhciBoLGQ9Yyhhcmd1bWVudHNbbCsrXSksZz1mP2koZCkuY29uY2F0KGYoZCkpOmkoZCksdj1nLmxlbmd0aCx5PTA7dj55OyloPWdbeSsrXSxyJiYhcC5jYWxsKGQsaCl8fChuW2hdPWRbaF0pO3JldHVybiBufTpsfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTQ4KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTQ5KSxvPUFycmF5LnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5jb25jYXQ7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1vLmNvbmNhdD9yOmV9fSxmdW5jdGlvbih0LGUsbil7big5Myk7dmFyIHI9bigxOCk7dC5leHBvcnRzPXIoIkFycmF5IikuY29uY2F0fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTUxKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTUyKSxvPUFycmF5LnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5tYXA7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1vLm1hcD9yOmV9fSxmdW5jdGlvbih0LGUsbil7bigxNTMpO3ZhciByPW4oMTgpO3QuZXhwb3J0cz1yKCJBcnJheSIpLm1hcH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89big3MykubWFwO3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDohbig3MikoIm1hcCIpfSx7bWFwOmZ1bmN0aW9uKHQpe3JldHVybiBvKHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNTUpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTU2KX0sZnVuY3Rpb24odCxlLG4pe24oMTU3KTt2YXIgcj1uKDEpLk9iamVjdCxvPXQuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHIuZGVmaW5lUHJvcGVydHkodCxlLG4pfTtyLmRlZmluZVByb3BlcnR5LnNoYW0mJihvLnNoYW09ITApfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKSxvPW4oMTMpO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDohbyxzaGFtOiFvfSx7ZGVmaW5lUHJvcGVydHk6bigyMykuZn0pfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTU5KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE2MCl9LGZ1bmN0aW9uKHQsZSxuKXtuKDE2MSk7dmFyIHI9bigxKS5PYmplY3Qsbz10LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxlKX07ci5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iuc2hhbSYmKG8uc2hhbT0hMCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89big2KSxpPW4oMjEpLGE9big0NSkuZixzPW4oMTMpLHU9byhmdW5jdGlvbigpe2EoMSl9KTtyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXN8fHUsc2hhbTohc30se2dldE93blByb3BlcnR5RGVzY3JpcHRvcjpmdW5jdGlvbih0LGUpe3JldHVybiBhKGkodCksZSl9fSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNjMpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTY0KX0sZnVuY3Rpb24odCxlLG4pe24oMTY1KTt2YXIgcj1uKDEpO3QuZXhwb3J0cz1yLlJlZmxlY3QuZ2V0fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigwKSxvPW4oNyksaT1uKDExKSxhPW4oMTQpLHM9big0NSksdT1uKDQ5KTtyKHt0YXJnZXQ6IlJlZmxlY3QiLHN0YXQ6ITB9LHtnZXQ6ZnVuY3Rpb24gdChlLG4pe3ZhciByLGMsbD1hcmd1bWVudHMubGVuZ3RoPDM/ZTphcmd1bWVudHNbMl07cmV0dXJuIGkoZSk9PT1sP2Vbbl06KHI9cy5mKGUsbikpP2EociwidmFsdWUiKT9yLnZhbHVlOnZvaWQgMD09PXIuZ2V0P3ZvaWQgMDpyLmdldC5jYWxsKGwpOm8oYz11KGUpKT90KGMsbixsKTp2b2lkIDB9fSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtmb3IoOyFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKSYmbnVsbCE9PSh0PXIodCkpOyk7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTY4KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE2OSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDE3MCk7dmFyIHI9bigxKTt0LmV4cG9ydHM9ci5PYmplY3QuZ2V0UHJvdG90eXBlT2Z9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89big2KSxpPW4oMjQpLGE9big0OSkscz1uKDk2KTtyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6byhmdW5jdGlvbigpe2EoMSl9KSxzaGFtOiFzfSx7Z2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24odCl7cmV0dXJuIGEoaSh0KSl9fSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNzIpfSxmdW5jdGlvbih0LGUsbil7bigxNzMpO3ZhciByPW4oMSk7dC5leHBvcnRzPXIuT2JqZWN0LnNldFByb3RvdHlwZU9mfSxmdW5jdGlvbih0LGUsbil7bigwKSh7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITB9LHtzZXRQcm90b3R5cGVPZjpuKDc0KX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoIXIodCkmJm51bGwhPT10KXRocm93IFR5cGVFcnJvcigiQ2FuJ3Qgc2V0ICIrU3RyaW5nKHQpKyIgYXMgYSBwcm90b3R5cGUiKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxNzYpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTc3KX0sZnVuY3Rpb24odCxlLG4pe24oMTc4KTt2YXIgcj1uKDEpLk9iamVjdDt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gci5jcmVhdGUodCxlKX19LGZ1bmN0aW9uKHQsZSxuKXtuKDApKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxzaGFtOiFuKDEzKX0se2NyZWF0ZTpuKDQ3KX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big5Nyk7ZnVuY3Rpb24gbyhlLG4pe3JldHVybiB0LmV4cG9ydHM9bz1yfHxmdW5jdGlvbih0LGUpe3JldHVybiB0Ll9fcHJvdG9fXz1lLHR9LG8oZSxuKX10LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTgxKSxvPW4oMTAzKTtmdW5jdGlvbiBpKGUpe3JldHVybiB0LmV4cG9ydHM9aT0iZnVuY3Rpb24iPT10eXBlb2YgbyYmInN5bWJvbCI9PXR5cGVvZiByP2Z1bmN0aW9uKHQpe3JldHVybiB0eXBlb2YgdH06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBvJiZ0LmNvbnN0cnVjdG9yPT09byYmdCE9PW8ucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiB0fSxpKGUpfXQuZXhwb3J0cz1pfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTgyKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDE4Myl9LGZ1bmN0aW9uKHQsZSxuKXtuKDk4KSxuKDM1KSxuKDUxKTt2YXIgcj1uKDc1KTt0LmV4cG9ydHM9ci5mKCJpdGVyYXRvciIpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2OCksbz1uKDQ2KSxpPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3ZhciBpLGEscz1TdHJpbmcobyhlKSksdT1yKG4pLGM9cy5sZW5ndGg7cmV0dXJuIHU8MHx8dT49Yz90PyIiOnZvaWQgMDooaT1zLmNoYXJDb2RlQXQodSkpPDU1Mjk2fHxpPjU2MzE5fHx1KzE9PT1jfHwoYT1zLmNoYXJDb2RlQXQodSsxKSk8NTYzMjB8fGE+NTczNDM/dD9zLmNoYXJBdCh1KTppOnQ/cy5zbGljZSh1LHUrMik6YS01NjMyMCsoaS01NTI5Njw8MTApKzY1NTM2fX07dC5leHBvcnRzPXtjb2RlQXQ6aSghMSksY2hhckF0OmkoITApfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNSksbz1uKDE4NiksaT1yLldlYWtNYXA7dC5leHBvcnRzPSJmdW5jdGlvbiI9PXR5cGVvZiBpJiYvbmF0aXZlIGNvZGUvLnRlc3Qoby5jYWxsKGkpKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNTgpO3QuZXhwb3J0cz1yKCJuYXRpdmUtZnVuY3Rpb24tdG8tc3RyaW5nIixGdW5jdGlvbi50b1N0cmluZyl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big3Niksbz17fTtvW24oMikoInRvU3RyaW5nVGFnIildPSJ6Iix0LmV4cG9ydHM9IltvYmplY3Qgel0iIT09U3RyaW5nKG8pP2Z1bmN0aW9uKCl7cmV0dXJuIltvYmplY3QgIityKHRoaXMpKyJdIn06by50b1N0cmluZ30sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9e0NTU1J1bGVMaXN0OjAsQ1NTU3R5bGVEZWNsYXJhdGlvbjowLENTU1ZhbHVlTGlzdDowLENsaWVudFJlY3RMaXN0OjAsRE9NUmVjdExpc3Q6MCxET01TdHJpbmdMaXN0OjAsRE9NVG9rZW5MaXN0OjEsRGF0YVRyYW5zZmVySXRlbUxpc3Q6MCxGaWxlTGlzdDowLEhUTUxBbGxDb2xsZWN0aW9uOjAsSFRNTENvbGxlY3Rpb246MCxIVE1MRm9ybUVsZW1lbnQ6MCxIVE1MU2VsZWN0RWxlbWVudDowLE1lZGlhTGlzdDowLE1pbWVUeXBlQXJyYXk6MCxOYW1lZE5vZGVNYXA6MCxOb2RlTGlzdDoxLFBhaW50UmVxdWVzdExpc3Q6MCxQbHVnaW46MCxQbHVnaW5BcnJheTowLFNWR0xlbmd0aExpc3Q6MCxTVkdOdW1iZXJMaXN0OjAsU1ZHUGF0aFNlZ0xpc3Q6MCxTVkdQb2ludExpc3Q6MCxTVkdTdHJpbmdMaXN0OjAsU1ZHVHJhbnNmb3JtTGlzdDowLFNvdXJjZUJ1ZmZlckxpc3Q6MCxTdHlsZVNoZWV0TGlzdDowLFRleHRUcmFja0N1ZUxpc3Q6MCxUZXh0VHJhY2tMaXN0OjAsVG91Y2hMaXN0OjB9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTA0KSxuKDIwNyksbigyMDgpLG4oMjA5KSxuKDIxMCksbigyMTEpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDUpLGk9bigyOCksYT1uKDEzKSxzPW4oOTUpLHU9big2KSxjPW4oMTQpLGw9big0OCksZj1uKDcpLHA9bigxMSksaD1uKDI0KSxkPW4oMjEpLGc9big1NCksdj1uKDMxKSx5PW4oNDcpLG09big1NSksYj1uKDEwNikseD1uKDE5MSksdz1uKDkyKSxrPW4oNDUpLFM9bigyMyksRT1uKDY0KSxqPW4oMTcpLFQ9bigzNiksTz1uKDU4KSxBPW4oNTcpLEM9big1NiksTD1uKDcwKSxSPW4oMiksUD1uKDc1KSxOPW4oNCksST1uKDI5KSxfPW4oNTApLEQ9big3MykuZm9yRWFjaCxNPUEoImhpZGRlbiIpLFU9UigidG9QcmltaXRpdmUiKSxCPV8uc2V0LHE9Xy5nZXR0ZXJGb3IoIlN5bWJvbCIpLEY9T2JqZWN0LnByb3RvdHlwZSxIPW8uU3ltYm9sLHo9by5KU09OLFc9eiYmei5zdHJpbmdpZnksJD1rLmYsWT1TLmYsVj14LmYsRz1FLmYsSz1PKCJzeW1ib2xzIiksWD1PKCJvcC1zeW1ib2xzIiksSj1PKCJzdHJpbmctdG8tc3ltYm9sLXJlZ2lzdHJ5IiksUT1PKCJzeW1ib2wtdG8tc3RyaW5nLXJlZ2lzdHJ5IiksWj1PKCJ3a3MiKSx0dD1vLlFPYmplY3QsZXQ9IXR0fHwhdHQucHJvdG90eXBlfHwhdHQucHJvdG90eXBlLmZpbmRDaGlsZCxudD1hJiZ1KGZ1bmN0aW9uKCl7cmV0dXJuIDchPXkoWSh7fSwiYSIse2dldDpmdW5jdGlvbigpe3JldHVybiBZKHRoaXMsImEiLHt2YWx1ZTo3fSkuYX19KSkuYX0pP2Z1bmN0aW9uKHQsZSxuKXt2YXIgcj0kKEYsZSk7ciYmZGVsZXRlIEZbZV0sWSh0LGUsbiksciYmdCE9PUYmJlkoRixlLHIpfTpZLHJ0PWZ1bmN0aW9uKHQsZSl7dmFyIG49S1t0XT15KEgucHJvdG90eXBlKTtyZXR1cm4gQihuLHt0eXBlOiJTeW1ib2wiLHRhZzp0LGRlc2NyaXB0aW9uOmV9KSxhfHwobi5kZXNjcmlwdGlvbj1lKSxufSxvdD1zJiYic3ltYm9sIj09dHlwZW9mIEguaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KHQpaW5zdGFuY2VvZiBIfSxpdD1mdW5jdGlvbih0LGUsbil7dD09PUYmJml0KFgsZSxuKSxwKHQpO3ZhciByPWcoZSwhMCk7cmV0dXJuIHAobiksYyhLLHIpPyhuLmVudW1lcmFibGU/KGModCxNKSYmdFtNXVtyXSYmKHRbTV1bcl09ITEpLG49eShuLHtlbnVtZXJhYmxlOnYoMCwhMSl9KSk6KGModCxNKXx8WSh0LE0sdigxLHt9KSksdFtNXVtyXT0hMCksbnQodCxyLG4pKTpZKHQscixuKX0sYXQ9ZnVuY3Rpb24odCxlKXtwKHQpO3ZhciBuPWQoZSkscj1tKG4pLmNvbmNhdChsdChuKSk7cmV0dXJuIEQocixmdW5jdGlvbihlKXthJiYhc3QuY2FsbChuLGUpfHxpdCh0LGUsbltlXSl9KSx0fSxzdD1mdW5jdGlvbih0KXt2YXIgZT1nKHQsITApLG49Ry5jYWxsKHRoaXMsZSk7cmV0dXJuISh0aGlzPT09RiYmYyhLLGUpJiYhYyhYLGUpKSYmKCEobnx8IWModGhpcyxlKXx8IWMoSyxlKXx8Yyh0aGlzLE0pJiZ0aGlzW01dW2VdKXx8bil9LHV0PWZ1bmN0aW9uKHQsZSl7dmFyIG49ZCh0KSxyPWcoZSwhMCk7aWYobiE9PUZ8fCFjKEsscil8fGMoWCxyKSl7dmFyIG89JChuLHIpO3JldHVybiFvfHwhYyhLLHIpfHxjKG4sTSkmJm5bTV1bcl18fChvLmVudW1lcmFibGU9ITApLG99fSxjdD1mdW5jdGlvbih0KXt2YXIgZT1WKGQodCkpLG49W107cmV0dXJuIEQoZSxmdW5jdGlvbih0KXtjKEssdCl8fGMoQyx0KXx8bi5wdXNoKHQpfSksbn0sbHQ9ZnVuY3Rpb24odCl7dmFyIGU9dD09PUYsbj1WKGU/WDpkKHQpKSxyPVtdO3JldHVybiBEKG4sZnVuY3Rpb24odCl7IWMoSyx0KXx8ZSYmIWMoRix0KXx8ci5wdXNoKEtbdF0pfSkscn07c3x8KFQoKEg9ZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2YgSCl0aHJvdyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3ZhciB0PWFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9TdHJpbmcoYXJndW1lbnRzWzBdKTp2b2lkIDAsZT1MKHQpLG49ZnVuY3Rpb24odCl7dGhpcz09PUYmJm4uY2FsbChYLHQpLGModGhpcyxNKSYmYyh0aGlzW01dLGUpJiYodGhpc1tNXVtlXT0hMSksbnQodGhpcyxlLHYoMSx0KSl9O3JldHVybiBhJiZldCYmbnQoRixlLHtjb25maWd1cmFibGU6ITAsc2V0Om59KSxydChlLHQpfSkucHJvdG90eXBlLCJ0b1N0cmluZyIsZnVuY3Rpb24oKXtyZXR1cm4gcSh0aGlzKS50YWd9KSxFLmY9c3QsUy5mPWl0LGsuZj11dCxiLmY9eC5mPWN0LHcuZj1sdCxhJiYoWShILnByb3RvdHlwZSwiZGVzY3JpcHRpb24iLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHEodGhpcykuZGVzY3JpcHRpb259fSksaXx8VChGLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsc3Qse3Vuc2FmZTohMH0pKSxQLmY9ZnVuY3Rpb24odCl7cmV0dXJuIHJ0KFIodCksdCl9KSxyKHtnbG9iYWw6ITAsd3JhcDohMCxmb3JjZWQ6IXMsc2hhbTohc30se1N5bWJvbDpIfSksRChtKFopLGZ1bmN0aW9uKHQpe04odCl9KSxyKHt0YXJnZXQ6IlN5bWJvbCIsc3RhdDohMCxmb3JjZWQ6IXN9LHtmb3I6ZnVuY3Rpb24odCl7dmFyIGU9U3RyaW5nKHQpO2lmKGMoSixlKSlyZXR1cm4gSltlXTt2YXIgbj1IKGUpO3JldHVybiBKW2VdPW4sUVtuXT1lLG59LGtleUZvcjpmdW5jdGlvbih0KXtpZighb3QodCkpdGhyb3cgVHlwZUVycm9yKHQrIiBpcyBub3QgYSBzeW1ib2wiKTtpZihjKFEsdCkpcmV0dXJuIFFbdF19LHVzZVNldHRlcjpmdW5jdGlvbigpe2V0PSEwfSx1c2VTaW1wbGU6ZnVuY3Rpb24oKXtldD0hMX19KSxyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXMsc2hhbTohYX0se2NyZWF0ZTpmdW5jdGlvbih0LGUpe3JldHVybiB2b2lkIDA9PT1lP3kodCk6YXQoeSh0KSxlKX0sZGVmaW5lUHJvcGVydHk6aXQsZGVmaW5lUHJvcGVydGllczphdCxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6dXR9KSxyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IXN9LHtnZXRPd25Qcm9wZXJ0eU5hbWVzOmN0LGdldE93blByb3BlcnR5U3ltYm9sczpsdH0pLHIoe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDp1KGZ1bmN0aW9uKCl7dy5mKDEpfSl9LHtnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ZnVuY3Rpb24odCl7cmV0dXJuIHcuZihoKHQpKX19KSx6JiZyKHt0YXJnZXQ6IkpTT04iLHN0YXQ6ITAsZm9yY2VkOiFzfHx1KGZ1bmN0aW9uKCl7dmFyIHQ9SCgpO3JldHVybiJbbnVsbF0iIT1XKFt0XSl8fCJ7fSIhPVcoe2E6dH0pfHwie30iIT1XKE9iamVjdCh0KSl9KX0se3N0cmluZ2lmeTpmdW5jdGlvbih0KXtmb3IodmFyIGUsbixyPVt0XSxvPTE7YXJndW1lbnRzLmxlbmd0aD5vOylyLnB1c2goYXJndW1lbnRzW28rK10pO2lmKG49ZT1yWzFdLChmKGUpfHx2b2lkIDAhPT10KSYmIW90KHQpKXJldHVybiBsKGUpfHwoZT1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuJiYoZT1uLmNhbGwodGhpcyx0LGUpKSwhb3QoZSkpcmV0dXJuIGV9KSxyWzFdPWUsVy5hcHBseSh6LHIpfX0pLEgucHJvdG90eXBlW1VdfHxqKEgucHJvdG90eXBlLFUsSC5wcm90b3R5cGUudmFsdWVPZiksSShILCJTeW1ib2wiKSxDW01dPSEwfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMSksbz1uKDEwNikuZixpPXt9LnRvU3RyaW5nLGE9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdyYmT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM/T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMod2luZG93KTpbXTt0LmV4cG9ydHMuZj1mdW5jdGlvbih0KXtyZXR1cm4gYSYmIltvYmplY3QgV2luZG93XSI9PWkuY2FsbCh0KT9mdW5jdGlvbih0KXt0cnl7cmV0dXJuIG8odCl9Y2F0Y2godCl7cmV0dXJuIGEuc2xpY2UoKX19KHQpOm8ocih0KSl9fSxmdW5jdGlvbih0LGUsbil7big0KSgiYXN5bmNJdGVyYXRvciIpfSxmdW5jdGlvbih0LGUpe30sZnVuY3Rpb24odCxlLG4pe24oNCkoImhhc0luc3RhbmNlIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJpc0NvbmNhdFNwcmVhZGFibGUiKX0sZnVuY3Rpb24odCxlLG4pe24oNCkoIm1hdGNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJtYXRjaEFsbCIpfSxmdW5jdGlvbih0LGUsbil7big0KSgicmVwbGFjZSIpfSxmdW5jdGlvbih0LGUsbil7big0KSgic2VhcmNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJzcGVjaWVzIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJzcGxpdCIpfSxmdW5jdGlvbih0LGUsbil7big0KSgidG9QcmltaXRpdmUiKX0sZnVuY3Rpb24odCxlLG4pe24oNCkoInRvU3RyaW5nVGFnIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJ1bnNjb3BhYmxlcyIpfSxmdW5jdGlvbih0LGUsbil7bigyOSkoTWF0aCwiTWF0aCIsITApfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KTtuKDI5KShyLkpTT04sIkpTT04iLCEwKX0sZnVuY3Rpb24odCxlLG4pe24oNCkoImFzeW5jRGlzcG9zZSIpfSxmdW5jdGlvbih0LGUsbil7big0KSgiZGlzcG9zZSIpfSxmdW5jdGlvbih0LGUsbil7big0KSgib2JzZXJ2YWJsZSIpfSxmdW5jdGlvbih0LGUsbil7big0KSgicGF0dGVybk1hdGNoIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJyZXBsYWNlQWxsIil9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMTQpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMTUpLG89QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmZpbmQ7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1vLmZpbmQ/cjplfX0sZnVuY3Rpb24odCxlLG4pe24oMjE2KTt2YXIgcj1uKDE4KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5maW5kfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDczKS5maW5kLGk9big3NyksYT0hMDsiZmluZCJpbltdJiZBcnJheSgxKS5maW5kKGZ1bmN0aW9uKCl7YT0hMX0pLHIoe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDphfSx7ZmluZDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pLGkoImZpbmQiKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIxOCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIxOSksbz1TdHJpbmcucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LnRyaW07cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fHx0PT09b3x8dCBpbnN0YW5jZW9mIFN0cmluZyYmZT09PW8udHJpbT9yOmV9fSxmdW5jdGlvbih0LGUsbil7bigyMjApO3ZhciByPW4oMTgpO3QuZXhwb3J0cz1yKCJTdHJpbmciKS50cmltfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDEwNykudHJpbTtyKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITAsZm9yY2VkOm4oMjIxKSgidHJpbSIpfSx7dHJpbTpmdW5jdGlvbigpe3JldHVybiBvKHRoaXMpfX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2KSxvPW4oNzgpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcihmdW5jdGlvbigpe3JldHVybiEhb1t0XSgpfHwi4oCLwoXhoI4iIT0i4oCLwoXhoI4iW3RdKCl8fG9bdF0ubmFtZSE9PXR9KX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyMjMpfSxmdW5jdGlvbih0LGUsbil7bigyMjQpO3ZhciByPW4oMSk7dC5leHBvcnRzPXIucGFyc2VJbnR9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDApLG89bigyMjUpO3Ioe2dsb2JhbDohMCxmb3JjZWQ6cGFyc2VJbnQhPW99LHtwYXJzZUludDpvfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUpLG89bigxMDcpLnRyaW0saT1uKDc4KSxhPXIucGFyc2VJbnQscz0vXlsrLV0/MFtYeF0vLHU9OCE9PWEoaSsiMDgiKXx8MjIhPT1hKGkrIjB4MTYiKTt0LmV4cG9ydHM9dT9mdW5jdGlvbih0LGUpe3ZhciBuPW8oU3RyaW5nKHQpKTtyZXR1cm4gYShuLGU+Pj4wfHwocy50ZXN0KG4pPzE2OjEwKSl9OmF9LGZ1bmN0aW9uKHQsZSxuKXtuKDUxKSxuKDM1KSx0LmV4cG9ydHM9bigxMDgpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTA5KX0sZnVuY3Rpb24odCxlLG4pe24oMCkoe3RhcmdldDoiQXJyYXkiLHN0YXQ6ITB9LHtpc0FycmF5Om4oNDgpfSl9LGZ1bmN0aW9uKHQsZSxuKXtuKDUxKSxuKDM1KSx0LmV4cG9ydHM9big1Mil9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMDQpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTEwKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDIzMyk7cih7dGFyZ2V0OiJBcnJheSIsc3RhdDohMCxmb3JjZWQ6IW4oMTEzKShmdW5jdGlvbih0KXtBcnJheS5mcm9tKHQpfSl9LHtmcm9tOm99KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMyKSxvPW4oMjQpLGk9bigxMTEpLGE9bigxMTIpLHM9bigzNCksdT1uKDcxKSxjPW4oNTIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZSxuLGwsZixwPW8odCksaD0iZnVuY3Rpb24iPT10eXBlb2YgdGhpcz90aGlzOkFycmF5LGQ9YXJndW1lbnRzLmxlbmd0aCxnPWQ+MT9hcmd1bWVudHNbMV06dm9pZCAwLHY9dm9pZCAwIT09Zyx5PTAsbT1jKHApO2lmKHYmJihnPXIoZyxkPjI/YXJndW1lbnRzWzJdOnZvaWQgMCwyKSksbnVsbD09bXx8aD09QXJyYXkmJmEobSkpZm9yKG49bmV3IGgoZT1zKHAubGVuZ3RoKSk7ZT55O3krKyl1KG4seSx2P2cocFt5XSx5KTpwW3ldKTtlbHNlIGZvcihmPW0uY2FsbChwKSxuPW5ldyBoOyEobD1mLm5leHQoKSkuZG9uZTt5KyspdShuLHksdj9pKGYsZyxbbC52YWx1ZSx5XSwhMCk6bC52YWx1ZSk7cmV0dXJuIG4ubGVuZ3RoPXksbn19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMTQpfSxmdW5jdGlvbih0LGUsbil7bigyMzYpO3ZhciByPW4oMTgpO3QuZXhwb3J0cz1yKCJBcnJheSIpLnNsaWNlfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMCksbz1uKDcpLGk9big0OCksYT1uKDg5KSxzPW4oMzQpLHU9bigyMSksYz1uKDcxKSxsPW4oNzIpLGY9bigyKSgic3BlY2llcyIpLHA9W10uc2xpY2UsaD1NYXRoLm1heDtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6IWwoInNsaWNlIil9LHtzbGljZTpmdW5jdGlvbih0LGUpe3ZhciBuLHIsbCxkPXUodGhpcyksZz1zKGQubGVuZ3RoKSx2PWEodCxnKSx5PWEodm9pZCAwPT09ZT9nOmUsZyk7aWYoaShkKSYmKCJmdW5jdGlvbiIhPXR5cGVvZihuPWQuY29uc3RydWN0b3IpfHxuIT09QXJyYXkmJiFpKG4ucHJvdG90eXBlKT9vKG4pJiZudWxsPT09KG49bltmXSkmJihuPXZvaWQgMCk6bj12b2lkIDAsbj09PUFycmF5fHx2b2lkIDA9PT1uKSlyZXR1cm4gcC5jYWxsKGQsdix5KTtmb3Iocj1uZXcodm9pZCAwPT09bj9BcnJheTpuKShoKHktdiwwKSksbD0wO3Y8eTt2KyssbCsrKXYgaW4gZCYmYyhyLGwsZFt2XSk7cmV0dXJuIHIubGVuZ3RoPWwscn19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDIzOCl9LGZ1bmN0aW9uKHQsZSxuKXtuKDIzOSk7dmFyIHI9bigxKTt0LmV4cG9ydHM9ci5PYmplY3Qua2V5c30sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDI0KSxpPW4oNTUpO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpuKDYpKGZ1bmN0aW9uKCl7aSgxKX0pfSx7a2V5czpmdW5jdGlvbih0KXtyZXR1cm4gaShvKHQpKX19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI0MSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI0Miksbz1BcnJheS5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuaW5kZXhPZjtyZXR1cm4gdD09PW98fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PW8uaW5kZXhPZj9yOmV9fSxmdW5jdGlvbih0LGUsbil7bigyNDMpO3ZhciByPW4oMTgpO3QuZXhwb3J0cz1yKCJBcnJheSIpLmluZGV4T2Z9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oNjcpLmluZGV4T2YsaT1uKDI0NCksYT1bXS5pbmRleE9mLHM9ISFhJiYxL1sxXS5pbmRleE9mKDEsLTApPDAsdT1pKCJpbmRleE9mIik7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOnN8fHV9LHtpbmRleE9mOmZ1bmN0aW9uKHQpe3JldHVybiBzP2EuYXBwbHkodGhpcyxhcmd1bWVudHMpfHwwOm8odGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDYpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPVtdW3RdO3JldHVybiFufHwhcihmdW5jdGlvbigpe24uY2FsbChudWxsLGV8fGZ1bmN0aW9uKCl7dGhyb3cgMX0sMSl9KX19LGZ1bmN0aW9uKHQsZSxuKXtuKDExNSksdC5leHBvcnRzPW4oMSkuc2V0VGltZW91dH0sZnVuY3Rpb24odCxlLG4pe24oMTE1KSx0LmV4cG9ydHM9bigxKS5zZXRJbnRlcnZhbH0sZnVuY3Rpb24odCxlLG4pe3ZhciByPWZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0Ijt2YXIgZSxuPU9iamVjdC5wcm90b3R5cGUscj1uLmhhc093blByb3BlcnR5LG89ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbD9TeW1ib2w6e30saT1vLml0ZXJhdG9yfHwiQEBpdGVyYXRvciIsYT1vLmFzeW5jSXRlcmF0b3J8fCJAQGFzeW5jSXRlcmF0b3IiLHM9by50b1N0cmluZ1RhZ3x8IkBAdG9TdHJpbmdUYWciO2Z1bmN0aW9uIHUodCxlLG4pe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSksdFtlXX10cnl7dSh7fSwiIil9Y2F0Y2godCl7dT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHRbZV09bn19ZnVuY3Rpb24gYyh0LGUsbixyKXt2YXIgbz1lJiZlLnByb3RvdHlwZSBpbnN0YW5jZW9mIHY/ZTp2LGk9T2JqZWN0LmNyZWF0ZShvLnByb3RvdHlwZSksYT1uZXcgQShyfHxbXSk7cmV0dXJuIGkuX2ludm9rZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9ZjtyZXR1cm4gZnVuY3Rpb24obyxpKXtpZihyPT09aCl0aHJvdyBuZXcgRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmciKTtpZihyPT09ZCl7aWYoInRocm93Ij09PW8pdGhyb3cgaTtyZXR1cm4gTCgpfWZvcihuLm1ldGhvZD1vLG4uYXJnPWk7Oyl7dmFyIGE9bi5kZWxlZ2F0ZTtpZihhKXt2YXIgcz1qKGEsbik7aWYocyl7aWYocz09PWcpY29udGludWU7cmV0dXJuIHN9fWlmKCJuZXh0Ij09PW4ubWV0aG9kKW4uc2VudD1uLl9zZW50PW4uYXJnO2Vsc2UgaWYoInRocm93Ij09PW4ubWV0aG9kKXtpZihyPT09Zil0aHJvdyByPWQsbi5hcmc7bi5kaXNwYXRjaEV4Y2VwdGlvbihuLmFyZyl9ZWxzZSJyZXR1cm4iPT09bi5tZXRob2QmJm4uYWJydXB0KCJyZXR1cm4iLG4uYXJnKTtyPWg7dmFyIHU9bCh0LGUsbik7aWYoIm5vcm1hbCI9PT11LnR5cGUpe2lmKHI9bi5kb25lP2Q6cCx1LmFyZz09PWcpY29udGludWU7cmV0dXJue3ZhbHVlOnUuYXJnLGRvbmU6bi5kb25lfX0idGhyb3ciPT09dS50eXBlJiYocj1kLG4ubWV0aG9kPSJ0aHJvdyIsbi5hcmc9dS5hcmcpfX19KHQsbixhKSxpfWZ1bmN0aW9uIGwodCxlLG4pe3RyeXtyZXR1cm57dHlwZToibm9ybWFsIixhcmc6dC5jYWxsKGUsbil9fWNhdGNoKHQpe3JldHVybnt0eXBlOiJ0aHJvdyIsYXJnOnR9fX10LndyYXA9Yzt2YXIgZj0ic3VzcGVuZGVkU3RhcnQiLHA9InN1c3BlbmRlZFlpZWxkIixoPSJleGVjdXRpbmciLGQ9ImNvbXBsZXRlZCIsZz17fTtmdW5jdGlvbiB2KCl7fWZ1bmN0aW9uIHkoKXt9ZnVuY3Rpb24gbSgpe312YXIgYj17fTtiW2ldPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O3ZhciB4PU9iamVjdC5nZXRQcm90b3R5cGVPZix3PXgmJngoeChDKFtdKSkpO3cmJnchPT1uJiZyLmNhbGwodyxpKSYmKGI9dyk7dmFyIGs9bS5wcm90b3R5cGU9di5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShiKTtmdW5jdGlvbiBTKHQpe1sibmV4dCIsInRocm93IiwicmV0dXJuIl0uZm9yRWFjaChmdW5jdGlvbihlKXt1KHQsZSxmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faW52b2tlKGUsdCl9KX0pfWZ1bmN0aW9uIEUodCxlKXt2YXIgbjt0aGlzLl9pbnZva2U9ZnVuY3Rpb24obyxpKXtmdW5jdGlvbiBhKCl7cmV0dXJuIG5ldyBlKGZ1bmN0aW9uKG4sYSl7IWZ1bmN0aW9uIG4obyxpLGEscyl7dmFyIHU9bCh0W29dLHQsaSk7aWYoInRocm93IiE9PXUudHlwZSl7dmFyIGM9dS5hcmcsZj1jLnZhbHVlO3JldHVybiBmJiYib2JqZWN0Ij09dHlwZW9mIGYmJnIuY2FsbChmLCJfX2F3YWl0Iik/ZS5yZXNvbHZlKGYuX19hd2FpdCkudGhlbihmdW5jdGlvbih0KXtuKCJuZXh0Iix0LGEscyl9LGZ1bmN0aW9uKHQpe24oInRocm93Iix0LGEscyl9KTplLnJlc29sdmUoZikudGhlbihmdW5jdGlvbih0KXtjLnZhbHVlPXQsYShjKX0sZnVuY3Rpb24odCl7cmV0dXJuIG4oInRocm93Iix0LGEscyl9KX1zKHUuYXJnKX0obyxpLG4sYSl9KX1yZXR1cm4gbj1uP24udGhlbihhLGEpOmEoKX19ZnVuY3Rpb24gaih0LG4pe3ZhciByPXQuaXRlcmF0b3Jbbi5tZXRob2RdO2lmKHI9PT1lKXtpZihuLmRlbGVnYXRlPW51bGwsInRocm93Ij09PW4ubWV0aG9kKXtpZih0Lml0ZXJhdG9yLnJldHVybiYmKG4ubWV0aG9kPSJyZXR1cm4iLG4uYXJnPWUsaih0LG4pLCJ0aHJvdyI9PT1uLm1ldGhvZCkpcmV0dXJuIGc7bi5tZXRob2Q9InRocm93IixuLmFyZz1uZXcgVHlwZUVycm9yKCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kIil9cmV0dXJuIGd9dmFyIG89bChyLHQuaXRlcmF0b3Isbi5hcmcpO2lmKCJ0aHJvdyI9PT1vLnR5cGUpcmV0dXJuIG4ubWV0aG9kPSJ0aHJvdyIsbi5hcmc9by5hcmcsbi5kZWxlZ2F0ZT1udWxsLGc7dmFyIGk9by5hcmc7cmV0dXJuIGk/aS5kb25lPyhuW3QucmVzdWx0TmFtZV09aS52YWx1ZSxuLm5leHQ9dC5uZXh0TG9jLCJyZXR1cm4iIT09bi5tZXRob2QmJihuLm1ldGhvZD0ibmV4dCIsbi5hcmc9ZSksbi5kZWxlZ2F0ZT1udWxsLGcpOmk6KG4ubWV0aG9kPSJ0aHJvdyIsbi5hcmc9bmV3IFR5cGVFcnJvcigiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3QiKSxuLmRlbGVnYXRlPW51bGwsZyl9ZnVuY3Rpb24gVCh0KXt2YXIgZT17dHJ5TG9jOnRbMF19OzEgaW4gdCYmKGUuY2F0Y2hMb2M9dFsxXSksMiBpbiB0JiYoZS5maW5hbGx5TG9jPXRbMl0sZS5hZnRlckxvYz10WzNdKSx0aGlzLnRyeUVudHJpZXMucHVzaChlKX1mdW5jdGlvbiBPKHQpe3ZhciBlPXQuY29tcGxldGlvbnx8e307ZS50eXBlPSJub3JtYWwiLGRlbGV0ZSBlLmFyZyx0LmNvbXBsZXRpb249ZX1mdW5jdGlvbiBBKHQpe3RoaXMudHJ5RW50cmllcz1be3RyeUxvYzoicm9vdCJ9XSx0LmZvckVhY2goVCx0aGlzKSx0aGlzLnJlc2V0KCEwKX1mdW5jdGlvbiBDKHQpe2lmKHQpe3ZhciBuPXRbaV07aWYobilyZXR1cm4gbi5jYWxsKHQpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0Lm5leHQpcmV0dXJuIHQ7aWYoIWlzTmFOKHQubGVuZ3RoKSl7dmFyIG89LTEsYT1mdW5jdGlvbiBuKCl7Zm9yKDsrK288dC5sZW5ndGg7KWlmKHIuY2FsbCh0LG8pKXJldHVybiBuLnZhbHVlPXRbb10sbi5kb25lPSExLG47cmV0dXJuIG4udmFsdWU9ZSxuLmRvbmU9ITAsbn07cmV0dXJuIGEubmV4dD1hfX1yZXR1cm57bmV4dDpMfX1mdW5jdGlvbiBMKCl7cmV0dXJue3ZhbHVlOmUsZG9uZTohMH19cmV0dXJuIHkucHJvdG90eXBlPWsuY29uc3RydWN0b3I9bSxtLmNvbnN0cnVjdG9yPXkseS5kaXNwbGF5TmFtZT11KG0scywiR2VuZXJhdG9yRnVuY3Rpb24iKSx0LmlzR2VuZXJhdG9yRnVuY3Rpb249ZnVuY3Rpb24odCl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQuY29uc3RydWN0b3I7cmV0dXJuISFlJiYoZT09PXl8fCJHZW5lcmF0b3JGdW5jdGlvbiI9PT0oZS5kaXNwbGF5TmFtZXx8ZS5uYW1lKSl9LHQubWFyaz1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZih0LG0pOih0Ll9fcHJvdG9fXz1tLHUodCxzLCJHZW5lcmF0b3JGdW5jdGlvbiIpKSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGspLHR9LHQuYXdyYXA9ZnVuY3Rpb24odCl7cmV0dXJue19fYXdhaXQ6dH19LFMoRS5wcm90b3R5cGUpLEUucHJvdG90eXBlW2FdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LHQuQXN5bmNJdGVyYXRvcj1FLHQuYXN5bmM9ZnVuY3Rpb24oZSxuLHIsbyxpKXt2b2lkIDA9PT1pJiYoaT1Qcm9taXNlKTt2YXIgYT1uZXcgRShjKGUsbixyLG8pLGkpO3JldHVybiB0LmlzR2VuZXJhdG9yRnVuY3Rpb24obik/YTphLm5leHQoKS50aGVuKGZ1bmN0aW9uKHQpe3JldHVybiB0LmRvbmU/dC52YWx1ZTphLm5leHQoKX0pfSxTKGspLHUoayxzLCJHZW5lcmF0b3IiKSxrW2ldPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGsudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4iW29iamVjdCBHZW5lcmF0b3JdIn0sdC5rZXlzPWZ1bmN0aW9uKHQpe3ZhciBlPVtdO2Zvcih2YXIgbiBpbiB0KWUucHVzaChuKTtyZXR1cm4gZS5yZXZlcnNlKCksZnVuY3Rpb24gbigpe2Zvcig7ZS5sZW5ndGg7KXt2YXIgcj1lLnBvcCgpO2lmKHIgaW4gdClyZXR1cm4gbi52YWx1ZT1yLG4uZG9uZT0hMSxufXJldHVybiBuLmRvbmU9ITAsbn19LHQudmFsdWVzPUMsQS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkEscmVzZXQ6ZnVuY3Rpb24odCl7aWYodGhpcy5wcmV2PTAsdGhpcy5uZXh0PTAsdGhpcy5zZW50PXRoaXMuX3NlbnQ9ZSx0aGlzLmRvbmU9ITEsdGhpcy5kZWxlZ2F0ZT1udWxsLHRoaXMubWV0aG9kPSJuZXh0Iix0aGlzLmFyZz1lLHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKE8pLCF0KWZvcih2YXIgbiBpbiB0aGlzKSJ0Ij09PW4uY2hhckF0KDApJiZyLmNhbGwodGhpcyxuKSYmIWlzTmFOKCtuLnNsaWNlKDEpKSYmKHRoaXNbbl09ZSl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLmRvbmU9ITA7dmFyIHQ9dGhpcy50cnlFbnRyaWVzWzBdLmNvbXBsZXRpb247aWYoInRocm93Ij09PXQudHlwZSl0aHJvdyB0LmFyZztyZXR1cm4gdGhpcy5ydmFsfSxkaXNwYXRjaEV4Y2VwdGlvbjpmdW5jdGlvbih0KXtpZih0aGlzLmRvbmUpdGhyb3cgdDt2YXIgbj10aGlzO2Z1bmN0aW9uIG8ocixvKXtyZXR1cm4gcy50eXBlPSJ0aHJvdyIscy5hcmc9dCxuLm5leHQ9cixvJiYobi5tZXRob2Q9Im5leHQiLG4uYXJnPWUpLCEhb31mb3IodmFyIGk9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO2k+PTA7LS1pKXt2YXIgYT10aGlzLnRyeUVudHJpZXNbaV0scz1hLmNvbXBsZXRpb247aWYoInJvb3QiPT09YS50cnlMb2MpcmV0dXJuIG8oImVuZCIpO2lmKGEudHJ5TG9jPD10aGlzLnByZXYpe3ZhciB1PXIuY2FsbChhLCJjYXRjaExvYyIpLGM9ci5jYWxsKGEsImZpbmFsbHlMb2MiKTtpZih1JiZjKXtpZih0aGlzLnByZXY8YS5jYXRjaExvYylyZXR1cm4gbyhhLmNhdGNoTG9jLCEwKTtpZih0aGlzLnByZXY8YS5maW5hbGx5TG9jKXJldHVybiBvKGEuZmluYWxseUxvYyl9ZWxzZSBpZih1KXtpZih0aGlzLnByZXY8YS5jYXRjaExvYylyZXR1cm4gbyhhLmNhdGNoTG9jLCEwKX1lbHNle2lmKCFjKXRocm93IG5ldyBFcnJvcigidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHkiKTtpZih0aGlzLnByZXY8YS5maW5hbGx5TG9jKXJldHVybiBvKGEuZmluYWxseUxvYyl9fX19LGFicnVwdDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7bj49MDstLW4pe3ZhciBvPXRoaXMudHJ5RW50cmllc1tuXTtpZihvLnRyeUxvYzw9dGhpcy5wcmV2JiZyLmNhbGwobywiZmluYWxseUxvYyIpJiZ0aGlzLnByZXY8by5maW5hbGx5TG9jKXt2YXIgaT1vO2JyZWFrfX1pJiYoImJyZWFrIj09PXR8fCJjb250aW51ZSI9PT10KSYmaS50cnlMb2M8PWUmJmU8PWkuZmluYWxseUxvYyYmKGk9bnVsbCk7dmFyIGE9aT9pLmNvbXBsZXRpb246e307cmV0dXJuIGEudHlwZT10LGEuYXJnPWUsaT8odGhpcy5tZXRob2Q9Im5leHQiLHRoaXMubmV4dD1pLmZpbmFsbHlMb2MsZyk6dGhpcy5jb21wbGV0ZShhKX0sY29tcGxldGU6ZnVuY3Rpb24odCxlKXtpZigidGhyb3ciPT09dC50eXBlKXRocm93IHQuYXJnO3JldHVybiJicmVhayI9PT10LnR5cGV8fCJjb250aW51ZSI9PT10LnR5cGU/dGhpcy5uZXh0PXQuYXJnOiJyZXR1cm4iPT09dC50eXBlPyh0aGlzLnJ2YWw9dGhpcy5hcmc9dC5hcmcsdGhpcy5tZXRob2Q9InJldHVybiIsdGhpcy5uZXh0PSJlbmQiKToibm9ybWFsIj09PXQudHlwZSYmZSYmKHRoaXMubmV4dD1lKSxnfSxmaW5pc2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtlPj0wOy0tZSl7dmFyIG49dGhpcy50cnlFbnRyaWVzW2VdO2lmKG4uZmluYWxseUxvYz09PXQpcmV0dXJuIHRoaXMuY29tcGxldGUobi5jb21wbGV0aW9uLG4uYWZ0ZXJMb2MpLE8obiksZ319LGNhdGNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7ZT49MDstLWUpe3ZhciBuPXRoaXMudHJ5RW50cmllc1tlXTtpZihuLnRyeUxvYz09PXQpe3ZhciByPW4uY29tcGxldGlvbjtpZigidGhyb3ciPT09ci50eXBlKXt2YXIgbz1yLmFyZztPKG4pfXJldHVybiBvfX10aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdCIpfSxkZWxlZ2F0ZVlpZWxkOmZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdGhpcy5kZWxlZ2F0ZT17aXRlcmF0b3I6Qyh0KSxyZXN1bHROYW1lOm4sbmV4dExvYzpyfSwibmV4dCI9PT10aGlzLm1ldGhvZCYmKHRoaXMuYXJnPWUpLGd9fSx0fSh0LmV4cG9ydHMpO3RyeXtyZWdlbmVyYXRvclJ1bnRpbWU9cn1jYXRjaCh0KXtGdW5jdGlvbigiciIsInJlZ2VuZXJhdG9yUnVudGltZSA9IHIiKShyKX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNDkpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNTApLG89RnVuY3Rpb24ucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmJpbmQ7cmV0dXJuIHQ9PT1vfHx0IGluc3RhbmNlb2YgRnVuY3Rpb24mJmU9PT1vLmJpbmQ/cjplfX0sZnVuY3Rpb24odCxlLG4pe24oMjUxKTt2YXIgcj1uKDE4KTt0LmV4cG9ydHM9cigiRnVuY3Rpb24iKS5iaW5kfSxmdW5jdGlvbih0LGUsbil7bigwKSh7dGFyZ2V0OiJGdW5jdGlvbiIscHJvdG86ITB9LHtiaW5kOm4oOTEpfSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNTMpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTE2KSxuKDI1OSksbigyNjApLG4oMjYxKSxuKDI2Mil9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHIsbyxpLGEscz1uKDApLHU9bigyOCksYz1uKDUpLGw9bigxKSxmPW4oMTE3KSxwPW4oMzYpLGg9bigxMTgpLGQ9bigyOSksZz1uKDI1NSksdj1uKDcpLHk9bigyMiksbT1uKDExOSksYj1uKDI3KSx4PW4oNTkpLHc9bigxMTMpLGs9bigxMjApLFM9bigxMjEpLnNldCxFPW4oMjU2KSxqPW4oMTIyKSxUPW4oMjU3KSxPPW4oNTMpLEE9big2MCksQz1uKDc5KSxMPW4oNTApLFI9big4NyksUD1uKDIpKCJzcGVjaWVzIiksTj0iUHJvbWlzZSIsST1MLmdldCxfPUwuc2V0LEQ9TC5nZXR0ZXJGb3IoTiksTT1mLFU9Yy5UeXBlRXJyb3IsQj1jLmRvY3VtZW50LHE9Yy5wcm9jZXNzLEY9Yy5mZXRjaCxIPXEmJnEudmVyc2lvbnMsej1IJiZILnY4fHwiIixXPU8uZiwkPVcsWT0icHJvY2VzcyI9PWIocSksVj0hIShCJiZCLmNyZWF0ZUV2ZW50JiZjLmRpc3BhdGNoRXZlbnQpLEc9UihOLGZ1bmN0aW9uKCl7dmFyIHQ9TS5yZXNvbHZlKDEpLGU9ZnVuY3Rpb24oKXt9LG49KHQuY29uc3RydWN0b3I9e30pW1BdPWZ1bmN0aW9uKHQpe3QoZSxlKX07cmV0dXJuISgoWXx8ImZ1bmN0aW9uIj09dHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCkmJighdXx8dC5maW5hbGx5KSYmdC50aGVuKGUpaW5zdGFuY2VvZiBuJiYwIT09ei5pbmRleE9mKCI2LjYiKSYmLTE9PT1DLmluZGV4T2YoIkNocm9tZS82NiIpKX0pLEs9R3x8IXcoZnVuY3Rpb24odCl7TS5hbGwodCkuY2F0Y2goZnVuY3Rpb24oKXt9KX0pLFg9ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuISghdih0KXx8ImZ1bmN0aW9uIiE9dHlwZW9mKGU9dC50aGVuKSkmJmV9LEo9ZnVuY3Rpb24odCxlLG4pe2lmKCFlLm5vdGlmaWVkKXtlLm5vdGlmaWVkPSEwO3ZhciByPWUucmVhY3Rpb25zO0UoZnVuY3Rpb24oKXtmb3IodmFyIG89ZS52YWx1ZSxpPTE9PWUuc3RhdGUsYT0wO3IubGVuZ3RoPmE7KXt2YXIgcyx1LGMsbD1yW2ErK10sZj1pP2wub2s6bC5mYWlsLHA9bC5yZXNvbHZlLGg9bC5yZWplY3QsZD1sLmRvbWFpbjt0cnl7Zj8oaXx8KDI9PT1lLnJlamVjdGlvbiYmZXQodCxlKSxlLnJlamVjdGlvbj0xKSwhMD09PWY/cz1vOihkJiZkLmVudGVyKCkscz1mKG8pLGQmJihkLmV4aXQoKSxjPSEwKSkscz09PWwucHJvbWlzZT9oKFUoIlByb21pc2UtY2hhaW4gY3ljbGUiKSk6KHU9WChzKSk/dS5jYWxsKHMscCxoKTpwKHMpKTpoKG8pfWNhdGNoKHQpe2QmJiFjJiZkLmV4aXQoKSxoKHQpfX1lLnJlYWN0aW9ucz1bXSxlLm5vdGlmaWVkPSExLG4mJiFlLnJlamVjdGlvbiYmWih0LGUpfSl9fSxRPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcixvO1Y/KChyPUIuY3JlYXRlRXZlbnQoIkV2ZW50IikpLnByb21pc2U9ZSxyLnJlYXNvbj1uLHIuaW5pdEV2ZW50KHQsITEsITApLGMuZGlzcGF0Y2hFdmVudChyKSk6cj17cHJvbWlzZTplLHJlYXNvbjpufSwobz1jWyJvbiIrdF0pP28ocik6InVuaGFuZGxlZHJlamVjdGlvbiI9PT10JiZUKCJVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24iLG4pfSxaPWZ1bmN0aW9uKHQsZSl7Uy5jYWxsKGMsZnVuY3Rpb24oKXt2YXIgbixyPWUudmFsdWU7aWYodHQoZSkmJihuPUEoZnVuY3Rpb24oKXtZP3EuZW1pdCgidW5oYW5kbGVkUmVqZWN0aW9uIixyLHQpOlEoInVuaGFuZGxlZHJlamVjdGlvbiIsdCxyKX0pLGUucmVqZWN0aW9uPVl8fHR0KGUpPzI6MSxuLmVycm9yKSl0aHJvdyBuLnZhbHVlfSl9LHR0PWZ1bmN0aW9uKHQpe3JldHVybiAxIT09dC5yZWplY3Rpb24mJiF0LnBhcmVudH0sZXQ9ZnVuY3Rpb24odCxlKXtTLmNhbGwoYyxmdW5jdGlvbigpe1k/cS5lbWl0KCJyZWplY3Rpb25IYW5kbGVkIix0KTpRKCJyZWplY3Rpb25oYW5kbGVkIix0LGUudmFsdWUpfSl9LG50PWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBmdW5jdGlvbihvKXt0KGUsbixvLHIpfX0scnQ9ZnVuY3Rpb24odCxlLG4scil7ZS5kb25lfHwoZS5kb25lPSEwLHImJihlPXIpLGUudmFsdWU9bixlLnN0YXRlPTIsSih0LGUsITApKX0sb3Q9ZnVuY3Rpb24odCxlLG4scil7aWYoIWUuZG9uZSl7ZS5kb25lPSEwLHImJihlPXIpO3RyeXtpZih0PT09bil0aHJvdyBVKCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZiIpO3ZhciBvPVgobik7bz9FKGZ1bmN0aW9uKCl7dmFyIHI9e2RvbmU6ITF9O3RyeXtvLmNhbGwobixudChvdCx0LHIsZSksbnQocnQsdCxyLGUpKX1jYXRjaChuKXtydCh0LHIsbixlKX19KTooZS52YWx1ZT1uLGUuc3RhdGU9MSxKKHQsZSwhMSkpfWNhdGNoKG4pe3J0KHQse2RvbmU6ITF9LG4sZSl9fX07RyYmKE09ZnVuY3Rpb24odCl7bSh0aGlzLE0sTikseSh0KSxyLmNhbGwodGhpcyk7dmFyIGU9SSh0aGlzKTt0cnl7dChudChvdCx0aGlzLGUpLG50KHJ0LHRoaXMsZSkpfWNhdGNoKHQpe3J0KHRoaXMsZSx0KX19LChyPWZ1bmN0aW9uKHQpe18odGhpcyx7dHlwZTpOLGRvbmU6ITEsbm90aWZpZWQ6ITEscGFyZW50OiExLHJlYWN0aW9uczpbXSxyZWplY3Rpb246ITEsc3RhdGU6MCx2YWx1ZTp2b2lkIDB9KX0pLnByb3RvdHlwZT1oKE0ucHJvdG90eXBlLHt0aGVuOmZ1bmN0aW9uKHQsZSl7dmFyIG49RCh0aGlzKSxyPVcoayh0aGlzLE0pKTtyZXR1cm4gci5vaz0iZnVuY3Rpb24iIT10eXBlb2YgdHx8dCxyLmZhaWw9ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUsci5kb21haW49WT9xLmRvbWFpbjp2b2lkIDAsbi5wYXJlbnQ9ITAsbi5yZWFjdGlvbnMucHVzaChyKSwwIT1uLnN0YXRlJiZKKHRoaXMsbiwhMSksci5wcm9taXNlfSxjYXRjaDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aGVuKHZvaWQgMCx0KX19KSxvPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IHIsZT1JKHQpO3RoaXMucHJvbWlzZT10LHRoaXMucmVzb2x2ZT1udChvdCx0LGUpLHRoaXMucmVqZWN0PW50KHJ0LHQsZSl9LE8uZj1XPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09TXx8dD09PWk/bmV3IG8odCk6JCh0KX0sdXx8ImZ1bmN0aW9uIiE9dHlwZW9mIGZ8fChhPWYucHJvdG90eXBlLnRoZW4scChmLnByb3RvdHlwZSwidGhlbiIsZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3JldHVybiBuZXcgTShmdW5jdGlvbih0LGUpe2EuY2FsbChuLHQsZSl9KS50aGVuKHQsZSl9KSwiZnVuY3Rpb24iPT10eXBlb2YgRiYmcyh7Z2xvYmFsOiEwLGVudW1lcmFibGU6ITAsZm9yY2VkOiEwfSx7ZmV0Y2g6ZnVuY3Rpb24odCl7cmV0dXJuIGooTSxGLmFwcGx5KGMsYXJndW1lbnRzKSl9fSkpKSxzKHtnbG9iYWw6ITAsd3JhcDohMCxmb3JjZWQ6R30se1Byb21pc2U6TX0pLGQoTSxOLCExLCEwKSxnKE4pLGk9bC5Qcm9taXNlLHMoe3RhcmdldDpOLHN0YXQ6ITAsZm9yY2VkOkd9LHtyZWplY3Q6ZnVuY3Rpb24odCl7dmFyIGU9Vyh0aGlzKTtyZXR1cm4gZS5yZWplY3QuY2FsbCh2b2lkIDAsdCksZS5wcm9taXNlfX0pLHMoe3RhcmdldDpOLHN0YXQ6ITAsZm9yY2VkOnV8fEd9LHtyZXNvbHZlOmZ1bmN0aW9uKHQpe3JldHVybiBqKHUmJnRoaXM9PT1pP006dGhpcyx0KX19KSxzKHt0YXJnZXQ6TixzdGF0OiEwLGZvcmNlZDpLfSx7YWxsOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1XKGUpLHI9bi5yZXNvbHZlLG89bi5yZWplY3QsaT1BKGZ1bmN0aW9uKCl7dmFyIG49eShlLnJlc29sdmUpLGk9W10sYT0wLHM9MTt4KHQsZnVuY3Rpb24odCl7dmFyIHU9YSsrLGM9ITE7aS5wdXNoKHZvaWQgMCkscysrLG4uY2FsbChlLHQpLnRoZW4oZnVuY3Rpb24odCl7Y3x8KGM9ITAsaVt1XT10LC0tc3x8cihpKSl9LG8pfSksLS1zfHxyKGkpfSk7cmV0dXJuIGkuZXJyb3ImJm8oaS52YWx1ZSksbi5wcm9taXNlfSxyYWNlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1XKGUpLHI9bi5yZWplY3Qsbz1BKGZ1bmN0aW9uKCl7dmFyIG89eShlLnJlc29sdmUpO3godCxmdW5jdGlvbih0KXtvLmNhbGwoZSx0KS50aGVuKG4ucmVzb2x2ZSxyKX0pfSk7cmV0dXJuIG8uZXJyb3ImJnIoby52YWx1ZSksbi5wcm9taXNlfX0pfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzMpLG89bigyMyksaT1uKDIpLGE9bigxMykscz1pKCJzcGVjaWVzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXIodCksbj1vLmY7YSYmZSYmIWVbc10mJm4oZSxzLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9fSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHIsbyxpLGEscyx1LGMsbD1uKDUpLGY9big0NSkuZixwPW4oMjcpLGg9bigxMjEpLnNldCxkPW4oNzkpLGc9bC5NdXRhdGlvbk9ic2VydmVyfHxsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXIsdj1sLnByb2Nlc3MseT1sLlByb21pc2UsbT0icHJvY2VzcyI9PXAodiksYj1mKGwsInF1ZXVlTWljcm90YXNrIikseD1iJiZiLnZhbHVlO3h8fChyPWZ1bmN0aW9uKCl7dmFyIHQsZTtmb3IobSYmKHQ9di5kb21haW4pJiZ0LmV4aXQoKTtvOyl7ZT1vLmZuLG89by5uZXh0O3RyeXtlKCl9Y2F0Y2godCl7dGhyb3cgbz9hKCk6aT12b2lkIDAsdH19aT12b2lkIDAsdCYmdC5lbnRlcigpfSxtP2E9ZnVuY3Rpb24oKXt2Lm5leHRUaWNrKHIpfTpnJiYhLyhpcGhvbmV8aXBvZHxpcGFkKS4qYXBwbGV3ZWJraXQvaS50ZXN0KGQpPyhzPSEwLHU9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiIpLG5ldyBnKHIpLm9ic2VydmUodSx7Y2hhcmFjdGVyRGF0YTohMH0pLGE9ZnVuY3Rpb24oKXt1LmRhdGE9cz0hc30pOnkmJnkucmVzb2x2ZT8oYz15LnJlc29sdmUodm9pZCAwKSxhPWZ1bmN0aW9uKCl7Yy50aGVuKHIpfSk6YT1mdW5jdGlvbigpe2guY2FsbChsLHIpfSksdC5leHBvcnRzPXh8fGZ1bmN0aW9uKHQpe3ZhciBlPXtmbjp0LG5leHQ6dm9pZCAwfTtpJiYoaS5uZXh0PWUpLG98fChvPWUsYSgpKSxpPWV9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbj1yLmNvbnNvbGU7biYmbi5lcnJvciYmKDE9PT1hcmd1bWVudHMubGVuZ3RoP24uZXJyb3IodCk6bi5lcnJvcih0LGUpKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oMjgpLGk9bigxMTcpLGE9bigzMykscz1uKDEyMCksdT1uKDEyMiksYz1uKDM2KTtyKHt0YXJnZXQ6IlByb21pc2UiLHByb3RvOiEwLHJlYWw6ITB9LHtmaW5hbGx5OmZ1bmN0aW9uKHQpe3ZhciBlPXModGhpcyxhKCJQcm9taXNlIikpLG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ7cmV0dXJuIHRoaXMudGhlbihuP2Z1bmN0aW9uKG4pe3JldHVybiB1KGUsdCgpKS50aGVuKGZ1bmN0aW9uKCl7cmV0dXJuIG59KX06dCxuP2Z1bmN0aW9uKG4pe3JldHVybiB1KGUsdCgpKS50aGVuKGZ1bmN0aW9uKCl7dGhyb3cgbn0pfTp0KX19KSxvfHwiZnVuY3Rpb24iIT10eXBlb2YgaXx8aS5wcm90b3R5cGUuZmluYWxseXx8YyhpLnByb3RvdHlwZSwiZmluYWxseSIsYSgiUHJvbWlzZSIpLnByb3RvdHlwZS5maW5hbGx5KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMCksbz1uKDQ5KSxpPW4oNzQpLGE9big0Nykscz1uKDMxKSx1PW4oNTkpLGM9bigxNyksbD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7aWYoIShuIGluc3RhbmNlb2YgbCkpcmV0dXJuIG5ldyBsKHQsZSk7aSYmKG49aShuZXcgRXJyb3IoZSksbyhuKSkpO3ZhciByPVtdO3JldHVybiB1KHQsci5wdXNoLHIpLGMobiwiZXJyb3JzIixyKSx2b2lkIDAhPT1lJiZjKG4sIm1lc3NhZ2UiLFN0cmluZyhlKSksbn07bC5wcm90b3R5cGU9YShFcnJvci5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnMoNSxsKSxuYW1lOnMoNSwiQWdncmVnYXRlRXJyb3IiKX0pLHIoe2dsb2JhbDohMH0se0FnZ3JlZ2F0ZUVycm9yOmx9KX0sZnVuY3Rpb24odCxlLG4pe24oMTIzKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89big1MyksaT1uKDYwKTtyKHt0YXJnZXQ6IlByb21pc2UiLHN0YXQ6ITB9LHt0cnk6ZnVuY3Rpb24odCl7dmFyIGU9by5mKHRoaXMpLG49aSh0KTtyZXR1cm4obi5lcnJvcj9lLnJlamVjdDplLnJlc29sdmUpKG4udmFsdWUpLGUucHJvbWlzZX19KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89bigyMiksaT1uKDMzKSxhPW4oNTMpLHM9big2MCksdT1uKDU5KTtyKHt0YXJnZXQ6IlByb21pc2UiLHN0YXQ6ITB9LHthbnk6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWEuZihlKSxyPW4ucmVzb2x2ZSxjPW4ucmVqZWN0LGw9cyhmdW5jdGlvbigpe3ZhciBuPW8oZS5yZXNvbHZlKSxhPVtdLHM9MCxsPTEsZj0hMTt1KHQsZnVuY3Rpb24odCl7dmFyIG89cysrLHU9ITE7YS5wdXNoKHZvaWQgMCksbCsrLG4uY2FsbChlLHQpLnRoZW4oZnVuY3Rpb24odCl7dXx8Znx8KGY9ITAscih0KSl9LGZ1bmN0aW9uKHQpe3V8fGZ8fCh1PSEwLGFbb109dCwtLWx8fGMobmV3KGkoIkFnZ3JlZ2F0ZUVycm9yIikpKGEsIk5vIG9uZSBwcm9taXNlIHJlc29sdmVkIikpKX0pfSksLS1sfHxjKG5ldyhpKCJBZ2dyZWdhdGVFcnJvciIpKShhLCJObyBvbmUgcHJvbWlzZSByZXNvbHZlZCIpKX0pO3JldHVybiBsLmVycm9yJiZjKGwudmFsdWUpLG4ucHJvbWlzZX19KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDExNil9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsci5rZXkscil9fXJldHVybiBmdW5jdGlvbihlLG4scil7cmV0dXJuIG4mJnQoZS5wcm90b3R5cGUsbiksciYmdChlLHIpLGV9fSgpLG89ZnVuY3Rpb24odCl7aWYodCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBlPXt9O2lmKG51bGwhPXQpZm9yKHZhciBuIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbikmJihlW25dPXRbbl0pO3JldHVybiBlLmRlZmF1bHQ9dCxlfShuKDI2NSkpLGk9cChuKDI2NikpLGE9cChuKDI2NykpLHM9cChuKDI2OCkpLHU9cChuKDI2OSkpLGM9cChuKDI3MCkpLGw9cChuKDI3MSkpLGY9cChuKDI3MikpO2Z1bmN0aW9uIHAodCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fXZhciBoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307IWZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsdCksdGhpcy50eXBlPSJsYW5ndWFnZURldGVjdG9yIix0aGlzLmRldGVjdG9ycz17fSx0aGlzLmluaXQoZSxuKX1yZXR1cm4gcih0LFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e30sbj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e307dGhpcy5zZXJ2aWNlcz10LHRoaXMub3B0aW9ucz1vLmRlZmF1bHRzKGUsdGhpcy5vcHRpb25zfHx7fSx7b3JkZXI6WyJxdWVyeXN0cmluZyIsImNvb2tpZSIsImxvY2FsU3RvcmFnZSIsIm5hdmlnYXRvciIsImh0bWxUYWciXSxsb29rdXBRdWVyeXN0cmluZzoibG5nIixsb29rdXBDb29raWU6ImkxOG5leHQiLGxvb2t1cExvY2FsU3RvcmFnZToiaTE4bmV4dExuZyIsY2FjaGVzOlsibG9jYWxTdG9yYWdlIl0sZXhjbHVkZUNhY2hlRm9yOlsiY2ltb2RlIl19KSx0aGlzLm9wdGlvbnMubG9va3VwRnJvbVVybEluZGV4JiYodGhpcy5vcHRpb25zLmxvb2t1cEZyb21QYXRoSW5kZXg9dGhpcy5vcHRpb25zLmxvb2t1cEZyb21VcmxJbmRleCksdGhpcy5pMThuT3B0aW9ucz1uLHRoaXMuYWRkRGV0ZWN0b3IoaS5kZWZhdWx0KSx0aGlzLmFkZERldGVjdG9yKGEuZGVmYXVsdCksdGhpcy5hZGREZXRlY3RvcihzLmRlZmF1bHQpLHRoaXMuYWRkRGV0ZWN0b3IodS5kZWZhdWx0KSx0aGlzLmFkZERldGVjdG9yKGMuZGVmYXVsdCksdGhpcy5hZGREZXRlY3RvcihsLmRlZmF1bHQpLHRoaXMuYWRkRGV0ZWN0b3IoZi5kZWZhdWx0KX19LHtrZXk6ImFkZERldGVjdG9yIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLmRldGVjdG9yc1t0Lm5hbWVdPXR9fSx7a2V5OiJkZXRlY3QiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dHx8KHQ9dGhpcy5vcHRpb25zLm9yZGVyKTt2YXIgbj1bXTt0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoZS5kZXRlY3RvcnNbdF0pe3ZhciByPWUuZGV0ZWN0b3JzW3RdLmxvb2t1cChlLm9wdGlvbnMpO3ImJiJzdHJpbmciPT10eXBlb2YgciYmKHI9W3JdKSxyJiYobj1uLmNvbmNhdChyKSl9fSk7dmFyIHI9dm9pZCAwO2lmKG4uZm9yRWFjaChmdW5jdGlvbih0KXtpZighcil7dmFyIG49ZS5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmZvcm1hdExhbmd1YWdlQ29kZSh0KTtlLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuaXNXaGl0ZWxpc3RlZChuKSYmKHI9bil9fSksIXIpe3ZhciBvPXRoaXMuaTE4bk9wdGlvbnMuZmFsbGJhY2tMbmc7InN0cmluZyI9PXR5cGVvZiBvJiYobz1bb10pLG98fChvPVtdKSxyPSJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KG8pP29bMF06b1swXXx8by5kZWZhdWx0JiZvLmRlZmF1bHRbMF19cmV0dXJuIHJ9fSx7a2V5OiJjYWNoZVVzZXJMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO2V8fChlPXRoaXMub3B0aW9ucy5jYWNoZXMpLGUmJih0aGlzLm9wdGlvbnMuZXhjbHVkZUNhY2hlRm9yJiZ0aGlzLm9wdGlvbnMuZXhjbHVkZUNhY2hlRm9yLmluZGV4T2YodCk+LTF8fGUuZm9yRWFjaChmdW5jdGlvbihlKXtuLmRldGVjdG9yc1tlXSYmbi5kZXRlY3RvcnNbZV0uY2FjaGVVc2VyTGFuZ3VhZ2UodCxuLm9wdGlvbnMpfSkpfX1dKSx0fSgpO2gudHlwZT0ibGFuZ3VhZ2VEZXRlY3RvciIsZS5kZWZhdWx0PWh9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZGVmYXVsdHM9ZnVuY3Rpb24odCl7cmV0dXJuIG8uY2FsbChpLmNhbGwoYXJndW1lbnRzLDEpLGZ1bmN0aW9uKGUpe2lmKGUpZm9yKHZhciBuIGluIGUpdm9pZCAwPT09dFtuXSYmKHRbbl09ZVtuXSl9KSx0fSxlLmV4dGVuZD1mdW5jdGlvbih0KXtyZXR1cm4gby5jYWxsKGkuY2FsbChhcmd1bWVudHMsMSksZnVuY3Rpb24oZSl7aWYoZSlmb3IodmFyIG4gaW4gZSl0W25dPWVbbl19KSx0fTt2YXIgcj1bXSxvPXIuZm9yRWFjaCxpPXIuc2xpY2V9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPXZvaWQgMDtpZihuKXt2YXIgaT1uZXcgRGF0ZTtpLnNldFRpbWUoaS5nZXRUaW1lKCkrNjAqbioxZTMpLG89IjsgZXhwaXJlcz0iK2kudG9HTVRTdHJpbmcoKX1lbHNlIG89IiI7cj1yPyJkb21haW49IityKyI7IjoiIixkb2N1bWVudC5jb29raWU9dCsiPSIrZStvKyI7IityKyJwYXRoPS8ifSxvPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10KyI9IixuPWRvY3VtZW50LmNvb2tpZS5zcGxpdCgiOyIpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7Zm9yKHZhciBvPW5bcl07IiAiPT09by5jaGFyQXQoMCk7KW89by5zdWJzdHJpbmcoMSxvLmxlbmd0aCk7aWYoMD09PW8uaW5kZXhPZihlKSlyZXR1cm4gby5zdWJzdHJpbmcoZS5sZW5ndGgsby5sZW5ndGgpfXJldHVybiBudWxsfTtlLmRlZmF1bHQ9e25hbWU6ImNvb2tpZSIsbG9va3VwOmZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMDtpZih0Lmxvb2t1cENvb2tpZSYmInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCl7dmFyIG49byh0Lmxvb2t1cENvb2tpZSk7biYmKGU9bil9cmV0dXJuIGV9LGNhY2hlVXNlckxhbmd1YWdlOmZ1bmN0aW9uKHQsZSl7ZS5sb29rdXBDb29raWUmJiJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJnIoZS5sb29rdXBDb29raWUsdCxlLmNvb2tpZU1pbnV0ZXMsZS5jb29raWVEb21haW4pfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZGVmYXVsdD17bmFtZToicXVlcnlzdHJpbmciLGxvb2t1cDpmdW5jdGlvbih0KXt2YXIgZT12b2lkIDA7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cpZm9yKHZhciBuPXdpbmRvdy5sb2NhdGlvbi5zZWFyY2guc3Vic3RyaW5nKDEpLnNwbGl0KCImIikscj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgbz1uW3JdLmluZGV4T2YoIj0iKTtpZihvPjApbltyXS5zdWJzdHJpbmcoMCxvKT09PXQubG9va3VwUXVlcnlzdHJpbmcmJihlPW5bcl0uc3Vic3RyaW5nKG8rMSkpfXJldHVybiBlfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPXZvaWQgMDt0cnl7cj0idW5kZWZpbmVkIiE9PXdpbmRvdyYmbnVsbCE9PXdpbmRvdy5sb2NhbFN0b3JhZ2U7d2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKCJpMThuZXh0LnRyYW5zbGF0ZS5ib28iLCJmb28iKSx3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oImkxOG5leHQudHJhbnNsYXRlLmJvbyIpfWNhdGNoKHQpe3I9ITF9ZS5kZWZhdWx0PXtuYW1lOiJsb2NhbFN0b3JhZ2UiLGxvb2t1cDpmdW5jdGlvbih0KXt2YXIgZT12b2lkIDA7aWYodC5sb29rdXBMb2NhbFN0b3JhZ2UmJnIpe3ZhciBuPXdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0Lmxvb2t1cExvY2FsU3RvcmFnZSk7biYmKGU9bil9cmV0dXJuIGV9LGNhY2hlVXNlckxhbmd1YWdlOmZ1bmN0aW9uKHQsZSl7ZS5sb29rdXBMb2NhbFN0b3JhZ2UmJnImJndpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShlLmxvb2t1cExvY2FsU3RvcmFnZSx0KX19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmRlZmF1bHQ9e25hbWU6Im5hdmlnYXRvciIsbG9va3VwOmZ1bmN0aW9uKHQpe3ZhciBlPVtdO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgbmF2aWdhdG9yKXtpZihuYXZpZ2F0b3IubGFuZ3VhZ2VzKWZvcih2YXIgbj0wO248bmF2aWdhdG9yLmxhbmd1YWdlcy5sZW5ndGg7bisrKWUucHVzaChuYXZpZ2F0b3IubGFuZ3VhZ2VzW25dKTtuYXZpZ2F0b3IudXNlckxhbmd1YWdlJiZlLnB1c2gobmF2aWdhdG9yLnVzZXJMYW5ndWFnZSksbmF2aWdhdG9yLmxhbmd1YWdlJiZlLnB1c2gobmF2aWdhdG9yLmxhbmd1YWdlKX1yZXR1cm4gZS5sZW5ndGg+MD9lOnZvaWQgMH19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlLmRlZmF1bHQ9e25hbWU6Imh0bWxUYWciLGxvb2t1cDpmdW5jdGlvbih0KXt2YXIgZT12b2lkIDAsbj10Lmh0bWxUYWd8fCgidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50P2RvY3VtZW50LmRvY3VtZW50RWxlbWVudDpudWxsKTtyZXR1cm4gbiYmImZ1bmN0aW9uIj09dHlwZW9mIG4uZ2V0QXR0cmlidXRlJiYoZT1uLmdldEF0dHJpYnV0ZSgibGFuZyIpKSxlfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZGVmYXVsdD17bmFtZToicGF0aCIsbG9va3VwOmZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyl7dmFyIG49d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLm1hdGNoKC9cLyhbYS16QS1aLV0qKS9nKTtpZihuIGluc3RhbmNlb2YgQXJyYXkpaWYoIm51bWJlciI9PXR5cGVvZiB0Lmxvb2t1cEZyb21QYXRoSW5kZXgpe2lmKCJzdHJpbmciIT10eXBlb2Ygblt0Lmxvb2t1cEZyb21QYXRoSW5kZXhdKXJldHVybjtlPW5bdC5sb29rdXBGcm9tUGF0aEluZGV4XS5yZXBsYWNlKCIvIiwiIil9ZWxzZSBlPW5bMF0ucmVwbGFjZSgiLyIsIiIpfXJldHVybiBlfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUuZGVmYXVsdD17bmFtZToic3ViZG9tYWluIixsb29rdXA6ZnVuY3Rpb24odCl7dmFyIGU9dm9pZCAwO2lmKCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93KXt2YXIgbj13aW5kb3cubG9jYXRpb24uaHJlZi5tYXRjaCgvKD86aHR0cFtzXSpcOlwvXC8pKiguKj8pXC4oPz1bXlwvXSpcLi57Miw1fSkvZ2kpO24gaW5zdGFuY2VvZiBBcnJheSYmKGU9Im51bWJlciI9PXR5cGVvZiB0Lmxvb2t1cEZyb21TdWJkb21haW5JbmRleD9uW3QubG9va3VwRnJvbVN1YmRvbWFpbkluZGV4XS5yZXBsYWNlKCJodHRwOi8vIiwiIikucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKS5yZXBsYWNlKCIuIiwiIik6blswXS5yZXBsYWNlKCJodHRwOi8vIiwiIikucmVwbGFjZSgiaHR0cHM6Ly8iLCIiKS5yZXBsYWNlKCIuIiwiIikpfXJldHVybiBlfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI3NCksbz1uKDEyNCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHIodCkpcmV0dXJuIG8odCl9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjc1KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDEwOSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEyNSksbz1uKDI3OCksaT1uKDEwMyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PWkmJm8oT2JqZWN0KHQpKSlyZXR1cm4gcih0KX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMTApfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjc5KX0sZnVuY3Rpb24odCxlLG4pe24oNTEpLG4oMzUpLHQuZXhwb3J0cz1uKDI4MCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDc2KSxvPW4oMiksaT1uKDMwKSxhPW8oIml0ZXJhdG9yIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPU9iamVjdCh0KTtyZXR1cm4gdm9pZCAwIT09ZVthXXx8IkBAaXRlcmF0b3IiaW4gZXx8aS5oYXNPd25Qcm9wZXJ0eShyKGUpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEyNSksbz1uKDI4MiksaT1uKDEyNCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG47aWYodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBpKHQsZSk7dmFyIGE9byhuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSkuY2FsbChuLDgsLTEpO3JldHVybiJPYmplY3QiPT09YSYmdC5jb25zdHJ1Y3RvciYmKGE9dC5jb25zdHJ1Y3Rvci5uYW1lKSwiTWFwIj09PWF8fCJTZXQiPT09YT9yKHQpOiJBcmd1bWVudHMiPT09YXx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QoYSk/aSh0LGUpOnZvaWQgMH19fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjgzKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDExNCl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjg2KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjg3KSxvPW4oMjg5KSxpPUFycmF5LnByb3RvdHlwZSxhPVN0cmluZy5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuaW5jbHVkZXM7cmV0dXJuIHQ9PT1pfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1pLmluY2x1ZGVzP3I6InN0cmluZyI9PXR5cGVvZiB0fHx0PT09YXx8dCBpbnN0YW5jZW9mIFN0cmluZyYmZT09PWEuaW5jbHVkZXM/bzplfX0sZnVuY3Rpb24odCxlLG4pe24oMjg4KTt2YXIgcj1uKDE4KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5pbmNsdWRlc30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDApLG89big2NykuaW5jbHVkZXMsaT1uKDc3KTtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMH0se2luY2x1ZGVzOmZ1bmN0aW9uKHQpe3JldHVybiBvKHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSksaSgiaW5jbHVkZXMiKX0sZnVuY3Rpb24odCxlLG4pe24oMjkwKTt2YXIgcj1uKDE4KTt0LmV4cG9ydHM9cigiU3RyaW5nIikuaW5jbHVkZXN9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigwKSxvPW4oMjkxKSxpPW4oNDYpO3Ioe3RhcmdldDoiU3RyaW5nIixwcm90bzohMCxmb3JjZWQ6IW4oMjkzKSgiaW5jbHVkZXMiKX0se2luY2x1ZGVzOmZ1bmN0aW9uKHQpe3JldHVybiEhflN0cmluZyhpKHRoaXMpKS5pbmRleE9mKG8odCksYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyOTIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZihyKHQpKXRocm93IFR5cGVFcnJvcigiVGhlIG1ldGhvZCBkb2Vzbid0IGFjY2VwdCByZWd1bGFyIGV4cHJlc3Npb25zIik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big3KSxvPW4oMjcpLGk9bigyKSgibWF0Y2giKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIHIodCkmJih2b2lkIDAhPT0oZT10W2ldKT8hIWU6IlJlZ0V4cCI9PW8odCkpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMikoIm1hdGNoIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPS8uLzt0cnl7Ii8uLyJbdF0oZSl9Y2F0Y2gobil7dHJ5e3JldHVybiBlW3JdPSExLCIvLi8iW3RdKGUpfWNhdGNoKHQpe319cmV0dXJuITF9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiOyhmdW5jdGlvbih0KXsKLyohCiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLgogKgogKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz4KICogQGxpY2Vuc2UgIE1JVAogKi8KdmFyIHI9bigyOTUpLG89bigyOTYpLGk9bigyOTcpO2Z1bmN0aW9uIGEoKXtyZXR1cm4gdS5UWVBFRF9BUlJBWV9TVVBQT1JUPzIxNDc0ODM2NDc6MTA3Mzc0MTgyM31mdW5jdGlvbiBzKHQsZSl7aWYoYSgpPGUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoIik7cmV0dXJuIHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odD1uZXcgVWludDhBcnJheShlKSkuX19wcm90b19fPXUucHJvdG90eXBlOihudWxsPT09dCYmKHQ9bmV3IHUoZSkpLHQubGVuZ3RoPWUpLHR9ZnVuY3Rpb24gdSh0LGUsbil7aWYoISh1LlRZUEVEX0FSUkFZX1NVUFBPUlR8fHRoaXMgaW5zdGFuY2VvZiB1KSlyZXR1cm4gbmV3IHUodCxlLG4pO2lmKCJudW1iZXIiPT10eXBlb2YgdCl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigiSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmciKTtyZXR1cm4gZih0aGlzLHQpfXJldHVybiBjKHRoaXMsdCxlLG4pfWZ1bmN0aW9uIGModCxlLG4scil7aWYoIm51bWJlciI9PXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKTtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI/ZnVuY3Rpb24odCxlLG4scil7aWYoZS5ieXRlTGVuZ3RoLG48MHx8ZS5ieXRlTGVuZ3RoPG4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidvZmZzZXQnIGlzIG91dCBvZiBib3VuZHMiKTtpZihlLmJ5dGVMZW5ndGg8bisocnx8MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidsZW5ndGgnIGlzIG91dCBvZiBib3VuZHMiKTtlPXZvaWQgMD09PW4mJnZvaWQgMD09PXI/bmV3IFVpbnQ4QXJyYXkoZSk6dm9pZCAwPT09cj9uZXcgVWludDhBcnJheShlLG4pOm5ldyBVaW50OEFycmF5KGUsbixyKTt1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHQ9ZSkuX19wcm90b19fPXUucHJvdG90eXBlOnQ9cCh0LGUpO3JldHVybiB0fSh0LGUsbixyKToic3RyaW5nIj09dHlwZW9mIGU/ZnVuY3Rpb24odCxlLG4peyJzdHJpbmciPT10eXBlb2YgbiYmIiIhPT1ufHwobj0idXRmOCIpO2lmKCF1LmlzRW5jb2RpbmcobikpdGhyb3cgbmV3IFR5cGVFcnJvcignImVuY29kaW5nIiBtdXN0IGJlIGEgdmFsaWQgc3RyaW5nIGVuY29kaW5nJyk7dmFyIHI9MHxkKGUsbiksbz0odD1zKHQscikpLndyaXRlKGUsbik7byE9PXImJih0PXQuc2xpY2UoMCxvKSk7cmV0dXJuIHR9KHQsZSxuKTpmdW5jdGlvbih0LGUpe2lmKHUuaXNCdWZmZXIoZSkpe3ZhciBuPTB8aChlLmxlbmd0aCk7cmV0dXJuIDA9PT0odD1zKHQsbikpLmxlbmd0aD90OihlLmNvcHkodCwwLDAsbiksdCl9aWYoZSl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmZS5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcnx8Imxlbmd0aCJpbiBlKXJldHVybiJudW1iZXIiIT10eXBlb2YgZS5sZW5ndGh8fChyPWUubGVuZ3RoKSE9cj9zKHQsMCk6cCh0LGUpO2lmKCJCdWZmZXIiPT09ZS50eXBlJiZpKGUuZGF0YSkpcmV0dXJuIHAodCxlLmRhdGEpfXZhciByO3Rocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4iKX0odCxlKX1mdW5jdGlvbiBsKHQpe2lmKCJudW1iZXIiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpO2lmKHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJyl9ZnVuY3Rpb24gZih0LGUpe2lmKGwoZSksdD1zKHQsZTwwPzA6MHxoKGUpKSwhdS5UWVBFRF9BUlJBWV9TVVBQT1JUKWZvcih2YXIgbj0wO248ZTsrK24pdFtuXT0wO3JldHVybiB0fWZ1bmN0aW9uIHAodCxlKXt2YXIgbj1lLmxlbmd0aDwwPzA6MHxoKGUubGVuZ3RoKTt0PXModCxuKTtmb3IodmFyIHI9MDtyPG47cis9MSl0W3JdPTI1NSZlW3JdO3JldHVybiB0fWZ1bmN0aW9uIGgodCl7aWYodD49YSgpKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtIHNpemU6IDB4IithKCkudG9TdHJpbmcoMTYpKyIgYnl0ZXMiKTtyZXR1cm4gMHx0fWZ1bmN0aW9uIGQodCxlKXtpZih1LmlzQnVmZmVyKHQpKXJldHVybiB0Lmxlbmd0aDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiYiZnVuY3Rpb24iPT10eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3JiYoQXJyYXlCdWZmZXIuaXNWaWV3KHQpfHx0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKXJldHVybiB0LmJ5dGVMZW5ndGg7InN0cmluZyIhPXR5cGVvZiB0JiYodD0iIit0KTt2YXIgbj10Lmxlbmd0aDtpZigwPT09bilyZXR1cm4gMDtmb3IodmFyIHI9ITE7Oylzd2l0Y2goZSl7Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gbjtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2Ugdm9pZCAwOnJldHVybiBGKHQpLmxlbmd0aDtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIDIqbjtjYXNlImhleCI6cmV0dXJuIG4+Pj4xO2Nhc2UiYmFzZTY0IjpyZXR1cm4gSCh0KS5sZW5ndGg7ZGVmYXVsdDppZihyKXJldHVybiBGKHQpLmxlbmd0aDtlPSgiIitlKS50b0xvd2VyQ2FzZSgpLHI9ITB9fWZ1bmN0aW9uIGcodCxlLG4pe3ZhciByPSExO2lmKCh2b2lkIDA9PT1lfHxlPDApJiYoZT0wKSxlPnRoaXMubGVuZ3RoKXJldHVybiIiO2lmKCh2b2lkIDA9PT1ufHxuPnRoaXMubGVuZ3RoKSYmKG49dGhpcy5sZW5ndGgpLG48PTApcmV0dXJuIiI7aWYoKG4+Pj49MCk8PShlPj4+PTApKXJldHVybiIiO2Zvcih0fHwodD0idXRmOCIpOzspc3dpdGNoKHQpe2Nhc2UiaGV4IjpyZXR1cm4gTCh0aGlzLGUsbik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gVCh0aGlzLGUsbik7Y2FzZSJhc2NpaSI6cmV0dXJuIEEodGhpcyxlLG4pO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIEModGhpcyxlLG4pO2Nhc2UiYmFzZTY0IjpyZXR1cm4gaih0aGlzLGUsbik7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiBSKHRoaXMsZSxuKTtkZWZhdWx0OmlmKHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIit0KTt0PSh0KyIiKS50b0xvd2VyQ2FzZSgpLHI9ITB9fWZ1bmN0aW9uIHYodCxlLG4pe3ZhciByPXRbZV07dFtlXT10W25dLHRbbl09cn1mdW5jdGlvbiB5KHQsZSxuLHIsbyl7aWYoMD09PXQubGVuZ3RoKXJldHVybi0xO2lmKCJzdHJpbmciPT10eXBlb2Ygbj8ocj1uLG49MCk6bj4yMTQ3NDgzNjQ3P249MjE0NzQ4MzY0NzpuPC0yMTQ3NDgzNjQ4JiYobj0tMjE0NzQ4MzY0OCksbj0rbixpc05hTihuKSYmKG49bz8wOnQubGVuZ3RoLTEpLG48MCYmKG49dC5sZW5ndGgrbiksbj49dC5sZW5ndGgpe2lmKG8pcmV0dXJuLTE7bj10Lmxlbmd0aC0xfWVsc2UgaWYobjwwKXtpZighbylyZXR1cm4tMTtuPTB9aWYoInN0cmluZyI9PXR5cGVvZiBlJiYoZT11LmZyb20oZSxyKSksdS5pc0J1ZmZlcihlKSlyZXR1cm4gMD09PWUubGVuZ3RoPy0xOm0odCxlLG4scixvKTtpZigibnVtYmVyIj09dHlwZW9mIGUpcmV0dXJuIGUmPTI1NSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQmJiJmdW5jdGlvbiI9PXR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mP28/VWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHQsZSxuKTpVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKHQsZSxuKTptKHQsW2VdLG4scixvKTt0aHJvdyBuZXcgVHlwZUVycm9yKCJ2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXIiKX1mdW5jdGlvbiBtKHQsZSxuLHIsbyl7dmFyIGksYT0xLHM9dC5sZW5ndGgsdT1lLmxlbmd0aDtpZih2b2lkIDAhPT1yJiYoInVjczIiPT09KHI9U3RyaW5nKHIpLnRvTG93ZXJDYXNlKCkpfHwidWNzLTIiPT09cnx8InV0ZjE2bGUiPT09cnx8InV0Zi0xNmxlIj09PXIpKXtpZih0Lmxlbmd0aDwyfHxlLmxlbmd0aDwyKXJldHVybi0xO2E9MixzLz0yLHUvPTIsbi89Mn1mdW5jdGlvbiBjKHQsZSl7cmV0dXJuIDE9PT1hP3RbZV06dC5yZWFkVUludDE2QkUoZSphKX1pZihvKXt2YXIgbD0tMTtmb3IoaT1uO2k8cztpKyspaWYoYyh0LGkpPT09YyhlLC0xPT09bD8wOmktbCkpe2lmKC0xPT09bCYmKGw9aSksaS1sKzE9PT11KXJldHVybiBsKmF9ZWxzZS0xIT09bCYmKGktPWktbCksbD0tMX1lbHNlIGZvcihuK3U+cyYmKG49cy11KSxpPW47aT49MDtpLS0pe2Zvcih2YXIgZj0hMCxwPTA7cDx1O3ArKylpZihjKHQsaStwKSE9PWMoZSxwKSl7Zj0hMTticmVha31pZihmKXJldHVybiBpfXJldHVybi0xfWZ1bmN0aW9uIGIodCxlLG4scil7bj1OdW1iZXIobil8fDA7dmFyIG89dC5sZW5ndGgtbjtyPyhyPU51bWJlcihyKSk+byYmKHI9byk6cj1vO3ZhciBpPWUubGVuZ3RoO2lmKGklMiE9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGhleCBzdHJpbmciKTtyPmkvMiYmKHI9aS8yKTtmb3IodmFyIGE9MDthPHI7KythKXt2YXIgcz1wYXJzZUludChlLnN1YnN0cigyKmEsMiksMTYpO2lmKGlzTmFOKHMpKXJldHVybiBhO3RbbithXT1zfXJldHVybiBhfWZ1bmN0aW9uIHgodCxlLG4scil7cmV0dXJuIHooRihlLHQubGVuZ3RoLW4pLHQsbixyKX1mdW5jdGlvbiB3KHQsZSxuLHIpe3JldHVybiB6KGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTA7bjx0Lmxlbmd0aDsrK24pZS5wdXNoKDI1NSZ0LmNoYXJDb2RlQXQobikpO3JldHVybiBlfShlKSx0LG4scil9ZnVuY3Rpb24gayh0LGUsbixyKXtyZXR1cm4gdyh0LGUsbixyKX1mdW5jdGlvbiBTKHQsZSxuLHIpe3JldHVybiB6KEgoZSksdCxuLHIpfWZ1bmN0aW9uIEUodCxlLG4scil7cmV0dXJuIHooZnVuY3Rpb24odCxlKXtmb3IodmFyIG4scixvLGk9W10sYT0wO2E8dC5sZW5ndGgmJiEoKGUtPTIpPDApOysrYSluPXQuY2hhckNvZGVBdChhKSxyPW4+Pjgsbz1uJTI1NixpLnB1c2gobyksaS5wdXNoKHIpO3JldHVybiBpfShlLHQubGVuZ3RoLW4pLHQsbixyKX1mdW5jdGlvbiBqKHQsZSxuKXtyZXR1cm4gMD09PWUmJm49PT10Lmxlbmd0aD9yLmZyb21CeXRlQXJyYXkodCk6ci5mcm9tQnl0ZUFycmF5KHQuc2xpY2UoZSxuKSl9ZnVuY3Rpb24gVCh0LGUsbil7bj1NYXRoLm1pbih0Lmxlbmd0aCxuKTtmb3IodmFyIHI9W10sbz1lO288bjspe3ZhciBpLGEscyx1LGM9dFtvXSxsPW51bGwsZj1jPjIzOT80OmM+MjIzPzM6Yz4xOTE/MjoxO2lmKG8rZjw9bilzd2l0Y2goZil7Y2FzZSAxOmM8MTI4JiYobD1jKTticmVhaztjYXNlIDI6MTI4PT0oMTkyJihpPXRbbysxXSkpJiYodT0oMzEmYyk8PDZ8NjMmaSk+MTI3JiYobD11KTticmVhaztjYXNlIDM6aT10W28rMV0sYT10W28rMl0sMTI4PT0oMTkyJmkpJiYxMjg9PSgxOTImYSkmJih1PSgxNSZjKTw8MTJ8KDYzJmkpPDw2fDYzJmEpPjIwNDcmJih1PDU1Mjk2fHx1PjU3MzQzKSYmKGw9dSk7YnJlYWs7Y2FzZSA0Omk9dFtvKzFdLGE9dFtvKzJdLHM9dFtvKzNdLDEyOD09KDE5MiZpKSYmMTI4PT0oMTkyJmEpJiYxMjg9PSgxOTImcykmJih1PSgxNSZjKTw8MTh8KDYzJmkpPDwxMnwoNjMmYSk8PDZ8NjMmcyk+NjU1MzUmJnU8MTExNDExMiYmKGw9dSl9bnVsbD09PWw/KGw9NjU1MzMsZj0xKTpsPjY1NTM1JiYobC09NjU1MzYsci5wdXNoKGw+Pj4xMCYxMDIzfDU1Mjk2KSxsPTU2MzIwfDEwMjMmbCksci5wdXNoKGwpLG8rPWZ9cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGU8PU8pcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHQpO3ZhciBuPSIiLHI9MDtmb3IoO3I8ZTspbis9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsdC5zbGljZShyLHIrPU8pKTtyZXR1cm4gbn0ocil9ZS5CdWZmZXI9dSxlLlNsb3dCdWZmZXI9ZnVuY3Rpb24odCl7K3QhPXQmJih0PTApO3JldHVybiB1LmFsbG9jKCt0KX0sZS5JTlNQRUNUX01BWF9CWVRFUz01MCx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ9dm9pZCAwIT09dC5UWVBFRF9BUlJBWV9TVVBQT1JUP3QuVFlQRURfQVJSQVlfU1VQUE9SVDpmdW5jdGlvbigpe3RyeXt2YXIgdD1uZXcgVWludDhBcnJheSgxKTtyZXR1cm4gdC5fX3Byb3RvX189e19fcHJvdG9fXzpVaW50OEFycmF5LnByb3RvdHlwZSxmb286ZnVuY3Rpb24oKXtyZXR1cm4gNDJ9fSw0Mj09PXQuZm9vKCkmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnN1YmFycmF5JiYwPT09dC5zdWJhcnJheSgxLDEpLmJ5dGVMZW5ndGh9Y2F0Y2godCl7cmV0dXJuITF9fSgpLGUua01heExlbmd0aD1hKCksdS5wb29sU2l6ZT04MTkyLHUuX2F1Z21lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19wcm90b19fPXUucHJvdG90eXBlLHR9LHUuZnJvbT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGMobnVsbCx0LGUsbil9LHUuVFlQRURfQVJSQVlfU1VQUE9SVCYmKHUucHJvdG90eXBlLl9fcHJvdG9fXz1VaW50OEFycmF5LnByb3RvdHlwZSx1Ll9fcHJvdG9fXz1VaW50OEFycmF5LCJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuc3BlY2llcyYmdVtTeW1ib2wuc3BlY2llc109PT11JiZPYmplY3QuZGVmaW5lUHJvcGVydHkodSxTeW1ib2wuc3BlY2llcyx7dmFsdWU6bnVsbCxjb25maWd1cmFibGU6ITB9KSksdS5hbGxvYz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBsKGUpLGU8PTA/cyh0LGUpOnZvaWQgMCE9PW4/InN0cmluZyI9PXR5cGVvZiByP3ModCxlKS5maWxsKG4scik6cyh0LGUpLmZpbGwobik6cyh0LGUpfShudWxsLHQsZSxuKX0sdS5hbGxvY1Vuc2FmZT1mdW5jdGlvbih0KXtyZXR1cm4gZihudWxsLHQpfSx1LmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbih0KXtyZXR1cm4gZihudWxsLHQpfSx1LmlzQnVmZmVyPWZ1bmN0aW9uKHQpe3JldHVybiEobnVsbD09dHx8IXQuX2lzQnVmZmVyKX0sdS5jb21wYXJlPWZ1bmN0aW9uKHQsZSl7aWYoIXUuaXNCdWZmZXIodCl8fCF1LmlzQnVmZmVyKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMiKTtpZih0PT09ZSlyZXR1cm4gMDtmb3IodmFyIG49dC5sZW5ndGgscj1lLmxlbmd0aCxvPTAsaT1NYXRoLm1pbihuLHIpO288aTsrK28paWYodFtvXSE9PWVbb10pe249dFtvXSxyPWVbb107YnJlYWt9cmV0dXJuIG48cj8tMTpyPG4/MTowfSx1LmlzRW5jb2Rpbmc9ZnVuY3Rpb24odCl7c3dpdGNoKFN0cmluZyh0KS50b0xvd2VyQ2FzZSgpKXtjYXNlImhleCI6Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19LHUuY29uY2F0PWZ1bmN0aW9uKHQsZSl7aWYoIWkodCkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2lmKDA9PT10Lmxlbmd0aClyZXR1cm4gdS5hbGxvYygwKTt2YXIgbjtpZih2b2lkIDA9PT1lKWZvcihlPTAsbj0wO248dC5sZW5ndGg7KytuKWUrPXRbbl0ubGVuZ3RoO3ZhciByPXUuYWxsb2NVbnNhZmUoZSksbz0wO2ZvcihuPTA7bjx0Lmxlbmd0aDsrK24pe3ZhciBhPXRbbl07aWYoIXUuaXNCdWZmZXIoYSkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2EuY29weShyLG8pLG8rPWEubGVuZ3RofXJldHVybiByfSx1LmJ5dGVMZW5ndGg9ZCx1LnByb3RvdHlwZS5faXNCdWZmZXI9ITAsdS5wcm90b3R5cGUuc3dhcDE2PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCUyIT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz0yKXYodGhpcyxlLGUrMSk7cmV0dXJuIHRoaXN9LHUucHJvdG90eXBlLnN3YXAzMj1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlNCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9NCl2KHRoaXMsZSxlKzMpLHYodGhpcyxlKzEsZSsyKTtyZXR1cm4gdGhpc30sdS5wcm90b3R5cGUuc3dhcDY0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5sZW5ndGg7aWYodCU4IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cyIpO2Zvcih2YXIgZT0wO2U8dDtlKz04KXYodGhpcyxlLGUrNyksdih0aGlzLGUrMSxlKzYpLHYodGhpcyxlKzIsZSs1KSx2KHRoaXMsZSszLGUrNCk7cmV0dXJuIHRoaXN9LHUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHQ9MHx0aGlzLmxlbmd0aDtyZXR1cm4gMD09PXQ/IiI6MD09PWFyZ3VtZW50cy5sZW5ndGg/VCh0aGlzLDAsdCk6Zy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHUucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtpZighdS5pc0J1ZmZlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7cmV0dXJuIHRoaXM9PT10fHwwPT09dS5jb21wYXJlKHRoaXMsdCl9LHUucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXt2YXIgdD0iIixuPWUuSU5TUEVDVF9NQVhfQllURVM7cmV0dXJuIHRoaXMubGVuZ3RoPjAmJih0PXRoaXMudG9TdHJpbmcoImhleCIsMCxuKS5tYXRjaCgvLnsyfS9nKS5qb2luKCIgIiksdGhpcy5sZW5ndGg+biYmKHQrPSIgLi4uICIpKSwiPEJ1ZmZlciAiK3QrIj4ifSx1LnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKHQsZSxuLHIsbyl7aWYoIXUuaXNCdWZmZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO2lmKHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PW4mJihuPXQ/dC5sZW5ndGg6MCksdm9pZCAwPT09ciYmKHI9MCksdm9pZCAwPT09byYmKG89dGhpcy5sZW5ndGgpLGU8MHx8bj50Lmxlbmd0aHx8cjwwfHxvPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihyPj1vJiZlPj1uKXJldHVybiAwO2lmKHI+PW8pcmV0dXJuLTE7aWYoZT49bilyZXR1cm4gMTtpZih0aGlzPT09dClyZXR1cm4gMDtmb3IodmFyIGk9KG8+Pj49MCktKHI+Pj49MCksYT0obj4+Pj0wKS0oZT4+Pj0wKSxzPU1hdGgubWluKGksYSksYz10aGlzLnNsaWNlKHIsbyksbD10LnNsaWNlKGUsbiksZj0wO2Y8czsrK2YpaWYoY1tmXSE9PWxbZl0pe2k9Y1tmXSxhPWxbZl07YnJlYWt9cmV0dXJuIGk8YT8tMTphPGk/MTowfSx1LnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbih0LGUsbil7cmV0dXJuLTEhPT10aGlzLmluZGV4T2YodCxlLG4pfSx1LnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4geSh0aGlzLHQsZSxuLCEwKX0sdS5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB5KHRoaXMsdCxlLG4sITEpfSx1LnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbih0LGUsbixyKXtpZih2b2lkIDA9PT1lKXI9InV0ZjgiLG49dGhpcy5sZW5ndGgsZT0wO2Vsc2UgaWYodm9pZCAwPT09biYmInN0cmluZyI9PXR5cGVvZiBlKXI9ZSxuPXRoaXMubGVuZ3RoLGU9MDtlbHNle2lmKCFpc0Zpbml0ZShlKSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7ZXw9MCxpc0Zpbml0ZShuKT8obnw9MCx2b2lkIDA9PT1yJiYocj0idXRmOCIpKToocj1uLG49dm9pZCAwKX12YXIgbz10aGlzLmxlbmd0aC1lO2lmKCh2b2lkIDA9PT1ufHxuPm8pJiYobj1vKSx0Lmxlbmd0aD4wJiYobjwwfHxlPDApfHxlPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO3J8fChyPSJ1dGY4Iik7Zm9yKHZhciBpPSExOzspc3dpdGNoKHIpe2Nhc2UiaGV4IjpyZXR1cm4gYih0aGlzLHQsZSxuKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiB4KHRoaXMsdCxlLG4pO2Nhc2UiYXNjaWkiOnJldHVybiB3KHRoaXMsdCxlLG4pO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIGsodGhpcyx0LGUsbik7Y2FzZSJiYXNlNjQiOnJldHVybiBTKHRoaXMsdCxlLG4pO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gRSh0aGlzLHQsZSxuKTtkZWZhdWx0OmlmKGkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIityKTtyPSgiIityKS50b0xvd2VyQ2FzZSgpLGk9ITB9fSx1LnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiQnVmZmVyIixkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2Fycnx8dGhpcywwKX19O3ZhciBPPTQwOTY7ZnVuY3Rpb24gQSh0LGUsbil7dmFyIHI9IiI7bj1NYXRoLm1pbih0Lmxlbmd0aCxuKTtmb3IodmFyIG89ZTtvPG47KytvKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI3JnRbb10pO3JldHVybiByfWZ1bmN0aW9uIEModCxlLG4pe3ZhciByPSIiO249TWF0aC5taW4odC5sZW5ndGgsbik7Zm9yKHZhciBvPWU7bzxuOysrbylyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHRbb10pO3JldHVybiByfWZ1bmN0aW9uIEwodCxlLG4pe3ZhciByPXQubGVuZ3RoOyghZXx8ZTwwKSYmKGU9MCksKCFufHxuPDB8fG4+cikmJihuPXIpO2Zvcih2YXIgbz0iIixpPWU7aTxuOysraSlvKz1xKHRbaV0pO3JldHVybiBvfWZ1bmN0aW9uIFIodCxlLG4pe2Zvcih2YXIgcj10LnNsaWNlKGUsbiksbz0iIixpPTA7aTxyLmxlbmd0aDtpKz0yKW8rPVN0cmluZy5mcm9tQ2hhckNvZGUocltpXSsyNTYqcltpKzFdKTtyZXR1cm4gb31mdW5jdGlvbiBQKHQsZSxuKXtpZih0JTEhPTB8fHQ8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib2Zmc2V0IGlzIG5vdCB1aW50Iik7aWYodCtlPm4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIlRyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgiKX1mdW5jdGlvbiBOKHQsZSxuLHIsbyxpKXtpZighdS5pc0J1ZmZlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCciYnVmZmVyIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJyk7aWYoZT5vfHxlPGkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJ2YWx1ZSIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpO2lmKG4rcj50Lmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gSSh0LGUsbixyKXtlPDAmJihlPTY1NTM1K2UrMSk7Zm9yKHZhciBvPTAsaT1NYXRoLm1pbih0Lmxlbmd0aC1uLDIpO288aTsrK28pdFtuK29dPShlJjI1NTw8OCoocj9vOjEtbykpPj4+OCoocj9vOjEtbyl9ZnVuY3Rpb24gXyh0LGUsbixyKXtlPDAmJihlPTQyOTQ5NjcyOTUrZSsxKTtmb3IodmFyIG89MCxpPU1hdGgubWluKHQubGVuZ3RoLW4sNCk7bzxpOysrbyl0W24rb109ZT4+PjgqKHI/bzozLW8pJjI1NX1mdW5jdGlvbiBEKHQsZSxuLHIsbyxpKXtpZihuK3I+dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpO2lmKG48MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gTSh0LGUsbixyLGkpe3JldHVybiBpfHxEKHQsMCxuLDQpLG8ud3JpdGUodCxlLG4sciwyMyw0KSxuKzR9ZnVuY3Rpb24gVSh0LGUsbixyLGkpe3JldHVybiBpfHxEKHQsMCxuLDgpLG8ud3JpdGUodCxlLG4sciw1Miw4KSxuKzh9dS5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24odCxlKXt2YXIgbixyPXRoaXMubGVuZ3RoO2lmKCh0PX5+dCk8MD8odCs9cik8MCYmKHQ9MCk6dD5yJiYodD1yKSwoZT12b2lkIDA9PT1lP3I6fn5lKTwwPyhlKz1yKTwwJiYoZT0wKTplPnImJihlPXIpLGU8dCYmKGU9dCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUKShuPXRoaXMuc3ViYXJyYXkodCxlKSkuX19wcm90b19fPXUucHJvdG90eXBlO2Vsc2V7dmFyIG89ZS10O249bmV3IHUobyx2b2lkIDApO2Zvcih2YXIgaT0wO2k8bzsrK2kpbltpXT10aGlzW2krdF19cmV0dXJuIG59LHUucHJvdG90eXBlLnJlYWRVSW50TEU9ZnVuY3Rpb24odCxlLG4pe3R8PTAsZXw9MCxufHxQKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXRoaXNbdF0sbz0xLGk9MDsrK2k8ZSYmKG8qPTI1Nik7KXIrPXRoaXNbdCtpXSpvO3JldHVybiByfSx1LnByb3RvdHlwZS5yZWFkVUludEJFPWZ1bmN0aW9uKHQsZSxuKXt0fD0wLGV8PTAsbnx8UCh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW3QrLS1lXSxvPTE7ZT4wJiYobyo9MjU2KTspcis9dGhpc1t0Ky0tZV0qbztyZXR1cm4gcn0sdS5wcm90b3R5cGUucmVhZFVJbnQ4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCwxLHRoaXMubGVuZ3RoKSx0aGlzW3RdfSx1LnByb3RvdHlwZS5yZWFkVUludDE2TEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8UCh0LDIsdGhpcy5sZW5ndGgpLHRoaXNbdF18dGhpc1t0KzFdPDw4fSx1LnByb3RvdHlwZS5yZWFkVUludDE2QkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8UCh0LDIsdGhpcy5sZW5ndGgpLHRoaXNbdF08PDh8dGhpc1t0KzFdfSx1LnByb3RvdHlwZS5yZWFkVUludDMyTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8UCh0LDQsdGhpcy5sZW5ndGgpLCh0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2KSsxNjc3NzIxNip0aGlzW3QrM119LHUucHJvdG90eXBlLnJlYWRVSW50MzJCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxQKHQsNCx0aGlzLmxlbmd0aCksMTY3NzcyMTYqdGhpc1t0XSsodGhpc1t0KzFdPDwxNnx0aGlzW3QrMl08PDh8dGhpc1t0KzNdKX0sdS5wcm90b3R5cGUucmVhZEludExFPWZ1bmN0aW9uKHQsZSxuKXt0fD0wLGV8PTAsbnx8UCh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW3RdLG89MSxpPTA7KytpPGUmJihvKj0yNTYpOylyKz10aGlzW3QraV0qbztyZXR1cm4gcj49KG8qPTEyOCkmJihyLT1NYXRoLnBvdygyLDgqZSkpLHJ9LHUucHJvdG90eXBlLnJlYWRJbnRCRT1mdW5jdGlvbih0LGUsbil7dHw9MCxlfD0wLG58fFAodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9ZSxvPTEsaT10aGlzW3QrLS1yXTtyPjAmJihvKj0yNTYpOylpKz10aGlzW3QrLS1yXSpvO3JldHVybiBpPj0obyo9MTI4KSYmKGktPU1hdGgucG93KDIsOCplKSksaX0sdS5wcm90b3R5cGUucmVhZEludDg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8UCh0LDEsdGhpcy5sZW5ndGgpLDEyOCZ0aGlzW3RdPy0xKigyNTUtdGhpc1t0XSsxKTp0aGlzW3RdfSx1LnByb3RvdHlwZS5yZWFkSW50MTZMRT1mdW5jdGlvbih0LGUpe2V8fFAodCwyLHRoaXMubGVuZ3RoKTt2YXIgbj10aGlzW3RdfHRoaXNbdCsxXTw8ODtyZXR1cm4gMzI3Njgmbj80Mjk0OTAxNzYwfG46bn0sdS5wcm90b3R5cGUucmVhZEludDE2QkU9ZnVuY3Rpb24odCxlKXtlfHxQKHQsMix0aGlzLmxlbmd0aCk7dmFyIG49dGhpc1t0KzFdfHRoaXNbdF08PDg7cmV0dXJuIDMyNzY4Jm4/NDI5NDkwMTc2MHxuOm59LHUucHJvdG90eXBlLnJlYWRJbnQzMkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCw0LHRoaXMubGVuZ3RoKSx0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2fHRoaXNbdCszXTw8MjR9LHUucHJvdG90eXBlLnJlYWRJbnQzMkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCw0LHRoaXMubGVuZ3RoKSx0aGlzW3RdPDwyNHx0aGlzW3QrMV08PDE2fHRoaXNbdCsyXTw8OHx0aGlzW3QrM119LHUucHJvdG90eXBlLnJlYWRGbG9hdExFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCw0LHRoaXMubGVuZ3RoKSxvLnJlYWQodGhpcyx0LCEwLDIzLDQpfSx1LnByb3RvdHlwZS5yZWFkRmxvYXRCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxQKHQsNCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsdCwhMSwyMyw0KX0sdS5wcm90b3R5cGUucmVhZERvdWJsZUxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFAodCw4LHRoaXMubGVuZ3RoKSxvLnJlYWQodGhpcyx0LCEwLDUyLDgpfSx1LnByb3RvdHlwZS5yZWFkRG91YmxlQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8UCh0LDgsdGhpcy5sZW5ndGgpLG8ucmVhZCh0aGlzLHQsITEsNTIsOCl9LHUucHJvdG90eXBlLndyaXRlVUludExFPWZ1bmN0aW9uKHQsZSxuLHIpeyh0PSt0LGV8PTAsbnw9MCxyKXx8Tih0aGlzLHQsZSxuLE1hdGgucG93KDIsOCpuKS0xLDApO3ZhciBvPTEsaT0wO2Zvcih0aGlzW2VdPTI1NSZ0OysraTxuJiYobyo9MjU2KTspdGhpc1tlK2ldPXQvbyYyNTU7cmV0dXJuIGUrbn0sdS5wcm90b3R5cGUud3JpdGVVSW50QkU9ZnVuY3Rpb24odCxlLG4scil7KHQ9K3QsZXw9MCxufD0wLHIpfHxOKHRoaXMsdCxlLG4sTWF0aC5wb3coMiw4Km4pLTEsMCk7dmFyIG89bi0xLGk9MTtmb3IodGhpc1tlK29dPTI1NSZ0Oy0tbz49MCYmKGkqPTI1Nik7KXRoaXNbZStvXT10L2kmMjU1O3JldHVybiBlK259LHUucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSwxLDI1NSwwKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlR8fCh0PU1hdGguZmxvb3IodCkpLHRoaXNbZV09MjU1JnQsZSsxfSx1LnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsMiw2NTUzNSwwKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44KTpJKHRoaXMsdCxlLCEwKSxlKzJ9LHUucHJvdG90eXBlLndyaXRlVUludDE2QkU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSwyLDY1NTM1LDApLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+OCx0aGlzW2UrMV09MjU1JnQpOkkodGhpcyx0LGUsITEpLGUrMn0sdS5wcm90b3R5cGUud3JpdGVVSW50MzJMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDQsNDI5NDk2NzI5NSwwKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZSszXT10Pj4+MjQsdGhpc1tlKzJdPXQ+Pj4xNix0aGlzW2UrMV09dD4+PjgsdGhpc1tlXT0yNTUmdCk6Xyh0aGlzLHQsZSwhMCksZSs0fSx1LnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsNCw0Mjk0OTY3Mjk1LDApLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT10Pj4+MjQsdGhpc1tlKzFdPXQ+Pj4xNix0aGlzW2UrMl09dD4+PjgsdGhpc1tlKzNdPTI1NSZ0KTpfKHRoaXMsdCxlLCExKSxlKzR9LHUucHJvdG90eXBlLndyaXRlSW50TEU9ZnVuY3Rpb24odCxlLG4scil7aWYodD0rdCxlfD0wLCFyKXt2YXIgbz1NYXRoLnBvdygyLDgqbi0xKTtOKHRoaXMsdCxlLG4sby0xLC1vKX12YXIgaT0wLGE9MSxzPTA7Zm9yKHRoaXNbZV09MjU1JnQ7KytpPG4mJihhKj0yNTYpOyl0PDAmJjA9PT1zJiYwIT09dGhpc1tlK2ktMV0mJihzPTEpLHRoaXNbZStpXT0odC9hPj4wKS1zJjI1NTtyZXR1cm4gZStufSx1LnByb3RvdHlwZS53cml0ZUludEJFPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQ9K3QsZXw9MCwhcil7dmFyIG89TWF0aC5wb3coMiw4Km4tMSk7Tih0aGlzLHQsZSxuLG8tMSwtbyl9dmFyIGk9bi0xLGE9MSxzPTA7Zm9yKHRoaXNbZStpXT0yNTUmdDstLWk+PTAmJihhKj0yNTYpOyl0PDAmJjA9PT1zJiYwIT09dGhpc1tlK2krMV0mJihzPTEpLHRoaXNbZStpXT0odC9hPj4wKS1zJjI1NTtyZXR1cm4gZStufSx1LnByb3RvdHlwZS53cml0ZUludDg9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Tih0aGlzLHQsZSwxLDEyNywtMTI4KSx1LlRZUEVEX0FSUkFZX1NVUFBPUlR8fCh0PU1hdGguZmxvb3IodCkpLHQ8MCYmKHQ9MjU1K3QrMSksdGhpc1tlXT0yNTUmdCxlKzF9LHUucHJvdG90eXBlLndyaXRlSW50MTZMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDIsMzI3NjcsLTMyNzY4KSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09MjU1JnQsdGhpc1tlKzFdPXQ+Pj44KTpJKHRoaXMsdCxlLCEwKSxlKzJ9LHUucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDIsMzI3NjcsLTMyNzY4KSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjgsdGhpc1tlKzFdPTI1NSZ0KTpJKHRoaXMsdCxlLCExKSxlKzJ9LHUucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxOKHRoaXMsdCxlLDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCx0aGlzW2UrMl09dD4+PjE2LHRoaXNbZSszXT10Pj4+MjQpOl8odGhpcyx0LGUsITApLGUrNH0sdS5wcm90b3R5cGUud3JpdGVJbnQzMkJFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fE4odGhpcyx0LGUsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSx0PDAmJih0PTQyOTQ5NjcyOTUrdCsxKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjI0LHRoaXNbZSsxXT10Pj4+MTYsdGhpc1tlKzJdPXQ+Pj44LHRoaXNbZSszXT0yNTUmdCk6Xyh0aGlzLHQsZSwhMSksZSs0fSx1LnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBNKHRoaXMsdCxlLCEwLG4pfSx1LnByb3RvdHlwZS53cml0ZUZsb2F0QkU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBNKHRoaXMsdCxlLCExLG4pfSx1LnByb3RvdHlwZS53cml0ZURvdWJsZUxFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gVSh0aGlzLHQsZSwhMCxuKX0sdS5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIFUodGhpcyx0LGUsITEsbil9LHUucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24odCxlLG4scil7aWYobnx8KG49MCkscnx8MD09PXJ8fChyPXRoaXMubGVuZ3RoKSxlPj10Lmxlbmd0aCYmKGU9dC5sZW5ndGgpLGV8fChlPTApLHI+MCYmcjxuJiYocj1uKSxyPT09bilyZXR1cm4gMDtpZigwPT09dC5sZW5ndGh8fDA9PT10aGlzLmxlbmd0aClyZXR1cm4gMDtpZihlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihuPDB8fG4+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzIik7aWYocjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcyIpO3I+dGhpcy5sZW5ndGgmJihyPXRoaXMubGVuZ3RoKSx0Lmxlbmd0aC1lPHItbiYmKHI9dC5sZW5ndGgtZStuKTt2YXIgbyxpPXItbjtpZih0aGlzPT09dCYmbjxlJiZlPHIpZm9yKG89aS0xO28+PTA7LS1vKXRbbytlXT10aGlzW28rbl07ZWxzZSBpZihpPDFlM3x8IXUuVFlQRURfQVJSQVlfU1VQUE9SVClmb3Iobz0wO288aTsrK28pdFtvK2VdPXRoaXNbbytuXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKHQsdGhpcy5zdWJhcnJheShuLG4raSksZSk7cmV0dXJuIGl9LHUucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24odCxlLG4scil7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtpZigic3RyaW5nIj09dHlwZW9mIGU/KHI9ZSxlPTAsbj10aGlzLmxlbmd0aCk6InN0cmluZyI9PXR5cGVvZiBuJiYocj1uLG49dGhpcy5sZW5ndGgpLDE9PT10Lmxlbmd0aCl7dmFyIG89dC5jaGFyQ29kZUF0KDApO288MjU2JiYodD1vKX1pZih2b2lkIDAhPT1yJiYic3RyaW5nIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyIpO2lmKCJzdHJpbmciPT10eXBlb2YgciYmIXUuaXNFbmNvZGluZyhyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3IpfWVsc2UibnVtYmVyIj09dHlwZW9mIHQmJih0Jj0yNTUpO2lmKGU8MHx8dGhpcy5sZW5ndGg8ZXx8dGhpcy5sZW5ndGg8bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiT3V0IG9mIHJhbmdlIGluZGV4Iik7aWYobjw9ZSlyZXR1cm4gdGhpczt2YXIgaTtpZihlPj4+PTAsbj12b2lkIDA9PT1uP3RoaXMubGVuZ3RoOm4+Pj4wLHR8fCh0PTApLCJudW1iZXIiPT10eXBlb2YgdClmb3IoaT1lO2k8bjsrK2kpdGhpc1tpXT10O2Vsc2V7dmFyIGE9dS5pc0J1ZmZlcih0KT90OkYobmV3IHUodCxyKS50b1N0cmluZygpKSxzPWEubGVuZ3RoO2ZvcihpPTA7aTxuLWU7KytpKXRoaXNbaStlXT1hW2klc119cmV0dXJuIHRoaXN9O3ZhciBCPS9bXitcLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIHEodCl7cmV0dXJuIHQ8MTY/IjAiK3QudG9TdHJpbmcoMTYpOnQudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIEYodCxlKXt2YXIgbjtlPWV8fDEvMDtmb3IodmFyIHI9dC5sZW5ndGgsbz1udWxsLGk9W10sYT0wO2E8cjsrK2Epe2lmKChuPXQuY2hhckNvZGVBdChhKSk+NTUyOTUmJm48NTczNDQpe2lmKCFvKXtpZihuPjU2MzE5KXsoZS09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aWYoYSsxPT09cil7KGUtPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfW89bjtjb250aW51ZX1pZihuPDU2MzIwKXsoZS09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSksbz1uO2NvbnRpbnVlfW49NjU1MzYrKG8tNTUyOTY8PDEwfG4tNTYzMjApfWVsc2UgbyYmKGUtPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpO2lmKG89bnVsbCxuPDEyOCl7aWYoKGUtPTEpPDApYnJlYWs7aS5wdXNoKG4pfWVsc2UgaWYobjwyMDQ4KXtpZigoZS09Mik8MClicmVhaztpLnB1c2gobj4+NnwxOTIsNjMmbnwxMjgpfWVsc2UgaWYobjw2NTUzNil7aWYoKGUtPTMpPDApYnJlYWs7aS5wdXNoKG4+PjEyfDIyNCxuPj42JjYzfDEyOCw2MyZufDEyOCl9ZWxzZXtpZighKG48MTExNDExMikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvZGUgcG9pbnQiKTtpZigoZS09NCk8MClicmVhaztpLnB1c2gobj4+MTh8MjQwLG4+PjEyJjYzfDEyOCxuPj42JjYzfDEyOCw2MyZufDEyOCl9fXJldHVybiBpfWZ1bmN0aW9uIEgodCl7cmV0dXJuIHIudG9CeXRlQXJyYXkoZnVuY3Rpb24odCl7aWYoKHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQudHJpbT90LnRyaW0oKTp0LnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0odCkucmVwbGFjZShCLCIiKSkubGVuZ3RoPDIpcmV0dXJuIiI7Zm9yKDt0Lmxlbmd0aCU0IT0wOyl0Kz0iPSI7cmV0dXJuIHR9KHQpKX1mdW5jdGlvbiB6KHQsZSxuLHIpe2Zvcih2YXIgbz0wO288ciYmIShvK24+PWUubGVuZ3RofHxvPj10Lmxlbmd0aCk7KytvKWVbbytuXT10W29dO3JldHVybiBvfX0pLmNhbGwodGhpcyxuKDg1KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZS5ieXRlTGVuZ3RoPWZ1bmN0aW9uKHQpe3ZhciBlPWModCksbj1lWzBdLHI9ZVsxXTtyZXR1cm4gMyoobityKS80LXJ9LGUudG9CeXRlQXJyYXk9ZnVuY3Rpb24odCl7dmFyIGUsbixyPWModCksYT1yWzBdLHM9clsxXSx1PW5ldyBpKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gMyooZStuKS80LW59KDAsYSxzKSksbD0wLGY9cz4wP2EtNDphO2ZvcihuPTA7bjxmO24rPTQpZT1vW3QuY2hhckNvZGVBdChuKV08PDE4fG9bdC5jaGFyQ29kZUF0KG4rMSldPDwxMnxvW3QuY2hhckNvZGVBdChuKzIpXTw8NnxvW3QuY2hhckNvZGVBdChuKzMpXSx1W2wrK109ZT4+MTYmMjU1LHVbbCsrXT1lPj44JjI1NSx1W2wrK109MjU1JmU7Mj09PXMmJihlPW9bdC5jaGFyQ29kZUF0KG4pXTw8MnxvW3QuY2hhckNvZGVBdChuKzEpXT4+NCx1W2wrK109MjU1JmUpOzE9PT1zJiYoZT1vW3QuY2hhckNvZGVBdChuKV08PDEwfG9bdC5jaGFyQ29kZUF0KG4rMSldPDw0fG9bdC5jaGFyQ29kZUF0KG4rMildPj4yLHVbbCsrXT1lPj44JjI1NSx1W2wrK109MjU1JmUpO3JldHVybiB1fSxlLmZyb21CeXRlQXJyYXk9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49dC5sZW5ndGgsbz1uJTMsaT1bXSxhPTAscz1uLW87YTxzO2ErPTE2MzgzKWkucHVzaChsKHQsYSxhKzE2MzgzPnM/czphKzE2MzgzKSk7MT09PW8/KGU9dFtuLTFdLGkucHVzaChyW2U+PjJdK3JbZTw8NCY2M10rIj09IikpOjI9PT1vJiYoZT0odFtuLTJdPDw4KSt0W24tMV0saS5wdXNoKHJbZT4+MTBdK3JbZT4+NCY2M10rcltlPDwyJjYzXSsiPSIpKTtyZXR1cm4gaS5qb2luKCIiKX07Zm9yKHZhciByPVtdLG89W10saT0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXk/VWludDhBcnJheTpBcnJheSxhPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIixzPTAsdT1hLmxlbmd0aDtzPHU7KytzKXJbc109YVtzXSxvW2EuY2hhckNvZGVBdChzKV09cztmdW5jdGlvbiBjKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGUlND4wKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIpO3ZhciBuPXQuaW5kZXhPZigiPSIpO3JldHVybi0xPT09biYmKG49ZSksW24sbj09PWU/MDo0LW4lNF19ZnVuY3Rpb24gbCh0LGUsbil7Zm9yKHZhciBvLGksYT1bXSxzPWU7czxuO3MrPTMpbz0odFtzXTw8MTYmMTY3MTE2ODApKyh0W3MrMV08PDgmNjUyODApKygyNTUmdFtzKzJdKSxhLnB1c2goclsoaT1vKT4+MTgmNjNdK3JbaT4+MTImNjNdK3JbaT4+NiY2M10rcls2MyZpXSk7cmV0dXJuIGEuam9pbigiIil9b1siLSIuY2hhckNvZGVBdCgwKV09NjIsb1siXyIuY2hhckNvZGVBdCgwKV09NjN9LGZ1bmN0aW9uKHQsZSl7ZS5yZWFkPWZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGksYSxzPTgqby1yLTEsdT0oMTw8cyktMSxjPXU+PjEsbD0tNyxmPW4/by0xOjAscD1uPy0xOjEsaD10W2UrZl07Zm9yKGYrPXAsaT1oJigxPDwtbCktMSxoPj49LWwsbCs9cztsPjA7aT0yNTYqaSt0W2UrZl0sZis9cCxsLT04KTtmb3IoYT1pJigxPDwtbCktMSxpPj49LWwsbCs9cjtsPjA7YT0yNTYqYSt0W2UrZl0sZis9cCxsLT04KTtpZigwPT09aSlpPTEtYztlbHNle2lmKGk9PT11KXJldHVybiBhP05hTjoxLzAqKGg/LTE6MSk7YSs9TWF0aC5wb3coMixyKSxpLT1jfXJldHVybihoPy0xOjEpKmEqTWF0aC5wb3coMixpLXIpfSxlLndyaXRlPWZ1bmN0aW9uKHQsZSxuLHIsbyxpKXt2YXIgYSxzLHUsYz04Kmktby0xLGw9KDE8PGMpLTEsZj1sPj4xLHA9MjM9PT1vP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxoPXI/MDppLTEsZD1yPzE6LTEsZz1lPDB8fDA9PT1lJiYxL2U8MD8xOjA7Zm9yKGU9TWF0aC5hYnMoZSksaXNOYU4oZSl8fGU9PT0xLzA/KHM9aXNOYU4oZSk/MTowLGE9bCk6KGE9TWF0aC5mbG9vcihNYXRoLmxvZyhlKS9NYXRoLkxOMiksZSoodT1NYXRoLnBvdygyLC1hKSk8MSYmKGEtLSx1Kj0yKSwoZSs9YStmPj0xP3AvdTpwKk1hdGgucG93KDIsMS1mKSkqdT49MiYmKGErKyx1Lz0yKSxhK2Y+PWw/KHM9MCxhPWwpOmErZj49MT8ocz0oZSp1LTEpKk1hdGgucG93KDIsbyksYSs9Zik6KHM9ZSpNYXRoLnBvdygyLGYtMSkqTWF0aC5wb3coMixvKSxhPTApKTtvPj04O3RbbitoXT0yNTUmcyxoKz1kLHMvPTI1NixvLT04KTtmb3IoYT1hPDxvfHMsYys9bztjPjA7dFtuK2hdPTI1NSZhLGgrPWQsYS89MjU2LGMtPTgpO3RbbitoLWRdfD0xMjgqZ319LGZ1bmN0aW9uKHQsZSl7dmFyIG49e30udG9TdHJpbmc7dC5leHBvcnRzPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PW4uY2FsbCh0KX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyOTkpfSxmdW5jdGlvbih0LGUsbil7bigzMDApO3ZhciByPW4oMSk7dC5leHBvcnRzPXIuVVJMU2VhcmNoUGFyYW1zfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24oMTAyKTt2YXIgcj1uKDApLG89bigzMDEpLGk9bigzNiksYT1uKDExOCkscz1uKDI5KSx1PW4oMTAwKSxjPW4oNTApLGw9bigxMTkpLGY9bigxNCkscD1uKDMyKSxoPW4oMTEpLGQ9big3KSxnPW4oMTA4KSx2PW4oNTIpLHk9bigyKSgiaXRlcmF0b3IiKSxtPWMuc2V0LGI9Yy5nZXR0ZXJGb3IoIlVSTFNlYXJjaFBhcmFtcyIpLHg9Yy5nZXR0ZXJGb3IoIlVSTFNlYXJjaFBhcmFtc0l0ZXJhdG9yIiksdz0vXCsvZyxrPUFycmF5KDQpLFM9ZnVuY3Rpb24odCl7cmV0dXJuIGtbdC0xXXx8KGtbdC0xXT1SZWdFeHAoIigoPzolW1xcZGEtZl17Mn0peyIrdCsifSkiLCJnaSIpKX0sRT1mdW5jdGlvbih0KXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh0KX1jYXRjaChlKXtyZXR1cm4gdH19LGo9ZnVuY3Rpb24odCl7dmFyIGU9dC5yZXBsYWNlKHcsIiAiKSxuPTQ7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZSl9Y2F0Y2godCl7Zm9yKDtuOyllPWUucmVwbGFjZShTKG4tLSksRSk7cmV0dXJuIGV9fSxUPS9bIScoKX5dfCUyMC9nLE89eyIhIjoiJTIxIiwiJyI6IiUyNyIsIigiOiIlMjgiLCIpIjoiJTI5IiwifiI6IiU3RSIsIiUyMCI6IisifSxBPWZ1bmN0aW9uKHQpe3JldHVybiBPW3RdfSxDPWZ1bmN0aW9uKHQpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQodCkucmVwbGFjZShULEEpfSxMPWZ1bmN0aW9uKHQsZSl7aWYoZSlmb3IodmFyIG4scixvPWUuc3BsaXQoIiYiKSxpPTA7aTxvLmxlbmd0aDspKG49b1tpKytdKS5sZW5ndGgmJihyPW4uc3BsaXQoIj0iKSx0LnB1c2goe2tleTpqKHIuc2hpZnQoKSksdmFsdWU6aihyLmpvaW4oIj0iKSl9KSl9LFI9ZnVuY3Rpb24odCl7dGhpcy5lbnRyaWVzLmxlbmd0aD0wLEwodGhpcy5lbnRyaWVzLHQpfSxQPWZ1bmN0aW9uKHQsZSl7aWYodDxlKXRocm93IFR5cGVFcnJvcigiTm90IGVub3VnaCBhcmd1bWVudHMiKX0sTj11KGZ1bmN0aW9uKHQsZSl7bSh0aGlzLHt0eXBlOiJVUkxTZWFyY2hQYXJhbXNJdGVyYXRvciIsaXRlcmF0b3I6ZyhiKHQpLmVudHJpZXMpLGtpbmQ6ZX0pfSwiSXRlcmF0b3IiLGZ1bmN0aW9uKCl7dmFyIHQ9eCh0aGlzKSxlPXQua2luZCxuPXQuaXRlcmF0b3IubmV4dCgpLHI9bi52YWx1ZTtyZXR1cm4gbi5kb25lfHwobi52YWx1ZT0ia2V5cyI9PT1lP3Iua2V5OiJ2YWx1ZXMiPT09ZT9yLnZhbHVlOltyLmtleSxyLnZhbHVlXSksbn0pLEk9ZnVuY3Rpb24oKXtsKHRoaXMsSSwiVVJMU2VhcmNoUGFyYW1zIik7dmFyIHQsZSxuLHIsbyxpLGEscz1hcmd1bWVudHMubGVuZ3RoPjA/YXJndW1lbnRzWzBdOnZvaWQgMCx1PXRoaXMsYz1bXTtpZihtKHUse3R5cGU6IlVSTFNlYXJjaFBhcmFtcyIsZW50cmllczpjLHVwZGF0ZVVSTDpmdW5jdGlvbigpe30sdXBkYXRlU2VhcmNoUGFyYW1zOlJ9KSx2b2lkIDAhPT1zKWlmKGQocykpaWYoImZ1bmN0aW9uIj09dHlwZW9mKHQ9dihzKSkpZm9yKGU9dC5jYWxsKHMpOyEobj1lLm5leHQoKSkuZG9uZTspe2lmKChvPShyPWcoaChuLnZhbHVlKSkpLm5leHQoKSkuZG9uZXx8KGk9ci5uZXh0KCkpLmRvbmV8fCFyLm5leHQoKS5kb25lKXRocm93IFR5cGVFcnJvcigiRXhwZWN0ZWQgc2VxdWVuY2Ugd2l0aCBsZW5ndGggMiIpO2MucHVzaCh7a2V5Om8udmFsdWUrIiIsdmFsdWU6aS52YWx1ZSsiIn0pfWVsc2UgZm9yKGEgaW4gcylmKHMsYSkmJmMucHVzaCh7a2V5OmEsdmFsdWU6c1thXSsiIn0pO2Vsc2UgTChjLCJzdHJpbmciPT10eXBlb2Ygcz8iPyI9PT1zLmNoYXJBdCgwKT9zLnNsaWNlKDEpOnM6cysiIil9LF89SS5wcm90b3R5cGU7YShfLHthcHBlbmQ6ZnVuY3Rpb24odCxlKXtQKGFyZ3VtZW50cy5sZW5ndGgsMik7dmFyIG49Yih0aGlzKTtuLmVudHJpZXMucHVzaCh7a2V5OnQrIiIsdmFsdWU6ZSsiIn0pLG4udXBkYXRlVVJMKCl9LGRlbGV0ZTpmdW5jdGlvbih0KXtQKGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciBlPWIodGhpcyksbj1lLmVudHJpZXMscj10KyIiLG89MDtvPG4ubGVuZ3RoOyluW29dLmtleT09PXI/bi5zcGxpY2UobywxKTpvKys7ZS51cGRhdGVVUkwoKX0sZ2V0OmZ1bmN0aW9uKHQpe1AoYXJndW1lbnRzLmxlbmd0aCwxKTtmb3IodmFyIGU9Yih0aGlzKS5lbnRyaWVzLG49dCsiIixyPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXS5rZXk9PT1uKXJldHVybiBlW3JdLnZhbHVlO3JldHVybiBudWxsfSxnZXRBbGw6ZnVuY3Rpb24odCl7UChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgZT1iKHRoaXMpLmVudHJpZXMsbj10KyIiLHI9W10sbz0wO288ZS5sZW5ndGg7bysrKWVbb10ua2V5PT09biYmci5wdXNoKGVbb10udmFsdWUpO3JldHVybiByfSxoYXM6ZnVuY3Rpb24odCl7UChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgZT1iKHRoaXMpLmVudHJpZXMsbj10KyIiLHI9MDtyPGUubGVuZ3RoOylpZihlW3IrK10ua2V5PT09bilyZXR1cm4hMDtyZXR1cm4hMX0sc2V0OmZ1bmN0aW9uKHQsZSl7UChhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgbixyPWIodGhpcyksbz1yLmVudHJpZXMsaT0hMSxhPXQrIiIscz1lKyIiLHU9MDt1PG8ubGVuZ3RoO3UrKykobj1vW3VdKS5rZXk9PT1hJiYoaT9vLnNwbGljZSh1LS0sMSk6KGk9ITAsbi52YWx1ZT1zKSk7aXx8by5wdXNoKHtrZXk6YSx2YWx1ZTpzfSksci51cGRhdGVVUkwoKX0sc29ydDpmdW5jdGlvbigpe3ZhciB0LGUsbixyPWIodGhpcyksbz1yLmVudHJpZXMsaT1vLnNsaWNlKCk7Zm9yKG8ubGVuZ3RoPTAsbj0wO248aS5sZW5ndGg7bisrKXtmb3IodD1pW25dLGU9MDtlPG47ZSsrKWlmKG9bZV0ua2V5PnQua2V5KXtvLnNwbGljZShlLDAsdCk7YnJlYWt9ZT09PW4mJm8ucHVzaCh0KX1yLnVwZGF0ZVVSTCgpfSxmb3JFYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPWIodGhpcykuZW50cmllcyxyPXAodCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCwzKSxvPTA7bzxuLmxlbmd0aDspcigoZT1uW28rK10pLnZhbHVlLGUua2V5LHRoaXMpfSxrZXlzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKHRoaXMsImtleXMiKX0sdmFsdWVzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKHRoaXMsInZhbHVlcyIpfSxlbnRyaWVzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBOKHRoaXMsImVudHJpZXMiKX19LHtlbnVtZXJhYmxlOiEwfSksaShfLHksXy5lbnRyaWVzKSxpKF8sInRvU3RyaW5nIixmdW5jdGlvbigpe2Zvcih2YXIgdCxlPWIodGhpcykuZW50cmllcyxuPVtdLHI9MDtyPGUubGVuZ3RoOyl0PWVbcisrXSxuLnB1c2goQyh0LmtleSkrIj0iK0ModC52YWx1ZSkpO3JldHVybiBuLmpvaW4oIiYiKX0se2VudW1lcmFibGU6ITB9KSxzKEksIlVSTFNlYXJjaFBhcmFtcyIpLHIoe2dsb2JhbDohMCxmb3JjZWQ6IW99LHtVUkxTZWFyY2hQYXJhbXM6SX0pLHQuZXhwb3J0cz17VVJMU2VhcmNoUGFyYW1zOkksZ2V0U3RhdGU6Yn19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpLG89bigyKSxpPW4oMjgpLGE9bygiaXRlcmF0b3IiKTt0LmV4cG9ydHM9IXIoZnVuY3Rpb24oKXt2YXIgdD1uZXcgVVJMKCJiP2U9MSIsImh0dHA6Ly9hIiksZT10LnNlYXJjaFBhcmFtcztyZXR1cm4gdC5wYXRobmFtZT0iYyUyMGQiLGkmJiF0LnRvSlNPTnx8IWUuc29ydHx8Imh0dHA6Ly9hL2MlMjBkP2U9MSIhPT10LmhyZWZ8fCIxIiE9PWUuZ2V0KCJlIil8fCJhPTEiIT09U3RyaW5nKG5ldyBVUkxTZWFyY2hQYXJhbXMoIj9hPTEiKSl8fCFlW2FdfHwiYSIhPT1uZXcgVVJMKCJodHRwczovL2FAYiIpLnVzZXJuYW1lfHwiYiIhPT1uZXcgVVJMU2VhcmNoUGFyYW1zKG5ldyBVUkxTZWFyY2hQYXJhbXMoImE9YiIpKS5nZXQoImEiKXx8InhuLS1lMWF5YmMiIT09bmV3IFVSTCgiaHR0cDovL9GC0LXRgdGCIikuaG9zdHx8IiMlRDAlQjEiIT09bmV3IFVSTCgiaHR0cDovL2Ej0LEiKS5oYXNofSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5yKGUpO3ZhciByPW4oOSksbz1uLm4ociksaT1uKDYxKSxhPW4ubihpKSxzPW4oMjYpLHU9bi5uKHMpLGM9bigzKSxsPW4ubihjKSxmPW4oMjApLHA9bi5uKGYpLGg9big4KSxkPW4ubihoKSxnPW4oMTIpLHY9bi5uKGcpLHk9bigxMjYpLG09bi5uKHkpLGI9bigxOSkseD1uLm4oYiksdz1uKDM3KSxrPW4ubih3KSxTPW4oMTUpLEU9bi5uKFMpLGo9bigxMCksVD1uLm4oaiksTz0obigxNiksbig4MCkpLEE9bi5uKE8pO2Z1bmN0aW9uIEModCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjAsbj1BKCkodC5yZXBsYWNlKC9bXjAtOV0vZ2ksIiIpLDEwKTtyZXR1cm4gbnx8ZX1mdW5jdGlvbiBMKHQpe3ZhciBlPSIiLG49dC5jb250ZW50cygpO2lmKG4ubGVuZ3RoPjApZm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKz0xKXt2YXIgbz1uLmdldChyKTszPT09by5ub2RlVHlwZSYmby5kYXRhJiYoZSs9by5kYXRhKX1yZXR1cm4gZX1mdW5jdGlvbiBSKHQsZSl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJzZWxlY3RvciByZXF1aXJlZCIpO3JldHVybiB0KGUpLmxlbmd0aD4wJiYiaW1nIj09PXQoZSkucHJvcCgidGFnTmFtZSIpLnRvTG93ZXJDYXNlKCk/dChlKS5hdHRyKCJhbHQiKXx8IiI6dChlKS50ZXh0KCkucmVwbGFjZSgvXG4vLCIiKX1mdW5jdGlvbiBQKHQsZSl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJzZWxlY3RvciByZXF1aXJlZCIpO3ZhciBuPSIiO2lmKHQoZSkubGVuZ3RoPjApe3ZhciByPXQoZSkucHJvcCgidGFnTmFtZSIpLnRvTG93ZXJDYXNlKCk7bj0iaW5wdXQiPT09cj90KGUpLnZhbCgpOiJtZXRhIj09PXI/dChlKS5hdHRyKCJjb250ZW50Iil8fCIiOkwodChlKSl9cmV0dXJuIG49bi5yZXBsYWNlKC9bXjAtOV0vZywiIiksQSgpKG4sMTApfXZhciBOPW4oMzgpLEk9bi5uKE4pLF89bigzOSksRD1uLm4oXyksTT1uKDQwKSxVPW4ubihNKSxCPW4oNDEpLHE9bi5uKEIpLEY9big0MiksSD1uLm4oRiksej1uKDQzKSxXPW4ubih6KSwkPW4oNjIpLFk9bi5uKCQpO2Z1bmN0aW9uIFYodCxlKXt2YXIgbjtpZih2b2lkIDA9PT1xLmF8fG51bGw9PVUoKSh0KSl7aWYoRCgpKHQpfHwobj1mdW5jdGlvbih0LGUpe3ZhciBuO2lmKCF0KXJldHVybjtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIEcodCxlKTt2YXIgcj1XKCkobj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpLmNhbGwobiw4LC0xKTsiT2JqZWN0Ij09PXImJnQuY29uc3RydWN0b3ImJihyPXQuY29uc3RydWN0b3IubmFtZSk7aWYoIk1hcCI9PT1yfHwiU2V0Ij09PXIpcmV0dXJuIEgoKSh0KTtpZigiQXJndW1lbnRzIj09PXJ8fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KHIpKXJldHVybiBHKHQsZSl9KHQpKXx8ZSYmdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCl7biYmKHQ9bik7dmFyIHI9MCxvPWZ1bmN0aW9uKCl7fTtyZXR1cm57czpvLG46ZnVuY3Rpb24oKXtyZXR1cm4gcj49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbcisrXX19LGU6ZnVuY3Rpb24odCl7dGhyb3cgdH0sZjpvfX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIGksYT0hMCxzPSExO3JldHVybntzOmZ1bmN0aW9uKCl7bj1JKCkodCl9LG46ZnVuY3Rpb24oKXt2YXIgdD1uLm5leHQoKTtyZXR1cm4gYT10LmRvbmUsdH0sZTpmdW5jdGlvbih0KXtzPSEwLGk9dH0sZjpmdW5jdGlvbigpe3RyeXthfHxudWxsPT1uLnJldHVybnx8bi5yZXR1cm4oKX1maW5hbGx5e2lmKHMpdGhyb3cgaX19fX1mdW5jdGlvbiBHKHQsZSl7KG51bGw9PWV8fGU+dC5sZW5ndGgpJiYoZT10Lmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkoZSk7bjxlO24rKylyW25dPXRbbl07cmV0dXJuIHJ9ZnVuY3Rpb24gSyh0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoIlNLVeOBjOS4jeato+OBp+OBmSIpO2lmKDA9PT1ZKCkodCkubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiU0tV6aCF55uu5pWw44GM5LiN5q2j44Gn44GZIil9dmFyIFg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ZhciBuPWUuJCxyPWUubmFtZSxvPWUucHJpY2U7ZCgpKHRoaXMsdCksdGhpcy4kPW4sdGhpcy5uYW1lU2VsZWN0b3I9cnx8IiIsdGhpcy5wcmljZVNlbGVjdG9yPW98fCIifXJldHVybiB2KCkodCxbe2tleToiZ2V0UHVyY2hhc2FibGUiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiEwfX0se2tleToiZXhlY3V0ZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdCxlLG4scj0hMDt0cnl7cmV0dXJuIHQ9dGhpcy5nZXRJdGVtKCksZT10aGlzLmdldFNrdVJvd3ModCkscj10aGlzLmdldFB1cmNoYXNhYmxlKHtpdGVtOnQsc2t1Um93czplfSksZnVuY3Rpb24odCl7dmFyIGU9dC5pdGVtLG49dC5za3VSb3dzO2lmKCFlKXRocm93IG5ldyBFcnJvcigi44Ki44Kk44OG44Og44GM5LiN5q2j44Gn44GZIik7aWYoIWUubmFtZSl0aHJvdyBuZXcgRXJyb3IoIuOCouOCpOODhuODoOWQjeWJjeOBjOS4jeato+OBp+OBmSIpO2lmKCEobiYmMCE9PW4ubGVuZ3RofHxlLnByaWNlKSl0aHJvdyBuZXcgRXJyb3IoIuOCouOCpOODhuODoOmHkemhjeOBjOS4jeato+OBp+OBmSIpO2lmKG4pe3ZhciByLG89VihuKTt0cnl7Zm9yKG8ucygpOyEocj1vLm4oKSkuZG9uZTspe0soci52YWx1ZSl9fWNhdGNoKHQpe28uZSh0KX1maW5hbGx5e28uZigpfX19KHtpdGVtOnQsc2t1Um93czplfSkse2l0ZW06dCxza3VSb3dzOmUscHVyY2hhc2FibGU6cn19Y2F0Y2godCl7bj10fXZhciBvPXtwdXJjaGFzYWJsZTpyfTtyZXR1cm4gdCYmKG8uaXRlbT10KSxlJiYoby5za3VSb3dzPWUpLG4mJihvLmVycm9yPW4pLG99fSx7a2V5OiJnZXRJdGVtIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXtuYW1lOiIiLHByaWNlOjB9O3RoaXMubmFtZVNlbGVjdG9yP3QubmFtZT10aGlzLmdldEl0ZW1OYW1lKFIodGhpcy4kLHRoaXMubmFtZVNlbGVjdG9yKSk6dC5uYW1lPXRoaXMuZ2V0SXRlbU5hbWUoKSx0aGlzLnByaWNlU2VsZWN0b3I/dC5wcmljZT10aGlzLmdldEl0ZW1QcmljZShQKHRoaXMuJCx0aGlzLnByaWNlU2VsZWN0b3IpKTp0LnByaWNlPXRoaXMuZ2V0SXRlbVByaWNlKCk7dmFyIGU9dGhpcy5nZXRJdGVtQ29kZSgpO3JldHVybiBlJiYodC5jb2RlPWUpLHR9fSx7a2V5OiJnZXRJdGVtTmFtZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06IiI7cmV0dXJuIHRoaXMubmFtZVNlbGVjdG9yP1IodGhpcy4kLHRoaXMubmFtZVNlbGVjdG9yKTp0fX0se2tleToiZ2V0SXRlbVByaWNlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTowO3JldHVybiB0aGlzLnByaWNlU2VsZWN0b3I/UCh0aGlzLiQsdGhpcy5wcmljZVNlbGVjdG9yKTp0fX0se2tleToiZ2V0SXRlbUNvZGUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9fSx7a2V5OiJnZXRTa3VSb3dzIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm5bXX19XSksdH0oKSxKPW4oMTI3KSxRPW4ubihKKSxaPW4oMTI4KTtmdW5jdGlvbiB0dCgpe3JldHVybiB3aW5kb3cubmF2aWdhdG9yLmxhbmd1YWdlcyYmd2luZG93Lm5hdmlnYXRvci5sYW5ndWFnZXNbMF18fHdpbmRvdy5uYXZpZ2F0b3IubGFuZ3VhZ2V8fHdpbmRvdy5uYXZpZ2F0b3IudXNlckxhbmd1YWdlfHx3aW5kb3cubmF2aWdhdG9yLmJyb3dzZXJMYW5ndWFnZX12YXIgZXQ9bigxMjkpLG50PW4ubihldCkscnQ9bigxMzApLG90PW4ubihydCksaXQ9InppZ3phZyI7dmFyIGF0PW4oMjUpLHN0PSJ1c2FnZSIsdXQ9InppZ3phZy1mbG93LWNvbnRyb2xsZWQiO2Z1bmN0aW9uIGN0KHQsZSl7d2luZG93LiQmJmZ1bmN0aW9uKG4pe3ZhciByPW4odCk7aWYociYmci5sZW5ndGg+MClmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rPTEpe3ZhciBpPXIuZ2V0KG8pO2kuaGFzQXR0cmlidXRlKHV0KXx8KCJjbGljayI9PT1lP2kub25jbGljaz1udWxsOiJzdWJtaXQiPT09ZSYmKGkub25zdWJtaXQ9bnVsbCksIm9mZiJpbiBuKGkpP24oaSkub2ZmKGUpOiJ1bmJpbmQiaW4gbihpKSYmbihpKS51bmJpbmQoZSkpfX0od2luZG93LiQpfXZhciBsdD17cHJlc2VydmVPcmlnaW5hbEV2ZW50OiExLGRpc2FibGVQb2ludGVyRXZlbnQ6ITEsZGlzYWJsZVJlcG9ydDohMX07dmFyIGZ0PXtkaXNhYmxlUmVwb3J0OiExfTtmdW5jdGlvbiBwdCh0KXt2YXIgZT1vdCgpKGZ1bmN0aW9uKCl7dmFyIG4scixvPXdpbmRvdy56aWd6YWc7ImRlYWN0aXZhdGVkIj09PShuPXN0LHI9d2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGl0KSxKU09OLnBhcnNlKHI/ZGVjb2RlVVJJQ29tcG9uZW50KGF0b2IocikpOiJ7fSIpW25dKXx8by5pc0RlbmllZHx8KHQoKSxjbGVhckludGVydmFsKGUpKX0sNTAwKX1mdW5jdGlvbiBodCh0LGUpe3ZhciBuPXdpbmRvdy56aWd6YWc7bnQoKShmdW5jdGlvbigpey9DaHJvbWUvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpJiYwPT09dChlKS5sZW5ndGgmJm4mJiJpdGVtIj09PW4uZGlzY292ZXJ5U3RhdHVzJiZhdC5hLmVycm9yKCIiLmNvbmNhdChlLCI6IOOCouOCpOODhuODoOODmuODvOOCuOOBp+ipsuW9k+OBmeOCi+ODleODreODvOWItuW+oeeUqOOBruimgee0oOOBjOimi+OBpOOBi+OCiuOBvuOBm+OCkyIpKX0sNWUzKX12YXIgZHQ9e29uQ2hhbmdlc1JlYWR5OmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpbImphIl07Qm9vbGVhbihUKCkoZSkuY2FsbChlLGZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybi0xIT09USgpKGU9dHQoKSkuY2FsbChlLHQpfSkpfHxwdChmdW5jdGlvbigpe3QoWil9KX0sb3ZlcnJpZGVDbGlja0V2ZW50OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106bHQ7aWYoKHI9dSgpKHUoKSh7fSxsdCkscikpLmRpc2FibGVSZXBvcnR8fGh0KHQsZSksci5kaXNhYmxlUG9pbnRlckV2ZW50KXtpZih3aW5kb3cuZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUodXQpKXJldHVybjt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO28uaW5uZXJIVE1MPSJcbiAgICAiLmNvbmNhdChlLCIge1xuICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgfSIpO3ZhciBpPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdCIpO3JldHVybiBpJiZpLnBhcmVudE5vZGUmJmkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobyxpKSx0KGRvY3VtZW50KS5vbigiY2xpY2siLGZ1bmN0aW9uKHIpe3IudGFyZ2V0JiZ0KHIudGFyZ2V0KS5jbG9zZXN0KHQoZSkucGFyZW50KCkpLmxlbmd0aD4wJiZuKHIpfSksdm9pZCB3aW5kb3cuZG9jdW1lbnQuYm9keS5zZXRBdHRyaWJ1dGUodXQsIjEiKX1yLnByZXNlcnZlT3JpZ2luYWxFdmVudHx8Y3QoZSwiY2xpY2siKTtmb3IodmFyIGE9dChlKSxzPTA7czxhLmxlbmd0aDtzKz0xKXt2YXIgYz1hLmdldChzKTtjLmhhc0F0dHJpYnV0ZSh1dCl8fChjLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbih0KXtyLnByZXNlcnZlT3JpZ2luYWxFdmVudHx8KHQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbigpKSxuKHQpfSwhMCksYy5zZXRBdHRyaWJ1dGUodXQsIjEiKSl9fSxvdmVycmlkZVN1Ym1pdEV2ZW50OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106ZnQ7KHI9dSgpKHUoKSh7fSxmdCkscikpLmRpc2FibGVSZXBvcnR8fGh0KHQsZSksY3QoZSwic3VibWl0Iik7dmFyIG89dChlKTtpZihvJiZvLmxlbmd0aD4wKWZvcih2YXIgaT0wO2k8by5sZW5ndGg7aSs9MSl7dmFyIGE9by5nZXQoaSk7YS5oYXNBdHRyaWJ1dGUodXQpfHwodChhKS5vbigic3VibWl0IixuKSxhLnNldEF0dHJpYnV0ZSh1dCwiMSIpKX19LHVuYmluZE9yaWdpbmFsSlF1ZXJ5RXZlbnRzOmN0fTt2YXIgZ3Q9big4MSksdnQ9bi5uKGd0KSx5dD1uKDEzMSksbXQ9bi5uKHl0KSxidD1uKDEzMikseHQ9bi5uKGJ0KSx3dD1uKDgyKSxrdD1uLm4od3QpO2Z1bmN0aW9uIFN0KHQpe3JldHVybihTdD0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgdH0pKHQpfWZ1bmN0aW9uIEV0KHQsZSxuKXtyZXR1cm4gZSBpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPW4sdH1mdW5jdGlvbiBqdCh0KXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbZV0/T2JqZWN0KGFyZ3VtZW50c1tlXSk6e30scj1PYmplY3Qua2V5cyhuKTsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyYmKHI9ci5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhuKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix0KS5lbnVtZXJhYmxlfSkpKSxyLmZvckVhY2goZnVuY3Rpb24oZSl7RXQodCxlLG5bZV0pfSl9cmV0dXJuIHR9ZnVuY3Rpb24gVHQodCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBPdCh0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsci5rZXkscil9fWZ1bmN0aW9uIEF0KHQsZSxuKXtyZXR1cm4gZSYmT3QodC5wcm90b3R5cGUsZSksbiYmT3QodCxuKSx0fWZ1bmN0aW9uIEN0KHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH1mdW5jdGlvbiBMdCh0LGUpe3JldHVybiFlfHwib2JqZWN0IiE9PVN0KGUpJiYiZnVuY3Rpb24iIT10eXBlb2YgZT9DdCh0KTplfWZ1bmN0aW9uIFJ0KHQpe3JldHVybihSdD1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKHQpfSkodCl9ZnVuY3Rpb24gUHQodCxlKXtyZXR1cm4oUHQ9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbih0LGUpe3JldHVybiB0Ll9fcHJvdG9fXz1lLHR9KSh0LGUpfWZ1bmN0aW9uIE50KHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7dC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOnQsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJlB0KHQsZSl9dmFyIEl0PXt0eXBlOiJsb2dnZXIiLGxvZzpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgibG9nIix0KX0sd2FybjpmdW5jdGlvbih0KXt0aGlzLm91dHB1dCgid2FybiIsdCl9LGVycm9yOmZ1bmN0aW9uKHQpe3RoaXMub3V0cHV0KCJlcnJvciIsdCl9LG91dHB1dDpmdW5jdGlvbih0LGUpe2NvbnNvbGUmJmNvbnNvbGVbdF0mJmNvbnNvbGVbdF0uYXBwbHkoY29uc29sZSxlKX19LF90PW5ldyhmdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O1R0KHRoaXMsdCksdGhpcy5pbml0KGUsbil9cmV0dXJuIEF0KHQsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTt0aGlzLnByZWZpeD1lLnByZWZpeHx8ImkxOG5leHQ6Iix0aGlzLmxvZ2dlcj10fHxJdCx0aGlzLm9wdGlvbnM9ZSx0aGlzLmRlYnVnPWUuZGVidWd9fSx7a2V5OiJzZXREZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5kZWJ1Zz10fX0se2tleToibG9nIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwibG9nIiwiIiwhMCl9fSx7a2V5OiJ3YXJuIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwid2FybiIsIiIsITApfX0se2tleToiZXJyb3IiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsZT1uZXcgQXJyYXkodCksbj0wO248dDtuKyspZVtuXT1hcmd1bWVudHNbbl07cmV0dXJuIHRoaXMuZm9yd2FyZChlLCJlcnJvciIsIiIpfX0se2tleToiZGVwcmVjYXRlIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLGU9bmV3IEFycmF5KHQpLG49MDtuPHQ7bisrKWVbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQoZSwid2FybiIsIldBUk5JTkcgREVQUkVDQVRFRDogIiwhMCl9fSx7a2V5OiJmb3J3YXJkIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gciYmIXRoaXMuZGVidWc/bnVsbDooInN0cmluZyI9PXR5cGVvZiB0WzBdJiYodFswXT0iIi5jb25jYXQobikuY29uY2F0KHRoaXMucHJlZml4LCIgIikuY29uY2F0KHRbMF0pKSx0aGlzLmxvZ2dlcltlXSh0KSl9fSx7a2V5OiJjcmVhdGUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBuZXcgdCh0aGlzLmxvZ2dlcixqdCh7fSx7cHJlZml4OiIiLmNvbmNhdCh0aGlzLnByZWZpeCwiOiIpLmNvbmNhdChlLCI6Iil9LHRoaXMub3B0aW9ucykpfX1dKSx0fSgpKSxEdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtUdCh0aGlzLHQpLHRoaXMub2JzZXJ2ZXJzPXt9fXJldHVybiBBdCh0LFt7a2V5OiJvbiIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3JldHVybiB0LnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbih0KXtuLm9ic2VydmVyc1t0XT1uLm9ic2VydmVyc1t0XXx8W10sbi5vYnNlcnZlcnNbdF0ucHVzaChlKX0pLHRoaXN9fSx7a2V5OiJvZmYiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5vYnNlcnZlcnNbdF0mJihlP3RoaXMub2JzZXJ2ZXJzW3RdPXRoaXMub2JzZXJ2ZXJzW3RdLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdCE9PWV9KTpkZWxldGUgdGhpcy5vYnNlcnZlcnNbdF0pfX0se2tleToiZW1pdCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkoZT4xP2UtMTowKSxyPTE7cjxlO3IrKyluW3ItMV09YXJndW1lbnRzW3JdO2lmKHRoaXMub2JzZXJ2ZXJzW3RdKXt2YXIgbz1bXS5jb25jYXQodGhpcy5vYnNlcnZlcnNbdF0pO28uZm9yRWFjaChmdW5jdGlvbih0KXt0LmFwcGx5KHZvaWQgMCxuKX0pfWlmKHRoaXMub2JzZXJ2ZXJzWyIqIl0pe3ZhciBpPVtdLmNvbmNhdCh0aGlzLm9ic2VydmVyc1siKiJdKTtpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5hcHBseShlLFt0XS5jb25jYXQobikpfSl9fX1dKSx0fSgpO2Z1bmN0aW9uIE10KCl7dmFyIHQsZSxuPW5ldyBQcm9taXNlKGZ1bmN0aW9uKG4scil7dD1uLGU9cn0pO3JldHVybiBuLnJlc29sdmU9dCxuLnJlamVjdD1lLG59ZnVuY3Rpb24gVXQodCl7cmV0dXJuIG51bGw9PXQ/IiI6IiIrdH1mdW5jdGlvbiBCdCh0LGUsbil7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5pbmRleE9mKCIjIyMiKT4tMT90LnJlcGxhY2UoLyMjIy9nLCIuIik6dH1mdW5jdGlvbiBvKCl7cmV0dXJuIXR8fCJzdHJpbmciPT10eXBlb2YgdH1mb3IodmFyIGk9InN0cmluZyIhPXR5cGVvZiBlP1tdLmNvbmNhdChlKTplLnNwbGl0KCIuIik7aS5sZW5ndGg+MTspe2lmKG8oKSlyZXR1cm57fTt2YXIgYT1yKGkuc2hpZnQoKSk7IXRbYV0mJm4mJih0W2FdPW5ldyBuKSx0PXRbYV19cmV0dXJuIG8oKT97fTp7b2JqOnQsazpyKGkuc2hpZnQoKSl9fWZ1bmN0aW9uIHF0KHQsZSxuKXt2YXIgcj1CdCh0LGUsT2JqZWN0KTtyLm9ialtyLmtdPW59ZnVuY3Rpb24gRnQodCxlKXt2YXIgbj1CdCh0LGUpLHI9bi5vYmosbz1uLms7aWYocilyZXR1cm4gcltvXX1mdW5jdGlvbiBIdCh0LGUsbil7dmFyIHI9RnQodCxuKTtyZXR1cm4gdm9pZCAwIT09cj9yOkZ0KGUsbil9ZnVuY3Rpb24genQodCxlLG4pe2Zvcih2YXIgciBpbiBlKSJfX3Byb3RvX18iIT09ciYmImNvbnN0cnVjdG9yIiE9PXImJihyIGluIHQ/InN0cmluZyI9PXR5cGVvZiB0W3JdfHx0W3JdaW5zdGFuY2VvZiBTdHJpbmd8fCJzdHJpbmciPT10eXBlb2YgZVtyXXx8ZVtyXWluc3RhbmNlb2YgU3RyaW5nP24mJih0W3JdPWVbcl0pOnp0KHRbcl0sZVtyXSxuKTp0W3JdPWVbcl0pO3JldHVybiB0fWZ1bmN0aW9uIFd0KHQpe3JldHVybiB0LnJlcGxhY2UoL1tcLVxbXF1cL1x7XH1cKFwpXCpcK1w/XC5cXFxeXCRcfF0vZywiXFwkJiIpfXZhciAkdD17IiYiOiImYW1wOyIsIjwiOiImbHQ7IiwiPiI6IiZndDsiLCciJzoiJnF1b3Q7IiwiJyI6IiYjMzk7IiwiLyI6IiYjeDJGOyJ9O2Z1bmN0aW9uIFl0KHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD90LnJlcGxhY2UoL1smPD4iJ1wvXS9nLGZ1bmN0aW9uKHQpe3JldHVybiAkdFt0XX0pOnR9dmFyIFZ0PSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cubmF2aWdhdG9yJiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCYmd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZigiTVNJRSIpPi0xLEd0PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCl7dmFyIG4scj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e25zOlsidHJhbnNsYXRpb24iXSxkZWZhdWx0TlM6InRyYW5zbGF0aW9uIn07cmV0dXJuIFR0KHRoaXMsZSksbj1MdCh0aGlzLFJ0KGUpLmNhbGwodGhpcykpLFZ0JiZEdC5jYWxsKEN0KG4pKSxuLmRhdGE9dHx8e30sbi5vcHRpb25zPXIsdm9pZCAwPT09bi5vcHRpb25zLmtleVNlcGFyYXRvciYmKG4ub3B0aW9ucy5rZXlTZXBhcmF0b3I9Ii4iKSxufXJldHVybiBOdChlLER0KSxBdChlLFt7a2V5OiJhZGROYW1lc3BhY2VzIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnMubnMuaW5kZXhPZih0KTwwJiZ0aGlzLm9wdGlvbnMubnMucHVzaCh0KX19LHtrZXk6InJlbW92ZU5hbWVzcGFjZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9ucy5ucy5pbmRleE9mKHQpO2U+LTEmJnRoaXMub3B0aW9ucy5ucy5zcGxpY2UoZSwxKX19LHtrZXk6ImdldFJlc291cmNlIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOnt9LG89dm9pZCAwIT09ci5rZXlTZXBhcmF0b3I/ci5rZXlTZXBhcmF0b3I6dGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcixpPVt0LGVdO3JldHVybiBuJiYic3RyaW5nIiE9dHlwZW9mIG4mJihpPWkuY29uY2F0KG4pKSxuJiYic3RyaW5nIj09dHlwZW9mIG4mJihpPWkuY29uY2F0KG8/bi5zcGxpdChvKTpuKSksdC5pbmRleE9mKCIuIik+LTEmJihpPXQuc3BsaXQoIi4iKSksRnQodGhpcy5kYXRhLGkpfX0se2tleToiYWRkUmVzb3VyY2UiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XTp7c2lsZW50OiExfSxpPXRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3I7dm9pZCAwPT09aSYmKGk9Ii4iKTt2YXIgYT1bdCxlXTtuJiYoYT1hLmNvbmNhdChpP24uc3BsaXQoaSk6bikpLHQuaW5kZXhPZigiLiIpPi0xJiYocj1lLGU9KGE9dC5zcGxpdCgiLiIpKVsxXSksdGhpcy5hZGROYW1lc3BhY2VzKGUpLHF0KHRoaXMuZGF0YSxhLHIpLG8uc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIix0LGUsbixyKX19LHtrZXk6ImFkZFJlc291cmNlcyIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7c2lsZW50OiExfTtmb3IodmFyIG8gaW4gbikic3RyaW5nIiE9dHlwZW9mIG5bb10mJiJbb2JqZWN0IEFycmF5XSIhPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KG5bb10pfHx0aGlzLmFkZFJlc291cmNlKHQsZSxvLG5bb10se3NpbGVudDohMH0pO3Iuc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIix0LGUsbil9fSx7a2V5OiJhZGRSZXNvdXJjZUJ1bmRsZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjUmJnZvaWQgMCE9PWFyZ3VtZW50c1s1XT9hcmd1bWVudHNbNV06e3NpbGVudDohMX0sYT1bdCxlXTt0LmluZGV4T2YoIi4iKT4tMSYmKHI9bixuPWUsZT0oYT10LnNwbGl0KCIuIikpWzFdKSx0aGlzLmFkZE5hbWVzcGFjZXMoZSk7dmFyIHM9RnQodGhpcy5kYXRhLGEpfHx7fTtyP3p0KHMsbixvKTpzPWp0KHt9LHMsbikscXQodGhpcy5kYXRhLGEscyksaS5zaWxlbnR8fHRoaXMuZW1pdCgiYWRkZWQiLHQsZSxuKX19LHtrZXk6InJlbW92ZVJlc291cmNlQnVuZGxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMuaGFzUmVzb3VyY2VCdW5kbGUodCxlKSYmZGVsZXRlIHRoaXMuZGF0YVt0XVtlXSx0aGlzLnJlbW92ZU5hbWVzcGFjZXMoZSksdGhpcy5lbWl0KCJyZW1vdmVkIix0LGUpfX0se2tleToiaGFzUmVzb3VyY2VCdW5kbGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuZ2V0UmVzb3VyY2UodCxlKX19LHtrZXk6ImdldFJlc291cmNlQnVuZGxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiBlfHwoZT10aGlzLm9wdGlvbnMuZGVmYXVsdE5TKSwidjEiPT09dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEk/anQoe30se30sdGhpcy5nZXRSZXNvdXJjZSh0LGUpKTp0aGlzLmdldFJlc291cmNlKHQsZSl9fSx7a2V5OiJnZXREYXRhQnlMYW5ndWFnZSIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGF0YVt0XX19LHtrZXk6InRvSlNPTiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhfX1dKSxlfSgpLEt0PXtwcm9jZXNzb3JzOnt9LGFkZFBvc3RQcm9jZXNzb3I6ZnVuY3Rpb24odCl7dGhpcy5wcm9jZXNzb3JzW3QubmFtZV09dH0saGFuZGxlOmZ1bmN0aW9uKHQsZSxuLHIsbyl7dmFyIGk9dGhpcztyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2kucHJvY2Vzc29yc1t0XSYmKGU9aS5wcm9jZXNzb3JzW3RdLnByb2Nlc3MoZSxuLHIsbykpfSksZX19LFh0PXt9LEp0PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCl7dmFyIG4scixvLGksYT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307cmV0dXJuIFR0KHRoaXMsZSksbj1MdCh0aGlzLFJ0KGUpLmNhbGwodGhpcykpLFZ0JiZEdC5jYWxsKEN0KG4pKSxyPVsicmVzb3VyY2VTdG9yZSIsImxhbmd1YWdlVXRpbHMiLCJwbHVyYWxSZXNvbHZlciIsImludGVycG9sYXRvciIsImJhY2tlbmRDb25uZWN0b3IiLCJpMThuRm9ybWF0IiwidXRpbHMiXSxvPXQsaT1DdChuKSxyLmZvckVhY2goZnVuY3Rpb24odCl7b1t0XSYmKGlbdF09b1t0XSl9KSxuLm9wdGlvbnM9YSx2b2lkIDA9PT1uLm9wdGlvbnMua2V5U2VwYXJhdG9yJiYobi5vcHRpb25zLmtleVNlcGFyYXRvcj0iLiIpLG4ubG9nZ2VyPV90LmNyZWF0ZSgidHJhbnNsYXRvciIpLG59cmV0dXJuIE50KGUsRHQpLEF0KGUsW3trZXk6ImNoYW5nZUxhbmd1YWdlIix2YWx1ZTpmdW5jdGlvbih0KXt0JiYodGhpcy5sYW5ndWFnZT10KX19LHtrZXk6ImV4aXN0cyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOntpbnRlcnBvbGF0aW9uOnt9fSxuPXRoaXMucmVzb2x2ZSh0LGUpO3JldHVybiBuJiZ2b2lkIDAhPT1uLnJlc319LHtrZXk6ImV4dHJhY3RGcm9tS2V5Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXZvaWQgMCE9PWUubnNTZXBhcmF0b3I/ZS5uc1NlcGFyYXRvcjp0aGlzLm9wdGlvbnMubnNTZXBhcmF0b3I7dm9pZCAwPT09biYmKG49IjoiKTt2YXIgcj12b2lkIDAhPT1lLmtleVNlcGFyYXRvcj9lLmtleVNlcGFyYXRvcjp0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLG89ZS5uc3x8dGhpcy5vcHRpb25zLmRlZmF1bHROUztpZihuJiZ0LmluZGV4T2Yobik+LTEpe3ZhciBpPXQubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7aWYoaSYmaS5sZW5ndGg+MClyZXR1cm57a2V5OnQsbmFtZXNwYWNlczpvfTt2YXIgYT10LnNwbGl0KG4pOyhuIT09cnx8bj09PXImJnRoaXMub3B0aW9ucy5ucy5pbmRleE9mKGFbMF0pPi0xKSYmKG89YS5zaGlmdCgpKSx0PWEuam9pbihyKX1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIG8mJihvPVtvXSkse2tleTp0LG5hbWVzcGFjZXM6b319fSx7a2V5OiJ0cmFuc2xhdGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzO2lmKCJvYmplY3QiIT09U3QoZSkmJnRoaXMub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlciYmKGU9dGhpcy5vcHRpb25zLm92ZXJsb2FkVHJhbnNsYXRpb25PcHRpb25IYW5kbGVyKGFyZ3VtZW50cykpLGV8fChlPXt9KSxudWxsPT10KXJldHVybiIiO0FycmF5LmlzQXJyYXkodCl8fCh0PVtTdHJpbmcodCldKTt2YXIgbz12b2lkIDAhPT1lLmtleVNlcGFyYXRvcj9lLmtleVNlcGFyYXRvcjp0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLGk9dGhpcy5leHRyYWN0RnJvbUtleSh0W3QubGVuZ3RoLTFdLGUpLGE9aS5rZXkscz1pLm5hbWVzcGFjZXMsdT1zW3MubGVuZ3RoLTFdLGM9ZS5sbmd8fHRoaXMubGFuZ3VhZ2UsbD1lLmFwcGVuZE5hbWVzcGFjZVRvQ0lNb2RlfHx0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU7aWYoYyYmImNpbW9kZSI9PT1jLnRvTG93ZXJDYXNlKCkpe2lmKGwpe3ZhciBmPWUubnNTZXBhcmF0b3J8fHRoaXMub3B0aW9ucy5uc1NlcGFyYXRvcjtyZXR1cm4gdStmK2F9cmV0dXJuIGF9dmFyIHA9dGhpcy5yZXNvbHZlKHQsZSksaD1wJiZwLnJlcyxkPXAmJnAudXNlZEtleXx8YSxnPXAmJnAuZXhhY3RVc2VkS2V5fHxhLHY9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseShoKSx5PVsiW29iamVjdCBOdW1iZXJdIiwiW29iamVjdCBGdW5jdGlvbl0iLCJbb2JqZWN0IFJlZ0V4cF0iXSxtPXZvaWQgMCE9PWUuam9pbkFycmF5cz9lLmpvaW5BcnJheXM6dGhpcy5vcHRpb25zLmpvaW5BcnJheXMsYj0hdGhpcy5pMThuRm9ybWF0fHx0aGlzLmkxOG5Gb3JtYXQuaGFuZGxlQXNPYmplY3QseD0ic3RyaW5nIiE9dHlwZW9mIGgmJiJib29sZWFuIiE9dHlwZW9mIGgmJiJudW1iZXIiIT10eXBlb2YgaDtpZihiJiZoJiZ4JiZ5LmluZGV4T2Yodik8MCYmKCJzdHJpbmciIT10eXBlb2YgbXx8IltvYmplY3QgQXJyYXldIiE9PXYpKXtpZighZS5yZXR1cm5PYmplY3RzJiYhdGhpcy5vcHRpb25zLnJldHVybk9iamVjdHMpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImFjY2Vzc2luZyBhbiBvYmplY3QgLSBidXQgcmV0dXJuT2JqZWN0cyBvcHRpb25zIGlzIG5vdCBlbmFibGVkISIpLHRoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXI/dGhpcy5vcHRpb25zLnJldHVybmVkT2JqZWN0SGFuZGxlcihkLGgsZSk6ImtleSAnIi5jb25jYXQoYSwiICgiKS5jb25jYXQodGhpcy5sYW5ndWFnZSwiKScgcmV0dXJuZWQgYW4gb2JqZWN0IGluc3RlYWQgb2Ygc3RyaW5nLiIpO2lmKG8pe3ZhciB3PSJbb2JqZWN0IEFycmF5XSI9PT12LGs9dz9bXTp7fSxTPXc/ZzpkO2Zvcih2YXIgRSBpbiBoKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChoLEUpKXt2YXIgaj0iIi5jb25jYXQoUykuY29uY2F0KG8pLmNvbmNhdChFKTtrW0VdPXRoaXMudHJhbnNsYXRlKGosanQoe30sZSx7am9pbkFycmF5czohMSxuczpzfSkpLGtbRV09PT1qJiYoa1tFXT1oW0VdKX1oPWt9fWVsc2UgaWYoYiYmInN0cmluZyI9PXR5cGVvZiBtJiYiW29iamVjdCBBcnJheV0iPT09dikoaD1oLmpvaW4obSkpJiYoaD10aGlzLmV4dGVuZFRyYW5zbGF0aW9uKGgsdCxlLG4pKTtlbHNle3ZhciBUPSExLE89ITE7aWYoIXRoaXMuaXNWYWxpZExvb2t1cChoKSYmdm9pZCAwIT09ZS5kZWZhdWx0VmFsdWUpe2lmKFQ9ITAsdm9pZCAwIT09ZS5jb3VudCl7dmFyIEE9dGhpcy5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXgoYyxlLmNvdW50KTtoPWVbImRlZmF1bHRWYWx1ZSIuY29uY2F0KEEpXX1ofHwoaD1lLmRlZmF1bHRWYWx1ZSl9dGhpcy5pc1ZhbGlkTG9va3VwKGgpfHwoTz0hMCxoPWEpO3ZhciBDPWUuZGVmYXVsdFZhbHVlJiZlLmRlZmF1bHRWYWx1ZSE9PWgmJnRoaXMub3B0aW9ucy51cGRhdGVNaXNzaW5nO2lmKE98fFR8fEMpe2lmKHRoaXMubG9nZ2VyLmxvZyhDPyJ1cGRhdGVLZXkiOiJtaXNzaW5nS2V5IixjLHUsYSxDP2UuZGVmYXVsdFZhbHVlOmgpLG8pe3ZhciBMPXRoaXMucmVzb2x2ZShhLGp0KHt9LGUse2tleVNlcGFyYXRvcjohMX0pKTtMJiZMLnJlcyYmdGhpcy5sb2dnZXIud2FybigiU2VlbXMgdGhlIGxvYWRlZCB0cmFuc2xhdGlvbnMgd2VyZSBpbiBmbGF0IEpTT04gZm9ybWF0IGluc3RlYWQgb2YgbmVzdGVkLiBFaXRoZXIgc2V0IGtleVNlcGFyYXRvcjogZmFsc2Ugb24gaW5pdCBvciBtYWtlIHN1cmUgeW91ciB0cmFuc2xhdGlvbnMgYXJlIHB1Ymxpc2hlZCBpbiBuZXN0ZWQgZm9ybWF0LiIpfXZhciBSPVtdLFA9dGhpcy5sYW5ndWFnZVV0aWxzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nLGUubG5nfHx0aGlzLmxhbmd1YWdlKTtpZigiZmFsbGJhY2siPT09dGhpcy5vcHRpb25zLnNhdmVNaXNzaW5nVG8mJlAmJlBbMF0pZm9yKHZhciBOPTA7TjxQLmxlbmd0aDtOKyspUi5wdXNoKFBbTl0pO2Vsc2UiYWxsIj09PXRoaXMub3B0aW9ucy5zYXZlTWlzc2luZ1RvP1I9dGhpcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShlLmxuZ3x8dGhpcy5sYW5ndWFnZSk6Ui5wdXNoKGUubG5nfHx0aGlzLmxhbmd1YWdlKTt2YXIgST1mdW5jdGlvbih0LG4pe3Iub3B0aW9ucy5taXNzaW5nS2V5SGFuZGxlcj9yLm9wdGlvbnMubWlzc2luZ0tleUhhbmRsZXIodCx1LG4sQz9lLmRlZmF1bHRWYWx1ZTpoLEMsZSk6ci5iYWNrZW5kQ29ubmVjdG9yJiZyLmJhY2tlbmRDb25uZWN0b3Iuc2F2ZU1pc3NpbmcmJnIuYmFja2VuZENvbm5lY3Rvci5zYXZlTWlzc2luZyh0LHUsbixDP2UuZGVmYXVsdFZhbHVlOmgsQyxlKSxyLmVtaXQoIm1pc3NpbmdLZXkiLHQsdSxuLGgpfTtpZih0aGlzLm9wdGlvbnMuc2F2ZU1pc3Npbmcpe3ZhciBfPXZvaWQgMCE9PWUuY291bnQmJiJzdHJpbmciIT10eXBlb2YgZS5jb3VudDt0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdQbHVyYWxzJiZfP1IuZm9yRWFjaChmdW5jdGlvbih0KXtyLnBsdXJhbFJlc29sdmVyLmdldFBsdXJhbEZvcm1zT2ZLZXkodCxhKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBJKFt0XSxlKX0pfSk6SShSLGEpfX1oPXRoaXMuZXh0ZW5kVHJhbnNsYXRpb24oaCx0LGUscCxuKSxPJiZoPT09YSYmdGhpcy5vcHRpb25zLmFwcGVuZE5hbWVzcGFjZVRvTWlzc2luZ0tleSYmKGg9IiIuY29uY2F0KHUsIjoiKS5jb25jYXQoYSkpLE8mJnRoaXMub3B0aW9ucy5wYXJzZU1pc3NpbmdLZXlIYW5kbGVyJiYoaD10aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlcihoKSl9cmV0dXJuIGh9fSx7a2V5OiJleHRlbmRUcmFuc2xhdGlvbiIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvKXt2YXIgaT10aGlzO2lmKHRoaXMuaTE4bkZvcm1hdCYmdGhpcy5pMThuRm9ybWF0LnBhcnNlKXQ9dGhpcy5pMThuRm9ybWF0LnBhcnNlKHQsbixyLnVzZWRMbmcsci51c2VkTlMsci51c2VkS2V5LHtyZXNvbHZlZDpyfSk7ZWxzZSBpZighbi5za2lwSW50ZXJwb2xhdGlvbil7bi5pbnRlcnBvbGF0aW9uJiZ0aGlzLmludGVycG9sYXRvci5pbml0KGp0KHt9LG4se2ludGVycG9sYXRpb246anQoe30sdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24sbi5pbnRlcnBvbGF0aW9uKX0pKTt2YXIgYSxzPW4uaW50ZXJwb2xhdGlvbiYmbi5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlc3x8dGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzO2lmKHMpe3ZhciB1PXQubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7YT11JiZ1Lmxlbmd0aH12YXIgYz1uLnJlcGxhY2UmJiJzdHJpbmciIT10eXBlb2Ygbi5yZXBsYWNlP24ucmVwbGFjZTpuO2lmKHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMmJihjPWp0KHt9LHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMsYykpLHQ9dGhpcy5pbnRlcnBvbGF0b3IuaW50ZXJwb2xhdGUodCxjLG4ubG5nfHx0aGlzLmxhbmd1YWdlLG4pLHMpe3ZhciBsPXQubWF0Y2godGhpcy5pbnRlcnBvbGF0b3IubmVzdGluZ1JlZ2V4cCk7YTwobCYmbC5sZW5ndGgpJiYobi5uZXN0PSExKX0hMSE9PW4ubmVzdCYmKHQ9dGhpcy5pbnRlcnBvbGF0b3IubmVzdCh0LGZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkodCksYT0wO2E8dDthKyspclthXT1hcmd1bWVudHNbYV07cmV0dXJuIG8mJm9bMF09PT1yWzBdJiYhbi5jb250ZXh0PyhpLmxvZ2dlci53YXJuKCJJdCBzZWVtcyB5b3UgYXJlIG5lc3RpbmcgcmVjdXJzaXZlbHkga2V5OiAiLmNvbmNhdChyWzBdLCIgaW4ga2V5OiAiKS5jb25jYXQoZVswXSkpLG51bGwpOmkudHJhbnNsYXRlLmFwcGx5KGksci5jb25jYXQoW2VdKSl9LG4pKSxuLmludGVycG9sYXRpb24mJnRoaXMuaW50ZXJwb2xhdG9yLnJlc2V0KCl9dmFyIGY9bi5wb3N0UHJvY2Vzc3x8dGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzLHA9InN0cmluZyI9PXR5cGVvZiBmP1tmXTpmO3JldHVybiBudWxsIT10JiZwJiZwLmxlbmd0aCYmITEhPT1uLmFwcGx5UG9zdFByb2Nlc3NvciYmKHQ9S3QuaGFuZGxlKHAsdCxlLHRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzUGFzc1Jlc29sdmVkP2p0KHtpMThuUmVzb2x2ZWQ6cn0sbik6bix0aGlzKSksdH19LHtrZXk6InJlc29sdmUiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlLG4scixvLGksYT10aGlzLHM9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmKHQ9W3RdKSx0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoIWEuaXNWYWxpZExvb2t1cChlKSl7dmFyIHU9YS5leHRyYWN0RnJvbUtleSh0LHMpLGM9dS5rZXk7bj1jO3ZhciBsPXUubmFtZXNwYWNlczthLm9wdGlvbnMuZmFsbGJhY2tOUyYmKGw9bC5jb25jYXQoYS5vcHRpb25zLmZhbGxiYWNrTlMpKTt2YXIgZj12b2lkIDAhPT1zLmNvdW50JiYic3RyaW5nIiE9dHlwZW9mIHMuY291bnQscD12b2lkIDAhPT1zLmNvbnRleHQmJiJzdHJpbmciPT10eXBlb2Ygcy5jb250ZXh0JiYiIiE9PXMuY29udGV4dCxoPXMubG5ncz9zLmxuZ3M6YS5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShzLmxuZ3x8YS5sYW5ndWFnZSxzLmZhbGxiYWNrTG5nKTtsLmZvckVhY2goZnVuY3Rpb24odCl7YS5pc1ZhbGlkTG9va3VwKGUpfHwoaT10LCFYdFsiIi5jb25jYXQoaFswXSwiLSIpLmNvbmNhdCh0KV0mJmEudXRpbHMmJmEudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlJiYhYS51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UoaSkmJihYdFsiIi5jb25jYXQoaFswXSwiLSIpLmNvbmNhdCh0KV09ITAsYS5sb2dnZXIud2Fybigna2V5ICInLmNvbmNhdChuLCciIGZvciBsYW5ndWFnZXMgIicpLmNvbmNhdChoLmpvaW4oIiwgIiksJyIgd29uXCd0IGdldCByZXNvbHZlZCBhcyBuYW1lc3BhY2UgIicpLmNvbmNhdChpLCciIHdhcyBub3QgeWV0IGxvYWRlZCcpLCJUaGlzIG1lYW5zIHNvbWV0aGluZyBJUyBXUk9ORyBpbiB5b3VyIHNldHVwLiBZb3UgYWNjZXNzIHRoZSB0IGZ1bmN0aW9uIGJlZm9yZSBpMThuZXh0LmluaXQgLyBpMThuZXh0LmxvYWROYW1lc3BhY2UgLyBpMThuZXh0LmNoYW5nZUxhbmd1YWdlIHdhcyBkb25lLiBXYWl0IGZvciB0aGUgY2FsbGJhY2sgb3IgUHJvbWlzZSB0byByZXNvbHZlIGJlZm9yZSBhY2Nlc3NpbmcgaXQhISEiKSksaC5mb3JFYWNoKGZ1bmN0aW9uKG4pe2lmKCFhLmlzVmFsaWRMb29rdXAoZSkpe289bjt2YXIgaSx1LGw9YyxoPVtsXTtpZihhLmkxOG5Gb3JtYXQmJmEuaTE4bkZvcm1hdC5hZGRMb29rdXBLZXlzKWEuaTE4bkZvcm1hdC5hZGRMb29rdXBLZXlzKGgsYyxuLHQscyk7ZWxzZSBmJiYoaT1hLnBsdXJhbFJlc29sdmVyLmdldFN1ZmZpeChuLHMuY291bnQpKSxmJiZwJiZoLnB1c2gobCtpKSxwJiZoLnB1c2gobCs9IiIuY29uY2F0KGEub3B0aW9ucy5jb250ZXh0U2VwYXJhdG9yKS5jb25jYXQocy5jb250ZXh0KSksZiYmaC5wdXNoKGwrPWkpO2Zvcig7dT1oLnBvcCgpOylhLmlzVmFsaWRMb29rdXAoZSl8fChyPXUsZT1hLmdldFJlc291cmNlKG4sdCx1LHMpKX19KSl9KX19KSx7cmVzOmUsdXNlZEtleTpuLGV4YWN0VXNlZEtleTpyLHVzZWRMbmc6byx1c2VkTlM6aX19fSx7a2V5OiJpc1ZhbGlkTG9va3VwIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4hKHZvaWQgMD09PXR8fCF0aGlzLm9wdGlvbnMucmV0dXJuTnVsbCYmbnVsbD09PXR8fCF0aGlzLm9wdGlvbnMucmV0dXJuRW1wdHlTdHJpbmcmJiIiPT09dCl9fSx7a2V5OiJnZXRSZXNvdXJjZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fTtyZXR1cm4gdGhpcy5pMThuRm9ybWF0JiZ0aGlzLmkxOG5Gb3JtYXQuZ2V0UmVzb3VyY2U/dGhpcy5pMThuRm9ybWF0LmdldFJlc291cmNlKHQsZSxuLHIpOnRoaXMucmVzb3VyY2VTdG9yZS5nZXRSZXNvdXJjZSh0LGUsbixyKX19XSksZX0oKTtmdW5jdGlvbiBRdCh0KXtyZXR1cm4gdC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpfXZhciBadD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7VHQodGhpcyx0KSx0aGlzLm9wdGlvbnM9ZSx0aGlzLndoaXRlbGlzdD10aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5nc3x8ITEsdGhpcy5zdXBwb3J0ZWRMbmdzPXRoaXMub3B0aW9ucy5zdXBwb3J0ZWRMbmdzfHwhMSx0aGlzLmxvZ2dlcj1fdC5jcmVhdGUoImxhbmd1YWdlVXRpbHMiKX1yZXR1cm4gQXQodCxbe2tleToiZ2V0U2NyaXB0UGFydEZyb21Db2RlIix2YWx1ZTpmdW5jdGlvbih0KXtpZighdHx8dC5pbmRleE9mKCItIik8MClyZXR1cm4gbnVsbDt2YXIgZT10LnNwbGl0KCItIik7cmV0dXJuIDI9PT1lLmxlbmd0aD9udWxsOihlLnBvcCgpLCJ4Ij09PWVbZS5sZW5ndGgtMV0udG9Mb3dlckNhc2UoKT9udWxsOnRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKGUuam9pbigiLSIpKSl9fSx7a2V5OiJnZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXR8fHQuaW5kZXhPZigiLSIpPDApcmV0dXJuIHQ7dmFyIGU9dC5zcGxpdCgiLSIpO3JldHVybiB0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlWzBdKX19LHtrZXk6ImZvcm1hdExhbmd1YWdlQ29kZSIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoInN0cmluZyI9PXR5cGVvZiB0JiZ0LmluZGV4T2YoIi0iKT4tMSl7dmFyIGU9WyJoYW5zIiwiaGFudCIsImxhdG4iLCJjeXJsIiwiY2FucyIsIm1vbmciLCJhcmFiIl0sbj10LnNwbGl0KCItIik7cmV0dXJuIHRoaXMub3B0aW9ucy5sb3dlckNhc2VMbmc/bj1uLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC50b0xvd2VyQ2FzZSgpfSk6Mj09PW4ubGVuZ3RoPyhuWzBdPW5bMF0udG9Mb3dlckNhc2UoKSxuWzFdPW5bMV0udG9VcHBlckNhc2UoKSxlLmluZGV4T2YoblsxXS50b0xvd2VyQ2FzZSgpKT4tMSYmKG5bMV09UXQoblsxXS50b0xvd2VyQ2FzZSgpKSkpOjM9PT1uLmxlbmd0aCYmKG5bMF09blswXS50b0xvd2VyQ2FzZSgpLDI9PT1uWzFdLmxlbmd0aCYmKG5bMV09blsxXS50b1VwcGVyQ2FzZSgpKSwic2duIiE9PW5bMF0mJjI9PT1uWzJdLmxlbmd0aCYmKG5bMl09blsyXS50b1VwcGVyQ2FzZSgpKSxlLmluZGV4T2YoblsxXS50b0xvd2VyQ2FzZSgpKT4tMSYmKG5bMV09UXQoblsxXS50b0xvd2VyQ2FzZSgpKSksZS5pbmRleE9mKG5bMl0udG9Mb3dlckNhc2UoKSk+LTEmJihuWzJdPVF0KG5bMl0udG9Mb3dlckNhc2UoKSkpKSxuLmpvaW4oIi0iKX1yZXR1cm4gdGhpcy5vcHRpb25zLmNsZWFuQ29kZXx8dGhpcy5vcHRpb25zLmxvd2VyQ2FzZUxuZz90LnRvTG93ZXJDYXNlKCk6dH19LHtrZXk6ImlzV2hpdGVsaXN0ZWQiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxvZ2dlci5kZXByZWNhdGUoImxhbmd1YWdlVXRpbHMuaXNXaGl0ZWxpc3RlZCIsJ2Z1bmN0aW9uICJpc1doaXRlbGlzdGVkIiB3aWxsIGJlIHJlbmFtZWQgdG8gImlzU3VwcG9ydGVkQ29kZSIgaW4gdGhlIG5leHQgbWFqb3IgLSBwbGVhc2UgbWFrZSBzdXJlIHRvIHJlbmFtZSBpdFwncyB1c2FnZSBhc2FwLicpLHRoaXMuaXNTdXBwb3J0ZWRDb2RlKHQpfX0se2tleToiaXNTdXBwb3J0ZWRDb2RlIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4oImxhbmd1YWdlT25seSI9PT10aGlzLm9wdGlvbnMubG9hZHx8dGhpcy5vcHRpb25zLm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncykmJih0PXRoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUodCkpLCF0aGlzLnN1cHBvcnRlZExuZ3N8fCF0aGlzLnN1cHBvcnRlZExuZ3MubGVuZ3RofHx0aGlzLnN1cHBvcnRlZExuZ3MuaW5kZXhPZih0KT4tMX19LHtrZXk6ImdldEJlc3RNYXRjaEZyb21Db2RlcyIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGUsbj10aGlzO3JldHVybiB0Pyh0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoIWUpe3ZhciByPW4uZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpO24ub3B0aW9ucy5zdXBwb3J0ZWRMbmdzJiYhbi5pc1N1cHBvcnRlZENvZGUocil8fChlPXIpfX0pLCFlJiZ0aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5ncyYmdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKCFlKXt2YXIgcj1uLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpO2lmKG4uaXNTdXBwb3J0ZWRDb2RlKHIpKXJldHVybiBlPXI7ZT1uLm9wdGlvbnMuc3VwcG9ydGVkTG5ncy5maW5kKGZ1bmN0aW9uKHQpe2lmKDA9PT10LmluZGV4T2YocikpcmV0dXJuIHR9KX19KSxlfHwoZT10aGlzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nKVswXSksZSk6bnVsbH19LHtrZXk6ImdldEZhbGxiYWNrQ29kZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYoIXQpcmV0dXJuW107aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PXQoZSkpLCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9W3RdKSwiW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5hcHBseSh0KSlyZXR1cm4gdDtpZighZSlyZXR1cm4gdC5kZWZhdWx0fHxbXTt2YXIgbj10W2VdO3JldHVybiBufHwobj10W3RoaXMuZ2V0U2NyaXB0UGFydEZyb21Db2RlKGUpXSksbnx8KG49dFt0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlKV0pLG58fChuPXRbdGhpcy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZShlKV0pLG58fChuPXQuZGVmYXVsdCksbnx8W119fSx7a2V5OiJ0b1Jlc29sdmVIaWVyYXJjaHkiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPXRoaXMuZ2V0RmFsbGJhY2tDb2RlcyhlfHx0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmd8fFtdLHQpLG89W10saT1mdW5jdGlvbih0KXt0JiYobi5pc1N1cHBvcnRlZENvZGUodCk/by5wdXNoKHQpOm4ubG9nZ2VyLndhcm4oInJlamVjdGluZyBsYW5ndWFnZSBjb2RlIG5vdCBmb3VuZCBpbiBzdXBwb3J0ZWRMbmdzOiAiLmNvbmNhdCh0KSkpfTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQmJnQuaW5kZXhPZigiLSIpPi0xPygibGFuZ3VhZ2VPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiZpKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKSwibGFuZ3VhZ2VPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiYiY3VycmVudE9ubHkiIT09dGhpcy5vcHRpb25zLmxvYWQmJmkodGhpcy5nZXRTY3JpcHRQYXJ0RnJvbUNvZGUodCkpLCJjdXJyZW50T25seSIhPT10aGlzLm9wdGlvbnMubG9hZCYmaSh0aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpKSk6InN0cmluZyI9PXR5cGVvZiB0JiZpKHRoaXMuZm9ybWF0TGFuZ3VhZ2VDb2RlKHQpKSxyLmZvckVhY2goZnVuY3Rpb24odCl7by5pbmRleE9mKHQpPDAmJmkobi5mb3JtYXRMYW5ndWFnZUNvZGUodCkpfSksb319XSksdH0oKSx0ZT1be2xuZ3M6WyJhY2giLCJhayIsImFtIiwiYXJuIiwiYnIiLCJmaWwiLCJndW4iLCJsbiIsIm1mZSIsIm1nIiwibWkiLCJvYyIsInB0IiwicHQtQlIiLCJ0ZyIsInRpIiwidHIiLCJ1eiIsIndhIl0sbnI6WzEsMl0sZmM6MX0se2xuZ3M6WyJhZiIsImFuIiwiYXN0IiwiYXoiLCJiZyIsImJuIiwiY2EiLCJkYSIsImRlIiwiZGV2IiwiZWwiLCJlbiIsImVvIiwiZXMiLCJldCIsImV1IiwiZmkiLCJmbyIsImZ1ciIsImZ5IiwiZ2wiLCJndSIsImhhIiwiaGkiLCJodSIsImh5IiwiaWEiLCJpdCIsImtuIiwia3UiLCJsYiIsIm1haSIsIm1sIiwibW4iLCJtciIsIm5haCIsIm5hcCIsIm5iIiwibmUiLCJubCIsIm5uIiwibm8iLCJuc28iLCJwYSIsInBhcCIsInBtcyIsInBzIiwicHQtUFQiLCJybSIsInNjbyIsInNlIiwic2kiLCJzbyIsInNvbiIsInNxIiwic3YiLCJzdyIsInRhIiwidGUiLCJ0ayIsInVyIiwieW8iXSxucjpbMSwyXSxmYzoyfSx7bG5nczpbImF5IiwiYm8iLCJjZ2ciLCJmYSIsImh0IiwiaWQiLCJqYSIsImpibyIsImthIiwia2siLCJrbSIsImtvIiwia3kiLCJsbyIsIm1zIiwic2FoIiwic3UiLCJ0aCIsInR0IiwidWciLCJ2aSIsIndvIiwiemgiXSxucjpbMV0sZmM6M30se2xuZ3M6WyJiZSIsImJzIiwiY25yIiwiZHoiLCJociIsInJ1Iiwic3IiLCJ1ayJdLG5yOlsxLDIsNV0sZmM6NH0se2xuZ3M6WyJhciJdLG5yOlswLDEsMiwzLDExLDEwMF0sZmM6NX0se2xuZ3M6WyJjcyIsInNrIl0sbnI6WzEsMiw1XSxmYzo2fSx7bG5nczpbImNzYiIsInBsIl0sbnI6WzEsMiw1XSxmYzo3fSx7bG5nczpbImN5Il0sbnI6WzEsMiwzLDhdLGZjOjh9LHtsbmdzOlsiZnIiXSxucjpbMSwyXSxmYzo5fSx7bG5nczpbImdhIl0sbnI6WzEsMiwzLDcsMTFdLGZjOjEwfSx7bG5nczpbImdkIl0sbnI6WzEsMiwzLDIwXSxmYzoxMX0se2xuZ3M6WyJpcyJdLG5yOlsxLDJdLGZjOjEyfSx7bG5nczpbImp2Il0sbnI6WzAsMV0sZmM6MTN9LHtsbmdzOlsia3ciXSxucjpbMSwyLDMsNF0sZmM6MTR9LHtsbmdzOlsibHQiXSxucjpbMSwyLDEwXSxmYzoxNX0se2xuZ3M6WyJsdiJdLG5yOlsxLDIsMF0sZmM6MTZ9LHtsbmdzOlsibWsiXSxucjpbMSwyXSxmYzoxN30se2xuZ3M6WyJtbmsiXSxucjpbMCwxLDJdLGZjOjE4fSx7bG5nczpbIm10Il0sbnI6WzEsMiwxMSwyMF0sZmM6MTl9LHtsbmdzOlsib3IiXSxucjpbMiwxXSxmYzoyfSx7bG5nczpbInJvIl0sbnI6WzEsMiwyMF0sZmM6MjB9LHtsbmdzOlsic2wiXSxucjpbNSwxLDIsM10sZmM6MjF9LHtsbmdzOlsiaGUiLCJpdyJdLG5yOlsxLDIsMjAsMjFdLGZjOjIyfV0sZWU9ezE6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0PjEpfSwyOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMSE9dCl9LDM6ZnVuY3Rpb24odCl7cmV0dXJuIDB9LDQ6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0JTEwPT0xJiZ0JTEwMCE9MTE/MDp0JTEwPj0yJiZ0JTEwPD00JiYodCUxMDA8MTB8fHQlMTAwPj0yMCk/MToyKX0sNTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDA9PXQ/MDoxPT10PzE6Mj09dD8yOnQlMTAwPj0zJiZ0JTEwMDw9MTA/Mzp0JTEwMD49MTE/NDo1KX0sNjpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDp0Pj0yJiZ0PD00PzE6Mil9LDc6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6dCUxMD49MiYmdCUxMDw9NCYmKHQlMTAwPDEwfHx0JTEwMD49MjApPzE6Mil9LDg6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6Mj09dD8xOjghPXQmJjExIT10PzI6Myl9LDk6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcih0Pj0yKX0sMTA6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6Mj09dD8xOnQ8Nz8yOnQ8MTE/Mzo0KX0sMTE6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10fHwxMT09dD8wOjI9PXR8fDEyPT10PzE6dD4yJiZ0PDIwPzI6Myl9LDEyOmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMCE9MXx8dCUxMDA9PTExKX0sMTM6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigwIT09dCl9LDE0OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIoMT09dD8wOjI9PXQ/MTozPT10PzI6Myl9LDE1OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMD09MSYmdCUxMDAhPTExPzA6dCUxMD49MiYmKHQlMTAwPDEwfHx0JTEwMD49MjApPzE6Mil9LDE2OmZ1bmN0aW9uKHQpe3JldHVybiBOdW1iZXIodCUxMD09MSYmdCUxMDAhPTExPzA6MCE9PXQ/MToyKX0sMTc6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10fHx0JTEwPT0xJiZ0JTEwMCE9MTE/MDoxKX0sMTg6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigwPT10PzA6MT09dD8xOjIpfSwxOTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDowPT10fHx0JTEwMD4xJiZ0JTEwMDwxMT8xOnQlMTAwPjEwJiZ0JTEwMDwyMD8yOjMpfSwyMDpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKDE9PXQ/MDowPT10fHx0JTEwMD4wJiZ0JTEwMDwyMD8xOjIpfSwyMTpmdW5jdGlvbih0KXtyZXR1cm4gTnVtYmVyKHQlMTAwPT0xPzE6dCUxMDA9PTI/Mjp0JTEwMD09M3x8dCUxMDA9PTQ/MzowKX0sMjI6ZnVuY3Rpb24odCl7cmV0dXJuIE51bWJlcigxPT10PzA6Mj09dD8xOih0PDB8fHQ+MTApJiZ0JTEwPT0wPzI6Myl9fTt2YXIgbmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ZhciBuLHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O1R0KHRoaXMsdCksdGhpcy5sYW5ndWFnZVV0aWxzPWUsdGhpcy5vcHRpb25zPXIsdGhpcy5sb2dnZXI9X3QuY3JlYXRlKCJwbHVyYWxSZXNvbHZlciIpLHRoaXMucnVsZXM9KG49e30sdGUuZm9yRWFjaChmdW5jdGlvbih0KXt0LmxuZ3MuZm9yRWFjaChmdW5jdGlvbihlKXtuW2VdPXtudW1iZXJzOnQubnIscGx1cmFsczplZVt0LmZjXX19KX0pLG4pfXJldHVybiBBdCh0LFt7a2V5OiJhZGRSdWxlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMucnVsZXNbdF09ZX19LHtrZXk6ImdldFJ1bGUiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJ1bGVzW3RdfHx0aGlzLnJ1bGVzW3RoaXMubGFuZ3VhZ2VVdGlscy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZSh0KV19fSx7a2V5OiJuZWVkc1BsdXJhbCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRSdWxlKHQpO3JldHVybiBlJiZlLm51bWJlcnMubGVuZ3RoPjF9fSx7a2V5OiJnZXRQbHVyYWxGb3Jtc09mS2V5Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj1bXSxvPXRoaXMuZ2V0UnVsZSh0KTtyZXR1cm4gbz8oby5udW1iZXJzLmZvckVhY2goZnVuY3Rpb24obyl7dmFyIGk9bi5nZXRTdWZmaXgodCxvKTtyLnB1c2goIiIuY29uY2F0KGUpLmNvbmNhdChpKSl9KSxyKTpyfX0se2tleToiZ2V0U3VmZml4Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMscj10aGlzLmdldFJ1bGUodCk7aWYocil7dmFyIG89ci5ub0Ficz9yLnBsdXJhbHMoZSk6ci5wbHVyYWxzKE1hdGguYWJzKGUpKSxpPXIubnVtYmVyc1tvXTt0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXgmJjI9PT1yLm51bWJlcnMubGVuZ3RoJiYxPT09ci5udW1iZXJzWzBdJiYoMj09PWk/aT0icGx1cmFsIjoxPT09aSYmKGk9IiIpKTt2YXIgYT1mdW5jdGlvbigpe3JldHVybiBuLm9wdGlvbnMucHJlcGVuZCYmaS50b1N0cmluZygpP24ub3B0aW9ucy5wcmVwZW5kK2kudG9TdHJpbmcoKTppLnRvU3RyaW5nKCl9O3JldHVybiJ2MSI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04/MT09PWk/IiI6Im51bWJlciI9PXR5cGVvZiBpPyJfcGx1cmFsXyIuY29uY2F0KGkudG9TdHJpbmcoKSk6YSgpOiJ2MiI9PT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04/YSgpOnRoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeCYmMj09PXIubnVtYmVycy5sZW5ndGgmJjE9PT1yLm51bWJlcnNbMF0/YSgpOnRoaXMub3B0aW9ucy5wcmVwZW5kJiZvLnRvU3RyaW5nKCk/dGhpcy5vcHRpb25zLnByZXBlbmQrby50b1N0cmluZygpOm8udG9TdHJpbmcoKX1yZXR1cm4gdGhpcy5sb2dnZXIud2Fybigibm8gcGx1cmFsIHJ1bGUgZm91bmQgZm9yOiAiLmNvbmNhdCh0KSksIiJ9fV0pLHR9KCkscmU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O1R0KHRoaXMsdCksdGhpcy5sb2dnZXI9X3QuY3JlYXRlKCJpbnRlcnBvbGF0b3IiKSx0aGlzLm9wdGlvbnM9ZSx0aGlzLmZvcm1hdD1lLmludGVycG9sYXRpb24mJmUuaW50ZXJwb2xhdGlvbi5mb3JtYXR8fGZ1bmN0aW9uKHQpe3JldHVybiB0fSx0aGlzLmluaXQoZSl9cmV0dXJuIEF0KHQsW3trZXk6ImluaXQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O3QuaW50ZXJwb2xhdGlvbnx8KHQuaW50ZXJwb2xhdGlvbj17ZXNjYXBlVmFsdWU6ITB9KTt2YXIgZT10LmludGVycG9sYXRpb247dGhpcy5lc2NhcGU9dm9pZCAwIT09ZS5lc2NhcGU/ZS5lc2NhcGU6WXQsdGhpcy5lc2NhcGVWYWx1ZT12b2lkIDA9PT1lLmVzY2FwZVZhbHVlfHxlLmVzY2FwZVZhbHVlLHRoaXMudXNlUmF3VmFsdWVUb0VzY2FwZT12b2lkIDAhPT1lLnVzZVJhd1ZhbHVlVG9Fc2NhcGUmJmUudXNlUmF3VmFsdWVUb0VzY2FwZSx0aGlzLnByZWZpeD1lLnByZWZpeD9XdChlLnByZWZpeCk6ZS5wcmVmaXhFc2NhcGVkfHwie3siLHRoaXMuc3VmZml4PWUuc3VmZml4P1d0KGUuc3VmZml4KTplLnN1ZmZpeEVzY2FwZWR8fCJ9fSIsdGhpcy5mb3JtYXRTZXBhcmF0b3I9ZS5mb3JtYXRTZXBhcmF0b3I/ZS5mb3JtYXRTZXBhcmF0b3I6ZS5mb3JtYXRTZXBhcmF0b3J8fCIsIix0aGlzLnVuZXNjYXBlUHJlZml4PWUudW5lc2NhcGVTdWZmaXg/IiI6ZS51bmVzY2FwZVByZWZpeHx8Ii0iLHRoaXMudW5lc2NhcGVTdWZmaXg9dGhpcy51bmVzY2FwZVByZWZpeD8iIjplLnVuZXNjYXBlU3VmZml4fHwiIix0aGlzLm5lc3RpbmdQcmVmaXg9ZS5uZXN0aW5nUHJlZml4P1d0KGUubmVzdGluZ1ByZWZpeCk6ZS5uZXN0aW5nUHJlZml4RXNjYXBlZHx8V3QoIiR0KCIpLHRoaXMubmVzdGluZ1N1ZmZpeD1lLm5lc3RpbmdTdWZmaXg/V3QoZS5uZXN0aW5nU3VmZml4KTplLm5lc3RpbmdTdWZmaXhFc2NhcGVkfHxXdCgiKSIpLHRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I9ZS5uZXN0aW5nT3B0aW9uc1NlcGFyYXRvcj9lLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yOmUubmVzdGluZ09wdGlvbnNTZXBhcmF0b3J8fCIsIix0aGlzLm1heFJlcGxhY2VzPWUubWF4UmVwbGFjZXM/ZS5tYXhSZXBsYWNlczoxZTMsdGhpcy5hbHdheXNGb3JtYXQ9dm9pZCAwIT09ZS5hbHdheXNGb3JtYXQmJmUuYWx3YXlzRm9ybWF0LHRoaXMucmVzZXRSZWdFeHAoKX19LHtrZXk6InJlc2V0Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMub3B0aW9ucyYmdGhpcy5pbml0KHRoaXMub3B0aW9ucyl9fSx7a2V5OiJyZXNldFJlZ0V4cCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0iIi5jb25jYXQodGhpcy5wcmVmaXgsIiguKz8pIikuY29uY2F0KHRoaXMuc3VmZml4KTt0aGlzLnJlZ2V4cD1uZXcgUmVnRXhwKHQsImciKTt2YXIgZT0iIi5jb25jYXQodGhpcy5wcmVmaXgpLmNvbmNhdCh0aGlzLnVuZXNjYXBlUHJlZml4LCIoLis/KSIpLmNvbmNhdCh0aGlzLnVuZXNjYXBlU3VmZml4KS5jb25jYXQodGhpcy5zdWZmaXgpO3RoaXMucmVnZXhwVW5lc2NhcGU9bmV3IFJlZ0V4cChlLCJnIik7dmFyIG49IiIuY29uY2F0KHRoaXMubmVzdGluZ1ByZWZpeCwiKC4rPykiKS5jb25jYXQodGhpcy5uZXN0aW5nU3VmZml4KTt0aGlzLm5lc3RpbmdSZWdleHA9bmV3IFJlZ0V4cChuLCJnIil9fSx7a2V5OiJpbnRlcnBvbGF0ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scil7dmFyIG8saSxhLHM9dGhpcyx1PXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24mJnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXN8fHt9O2Z1bmN0aW9uIGModCl7cmV0dXJuIHQucmVwbGFjZSgvXCQvZywiJCQkJCIpfXZhciBsPWZ1bmN0aW9uKHQpe2lmKHQuaW5kZXhPZihzLmZvcm1hdFNlcGFyYXRvcik8MCl7dmFyIG89SHQoZSx1LHQpO3JldHVybiBzLmFsd2F5c0Zvcm1hdD9zLmZvcm1hdChvLHZvaWQgMCxuKTpvfXZhciBpPXQuc3BsaXQocy5mb3JtYXRTZXBhcmF0b3IpLGE9aS5zaGlmdCgpLnRyaW0oKSxjPWkuam9pbihzLmZvcm1hdFNlcGFyYXRvcikudHJpbSgpO3JldHVybiBzLmZvcm1hdChIdChlLHUsYSksYyxuLHIpfTt0aGlzLnJlc2V0UmVnRXhwKCk7dmFyIGY9ciYmci5taXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXJ8fHRoaXMub3B0aW9ucy5taXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXIscD1yJiZyLmludGVycG9sYXRpb24mJnIuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXN8fHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlcztyZXR1cm5be3JlZ2V4OnRoaXMucmVnZXhwVW5lc2NhcGUsc2FmZVZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiBjKHQpfX0se3JlZ2V4OnRoaXMucmVnZXhwLHNhZmVWYWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gcy5lc2NhcGVWYWx1ZT9jKHMuZXNjYXBlKHQpKTpjKHQpfX1dLmZvckVhY2goZnVuY3Rpb24oZSl7Zm9yKGE9MDtvPWUucmVnZXguZXhlYyh0KTspe2lmKHZvaWQgMD09PShpPWwob1sxXS50cmltKCkpKSlpZigiZnVuY3Rpb24iPT10eXBlb2YgZil7dmFyIG49Zih0LG8scik7aT0ic3RyaW5nIj09dHlwZW9mIG4/bjoiIn1lbHNle2lmKHApe2k9b1swXTtjb250aW51ZX1zLmxvZ2dlci53YXJuKCJtaXNzZWQgdG8gcGFzcyBpbiB2YXJpYWJsZSAiLmNvbmNhdChvWzFdLCIgZm9yIGludGVycG9sYXRpbmcgIikuY29uY2F0KHQpKSxpPSIifWVsc2Uic3RyaW5nIj09dHlwZW9mIGl8fHMudXNlUmF3VmFsdWVUb0VzY2FwZXx8KGk9VXQoaSkpO2lmKHQ9dC5yZXBsYWNlKG9bMF0sZS5zYWZlVmFsdWUoaSkpLGUucmVnZXgubGFzdEluZGV4PTAsKythPj1zLm1heFJlcGxhY2VzKWJyZWFrfX0pLHR9fSx7a2V5OiJuZXN0Iix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuLHIsbz10aGlzLGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LGE9anQoe30saSk7ZnVuY3Rpb24gcyh0LGUpe3ZhciBuPXRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I7aWYodC5pbmRleE9mKG4pPDApcmV0dXJuIHQ7dmFyIHI9dC5zcGxpdChuZXcgUmVnRXhwKCIiLmNvbmNhdChuLCJbIF0qeyIpKSksbz0ieyIuY29uY2F0KHJbMV0pO3Q9clswXSxvPShvPXRoaXMuaW50ZXJwb2xhdGUobyxhKSkucmVwbGFjZSgvJy9nLCciJyk7dHJ5e2E9SlNPTi5wYXJzZShvKSxlJiYoYT1qdCh7fSxlLGEpKX1jYXRjaChlKXtyZXR1cm4gdGhpcy5sb2dnZXIud2FybigiZmFpbGVkIHBhcnNpbmcgb3B0aW9ucyBzdHJpbmcgaW4gbmVzdGluZyBmb3Iga2V5ICIuY29uY2F0KHQpLGUpLCIiLmNvbmNhdCh0KS5jb25jYXQobikuY29uY2F0KG8pfXJldHVybiBkZWxldGUgYS5kZWZhdWx0VmFsdWUsdH1mb3IoYS5hcHBseVBvc3RQcm9jZXNzb3I9ITEsZGVsZXRlIGEuZGVmYXVsdFZhbHVlO249dGhpcy5uZXN0aW5nUmVnZXhwLmV4ZWModCk7KXt2YXIgdT1bXSxjPSExO2lmKG5bMF0uaW5jbHVkZXModGhpcy5mb3JtYXRTZXBhcmF0b3IpJiYhL3suKn0vLnRlc3QoblsxXSkpe3ZhciBsPW5bMV0uc3BsaXQodGhpcy5mb3JtYXRTZXBhcmF0b3IpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC50cmltKCl9KTtuWzFdPWwuc2hpZnQoKSx1PWwsYz0hMH1pZigocj1lKHMuY2FsbCh0aGlzLG5bMV0udHJpbSgpLGEpLGEpKSYmblswXT09PXQmJiJzdHJpbmciIT10eXBlb2YgcilyZXR1cm4gcjsic3RyaW5nIiE9dHlwZW9mIHImJihyPVV0KHIpKSxyfHwodGhpcy5sb2dnZXIud2FybigibWlzc2VkIHRvIHJlc29sdmUgIi5jb25jYXQoblsxXSwiIGZvciBuZXN0aW5nICIpLmNvbmNhdCh0KSkscj0iIiksYyYmKHI9dS5yZWR1Y2UoZnVuY3Rpb24odCxlKXtyZXR1cm4gby5mb3JtYXQodCxlLGkubG5nLGkpfSxyLnRyaW0oKSkpLHQ9dC5yZXBsYWNlKG5bMF0sciksdGhpcy5yZWdleHAubGFzdEluZGV4PTB9cmV0dXJuIHR9fV0pLHR9KCk7dmFyIG9lPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxuLHIpe3ZhciBvLGk9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOnt9O3JldHVybiBUdCh0aGlzLGUpLG89THQodGhpcyxSdChlKS5jYWxsKHRoaXMpKSxWdCYmRHQuY2FsbChDdChvKSksby5iYWNrZW5kPXQsby5zdG9yZT1uLG8uc2VydmljZXM9cixvLmxhbmd1YWdlVXRpbHM9ci5sYW5ndWFnZVV0aWxzLG8ub3B0aW9ucz1pLG8ubG9nZ2VyPV90LmNyZWF0ZSgiYmFja2VuZENvbm5lY3RvciIpLG8uc3RhdGU9e30sby5xdWV1ZT1bXSxvLmJhY2tlbmQmJm8uYmFja2VuZC5pbml0JiZvLmJhY2tlbmQuaW5pdChyLGkuYmFja2VuZCxpKSxvfXJldHVybiBOdChlLER0KSxBdChlLFt7a2V5OiJxdWV1ZUxvYWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPXRoaXMsaT1bXSxhPVtdLHM9W10sdT1bXTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciByPSEwO2UuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgcz0iIi5jb25jYXQodCwifCIpLmNvbmNhdChlKTshbi5yZWxvYWQmJm8uc3RvcmUuaGFzUmVzb3VyY2VCdW5kbGUodCxlKT9vLnN0YXRlW3NdPTI6by5zdGF0ZVtzXTwwfHwoMT09PW8uc3RhdGVbc10/YS5pbmRleE9mKHMpPDAmJmEucHVzaChzKTooby5zdGF0ZVtzXT0xLHI9ITEsYS5pbmRleE9mKHMpPDAmJmEucHVzaChzKSxpLmluZGV4T2Yocyk8MCYmaS5wdXNoKHMpLHUuaW5kZXhPZihlKTwwJiZ1LnB1c2goZSkpKX0pLHJ8fHMucHVzaCh0KX0pLChpLmxlbmd0aHx8YS5sZW5ndGgpJiZ0aGlzLnF1ZXVlLnB1c2goe3BlbmRpbmc6YSxsb2FkZWQ6e30sZXJyb3JzOltdLGNhbGxiYWNrOnJ9KSx7dG9Mb2FkOmkscGVuZGluZzphLHRvTG9hZExhbmd1YWdlczpzLHRvTG9hZE5hbWVzcGFjZXM6dX19fSx7a2V5OiJsb2FkZWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10LnNwbGl0KCJ8Iiksbz1yWzBdLGk9clsxXTtlJiZ0aGlzLmVtaXQoImZhaWxlZExvYWRpbmciLG8saSxlKSxuJiZ0aGlzLnN0b3JlLmFkZFJlc291cmNlQnVuZGxlKG8saSxuKSx0aGlzLnN0YXRlW3RdPWU/LTE6Mjt2YXIgYT17fTt0aGlzLnF1ZXVlLmZvckVhY2goZnVuY3Rpb24obil7IWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPUJ0KHQsZSxPYmplY3QpLGk9by5vYmosYT1vLms7aVthXT1pW2FdfHxbXSxyJiYoaVthXT1pW2FdLmNvbmNhdChuKSkscnx8aVthXS5wdXNoKG4pfShuLmxvYWRlZCxbb10saSksZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5pbmRleE9mKGUpOy0xIT09bjspdC5zcGxpY2UobiwxKSxuPXQuaW5kZXhPZihlKX0obi5wZW5kaW5nLHQpLGUmJm4uZXJyb3JzLnB1c2goZSksMCE9PW4ucGVuZGluZy5sZW5ndGh8fG4uZG9uZXx8KE9iamVjdC5rZXlzKG4ubG9hZGVkKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2FbdF18fChhW3RdPVtdKSxuLmxvYWRlZFt0XS5sZW5ndGgmJm4ubG9hZGVkW3RdLmZvckVhY2goZnVuY3Rpb24oZSl7YVt0XS5pbmRleE9mKGUpPDAmJmFbdF0ucHVzaChlKX0pfSksbi5kb25lPSEwLG4uZXJyb3JzLmxlbmd0aD9uLmNhbGxiYWNrKG4uZXJyb3JzKTpuLmNhbGxiYWNrKCkpfSksdGhpcy5lbWl0KCJsb2FkZWQiLGEpLHRoaXMucXVldWU9dGhpcy5xdWV1ZS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIXQuZG9uZX0pfX0se2tleToicmVhZCIsdmFsdWU6ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMsbz1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106MCxpPWFyZ3VtZW50cy5sZW5ndGg+NCYmdm9pZCAwIT09YXJndW1lbnRzWzRdP2FyZ3VtZW50c1s0XTozNTAsYT1hcmd1bWVudHMubGVuZ3RoPjU/YXJndW1lbnRzWzVdOnZvaWQgMDtyZXR1cm4gdC5sZW5ndGg/dGhpcy5iYWNrZW5kW25dKHQsZSxmdW5jdGlvbihzLHUpe3MmJnUmJm88NT9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5yZWFkLmNhbGwocix0LGUsbixvKzEsMippLGEpfSxpKTphKHMsdSl9KTphKG51bGwse30pfX0se2tleToicHJlcGFyZUxvYWRpbmciLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp7fSxvPWFyZ3VtZW50cy5sZW5ndGg+Mz9hcmd1bWVudHNbM106dm9pZCAwO2lmKCF0aGlzLmJhY2tlbmQpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oIk5vIGJhY2tlbmQgd2FzIGFkZGVkIHZpYSBpMThuZXh0LnVzZS4gV2lsbCBub3QgbG9hZCByZXNvdXJjZXMuIiksbyYmbygpOyJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dGhpcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeSh0KSksInN0cmluZyI9PXR5cGVvZiBlJiYoZT1bZV0pO3ZhciBpPXRoaXMucXVldWVMb2FkKHQsZSxyLG8pO2lmKCFpLnRvTG9hZC5sZW5ndGgpcmV0dXJuIGkucGVuZGluZy5sZW5ndGh8fG8oKSxudWxsO2kudG9Mb2FkLmZvckVhY2goZnVuY3Rpb24odCl7bi5sb2FkT25lKHQpfSl9fSx7a2V5OiJsb2FkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dGhpcy5wcmVwYXJlTG9hZGluZyh0LGUse30sbil9fSx7a2V5OiJyZWxvYWQiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt0aGlzLnByZXBhcmVMb2FkaW5nKHQsZSx7cmVsb2FkOiEwfSxuKX19LHtrZXk6ImxvYWRPbmUiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06IiIscj10LnNwbGl0KCJ8Iiksbz1yWzBdLGk9clsxXTt0aGlzLnJlYWQobyxpLCJyZWFkIix2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKHIsYSl7ciYmZS5sb2dnZXIud2FybigiIi5jb25jYXQobiwibG9hZGluZyBuYW1lc3BhY2UgIikuY29uY2F0KGksIiBmb3IgbGFuZ3VhZ2UgIikuY29uY2F0KG8sIiBmYWlsZWQiKSxyKSwhciYmYSYmZS5sb2dnZXIubG9nKCIiLmNvbmNhdChuLCJsb2FkZWQgbmFtZXNwYWNlICIpLmNvbmNhdChpLCIgZm9yIGxhbmd1YWdlICIpLmNvbmNhdChvKSxhKSxlLmxvYWRlZCh0LHIsYSl9KX19LHtrZXk6InNhdmVNaXNzaW5nIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLG8pe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+NSYmdm9pZCAwIT09YXJndW1lbnRzWzVdP2FyZ3VtZW50c1s1XTp7fTt0aGlzLnNlcnZpY2VzLnV0aWxzJiZ0aGlzLnNlcnZpY2VzLnV0aWxzLmhhc0xvYWRlZE5hbWVzcGFjZSYmIXRoaXMuc2VydmljZXMudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlKGUpP3RoaXMubG9nZ2VyLndhcm4oJ2RpZCBub3Qgc2F2ZSBrZXkgIicuY29uY2F0KG4sJyIgYXMgdGhlIG5hbWVzcGFjZSAiJykuY29uY2F0KGUsJyIgd2FzIG5vdCB5ZXQgbG9hZGVkJyksIlRoaXMgbWVhbnMgc29tZXRoaW5nIElTIFdST05HIGluIHlvdXIgc2V0dXAuIFlvdSBhY2Nlc3MgdGhlIHQgZnVuY3Rpb24gYmVmb3JlIGkxOG5leHQuaW5pdCAvIGkxOG5leHQubG9hZE5hbWVzcGFjZSAvIGkxOG5leHQuY2hhbmdlTGFuZ3VhZ2Ugd2FzIGRvbmUuIFdhaXQgZm9yIHRoZSBjYWxsYmFjayBvciBQcm9taXNlIHRvIHJlc29sdmUgYmVmb3JlIGFjY2Vzc2luZyBpdCEhISIpOm51bGwhPW4mJiIiIT09biYmKHRoaXMuYmFja2VuZCYmdGhpcy5iYWNrZW5kLmNyZWF0ZSYmdGhpcy5iYWNrZW5kLmNyZWF0ZSh0LGUsbixyLG51bGwsanQoe30saSx7aXNVcGRhdGU6b30pKSx0JiZ0WzBdJiZ0aGlzLnN0b3JlLmFkZFJlc291cmNlKHRbMF0sZSxuLHIpKX19XSksZX0oKTtmdW5jdGlvbiBpZSgpe3JldHVybntkZWJ1ZzohMSxpbml0SW1tZWRpYXRlOiEwLG5zOlsidHJhbnNsYXRpb24iXSxkZWZhdWx0TlM6WyJ0cmFuc2xhdGlvbiJdLGZhbGxiYWNrTG5nOlsiZGV2Il0sZmFsbGJhY2tOUzohMSx3aGl0ZWxpc3Q6ITEsbm9uRXhwbGljaXRXaGl0ZWxpc3Q6ITEsc3VwcG9ydGVkTG5nczohMSxub25FeHBsaWNpdFN1cHBvcnRlZExuZ3M6ITEsbG9hZDoiYWxsIixwcmVsb2FkOiExLHNpbXBsaWZ5UGx1cmFsU3VmZml4OiEwLGtleVNlcGFyYXRvcjoiLiIsbnNTZXBhcmF0b3I6IjoiLHBsdXJhbFNlcGFyYXRvcjoiXyIsY29udGV4dFNlcGFyYXRvcjoiXyIscGFydGlhbEJ1bmRsZWRMYW5ndWFnZXM6ITEsc2F2ZU1pc3Npbmc6ITEsdXBkYXRlTWlzc2luZzohMSxzYXZlTWlzc2luZ1RvOiJmYWxsYmFjayIsc2F2ZU1pc3NpbmdQbHVyYWxzOiEwLG1pc3NpbmdLZXlIYW5kbGVyOiExLG1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlcjohMSxwb3N0UHJvY2VzczohMSxwb3N0UHJvY2Vzc1Bhc3NSZXNvbHZlZDohMSxyZXR1cm5OdWxsOiEwLHJldHVybkVtcHR5U3RyaW5nOiEwLHJldHVybk9iamVjdHM6ITEsam9pbkFycmF5czohMSxyZXR1cm5lZE9iamVjdEhhbmRsZXI6ITEscGFyc2VNaXNzaW5nS2V5SGFuZGxlcjohMSxhcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXk6ITEsYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU6ITEsb3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIGU9e307aWYoIm9iamVjdCI9PT1TdCh0WzFdKSYmKGU9dFsxXSksInN0cmluZyI9PXR5cGVvZiB0WzFdJiYoZS5kZWZhdWx0VmFsdWU9dFsxXSksInN0cmluZyI9PXR5cGVvZiB0WzJdJiYoZS50RGVzY3JpcHRpb249dFsyXSksIm9iamVjdCI9PT1TdCh0WzJdKXx8Im9iamVjdCI9PT1TdCh0WzNdKSl7dmFyIG49dFszXXx8dFsyXTtPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbdF09blt0XX0pfXJldHVybiBlfSxpbnRlcnBvbGF0aW9uOntlc2NhcGVWYWx1ZTohMCxmb3JtYXQ6ZnVuY3Rpb24odCxlLG4scil7cmV0dXJuIHR9LHByZWZpeDoie3siLHN1ZmZpeDoifX0iLGZvcm1hdFNlcGFyYXRvcjoiLCIsdW5lc2NhcGVQcmVmaXg6Ii0iLG5lc3RpbmdQcmVmaXg6IiR0KCIsbmVzdGluZ1N1ZmZpeDoiKSIsbmVzdGluZ09wdGlvbnNTZXBhcmF0b3I6IiwiLG1heFJlcGxhY2VzOjFlMyxza2lwT25WYXJpYWJsZXM6ITF9fX1mdW5jdGlvbiBhZSh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQubnMmJih0Lm5zPVt0Lm5zXSksInN0cmluZyI9PXR5cGVvZiB0LmZhbGxiYWNrTG5nJiYodC5mYWxsYmFja0xuZz1bdC5mYWxsYmFja0xuZ10pLCJzdHJpbmciPT10eXBlb2YgdC5mYWxsYmFja05TJiYodC5mYWxsYmFja05TPVt0LmZhbGxiYWNrTlNdKSx0LndoaXRlbGlzdCYmKHQud2hpdGVsaXN0JiZ0LndoaXRlbGlzdC5pbmRleE9mKCJjaW1vZGUiKTwwJiYodC53aGl0ZWxpc3Q9dC53aGl0ZWxpc3QuY29uY2F0KFsiY2ltb2RlIl0pKSx0LnN1cHBvcnRlZExuZ3M9dC53aGl0ZWxpc3QpLHQubm9uRXhwbGljaXRXaGl0ZWxpc3QmJih0Lm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncz10Lm5vbkV4cGxpY2l0V2hpdGVsaXN0KSx0LnN1cHBvcnRlZExuZ3MmJnQuc3VwcG9ydGVkTG5ncy5pbmRleE9mKCJjaW1vZGUiKTwwJiYodC5zdXBwb3J0ZWRMbmdzPXQuc3VwcG9ydGVkTG5ncy5jb25jYXQoWyJjaW1vZGUiXSkpLHR9ZnVuY3Rpb24gc2UoKXt9dmFyIHVlPW5ldyhmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIHQsbj1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30scj1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDtpZihUdCh0aGlzLGUpLHQ9THQodGhpcyxSdChlKS5jYWxsKHRoaXMpKSxWdCYmRHQuY2FsbChDdCh0KSksdC5vcHRpb25zPWFlKG4pLHQuc2VydmljZXM9e30sdC5sb2dnZXI9X3QsdC5tb2R1bGVzPXtleHRlcm5hbDpbXX0sciYmIXQuaXNJbml0aWFsaXplZCYmIW4uaXNDbG9uZSl7aWYoIXQub3B0aW9ucy5pbml0SW1tZWRpYXRlKXJldHVybiB0LmluaXQobixyKSxMdCh0LEN0KHQpKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5pbml0KG4scil9LDApfXJldHVybiB0fXJldHVybiBOdChlLER0KSxBdChlLFt7a2V5OiJpbml0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30sbj1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDtmdW5jdGlvbiByKHQpe3JldHVybiB0PyJmdW5jdGlvbiI9PXR5cGVvZiB0P25ldyB0OnQ6bnVsbH1pZigiZnVuY3Rpb24iPT10eXBlb2YgZSYmKG49ZSxlPXt9KSxlLndoaXRlbGlzdCYmIWUuc3VwcG9ydGVkTG5ncyYmdGhpcy5sb2dnZXIuZGVwcmVjYXRlKCJ3aGl0ZWxpc3QiLCdvcHRpb24gIndoaXRlbGlzdCIgd2lsbCBiZSByZW5hbWVkIHRvICJzdXBwb3J0ZWRMbmdzIiBpbiB0aGUgbmV4dCBtYWpvciAtIHBsZWFzZSBtYWtlIHN1cmUgdG8gcmVuYW1lIHRoaXMgb3B0aW9uIGFzYXAuJyksZS5ub25FeHBsaWNpdFdoaXRlbGlzdCYmIWUubm9uRXhwbGljaXRTdXBwb3J0ZWRMbmdzJiZ0aGlzLmxvZ2dlci5kZXByZWNhdGUoIndoaXRlbGlzdCIsJ29wdGlvbnMgIm5vbkV4cGxpY2l0V2hpdGVsaXN0IiB3aWxsIGJlIHJlbmFtZWQgdG8gIm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncyIgaW4gdGhlIG5leHQgbWFqb3IgLSBwbGVhc2UgbWFrZSBzdXJlIHRvIHJlbmFtZSB0aGlzIG9wdGlvbiBhc2FwLicpLHRoaXMub3B0aW9ucz1qdCh7fSxpZSgpLHRoaXMub3B0aW9ucyxhZShlKSksdGhpcy5mb3JtYXQ9dGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0LG58fChuPXNlKSwhdGhpcy5vcHRpb25zLmlzQ2xvbmUpe3RoaXMubW9kdWxlcy5sb2dnZXI/X3QuaW5pdChyKHRoaXMubW9kdWxlcy5sb2dnZXIpLHRoaXMub3B0aW9ucyk6X3QuaW5pdChudWxsLHRoaXMub3B0aW9ucyk7dmFyIG89bmV3IFp0KHRoaXMub3B0aW9ucyk7dGhpcy5zdG9yZT1uZXcgR3QodGhpcy5vcHRpb25zLnJlc291cmNlcyx0aGlzLm9wdGlvbnMpO3ZhciBpPXRoaXMuc2VydmljZXM7aS5sb2dnZXI9X3QsaS5yZXNvdXJjZVN0b3JlPXRoaXMuc3RvcmUsaS5sYW5ndWFnZVV0aWxzPW8saS5wbHVyYWxSZXNvbHZlcj1uZXcgbmUobyx7cHJlcGVuZDp0aGlzLm9wdGlvbnMucGx1cmFsU2VwYXJhdG9yLGNvbXBhdGliaWxpdHlKU09OOnRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTixzaW1wbGlmeVBsdXJhbFN1ZmZpeDp0aGlzLm9wdGlvbnMuc2ltcGxpZnlQbHVyYWxTdWZmaXh9KSxpLmludGVycG9sYXRvcj1uZXcgcmUodGhpcy5vcHRpb25zKSxpLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6dGhpcy5oYXNMb2FkZWROYW1lc3BhY2UuYmluZCh0aGlzKX0saS5iYWNrZW5kQ29ubmVjdG9yPW5ldyBvZShyKHRoaXMubW9kdWxlcy5iYWNrZW5kKSxpLnJlc291cmNlU3RvcmUsaSx0aGlzLm9wdGlvbnMpLGkuYmFja2VuZENvbm5lY3Rvci5vbigiKiIsZnVuY3Rpb24oZSl7Zm9yKHZhciBuPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkobj4xP24tMTowKSxvPTE7bzxuO28rKylyW28tMV09YXJndW1lbnRzW29dO3QuZW1pdC5hcHBseSh0LFtlXS5jb25jYXQocikpfSksdGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3ImJihpLmxhbmd1YWdlRGV0ZWN0b3I9cih0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3RvciksaS5sYW5ndWFnZURldGVjdG9yLmluaXQoaSx0aGlzLm9wdGlvbnMuZGV0ZWN0aW9uLHRoaXMub3B0aW9ucykpLHRoaXMubW9kdWxlcy5pMThuRm9ybWF0JiYoaS5pMThuRm9ybWF0PXIodGhpcy5tb2R1bGVzLmkxOG5Gb3JtYXQpLGkuaTE4bkZvcm1hdC5pbml0JiZpLmkxOG5Gb3JtYXQuaW5pdCh0aGlzKSksdGhpcy50cmFuc2xhdG9yPW5ldyBKdCh0aGlzLnNlcnZpY2VzLHRoaXMub3B0aW9ucyksdGhpcy50cmFuc2xhdG9yLm9uKCIqIixmdW5jdGlvbihlKXtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheShuPjE/bi0xOjApLG89MTtvPG47bysrKXJbby0xXT1hcmd1bWVudHNbb107dC5lbWl0LmFwcGx5KHQsW2VdLmNvbmNhdChyKSl9KSx0aGlzLm1vZHVsZXMuZXh0ZXJuYWwuZm9yRWFjaChmdW5jdGlvbihlKXtlLmluaXQmJmUuaW5pdCh0KX0pfXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvcnx8dGhpcy5vcHRpb25zLmxuZ3x8dGhpcy5sb2dnZXIud2FybigiaW5pdDogbm8gbGFuZ3VhZ2VEZXRlY3RvciBpcyB1c2VkIGFuZCBubyBsbmcgaXMgZGVmaW5lZCIpO3ZhciBhPVsiZ2V0UmVzb3VyY2UiLCJoYXNSZXNvdXJjZUJ1bmRsZSIsImdldFJlc291cmNlQnVuZGxlIiwiZ2V0RGF0YUJ5TGFuZ3VhZ2UiXTthLmZvckVhY2goZnVuY3Rpb24oZSl7dFtlXT1mdW5jdGlvbigpe3ZhciBuO3JldHVybihuPXQuc3RvcmUpW2VdLmFwcGx5KG4sYXJndW1lbnRzKX19KTt2YXIgcz1bImFkZFJlc291cmNlIiwiYWRkUmVzb3VyY2VzIiwiYWRkUmVzb3VyY2VCdW5kbGUiLCJyZW1vdmVSZXNvdXJjZUJ1bmRsZSJdO3MuZm9yRWFjaChmdW5jdGlvbihlKXt0W2VdPWZ1bmN0aW9uKCl7dmFyIG47cmV0dXJuKG49dC5zdG9yZSlbZV0uYXBwbHkobixhcmd1bWVudHMpLHR9fSk7dmFyIHU9TXQoKSxjPWZ1bmN0aW9uKCl7dC5jaGFuZ2VMYW5ndWFnZSh0Lm9wdGlvbnMubG5nLGZ1bmN0aW9uKGUscil7dC5pc0luaXRpYWxpemVkPSEwLHQub3B0aW9ucy5pc0Nsb25lfHx0LmxvZ2dlci5sb2coImluaXRpYWxpemVkIix0Lm9wdGlvbnMpLHQuZW1pdCgiaW5pdGlhbGl6ZWQiLHQub3B0aW9ucyksdS5yZXNvbHZlKHIpLG4oZSxyKX0pfTtyZXR1cm4gdGhpcy5vcHRpb25zLnJlc291cmNlc3x8IXRoaXMub3B0aW9ucy5pbml0SW1tZWRpYXRlP2MoKTpzZXRUaW1lb3V0KGMsMCksdX19LHtrZXk6ImxvYWRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06c2Uscj1uLG89InN0cmluZyI9PXR5cGVvZiB0P3Q6dGhpcy5sYW5ndWFnZTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdCYmKHI9dCksIXRoaXMub3B0aW9ucy5yZXNvdXJjZXN8fHRoaXMub3B0aW9ucy5wYXJ0aWFsQnVuZGxlZExhbmd1YWdlcyl7aWYobyYmImNpbW9kZSI9PT1vLnRvTG93ZXJDYXNlKCkpcmV0dXJuIHIoKTt2YXIgaT1bXSxhPWZ1bmN0aW9uKHQpe3QmJmUuc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkodCkuZm9yRWFjaChmdW5jdGlvbih0KXtpLmluZGV4T2YodCk8MCYmaS5wdXNoKHQpfSl9O2lmKG8pYShvKTtlbHNle3ZhciBzPXRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyk7cy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBhKHQpfSl9dGhpcy5vcHRpb25zLnByZWxvYWQmJnRoaXMub3B0aW9ucy5wcmVsb2FkLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIGEodCl9KSx0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IubG9hZChpLHRoaXMub3B0aW9ucy5ucyxyKX1lbHNlIHIobnVsbCl9fSx7a2V5OiJyZWxvYWRSZXNvdXJjZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1NdCgpO3JldHVybiB0fHwodD10aGlzLmxhbmd1YWdlcyksZXx8KGU9dGhpcy5vcHRpb25zLm5zKSxufHwobj1zZSksdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLnJlbG9hZCh0LGUsZnVuY3Rpb24odCl7ci5yZXNvbHZlKCksbih0KX0pLHJ9fSx7a2V5OiJ1c2UiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCF0KXRocm93IG5ldyBFcnJvcigiWW91IGFyZSBwYXNzaW5nIGFuIHVuZGVmaW5lZCBtb2R1bGUhIFBsZWFzZSBjaGVjayB0aGUgb2JqZWN0IHlvdSBhcmUgcGFzc2luZyB0byBpMThuZXh0LnVzZSgpIik7aWYoIXQudHlwZSl0aHJvdyBuZXcgRXJyb3IoIllvdSBhcmUgcGFzc2luZyBhIHdyb25nIG1vZHVsZSEgUGxlYXNlIGNoZWNrIHRoZSBvYmplY3QgeW91IGFyZSBwYXNzaW5nIHRvIGkxOG5leHQudXNlKCkiKTtyZXR1cm4iYmFja2VuZCI9PT10LnR5cGUmJih0aGlzLm1vZHVsZXMuYmFja2VuZD10KSwoImxvZ2dlciI9PT10LnR5cGV8fHQubG9nJiZ0Lndhcm4mJnQuZXJyb3IpJiYodGhpcy5tb2R1bGVzLmxvZ2dlcj10KSwibGFuZ3VhZ2VEZXRlY3RvciI9PT10LnR5cGUmJih0aGlzLm1vZHVsZXMubGFuZ3VhZ2VEZXRlY3Rvcj10KSwiaTE4bkZvcm1hdCI9PT10LnR5cGUmJih0aGlzLm1vZHVsZXMuaTE4bkZvcm1hdD10KSwicG9zdFByb2Nlc3NvciI9PT10LnR5cGUmJkt0LmFkZFBvc3RQcm9jZXNzb3IodCksIjNyZFBhcnR5Ij09PXQudHlwZSYmdGhpcy5tb2R1bGVzLmV4dGVybmFsLnB1c2godCksdGhpc319LHtrZXk6ImNoYW5nZUxhbmd1YWdlIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7dGhpcy5pc0xhbmd1YWdlQ2hhbmdpbmdUbz10O3ZhciByPU10KCk7dGhpcy5lbWl0KCJsYW5ndWFnZUNoYW5naW5nIix0KTt2YXIgbz1mdW5jdGlvbih0KXt2YXIgbz0ic3RyaW5nIj09dHlwZW9mIHQ/dDpuLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMuZ2V0QmVzdE1hdGNoRnJvbUNvZGVzKHQpO28mJihuLmxhbmd1YWdlfHwobi5sYW5ndWFnZT1vLG4ubGFuZ3VhZ2VzPW4uc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkobykpLG4udHJhbnNsYXRvci5sYW5ndWFnZXx8bi50cmFuc2xhdG9yLmNoYW5nZUxhbmd1YWdlKG8pLG4uc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmbi5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmNhY2hlVXNlckxhbmd1YWdlKG8pKSxuLmxvYWRSZXNvdXJjZXMobyxmdW5jdGlvbih0KXshZnVuY3Rpb24odCxvKXtvPyhuLmxhbmd1YWdlPW8sbi5sYW5ndWFnZXM9bi5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShvKSxuLnRyYW5zbGF0b3IuY2hhbmdlTGFuZ3VhZ2Uobyksbi5pc0xhbmd1YWdlQ2hhbmdpbmdUbz12b2lkIDAsbi5lbWl0KCJsYW5ndWFnZUNoYW5nZWQiLG8pLG4ubG9nZ2VyLmxvZygibGFuZ3VhZ2VDaGFuZ2VkIixvKSk6bi5pc0xhbmd1YWdlQ2hhbmdpbmdUbz12b2lkIDAsci5yZXNvbHZlKGZ1bmN0aW9uKCl7cmV0dXJuIG4udC5hcHBseShuLGFyZ3VtZW50cyl9KSxlJiZlKHQsZnVuY3Rpb24oKXtyZXR1cm4gbi50LmFwcGx5KG4sYXJndW1lbnRzKX0pfSh0LG8pfSl9O3JldHVybiB0fHwhdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yfHx0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuYXN5bmM/IXQmJnRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3RvciYmdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmFzeW5jP3RoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5kZXRlY3Qobyk6byh0KTpvKHRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5kZXRlY3QoKSkscn19LHtrZXk6ImdldEZpeGVkVCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9ZnVuY3Rpb24gdChlLHIpe3ZhciBvO2lmKCJvYmplY3QiIT09U3Qocikpe2Zvcih2YXIgaT1hcmd1bWVudHMubGVuZ3RoLGE9bmV3IEFycmF5KGk+Mj9pLTI6MCkscz0yO3M8aTtzKyspYVtzLTJdPWFyZ3VtZW50c1tzXTtvPW4ub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcihbZSxyXS5jb25jYXQoYSkpfWVsc2Ugbz1qdCh7fSxyKTtyZXR1cm4gby5sbmc9by5sbmd8fHQubG5nLG8ubG5ncz1vLmxuZ3N8fHQubG5ncyxvLm5zPW8ubnN8fHQubnMsbi50KGUsbyl9O3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9yLmxuZz10OnIubG5ncz10LHIubnM9ZSxyfX0se2tleToidCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4gdGhpcy50cmFuc2xhdG9yJiYodD10aGlzLnRyYW5zbGF0b3IpLnRyYW5zbGF0ZS5hcHBseSh0LGFyZ3VtZW50cyl9fSx7a2V5OiJleGlzdHMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIHRoaXMudHJhbnNsYXRvciYmKHQ9dGhpcy50cmFuc2xhdG9yKS5leGlzdHMuYXBwbHkodCxhcmd1bWVudHMpfX0se2tleToic2V0RGVmYXVsdE5hbWVzcGFjZSIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLmRlZmF1bHROUz10fX0se2tleToiaGFzTG9hZGVkTmFtZXNwYWNlIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O2lmKCF0aGlzLmlzSW5pdGlhbGl6ZWQpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImhhc0xvYWRlZE5hbWVzcGFjZTogaTE4bmV4dCB3YXMgbm90IGluaXRpYWxpemVkIix0aGlzLmxhbmd1YWdlcyksITE7aWYoIXRoaXMubGFuZ3VhZ2VzfHwhdGhpcy5sYW5ndWFnZXMubGVuZ3RoKXJldHVybiB0aGlzLmxvZ2dlci53YXJuKCJoYXNMb2FkZWROYW1lc3BhY2U6IGkxOG4ubGFuZ3VhZ2VzIHdlcmUgdW5kZWZpbmVkIG9yIGVtcHR5Iix0aGlzLmxhbmd1YWdlcyksITE7dmFyIHI9dGhpcy5sYW5ndWFnZXNbMF0sbz0hIXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nLGk9dGhpcy5sYW5ndWFnZXNbdGhpcy5sYW5ndWFnZXMubGVuZ3RoLTFdO2lmKCJjaW1vZGUiPT09ci50b0xvd2VyQ2FzZSgpKXJldHVybiEwO3ZhciBhPWZ1bmN0aW9uKHQsbil7dmFyIHI9ZS5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLnN0YXRlWyIiLmNvbmNhdCh0LCJ8IikuY29uY2F0KG4pXTtyZXR1cm4tMT09PXJ8fDI9PT1yfTtpZihuLnByZWNoZWNrKXt2YXIgcz1uLnByZWNoZWNrKHRoaXMsYSk7aWYodm9pZCAwIT09cylyZXR1cm4gc31yZXR1cm4hIXRoaXMuaGFzUmVzb3VyY2VCdW5kbGUocix0KXx8KCF0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IuYmFja2VuZHx8ISghYShyLHQpfHxvJiYhYShpLHQpKSl9fSx7a2V5OiJsb2FkTmFtZXNwYWNlcyIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9TXQoKTtyZXR1cm4gdGhpcy5vcHRpb25zLm5zPygic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe24ub3B0aW9ucy5ucy5pbmRleE9mKHQpPDAmJm4ub3B0aW9ucy5ucy5wdXNoKHQpfSksdGhpcy5sb2FkUmVzb3VyY2VzKGZ1bmN0aW9uKHQpe3IucmVzb2x2ZSgpLGUmJmUodCl9KSxyKTooZSYmZSgpLFByb21pc2UucmVzb2x2ZSgpKX19LHtrZXk6ImxvYWRMYW5ndWFnZXMiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49TXQoKTsic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSk7dmFyIHI9dGhpcy5vcHRpb25zLnByZWxvYWR8fFtdLG89dC5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHIuaW5kZXhPZih0KTwwfSk7cmV0dXJuIG8ubGVuZ3RoPyh0aGlzLm9wdGlvbnMucHJlbG9hZD1yLmNvbmNhdChvKSx0aGlzLmxvYWRSZXNvdXJjZXMoZnVuY3Rpb24odCl7bi5yZXNvbHZlKCksZSYmZSh0KX0pLG4pOihlJiZlKCksUHJvbWlzZS5yZXNvbHZlKCkpfX0se2tleToiZGlyIix2YWx1ZTpmdW5jdGlvbih0KXtpZih0fHwodD10aGlzLmxhbmd1YWdlcyYmdGhpcy5sYW5ndWFnZXMubGVuZ3RoPjA/dGhpcy5sYW5ndWFnZXNbMF06dGhpcy5sYW5ndWFnZSksIXQpcmV0dXJuInJ0bCI7cmV0dXJuWyJhciIsInNodSIsInNxciIsInNzaCIsInhhYSIsInloZCIsInl1ZCIsImFhbyIsImFiaCIsImFidiIsImFjbSIsImFjcSIsImFjdyIsImFjeCIsImFjeSIsImFkZiIsImFkcyIsImFlYiIsImFlYyIsImFmYiIsImFqcCIsImFwYyIsImFwZCIsImFyYiIsImFycSIsImFycyIsImFyeSIsImFyeiIsImF1eiIsImF2bCIsImF5aCIsImF5bCIsImF5biIsImF5cCIsImJieiIsInBnYSIsImhlIiwiaXciLCJwcyIsInBidCIsInBidSIsInBzdCIsInBycCIsInByZCIsInVnIiwidXIiLCJ5ZGQiLCJ5ZHMiLCJ5aWgiLCJqaSIsInlpIiwiaGJvIiwibWVuIiwieG1uIiwiZmEiLCJqcHIiLCJwZW8iLCJwZXMiLCJwcnMiLCJkdiIsInNhbSJdLmluZGV4T2YodGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKHQpKT49MD8icnRsIjoibHRyIn19LHtrZXk6ImNyZWF0ZUluc3RhbmNlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fSxuPWFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwO3JldHVybiBuZXcgZSh0LG4pfX0se2tleToiY2xvbmVJbnN0YW5jZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9LHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnNlLG89anQoe30sdGhpcy5vcHRpb25zLG4se2lzQ2xvbmU6ITB9KSxpPW5ldyBlKG8pLGE9WyJzdG9yZSIsInNlcnZpY2VzIiwibGFuZ3VhZ2UiXTtyZXR1cm4gYS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lbZV09dFtlXX0pLGkuc2VydmljZXM9anQoe30sdGhpcy5zZXJ2aWNlcyksaS5zZXJ2aWNlcy51dGlscz17aGFzTG9hZGVkTmFtZXNwYWNlOmkuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQoaSl9LGkudHJhbnNsYXRvcj1uZXcgSnQoaS5zZXJ2aWNlcyxpLm9wdGlvbnMpLGkudHJhbnNsYXRvci5vbigiKiIsZnVuY3Rpb24odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkoZT4xP2UtMTowKSxyPTE7cjxlO3IrKyluW3ItMV09YXJndW1lbnRzW3JdO2kuZW1pdC5hcHBseShpLFt0XS5jb25jYXQobikpfSksaS5pbml0KG8sciksaS50cmFuc2xhdG9yLm9wdGlvbnM9aS5vcHRpb25zLGkudHJhbnNsYXRvci5iYWNrZW5kQ29ubmVjdG9yLnNlcnZpY2VzLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6aS5oYXNMb2FkZWROYW1lc3BhY2UuYmluZChpKX0saX19XSksZX0oKSksY2U9bigxMzMpLGxlPW4ubihjZSk7ZnVuY3Rpb24gZmUodCxlLG4pe3JldHVybiBlIGluIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnRbZV09bix0fWZ1bmN0aW9uIHBlKHQpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspe3ZhciBuPW51bGwhPWFyZ3VtZW50c1tlXT9hcmd1bWVudHNbZV06e30scj1PYmplY3Qua2V5cyhuKTsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyYmKHI9ci5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhuKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix0KS5lbnVtZXJhYmxlfSkpKSxyLmZvckVhY2goZnVuY3Rpb24oZSl7ZmUodCxlLG5bZV0pfSl9cmV0dXJuIHR9ZnVuY3Rpb24gaGUodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIua2V5LHIpfX1mdW5jdGlvbiBkZSh0LGUsbil7dmFyIHI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89dGhpcyxpPWFyZ3VtZW50cyxhPWZ1bmN0aW9uKCl7cj1udWxsLG58fHQuYXBwbHkobyxpKX0scz1uJiYhcjtjbGVhclRpbWVvdXQocikscj1zZXRUaW1lb3V0KGEsZSkscyYmdC5hcHBseShvLGkpfX1mdW5jdGlvbiBnZSh0LGUsbil7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdCYmdC5pbmRleE9mKCIjIyMiKT4tMT90LnJlcGxhY2UoLyMjIy9nLCIuIik6dH1mb3IodmFyIG89InN0cmluZyIhPXR5cGVvZiBlP1tdLmNvbmNhdChlKTplLnNwbGl0KCIuIik7by5sZW5ndGg+MTspe2lmKCF0KXJldHVybnt9O3ZhciBpPXIoby5zaGlmdCgpKTshdFtpXSYmbiYmKHRbaV09bmV3IG4pLHQ9dFtpXX1yZXR1cm4gdD97b2JqOnQsazpyKG8uc2hpZnQoKSl9Ont9fWZ1bmN0aW9uIHZlKHQsZSxuKXt2YXIgcj1nZSh0LGUsT2JqZWN0KTtyLm9ialtyLmtdPW59ZnVuY3Rpb24geWUodCxlKXt2YXIgbj1nZSh0LGUpLHI9bi5vYmosbz1uLms7aWYocilyZXR1cm4gcltvXX12YXIgbWU9bmV3IFJlZ0V4cCgie3soLis/KX19IiwiZyIpO2Z1bmN0aW9uIGJlKHQsZSxuKXt2YXIgcixvLGk7Zm9yKDtyPW1lLmV4ZWModCk7KSJzdHJpbmciIT10eXBlb2Yobz1yWzFdLnRyaW0oKSkmJihvPW51bGw9PShpPW8pPyIiOiIiK2kpLG98fChvPSIiKSxvPW8ucmVwbGFjZSgvXCQvZywiJCQkJCIpLHQ9dC5yZXBsYWNlKHJbMF0sZVtvXXx8byksbWUubGFzdEluZGV4PTA7cmV0dXJuIHR9ZnVuY3Rpb24geGUodCxlLG4scixvKXt0cnl7dmFyIGk9bmV3KFhNTEh0dHBSZXF1ZXN0fHxBY3RpdmVYT2JqZWN0KSgiTVNYTUwyLlhNTEhUVFAuMy4wIik7aS5vcGVuKHI/IlBPU1QiOiJHRVQiLHQsMSksZS5jcm9zc0RvbWFpbnx8aS5zZXRSZXF1ZXN0SGVhZGVyKCJYLVJlcXVlc3RlZC1XaXRoIiwiWE1MSHR0cFJlcXVlc3QiKSxlLmF1dGhvcml6ZSYmZS5hcGlLZXkmJmkuc2V0UmVxdWVzdEhlYWRlcigiQXV0aG9yaXphdGlvbiIsZS5hcGlLZXkpLChyfHxlLnNldENvbnRlbnRUeXBlSlNPTikmJmkuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC10eXBlIiwiYXBwbGljYXRpb24vanNvbiIpLGkub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7aS5yZWFkeVN0YXRlPjMmJm4mJm4oaS5yZXNwb25zZVRleHQsaSl9LGkuc2VuZChKU09OLnN0cmluZ2lmeShyKSl9Y2F0Y2godCl7d2luZG93LmNvbnNvbGUmJmNvbnNvbGUubG9nKHQpfX12YXIgd2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsbixyKXshZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyx0KSxlJiZlLnByb2plY3RJZD90aGlzLmluaXQobnVsbCxlLHt9LG4pOnRoaXMuaW5pdChudWxsLG4se30sciksdGhpcy50eXBlPSJiYWNrZW5kIn12YXIgZSxuLHI7cmV0dXJuIGU9dCwobj1be2tleToiaW5pdCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fSxyPWFyZ3VtZW50cy5sZW5ndGg+Mj9hcmd1bWVudHNbMl06dm9pZCAwLG89YXJndW1lbnRzLmxlbmd0aD4zP2FyZ3VtZW50c1szXTp2b2lkIDA7dGhpcy5vcHRpb25zPXBlKHt9LHtsb2FkUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL3t7cHJvamVjdElkfX0ve3t2ZXJzaW9ufX0ve3tsbmd9fS97e25zfX0iLHByaXZhdGVQYXRoOiJodHRwczovL2FwaS5sb2NpemUuaW8vcHJpdmF0ZS97e3Byb2plY3RJZH19L3t7dmVyc2lvbn19L3t7bG5nfX0ve3tuc319IixwdWxsUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL3B1bGwve3twcm9qZWN0SWR9fS97e3ZlcnNpb259fS97e2xuZ319L3t7bnN9fSIsZ2V0TGFuZ3VhZ2VzUGF0aDoiaHR0cHM6Ly9hcGkubG9jaXplLmlvL2xhbmd1YWdlcy97e3Byb2plY3RJZH19IixhZGRQYXRoOiJodHRwczovL2FwaS5sb2NpemUuaW8vbWlzc2luZy97e3Byb2plY3RJZH19L3t7dmVyc2lvbn19L3t7bG5nfX0ve3tuc319Iix1cGRhdGVQYXRoOiJodHRwczovL2FwaS5sb2NpemUuaW8vdXBkYXRlL3t7cHJvamVjdElkfX0ve3t2ZXJzaW9ufX0ve3tsbmd9fS97e25zfX0iLHJlZmVyZW5jZUxuZzoiZW4iLGNyb3NzRG9tYWluOiEwLHNldENvbnRlbnRUeXBlSlNPTjohMSx2ZXJzaW9uOiJsYXRlc3QiLHB1bGw6ITEscHJpdmF0ZTohMSx3aGl0ZWxpc3RUaHJlc2hvbGQ6LjksZmFpbExvYWRpbmdPbkVtcHR5SlNPTjohMSxhbGxvd2VkQWRkT3JVcGRhdGVIb3N0czpbImxvY2FsaG9zdCJdfSx0aGlzLm9wdGlvbnMsbiksdGhpcy5zZXJ2aWNlcz10LHRoaXMub3B0aW9ucy5wdWxsJiZjb25zb2xlLndhcm4oImRlcHJlY2F0ZWQ6IHB1bGwgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBhbmQgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggbG9jaXplIHByaXZhdGUgdmVyc2lvbnMiKTt2YXIgaT13aW5kb3cubG9jYXRpb24mJndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZTtpPyh0aGlzLmlzQWRkT3JVcGRhdGVBbGxvd2VkPXRoaXMub3B0aW9ucy5hbGxvd2VkQWRkT3JVcGRhdGVIb3N0cy5pbmRleE9mKGkpPi0xLHIuc2F2ZU1pc3NpbmcmJiF0aGlzLmlzQWRkT3JVcGRhdGVBbGxvd2VkJiZ0JiZ0LmxvZ2dlciYmdC5sb2dnZXIud2FybignbG9jaXplLWJhY2tlbmQ6IHdpbGwgbm90IHNhdmUgbWlzc2luZ3MgYmVjYXVzZSB0aGUgaG9zdCAiJy5jb25jYXQoaSwnIiB3YXMgbm90IGluIHRoZSBsaXN0IG9mIGFsbG93ZWRBZGRPclVwZGF0ZUhvc3RzOiAnKS5jb25jYXQodGhpcy5vcHRpb25zLmFsbG93ZWRBZGRPclVwZGF0ZUhvc3RzLmpvaW4oIiwgIiksIiAobWF0Y2hlcyBuZWVkIHRvIGJlIGV4YWN0KS4iKSkpOnRoaXMuaXNBZGRPclVwZGF0ZUFsbG93ZWQ9ITAsImZ1bmN0aW9uIj09dHlwZW9mIG8mJnRoaXMuZ2V0T3B0aW9ucyhmdW5jdGlvbih0LHIpe2lmKHQpcmV0dXJuIG8odCk7ZS5vcHRpb25zLnJlZmVyZW5jZUxuZz1uLnJlZmVyZW5jZUxuZ3x8ci5yZWZlcmVuY2VMbmd8fGUub3B0aW9ucy5yZWZlcmVuY2VMbmcsbyhudWxsLHIpfSksdGhpcy5xdWV1ZWRXcml0ZXM9e30sdGhpcy5kZWJvdW5jZWRQcm9jZXNzPWRlKHRoaXMucHJvY2VzcywxZTQpfX0se2tleToiZ2V0TGFuZ3VhZ2VzIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1iZSh0aGlzLm9wdGlvbnMuZ2V0TGFuZ3VhZ2VzUGF0aCx7cHJvamVjdElkOnRoaXMub3B0aW9ucy5wcm9qZWN0SWR9KTt0aGlzLmxvYWRVcmwoZSx7fSx0KX19LHtrZXk6ImdldE9wdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy5nZXRMYW5ndWFnZXMoZnVuY3Rpb24obixyKXtpZihuKXJldHVybiB0KG4pO3ZhciBvPU9iamVjdC5rZXlzKHIpO2lmKCFvLmxlbmd0aClyZXR1cm4gdChuZXcgRXJyb3IoIndhcyB1bmFibGUgdG8gbG9hZCBsYW5ndWFnZXMgdmlhIEFQSSIpKTt2YXIgaT1vLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiByW2VdLmlzUmVmZXJlbmNlTGFuZ3VhZ2UmJih0PWUpLHR9LCIiKSxhPW8ucmVkdWNlKGZ1bmN0aW9uKHQsbil7dmFyIG89cltuXTtyZXR1cm4gby50cmFuc2xhdGVkW2Uub3B0aW9ucy52ZXJzaW9uXSYmby50cmFuc2xhdGVkW2Uub3B0aW9ucy52ZXJzaW9uXT49ZS5vcHRpb25zLndoaXRlbGlzdFRocmVzaG9sZCYmdC5wdXNoKG4pLHR9LFtdKSxzPW8ucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuaW5kZXhPZigiLSIpPi0xfHx0fSwhMSk7dChudWxsLHtmYWxsYmFja0xuZzppLHJlZmVyZW5jZUxuZzppLHdoaXRlbGlzdDphLGxvYWQ6cz8iYWxsIjoibGFuZ3VhZ2VPbmx5In0pfSl9fSx7a2V5OiJyZWFkIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHIsbz17fTt0aGlzLm9wdGlvbnMucHJpdmF0ZT8ocj1iZSh0aGlzLm9wdGlvbnMucHJpdmF0ZVBhdGgse2xuZzp0LG5zOmUscHJvamVjdElkOnRoaXMub3B0aW9ucy5wcm9qZWN0SWQsdmVyc2lvbjp0aGlzLm9wdGlvbnMudmVyc2lvbn0pLG89e2F1dGhvcml6ZTohMH0pOnRoaXMub3B0aW9ucy5wdWxsPyhyPWJlKHRoaXMub3B0aW9ucy5wdWxsUGF0aCx7bG5nOnQsbnM6ZSxwcm9qZWN0SWQ6dGhpcy5vcHRpb25zLnByb2plY3RJZCx2ZXJzaW9uOnRoaXMub3B0aW9ucy52ZXJzaW9ufSksbz17YXV0aG9yaXplOiEwfSk6cj1iZSh0aGlzLm9wdGlvbnMubG9hZFBhdGgse2xuZzp0LG5zOmUscHJvamVjdElkOnRoaXMub3B0aW9ucy5wcm9qZWN0SWQsdmVyc2lvbjp0aGlzLm9wdGlvbnMudmVyc2lvbn0pLHRoaXMubG9hZFVybChyLG8sbil9fSx7a2V5OiJsb2FkVXJsIix2YWx1ZTpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpczt4ZSh0LHBlKHt9LHRoaXMub3B0aW9ucyxlKSxmdW5jdGlvbihlLG8pe2lmKG8uc3RhdHVzPj01MDAmJm8uc3RhdHVzPDYwMClyZXR1cm4gbigiZmFpbGVkIGxvYWRpbmcgIit0LCEwKTtpZihvLnN0YXR1cz49NDAwJiZvLnN0YXR1czw1MDApcmV0dXJuIG4oImZhaWxlZCBsb2FkaW5nICIrdCwhMSk7dmFyIGksYTt0cnl7aT1KU09OLnBhcnNlKGUpfWNhdGNoKGUpe2E9ImZhaWxlZCBwYXJzaW5nICIrdCsiIHRvIGpzb24ifXJldHVybiBhP24oYSwhMSk6ci5vcHRpb25zLmZhaWxMb2FkaW5nT25FbXB0eUpTT04mJiFPYmplY3Qua2V5cyhpKS5sZW5ndGg/bigibG9hZGVkIHJlc3VsdCBlbXB0eSBmb3IgIit0LCExKTp2b2lkIG4obnVsbCxpKX0pfX0se2tleToiY3JlYXRlIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLG8saSl7dmFyIGE9dGhpcztpZihvfHwobz1mdW5jdGlvbigpe30pLCF0aGlzLmlzQWRkT3JVcGRhdGVBbGxvd2VkKXJldHVybiBvKCJob3N0IGlzIG5vdCBhbGxvd2VkIHRvIGNyZWF0ZSBrZXkuIik7InN0cmluZyI9PXR5cGVvZiB0JiYodD1bdF0pLHQuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0PT09YS5vcHRpb25zLnJlZmVyZW5jZUxuZ30pLmxlbmd0aDwxJiZ0aGlzLnNlcnZpY2VzJiZ0aGlzLnNlcnZpY2VzLmxvZ2dlciYmdGhpcy5zZXJ2aWNlcy5sb2dnZXIud2FybignbG9jaXplLWJhY2tlbmQ6IHdpbGwgbm90IHNhdmUgbWlzc2luZ3MgYmVjYXVzZSB0aGUgcmVmZXJlbmNlIGxhbmd1YWdlICInLmNvbmNhdCh0aGlzLm9wdGlvbnMucmVmZXJlbmNlTG5nLCciIHdhcyBub3QgaW4gdGhlIGxpc3Qgb2YgdG8gc2F2ZSBsYW5ndWFnZXM6ICcpLmNvbmNhdCh0LmpvaW4oIiwgIiksIiAob3BlbiB5b3VyIHNpdGUgaW4gdGhlIHJlZmVyZW5jZSBsYW5ndWFnZSB0byBzYXZlIG1pc3NpbmdzKS4iKSksdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Q9PT1hLm9wdGlvbnMucmVmZXJlbmNlTG5nJiZhLnF1ZXVlLmNhbGwoYSxhLm9wdGlvbnMucmVmZXJlbmNlTG5nLGUsbixyLG8saSl9KX19LHtrZXk6InVwZGF0ZSIsdmFsdWU6ZnVuY3Rpb24odCxlLG4scixvLGkpe3ZhciBhPXRoaXM7aWYob3x8KG89ZnVuY3Rpb24oKXt9KSwhdGhpcy5pc0FkZE9yVXBkYXRlQWxsb3dlZClyZXR1cm4gbygiaG9zdCBpcyBub3QgYWxsb3dlZCB0byB1cGRhdGUga2V5LiIpO2l8fChpPXt9KSwic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSksaS5pc1VwZGF0ZT0hMCx0LmZvckVhY2goZnVuY3Rpb24odCl7dD09PWEub3B0aW9ucy5yZWZlcmVuY2VMbmcmJmEucXVldWUuY2FsbChhLGEub3B0aW9ucy5yZWZlcmVuY2VMbmcsZSxuLHIsbyxpKX0pfX0se2tleToid3JpdGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztpZigheWUodGhpcy5xdWV1ZWRXcml0ZXMsWyJsb2NrcyIsdCxlXSkpe3ZhciByPWJlKHRoaXMub3B0aW9ucy5hZGRQYXRoLHtsbmc6dCxuczplLHByb2plY3RJZDp0aGlzLm9wdGlvbnMucHJvamVjdElkLHZlcnNpb246dGhpcy5vcHRpb25zLnZlcnNpb259KSxvPWJlKHRoaXMub3B0aW9ucy51cGRhdGVQYXRoLHtsbmc6dCxuczplLHByb2plY3RJZDp0aGlzLm9wdGlvbnMucHJvamVjdElkLHZlcnNpb246dGhpcy5vcHRpb25zLnZlcnNpb259KSxpPXllKHRoaXMucXVldWVkV3JpdGVzLFt0LGVdKTtpZih2ZSh0aGlzLnF1ZXVlZFdyaXRlcyxbdCxlXSxbXSksaS5sZW5ndGgpe3ZlKHRoaXMucXVldWVkV3JpdGVzLFsibG9ja3MiLHQsZV0sITApO3ZhciBhPSExLHM9ITEsdT17fSxjPXt9O2kuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT10Lm9wdGlvbnMmJnQub3B0aW9ucy50RGVzY3JpcHRpb24/e3ZhbHVlOnQuZmFsbGJhY2tWYWx1ZXx8IiIsY29udGV4dDp7dGV4dDp0Lm9wdGlvbnMudERlc2NyaXB0aW9ufX06dC5mYWxsYmFja1ZhbHVlfHwiIjt0Lm9wdGlvbnMmJnQub3B0aW9ucy5pc1VwZGF0ZT8oc3x8KHM9ITApLGNbdC5rZXldPWUpOihhfHwoYT0hMCksdVt0LmtleV09ZSl9KTt2YXIgbD0wO2EmJmwrKyxzJiZsKys7dmFyIGY9ZnVuY3Rpb24oKXstLWx8fCh2ZShuLnF1ZXVlZFdyaXRlcyxbImxvY2tzIix0LGVdLCExKSxpLmZvckVhY2goZnVuY3Rpb24odCl7dC5jYWxsYmFjayYmdC5jYWxsYmFjaygpfSksbi5kZWJvdW5jZWRQcm9jZXNzKHQsZSkpfTtsfHxmKCksYSYmeGUocixwZSh7fSx7YXV0aG9yaXplOiEwfSx0aGlzLm9wdGlvbnMpLGZ1bmN0aW9uKHQsZSl7ZigpfSx1KSxzJiZ4ZShvLHBlKHt9LHthdXRob3JpemU6ITB9LHRoaXMub3B0aW9ucyksZnVuY3Rpb24odCxlKXtmKCl9LGMpfX19fSx7a2V5OiJwcm9jZXNzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7T2JqZWN0LmtleXModGhpcy5xdWV1ZWRXcml0ZXMpLmZvckVhY2goZnVuY3Rpb24oZSl7ImxvY2tzIiE9PWUmJk9iamVjdC5rZXlzKHQucXVldWVkV3JpdGVzW2VdKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3QucXVldWVkV3JpdGVzW2VdW25dLmxlbmd0aCYmdC53cml0ZShlLG4pfSl9KX19LHtrZXk6InF1ZXVlIix2YWx1ZTpmdW5jdGlvbih0LGUsbixyLG8saSl7IWZ1bmN0aW9uKHQsZSxuLHIpe3ZhciBvPWdlKHQsZSxPYmplY3QpLGk9by5vYmosYT1vLms7aVthXT1pW2FdfHxbXSxyJiYoaVthXT1pW2FdLmNvbmNhdChuKSkscnx8aVthXS5wdXNoKG4pfSh0aGlzLnF1ZXVlZFdyaXRlcyxbdCxlXSx7a2V5Om4sZmFsbGJhY2tWYWx1ZTpyfHwiIixjYWxsYmFjazpvLG9wdGlvbnM6aX0pLHRoaXMuZGVib3VuY2VkUHJvY2VzcygpfX1dKSYmaGUoZS5wcm90b3R5cGUsbiksciYmaGUoZSxyKSx0fSgpO3dlLnR5cGU9ImJhY2tlbmQiO3ZhciBrZT13ZSxTZT1uKDQ0KTtmdW5jdGlvbiBFZSgpe3JldHVybihFZT14dCgpKHZ0LmEubWFyayhmdW5jdGlvbiB0KGUpe3JldHVybiB2dC5hLndyYXAoZnVuY3Rpb24odCl7Zm9yKDs7KXN3aXRjaCh0LnByZXY9dC5uZXh0KXtjYXNlIDA6cmV0dXJuIHQuYWJydXB0KCJyZXR1cm4iLG5ldyBrdC5hKGZ1bmN0aW9uKHQpe3VlLmNoYW5nZUxhbmd1YWdlKGUsZnVuY3Rpb24oKXt0KHZvaWQgMCl9KX0pKTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19LHQpfSkpKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gamUoKXt2YXIgdDtyZXR1cm4gbXQoKSh0PXVlLnQpLmNhbGwodCx1ZSl9dmFyIFRlPXtpbml0aWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBrdC5hKGZ1bmN0aW9uKHQsZSl7dWUudXNlKG5ldyBsZS5hKG51bGwse29yZGVyOlsibmF2aWdhdG9yIl19KSkudXNlKGtlKS5pbml0KHtmYWxsYmFja0xuZzoiZW4iLG5zOlsiZGVmYXVsdCJdLGRlZmF1bHROUzoiZGVmYXVsdCIsYmFja2VuZDp7cHJvamVjdElkOlNlLmxvY2l6ZS5wcm9kdWN0SWQsdmVyc2lvbjpTZS5sb2NpemUudmVyc2lvbixhcGlLZXk6U2UubG9jaXplLmFwaUtleSxyZWZlcmVuY2VMbmc6ImVuIn19LGZ1bmN0aW9uKG4scil7cmV0dXJuIG4/ZShuKTp0KHIpfSl9KX0sY2hhbmdlTGFuZ3VhZ2U6ZnVuY3Rpb24odCl7cmV0dXJuIEVlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZ2V0TGFuZ3VhZ2U6ZnVuY3Rpb24oKXtyZXR1cm4gdWUubGFuZ3VhZ2V9LGdldFQ6amV9LE9lPW4oODMpLEFlPW4ubihPZSksQ2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3ZhciBuPWUuZGF0YTtkKCkodGhpcyx0KSx0aGlzLmRhdGE9bn1yZXR1cm4gdigpKHQsbnVsbCxbe2tleToiY29udmVydEdvb2dsZVNwcmVhZHNoZWV0QXBpUmF3RGF0YSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W10scj0xO3I8ZS5sZW5ndGg7cis9MSl7Zm9yKHZhciBvPXt9LGk9MDtpPHQubGVuZ3RoO2krPTEpb1t0W2ldXT1lW3JdW2ldO24ucHVzaChvKX1yZXR1cm4gbn19LHtrZXk6InNwbGl0Q291bnRyaWVzIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdD8iIj09PXR8fCIsIj09PXQ/W106dC5zcGxpdCgiLCIpOltdfX0se2tleToibm9ybWFsaXplUmF3RGF0YSIsdmFsdWU6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W10scj0wLG89WSgpKHQpO3I8by5sZW5ndGg7cisrKXt2YXIgaSxhPXRbb1tyXV07YS5zaGlmdCgpLG49bCgpKGk9W10pLmNhbGwoaSxBZSgpKG4pLEFlKCkoYSkpfXJldHVybiBuLnVuc2hpZnQoZSkse2RhdGE6bn19fV0pLHR9KCk7ZnVuY3Rpb24gTGUodCl7dmFyIGU9ZnVuY3Rpb24oKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIFJlZmxlY3R8fCFvLmEpcmV0dXJuITE7aWYoby5hLnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKCkoRGF0ZSxbXSxmdW5jdGlvbigpe30pKSwhMH1jYXRjaCh0KXtyZXR1cm4hMX19KCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG4scj1FKCkodCk7aWYoZSl7dmFyIGk9RSgpKHRoaXMpLmNvbnN0cnVjdG9yO249bygpKHIsYXJndW1lbnRzLGkpfWVsc2Ugbj1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gaygpKHRoaXMsbil9fXZhciBSZT17YnlVcmw6e25hbWU6ImJ5VXJsIixjb2x1bW5zOlsidXJsIiwiY291bnRyaWVzIl19LGJ5SXRlbU5hbWU6e25hbWU6ImJ5SXRlbU5hbWUiLGNvbHVtbnM6WyJpdGVtTmFtZSIsImNvdW50cmllcyJdfSxieUl0ZW1Db2RlOntuYW1lOiJieUl0ZW1Db2RlIixjb2x1bW5zOlsiaXRlbUNvZGUiLCJjb3VudHJpZXMiXX0sYnlDYXRlZ29yeTp7bmFtZToiYnlDYXRlZ29yeSIsY29sdW1uczpbImNhdGVnb3J5IiwiY291bnRyaWVzIl19LGJ5SXRlbURlc2NyaXB0aW9uOntuYW1lOiJieUl0ZW1EZXNjcmlwdGlvbiIsY29sdW1uczpbInRleHQiLCJjb3VudHJpZXMiXX19LFBlPWZ1bmN0aW9uKHQpe3goKShuLHQpO3ZhciBlPUxlKG4pO2Z1bmN0aW9uIG4odCl7dmFyIHI7cmV0dXJuIGQoKSh0aGlzLG4pLChyPWUuY2FsbCh0aGlzLHQpKS5kYXRhPXQuZGF0YSxyLnNoZWV0VHlwZT10LnNoZWV0VHlwZXx8UmUscn1yZXR1cm4gdigpKG4sW3trZXk6ImJ5VXJsIix2YWx1ZTpmdW5jdGlvbigpe2lmKCF0aGlzLnNoZWV0VHlwZS5ieVVybClyZXR1cm5bXTt2YXIgdD10aGlzLnNoZWV0VHlwZS5ieVVybDtpZighdGhpcy5kYXRhW3QubmFtZV0pcmV0dXJuW107dmFyIGU9Q2UuY29udmVydEdvb2dsZVNwcmVhZHNoZWV0QXBpUmF3RGF0YSh0LmNvbHVtbnMsdGhpcy5kYXRhW3QubmFtZV0pO3JldHVybiBwKCkoZSkuY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciBuPWVbdC5jb2x1bW5zWzFdXTtyZXR1cm57dXJsOmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6Q2Uuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiYnlJdGVtTmFtZSIsdmFsdWU6ZnVuY3Rpb24oKXtpZighdGhpcy5zaGVldFR5cGUuYnlJdGVtTmFtZSlyZXR1cm5bXTt2YXIgdD10aGlzLnNoZWV0VHlwZS5ieUl0ZW1OYW1lO2lmKCF0aGlzLmRhdGFbdC5uYW1lXSlyZXR1cm5bXTt2YXIgZT1DZS5jb252ZXJ0R29vZ2xlU3ByZWFkc2hlZXRBcGlSYXdEYXRhKHQuY29sdW1ucyx0aGlzLmRhdGFbdC5uYW1lXSk7cmV0dXJuIHAoKShlKS5jYWxsKGUsZnVuY3Rpb24oZSl7dmFyIG49ZVt0LmNvbHVtbnNbMV1dO3JldHVybntpdGVtTmFtZTplW3QuY29sdW1uc1swXV0sY291bnRyaWVzOkNlLnNwbGl0Q291bnRyaWVzKG4pLGlzQWxsOiJBTEwiPT09bn19KX19LHtrZXk6ImJ5SXRlbUNvZGUiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2hlZXRUeXBlLmJ5SXRlbUNvZGUpcmV0dXJuW107dmFyIHQ9dGhpcy5zaGVldFR5cGUuYnlJdGVtQ29kZTtpZighdGhpcy5kYXRhW3QubmFtZV0pcmV0dXJuW107dmFyIGU9Q2UuY29udmVydEdvb2dsZVNwcmVhZHNoZWV0QXBpUmF3RGF0YSh0LmNvbHVtbnMsdGhpcy5kYXRhW3QubmFtZV0pO3JldHVybiBwKCkoZSkuY2FsbChlLGZ1bmN0aW9uKGUpe3ZhciBuPWVbdC5jb2x1bW5zWzFdXTtyZXR1cm57aXRlbUNvZGU6ZVt0LmNvbHVtbnNbMF1dLGNvdW50cmllczpDZS5zcGxpdENvdW50cmllcyhuKSxpc0FsbDoiQUxMIj09PW59fSl9fSx7a2V5OiJieUNhdGVnb3J5Iix2YWx1ZTpmdW5jdGlvbigpe2lmKCF0aGlzLnNoZWV0VHlwZS5ieUNhdGVnb3J5KXJldHVybltdO3ZhciB0PXRoaXMuc2hlZXRUeXBlLmJ5Q2F0ZWdvcnk7aWYoIXRoaXMuZGF0YVt0Lm5hbWVdKXJldHVybltdO3ZhciBlPUNlLmNvbnZlcnRHb29nbGVTcHJlYWRzaGVldEFwaVJhd0RhdGEodC5jb2x1bW5zLHRoaXMuZGF0YVt0Lm5hbWVdKTtyZXR1cm4gcCgpKGUpLmNhbGwoZSxmdW5jdGlvbihlKXt2YXIgbj1lW3QuY29sdW1uc1sxXV07cmV0dXJue2NhdGVnb3J5OmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6Q2Uuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiYnlJdGVtRGVzY3JpcHRpb24iLHZhbHVlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuc2hlZXRUeXBlLmJ5SXRlbURlc2NyaXB0aW9uKXJldHVybltdO3ZhciB0PXRoaXMuc2hlZXRUeXBlLmJ5SXRlbURlc2NyaXB0aW9uO2lmKCF0aGlzLmRhdGFbdC5uYW1lXSlyZXR1cm5bXTt2YXIgZT1DZS5jb252ZXJ0R29vZ2xlU3ByZWFkc2hlZXRBcGlSYXdEYXRhKHQuY29sdW1ucyx0aGlzLmRhdGFbdC5uYW1lXSk7cmV0dXJuIHAoKShlKS5jYWxsKGUsZnVuY3Rpb24oZSl7dmFyIG49ZVt0LmNvbHVtbnNbMV1dO3JldHVybnt0ZXh0OmVbdC5jb2x1bW5zWzBdXSxjb3VudHJpZXM6Q2Uuc3BsaXRDb3VudHJpZXMobiksaXNBbGw6IkFMTCI9PT1ufX0pfX0se2tleToiZXhlY3V0ZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57ZXhjbHVzaW9uOntieVVybDp0aGlzLmJ5VXJsKCksYnlJdGVtTmFtZTp0aGlzLmJ5SXRlbU5hbWUoKSxieUl0ZW1Db2RlOnRoaXMuYnlJdGVtQ29kZSgpLGJ5Q2F0ZWdvcnk6dGhpcy5ieUNhdGVnb3J5KCksYnlJdGVtRGVzY3JpcHRpb246dGhpcy5ieUl0ZW1EZXNjcmlwdGlvbigpfX19fV0pLG59KENlKSxOZT1uKDYzKSxJZT1uLm4oTmUpLF9lPW4oODQpO2Z1bmN0aW9uIERlKHQsZSl7dmFyIG47aWYodm9pZCAwPT09cS5hfHxudWxsPT1VKCkodCkpe2lmKEQoKSh0KXx8KG49ZnVuY3Rpb24odCxlKXt2YXIgbjtpZighdClyZXR1cm47aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBNZSh0LGUpO3ZhciByPVcoKShuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSkuY2FsbChuLDgsLTEpOyJPYmplY3QiPT09ciYmdC5jb25zdHJ1Y3RvciYmKHI9dC5jb25zdHJ1Y3Rvci5uYW1lKTtpZigiTWFwIj09PXJ8fCJTZXQiPT09cilyZXR1cm4gSCgpKHQpO2lmKCJBcmd1bWVudHMiPT09cnx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QocikpcmV0dXJuIE1lKHQsZSl9KHQpKXx8ZSYmdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aCl7biYmKHQ9bik7dmFyIHI9MCxvPWZ1bmN0aW9uKCl7fTtyZXR1cm57czpvLG46ZnVuY3Rpb24oKXtyZXR1cm4gcj49dC5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOnRbcisrXX19LGU6ZnVuY3Rpb24odCl7dGhyb3cgdH0sZjpvfX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIGksYT0hMCxzPSExO3JldHVybntzOmZ1bmN0aW9uKCl7bj1JKCkodCl9LG46ZnVuY3Rpb24oKXt2YXIgdD1uLm5leHQoKTtyZXR1cm4gYT10LmRvbmUsdH0sZTpmdW5jdGlvbih0KXtzPSEwLGk9dH0sZjpmdW5jdGlvbigpe3RyeXthfHxudWxsPT1uLnJldHVybnx8bi5yZXR1cm4oKX1maW5hbGx5e2lmKHMpdGhyb3cgaX19fX1mdW5jdGlvbiBNZSh0LGUpeyhudWxsPT1lfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KGUpO248ZTtuKyspcltuXT10W25dO3JldHVybiByfWZ1bmN0aW9uIFVlKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhby5hKXJldHVybiExO2lmKG8uYS5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobygpKERhdGUsW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9RSgpKHQpO2lmKGUpe3ZhciBpPUUoKSh0aGlzKS5jb25zdHJ1Y3RvcjtuPW8oKShyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGsoKSh0aGlzLG4pfX12YXIgQmU9ZnVuY3Rpb24odCl7eCgpKG4sdCk7dmFyIGU9VWUobik7ZnVuY3Rpb24gbigpe3JldHVybiBkKCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gdigpKG4sW3trZXk6ImV4Y2x1ZGUiLHZhbHVlOmZ1bmN0aW9uKHQsZSxyKXt2YXIgbyxpLGEscz0hMSx1PXRoaXMubG9jYXRpb24uY291bnRyeSxjPURlKHQpO3RyeXtmb3IoYy5zKCk7IShvPWMubigpKS5kb25lOyl7dmFyIGY9by52YWx1ZTtpZihyKGYpKXtzPW4ubWF0Y2hDb3VudHJ5KGYsdSk7YnJlYWt9fX1jYXRjaCh0KXtjLmUodCl9ZmluYWxseXtjLmYoKX1yZXR1cm4gcz8oYXQuYS5kZWJ1ZyhsKCkoaT0iRVhDTFVERUQgQlkgU1BSRUFEU0hFRVQ6ICIuY29uY2F0KGUsIiwgIikpLmNhbGwoaSx1KSkse2NvZGU6IkVYQ0xVREVEX0JZX0JMQUNLTElTVCIsbWVzc2FnZTpsKCkoYT0iIi5jb25jYXQoZSwiLCAiKSkuY2FsbChhLHUsIiDjgavoqbLlvZPjgZfjgZ/jgZ/jgoHpmaTlpJYiKSxwYXJhbXM6e3ZhbHVlOmUsY291bnRyeTp1fX0pOl9lLmF9fV0sW3trZXk6Im1hdGNoQ291bnRyeSIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4hKCF0LmlzQWxsJiYwIT09dC5jb3VudHJpZXMubGVuZ3RoKXx8SWUoKShuPXQuY291bnRyaWVzKS5jYWxsKG4sZSl9fV0pLG59KF9lLmIpO2Z1bmN0aW9uIHFlKHQpe3ZhciBlPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhby5hKXJldHVybiExO2lmKG8uYS5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobygpKERhdGUsW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9RSgpKHQpO2lmKGUpe3ZhciBpPUUoKSh0aGlzKS5jb25zdHJ1Y3RvcjtuPW8oKShyLGFyZ3VtZW50cyxpKX1lbHNlIG49ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGsoKSh0aGlzLG4pfX12YXIgRmU9d2luZG93LnppZ3phZyxIZT1kb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJidG4tbmF2IikubGVuZ3RoPjAsemU9L1wvaXRlbVwvXGQrLy50ZXN0KHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtkdC5vbkNoYW5nZXNSZWFkeShmdW5jdGlvbih0KXsvdG93ZXJcLmpwXC8vLnRlc3Qod2luZG93LmxvY2F0aW9uLmhyZWYpJiYoSGU/KHplJiYoZHQub3ZlcnJpZGVDbGlja0V2ZW50KHQsIi5pdGVtLWluZm8tbWFpbiAubWFpbi1jYXJ0aW4tYnRuLCAjRmxvYXRpbmdDYXJ0SW4gLm1haW4tY2FydGluLWJ0biIsZnVuY3Rpb24oKXtGZS5wYWdlVG8oIml0ZW0iKX0pLHQoJ1tpZCo9IlJlbGF0aW9uR3JvdXBJdGVtc18iXScpLmxlbmd0aD4wJiZkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwiLmNhcnRpbi1idG4ucmVsZWFzZWQtYnRuIixmdW5jdGlvbihlKXtpZihlLnRhcmdldCl7dmFyIG4scj10KGUudGFyZ2V0KTtpZihyLmNsb3Nlc3QoIi5yZWxhdGlvbi1ncm91cC1pdGVtLXJvdyIpLmxlbmd0aD4wKXdpbmRvdy5sb2NhdGlvbi5ocmVmPVQoKShuPXIuY2xvc2VzdCgiLnJlbGF0aW9uLWdyb3VwLWl0ZW0tcm93IikpLmNhbGwobiwiLml0ZW0taW5mby1ibG9jayA+IGEiKS5hdHRyKCJocmVmIil8fCIifX0pKSxkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwnYVtocmVmJD0iL2VjL1Nob3BwaW5nQmFnL0l0ZW1MaXN0Il0nLGZ1bmN0aW9uKCl7RmUucGFnZVRvKCJjYXJ0Iil9KSx0KCIuYm94LnNlY3Rpb24sIC50ZXh0LWhvbGRlciIpLmxlbmd0aD4wJiZkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwnYVtocmVmKj0iYWN0aW9uPWNhcnRpbiJdJyxmdW5jdGlvbihlKXtpZihlLnRhcmdldCl7dmFyIG49dChlLnRhcmdldCk7aWYobi5jbG9zZXN0KCIuZXZlbi1pdGVtIikubGVuZ3RoPjApe3ZhciByPW4uY2xvc2VzdCgiLmV2ZW4taXRlbSIpO1QoKShyKS5jYWxsKHIsIi5zdWItdGl0bGUiKS5sZW5ndGg+MD93aW5kb3cubG9jYXRpb24uaHJlZj1UKCkocikuY2FsbChyLCIuc3ViLXRpdGxlID4gYSIpLmF0dHIoImhyZWYiKXx8IiI6VCgpKHIpLmNhbGwociwiLndyYXBwLXRleHQiKS5sZW5ndGg+MCYmKHdpbmRvdy5sb2NhdGlvbi5ocmVmPVQoKShyKS5jYWxsKHIsIi53cmFwcC10ZXh0IGE6Zmlyc3Qtb2YtdHlwZSIpLmF0dHIoImhyZWYiKXx8IiIpfX19KSk6KHplJiYoZHQub3ZlcnJpZGVDbGlja0V2ZW50KHQsIi5wcmljZS1pbmZvLW1haW4gLmNhcnRpbi1hcmVhLW5vd29uc2FsZSwgLnByaWNlLWluZm8tbWFpbiAuY2FydGluLWFyZWEtcmVzZXJ2ZSIsZnVuY3Rpb24oKXtGZS5wYWdlVG8oIml0ZW0iKX0pLHQoJ1tpZCo9IlJlbGF0aW9uR3JvdXBJdGVtc18iXScpLmxlbmd0aD4wJiZkdC5vdmVycmlkZUNsaWNrRXZlbnQodCwiLmNhcnRpbi1idG4ucmVsZWFzZWQtYnRuIixmdW5jdGlvbihlKXtpZihlLnRhcmdldCl7dmFyIG4scj10KGUudGFyZ2V0KTtpZihyLmNsb3Nlc3QoIi5yZWxhdGlvbi1ncm91cC1pdGVtLXJvdyIpLmxlbmd0aD4wKXdpbmRvdy5sb2NhdGlvbi5ocmVmPVQoKShuPXIuY2xvc2VzdCgiLml0ZW0tYmxvY2siKSkuY2FsbChuLCIuaXRlbS1pbmZvLWJsb2NrID4gYSIpLmF0dHIoImhyZWYiKXx8IiJ9fSkpLGR0Lm92ZXJyaWRlQ2xpY2tFdmVudCh0LCdhW2hyZWYkPSIvZWMvU2hvcHBpbmdCYWcvSXRlbUxpc3QiXScsZnVuY3Rpb24oKXtGZS5wYWdlVG8oImNhcnQiKX0pLHQoIi50b3BNb2R1bGVCb3gsIC5hcnRpc3RNYWluT25lQ29sdW1uLCAuc2VhcmNoTGlzdFRhYmxlIikubGVuZ3RoPjAmJmR0Lm92ZXJyaWRlQ2xpY2tFdmVudCh0LCdhW2hyZWYqPSJhY3Rpb249Y2FydGluIl0nLGZ1bmN0aW9uKGUpe2lmKGUudGFyZ2V0KXt2YXIgbixyPXQoZS50YXJnZXQpO2lmKHIuY2xvc2VzdCgiLmZlYXR1cmVJdGVtQ2FydFdyYXAwMSIpLmxlbmd0aD4wKXdpbmRvdy5sb2NhdGlvbi5ocmVmPVQoKShuPXIuY2xvc2VzdCgiLmZlYXR1cmVJdGVtQ2FydFdyYXAwMSIpKS5jYWxsKG4sIi5uYW1lOmZpcnN0LW9mLXR5cGUgPiBhIikuYXR0cigiaHJlZiIpfHwiIjtlbHNlIGlmKHIuY2xvc2VzdCgiLmFydGlzdFNlY3Rpb25MaW5lMDEiKS5sZW5ndGg+MCl7dmFyIG87d2luZG93LmxvY2F0aW9uLmhyZWY9VCgpKG89ci5jbG9zZXN0KCJsaSIpKS5jYWxsKG8sIi50aXRsZSA+IGEiKS5hdHRyKCJocmVmIil8fCIifWVsc2UgaWYoci5jbG9zZXN0KCIuaW5NZGwtZmVhdHVyZUl0ZW1DZWxsLCAuZGlzY29ncmFwaHlMaW5ldXBUYWJsZTAxIikubGVuZ3RoPjApe3ZhciBpO3dpbmRvdy5sb2NhdGlvbi5ocmVmPVQoKShpPXIuY2xvc2VzdCgiLmluTWRsLWZlYXR1cmVJdGVtQ2VsbCwgLmRpc2NvZ3JhcGh5TGluZXVwVGFibGUwMSIpKS5jYWxsKGksIi50aXRsZSA+IGEiKS5hdHRyKCJocmVmIil8fCIifWVsc2UgaWYoci5jbG9zZXN0KCIuZmVhdHVyZUl0ZW1PdGhlckxpc3QwMSIpLmxlbmd0aD4wKXt2YXIgYTt3aW5kb3cubG9jYXRpb24uaHJlZj1UKCkoYT1yLmNsb3Nlc3QoImxpIikpLmNhbGwoYSwiLmltZyA+IHAgPiBhIikuYXR0cigiaHJlZiIpfHwiIn1lbHNlIGlmKHIuY2xvc2VzdCgiLmluTWRsLWF0Y2xJdGVtUm93IikubGVuZ3RoPjApe3ZhciBzO3dpbmRvdy5sb2NhdGlvbi5ocmVmPVQoKShzPXIuY2xvc2VzdCgibGkiKSkuY2FsbChzLCIudGl0bGUgPiBhIikuYXR0cigiaHJlZiIpfHwiIn19fSx7ZGlzYWJsZVBvaW50ZXJFdmVudDohMH0pKSl9KTt2YXIgV2U9ZnVuY3Rpb24odCl7eCgpKG4sdCk7dmFyIGU9cWUobik7ZnVuY3Rpb24gbigpe3JldHVybiBkKCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gdigpKG4sW3trZXk6ImdldEl0ZW0iLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQsZSxyPXRoaXMsbz1tKCkoRSgpKG4ucHJvdG90eXBlKSwiZ2V0SXRlbSIsdGhpcykuY2FsbCh0aGlzKTtIZT9vLmltYWdlcz1wKCkodD10aGlzLiQoIiNqYWNrZXRQaG90b1N3aXBlciAubWFpbi1qYWNrZXQgaW1nIikuZ2V0KCkpLmNhbGwodCxmdW5jdGlvbih0KXtyZXR1cm4gci4kKHQpLmF0dHIoInNyYyIpfHwiIn0pOm8uaW1hZ2VzPXAoKShlPXRoaXMuJCgiI21haW4taW1hZ2UiKS5nZXQoKSkuY2FsbChlLGZ1bmN0aW9uKHQpe3JldHVybiByLiQodCkuYXR0cigic3JjIil8fCIifSk7cmV0dXJuIG99fSx7a2V5OiJnZXRJdGVtTmFtZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06IiI7cmV0dXJuIHRoaXMuJCgiI1ByaXZpbGVnZUFyZWEiKS5sZW5ndGg+MD90KyLvvIjnibnlhbjjgYLjgorvvIkiOnR9fSx7a2V5OiJnZXRJdGVtUHJpY2UiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOjAsZT10LG49dGhpcy4kKCIuc2FsZS1wcmljZS12YWx1ZSIpLHI9dGhpcy4kKCIubXVsdGlidXktcHJpY2UtbGFiZWwiKS50ZXh0KCk7cmV0dXJuIG4ubGVuZ3RoPjAmJigv44G+44Go44KB44Gm44Kq44OV5L6h5qC8Ly50ZXN0KHIpfHwoZT1DKG4udGV4dCgpKSkpLGV9fSx7a2V5OiJnZXRQdXJjaGFzYWJsZSIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIDAhPT10aGlzLiQoJy5jYXJ0aW4tYXJlYS1ub3dvbnNhbGVbb25jbGljayo9IkNhcnRJbiJdLCAuY2FydGluLWFyZWEtcmVzZXJ2ZVtvbmNsaWNrKj0iQ2FydEluIl0nKS5sZW5ndGh8fChhdC5hLmRlYnVnKCLjgqvjg7zjg4jjg5zjgr/jg7PjgYznhKHjgYTjgZ/jgoHjgIHos7zlhaXkuI3lj68iKSwhMSl9fV0pLG59KFgpLCRlPWZ1bmN0aW9uKHQpe3goKShuLHQpO3ZhciBlPXFlKG4pO2Z1bmN0aW9uIG4oKXtyZXR1cm4gZCgpKHRoaXMsbiksZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIG59KFdlKSxZZT1mdW5jdGlvbih0KXt4KCkobix0KTt2YXIgZT1xZShuKTtmdW5jdGlvbiBuKCl7cmV0dXJuIGQoKSh0aGlzLG4pLGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBufShXZSksVmU9ZnVuY3Rpb24odCl7eCgpKG4sdCk7dmFyIGU9cWUobik7ZnVuY3Rpb24gbigpe3JldHVybiBkKCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gbn0oQmUpO0ZlLmRpc2NvdmVyeShmdW5jdGlvbih0KXt2YXIgZT10LmNhbGxiYWNrLG49dC5sb2NhdGlvbjshZnVuY3Rpb24odCxlKXt2YXIgbj13aW5kb3cuemlnemFnO24mJm4udXRpbHMuZmV0Y2hIdG1sKHQsZSl9KGZ1bmN0aW9uKHQpe3RyeXtpZighemUpcmV0dXJuIGUoKTt2YXIgcixvPW5ldyBQZSh7ZGF0YTpGZS5zaG9wRGF0YXx8e319KS5leGVjdXRlKCk7aWYoSGUpe3I9bmV3ICRlKHskOnQsbmFtZToiLml0ZW0tamFja2V0LXRpdGxlIC5wcm9kdWN0LXRpdGxlIixwcmljZToiLml0ZW0taW5mbyAucHJpY2UtdmFsdWUifSkuZXhlY3V0ZSgpfWVsc2V7cj1uZXcgWWUoeyQ6dCxuYW1lOiIuaXRlbS1pbmZvIC5wcm9kdWN0LXRpdGxlIixwcmljZToiLnByaWNlLWluZm8tbWFpbiAucHJpY2UtdmFsdWUifSkuZXhlY3V0ZSgpfXZhciBpPW5ldyBWZSh7bG9jYXRpb246bixzY3JhcGVyUmVzdWx0OnIsZGF0YTpvLmV4Y2x1c2lvbn0pLmV4ZWN1dGUoKTtyZXR1cm4gZShudWxsLHtpdGVtOnIuaXRlbSxza3VSb3dzOnIuc2t1Um93cyxleGNsdXNpb246aX0pfWNhdGNoKHQpe3JldHVybiBlKHQpfX0pfSk7dmFyIEdlPW5ldyBEYXRlKCJNb24gRmViIDEgMjAyMSAwMDowMDowMCBHTVQrMDgwMCIpLEtlPW5ldyBEYXRlKCJTdW4gRmViIDI4IDIwMjEgMjM6NTk6NTkgR01UKzA4MDAiKSxYZT1uZXcgRGF0ZSgiTW9uIEZlYiAxIDIwMjEgMDA6MDA6MDAgR01UKzA4MDAiKSxKZT1uZXcgRGF0ZSgiU3VuIEZlYiAxNCAyMDIxIDIzOjU5OjU5IEdNVCswODAwIiksUWU9bmV3IERhdGUsWmU9UWUuZ2V0VGltZSgpPj1HZS5nZXRUaW1lKCkmJlFlLmdldFRpbWUoKTw9S2UuZ2V0VGltZSgpLHRuPVFlLmdldFRpbWUoKT49WGUuZ2V0VGltZSgpJiZRZS5nZXRUaW1lKCk8PUplLmdldFRpbWUoKSxlbj0vXnpoL2kudGVzdCh0dCgpKTtpZihaZSYmZW4/KEZlLmNhcnRNb2RhbChmdW5jdGlvbigpe3ZhciB0LGUsbixyPWplKCk7cmV0dXJue2JvdHRvbTp7aHRtbDpsKCkodD1sKCkoZT1sKCkobj0nXG4gICAgPGRpdiBzdHlsZT0ibGluZS1oZWlnaHQ6IDEuMyAhaW1wb3J0YW50OyI+XG4gICAgPHAgc3R5bGU9ImNvbG9yOiByZWQgIWltcG9ydGFudDtmb250LXNpemU6IDAuN2VtICFpbXBvcnRhbnQ7bWFyZ2luOiAwICFpbXBvcnRhbnQ7Ij4nLmNvbmNhdChyKCJ0b3dlcl9qcC5jYXJ0LmJvdHRvbS50ZXh0MS5hbGVydCIpLCc8L3A+XG4gICAgPHVsIHN0eWxlPSJtYXJnaW46IDAuNGVtIDAgIWltcG9ydGFudDsiPlxuICAgIDxsaSBzdHlsZT0iZm9udC1zaXplOiAwLjdlbSAhaW1wb3J0YW50O3BhZGRpbmc6IDAgIWltcG9ydGFudDsiPicpKS5jYWxsKG4scigidG93ZXJfanAuY2FydC5ib3R0b20ubGluZTEiKSwnPC9saT5cbiAgICA8bGkgc3R5bGU9ImZvbnQtc2l6ZTogMC43ZW0gIWltcG9ydGFudDtwYWRkaW5nOiAwICFpbXBvcnRhbnQ7Ij4nKSkuY2FsbChlLHIoInRvd2VyX2pwLmNhcnQuYm90dG9tLmxpbmUyIiksJzwvbGk+XG4gICAgPC91bD5cbiAgICA8cCBzdHlsZT0iY29sb3I6IHJlZCAhaW1wb3J0YW50O2ZvbnQtc2l6ZTogMC43ZW0gIWltcG9ydGFudDttYXJnaW46IDAgIWltcG9ydGFudDsiPicpKS5jYWxsKHQscigidG93ZXJfanAuY2FydC5ib3R0b20udGV4dDIuYWxlcnQiKSwiIDwvcD5cbiAgICA8L2Rpdj5cbiAgICAiKX0sbWlkZGxlOntodG1sOidcbiAgICA8ZGl2IHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmUgIWltcG9ydGFudDsgbWFyZ2luOiAtMTZweCAwIDBweCAhaW1wb3J0YW50OyI+XG4gICAgPHNwYW4gc3R5bGU9IlxuICAgIGNvbnRlbnQ6IFwnXCcgIWltcG9ydGFudDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDtcbiAgICByaWdodDogMTNweCAhaW1wb3J0YW50O1xuICAgIHRvcDogLTExcHggIWltcG9ydGFudDtcbiAgICB3aWR0aDogMHB4ICFpbXBvcnRhbnQ7XG4gICAgaGVpZ2h0OiAwcHggIWltcG9ydGFudDtcbiAgICBtYXJnaW46IGF1dG8gIWltcG9ydGFudDtcbiAgICBib3JkZXItc3R5bGU6IHNvbGlkICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyOiA2cHggc29saWQgdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcbiAgICBib3JkZXItYm90dG9tOiA2cHggc29saWQgI2UzMzczOCAhaW1wb3J0YW50OyI+PC9zcGFuPlxuICAgIDxwIHN0eWxlPSJcbiAgICBmb250LXNpemU6IDEycHggIWltcG9ydGFudDtcbiAgICBjb2xvcjogI2RhNDg0OCAhaW1wb3J0YW50O1xuICAgIGxpbmUtaGVpZ2h0OiAxLjUgIWltcG9ydGFudDtcbiAgICBmb250LXdlaWdodDogYm9sZCAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDNweCAhaW1wb3J0YW50O1xuICAgIGJhY2tncm91bmQ6ICNmZmZlZmMgIWltcG9ydGFudDtcbiAgICBib3JkZXI6IHNvbGlkIDFweCAjZGE0ODQ4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZzogNHB4IDFlbSAhaW1wb3J0YW50O1xuICAgIHdoaXRlLXNwYWNlOiBwcmUtbGluZSAhaW1wb3J0YW50OyI+Jy5jb25jYXQocigidG93ZXJfanAuY2FydE1vZGFsLm1pZGRsZSIpLCI8L3A+XG4gICAgPC9kaXY+XG4gICAgIil9fX0pLEZlLmNoYXJnZXMoZnVuY3Rpb24odCl7dmFyIGU9dC5kZWZhdWx0Q2hhcmdlcztyZXR1cm4gdSgpKHUoKSh7fSxlKSx7cHVyY2hhc2VTZXJ2aWNlRmVlOjB9KX0pKTpGZS5jYXJ0TW9kYWwoZnVuY3Rpb24oKXt2YXIgdCxlLG4scj1qZSgpO3JldHVybntib3R0b206e2h0bWw6bCgpKHQ9bCgpKGU9bCgpKG49J1xuICA8ZGl2IHN0eWxlPSJsaW5lLWhlaWdodDogMS4zICFpbXBvcnRhbnQ7Ij5cbiAgPHAgc3R5bGU9ImNvbG9yOiByZWQgIWltcG9ydGFudDtmb250LXNpemU6IDAuN2VtICFpbXBvcnRhbnQ7bWFyZ2luOiAwICFpbXBvcnRhbnQ7Ij4nLmNvbmNhdChyKCJ0b3dlcl9qcC5jYXJ0LmJvdHRvbS50ZXh0MS5hbGVydCIpLCc8L3A+XG4gIDx1bCBzdHlsZT0ibWFyZ2luOiAwLjRlbSAwICFpbXBvcnRhbnQ7Ij5cbiAgPGxpIHN0eWxlPSJmb250LXNpemU6IDAuN2VtICFpbXBvcnRhbnQ7cGFkZGluZzogMCAhaW1wb3J0YW50OyI+JykpLmNhbGwobixyKCJ0b3dlcl9qcC5jYXJ0LmJvdHRvbS5saW5lMSIpLCc8L2xpPlxuICA8bGkgc3R5bGU9ImZvbnQtc2l6ZTogMC43ZW0gIWltcG9ydGFudDtwYWRkaW5nOiAwICFpbXBvcnRhbnQ7Ij4nKSkuY2FsbChlLHIoInRvd2VyX2pwLmNhcnQuYm90dG9tLmxpbmUyIiksJzwvbGk+XG4gIDwvdWw+XG4gIDxwIHN0eWxlPSJjb2xvcjogcmVkICFpbXBvcnRhbnQ7Zm9udC1zaXplOiAwLjdlbSAhaW1wb3J0YW50O21hcmdpbjogMCAhaW1wb3J0YW50OyI+JykpLmNhbGwodCxyKCJ0b3dlcl9qcC5jYXJ0LmJvdHRvbS50ZXh0Mi5hbGVydCIpLCIgPC9wPlxuICA8L2Rpdj5cbiAgIil9fX0pLHRuJiZlbil7aWYoRmUubm90aWNlTW9kYWwoZnVuY3Rpb24oKXt2YXIgdCxlLG4scixvPWplKCk7cmV0dXJuIEhlP3tqdW1ib3Ryb246e2h0bWw6bCgpKHQ9bCgpKGU9J1xuICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luOiA2cHggMCAwICFpbXBvcnRhbnQ7Ij5cbiAgICAgIDxkaXY+XG4gICAgICA8c3BhbiBzdHlsZT0ibWFyZ2luOiAzNHB4IDAgMCAhaW1wb3J0YW50OyBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyI+PGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvbm90aWNlTW9kYWxfbG9nby5wbmciIGFsdD0iV29ybGRTaG9wcGluZ8OXVE9XRVIgUkVDT1JEUyIgc3R5bGU9Im1heC13aWR0aDogNDAwcHggIWltcG9ydGFudDsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsiPjwvc3Bhbj5cbiAgICAgIDxoMSBzdHlsZT0iZm9udC1zaXplOiAyLjlyZW0gIWltcG9ydGFudDsiPicuY29uY2F0KG8oImNvbW1vbi5ub3RpY2VNb2RhbC5qdW1ib3Ryb24uaDEiKSwnPC9oMT5cbiAgICAgIDxoMiBzdHlsZT0iZm9udC1zaXplOiAxLjRyZW0gIWltcG9ydGFudDsiPicpKS5jYWxsKGUsbygiY29tbW9uLm5vdGljZU1vZGFsLmp1bWJvdHJvbi5oMiIpLCc8L2gyPlxuICAgICAgPGEgaHJlZj0iYWxpcGF5czovL3BsYXRmb3JtYXBpL3N0YXJ0YXBwP2FwcElkPTIwMTkxMDE3Njg0MTg3NTUiPlxuICAgICAgPGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvY2FtcGFpZ24tYmFubmVyLXNwXzIwMjEwMTIyLnBuZyIgc3R5bGU9IndpZHRoOiAxMDAlICFpbXBvcnRhbnQ7Ij5cbiAgICAgIDwvYT5cbiAgICAgIDxhIHN0eWxlPSJ0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsgY29sb3I6IGJsYWNrICFpbXBvcnRhbnQ7IiBocmVmPSJodHRwczovL3Rvd2VyLmpwL3NpdGUvaG93dG8vZm9yaW50ZXJuYXRpb25hbGN1c3RvbWVyIj5cbiAgICAgIDxzcGFuIHN0eWxlPSJkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICAgICAgICAgIGZvbnQtc2l6ZTogMS42cmVtICFpbXBvcnRhbnQ7XG4gICAgICAgICAgbWFyZ2luOiAxcmVtIGF1dG8gIWltcG9ydGFudDtcbiAgICAgICAgICBwYWRkaW5nOiAxcmVtICFpbXBvcnRhbnQ7XG4gICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQgIWltcG9ydGFudDtcbiAgICAgICAgICBtYXgtd2lkdGg6IDUwMHB4ICFpbXBvcnRhbnQ7XG4gICAgICAgICAgYm9yZGVyOiBzb2xpZCAjZmZjYTAwICFpbXBvcnRhbnQ7XG4gICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmY2EwMCAhaW1wb3J0YW50O1xuICAgICAgICAgIGNvbG9yOiAjMDAwMDAwICFpbXBvcnRhbnQ7Ij4nKSkuY2FsbCh0LG8oInRvd2VyX2pwLm5vdGljZU1vZGFsLmp1bWJvdHJvbi50ZXh0IiksIjwvc3Bhbj5cbiAgICAgIDwvYT5cbiAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICAiKX19OntqdW1ib3Ryb246e2h0bWw6bCgpKG49bCgpKHI9J1xuICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luOiA2cHggMCAwICFpbXBvcnRhbnQ7Ij5cbiAgICAgIDxkaXY+XG4gICAgICA8c3BhbiBzdHlsZT0ibWFyZ2luOiAzNHB4IDAgMCAhaW1wb3J0YW50OyBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyI+PGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvbm90aWNlTW9kYWxfbG9nby5wbmciIGFsdD0iV29ybGRTaG9wcGluZ8OXVE9XRVIgUkVDT1JEUyIgc3R5bGU9Im1heC13aWR0aDogNDAwcHggIWltcG9ydGFudDsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsiPjwvc3Bhbj5cbiAgICAgIDxoMSBzdHlsZT0iZm9udC1zaXplOiAyLjlyZW0gIWltcG9ydGFudDsiPicuY29uY2F0KG8oImNvbW1vbi5ub3RpY2VNb2RhbC5qdW1ib3Ryb24uaDEiKSwnPC9oMT5cbiAgICAgIDxoMiBzdHlsZT0iZm9udC1zaXplOiAxLjRyZW0gIWltcG9ydGFudDsiPicpKS5jYWxsKHIsbygiY29tbW9uLm5vdGljZU1vZGFsLmp1bWJvdHJvbi5oMiIpLCc8L2gyPlxuICAgICAgPGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvY2FtcGFpZ24tYmFubmVyLXBjXzIwMjEwMTIyLnBuZyIgc3R5bGU9IndpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IG1heC13aWR0aDogMzgwcHggIWltcG9ydGFudDsiPlxuICAgICAgPGEgc3R5bGU9InRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50OyBjb2xvcjogYmxhY2sgIWltcG9ydGFudDsiIGhyZWY9Imh0dHBzOi8vdG93ZXIuanAvc2l0ZS9ob3d0by9mb3JpbnRlcm5hdGlvbmFsY3VzdG9tZXIiPlxuICAgICAgPHNwYW4gc3R5bGU9ImRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gICAgICAgIGZvbnQtc2l6ZTogMS42cmVtICFpbXBvcnRhbnQ7XG4gICAgICAgIG1hcmdpbjogMXJlbSBhdXRvICFpbXBvcnRhbnQ7XG4gICAgICAgIHBhZGRpbmc6IDFyZW0gIWltcG9ydGFudDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQgIWltcG9ydGFudDtcbiAgICAgICAgbWF4LXdpZHRoOiA1MDBweCAhaW1wb3J0YW50O1xuICAgICAgICBib3JkZXI6IHNvbGlkICNmZmNhMDAgIWltcG9ydGFudDtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmY2EwMCAhaW1wb3J0YW50O1xuICAgICAgICBjb2xvcjogIzAwMDAwMCAhaW1wb3J0YW50OyI+JykpLmNhbGwobixvKCJ0b3dlcl9qcC5ub3RpY2VNb2RhbC5qdW1ib3Ryb24udGV4dCIpLCI8L3NwYW4+XG4gICAgICA8L2E+XG4gICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgIil9fX0pLHplKWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pdGVtLWluZm8tbWFpbiAuc3RvY2stc3RhdHVzIikubGVuZ3RoPjAmJiLjgYrlj5bjgorlr4TjgZsiPT09ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLml0ZW0taW5mby1tYWluIC5zdG9jay1zdGF0dXMiKVswXS50ZXh0Q29udGVudD9GZS5pdGVtTW9kYWwoZnVuY3Rpb24oKXt2YXIgdCxlLG49amUoKTtyZXR1cm4gSGU/e2JvdHRvbTp7aHRtbDpsKCkodD0nXG4gICAgICA8ZGl2PlxuICAgICAgPHAgc3R5bGU9ImNvbG9yOiByZWQgIWltcG9ydGFudDtcbiAgICAgICAgICBmb250LXNpemU6IDEycHggIWltcG9ydGFudDtcbiAgICAgICAgICBmb250LXdlaWdodDogYm9sZCAhaW1wb3J0YW50O1xuICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxICFpbXBvcnRhbnQ7XG4gICAgICAgICAgbWFyZ2luOiAwLjRlbSAwICFpbXBvcnRhbnQ7Ij4nLmNvbmNhdChuKCJ0b3dlcl9qcC5pdGVtLmJvdHRvbS50aXRsZSIpLCc8L3A+XG4gICAgICA8cCBzdHlsZT0iZm9udC1zaXplOiAxMXB4ICFpbXBvcnRhbnQ7XG4gICAgICAgICAgd2hpdGUtc3BhY2U6IHByZS1saW5lICFpbXBvcnRhbnQ7XG4gICAgICAgICAgbGluZS1oZWlnaHQ6IDEuMiAhaW1wb3J0YW50O1xuICAgICAgICAgIHBhZGRpbmctYm90dG9tOiAwLjJlbSAhaW1wb3J0YW50OyI+JykpLmNhbGwodCxuKCJ0b3dlcl9qcC5pdGVtLmJvdHRvbS50ZXh0IiksJzwvcD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGEgaHJlZj0iYWxpcGF5czovL3BsYXRmb3JtYXBpL3N0YXJ0YXBwP2FwcElkPTIwMTkxMDE3Njg0MTg3NTUiPlxuICAgICAgPGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvY2FtcGFpZ24tYmFubmVyLXNwXzIwMjEwMTIyLnBuZyIgc3R5bGU9IndpZHRoOiAxMDAlICFpbXBvcnRhbnQ7Ij5cbiAgICAgIDwvYT5cbiAgICAgICcpfX06e2JvdHRvbTp7aHRtbDpsKCkoZT0nXG4gICAgICA8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiAtMTVweCFpbXBvcnRhbnQ7Ij5cbiAgICAgIDxwIHN0eWxlPSJjb2xvcjogcmVkICFpbXBvcnRhbnQ7XG4gICAgICAgICAgZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7XG4gICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQgIWltcG9ydGFudDtcbiAgICAgICAgICBsaW5lLWhlaWdodDogMSAhaW1wb3J0YW50O1xuICAgICAgICAgIG1hcmdpbjogMC4xZW0gMCAhaW1wb3J0YW50OyI+Jy5jb25jYXQobigidG93ZXJfanAuaXRlbS5ib3R0b20udGl0bGUiKSwnPC9wPlxuICAgICAgPHAgc3R5bGU9ImZvbnQtc2l6ZTogMTBweCAhaW1wb3J0YW50O1xuICAgICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtbGluZSAhaW1wb3J0YW50O1xuICAgICAgICAgIGxpbmUtaGVpZ2h0OiAxICFpbXBvcnRhbnQ7Ij4nKSkuY2FsbChlLG4oInRvd2VyX2pwLml0ZW0uYm90dG9tLnRleHQiKSwnPC9wPlxuICAgICAgPC9kaXY+XG4gICAgICA8aW1nIHNyYz0iaHR0cHM6Ly9zdGF0aWMtY29udGVudHMud29ybGRzaG9wcGluZy5qcC9zaG9wcy90b3dlcl9qcC9jYW1wYWlnbi1iYW5uZXItcGNfMjAyMTAxMjIucG5nIiBzdHlsZT0id2lkdGg6IDg1JSAhaW1wb3J0YW50OyBtYXgtd2lkdGg6IDI0MHB4ICFpbXBvcnRhbnQ7IG1hcmdpbi1ib3R0b206IC0xNXB4IWltcG9ydGFudDsiPlxuICAgICAgJyl9fX0pOkZlLml0ZW1Nb2RhbChmdW5jdGlvbigpe3JldHVybiBIZT97Ym90dG9tOntodG1sOidcbiAgICAgICAgICA8YSBocmVmPSJhbGlwYXlzOi8vcGxhdGZvcm1hcGkvc3RhcnRhcHA/YXBwSWQ9MjAxOTEwMTc2ODQxODc1NSI+XG4gICAgICAgICAgPGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvY2FtcGFpZ24tYmFubmVyLXNwXzIwMjEwMTIyLnBuZyIgc3R5bGU9IndpZHRoOiAxMDAlICFpbXBvcnRhbnQ7Ij5cbiAgICAgICAgICA8L2E+XG4gICAgICAgICAgJ319Ontib3R0b206e2h0bWw6J1xuICAgICAgICAgIDxpbWcgc3JjPSJodHRwczovL3N0YXRpYy1jb250ZW50cy53b3JsZHNob3BwaW5nLmpwL3Nob3BzL3Rvd2VyX2pwL2NhbXBhaWduLWJhbm5lci1wY18yMDIxMDEyMi5wbmciIHN0eWxlPSJ3aWR0aDogMTAwJSAhaW1wb3J0YW50OyBtYXgtd2lkdGg6IDQ4MHB4ICFpbXBvcnRhbnQ7Ij5cbiAgICAgICAgICAnfX19KTtGZS5sYXVuY2goZnVuY3Rpb24oKXt2YXIgdD0hc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgiU1RPUkFHRV9LRVlfcmFndGFnX2pwIik7cmV0dXJuIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oIlNUT1JBR0VfS0VZX3JhZ3RhZ19qcCIsYSgpKCEwKSksdD8ibm90aWNlIjpudWxsfSl9ZWxzZXtpZihGZS5ub3RpY2VNb2RhbChmdW5jdGlvbigpe3ZhciB0LGUsbj1qZSgpO3JldHVybntqdW1ib3Ryb246e2h0bWw6bCgpKHQ9bCgpKGU9J1xuICA8ZGl2IHN0eWxlPSJtYXJnaW46IDZweCAwIDAgIWltcG9ydGFudDsiPlxuICA8ZGl2PlxuICA8c3BhbiBzdHlsZT0ibWFyZ2luOiAzNHB4IDAgMCAhaW1wb3J0YW50OyBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OyI+PGltZyBzcmM9Imh0dHBzOi8vc3RhdGljLWNvbnRlbnRzLndvcmxkc2hvcHBpbmcuanAvc2hvcHMvdG93ZXJfanAvbm90aWNlTW9kYWxfbG9nby5wbmciIGFsdD0iV29ybGRTaG9wcGluZ8OXVE9XRVIgUkVDT1JEUyIgc3R5bGU9Im1heC13aWR0aDogNDAwcHggIWltcG9ydGFudDsgd2lkdGg6IDEwMCUgIWltcG9ydGFudDsiPjwvc3Bhbj5cbiAgPGgxIHN0eWxlPSJmb250LXNpemU6IDIuOXJlbSAhaW1wb3J0YW50OyI+Jy5jb25jYXQobigiY29tbW9uLm5vdGljZU1vZGFsLmp1bWJvdHJvbi5oMSIpLCc8L2gxPlxuICA8aDIgc3R5bGU9ImZvbnQtc2l6ZTogMS40cmVtICFpbXBvcnRhbnQ7Ij4nKSkuY2FsbChlLG4oImNvbW1vbi5ub3RpY2VNb2RhbC5qdW1ib3Ryb24uaDIiKSwnPC9oMj5cbiAgPGEgc3R5bGU9InRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50OyBjb2xvcjogYmxhY2sgIWltcG9ydGFudDsiIGhyZWY9Imh0dHBzOi8vdG93ZXIuanAvc2l0ZS9ob3d0by9mb3JpbnRlcm5hdGlvbmFsY3VzdG9tZXIiPlxuICA8c3BhbiBzdHlsZT0iZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgICAgIGZvbnQtc2l6ZTogMS42cmVtICFpbXBvcnRhbnQ7XG4gICAgICBtYXJnaW46IDFyZW0gYXV0byAhaW1wb3J0YW50O1xuICAgICAgcGFkZGluZzogMXJlbSAhaW1wb3J0YW50O1xuICAgICAgZm9udC13ZWlnaHQ6IGJvbGQgIWltcG9ydGFudDtcbiAgICAgIG1heC13aWR0aDogNTAwcHggIWltcG9ydGFudDtcbiAgICAgIGJvcmRlcjogc29saWQgI2ZmY2EwMCAhaW1wb3J0YW50O1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmY2EwMCAhaW1wb3J0YW50O1xuICAgICAgY29sb3I6ICMwMDAwMDAgIWltcG9ydGFudDsiPicpKS5jYWxsKHQsbigidG93ZXJfanAubm90aWNlTW9kYWwuanVtYm90cm9uLnRleHQiKSwiPC9zcGFuPlxuICA8L2E+XG4gIDwvZGl2PlxuICA8L2Rpdj5cbiAgIil9fX0pLHplKWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pdGVtLWluZm8tbWFpbiAuc3RvY2stc3RhdHVzIikubGVuZ3RoPjAmJiLjgYrlj5bjgorlr4TjgZsiPT09ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLml0ZW0taW5mby1tYWluIC5zdG9jay1zdGF0dXMiKVswXS50ZXh0Q29udGVudCYmRmUuaXRlbU1vZGFsKGZ1bmN0aW9uKCl7dmFyIHQsZT1qZSgpO3JldHVybntib3R0b206e2h0bWw6bCgpKHQ9J1xuICA8ZGl2PlxuICA8cCBzdHlsZT0iY29sb3I6IHJlZCAhaW1wb3J0YW50O1xuICAgICAgZm9udC1zaXplOiAxMnB4ICFpbXBvcnRhbnQ7XG4gICAgICBmb250LXdlaWdodDogYm9sZCAhaW1wb3J0YW50O1xuICAgICAgbGluZS1oZWlnaHQ6IDEgIWltcG9ydGFudDtcbiAgICAgIG1hcmdpbjogMC40ZW0gMCAhaW1wb3J0YW50OyI+Jy5jb25jYXQoZSgidG93ZXJfanAuaXRlbS5ib3R0b20udGl0bGUiKSwnPC9wPlxuICA8cCBzdHlsZT0iZm9udC1zaXplOiAxMXB4ICFpbXBvcnRhbnQ7XG4gICAgICB3aGl0ZS1zcGFjZTogcHJlLWxpbmUgIWltcG9ydGFudDtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxLjIgIWltcG9ydGFudDtcbiAgICAgIHBhZGRpbmctYm90dG9tOiAwLjJlbSAhaW1wb3J0YW50OyI+JykpLmNhbGwodCxlKCJ0b3dlcl9qcC5pdGVtLmJvdHRvbS50ZXh0IiksIjwvcD5cbiAgPC9kaXY+XG4gICIpfX19KX0vdG93ZXJzaGlidXlhXC5qcFwva3BvcC8udGVzdCh3aW5kb3cubG9jYXRpb24uaHJlZik/KEZlLmxhdW5jaChmdW5jdGlvbigpe3JldHVybiJiYW5uZXItaGlkZGVuIn0pLEZlLmJhbm5lcihmdW5jdGlvbigpe3JldHVybntoaWRkZW46e2h0bWw6J1xuPGEgaHJlZj0iaHR0cHM6Ly9iaXQubHkvMllVbEtUZCI+XG48ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiAjNjQ2NTY3ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZzogNHB4IDRweCAwICFpbXBvcnRhbnQ7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyICFpbXBvcnRhbnQ7XG4gICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XG4gICAgYm90dG9tOiAwICFpbXBvcnRhbnQ7XG4gICAgcmlnaHQ6IDEwcHggIWltcG9ydGFudDtcbiAgICBsZWZ0OiBhdXRvICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogMTBweCAxMHB4IDAgMCAhaW1wb3J0YW50OyI+XG4gICAgPHNwYW4gc3R5bGU9ImJhY2tncm91bmQtY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7XG4gICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDtcbiAgICB3aWR0aDogNTBweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDZweCA3cHggNXB4IDdweCAhaW1wb3J0YW50O1xuICAgIGJvcmRlci1yYWRpdXM6IDZweCA2cHggMCAwICFpbXBvcnRhbnQ7Ij5cbiAgICA8aW1nIHNyYz0iaHR0cHM6Ly9jaGVja291dC1zdGF0aWMud29ybGRzaG9wcGluZy5qcC9pbWFnZXMvY29tbW9uL2Jhbm5lcl9oaWRkZW5faWNvbl9lbi5zdmciIGFsdD0iR2xvYmFsIFNoaXBwaW5nIiBzdHlsZT0id2lkdGg6IDUycHggIWltcG9ydGFudDsiPlxuICAgIDwvc3Bhbj5cbjwvZGl2PlxuPC9hPlxuJ319fSkpOi8odG93ZXJzaGlidXlhXC5qcCkvLnRlc3Qod2luZG93LmxvY2F0aW9uLmhyZWYpJiYoRmUubGF1bmNoKGZ1bmN0aW9uKCl7cmV0dXJuImJhbm5lci1oaWRkZW4ifSksRmUuYmFubmVyKGZ1bmN0aW9uKCl7cmV0dXJue2hpZGRlbjp7aHRtbDonXG48YSBocmVmPSJodHRwczovL2JpdC5seS8zZ0x1NHVBIj5cbjxkaXYgc3R5bGU9ImJhY2tncm91bmQ6ICM2NDY1NjcgIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiA0cHggNHB4IDAgIWltcG9ydGFudDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXIgIWltcG9ydGFudDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDtcbiAgICBib3R0b206IDAgIWltcG9ydGFudDtcbiAgICByaWdodDogMTBweCAhaW1wb3J0YW50O1xuICAgIGxlZnQ6IGF1dG8gIWltcG9ydGFudDtcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4IDEwcHggMCAwICFpbXBvcnRhbnQ7Ij5cbiAgICA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjogd2hpdGUgIWltcG9ydGFudDtcbiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50O1xuICAgIHdpZHRoOiA1MHB4ICFpbXBvcnRhbnQ7XG4gICAgcGFkZGluZzogNnB4IDdweCA1cHggN3B4ICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogNnB4IDZweCAwIDAgIWltcG9ydGFudDsiPlxuICAgIDxpbWcgc3JjPSJodHRwczovL2NoZWNrb3V0LXN0YXRpYy53b3JsZHNob3BwaW5nLmpwL2ltYWdlcy9jb21tb24vYmFubmVyX2hpZGRlbl9pY29uX2VuLnN2ZyIgYWx0PSJHbG9iYWwgU2hpcHBpbmciIHN0eWxlPSJ3aWR0aDogNTJweCAhaW1wb3J0YW50OyI+XG4gICAgPC9zcGFuPlxuPC9kaXY+XG48L2E+XG4nfX19KSksLyhtaWtpa2lcLnRva3lvXC5qcFwvKS8udGVzdCh3aW5kb3cubG9jYXRpb24uaHJlZikmJihGZS5sYXVuY2goZnVuY3Rpb24oKXtyZXR1cm4iYmFubmVyLWhpZGRlbiJ9KSxGZS5iYW5uZXIoZnVuY3Rpb24oKXtyZXR1cm57aGlkZGVuOntodG1sOidcbjxhIGhyZWY9Imh0dHBzOi8vYml0Lmx5LzMxSU56MkwiPlxuPGRpdiBzdHlsZT0iYmFja2dyb3VuZDogIzY0NjU2NyAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDRweCA0cHggIWltcG9ydGFudDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXIgIWltcG9ydGFudDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGUgIWltcG9ydGFudDtcbiAgICBib3R0b206IDEzMHB4ICFpbXBvcnRhbnQ7XG4gICAgcmlnaHQ6IC0yM3B4ICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogMTBweCAwIDAgMTBweCAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmctcmlnaHQ6IDAgIWltcG9ydGFudDsiPlxuICAgIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50O1xuICAgIGRpc3BsYXk6IGJsb2NrICFpbXBvcnRhbnQ7XG4gICAgd2lkdGg6IDUwcHggIWltcG9ydGFudDtcbiAgICBwYWRkaW5nOiA2cHggMjBweCA2cHggN3B4ICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogNnB4IDAgMCA2cHggIWltcG9ydGFudDsiPlxuICAgIDxpbWcgc3JjPSJodHRwczovL2NoZWNrb3V0LXN0YXRpYy53b3JsZHNob3BwaW5nLmpwL2ltYWdlcy9jb21tb24vYmFubmVyX2hpZGRlbl9pY29uX2VuLnN2ZyIgYWx0PSJHbG9iYWwgU2hpcHBpbmciIHN0eWxlPSJ3aWR0aDogNTJweCAhaW1wb3J0YW50OyBib3JkZXItcmFkaXVzOiA2cHggMCAwIDZweCAhaW1wb3J0YW50OyI+XG4gICAgPC9zcGFuPlxuPC9kaXY+XG48L2E+XG4nfX19KSksLyh0b3dlclwuanBcL3x0b3dlcnNoaWJ1eWFcLmpwXC98bWlraWtpXC50b2t5b1wuanBcLykvLnRlc3Qod2luZG93LmxvY2F0aW9uLmhyZWYpJiZUZS5pbml0aWFsaXplKCkudGhlbihmdW5jdGlvbigpe3JldHVybiBGZS5ydW4oKX0pfV0pO30=
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
13.32.24.99 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-13-32-24-99.fra56.r.cloudfront.net
Software
AmazonS3 /
Resource Hash
3fecb7a5f36736f043a5819358c0b1521aeabfdd04bb870923fdf5bc67d5bdb1

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

x-amz-version-id
6yzel0L982ysy7x2hCXBIo9iZ4e1Tu5w
content-encoding
gzip
etag
W/"b845914cddfd22ae511387ee2b454829"
x-amz-cf-pop
FRA56-C2
x-cache
RefreshHit from cloudfront
access-control-max-age
300
x-amz-replication-status
COMPLETED
access-control-allow-origin
*
last-modified
Sat, 20 Feb 2021 08:49:55 GMT
server
AmazonS3
date
Tue, 02 Mar 2021 09:08:56 GMT
vary
Access-Control-Request-Headers,Access-Control-Request-Method
access-control-allow-methods
GET, HEAD
content-type
application/json
via
1.1 ef4ff53b101ef123a46ec560b6c94cb8.cloudfront.net (CloudFront)
access-control-expose-headers
x-cache
cache-control
public, must-revalidate, proxy-revalidate, max-age=0
x-amz-cf-id
FYdCv0NowYuCs0a28zL2nZwPsDJaenHSYzYmpP1zl2E7VlhZkGRQOg==
b43bae49f7
bam-cell.nr-data.net/1/
57 B
646 B
Script
General
Full URL
https://bam-cell.nr-data.net/1/b43bae49f7?a=59411024&v=1198.fe6ec20&to=YVdXbUsHVhcFVxVfDVgddGppSVsLCUQOWAdYRkYWSQdfARBNEVMRGQMHW1gVXRcBVRNVCkZTUlwXB0sUHA%3D%3D&rst=10728&ck=1&ref=https://tower.jp/search/advanced/item/search&ap=130&be=2431&fe=10558&dc=8140&perf=%7B%22timing%22:%7B%22of%22:1614676124809,%22n%22:0,%22f%22:1,%22dn%22:1,%22dne%22:2,%22c%22:2,%22s%22:27,%22ce%22:1913,%22rq%22:1914,%22rp%22:2422,%22rpe%22:2985,%22dl%22:2424,%22di%22:8141,%22ds%22:8141,%22de%22:8173,%22dc%22:10558,%22l%22:10558,%22le%22:10598%7D,%22navigation%22:%7B%7D%7D&fp=5847&fcp=5847&jsonp=NREUM.setToken
Requested by
Host: js-agent.newrelic.com
URL: https://js-agent.newrelic.com/nr-1198.min.js
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
162.247.243.146 , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
d10c94b6cdb747904baee9070f003bb45849da46f8100b1320f286c21cbcaaa1

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36

Response headers

Date
Tue, 02 Mar 2021 09:08:55 GMT
Content-Encoding
gzip
CF-Cache-Status
DYNAMIC
Server
cloudflare
Expect-CT
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary
Accept-Encoding
Content-Type
text/javascript;charset=ISO-8859-1
Transfer-Encoding
chunked
Connection
keep-alive
CF-Ray
62997bb7886ef2ac-WAW
cf-request-id
0893cba6b80000f2ac66b3c000000001
Expires
Thu, 01 Jan 1970 00:00:00 GMT
report
checkout-api.worldshopping.jp/v1/
0
0
Other
General
Full URL
https://checkout-api.worldshopping.jp/v1/report
Protocol
H2
Server
13.225.74.64 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-13-225-74-64.fra2.r.cloudfront.net
Software
/
Resource Hash

Request headers

Accept
*/*
Access-Control-Request-Method
POST
Access-Control-Request-Headers
content-type
Origin
https://tower.jp
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Sec-Fetch-Mode
cors

Response headers

content-type
application/json
content-length
1
date
Tue, 02 Mar 2021 09:08:56 GMT
x-amzn-requestid
37233404-9da4-45d4-bca4-9af2c8ea53eb
access-control-allow-origin
https://tower.jp
access-control-allow-headers
Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent
x-amz-apigw-id
bjUKVF52tjMFpxw=
access-control-allow-methods
OPTIONS,POST
access-control-allow-credentials
false
via
1.1 3d58896f901dbeed449603f5d2b4d9f1.cloudfront.net (CloudFront), 1.1 d6b9c7bad28b271f1e800a50d49ab8a4.cloudfront.net (CloudFront)
x-amz-cf-pop
FRA56-C2 FRA2-C2
x-cache
Miss from cloudfront
x-amz-cf-id
0MIvofp4WiRpIFKCwF9BimLzL2wdyfx5JLZqLcwK3V35Gt3uHcVOqw==
report
checkout-api.worldshopping.jp/v1/
2 B
444 B
XHR
General
Full URL
https://checkout-api.worldshopping.jp/v1/report
Requested by
Host: checkout-js.worldshopping.jp
URL: https://checkout-js.worldshopping.jp/checkout-3_2_26.js
Protocol
H2
Security
TLS 1.3, , AES_128_GCM
Server
13.225.74.64 , United States, ASN16509 (AMAZON-02, US),
Reverse DNS
server-13-225-74-64.fra2.r.cloudfront.net
Software
/
Resource Hash
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
Content-Type
application/json

Response headers

date
Tue, 02 Mar 2021 09:08:56 GMT
via
1.1 0a4e8f7c3d348e526848328c55dd452b.cloudfront.net (CloudFront), 1.1 d6b9c7bad28b271f1e800a50d49ab8a4.cloudfront.net (CloudFront)
x-amz-cf-pop
FRA56-C2, FRA2-C2
x-amzn-requestid
55231424-f982-4ac1-b1e3-f9070c551d9b
x-cache
Miss from cloudfront
content-type
application/json; charset=utf-8
access-control-allow-origin
*
x-amzn-trace-id
Root=1-603e00a8-2ff56fc4520f49861386dca2;Sampled=0
x-amz-apigw-id
bjUKYHndtjMFlDw=
content-length
2
x-amz-cf-id
LYIliEkNLCt94A49iNE1-saR1twYUrsfDkqQzQbgRVumfWKMbcWfcQ==
b43bae49f7
bam-cell.nr-data.net/events/1/
24 B
484 B
XHR
General
Full URL
https://bam-cell.nr-data.net/events/1/b43bae49f7?a=59411024&v=1198.fe6ec20&to=YVdXbUsHVhcFVxVfDVgddGppSVsLCUQOWAdYRkYWSQdfARBNEVMRGQMHW1gVXRcBVRNVCkZTUlwXB0sUHA%3D%3D&rst=20728&ck=1&ref=https://tower.jp/search/advanced/item/search
Requested by
Host: js-agent.newrelic.com
URL: https://js-agent.newrelic.com/nr-1198.min.js
Protocol
HTTP/1.1
Security
TLS 1.3, , AES_128_GCM
Server
162.247.243.146 , United States, ASN13335 (CLOUDFLARENET, US),
Reverse DNS
Software
cloudflare /
Resource Hash
0c9cf152a0ad00d4f102c93c613c104914be5517ac8f8e0831727f8bfbe8b300

Request headers

Referer
https://tower.jp/search/advanced/item/search?jan=4562494353476%7C4562494353483
User-Agent
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36
content-type
text/plain

Response headers

Date
Tue, 02 Mar 2021 09:09:05 GMT
CF-Cache-Status
DYNAMIC
Server
cloudflare
Expect-CT
max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
Vary
Accept-Encoding
Content-Type
image/gif
Access-Control-Allow-Origin
https://tower.jp
Access-Control-Allow-Credentials
true
Connection
keep-alive
CF-Ray
62997bf5ac7ff2ac-WAW
Content-Length
24
cf-request-id
0893cbcd8f0000f2ac623ba000000001

Verdicts & Comments Add Verdict or Comment

265 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| ontransitionrun object| ontransitionstart object| ontransitioncancel object| cookieStore function| showDirectoryPicker function| showOpenFilePicker function| showSaveFilePicker object| trustedTypes boolean| crossOriginIsolated object| NREUM object| newrelic function| __nr_require string| contextPath string| currentTab object| dataLayer undefined| $ function| jQuery function| $j function| jjQuery function| $w function| MM_preloadImages function| MM_swapImgRestore function| MM_findObj function| MM_swapImage function| MM_openBrWindow function| MM_goToURL undefined| currentYear undefined| currentMonth undefined| currentDay function| setCurrentDate function| isToday function| isSaturday function| isHoliday function| isSunday function| getFirstMonday string| liveUri object| gcBtnTimmer1 object| gcBtnTimmer2 function| windowLoad function| ___global_navi_subgenre_list_open___ function| ___global_navi_subgenre_list_close___ undefined| lastFocusedInputElement boolean| lastFocusedFlag undefined| lastSelectTimer boolean| lastFocuseTimerFlag function| focusOnLastFocusedElement object| BANNER_TYPE_SITETOP_RECTANGLE object| BANNER_TYPE_RECTANGLE object| BANNER_TYPE_PAGE object| DEFAULT_BANNER_TYPE function| bannerTag function| resizeMap function| popupReviewWindow function| popupSimpleWindow function| boolean2yn function| windowPopupSource function| adv_getBody function| loginUserManager_switchLoginLogoutText function| loginUserManager_checkLogin function| loginUserManager_hasCookie string| DS number| pageNo number| page function| replAll function| encodeSearchStr boolean| submitted function| form_submit function| getActionPath function| switchSearchMode function| resetSearchRule function| Trance4Ssl function| Move2Ssl function| topFlashDisp object| Blog object| ArtistPageUtil object| CommonPageUtil object| ItemPageUtil function| bindDatePicker object| ArticlePageUtil function| ArticleItemBoxLoader function| ItemBox object| LoginStateManager function| decryptUserName function| SearchCondition function| SearchHelpPopup string| playerURL string| windowOptions string| windowSize function| obf function| jplayer function| mediaplayer function| realplayer object| ewt function| getHeaderContents function| setAreaData function| getFooterContents object| Encoder function| subscribeEvent function| unsubscribeEvent function| startActivityHandler function| placeCheckerRequest function| placeCssAspxRequest function| timeoutSleep function| getMetatagContent function| logout function| login function| heightChange function| addTempIdDispDivR_NEW function| CreateInnerL01 function| CreateInnerL02 function| CreateInnerR01 function| CreateInnerR02 function| Setlive01 function| Setlive02 function| SetDefaultImage function| CreateItemURL function| Visiblity function| escapeSelectorString boolean| norewrite function| form_submit2 function| form_submit3 function| replaceSearchStr function| UpdateCartInCount object| jjQuery17205877110013552049 string| apiUrl string| uidCookieName string| loginTokenName function| CloseNotice function| OpenNotice number| limit number| index function| ShowNotice boolean| procesingFlg function| NoticeLing boolean| procesingAllFlg function| NoticeAllAlreadyDisplayData object| jQuery17204156817824716632 object| theForm function| __doPostBack function| WebForm_PostBackOptions function| WebForm_DoPostBackWithOptions object| __pendingCallbacks number| __synchronousCallBackIndex function| WebForm_DoCallback function| WebForm_CallbackComplete function| WebForm_ExecuteCallback function| WebForm_FillFirstAvailableSlot boolean| __nonMSDOMBrowser string| __theFormPostData object| __theFormPostCollection object| __callbackTextTypes function| WebForm_InitCallback function| WebForm_InitCallbackAddField function| WebForm_EncodeCallback object| __disabledControlArray function| WebForm_ReEnableControls function| WebForm_ReDisableControls function| WebForm_SimulateClick function| WebForm_FireDefaultButton function| WebForm_GetScrollX function| WebForm_GetScrollY function| WebForm_SaveScrollPositionSubmit function| WebForm_SaveScrollPositionOnSubmit function| WebForm_RestoreScrollPosition function| WebForm_TextBoxKeyHandler function| WebForm_TrimString function| WebForm_AppendToClassName function| WebForm_RemoveClassName function| WebForm_GetElementById function| WebForm_GetElementByTagName function| WebForm_GetElementsByTagName function| WebForm_GetElementDir function| WebForm_GetElementPosition function| WebForm_GetParentByTagName function| WebForm_SetElementHeight function| WebForm_SetElementWidth function| WebForm_SetElementX function| WebForm_SetElementY object| Sys function| $get function| $create function| $addHandler function| $addHandlers function| $clearHandlers function| Type function| $removeHandler object| _events function| $find object| google_tag_manager function| postscribe function| twq object| google_tag_data string| GoogleAnalyticsObject function| ga function| eccCatFlags function| getCategoryId string| language string| userAgent string| web_browser number| login_flg string| categoryId object| catFlags number| cartin_flg number| cartin_count undefined| loginstate undefined| items undefined| tmpItems function| getParam undefined| format_id object| ara function| fbq function| _fbq object| yahoo_ss_retargeting_id object| yahoo_sstag_custom_params object| yahoo_ss_retargeting object| _ltq function| _lt object| gaplugins object| gaGlobal object| gaData object| twttr function| GooglemKTybQhCsO function| google_trackConversion object| GooglebQhCsO object| _ltc function| isData object| yahoo_conversion_id object| yahoo_conversion_language object| yahoo_conversion_color object| yahoo_conversion_label object| yahoo_conversion_value function| gtag function| DP_jQuery_1614676132390 string| gaJsHost number| zigzagLoadingStartedAt object| yjDataLayer function| ytag function| onLoadZigZag object| _gat object| _gaq object| pageTracker string| ctj_cn string| ctj_ck string| ctj_x number| ctj_y string| TensocomBannerVisible string| TensocomBannerTestModeFlg object| _buyee object| _bqs string| key string| data string| namespace function| VcLp object| vclpObj undefined| CheckReadyState object| regeneratorRuntime object| zigzag string| className string| parentClassName object| reg object| objCN function| changeBoxSize function| checkBoxSize string| ewt_host string| ewt_page_key

20 Cookies

Domain/Path Name / Value
.tower.jp/ Name: com.silverpop.iMA.page_visit
Value: 1218576943:
.tower.jp/ Name: com.silverpop.iMA.session
Value: 12260585-8d4c-4ee2-5713-210b0cbc2e6c
.tower.jp/ Name: com.silverpop.iMAWebCookie
Value: 68d96710-b7e3-697e-a850-dea1d2c07574
.tower.jp/ Name: glue_uid2
Value: nnkkwnvttxnhf5vuuwyhooch
.tower.jp/ Name: __utmb
Value: 144181808.1.10.1614676133
.tower.jp/ Name: _fbp
Value: fb.1.1614676132238.1716865323
.tower.jp/ Name: __lt__sid
Value: db26c999-2dd8eb5f
.tower.jp/ Name: _gid
Value: GA1.2.579042794.1614676131
.tower.jp/ Name: __lt__cid
Value: 559a7db4-eb53-491c-ba7f-bfb11edcf614
.tower.jp/ Name: _gat_UA-21926253-1
Value: 1
tower.jp/ Name: ASP.NET_SessionId_ec
Value: gbnngxvttu4egmwssumvjjmm
.tower.jp/ Name: _gcl_au
Value: 1.1.1234136111.1614676132
.tower.jp/ Name: tracking2
Value: 9b5a5ab4841a4aad92f0ab814a090a61
tower.jp/ Name: SC_ANALYTICS_GLOBAL_COOKIE
Value: a7a874d93b1144af8187c9e5268145e8|False
.tower.jp/ Name: __utmz
Value: 144181808.1614676133.1.1.utmcsr=t.co|utmccn=(referral)|utmcmd=referral|utmcct=/EQWgQUtcoG
.tower.jp/ Name: __utma
Value: 144181808.2007558036.1614676131.1614676133.1614676133.1
tower.jp/ Name: ASP.NET_SessionId
Value: w01xyt3gouvu2kodgzw1ylez
.tower.jp/ Name: __utmt
Value: 1
.tower.jp/ Name: __utmc
Value: 144181808
.tower.jp/ Name: _ga
Value: GA1.2.2007558036.1614676131

3 Console Messages

Source Level URL
Text
console-api log URL: https://tower.jp/javascript/mdb_search.js?20201210(Line 2)
Message:
mdb_search loaded!!
console-api log URL: https://tower.jp/javascript/mdb_search.js?20201210(Line 50)
Message:
console-api log URL: https://tower.jp/javascript/mdb_search.js?20201210(Line 54)
Message:
[object HTMLCollection]

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=0
X-Xss-Protection 0

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.

a.imgvc.com
ajax.googleapis.com
analytics.twitter.com
api.locize.io
api.mdb.tower.jp
b97.yahoo.co.jp
bam-cell.nr-data.net
banner.buyee.jp
cdfront.tower.jp
cdn.tower.jp
checkout-api.worldshopping.jp
checkout-js.worldshopping.jp
connect.facebook.net
d.line-scdn.net
ec-concier.com
googleads.g.doubleclick.net
js-agent.newrelic.com
resource.buyee.jp
s.yimg.jp
ssl.google-analytics.com
static.ads-twitter.com
stats.g.doubleclick.net
t.co
tower.jp
tr.line.me
trj.valuecommerce.com
use.fontawesome.com
web-cache.chocomaru.com
www.facebook.com
www.google-analytics.com
www.google.com
www.google.de
www.googleadservices.com
www.googletagmanager.com
www.pages07.net
www.sc.pages07.net
104.244.42.133
104.244.42.3
13.225.74.33
13.225.74.64
13.32.24.99
133.130.50.172
142.250.185.66
151.101.114.110
151.101.12.157
162.247.243.146
18.140.152.123
183.79.249.252
183.79.255.12
184.30.25.99
202.79.240.62
203.104.153.77
210.140.252.195
23.111.9.35
2a00:1450:4001:802::2002
2a00:1450:4001:803::200e
2a00:1450:4001:809::200a
2a00:1450:4001:812::2003
2a00:1450:4001:827::2008
2a00:1450:4001:827::200e
2a00:1450:4001:82a::2004
2a00:1450:400c:c0c::9b
2a03:2880:f01c:8012:face:b00c:0:3
2a03:2880:f11c:8183:face:b00c:0:25de
2a04:4e42:1b::737
52.68.230.127
54.150.94.100
54.199.47.219
65.9.187.79
65.9.58.40
65.9.58.52
05053f4b39cd121307a7287d67fec3c2f7ff69cf8cfc09d985ee44430134939a
07e181c68275ce643e2c11eac0f8b4886d031e7b3eca2da4a92e1c11516c9534
0c9cf152a0ad00d4f102c93c613c104914be5517ac8f8e0831727f8bfbe8b300
0eb552152f6305ec644c355ae495a267467f1d0896c2613860290be7c52039eb
0f3be44690ae9914ae3e47b7752e1bdea316f09938e9094f99e0de19ccd8987a
0fd20e0376bd50d74139c7af594bbd96dc7b74c5a01726dd5e882876800c6d6b
10d8d42d73a02ddb877101e72fbfa15a0ec820224d97cedee4cf92d571be5caa
120e68bad5d24b0c40973ca2fee9d14110cadcb0a5eac012edcb8613aa22ba05
121795731a7c99074d2b64aa2d893107082f9adea424638a0101bb89fe023074
1259ea99bd76596239bfd3102c679eb0a5052578dc526b0452f4d42f8bcdd45f
126b381f32f601d12e517bff52589bd007f815ec05a422e22c118f6497a2abfc
15f052cbf5af9b865ea0fb08e5279acb2fd591accf5edf38a2fa2f82663ed12c
166b2a97d5792d9db46ac2027c31e558307a8bc101bf819b2f7759d1bb97c1ce
19e6639dff4ff6cbc70b8855a5e1bb974adf97c58828c67d0b9de8ee67d73f8a
1ac48d9af345dd28af1303b3f410527f21596c518b1b21d869b233a494e7945a
20031c19cc62ac4ed1dbb90075cd5e172de796fab9a1b976edeb53f0d545de5c
20497eb2f6ed4b23034eba93f73f36272b9ace6ddb8091a7cd780ea4eebdb732
207baadced99f2868b604e6bae6ad9ddb2ffe5d2f0742a5279121e3cdef4324e
243fec92049b8f9af69bfcbebf5bd9c0cc323c5396f8a09470c9cb5f37ef22e5
261595338fd9066332abdbde9ab8f2cf826985e226e2d03904777799e54c9665
26f106635b241c3880235dca8b3a655f031b1ea065d69f029a5314000cb9431b
27a1e80167055f562f0ddda38620ec1f5a354c5ab795c75da16874f4095520f3
299b1a906b7ed7379b4a7e5355474ba1ce2a1e79d53dad46475825f6eba58b6c
2d30b6fbb1e3c1ef16cce11496e43b32b9b8f6782208684fe63c48a47dd7c4df
2d641afda5e68dd8ab7c4bdf4a232b08536f584fe200241876d068a07a35a72c
2db557f36acbceb3973d2290e445ec7e4197d5e2fa2af2bfff9036604aef9ec6
30a5849c126dd8e55195496e99d4d21fea1c8a7182a3a996267f93e6c02db523
376a682120dd600b49f1ef1af899a4920d3174515d363eac9bf956a70ec5e3f2
37a654f49298dc0a8748544e6c24a8dd4fceb700daab715f799d67986e4e2287
381ce07936af3f4b50e3b6baef995b0ce48316c424e691a9f973938e45cd4943
3842b063705286e729befd4832755eb4aa7df42d505201c7ea76b19517b46ac9
3928ea8524f38f4324a4278c6be669dfeaadd92350668ac918db090f8b2b103f
39893061747f88b837a34d0395d05fca83e7cd5bbf2d582d181a73c5c9a174c6
3c19fa6f93526627aab799788fb2bfbb1aaa425903d3f293ba310a41665ffcd2
3c72f2cf1c4c96d2cfb5d80101d27048cf55cba821ec7243dcf459fe55a2f44a
3d893878229b2ced3cc5e4d3e75917f3b6b5035489e515dfbd422c643f373ca7
3fecb7a5f36736f043a5819358c0b1521aeabfdd04bb870923fdf5bc67d5bdb1
40732e9dcfa704cf615e4691bb07aecfd1cc5e063220a46e4a7ff6560c77f5db
4149b40a748cdec2c87a959885e3fbd374e033f0513ebc5e7bbbf384cc5244c0
44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a
47b68dce8cb6805ad5b3ea4d27af92a241f4e29a5c12a274c852e4346a0500b4
481a0574246e281316ffa0e15399bf5388bb81ae550ce0401a0353b6bb2d1e5a
49733e2668cc34cc3e2274f581ea30985edb82f1c9cccb643391fad2d76e8fa8
497f110ecc33b4518fedf5b68fc843c2e08a76fd45e75ae01c35c193c8e91cca
4a25feaeae8304fa73bd4dbc32b87dbe2fff302fe547eac7f5f41aac408ae5c7
4cf52cc73734aa71f26f6a10be9aeec89602af45bf0f9abd5c8445a076c1ae1a
4e9e987e00635d9c1c3b883806da3e8a1c225663d98d94ec5653107c9b637e6f
4ef6d36ec28aa5135b09a68f294cf8cc4f165c26782e95e70d161e912a417d59
4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945
55862b159f4e2a50e32d0bc422077bfdcc51d5da4b95229c01c4bd34f3053c1f
55cd1edaa9a74ccd29537484c801462c417fd96e46640182f7baf14a044ec423
5657567a1698adebc9687013b75f3285a7e84eb94dcc2d7c226889c3419229b5
57131295389f99b9db459b9d7b857ebe2458f4c4ac2530c9cd72b7e45ba6eb02
57d19dc26ae8b463ad08380997f5b9949d7160fcf58fa085a9dbe1b54f28a74b
5aed7482ac5ee80931b3b0e2e5ee5824d7a71fa8d6693cc411079baf638a68cd
5b73d1b6af9b17dbbb10d4e2090307fbf2a7d60d8cd99a47b37fb58ce8e2edaf
5ebe52be539f4c1b0c3a17949ec2d918a67b060c6a2e75aac85da427d541802e
5feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e9
625706d3aacbb5929db21ef012a3aae739195adde128b239275640c757ba54d6
68cbf9a96110e6129e60d52fa68132e789b41f46eca56be6194e9256095c35bf
6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b
6bc0ce7ce61d95c25daf4e610b1581263d997546d7df6ed373fb3db7d89dbe78
6cca693443c1c05612007832e0cc54efa2e92e111c985a2f654ccadee916b095
6dd30a7f7f46120ffd1dc8c0f94c519040d23c8fef05a58581ee1e2c62d99334
6e4c349cac91bab883e88b656bc8a782af4f99af7009f9f6e6b4ff0b425b10ed
703bd02f2d6aaadee95a856d7bf5cc7b7cebdd126834322d563a4167cc64aad2
712ee50dad1b20364445bf525020dd27fa1b955a52607ce6dafa9de0918a50ee
727c18e271d7da217503f74f7b937ee4af0b4f59ba8581d885474dae33d6903e
73194afbca60b2564c4247a66a6fcaee5ad8ebe033c412f014b52edbd5d6c057
7aef2b67926d92a069eff1a28eb3c454825aa3cb2419054a0e3a43df945b51b7
7af2a8c4fd6668804a86734010789407d157bf886b41af9b613b3fd3645f00c0
7d88f50f0bf1b32a0f7c1e1cf4151190524a1ae1849d70d76c232b5599952cef
8076f0762435df3c7cb817689080d4111426e693efcffc168795ece3330d59af
8337212354871836e6763a41e615916c89bac5b3f1f0adf60ba43c7c806e1015
8478774a31eee46e8089d73a9cd59744947149f2b25062ae533ddb700763cdc6
8711600b9da5d151e0e5c013cfd991cca6080128c995304ed0a1de71961d6d11
8719e209842c8174e2890bace740a28aa6345d17b9dc44973caca8ccd31855b2
8903ee493612b4f22a87354d5fb77c4463fb987872f16cb49d1bd127be436910
8a31934b218f21b0e3fdc40ee7252e47b8ce54fb3e045caf759f9973a5df0ef3
8df801a08f3c5e999e78ee5284bbc456be85304cb1365d277c1f83470fd7ba0e
8e152b29ad8668f5a58cba6556590926ec7e826d042e4e6d37c47f74851ddcdf
917e761400a493d3513481fc67e9a040d51a58521aaba28876660cfb962b728c
93f9aa31b40a84bf9792367470e4460cf50914d11c5afdc3cf3bb6e1a8241c97
9704e7b52ce2c04a7ce9fd2f49e3c5f2e997500ed0a7caa2a7ba30f31ef5f70c
98b2ea6cc6772cdf8797c77892f643b1fe14b6f4529bdd30a9c349b1f56b9515
9a8279b6f428826ee42f582a1894eb29d17bd4acef46a3ae87d310974cefd6a7
9e3a9103c80346b1b39bea3de46f44a462b3f594fa45e7206252bc41d7e3e855
9e7ea2b4ba8e2bcc4a964d6192e4671dc5f6863a1c7e35b52b229a3c1e67a68d
a22a5657f089797bd3cf4c6c8932606f3fd77e90543c916cff2f6e420d93bc3a
a5232f9b282afe0a361288029ccc96669844229080bf190dc50fca53abcbf73c
a7667631a0c021d3c969677848b99aedb6106bb7088aeda812a1ae4769beeb69
ab068cd65d308fdedddf83bad40970dd445a32bdcdb0d3f3ccc5c2e718a0d8ce
ac8778041fdb7f2e08ceb574c9a766247ea26f1a7d90fa854c4efcf4b361a957
ad7400d346ea8550094e6b201601691ba0ea4f5451c64d336527c12e1c5c2392
af829d43dbe5ab264b0e658bc2b8742d347d77ee8c386758885b348f937b3557
b2f0eb78e760793aa88df7683c138159b89a40b6bae150e750ce9b3db204d10a
b40c65e2db05b2a8a3cbb59cd41e8f5d14bbb91a7ea2a24c9e99817c1a1be12c
b4ceacee581031a4014c658e33aa47874612b4c25c1aed8ef682cada98b99d6d
b667e13f9583b98d8a1f3a1c373975f9c698708bb350a8f59eafe8877983b6ec
b77aed29b410f38c6d49e00d5720cc0ed6ac8b283111ab85dbc464bba5a7f040
b9703df5640cd1d2fccb85ef4187702dfab9ab4b54f9ad1f18d3e292c482476e
b9b90683e07e9ea08c7e8f44a47f6e21ea1abc724030696353bcedf5b29dba2a
bab57a635cd38fdf5da8488c2ba1bc55d7a99221d631e97cc24cf7d153c0d221
bc0bb941ff4d0254e4776285401b9d22a976711f3bbbdc9e0c83420a6e46d640
c09a4ac86d24db52cd3382f681d858442fda8132ef701a5607b64e62e5b4e3b1
c24f800cc531b63e5613ea0ccf746a98c9c0747412fd547991f62c00b4c8c49c
c483acfc0b19eec9a41f91605b7b51f17b84da8c11d344ec6ca7696af14bfb8d
c8112c38ab6471835615b6188a847011200491cdbdd29d4dff89ae449105eb51
c9ea5f4268368b289f2430830708cbdf080fcaaca156da67bff62ea15746e8ed
ca3d163bab055381827226140568f3bef7eaac187cebd76878e0b63e9e442356
cf4724b2f736ed1a0ae6bc28f1ead963d9cd2c1fd87b6ef32e7799fc1c5c8bda
d0ceccf41628171f0701230fc8b03c1cfe9227fff85ebb2029562fadded116ad
d10c94b6cdb747904baee9070f003bb45849da46f8100b1320f286c21cbcaaa1
d3fc632ef626f766ed7955dcbf7f3510e5d228f97ae700c8f5bbe9fd97cc5bf3
d44b09ffb577b57e6ce2e752f490a0e591b491e276f1eaae0dfd8281e6478945
d7b5c7bb06dad5cc4f51aeecb8f4315a970df31fa72e0fc8ba66167450a2d08c
d7fdcdea5a606aa1629a6cdf4c6002407958ed7a772342ca8aad6655480b8859
d9e52a6b5467b869b3574bef4ba8fef8a33123cc8f4c4d986d738731679ef742
dc7665f524b201d6fc55e28649f1d19557b5612530869be6a500b3d69532b777
ddae5c6cc15dc98df04b30e9e5a02b462098edff362e951826c5da8fc8dec6a9
de3246094525b21a870fc7d2a67490d0132535c6fa5993755c549f1a9d1bd8af
df270600155499b4aa53dbd8fa83bc7bf03be72cbc593a4c7d3d5b969f244b89
df3e003cc30e9bdd0313100e8ee5d468070b4b34d11ad355f276a356d4b9c7bf
e0b8e517bce461bbaca9359727d48121510064f2f2ce2d799f76fad6a5e1f1fd
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
e62dfc396b9f02438f76fb05e0d771bf13512d6e227fdec2a033b857718336a8
e8f1e845fb07301d06e8b03e21325d6a4532ba2ddee8b06222d8667f9b16a179
eb39067ad7f064d9fbf8a44a316336cf4ed1321ef1e7b7f6650f6ab19ff524b6
ec8c3b41fc8e1d256e7ef233c5c4700341ca2656fa9e41522d1a13730421310e
ef1955ae757c8b966c83248350331bd3a30f658ced11f387f8ebf05ab3368629
f1d2a34f883d83fe764db7fa3b17845cfd31f81ccd1426129111cde47437ad0a
f706e977b49ea16c21a58411ede0be44de71692c02ed10c4695a0acd3e0f0d03
f7aa4d4290e0978864d4f316665f8fb0deddf45c62df62fbffd2a1710bbd295c
f9d8cdaa185d8136a468eb5e09ae0d05d092eb1935b9fdf25fa22431a7216517
fa569f9784ea95f9264f89a90e49cd802adacf572a2d983c6522a0496569acdb
fcb5ee7a8fcec48a11b7adf420332a9ff2cf49f99558795d6b7b810618573e35
fd32b817b9db7ee1ad4f6e051a654ed386ce679cc0acf79c549eee587bc79c06