middleware

package module
v0.0.0-...-27f6569 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 28, 2023 License: Apache-2.0 Imports: 47 Imported by: 0

README

Middleware

Golang Framework

Cloud Native, 兼容云上及私有化

官网

Documentation

Overview

config module

Index

Constants

View Source
const (
	Slash               = "/"
	SlashSlash          = "//"
	SlashDotDot         = "/.."
	SlashDotSlash       = "/./"
	SlashDotDotSlash    = "/../"
	CRLF                = "\r\n"
	HTTP                = "http"
	HTTPS               = "https"
	HTTP11              = "HTTP/1.1"
	ColonSlashSlash     = "://"
	ColonSpace          = ": "
	GMT                 = "GMT"
	ResponseContinue    = "HTTP/1.1 100 Continue\r\n\r\n"
	GET                 = "GET"
	HEAD                = "HEAD"
	POST                = "POST"
	PUT                 = "PUT"
	DELETE              = "DELETE"
	OPTIONS             = "OPTIONS"
	EXPECT              = "EXPECT"
	Connection          = "Connection"
	ContentLength       = "Content-Length"
	ContentType         = "Content-Type"
	Date                = "Date"
	Host                = "Host"
	Referer             = "Referer"
	ServerHeader        = "Server"
	TransferEncoding    = "Transfer-Encoding"
	ContentEncoding     = "Content-Encoding"
	AcceptEncoding      = "Accept-Encoding"
	UserAgent           = "User-Agent"
	Cookie              = "Cookie"
	SetCookie           = "Set-Cookie"
	Location            = "Location"
	IfModifiedSince     = "If-Modified-Since"
	LastModified        = "Last-Modified"
	AcceptRanges        = "Accept-Ranges"
	Range               = "Range"
	ContentRange        = "Content-Range"
	CookieExpires       = "expires"
	CookieDomain        = "domain"
	CookiePath          = "Path"
	CookieHTTPOnly      = "HttpOnly"
	CookieSecure        = "secure"
	HttpClose           = "close"
	Gzip                = "gzip"
	Deflate             = "deflate"
	KeepAlive           = "keep-alive"
	KeepAliveCamelCase  = "Keep-Alive"
	Upgrade             = "Upgrade"
	Chunked             = "chunked"
	Identity            = "identity"
	PostArgsContentType = "application/x-www-form-urlencoded"
	MultipartFormData   = "multipart/form-data"
	Boundary            = "boundary"
	Bytes               = "bytes"
	TextSlash           = "text/"
	ApplicationSlash    = "application/"
)
View Source
const (
	ApplicationJson   = "application/json; charset=utf-8"
	Json              = "application/json; charset=utf-8"
	Css               = "text/css; charset=utf-8"
	Plain             = "text/plain; charset=utf-8"
	Html              = "text/html; charset=utf-8"
	Jpeg              = "image/jpeg"
	Js                = "text/javascript; charset=utf-8"
	Ts                = "text/typescript; charset=utf-8"
	Pdf               = "application/pdf"
	Png               = "image/png"
	Svg               = "image/svg+xml"
	Xml               = "text/xml; charset=utf-8"
	ApplicationFont   = "application/x-font-woff"
	ApplicationStream = "application/octet-stream"
)
View Source
const (
	AccessControlAllowOrigin  = "Access-Control-Allow-Origin"
	AccessControlAllowMethods = "Access-Control-Allow-Methods"
	AccessControlAllowHeaders = "Access-Control-Allow-Headers"
	METHODS                   = "POST,GET,OPTIONS,DELETE"
)
View Source
const (
	StatusContinue           = 100 // RFC 7231, 6.2.1
	StatusSwitchingProtocols = 101 // RFC 7231, 6.2.2
	StatusProcessing         = 102 // RFC 2518, 10.1

	StatusOK                   = 200 // RFC 7231, 6.3.1
	StatusCreated              = 201 // RFC 7231, 6.3.2
	StatusAccepted             = 202 // RFC 7231, 6.3.3
	StatusNonAuthoritativeInfo = 203 // RFC 7231, 6.3.4
	StatusNoContent            = 204 // RFC 7231, 6.3.5
	StatusResetContent         = 205 // RFC 7231, 6.3.6
	StatusPartialContent       = 206 // RFC 7233, 4.1
	StatusMultiStatus          = 207 // RFC 4918, 11.1
	StatusAlreadyReported      = 208 // RFC 5842, 7.1
	StatusIMUsed               = 226 // RFC 3229, 10.4.1

	StatusMultipleChoices  = 300 // RFC 7231, 6.4.1
	StatusMovedPermanently = 301 // RFC 7231, 6.4.2
	StatusFound            = 302 // RFC 7231, 6.4.3
	StatusSeeOther         = 303 // RFC 7231, 6.4.4
	StatusNotModified      = 304 // RFC 7232, 4.1
	StatusUseProxy         = 305 // RFC 7231, 6.4.5

	StatusTemporaryRedirect = 307 // RFC 7231, 6.4.7
	StatusPermanentRedirect = 308 // RFC 7538, 3

	StatusBadRequest                   = 400 // RFC 7231, 6.5.1
	StatusUnauthorized                 = 401 // RFC 7235, 3.1
	StatusPaymentRequired              = 402 // RFC 7231, 6.5.2
	StatusForbidden                    = 403 // RFC 7231, 6.5.3
	StatusNotFound                     = 404 // RFC 7231, 6.5.4
	StatusMethodNotAllowed             = 405 // RFC 7231, 6.5.5
	StatusNotAcceptable                = 406 // RFC 7231, 6.5.6
	StatusProxyAuthRequired            = 407 // RFC 7235, 3.2
	StatusRequestTimeout               = 408 // RFC 7231, 6.5.7
	StatusConflict                     = 409 // RFC 7231, 6.5.8
	StatusGone                         = 410 // RFC 7231, 6.5.9
	StatusLengthRequired               = 411 // RFC 7231, 6.5.10
	StatusPreconditionFailed           = 412 // RFC 7232, 4.2
	StatusRequestEntityTooLarge        = 413 // RFC 7231, 6.5.11
	StatusRequestURITooLong            = 414 // RFC 7231, 6.5.12
	StatusUnsupportedMediaType         = 415 // RFC 7231, 6.5.13
	StatusRequestedRangeNotSatisfiable = 416 // RFC 7233, 4.4
	StatusExpectationFailed            = 417 // RFC 7231, 6.5.14
	StatusTeapot                       = 418 // RFC 7168, 2.3.3
	StatusUnprocessableEntity          = 422 // RFC 4918, 11.2
	StatusLocked                       = 423 // RFC 4918, 11.3
	StatusFailedDependency             = 424 // RFC 4918, 11.4
	StatusUpgradeRequired              = 426 // RFC 7231, 6.5.15
	StatusPreconditionRequired         = 428 // RFC 6585, 3
	StatusTooManyRequests              = 429 // RFC 6585, 4
	StatusRequestHeaderFieldsTooLarge  = 431 // RFC 6585, 5
	StatusUnavailableForLegalReasons   = 451 // RFC 7725, 3

	StatusInternalServerError           = 500 // RFC 7231, 6.6.1
	StatusNotImplemented                = 501 // RFC 7231, 6.6.2
	StatusBadGateway                    = 502 // RFC 7231, 6.6.3
	StatusServiceUnavailable            = 503 // RFC 7231, 6.6.4
	StatusGatewayTimeout                = 504 // RFC 7231, 6.6.5
	StatusHTTPVersionNotSupported       = 505 // RFC 7231, 6.6.6
	StatusVariantAlsoNegotiates         = 506 // RFC 2295, 8.1
	StatusInsufficientStorage           = 507 // RFC 4918, 11.5
	StatusLoopDetected                  = 508 // RFC 5842, 7.2
	StatusNotExtended                   = 510 // RFC 2774, 7
	StatusNetworkAuthenticationRequired = 511 // RFC 6585, 6
)

HTTP status codes as registered with IANA. See: http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml

View Source
const (
	JSONPATH_ROOT      = "$"          // $ 根节点
	JSONPATH_SPLIT     = "."          // . 分隔符
	JSONPATH_CURRENT   = "@"          // @ 当前节点
	JSONPATH_ALL_MATCH = ".."         // .. 匹配所有符合条件的节点
	JSONPATH_INDEX     = "[%v]"       // [] 数组选择其中的一个
	JSONPATH_SLICE     = "[%v:%v:%v]" // [start:end:step] 数组切片
	JSONPATH_ALL       = "*"          // * 所有节点
)
View Source
const (
	PROTOCOL_TCP = "tcp"
	PROTOCOL_UDP = "udp"
)
View Source
const BootstrapCss = `` /* 163875-byte string literal not displayed */
View Source
const ConfDir = "CONF_DIR"
View Source
const DefaultIndex = `` /* 2571-byte string literal not displayed */

DefaultIndex title, backgroundUrl headerLinks, centerContent, enterLink, poweredBy, footerLinks

View Source
const HttpTimeFormattor = "Mon, 02 Jan 2006 15:04:05 GMT"
View Source
const StaticHtml = `` /* 1100-byte string literal not displayed */
View Source
const SwaggerCss = `` /* 143712-byte string literal not displayed */
View Source
const TimeFormat = "2006-1-2 15:04:05"
View Source
const TimeFormatForClickhouse = "2006-01-02 15:04:05"

Variables

View Source
var ConsoleLogFormatter = "[%s] [%s] %v\n"

[2023-01-11 12:00:01] [INFO] log content

View Source
var DefaultConnectionLifeSeconds = time.Duration(60*10) * time.Second

DefaultConnectionLifeSeconds 数据库连接池 最长默认存活时间

可进行设置

View Source
var ErrGetFromNullObj = errors.New("get attribute from null object")
View Source
var LogFormatter = "[%s] %v"
View Source
var RequestDefaultTimeout = 30

RequestDefaultTimeout http请求默认超时时间30s, 可在自己代码中进行全局修改

View Source
var StatusNotFoundView = fmt.Sprintf(StaticHtml, "NOT FOUND", "<h1>404 NOT FOUND</h1>")
View Source
var SwaggerJs, _ = base64.StdEncoding.DecodeString(`IWZ1bmN0aW9uKGUsdCl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz10KCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW10sdCk6Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMuU3dhZ2dlclVJQnVuZGxlPXQoKTplLlN3YWdnZXJVSUJ1bmRsZT10KCl9KHRoaXMsKGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0PXt9O2Z1bmN0aW9uIG4ocil7aWYodFtyXSlyZXR1cm4gdFtyXS5leHBvcnRzO3ZhciBvPXRbcl09e2k6cixsOiExLGV4cG9ydHM6e319O3JldHVybiBlW3JdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLG4pLG8ubD0hMCxvLmV4cG9ydHN9cmV0dXJuIG4ubT1lLG4uYz10LG4uZD1mdW5jdGlvbihlLHQscil7bi5vKGUsdCl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2VudW1lcmFibGU6ITAsZ2V0OnJ9KX0sbi5yPWZ1bmN0aW9uKGUpeyJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6Ik1vZHVsZSJ9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9LG4udD1mdW5jdGlvbihlLHQpe2lmKDEmdCYmKGU9bihlKSksOCZ0KXJldHVybiBlO2lmKDQmdCYmIm9iamVjdCI9PXR5cGVvZiBlJiZlJiZlLl9fZXNNb2R1bGUpcmV0dXJuIGU7dmFyIHI9T2JqZWN0LmNyZWF0ZShudWxsKTtpZihuLnIociksT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsImRlZmF1bHQiLHtlbnVtZXJhYmxlOiEwLHZhbHVlOmV9KSwyJnQmJiJzdHJpbmciIT10eXBlb2YgZSlmb3IodmFyIG8gaW4gZSluLmQocixvLGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfS5iaW5kKG51bGwsbykpO3JldHVybiByfSxuLm49ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIGUuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gZX07cmV0dXJuIG4uZCh0LCJhIix0KSx0fSxuLm89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCl9LG4ucD0iL2Rpc3QiLG4obi5zPTUzNCl9KFtmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1uKDEzMyl9LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlO2Z1bmN0aW9uIHQoZSx0KXt0JiYoZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSkpLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWV9ZnVuY3Rpb24gbihlKXtyZXR1cm4gaShlKT9lOkooZSl9ZnVuY3Rpb24gcihlKXtyZXR1cm4gcyhlKT9lOksoZSl9ZnVuY3Rpb24gbyhlKXtyZXR1cm4gdShlKT9lOlkoZSl9ZnVuY3Rpb24gYShlKXtyZXR1cm4gaShlKSYmIWMoZSk/ZTpHKGUpfWZ1bmN0aW9uIGkoZSl7cmV0dXJuISghZXx8IWVbcF0pfWZ1bmN0aW9uIHMoZSl7cmV0dXJuISghZXx8IWVbZl0pfWZ1bmN0aW9uIHUoZSl7cmV0dXJuISghZXx8IWVbaF0pfWZ1bmN0aW9uIGMoZSl7cmV0dXJuIHMoZSl8fHUoZSl9ZnVuY3Rpb24gbChlKXtyZXR1cm4hKCFlfHwhZVtkXSl9dChyLG4pLHQobyxuKSx0KGEsbiksbi5pc0l0ZXJhYmxlPWksbi5pc0tleWVkPXMsbi5pc0luZGV4ZWQ9dSxuLmlzQXNzb2NpYXRpdmU9YyxuLmlzT3JkZXJlZD1sLG4uS2V5ZWQ9cixuLkluZGV4ZWQ9byxuLlNldD1hO3ZhciBwPSJAQF9fSU1NVVRBQkxFX0lURVJBQkxFX19AQCIsZj0iQEBfX0lNTVVUQUJMRV9LRVlFRF9fQEAiLGg9IkBAX19JTU1VVEFCTEVfSU5ERVhFRF9fQEAiLGQ9IkBAX19JTU1VVEFCTEVfT1JERVJFRF9fQEAiLG09ImRlbGV0ZSIsdj01LGc9MTw8dix5PWctMSxiPXt9LF89e3ZhbHVlOiExfSx3PXt2YWx1ZTohMX07ZnVuY3Rpb24geChlKXtyZXR1cm4gZS52YWx1ZT0hMSxlfWZ1bmN0aW9uIEUoZSl7ZSYmKGUudmFsdWU9ITApfWZ1bmN0aW9uIFMoKXt9ZnVuY3Rpb24gQyhlLHQpe3Q9dHx8MDtmb3IodmFyIG49TWF0aC5tYXgoMCxlLmxlbmd0aC10KSxyPW5ldyBBcnJheShuKSxvPTA7bzxuO28rKylyW29dPWVbbyt0XTtyZXR1cm4gcn1mdW5jdGlvbiBBKGUpe3JldHVybiB2b2lkIDA9PT1lLnNpemUmJihlLnNpemU9ZS5fX2l0ZXJhdGUoaykpLGUuc2l6ZX1mdW5jdGlvbiBPKGUsdCl7aWYoIm51bWJlciIhPXR5cGVvZiB0KXt2YXIgbj10Pj4+MDtpZigiIituIT09dHx8NDI5NDk2NzI5NT09PW4pcmV0dXJuIE5hTjt0PW59cmV0dXJuIHQ8MD9BKGUpK3Q6dH1mdW5jdGlvbiBrKCl7cmV0dXJuITB9ZnVuY3Rpb24gaihlLHQsbil7cmV0dXJuKDA9PT1lfHx2b2lkIDAhPT1uJiZlPD0tbikmJih2b2lkIDA9PT10fHx2b2lkIDAhPT1uJiZ0Pj1uKX1mdW5jdGlvbiBUKGUsdCl7cmV0dXJuIFAoZSx0LDApfWZ1bmN0aW9uIEkoZSx0KXtyZXR1cm4gUChlLHQsdCl9ZnVuY3Rpb24gUChlLHQsbil7cmV0dXJuIHZvaWQgMD09PWU/bjplPDA/TWF0aC5tYXgoMCx0K2UpOnZvaWQgMD09PXQ/ZTpNYXRoLm1pbih0LGUpfXZhciBOPTAsTT0xLFI9MixEPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvcixMPSJAQGl0ZXJhdG9yIixCPUR8fEw7ZnVuY3Rpb24gRihlKXt0aGlzLm5leHQ9ZX1mdW5jdGlvbiBVKGUsdCxuLHIpe3ZhciBvPTA9PT1lP3Q6MT09PWU/bjpbdCxuXTtyZXR1cm4gcj9yLnZhbHVlPW86cj17dmFsdWU6byxkb25lOiExfSxyfWZ1bmN0aW9uIHEoKXtyZXR1cm57dmFsdWU6dm9pZCAwLGRvbmU6ITB9fWZ1bmN0aW9uIHooZSl7cmV0dXJuISFIKGUpfWZ1bmN0aW9uIFYoZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLm5leHR9ZnVuY3Rpb24gVyhlKXt2YXIgdD1IKGUpO3JldHVybiB0JiZ0LmNhbGwoZSl9ZnVuY3Rpb24gSChlKXt2YXIgdD1lJiYoRCYmZVtEXXx8ZVtMXSk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQpcmV0dXJuIHR9ZnVuY3Rpb24gJChlKXtyZXR1cm4gZSYmIm51bWJlciI9PXR5cGVvZiBlLmxlbmd0aH1mdW5jdGlvbiBKKGUpe3JldHVybiBudWxsPT1lP2llKCk6aShlKT9lLnRvU2VxKCk6Y2UoZSl9ZnVuY3Rpb24gSyhlKXtyZXR1cm4gbnVsbD09ZT9pZSgpLnRvS2V5ZWRTZXEoKTppKGUpP3MoZSk/ZS50b1NlcSgpOmUuZnJvbUVudHJ5U2VxKCk6c2UoZSl9ZnVuY3Rpb24gWShlKXtyZXR1cm4gbnVsbD09ZT9pZSgpOmkoZSk/cyhlKT9lLmVudHJ5U2VxKCk6ZS50b0luZGV4ZWRTZXEoKTp1ZShlKX1mdW5jdGlvbiBHKGUpe3JldHVybihudWxsPT1lP2llKCk6aShlKT9zKGUpP2UuZW50cnlTZXEoKTplOnVlKGUpKS50b1NldFNlcSgpfUYucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIltJdGVyYXRvcl0ifSxGLktFWVM9TixGLlZBTFVFUz1NLEYuRU5UUklFUz1SLEYucHJvdG90eXBlLmluc3BlY3Q9Ri5wcm90b3R5cGUudG9Tb3VyY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b1N0cmluZygpfSxGLnByb3RvdHlwZVtCXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSx0KEosbiksSi5vZj1mdW5jdGlvbigpe3JldHVybiBKKGFyZ3VtZW50cyl9LEoucHJvdG90eXBlLnRvU2VxPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LEoucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX190b1N0cmluZygiU2VxIHsiLCJ9Iil9LEoucHJvdG90eXBlLmNhY2hlUmVzdWx0PWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuX2NhY2hlJiZ0aGlzLl9faXRlcmF0ZVVuY2FjaGVkJiYodGhpcy5fY2FjaGU9dGhpcy5lbnRyeVNlcSgpLnRvQXJyYXkoKSx0aGlzLnNpemU9dGhpcy5fY2FjaGUubGVuZ3RoKSx0aGlzfSxKLnByb3RvdHlwZS5fX2l0ZXJhdGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcGUodGhpcyxlLHQsITApfSxKLnByb3RvdHlwZS5fX2l0ZXJhdG9yPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZlKHRoaXMsZSx0LCEwKX0sdChLLEopLEsucHJvdG90eXBlLnRvS2V5ZWRTZXE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sdChZLEopLFkub2Y9ZnVuY3Rpb24oKXtyZXR1cm4gWShhcmd1bWVudHMpfSxZLnByb3RvdHlwZS50b0luZGV4ZWRTZXE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sWS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX3RvU3RyaW5nKCJTZXEgWyIsIl0iKX0sWS5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHBlKHRoaXMsZSx0LCExKX0sWS5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbihlLHQpe3JldHVybiBmZSh0aGlzLGUsdCwhMSl9LHQoRyxKKSxHLm9mPWZ1bmN0aW9uKCl7cmV0dXJuIEcoYXJndW1lbnRzKX0sRy5wcm90b3R5cGUudG9TZXRTZXE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sSi5pc1NlcT1hZSxKLktleWVkPUssSi5TZXQ9RyxKLkluZGV4ZWQ9WTt2YXIgWixYLFEsZWU9IkBAX19JTU1VVEFCTEVfU0VRX19AQCI7ZnVuY3Rpb24gdGUoZSl7dGhpcy5fYXJyYXk9ZSx0aGlzLnNpemU9ZS5sZW5ndGh9ZnVuY3Rpb24gbmUoZSl7dmFyIHQ9T2JqZWN0LmtleXMoZSk7dGhpcy5fb2JqZWN0PWUsdGhpcy5fa2V5cz10LHRoaXMuc2l6ZT10Lmxlbmd0aH1mdW5jdGlvbiByZShlKXt0aGlzLl9pdGVyYWJsZT1lLHRoaXMuc2l6ZT1lLmxlbmd0aHx8ZS5zaXplfWZ1bmN0aW9uIG9lKGUpe3RoaXMuX2l0ZXJhdG9yPWUsdGhpcy5faXRlcmF0b3JDYWNoZT1bXX1mdW5jdGlvbiBhZShlKXtyZXR1cm4hKCFlfHwhZVtlZV0pfWZ1bmN0aW9uIGllKCl7cmV0dXJuIFp8fChaPW5ldyB0ZShbXSkpfWZ1bmN0aW9uIHNlKGUpe3ZhciB0PUFycmF5LmlzQXJyYXkoZSk/bmV3IHRlKGUpLmZyb21FbnRyeVNlcSgpOlYoZSk/bmV3IG9lKGUpLmZyb21FbnRyeVNlcSgpOnooZSk/bmV3IHJlKGUpLmZyb21FbnRyeVNlcSgpOiJvYmplY3QiPT10eXBlb2YgZT9uZXcgbmUoZSk6dm9pZCAwO2lmKCF0KXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIEFycmF5IG9yIGl0ZXJhYmxlIG9iamVjdCBvZiBbaywgdl0gZW50cmllcywgb3Iga2V5ZWQgb2JqZWN0OiAiK2UpO3JldHVybiB0fWZ1bmN0aW9uIHVlKGUpe3ZhciB0PWxlKGUpO2lmKCF0KXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIEFycmF5IG9yIGl0ZXJhYmxlIG9iamVjdCBvZiB2YWx1ZXM6ICIrZSk7cmV0dXJuIHR9ZnVuY3Rpb24gY2UoZSl7dmFyIHQ9bGUoZSl8fCJvYmplY3QiPT10eXBlb2YgZSYmbmV3IG5lKGUpO2lmKCF0KXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIEFycmF5IG9yIGl0ZXJhYmxlIG9iamVjdCBvZiB2YWx1ZXMsIG9yIGtleWVkIG9iamVjdDogIitlKTtyZXR1cm4gdH1mdW5jdGlvbiBsZShlKXtyZXR1cm4gJChlKT9uZXcgdGUoZSk6VihlKT9uZXcgb2UoZSk6eihlKT9uZXcgcmUoZSk6dm9pZCAwfWZ1bmN0aW9uIHBlKGUsdCxuLHIpe3ZhciBvPWUuX2NhY2hlO2lmKG8pe2Zvcih2YXIgYT1vLmxlbmd0aC0xLGk9MDtpPD1hO2krKyl7dmFyIHM9b1tuP2EtaTppXTtpZighMT09PXQoc1sxXSxyP3NbMF06aSxlKSlyZXR1cm4gaSsxfXJldHVybiBpfXJldHVybiBlLl9faXRlcmF0ZVVuY2FjaGVkKHQsbil9ZnVuY3Rpb24gZmUoZSx0LG4scil7dmFyIG89ZS5fY2FjaGU7aWYobyl7dmFyIGE9by5sZW5ndGgtMSxpPTA7cmV0dXJuIG5ldyBGKChmdW5jdGlvbigpe3ZhciBlPW9bbj9hLWk6aV07cmV0dXJuIGkrKz5hP3EoKTpVKHQscj9lWzBdOmktMSxlWzFdKX0pKX1yZXR1cm4gZS5fX2l0ZXJhdG9yVW5jYWNoZWQodCxuKX1mdW5jdGlvbiBoZShlLHQpe3JldHVybiB0P2RlKHQsZSwiIix7IiI6ZX0pOm1lKGUpfWZ1bmN0aW9uIGRlKGUsdCxuLHIpe3JldHVybiBBcnJheS5pc0FycmF5KHQpP2UuY2FsbChyLG4sWSh0KS5tYXAoKGZ1bmN0aW9uKG4scil7cmV0dXJuIGRlKGUsbixyLHQpfSkpKTp2ZSh0KT9lLmNhbGwocixuLEsodCkubWFwKChmdW5jdGlvbihuLHIpe3JldHVybiBkZShlLG4scix0KX0pKSk6dH1mdW5jdGlvbiBtZShlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9ZKGUpLm1hcChtZSkudG9MaXN0KCk6dmUoZSk/SyhlKS5tYXAobWUpLnRvTWFwKCk6ZX1mdW5jdGlvbiB2ZShlKXtyZXR1cm4gZSYmKGUuY29uc3RydWN0b3I9PT1PYmplY3R8fHZvaWQgMD09PWUuY29uc3RydWN0b3IpfWZ1bmN0aW9uIGdlKGUsdCl7aWYoZT09PXR8fGUhPWUmJnQhPXQpcmV0dXJuITA7aWYoIWV8fCF0KXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBlLnZhbHVlT2YmJiJmdW5jdGlvbiI9PXR5cGVvZiB0LnZhbHVlT2Ype2lmKChlPWUudmFsdWVPZigpKT09PSh0PXQudmFsdWVPZigpKXx8ZSE9ZSYmdCE9dClyZXR1cm4hMDtpZighZXx8IXQpcmV0dXJuITF9cmV0dXJuISgiZnVuY3Rpb24iIT10eXBlb2YgZS5lcXVhbHN8fCJmdW5jdGlvbiIhPXR5cGVvZiB0LmVxdWFsc3x8IWUuZXF1YWxzKHQpKX1mdW5jdGlvbiB5ZShlLHQpe2lmKGU9PT10KXJldHVybiEwO2lmKCFpKHQpfHx2b2lkIDAhPT1lLnNpemUmJnZvaWQgMCE9PXQuc2l6ZSYmZS5zaXplIT09dC5zaXplfHx2b2lkIDAhPT1lLl9faGFzaCYmdm9pZCAwIT09dC5fX2hhc2gmJmUuX19oYXNoIT09dC5fX2hhc2h8fHMoZSkhPT1zKHQpfHx1KGUpIT09dSh0KXx8bChlKSE9PWwodCkpcmV0dXJuITE7aWYoMD09PWUuc2l6ZSYmMD09PXQuc2l6ZSlyZXR1cm4hMDt2YXIgbj0hYyhlKTtpZihsKGUpKXt2YXIgcj1lLmVudHJpZXMoKTtyZXR1cm4gdC5ldmVyeSgoZnVuY3Rpb24oZSx0KXt2YXIgbz1yLm5leHQoKS52YWx1ZTtyZXR1cm4gbyYmZ2Uob1sxXSxlKSYmKG58fGdlKG9bMF0sdCkpfSkpJiZyLm5leHQoKS5kb25lfXZhciBvPSExO2lmKHZvaWQgMD09PWUuc2l6ZSlpZih2b2lkIDA9PT10LnNpemUpImZ1bmN0aW9uIj09dHlwZW9mIGUuY2FjaGVSZXN1bHQmJmUuY2FjaGVSZXN1bHQoKTtlbHNle289ITA7dmFyIGE9ZTtlPXQsdD1hfXZhciBwPSEwLGY9dC5fX2l0ZXJhdGUoKGZ1bmN0aW9uKHQscil7aWYobj8hZS5oYXModCk6bz8hZ2UodCxlLmdldChyLGIpKTohZ2UoZS5nZXQocixiKSx0KSlyZXR1cm4gcD0hMSwhMX0pKTtyZXR1cm4gcCYmZS5zaXplPT09Zn1mdW5jdGlvbiBiZShlLHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGJlKSlyZXR1cm4gbmV3IGJlKGUsdCk7aWYodGhpcy5fdmFsdWU9ZSx0aGlzLnNpemU9dm9pZCAwPT09dD8xLzA6TWF0aC5tYXgoMCx0KSwwPT09dGhpcy5zaXplKXtpZihYKXJldHVybiBYO1g9dGhpc319ZnVuY3Rpb24gX2UoZSx0KXtpZighZSl0aHJvdyBuZXcgRXJyb3IodCl9ZnVuY3Rpb24gd2UoZSx0LG4pe2lmKCEodGhpcyBpbnN0YW5jZW9mIHdlKSlyZXR1cm4gbmV3IHdlKGUsdCxuKTtpZihfZSgwIT09biwiQ2Fubm90IHN0ZXAgYSBSYW5nZSBieSAwIiksZT1lfHwwLHZvaWQgMD09PXQmJih0PTEvMCksbj12b2lkIDA9PT1uPzE6TWF0aC5hYnMobiksdDxlJiYobj0tbiksdGhpcy5fc3RhcnQ9ZSx0aGlzLl9lbmQ9dCx0aGlzLl9zdGVwPW4sdGhpcy5zaXplPU1hdGgubWF4KDAsTWF0aC5jZWlsKCh0LWUpL24tMSkrMSksMD09PXRoaXMuc2l6ZSl7aWYoUSlyZXR1cm4gUTtRPXRoaXN9fWZ1bmN0aW9uIHhlKCl7dGhyb3cgVHlwZUVycm9yKCJBYnN0cmFjdCIpfWZ1bmN0aW9uIEVlKCl7fWZ1bmN0aW9uIFNlKCl7fWZ1bmN0aW9uIENlKCl7fUoucHJvdG90eXBlW2VlXT0hMCx0KHRlLFkpLHRlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5oYXMoZSk/dGhpcy5fYXJyYXlbTyh0aGlzLGUpXTp0fSx0ZS5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXRoaXMuX2FycmF5LHI9bi5sZW5ndGgtMSxvPTA7bzw9cjtvKyspaWYoITE9PT1lKG5bdD9yLW86b10sbyx0aGlzKSlyZXR1cm4gbysxO3JldHVybiBvfSx0ZS5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX2FycmF5LHI9bi5sZW5ndGgtMSxvPTA7cmV0dXJuIG5ldyBGKChmdW5jdGlvbigpe3JldHVybiBvPnI/cSgpOlUoZSxvLG5bdD9yLW8rKzpvKytdKX0pKX0sdChuZSxLKSxuZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXR8fHRoaXMuaGFzKGUpP3RoaXMuX29iamVjdFtlXTp0fSxuZS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9vYmplY3QuaGFzT3duUHJvcGVydHkoZSl9LG5lLnByb3RvdHlwZS5fX2l0ZXJhdGU9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49dGhpcy5fb2JqZWN0LHI9dGhpcy5fa2V5cyxvPXIubGVuZ3RoLTEsYT0wO2E8PW87YSsrKXt2YXIgaT1yW3Q/by1hOmFdO2lmKCExPT09ZShuW2ldLGksdGhpcykpcmV0dXJuIGErMX1yZXR1cm4gYX0sbmUucHJvdG90eXBlLl9faXRlcmF0b3I9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9vYmplY3Qscj10aGlzLl9rZXlzLG89ci5sZW5ndGgtMSxhPTA7cmV0dXJuIG5ldyBGKChmdW5jdGlvbigpe3ZhciBpPXJbdD9vLWE6YV07cmV0dXJuIGErKz5vP3EoKTpVKGUsaSxuW2ldKX0pKX0sbmUucHJvdG90eXBlW2RdPSEwLHQocmUsWSkscmUucHJvdG90eXBlLl9faXRlcmF0ZVVuY2FjaGVkPWZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0ZShlLHQpO3ZhciBuPVcodGhpcy5faXRlcmFibGUpLHI9MDtpZihWKG4pKWZvcih2YXIgbzshKG89bi5uZXh0KCkpLmRvbmUmJiExIT09ZShvLnZhbHVlLHIrKyx0aGlzKTspO3JldHVybiByfSxyZS5wcm90b3R5cGUuX19pdGVyYXRvclVuY2FjaGVkPWZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0b3IoZSx0KTt2YXIgbj1XKHRoaXMuX2l0ZXJhYmxlKTtpZighVihuKSlyZXR1cm4gbmV3IEYocSk7dmFyIHI9MDtyZXR1cm4gbmV3IEYoKGZ1bmN0aW9uKCl7dmFyIHQ9bi5uZXh0KCk7cmV0dXJuIHQuZG9uZT90OlUoZSxyKyssdC52YWx1ZSl9KSl9LHQob2UsWSksb2UucHJvdG90eXBlLl9faXRlcmF0ZVVuY2FjaGVkPWZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0ZShlLHQpO2Zvcih2YXIgbixyPXRoaXMuX2l0ZXJhdG9yLG89dGhpcy5faXRlcmF0b3JDYWNoZSxhPTA7YTxvLmxlbmd0aDspaWYoITE9PT1lKG9bYV0sYSsrLHRoaXMpKXJldHVybiBhO2Zvcig7IShuPXIubmV4dCgpKS5kb25lOyl7dmFyIGk9bi52YWx1ZTtpZihvW2FdPWksITE9PT1lKGksYSsrLHRoaXMpKWJyZWFrfXJldHVybiBhfSxvZS5wcm90b3R5cGUuX19pdGVyYXRvclVuY2FjaGVkPWZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0b3IoZSx0KTt2YXIgbj10aGlzLl9pdGVyYXRvcixyPXRoaXMuX2l0ZXJhdG9yQ2FjaGUsbz0wO3JldHVybiBuZXcgRigoZnVuY3Rpb24oKXtpZihvPj1yLmxlbmd0aCl7dmFyIHQ9bi5uZXh0KCk7aWYodC5kb25lKXJldHVybiB0O3Jbb109dC52YWx1ZX1yZXR1cm4gVShlLG8scltvKytdKX0pKX0sdChiZSxZKSxiZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuc2l6ZT8iUmVwZWF0IFtdIjoiUmVwZWF0IFsgIit0aGlzLl92YWx1ZSsiICIrdGhpcy5zaXplKyIgdGltZXMgXSJ9LGJlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5oYXMoZSk/dGhpcy5fdmFsdWU6dH0sYmUucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uKGUpe3JldHVybiBnZSh0aGlzLl92YWx1ZSxlKX0sYmUucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5zaXplO3JldHVybiBqKGUsdCxuKT90aGlzOm5ldyBiZSh0aGlzLl92YWx1ZSxJKHQsbiktVChlLG4pKX0sYmUucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sYmUucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24oZSl7cmV0dXJuIGdlKHRoaXMuX3ZhbHVlLGUpPzA6LTF9LGJlLnByb3RvdHlwZS5sYXN0SW5kZXhPZj1mdW5jdGlvbihlKXtyZXR1cm4gZ2UodGhpcy5fdmFsdWUsZSk/dGhpcy5zaXplOi0xfSxiZS5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTA7bjx0aGlzLnNpemU7bisrKWlmKCExPT09ZSh0aGlzLl92YWx1ZSxuLHRoaXMpKXJldHVybiBuKzE7cmV0dXJuIG59LGJlLnByb3RvdHlwZS5fX2l0ZXJhdG9yPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcyxyPTA7cmV0dXJuIG5ldyBGKChmdW5jdGlvbigpe3JldHVybiByPG4uc2l6ZT9VKGUscisrLG4uX3ZhbHVlKTpxKCl9KSl9LGJlLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBiZT9nZSh0aGlzLl92YWx1ZSxlLl92YWx1ZSk6eWUoZSl9LHQod2UsWSksd2UucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLnNpemU/IlJhbmdlIFtdIjoiUmFuZ2UgWyAiK3RoaXMuX3N0YXJ0KyIuLi4iK3RoaXMuX2VuZCsoMSE9PXRoaXMuX3N0ZXA/IiBieSAiK3RoaXMuX3N0ZXA6IiIpKyIgXSJ9LHdlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5oYXMoZSk/dGhpcy5fc3RhcnQrTyh0aGlzLGUpKnRoaXMuX3N0ZXA6dH0sd2UucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uKGUpe3ZhciB0PShlLXRoaXMuX3N0YXJ0KS90aGlzLl9zdGVwO3JldHVybiB0Pj0wJiZ0PHRoaXMuc2l6ZSYmdD09PU1hdGguZmxvb3IodCl9LHdlLnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbihlLHQpe3JldHVybiBqKGUsdCx0aGlzLnNpemUpP3RoaXM6KGU9VChlLHRoaXMuc2l6ZSksKHQ9SSh0LHRoaXMuc2l6ZSkpPD1lP25ldyB3ZSgwLDApOm5ldyB3ZSh0aGlzLmdldChlLHRoaXMuX2VuZCksdGhpcy5nZXQodCx0aGlzLl9lbmQpLHRoaXMuX3N0ZXApKX0sd2UucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS10aGlzLl9zdGFydDtpZih0JXRoaXMuX3N0ZXA9PTApe3ZhciBuPXQvdGhpcy5fc3RlcDtpZihuPj0wJiZuPHRoaXMuc2l6ZSlyZXR1cm4gbn1yZXR1cm4tMX0sd2UucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmluZGV4T2YoZSl9LHdlLnByb3RvdHlwZS5fX2l0ZXJhdGU9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49dGhpcy5zaXplLTEscj10aGlzLl9zdGVwLG89dD90aGlzLl9zdGFydCtuKnI6dGhpcy5fc3RhcnQsYT0wO2E8PW47YSsrKXtpZighMT09PWUobyxhLHRoaXMpKXJldHVybiBhKzE7bys9dD8tcjpyfXJldHVybiBhfSx3ZS5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuc2l6ZS0xLHI9dGhpcy5fc3RlcCxvPXQ/dGhpcy5fc3RhcnQrbipyOnRoaXMuX3N0YXJ0LGE9MDtyZXR1cm4gbmV3IEYoKGZ1bmN0aW9uKCl7dmFyIGk9bztyZXR1cm4gbys9dD8tcjpyLGE+bj9xKCk6VShlLGErKyxpKX0pKX0sd2UucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIHdlP3RoaXMuX3N0YXJ0PT09ZS5fc3RhcnQmJnRoaXMuX2VuZD09PWUuX2VuZCYmdGhpcy5fc3RlcD09PWUuX3N0ZXA6eWUodGhpcyxlKX0sdCh4ZSxuKSx0KEVlLHhlKSx0KFNlLHhlKSx0KENlLHhlKSx4ZS5LZXllZD1FZSx4ZS5JbmRleGVkPVNlLHhlLlNldD1DZTt2YXIgQWU9ImZ1bmN0aW9uIj09dHlwZW9mIE1hdGguaW11bCYmLTI9PT1NYXRoLmltdWwoNDI5NDk2NzI5NSwyKT9NYXRoLmltdWw6ZnVuY3Rpb24oZSx0KXt2YXIgbj02NTUzNSYoZXw9MCkscj02NTUzNSYodHw9MCk7cmV0dXJuIG4qcisoKGU+Pj4xNikqcituKih0Pj4+MTYpPDwxNj4+PjApfDB9O2Z1bmN0aW9uIE9lKGUpe3JldHVybiBlPj4+MSYxMDczNzQxODI0fDMyMjEyMjU0NzEmZX1mdW5jdGlvbiBrZShlKXtpZighMT09PWV8fG51bGw9PWUpcmV0dXJuIDA7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUudmFsdWVPZiYmKCExPT09KGU9ZS52YWx1ZU9mKCkpfHxudWxsPT1lKSlyZXR1cm4gMDtpZighMD09PWUpcmV0dXJuIDE7dmFyIHQ9dHlwZW9mIGU7aWYoIm51bWJlciI9PT10KXtpZihlIT1lfHxlPT09MS8wKXJldHVybiAwO3ZhciBuPTB8ZTtmb3IobiE9PWUmJihuXj00Mjk0OTY3Mjk1KmUpO2U+NDI5NDk2NzI5NTspbl49ZS89NDI5NDk2NzI5NTtyZXR1cm4gT2Uobil9aWYoInN0cmluZyI9PT10KXJldHVybiBlLmxlbmd0aD5GZT9qZShlKTpUZShlKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgZS5oYXNoQ29kZSlyZXR1cm4gZS5oYXNoQ29kZSgpO2lmKCJvYmplY3QiPT09dClyZXR1cm4gSWUoZSk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUudG9TdHJpbmcpcmV0dXJuIFRlKGUudG9TdHJpbmcoKSk7dGhyb3cgbmV3IEVycm9yKCJWYWx1ZSB0eXBlICIrdCsiIGNhbm5vdCBiZSBoYXNoZWQuIil9ZnVuY3Rpb24gamUoZSl7dmFyIHQ9emVbZV07cmV0dXJuIHZvaWQgMD09PXQmJih0PVRlKGUpLHFlPT09VWUmJihxZT0wLHplPXt9KSxxZSsrLHplW2VdPXQpLHR9ZnVuY3Rpb24gVGUoZSl7Zm9yKHZhciB0PTAsbj0wO248ZS5sZW5ndGg7bisrKXQ9MzEqdCtlLmNoYXJDb2RlQXQobil8MDtyZXR1cm4gT2UodCl9ZnVuY3Rpb24gSWUoZSl7dmFyIHQ7aWYoRGUmJnZvaWQgMCE9PSh0PVJlLmdldChlKSkpcmV0dXJuIHQ7aWYodm9pZCAwIT09KHQ9ZVtCZV0pKXJldHVybiB0O2lmKCFOZSl7aWYodm9pZCAwIT09KHQ9ZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmZS5wcm9wZXJ0eUlzRW51bWVyYWJsZVtCZV0pKXJldHVybiB0O2lmKHZvaWQgMCE9PSh0PU1lKGUpKSlyZXR1cm4gdH1pZih0PSsrTGUsMTA3Mzc0MTgyNCZMZSYmKExlPTApLERlKVJlLnNldChlLHQpO2Vsc2V7aWYodm9pZCAwIT09UGUmJiExPT09UGUoZSkpdGhyb3cgbmV3IEVycm9yKCJOb24tZXh0ZW5zaWJsZSBvYmplY3RzIGFyZSBub3QgYWxsb3dlZCBhcyBrZXlzLiIpO2lmKE5lKU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLEJlLHtlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMSx3cml0YWJsZTohMSx2YWx1ZTp0fSk7ZWxzZSBpZih2b2lkIDAhPT1lLnByb3BlcnR5SXNFbnVtZXJhYmxlJiZlLnByb3BlcnR5SXNFbnVtZXJhYmxlPT09ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUpZS5wcm9wZXJ0eUlzRW51bWVyYWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvcGVydHlJc0VudW1lcmFibGVbQmVdPXQ7ZWxzZXtpZih2b2lkIDA9PT1lLm5vZGVUeXBlKXRocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIHNldCBhIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5IG9uIG9iamVjdC4iKTtlW0JlXT10fX1yZXR1cm4gdH12YXIgUGU9T2JqZWN0LmlzRXh0ZW5zaWJsZSxOZT1mdW5jdGlvbigpe3RyeXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJAIix7fSksITB9Y2F0Y2goZSl7cmV0dXJuITF9fSgpO2Z1bmN0aW9uIE1lKGUpe2lmKGUmJmUubm9kZVR5cGU+MClzd2l0Y2goZS5ub2RlVHlwZSl7Y2FzZSAxOnJldHVybiBlLnVuaXF1ZUlEO2Nhc2UgOTpyZXR1cm4gZS5kb2N1bWVudEVsZW1lbnQmJmUuZG9jdW1lbnRFbGVtZW50LnVuaXF1ZUlEfX12YXIgUmUsRGU9ImZ1bmN0aW9uIj09dHlwZW9mIFdlYWtNYXA7RGUmJihSZT1uZXcgV2Vha01hcCk7dmFyIExlPTAsQmU9Il9faW1tdXRhYmxlaGFzaF9fIjsiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYoQmU9U3ltYm9sKEJlKSk7dmFyIEZlPTE2LFVlPTI1NSxxZT0wLHplPXt9O2Z1bmN0aW9uIFZlKGUpe19lKGUhPT0xLzAsIkNhbm5vdCBwZXJmb3JtIHRoaXMgYWN0aW9uIHdpdGggYW4gaW5maW5pdGUgc2l6ZS4iKX1mdW5jdGlvbiBXZShlKXtyZXR1cm4gbnVsbD09ZT9vdCgpOkhlKGUpJiYhbChlKT9lOm90KCkud2l0aE11dGF0aW9ucygoZnVuY3Rpb24odCl7dmFyIG49cihlKTtWZShuLnNpemUpLG4uZm9yRWFjaCgoZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5zZXQobixlKX0pKX0pKX1mdW5jdGlvbiBIZShlKXtyZXR1cm4hKCFlfHwhZVtKZV0pfXQoV2UsRWUpLFdlLm9mPWZ1bmN0aW9uKCl7dmFyIHQ9ZS5jYWxsKGFyZ3VtZW50cywwKTtyZXR1cm4gb3QoKS53aXRoTXV0YXRpb25zKChmdW5jdGlvbihlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rPTIpe2lmKG4rMT49dC5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHZhbHVlIGZvciBrZXk6ICIrdFtuXSk7ZS5zZXQodFtuXSx0W24rMV0pfX0pKX0sV2UucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX190b1N0cmluZygiTWFwIHsiLCJ9Iil9LFdlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5fcm9vdD90aGlzLl9yb290LmdldCgwLHZvaWQgMCxlLHQpOnR9LFdlLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYXQodGhpcyxlLHQpfSxXZS5wcm90b3R5cGUuc2V0SW49ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy51cGRhdGVJbihlLGIsKGZ1bmN0aW9uKCl7cmV0dXJuIHR9KSl9LFdlLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24oZSl7cmV0dXJuIGF0KHRoaXMsZSxiKX0sV2UucHJvdG90eXBlLmRlbGV0ZUluPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnVwZGF0ZUluKGUsKGZ1bmN0aW9uKCl7cmV0dXJuIGJ9KSl9LFdlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9lKHRoaXMpOnRoaXMudXBkYXRlSW4oW2VdLHQsbil9LFdlLnByb3RvdHlwZS51cGRhdGVJbj1mdW5jdGlvbihlLHQsbil7bnx8KG49dCx0PXZvaWQgMCk7dmFyIHI9dnQodGhpcyx4bihlKSx0LG4pO3JldHVybiByPT09Yj92b2lkIDA6cn0sV2UucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLnNpemU/dGhpczp0aGlzLl9fb3duZXJJRD8odGhpcy5zaXplPTAsdGhpcy5fcm9vdD1udWxsLHRoaXMuX19oYXNoPXZvaWQgMCx0aGlzLl9fYWx0ZXJlZD0hMCx0aGlzKTpvdCgpfSxXZS5wcm90b3R5cGUubWVyZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gZnQodGhpcyx2b2lkIDAsYXJndW1lbnRzKX0sV2UucHJvdG90eXBlLm1lcmdlV2l0aD1mdW5jdGlvbih0KXtyZXR1cm4gZnQodGhpcyx0LGUuY2FsbChhcmd1bWVudHMsMSkpfSxXZS5wcm90b3R5cGUubWVyZ2VJbj1mdW5jdGlvbih0KXt2YXIgbj1lLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiB0aGlzLnVwZGF0ZUluKHQsb3QoKSwoZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUubWVyZ2U/ZS5tZXJnZS5hcHBseShlLG4pOm5bbi5sZW5ndGgtMV19KSl9LFdlLnByb3RvdHlwZS5tZXJnZURlZXA9ZnVuY3Rpb24oKXtyZXR1cm4gZnQodGhpcyxodCxhcmd1bWVudHMpfSxXZS5wcm90b3R5cGUubWVyZ2VEZWVwV2l0aD1mdW5jdGlvbih0KXt2YXIgbj1lLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBmdCh0aGlzLGR0KHQpLG4pfSxXZS5wcm90b3R5cGUubWVyZ2VEZWVwSW49ZnVuY3Rpb24odCl7dmFyIG49ZS5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gdGhpcy51cGRhdGVJbih0LG90KCksKGZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlLm1lcmdlRGVlcD9lLm1lcmdlRGVlcC5hcHBseShlLG4pOm5bbi5sZW5ndGgtMV19KSl9LFdlLnByb3RvdHlwZS5zb3J0PWZ1bmN0aW9uKGUpe3JldHVybiB6dChwbih0aGlzLGUpKX0sV2UucHJvdG90eXBlLnNvcnRCeT1mdW5jdGlvbihlLHQpe3JldHVybiB6dChwbih0aGlzLHQsZSkpfSxXZS5wcm90b3R5cGUud2l0aE11dGF0aW9ucz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmFzTXV0YWJsZSgpO3JldHVybiBlKHQpLHQud2FzQWx0ZXJlZCgpP3QuX19lbnN1cmVPd25lcih0aGlzLl9fb3duZXJJRCk6dGhpc30sV2UucHJvdG90eXBlLmFzTXV0YWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fb3duZXJJRD90aGlzOnRoaXMuX19lbnN1cmVPd25lcihuZXcgUyl9LFdlLnByb3RvdHlwZS5hc0ltbXV0YWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fZW5zdXJlT3duZXIoKX0sV2UucHJvdG90eXBlLndhc0FsdGVyZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2FsdGVyZWR9LFdlLnByb3RvdHlwZS5fX2l0ZXJhdG9yPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBldCh0aGlzLGUsdCl9LFdlLnByb3RvdHlwZS5fX2l0ZXJhdGU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLHI9MDtyZXR1cm4gdGhpcy5fcm9vdCYmdGhpcy5fcm9vdC5pdGVyYXRlKChmdW5jdGlvbih0KXtyZXR1cm4gcisrLGUodFsxXSx0WzBdLG4pfSksdCkscn0sV2UucHJvdG90eXBlLl9fZW5zdXJlT3duZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10aGlzLl9fb3duZXJJRD90aGlzOmU/cnQodGhpcy5zaXplLHRoaXMuX3Jvb3QsZSx0aGlzLl9faGFzaCk6KHRoaXMuX19vd25lcklEPWUsdGhpcy5fX2FsdGVyZWQ9ITEsdGhpcyl9LFdlLmlzTWFwPUhlO3ZhciAkZSxKZT0iQEBfX0lNTVVUQUJMRV9NQVBfX0BAIixLZT1XZS5wcm90b3R5cGU7ZnVuY3Rpb24gWWUoZSx0KXt0aGlzLm93bmVySUQ9ZSx0aGlzLmVudHJpZXM9dH1mdW5jdGlvbiBHZShlLHQsbil7dGhpcy5vd25lcklEPWUsdGhpcy5iaXRtYXA9dCx0aGlzLm5vZGVzPW59ZnVuY3Rpb24gWmUoZSx0LG4pe3RoaXMub3duZXJJRD1lLHRoaXMuY291bnQ9dCx0aGlzLm5vZGVzPW59ZnVuY3Rpb24gWGUoZSx0LG4pe3RoaXMub3duZXJJRD1lLHRoaXMua2V5SGFzaD10LHRoaXMuZW50cmllcz1ufWZ1bmN0aW9uIFFlKGUsdCxuKXt0aGlzLm93bmVySUQ9ZSx0aGlzLmtleUhhc2g9dCx0aGlzLmVudHJ5PW59ZnVuY3Rpb24gZXQoZSx0LG4pe3RoaXMuX3R5cGU9dCx0aGlzLl9yZXZlcnNlPW4sdGhpcy5fc3RhY2s9ZS5fcm9vdCYmbnQoZS5fcm9vdCl9ZnVuY3Rpb24gdHQoZSx0KXtyZXR1cm4gVShlLHRbMF0sdFsxXSl9ZnVuY3Rpb24gbnQoZSx0KXtyZXR1cm57bm9kZTplLGluZGV4OjAsX19wcmV2OnR9fWZ1bmN0aW9uIHJ0KGUsdCxuLHIpe3ZhciBvPU9iamVjdC5jcmVhdGUoS2UpO3JldHVybiBvLnNpemU9ZSxvLl9yb290PXQsby5fX293bmVySUQ9bixvLl9faGFzaD1yLG8uX19hbHRlcmVkPSExLG99ZnVuY3Rpb24gb3QoKXtyZXR1cm4gJGV8fCgkZT1ydCgwKSl9ZnVuY3Rpb24gYXQoZSx0LG4pe3ZhciByLG87aWYoZS5fcm9vdCl7dmFyIGE9eChfKSxpPXgodyk7aWYocj1pdChlLl9yb290LGUuX19vd25lcklELDAsdm9pZCAwLHQsbixhLGkpLCFpLnZhbHVlKXJldHVybiBlO289ZS5zaXplKyhhLnZhbHVlP249PT1iPy0xOjE6MCl9ZWxzZXtpZihuPT09YilyZXR1cm4gZTtvPTEscj1uZXcgWWUoZS5fX293bmVySUQsW1t0LG5dXSl9cmV0dXJuIGUuX19vd25lcklEPyhlLnNpemU9byxlLl9yb290PXIsZS5fX2hhc2g9dm9pZCAwLGUuX19hbHRlcmVkPSEwLGUpOnI/cnQobyxyKTpvdCgpfWZ1bmN0aW9uIGl0KGUsdCxuLHIsbyxhLGkscyl7cmV0dXJuIGU/ZS51cGRhdGUodCxuLHIsbyxhLGkscyk6YT09PWI/ZTooRShzKSxFKGkpLG5ldyBRZSh0LHIsW28sYV0pKX1mdW5jdGlvbiBzdChlKXtyZXR1cm4gZS5jb25zdHJ1Y3Rvcj09PVFlfHxlLmNvbnN0cnVjdG9yPT09WGV9ZnVuY3Rpb24gdXQoZSx0LG4scixvKXtpZihlLmtleUhhc2g9PT1yKXJldHVybiBuZXcgWGUodCxyLFtlLmVudHJ5LG9dKTt2YXIgYSxpPSgwPT09bj9lLmtleUhhc2g6ZS5rZXlIYXNoPj4+bikmeSxzPSgwPT09bj9yOnI+Pj5uKSZ5O3JldHVybiBuZXcgR2UodCwxPDxpfDE8PHMsaT09PXM/W3V0KGUsdCxuK3YscixvKV06KGE9bmV3IFFlKHQscixvKSxpPHM/W2UsYV06W2EsZV0pKX1mdW5jdGlvbiBjdChlLHQsbixyKXtlfHwoZT1uZXcgUyk7Zm9yKHZhciBvPW5ldyBRZShlLGtlKG4pLFtuLHJdKSxhPTA7YTx0Lmxlbmd0aDthKyspe3ZhciBpPXRbYV07bz1vLnVwZGF0ZShlLDAsdm9pZCAwLGlbMF0saVsxXSl9cmV0dXJuIG99ZnVuY3Rpb24gbHQoZSx0LG4scil7Zm9yKHZhciBvPTAsYT0wLGk9bmV3IEFycmF5KG4pLHM9MCx1PTEsYz10Lmxlbmd0aDtzPGM7cysrLHU8PD0xKXt2YXIgbD10W3NdO3ZvaWQgMCE9PWwmJnMhPT1yJiYob3w9dSxpW2ErK109bCl9cmV0dXJuIG5ldyBHZShlLG8saSl9ZnVuY3Rpb24gcHQoZSx0LG4scixvKXtmb3IodmFyIGE9MCxpPW5ldyBBcnJheShnKSxzPTA7MCE9PW47cysrLG4+Pj49MSlpW3NdPTEmbj90W2ErK106dm9pZCAwO3JldHVybiBpW3JdPW8sbmV3IFplKGUsYSsxLGkpfWZ1bmN0aW9uIGZ0KGUsdCxuKXtmb3IodmFyIG89W10sYT0wO2E8bi5sZW5ndGg7YSsrKXt2YXIgcz1uW2FdLHU9cihzKTtpKHMpfHwodT11Lm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGhlKGUpfSkpKSxvLnB1c2godSl9cmV0dXJuIG10KGUsdCxvKX1mdW5jdGlvbiBodChlLHQsbil7cmV0dXJuIGUmJmUubWVyZ2VEZWVwJiZpKHQpP2UubWVyZ2VEZWVwKHQpOmdlKGUsdCk/ZTp0fWZ1bmN0aW9uIGR0KGUpe3JldHVybiBmdW5jdGlvbih0LG4scil7aWYodCYmdC5tZXJnZURlZXBXaXRoJiZpKG4pKXJldHVybiB0Lm1lcmdlRGVlcFdpdGgoZSxuKTt2YXIgbz1lKHQsbixyKTtyZXR1cm4gZ2UodCxvKT90Om99fWZ1bmN0aW9uIG10KGUsdCxuKXtyZXR1cm4gMD09PShuPW4uZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gMCE9PWUuc2l6ZX0pKSkubGVuZ3RoP2U6MCE9PWUuc2l6ZXx8ZS5fX293bmVySUR8fDEhPT1uLmxlbmd0aD9lLndpdGhNdXRhdGlvbnMoKGZ1bmN0aW9uKGUpe2Zvcih2YXIgcj10P2Z1bmN0aW9uKG4scil7ZS51cGRhdGUocixiLChmdW5jdGlvbihlKXtyZXR1cm4gZT09PWI/bjp0KGUsbixyKX0pKX06ZnVuY3Rpb24odCxuKXtlLnNldChuLHQpfSxvPTA7bzxuLmxlbmd0aDtvKyspbltvXS5mb3JFYWNoKHIpfSkpOmUuY29uc3RydWN0b3IoblswXSl9ZnVuY3Rpb24gdnQoZSx0LG4scil7dmFyIG89ZT09PWIsYT10Lm5leHQoKTtpZihhLmRvbmUpe3ZhciBpPW8/bjplLHM9cihpKTtyZXR1cm4gcz09PWk/ZTpzfV9lKG98fGUmJmUuc2V0LCJpbnZhbGlkIGtleVBhdGgiKTt2YXIgdT1hLnZhbHVlLGM9bz9iOmUuZ2V0KHUsYiksbD12dChjLHQsbixyKTtyZXR1cm4gbD09PWM/ZTpsPT09Yj9lLnJlbW92ZSh1KToobz9vdCgpOmUpLnNldCh1LGwpfWZ1bmN0aW9uIGd0KGUpe3JldHVybiBlPShlPSg4NTg5OTM0NTkmKGUtPWU+PjEmMTQzMTY1NTc2NSkpKyhlPj4yJjg1ODk5MzQ1OSkpKyhlPj40KSYyNTI2NDUxMzUsZSs9ZT4+OCwxMjcmKGUrPWU+PjE2KX1mdW5jdGlvbiB5dChlLHQsbixyKXt2YXIgbz1yP2U6QyhlKTtyZXR1cm4gb1t0XT1uLG99ZnVuY3Rpb24gYnQoZSx0LG4scil7dmFyIG89ZS5sZW5ndGgrMTtpZihyJiZ0KzE9PT1vKXJldHVybiBlW3RdPW4sZTtmb3IodmFyIGE9bmV3IEFycmF5KG8pLGk9MCxzPTA7czxvO3MrKylzPT09dD8oYVtzXT1uLGk9LTEpOmFbc109ZVtzK2ldO3JldHVybiBhfWZ1bmN0aW9uIF90KGUsdCxuKXt2YXIgcj1lLmxlbmd0aC0xO2lmKG4mJnQ9PT1yKXJldHVybiBlLnBvcCgpLGU7Zm9yKHZhciBvPW5ldyBBcnJheShyKSxhPTAsaT0wO2k8cjtpKyspaT09PXQmJihhPTEpLG9baV09ZVtpK2FdO3JldHVybiBvfUtlW0plXT0hMCxLZVttXT1LZS5yZW1vdmUsS2UucmVtb3ZlSW49S2UuZGVsZXRlSW4sWWUucHJvdG90eXBlLmdldD1mdW5jdGlvbihlLHQsbixyKXtmb3IodmFyIG89dGhpcy5lbnRyaWVzLGE9MCxpPW8ubGVuZ3RoO2E8aTthKyspaWYoZ2UobixvW2FdWzBdKSlyZXR1cm4gb1thXVsxXTtyZXR1cm4gcn0sWWUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlLHQsbixyLG8sYSxpKXtmb3IodmFyIHM9bz09PWIsdT10aGlzLmVudHJpZXMsYz0wLGw9dS5sZW5ndGg7YzxsJiYhZ2Uocix1W2NdWzBdKTtjKyspO3ZhciBwPWM8bDtpZihwP3VbY11bMV09PT1vOnMpcmV0dXJuIHRoaXM7aWYoRShpKSwoc3x8IXApJiZFKGEpLCFzfHwxIT09dS5sZW5ndGgpe2lmKCFwJiYhcyYmdS5sZW5ndGg+PXd0KXJldHVybiBjdChlLHUscixvKTt2YXIgZj1lJiZlPT09dGhpcy5vd25lcklELGg9Zj91OkModSk7cmV0dXJuIHA/cz9jPT09bC0xP2gucG9wKCk6aFtjXT1oLnBvcCgpOmhbY109W3Isb106aC5wdXNoKFtyLG9dKSxmPyh0aGlzLmVudHJpZXM9aCx0aGlzKTpuZXcgWWUoZSxoKX19LEdlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oZSx0LG4scil7dm9pZCAwPT09dCYmKHQ9a2UobikpO3ZhciBvPTE8PCgoMD09PWU/dDp0Pj4+ZSkmeSksYT10aGlzLmJpdG1hcDtyZXR1cm4gMD09KGEmbyk/cjp0aGlzLm5vZGVzW2d0KGEmby0xKV0uZ2V0KGUrdix0LG4scil9LEdlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSx0LG4scixvLGEsaSl7dm9pZCAwPT09biYmKG49a2UocikpO3ZhciBzPSgwPT09dD9uOm4+Pj50KSZ5LHU9MTw8cyxjPXRoaXMuYml0bWFwLGw9MCE9KGMmdSk7aWYoIWwmJm89PT1iKXJldHVybiB0aGlzO3ZhciBwPWd0KGMmdS0xKSxmPXRoaXMubm9kZXMsaD1sP2ZbcF06dm9pZCAwLGQ9aXQoaCxlLHQrdixuLHIsbyxhLGkpO2lmKGQ9PT1oKXJldHVybiB0aGlzO2lmKCFsJiZkJiZmLmxlbmd0aD49eHQpcmV0dXJuIHB0KGUsZixjLHMsZCk7aWYobCYmIWQmJjI9PT1mLmxlbmd0aCYmc3QoZlsxXnBdKSlyZXR1cm4gZlsxXnBdO2lmKGwmJmQmJjE9PT1mLmxlbmd0aCYmc3QoZCkpcmV0dXJuIGQ7dmFyIG09ZSYmZT09PXRoaXMub3duZXJJRCxnPWw/ZD9jOmNedTpjfHUsXz1sP2Q/eXQoZixwLGQsbSk6X3QoZixwLG0pOmJ0KGYscCxkLG0pO3JldHVybiBtPyh0aGlzLmJpdG1hcD1nLHRoaXMubm9kZXM9Xyx0aGlzKTpuZXcgR2UoZSxnLF8pfSxaZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGUsdCxuLHIpe3ZvaWQgMD09PXQmJih0PWtlKG4pKTt2YXIgbz0oMD09PWU/dDp0Pj4+ZSkmeSxhPXRoaXMubm9kZXNbb107cmV0dXJuIGE/YS5nZXQoZSt2LHQsbixyKTpyfSxaZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUsdCxuLHIsbyxhLGkpe3ZvaWQgMD09PW4mJihuPWtlKHIpKTt2YXIgcz0oMD09PXQ/bjpuPj4+dCkmeSx1PW89PT1iLGM9dGhpcy5ub2RlcyxsPWNbc107aWYodSYmIWwpcmV0dXJuIHRoaXM7dmFyIHA9aXQobCxlLHQrdixuLHIsbyxhLGkpO2lmKHA9PT1sKXJldHVybiB0aGlzO3ZhciBmPXRoaXMuY291bnQ7aWYobCl7aWYoIXAmJi0tZjxFdClyZXR1cm4gbHQoZSxjLGYscyl9ZWxzZSBmKys7dmFyIGg9ZSYmZT09PXRoaXMub3duZXJJRCxkPXl0KGMscyxwLGgpO3JldHVybiBoPyh0aGlzLmNvdW50PWYsdGhpcy5ub2Rlcz1kLHRoaXMpOm5ldyBaZShlLGYsZCl9LFhlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oZSx0LG4scil7Zm9yKHZhciBvPXRoaXMuZW50cmllcyxhPTAsaT1vLmxlbmd0aDthPGk7YSsrKWlmKGdlKG4sb1thXVswXSkpcmV0dXJuIG9bYV1bMV07cmV0dXJuIHJ9LFhlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSx0LG4scixvLGEsaSl7dm9pZCAwPT09biYmKG49a2UocikpO3ZhciBzPW89PT1iO2lmKG4hPT10aGlzLmtleUhhc2gpcmV0dXJuIHM/dGhpczooRShpKSxFKGEpLHV0KHRoaXMsZSx0LG4sW3Isb10pKTtmb3IodmFyIHU9dGhpcy5lbnRyaWVzLGM9MCxsPXUubGVuZ3RoO2M8bCYmIWdlKHIsdVtjXVswXSk7YysrKTt2YXIgcD1jPGw7aWYocD91W2NdWzFdPT09bzpzKXJldHVybiB0aGlzO2lmKEUoaSksKHN8fCFwKSYmRShhKSxzJiYyPT09bClyZXR1cm4gbmV3IFFlKGUsdGhpcy5rZXlIYXNoLHVbMV5jXSk7dmFyIGY9ZSYmZT09PXRoaXMub3duZXJJRCxoPWY/dTpDKHUpO3JldHVybiBwP3M/Yz09PWwtMT9oLnBvcCgpOmhbY109aC5wb3AoKTpoW2NdPVtyLG9dOmgucHVzaChbcixvXSksZj8odGhpcy5lbnRyaWVzPWgsdGhpcyk6bmV3IFhlKGUsdGhpcy5rZXlIYXNoLGgpfSxRZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBnZShuLHRoaXMuZW50cnlbMF0pP3RoaXMuZW50cnlbMV06cn0sUWUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlLHQsbixyLG8sYSxpKXt2YXIgcz1vPT09Yix1PWdlKHIsdGhpcy5lbnRyeVswXSk7cmV0dXJuKHU/bz09PXRoaXMuZW50cnlbMV06cyk/dGhpczooRShpKSxzP3ZvaWQgRShhKTp1P2UmJmU9PT10aGlzLm93bmVySUQ/KHRoaXMuZW50cnlbMV09byx0aGlzKTpuZXcgUWUoZSx0aGlzLmtleUhhc2gsW3Isb10pOihFKGEpLHV0KHRoaXMsZSx0LGtlKHIpLFtyLG9dKSkpfSxZZS5wcm90b3R5cGUuaXRlcmF0ZT1YZS5wcm90b3R5cGUuaXRlcmF0ZT1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj10aGlzLmVudHJpZXMscj0wLG89bi5sZW5ndGgtMTtyPD1vO3IrKylpZighMT09PWUoblt0P28tcjpyXSkpcmV0dXJuITF9LEdlLnByb3RvdHlwZS5pdGVyYXRlPVplLnByb3RvdHlwZS5pdGVyYXRlPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXRoaXMubm9kZXMscj0wLG89bi5sZW5ndGgtMTtyPD1vO3IrKyl7dmFyIGE9blt0P28tcjpyXTtpZihhJiYhMT09PWEuaXRlcmF0ZShlLHQpKXJldHVybiExfX0sUWUucHJvdG90eXBlLml0ZXJhdGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSh0aGlzLmVudHJ5KX0sdChldCxGKSxldC5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLl90eXBlLHQ9dGhpcy5fc3RhY2s7dDspe3ZhciBuLHI9dC5ub2RlLG89dC5pbmRleCsrO2lmKHIuZW50cnkpe2lmKDA9PT1vKXJldHVybiB0dChlLHIuZW50cnkpfWVsc2UgaWYoci5lbnRyaWVzKXtpZihvPD0obj1yLmVudHJpZXMubGVuZ3RoLTEpKXJldHVybiB0dChlLHIuZW50cmllc1t0aGlzLl9yZXZlcnNlP24tbzpvXSl9ZWxzZSBpZihvPD0obj1yLm5vZGVzLmxlbmd0aC0xKSl7dmFyIGE9ci5ub2Rlc1t0aGlzLl9yZXZlcnNlP24tbzpvXTtpZihhKXtpZihhLmVudHJ5KXJldHVybiB0dChlLGEuZW50cnkpO3Q9dGhpcy5fc3RhY2s9bnQoYSx0KX1jb250aW51ZX10PXRoaXMuX3N0YWNrPXRoaXMuX3N0YWNrLl9fcHJldn1yZXR1cm4gcSgpfTt2YXIgd3Q9Zy80LHh0PWcvMixFdD1nLzQ7ZnVuY3Rpb24gU3QoZSl7dmFyIHQ9TXQoKTtpZihudWxsPT1lKXJldHVybiB0O2lmKEN0KGUpKXJldHVybiBlO3ZhciBuPW8oZSkscj1uLnNpemU7cmV0dXJuIDA9PT1yP3Q6KFZlKHIpLHI+MCYmcjxnP050KDAscix2LG51bGwsbmV3IGt0KG4udG9BcnJheSgpKSk6dC53aXRoTXV0YXRpb25zKChmdW5jdGlvbihlKXtlLnNldFNpemUociksbi5mb3JFYWNoKChmdW5jdGlvbih0LG4pe3JldHVybiBlLnNldChuLHQpfSkpfSkpKX1mdW5jdGlvbiBDdChlKXtyZXR1cm4hKCFlfHwhZVtBdF0pfXQoU3QsU2UpLFN0Lm9mPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMoYXJndW1lbnRzKX0sU3QucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX190b1N0cmluZygiTGlzdCBbIiwiXSIpfSxTdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGUsdCl7aWYoKGU9Tyh0aGlzLGUpKT49MCYmZTx0aGlzLnNpemUpe3ZhciBuPUJ0KHRoaXMsZSs9dGhpcy5fb3JpZ2luKTtyZXR1cm4gbiYmbi5hcnJheVtlJnldfXJldHVybiB0fSxTdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIFJ0KHRoaXMsZSx0KX0sU3QucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5oYXMoZSk/MD09PWU/dGhpcy5zaGlmdCgpOmU9PT10aGlzLnNpemUtMT90aGlzLnBvcCgpOnRoaXMuc3BsaWNlKGUsMSk6dGhpc30sU3QucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnNwbGljZShlLDAsdCl9LFN0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5zaXplP3RoaXM6dGhpcy5fX293bmVySUQ/KHRoaXMuc2l6ZT10aGlzLl9vcmlnaW49dGhpcy5fY2FwYWNpdHk9MCx0aGlzLl9sZXZlbD12LHRoaXMuX3Jvb3Q9dGhpcy5fdGFpbD1udWxsLHRoaXMuX19oYXNoPXZvaWQgMCx0aGlzLl9fYWx0ZXJlZD0hMCx0aGlzKTpNdCgpfSxTdC5wcm90b3R5cGUucHVzaD1mdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cyx0PXRoaXMuc2l6ZTtyZXR1cm4gdGhpcy53aXRoTXV0YXRpb25zKChmdW5jdGlvbihuKXtGdChuLDAsdCtlLmxlbmd0aCk7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspbi5zZXQodCtyLGVbcl0pfSkpfSxTdC5wcm90b3R5cGUucG9wPWZ1bmN0aW9uKCl7cmV0dXJuIEZ0KHRoaXMsMCwtMSl9LFN0LnByb3RvdHlwZS51bnNoaWZ0PWZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzO3JldHVybiB0aGlzLndpdGhNdXRhdGlvbnMoKGZ1bmN0aW9uKHQpe0Z0KHQsLWUubGVuZ3RoKTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl0LnNldChuLGVbbl0pfSkpfSxTdC5wcm90b3R5cGUuc2hpZnQ9ZnVuY3Rpb24oKXtyZXR1cm4gRnQodGhpcywxKX0sU3QucHJvdG90eXBlLm1lcmdlPWZ1bmN0aW9uKCl7cmV0dXJuIFV0KHRoaXMsdm9pZCAwLGFyZ3VtZW50cyl9LFN0LnByb3RvdHlwZS5tZXJnZVdpdGg9ZnVuY3Rpb24odCl7cmV0dXJuIFV0KHRoaXMsdCxlLmNhbGwoYXJndW1lbnRzLDEpKX0sU3QucHJvdG90eXBlLm1lcmdlRGVlcD1mdW5jdGlvbigpe3JldHVybiBVdCh0aGlzLGh0LGFyZ3VtZW50cyl9LFN0LnByb3RvdHlwZS5tZXJnZURlZXBXaXRoPWZ1bmN0aW9uKHQpe3ZhciBuPWUuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIFV0KHRoaXMsZHQodCksbil9LFN0LnByb3RvdHlwZS5zZXRTaXplPWZ1bmN0aW9uKGUpe3JldHVybiBGdCh0aGlzLDAsZSl9LFN0LnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuc2l6ZTtyZXR1cm4gaihlLHQsbik/dGhpczpGdCh0aGlzLFQoZSxuKSxJKHQsbikpfSxTdC5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbihlLHQpe3ZhciBuPTAscj1QdCh0aGlzLHQpO3JldHVybiBuZXcgRigoZnVuY3Rpb24oKXt2YXIgdD1yKCk7cmV0dXJuIHQ9PT1JdD9xKCk6VShlLG4rKyx0KX0pKX0sU3QucHJvdG90eXBlLl9faXRlcmF0ZT1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbixyPTAsbz1QdCh0aGlzLHQpOyhuPW8oKSkhPT1JdCYmITEhPT1lKG4scisrLHRoaXMpOyk7cmV0dXJuIHJ9LFN0LnByb3RvdHlwZS5fX2Vuc3VyZU93bmVyPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dGhpcy5fX293bmVySUQ/dGhpczplP050KHRoaXMuX29yaWdpbix0aGlzLl9jYXBhY2l0eSx0aGlzLl9sZXZlbCx0aGlzLl9yb290LHRoaXMuX3RhaWwsZSx0aGlzLl9faGFzaCk6KHRoaXMuX19vd25lcklEPWUsdGhpcyl9LFN0LmlzTGlzdD1DdDt2YXIgQXQ9IkBAX19JTU1VVEFCTEVfTElTVF9fQEAiLE90PVN0LnByb3RvdHlwZTtmdW5jdGlvbiBrdChlLHQpe3RoaXMuYXJyYXk9ZSx0aGlzLm93bmVySUQ9dH1PdFtBdF09ITAsT3RbbV09T3QucmVtb3ZlLE90LnNldEluPUtlLnNldEluLE90LmRlbGV0ZUluPU90LnJlbW92ZUluPUtlLnJlbW92ZUluLE90LnVwZGF0ZT1LZS51cGRhdGUsT3QudXBkYXRlSW49S2UudXBkYXRlSW4sT3QubWVyZ2VJbj1LZS5tZXJnZUluLE90Lm1lcmdlRGVlcEluPUtlLm1lcmdlRGVlcEluLE90LndpdGhNdXRhdGlvbnM9S2Uud2l0aE11dGF0aW9ucyxPdC5hc011dGFibGU9S2UuYXNNdXRhYmxlLE90LmFzSW1tdXRhYmxlPUtlLmFzSW1tdXRhYmxlLE90Lndhc0FsdGVyZWQ9S2Uud2FzQWx0ZXJlZCxrdC5wcm90b3R5cGUucmVtb3ZlQmVmb3JlPWZ1bmN0aW9uKGUsdCxuKXtpZihuPT09dD8xPDx0OjA9PT10aGlzLmFycmF5Lmxlbmd0aClyZXR1cm4gdGhpczt2YXIgcj1uPj4+dCZ5O2lmKHI+PXRoaXMuYXJyYXkubGVuZ3RoKXJldHVybiBuZXcga3QoW10sZSk7dmFyIG8sYT0wPT09cjtpZih0PjApe3ZhciBpPXRoaXMuYXJyYXlbcl07aWYoKG89aSYmaS5yZW1vdmVCZWZvcmUoZSx0LXYsbikpPT09aSYmYSlyZXR1cm4gdGhpc31pZihhJiYhbylyZXR1cm4gdGhpczt2YXIgcz1MdCh0aGlzLGUpO2lmKCFhKWZvcih2YXIgdT0wO3U8cjt1Kyspcy5hcnJheVt1XT12b2lkIDA7cmV0dXJuIG8mJihzLmFycmF5W3JdPW8pLHN9LGt0LnByb3RvdHlwZS5yZW1vdmVBZnRlcj1mdW5jdGlvbihlLHQsbil7aWYobj09PSh0PzE8PHQ6MCl8fDA9PT10aGlzLmFycmF5Lmxlbmd0aClyZXR1cm4gdGhpczt2YXIgcixvPW4tMT4+PnQmeTtpZihvPj10aGlzLmFycmF5Lmxlbmd0aClyZXR1cm4gdGhpcztpZih0PjApe3ZhciBhPXRoaXMuYXJyYXlbb107aWYoKHI9YSYmYS5yZW1vdmVBZnRlcihlLHQtdixuKSk9PT1hJiZvPT09dGhpcy5hcnJheS5sZW5ndGgtMSlyZXR1cm4gdGhpc312YXIgaT1MdCh0aGlzLGUpO3JldHVybiBpLmFycmF5LnNwbGljZShvKzEpLHImJihpLmFycmF5W29dPXIpLGl9O3ZhciBqdCxUdCxJdD17fTtmdW5jdGlvbiBQdChlLHQpe3ZhciBuPWUuX29yaWdpbixyPWUuX2NhcGFjaXR5LG89cXQociksYT1lLl90YWlsO3JldHVybiBpKGUuX3Jvb3QsZS5fbGV2ZWwsMCk7ZnVuY3Rpb24gaShlLHQsbil7cmV0dXJuIDA9PT10P3MoZSxuKTp1KGUsdCxuKX1mdW5jdGlvbiBzKGUsaSl7dmFyIHM9aT09PW8/YSYmYS5hcnJheTplJiZlLmFycmF5LHU9aT5uPzA6bi1pLGM9ci1pO3JldHVybiBjPmcmJihjPWcpLGZ1bmN0aW9uKCl7aWYodT09PWMpcmV0dXJuIEl0O3ZhciBlPXQ/LS1jOnUrKztyZXR1cm4gcyYmc1tlXX19ZnVuY3Rpb24gdShlLG8sYSl7dmFyIHMsdT1lJiZlLmFycmF5LGM9YT5uPzA6bi1hPj5vLGw9MSsoci1hPj5vKTtyZXR1cm4gbD5nJiYobD1nKSxmdW5jdGlvbigpe2Zvcig7Oyl7aWYocyl7dmFyIGU9cygpO2lmKGUhPT1JdClyZXR1cm4gZTtzPW51bGx9aWYoYz09PWwpcmV0dXJuIEl0O3ZhciBuPXQ/LS1sOmMrKztzPWkodSYmdVtuXSxvLXYsYSsobjw8bykpfX19fWZ1bmN0aW9uIE50KGUsdCxuLHIsbyxhLGkpe3ZhciBzPU9iamVjdC5jcmVhdGUoT3QpO3JldHVybiBzLnNpemU9dC1lLHMuX29yaWdpbj1lLHMuX2NhcGFjaXR5PXQscy5fbGV2ZWw9bixzLl9yb290PXIscy5fdGFpbD1vLHMuX19vd25lcklEPWEscy5fX2hhc2g9aSxzLl9fYWx0ZXJlZD0hMSxzfWZ1bmN0aW9uIE10KCl7cmV0dXJuIGp0fHwoanQ9TnQoMCwwLHYpKX1mdW5jdGlvbiBSdChlLHQsbil7aWYoKHQ9TyhlLHQpKSE9dClyZXR1cm4gZTtpZih0Pj1lLnNpemV8fHQ8MClyZXR1cm4gZS53aXRoTXV0YXRpb25zKChmdW5jdGlvbihlKXt0PDA/RnQoZSx0KS5zZXQoMCxuKTpGdChlLDAsdCsxKS5zZXQodCxuKX0pKTt0Kz1lLl9vcmlnaW47dmFyIHI9ZS5fdGFpbCxvPWUuX3Jvb3QsYT14KHcpO3JldHVybiB0Pj1xdChlLl9jYXBhY2l0eSk/cj1EdChyLGUuX19vd25lcklELDAsdCxuLGEpOm89RHQobyxlLl9fb3duZXJJRCxlLl9sZXZlbCx0LG4sYSksYS52YWx1ZT9lLl9fb3duZXJJRD8oZS5fcm9vdD1vLGUuX3RhaWw9cixlLl9faGFzaD12b2lkIDAsZS5fX2FsdGVyZWQ9ITAsZSk6TnQoZS5fb3JpZ2luLGUuX2NhcGFjaXR5LGUuX2xldmVsLG8scik6ZX1mdW5jdGlvbiBEdChlLHQsbixyLG8sYSl7dmFyIGkscz1yPj4+biZ5LHU9ZSYmczxlLmFycmF5Lmxlbmd0aDtpZighdSYmdm9pZCAwPT09bylyZXR1cm4gZTtpZihuPjApe3ZhciBjPWUmJmUuYXJyYXlbc10sbD1EdChjLHQsbi12LHIsbyxhKTtyZXR1cm4gbD09PWM/ZTooKGk9THQoZSx0KSkuYXJyYXlbc109bCxpKX1yZXR1cm4gdSYmZS5hcnJheVtzXT09PW8/ZTooRShhKSxpPUx0KGUsdCksdm9pZCAwPT09byYmcz09PWkuYXJyYXkubGVuZ3RoLTE/aS5hcnJheS5wb3AoKTppLmFycmF5W3NdPW8saSl9ZnVuY3Rpb24gTHQoZSx0KXtyZXR1cm4gdCYmZSYmdD09PWUub3duZXJJRD9lOm5ldyBrdChlP2UuYXJyYXkuc2xpY2UoKTpbXSx0KX1mdW5jdGlvbiBCdChlLHQpe2lmKHQ+PXF0KGUuX2NhcGFjaXR5KSlyZXR1cm4gZS5fdGFpbDtpZih0PDE8PGUuX2xldmVsK3Ype2Zvcih2YXIgbj1lLl9yb290LHI9ZS5fbGV2ZWw7biYmcj4wOyluPW4uYXJyYXlbdD4+PnImeV0sci09djtyZXR1cm4gbn19ZnVuY3Rpb24gRnQoZSx0LG4pe3ZvaWQgMCE9PXQmJih0fD0wKSx2b2lkIDAhPT1uJiYobnw9MCk7dmFyIHI9ZS5fX293bmVySUR8fG5ldyBTLG89ZS5fb3JpZ2luLGE9ZS5fY2FwYWNpdHksaT1vK3Qscz12b2lkIDA9PT1uP2E6bjwwP2ErbjpvK247aWYoaT09PW8mJnM9PT1hKXJldHVybiBlO2lmKGk+PXMpcmV0dXJuIGUuY2xlYXIoKTtmb3IodmFyIHU9ZS5fbGV2ZWwsYz1lLl9yb290LGw9MDtpK2w8MDspYz1uZXcga3QoYyYmYy5hcnJheS5sZW5ndGg/W3ZvaWQgMCxjXTpbXSxyKSxsKz0xPDwodSs9dik7bCYmKGkrPWwsbys9bCxzKz1sLGErPWwpO2Zvcih2YXIgcD1xdChhKSxmPXF0KHMpO2Y+PTE8PHUrdjspYz1uZXcga3QoYyYmYy5hcnJheS5sZW5ndGg/W2NdOltdLHIpLHUrPXY7dmFyIGg9ZS5fdGFpbCxkPWY8cD9CdChlLHMtMSk6Zj5wP25ldyBrdChbXSxyKTpoO2lmKGgmJmY+cCYmaTxhJiZoLmFycmF5Lmxlbmd0aCl7Zm9yKHZhciBtPWM9THQoYyxyKSxnPXU7Zz52O2ctPXYpe3ZhciBiPXA+Pj5nJnk7bT1tLmFycmF5W2JdPUx0KG0uYXJyYXlbYl0scil9bS5hcnJheVtwPj4+diZ5XT1ofWlmKHM8YSYmKGQ9ZCYmZC5yZW1vdmVBZnRlcihyLDAscykpLGk+PWYpaS09ZixzLT1mLHU9dixjPW51bGwsZD1kJiZkLnJlbW92ZUJlZm9yZShyLDAsaSk7ZWxzZSBpZihpPm98fGY8cCl7Zm9yKGw9MDtjOyl7dmFyIF89aT4+PnUmeTtpZihfIT09Zj4+PnUmeSlicmVhaztfJiYobCs9KDE8PHUpKl8pLHUtPXYsYz1jLmFycmF5W19dfWMmJmk+byYmKGM9Yy5yZW1vdmVCZWZvcmUocix1LGktbCkpLGMmJmY8cCYmKGM9Yy5yZW1vdmVBZnRlcihyLHUsZi1sKSksbCYmKGktPWwscy09bCl9cmV0dXJuIGUuX19vd25lcklEPyhlLnNpemU9cy1pLGUuX29yaWdpbj1pLGUuX2NhcGFjaXR5PXMsZS5fbGV2ZWw9dSxlLl9yb290PWMsZS5fdGFpbD1kLGUuX19oYXNoPXZvaWQgMCxlLl9fYWx0ZXJlZD0hMCxlKTpOdChpLHMsdSxjLGQpfWZ1bmN0aW9uIFV0KGUsdCxuKXtmb3IodmFyIHI9W10sYT0wLHM9MDtzPG4ubGVuZ3RoO3MrKyl7dmFyIHU9bltzXSxjPW8odSk7Yy5zaXplPmEmJihhPWMuc2l6ZSksaSh1KXx8KGM9Yy5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBoZShlKX0pKSksci5wdXNoKGMpfXJldHVybiBhPmUuc2l6ZSYmKGU9ZS5zZXRTaXplKGEpKSxtdChlLHQscil9ZnVuY3Rpb24gcXQoZSl7cmV0dXJuIGU8Zz8wOmUtMT4+PnY8PHZ9ZnVuY3Rpb24genQoZSl7cmV0dXJuIG51bGw9PWU/SHQoKTpWdChlKT9lOkh0KCkud2l0aE11dGF0aW9ucygoZnVuY3Rpb24odCl7dmFyIG49cihlKTtWZShuLnNpemUpLG4uZm9yRWFjaCgoZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5zZXQobixlKX0pKX0pKX1mdW5jdGlvbiBWdChlKXtyZXR1cm4gSGUoZSkmJmwoZSl9ZnVuY3Rpb24gV3QoZSx0LG4scil7dmFyIG89T2JqZWN0LmNyZWF0ZSh6dC5wcm90b3R5cGUpO3JldHVybiBvLnNpemU9ZT9lLnNpemU6MCxvLl9tYXA9ZSxvLl9saXN0PXQsby5fX293bmVySUQ9bixvLl9faGFzaD1yLG99ZnVuY3Rpb24gSHQoKXtyZXR1cm4gVHR8fChUdD1XdChvdCgpLE10KCkpKX1mdW5jdGlvbiAkdChlLHQsbil7dmFyIHIsbyxhPWUuX21hcCxpPWUuX2xpc3Qscz1hLmdldCh0KSx1PXZvaWQgMCE9PXM7aWYobj09PWIpe2lmKCF1KXJldHVybiBlO2kuc2l6ZT49ZyYmaS5zaXplPj0yKmEuc2l6ZT8ocj0obz1pLmZpbHRlcigoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwIT09ZSYmcyE9PXR9KSkpLnRvS2V5ZWRTZXEoKS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlWzBdfSkpLmZsaXAoKS50b01hcCgpLGUuX19vd25lcklEJiYoci5fX293bmVySUQ9by5fX293bmVySUQ9ZS5fX293bmVySUQpKToocj1hLnJlbW92ZSh0KSxvPXM9PT1pLnNpemUtMT9pLnBvcCgpOmkuc2V0KHMsdm9pZCAwKSl9ZWxzZSBpZih1KXtpZihuPT09aS5nZXQocylbMV0pcmV0dXJuIGU7cj1hLG89aS5zZXQocyxbdCxuXSl9ZWxzZSByPWEuc2V0KHQsaS5zaXplKSxvPWkuc2V0KGkuc2l6ZSxbdCxuXSk7cmV0dXJuIGUuX19vd25lcklEPyhlLnNpemU9ci5zaXplLGUuX21hcD1yLGUuX2xpc3Q9byxlLl9faGFzaD12b2lkIDAsZSk6V3QocixvKX1mdW5jdGlvbiBKdChlLHQpe3RoaXMuX2l0ZXI9ZSx0aGlzLl91c2VLZXlzPXQsdGhpcy5zaXplPWUuc2l6ZX1mdW5jdGlvbiBLdChlKXt0aGlzLl9pdGVyPWUsdGhpcy5zaXplPWUuc2l6ZX1mdW5jdGlvbiBZdChlKXt0aGlzLl9pdGVyPWUsdGhpcy5zaXplPWUuc2l6ZX1mdW5jdGlvbiBHdChlKXt0aGlzLl9pdGVyPWUsdGhpcy5zaXplPWUuc2l6ZX1mdW5jdGlvbiBadChlKXt2YXIgdD1ibihlKTtyZXR1cm4gdC5faXRlcj1lLHQuc2l6ZT1lLnNpemUsdC5mbGlwPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LHQucmV2ZXJzZT1mdW5jdGlvbigpe3ZhciB0PWUucmV2ZXJzZS5hcHBseSh0aGlzKTtyZXR1cm4gdC5mbGlwPWZ1bmN0aW9uKCl7cmV0dXJuIGUucmV2ZXJzZSgpfSx0fSx0Lmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gZS5pbmNsdWRlcyh0KX0sdC5pbmNsdWRlcz1mdW5jdGlvbih0KXtyZXR1cm4gZS5oYXModCl9LHQuY2FjaGVSZXN1bHQ9X24sdC5fX2l0ZXJhdGVVbmNhY2hlZD1mdW5jdGlvbih0LG4pe3ZhciByPXRoaXM7cmV0dXJuIGUuX19pdGVyYXRlKChmdW5jdGlvbihlLG4pe3JldHVybiExIT09dChuLGUscil9KSxuKX0sdC5fX2l0ZXJhdG9yVW5jYWNoZWQ9ZnVuY3Rpb24odCxuKXtpZih0PT09Uil7dmFyIHI9ZS5fX2l0ZXJhdG9yKHQsbik7cmV0dXJuIG5ldyBGKChmdW5jdGlvbigpe3ZhciBlPXIubmV4dCgpO2lmKCFlLmRvbmUpe3ZhciB0PWUudmFsdWVbMF07ZS52YWx1ZVswXT1lLnZhbHVlWzFdLGUudmFsdWVbMV09dH1yZXR1cm4gZX0pKX1yZXR1cm4gZS5fX2l0ZXJhdG9yKHQ9PT1NP046TSxuKX0sdH1mdW5jdGlvbiBYdChlLHQsbil7dmFyIHI9Ym4oZSk7cmV0dXJuIHIuc2l6ZT1lLnNpemUsci5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIGUuaGFzKHQpfSxyLmdldD1mdW5jdGlvbihyLG8pe3ZhciBhPWUuZ2V0KHIsYik7cmV0dXJuIGE9PT1iP286dC5jYWxsKG4sYSxyLGUpfSxyLl9faXRlcmF0ZVVuY2FjaGVkPWZ1bmN0aW9uKHIsbyl7dmFyIGE9dGhpcztyZXR1cm4gZS5fX2l0ZXJhdGUoKGZ1bmN0aW9uKGUsbyxpKXtyZXR1cm4hMSE9PXIodC5jYWxsKG4sZSxvLGkpLG8sYSl9KSxvKX0sci5fX2l0ZXJhdG9yVW5jYWNoZWQ9ZnVuY3Rpb24ocixvKXt2YXIgYT1lLl9faXRlcmF0b3IoUixvKTtyZXR1cm4gbmV3IEYoKGZ1bmN0aW9uKCl7dmFyIG89YS5uZXh0KCk7aWYoby5kb25lKXJldHVybiBvO3ZhciBpPW8udmFsdWUscz1pWzBdO3JldHVybiBVKHIscyx0LmNhbGwobixpWzFdLHMsZSksbyl9KSl9LHJ9ZnVuY3Rpb24gUXQoZSx0KXt2YXIgbj1ibihlKTtyZXR1cm4gbi5faXRlcj1lLG4uc2l6ZT1lLnNpemUsbi5yZXZlcnNlPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LGUuZmxpcCYmKG4uZmxpcD1mdW5jdGlvbigpe3ZhciB0PVp0KGUpO3JldHVybiB0LnJldmVyc2U9ZnVuY3Rpb24oKXtyZXR1cm4gZS5mbGlwKCl9LHR9KSxuLmdldD1mdW5jdGlvbihuLHIpe3JldHVybiBlLmdldCh0P246LTEtbixyKX0sbi5oYXM9ZnVuY3Rpb24obil7cmV0dXJuIGUuaGFzKHQ/bjotMS1uKX0sbi5pbmNsdWRlcz1mdW5jdGlvbih0KXtyZXR1cm4gZS5pbmNsdWRlcyh0KX0sbi5jYWNoZVJlc3VsdD1fbixuLl9faXRlcmF0ZT1mdW5jdGlvbih0LG4pe3ZhciByPXRoaXM7cmV0dXJuIGUuX19pdGVyYXRlKChmdW5jdGlvbihlLG4pe3JldHVybiB0KGUsbixyKX0pLCFuKX0sbi5fX2l0ZXJhdG9yPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuX19pdGVyYXRvcih0LCFuKX0sbn1mdW5jdGlvbiBlbihlLHQsbixyKXt2YXIgbz1ibihlKTtyZXR1cm4gciYmKG8uaGFzPWZ1bmN0aW9uKHIpe3ZhciBvPWUuZ2V0KHIsYik7cmV0dXJuIG8hPT1iJiYhIXQuY2FsbChuLG8scixlKX0sby5nZXQ9ZnVuY3Rpb24ocixvKXt2YXIgYT1lLmdldChyLGIpO3JldHVybiBhIT09YiYmdC5jYWxsKG4sYSxyLGUpP2E6b30pLG8uX19pdGVyYXRlVW5jYWNoZWQ9ZnVuY3Rpb24obyxhKXt2YXIgaT10aGlzLHM9MDtyZXR1cm4gZS5fX2l0ZXJhdGUoKGZ1bmN0aW9uKGUsYSx1KXtpZih0LmNhbGwobixlLGEsdSkpcmV0dXJuIHMrKyxvKGUscj9hOnMtMSxpKX0pLGEpLHN9LG8uX19pdGVyYXRvclVuY2FjaGVkPWZ1bmN0aW9uKG8sYSl7dmFyIGk9ZS5fX2l0ZXJhdG9yKFIsYSkscz0wO3JldHVybiBuZXcgRigoZnVuY3Rpb24oKXtmb3IoOzspe3ZhciBhPWkubmV4dCgpO2lmKGEuZG9uZSlyZXR1cm4gYTt2YXIgdT1hLnZhbHVlLGM9dVswXSxsPXVbMV07aWYodC5jYWxsKG4sbCxjLGUpKXJldHVybiBVKG8scj9jOnMrKyxsLGEpfX0pKX0sb31mdW5jdGlvbiB0bihlLHQsbil7dmFyIHI9V2UoKS5hc011dGFibGUoKTtyZXR1cm4gZS5fX2l0ZXJhdGUoKGZ1bmN0aW9uKG8sYSl7ci51cGRhdGUodC5jYWxsKG4sbyxhLGUpLDAsKGZ1bmN0aW9uKGUpe3JldHVybiBlKzF9KSl9KSksci5hc0ltbXV0YWJsZSgpfWZ1bmN0aW9uIG5uKGUsdCxuKXt2YXIgcj1zKGUpLG89KGwoZSk/enQoKTpXZSgpKS5hc011dGFibGUoKTtlLl9faXRlcmF0ZSgoZnVuY3Rpb24oYSxpKXtvLnVwZGF0ZSh0LmNhbGwobixhLGksZSksKGZ1bmN0aW9uKGUpe3JldHVybihlPWV8fFtdKS5wdXNoKHI/W2ksYV06YSksZX0pKX0pKTt2YXIgYT15bihlKTtyZXR1cm4gby5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBtbihlLGEodCkpfSkpfWZ1bmN0aW9uIHJuKGUsdCxuLHIpe3ZhciBvPWUuc2l6ZTtpZih2b2lkIDAhPT10JiYodHw9MCksdm9pZCAwIT09biYmKG49PT0xLzA/bj1vOm58PTApLGoodCxuLG8pKXJldHVybiBlO3ZhciBhPVQodCxvKSxpPUkobixvKTtpZihhIT1hfHxpIT1pKXJldHVybiBybihlLnRvU2VxKCkuY2FjaGVSZXN1bHQoKSx0LG4scik7dmFyIHMsdT1pLWE7dT09dSYmKHM9dTwwPzA6dSk7dmFyIGM9Ym4oZSk7cmV0dXJuIGMuc2l6ZT0wPT09cz9zOmUuc2l6ZSYmc3x8dm9pZCAwLCFyJiZhZShlKSYmcz49MCYmKGMuZ2V0PWZ1bmN0aW9uKHQsbil7cmV0dXJuKHQ9Tyh0aGlzLHQpKT49MCYmdDxzP2UuZ2V0KHQrYSxuKTpufSksYy5fX2l0ZXJhdGVVbmNhY2hlZD1mdW5jdGlvbih0LG4pe3ZhciBvPXRoaXM7aWYoMD09PXMpcmV0dXJuIDA7aWYobilyZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0ZSh0LG4pO3ZhciBpPTAsdT0hMCxjPTA7cmV0dXJuIGUuX19pdGVyYXRlKChmdW5jdGlvbihlLG4pe2lmKCF1fHwhKHU9aSsrPGEpKXJldHVybiBjKyssITEhPT10KGUscj9uOmMtMSxvKSYmYyE9PXN9KSksY30sYy5fX2l0ZXJhdG9yVW5jYWNoZWQ9ZnVuY3Rpb24odCxuKXtpZigwIT09cyYmbilyZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0b3IodCxuKTt2YXIgbz0wIT09cyYmZS5fX2l0ZXJhdG9yKHQsbiksaT0wLHU9MDtyZXR1cm4gbmV3IEYoKGZ1bmN0aW9uKCl7Zm9yKDtpKys8YTspby5uZXh0KCk7aWYoKyt1PnMpcmV0dXJuIHEoKTt2YXIgZT1vLm5leHQoKTtyZXR1cm4gcnx8dD09PU0/ZTpVKHQsdS0xLHQ9PT1OP3ZvaWQgMDplLnZhbHVlWzFdLGUpfSkpfSxjfWZ1bmN0aW9uIG9uKGUsdCxuKXt2YXIgcj1ibihlKTtyZXR1cm4gci5fX2l0ZXJhdGVVbmNhY2hlZD1mdW5jdGlvbihyLG8pe3ZhciBhPXRoaXM7aWYobylyZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0ZShyLG8pO3ZhciBpPTA7cmV0dXJuIGUuX19pdGVyYXRlKChmdW5jdGlvbihlLG8scyl7cmV0dXJuIHQuY2FsbChuLGUsbyxzKSYmKytpJiZyKGUsbyxhKX0pKSxpfSxyLl9faXRlcmF0b3JVbmNhY2hlZD1mdW5jdGlvbihyLG8pe3ZhciBhPXRoaXM7aWYobylyZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0b3IocixvKTt2YXIgaT1lLl9faXRlcmF0b3IoUixvKSxzPSEwO3JldHVybiBuZXcgRigoZnVuY3Rpb24oKXtpZighcylyZXR1cm4gcSgpO3ZhciBlPWkubmV4dCgpO2lmKGUuZG9uZSlyZXR1cm4gZTt2YXIgbz1lLnZhbHVlLHU9b1swXSxjPW9bMV07cmV0dXJuIHQuY2FsbChuLGMsdSxhKT9yPT09Uj9lOlUocix1LGMsZSk6KHM9ITEscSgpKX0pKX0scn1mdW5jdGlvbiBhbihlLHQsbixyKXt2YXIgbz1ibihlKTtyZXR1cm4gby5fX2l0ZXJhdGVVbmNhY2hlZD1mdW5jdGlvbihvLGEpe3ZhciBpPXRoaXM7aWYoYSlyZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0ZShvLGEpO3ZhciBzPSEwLHU9MDtyZXR1cm4gZS5fX2l0ZXJhdGUoKGZ1bmN0aW9uKGUsYSxjKXtpZighc3x8IShzPXQuY2FsbChuLGUsYSxjKSkpcmV0dXJuIHUrKyxvKGUscj9hOnUtMSxpKX0pKSx1fSxvLl9faXRlcmF0b3JVbmNhY2hlZD1mdW5jdGlvbihvLGEpe3ZhciBpPXRoaXM7aWYoYSlyZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0b3IobyxhKTt2YXIgcz1lLl9faXRlcmF0b3IoUixhKSx1PSEwLGM9MDtyZXR1cm4gbmV3IEYoKGZ1bmN0aW9uKCl7dmFyIGUsYSxsO2Rve2lmKChlPXMubmV4dCgpKS5kb25lKXJldHVybiByfHxvPT09TT9lOlUobyxjKyssbz09PU4/dm9pZCAwOmUudmFsdWVbMV0sZSk7dmFyIHA9ZS52YWx1ZTthPXBbMF0sbD1wWzFdLHUmJih1PXQuY2FsbChuLGwsYSxpKSl9d2hpbGUodSk7cmV0dXJuIG89PT1SP2U6VShvLGEsbCxlKX0pKX0sb31mdW5jdGlvbiBzbihlLHQpe3ZhciBuPXMoZSksbz1bZV0uY29uY2F0KHQpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGkoZSk/biYmKGU9cihlKSk6ZT1uP3NlKGUpOnVlKEFycmF5LmlzQXJyYXkoZSk/ZTpbZV0pLGV9KSkuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gMCE9PWUuc2l6ZX0pKTtpZigwPT09by5sZW5ndGgpcmV0dXJuIGU7aWYoMT09PW8ubGVuZ3RoKXt2YXIgYT1vWzBdO2lmKGE9PT1lfHxuJiZzKGEpfHx1KGUpJiZ1KGEpKXJldHVybiBhfXZhciBjPW5ldyB0ZShvKTtyZXR1cm4gbj9jPWMudG9LZXllZFNlcSgpOnUoZSl8fChjPWMudG9TZXRTZXEoKSksKGM9Yy5mbGF0dGVuKCEwKSkuc2l6ZT1vLnJlZHVjZSgoZnVuY3Rpb24oZSx0KXtpZih2b2lkIDAhPT1lKXt2YXIgbj10LnNpemU7aWYodm9pZCAwIT09bilyZXR1cm4gZStufX0pLDApLGN9ZnVuY3Rpb24gdW4oZSx0LG4pe3ZhciByPWJuKGUpO3JldHVybiByLl9faXRlcmF0ZVVuY2FjaGVkPWZ1bmN0aW9uKHIsbyl7dmFyIGE9MCxzPSExO2Z1bmN0aW9uIHUoZSxjKXt2YXIgbD10aGlzO2UuX19pdGVyYXRlKChmdW5jdGlvbihlLG8pe3JldHVybighdHx8Yzx0KSYmaShlKT91KGUsYysxKTohMT09PXIoZSxuP286YSsrLGwpJiYocz0hMCksIXN9KSxvKX1yZXR1cm4gdShlLDApLGF9LHIuX19pdGVyYXRvclVuY2FjaGVkPWZ1bmN0aW9uKHIsbyl7dmFyIGE9ZS5fX2l0ZXJhdG9yKHIsbykscz1bXSx1PTA7cmV0dXJuIG5ldyBGKChmdW5jdGlvbigpe2Zvcig7YTspe3ZhciBlPWEubmV4dCgpO2lmKCExPT09ZS5kb25lKXt2YXIgYz1lLnZhbHVlO2lmKHI9PT1SJiYoYz1jWzFdKSx0JiYhKHMubGVuZ3RoPHQpfHwhaShjKSlyZXR1cm4gbj9lOlUocix1KyssYyxlKTtzLnB1c2goYSksYT1jLl9faXRlcmF0b3IocixvKX1lbHNlIGE9cy5wb3AoKX1yZXR1cm4gcSgpfSkpfSxyfWZ1bmN0aW9uIGNuKGUsdCxuKXt2YXIgcj15bihlKTtyZXR1cm4gZS50b1NlcSgpLm1hcCgoZnVuY3Rpb24obyxhKXtyZXR1cm4gcih0LmNhbGwobixvLGEsZSkpfSkpLmZsYXR0ZW4oITApfWZ1bmN0aW9uIGxuKGUsdCl7dmFyIG49Ym4oZSk7cmV0dXJuIG4uc2l6ZT1lLnNpemUmJjIqZS5zaXplLTEsbi5fX2l0ZXJhdGVVbmNhY2hlZD1mdW5jdGlvbihuLHIpe3ZhciBvPXRoaXMsYT0wO3JldHVybiBlLl9faXRlcmF0ZSgoZnVuY3Rpb24oZSxyKXtyZXR1cm4oIWF8fCExIT09bih0LGErKyxvKSkmJiExIT09bihlLGErKyxvKX0pLHIpLGF9LG4uX19pdGVyYXRvclVuY2FjaGVkPWZ1bmN0aW9uKG4scil7dmFyIG8sYT1lLl9faXRlcmF0b3IoTSxyKSxpPTA7cmV0dXJuIG5ldyBGKChmdW5jdGlvbigpe3JldHVybighb3x8aSUyKSYmKG89YS5uZXh0KCkpLmRvbmU/bzppJTI/VShuLGkrKyx0KTpVKG4saSsrLG8udmFsdWUsbyl9KSl9LG59ZnVuY3Rpb24gcG4oZSx0LG4pe3R8fCh0PXduKTt2YXIgcj1zKGUpLG89MCxhPWUudG9TZXEoKS5tYXAoKGZ1bmN0aW9uKHQscil7cmV0dXJuW3IsdCxvKyssbj9uKHQscixlKTp0XX0pKS50b0FycmF5KCk7cmV0dXJuIGEuc29ydCgoZnVuY3Rpb24oZSxuKXtyZXR1cm4gdChlWzNdLG5bM10pfHxlWzJdLW5bMl19KSkuZm9yRWFjaChyP2Z1bmN0aW9uKGUsdCl7YVt0XS5sZW5ndGg9Mn06ZnVuY3Rpb24oZSx0KXthW3RdPWVbMV19KSxyP0soYSk6dShlKT9ZKGEpOkcoYSl9ZnVuY3Rpb24gZm4oZSx0LG4pe2lmKHR8fCh0PXduKSxuKXt2YXIgcj1lLnRvU2VxKCkubWFwKChmdW5jdGlvbih0LHIpe3JldHVyblt0LG4odCxyLGUpXX0pKS5yZWR1Y2UoKGZ1bmN0aW9uKGUsbil7cmV0dXJuIGhuKHQsZVsxXSxuWzFdKT9uOmV9KSk7cmV0dXJuIHImJnJbMF19cmV0dXJuIGUucmVkdWNlKChmdW5jdGlvbihlLG4pe3JldHVybiBobih0LGUsbik/bjplfSkpfWZ1bmN0aW9uIGhuKGUsdCxuKXt2YXIgcj1lKG4sdCk7cmV0dXJuIDA9PT1yJiZuIT09dCYmKG51bGw9PW58fG4hPW4pfHxyPjB9ZnVuY3Rpb24gZG4oZSx0LHIpe3ZhciBvPWJuKGUpO3JldHVybiBvLnNpemU9bmV3IHRlKHIpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc2l6ZX0pKS5taW4oKSxvLl9faXRlcmF0ZT1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbixyPXRoaXMuX19pdGVyYXRvcihNLHQpLG89MDshKG49ci5uZXh0KCkpLmRvbmUmJiExIT09ZShuLnZhbHVlLG8rKyx0aGlzKTspO3JldHVybiBvfSxvLl9faXRlcmF0b3JVbmNhY2hlZD1mdW5jdGlvbihlLG8pe3ZhciBhPXIubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZT1uKGUpLFcobz9lLnJldmVyc2UoKTplKX0pKSxpPTAscz0hMTtyZXR1cm4gbmV3IEYoKGZ1bmN0aW9uKCl7dmFyIG47cmV0dXJuIHN8fChuPWEubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS5uZXh0KCl9KSkscz1uLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmRvbmV9KSkpLHM/cSgpOlUoZSxpKyssdC5hcHBseShudWxsLG4ubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS52YWx1ZX0pKSkpfSkpfSxvfWZ1bmN0aW9uIG1uKGUsdCl7cmV0dXJuIGFlKGUpP3Q6ZS5jb25zdHJ1Y3Rvcih0KX1mdW5jdGlvbiB2bihlKXtpZihlIT09T2JqZWN0KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIFtLLCBWXSB0dXBsZTogIitlKX1mdW5jdGlvbiBnbihlKXtyZXR1cm4gVmUoZS5zaXplKSxBKGUpfWZ1bmN0aW9uIHluKGUpe3JldHVybiBzKGUpP3I6dShlKT9vOmF9ZnVuY3Rpb24gYm4oZSl7cmV0dXJuIE9iamVjdC5jcmVhdGUoKHMoZSk/Szp1KGUpP1k6RykucHJvdG90eXBlKX1mdW5jdGlvbiBfbigpe3JldHVybiB0aGlzLl9pdGVyLmNhY2hlUmVzdWx0Pyh0aGlzLl9pdGVyLmNhY2hlUmVzdWx0KCksdGhpcy5zaXplPXRoaXMuX2l0ZXIuc2l6ZSx0aGlzKTpKLnByb3RvdHlwZS5jYWNoZVJlc3VsdC5jYWxsKHRoaXMpfWZ1bmN0aW9uIHduKGUsdCl7cmV0dXJuIGU+dD8xOmU8dD8tMTowfWZ1bmN0aW9uIHhuKGUpe3ZhciB0PVcoZSk7aWYoIXQpe2lmKCEkKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGl0ZXJhYmxlIG9yIGFycmF5LWxpa2U6ICIrZSk7dD1XKG4oZSkpfXJldHVybiB0fWZ1bmN0aW9uIEVuKGUsdCl7dmFyIG4scj1mdW5jdGlvbihhKXtpZihhIGluc3RhbmNlb2YgcilyZXR1cm4gYTtpZighKHRoaXMgaW5zdGFuY2VvZiByKSlyZXR1cm4gbmV3IHIoYSk7aWYoIW4pe249ITA7dmFyIGk9T2JqZWN0LmtleXMoZSk7T24obyxpKSxvLnNpemU9aS5sZW5ndGgsby5fbmFtZT10LG8uX2tleXM9aSxvLl9kZWZhdWx0VmFsdWVzPWV9dGhpcy5fbWFwPVdlKGEpfSxvPXIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoU24pO3JldHVybiBvLmNvbnN0cnVjdG9yPXIscn10KHp0LFdlKSx6dC5vZj1mdW5jdGlvbigpe3JldHVybiB0aGlzKGFyZ3VtZW50cyl9LHp0LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fdG9TdHJpbmcoIk9yZGVyZWRNYXAgeyIsIn0iKX0senQucHJvdG90eXBlLmdldD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX21hcC5nZXQoZSk7cmV0dXJuIHZvaWQgMCE9PW4/dGhpcy5fbGlzdC5nZXQobilbMV06dH0senQucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLnNpemU/dGhpczp0aGlzLl9fb3duZXJJRD8odGhpcy5zaXplPTAsdGhpcy5fbWFwLmNsZWFyKCksdGhpcy5fbGlzdC5jbGVhcigpLHRoaXMpOkh0KCl9LHp0LnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gJHQodGhpcyxlLHQpfSx6dC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKGUpe3JldHVybiAkdCh0aGlzLGUsYil9LHp0LnByb3RvdHlwZS53YXNBbHRlcmVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcC53YXNBbHRlcmVkKCl8fHRoaXMuX2xpc3Qud2FzQWx0ZXJlZCgpfSx6dC5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztyZXR1cm4gdGhpcy5fbGlzdC5fX2l0ZXJhdGUoKGZ1bmN0aW9uKHQpe3JldHVybiB0JiZlKHRbMV0sdFswXSxuKX0pLHQpfSx6dC5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9saXN0LmZyb21FbnRyeVNlcSgpLl9faXRlcmF0b3IoZSx0KX0senQucHJvdG90eXBlLl9fZW5zdXJlT3duZXI9ZnVuY3Rpb24oZSl7aWYoZT09PXRoaXMuX19vd25lcklEKXJldHVybiB0aGlzO3ZhciB0PXRoaXMuX21hcC5fX2Vuc3VyZU93bmVyKGUpLG49dGhpcy5fbGlzdC5fX2Vuc3VyZU93bmVyKGUpO3JldHVybiBlP1d0KHQsbixlLHRoaXMuX19oYXNoKToodGhpcy5fX293bmVySUQ9ZSx0aGlzLl9tYXA9dCx0aGlzLl9saXN0PW4sdGhpcyl9LHp0LmlzT3JkZXJlZE1hcD1WdCx6dC5wcm90b3R5cGVbZF09ITAsenQucHJvdG90eXBlW21dPXp0LnByb3RvdHlwZS5yZW1vdmUsdChKdCxLKSxKdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX2l0ZXIuZ2V0KGUsdCl9LEp0LnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2l0ZXIuaGFzKGUpfSxKdC5wcm90b3R5cGUudmFsdWVTZXE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXRlci52YWx1ZVNlcSgpfSxKdC5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1RdCh0aGlzLCEwKTtyZXR1cm4gdGhpcy5fdXNlS2V5c3x8KHQudmFsdWVTZXE9ZnVuY3Rpb24oKXtyZXR1cm4gZS5faXRlci50b1NlcSgpLnJldmVyc2UoKX0pLHR9LEp0LnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLHI9WHQodGhpcyxlLHQpO3JldHVybiB0aGlzLl91c2VLZXlzfHwoci52YWx1ZVNlcT1mdW5jdGlvbigpe3JldHVybiBuLl9pdGVyLnRvU2VxKCkubWFwKGUsdCl9KSxyfSxKdC5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj10aGlzO3JldHVybiB0aGlzLl9pdGVyLl9faXRlcmF0ZSh0aGlzLl91c2VLZXlzP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGUodCxuLHIpfToobj10P2duKHRoaXMpOjAsZnVuY3Rpb24obyl7cmV0dXJuIGUobyx0Py0tbjpuKysscil9KSx0KX0sSnQucHJvdG90eXBlLl9faXRlcmF0b3I9ZnVuY3Rpb24oZSx0KXtpZih0aGlzLl91c2VLZXlzKXJldHVybiB0aGlzLl9pdGVyLl9faXRlcmF0b3IoZSx0KTt2YXIgbj10aGlzLl9pdGVyLl9faXRlcmF0b3IoTSx0KSxyPXQ/Z24odGhpcyk6MDtyZXR1cm4gbmV3IEYoKGZ1bmN0aW9uKCl7dmFyIG89bi5uZXh0KCk7cmV0dXJuIG8uZG9uZT9vOlUoZSx0Py0tcjpyKyssby52YWx1ZSxvKX0pKX0sSnQucHJvdG90eXBlW2RdPSEwLHQoS3QsWSksS3QucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9pdGVyLmluY2x1ZGVzKGUpfSxLdC5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcyxyPTA7cmV0dXJuIHRoaXMuX2l0ZXIuX19pdGVyYXRlKChmdW5jdGlvbih0KXtyZXR1cm4gZSh0LHIrKyxuKX0pLHQpfSxLdC5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX2l0ZXIuX19pdGVyYXRvcihNLHQpLHI9MDtyZXR1cm4gbmV3IEYoKGZ1bmN0aW9uKCl7dmFyIHQ9bi5uZXh0KCk7cmV0dXJuIHQuZG9uZT90OlUoZSxyKyssdC52YWx1ZSx0KX0pKX0sdChZdCxHKSxZdC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9pdGVyLmluY2x1ZGVzKGUpfSxZdC5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztyZXR1cm4gdGhpcy5faXRlci5fX2l0ZXJhdGUoKGZ1bmN0aW9uKHQpe3JldHVybiBlKHQsdCxuKX0pLHQpfSxZdC5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX2l0ZXIuX19pdGVyYXRvcihNLHQpO3JldHVybiBuZXcgRigoZnVuY3Rpb24oKXt2YXIgdD1uLm5leHQoKTtyZXR1cm4gdC5kb25lP3Q6VShlLHQudmFsdWUsdC52YWx1ZSx0KX0pKX0sdChHdCxLKSxHdC5wcm90b3R5cGUuZW50cnlTZXE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXRlci50b1NlcSgpfSxHdC5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztyZXR1cm4gdGhpcy5faXRlci5fX2l0ZXJhdGUoKGZ1bmN0aW9uKHQpe2lmKHQpe3ZuKHQpO3ZhciByPWkodCk7cmV0dXJuIGUocj90LmdldCgxKTp0WzFdLHI/dC5nZXQoMCk6dFswXSxuKX19KSx0KX0sR3QucHJvdG90eXBlLl9faXRlcmF0b3I9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9pdGVyLl9faXRlcmF0b3IoTSx0KTtyZXR1cm4gbmV3IEYoKGZ1bmN0aW9uKCl7Zm9yKDs7KXt2YXIgdD1uLm5leHQoKTtpZih0LmRvbmUpcmV0dXJuIHQ7dmFyIHI9dC52YWx1ZTtpZihyKXt2bihyKTt2YXIgbz1pKHIpO3JldHVybiBVKGUsbz9yLmdldCgwKTpyWzBdLG8/ci5nZXQoMSk6clsxXSx0KX19fSkpfSxLdC5wcm90b3R5cGUuY2FjaGVSZXN1bHQ9SnQucHJvdG90eXBlLmNhY2hlUmVzdWx0PVl0LnByb3RvdHlwZS5jYWNoZVJlc3VsdD1HdC5wcm90b3R5cGUuY2FjaGVSZXN1bHQ9X24sdChFbixFZSksRW4ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX190b1N0cmluZyhBbih0aGlzKSsiIHsiLCJ9Iil9LEVuLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2RlZmF1bHRWYWx1ZXMuaGFzT3duUHJvcGVydHkoZSl9LEVuLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oZSx0KXtpZighdGhpcy5oYXMoZSkpcmV0dXJuIHQ7dmFyIG49dGhpcy5fZGVmYXVsdFZhbHVlc1tlXTtyZXR1cm4gdGhpcy5fbWFwP3RoaXMuX21hcC5nZXQoZSxuKTpufSxFbi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXtpZih0aGlzLl9fb3duZXJJRClyZXR1cm4gdGhpcy5fbWFwJiZ0aGlzLl9tYXAuY2xlYXIoKSx0aGlzO3ZhciBlPXRoaXMuY29uc3RydWN0b3I7cmV0dXJuIGUuX2VtcHR5fHwoZS5fZW1wdHk9Q24odGhpcyxvdCgpKSl9LEVuLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oZSx0KXtpZighdGhpcy5oYXMoZSkpdGhyb3cgbmV3IEVycm9yKCdDYW5ub3Qgc2V0IHVua25vd24ga2V5ICInK2UrJyIgb24gJytBbih0aGlzKSk7aWYodGhpcy5fbWFwJiYhdGhpcy5fbWFwLmhhcyhlKSYmdD09PXRoaXMuX2RlZmF1bHRWYWx1ZXNbZV0pcmV0dXJuIHRoaXM7dmFyIG49dGhpcy5fbWFwJiZ0aGlzLl9tYXAuc2V0KGUsdCk7cmV0dXJuIHRoaXMuX19vd25lcklEfHxuPT09dGhpcy5fbWFwP3RoaXM6Q24odGhpcyxuKX0sRW4ucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbihlKXtpZighdGhpcy5oYXMoZSkpcmV0dXJuIHRoaXM7dmFyIHQ9dGhpcy5fbWFwJiZ0aGlzLl9tYXAucmVtb3ZlKGUpO3JldHVybiB0aGlzLl9fb3duZXJJRHx8dD09PXRoaXMuX21hcD90aGlzOkNuKHRoaXMsdCl9LEVuLnByb3RvdHlwZS53YXNBbHRlcmVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcC53YXNBbHRlcmVkKCl9LEVuLnByb3RvdHlwZS5fX2l0ZXJhdG9yPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztyZXR1cm4gcih0aGlzLl9kZWZhdWx0VmFsdWVzKS5tYXAoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIG4uZ2V0KHQpfSkpLl9faXRlcmF0b3IoZSx0KX0sRW4ucHJvdG90eXBlLl9faXRlcmF0ZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7cmV0dXJuIHIodGhpcy5fZGVmYXVsdFZhbHVlcykubWFwKChmdW5jdGlvbihlLHQpe3JldHVybiBuLmdldCh0KX0pKS5fX2l0ZXJhdGUoZSx0KX0sRW4ucHJvdG90eXBlLl9fZW5zdXJlT3duZXI9ZnVuY3Rpb24oZSl7aWYoZT09PXRoaXMuX19vd25lcklEKXJldHVybiB0aGlzO3ZhciB0PXRoaXMuX21hcCYmdGhpcy5fbWFwLl9fZW5zdXJlT3duZXIoZSk7cmV0dXJuIGU/Q24odGhpcyx0LGUpOih0aGlzLl9fb3duZXJJRD1lLHRoaXMuX21hcD10LHRoaXMpfTt2YXIgU249RW4ucHJvdG90eXBlO2Z1bmN0aW9uIENuKGUsdCxuKXt2YXIgcj1PYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihlKSk7cmV0dXJuIHIuX21hcD10LHIuX19vd25lcklEPW4scn1mdW5jdGlvbiBBbihlKXtyZXR1cm4gZS5fbmFtZXx8ZS5jb25zdHJ1Y3Rvci5uYW1lfHwiUmVjb3JkIn1mdW5jdGlvbiBPbihlLHQpe3RyeXt0LmZvckVhY2goa24uYmluZCh2b2lkIDAsZSkpfWNhdGNoKGUpe319ZnVuY3Rpb24ga24oZSx0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQodCl9LHNldDpmdW5jdGlvbihlKXtfZSh0aGlzLl9fb3duZXJJRCwiQ2Fubm90IHNldCBvbiBhbiBpbW11dGFibGUgcmVjb3JkLiIpLHRoaXMuc2V0KHQsZSl9fSl9ZnVuY3Rpb24gam4oZSl7cmV0dXJuIG51bGw9PWU/RG4oKTpUbihlKSYmIWwoZSk/ZTpEbigpLndpdGhNdXRhdGlvbnMoKGZ1bmN0aW9uKHQpe3ZhciBuPWEoZSk7VmUobi5zaXplKSxuLmZvckVhY2goKGZ1bmN0aW9uKGUpe3JldHVybiB0LmFkZChlKX0pKX0pKX1mdW5jdGlvbiBUbihlKXtyZXR1cm4hKCFlfHwhZVtQbl0pfVNuW21dPVNuLnJlbW92ZSxTbi5kZWxldGVJbj1Tbi5yZW1vdmVJbj1LZS5yZW1vdmVJbixTbi5tZXJnZT1LZS5tZXJnZSxTbi5tZXJnZVdpdGg9S2UubWVyZ2VXaXRoLFNuLm1lcmdlSW49S2UubWVyZ2VJbixTbi5tZXJnZURlZXA9S2UubWVyZ2VEZWVwLFNuLm1lcmdlRGVlcFdpdGg9S2UubWVyZ2VEZWVwV2l0aCxTbi5tZXJnZURlZXBJbj1LZS5tZXJnZURlZXBJbixTbi5zZXRJbj1LZS5zZXRJbixTbi51cGRhdGU9S2UudXBkYXRlLFNuLnVwZGF0ZUluPUtlLnVwZGF0ZUluLFNuLndpdGhNdXRhdGlvbnM9S2Uud2l0aE11dGF0aW9ucyxTbi5hc011dGFibGU9S2UuYXNNdXRhYmxlLFNuLmFzSW1tdXRhYmxlPUtlLmFzSW1tdXRhYmxlLHQoam4sQ2UpLGpuLm9mPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMoYXJndW1lbnRzKX0sam4uZnJvbUtleXM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMocihlKS5rZXlTZXEoKSl9LGpuLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fdG9TdHJpbmcoIlNldCB7IiwifSIpfSxqbi5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9tYXAuaGFzKGUpfSxqbi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGUpe3JldHVybiBNbih0aGlzLHRoaXMuX21hcC5zZXQoZSwhMCkpfSxqbi5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKGUpe3JldHVybiBNbih0aGlzLHRoaXMuX21hcC5yZW1vdmUoZSkpfSxqbi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXtyZXR1cm4gTW4odGhpcyx0aGlzLl9tYXAuY2xlYXIoKSl9LGpuLnByb3RvdHlwZS51bmlvbj1mdW5jdGlvbigpe3ZhciB0PWUuY2FsbChhcmd1bWVudHMsMCk7cmV0dXJuIDA9PT0odD10LmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIDAhPT1lLnNpemV9KSkpLmxlbmd0aD90aGlzOjAhPT10aGlzLnNpemV8fHRoaXMuX19vd25lcklEfHwxIT09dC5sZW5ndGg/dGhpcy53aXRoTXV0YXRpb25zKChmdW5jdGlvbihlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylhKHRbbl0pLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBlLmFkZCh0KX0pKX0pKTp0aGlzLmNvbnN0cnVjdG9yKHRbMF0pfSxqbi5wcm90b3R5cGUuaW50ZXJzZWN0PWZ1bmN0aW9uKCl7dmFyIHQ9ZS5jYWxsKGFyZ3VtZW50cywwKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuIHRoaXM7dD10Lm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGEoZSl9KSk7dmFyIG49dGhpcztyZXR1cm4gdGhpcy53aXRoTXV0YXRpb25zKChmdW5jdGlvbihlKXtuLmZvckVhY2goKGZ1bmN0aW9uKG4pe3QuZXZlcnkoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmluY2x1ZGVzKG4pfSkpfHxlLnJlbW92ZShuKX0pKX0pKX0sam4ucHJvdG90eXBlLnN1YnRyYWN0PWZ1bmN0aW9uKCl7dmFyIHQ9ZS5jYWxsKGFyZ3VtZW50cywwKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuIHRoaXM7dD10Lm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGEoZSl9KSk7dmFyIG49dGhpcztyZXR1cm4gdGhpcy53aXRoTXV0YXRpb25zKChmdW5jdGlvbihlKXtuLmZvckVhY2goKGZ1bmN0aW9uKG4pe3Quc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5jbHVkZXMobil9KSkmJmUucmVtb3ZlKG4pfSkpfSkpfSxqbi5wcm90b3R5cGUubWVyZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGpuLnByb3RvdHlwZS5tZXJnZVdpdGg9ZnVuY3Rpb24odCl7dmFyIG49ZS5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gdGhpcy51bmlvbi5hcHBseSh0aGlzLG4pfSxqbi5wcm90b3R5cGUuc29ydD1mdW5jdGlvbihlKXtyZXR1cm4gTG4ocG4odGhpcyxlKSl9LGpuLnByb3RvdHlwZS5zb3J0Qnk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gTG4ocG4odGhpcyx0LGUpKX0sam4ucHJvdG90eXBlLndhc0FsdGVyZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwLndhc0FsdGVyZWQoKX0sam4ucHJvdG90eXBlLl9faXRlcmF0ZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7cmV0dXJuIHRoaXMuX21hcC5fX2l0ZXJhdGUoKGZ1bmN0aW9uKHQscil7cmV0dXJuIGUocixyLG4pfSksdCl9LGpuLnByb3RvdHlwZS5fX2l0ZXJhdG9yPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX21hcC5tYXAoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR9KSkuX19pdGVyYXRvcihlLHQpfSxqbi5wcm90b3R5cGUuX19lbnN1cmVPd25lcj1mdW5jdGlvbihlKXtpZihlPT09dGhpcy5fX293bmVySUQpcmV0dXJuIHRoaXM7dmFyIHQ9dGhpcy5fbWFwLl9fZW5zdXJlT3duZXIoZSk7cmV0dXJuIGU/dGhpcy5fX21ha2UodCxlKToodGhpcy5fX293bmVySUQ9ZSx0aGlzLl9tYXA9dCx0aGlzKX0sam4uaXNTZXQ9VG47dmFyIEluLFBuPSJAQF9fSU1NVVRBQkxFX1NFVF9fQEAiLE5uPWpuLnByb3RvdHlwZTtmdW5jdGlvbiBNbihlLHQpe3JldHVybiBlLl9fb3duZXJJRD8oZS5zaXplPXQuc2l6ZSxlLl9tYXA9dCxlKTp0PT09ZS5fbWFwP2U6MD09PXQuc2l6ZT9lLl9fZW1wdHkoKTplLl9fbWFrZSh0KX1mdW5jdGlvbiBSbihlLHQpe3ZhciBuPU9iamVjdC5jcmVhdGUoTm4pO3JldHVybiBuLnNpemU9ZT9lLnNpemU6MCxuLl9tYXA9ZSxuLl9fb3duZXJJRD10LG59ZnVuY3Rpb24gRG4oKXtyZXR1cm4gSW58fChJbj1SbihvdCgpKSl9ZnVuY3Rpb24gTG4oZSl7cmV0dXJuIG51bGw9PWU/em4oKTpCbihlKT9lOnpuKCkud2l0aE11dGF0aW9ucygoZnVuY3Rpb24odCl7dmFyIG49YShlKTtWZShuLnNpemUpLG4uZm9yRWFjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIHQuYWRkKGUpfSkpfSkpfWZ1bmN0aW9uIEJuKGUpe3JldHVybiBUbihlKSYmbChlKX1ObltQbl09ITAsTm5bbV09Tm4ucmVtb3ZlLE5uLm1lcmdlRGVlcD1Obi5tZXJnZSxObi5tZXJnZURlZXBXaXRoPU5uLm1lcmdlV2l0aCxObi53aXRoTXV0YXRpb25zPUtlLndpdGhNdXRhdGlvbnMsTm4uYXNNdXRhYmxlPUtlLmFzTXV0YWJsZSxObi5hc0ltbXV0YWJsZT1LZS5hc0ltbXV0YWJsZSxObi5fX2VtcHR5PURuLE5uLl9fbWFrZT1Sbix0KExuLGpuKSxMbi5vZj1mdW5jdGlvbigpe3JldHVybiB0aGlzKGFyZ3VtZW50cyl9LExuLmZyb21LZXlzPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzKHIoZSkua2V5U2VxKCkpfSxMbi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX3RvU3RyaW5nKCJPcmRlcmVkU2V0IHsiLCJ9Iil9LExuLmlzT3JkZXJlZFNldD1Cbjt2YXIgRm4sVW49TG4ucHJvdG90eXBlO2Z1bmN0aW9uIHFuKGUsdCl7dmFyIG49T2JqZWN0LmNyZWF0ZShVbik7cmV0dXJuIG4uc2l6ZT1lP2Uuc2l6ZTowLG4uX21hcD1lLG4uX19vd25lcklEPXQsbn1mdW5jdGlvbiB6bigpe3JldHVybiBGbnx8KEZuPXFuKEh0KCkpKX1mdW5jdGlvbiBWbihlKXtyZXR1cm4gbnVsbD09ZT9ZbigpOlduKGUpP2U6WW4oKS51bnNoaWZ0QWxsKGUpfWZ1bmN0aW9uIFduKGUpe3JldHVybiEoIWV8fCFlWyRuXSl9VW5bZF09ITAsVW4uX19lbXB0eT16bixVbi5fX21ha2U9cW4sdChWbixTZSksVm4ub2Y9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcyhhcmd1bWVudHMpfSxWbi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX3RvU3RyaW5nKCJTdGFjayBbIiwiXSIpfSxWbi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5faGVhZDtmb3IoZT1PKHRoaXMsZSk7biYmZS0tOyluPW4ubmV4dDtyZXR1cm4gbj9uLnZhbHVlOnR9LFZuLnByb3RvdHlwZS5wZWVrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hlYWQmJnRoaXMuX2hlYWQudmFsdWV9LFZuLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXM7Zm9yKHZhciBlPXRoaXMuc2l6ZSthcmd1bWVudHMubGVuZ3RoLHQ9dGhpcy5faGVhZCxuPWFyZ3VtZW50cy5sZW5ndGgtMTtuPj0wO24tLSl0PXt2YWx1ZTphcmd1bWVudHNbbl0sbmV4dDp0fTtyZXR1cm4gdGhpcy5fX293bmVySUQ/KHRoaXMuc2l6ZT1lLHRoaXMuX2hlYWQ9dCx0aGlzLl9faGFzaD12b2lkIDAsdGhpcy5fX2FsdGVyZWQ9ITAsdGhpcyk6S24oZSx0KX0sVm4ucHJvdG90eXBlLnB1c2hBbGw9ZnVuY3Rpb24oZSl7aWYoMD09PShlPW8oZSkpLnNpemUpcmV0dXJuIHRoaXM7VmUoZS5zaXplKTt2YXIgdD10aGlzLnNpemUsbj10aGlzLl9oZWFkO3JldHVybiBlLnJldmVyc2UoKS5mb3JFYWNoKChmdW5jdGlvbihlKXt0Kyssbj17dmFsdWU6ZSxuZXh0Om59fSkpLHRoaXMuX19vd25lcklEPyh0aGlzLnNpemU9dCx0aGlzLl9oZWFkPW4sdGhpcy5fX2hhc2g9dm9pZCAwLHRoaXMuX19hbHRlcmVkPSEwLHRoaXMpOktuKHQsbil9LFZuLnByb3RvdHlwZS5wb3A9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zbGljZSgxKX0sVm4ucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sVm4ucHJvdG90eXBlLnVuc2hpZnRBbGw9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaEFsbChlKX0sVm4ucHJvdG90eXBlLnNoaWZ0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucG9wLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sVm4ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLnNpemU/dGhpczp0aGlzLl9fb3duZXJJRD8odGhpcy5zaXplPTAsdGhpcy5faGVhZD12b2lkIDAsdGhpcy5fX2hhc2g9dm9pZCAwLHRoaXMuX19hbHRlcmVkPSEwLHRoaXMpOlluKCl9LFZuLnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbihlLHQpe2lmKGooZSx0LHRoaXMuc2l6ZSkpcmV0dXJuIHRoaXM7dmFyIG49VChlLHRoaXMuc2l6ZSk7aWYoSSh0LHRoaXMuc2l6ZSkhPT10aGlzLnNpemUpcmV0dXJuIFNlLnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMsZSx0KTtmb3IodmFyIHI9dGhpcy5zaXplLW4sbz10aGlzLl9oZWFkO24tLTspbz1vLm5leHQ7cmV0dXJuIHRoaXMuX19vd25lcklEPyh0aGlzLnNpemU9cix0aGlzLl9oZWFkPW8sdGhpcy5fX2hhc2g9dm9pZCAwLHRoaXMuX19hbHRlcmVkPSEwLHRoaXMpOktuKHIsbyl9LFZuLnByb3RvdHlwZS5fX2Vuc3VyZU93bmVyPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dGhpcy5fX293bmVySUQ/dGhpczplP0tuKHRoaXMuc2l6ZSx0aGlzLl9oZWFkLGUsdGhpcy5fX2hhc2gpOih0aGlzLl9fb3duZXJJRD1lLHRoaXMuX19hbHRlcmVkPSExLHRoaXMpfSxWbi5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4gdGhpcy5yZXZlcnNlKCkuX19pdGVyYXRlKGUpO2Zvcih2YXIgbj0wLHI9dGhpcy5faGVhZDtyJiYhMSE9PWUoci52YWx1ZSxuKyssdGhpcyk7KXI9ci5uZXh0O3JldHVybiBufSxWbi5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbihlLHQpe2lmKHQpcmV0dXJuIHRoaXMucmV2ZXJzZSgpLl9faXRlcmF0b3IoZSk7dmFyIG49MCxyPXRoaXMuX2hlYWQ7cmV0dXJuIG5ldyBGKChmdW5jdGlvbigpe2lmKHIpe3ZhciB0PXIudmFsdWU7cmV0dXJuIHI9ci5uZXh0LFUoZSxuKyssdCl9cmV0dXJuIHEoKX0pKX0sVm4uaXNTdGFjaz1Xbjt2YXIgSG4sJG49IkBAX19JTU1VVEFCTEVfU1RBQ0tfX0BAIixKbj1Wbi5wcm90b3R5cGU7ZnVuY3Rpb24gS24oZSx0LG4scil7dmFyIG89T2JqZWN0LmNyZWF0ZShKbik7cmV0dXJuIG8uc2l6ZT1lLG8uX2hlYWQ9dCxvLl9fb3duZXJJRD1uLG8uX19oYXNoPXIsby5fX2FsdGVyZWQ9ITEsb31mdW5jdGlvbiBZbigpe3JldHVybiBIbnx8KEhuPUtuKDApKX1mdW5jdGlvbiBHbihlLHQpe3ZhciBuPWZ1bmN0aW9uKG4pe2UucHJvdG90eXBlW25dPXRbbl19O3JldHVybiBPYmplY3Qua2V5cyh0KS5mb3JFYWNoKG4pLE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMmJk9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCkuZm9yRWFjaChuKSxlfUpuWyRuXT0hMCxKbi53aXRoTXV0YXRpb25zPUtlLndpdGhNdXRhdGlvbnMsSm4uYXNNdXRhYmxlPUtlLmFzTXV0YWJsZSxKbi5hc0ltbXV0YWJsZT1LZS5hc0ltbXV0YWJsZSxKbi53YXNBbHRlcmVkPUtlLndhc0FsdGVyZWQsbi5JdGVyYXRvcj1GLEduKG4se3RvQXJyYXk6ZnVuY3Rpb24oKXtWZSh0aGlzLnNpemUpO3ZhciBlPW5ldyBBcnJheSh0aGlzLnNpemV8fDApO3JldHVybiB0aGlzLnZhbHVlU2VxKCkuX19pdGVyYXRlKChmdW5jdGlvbih0LG4pe2Vbbl09dH0pKSxlfSx0b0luZGV4ZWRTZXE6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEt0KHRoaXMpfSx0b0pTOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG9TZXEoKS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS50b0pTP2UudG9KUygpOmV9KSkuX190b0pTKCl9LHRvSlNPTjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRvU2VxKCkubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudG9KU09OP2UudG9KU09OKCk6ZX0pKS5fX3RvSlMoKX0sdG9LZXllZFNlcTpmdW5jdGlvbigpe3JldHVybiBuZXcgSnQodGhpcywhMCl9LHRvTWFwOmZ1bmN0aW9uKCl7cmV0dXJuIFdlKHRoaXMudG9LZXllZFNlcSgpKX0sdG9PYmplY3Q6ZnVuY3Rpb24oKXtWZSh0aGlzLnNpemUpO3ZhciBlPXt9O3JldHVybiB0aGlzLl9faXRlcmF0ZSgoZnVuY3Rpb24odCxuKXtlW25dPXR9KSksZX0sdG9PcmRlcmVkTWFwOmZ1bmN0aW9uKCl7cmV0dXJuIHp0KHRoaXMudG9LZXllZFNlcSgpKX0sdG9PcmRlcmVkU2V0OmZ1bmN0aW9uKCl7cmV0dXJuIExuKHModGhpcyk/dGhpcy52YWx1ZVNlcSgpOnRoaXMpfSx0b1NldDpmdW5jdGlvbigpe3JldHVybiBqbihzKHRoaXMpP3RoaXMudmFsdWVTZXEoKTp0aGlzKX0sdG9TZXRTZXE6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFl0KHRoaXMpfSx0b1NlcTpmdW5jdGlvbigpe3JldHVybiB1KHRoaXMpP3RoaXMudG9JbmRleGVkU2VxKCk6cyh0aGlzKT90aGlzLnRvS2V5ZWRTZXEoKTp0aGlzLnRvU2V0U2VxKCl9LHRvU3RhY2s6ZnVuY3Rpb24oKXtyZXR1cm4gVm4ocyh0aGlzKT90aGlzLnZhbHVlU2VxKCk6dGhpcyl9LHRvTGlzdDpmdW5jdGlvbigpe3JldHVybiBTdChzKHRoaXMpP3RoaXMudmFsdWVTZXEoKTp0aGlzKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4iW0l0ZXJhYmxlXSJ9LF9fdG9TdHJpbmc6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gMD09PXRoaXMuc2l6ZT9lK3Q6ZSsiICIrdGhpcy50b1NlcSgpLm1hcCh0aGlzLl9fdG9TdHJpbmdNYXBwZXIpLmpvaW4oIiwgIikrIiAiK3R9LGNvbmNhdDpmdW5jdGlvbigpe3JldHVybiBtbih0aGlzLHNuKHRoaXMsZS5jYWxsKGFyZ3VtZW50cywwKSkpfSxpbmNsdWRlczpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gZ2UodCxlKX0pKX0sZW50cmllczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9faXRlcmF0b3IoUil9LGV2ZXJ5OmZ1bmN0aW9uKGUsdCl7VmUodGhpcy5zaXplKTt2YXIgbj0hMDtyZXR1cm4gdGhpcy5fX2l0ZXJhdGUoKGZ1bmN0aW9uKHIsbyxhKXtpZighZS5jYWxsKHQscixvLGEpKXJldHVybiBuPSExLCExfSkpLG59LGZpbHRlcjpmdW5jdGlvbihlLHQpe3JldHVybiBtbih0aGlzLGVuKHRoaXMsZSx0LCEwKSl9LGZpbmQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuZmluZEVudHJ5KGUsdCk7cmV0dXJuIHI/clsxXTpufSxmb3JFYWNoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIFZlKHRoaXMuc2l6ZSksdGhpcy5fX2l0ZXJhdGUodD9lLmJpbmQodCk6ZSl9LGpvaW46ZnVuY3Rpb24oZSl7VmUodGhpcy5zaXplKSxlPXZvaWQgMCE9PWU/IiIrZToiLCI7dmFyIHQ9IiIsbj0hMDtyZXR1cm4gdGhpcy5fX2l0ZXJhdGUoKGZ1bmN0aW9uKHIpe24/bj0hMTp0Kz1lLHQrPW51bGwhPXI/ci50b1N0cmluZygpOiIifSkpLHR9LGtleXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2l0ZXJhdG9yKE4pfSxtYXA6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbW4odGhpcyxYdCh0aGlzLGUsdCkpfSxyZWR1Y2U6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLG87cmV0dXJuIFZlKHRoaXMuc2l6ZSksYXJndW1lbnRzLmxlbmd0aDwyP289ITA6cj10LHRoaXMuX19pdGVyYXRlKChmdW5jdGlvbih0LGEsaSl7bz8obz0hMSxyPXQpOnI9ZS5jYWxsKG4scix0LGEsaSl9KSkscn0scmVkdWNlUmlnaHQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMudG9LZXllZFNlcSgpLnJldmVyc2UoKTtyZXR1cm4gci5yZWR1Y2UuYXBwbHkocixhcmd1bWVudHMpfSxyZXZlcnNlOmZ1bmN0aW9uKCl7cmV0dXJuIG1uKHRoaXMsUXQodGhpcywhMCkpfSxzbGljZTpmdW5jdGlvbihlLHQpe3JldHVybiBtbih0aGlzLHJuKHRoaXMsZSx0LCEwKSl9LHNvbWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4hdGhpcy5ldmVyeSh0cihlKSx0KX0sc29ydDpmdW5jdGlvbihlKXtyZXR1cm4gbW4odGhpcyxwbih0aGlzLGUpKX0sdmFsdWVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19pdGVyYXRvcihNKX0sYnV0TGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNsaWNlKDAsLTEpfSxpc0VtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuc2l6ZT8wPT09dGhpcy5zaXplOiF0aGlzLnNvbWUoKGZ1bmN0aW9uKCl7cmV0dXJuITB9KSl9LGNvdW50OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIEEoZT90aGlzLnRvU2VxKCkuZmlsdGVyKGUsdCk6dGhpcyl9LGNvdW50Qnk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdG4odGhpcyxlLHQpfSxlcXVhbHM6ZnVuY3Rpb24oZSl7cmV0dXJuIHllKHRoaXMsZSl9LGVudHJ5U2VxOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpZihlLl9jYWNoZSlyZXR1cm4gbmV3IHRlKGUuX2NhY2hlKTt2YXIgdD1lLnRvU2VxKCkubWFwKGVyKS50b0luZGV4ZWRTZXEoKTtyZXR1cm4gdC5mcm9tRW50cnlTZXE9ZnVuY3Rpb24oKXtyZXR1cm4gZS50b1NlcSgpfSx0fSxmaWx0ZXJOb3Q6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5maWx0ZXIodHIoZSksdCl9LGZpbmRFbnRyeTpmdW5jdGlvbihlLHQsbil7dmFyIHI9bjtyZXR1cm4gdGhpcy5fX2l0ZXJhdGUoKGZ1bmN0aW9uKG4sbyxhKXtpZihlLmNhbGwodCxuLG8sYSkpcmV0dXJuIHI9W28sbl0sITF9KSkscn0sZmluZEtleTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZmluZEVudHJ5KGUsdCk7cmV0dXJuIG4mJm5bMF19LGZpbmRMYXN0OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy50b0tleWVkU2VxKCkucmV2ZXJzZSgpLmZpbmQoZSx0LG4pfSxmaW5kTGFzdEVudHJ5OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy50b0tleWVkU2VxKCkucmV2ZXJzZSgpLmZpbmRFbnRyeShlLHQsbil9LGZpbmRMYXN0S2V5OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMudG9LZXllZFNlcSgpLnJldmVyc2UoKS5maW5kS2V5KGUsdCl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmluZChrKX0sZmxhdE1hcDpmdW5jdGlvbihlLHQpe3JldHVybiBtbih0aGlzLGNuKHRoaXMsZSx0KSl9LGZsYXR0ZW46ZnVuY3Rpb24oZSl7cmV0dXJuIG1uKHRoaXMsdW4odGhpcyxlLCEwKSl9LGZyb21FbnRyeVNlcTpmdW5jdGlvbigpe3JldHVybiBuZXcgR3QodGhpcyl9LGdldDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmZpbmQoKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGdlKG4sZSl9KSx2b2lkIDAsdCl9LGdldEluOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuLHI9dGhpcyxvPXhuKGUpOyEobj1vLm5leHQoKSkuZG9uZTspe3ZhciBhPW4udmFsdWU7aWYoKHI9ciYmci5nZXQ/ci5nZXQoYSxiKTpiKT09PWIpcmV0dXJuIHR9cmV0dXJuIHJ9LGdyb3VwQnk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbm4odGhpcyxlLHQpfSxoYXM6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZ2V0KGUsYikhPT1ifSxoYXNJbjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5nZXRJbihlLGIpIT09Yn0saXNTdWJzZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9ImZ1bmN0aW9uIj09dHlwZW9mIGUuaW5jbHVkZXM/ZTpuKGUpLHRoaXMuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiBlLmluY2x1ZGVzKHQpfSkpfSxpc1N1cGVyc2V0OmZ1bmN0aW9uKGUpe3JldHVybihlPSJmdW5jdGlvbiI9PXR5cGVvZiBlLmlzU3Vic2V0P2U6bihlKSkuaXNTdWJzZXQodGhpcyl9LGtleU9mOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmZpbmRLZXkoKGZ1bmN0aW9uKHQpe3JldHVybiBnZSh0LGUpfSkpfSxrZXlTZXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b1NlcSgpLm1hcChRbikudG9JbmRleGVkU2VxKCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b1NlcSgpLnJldmVyc2UoKS5maXJzdCgpfSxsYXN0S2V5T2Y6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudG9LZXllZFNlcSgpLnJldmVyc2UoKS5rZXlPZihlKX0sbWF4OmZ1bmN0aW9uKGUpe3JldHVybiBmbih0aGlzLGUpfSxtYXhCeTpmdW5jdGlvbihlLHQpe3JldHVybiBmbih0aGlzLHQsZSl9LG1pbjpmdW5jdGlvbihlKXtyZXR1cm4gZm4odGhpcyxlP25yKGUpOmFyKX0sbWluQnk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZm4odGhpcyx0P25yKHQpOmFyLGUpfSxyZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2xpY2UoMSl9LHNraXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuc2xpY2UoTWF0aC5tYXgoMCxlKSl9LHNraXBMYXN0OmZ1bmN0aW9uKGUpe3JldHVybiBtbih0aGlzLHRoaXMudG9TZXEoKS5yZXZlcnNlKCkuc2tpcChlKS5yZXZlcnNlKCkpfSxza2lwV2hpbGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbW4odGhpcyxhbih0aGlzLGUsdCwhMCkpfSxza2lwVW50aWw6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5za2lwV2hpbGUodHIoZSksdCl9LHNvcnRCeTpmdW5jdGlvbihlLHQpe3JldHVybiBtbih0aGlzLHBuKHRoaXMsdCxlKSl9LHRha2U6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuc2xpY2UoMCxNYXRoLm1heCgwLGUpKX0sdGFrZUxhc3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIG1uKHRoaXMsdGhpcy50b1NlcSgpLnJldmVyc2UoKS50YWtlKGUpLnJldmVyc2UoKSl9LHRha2VXaGlsZTpmdW5jdGlvbihlLHQpe3JldHVybiBtbih0aGlzLG9uKHRoaXMsZSx0KSl9LHRha2VVbnRpbDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnRha2VXaGlsZSh0cihlKSx0KX0sdmFsdWVTZXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b0luZGV4ZWRTZXEoKX0saGFzaENvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2hhc2h8fCh0aGlzLl9faGFzaD1pcih0aGlzKSl9fSk7dmFyIFpuPW4ucHJvdG90eXBlO1puW3BdPSEwLFpuW0JdPVpuLnZhbHVlcyxabi5fX3RvSlM9Wm4udG9BcnJheSxabi5fX3RvU3RyaW5nTWFwcGVyPXJyLFpuLmluc3BlY3Q9Wm4udG9Tb3VyY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b1N0cmluZygpfSxabi5jaGFpbj1abi5mbGF0TWFwLFpuLmNvbnRhaW5zPVpuLmluY2x1ZGVzLEduKHIse2ZsaXA6ZnVuY3Rpb24oKXtyZXR1cm4gbW4odGhpcyxadCh0aGlzKSl9LG1hcEVudHJpZXM6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLHI9MDtyZXR1cm4gbW4odGhpcyx0aGlzLnRvU2VxKCkubWFwKChmdW5jdGlvbihvLGEpe3JldHVybiBlLmNhbGwodCxbYSxvXSxyKyssbil9KSkuZnJvbUVudHJ5U2VxKCkpfSxtYXBLZXlzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztyZXR1cm4gbW4odGhpcyx0aGlzLnRvU2VxKCkuZmxpcCgpLm1hcCgoZnVuY3Rpb24ocixvKXtyZXR1cm4gZS5jYWxsKHQscixvLG4pfSkpLmZsaXAoKSl9fSk7dmFyIFhuPXIucHJvdG90eXBlO2Z1bmN0aW9uIFFuKGUsdCl7cmV0dXJuIHR9ZnVuY3Rpb24gZXIoZSx0KXtyZXR1cm5bdCxlXX1mdW5jdGlvbiB0cihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4hZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIG5yKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybi1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gcnIoZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlP0pTT04uc3RyaW5naWZ5KGUpOlN0cmluZyhlKX1mdW5jdGlvbiBvcigpe3JldHVybiBDKGFyZ3VtZW50cyl9ZnVuY3Rpb24gYXIoZSx0KXtyZXR1cm4gZTx0PzE6ZT50Py0xOjB9ZnVuY3Rpb24gaXIoZSl7aWYoZS5zaXplPT09MS8wKXJldHVybiAwO3ZhciB0PWwoZSksbj1zKGUpLHI9dD8xOjA7cmV0dXJuIHNyKGUuX19pdGVyYXRlKG4/dD9mdW5jdGlvbihlLHQpe3I9MzEqcit1cihrZShlKSxrZSh0KSl8MH06ZnVuY3Rpb24oZSx0KXtyPXIrdXIoa2UoZSksa2UodCkpfDB9OnQ/ZnVuY3Rpb24oZSl7cj0zMSpyK2tlKGUpfDB9OmZ1bmN0aW9uKGUpe3I9citrZShlKXwwfSkscil9ZnVuY3Rpb24gc3IoZSx0KXtyZXR1cm4gdD1BZSh0LDM0MzI5MTgzNTMpLHQ9QWUodDw8MTV8dD4+Pi0xNSw0NjE4NDU5MDcpLHQ9QWUodDw8MTN8dD4+Pi0xMyw1KSx0PUFlKCh0PSh0KzM4NjQyOTIxOTZ8MCleZSledD4+PjE2LDIyNDY4MjI1MDcpLHQ9T2UoKHQ9QWUodF50Pj4+MTMsMzI2NjQ4OTkwOSkpXnQ+Pj4xNil9ZnVuY3Rpb24gdXIoZSx0KXtyZXR1cm4gZV50KzI2NTQ0MzU3NjkrKGU8PDYpKyhlPj4yKXwwfXJldHVybiBYbltmXT0hMCxYbltCXT1abi5lbnRyaWVzLFhuLl9fdG9KUz1abi50b09iamVjdCxYbi5fX3RvU3RyaW5nTWFwcGVyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHQpKyI6ICIrcnIoZSl9LEduKG8se3RvS2V5ZWRTZXE6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEp0KHRoaXMsITEpfSxmaWx0ZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbW4odGhpcyxlbih0aGlzLGUsdCwhMSkpfSxmaW5kSW5kZXg6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmZpbmRFbnRyeShlLHQpO3JldHVybiBuP25bMF06LTF9LGluZGV4T2Y6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5rZXlPZihlKTtyZXR1cm4gdm9pZCAwPT09dD8tMTp0fSxsYXN0SW5kZXhPZjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmxhc3RLZXlPZihlKTtyZXR1cm4gdm9pZCAwPT09dD8tMTp0fSxyZXZlcnNlOmZ1bmN0aW9uKCl7cmV0dXJuIG1uKHRoaXMsUXQodGhpcywhMSkpfSxzbGljZTpmdW5jdGlvbihlLHQpe3JldHVybiBtbih0aGlzLHJuKHRoaXMsZSx0LCExKSl9LHNwbGljZTpmdW5jdGlvbihlLHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg7aWYodD1NYXRoLm1heCgwfHQsMCksMD09PW58fDI9PT1uJiYhdClyZXR1cm4gdGhpcztlPVQoZSxlPDA/dGhpcy5jb3VudCgpOnRoaXMuc2l6ZSk7dmFyIHI9dGhpcy5zbGljZSgwLGUpO3JldHVybiBtbih0aGlzLDE9PT1uP3I6ci5jb25jYXQoQyhhcmd1bWVudHMsMiksdGhpcy5zbGljZShlK3QpKSl9LGZpbmRMYXN0SW5kZXg6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmZpbmRMYXN0RW50cnkoZSx0KTtyZXR1cm4gbj9uWzBdOi0xfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldCgwKX0sZmxhdHRlbjpmdW5jdGlvbihlKXtyZXR1cm4gbW4odGhpcyx1bih0aGlzLGUsITEpKX0sZ2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuKGU9Tyh0aGlzLGUpKTwwfHx0aGlzLnNpemU9PT0xLzB8fHZvaWQgMCE9PXRoaXMuc2l6ZSYmZT50aGlzLnNpemU/dDp0aGlzLmZpbmQoKGZ1bmN0aW9uKHQsbil7cmV0dXJuIG49PT1lfSksdm9pZCAwLHQpfSxoYXM6ZnVuY3Rpb24oZSl7cmV0dXJuKGU9Tyh0aGlzLGUpKT49MCYmKHZvaWQgMCE9PXRoaXMuc2l6ZT90aGlzLnNpemU9PT0xLzB8fGU8dGhpcy5zaXplOi0xIT09dGhpcy5pbmRleE9mKGUpKX0saW50ZXJwb3NlOmZ1bmN0aW9uKGUpe3JldHVybiBtbih0aGlzLGxuKHRoaXMsZSkpfSxpbnRlcmxlYXZlOmZ1bmN0aW9uKCl7dmFyIGU9W3RoaXNdLmNvbmNhdChDKGFyZ3VtZW50cykpLHQ9ZG4odGhpcy50b1NlcSgpLFkub2YsZSksbj10LmZsYXR0ZW4oITApO3JldHVybiB0LnNpemUmJihuLnNpemU9dC5zaXplKmUubGVuZ3RoKSxtbih0aGlzLG4pfSxrZXlTZXE6ZnVuY3Rpb24oKXtyZXR1cm4gd2UoMCx0aGlzLnNpemUpfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KC0xKX0sc2tpcFdoaWxlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG1uKHRoaXMsYW4odGhpcyxlLHQsITEpKX0semlwOmZ1bmN0aW9uKCl7cmV0dXJuIG1uKHRoaXMsZG4odGhpcyxvcixbdGhpc10uY29uY2F0KEMoYXJndW1lbnRzKSkpKX0semlwV2l0aDpmdW5jdGlvbihlKXt2YXIgdD1DKGFyZ3VtZW50cyk7cmV0dXJuIHRbMF09dGhpcyxtbih0aGlzLGRuKHRoaXMsZSx0KSl9fSksby5wcm90b3R5cGVbaF09ITAsby5wcm90b3R5cGVbZF09ITAsR24oYSx7Z2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuaGFzKGUpP2U6dH0saW5jbHVkZXM6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuaGFzKGUpfSxrZXlTZXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZVNlcSgpfX0pLGEucHJvdG90eXBlLmhhcz1abi5pbmNsdWRlcyxhLnByb3RvdHlwZS5jb250YWlucz1hLnByb3RvdHlwZS5pbmNsdWRlcyxHbihLLHIucHJvdG90eXBlKSxHbihZLG8ucHJvdG90eXBlKSxHbihHLGEucHJvdG90eXBlKSxHbihFZSxyLnByb3RvdHlwZSksR24oU2Usby5wcm90b3R5cGUpLEduKENlLGEucHJvdG90eXBlKSx7SXRlcmFibGU6bixTZXE6SixDb2xsZWN0aW9uOnhlLE1hcDpXZSxPcmRlcmVkTWFwOnp0LExpc3Q6U3QsU3RhY2s6Vm4sU2V0OmpuLE9yZGVyZWRTZXQ6TG4sUmVjb3JkOkVuLFJhbmdlOndlLFJlcGVhdDpiZSxpczpnZSxmcm9tSlM6aGV9fSgpfSxmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPW4oNTY4KX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMjM4KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0IGluIGU/cihlLHQse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTplW3RdPW4sZX0sZS5leHBvcnRzLmRlZmF1bHQ9ZS5leHBvcnRzLGUuZXhwb3J0cy5fX2VzTW9kdWxlPSEwfSxmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPW4oNTk5KX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjsoZnVuY3Rpb24oZSl7bi5kKHQsInoiLChmdW5jdGlvbigpe3JldHVybiB5ZX0pKSxuLmQodCwiaSIsKGZ1bmN0aW9uKCl7cmV0dXJuIGJlfSkpLG4uZCh0LCJ2IiwoZnVuY3Rpb24oKXtyZXR1cm4gX2V9KSksbi5kKHQsInIiLChmdW5jdGlvbigpe3JldHVybiB3ZX0pKSxuLmQodCwidCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHhlfSkpLG4uZCh0LCJzIiwoZnVuY3Rpb24oKXtyZXR1cm4gRWV9KSksbi5kKHQsInAiLChmdW5jdGlvbigpe3JldHVybiBTZX0pKSxuLmQodCwidSIsKGZ1bmN0aW9uKCl7cmV0dXJuIENlfSkpLG4uZCh0LCJ4IiwoZnVuY3Rpb24oKXtyZXR1cm4gQWV9KSksbi5kKHQsInkiLChmdW5jdGlvbigpe3JldHVybiBPZX0pKSxuLmQodCwiSiIsKGZ1bmN0aW9uKCl7cmV0dXJuIGtlfSkpLG4uZCh0LCJmIiwoZnVuY3Rpb24oKXtyZXR1cm4gamV9KSksbi5kKHQsIm4iLChmdW5jdGlvbigpe3JldHVybiBUZX0pKSxuLmQodCwiaCIsKGZ1bmN0aW9uKCl7cmV0dXJuIEllfSkpLG4uZCh0LCJEIiwoZnVuY3Rpb24oKXtyZXR1cm4gUGV9KSksbi5kKHQsIksiLChmdW5jdGlvbigpe3JldHVybiBNZX0pKSxuLmQodCwibyIsKGZ1bmN0aW9uKCl7cmV0dXJuIFVlfSkpLG4uZCh0LCJDIiwoZnVuY3Rpb24oKXtyZXR1cm4gcWV9KSksbi5kKHQsImEiLChmdW5jdGlvbigpe3JldHVybiB6ZX0pKSxuLmQodCwiSCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFZlfSkpLG4uZCh0LCJiIiwoZnVuY3Rpb24oKXtyZXR1cm4gV2V9KSksbi5kKHQsIkciLChmdW5jdGlvbigpe3JldHVybiBIZX0pKSxuLmQodCwiRiIsKGZ1bmN0aW9uKCl7cmV0dXJuICRlfSkpLG4uZCh0LCJFIiwoZnVuY3Rpb24oKXtyZXR1cm4gSmV9KSksbi5kKHQsImsiLChmdW5jdGlvbigpe3JldHVybiBLZX0pKSxuLmQodCwiZCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFllfSkpLG4uZCh0LCJnIiwoZnVuY3Rpb24oKXtyZXR1cm4gR2V9KSksbi5kKHQsIm0iLChmdW5jdGlvbigpe3JldHVybiBaZX0pKSxuLmQodCwibCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFhlfSkpLG4uZCh0LCJlIiwoZnVuY3Rpb24oKXtyZXR1cm4gUWV9KSksbi5kKHQsIkkiLChmdW5jdGlvbigpe3JldHVybiBldH0pKSxuLmQodCwidyIsKGZ1bmN0aW9uKCl7cmV0dXJuIHR0fSkpLG4uZCh0LCJBIiwoZnVuY3Rpb24oKXtyZXR1cm4gbnR9KSksbi5kKHQsIkIiLChmdW5jdGlvbigpe3JldHVybiBydH0pKSxuLmQodCwiaiIsKGZ1bmN0aW9uKCl7cmV0dXJuIG90fSkpLG4uZCh0LCJjIiwoZnVuY3Rpb24oKXtyZXR1cm4gYXR9KSksbi5kKHQsInEiLChmdW5jdGlvbigpe3JldHVybiBzdH0pKTt2YXIgcj1uKDE0KSxvPW4ubihyKSxhPShuKDEzKSxuKDE4KSksaT1uLm4oYSkscz1uKDQ5KSx1PW4ubihzKSxjPW4oMjMpLGw9bi5uKGMpLHA9big0KSxmPW4ubihwKSxoPW4oODEpLGQ9bi5uKGgpLG09bigyKSx2PW4ubihtKSxnPW4oMjEpLHk9bi5uKGcpLGI9bigxMiksXz1uLm4oYiksdz1uKDE1KSx4PW4ubih3KSxFPShuKDM2KSxuKDI5KSksUz1uLm4oRSksQz1uKDIwKSxBPW4ubihDKSxPPW4oMjA5KSxrPW4ubihPKSxqPW4oMTkpLFQ9bi5uKGopLEk9big3NCksUD1uLm4oSSksTj0obigzMSksbigzMikpLE09bi5uKE4pLFI9bigxNyksRD1uLm4oUiksTD1uKDU4KSxCPW4ubihMKSxGPW4oMTA0KSxVPW4ubihGKSxxPW4oMTAxKSx6PW4ubihxKSxWPW4oMSksVz1uLm4oViksSD1uKDUwMyksJD1uKDUwNCksSj1uLm4oJCksSz1uKDI4NCksWT1uLm4oSyksRz1uKDI4NSksWj1uLm4oRyksWD1uKDUwNSksUT1uLm4oWCksZWU9bigzNDYpLHRlPW4ubihlZSksbmU9bigxMjMpLHJlPW4ubihuZSksb2U9bigxNzEpLGFlPW4ubihvZSksaWU9bigxNDcpLHNlPW4oMjYpLHVlPW4oNTA3KSxjZT1uLm4odWUpLGxlPW4oMTUwKSxwZT1uKDEyNSksZmU9bi5uKHBlKSxoZT1uKDUwOCksZGU9bi5uKGhlKSxtZT1uKDczKSx2ZT0iZGVmYXVsdCIsZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIFcuYS5JdGVyYWJsZS5pc0l0ZXJhYmxlKGUpfTtmdW5jdGlvbiB5ZShlKXtyZXR1cm4geGUoZSk/Z2UoZSk/ZS50b0pTKCk6ZTp7fX1mdW5jdGlvbiBiZShlKXt2YXIgdCxuO2lmKGdlKGUpKXJldHVybiBlO2lmKGUgaW5zdGFuY2VvZiBzZS5hLkZpbGUpcmV0dXJuIGU7aWYoIXhlKGUpKXJldHVybiBlO2lmKGwoKShlKSlyZXR1cm4gZigpKG49Vy5hLlNlcShlKSkuY2FsbChuLGJlKS50b0xpc3QoKTtpZihhZSgpKGQoKShlKSkpe3ZhciByLG89ZnVuY3Rpb24oZSl7aWYoIWFlKCkoZCgpKGUpKSlyZXR1cm4gZTt2YXIgdCxuPXt9LHI9Il8qKltdIixvPXt9LGE9dSgpKGQoKShlKS5jYWxsKGUpKTt0cnl7Zm9yKGEucygpOyEodD1hLm4oKSkuZG9uZTspe3ZhciBpPXQudmFsdWU7aWYobltpWzBdXXx8b1tpWzBdXSYmb1tpWzBdXS5jb250YWluc011bHRpcGxlKXt2YXIgcyxjLGwscDtpZighb1tpWzBdXSlvW2lbMF1dPXtjb250YWluc011bHRpcGxlOiEwLGxlbmd0aDoxfSxuW3YoKShsPXYoKShwPSIiLmNvbmNhdChpWzBdKSkuY2FsbChwLHIpKS5jYWxsKGwsb1tpWzBdXS5sZW5ndGgpXT1uW2lbMF1dLGRlbGV0ZSBuW2lbMF1dO29baVswXV0ubGVuZ3RoKz0xLG5bdigpKHM9digpKGM9IiIuY29uY2F0KGlbMF0pKS5jYWxsKGMscikpLmNhbGwocyxvW2lbMF1dLmxlbmd0aCldPWlbMV19ZWxzZSBuW2lbMF1dPWlbMV19fWNhdGNoKGUpe2EuZShlKX1maW5hbGx5e2EuZigpfXJldHVybiBufShlKTtyZXR1cm4gZigpKHI9Vy5hLk9yZGVyZWRNYXAobykpLmNhbGwocixiZSl9cmV0dXJuIGYoKSh0PVcuYS5PcmRlcmVkTWFwKGUpKS5jYWxsKHQsYmUpfWZ1bmN0aW9uIF9lKGUpe3JldHVybiBsKCkoZSk/ZTpbZV19ZnVuY3Rpb24gd2UoZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGV9ZnVuY3Rpb24geGUoZSl7cmV0dXJuISFlJiYib2JqZWN0Ij09PWkoKShlKX1mdW5jdGlvbiBFZShlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZX1mdW5jdGlvbiBTZShlKXtyZXR1cm4gbCgpKGUpfXZhciBDZT1aLmE7ZnVuY3Rpb24gQWUoZSx0KXt2YXIgbjtyZXR1cm4gUygpKG49eCgpKGUpKS5jYWxsKG4sKGZ1bmN0aW9uKG4scil7cmV0dXJuIG5bcl09dChlW3JdLHIpLG59KSx7fSl9ZnVuY3Rpb24gT2UoZSx0KXt2YXIgbjtyZXR1cm4gUygpKG49eCgpKGUpKS5jYWxsKG4sKGZ1bmN0aW9uKG4scil7dmFyIG89dChlW3JdLHIpO3JldHVybiBvJiYib2JqZWN0Ij09PWkoKShvKSYmQSgpKG4sbyksbn0pLHt9KX1mdW5jdGlvbiBrZShlKXtyZXR1cm4gZnVuY3Rpb24odCl7dC5kaXNwYXRjaCx0LmdldFN0YXRlO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG4/bihlKCkpOnQobil9fX19ZnVuY3Rpb24gamUoZSl7dmFyIHQsbj1lLmtleVNlcSgpO3JldHVybiBuLmNvbnRhaW5zKHZlKT92ZTprKCkodD1fKCkobikuY2FsbChuLChmdW5jdGlvbihlKXtyZXR1cm4iMiI9PT0oZSsiIilbMF19KSkpLmNhbGwodCkuZmlyc3QoKX1mdW5jdGlvbiBUZShlLHQpe2lmKCFXLmEuSXRlcmFibGUuaXNJdGVyYWJsZShlKSlyZXR1cm4gVy5hLkxpc3QoKTt2YXIgbj1lLmdldEluKGwoKSh0KT90Olt0XSk7cmV0dXJuIFcuYS5MaXN0LmlzTGlzdChuKT9uOlcuYS5MaXN0KCl9ZnVuY3Rpb24gSWUoZSl7dmFyIHQsbj1bL2ZpbGVuYW1lXCo9W14nXSsnXHcqJyIoW14iXSspIjs/L2ksL2ZpbGVuYW1lXCo9W14nXSsnXHcqJyhbXjtdKyk7Py9pLC9maWxlbmFtZT0iKFteO10qKTs/Ii9pLC9maWxlbmFtZT0oW147XSopOz8vaV07aWYoUCgpKG4pLmNhbGwobiwoZnVuY3Rpb24obil7cmV0dXJuIG51bGwhPT0odD1uLmV4ZWMoZSkpfSkpLG51bGwhPT10JiZ0Lmxlbmd0aD4xKXRyeXtyZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHRbMV0pfWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoZSl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gUGUoZSl7cmV0dXJuIHQ9ZS5yZXBsYWNlKC9cLlteLi9dKiQvLCIiKSxZKCkoSigpKHQpKTt2YXIgdH1mdW5jdGlvbiBOZShlLHQsbixyLGEpe2lmKCF0KXJldHVybltdO3ZhciBzPVtdLHU9dC5nZXQoIm51bGxhYmxlIiksYz10LmdldCgicmVxdWlyZWQiKSxwPXQuZ2V0KCJtYXhpbXVtIiksaD10LmdldCgibWluaW11bSIpLGQ9dC5nZXQoInR5cGUiKSxtPXQuZ2V0KCJmb3JtYXQiKSxnPXQuZ2V0KCJtYXhMZW5ndGgiKSxiPXQuZ2V0KCJtaW5MZW5ndGgiKSx3PXQuZ2V0KCJ1bmlxdWVJdGVtcyIpLHg9dC5nZXQoIm1heEl0ZW1zIiksRT10LmdldCgibWluSXRlbXMiKSxTPXQuZ2V0KCJwYXR0ZXJuIiksQz1ufHwhMD09PWMsQT1udWxsIT1lO2lmKHUmJm51bGw9PT1lfHwhZHx8IShDfHxBJiYiYXJyYXkiPT09ZHx8ISghQyYmIUEpKSlyZXR1cm5bXTt2YXIgTz0ic3RyaW5nIj09PWQmJmUsaz0iYXJyYXkiPT09ZCYmbCgpKGUpJiZlLmxlbmd0aCxqPSJhcnJheSI9PT1kJiZXLmEuTGlzdC5pc0xpc3QoZSkmJmUuY291bnQoKSxUPVtPLGssaiwiYXJyYXkiPT09ZCYmInN0cmluZyI9PXR5cGVvZiBlJiZlLCJmaWxlIj09PWQmJmUgaW5zdGFuY2VvZiBzZS5hLkZpbGUsImJvb2xlYW4iPT09ZCYmKGV8fCExPT09ZSksIm51bWJlciI9PT1kJiYoZXx8MD09PWUpLCJpbnRlZ2VyIj09PWQmJihlfHwwPT09ZSksIm9iamVjdCI9PT1kJiYib2JqZWN0Ij09PWkoKShlKSYmbnVsbCE9PWUsIm9iamVjdCI9PT1kJiYic3RyaW5nIj09dHlwZW9mIGUmJmVdLEk9UCgpKFQpLmNhbGwoVCwoZnVuY3Rpb24oZSl7cmV0dXJuISFlfSkpO2lmKEMmJiFJJiYhcilyZXR1cm4gcy5wdXNoKCJSZXF1aXJlZCBmaWVsZCBpcyBub3QgcHJvdmlkZWQiKSxzO2lmKCJvYmplY3QiPT09ZCYmKG51bGw9PT1hfHwiYXBwbGljYXRpb24vanNvbiI9PT1hKSl7dmFyIE4sTT1lO2lmKCJzdHJpbmciPT10eXBlb2YgZSl0cnl7TT1KU09OLnBhcnNlKGUpfWNhdGNoKGUpe3JldHVybiBzLnB1c2goIlBhcmFtZXRlciBzdHJpbmcgdmFsdWUgbXVzdCBiZSB2YWxpZCBKU09OIiksc31pZih0JiZ0LmhhcygicmVxdWlyZWQiKSYmRWUoYy5pc0xpc3QpJiZjLmlzTGlzdCgpJiZ5KCkoYykuY2FsbChjLChmdW5jdGlvbihlKXt2b2lkIDA9PT1NW2VdJiZzLnB1c2goe3Byb3BLZXk6ZSxlcnJvcjoiUmVxdWlyZWQgcHJvcGVydHkgbm90IGZvdW5kIn0pfSkpLHQmJnQuaGFzKCJwcm9wZXJ0aWVzIikpeSgpKE49dC5nZXQoInByb3BlcnRpZXMiKSkuY2FsbChOLChmdW5jdGlvbihlLHQpe3ZhciBuPU5lKE1bdF0sZSwhMSxyLGEpO3MucHVzaC5hcHBseShzLG8oKShmKCkobikuY2FsbChuLChmdW5jdGlvbihlKXtyZXR1cm57cHJvcEtleTp0LGVycm9yOmV9fSkpKSl9KSl9aWYoUyl7dmFyIFI9ZnVuY3Rpb24oZSx0KXtpZighbmV3IFJlZ0V4cCh0KS50ZXN0KGUpKXJldHVybiJWYWx1ZSBtdXN0IGZvbGxvdyBwYXR0ZXJuICIrdH0oZSxTKTtSJiZzLnB1c2goUil9aWYoRSYmImFycmF5Ij09PWQpe3ZhciBEPWZ1bmN0aW9uKGUsdCl7dmFyIG47aWYoIWUmJnQ+PTF8fGUmJmUubGVuZ3RoPHQpcmV0dXJuIHYoKShuPSJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgIi5jb25jYXQodCwiIGl0ZW0iKSkuY2FsbChuLDE9PT10PyIiOiJzIil9KGUsRSk7RCYmcy5wdXNoKEQpfWlmKHgmJiJhcnJheSI9PT1kKXt2YXIgTD1mdW5jdGlvbihlLHQpe3ZhciBuO2lmKGUmJmUubGVuZ3RoPnQpcmV0dXJuIHYoKShuPSJBcnJheSBtdXN0IG5vdCBjb250YWluIG1vcmUgdGhlbiAiLmNvbmNhdCh0LCIgaXRlbSIpKS5jYWxsKG4sMT09PXQ/IiI6InMiKX0oZSx4KTtMJiZzLnB1c2goe25lZWRSZW1vdmU6ITAsZXJyb3I6TH0pfWlmKHcmJiJhcnJheSI9PT1kKXt2YXIgQj1mdW5jdGlvbihlLHQpe2lmKGUmJigidHJ1ZSI9PT10fHwhMD09PXQpKXt2YXIgbj1PYmplY3QoVi5mcm9tSlMpKGUpLHI9bi50b1NldCgpO2lmKGUubGVuZ3RoPnIuc2l6ZSl7dmFyIG89T2JqZWN0KFYuU2V0KSgpO2lmKHkoKShuKS5jYWxsKG4sKGZ1bmN0aW9uKGUsdCl7XygpKG4pLmNhbGwobiwoZnVuY3Rpb24odCl7cmV0dXJuIEVlKHQuZXF1YWxzKT90LmVxdWFscyhlKTp0PT09ZX0pKS5zaXplPjEmJihvPW8uYWRkKHQpKX0pKSwwIT09by5zaXplKXJldHVybiBmKCkobykuY2FsbChvLChmdW5jdGlvbihlKXtyZXR1cm57aW5kZXg6ZSxlcnJvcjoiTm8gZHVwbGljYXRlcyBhbGxvd2VkLiJ9fSkpLnRvQXJyYXkoKX19fShlLHcpO0ImJnMucHVzaC5hcHBseShzLG8oKShCKSl9aWYoZ3x8MD09PWcpe3ZhciBGPWZ1bmN0aW9uKGUsdCl7dmFyIG47aWYoZS5sZW5ndGg+dClyZXR1cm4gdigpKG49IlZhbHVlIG11c3QgYmUgbm8gbG9uZ2VyIHRoYW4gIi5jb25jYXQodCwiIGNoYXJhY3RlciIpKS5jYWxsKG4sMSE9PXQ/InMiOiIiKX0oZSxnKTtGJiZzLnB1c2goRil9aWYoYil7dmFyIFU9ZnVuY3Rpb24oZSx0KXt2YXIgbjtpZihlLmxlbmd0aDx0KXJldHVybiB2KCkobj0iVmFsdWUgbXVzdCBiZSBhdCBsZWFzdCAiLmNvbmNhdCh0LCIgY2hhcmFjdGVyIikpLmNhbGwobiwxIT09dD8icyI6IiIpfShlLGIpO1UmJnMucHVzaChVKX1pZihwfHwwPT09cCl7dmFyIHE9ZnVuY3Rpb24oZSx0KXtpZihlPnQpcmV0dXJuIlZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICIuY29uY2F0KHQpfShlLHApO3EmJnMucHVzaChxKX1pZihofHwwPT09aCl7dmFyIHo9ZnVuY3Rpb24oZSx0KXtpZihlPHQpcmV0dXJuIlZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICIuY29uY2F0KHQpfShlLGgpO3omJnMucHVzaCh6KX1pZigic3RyaW5nIj09PWQpe3ZhciBIO2lmKCEoSD0iZGF0ZS10aW1lIj09PW0/ZnVuY3Rpb24oZSl7aWYoaXNOYU4oRGF0ZS5wYXJzZShlKSkpcmV0dXJuIlZhbHVlIG11c3QgYmUgYSBEYXRlVGltZSJ9KGUpOiJ1dWlkIj09PW0/ZnVuY3Rpb24oZSl7aWYoZT1lLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSwhL15beyhdP1swLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfVspfV0/JC8udGVzdChlKSlyZXR1cm4iVmFsdWUgbXVzdCBiZSBhIEd1aWQifShlKTpmdW5jdGlvbihlKXtpZihlJiYic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIlZhbHVlIG11c3QgYmUgYSBzdHJpbmcifShlKSkpcmV0dXJuIHM7cy5wdXNoKEgpfWVsc2UgaWYoImJvb2xlYW4iPT09ZCl7dmFyICQ9ZnVuY3Rpb24oZSl7aWYoInRydWUiIT09ZSYmImZhbHNlIiE9PWUmJiEwIT09ZSYmITEhPT1lKXJldHVybiJWYWx1ZSBtdXN0IGJlIGEgYm9vbGVhbiJ9KGUpO2lmKCEkKXJldHVybiBzO3MucHVzaCgkKX1lbHNlIGlmKCJudW1iZXIiPT09ZCl7dmFyIEo9ZnVuY3Rpb24oZSl7aWYoIS9eLT9cZCsoXC4/XGQrKT8kLy50ZXN0KGUpKXJldHVybiJWYWx1ZSBtdXN0IGJlIGEgbnVtYmVyIn0oZSk7aWYoIUopcmV0dXJuIHM7cy5wdXNoKEopfWVsc2UgaWYoImludGVnZXIiPT09ZCl7dmFyIEs9ZnVuY3Rpb24oZSl7aWYoIS9eLT9cZCskLy50ZXN0KGUpKXJldHVybiJWYWx1ZSBtdXN0IGJlIGFuIGludGVnZXIifShlKTtpZighSylyZXR1cm4gcztzLnB1c2goSyl9ZWxzZSBpZigiYXJyYXkiPT09ZCl7aWYoIWsmJiFqKXJldHVybiBzO2UmJnkoKShlKS5jYWxsKGUsKGZ1bmN0aW9uKGUsbil7dmFyIGk9TmUoZSx0LmdldCgiaXRlbXMiKSwhMSxyLGEpO3MucHVzaC5hcHBseShzLG8oKShmKCkoaSkuY2FsbChpLChmdW5jdGlvbihlKXtyZXR1cm57aW5kZXg6bixlcnJvcjplfX0pKSkpfSkpfWVsc2UgaWYoImZpbGUiPT09ZCl7dmFyIFk9ZnVuY3Rpb24oZSl7aWYoZSYmIShlIGluc3RhbmNlb2Ygc2UuYS5GaWxlKSlyZXR1cm4iVmFsdWUgbXVzdCBiZSBhIGZpbGUifShlKTtpZighWSlyZXR1cm4gcztzLnB1c2goWSl9cmV0dXJuIHN9dmFyIE1lPWZ1bmN0aW9uKGUsdCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LHI9bi5pc09BUzMsbz12b2lkIDAhPT1yJiZyLGE9bi5ieXBhc3NSZXF1aXJlZENoZWNrLGk9dm9pZCAwIT09YSYmYSxzPWUuZ2V0KCJyZXF1aXJlZCIpLHU9T2JqZWN0KGxlLmEpKGUse2lzT0FTMzpvfSksYz11LnNjaGVtYSxsPXUucGFyYW1ldGVyQ29udGVudE1lZGlhVHlwZTtyZXR1cm4gTmUodCxjLHMsaSxsKX0sUmU9ZnVuY3Rpb24oZSx0LG4pe2lmKGUmJighZS54bWx8fCFlLnhtbC5uYW1lKSl7aWYoZS54bWw9ZS54bWx8fHt9LCFlLiQkcmVmKXJldHVybiBlLnR5cGV8fGUuaXRlbXN8fGUucHJvcGVydGllc3x8ZS5hZGRpdGlvbmFsUHJvcGVydGllcz8nPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz5cblx4M2MhLS0gWE1MIGV4YW1wbGUgY2Fubm90IGJlIGdlbmVyYXRlZDsgcm9vdCBlbGVtZW50IG5hbWUgaXMgdW5kZWZpbmVkIC0tXHgzZSc6bnVsbDt2YXIgcj1lLiQkcmVmLm1hdGNoKC9cUypcLyhcUyspJC8pO2UueG1sLm5hbWU9clsxXX1yZXR1cm4gT2JqZWN0KGllLm1lbW9pemVkQ3JlYXRlWE1MRXhhbXBsZSkoZSx0LG4pfSxEZT1be3doZW46L2pzb24vLHNob3VsZFN0cmluZ2lmeVR5cGVzOlsic3RyaW5nIl19XSxMZT1bIm9iamVjdCJdLEJlPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBhPU9iamVjdChpZS5tZW1vaXplZFNhbXBsZUZyb21TY2hlbWEpKGUsdCxyKSxzPWkoKShhKSx1PVMoKShEZSkuY2FsbChEZSwoZnVuY3Rpb24oZSx0KXt2YXIgcjtyZXR1cm4gdC53aGVuLnRlc3Qobik/digpKHI9W10pLmNhbGwocixvKCkoZSksbygpKHQuc2hvdWxkU3RyaW5naWZ5VHlwZXMpKTplfSksTGUpO3JldHVybiB0ZSgpKHUsKGZ1bmN0aW9uKGUpe3JldHVybiBlPT09c30pKT9NKCkoYSxudWxsLDIpOmF9LEZlPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvLGE9QmUoZSx0LG4scik7dHJ5eyJcbiI9PT0obz1tZS5hLmR1bXAobWUuYS5sb2FkKGEpLHtsaW5lV2lkdGg6LTF9KSlbby5sZW5ndGgtMV0mJihvPVQoKShvKS5jYWxsKG8sMCxvLmxlbmd0aC0xKSl9Y2F0Y2goZSl7cmV0dXJuIGNvbnNvbGUuZXJyb3IoZSksImVycm9yOiBjb3VsZCBub3QgZ2VuZXJhdGUgeWFtbCBleGFtcGxlIn1yZXR1cm4gby5yZXBsYWNlKC9cdC9nLCIgICIpfSxVZT1mdW5jdGlvbihlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06IiIsbj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e30scj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106dm9pZCAwO3JldHVybiBlJiZFZShlLnRvSlMpJiYoZT1lLnRvSlMoKSksciYmRWUoci50b0pTKSYmKHI9ci50b0pTKCkpLC94bWwvLnRlc3QodCk/UmUoZSxuLHIpOi8oeWFtbHx5bWwpLy50ZXN0KHQpP0ZlKGUsbix0LHIpOkJlKGUsbix0LHIpfSxxZT1mdW5jdGlvbigpe3ZhciBlPXt9LHQ9c2UuYS5sb2NhdGlvbi5zZWFyY2g7aWYoIXQpcmV0dXJue307aWYoIiIhPXQpe3ZhciBuPXQuc3Vic3RyKDEpLnNwbGl0KCImIik7Zm9yKHZhciByIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJihyPW5bcl0uc3BsaXQoIj0iKSxlW2RlY29kZVVSSUNvbXBvbmVudChyWzBdKV09clsxXSYmZGVjb2RlVVJJQ29tcG9uZW50KHJbMV0pfHwiIil9cmV0dXJuIGV9LHplPWZ1bmN0aW9uKHQpe3JldHVybih0IGluc3RhbmNlb2YgZT90OmUuZnJvbSh0LnRvU3RyaW5nKCksInV0Zi04IikpLnRvU3RyaW5nKCJiYXNlNjQiKX0sVmU9e29wZXJhdGlvbnNTb3J0ZXI6e2FscGhhOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuZ2V0KCJwYXRoIikubG9jYWxlQ29tcGFyZSh0LmdldCgicGF0aCIpKX0sbWV0aG9kOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuZ2V0KCJtZXRob2QiKS5sb2NhbGVDb21wYXJlKHQuZ2V0KCJtZXRob2QiKSl9fSx0YWdzU29ydGVyOnthbHBoYTpmdW5jdGlvbihlLHQpe3JldHVybiBlLmxvY2FsZUNvbXBhcmUodCl9fX0sV2U9ZnVuY3Rpb24oZSl7dmFyIHQ9W107Zm9yKHZhciBuIGluIGUpe3ZhciByPWVbbl07dm9pZCAwIT09ciYmIiIhPT1yJiZ0LnB1c2goW24sIj0iLGVuY29kZVVSSUNvbXBvbmVudChyKS5yZXBsYWNlKC8lMjAvZywiKyIpXS5qb2luKCIiKSl9cmV0dXJuIHQuam9pbigiJiIpfSxIZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuISFRKCkobiwoZnVuY3Rpb24obil7cmV0dXJuIHJlKCkoZVtuXSx0W25dKX0pKX07ZnVuY3Rpb24gJGUoZSl7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBlfHwiIj09PWU/IiI6T2JqZWN0KEguc2FuaXRpemVVcmwpKGUpfWZ1bmN0aW9uIEplKGUpe3JldHVybiEoIWV8fEQoKShlKS5jYWxsKGUsImxvY2FsaG9zdCIpPj0wfHxEKCkoZSkuY2FsbChlLCIxMjcuMC4wLjEiKT49MHx8Im5vbmUiPT09ZSl9ZnVuY3Rpb24gS2UoZSl7aWYoIVcuYS5PcmRlcmVkTWFwLmlzT3JkZXJlZE1hcChlKSlyZXR1cm4gbnVsbDtpZighZS5zaXplKXJldHVybiBudWxsO3ZhciB0PUIoKShlKS5jYWxsKGUsKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIFUoKSh0KS5jYWxsKHQsIjIiKSYmeCgpKGUuZ2V0KCJjb250ZW50Iil8fHt9KS5sZW5ndGg+MH0pKSxuPWUuZ2V0KCJkZWZhdWx0Iil8fFcuYS5PcmRlcmVkTWFwKCkscj0obi5nZXQoImNvbnRlbnQiKXx8Vy5hLk9yZGVyZWRNYXAoKSkua2V5U2VxKCkudG9KUygpLmxlbmd0aD9uOm51bGw7cmV0dXJuIHR8fHJ9dmFyIFllPWZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZXx8ZSBpbnN0YW5jZW9mIFN0cmluZz96KCkoZSkuY2FsbChlKS5yZXBsYWNlKC9ccy9nLCIlMjAiKToiIn0sR2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGNlKCkoWWUoZSkucmVwbGFjZSgvJTIwL2csIl8iKSl9LFplPWZ1bmN0aW9uKGUpe3JldHVybiBfKCkoZSkuY2FsbChlLChmdW5jdGlvbihlLHQpe3JldHVybi9eeC0vLnRlc3QodCl9KSl9LFhlPWZ1bmN0aW9uKGUpe3JldHVybiBfKCkoZSkuY2FsbChlLChmdW5jdGlvbihlLHQpe3JldHVybi9ecGF0dGVybnxtYXhMZW5ndGh8bWluTGVuZ3RofG1heGltdW18bWluaW11bS8udGVzdCh0KX0pKX07ZnVuY3Rpb24gUWUoZSx0KXt2YXIgbixyPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpmdW5jdGlvbigpe3JldHVybiEwfTtpZigib2JqZWN0IiE9PWkoKShlKXx8bCgpKGUpfHxudWxsPT09ZXx8IXQpcmV0dXJuIGU7dmFyIG89QSgpKHt9LGUpO3JldHVybiB5KCkobj14KCkobykpLmNhbGwobiwoZnVuY3Rpb24oZSl7ZT09PXQmJnIob1tlXSxlKT9kZWxldGUgb1tlXTpvW2VdPVFlKG9bZV0sdCxyKX0pKSxvfWZ1bmN0aW9uIGV0KGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gZTtpZihlJiZlLnRvSlMmJihlPWUudG9KUygpKSwib2JqZWN0Ij09PWkoKShlKSYmbnVsbCE9PWUpdHJ5e3JldHVybiBNKCkoZSxudWxsLDIpfWNhdGNoKHQpe3JldHVybiBTdHJpbmcoZSl9cmV0dXJuIG51bGw9PWU/IiI6ZS50b1N0cmluZygpfWZ1bmN0aW9uIHR0KGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZT9lLnRvU3RyaW5nKCk6ZX1mdW5jdGlvbiBudChlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e30sbj10LnJldHVybkFsbCxyPXZvaWQgMCE9PW4mJm4sbz10LmFsbG93SGFzaGVzLGE9dm9pZCAwPT09b3x8bztpZighVy5hLk1hcC5pc01hcChlKSl0aHJvdyBuZXcgRXJyb3IoInBhcmFtVG9JZGVudGlmaWVyOiByZWNlaXZlZCBhIG5vbi1JbS5NYXAgcGFyYW1ldGVyIGFzIGlucHV0Iik7dmFyIGkscyx1LGM9ZS5nZXQoIm5hbWUiKSxsPWUuZ2V0KCJpbiIpLHA9W107ZSYmZS5oYXNoQ29kZSYmbCYmYyYmYSYmcC5wdXNoKHYoKShpPXYoKShzPSIiLmNvbmNhdChsLCIuIikpLmNhbGwocyxjLCIuaGFzaC0iKSkuY2FsbChpLGUuaGFzaENvZGUoKSkpO2wmJmMmJnAucHVzaCh2KCkodT0iIi5jb25jYXQobCwiLiIpKS5jYWxsKHUsYykpO3JldHVybiBwLnB1c2goYykscj9wOnBbMF18fCIifWZ1bmN0aW9uIHJ0KGUsdCl7dmFyIG4scj1udChlLHtyZXR1cm5BbGw6ITB9KTtyZXR1cm4gXygpKG49ZigpKHIpLmNhbGwociwoZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19KSkpLmNhbGwobiwoZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMCE9PWV9KSlbMF19ZnVuY3Rpb24gb3QoKXtyZXR1cm4gaXQoZmUoKSgzMikudG9TdHJpbmcoImJhc2U2NCIpKX1mdW5jdGlvbiBhdChlKXtyZXR1cm4gaXQoZGUoKSgic2hhMjU2IikudXBkYXRlKGUpLmRpZ2VzdCgiYmFzZTY0IikpfWZ1bmN0aW9uIGl0KGUpe3JldHVybiBlLnJlcGxhY2UoL1wrL2csIi0iKS5yZXBsYWNlKC9cLy9nLCJfIikucmVwbGFjZSgvPS9nLCIiKX12YXIgc3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIWV8fCEoIWdlKGUpfHwhZS5pc0VtcHR5KCkpfX0pLmNhbGwodGhpcyxuKDEzMikuQnVmZmVyKX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0sZS5leHBvcnRzLmRlZmF1bHQ9ZS5leHBvcnRzLGUuZXhwb3J0cy5fX2VzTW9kdWxlPSEwfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigyMzgpO2Z1bmN0aW9uIG8oZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIG89dFtuXTtvLmVudW1lcmFibGU9by5lbnVtZXJhYmxlfHwhMSxvLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gbyYmKG8ud3JpdGFibGU9ITApLHIoZSxvLmtleSxvKX19ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdCYmbyhlLnByb3RvdHlwZSx0KSxuJiZvKGUsbiksZX0sZS5leHBvcnRzLmRlZmF1bHQ9ZS5leHBvcnRzLGUuZXhwb3J0cy5fX2VzTW9kdWxlPSEwfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big4OTUpLG89big4OTkpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO2UucHJvdG90eXBlPXIodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiZvKGUsdCl9LGUuZXhwb3J0cy5kZWZhdWx0PWUuZXhwb3J0cyxlLmV4cG9ydHMuX19lc01vZHVsZT0hMH0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNDYxKSxvPW4oOTA2KSxhPW4oOTExKSxpPW4oOTEyKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9YSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLGE9byhlKTtpZih0KXt2YXIgcz1vKHRoaXMpLmNvbnN0cnVjdG9yO249cihhLGFyZ3VtZW50cyxzKX1lbHNlIG49YS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGkodGhpcyxuKX19LGUuZXhwb3J0cy5kZWZhdWx0PWUuZXhwb3J0cyxlLmV4cG9ydHMuX19lc01vZHVsZT0hMH0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09ZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiBlfSxlLmV4cG9ydHMuZGVmYXVsdD1lLmV4cG9ydHMsZS5leHBvcnRzLl9fZXNNb2R1bGU9ITB9LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9big5OTApKCl9LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9big1NzEpfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigzOTgpLG89big2MzIpLGE9bigxODcpLGk9bigzOTkpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiByKGUpfHxvKGUsdCl8fGEoZSx0KXx8aSgpfSxlLmV4cG9ydHMuZGVmYXVsdD1lLmV4cG9ydHMsZS5leHBvcnRzLl9fZXNNb2R1bGU9ITB9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDYyMyksbz1uKDM5MSksYT1uKDE4NyksaT1uKDYzMSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiByKGUpfHxvKGUpfHxhKGUpfHxpKCl9LGUuZXhwb3J0cy5kZWZhdWx0PWUuZXhwb3J0cyxlLmV4cG9ydHMuX19lc01vZHVsZT0hMH0sZnVuY3Rpb24oZSx0LG4pe2UuZXhwb3J0cz1uKDU3NCl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3JldHVybiBlPT09dH1mdW5jdGlvbiBvKGUsdCxuKXtpZihudWxsPT09dHx8bnVsbD09PW58fHQubGVuZ3RoIT09bi5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciByPXQubGVuZ3RoLG89MDtvPHI7bysrKWlmKCFlKHRbb10sbltvXSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gYShlKXt2YXIgdD1BcnJheS5pc0FycmF5KGVbMF0pP2VbMF06ZTtpZighdC5ldmVyeSgoZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGV9KSkpe3ZhciBuPXQubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGV9KSkuam9pbigiLCAiKTt0aHJvdyBuZXcgRXJyb3IoIlNlbGVjdG9yIGNyZWF0b3JzIGV4cGVjdCBhbGwgaW5wdXQtc2VsZWN0b3JzIHRvIGJlIGZ1bmN0aW9ucywgaW5zdGVhZCByZWNlaXZlZCB0aGUgZm9sbG93aW5nIHR5cGVzOiBbIituKyJdIil9cmV0dXJuIHR9bi5kKHQsImEiLChmdW5jdGlvbigpe3JldHVybiBpfSkpO3ZhciBpPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLG49QXJyYXkodD4xP3QtMTowKSxyPTE7cjx0O3IrKyluW3ItMV09YXJndW1lbnRzW3JdO3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLHI9QXJyYXkodCksbz0wO288dDtvKyspcltvXT1hcmd1bWVudHNbb107dmFyIGk9MCxzPXIucG9wKCksdT1hKHIpLGM9ZS5hcHBseSh2b2lkIDAsW2Z1bmN0aW9uKCl7cmV0dXJuIGkrKyxzLmFwcGx5KG51bGwsYXJndW1lbnRzKX1dLmNvbmNhdChuKSksbD1lKChmdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PXUubGVuZ3RoLG49MDtuPHQ7bisrKWUucHVzaCh1W25dLmFwcGx5KG51bGwsYXJndW1lbnRzKSk7cmV0dXJuIGMuYXBwbHkobnVsbCxlKX0pKTtyZXR1cm4gbC5yZXN1bHRGdW5jPXMsbC5kZXBlbmRlbmNpZXM9dSxsLnJlY29tcHV0YXRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIGl9LGwucmVzZXRSZWNvbXB1dGF0aW9ucz1mdW5jdGlvbigpe3JldHVybiBpPTB9LGx9fSgoZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnIsbj1udWxsLGE9bnVsbDtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbyh0LG4sYXJndW1lbnRzKXx8KGE9ZS5hcHBseShudWxsLGFyZ3VtZW50cykpLG49YXJndW1lbnRzLGF9fSkpfSxmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPW4oNjU5KX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTc3KSxvPW4oNTYzKTtmdW5jdGlvbiBhKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiByJiYic3ltYm9sIj09dHlwZW9mIG8/KGUuZXhwb3J0cz1hPWZ1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX0sZS5leHBvcnRzLmRlZmF1bHQ9ZS5leHBvcnRzLGUuZXhwb3J0cy5fX2VzTW9kdWxlPSEwKTooZS5leHBvcnRzPWE9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiByJiZlLmNvbnN0cnVjdG9yPT09ciYmZSE9PXIucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSxlLmV4cG9ydHMuZGVmYXVsdD1lLmV4cG9ydHMsZS5leHBvcnRzLl9fZXNNb2R1bGU9ITApLGEodCl9ZS5leHBvcnRzPWEsZS5leHBvcnRzLmRlZmF1bHQ9ZS5leHBvcnRzLGUuZXhwb3J0cy5fX2VzTW9kdWxlPSEwfSxmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPW4oNTg5KX0sZnVuY3Rpb24oZSx0LG4pe2UuZXhwb3J0cz1uKDU4Nyl9LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9big0MDApfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNDApLG89bigxMjcpLmYsYT1uKDM2MSksaT1uKDMzKSxzPW4oMTA5KSx1PW4oNjcpLGM9big1NSksbD1mdW5jdGlvbihlKXt2YXIgdD1mdW5jdGlvbih0LG4scil7aWYodGhpcyBpbnN0YW5jZW9mIGUpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIG5ldyBlO2Nhc2UgMTpyZXR1cm4gbmV3IGUodCk7Y2FzZSAyOnJldHVybiBuZXcgZSh0LG4pfXJldHVybiBuZXcgZSh0LG4scil9cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtyZXR1cm4gdC5wcm90b3R5cGU9ZS5wcm90b3R5cGUsdH07ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIG4scCxmLGgsZCxtLHYsZyx5PWUudGFyZ2V0LGI9ZS5nbG9iYWwsXz1lLnN0YXQsdz1lLnByb3RvLHg9Yj9yOl8/clt5XTooclt5XXx8e30pLnByb3RvdHlwZSxFPWI/aTppW3ldfHwoaVt5XT17fSksUz1FLnByb3RvdHlwZTtmb3IoZiBpbiB0KW49IWEoYj9mOnkrKF8/Ii4iOiIjIikrZixlLmZvcmNlZCkmJngmJmMoeCxmKSxkPUVbZl0sbiYmKG09ZS5ub1RhcmdldEdldD8oZz1vKHgsZikpJiZnLnZhbHVlOnhbZl0pLGg9biYmbT9tOnRbZl0sbiYmdHlwZW9mIGQ9PXR5cGVvZiBofHwodj1lLmJpbmQmJm4/cyhoLHIpOmUud3JhcCYmbj9sKGgpOncmJiJmdW5jdGlvbiI9PXR5cGVvZiBoP3MoRnVuY3Rpb24uY2FsbCxoKTpoLChlLnNoYW18fGgmJmguc2hhbXx8ZCYmZC5zaGFtKSYmdSh2LCJzaGFtIiwhMCksRVtmXT12LHcmJihjKGkscD15KyJQcm90b3R5cGUiKXx8dShpLHAse30pLGlbcF1bZl09aCxlLnJlYWwmJlMmJiFTW2ZdJiZ1KFMsZixoKSkpfX0sZnVuY3Rpb24oZSx0LG4pe2UuZXhwb3J0cz1uKDU5Mil9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDQ0NCksbz1uKDQ0NSksYT1uKDg0OSksaT1uKDg1MSkscz1uKDg1NSksdT1uKDg1NyksYz1uKDg2MiksbD1uKDIzOCkscD1uKDMpO2Z1bmN0aW9uIGYoZSx0KXt2YXIgbj1yKGUpO2lmKG8pe3ZhciBzPW8oZSk7dCYmKHM9YShzKS5jYWxsKHMsKGZ1bmN0aW9uKHQpe3JldHVybiBpKGUsdCkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scyl9cmV0dXJuIG59ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuLHI9bnVsbCE9YXJndW1lbnRzW3RdP2FyZ3VtZW50c1t0XTp7fTtpZih0JTIpcyhuPWYoT2JqZWN0KHIpLCEwKSkuY2FsbChuLChmdW5jdGlvbih0KXtwKGUsdCxyW3RdKX0pKTtlbHNlIGlmKHUpYyhlLHUocikpO2Vsc2V7dmFyIG87cyhvPWYoT2JqZWN0KHIpKSkuY2FsbChvLChmdW5jdGlvbih0KXtsKGUsdCxpKHIsdCkpfSkpfX1yZXR1cm4gZX0sZS5leHBvcnRzLmRlZmF1bHQ9ZS5leHBvcnRzLGUuZXhwb3J0cy5fX2VzTW9kdWxlPSEwfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixyLG8sYSxpLHMpe2lmKCFlKXt2YXIgdTtpZih2b2lkIDA9PT10KXU9bmV3IEVycm9yKCJNaW5pZmllZCBleGNlcHRpb24gb2NjdXJyZWQ7IHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgdGhlIGZ1bGwgZXJyb3IgbWVzc2FnZSBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLiIpO2Vsc2V7dmFyIGM9W24scixvLGEsaSxzXSxsPTA7KHU9bmV3IEVycm9yKHQucmVwbGFjZSgvJXMvZywoZnVuY3Rpb24oKXtyZXR1cm4gY1tsKytdfSkpKSkubmFtZT0iSW52YXJpYW50IFZpb2xhdGlvbiJ9dGhyb3cgdS5mcmFtZXNUb1BvcD0xLHV9fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt0LmE9ZnVuY3Rpb24oKXt2YXIgZT17bG9jYXRpb246e30saGlzdG9yeTp7fSxvcGVuOmZ1bmN0aW9uKCl7fSxjbG9zZTpmdW5jdGlvbigpe30sRmlsZTpmdW5jdGlvbigpe319O2lmKCJ1bmRlZmluZWQiPT10eXBlb2Ygd2luZG93KXJldHVybiBlO3RyeXtlPXdpbmRvdztmb3IodmFyIHQ9MCxuPVsiRmlsZSIsIkJsb2IiLCJGb3JtRGF0YSJdO3Q8bi5sZW5ndGg7dCsrKXt2YXIgcj1uW3RdO3IgaW4gd2luZG93JiYoZVtyXT13aW5kb3dbcl0pfX1jYXRjaChlKXtjb25zb2xlLmVycm9yKGUpfXJldHVybiBlfSgpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByLG89bigxKSxhPSI8PGFub255bW91cz4+IixpPWZ1bmN0aW9uKCl7aW52YXJpYW50KCExLCJJbW11dGFibGVQcm9wVHlwZXMgdHlwZSBjaGVja2luZyBjb2RlIGlzIHN0cmlwcGVkIGluIHByb2R1Y3Rpb24uIil9O2kuaXNSZXF1aXJlZD1pO3ZhciBzPWZ1bmN0aW9uKCl7cmV0dXJuIGl9O2Z1bmN0aW9uIHUoZSl7dmFyIHQ9dHlwZW9mIGU7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ImFycmF5IjplIGluc3RhbmNlb2YgUmVnRXhwPyJvYmplY3QiOmUgaW5zdGFuY2VvZiBvLkl0ZXJhYmxlPyJJbW11dGFibGUuIitlLnRvU291cmNlKCkuc3BsaXQoIiAiKVswXTp0fWZ1bmN0aW9uIGMoZSl7ZnVuY3Rpb24gdCh0LG4scixvLGkscyl7Zm9yKHZhciB1PWFyZ3VtZW50cy5sZW5ndGgsYz1BcnJheSh1PjY/dS02OjApLGw9NjtsPHU7bCsrKWNbbC02XT1hcmd1bWVudHNbbF07aWYocz1zfHxyLG89b3x8YSxudWxsIT1uW3JdKXJldHVybiBlLmFwcGx5KHZvaWQgMCxbbixyLG8saSxzXS5jb25jYXQoYykpO3ZhciBwPWk7cmV0dXJuIHQ/bmV3IEVycm9yKCJSZXF1aXJlZCAiK3ArIiBgIitzKyJgIHdhcyBub3Qgc3BlY2lmaWVkIGluIGAiK28rImAuIik6dm9pZCAwfXZhciBuPXQuYmluZChudWxsLCExKTtyZXR1cm4gbi5pc1JlcXVpcmVkPXQuYmluZChudWxsLCEwKSxufWZ1bmN0aW9uIGwoZSx0KXtyZXR1cm4gbj0iSXRlcmFibGUuIitlLHI9ZnVuY3Rpb24oZSl7cmV0dXJuIG8uSXRlcmFibGUuaXNJdGVyYWJsZShlKSYmdChlKX0sYygoZnVuY3Rpb24oZSx0LG8sYSxpKXt2YXIgcz1lW3RdO2lmKCFyKHMpKXt2YXIgYz11KHMpO3JldHVybiBuZXcgRXJyb3IoIkludmFsaWQgIithKyIgYCIraSsiYCBvZiB0eXBlIGAiK2MrImAgc3VwcGxpZWQgdG8gYCIrbysiYCwgZXhwZWN0ZWQgYCIrbisiYC4iKX1yZXR1cm4gbnVsbH0pKTt2YXIgbixyfShyPXtsaXN0T2Y6cyxtYXBPZjpzLG9yZGVyZWRNYXBPZjpzLHNldE9mOnMsb3JkZXJlZFNldE9mOnMsc3RhY2tPZjpzLGl0ZXJhYmxlT2Y6cyxyZWNvcmRPZjpzLHNoYXBlOnMsY29udGFpbnM6cyxtYXBDb250YWluczpzLG9yZGVyZWRNYXBDb250YWluczpzLGxpc3Q6aSxtYXA6aSxvcmRlcmVkTWFwOmksc2V0Omksb3JkZXJlZFNldDppLHN0YWNrOmksc2VxOmkscmVjb3JkOmksaXRlcmFibGU6aX0pLml0ZXJhYmxlLmluZGV4ZWQ9bCgiSW5kZXhlZCIsby5JdGVyYWJsZS5pc0luZGV4ZWQpLHIuaXRlcmFibGUua2V5ZWQ9bCgiS2V5ZWQiLG8uSXRlcmFibGUuaXNLZXllZCksZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDg5Myk7ZnVuY3Rpb24gbygpe3JldHVybiBlLmV4cG9ydHM9bz1yfHxmdW5jdGlvbihlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1hcmd1bWVudHNbdF07Zm9yKHZhciByIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJihlW3JdPW5bcl0pfXJldHVybiBlfSxlLmV4cG9ydHMuZGVmYXVsdD1lLmV4cG9ydHMsZS5leHBvcnRzLl9fZXNNb2R1bGU9ITAsby5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZS5leHBvcnRzPW8sZS5leHBvcnRzLmRlZmF1bHQ9ZS5leHBvcnRzLGUuZXhwb3J0cy5fX2VzTW9kdWxlPSEwfSxmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPW4oNTk0KX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgtMSxuPSJNaW5pZmllZCBSZWFjdCBlcnJvciAjIitlKyI7IHZpc2l0IGh0dHA6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy9lcnJvci1kZWNvZGVyLmh0bWw/aW52YXJpYW50PSIrZSxyPTA7cjx0O3IrKyluKz0iJmFyZ3NbXT0iK2VuY29kZVVSSUNvbXBvbmVudChhcmd1bWVudHNbcisxXSk7bis9IiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuIjt2YXIgbz1uZXcgRXJyb3Iobik7dGhyb3cgby5uYW1lPSJJbnZhcmlhbnQgVmlvbGF0aW9uIixvLmZyYW1lc1RvUG9wPTEsb319LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9big2NTIpfSxmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPW4oNTc2KX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9e319LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9big3OCk7ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpLG4uZCh0LCJpc09BUzMiLChmdW5jdGlvbigpe3JldHVybiBjfSkpLG4uZCh0LCJpc1N3YWdnZXIyIiwoZnVuY3Rpb24oKXtyZXR1cm4gbH0pKSxuLmQodCwiT0FTM0NvbXBvbmVudFdyYXBGYWN0b3J5IiwoZnVuY3Rpb24oKXtyZXR1cm4gcH0pKTt2YXIgcj1uKDI4KSxvPW4ubihyKSxhPW4oMTA0KSxpPW4ubihhKSxzPW4oMCksdT1uLm4ocyk7ZnVuY3Rpb24gYyhlKXt2YXIgdD1lLmdldCgib3BlbmFwaSIpO3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmKGkoKSh0KS5jYWxsKHQsIjMuMC4iKSYmdC5sZW5ndGg+NCl9ZnVuY3Rpb24gbChlKXt2YXIgdD1lLmdldCgic3dhZ2dlciIpO3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmaSgpKHQpLmNhbGwodCwiMi4wIil9ZnVuY3Rpb24gcChlKXtyZXR1cm4gZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24ocil7cmV0dXJuIG4mJm4uc3BlY1NlbGVjdG9ycyYmbi5zcGVjU2VsZWN0b3JzLnNwZWNKc29uP2Mobi5zcGVjU2VsZWN0b3JzLnNwZWNKc29uKCkpP3UuYS5jcmVhdGVFbGVtZW50KGUsbygpKHt9LHIsbix7T3JpOnR9KSk6dS5hLmNyZWF0ZUVsZW1lbnQodCxyKTooY29uc29sZS53YXJuKCJPQVMzIHdyYXBwZXI6IGNvdWxkbid0IGdldCBzcGVjIiksbnVsbCl9fX19LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9big1ODMpfSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbihlKXt0cnl7cmV0dXJuISFlKCl9Y2F0Y2goZSl7cmV0dXJuITB9fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLG89T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxhPU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGU7ZnVuY3Rpb24gaShlKXtpZihudWxsPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoIk9iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkIik7cmV0dXJuIE9iamVjdChlKX1lLmV4cG9ydHM9ZnVuY3Rpb24oKXt0cnl7aWYoIU9iamVjdC5hc3NpZ24pcmV0dXJuITE7dmFyIGU9bmV3IFN0cmluZygiYWJjIik7aWYoZVs1XT0iZGUiLCI1Ij09PU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpWzBdKXJldHVybiExO2Zvcih2YXIgdD17fSxuPTA7bjwxMDtuKyspdFsiXyIrU3RyaW5nLmZyb21DaGFyQ29kZShuKV09bjtpZigiMDEyMzQ1Njc4OSIhPT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0KS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfSkpLmpvaW4oIiIpKXJldHVybiExO3ZhciByPXt9O3JldHVybiJhYmNkZWZnaGlqa2xtbm9wcXJzdCIuc3BsaXQoIiIpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3JbZV09ZX0pKSwiYWJjZGVmZ2hpamtsbW5vcHFyc3QiPT09T2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSxyKSkuam9pbigiIil9Y2F0Y2goZSl7cmV0dXJuITF9fSgpP09iamVjdC5hc3NpZ246ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4scyx1PWkoZSksYz0xO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspe2Zvcih2YXIgbCBpbiBuPU9iamVjdChhcmd1bWVudHNbY10pKW8uY2FsbChuLGwpJiYodVtsXT1uW2xdKTtpZihyKXtzPXIobik7Zm9yKHZhciBwPTA7cDxzLmxlbmd0aDtwKyspYS5jYWxsKG4sc1twXSkmJih1W3NbcF1dPW5bc1twXV0pfX1yZXR1cm4gdX19LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9big4ODApfSxmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKHQpe3ZhciBuPWZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLk1hdGg9PU1hdGgmJmV9O2UuZXhwb3J0cz1uKCJvYmplY3QiPT10eXBlb2YgZ2xvYmFsVGhpcyYmZ2xvYmFsVGhpcyl8fG4oIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdyl8fG4oIm9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmKXx8bigib2JqZWN0Ij09dHlwZW9mIHQmJnQpfHxmdW5jdGlvbigpe3JldHVybiB0aGlzfSgpfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpfSkuY2FsbCh0aGlzLG4oNTEpKX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNDApLG89bigyMjUpLGE9big1NSksaT1uKDE4MSkscz1uKDIyNyksdT1uKDM2MiksYz1vKCJ3a3MiKSxsPXIuU3ltYm9sLHA9dT9sOmwmJmwud2l0aG91dFNldHRlcnx8aTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGEoYyxlKSYmKHN8fCJzdHJpbmciPT10eXBlb2YgY1tlXSl8fChzJiZhKGwsZSk/Y1tlXT1sW2VdOmNbZV09cCgiU3ltYm9sLiIrZSkpLGNbZV19fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigzMyk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiByW2UrIlByb3RvdHlwZSJdfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMjUxKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe3ZhciBvPW51bGw9PWU/dm9pZCAwOnIoZSx0KTtyZXR1cm4gdm9pZCAwPT09bz9uOm99fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigzMyksbz1uKDU1KSxhPW4oMjM0KSxpPW4oNjgpLmY7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PXIuU3ltYm9sfHwoci5TeW1ib2w9e30pO28odCxlKXx8aSh0LGUse3ZhbHVlOmEuZihlKX0pfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMwKSxvPW4oMTQyKSxhPW4oNDYyKSxpPShuKDI1KSxvLklEX0FUVFJJQlVURV9OQU1FKSxzPWEsdT0iX19yZWFjdEludGVybmFsSW5zdGFuY2UkIitNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTtmdW5jdGlvbiBjKGUsdCl7cmV0dXJuIDE9PT1lLm5vZGVUeXBlJiZlLmdldEF0dHJpYnV0ZShpKT09PVN0cmluZyh0KXx8OD09PWUubm9kZVR5cGUmJmUubm9kZVZhbHVlPT09IiByZWFjdC10ZXh0OiAiK3QrIiAifHw4PT09ZS5ub2RlVHlwZSYmZS5ub2RlVmFsdWU9PT0iIHJlYWN0LWVtcHR5OiAiK3QrIiAifWZ1bmN0aW9uIGwoZSl7Zm9yKHZhciB0O3Q9ZS5fcmVuZGVyZWRDb21wb25lbnQ7KWU9dDtyZXR1cm4gZX1mdW5jdGlvbiBwKGUsdCl7dmFyIG49bChlKTtuLl9ob3N0Tm9kZT10LHRbdV09bn1mdW5jdGlvbiBmKGUsdCl7aWYoIShlLl9mbGFncyZzLmhhc0NhY2hlZENoaWxkTm9kZXMpKXt2YXIgbj1lLl9yZW5kZXJlZENoaWxkcmVuLG89dC5maXJzdENoaWxkO2U6Zm9yKHZhciBhIGluIG4paWYobi5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGk9blthXSx1PWwoaSkuX2RvbUlEO2lmKDAhPT11KXtmb3IoO251bGwhPT1vO289by5uZXh0U2libGluZylpZihjKG8sdSkpe3AoaSxvKTtjb250aW51ZSBlfXIoIjMyIix1KX19ZS5fZmxhZ3N8PXMuaGFzQ2FjaGVkQ2hpbGROb2Rlc319ZnVuY3Rpb24gaChlKXtpZihlW3VdKXJldHVybiBlW3VdO2Zvcih2YXIgdCxuLHI9W107IWVbdV07KXtpZihyLnB1c2goZSksIWUucGFyZW50Tm9kZSlyZXR1cm4gbnVsbDtlPWUucGFyZW50Tm9kZX1mb3IoO2UmJihuPWVbdV0pO2U9ci5wb3AoKSl0PW4sci5sZW5ndGgmJmYobixlKTtyZXR1cm4gdH12YXIgZD17Z2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGU6aCxnZXRJbnN0YW5jZUZyb21Ob2RlOmZ1bmN0aW9uKGUpe3ZhciB0PWgoZSk7cmV0dXJuIG51bGwhPXQmJnQuX2hvc3ROb2RlPT09ZT90Om51bGx9LGdldE5vZGVGcm9tSW5zdGFuY2U6ZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09ZS5faG9zdE5vZGUmJnIoIjMzIiksZS5faG9zdE5vZGUpcmV0dXJuIGUuX2hvc3ROb2RlO2Zvcih2YXIgdD1bXTshZS5faG9zdE5vZGU7KXQucHVzaChlKSxlLl9ob3N0UGFyZW50fHxyKCIzNCIpLGU9ZS5faG9zdFBhcmVudDtmb3IoO3QubGVuZ3RoO2U9dC5wb3AoKSlmKGUsZS5faG9zdE5vZGUpO3JldHVybiBlLl9ob3N0Tm9kZX0scHJlY2FjaGVDaGlsZE5vZGVzOmYscHJlY2FjaGVOb2RlOnAsdW5jYWNoZU5vZGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5faG9zdE5vZGU7dCYmKGRlbGV0ZSB0W3VdLGUuX2hvc3ROb2RlPW51bGwpfX07ZS5leHBvcnRzPWR9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpLG4uZCh0LCJVUERBVEVfU1BFQyIsKGZ1bmN0aW9uKCl7cmV0dXJuIGVlfSkpLG4uZCh0LCJVUERBVEVfVVJMIiwoZnVuY3Rpb24oKXtyZXR1cm4gdGV9KSksbi5kKHQsIlVQREFURV9KU09OIiwoZnVuY3Rpb24oKXtyZXR1cm4gbmV9KSksbi5kKHQsIlVQREFURV9QQVJBTSIsKGZ1bmN0aW9uKCl7cmV0dXJuIHJlfSkpLG4uZCh0LCJVUERBVEVfRU1QVFlfUEFSQU1fSU5DTFVTSU9OIiwoZnVuY3Rpb24oKXtyZXR1cm4gb2V9KSksbi5kKHQsIlZBTElEQVRFX1BBUkFNUyIsKGZ1bmN0aW9uKCl7cmV0dXJuIGFlfSkpLG4uZCh0LCJTRVRfUkVTUE9OU0UiLChmdW5jdGlvbigpe3JldHVybiBpZX0pKSxuLmQodCwiU0VUX1JFUVVFU1QiLChmdW5jdGlvbigpe3JldHVybiBzZX0pKSxuLmQodCwiU0VUX01VVEFURURfUkVRVUVTVCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHVlfSkpLG4uZCh0LCJMT0dfUkVRVUVTVCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGNlfSkpLG4uZCh0LCJDTEVBUl9SRVNQT05TRSIsKGZ1bmN0aW9uKCl7cmV0dXJuIGxlfSkpLG4uZCh0LCJDTEVBUl9SRVFVRVNUIiwoZnVuY3Rpb24oKXtyZXR1cm4gcGV9KSksbi5kKHQsIkNMRUFSX1ZBTElEQVRFX1BBUkFNUyIsKGZ1bmN0aW9uKCl7cmV0dXJuIGZlfSkpLG4uZCh0LCJVUERBVEVfT1BFUkFUSU9OX01FVEFfVkFMVUUiLChmdW5jdGlvbigpe3JldHVybiBoZX0pKSxuLmQodCwiVVBEQVRFX1JFU09MVkVEIiwoZnVuY3Rpb24oKXtyZXR1cm4gZGV9KSksbi5kKHQsIlVQREFURV9SRVNPTFZFRF9TVUJUUkVFIiwoZnVuY3Rpb24oKXtyZXR1cm4gbWV9KSksbi5kKHQsIlNFVF9TQ0hFTUUiLChmdW5jdGlvbigpe3JldHVybiB2ZX0pKSxuLmQodCwidXBkYXRlU3BlYyIsKGZ1bmN0aW9uKCl7cmV0dXJuIGdlfSkpLG4uZCh0LCJ1cGRhdGVSZXNvbHZlZCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHllfSkpLG4uZCh0LCJ1cGRhdGVVcmwiLChmdW5jdGlvbigpe3JldHVybiBiZX0pKSxuLmQodCwidXBkYXRlSnNvblNwZWMiLChmdW5jdGlvbigpe3JldHVybiBfZX0pKSxuLmQodCwicGFyc2VUb0pzb24iLChmdW5jdGlvbigpe3JldHVybiB3ZX0pKSxuLmQodCwicmVzb2x2ZVNwZWMiLChmdW5jdGlvbigpe3JldHVybiBFZX0pKSxuLmQodCwicmVxdWVzdFJlc29sdmVkU3VidHJlZSIsKGZ1bmN0aW9uKCl7cmV0dXJuIEFlfSkpLG4uZCh0LCJjaGFuZ2VQYXJhbSIsKGZ1bmN0aW9uKCl7cmV0dXJuIE9lfSkpLG4uZCh0LCJjaGFuZ2VQYXJhbUJ5SWRlbnRpdHkiLChmdW5jdGlvbigpe3JldHVybiBrZX0pKSxuLmQodCwidXBkYXRlUmVzb2x2ZWRTdWJ0cmVlIiwoZnVuY3Rpb24oKXtyZXR1cm4gamV9KSksbi5kKHQsImludmFsaWRhdGVSZXNvbHZlZFN1YnRyZWVDYWNoZSIsKGZ1bmN0aW9uKCl7cmV0dXJuIFRlfSkpLG4uZCh0LCJ2YWxpZGF0ZVBhcmFtcyIsKGZ1bmN0aW9uKCl7cmV0dXJuIEllfSkpLG4uZCh0LCJ1cGRhdGVFbXB0eVBhcmFtSW5jbHVzaW9uIiwoZnVuY3Rpb24oKXtyZXR1cm4gUGV9KSksbi5kKHQsImNsZWFyVmFsaWRhdGVQYXJhbXMiLChmdW5jdGlvbigpe3JldHVybiBOZX0pKSxuLmQodCwiY2hhbmdlQ29uc3VtZXNWYWx1ZSIsKGZ1bmN0aW9uKCl7cmV0dXJuIE1lfSkpLG4uZCh0LCJjaGFuZ2VQcm9kdWNlc1ZhbHVlIiwoZnVuY3Rpb24oKXtyZXR1cm4gUmV9KSksbi5kKHQsInNldFJlc3BvbnNlIiwoZnVuY3Rpb24oKXtyZXR1cm4gRGV9KSksbi5kKHQsInNldFJlcXVlc3QiLChmdW5jdGlvbigpe3JldHVybiBMZX0pKSxuLmQodCwic2V0TXV0YXRlZFJlcXVlc3QiLChmdW5jdGlvbigpe3JldHVybiBCZX0pKSxuLmQodCwibG9nUmVxdWVzdCIsKGZ1bmN0aW9uKCl7cmV0dXJuIEZlfSkpLG4uZCh0LCJleGVjdXRlUmVxdWVzdCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFVlfSkpLG4uZCh0LCJleGVjdXRlIiwoZnVuY3Rpb24oKXtyZXR1cm4gcWV9KSksbi5kKHQsImNsZWFyUmVzcG9uc2UiLChmdW5jdGlvbigpe3JldHVybiB6ZX0pKSxuLmQodCwiY2xlYXJSZXF1ZXN0IiwoZnVuY3Rpb24oKXtyZXR1cm4gVmV9KSksbi5kKHQsInNldFNjaGVtZSIsKGZ1bmN0aW9uKCl7cmV0dXJuIFdlfSkpO3ZhciByPW4oMjQpLG89bi5uKHIpLGE9big1MyksaT1uLm4oYSkscz1uKDc1KSx1PW4ubihzKSxjPW4oMTgpLGw9bi5uKGMpLHA9bigzOSksZj1uLm4ocCksaD1uKDIzKSxkPW4ubihoKSxtPW4oNCksdj1uLm4obSksZz1uKDM0OCkseT1uLm4oZyksYj1uKDI5KSxfPW4ubihiKSx3PW4oMjEwKSx4PW4ubih3KSxFPW4oNjUpLFM9bi5uKEUpLEM9bigxMiksQT1uLm4oQyksTz1uKDIxMSksaz1uLm4oTyksaj1uKDE3KSxUPW4ubihqKSxJPW4oMjEpLFA9bi5uKEkpLE49bigyKSxNPW4ubihOKSxSPW4oMTUpLEQ9bi5uKFIpLEw9bigyMCksQj1uLm4oTCksRj1uKDM0OSksVT1uLm4oRikscT1uKDczKSx6PW4oMSksVj1uKDkyKSxXPW4ubihWKSxIPW4oMTQ2KSwkPW4oNTEwKSxKPW4ubigkKSxLPW4oNTExKSxZPW4ubihLKSxHPW4oMzUwKSxaPW4ubihHKSxYPW4oNSksUT1bInBhdGgiLCJtZXRob2QiXSxlZT0ic3BlY191cGRhdGVfc3BlYyIsdGU9InNwZWNfdXBkYXRlX3VybCIsbmU9InNwZWNfdXBkYXRlX2pzb24iLHJlPSJzcGVjX3VwZGF0ZV9wYXJhbSIsb2U9InNwZWNfdXBkYXRlX2VtcHR5X3BhcmFtX2luY2x1c2lvbiIsYWU9InNwZWNfdmFsaWRhdGVfcGFyYW0iLGllPSJzcGVjX3NldF9yZXNwb25zZSIsc2U9InNwZWNfc2V0X3JlcXVlc3QiLHVlPSJzcGVjX3NldF9tdXRhdGVkX3JlcXVlc3QiLGNlPSJzcGVjX2xvZ19yZXF1ZXN0IixsZT0ic3BlY19jbGVhcl9yZXNwb25zZSIscGU9InNwZWNfY2xlYXJfcmVxdWVzdCIsZmU9InNwZWNfY2xlYXJfdmFsaWRhdGVfcGFyYW0iLGhlPSJzcGVjX3VwZGF0ZV9vcGVyYXRpb25fbWV0YV92YWx1ZSIsZGU9InNwZWNfdXBkYXRlX3Jlc29sdmVkIixtZT0ic3BlY191cGRhdGVfcmVzb2x2ZWRfc3VidHJlZSIsdmU9InNldF9zY2hlbWUiO2Z1bmN0aW9uIGdlKGUpe3ZhciB0LG49KHQ9ZSxKKCkodCk/dDoiIikucmVwbGFjZSgvXHQvZywiICAiKTtpZigic3RyaW5nIj09dHlwZW9mIGUpcmV0dXJue3R5cGU6ZWUscGF5bG9hZDpufX1mdW5jdGlvbiB5ZShlKXtyZXR1cm57dHlwZTpkZSxwYXlsb2FkOmV9fWZ1bmN0aW9uIGJlKGUpe3JldHVybnt0eXBlOnRlLHBheWxvYWQ6ZX19ZnVuY3Rpb24gX2UoZSl7cmV0dXJue3R5cGU6bmUscGF5bG9hZDplfX12YXIgd2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPXQuc3BlY0FjdGlvbnMscj10LnNwZWNTZWxlY3RvcnMsbz10LmVyckFjdGlvbnMsYT1yLnNwZWNTdHIsaT1udWxsO3RyeXtlPWV8fGEoKSxvLmNsZWFyKHtzb3VyY2U6InBhcnNlciJ9KSxpPXEuYS5sb2FkKGUpfWNhdGNoKGUpe3JldHVybiBjb25zb2xlLmVycm9yKGUpLG8ubmV3U3BlY0Vycih7c291cmNlOiJwYXJzZXIiLGxldmVsOiJlcnJvciIsbWVzc2FnZTplLnJlYXNvbixsaW5lOmUubWFyayYmZS5tYXJrLmxpbmU/ZS5tYXJrLmxpbmUrMTp2b2lkIDB9KX1yZXR1cm4gaSYmIm9iamVjdCI9PT1sKCkoaSk/bi51cGRhdGVKc29uU3BlYyhpKTp7fX19LHhlPSExLEVlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciByPW4uc3BlY0FjdGlvbnMsbz1uLnNwZWNTZWxlY3RvcnMsYT1uLmVyckFjdGlvbnMsaT1uLmZuLHM9aS5mZXRjaCx1PWkucmVzb2x2ZSxjPWkuQVNULGw9dm9pZCAwPT09Yz97fTpjLHA9bi5nZXRDb25maWdzO3hlfHwoY29uc29sZS53YXJuKCJzcGVjQWN0aW9ucy5yZXNvbHZlU3BlYyBpcyBkZXByZWNhdGVkIHNpbmNlIHYzLjEwLjAgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB2NC4wLjA7IHVzZSByZXF1ZXN0UmVzb2x2ZWRTdWJ0cmVlIGluc3RlYWQhIikseGU9ITApO3ZhciBmPXAoKSxoPWYubW9kZWxQcm9wZXJ0eU1hY3JvLG09Zi5wYXJhbWV0ZXJNYWNybyxnPWYucmVxdWVzdEludGVyY2VwdG9yLGI9Zi5yZXNwb25zZUludGVyY2VwdG9yO3ZvaWQgMD09PWUmJihlPW8uc3BlY0pzb24oKSksdm9pZCAwPT09dCYmKHQ9by51cmwoKSk7dmFyIF89bC5nZXRMaW5lTnVtYmVyRm9yUGF0aD9sLmdldExpbmVOdW1iZXJGb3JQYXRoOmZ1bmN0aW9uKCl7fSx3PW8uc3BlY1N0cigpO3JldHVybiB1KHtmZXRjaDpzLHNwZWM6ZSxiYXNlRG9jOnQsbW9kZWxQcm9wZXJ0eU1hY3JvOmgscGFyYW1ldGVyTWFjcm86bSxyZXF1ZXN0SW50ZXJjZXB0b3I6ZyxyZXNwb25zZUludGVyY2VwdG9yOmJ9KS50aGVuKChmdW5jdGlvbihlKXt2YXIgdD1lLnNwZWMsbj1lLmVycm9ycztpZihhLmNsZWFyKHt0eXBlOiJ0aHJvd24ifSksZCgpKG4pJiZuLmxlbmd0aD4wKXt2YXIgbz12KCkobikuY2FsbChuLChmdW5jdGlvbihlKXtyZXR1cm4gY29uc29sZS5lcnJvcihlKSxlLmxpbmU9ZS5mdWxsUGF0aD9fKHcsZS5mdWxsUGF0aCk6bnVsbCxlLnBhdGg9ZS5mdWxsUGF0aD9lLmZ1bGxQYXRoLmpvaW4oIi4iKTpudWxsLGUubGV2ZWw9ImVycm9yIixlLnR5cGU9InRocm93biIsZS5zb3VyY2U9InJlc29sdmVyIix5KCkoZSwibWVzc2FnZSIse2VudW1lcmFibGU6ITAsdmFsdWU6ZS5tZXNzYWdlfSksZX0pKTthLm5ld1Rocm93bkVyckJhdGNoKG8pfXJldHVybiByLnVwZGF0ZVJlc29sdmVkKHQpfSkpfX0sU2U9W10sQ2U9WSgpKHUoKShmLmEubWFyaygoZnVuY3Rpb24gZSgpe3ZhciB0LG4scixvLGEsaSxzLGMsbCxwLGgsbSxnLGIsdyxFLEMsTztyZXR1cm4gZi5hLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOmlmKHQ9U2Uuc3lzdGVtKXtlLm5leHQ9NDticmVha31yZXR1cm4gY29uc29sZS5lcnJvcigiZGViUmVzb2x2ZVN1YnRyZWVzOiBkb24ndCBoYXZlIGEgc3lzdGVtIHRvIG9wZXJhdGUgb24sIGFib3J0aW5nLiIpLGUuYWJydXB0KCJyZXR1cm4iKTtjYXNlIDQ6aWYobj10LmVyckFjdGlvbnMscj10LmVyclNlbGVjdG9ycyxvPXQuZm4sYT1vLnJlc29sdmVTdWJ0cmVlLGk9by5mZXRjaCxzPW8uQVNULGM9dm9pZCAwPT09cz97fTpzLGw9dC5zcGVjU2VsZWN0b3JzLHA9dC5zcGVjQWN0aW9ucyxhKXtlLm5leHQ9ODticmVha31yZXR1cm4gY29uc29sZS5lcnJvcigiRXJyb3I6IFN3YWdnZXItQ2xpZW50IGRpZCBub3QgcHJvdmlkZSBhIGByZXNvbHZlU3VidHJlZWAgbWV0aG9kLCBkb2luZyBub3RoaW5nLiIpLGUuYWJydXB0KCJyZXR1cm4iKTtjYXNlIDg6cmV0dXJuIGg9Yy5nZXRMaW5lTnVtYmVyRm9yUGF0aD9jLmdldExpbmVOdW1iZXJGb3JQYXRoOmZ1bmN0aW9uKCl7fSxtPWwuc3BlY1N0cigpLGc9dC5nZXRDb25maWdzKCksYj1nLm1vZGVsUHJvcGVydHlNYWNybyx3PWcucGFyYW1ldGVyTWFjcm8sRT1nLnJlcXVlc3RJbnRlcmNlcHRvcixDPWcucmVzcG9uc2VJbnRlcmNlcHRvcixlLnByZXY9MTEsZS5uZXh0PTE0LF8oKShTZSkuY2FsbChTZSxmdW5jdGlvbigpe3ZhciBlPXUoKShmLmEubWFyaygoZnVuY3Rpb24gZSh0LG8pe3ZhciBzLGMscCxnLF8sTyxqLFQsSTtyZXR1cm4gZi5hLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLm5leHQ9Mix0O2Nhc2UgMjpyZXR1cm4gcz1lLnNlbnQsYz1zLnJlc3VsdE1hcCxwPXMuc3BlY1dpdGhDdXJyZW50U3VidHJlZXMsZS5uZXh0PTcsYShwLG8se2Jhc2VEb2M6bC51cmwoKSxtb2RlbFByb3BlcnR5TWFjcm86YixwYXJhbWV0ZXJNYWNybzp3LHJlcXVlc3RJbnRlcmNlcHRvcjpFLHJlc3BvbnNlSW50ZXJjZXB0b3I6Q30pO2Nhc2UgNzppZihnPWUuc2VudCxfPWcuZXJyb3JzLE89Zy5zcGVjLHIuYWxsRXJyb3JzKCkuc2l6ZSYmbi5jbGVhckJ5KChmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4idGhyb3duIiE9PWUuZ2V0KCJ0eXBlIil8fCJyZXNvbHZlciIhPT1lLmdldCgic291cmNlIil8fCF4KCkodD1lLmdldCgiZnVsbFBhdGgiKSkuY2FsbCh0LChmdW5jdGlvbihlLHQpe3JldHVybiBlPT09b1t0XXx8dm9pZCAwPT09b1t0XX0pKX0pKSxkKCkoXykmJl8ubGVuZ3RoPjAmJihqPXYoKShfKS5jYWxsKF8sKGZ1bmN0aW9uKGUpe3JldHVybiBlLmxpbmU9ZS5mdWxsUGF0aD9oKG0sZS5mdWxsUGF0aCk6bnVsbCxlLnBhdGg9ZS5mdWxsUGF0aD9lLmZ1bGxQYXRoLmpvaW4oIi4iKTpudWxsLGUubGV2ZWw9ImVycm9yIixlLnR5cGU9InRocm93biIsZS5zb3VyY2U9InJlc29sdmVyIix5KCkoZSwibWVzc2FnZSIse2VudW1lcmFibGU6ITAsdmFsdWU6ZS5tZXNzYWdlfSksZX0pKSxuLm5ld1Rocm93bkVyckJhdGNoKGopKSwhT3x8IWwuaXNPQVMzKCl8fCJjb21wb25lbnRzIiE9PW9bMF18fCJzZWN1cml0eVNjaGVtZXMiIT09b1sxXSl7ZS5uZXh0PTE1O2JyZWFrfXJldHVybiBlLm5leHQ9MTUsUy5hLmFsbCh2KCkoVD1BKCkoST1rKCkoTykpLmNhbGwoSSwoZnVuY3Rpb24oZSl7cmV0dXJuIm9wZW5JZENvbm5lY3QiPT09ZS50eXBlfSkpKS5jYWxsKFQsZnVuY3Rpb24oKXt2YXIgZT11KCkoZi5hLm1hcmsoKGZ1bmN0aW9uIGUodCl7dmFyIG4scjtyZXR1cm4gZi5hLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBuPXt1cmw6dC5vcGVuSWRDb25uZWN0VXJsLHJlcXVlc3RJbnRlcmNlcHRvcjpFLHJlc3BvbnNlSW50ZXJjZXB0b3I6Q30sZS5wcmV2PTEsZS5uZXh0PTQsaShuKTtjYXNlIDQ6KHI9ZS5zZW50KWluc3RhbmNlb2YgRXJyb3J8fHIuc3RhdHVzPj00MDA/Y29uc29sZS5lcnJvcihyLnN0YXR1c1RleHQrIiAiK24udXJsKTp0Lm9wZW5JZENvbm5lY3REYXRhPUpTT04ucGFyc2Uoci50ZXh0KSxlLm5leHQ9MTE7YnJlYWs7Y2FzZSA4OmUucHJldj04LGUudDA9ZS5jYXRjaCgxKSxjb25zb2xlLmVycm9yKGUudDApO2Nhc2UgMTE6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlLG51bGwsW1sxLDhdXSl9KSkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpKSk7Y2FzZSAxNTpyZXR1cm4gWigpKGMsbyxPKSxaKCkocCxvLE8pLGUuYWJydXB0KCJyZXR1cm4iLHtyZXN1bHRNYXA6YyxzcGVjV2l0aEN1cnJlbnRTdWJ0cmVlczpwfSk7Y2FzZSAxODpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUpfSkpKTtyZXR1cm4gZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fSgpLFMuYS5yZXNvbHZlKHtyZXN1bHRNYXA6KGwuc3BlY1Jlc29sdmVkU3VidHJlZShbXSl8fE9iamVjdCh6Lk1hcCkoKSkudG9KUygpLHNwZWNXaXRoQ3VycmVudFN1YnRyZWVzOmwuc3BlY0pzb24oKS50b0pTKCl9KSk7Y2FzZSAxNDpPPWUuc2VudCxkZWxldGUgU2Uuc3lzdGVtLFNlPVtdLGUubmV4dD0yMjticmVhaztjYXNlIDE5OmUucHJldj0xOSxlLnQwPWUuY2F0Y2goMTEpLGNvbnNvbGUuZXJyb3IoZS50MCk7Y2FzZSAyMjpwLnVwZGF0ZVJlc29sdmVkU3VidHJlZShbXSxPLnJlc3VsdE1hcCk7Y2FzZSAyMzpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUsbnVsbCxbWzExLDE5XV0pfSkpKSwzNSksQWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuO1QoKShuPXYoKShTZSkuY2FsbChTZSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuam9pbigiQEAiKX0pKSkuY2FsbChuLGUuam9pbigiQEAiKSk+LTF8fChTZS5wdXNoKGUpLFNlLnN5c3RlbT10LENlKCkpfX07ZnVuY3Rpb24gT2UoZSx0LG4scixvKXtyZXR1cm57dHlwZTpyZSxwYXlsb2FkOntwYXRoOmUsdmFsdWU6cixwYXJhbU5hbWU6dCxwYXJhbUluOm4saXNYbWw6b319fWZ1bmN0aW9uIGtlKGUsdCxuLHIpe3JldHVybnt0eXBlOnJlLHBheWxvYWQ6e3BhdGg6ZSxwYXJhbTp0LHZhbHVlOm4saXNYbWw6cn19fXZhciBqZT1mdW5jdGlvbihlLHQpe3JldHVybnt0eXBlOm1lLHBheWxvYWQ6e3BhdGg6ZSx2YWx1ZTp0fX19LFRlPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6bWUscGF5bG9hZDp7cGF0aDpbXSx2YWx1ZTpPYmplY3Qoei5NYXApKCl9fX0sSWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm57dHlwZTphZSxwYXlsb2FkOntwYXRoTWV0aG9kOmUsaXNPQVMzOnR9fX0sUGU9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJue3R5cGU6b2UscGF5bG9hZDp7cGF0aE1ldGhvZDplLHBhcmFtTmFtZTp0LHBhcmFtSW46bixpbmNsdWRlRW1wdHlWYWx1ZTpyfX19O2Z1bmN0aW9uIE5lKGUpe3JldHVybnt0eXBlOmZlLHBheWxvYWQ6e3BhdGhNZXRob2Q6ZX19fWZ1bmN0aW9uIE1lKGUsdCl7cmV0dXJue3R5cGU6aGUscGF5bG9hZDp7cGF0aDplLHZhbHVlOnQsa2V5OiJjb25zdW1lc192YWx1ZSJ9fX1mdW5jdGlvbiBSZShlLHQpe3JldHVybnt0eXBlOmhlLHBheWxvYWQ6e3BhdGg6ZSx2YWx1ZTp0LGtleToicHJvZHVjZXNfdmFsdWUifX19dmFyIERlPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm57cGF5bG9hZDp7cGF0aDplLG1ldGhvZDp0LHJlczpufSx0eXBlOmllfX0sTGU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybntwYXlsb2FkOntwYXRoOmUsbWV0aG9kOnQscmVxOm59LHR5cGU6c2V9fSxCZT1mdW5jdGlvbihlLHQsbil7cmV0dXJue3BheWxvYWQ6e3BhdGg6ZSxtZXRob2Q6dCxyZXE6bn0sdHlwZTp1ZX19LEZlPWZ1bmN0aW9uKGUpe3JldHVybntwYXlsb2FkOmUsdHlwZTpjZX19LFVlPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbixyLG89dC5mbixhPXQuc3BlY0FjdGlvbnMsaT10LnNwZWNTZWxlY3RvcnMscz10LmdldENvbmZpZ3MsYz10Lm9hczNTZWxlY3RvcnMsbD1lLnBhdGhOYW1lLHA9ZS5tZXRob2QsaD1lLm9wZXJhdGlvbixtPXMoKSxnPW0ucmVxdWVzdEludGVyY2VwdG9yLHk9bS5yZXNwb25zZUludGVyY2VwdG9yLGI9aC50b0pTKCk7aCYmaC5nZXQoInBhcmFtZXRlcnMiKSYmUCgpKG49QSgpKHI9aC5nZXQoInBhcmFtZXRlcnMiKSkuY2FsbChyLChmdW5jdGlvbihlKXtyZXR1cm4gZSYmITA9PT1lLmdldCgiYWxsb3dFbXB0eVZhbHVlIil9KSkpLmNhbGwobiwoZnVuY3Rpb24odCl7aWYoaS5wYXJhbWV0ZXJJbmNsdXNpb25TZXR0aW5nRm9yKFtsLHBdLHQuZ2V0KCJuYW1lIiksdC5nZXQoImluIikpKXtlLnBhcmFtZXRlcnM9ZS5wYXJhbWV0ZXJzfHx7fTt2YXIgbj1PYmplY3QoWC5CKSh0LGUucGFyYW1ldGVycyk7KCFufHxuJiYwPT09bi5zaXplKSYmKGUucGFyYW1ldGVyc1t0LmdldCgibmFtZSIpXT0iIil9fSkpO2lmKGUuY29udGV4dFVybD1XKCkoaS51cmwoKSkudG9TdHJpbmcoKSxiJiZiLm9wZXJhdGlvbklkP2Uub3BlcmF0aW9uSWQ9Yi5vcGVyYXRpb25JZDpiJiZsJiZwJiYoZS5vcGVyYXRpb25JZD1vLm9wSWQoYixsLHApKSxpLmlzT0FTMygpKXt2YXIgXyx3PU0oKShfPSIiLmNvbmNhdChsLCI6IikpLmNhbGwoXyxwKTtlLnNlcnZlcj1jLnNlbGVjdGVkU2VydmVyKHcpfHxjLnNlbGVjdGVkU2VydmVyKCk7dmFyIHg9Yy5zZXJ2ZXJWYXJpYWJsZXMoe3NlcnZlcjplLnNlcnZlcixuYW1lc3BhY2U6d30pLnRvSlMoKSxFPWMuc2VydmVyVmFyaWFibGVzKHtzZXJ2ZXI6ZS5zZXJ2ZXJ9KS50b0pTKCk7ZS5zZXJ2ZXJWYXJpYWJsZXM9RCgpKHgpLmxlbmd0aD94OkUsZS5yZXF1ZXN0Q29udGVudFR5cGU9Yy5yZXF1ZXN0Q29udGVudFR5cGUobCxwKSxlLnJlc3BvbnNlQ29udGVudFR5cGU9Yy5yZXNwb25zZUNvbnRlbnRUeXBlKGwscCl8fCIqLyoiO3ZhciBTLEM9Yy5yZXF1ZXN0Qm9keVZhbHVlKGwscCksTz1jLnJlcXVlc3RCb2R5SW5jbHVzaW9uU2V0dGluZyhsLHApO2lmKEMmJkMudG9KUyllLnJlcXVlc3RCb2R5PUEoKShTPXYoKShDKS5jYWxsKEMsKGZ1bmN0aW9uKGUpe3JldHVybiB6Lk1hcC5pc01hcChlKT9lLmdldCgidmFsdWUiKTplfSkpKS5jYWxsKFMsKGZ1bmN0aW9uKGUsdCl7cmV0dXJuKGQoKShlKT8wIT09ZS5sZW5ndGg6IU9iamVjdChYLnEpKGUpKXx8Ty5nZXQodCl9KSkudG9KUygpO2Vsc2UgZS5yZXF1ZXN0Qm9keT1DfXZhciBrPUIoKSh7fSxlKTtrPW8uYnVpbGRSZXF1ZXN0KGspLGEuc2V0UmVxdWVzdChlLnBhdGhOYW1lLGUubWV0aG9kLGspO3ZhciBqPWZ1bmN0aW9uKCl7dmFyIHQ9dSgpKGYuYS5tYXJrKChmdW5jdGlvbiB0KG4pe3ZhciByLG87cmV0dXJuIGYuYS53cmFwKChmdW5jdGlvbih0KXtmb3IoOzspc3dpdGNoKHQucHJldj10Lm5leHQpe2Nhc2UgMDpyZXR1cm4gdC5uZXh0PTIsZy5hcHBseSh1bmRlZmluZWQsW25dKTtjYXNlIDI6cmV0dXJuIHI9dC5zZW50LG89QigpKHt9LHIpLGEuc2V0TXV0YXRlZFJlcXVlc3QoZS5wYXRoTmFtZSxlLm1ldGhvZCxvKSx0LmFicnVwdCgicmV0dXJuIixyKTtjYXNlIDY6Y2FzZSJlbmQiOnJldHVybiB0LnN0b3AoKX19KSx0KX0pKSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCk7ZS5yZXF1ZXN0SW50ZXJjZXB0b3I9aixlLnJlc3BvbnNlSW50ZXJjZXB0b3I9eTt2YXIgVD1VKCkoKTtyZXR1cm4gby5leGVjdXRlKGUpLnRoZW4oKGZ1bmN0aW9uKHQpe3QuZHVyYXRpb249VSgpKCktVCxhLnNldFJlc3BvbnNlKGUucGF0aE5hbWUsZS5tZXRob2QsdCl9KSkuY2F0Y2goKGZ1bmN0aW9uKHQpeyJGYWlsZWQgdG8gZmV0Y2giPT09dC5tZXNzYWdlJiYodC5uYW1lPSIiLHQubWVzc2FnZT0nKipGYWlsZWQgdG8gZmV0Y2guKiogIFxuKipQb3NzaWJsZSBSZWFzb25zOioqIFxuICAtIENPUlMgXG4gIC0gTmV0d29yayBGYWlsdXJlIFxuICAtIFVSTCBzY2hlbWUgbXVzdCBiZSAiaHR0cCIgb3IgImh0dHBzIiBmb3IgQ09SUyByZXF1ZXN0LicpLGEuc2V0UmVzcG9uc2UoZS5wYXRoTmFtZSxlLm1ldGhvZCx7ZXJyb3I6ITAsZXJyOk9iamVjdChILnNlcmlhbGl6ZUVycm9yKSh0KX0pfSkpfX0scWU9ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30sdD1lLnBhdGgsbj1lLm1ldGhvZCxyPWkoKShlLFEpO3JldHVybiBmdW5jdGlvbihlKXt2YXIgYT1lLmZuLmZldGNoLGk9ZS5zcGVjU2VsZWN0b3JzLHM9ZS5zcGVjQWN0aW9ucyx1PWkuc3BlY0pzb25XaXRoUmVzb2x2ZWRTdWJ0cmVlcygpLnRvSlMoKSxjPWkub3BlcmF0aW9uU2NoZW1lKHQsbiksbD1pLmNvbnRlbnRUeXBlVmFsdWVzKFt0LG5dKS50b0pTKCkscD1sLnJlcXVlc3RDb250ZW50VHlwZSxmPWwucmVzcG9uc2VDb250ZW50VHlwZSxoPS94bWwvaS50ZXN0KHApLGQ9aS5wYXJhbWV0ZXJWYWx1ZXMoW3Qsbl0saCkudG9KUygpO3JldHVybiBzLmV4ZWN1dGVSZXF1ZXN0KG8oKShvKCkoe30scikse30se2ZldGNoOmEsc3BlYzp1LHBhdGhOYW1lOnQsbWV0aG9kOm4scGFyYW1ldGVyczpkLHJlcXVlc3RDb250ZW50VHlwZTpwLHNjaGVtZTpjLHJlc3BvbnNlQ29udGVudFR5cGU6Zn0pKX19O2Z1bmN0aW9uIHplKGUsdCl7cmV0dXJue3R5cGU6bGUscGF5bG9hZDp7cGF0aDplLG1ldGhvZDp0fX19ZnVuY3Rpb24gVmUoZSx0KXtyZXR1cm57dHlwZTpwZSxwYXlsb2FkOntwYXRoOmUsbWV0aG9kOnR9fX1mdW5jdGlvbiBXZShlLHQsbil7cmV0dXJue3R5cGU6dmUscGF5bG9hZDp7c2NoZW1lOmUscGF0aDp0LG1ldGhvZDpufX19fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGU/bnVsbCE9PWU6ImZ1bmN0aW9uIj09dHlwZW9mIGV9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigzNyk7ZS5leHBvcnRzPSFyKChmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sMSx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSlbMV19KSl9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDE3Nyksbz1uKDI0MSksYT1uKDI0MCksaT1uKDE4Nyk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIG49dm9pZCAwIT09ciYmbyhlKXx8ZVsiQEBpdGVyYXRvciJdO2lmKCFuKXtpZihhKGUpfHwobj1pKGUpKXx8dCYmZSYmIm51bWJlciI9PXR5cGVvZiBlLmxlbmd0aCl7biYmKGU9bik7dmFyIHM9MCx1PWZ1bmN0aW9uKCl7fTtyZXR1cm57czp1LG46ZnVuY3Rpb24oKXtyZXR1cm4gcz49ZS5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOmVbcysrXX19LGU6ZnVuY3Rpb24oZSl7dGhyb3cgZX0sZjp1fX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIGMsbD0hMCxwPSExO3JldHVybntzOmZ1bmN0aW9uKCl7bj1uLmNhbGwoZSl9LG46ZnVuY3Rpb24oKXt2YXIgZT1uLm5leHQoKTtyZXR1cm4gbD1lLmRvbmUsZX0sZTpmdW5jdGlvbihlKXtwPSEwLGM9ZX0sZjpmdW5jdGlvbigpe3RyeXtsfHxudWxsPT1uLnJldHVybnx8bi5yZXR1cm4oKX1maW5hbGx5e2lmKHApdGhyb3cgY319fX0sZS5leHBvcnRzLmRlZmF1bHQ9ZS5leHBvcnRzLGUuZXhwb3J0cy5fX2VzTW9kdWxlPSEwfSxmdW5jdGlvbihlLHQsbil7dmFyIHI7IWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBuPXt9Lmhhc093blByb3BlcnR5O2Z1bmN0aW9uIG8oKXtmb3IodmFyIGU9W10sdD0wO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciByPWFyZ3VtZW50c1t0XTtpZihyKXt2YXIgYT10eXBlb2YgcjtpZigic3RyaW5nIj09PWF8fCJudW1iZXIiPT09YSllLnB1c2gocik7ZWxzZSBpZihBcnJheS5pc0FycmF5KHIpKXtpZihyLmxlbmd0aCl7dmFyIGk9by5hcHBseShudWxsLHIpO2kmJmUucHVzaChpKX19ZWxzZSBpZigib2JqZWN0Ij09PWEpaWYoci50b1N0cmluZz09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcpZm9yKHZhciBzIGluIHIpbi5jYWxsKHIscykmJnJbc10mJmUucHVzaChzKTtlbHNlIGUucHVzaChyLnRvU3RyaW5nKCkpfX1yZXR1cm4gZS5qb2luKCIgIil9ZS5leHBvcnRzPyhvLmRlZmF1bHQ9byxlLmV4cG9ydHM9byk6dm9pZCAwPT09KHI9ZnVuY3Rpb24oKXtyZXR1cm4gb30uYXBwbHkodCxbXSkpfHwoZS5leHBvcnRzPXIpfSgpfSxmdW5jdGlvbihlLHQpe3ZhciBuO249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKTt0cnl7bj1ufHxuZXcgRnVuY3Rpb24oInJldHVybiB0aGlzIikoKX1jYXRjaChlKXsib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmKG49d2luZG93KX1lLmV4cG9ydHM9bn0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNDcpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZighcihlKSl0aHJvdyBUeXBlRXJyb3IoU3RyaW5nKGUpKyIgaXMgbm90IGFuIG9iamVjdCIpO3JldHVybiBlfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNDQ1KSxvPW4oNDQ2KSxhPW4oODY3KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZihudWxsPT1lKXJldHVybnt9O3ZhciBuLGkscz1hKGUsdCk7aWYocil7dmFyIHU9cihlKTtmb3IoaT0wO2k8dS5sZW5ndGg7aSsrKW49dVtpXSxvKHQpLmNhbGwodCxuKT49MHx8T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsbikmJihzW25dPWVbbl0pfXJldHVybiBzfSxlLmV4cG9ydHMuZGVmYXVsdD1lLmV4cG9ydHMsZS5leHBvcnRzLl9fZXNNb2R1bGU9ITB9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpLG4uZCh0LCJVUERBVEVfU0VMRUNURURfU0VSVkVSIiwoZnVuY3Rpb24oKXtyZXR1cm4gcn0pKSxuLmQodCwiVVBEQVRFX1JFUVVFU1RfQk9EWV9WQUxVRSIsKGZ1bmN0aW9uKCl7cmV0dXJuIG99KSksbi5kKHQsIlVQREFURV9SRVFVRVNUX0JPRFlfVkFMVUVfUkVUQUlOX0ZMQUciLChmdW5jdGlvbigpe3JldHVybiBhfSkpLG4uZCh0LCJVUERBVEVfUkVRVUVTVF9CT0RZX0lOQ0xVU0lPTiIsKGZ1bmN0aW9uKCl7cmV0dXJuIGl9KSksbi5kKHQsIlVQREFURV9BQ1RJVkVfRVhBTVBMRVNfTUVNQkVSIiwoZnVuY3Rpb24oKXtyZXR1cm4gc30pKSxuLmQodCwiVVBEQVRFX1JFUVVFU1RfQ09OVEVOVF9UWVBFIiwoZnVuY3Rpb24oKXtyZXR1cm4gdX0pKSxuLmQodCwiVVBEQVRFX1JFU1BPTlNFX0NPTlRFTlRfVFlQRSIsKGZ1bmN0aW9uKCl7cmV0dXJuIGN9KSksbi5kKHQsIlVQREFURV9TRVJWRVJfVkFSSUFCTEVfVkFMVUUiLChmdW5jdGlvbigpe3JldHVybiBsfSkpLG4uZCh0LCJTRVRfUkVRVUVTVF9CT0RZX1ZBTElEQVRFX0VSUk9SIiwoZnVuY3Rpb24oKXtyZXR1cm4gcH0pKSxuLmQodCwiQ0xFQVJfUkVRVUVTVF9CT0RZX1ZBTElEQVRFX0VSUk9SIiwoZnVuY3Rpb24oKXtyZXR1cm4gZn0pKSxuLmQodCwiQ0xFQVJfUkVRVUVTVF9CT0RZX1ZBTFVFIiwoZnVuY3Rpb24oKXtyZXR1cm4gaH0pKSxuLmQodCwic2V0U2VsZWN0ZWRTZXJ2ZXIiLChmdW5jdGlvbigpe3JldHVybiBkfSkpLG4uZCh0LCJzZXRSZXF1ZXN0Qm9keVZhbHVlIiwoZnVuY3Rpb24oKXtyZXR1cm4gbX0pKSxuLmQodCwic2V0UmV0YWluUmVxdWVzdEJvZHlWYWx1ZUZsYWciLChmdW5jdGlvbigpe3JldHVybiB2fSkpLG4uZCh0LCJzZXRSZXF1ZXN0Qm9keUluY2x1c2lvbiIsKGZ1bmN0aW9uKCl7cmV0dXJuIGd9KSksbi5kKHQsInNldEFjdGl2ZUV4YW1wbGVzTWVtYmVyIiwoZnVuY3Rpb24oKXtyZXR1cm4geX0pKSxuLmQodCwic2V0UmVxdWVzdENvbnRlbnRUeXBlIiwoZnVuY3Rpb24oKXtyZXR1cm4gYn0pKSxuLmQodCwic2V0UmVzcG9uc2VDb250ZW50VHlwZSIsKGZ1bmN0aW9uKCl7cmV0dXJuIF99KSksbi5kKHQsInNldFNlcnZlclZhcmlhYmxlVmFsdWUiLChmdW5jdGlvbigpe3JldHVybiB3fSkpLG4uZCh0LCJzZXRSZXF1ZXN0Qm9keVZhbGlkYXRlRXJyb3IiLChmdW5jdGlvbigpe3JldHVybiB4fSkpLG4uZCh0LCJjbGVhclJlcXVlc3RCb2R5VmFsaWRhdGVFcnJvciIsKGZ1bmN0aW9uKCl7cmV0dXJuIEV9KSksbi5kKHQsImluaXRSZXF1ZXN0Qm9keVZhbGlkYXRlRXJyb3IiLChmdW5jdGlvbigpe3JldHVybiBTfSkpLG4uZCh0LCJjbGVhclJlcXVlc3RCb2R5VmFsdWUiLChmdW5jdGlvbigpe3JldHVybiBDfSkpO3ZhciByPSJvYXMzX3NldF9zZXJ2ZXJzIixvPSJvYXMzX3NldF9yZXF1ZXN0X2JvZHlfdmFsdWUiLGE9Im9hczNfc2V0X3JlcXVlc3RfYm9keV9yZXRhaW5fZmxhZyIsaT0ib2FzM19zZXRfcmVxdWVzdF9ib2R5X2luY2x1c2lvbiIscz0ib2FzM19zZXRfYWN0aXZlX2V4YW1wbGVzX21lbWJlciIsdT0ib2FzM19zZXRfcmVxdWVzdF9jb250ZW50X3R5cGUiLGM9Im9hczNfc2V0X3Jlc3BvbnNlX2NvbnRlbnRfdHlwZSIsbD0ib2FzM19zZXRfc2VydmVyX3ZhcmlhYmxlX3ZhbHVlIixwPSJvYXMzX3NldF9yZXF1ZXN0X2JvZHlfdmFsaWRhdGVfZXJyb3IiLGY9Im9hczNfY2xlYXJfcmVxdWVzdF9ib2R5X3ZhbGlkYXRlX2Vycm9yIixoPSJvYXMzX2NsZWFyX3JlcXVlc3RfYm9keV92YWx1ZSI7ZnVuY3Rpb24gZChlLHQpe3JldHVybnt0eXBlOnIscGF5bG9hZDp7c2VsZWN0ZWRTZXJ2ZXJVcmw6ZSxuYW1lc3BhY2U6dH19fWZ1bmN0aW9uIG0oZSl7dmFyIHQ9ZS52YWx1ZSxuPWUucGF0aE1ldGhvZDtyZXR1cm57dHlwZTpvLHBheWxvYWQ6e3ZhbHVlOnQscGF0aE1ldGhvZDpufX19dmFyIHY9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS52YWx1ZSxuPWUucGF0aE1ldGhvZDtyZXR1cm57dHlwZTphLHBheWxvYWQ6e3ZhbHVlOnQscGF0aE1ldGhvZDpufX19O2Z1bmN0aW9uIGcoZSl7dmFyIHQ9ZS52YWx1ZSxuPWUucGF0aE1ldGhvZCxyPWUubmFtZTtyZXR1cm57dHlwZTppLHBheWxvYWQ6e3ZhbHVlOnQscGF0aE1ldGhvZDpuLG5hbWU6cn19fWZ1bmN0aW9uIHkoZSl7dmFyIHQ9ZS5uYW1lLG49ZS5wYXRoTWV0aG9kLHI9ZS5jb250ZXh0VHlwZSxvPWUuY29udGV4dE5hbWU7cmV0dXJue3R5cGU6cyxwYXlsb2FkOntuYW1lOnQscGF0aE1ldGhvZDpuLGNvbnRleHRUeXBlOnIsY29udGV4dE5hbWU6b319fWZ1bmN0aW9uIGIoZSl7dmFyIHQ9ZS52YWx1ZSxuPWUucGF0aE1ldGhvZDtyZXR1cm57dHlwZTp1LHBheWxvYWQ6e3ZhbHVlOnQscGF0aE1ldGhvZDpufX19ZnVuY3Rpb24gXyhlKXt2YXIgdD1lLnZhbHVlLG49ZS5wYXRoLHI9ZS5tZXRob2Q7cmV0dXJue3R5cGU6YyxwYXlsb2FkOnt2YWx1ZTp0LHBhdGg6bixtZXRob2Q6cn19fWZ1bmN0aW9uIHcoZSl7dmFyIHQ9ZS5zZXJ2ZXIsbj1lLm5hbWVzcGFjZSxyPWUua2V5LG89ZS52YWw7cmV0dXJue3R5cGU6bCxwYXlsb2FkOntzZXJ2ZXI6dCxuYW1lc3BhY2U6bixrZXk6cix2YWw6b319fXZhciB4PWZ1bmN0aW9uKGUpe3ZhciB0PWUucGF0aCxuPWUubWV0aG9kLHI9ZS52YWxpZGF0aW9uRXJyb3JzO3JldHVybnt0eXBlOnAscGF5bG9hZDp7cGF0aDp0LG1ldGhvZDpuLHZhbGlkYXRpb25FcnJvcnM6cn19fSxFPWZ1bmN0aW9uKGUpe3ZhciB0PWUucGF0aCxuPWUubWV0aG9kO3JldHVybnt0eXBlOmYscGF5bG9hZDp7cGF0aDp0LG1ldGhvZDpufX19LFM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXRoTWV0aG9kO3JldHVybnt0eXBlOmYscGF5bG9hZDp7cGF0aDp0WzBdLG1ldGhvZDp0WzFdfX19LEM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXRoTWV0aG9kO3JldHVybnt0eXBlOmgscGF5bG9hZDp7cGF0aE1ldGhvZDp0fX19fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big2Miksbz17fS5oYXNPd25Qcm9wZXJ0eTtlLmV4cG9ydHM9T2JqZWN0Lmhhc093bnx8ZnVuY3Rpb24oZSx0KXtyZXR1cm4gby5jYWxsKHIoZSksdCl9fSxmdW5jdGlvbihlLHQpe3ZhciBuPUFycmF5LmlzQXJyYXk7ZS5leHBvcnRzPW59LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ISgidW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvd3x8IXdpbmRvdy5kb2N1bWVudHx8IXdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KSxvPXtjYW5Vc2VET006cixjYW5Vc2VXb3JrZXJzOiJ1bmRlZmluZWQiIT10eXBlb2YgV29ya2VyLGNhblVzZUV2ZW50TGlzdGVuZXJzOnImJiEoIXdpbmRvdy5hZGRFdmVudExpc3RlbmVyJiYhd2luZG93LmF0dGFjaEV2ZW50KSxjYW5Vc2VWaWV3cG9ydDpyJiYhIXdpbmRvdy5zY3JlZW4saXNJbldvcmtlcjohcn07ZS5leHBvcnRzPW99LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9big2NjIpfSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD10eXBlb2YgZTtyZXR1cm4gbnVsbCE9ZSYmKCJvYmplY3QiPT10fHwiZnVuY3Rpb24iPT10KX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5kKHQsImIiLChmdW5jdGlvbigpe3JldHVybiBtfSkpLG4uZCh0LCJlIiwoZnVuY3Rpb24oKXtyZXR1cm4gdn0pKSxuLmQodCwiYyIsKGZ1bmN0aW9uKCl7cmV0dXJuIHl9KSksbi5kKHQsImEiLChmdW5jdGlvbigpe3JldHVybiBifSkpLG4uZCh0LCJkIiwoZnVuY3Rpb24oKXtyZXR1cm4gX30pKTt2YXIgcj1uKDQ5KSxvPW4ubihyKSxhPW4oMTgpLGk9bi5uKGEpLHM9bigxMDQpLHU9bi5uKHMpLGM9bigyKSxsPW4ubihjKSxwPW4oNTkpLGY9bi5uKHApLGg9ZnVuY3Rpb24oZSl7cmV0dXJuIFN0cmluZy5wcm90b3R5cGUudG9Mb3dlckNhc2UuY2FsbChlKX0sZD1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC9bXlx3XS9naSwiXyIpfTtmdW5jdGlvbiBtKGUpe3ZhciB0PWUub3BlbmFwaTtyZXR1cm4hIXQmJnUoKSh0KS5jYWxsKHQsIjMiKX1mdW5jdGlvbiB2KGUsdCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOiIiLHI9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOnt9LG89ci52Mk9wZXJhdGlvbklkQ29tcGF0aWJpbGl0eU1vZGU7aWYoIWV8fCJvYmplY3QiIT09aSgpKGUpKXJldHVybiBudWxsO3ZhciBhPShlLm9wZXJhdGlvbklkfHwiIikucmVwbGFjZSgvXHMvZywiIik7cmV0dXJuIGEubGVuZ3RoP2QoZS5vcGVyYXRpb25JZCk6Zyh0LG4se3YyT3BlcmF0aW9uSWRDb21wYXRpYmlsaXR5TW9kZTpvfSl9ZnVuY3Rpb24gZyhlLHQpe3ZhciBuLHI9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LG89ci52Mk9wZXJhdGlvbklkQ29tcGF0aWJpbGl0eU1vZGU7aWYobyl7dmFyIGEsaSxzPWwoKShhPSIiLmNvbmNhdCh0LnRvTG93ZXJDYXNlKCksIl8iKSkuY2FsbChhLGUpLnJlcGxhY2UoL1tccyFAIyQlXiYqKClfKz1be1xdfTs6PD58Li8/LFxcJyIiLV0vZywiXyIpO3JldHVybihzPXN8fGwoKShpPSIiLmNvbmNhdChlLnN1YnN0cmluZygxKSwiXyIpKS5jYWxsKGksdCkpLnJlcGxhY2UoLygoXyl7Mix9KS9nLCJfIikucmVwbGFjZSgvXihfKSovZywiIikucmVwbGFjZSgvKFtfXSkqJC9nLCIiKX1yZXR1cm4gbCgpKG49IiIuY29uY2F0KGgodCkpKS5jYWxsKG4sZChlKSl9ZnVuY3Rpb24geShlLHQpe3ZhciBuO3JldHVybiBsKCkobj0iIi5jb25jYXQoaCh0KSwiLSIpKS5jYWxsKG4sZSl9ZnVuY3Rpb24gYihlLHQpe3JldHVybiBlJiZlLnBhdGhzP2Z1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXtpZighZXx8Im9iamVjdCIhPT1pKCkoZSl8fCFlLnBhdGhzfHwib2JqZWN0IiE9PWkoKShlLnBhdGhzKSlyZXR1cm4gbnVsbDt2YXIgcj1lLnBhdGhzO2Zvcih2YXIgbyBpbiByKWZvcih2YXIgYSBpbiByW29dKWlmKCJQQVJBTUVURVJTIiE9PWEudG9VcHBlckNhc2UoKSl7dmFyIHM9cltvXVthXTtpZihzJiYib2JqZWN0Ij09PWkoKShzKSl7dmFyIHU9e3NwZWM6ZSxwYXRoTmFtZTpvLG1ldGhvZDphLnRvVXBwZXJDYXNlKCksb3BlcmF0aW9uOnN9LGM9dCh1KTtpZihuJiZjKXJldHVybiB1fX1yZXR1cm59KGUsdCwhMCl8fG51bGx9KGUsKGZ1bmN0aW9uKGUpe3ZhciBuPWUucGF0aE5hbWUscj1lLm1ldGhvZCxvPWUub3BlcmF0aW9uO2lmKCFvfHwib2JqZWN0IiE9PWkoKShvKSlyZXR1cm4hMTt2YXIgYT1vLm9wZXJhdGlvbklkO3JldHVyblt2KG8sbixyKSx5KG4sciksYV0uc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmU9PT10fSkpfSkpOm51bGx9ZnVuY3Rpb24gXyhlKXt2YXIgdD1lLnNwZWMsbj10LnBhdGhzLHI9e307aWYoIW58fHQuJCRub3JtYWxpemVkKXJldHVybiBlO2Zvcih2YXIgYSBpbiBuKXt2YXIgaT1uW2FdO2lmKGYoKShpKSl7dmFyIHM9aS5wYXJhbWV0ZXJzLHU9ZnVuY3Rpb24oZSl7dmFyIG49aVtlXTtpZighZigpKG4pKXJldHVybiJjb250aW51ZSI7dmFyIHU9dihuLGEsZSk7aWYodSl7clt1XT9yW3VdLnB1c2gobik6clt1XT1bbl07dmFyIGM9clt1XTtpZihjLmxlbmd0aD4xKWMuZm9yRWFjaCgoZnVuY3Rpb24oZSx0KXt2YXIgbjtlLl9fb3JpZ2luYWxPcGVyYXRpb25JZD1lLl9fb3JpZ2luYWxPcGVyYXRpb25JZHx8ZS5vcGVyYXRpb25JZCxlLm9wZXJhdGlvbklkPWwoKShuPSIiLmNvbmNhdCh1KSkuY2FsbChuLHQrMSl9KSk7ZWxzZSBpZih2b2lkIDAhPT1uLm9wZXJhdGlvbklkKXt2YXIgcD1jWzBdO3AuX19vcmlnaW5hbE9wZXJhdGlvbklkPXAuX19vcmlnaW5hbE9wZXJhdGlvbklkfHxuLm9wZXJhdGlvbklkLHAub3BlcmF0aW9uSWQ9dX19aWYoInBhcmFtZXRlcnMiIT09ZSl7dmFyIGg9W10sZD17fTtmb3IodmFyIG0gaW4gdCkicHJvZHVjZXMiIT09bSYmImNvbnN1bWVzIiE9PW0mJiJzZWN1cml0eSIhPT1tfHwoZFttXT10W21dLGgucHVzaChkKSk7aWYocyYmKGQucGFyYW1ldGVycz1zLGgucHVzaChkKSksaC5sZW5ndGgpe3ZhciBnLHk9bygpKGgpO3RyeXtmb3IoeS5zKCk7IShnPXkubigpKS5kb25lOyl7dmFyIGI9Zy52YWx1ZTtmb3IodmFyIF8gaW4gYilpZihuW19dKXtpZigicGFyYW1ldGVycyI9PT1fKXt2YXIgdyx4PW8oKShiW19dKTt0cnl7dmFyIEU9ZnVuY3Rpb24oKXt2YXIgZT13LnZhbHVlO25bX10uc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIHQubmFtZSYmdC5uYW1lPT09ZS5uYW1lfHx0LiRyZWYmJnQuJHJlZj09PWUuJHJlZnx8dC4kJHJlZiYmdC4kJHJlZj09PWUuJCRyZWZ8fHQ9PT1lfSkpfHxuW19dLnB1c2goZSl9O2Zvcih4LnMoKTshKHc9eC5uKCkpLmRvbmU7KUUoKX1jYXRjaChlKXt4LmUoZSl9ZmluYWxseXt4LmYoKX19fWVsc2UgbltfXT1iW19dfX1jYXRjaChlKXt5LmUoZSl9ZmluYWxseXt5LmYoKX19fX07Zm9yKHZhciBjIGluIGkpdShjKX19cmV0dXJuIHQuJCRub3JtYWxpemVkPSEwLGV9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KSxuLmQodCwiTkVXX1RIUk9XTl9FUlIiLChmdW5jdGlvbigpe3JldHVybiBvfSkpLG4uZCh0LCJORVdfVEhST1dOX0VSUl9CQVRDSCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGF9KSksbi5kKHQsIk5FV19TUEVDX0VSUiIsKGZ1bmN0aW9uKCl7cmV0dXJuIGl9KSksbi5kKHQsIk5FV19TUEVDX0VSUl9CQVRDSCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHN9KSksbi5kKHQsIk5FV19BVVRIX0VSUiIsKGZ1bmN0aW9uKCl7cmV0dXJuIHV9KSksbi5kKHQsIkNMRUFSIiwoZnVuY3Rpb24oKXtyZXR1cm4gY30pKSxuLmQodCwiQ0xFQVJfQlkiLChmdW5jdGlvbigpe3JldHVybiBsfSkpLG4uZCh0LCJuZXdUaHJvd25FcnIiLChmdW5jdGlvbigpe3JldHVybiBwfSkpLG4uZCh0LCJuZXdUaHJvd25FcnJCYXRjaCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KSksbi5kKHQsIm5ld1NwZWNFcnIiLChmdW5jdGlvbigpe3JldHVybiBofSkpLG4uZCh0LCJuZXdTcGVjRXJyQmF0Y2giLChmdW5jdGlvbigpe3JldHVybiBkfSkpLG4uZCh0LCJuZXdBdXRoRXJyIiwoZnVuY3Rpb24oKXtyZXR1cm4gbX0pKSxuLmQodCwiY2xlYXIiLChmdW5jdGlvbigpe3JldHVybiB2fSkpLG4uZCh0LCJjbGVhckJ5IiwoZnVuY3Rpb24oKXtyZXR1cm4gZ30pKTt2YXIgcj1uKDE0Niksbz0iZXJyX25ld190aHJvd25fZXJyIixhPSJlcnJfbmV3X3Rocm93bl9lcnJfYmF0Y2giLGk9ImVycl9uZXdfc3BlY19lcnIiLHM9ImVycl9uZXdfc3BlY19lcnJfYmF0Y2giLHU9ImVycl9uZXdfYXV0aF9lcnIiLGM9ImVycl9jbGVhciIsbD0iZXJyX2NsZWFyX2J5IjtmdW5jdGlvbiBwKGUpe3JldHVybnt0eXBlOm8scGF5bG9hZDpPYmplY3Qoci5zZXJpYWxpemVFcnJvcikoZSl9fWZ1bmN0aW9uIGYoZSl7cmV0dXJue3R5cGU6YSxwYXlsb2FkOmV9fWZ1bmN0aW9uIGgoZSl7cmV0dXJue3R5cGU6aSxwYXlsb2FkOmV9fWZ1bmN0aW9uIGQoZSl7cmV0dXJue3R5cGU6cyxwYXlsb2FkOmV9fWZ1bmN0aW9uIG0oZSl7cmV0dXJue3R5cGU6dSxwYXlsb2FkOmV9fWZ1bmN0aW9uIHYoKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e307cmV0dXJue3R5cGU6YyxwYXlsb2FkOmV9fWZ1bmN0aW9uIGcoKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06ZnVuY3Rpb24oKXtyZXR1cm4hMH07cmV0dXJue3R5cGU6bCxwYXlsb2FkOmV9fX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTA4KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdChyKGUpKX19LGZ1bmN0aW9uKGUsdCl7ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5jcmVhdGU/ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7ZS5zdXBlcl89dCxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KX06ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7ZS5zdXBlcl89dDt2YXIgbj1mdW5jdGlvbigpe307bi5wcm90b3R5cGU9dC5wcm90b3R5cGUsZS5wcm90b3R5cGU9bmV3IG4sZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDEzMiksbz1yLkJ1ZmZlcjtmdW5jdGlvbiBhKGUsdCl7Zm9yKHZhciBuIGluIGUpdFtuXT1lW25dfWZ1bmN0aW9uIGkoZSx0LG4pe3JldHVybiBvKGUsdCxuKX1vLmZyb20mJm8uYWxsb2MmJm8uYWxsb2NVbnNhZmUmJm8uYWxsb2NVbnNhZmVTbG93P2UuZXhwb3J0cz1yOihhKHIsdCksdC5CdWZmZXI9aSksYShvLGkpLGkuZnJvbT1mdW5jdGlvbihlLHQsbil7aWYoIm51bWJlciI9PXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyIik7cmV0dXJuIG8oZSx0LG4pfSxpLmFsbG9jPWZ1bmN0aW9uKGUsdCxuKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3ZhciByPW8oZSk7cmV0dXJuIHZvaWQgMCE9PXQ/InN0cmluZyI9PXR5cGVvZiBuP3IuZmlsbCh0LG4pOnIuZmlsbCh0KTpyLmZpbGwoMCkscn0saS5hbGxvY1Vuc2FmZT1mdW5jdGlvbihlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiBvKGUpfSxpLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbihlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiByLlNsb3dCdWZmZXIoZSl9fSxmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPW4oODgyKX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTc5KSxvPW4oMTA4KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHIobyhlKSl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big0OCksbz1uKDY4KSxhPW4oMTA3KTtlLmV4cG9ydHM9cj9mdW5jdGlvbihlLHQsbil7cmV0dXJuIG8uZihlLHQsYSgxLG4pKX06ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlW3RdPW4sZX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDQ4KSxvPW4oMzYwKSxhPW4oNTIpLGk9bigxODApLHM9T2JqZWN0LmRlZmluZVByb3BlcnR5O3QuZj1yP3M6ZnVuY3Rpb24oZSx0LG4pe2lmKGEoZSksdD1pKHQsITApLGEobiksbyl0cnl7cmV0dXJuIHMoZSx0LG4pfWNhdGNoKGUpe31pZigiZ2V0ImluIG58fCJzZXQiaW4gbil0aHJvdyBUeXBlRXJyb3IoIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIik7cmV0dXJuInZhbHVlImluIG4mJihlW3RdPW4udmFsdWUpLGV9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMjgpLG89TWF0aC5taW47ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBlPjA/byhyKGUpLDkwMDcxOTkyNTQ3NDA5OTEpOjB9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigzMyksbz1uKDQwKSxhPWZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6dm9pZCAwfTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP2EocltlXSl8fGEob1tlXSk6cltlXSYmcltlXVt0XXx8b1tlXSYmb1tlXVt0XX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDQwNSksbz0ib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLGE9cnx8b3x8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKTtlLmV4cG9ydHM9YX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9e2RlYnVnVG9vbDpudWxsfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBudWxsPT1lfXZhciBvPXtpc05vdGhpbmc6cixpc09iamVjdDpmdW5jdGlvbihlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPT1lfSx0b0FycmF5OmZ1bmN0aW9uKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2U6cihlKT9bXTpbZV19LHJlcGVhdDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9IiI7Zm9yKG49MDtuPHQ7bis9MSlyKz1lO3JldHVybiByfSxpc05lZ2F0aXZlWmVybzpmdW5jdGlvbihlKXtyZXR1cm4gMD09PWUmJk51bWJlci5ORUdBVElWRV9JTkZJTklUWT09PTEvZX0sZXh0ZW5kOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixvLGE7aWYodClmb3Iobj0wLHI9KGE9T2JqZWN0LmtleXModCkpLmxlbmd0aDtuPHI7bis9MSllW289YVtuXV09dFtvXTtyZXR1cm4gZX19O2Z1bmN0aW9uIGEoZSx0KXt2YXIgbj0iIixyPWUucmVhc29ufHwiKHVua25vd24gcmVhc29uKSI7cmV0dXJuIGUubWFyaz8oZS5tYXJrLm5hbWUmJihuKz0naW4gIicrZS5tYXJrLm5hbWUrJyIgJyksbis9IigiKyhlLm1hcmsubGluZSsxKSsiOiIrKGUubWFyay5jb2x1bW4rMSkrIikiLCF0JiZlLm1hcmsuc25pcHBldCYmKG4rPSJcblxuIitlLm1hcmsuc25pcHBldCkscisiICIrbik6cn1mdW5jdGlvbiBpKGUsdCl7RXJyb3IuY2FsbCh0aGlzKSx0aGlzLm5hbWU9IllBTUxFeGNlcHRpb24iLHRoaXMucmVhc29uPWUsdGhpcy5tYXJrPXQsdGhpcy5tZXNzYWdlPWEodGhpcywhMSksRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U/RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcyx0aGlzLmNvbnN0cnVjdG9yKTp0aGlzLnN0YWNrPShuZXcgRXJyb3IpLnN0YWNrfHwiIn1pLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSksaS5wcm90b3R5cGUuY29uc3RydWN0b3I9aSxpLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5uYW1lKyI6ICIrYSh0aGlzLGUpfTt2YXIgcz1pO2Z1bmN0aW9uIHUoZSx0LG4scixvKXt2YXIgYT0iIixpPSIiLHM9TWF0aC5mbG9vcihvLzIpLTE7cmV0dXJuIHItdD5zJiYodD1yLXMrKGE9IiAuLi4gIikubGVuZ3RoKSxuLXI+cyYmKG49citzLShpPSIgLi4uIikubGVuZ3RoKSx7c3RyOmErZS5zbGljZSh0LG4pLnJlcGxhY2UoL1x0L2csIuKGkiIpK2kscG9zOnItdCthLmxlbmd0aH19ZnVuY3Rpb24gYyhlLHQpe3JldHVybiBvLnJlcGVhdCgiICIsdC1lLmxlbmd0aCkrZX12YXIgbD1mdW5jdGlvbihlLHQpe2lmKHQ9T2JqZWN0LmNyZWF0ZSh0fHxudWxsKSwhZS5idWZmZXIpcmV0dXJuIG51bGw7dC5tYXhMZW5ndGh8fCh0Lm1heExlbmd0aD03OSksIm51bWJlciIhPXR5cGVvZiB0LmluZGVudCYmKHQuaW5kZW50PTEpLCJudW1iZXIiIT10eXBlb2YgdC5saW5lc0JlZm9yZSYmKHQubGluZXNCZWZvcmU9MyksIm51bWJlciIhPXR5cGVvZiB0LmxpbmVzQWZ0ZXImJih0LmxpbmVzQWZ0ZXI9Mik7Zm9yKHZhciBuLHI9L1xyP1xufFxyfFwwL2csYT1bMF0saT1bXSxzPS0xO249ci5leGVjKGUuYnVmZmVyKTspaS5wdXNoKG4uaW5kZXgpLGEucHVzaChuLmluZGV4K25bMF0ubGVuZ3RoKSxlLnBvc2l0aW9uPD1uLmluZGV4JiZzPDAmJihzPWEubGVuZ3RoLTIpO3M8MCYmKHM9YS5sZW5ndGgtMSk7dmFyIGwscCxmPSIiLGg9TWF0aC5taW4oZS5saW5lK3QubGluZXNBZnRlcixpLmxlbmd0aCkudG9TdHJpbmcoKS5sZW5ndGgsZD10Lm1heExlbmd0aC0odC5pbmRlbnQraCszKTtmb3IobD0xO2w8PXQubGluZXNCZWZvcmUmJiEocy1sPDApO2wrKylwPXUoZS5idWZmZXIsYVtzLWxdLGlbcy1sXSxlLnBvc2l0aW9uLShhW3NdLWFbcy1sXSksZCksZj1vLnJlcGVhdCgiICIsdC5pbmRlbnQpK2MoKGUubGluZS1sKzEpLnRvU3RyaW5nKCksaCkrIiB8ICIrcC5zdHIrIlxuIitmO2ZvcihwPXUoZS5idWZmZXIsYVtzXSxpW3NdLGUucG9zaXRpb24sZCksZis9by5yZXBlYXQoIiAiLHQuaW5kZW50KStjKChlLmxpbmUrMSkudG9TdHJpbmcoKSxoKSsiIHwgIitwLnN0cisiXG4iLGYrPW8ucmVwZWF0KCItIix0LmluZGVudCtoKzMrcC5wb3MpKyJeXG4iLGw9MTtsPD10LmxpbmVzQWZ0ZXImJiEocytsPj1pLmxlbmd0aCk7bCsrKXA9dShlLmJ1ZmZlcixhW3MrbF0saVtzK2xdLGUucG9zaXRpb24tKGFbc10tYVtzK2xdKSxkKSxmKz1vLnJlcGVhdCgiICIsdC5pbmRlbnQpK2MoKGUubGluZStsKzEpLnRvU3RyaW5nKCksaCkrIiB8ICIrcC5zdHIrIlxuIjtyZXR1cm4gZi5yZXBsYWNlKC9cbiQvLCIiKX0scD1bImtpbmQiLCJtdWx0aSIsInJlc29sdmUiLCJjb25zdHJ1Y3QiLCJpbnN0YW5jZU9mIiwicHJlZGljYXRlIiwicmVwcmVzZW50IiwicmVwcmVzZW50TmFtZSIsImRlZmF1bHRTdHlsZSIsInN0eWxlQWxpYXNlcyJdLGY9WyJzY2FsYXIiLCJzZXF1ZW5jZSIsIm1hcHBpbmciXTt2YXIgaD1mdW5jdGlvbihlLHQpe2lmKHQ9dHx8e30sT2JqZWN0LmtleXModCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoLTE9PT1wLmluZGV4T2YodCkpdGhyb3cgbmV3IHMoJ1Vua25vd24gb3B0aW9uICInK3QrJyIgaXMgbWV0IGluIGRlZmluaXRpb24gb2YgIicrZSsnIiBZQU1MIHR5cGUuJyl9KSksdGhpcy5vcHRpb25zPXQsdGhpcy50YWc9ZSx0aGlzLmtpbmQ9dC5raW5kfHxudWxsLHRoaXMucmVzb2x2ZT10LnJlc29sdmV8fGZ1bmN0aW9uKCl7cmV0dXJuITB9LHRoaXMuY29uc3RydWN0PXQuY29uc3RydWN0fHxmdW5jdGlvbihlKXtyZXR1cm4gZX0sdGhpcy5pbnN0YW5jZU9mPXQuaW5zdGFuY2VPZnx8bnVsbCx0aGlzLnByZWRpY2F0ZT10LnByZWRpY2F0ZXx8bnVsbCx0aGlzLnJlcHJlc2VudD10LnJlcHJlc2VudHx8bnVsbCx0aGlzLnJlcHJlc2VudE5hbWU9dC5yZXByZXNlbnROYW1lfHxudWxsLHRoaXMuZGVmYXVsdFN0eWxlPXQuZGVmYXVsdFN0eWxlfHxudWxsLHRoaXMubXVsdGk9dC5tdWx0aXx8ITEsdGhpcy5zdHlsZUFsaWFzZXM9ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIG51bGwhPT1lJiZPYmplY3Qua2V5cyhlKS5mb3JFYWNoKChmdW5jdGlvbihuKXtlW25dLmZvckVhY2goKGZ1bmN0aW9uKGUpe3RbU3RyaW5nKGUpXT1ufSkpfSkpLHR9KHQuc3R5bGVBbGlhc2VzfHxudWxsKSwtMT09PWYuaW5kZXhPZih0aGlzLmtpbmQpKXRocm93IG5ldyBzKCdVbmtub3duIGtpbmQgIicrdGhpcy5raW5kKyciIGlzIHNwZWNpZmllZCBmb3IgIicrZSsnIiBZQU1MIHR5cGUuJyl9O2Z1bmN0aW9uIGQoZSx0KXt2YXIgbj1bXTtyZXR1cm4gZVt0XS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgdD1uLmxlbmd0aDtuLmZvckVhY2goKGZ1bmN0aW9uKG4scil7bi50YWc9PT1lLnRhZyYmbi5raW5kPT09ZS5raW5kJiZuLm11bHRpPT09ZS5tdWx0aSYmKHQ9cil9KSksblt0XT1lfSkpLG59ZnVuY3Rpb24gbShlKXtyZXR1cm4gdGhpcy5leHRlbmQoZSl9bS5wcm90b3R5cGUuZXh0ZW5kPWZ1bmN0aW9uKGUpe3ZhciB0PVtdLG49W107aWYoZSBpbnN0YW5jZW9mIGgpbi5wdXNoKGUpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShlKSluPW4uY29uY2F0KGUpO2Vsc2V7aWYoIWV8fCFBcnJheS5pc0FycmF5KGUuaW1wbGljaXQpJiYhQXJyYXkuaXNBcnJheShlLmV4cGxpY2l0KSl0aHJvdyBuZXcgcygiU2NoZW1hLmV4dGVuZCBhcmd1bWVudCBzaG91bGQgYmUgYSBUeXBlLCBbIFR5cGUgXSwgb3IgYSBzY2hlbWEgZGVmaW5pdGlvbiAoeyBpbXBsaWNpdDogWy4uLl0sIGV4cGxpY2l0OiBbLi4uXSB9KSIpO2UuaW1wbGljaXQmJih0PXQuY29uY2F0KGUuaW1wbGljaXQpKSxlLmV4cGxpY2l0JiYobj1uLmNvbmNhdChlLmV4cGxpY2l0KSl9dC5mb3JFYWNoKChmdW5jdGlvbihlKXtpZighKGUgaW5zdGFuY2VvZiBoKSl0aHJvdyBuZXcgcygiU3BlY2lmaWVkIGxpc3Qgb2YgWUFNTCB0eXBlcyAob3IgYSBzaW5nbGUgVHlwZSBvYmplY3QpIGNvbnRhaW5zIGEgbm9uLVR5cGUgb2JqZWN0LiIpO2lmKGUubG9hZEtpbmQmJiJzY2FsYXIiIT09ZS5sb2FkS2luZCl0aHJvdyBuZXcgcygiVGhlcmUgaXMgYSBub24tc2NhbGFyIHR5cGUgaW4gdGhlIGltcGxpY2l0IGxpc3Qgb2YgYSBzY2hlbWEuIEltcGxpY2l0IHJlc29sdmluZyBvZiBzdWNoIHR5cGVzIGlzIG5vdCBzdXBwb3J0ZWQuIik7aWYoZS5tdWx0aSl0aHJvdyBuZXcgcygiVGhlcmUgaXMgYSBtdWx0aSB0eXBlIGluIHRoZSBpbXBsaWNpdCBsaXN0IG9mIGEgc2NoZW1hLiBNdWx0aSB0YWdzIGNhbiBvbmx5IGJlIGxpc3RlZCBhcyBleHBsaWNpdC4iKX0pKSxuLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKCEoZSBpbnN0YW5jZW9mIGgpKXRocm93IG5ldyBzKCJTcGVjaWZpZWQgbGlzdCBvZiBZQU1MIHR5cGVzIChvciBhIHNpbmdsZSBUeXBlIG9iamVjdCkgY29udGFpbnMgYSBub24tVHlwZSBvYmplY3QuIil9KSk7dmFyIHI9T2JqZWN0LmNyZWF0ZShtLnByb3RvdHlwZSk7cmV0dXJuIHIuaW1wbGljaXQ9KHRoaXMuaW1wbGljaXR8fFtdKS5jb25jYXQodCksci5leHBsaWNpdD0odGhpcy5leHBsaWNpdHx8W10pLmNvbmNhdChuKSxyLmNvbXBpbGVkSW1wbGljaXQ9ZChyLCJpbXBsaWNpdCIpLHIuY29tcGlsZWRFeHBsaWNpdD1kKHIsImV4cGxpY2l0Iiksci5jb21waWxlZFR5cGVNYXA9ZnVuY3Rpb24oKXt2YXIgZSx0LG49e3NjYWxhcjp7fSxzZXF1ZW5jZTp7fSxtYXBwaW5nOnt9LGZhbGxiYWNrOnt9LG11bHRpOntzY2FsYXI6W10sc2VxdWVuY2U6W10sbWFwcGluZzpbXSxmYWxsYmFjazpbXX19O2Z1bmN0aW9uIHIoZSl7ZS5tdWx0aT8obi5tdWx0aVtlLmtpbmRdLnB1c2goZSksbi5tdWx0aS5mYWxsYmFjay5wdXNoKGUpKTpuW2Uua2luZF1bZS50YWddPW4uZmFsbGJhY2tbZS50YWddPWV9Zm9yKGU9MCx0PWFyZ3VtZW50cy5sZW5ndGg7ZTx0O2UrPTEpYXJndW1lbnRzW2VdLmZvckVhY2gocik7cmV0dXJuIG59KHIuY29tcGlsZWRJbXBsaWNpdCxyLmNvbXBpbGVkRXhwbGljaXQpLHJ9O3ZhciB2PW0sZz1uZXcgaCgidGFnOnlhbWwub3JnLDIwMDI6c3RyIix7a2luZDoic2NhbGFyIixjb25zdHJ1Y3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPT1lP2U6IiJ9fSkseT1uZXcgaCgidGFnOnlhbWwub3JnLDIwMDI6c2VxIix7a2luZDoic2VxdWVuY2UiLGNvbnN0cnVjdDpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9PWU/ZTpbXX19KSxiPW5ldyBoKCJ0YWc6eWFtbC5vcmcsMjAwMjptYXAiLHtraW5kOiJtYXBwaW5nIixjb25zdHJ1Y3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPT1lP2U6e319fSksXz1uZXcgdih7ZXhwbGljaXQ6W2cseSxiXX0pO3ZhciB3PW5ldyBoKCJ0YWc6eWFtbC5vcmcsMjAwMjpudWxsIix7a2luZDoic2NhbGFyIixyZXNvbHZlOmZ1bmN0aW9uKGUpe2lmKG51bGw9PT1lKXJldHVybiEwO3ZhciB0PWUubGVuZ3RoO3JldHVybiAxPT09dCYmIn4iPT09ZXx8ND09PXQmJigibnVsbCI9PT1lfHwiTnVsbCI9PT1lfHwiTlVMTCI9PT1lKX0sY29uc3RydWN0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LHByZWRpY2F0ZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWV9LHJlcHJlc2VudDp7Y2Fub25pY2FsOmZ1bmN0aW9uKCl7cmV0dXJuIn4ifSxsb3dlcmNhc2U6ZnVuY3Rpb24oKXtyZXR1cm4ibnVsbCJ9LHVwcGVyY2FzZTpmdW5jdGlvbigpe3JldHVybiJOVUxMIn0sY2FtZWxjYXNlOmZ1bmN0aW9uKCl7cmV0dXJuIk51bGwifSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiIifX0sZGVmYXVsdFN0eWxlOiJsb3dlcmNhc2UifSk7dmFyIHg9bmV3IGgoInRhZzp5YW1sLm9yZywyMDAyOmJvb2wiLHtraW5kOiJzY2FsYXIiLHJlc29sdmU6ZnVuY3Rpb24oZSl7aWYobnVsbD09PWUpcmV0dXJuITE7dmFyIHQ9ZS5sZW5ndGg7cmV0dXJuIDQ9PT10JiYoInRydWUiPT09ZXx8IlRydWUiPT09ZXx8IlRSVUUiPT09ZSl8fDU9PT10JiYoImZhbHNlIj09PWV8fCJGYWxzZSI9PT1lfHwiRkFMU0UiPT09ZSl9LGNvbnN0cnVjdDpmdW5jdGlvbihlKXtyZXR1cm4idHJ1ZSI9PT1lfHwiVHJ1ZSI9PT1lfHwiVFJVRSI9PT1lfSxwcmVkaWNhdGU6ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgQm9vbGVhbl0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfSxyZXByZXNlbnQ6e2xvd2VyY2FzZTpmdW5jdGlvbihlKXtyZXR1cm4gZT8idHJ1ZSI6ImZhbHNlIn0sdXBwZXJjYXNlOmZ1bmN0aW9uKGUpe3JldHVybiBlPyJUUlVFIjoiRkFMU0UifSxjYW1lbGNhc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/IlRydWUiOiJGYWxzZSJ9fSxkZWZhdWx0U3R5bGU6Imxvd2VyY2FzZSJ9KTtmdW5jdGlvbiBFKGUpe3JldHVybiA0ODw9ZSYmZTw9NTV9ZnVuY3Rpb24gUyhlKXtyZXR1cm4gNDg8PWUmJmU8PTU3fXZhciBDPW5ldyBoKCJ0YWc6eWFtbC5vcmcsMjAwMjppbnQiLHtraW5kOiJzY2FsYXIiLHJlc29sdmU6ZnVuY3Rpb24oZSl7aWYobnVsbD09PWUpcmV0dXJuITE7dmFyIHQsbixyPWUubGVuZ3RoLG89MCxhPSExO2lmKCFyKXJldHVybiExO2lmKCItIiE9PSh0PWVbb10pJiYiKyIhPT10fHwodD1lWysrb10pLCIwIj09PXQpe2lmKG8rMT09PXIpcmV0dXJuITA7aWYoImIiPT09KHQ9ZVsrK29dKSl7Zm9yKG8rKztvPHI7bysrKWlmKCJfIiE9PSh0PWVbb10pKXtpZigiMCIhPT10JiYiMSIhPT10KXJldHVybiExO2E9ITB9cmV0dXJuIGEmJiJfIiE9PXR9aWYoIngiPT09dCl7Zm9yKG8rKztvPHI7bysrKWlmKCJfIiE9PSh0PWVbb10pKXtpZighKDQ4PD0obj1lLmNoYXJDb2RlQXQobykpJiZuPD01N3x8NjU8PW4mJm48PTcwfHw5Nzw9biYmbjw9MTAyKSlyZXR1cm4hMTthPSEwfXJldHVybiBhJiYiXyIhPT10fWlmKCJvIj09PXQpe2ZvcihvKys7bzxyO28rKylpZigiXyIhPT0odD1lW29dKSl7aWYoIUUoZS5jaGFyQ29kZUF0KG8pKSlyZXR1cm4hMTthPSEwfXJldHVybiBhJiYiXyIhPT10fX1pZigiXyI9PT10KXJldHVybiExO2Zvcig7bzxyO28rKylpZigiXyIhPT0odD1lW29dKSl7aWYoIVMoZS5jaGFyQ29kZUF0KG8pKSlyZXR1cm4hMTthPSEwfXJldHVybiEoIWF8fCJfIj09PXQpfSxjb25zdHJ1Y3Q6ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLHI9MTtpZigtMSE9PW4uaW5kZXhPZigiXyIpJiYobj1uLnJlcGxhY2UoL18vZywiIikpLCItIiE9PSh0PW5bMF0pJiYiKyIhPT10fHwoIi0iPT09dCYmKHI9LTEpLHQ9KG49bi5zbGljZSgxKSlbMF0pLCIwIj09PW4pcmV0dXJuIDA7aWYoIjAiPT09dCl7aWYoImIiPT09blsxXSlyZXR1cm4gcipwYXJzZUludChuLnNsaWNlKDIpLDIpO2lmKCJ4Ij09PW5bMV0pcmV0dXJuIHIqcGFyc2VJbnQobi5zbGljZSgyKSwxNik7aWYoIm8iPT09blsxXSlyZXR1cm4gcipwYXJzZUludChuLnNsaWNlKDIpLDgpfXJldHVybiByKnBhcnNlSW50KG4sMTApfSxwcmVkaWNhdGU6ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgTnVtYmVyXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkmJmUlMT09MCYmIW8uaXNOZWdhdGl2ZVplcm8oZSl9LHJlcHJlc2VudDp7YmluYXJ5OmZ1bmN0aW9uKGUpe3JldHVybiBlPj0wPyIwYiIrZS50b1N0cmluZygyKToiLTBiIitlLnRvU3RyaW5nKDIpLnNsaWNlKDEpfSxvY3RhbDpmdW5jdGlvbihlKXtyZXR1cm4gZT49MD8iMG8iK2UudG9TdHJpbmcoOCk6Ii0wbyIrZS50b1N0cmluZyg4KS5zbGljZSgxKX0sZGVjaW1hbDpmdW5jdGlvbihlKXtyZXR1cm4gZS50b1N0cmluZygxMCl9LGhleGFkZWNpbWFsOmZ1bmN0aW9uKGUpe3JldHVybiBlPj0wPyIweCIrZS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKToiLTB4IitlLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLnNsaWNlKDEpfX0sZGVmYXVsdFN0eWxlOiJkZWNpbWFsIixzdHlsZUFsaWFzZXM6e2JpbmFyeTpbMiwiYmluIl0sb2N0YWw6WzgsIm9jdCJdLGRlY2ltYWw6WzEwLCJkZWMiXSxoZXhhZGVjaW1hbDpbMTYsImhleCJdfX0pLEE9bmV3IFJlZ0V4cCgiXig/OlstK10/KD86WzAtOV1bMC05X10qKSg/OlxcLlswLTlfXSopPyg/OltlRV1bLStdP1swLTldKyk/fFxcLlswLTlfXSsoPzpbZUVdWy0rXT9bMC05XSspP3xbLStdP1xcLig/OmluZnxJbmZ8SU5GKXxcXC4oPzpuYW58TmFOfE5BTikpJCIpO3ZhciBPPS9eWy0rXT9bMC05XStlLzt2YXIgaz1uZXcgaCgidGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQiLHtraW5kOiJzY2FsYXIiLHJlc29sdmU6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPT1lJiYhKCFBLnRlc3QoZSl8fCJfIj09PWVbZS5sZW5ndGgtMV0pfSxjb25zdHJ1Y3Q6ZnVuY3Rpb24oZSl7dmFyIHQsbjtyZXR1cm4gbj0iLSI9PT0odD1lLnJlcGxhY2UoL18vZywiIikudG9Mb3dlckNhc2UoKSlbMF0/LTE6MSwiKy0iLmluZGV4T2YodFswXSk+PTAmJih0PXQuc2xpY2UoMSkpLCIuaW5mIj09PXQ/MT09PW4/TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOk51bWJlci5ORUdBVElWRV9JTkZJTklUWToiLm5hbiI9PT10P05hTjpuKnBhcnNlRmxvYXQodCwxMCl9LHByZWRpY2F0ZTpmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBOdW1iZXJdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSYmKGUlMSE9MHx8by5pc05lZ2F0aXZlWmVybyhlKSl9LHJlcHJlc2VudDpmdW5jdGlvbihlLHQpe3ZhciBuO2lmKGlzTmFOKGUpKXN3aXRjaCh0KXtjYXNlImxvd2VyY2FzZSI6cmV0dXJuIi5uYW4iO2Nhc2UidXBwZXJjYXNlIjpyZXR1cm4iLk5BTiI7Y2FzZSJjYW1lbGNhc2UiOnJldHVybiIuTmFOIn1lbHNlIGlmKE51bWJlci5QT1NJVElWRV9JTkZJTklUWT09PWUpc3dpdGNoKHQpe2Nhc2UibG93ZXJjYXNlIjpyZXR1cm4iLmluZiI7Y2FzZSJ1cHBlcmNhc2UiOnJldHVybiIuSU5GIjtjYXNlImNhbWVsY2FzZSI6cmV0dXJuIi5JbmYifWVsc2UgaWYoTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZPT09ZSlzd2l0Y2godCl7Y2FzZSJsb3dlcmNhc2UiOnJldHVybiItLmluZiI7Y2FzZSJ1cHBlcmNhc2UiOnJldHVybiItLklORiI7Y2FzZSJjYW1lbGNhc2UiOnJldHVybiItLkluZiJ9ZWxzZSBpZihvLmlzTmVnYXRpdmVaZXJvKGUpKXJldHVybiItMC4wIjtyZXR1cm4gbj1lLnRvU3RyaW5nKDEwKSxPLnRlc3Qobik/bi5yZXBsYWNlKCJlIiwiLmUiKTpufSxkZWZhdWx0U3R5bGU6Imxvd2VyY2FzZSJ9KSxqPV8uZXh0ZW5kKHtpbXBsaWNpdDpbdyx4LEMsa119KSxUPWosST1uZXcgUmVnRXhwKCJeKFswLTldWzAtOV1bMC05XVswLTldKS0oWzAtOV1bMC05XSktKFswLTldWzAtOV0pJCIpLFA9bmV3IFJlZ0V4cCgiXihbMC05XVswLTldWzAtOV1bMC05XSktKFswLTldWzAtOV0/KS0oWzAtOV1bMC05XT8pKD86W1R0XXxbIFxcdF0rKShbMC05XVswLTldPyk6KFswLTldWzAtOV0pOihbMC05XVswLTldKSg/OlxcLihbMC05XSopKT8oPzpbIFxcdF0qKFp8KFstK10pKFswLTldWzAtOV0/KSg/OjooWzAtOV1bMC05XSkpPykpPyQiKTt2YXIgTj1uZXcgaCgidGFnOnlhbWwub3JnLDIwMDI6dGltZXN0YW1wIix7a2luZDoic2NhbGFyIixyZXNvbHZlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT09ZSYmKG51bGwhPT1JLmV4ZWMoZSl8fG51bGwhPT1QLmV4ZWMoZSkpfSxjb25zdHJ1Y3Q6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLG8sYSxpLHMsdSxjPTAsbD1udWxsO2lmKG51bGw9PT0odD1JLmV4ZWMoZSkpJiYodD1QLmV4ZWMoZSkpLG51bGw9PT10KXRocm93IG5ldyBFcnJvcigiRGF0ZSByZXNvbHZlIGVycm9yIik7aWYobj0rdFsxXSxyPSt0WzJdLTEsbz0rdFszXSwhdFs0XSlyZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMobixyLG8pKTtpZihhPSt0WzRdLGk9K3RbNV0scz0rdFs2XSx0WzddKXtmb3IoYz10WzddLnNsaWNlKDAsMyk7Yy5sZW5ndGg8MzspYys9IjAiO2M9K2N9cmV0dXJuIHRbOV0mJihsPTZlNCooNjAqK3RbMTBdKyArKHRbMTFdfHwwKSksIi0iPT09dFs5XSYmKGw9LWwpKSx1PW5ldyBEYXRlKERhdGUuVVRDKG4scixvLGEsaSxzLGMpKSxsJiZ1LnNldFRpbWUodS5nZXRUaW1lKCktbCksdX0saW5zdGFuY2VPZjpEYXRlLHJlcHJlc2VudDpmdW5jdGlvbihlKXtyZXR1cm4gZS50b0lTT1N0cmluZygpfX0pO3ZhciBNPW5ldyBoKCJ0YWc6eWFtbC5vcmcsMjAwMjptZXJnZSIse2tpbmQ6InNjYWxhciIscmVzb2x2ZTpmdW5jdGlvbihlKXtyZXR1cm4iPDwiPT09ZXx8bnVsbD09PWV9fSksUj0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz1cblxyIjt2YXIgRD1uZXcgaCgidGFnOnlhbWwub3JnLDIwMDI6YmluYXJ5Iix7a2luZDoic2NhbGFyIixyZXNvbHZlOmZ1bmN0aW9uKGUpe2lmKG51bGw9PT1lKXJldHVybiExO3ZhciB0LG4scj0wLG89ZS5sZW5ndGgsYT1SO2ZvcihuPTA7bjxvO24rKylpZighKCh0PWEuaW5kZXhPZihlLmNoYXJBdChuKSkpPjY0KSl7aWYodDwwKXJldHVybiExO3IrPTZ9cmV0dXJuIHIlOD09MH0sY29uc3RydWN0OmZ1bmN0aW9uKGUpe3ZhciB0LG4scj1lLnJlcGxhY2UoL1tcclxuPV0vZywiIiksbz1yLmxlbmd0aCxhPVIsaT0wLHM9W107Zm9yKHQ9MDt0PG87dCsrKXQlND09MCYmdCYmKHMucHVzaChpPj4xNiYyNTUpLHMucHVzaChpPj44JjI1NSkscy5wdXNoKDI1NSZpKSksaT1pPDw2fGEuaW5kZXhPZihyLmNoYXJBdCh0KSk7cmV0dXJuIDA9PT0obj1vJTQqNik/KHMucHVzaChpPj4xNiYyNTUpLHMucHVzaChpPj44JjI1NSkscy5wdXNoKDI1NSZpKSk6MTg9PT1uPyhzLnB1c2goaT4+MTAmMjU1KSxzLnB1c2goaT4+MiYyNTUpKToxMj09PW4mJnMucHVzaChpPj40JjI1NSksbmV3IFVpbnQ4QXJyYXkocyl9LHByZWRpY2F0ZTpmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBVaW50OEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9LHJlcHJlc2VudDpmdW5jdGlvbihlKXt2YXIgdCxuLHI9IiIsbz0wLGE9ZS5sZW5ndGgsaT1SO2Zvcih0PTA7dDxhO3QrKyl0JTM9PTAmJnQmJihyKz1pW28+PjE4JjYzXSxyKz1pW28+PjEyJjYzXSxyKz1pW28+PjYmNjNdLHIrPWlbNjMmb10pLG89KG88PDgpK2VbdF07cmV0dXJuIDA9PT0obj1hJTMpPyhyKz1pW28+PjE4JjYzXSxyKz1pW28+PjEyJjYzXSxyKz1pW28+PjYmNjNdLHIrPWlbNjMmb10pOjI9PT1uPyhyKz1pW28+PjEwJjYzXSxyKz1pW28+PjQmNjNdLHIrPWlbbzw8MiY2M10scis9aVs2NF0pOjE9PT1uJiYocis9aVtvPj4yJjYzXSxyKz1pW288PDQmNjNdLHIrPWlbNjRdLHIrPWlbNjRdKSxyfX0pLEw9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxCPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7dmFyIEY9bmV3IGgoInRhZzp5YW1sLm9yZywyMDAyOm9tYXAiLHtraW5kOiJzZXF1ZW5jZSIscmVzb2x2ZTpmdW5jdGlvbihlKXtpZihudWxsPT09ZSlyZXR1cm4hMDt2YXIgdCxuLHIsbyxhLGk9W10scz1lO2Zvcih0PTAsbj1zLmxlbmd0aDt0PG47dCs9MSl7aWYocj1zW3RdLGE9ITEsIltvYmplY3QgT2JqZWN0XSIhPT1CLmNhbGwocikpcmV0dXJuITE7Zm9yKG8gaW4gcilpZihMLmNhbGwocixvKSl7aWYoYSlyZXR1cm4hMTthPSEwfWlmKCFhKXJldHVybiExO2lmKC0xIT09aS5pbmRleE9mKG8pKXJldHVybiExO2kucHVzaChvKX1yZXR1cm4hMH0sY29uc3RydWN0OmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT09ZT9lOltdfX0pLFU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzt2YXIgcT1uZXcgaCgidGFnOnlhbWwub3JnLDIwMDI6cGFpcnMiLHtraW5kOiJzZXF1ZW5jZSIscmVzb2x2ZTpmdW5jdGlvbihlKXtpZihudWxsPT09ZSlyZXR1cm4hMDt2YXIgdCxuLHIsbyxhLGk9ZTtmb3IoYT1uZXcgQXJyYXkoaS5sZW5ndGgpLHQ9MCxuPWkubGVuZ3RoO3Q8bjt0Kz0xKXtpZihyPWlbdF0sIltvYmplY3QgT2JqZWN0XSIhPT1VLmNhbGwocikpcmV0dXJuITE7aWYoMSE9PShvPU9iamVjdC5rZXlzKHIpKS5sZW5ndGgpcmV0dXJuITE7YVt0XT1bb1swXSxyW29bMF1dXX1yZXR1cm4hMH0sY29uc3RydWN0OmZ1bmN0aW9uKGUpe2lmKG51bGw9PT1lKXJldHVybltdO3ZhciB0LG4scixvLGEsaT1lO2ZvcihhPW5ldyBBcnJheShpLmxlbmd0aCksdD0wLG49aS5sZW5ndGg7dDxuO3QrPTEpcj1pW3RdLG89T2JqZWN0LmtleXMociksYVt0XT1bb1swXSxyW29bMF1dXTtyZXR1cm4gYX19KSx6PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIFY9bmV3IGgoInRhZzp5YW1sLm9yZywyMDAyOnNldCIse2tpbmQ6Im1hcHBpbmciLHJlc29sdmU6ZnVuY3Rpb24oZSl7aWYobnVsbD09PWUpcmV0dXJuITA7dmFyIHQsbj1lO2Zvcih0IGluIG4paWYoei5jYWxsKG4sdCkmJm51bGwhPT1uW3RdKXJldHVybiExO3JldHVybiEwfSxjb25zdHJ1Y3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPT1lP2U6e319fSksVz1ULmV4dGVuZCh7aW1wbGljaXQ6W04sTV0sZXhwbGljaXQ6W0QsRixxLFZdfSksSD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LCQ9L1tceDAwLVx4MDhceDBCXHgwQ1x4MEUtXHgxRlx4N0YtXHg4NFx4ODYtXHg5Rlx1RkZGRVx1RkZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdLyxKPS9bXHg4NVx1MjAyOFx1MjAyOV0vLEs9L1ssXFtcXVx7XH1dLyxZPS9eKD86IXwhIXwhW2EtelwtXSshKSQvaSxHPS9eKD86IXxbXixcW1xdXHtcfV0pKD86JVswLTlhLWZdezJ9fFswLTlhLXpcLSM7XC9cPzpAJj1cK1wkLF9cLiF+XConXChcKVxbXF1dKSokL2k7ZnVuY3Rpb24gWihlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfWZ1bmN0aW9uIFgoZSl7cmV0dXJuIDEwPT09ZXx8MTM9PT1lfWZ1bmN0aW9uIFEoZSl7cmV0dXJuIDk9PT1lfHwzMj09PWV9ZnVuY3Rpb24gZWUoZSl7cmV0dXJuIDk9PT1lfHwzMj09PWV8fDEwPT09ZXx8MTM9PT1lfWZ1bmN0aW9uIHRlKGUpe3JldHVybiA0ND09PWV8fDkxPT09ZXx8OTM9PT1lfHwxMjM9PT1lfHwxMjU9PT1lfWZ1bmN0aW9uIG5lKGUpe3ZhciB0O3JldHVybiA0ODw9ZSYmZTw9NTc/ZS00ODo5Nzw9KHQ9MzJ8ZSkmJnQ8PTEwMj90LTk3KzEwOi0xfWZ1bmN0aW9uIHJlKGUpe3JldHVybiA0OD09PWU/IlwwIjo5Nz09PWU/IgciOjk4PT09ZT8iXGIiOjExNj09PWV8fDk9PT1lPyJcdCI6MTEwPT09ZT8iXG4iOjExOD09PWU/Ilx2IjoxMDI9PT1lPyJcZiI6MTE0PT09ZT8iXHIiOjEwMT09PWU/IhsiOjMyPT09ZT8iICI6MzQ9PT1lPyciJzo0Nz09PWU/Ii8iOjkyPT09ZT8iXFwiOjc4PT09ZT8iwoUiOjk1PT09ZT8iwqAiOjc2PT09ZT8iXHUyMDI4Ijo4MD09PWU/Ilx1MjAyOSI6IiJ9ZnVuY3Rpb24gb2UoZSl7cmV0dXJuIGU8PTY1NTM1P1N0cmluZy5mcm9tQ2hhckNvZGUoZSk6U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NisoZS02NTUzNj4+MTApLDU2MzIwKyhlLTY1NTM2JjEwMjMpKX1mb3IodmFyIGFlPW5ldyBBcnJheSgyNTYpLGllPW5ldyBBcnJheSgyNTYpLHNlPTA7c2U8MjU2O3NlKyspYWVbc2VdPXJlKHNlKT8xOjAsaWVbc2VdPXJlKHNlKTtmdW5jdGlvbiB1ZShlLHQpe3RoaXMuaW5wdXQ9ZSx0aGlzLmZpbGVuYW1lPXQuZmlsZW5hbWV8fG51bGwsdGhpcy5zY2hlbWE9dC5zY2hlbWF8fFcsdGhpcy5vbldhcm5pbmc9dC5vbldhcm5pbmd8fG51bGwsdGhpcy5sZWdhY3k9dC5sZWdhY3l8fCExLHRoaXMuanNvbj10Lmpzb258fCExLHRoaXMubGlzdGVuZXI9dC5saXN0ZW5lcnx8bnVsbCx0aGlzLmltcGxpY2l0VHlwZXM9dGhpcy5zY2hlbWEuY29tcGlsZWRJbXBsaWNpdCx0aGlzLnR5cGVNYXA9dGhpcy5zY2hlbWEuY29tcGlsZWRUeXBlTWFwLHRoaXMubGVuZ3RoPWUubGVuZ3RoLHRoaXMucG9zaXRpb249MCx0aGlzLmxpbmU9MCx0aGlzLmxpbmVTdGFydD0wLHRoaXMubGluZUluZGVudD0wLHRoaXMuZmlyc3RUYWJJbkxpbmU9LTEsdGhpcy5kb2N1bWVudHM9W119ZnVuY3Rpb24gY2UoZSx0KXt2YXIgbj17bmFtZTplLmZpbGVuYW1lLGJ1ZmZlcjplLmlucHV0LnNsaWNlKDAsLTEpLHBvc2l0aW9uOmUucG9zaXRpb24sbGluZTplLmxpbmUsY29sdW1uOmUucG9zaXRpb24tZS5saW5lU3RhcnR9O3JldHVybiBuLnNuaXBwZXQ9bChuKSxuZXcgcyh0LG4pfWZ1bmN0aW9uIGxlKGUsdCl7dGhyb3cgY2UoZSx0KX1mdW5jdGlvbiBwZShlLHQpe2Uub25XYXJuaW5nJiZlLm9uV2FybmluZy5jYWxsKG51bGwsY2UoZSx0KSl9dmFyIGZlPXtZQU1MOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixvLGE7bnVsbCE9PWUudmVyc2lvbiYmbGUoZSwiZHVwbGljYXRpb24gb2YgJVlBTUwgZGlyZWN0aXZlIiksMSE9PW4ubGVuZ3RoJiZsZShlLCJZQU1MIGRpcmVjdGl2ZSBhY2NlcHRzIGV4YWN0bHkgb25lIGFyZ3VtZW50IiksbnVsbD09PShyPS9eKFswLTldKylcLihbMC05XSspJC8uZXhlYyhuWzBdKSkmJmxlKGUsImlsbC1mb3JtZWQgYXJndW1lbnQgb2YgdGhlIFlBTUwgZGlyZWN0aXZlIiksbz1wYXJzZUludChyWzFdLDEwKSxhPXBhcnNlSW50KHJbMl0sMTApLDEhPT1vJiZsZShlLCJ1bmFjY2VwdGFibGUgWUFNTCB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudCIpLGUudmVyc2lvbj1uWzBdLGUuY2hlY2tMaW5lQnJlYWtzPWE8MiwxIT09YSYmMiE9PWEmJnBlKGUsInVuc3VwcG9ydGVkIFlBTUwgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnQiKX0sVEFHOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixvOzIhPT1uLmxlbmd0aCYmbGUoZSwiVEFHIGRpcmVjdGl2ZSBhY2NlcHRzIGV4YWN0bHkgdHdvIGFyZ3VtZW50cyIpLHI9blswXSxvPW5bMV0sWS50ZXN0KHIpfHxsZShlLCJpbGwtZm9ybWVkIHRhZyBoYW5kbGUgKGZpcnN0IGFyZ3VtZW50KSBvZiB0aGUgVEFHIGRpcmVjdGl2ZSIpLEguY2FsbChlLnRhZ01hcCxyKSYmbGUoZSwndGhlcmUgaXMgYSBwcmV2aW91c2x5IGRlY2xhcmVkIHN1ZmZpeCBmb3IgIicrcisnIiB0YWcgaGFuZGxlJyksRy50ZXN0KG8pfHxsZShlLCJpbGwtZm9ybWVkIHRhZyBwcmVmaXggKHNlY29uZCBhcmd1bWVudCkgb2YgdGhlIFRBRyBkaXJlY3RpdmUiKTt0cnl7bz1kZWNvZGVVUklDb21wb25lbnQobyl9Y2F0Y2godCl7bGUoZSwidGFnIHByZWZpeCBpcyBtYWxmb3JtZWQ6ICIrbyl9ZS50YWdNYXBbcl09b319O2Z1bmN0aW9uIGhlKGUsdCxuLHIpe3ZhciBvLGEsaSxzO2lmKHQ8bil7aWYocz1lLmlucHV0LnNsaWNlKHQsbikscilmb3Iobz0wLGE9cy5sZW5ndGg7bzxhO28rPTEpOT09PShpPXMuY2hhckNvZGVBdChvKSl8fDMyPD1pJiZpPD0xMTE0MTExfHxsZShlLCJleHBlY3RlZCB2YWxpZCBKU09OIGNoYXJhY3RlciIpO2Vsc2UgJC50ZXN0KHMpJiZsZShlLCJ0aGUgc3RyZWFtIGNvbnRhaW5zIG5vbi1wcmludGFibGUgY2hhcmFjdGVycyIpO2UucmVzdWx0Kz1zfX1mdW5jdGlvbiBkZShlLHQsbixyKXt2YXIgYSxpLHMsdTtmb3Ioby5pc09iamVjdChuKXx8bGUoZSwiY2Fubm90IG1lcmdlIG1hcHBpbmdzOyB0aGUgcHJvdmlkZWQgc291cmNlIG9iamVjdCBpcyB1bmFjY2VwdGFibGUiKSxzPTAsdT0oYT1PYmplY3Qua2V5cyhuKSkubGVuZ3RoO3M8dTtzKz0xKWk9YVtzXSxILmNhbGwodCxpKXx8KHRbaV09bltpXSxyW2ldPSEwKX1mdW5jdGlvbiBtZShlLHQsbixyLG8sYSxpLHMsdSl7dmFyIGMsbDtpZihBcnJheS5pc0FycmF5KG8pKWZvcihjPTAsbD0obz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChvKSkubGVuZ3RoO2M8bDtjKz0xKUFycmF5LmlzQXJyYXkob1tjXSkmJmxlKGUsIm5lc3RlZCBhcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW5zaWRlIGtleXMiKSwib2JqZWN0Ij09dHlwZW9mIG8mJiJbb2JqZWN0IE9iamVjdF0iPT09WihvW2NdKSYmKG9bY109IltvYmplY3QgT2JqZWN0XSIpO2lmKCJvYmplY3QiPT10eXBlb2YgbyYmIltvYmplY3QgT2JqZWN0XSI9PT1aKG8pJiYobz0iW29iamVjdCBPYmplY3RdIiksbz1TdHJpbmcobyksbnVsbD09PXQmJih0PXt9KSwidGFnOnlhbWwub3JnLDIwMDI6bWVyZ2UiPT09cilpZihBcnJheS5pc0FycmF5KGEpKWZvcihjPTAsbD1hLmxlbmd0aDtjPGw7Yys9MSlkZShlLHQsYVtjXSxuKTtlbHNlIGRlKGUsdCxhLG4pO2Vsc2UgZS5qc29ufHxILmNhbGwobixvKXx8IUguY2FsbCh0LG8pfHwoZS5saW5lPWl8fGUubGluZSxlLmxpbmVTdGFydD1zfHxlLmxpbmVTdGFydCxlLnBvc2l0aW9uPXV8fGUucG9zaXRpb24sbGUoZSwiZHVwbGljYXRlZCBtYXBwaW5nIGtleSIpKSwiX19wcm90b19fIj09PW8/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbyx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6YX0pOnRbb109YSxkZWxldGUgbltvXTtyZXR1cm4gdH1mdW5jdGlvbiB2ZShlKXt2YXIgdDsxMD09PSh0PWUuaW5wdXQuY2hhckNvZGVBdChlLnBvc2l0aW9uKSk/ZS5wb3NpdGlvbisrOjEzPT09dD8oZS5wb3NpdGlvbisrLDEwPT09ZS5pbnB1dC5jaGFyQ29kZUF0KGUucG9zaXRpb24pJiZlLnBvc2l0aW9uKyspOmxlKGUsImEgbGluZSBicmVhayBpcyBleHBlY3RlZCIpLGUubGluZSs9MSxlLmxpbmVTdGFydD1lLnBvc2l0aW9uLGUuZmlyc3RUYWJJbkxpbmU9LTF9ZnVuY3Rpb24gZ2UoZSx0LG4pe2Zvcih2YXIgcj0wLG89ZS5pbnB1dC5jaGFyQ29kZUF0KGUucG9zaXRpb24pOzAhPT1vOyl7Zm9yKDtRKG8pOyk5PT09byYmLTE9PT1lLmZpcnN0VGFiSW5MaW5lJiYoZS5maXJzdFRhYkluTGluZT1lLnBvc2l0aW9uKSxvPWUuaW5wdXQuY2hhckNvZGVBdCgrK2UucG9zaXRpb24pO2lmKHQmJjM1PT09bylkb3tvPWUuaW5wdXQuY2hhckNvZGVBdCgrK2UucG9zaXRpb24pfXdoaWxlKDEwIT09byYmMTMhPT1vJiYwIT09byk7aWYoIVgobykpYnJlYWs7Zm9yKHZlKGUpLG89ZS5pbnB1dC5jaGFyQ29kZUF0KGUucG9zaXRpb24pLHIrKyxlLmxpbmVJbmRlbnQ9MDszMj09PW87KWUubGluZUluZGVudCsrLG89ZS5pbnB1dC5jaGFyQ29kZUF0KCsrZS5wb3NpdGlvbil9cmV0dXJuLTEhPT1uJiYwIT09ciYmZS5saW5lSW5kZW50PG4mJnBlKGUsImRlZmljaWVudCBpbmRlbnRhdGlvbiIpLHJ9ZnVuY3Rpb24geWUoZSl7dmFyIHQsbj1lLnBvc2l0aW9uO3JldHVybiEoNDUhPT0odD1lLmlucHV0LmNoYXJDb2RlQXQobikpJiY0NiE9PXR8fHQhPT1lLmlucHV0LmNoYXJDb2RlQXQobisxKXx8dCE9PWUuaW5wdXQuY2hhckNvZGVBdChuKzIpfHwobis9MywwIT09KHQ9ZS5pbnB1dC5jaGFyQ29kZUF0KG4pKSYmIWVlKHQpKSl9ZnVuY3Rpb24gYmUoZSx0KXsxPT09dD9lLnJlc3VsdCs9IiAiOnQ+MSYmKGUucmVzdWx0Kz1vLnJlcGVhdCgiXG4iLHQtMSkpfWZ1bmN0aW9uIF9lKGUsdCl7dmFyIG4scixvPWUudGFnLGE9ZS5hbmNob3IsaT1bXSxzPSExO2lmKC0xIT09ZS5maXJzdFRhYkluTGluZSlyZXR1cm4hMTtmb3IobnVsbCE9PWUuYW5jaG9yJiYoZS5hbmNob3JNYXBbZS5hbmNob3JdPWkpLHI9ZS5pbnB1dC5jaGFyQ29kZUF0KGUucG9zaXRpb24pOzAhPT1yJiYoLTEhPT1lLmZpcnN0VGFiSW5MaW5lJiYoZS5wb3NpdGlvbj1lLmZpcnN0VGFiSW5MaW5lLGxlKGUsInRhYiBjaGFyYWN0ZXJzIG11c3Qgbm90IGJlIHVzZWQgaW4gaW5kZW50YXRpb24iKSksNDU9PT1yKSYmZWUoZS5pbnB1dC5jaGFyQ29kZUF0KGUucG9zaXRpb24rMSkpOylpZihzPSEwLGUucG9zaXRpb24rKyxnZShlLCEwLC0xKSYmZS5saW5lSW5kZW50PD10KWkucHVzaChudWxsKSxyPWUuaW5wdXQuY2hhckNvZGVBdChlLnBvc2l0aW9uKTtlbHNlIGlmKG49ZS5saW5lLEVlKGUsdCwzLCExLCEwKSxpLnB1c2goZS5yZXN1bHQpLGdlKGUsITAsLTEpLHI9ZS5pbnB1dC5jaGFyQ29kZUF0KGUucG9zaXRpb24pLChlLmxpbmU9PT1ufHxlLmxpbmVJbmRlbnQ+dCkmJjAhPT1yKWxlKGUsImJhZCBpbmRlbnRhdGlvbiBvZiBhIHNlcXVlbmNlIGVudHJ5Iik7ZWxzZSBpZihlLmxpbmVJbmRlbnQ8dClicmVhaztyZXR1cm4hIXMmJihlLnRhZz1vLGUuYW5jaG9yPWEsZS5raW5kPSJzZXF1ZW5jZSIsZS5yZXN1bHQ9aSwhMCl9ZnVuY3Rpb24gd2UoZSl7dmFyIHQsbixyLG8sYT0hMSxpPSExO2lmKDMzIT09KG89ZS5pbnB1dC5jaGFyQ29kZUF0KGUucG9zaXRpb24pKSlyZXR1cm4hMTtpZihudWxsIT09ZS50YWcmJmxlKGUsImR1cGxpY2F0aW9uIG9mIGEgdGFnIHByb3BlcnR5IiksNjA9PT0obz1lLmlucHV0LmNoYXJDb2RlQXQoKytlLnBvc2l0aW9uKSk/KGE9ITAsbz1lLmlucHV0LmNoYXJDb2RlQXQoKytlLnBvc2l0aW9uKSk6MzM9PT1vPyhpPSEwLG49IiEhIixvPWUuaW5wdXQuY2hhckNvZGVBdCgrK2UucG9zaXRpb24pKTpuPSIhIix0PWUucG9zaXRpb24sYSl7ZG97bz1lLmlucHV0LmNoYXJDb2RlQXQoKytlLnBvc2l0aW9uKX13aGlsZSgwIT09byYmNjIhPT1vKTtlLnBvc2l0aW9uPGUubGVuZ3RoPyhyPWUuaW5wdXQuc2xpY2UodCxlLnBvc2l0aW9uKSxvPWUuaW5wdXQuY2hhckNvZGVBdCgrK2UucG9zaXRpb24pKTpsZShlLCJ1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIHZlcmJhdGltIHRhZyIpfWVsc2V7Zm9yKDswIT09byYmIWVlKG8pOykzMz09PW8mJihpP2xlKGUsInRhZyBzdWZmaXggY2Fubm90IGNvbnRhaW4gZXhjbGFtYXRpb24gbWFya3MiKToobj1lLmlucHV0LnNsaWNlKHQtMSxlLnBvc2l0aW9uKzEpLFkudGVzdChuKXx8bGUoZSwibmFtZWQgdGFnIGhhbmRsZSBjYW5ub3QgY29udGFpbiBzdWNoIGNoYXJhY3RlcnMiKSxpPSEwLHQ9ZS5wb3NpdGlvbisxKSksbz1lLmlucHV0LmNoYXJDb2RlQXQoKytlLnBvc2l0aW9uKTtyPWUuaW5wdXQuc2xpY2UodCxlLnBvc2l0aW9uKSxLLnRlc3QocikmJmxlKGUsInRhZyBzdWZmaXggY2Fubm90IGNvbnRhaW4gZmxvdyBpbmRpY2F0b3IgY2hhcmFjdGVycyIpfXImJiFHLnRlc3QocikmJmxlKGUsInRhZyBuYW1lIGNhbm5vdCBjb250YWluIHN1Y2ggY2hhcmFjdGVyczogIityKTt0cnl7cj1kZWNvZGVVUklDb21wb25lbnQocil9Y2F0Y2godCl7bGUoZSwidGFnIG5hbWUgaXMgbWFsZm9ybWVkOiAiK3IpfXJldHVybiBhP2UudGFnPXI6SC5jYWxsKGUudGFnTWFwLG4pP2UudGFnPWUudGFnTWFwW25dK3I6IiEiPT09bj9lLnRhZz0iISIrcjoiISEiPT09bj9lLnRhZz0idGFnOnlhbWwub3JnLDIwMDI6IityOmxlKGUsJ3VuZGVjbGFyZWQgdGFnIGhhbmRsZSAiJytuKyciJyksITB9ZnVuY3Rpb24geGUoZSl7dmFyIHQsbjtpZigzOCE9PShuPWUuaW5wdXQuY2hhckNvZGVBdChlLnBvc2l0aW9uKSkpcmV0dXJuITE7Zm9yKG51bGwhPT1lLmFuY2hvciYmbGUoZSwiZHVwbGljYXRpb24gb2YgYW4gYW5jaG9yIHByb3BlcnR5Iiksbj1lLmlucHV0LmNoYXJDb2RlQXQoKytlLnBvc2l0aW9uKSx0PWUucG9zaXRpb247MCE9PW4mJiFlZShuKSYmIXRlKG4pOyluPWUuaW5wdXQuY2hhckNvZGVBdCgrK2UucG9zaXRpb24pO3JldHVybiBlLnBvc2l0aW9uPT09dCYmbGUoZSwibmFtZSBvZiBhbiBhbmNob3Igbm9kZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGNoYXJhY3RlciIpLGUuYW5jaG9yPWUuaW5wdXQuc2xpY2UodCxlLnBvc2l0aW9uKSwhMH1mdW5jdGlvbiBFZShlLHQsbixyLGEpe3ZhciBpLHMsdSxjLGwscCxmLGgsZCxtPTEsdj0hMSxnPSExO2lmKG51bGwhPT1lLmxpc3RlbmVyJiZlLmxpc3RlbmVyKCJvcGVuIixlKSxlLnRhZz1udWxsLGUuYW5jaG9yPW51bGwsZS5raW5kPW51bGwsZS5yZXN1bHQ9bnVsbCxpPXM9dT00PT09bnx8Mz09PW4sciYmZ2UoZSwhMCwtMSkmJih2PSEwLGUubGluZUluZGVudD50P209MTplLmxpbmVJbmRlbnQ9PT10P209MDplLmxpbmVJbmRlbnQ8dCYmKG09LTEpKSwxPT09bSlmb3IoO3dlKGUpfHx4ZShlKTspZ2UoZSwhMCwtMSk/KHY9ITAsdT1pLGUubGluZUluZGVudD50P209MTplLmxpbmVJbmRlbnQ9PT10P209MDplLmxpbmVJbmRlbnQ8dCYmKG09LTEpKTp1PSExO2lmKHUmJih1PXZ8fGEpLDEhPT1tJiY0IT09bnx8KGg9MT09PW58fDI9PT1uP3Q6dCsxLGQ9ZS5wb3NpdGlvbi1lLmxpbmVTdGFydCwxPT09bT91JiYoX2UoZSxkKXx8ZnVuY3Rpb24oZSx0LG4pe3ZhciByLG8sYSxpLHMsdSxjLGw9ZS50YWcscD1lLmFuY2hvcixmPXt9LGg9T2JqZWN0LmNyZWF0ZShudWxsKSxkPW51bGwsbT1udWxsLHY9bnVsbCxnPSExLHk9ITE7aWYoLTEhPT1lLmZpcnN0VGFiSW5MaW5lKXJldHVybiExO2ZvcihudWxsIT09ZS5hbmNob3ImJihlLmFuY2hvck1hcFtlLmFuY2hvcl09ZiksYz1lLmlucHV0LmNoYXJDb2RlQXQoZS5wb3NpdGlvbik7MCE9PWM7KXtpZihnfHwtMT09PWUuZmlyc3RUYWJJbkxpbmV8fChlLnBvc2l0aW9uPWUuZmlyc3RUYWJJbkxpbmUsbGUoZSwidGFiIGNoYXJhY3RlcnMgbXVzdCBub3QgYmUgdXNlZCBpbiBpbmRlbnRhdGlvbiIpKSxyPWUuaW5wdXQuY2hhckNvZGVBdChlLnBvc2l0aW9uKzEpLGE9ZS5saW5lLDYzIT09YyYmNTghPT1jfHwhZWUocikpe2lmKGk9ZS5saW5lLHM9ZS5saW5lU3RhcnQsdT1lLnBvc2l0aW9uLCFFZShlLG4sMiwhMSwhMCkpYnJlYWs7aWYoZS5saW5lPT09YSl7Zm9yKGM9ZS5pbnB1dC5jaGFyQ29kZUF0KGUucG9zaXRpb24pO1EoYyk7KWM9ZS5pbnB1dC5jaGFyQ29kZUF0KCsrZS5wb3NpdGlvbik7aWYoNTg9PT1jKWVlKGM9ZS5pbnB1dC5jaGFyQ29kZUF0KCsrZS5wb3NpdGlvbikpfHxsZShlLCJhIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIGV4cGVjdGVkIGFmdGVyIHRoZSBrZXktdmFsdWUgc2VwYXJhdG9yIHdpdGhpbiBhIGJsb2NrIG1hcHBpbmciKSxnJiYobWUoZSxmLGgsZCxtLG51bGwsaSxzLHUpLGQ9bT12PW51bGwpLHk9ITAsZz0hMSxvPSExLGQ9ZS50YWcsbT1lLnJlc3VsdDtlbHNle2lmKCF5KXJldHVybiBlLnRhZz1sLGUuYW5jaG9yPXAsITA7bGUoZSwiY2FuIG5vdCByZWFkIGFuIGltcGxpY2l0IG1hcHBpbmcgcGFpcjsgYSBjb2xvbiBpcyBtaXNzZWQiKX19ZWxzZXtpZigheSlyZXR1cm4gZS50YWc9bCxlLmFuY2hvcj1wLCEwO2xlKGUsImNhbiBub3QgcmVhZCBhIGJsb2NrIG1hcHBpbmcgZW50cnk7IGEgbXVsdGlsaW5lIGtleSBtYXkgbm90IGJlIGFuIGltcGxpY2l0IGtleSIpfX1lbHNlIDYzPT09Yz8oZyYmKG1lKGUsZixoLGQsbSxudWxsLGkscyx1KSxkPW09dj1udWxsKSx5PSEwLGc9ITAsbz0hMCk6Zz8oZz0hMSxvPSEwKTpsZShlLCJpbmNvbXBsZXRlIGV4cGxpY2l0IG1hcHBpbmcgcGFpcjsgYSBrZXkgbm9kZSBpcyBtaXNzZWQ7IG9yIGZvbGxvd2VkIGJ5IGEgbm9uLXRhYnVsYXRlZCBlbXB0eSBsaW5lIiksZS5wb3NpdGlvbis9MSxjPXI7aWYoKGUubGluZT09PWF8fGUubGluZUluZGVudD50KSYmKGcmJihpPWUubGluZSxzPWUubGluZVN0YXJ0LHU9ZS5wb3NpdGlvbiksRWUoZSx0LDQsITAsbykmJihnP209ZS5yZXN1bHQ6dj1lLnJlc3VsdCksZ3x8KG1lKGUsZixoLGQsbSx2LGkscyx1KSxkPW09dj1udWxsKSxnZShlLCEwLC0xKSxjPWUuaW5wdXQuY2hhckNvZGVBdChlLnBvc2l0aW9uKSksKGUubGluZT09PWF8fGUubGluZUluZGVudD50KSYmMCE9PWMpbGUoZSwiYmFkIGluZGVudGF0aW9uIG9mIGEgbWFwcGluZyBlbnRyeSIpO2Vsc2UgaWYoZS5saW5lSW5kZW50PHQpYnJlYWt9cmV0dXJuIGcmJm1lKGUsZixoLGQsbSxudWxsLGkscyx1KSx5JiYoZS50YWc9bCxlLmFuY2hvcj1wLGUua2luZD0ibWFwcGluZyIsZS5yZXN1bHQ9ZikseX0oZSxkLGgpKXx8ZnVuY3Rpb24oZSx0KXt2YXIgbixyLG8sYSxpLHMsdSxjLGwscCxmLGgsZD0hMCxtPWUudGFnLHY9ZS5hbmNob3IsZz1PYmplY3QuY3JlYXRlKG51bGwpO2lmKDkxPT09KGg9ZS5pbnB1dC5jaGFyQ29kZUF0KGUucG9zaXRpb24pKSlpPTkzLGM9ITEsYT1bXTtlbHNle2lmKDEyMyE9PWgpcmV0dXJuITE7aT0xMjUsYz0hMCxhPXt9fWZvcihudWxsIT09ZS5hbmNob3ImJihlLmFuY2hvck1hcFtlLmFuY2hvcl09YSksaD1lLmlucHV0LmNoYXJDb2RlQXQoKytlLnBvc2l0aW9uKTswIT09aDspe2lmKGdlKGUsITAsdCksKGg9ZS5pbnB1dC5jaGFyQ29kZUF0KGUucG9zaXRpb24pKT09PWkpcmV0dXJuIGUucG9zaXRpb24rKyxlLnRhZz1tLGUuYW5jaG9yPXYsZS5raW5kPWM/Im1hcHBpbmciOiJzZXF1ZW5jZSIsZS5yZXN1bHQ9YSwhMDtkPzQ0PT09aCYmbGUoZSwiZXhwZWN0ZWQgdGhlIG5vZGUgY29udGVudCwgYnV0IGZvdW5kICcsJyIpOmxlKGUsIm1pc3NlZCBjb21tYSBiZXR3ZWVuIGZsb3cgY29sbGVjdGlvbiBlbnRyaWVzIiksZj1udWxsLHM9dT0hMSw2Mz09PWgmJmVlKGUuaW5wdXQuY2hhckNvZGVBdChlLnBvc2l0aW9uKzEpKSYmKHM9dT0hMCxlLnBvc2l0aW9uKyssZ2UoZSwhMCx0KSksbj1lLmxpbmUscj1lLmxpbmVTdGFydCxvPWUucG9zaXRpb24sRWUoZSx0LDEsITEsITApLHA9ZS50YWcsbD1lLnJlc3VsdCxnZShlLCEwLHQpLGg9ZS5pbnB1dC5jaGFyQ29kZUF0KGUucG9zaXRpb24pLCF1JiZlLmxpbmUhPT1ufHw1OCE9PWh8fChzPSEwLGg9ZS5pbnB1dC5jaGFyQ29kZUF0KCsrZS5wb3NpdGlvbiksZ2UoZSwhMCx0KSxFZShlLHQsMSwhMSwhMCksZj1lLnJlc3VsdCksYz9tZShlLGEsZyxwLGwsZixuLHIsbyk6cz9hLnB1c2gobWUoZSxudWxsLGcscCxsLGYsbixyLG8pKTphLnB1c2gobCksZ2UoZSwhMCx0KSw0ND09PShoPWUuaW5wdXQuY2hhckNvZGVBdChlLnBvc2l0aW9uKSk/KGQ9ITAsaD1lLmlucHV0LmNoYXJDb2RlQXQoKytlLnBvc2l0aW9uKSk6ZD0hMX1sZShlLCJ1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIGZsb3cgY29sbGVjdGlvbiIpfShlLGgpP2c9ITA6KHMmJmZ1bmN0aW9uKGUsdCl7dmFyIG4scixhLGkscyx1PTEsYz0hMSxsPSExLHA9dCxmPTAsaD0hMTtpZigxMjQ9PT0oaT1lLmlucHV0LmNoYXJDb2RlQXQoZS5wb3NpdGlvbikpKXI9ITE7ZWxzZXtpZig2MiE9PWkpcmV0dXJuITE7cj0hMH1mb3IoZS5raW5kPSJzY2FsYXIiLGUucmVzdWx0PSIiOzAhPT1pOylpZig0Mz09PShpPWUuaW5wdXQuY2hhckNvZGVBdCgrK2UucG9zaXRpb24pKXx8NDU9PT1pKTE9PT11P3U9NDM9PT1pPzM6MjpsZShlLCJyZXBlYXQgb2YgYSBjaG9tcGluZyBtb2RlIGlkZW50aWZpZXIiKTtlbHNle2lmKCEoKGE9NDg8PShzPWkpJiZzPD01Nz9zLTQ4Oi0xKT49MCkpYnJlYWs7MD09PWE/bGUoZSwiYmFkIGV4cGxpY2l0IGluZGVudGF0aW9uIHdpZHRoIG9mIGEgYmxvY2sgc2NhbGFyOyBpdCBjYW5ub3QgYmUgbGVzcyB0aGFuIG9uZSIpOmw/bGUoZSwicmVwZWF0IG9mIGFuIGluZGVudGF0aW9uIHdpZHRoIGlkZW50aWZpZXIiKToocD10K2EtMSxsPSEwKX1pZihRKGkpKXtkb3tpPWUuaW5wdXQuY2hhckNvZGVBdCgrK2UucG9zaXRpb24pfXdoaWxlKFEoaSkpO2lmKDM1PT09aSlkb3tpPWUuaW5wdXQuY2hhckNvZGVBdCgrK2UucG9zaXRpb24pfXdoaWxlKCFYKGkpJiYwIT09aSl9Zm9yKDswIT09aTspe2Zvcih2ZShlKSxlLmxpbmVJbmRlbnQ9MCxpPWUuaW5wdXQuY2hhckNvZGVBdChlLnBvc2l0aW9uKTsoIWx8fGUubGluZUluZGVudDxwKSYmMzI9PT1pOyllLmxpbmVJbmRlbnQrKyxpPWUuaW5wdXQuY2hhckNvZGVBdCgrK2UucG9zaXRpb24pO2lmKCFsJiZlLmxpbmVJbmRlbnQ+cCYmKHA9ZS5saW5lSW5kZW50KSxYKGkpKWYrKztlbHNle2lmKGUubGluZUluZGVudDxwKXszPT09dT9lLnJlc3VsdCs9by5yZXBlYXQoIlxuIixjPzErZjpmKToxPT09dSYmYyYmKGUucmVzdWx0Kz0iXG4iKTticmVha31mb3Iocj9RKGkpPyhoPSEwLGUucmVzdWx0Kz1vLnJlcGVhdCgiXG4iLGM/MStmOmYpKTpoPyhoPSExLGUucmVzdWx0Kz1vLnJlcGVhdCgiXG4iLGYrMSkpOjA9PT1mP2MmJihlLnJlc3VsdCs9IiAiKTplLnJlc3VsdCs9by5yZXBlYXQoIlxuIixmKTplLnJlc3VsdCs9by5yZXBlYXQoIlxuIixjPzErZjpmKSxjPSEwLGw9ITAsZj0wLG49ZS5wb3NpdGlvbjshWChpKSYmMCE9PWk7KWk9ZS5pbnB1dC5jaGFyQ29kZUF0KCsrZS5wb3NpdGlvbik7aGUoZSxuLGUucG9zaXRpb24sITEpfX1yZXR1cm4hMH0oZSxoKXx8ZnVuY3Rpb24oZSx0KXt2YXIgbixyLG87aWYoMzkhPT0obj1lLmlucHV0LmNoYXJDb2RlQXQoZS5wb3NpdGlvbikpKXJldHVybiExO2ZvcihlLmtpbmQ9InNjYWxhciIsZS5yZXN1bHQ9IiIsZS5wb3NpdGlvbisrLHI9bz1lLnBvc2l0aW9uOzAhPT0obj1lLmlucHV0LmNoYXJDb2RlQXQoZS5wb3NpdGlvbikpOylpZigzOT09PW4pe2lmKGhlKGUscixlLnBvc2l0aW9uLCEwKSwzOSE9PShuPWUuaW5wdXQuY2hhckNvZGVBdCgrK2UucG9zaXRpb24pKSlyZXR1cm4hMDtyPWUucG9zaXRpb24sZS5wb3NpdGlvbisrLG89ZS5wb3NpdGlvbn1lbHNlIFgobik/KGhlKGUscixvLCEwKSxiZShlLGdlKGUsITEsdCkpLHI9bz1lLnBvc2l0aW9uKTplLnBvc2l0aW9uPT09ZS5saW5lU3RhcnQmJnllKGUpP2xlKGUsInVuZXhwZWN0ZWQgZW5kIG9mIHRoZSBkb2N1bWVudCB3aXRoaW4gYSBzaW5nbGUgcXVvdGVkIHNjYWxhciIpOihlLnBvc2l0aW9uKyssbz1lLnBvc2l0aW9uKTtsZShlLCJ1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIHNpbmdsZSBxdW90ZWQgc2NhbGFyIil9KGUsaCl8fGZ1bmN0aW9uKGUsdCl7dmFyIG4scixvLGEsaSxzLHU7aWYoMzQhPT0ocz1lLmlucHV0LmNoYXJDb2RlQXQoZS5wb3NpdGlvbikpKXJldHVybiExO2ZvcihlLmtpbmQ9InNjYWxhciIsZS5yZXN1bHQ9IiIsZS5wb3NpdGlvbisrLG49cj1lLnBvc2l0aW9uOzAhPT0ocz1lLmlucHV0LmNoYXJDb2RlQXQoZS5wb3NpdGlvbikpOyl7aWYoMzQ9PT1zKXJldHVybiBoZShlLG4sZS5wb3NpdGlvbiwhMCksZS5wb3NpdGlvbisrLCEwO2lmKDkyPT09cyl7aWYoaGUoZSxuLGUucG9zaXRpb24sITApLFgocz1lLmlucHV0LmNoYXJDb2RlQXQoKytlLnBvc2l0aW9uKSkpZ2UoZSwhMSx0KTtlbHNlIGlmKHM8MjU2JiZhZVtzXSllLnJlc3VsdCs9aWVbc10sZS5wb3NpdGlvbisrO2Vsc2UgaWYoKGk9MTIwPT09KHU9cyk/MjoxMTc9PT11PzQ6ODU9PT11Pzg6MCk+MCl7Zm9yKG89aSxhPTA7bz4wO28tLSkoaT1uZShzPWUuaW5wdXQuY2hhckNvZGVBdCgrK2UucG9zaXRpb24pKSk+PTA/YT0oYTw8NCkraTpsZShlLCJleHBlY3RlZCBoZXhhZGVjaW1hbCBjaGFyYWN0ZXIiKTtlLnJlc3VsdCs9b2UoYSksZS5wb3NpdGlvbisrfWVsc2UgbGUoZSwidW5rbm93biBlc2NhcGUgc2VxdWVuY2UiKTtuPXI9ZS5wb3NpdGlvbn1lbHNlIFgocyk/KGhlKGUsbixyLCEwKSxiZShlLGdlKGUsITEsdCkpLG49cj1lLnBvc2l0aW9uKTplLnBvc2l0aW9uPT09ZS5saW5lU3RhcnQmJnllKGUpP2xlKGUsInVuZXhwZWN0ZWQgZW5kIG9mIHRoZSBkb2N1bWVudCB3aXRoaW4gYSBkb3VibGUgcXVvdGVkIHNjYWxhciIpOihlLnBvc2l0aW9uKysscj1lLnBvc2l0aW9uKX1sZShlLCJ1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIGRvdWJsZSBxdW90ZWQgc2NhbGFyIil9KGUsaCk/Zz0hMDohZnVuY3Rpb24oZSl7dmFyIHQsbixyO2lmKDQyIT09KHI9ZS5pbnB1dC5jaGFyQ29kZUF0KGUucG9zaXRpb24pKSlyZXR1cm4hMTtmb3Iocj1lLmlucHV0LmNoYXJDb2RlQXQoKytlLnBvc2l0aW9uKSx0PWUucG9zaXRpb247MCE9PXImJiFlZShyKSYmIXRlKHIpOylyPWUuaW5wdXQuY2hhckNvZGVBdCgrK2UucG9zaXRpb24pO3JldHVybiBlLnBvc2l0aW9uPT09dCYmbGUoZSwibmFtZSBvZiBhbiBhbGlhcyBub2RlIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIiksbj1lLmlucHV0LnNsaWNlKHQsZS5wb3NpdGlvbiksSC5jYWxsKGUuYW5jaG9yTWFwLG4pfHxsZShlLCd1bmlkZW50aWZpZWQgYWxpYXMgIicrbisnIicpLGUucmVzdWx0PWUuYW5jaG9yTWFwW25dLGdlKGUsITAsLTEpLCEwfShlKT9mdW5jdGlvbihlLHQsbil7dmFyIHIsbyxhLGkscyx1LGMsbCxwPWUua2luZCxmPWUucmVzdWx0O2lmKGVlKGw9ZS5pbnB1dC5jaGFyQ29kZUF0KGUucG9zaXRpb24pKXx8dGUobCl8fDM1PT09bHx8Mzg9PT1sfHw0Mj09PWx8fDMzPT09bHx8MTI0PT09bHx8NjI9PT1sfHwzOT09PWx8fDM0PT09bHx8Mzc9PT1sfHw2ND09PWx8fDk2PT09bClyZXR1cm4hMTtpZigoNjM9PT1sfHw0NT09PWwpJiYoZWUocj1lLmlucHV0LmNoYXJDb2RlQXQoZS5wb3NpdGlvbisxKSl8fG4mJnRlKHIpKSlyZXR1cm4hMTtmb3IoZS5raW5kPSJzY2FsYXIiLGUucmVzdWx0PSIiLG89YT1lLnBvc2l0aW9uLGk9ITE7MCE9PWw7KXtpZig1OD09PWwpe2lmKGVlKHI9ZS5pbnB1dC5jaGFyQ29kZUF0KGUucG9zaXRpb24rMSkpfHxuJiZ0ZShyKSlicmVha31lbHNlIGlmKDM1PT09bCl7aWYoZWUoZS5pbnB1dC5jaGFyQ29kZUF0KGUucG9zaXRpb24tMSkpKWJyZWFrfWVsc2V7aWYoZS5wb3NpdGlvbj09PWUubGluZVN0YXJ0JiZ5ZShlKXx8biYmdGUobCkpYnJlYWs7aWYoWChsKSl7aWYocz1lLmxpbmUsdT1lLmxpbmVTdGFydCxjPWUubGluZUluZGVudCxnZShlLCExLC0xKSxlLmxpbmVJbmRlbnQ+PXQpe2k9ITAsbD1lLmlucHV0LmNoYXJDb2RlQXQoZS5wb3NpdGlvbik7Y29udGludWV9ZS5wb3NpdGlvbj1hLGUubGluZT1zLGUubGluZVN0YXJ0PXUsZS5saW5lSW5kZW50PWM7YnJlYWt9fWkmJihoZShlLG8sYSwhMSksYmUoZSxlLmxpbmUtcyksbz1hPWUucG9zaXRpb24saT0hMSksUShsKXx8KGE9ZS5wb3NpdGlvbisxKSxsPWUuaW5wdXQuY2hhckNvZGVBdCgrK2UucG9zaXRpb24pfXJldHVybiBoZShlLG8sYSwhMSksISFlLnJlc3VsdHx8KGUua2luZD1wLGUucmVzdWx0PWYsITEpfShlLGgsMT09PW4pJiYoZz0hMCxudWxsPT09ZS50YWcmJihlLnRhZz0iPyIpKTooZz0hMCxudWxsPT09ZS50YWcmJm51bGw9PT1lLmFuY2hvcnx8bGUoZSwiYWxpYXMgbm9kZSBzaG91bGQgbm90IGhhdmUgYW55IHByb3BlcnRpZXMiKSksbnVsbCE9PWUuYW5jaG9yJiYoZS5hbmNob3JNYXBbZS5hbmNob3JdPWUucmVzdWx0KSk6MD09PW0mJihnPXUmJl9lKGUsZCkpKSxudWxsPT09ZS50YWcpbnVsbCE9PWUuYW5jaG9yJiYoZS5hbmNob3JNYXBbZS5hbmNob3JdPWUucmVzdWx0KTtlbHNlIGlmKCI/Ij09PWUudGFnKXtmb3IobnVsbCE9PWUucmVzdWx0JiYic2NhbGFyIiE9PWUua2luZCYmbGUoZSwndW5hY2NlcHRhYmxlIG5vZGUga2luZCBmb3IgITw/PiB0YWc7IGl0IHNob3VsZCBiZSAic2NhbGFyIiwgbm90ICInK2Uua2luZCsnIicpLGM9MCxsPWUuaW1wbGljaXRUeXBlcy5sZW5ndGg7YzxsO2MrPTEpaWYoKGY9ZS5pbXBsaWNpdFR5cGVzW2NdKS5yZXNvbHZlKGUucmVzdWx0KSl7ZS5yZXN1bHQ9Zi5jb25zdHJ1Y3QoZS5yZXN1bHQpLGUudGFnPWYudGFnLG51bGwhPT1lLmFuY2hvciYmKGUuYW5jaG9yTWFwW2UuYW5jaG9yXT1lLnJlc3VsdCk7YnJlYWt9fWVsc2UgaWYoIiEiIT09ZS50YWcpe2lmKEguY2FsbChlLnR5cGVNYXBbZS5raW5kfHwiZmFsbGJhY2siXSxlLnRhZykpZj1lLnR5cGVNYXBbZS5raW5kfHwiZmFsbGJhY2siXVtlLnRhZ107ZWxzZSBmb3IoZj1udWxsLGM9MCxsPShwPWUudHlwZU1hcC5tdWx0aVtlLmtpbmR8fCJmYWxsYmFjayJdKS5sZW5ndGg7YzxsO2MrPTEpaWYoZS50YWcuc2xpY2UoMCxwW2NdLnRhZy5sZW5ndGgpPT09cFtjXS50YWcpe2Y9cFtjXTticmVha31mfHxsZShlLCJ1bmtub3duIHRhZyAhPCIrZS50YWcrIj4iKSxudWxsIT09ZS5yZXN1bHQmJmYua2luZCE9PWUua2luZCYmbGUoZSwidW5hY2NlcHRhYmxlIG5vZGUga2luZCBmb3IgITwiK2UudGFnKyc+IHRhZzsgaXQgc2hvdWxkIGJlICInK2Yua2luZCsnIiwgbm90ICInK2Uua2luZCsnIicpLGYucmVzb2x2ZShlLnJlc3VsdCxlLnRhZyk/KGUucmVzdWx0PWYuY29uc3RydWN0KGUucmVzdWx0LGUudGFnKSxudWxsIT09ZS5hbmNob3ImJihlLmFuY2hvck1hcFtlLmFuY2hvcl09ZS5yZXN1bHQpKTpsZShlLCJjYW5ub3QgcmVzb2x2ZSBhIG5vZGUgd2l0aCAhPCIrZS50YWcrIj4gZXhwbGljaXQgdGFnIil9cmV0dXJuIG51bGwhPT1lLmxpc3RlbmVyJiZlLmxpc3RlbmVyKCJjbG9zZSIsZSksbnVsbCE9PWUudGFnfHxudWxsIT09ZS5hbmNob3J8fGd9ZnVuY3Rpb24gU2UoZSl7dmFyIHQsbixyLG8sYT1lLnBvc2l0aW9uLGk9ITE7Zm9yKGUudmVyc2lvbj1udWxsLGUuY2hlY2tMaW5lQnJlYWtzPWUubGVnYWN5LGUudGFnTWFwPU9iamVjdC5jcmVhdGUobnVsbCksZS5hbmNob3JNYXA9T2JqZWN0LmNyZWF0ZShudWxsKTswIT09KG89ZS5pbnB1dC5jaGFyQ29kZUF0KGUucG9zaXRpb24pKSYmKGdlKGUsITAsLTEpLG89ZS5pbnB1dC5jaGFyQ29kZUF0KGUucG9zaXRpb24pLCEoZS5saW5lSW5kZW50PjB8fDM3IT09bykpOyl7Zm9yKGk9ITAsbz1lLmlucHV0LmNoYXJDb2RlQXQoKytlLnBvc2l0aW9uKSx0PWUucG9zaXRpb247MCE9PW8mJiFlZShvKTspbz1lLmlucHV0LmNoYXJDb2RlQXQoKytlLnBvc2l0aW9uKTtmb3Iocj1bXSwobj1lLmlucHV0LnNsaWNlKHQsZS5wb3NpdGlvbikpLmxlbmd0aDwxJiZsZShlLCJkaXJlY3RpdmUgbmFtZSBtdXN0IG5vdCBiZSBsZXNzIHRoYW4gb25lIGNoYXJhY3RlciBpbiBsZW5ndGgiKTswIT09bzspe2Zvcig7UShvKTspbz1lLmlucHV0LmNoYXJDb2RlQXQoKytlLnBvc2l0aW9uKTtpZigzNT09PW8pe2Rve289ZS5pbnB1dC5jaGFyQ29kZUF0KCsrZS5wb3NpdGlvbil9d2hpbGUoMCE9PW8mJiFYKG8pKTticmVha31pZihYKG8pKWJyZWFrO2Zvcih0PWUucG9zaXRpb247MCE9PW8mJiFlZShvKTspbz1lLmlucHV0LmNoYXJDb2RlQXQoKytlLnBvc2l0aW9uKTtyLnB1c2goZS5pbnB1dC5zbGljZSh0LGUucG9zaXRpb24pKX0wIT09byYmdmUoZSksSC5jYWxsKGZlLG4pP2ZlW25dKGUsbixyKTpwZShlLCd1bmtub3duIGRvY3VtZW50IGRpcmVjdGl2ZSAiJytuKyciJyl9Z2UoZSwhMCwtMSksMD09PWUubGluZUluZGVudCYmNDU9PT1lLmlucHV0LmNoYXJDb2RlQXQoZS5wb3NpdGlvbikmJjQ1PT09ZS5pbnB1dC5jaGFyQ29kZUF0KGUucG9zaXRpb24rMSkmJjQ1PT09ZS5pbnB1dC5jaGFyQ29kZUF0KGUucG9zaXRpb24rMik/KGUucG9zaXRpb24rPTMsZ2UoZSwhMCwtMSkpOmkmJmxlKGUsImRpcmVjdGl2ZXMgZW5kIG1hcmsgaXMgZXhwZWN0ZWQiKSxFZShlLGUubGluZUluZGVudC0xLDQsITEsITApLGdlKGUsITAsLTEpLGUuY2hlY2tMaW5lQnJlYWtzJiZKLnRlc3QoZS5pbnB1dC5zbGljZShhLGUucG9zaXRpb24pKSYmcGUoZSwibm9uLUFTQ0lJIGxpbmUgYnJlYWtzIGFyZSBpbnRlcnByZXRlZCBhcyBjb250ZW50IiksZS5kb2N1bWVudHMucHVzaChlLnJlc3VsdCksZS5wb3NpdGlvbj09PWUubGluZVN0YXJ0JiZ5ZShlKT80Nj09PWUuaW5wdXQuY2hhckNvZGVBdChlLnBvc2l0aW9uKSYmKGUucG9zaXRpb24rPTMsZ2UoZSwhMCwtMSkpOmUucG9zaXRpb248ZS5sZW5ndGgtMSYmbGUoZSwiZW5kIG9mIHRoZSBzdHJlYW0gb3IgYSBkb2N1bWVudCBzZXBhcmF0b3IgaXMgZXhwZWN0ZWQiKX1mdW5jdGlvbiBDZShlLHQpe3Q9dHx8e30sMCE9PShlPVN0cmluZyhlKSkubGVuZ3RoJiYoMTAhPT1lLmNoYXJDb2RlQXQoZS5sZW5ndGgtMSkmJjEzIT09ZS5jaGFyQ29kZUF0KGUubGVuZ3RoLTEpJiYoZSs9IlxuIiksNjUyNzk9PT1lLmNoYXJDb2RlQXQoMCkmJihlPWUuc2xpY2UoMSkpKTt2YXIgbj1uZXcgdWUoZSx0KSxyPWUuaW5kZXhPZigiXDAiKTtmb3IoLTEhPT1yJiYobi5wb3NpdGlvbj1yLGxlKG4sIm51bGwgYnl0ZSBpcyBub3QgYWxsb3dlZCBpbiBpbnB1dCIpKSxuLmlucHV0Kz0iXDAiOzMyPT09bi5pbnB1dC5jaGFyQ29kZUF0KG4ucG9zaXRpb24pOyluLmxpbmVJbmRlbnQrPTEsbi5wb3NpdGlvbis9MTtmb3IoO24ucG9zaXRpb248bi5sZW5ndGgtMTspU2Uobik7cmV0dXJuIG4uZG9jdW1lbnRzfXZhciBBZT17bG9hZEFsbDpmdW5jdGlvbihlLHQsbil7bnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdCYmdm9pZCAwPT09biYmKG49dCx0PW51bGwpO3ZhciByPUNlKGUsbik7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpcmV0dXJuIHI7Zm9yKHZhciBvPTAsYT1yLmxlbmd0aDtvPGE7bys9MSl0KHJbb10pfSxsb2FkOmZ1bmN0aW9uKGUsdCl7dmFyIG49Q2UoZSx0KTtpZigwIT09bi5sZW5ndGgpe2lmKDE9PT1uLmxlbmd0aClyZXR1cm4gblswXTt0aHJvdyBuZXcgcygiZXhwZWN0ZWQgYSBzaW5nbGUgZG9jdW1lbnQgaW4gdGhlIHN0cmVhbSwgYnV0IGZvdW5kIG1vcmUiKX19fSxPZT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLGtlPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksamU9NjUyNzksVGU9ezA6IlxcMCIsNzoiXFxhIiw4OiJcXGIiLDk6IlxcdCIsMTA6IlxcbiIsMTE6IlxcdiIsMTI6IlxcZiIsMTM6IlxcciIsMjc6IlxcZSIsMzQ6J1xcIicsOTI6IlxcXFwiLDEzMzoiXFxOIiwxNjA6IlxcXyIsODIzMjoiXFxMIiw4MjMzOiJcXFAifSxJZT1bInkiLCJZIiwieWVzIiwiWWVzIiwiWUVTIiwib24iLCJPbiIsIk9OIiwibiIsIk4iLCJubyIsIk5vIiwiTk8iLCJvZmYiLCJPZmYiLCJPRkYiXSxQZT0vXlstK10/WzAtOV9dKyg/OjpbMC05X10rKSsoPzpcLlswLTlfXSopPyQvO2Z1bmN0aW9uIE5lKGUpe3ZhciB0LG4scjtpZih0PWUudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCksZTw9MjU1KW49IngiLHI9MjtlbHNlIGlmKGU8PTY1NTM1KW49InUiLHI9NDtlbHNle2lmKCEoZTw9NDI5NDk2NzI5NSkpdGhyb3cgbmV3IHMoImNvZGUgcG9pbnQgd2l0aGluIGEgc3RyaW5nIG1heSBub3QgYmUgZ3JlYXRlciB0aGFuIDB4RkZGRkZGRkYiKTtuPSJVIixyPTh9cmV0dXJuIlxcIituK28ucmVwZWF0KCIwIixyLXQubGVuZ3RoKSt0fWZ1bmN0aW9uIE1lKGUpe3RoaXMuc2NoZW1hPWUuc2NoZW1hfHxXLHRoaXMuaW5kZW50PU1hdGgubWF4KDEsZS5pbmRlbnR8fDIpLHRoaXMubm9BcnJheUluZGVudD1lLm5vQXJyYXlJbmRlbnR8fCExLHRoaXMuc2tpcEludmFsaWQ9ZS5za2lwSW52YWxpZHx8ITEsdGhpcy5mbG93TGV2ZWw9by5pc05vdGhpbmcoZS5mbG93TGV2ZWwpPy0xOmUuZmxvd0xldmVsLHRoaXMuc3R5bGVNYXA9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLG8sYSxpLHMsdTtpZihudWxsPT09dClyZXR1cm57fTtmb3Iobj17fSxvPTAsYT0ocj1PYmplY3Qua2V5cyh0KSkubGVuZ3RoO288YTtvKz0xKWk9cltvXSxzPVN0cmluZyh0W2ldKSwiISEiPT09aS5zbGljZSgwLDIpJiYoaT0idGFnOnlhbWwub3JnLDIwMDI6IitpLnNsaWNlKDIpKSwodT1lLmNvbXBpbGVkVHlwZU1hcC5mYWxsYmFja1tpXSkmJmtlLmNhbGwodS5zdHlsZUFsaWFzZXMscykmJihzPXUuc3R5bGVBbGlhc2VzW3NdKSxuW2ldPXM7cmV0dXJuIG59KHRoaXMuc2NoZW1hLGUuc3R5bGVzfHxudWxsKSx0aGlzLnNvcnRLZXlzPWUuc29ydEtleXN8fCExLHRoaXMubGluZVdpZHRoPWUubGluZVdpZHRofHw4MCx0aGlzLm5vUmVmcz1lLm5vUmVmc3x8ITEsdGhpcy5ub0NvbXBhdE1vZGU9ZS5ub0NvbXBhdE1vZGV8fCExLHRoaXMuY29uZGVuc2VGbG93PWUuY29uZGVuc2VGbG93fHwhMSx0aGlzLnF1b3RpbmdUeXBlPSciJz09PWUucXVvdGluZ1R5cGU/MjoxLHRoaXMuZm9yY2VRdW90ZXM9ZS5mb3JjZVF1b3Rlc3x8ITEsdGhpcy5yZXBsYWNlcj0iZnVuY3Rpb24iPT10eXBlb2YgZS5yZXBsYWNlcj9lLnJlcGxhY2VyOm51bGwsdGhpcy5pbXBsaWNpdFR5cGVzPXRoaXMuc2NoZW1hLmNvbXBpbGVkSW1wbGljaXQsdGhpcy5leHBsaWNpdFR5cGVzPXRoaXMuc2NoZW1hLmNvbXBpbGVkRXhwbGljaXQsdGhpcy50YWc9bnVsbCx0aGlzLnJlc3VsdD0iIix0aGlzLmR1cGxpY2F0ZXM9W10sdGhpcy51c2VkRHVwbGljYXRlcz1udWxsfWZ1bmN0aW9uIFJlKGUsdCl7Zm9yKHZhciBuLHI9by5yZXBlYXQoIiAiLHQpLGE9MCxpPS0xLHM9IiIsdT1lLmxlbmd0aDthPHU7KS0xPT09KGk9ZS5pbmRleE9mKCJcbiIsYSkpPyhuPWUuc2xpY2UoYSksYT11KToobj1lLnNsaWNlKGEsaSsxKSxhPWkrMSksbi5sZW5ndGgmJiJcbiIhPT1uJiYocys9cikscys9bjtyZXR1cm4gc31mdW5jdGlvbiBEZShlLHQpe3JldHVybiJcbiIrby5yZXBlYXQoIiAiLGUuaW5kZW50KnQpfWZ1bmN0aW9uIExlKGUpe3JldHVybiAzMj09PWV8fDk9PT1lfWZ1bmN0aW9uIEJlKGUpe3JldHVybiAzMjw9ZSYmZTw9MTI2fHwxNjE8PWUmJmU8PTU1Mjk1JiY4MjMyIT09ZSYmODIzMyE9PWV8fDU3MzQ0PD1lJiZlPD02NTUzMyYmZSE9PWplfHw2NTUzNjw9ZSYmZTw9MTExNDExMX1mdW5jdGlvbiBGZShlKXtyZXR1cm4gQmUoZSkmJmUhPT1qZSYmMTMhPT1lJiYxMCE9PWV9ZnVuY3Rpb24gVWUoZSx0LG4pe3ZhciByPUZlKGUpLG89ciYmIUxlKGUpO3JldHVybihuP3I6ciYmNDQhPT1lJiY5MSE9PWUmJjkzIT09ZSYmMTIzIT09ZSYmMTI1IT09ZSkmJjM1IT09ZSYmISg1OD09PXQmJiFvKXx8RmUodCkmJiFMZSh0KSYmMzU9PT1lfHw1OD09PXQmJm99ZnVuY3Rpb24gcWUoZSx0KXt2YXIgbixyPWUuY2hhckNvZGVBdCh0KTtyZXR1cm4gcj49NTUyOTYmJnI8PTU2MzE5JiZ0KzE8ZS5sZW5ndGgmJihuPWUuY2hhckNvZGVBdCh0KzEpKT49NTYzMjAmJm48PTU3MzQzPzEwMjQqKHItNTUyOTYpK24tNTYzMjArNjU1MzY6cn1mdW5jdGlvbiB6ZShlKXtyZXR1cm4vXlxuKiAvLnRlc3QoZSl9ZnVuY3Rpb24gVmUoZSx0LG4scixvLGEsaSxzKXt2YXIgdSxjLGw9MCxwPW51bGwsZj0hMSxoPSExLGQ9LTEhPT1yLG09LTEsdj1CZShjPXFlKGUsMCkpJiZjIT09amUmJiFMZShjKSYmNDUhPT1jJiY2MyE9PWMmJjU4IT09YyYmNDQhPT1jJiY5MSE9PWMmJjkzIT09YyYmMTIzIT09YyYmMTI1IT09YyYmMzUhPT1jJiYzOCE9PWMmJjQyIT09YyYmMzMhPT1jJiYxMjQhPT1jJiY2MSE9PWMmJjYyIT09YyYmMzkhPT1jJiYzNCE9PWMmJjM3IT09YyYmNjQhPT1jJiY5NiE9PWMmJmZ1bmN0aW9uKGUpe3JldHVybiFMZShlKSYmNTghPT1lfShxZShlLGUubGVuZ3RoLTEpKTtpZih0fHxpKWZvcih1PTA7dTxlLmxlbmd0aDtsPj02NTUzNj91Kz0yOnUrKyl7aWYoIUJlKGw9cWUoZSx1KSkpcmV0dXJuIDU7dj12JiZVZShsLHAscykscD1sfWVsc2V7Zm9yKHU9MDt1PGUubGVuZ3RoO2w+PTY1NTM2P3UrPTI6dSsrKXtpZigxMD09PShsPXFlKGUsdSkpKWY9ITAsZCYmKGg9aHx8dS1tLTE+ciYmIiAiIT09ZVttKzFdLG09dSk7ZWxzZSBpZighQmUobCkpcmV0dXJuIDU7dj12JiZVZShsLHAscykscD1sfWg9aHx8ZCYmdS1tLTE+ciYmIiAiIT09ZVttKzFdfXJldHVybiBmfHxoP24+OSYmemUoZSk/NTppPzI9PT1hPzU6MjpoPzQ6Mzohdnx8aXx8byhlKT8yPT09YT81OjI6MX1mdW5jdGlvbiBXZShlLHQsbixyLG8pe2UuZHVtcD1mdW5jdGlvbigpe2lmKDA9PT10Lmxlbmd0aClyZXR1cm4gMj09PWUucXVvdGluZ1R5cGU/JyIiJzoiJyciO2lmKCFlLm5vQ29tcGF0TW9kZSYmKC0xIT09SWUuaW5kZXhPZih0KXx8UGUudGVzdCh0KSkpcmV0dXJuIDI9PT1lLnF1b3RpbmdUeXBlPyciJyt0KyciJzoiJyIrdCsiJyI7dmFyIGE9ZS5pbmRlbnQqTWF0aC5tYXgoMSxuKSxpPS0xPT09ZS5saW5lV2lkdGg/LTE6TWF0aC5tYXgoTWF0aC5taW4oZS5saW5lV2lkdGgsNDApLGUubGluZVdpZHRoLWEpLHU9cnx8ZS5mbG93TGV2ZWw+LTEmJm4+PWUuZmxvd0xldmVsO3N3aXRjaChWZSh0LHUsZS5pbmRlbnQsaSwoZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7dmFyIG4scjtmb3Iobj0wLHI9ZS5pbXBsaWNpdFR5cGVzLmxlbmd0aDtuPHI7bis9MSlpZihlLmltcGxpY2l0VHlwZXNbbl0ucmVzb2x2ZSh0KSlyZXR1cm4hMDtyZXR1cm4hMX0oZSx0KX0pLGUucXVvdGluZ1R5cGUsZS5mb3JjZVF1b3RlcyYmIXIsbykpe2Nhc2UgMTpyZXR1cm4gdDtjYXNlIDI6cmV0dXJuIiciK3QucmVwbGFjZSgvJy9nLCInJyIpKyInIjtjYXNlIDM6cmV0dXJuInwiK0hlKHQsZS5pbmRlbnQpKyRlKFJlKHQsYSkpO2Nhc2UgNDpyZXR1cm4iPiIrSGUodCxlLmluZGVudCkrJGUoUmUoZnVuY3Rpb24oZSx0KXt2YXIgbixyLG89LyhcbispKFteXG5dKikvZyxhPShzPWUuaW5kZXhPZigiXG4iKSxzPS0xIT09cz9zOmUubGVuZ3RoLG8ubGFzdEluZGV4PXMsSmUoZS5zbGljZSgwLHMpLHQpKSxpPSJcbiI9PT1lWzBdfHwiICI9PT1lWzBdO3ZhciBzO2Zvcig7cj1vLmV4ZWMoZSk7KXt2YXIgdT1yWzFdLGM9clsyXTtuPSIgIj09PWNbMF0sYSs9dSsoaXx8bnx8IiI9PT1jPyIiOiJcbiIpK0plKGMsdCksaT1ufXJldHVybiBhfSh0LGkpLGEpKTtjYXNlIDU6cmV0dXJuJyInK2Z1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPSIiLHI9MCxvPTA7bzxlLmxlbmd0aDtyPj02NTUzNj9vKz0yOm8rKylyPXFlKGUsbyksISh0PVRlW3JdKSYmQmUocik/KG4rPWVbb10scj49NjU1MzYmJihuKz1lW28rMV0pKTpuKz10fHxOZShyKTtyZXR1cm4gbn0odCkrJyInO2RlZmF1bHQ6dGhyb3cgbmV3IHMoImltcG9zc2libGUgZXJyb3I6IGludmFsaWQgc2NhbGFyIHN0eWxlIil9fSgpfWZ1bmN0aW9uIEhlKGUsdCl7dmFyIG49emUoZSk/U3RyaW5nKHQpOiIiLHI9IlxuIj09PWVbZS5sZW5ndGgtMV07cmV0dXJuIG4rKHImJigiXG4iPT09ZVtlLmxlbmd0aC0yXXx8IlxuIj09PWUpPyIrIjpyPyIiOiItIikrIlxuIn1mdW5jdGlvbiAkZShlKXtyZXR1cm4iXG4iPT09ZVtlLmxlbmd0aC0xXT9lLnNsaWNlKDAsLTEpOmV9ZnVuY3Rpb24gSmUoZSx0KXtpZigiIj09PWV8fCIgIj09PWVbMF0pcmV0dXJuIGU7Zm9yKHZhciBuLHIsbz0vIFteIF0vZyxhPTAsaT0wLHM9MCx1PSIiO249by5leGVjKGUpOykocz1uLmluZGV4KS1hPnQmJihyPWk+YT9pOnMsdSs9IlxuIitlLnNsaWNlKGEsciksYT1yKzEpLGk9cztyZXR1cm4gdSs9IlxuIixlLmxlbmd0aC1hPnQmJmk+YT91Kz1lLnNsaWNlKGEsaSkrIlxuIitlLnNsaWNlKGkrMSk6dSs9ZS5zbGljZShhKSx1LnNsaWNlKDEpfWZ1bmN0aW9uIEtlKGUsdCxuLHIpe3ZhciBvLGEsaSxzPSIiLHU9ZS50YWc7Zm9yKG89MCxhPW4ubGVuZ3RoO288YTtvKz0xKWk9bltvXSxlLnJlcGxhY2VyJiYoaT1lLnJlcGxhY2VyLmNhbGwobixTdHJpbmcobyksaSkpLChHZShlLHQrMSxpLCEwLCEwLCExLCEwKXx8dm9pZCAwPT09aSYmR2UoZSx0KzEsbnVsbCwhMCwhMCwhMSwhMCkpJiYociYmIiI9PT1zfHwocys9RGUoZSx0KSksZS5kdW1wJiYxMD09PWUuZHVtcC5jaGFyQ29kZUF0KDApP3MrPSItIjpzKz0iLSAiLHMrPWUuZHVtcCk7ZS50YWc9dSxlLmR1bXA9c3x8IltdIn1mdW5jdGlvbiBZZShlLHQsbil7dmFyIHIsbyxhLGksdSxjO2ZvcihhPTAsaT0obz1uP2UuZXhwbGljaXRUeXBlczplLmltcGxpY2l0VHlwZXMpLmxlbmd0aDthPGk7YSs9MSlpZigoKHU9b1thXSkuaW5zdGFuY2VPZnx8dS5wcmVkaWNhdGUpJiYoIXUuaW5zdGFuY2VPZnx8Im9iamVjdCI9PXR5cGVvZiB0JiZ0IGluc3RhbmNlb2YgdS5pbnN0YW5jZU9mKSYmKCF1LnByZWRpY2F0ZXx8dS5wcmVkaWNhdGUodCkpKXtpZihuP3UubXVsdGkmJnUucmVwcmVzZW50TmFtZT9lLnRhZz11LnJlcHJlc2VudE5hbWUodCk6ZS50YWc9dS50YWc6ZS50YWc9Ij8iLHUucmVwcmVzZW50KXtpZihjPWUuc3R5bGVNYXBbdS50YWddfHx1LmRlZmF1bHRTdHlsZSwiW29iamVjdCBGdW5jdGlvbl0iPT09T2UuY2FsbCh1LnJlcHJlc2VudCkpcj11LnJlcHJlc2VudCh0LGMpO2Vsc2V7aWYoIWtlLmNhbGwodS5yZXByZXNlbnQsYykpdGhyb3cgbmV3IHMoIiE8Iit1LnRhZysnPiB0YWcgcmVzb2x2ZXIgYWNjZXB0cyBub3QgIicrYysnIiBzdHlsZScpO3I9dS5yZXByZXNlbnRbY10odCxjKX1lLmR1bXA9cn1yZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBHZShlLHQsbixyLG8sYSxpKXtlLnRhZz1udWxsLGUuZHVtcD1uLFllKGUsbiwhMSl8fFllKGUsbiwhMCk7dmFyIHUsYz1PZS5jYWxsKGUuZHVtcCksbD1yO3ImJihyPWUuZmxvd0xldmVsPDB8fGUuZmxvd0xldmVsPnQpO3ZhciBwLGYsaD0iW29iamVjdCBPYmplY3RdIj09PWN8fCJbb2JqZWN0IEFycmF5XSI9PT1jO2lmKGgmJihmPS0xIT09KHA9ZS5kdXBsaWNhdGVzLmluZGV4T2YobikpKSwobnVsbCE9PWUudGFnJiYiPyIhPT1lLnRhZ3x8Znx8MiE9PWUuaW5kZW50JiZ0PjApJiYobz0hMSksZiYmZS51c2VkRHVwbGljYXRlc1twXSllLmR1bXA9IipyZWZfIitwO2Vsc2V7aWYoaCYmZiYmIWUudXNlZER1cGxpY2F0ZXNbcF0mJihlLnVzZWREdXBsaWNhdGVzW3BdPSEwKSwiW29iamVjdCBPYmplY3RdIj09PWMpciYmMCE9PU9iamVjdC5rZXlzKGUuZHVtcCkubGVuZ3RoPyghZnVuY3Rpb24oZSx0LG4scil7dmFyIG8sYSxpLHUsYyxsLHA9IiIsZj1lLnRhZyxoPU9iamVjdC5rZXlzKG4pO2lmKCEwPT09ZS5zb3J0S2V5cyloLnNvcnQoKTtlbHNlIGlmKCJmdW5jdGlvbiI9PXR5cGVvZiBlLnNvcnRLZXlzKWguc29ydChlLnNvcnRLZXlzKTtlbHNlIGlmKGUuc29ydEtleXMpdGhyb3cgbmV3IHMoInNvcnRLZXlzIG11c3QgYmUgYSBib29sZWFuIG9yIGEgZnVuY3Rpb24iKTtmb3Iobz0wLGE9aC5sZW5ndGg7bzxhO28rPTEpbD0iIixyJiYiIj09PXB8fChsKz1EZShlLHQpKSx1PW5baT1oW29dXSxlLnJlcGxhY2VyJiYodT1lLnJlcGxhY2VyLmNhbGwobixpLHUpKSxHZShlLHQrMSxpLCEwLCEwLCEwKSYmKChjPW51bGwhPT1lLnRhZyYmIj8iIT09ZS50YWd8fGUuZHVtcCYmZS5kdW1wLmxlbmd0aD4xMDI0KSYmKGUuZHVtcCYmMTA9PT1lLmR1bXAuY2hhckNvZGVBdCgwKT9sKz0iPyI6bCs9Ij8gIiksbCs9ZS5kdW1wLGMmJihsKz1EZShlLHQpKSxHZShlLHQrMSx1LCEwLGMpJiYoZS5kdW1wJiYxMD09PWUuZHVtcC5jaGFyQ29kZUF0KDApP2wrPSI6IjpsKz0iOiAiLHArPWwrPWUuZHVtcCkpO2UudGFnPWYsZS5kdW1wPXB8fCJ7fSJ9KGUsdCxlLmR1bXAsbyksZiYmKGUuZHVtcD0iJnJlZl8iK3ArZS5kdW1wKSk6KCFmdW5jdGlvbihlLHQsbil7dmFyIHIsbyxhLGkscyx1PSIiLGM9ZS50YWcsbD1PYmplY3Qua2V5cyhuKTtmb3Iocj0wLG89bC5sZW5ndGg7cjxvO3IrPTEpcz0iIiwiIiE9PXUmJihzKz0iLCAiKSxlLmNvbmRlbnNlRmxvdyYmKHMrPSciJyksaT1uW2E9bFtyXV0sZS5yZXBsYWNlciYmKGk9ZS5yZXBsYWNlci5jYWxsKG4sYSxpKSksR2UoZSx0LGEsITEsITEpJiYoZS5kdW1wLmxlbmd0aD4xMDI0JiYocys9Ij8gIikscys9ZS5kdW1wKyhlLmNvbmRlbnNlRmxvdz8nIic6IiIpKyI6IisoZS5jb25kZW5zZUZsb3c/IiI6IiAiKSxHZShlLHQsaSwhMSwhMSkmJih1Kz1zKz1lLmR1bXApKTtlLnRhZz1jLGUuZHVtcD0ieyIrdSsifSJ9KGUsdCxlLmR1bXApLGYmJihlLmR1bXA9IiZyZWZfIitwKyIgIitlLmR1bXApKTtlbHNlIGlmKCJbb2JqZWN0IEFycmF5XSI9PT1jKXImJjAhPT1lLmR1bXAubGVuZ3RoPyhlLm5vQXJyYXlJbmRlbnQmJiFpJiZ0PjA/S2UoZSx0LTEsZS5kdW1wLG8pOktlKGUsdCxlLmR1bXAsbyksZiYmKGUuZHVtcD0iJnJlZl8iK3ArZS5kdW1wKSk6KCFmdW5jdGlvbihlLHQsbil7dmFyIHIsbyxhLGk9IiIscz1lLnRhZztmb3Iocj0wLG89bi5sZW5ndGg7cjxvO3IrPTEpYT1uW3JdLGUucmVwbGFjZXImJihhPWUucmVwbGFjZXIuY2FsbChuLFN0cmluZyhyKSxhKSksKEdlKGUsdCxhLCExLCExKXx8dm9pZCAwPT09YSYmR2UoZSx0LG51bGwsITEsITEpKSYmKCIiIT09aSYmKGkrPSIsIisoZS5jb25kZW5zZUZsb3c/IiI6IiAiKSksaSs9ZS5kdW1wKTtlLnRhZz1zLGUuZHVtcD0iWyIraSsiXSJ9KGUsdCxlLmR1bXApLGYmJihlLmR1bXA9IiZyZWZfIitwKyIgIitlLmR1bXApKTtlbHNle2lmKCJbb2JqZWN0IFN0cmluZ10iIT09Yyl7aWYoIltvYmplY3QgVW5kZWZpbmVkXSI9PT1jKXJldHVybiExO2lmKGUuc2tpcEludmFsaWQpcmV0dXJuITE7dGhyb3cgbmV3IHMoInVuYWNjZXB0YWJsZSBraW5kIG9mIGFuIG9iamVjdCB0byBkdW1wICIrYyl9Ij8iIT09ZS50YWcmJldlKGUsZS5kdW1wLHQsYSxsKX1udWxsIT09ZS50YWcmJiI/IiE9PWUudGFnJiYodT1lbmNvZGVVUkkoIiEiPT09ZS50YWdbMF0/ZS50YWcuc2xpY2UoMSk6ZS50YWcpLnJlcGxhY2UoLyEvZywiJTIxIiksdT0iISI9PT1lLnRhZ1swXT8iISIrdToidGFnOnlhbWwub3JnLDIwMDI6Ij09PXUuc2xpY2UoMCwxOCk/IiEhIit1LnNsaWNlKDE4KToiITwiK3UrIj4iLGUuZHVtcD11KyIgIitlLmR1bXApfXJldHVybiEwfWZ1bmN0aW9uIFplKGUsdCl7dmFyIG4scixvPVtdLGE9W107Zm9yKFhlKGUsbyxhKSxuPTAscj1hLmxlbmd0aDtuPHI7bis9MSl0LmR1cGxpY2F0ZXMucHVzaChvW2Fbbl1dKTt0LnVzZWREdXBsaWNhdGVzPW5ldyBBcnJheShyKX1mdW5jdGlvbiBYZShlLHQsbil7dmFyIHIsbyxhO2lmKG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGUpaWYoLTEhPT0obz10LmluZGV4T2YoZSkpKS0xPT09bi5pbmRleE9mKG8pJiZuLnB1c2gobyk7ZWxzZSBpZih0LnB1c2goZSksQXJyYXkuaXNBcnJheShlKSlmb3Iobz0wLGE9ZS5sZW5ndGg7bzxhO28rPTEpWGUoZVtvXSx0LG4pO2Vsc2UgZm9yKG89MCxhPShyPU9iamVjdC5rZXlzKGUpKS5sZW5ndGg7bzxhO28rPTEpWGUoZVtyW29dXSx0LG4pfWZ1bmN0aW9uIFFlKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJGdW5jdGlvbiB5YW1sLiIrZSsiIGlzIHJlbW92ZWQgaW4ganMteWFtbCA0LiBVc2UgeWFtbC4iK3QrIiBpbnN0ZWFkLCB3aGljaCBpcyBub3cgc2FmZSBieSBkZWZhdWx0LiIpfX12YXIgZXQ9e1R5cGU6aCxTY2hlbWE6dixGQUlMU0FGRV9TQ0hFTUE6XyxKU09OX1NDSEVNQTpqLENPUkVfU0NIRU1BOlQsREVGQVVMVF9TQ0hFTUE6Vyxsb2FkOkFlLmxvYWQsbG9hZEFsbDpBZS5sb2FkQWxsLGR1bXA6e2R1bXA6ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgTWUodD10fHx7fSk7bi5ub1JlZnN8fFplKGUsbik7dmFyIHI9ZTtyZXR1cm4gbi5yZXBsYWNlciYmKHI9bi5yZXBsYWNlci5jYWxsKHsiIjpyfSwiIixyKSksR2UobiwwLHIsITAsITApP24uZHVtcCsiXG4iOiIifX0uZHVtcCxZQU1MRXhjZXB0aW9uOnMsdHlwZXM6e2JpbmFyeTpELGZsb2F0OmssbWFwOmIsbnVsbDp3LHBhaXJzOnEsc2V0OlYsdGltZXN0YW1wOk4sYm9vbDp4LGludDpDLG1lcmdlOk0sb21hcDpGLHNlcTp5LHN0cjpnfSxzYWZlTG9hZDpRZSgic2FmZUxvYWQiLCJsb2FkIiksc2FmZUxvYWRBbGw6UWUoInNhZmVMb2FkQWxsIiwibG9hZEFsbCIpLHNhZmVEdW1wOlFlKCJzYWZlRHVtcCIsImR1bXAiKX07dC5hPWV0fSxmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPW4oNjQ4KX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oODY4KTtmdW5jdGlvbiBvKGUsdCxuLG8sYSxpLHMpe3RyeXt2YXIgdT1lW2ldKHMpLGM9dS52YWx1ZX1jYXRjaChlKXtyZXR1cm4gdm9pZCBuKGUpfXUuZG9uZT90KGMpOnIucmVzb2x2ZShjKS50aGVuKG8sYSl9ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PXRoaXMsbj1hcmd1bWVudHM7cmV0dXJuIG5ldyByKChmdW5jdGlvbihyLGEpe3ZhciBpPWUuYXBwbHkodCxuKTtmdW5jdGlvbiBzKGUpe28oaSxyLGEscyx1LCJuZXh0IixlKX1mdW5jdGlvbiB1KGUpe28oaSxyLGEscyx1LCJ0aHJvdyIsZSl9cyh2b2lkIDApfSkpfX0sZS5leHBvcnRzLmRlZmF1bHQ9ZS5leHBvcnRzLGUuZXhwb3J0cy5fX2VzTW9kdWxlPSEwfSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBUeXBlRXJyb3IoU3RyaW5nKGUpKyIgaXMgbm90IGEgZnVuY3Rpb24iKTtyZXR1cm4gZX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcixvLGEsaT1uKDM2Nikscz1uKDQwKSx1PW4oNDcpLGM9big2NyksbD1uKDU1KSxwPW4oMjI2KSxmPW4oMTgzKSxoPW4oMTU3KSxkPSJPYmplY3QgYWxyZWFkeSBpbml0aWFsaXplZCIsbT1zLldlYWtNYXA7aWYoaXx8cC5zdGF0ZSl7dmFyIHY9cC5zdGF0ZXx8KHAuc3RhdGU9bmV3IG0pLGc9di5nZXQseT12LmhhcyxiPXYuc2V0O3I9ZnVuY3Rpb24oZSx0KXtpZih5LmNhbGwodixlKSl0aHJvdyBuZXcgVHlwZUVycm9yKGQpO3JldHVybiB0LmZhY2FkZT1lLGIuY2FsbCh2LGUsdCksdH0sbz1mdW5jdGlvbihlKXtyZXR1cm4gZy5jYWxsKHYsZSl8fHt9fSxhPWZ1bmN0aW9uKGUpe3JldHVybiB5LmNhbGwodixlKX19ZWxzZXt2YXIgXz1mKCJzdGF0ZSIpO2hbX109ITAscj1mdW5jdGlvbihlLHQpe2lmKGwoZSxfKSl0aHJvdyBuZXcgVHlwZUVycm9yKGQpO3JldHVybiB0LmZhY2FkZT1lLGMoZSxfLHQpLHR9LG89ZnVuY3Rpb24oZSl7cmV0dXJuIGwoZSxfKT9lW19dOnt9fSxhPWZ1bmN0aW9uKGUpe3JldHVybiBsKGUsXyl9fWUuZXhwb3J0cz17c2V0OnIsZ2V0Om8saGFzOmEsZW5mb3JjZTpmdW5jdGlvbihlKXtyZXR1cm4gYShlKT9vKGUpOnIoZSx7fSl9LGdldHRlckZvcjpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG47aWYoIXUodCl8fChuPW8odCkpLnR5cGUhPT1lKXRocm93IFR5cGVFcnJvcigiSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAiK2UrIiByZXF1aXJlZCIpO3JldHVybiBufX19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGV9fXZhciBvPWZ1bmN0aW9uKCl7fTtvLnRoYXRSZXR1cm5zPXIsby50aGF0UmV0dXJuc0ZhbHNlPXIoITEpLG8udGhhdFJldHVybnNUcnVlPXIoITApLG8udGhhdFJldHVybnNOdWxsPXIobnVsbCksby50aGF0UmV0dXJuc1RoaXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sby50aGF0UmV0dXJuc0FyZ3VtZW50PWZ1bmN0aW9uKGUpe3JldHVybiBlfSxlLmV4cG9ydHM9b30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMwKSxvPW4oMzgpLGE9big0NjYpLGk9bigxMjIpLHM9big0NjcpLHU9bigxNDMpLGM9bigyMDMpLGw9bigyNSkscD1bXSxmPTAsaD1hLmdldFBvb2xlZCgpLGQ9ITEsbT1udWxsO2Z1bmN0aW9uIHYoKXt4LlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24mJm18fHIoIjEyMyIpfXZhciBnPVt7aW5pdGlhbGl6ZTpmdW5jdGlvbigpe3RoaXMuZGlydHlDb21wb25lbnRzTGVuZ3RoPXAubGVuZ3RofSxjbG9zZTpmdW5jdGlvbigpe3RoaXMuZGlydHlDb21wb25lbnRzTGVuZ3RoIT09cC5sZW5ndGg/KHAuc3BsaWNlKDAsdGhpcy5kaXJ0eUNvbXBvbmVudHNMZW5ndGgpLHcoKSk6cC5sZW5ndGg9MH19LHtpbml0aWFsaXplOmZ1bmN0aW9uKCl7dGhpcy5jYWxsYmFja1F1ZXVlLnJlc2V0KCl9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy5jYWxsYmFja1F1ZXVlLm5vdGlmeUFsbCgpfX1dO2Z1bmN0aW9uIHkoKXt0aGlzLnJlaW5pdGlhbGl6ZVRyYW5zYWN0aW9uKCksdGhpcy5kaXJ0eUNvbXBvbmVudHNMZW5ndGg9bnVsbCx0aGlzLmNhbGxiYWNrUXVldWU9YS5nZXRQb29sZWQoKSx0aGlzLnJlY29uY2lsZVRyYW5zYWN0aW9uPXguUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbi5nZXRQb29sZWQoITApfWZ1bmN0aW9uIGIoZSx0KXtyZXR1cm4gZS5fbW91bnRPcmRlci10Ll9tb3VudE9yZGVyfWZ1bmN0aW9uIF8oZSl7dmFyIHQ9ZS5kaXJ0eUNvbXBvbmVudHNMZW5ndGg7dCE9PXAubGVuZ3RoJiZyKCIxMjQiLHQscC5sZW5ndGgpLHAuc29ydChiKSxmKys7Zm9yKHZhciBuPTA7bjx0O24rKyl7dmFyIG8sYT1wW25dLGk9YS5fcGVuZGluZ0NhbGxiYWNrcztpZihhLl9wZW5kaW5nQ2FsbGJhY2tzPW51bGwscy5sb2dUb3BMZXZlbFJlbmRlcnMpe3ZhciBjPWE7YS5fY3VycmVudEVsZW1lbnQudHlwZS5pc1JlYWN0VG9wTGV2ZWxXcmFwcGVyJiYoYz1hLl9yZW5kZXJlZENvbXBvbmVudCksbz0iUmVhY3QgdXBkYXRlOiAiK2MuZ2V0TmFtZSgpLGNvbnNvbGUudGltZShvKX1pZih1LnBlcmZvcm1VcGRhdGVJZk5lY2Vzc2FyeShhLGUucmVjb25jaWxlVHJhbnNhY3Rpb24sZiksbyYmY29uc29sZS50aW1lRW5kKG8pLGkpZm9yKHZhciBsPTA7bDxpLmxlbmd0aDtsKyspZS5jYWxsYmFja1F1ZXVlLmVucXVldWUoaVtsXSxhLmdldFB1YmxpY0luc3RhbmNlKCkpfX1vKHkucHJvdG90eXBlLGMse2dldFRyYW5zYWN0aW9uV3JhcHBlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gZ30sZGVzdHJ1Y3RvcjpmdW5jdGlvbigpe3RoaXMuZGlydHlDb21wb25lbnRzTGVuZ3RoPW51bGwsYS5yZWxlYXNlKHRoaXMuY2FsbGJhY2tRdWV1ZSksdGhpcy5jYWxsYmFja1F1ZXVlPW51bGwseC5SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uLnJlbGVhc2UodGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbiksdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbj1udWxsfSxwZXJmb3JtOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gYy5wZXJmb3JtLmNhbGwodGhpcyx0aGlzLnJlY29uY2lsZVRyYW5zYWN0aW9uLnBlcmZvcm0sdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbixlLHQsbil9fSksaS5hZGRQb29saW5nVG8oeSk7dmFyIHc9ZnVuY3Rpb24oKXtmb3IoO3AubGVuZ3RofHxkOyl7aWYocC5sZW5ndGgpe3ZhciBlPXkuZ2V0UG9vbGVkKCk7ZS5wZXJmb3JtKF8sbnVsbCxlKSx5LnJlbGVhc2UoZSl9aWYoZCl7ZD0hMTt2YXIgdD1oO2g9YS5nZXRQb29sZWQoKSx0Lm5vdGlmeUFsbCgpLGEucmVsZWFzZSh0KX19fTt2YXIgeD17UmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbjpudWxsLGJhdGNoZWRVcGRhdGVzOmZ1bmN0aW9uKGUsdCxuLHIsbyxhKXtyZXR1cm4gdigpLG0uYmF0Y2hlZFVwZGF0ZXMoZSx0LG4scixvLGEpfSxlbnF1ZXVlVXBkYXRlOmZ1bmN0aW9uIGUodCl7digpLG0uaXNCYXRjaGluZ1VwZGF0ZXM/KHAucHVzaCh0KSxudWxsPT10Ll91cGRhdGVCYXRjaE51bWJlciYmKHQuX3VwZGF0ZUJhdGNoTnVtYmVyPWYrMSkpOm0uYmF0Y2hlZFVwZGF0ZXMoZSx0KX0sZmx1c2hCYXRjaGVkVXBkYXRlczp3LGluamVjdGlvbjp7aW5qZWN0UmVjb25jaWxlVHJhbnNhY3Rpb246ZnVuY3Rpb24oZSl7ZXx8cigiMTI2IikseC5SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uPWV9LGluamVjdEJhdGNoaW5nU3RyYXRlZ3k6ZnVuY3Rpb24oZSl7ZXx8cigiMTI3IiksImZ1bmN0aW9uIiE9dHlwZW9mIGUuYmF0Y2hlZFVwZGF0ZXMmJnIoIjEyOCIpLCJib29sZWFuIiE9dHlwZW9mIGUuaXNCYXRjaGluZ1VwZGF0ZXMmJnIoIjEyOSIpLG09ZX19LGFzYXA6ZnVuY3Rpb24oZSx0KXtsKG0uaXNCYXRjaGluZ1VwZGF0ZXMsIlJlYWN0VXBkYXRlcy5hc2FwOiBDYW4ndCBlbnF1ZXVlIGFuIGFzYXAgY2FsbGJhY2sgaW4gYSBjb250ZXh0IHdoZXJldXBkYXRlcyBhcmUgbm90IGJlaW5nIGJhdGNoZWQuIiksaC5lbnF1ZXVlKGUsdCksZD0hMH19O2UuZXhwb3J0cz14fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiOyhmdW5jdGlvbih0KXtmdW5jdGlvbiBuKGUpe3JldHVybiBlIGluc3RhbmNlb2YgdHx8ZSBpbnN0YW5jZW9mIERhdGV8fGUgaW5zdGFuY2VvZiBSZWdFeHB9ZnVuY3Rpb24gcihlKXtpZihlIGluc3RhbmNlb2YgdCl7dmFyIG49dC5hbGxvYz90LmFsbG9jKGUubGVuZ3RoKTpuZXcgdChlLmxlbmd0aCk7cmV0dXJuIGUuY29weShuKSxufWlmKGUgaW5zdGFuY2VvZiBEYXRlKXJldHVybiBuZXcgRGF0ZShlLmdldFRpbWUoKSk7aWYoZSBpbnN0YW5jZW9mIFJlZ0V4cClyZXR1cm4gbmV3IFJlZ0V4cChlKTt0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgc2l0dWF0aW9uIil9ZnVuY3Rpb24gbyhlKXt2YXIgdD1bXTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlLGEpeyJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9PWU/QXJyYXkuaXNBcnJheShlKT90W2FdPW8oZSk6bihlKT90W2FdPXIoZSk6dFthXT1pKHt9LGUpOnRbYV09ZX0pKSx0fWZ1bmN0aW9uIGEoZSx0KXtyZXR1cm4iX19wcm90b19fIj09PXQ/dm9pZCAwOmVbdF19dmFyIGk9ZS5leHBvcnRzPWZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzLmxlbmd0aDwxfHwib2JqZWN0IiE9dHlwZW9mIGFyZ3VtZW50c1swXSlyZXR1cm4hMTtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuIGFyZ3VtZW50c1swXTt2YXIgZSx0LHM9YXJndW1lbnRzWzBdLHU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiB1LmZvckVhY2goKGZ1bmN0aW9uKHUpeyJvYmplY3QiIT10eXBlb2YgdXx8bnVsbD09PXV8fEFycmF5LmlzQXJyYXkodSl8fE9iamVjdC5rZXlzKHUpLmZvckVhY2goKGZ1bmN0aW9uKGMpe3JldHVybiB0PWEocyxjKSwoZT1hKHUsYykpPT09cz92b2lkIDA6Im9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZT92b2lkKHNbY109ZSk6QXJyYXkuaXNBcnJheShlKT92b2lkKHNbY109byhlKSk6bihlKT92b2lkKHNbY109cihlKSk6Im9iamVjdCIhPXR5cGVvZiB0fHxudWxsPT09dHx8QXJyYXkuaXNBcnJheSh0KT92b2lkKHNbY109aSh7fSxlKSk6dm9pZChzW2NdPWkodCxlKSl9KSl9KSksc319KS5jYWxsKHRoaXMsbigxMzIpLkJ1ZmZlcil9LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9big2MzMpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTA3NSksbz1uKDEwNzYpO2Z1bmN0aW9uIGEoKXt0aGlzLnByb3RvY29sPW51bGwsdGhpcy5zbGFzaGVzPW51bGwsdGhpcy5hdXRoPW51bGwsdGhpcy5ob3N0PW51bGwsdGhpcy5wb3J0PW51bGwsdGhpcy5ob3N0bmFtZT1udWxsLHRoaXMuaGFzaD1udWxsLHRoaXMuc2VhcmNoPW51bGwsdGhpcy5xdWVyeT1udWxsLHRoaXMucGF0aG5hbWU9bnVsbCx0aGlzLnBhdGg9bnVsbCx0aGlzLmhyZWY9bnVsbH10LnBhcnNlPWIsdC5yZXNvbHZlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGIoZSwhMSwhMCkucmVzb2x2ZSh0KX0sdC5yZXNvbHZlT2JqZWN0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU/YihlLCExLCEwKS5yZXNvbHZlT2JqZWN0KHQpOnR9LHQuZm9ybWF0PWZ1bmN0aW9uKGUpe28uaXNTdHJpbmcoZSkmJihlPWIoZSkpO3JldHVybiBlIGluc3RhbmNlb2YgYT9lLmZvcm1hdCgpOmEucHJvdG90eXBlLmZvcm1hdC5jYWxsKGUpfSx0LlVybD1hO3ZhciBpPS9eKFthLXowLTkuKy1dKzopL2kscz0vOlswLTldKiQvLHU9L14oXC9cLz8oPyFcLylbXlw/XHNdKikoXD9bXlxzXSopPyQvLGM9WyJ7IiwifSIsInwiLCJcXCIsIl4iLCJgIl0uY29uY2F0KFsiPCIsIj4iLCciJywiYCIsIiAiLCJcciIsIlxuIiwiXHQiXSksbD1bIiciXS5jb25jYXQoYykscD1bIiUiLCIvIiwiPyIsIjsiLCIjIl0uY29uY2F0KGwpLGY9WyIvIiwiPyIsIiMiXSxoPS9eWythLXowLTlBLVpfLV17MCw2M30kLyxkPS9eKFsrYS16MC05QS1aXy1dezAsNjN9KSguKikkLyxtPXtqYXZhc2NyaXB0OiEwLCJqYXZhc2NyaXB0OiI6ITB9LHY9e2phdmFzY3JpcHQ6ITAsImphdmFzY3JpcHQ6IjohMH0sZz17aHR0cDohMCxodHRwczohMCxmdHA6ITAsZ29waGVyOiEwLGZpbGU6ITAsImh0dHA6IjohMCwiaHR0cHM6IjohMCwiZnRwOiI6ITAsImdvcGhlcjoiOiEwLCJmaWxlOiI6ITB9LHk9bigxMDc3KTtmdW5jdGlvbiBiKGUsdCxuKXtpZihlJiZvLmlzT2JqZWN0KGUpJiZlIGluc3RhbmNlb2YgYSlyZXR1cm4gZTt2YXIgcj1uZXcgYTtyZXR1cm4gci5wYXJzZShlLHQsbikscn1hLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihlLHQsbil7aWYoIW8uaXNTdHJpbmcoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiUGFyYW1ldGVyICd1cmwnIG11c3QgYmUgYSBzdHJpbmcsIG5vdCAiK3R5cGVvZiBlKTt2YXIgYT1lLmluZGV4T2YoIj8iKSxzPS0xIT09YSYmYTxlLmluZGV4T2YoIiMiKT8iPyI6IiMiLGM9ZS5zcGxpdChzKTtjWzBdPWNbMF0ucmVwbGFjZSgvXFwvZywiLyIpO3ZhciBiPWU9Yy5qb2luKHMpO2lmKGI9Yi50cmltKCksIW4mJjE9PT1lLnNwbGl0KCIjIikubGVuZ3RoKXt2YXIgXz11LmV4ZWMoYik7aWYoXylyZXR1cm4gdGhpcy5wYXRoPWIsdGhpcy5ocmVmPWIsdGhpcy5wYXRobmFtZT1fWzFdLF9bMl0/KHRoaXMuc2VhcmNoPV9bMl0sdGhpcy5xdWVyeT10P3kucGFyc2UodGhpcy5zZWFyY2guc3Vic3RyKDEpKTp0aGlzLnNlYXJjaC5zdWJzdHIoMSkpOnQmJih0aGlzLnNlYXJjaD0iIix0aGlzLnF1ZXJ5PXt9KSx0aGlzfXZhciB3PWkuZXhlYyhiKTtpZih3KXt2YXIgeD0odz13WzBdKS50b0xvd2VyQ2FzZSgpO3RoaXMucHJvdG9jb2w9eCxiPWIuc3Vic3RyKHcubGVuZ3RoKX1pZihufHx3fHxiLm1hdGNoKC9eXC9cL1teQFwvXStAW15AXC9dKy8pKXt2YXIgRT0iLy8iPT09Yi5zdWJzdHIoMCwyKTshRXx8dyYmdlt3XXx8KGI9Yi5zdWJzdHIoMiksdGhpcy5zbGFzaGVzPSEwKX1pZighdlt3XSYmKEV8fHcmJiFnW3ddKSl7Zm9yKHZhciBTLEMsQT0tMSxPPTA7TzxmLmxlbmd0aDtPKyspey0xIT09KGs9Yi5pbmRleE9mKGZbT10pKSYmKC0xPT09QXx8azxBKSYmKEE9ayl9LTEhPT0oQz0tMT09PUE/Yi5sYXN0SW5kZXhPZigiQCIpOmIubGFzdEluZGV4T2YoIkAiLEEpKSYmKFM9Yi5zbGljZSgwLEMpLGI9Yi5zbGljZShDKzEpLHRoaXMuYXV0aD1kZWNvZGVVUklDb21wb25lbnQoUykpLEE9LTE7Zm9yKE89MDtPPHAubGVuZ3RoO08rKyl7dmFyIGs7LTEhPT0oaz1iLmluZGV4T2YocFtPXSkpJiYoLTE9PT1BfHxrPEEpJiYoQT1rKX0tMT09PUEmJihBPWIubGVuZ3RoKSx0aGlzLmhvc3Q9Yi5zbGljZSgwLEEpLGI9Yi5zbGljZShBKSx0aGlzLnBhcnNlSG9zdCgpLHRoaXMuaG9zdG5hbWU9dGhpcy5ob3N0bmFtZXx8IiI7dmFyIGo9IlsiPT09dGhpcy5ob3N0bmFtZVswXSYmIl0iPT09dGhpcy5ob3N0bmFtZVt0aGlzLmhvc3RuYW1lLmxlbmd0aC0xXTtpZighailmb3IodmFyIFQ9dGhpcy5ob3N0bmFtZS5zcGxpdCgvXC4vKSxJPShPPTAsVC5sZW5ndGgpO088STtPKyspe3ZhciBQPVRbT107aWYoUCYmIVAubWF0Y2goaCkpe2Zvcih2YXIgTj0iIixNPTAsUj1QLmxlbmd0aDtNPFI7TSsrKVAuY2hhckNvZGVBdChNKT4xMjc/Tis9IngiOk4rPVBbTV07aWYoIU4ubWF0Y2goaCkpe3ZhciBEPVQuc2xpY2UoMCxPKSxMPVQuc2xpY2UoTysxKSxCPVAubWF0Y2goZCk7QiYmKEQucHVzaChCWzFdKSxMLnVuc2hpZnQoQlsyXSkpLEwubGVuZ3RoJiYoYj0iLyIrTC5qb2luKCIuIikrYiksdGhpcy5ob3N0bmFtZT1ELmpvaW4oIi4iKTticmVha319fXRoaXMuaG9zdG5hbWUubGVuZ3RoPjI1NT90aGlzLmhvc3RuYW1lPSIiOnRoaXMuaG9zdG5hbWU9dGhpcy5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpLGp8fCh0aGlzLmhvc3RuYW1lPXIudG9BU0NJSSh0aGlzLmhvc3RuYW1lKSk7dmFyIEY9dGhpcy5wb3J0PyI6Iit0aGlzLnBvcnQ6IiIsVT10aGlzLmhvc3RuYW1lfHwiIjt0aGlzLmhvc3Q9VStGLHRoaXMuaHJlZis9dGhpcy5ob3N0LGomJih0aGlzLmhvc3RuYW1lPXRoaXMuaG9zdG5hbWUuc3Vic3RyKDEsdGhpcy5ob3N0bmFtZS5sZW5ndGgtMiksIi8iIT09YlswXSYmKGI9Ii8iK2IpKX1pZighbVt4XSlmb3IoTz0wLEk9bC5sZW5ndGg7TzxJO08rKyl7dmFyIHE9bFtPXTtpZigtMSE9PWIuaW5kZXhPZihxKSl7dmFyIHo9ZW5jb2RlVVJJQ29tcG9uZW50KHEpO3o9PT1xJiYoej1lc2NhcGUocSkpLGI9Yi5zcGxpdChxKS5qb2luKHopfX12YXIgVj1iLmluZGV4T2YoIiMiKTstMSE9PVYmJih0aGlzLmhhc2g9Yi5zdWJzdHIoViksYj1iLnNsaWNlKDAsVikpO3ZhciBXPWIuaW5kZXhPZigiPyIpO2lmKC0xIT09Vz8odGhpcy5zZWFyY2g9Yi5zdWJzdHIoVyksdGhpcy5xdWVyeT1iLnN1YnN0cihXKzEpLHQmJih0aGlzLnF1ZXJ5PXkucGFyc2UodGhpcy5xdWVyeSkpLGI9Yi5zbGljZSgwLFcpKTp0JiYodGhpcy5zZWFyY2g9IiIsdGhpcy5xdWVyeT17fSksYiYmKHRoaXMucGF0aG5hbWU9YiksZ1t4XSYmdGhpcy5ob3N0bmFtZSYmIXRoaXMucGF0aG5hbWUmJih0aGlzLnBhdGhuYW1lPSIvIiksdGhpcy5wYXRobmFtZXx8dGhpcy5zZWFyY2gpe0Y9dGhpcy5wYXRobmFtZXx8IiI7dmFyIEg9dGhpcy5zZWFyY2h8fCIiO3RoaXMucGF0aD1GK0h9cmV0dXJuIHRoaXMuaHJlZj10aGlzLmZvcm1hdCgpLHRoaXN9LGEucHJvdG90eXBlLmZvcm1hdD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuYXV0aHx8IiI7ZSYmKGU9KGU9ZW5jb2RlVVJJQ29tcG9uZW50KGUpKS5yZXBsYWNlKC8lM0EvaSwiOiIpLGUrPSJAIik7dmFyIHQ9dGhpcy5wcm90b2NvbHx8IiIsbj10aGlzLnBhdGhuYW1lfHwiIixyPXRoaXMuaGFzaHx8IiIsYT0hMSxpPSIiO3RoaXMuaG9zdD9hPWUrdGhpcy5ob3N0OnRoaXMuaG9zdG5hbWUmJihhPWUrKC0xPT09dGhpcy5ob3N0bmFtZS5pbmRleE9mKCI6Iik/dGhpcy5ob3N0bmFtZToiWyIrdGhpcy5ob3N0bmFtZSsiXSIpLHRoaXMucG9ydCYmKGErPSI6Iit0aGlzLnBvcnQpKSx0aGlzLnF1ZXJ5JiZvLmlzT2JqZWN0KHRoaXMucXVlcnkpJiZPYmplY3Qua2V5cyh0aGlzLnF1ZXJ5KS5sZW5ndGgmJihpPXkuc3RyaW5naWZ5KHRoaXMucXVlcnkpKTt2YXIgcz10aGlzLnNlYXJjaHx8aSYmIj8iK2l8fCIiO3JldHVybiB0JiYiOiIhPT10LnN1YnN0cigtMSkmJih0Kz0iOiIpLHRoaXMuc2xhc2hlc3x8KCF0fHxnW3RdKSYmITEhPT1hPyhhPSIvLyIrKGF8fCIiKSxuJiYiLyIhPT1uLmNoYXJBdCgwKSYmKG49Ii8iK24pKTphfHwoYT0iIiksciYmIiMiIT09ci5jaGFyQXQoMCkmJihyPSIjIityKSxzJiYiPyIhPT1zLmNoYXJBdCgwKSYmKHM9Ij8iK3MpLHQrYSsobj1uLnJlcGxhY2UoL1s/I10vZywoZnVuY3Rpb24oZSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlKX0pKSkrKHM9cy5yZXBsYWNlKCIjIiwiJTIzIikpK3J9LGEucHJvdG90eXBlLnJlc29sdmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVzb2x2ZU9iamVjdChiKGUsITEsITApKS5mb3JtYXQoKX0sYS5wcm90b3R5cGUucmVzb2x2ZU9iamVjdD1mdW5jdGlvbihlKXtpZihvLmlzU3RyaW5nKGUpKXt2YXIgdD1uZXcgYTt0LnBhcnNlKGUsITEsITApLGU9dH1mb3IodmFyIG49bmV3IGEscj1PYmplY3Qua2V5cyh0aGlzKSxpPTA7aTxyLmxlbmd0aDtpKyspe3ZhciBzPXJbaV07bltzXT10aGlzW3NdfWlmKG4uaGFzaD1lLmhhc2gsIiI9PT1lLmhyZWYpcmV0dXJuIG4uaHJlZj1uLmZvcm1hdCgpLG47aWYoZS5zbGFzaGVzJiYhZS5wcm90b2NvbCl7Zm9yKHZhciB1PU9iamVjdC5rZXlzKGUpLGM9MDtjPHUubGVuZ3RoO2MrKyl7dmFyIGw9dVtjXTsicHJvdG9jb2wiIT09bCYmKG5bbF09ZVtsXSl9cmV0dXJuIGdbbi5wcm90b2NvbF0mJm4uaG9zdG5hbWUmJiFuLnBhdGhuYW1lJiYobi5wYXRoPW4ucGF0aG5hbWU9Ii8iKSxuLmhyZWY9bi5mb3JtYXQoKSxufWlmKGUucHJvdG9jb2wmJmUucHJvdG9jb2whPT1uLnByb3RvY29sKXtpZighZ1tlLnByb3RvY29sXSl7Zm9yKHZhciBwPU9iamVjdC5rZXlzKGUpLGY9MDtmPHAubGVuZ3RoO2YrKyl7dmFyIGg9cFtmXTtuW2hdPWVbaF19cmV0dXJuIG4uaHJlZj1uLmZvcm1hdCgpLG59aWYobi5wcm90b2NvbD1lLnByb3RvY29sLGUuaG9zdHx8dltlLnByb3RvY29sXSluLnBhdGhuYW1lPWUucGF0aG5hbWU7ZWxzZXtmb3IodmFyIGQ9KGUucGF0aG5hbWV8fCIiKS5zcGxpdCgiLyIpO2QubGVuZ3RoJiYhKGUuaG9zdD1kLnNoaWZ0KCkpOyk7ZS5ob3N0fHwoZS5ob3N0PSIiKSxlLmhvc3RuYW1lfHwoZS5ob3N0bmFtZT0iIiksIiIhPT1kWzBdJiZkLnVuc2hpZnQoIiIpLGQubGVuZ3RoPDImJmQudW5zaGlmdCgiIiksbi5wYXRobmFtZT1kLmpvaW4oIi8iKX1pZihuLnNlYXJjaD1lLnNlYXJjaCxuLnF1ZXJ5PWUucXVlcnksbi5ob3N0PWUuaG9zdHx8IiIsbi5hdXRoPWUuYXV0aCxuLmhvc3RuYW1lPWUuaG9zdG5hbWV8fGUuaG9zdCxuLnBvcnQ9ZS5wb3J0LG4ucGF0aG5hbWV8fG4uc2VhcmNoKXt2YXIgbT1uLnBhdGhuYW1lfHwiIix5PW4uc2VhcmNofHwiIjtuLnBhdGg9bSt5fXJldHVybiBuLnNsYXNoZXM9bi5zbGFzaGVzfHxlLnNsYXNoZXMsbi5ocmVmPW4uZm9ybWF0KCksbn12YXIgYj1uLnBhdGhuYW1lJiYiLyI9PT1uLnBhdGhuYW1lLmNoYXJBdCgwKSxfPWUuaG9zdHx8ZS5wYXRobmFtZSYmIi8iPT09ZS5wYXRobmFtZS5jaGFyQXQoMCksdz1ffHxifHxuLmhvc3QmJmUucGF0aG5hbWUseD13LEU9bi5wYXRobmFtZSYmbi5wYXRobmFtZS5zcGxpdCgiLyIpfHxbXSxTPShkPWUucGF0aG5hbWUmJmUucGF0aG5hbWUuc3BsaXQoIi8iKXx8W10sbi5wcm90b2NvbCYmIWdbbi5wcm90b2NvbF0pO2lmKFMmJihuLmhvc3RuYW1lPSIiLG4ucG9ydD1udWxsLG4uaG9zdCYmKCIiPT09RVswXT9FWzBdPW4uaG9zdDpFLnVuc2hpZnQobi5ob3N0KSksbi5ob3N0PSIiLGUucHJvdG9jb2wmJihlLmhvc3RuYW1lPW51bGwsZS5wb3J0PW51bGwsZS5ob3N0JiYoIiI9PT1kWzBdP2RbMF09ZS5ob3N0OmQudW5zaGlmdChlLmhvc3QpKSxlLmhvc3Q9bnVsbCksdz13JiYoIiI9PT1kWzBdfHwiIj09PUVbMF0pKSxfKW4uaG9zdD1lLmhvc3R8fCIiPT09ZS5ob3N0P2UuaG9zdDpuLmhvc3Qsbi5ob3N0bmFtZT1lLmhvc3RuYW1lfHwiIj09PWUuaG9zdG5hbWU/ZS5ob3N0bmFtZTpuLmhvc3RuYW1lLG4uc2VhcmNoPWUuc2VhcmNoLG4ucXVlcnk9ZS5xdWVyeSxFPWQ7ZWxzZSBpZihkLmxlbmd0aClFfHwoRT1bXSksRS5wb3AoKSxFPUUuY29uY2F0KGQpLG4uc2VhcmNoPWUuc2VhcmNoLG4ucXVlcnk9ZS5xdWVyeTtlbHNlIGlmKCFvLmlzTnVsbE9yVW5kZWZpbmVkKGUuc2VhcmNoKSl7aWYoUyluLmhvc3RuYW1lPW4uaG9zdD1FLnNoaWZ0KCksKGo9ISEobi5ob3N0JiZuLmhvc3QuaW5kZXhPZigiQCIpPjApJiZuLmhvc3Quc3BsaXQoIkAiKSkmJihuLmF1dGg9ai5zaGlmdCgpLG4uaG9zdD1uLmhvc3RuYW1lPWouc2hpZnQoKSk7cmV0dXJuIG4uc2VhcmNoPWUuc2VhcmNoLG4ucXVlcnk9ZS5xdWVyeSxvLmlzTnVsbChuLnBhdGhuYW1lKSYmby5pc051bGwobi5zZWFyY2gpfHwobi5wYXRoPShuLnBhdGhuYW1lP24ucGF0aG5hbWU6IiIpKyhuLnNlYXJjaD9uLnNlYXJjaDoiIikpLG4uaHJlZj1uLmZvcm1hdCgpLG59aWYoIUUubGVuZ3RoKXJldHVybiBuLnBhdGhuYW1lPW51bGwsbi5zZWFyY2g/bi5wYXRoPSIvIituLnNlYXJjaDpuLnBhdGg9bnVsbCxuLmhyZWY9bi5mb3JtYXQoKSxuO2Zvcih2YXIgQz1FLnNsaWNlKC0xKVswXSxBPShuLmhvc3R8fGUuaG9zdHx8RS5sZW5ndGg+MSkmJigiLiI9PT1DfHwiLi4iPT09Qyl8fCIiPT09QyxPPTAsaz1FLmxlbmd0aDtrPj0wO2stLSkiLiI9PT0oQz1FW2tdKT9FLnNwbGljZShrLDEpOiIuLiI9PT1DPyhFLnNwbGljZShrLDEpLE8rKyk6TyYmKEUuc3BsaWNlKGssMSksTy0tKTtpZighdyYmIXgpZm9yKDtPLS07TylFLnVuc2hpZnQoIi4uIik7IXd8fCIiPT09RVswXXx8RVswXSYmIi8iPT09RVswXS5jaGFyQXQoMCl8fEUudW5zaGlmdCgiIiksQSYmIi8iIT09RS5qb2luKCIvIikuc3Vic3RyKC0xKSYmRS5wdXNoKCIiKTt2YXIgaixUPSIiPT09RVswXXx8RVswXSYmIi8iPT09RVswXS5jaGFyQXQoMCk7UyYmKG4uaG9zdG5hbWU9bi5ob3N0PVQ/IiI6RS5sZW5ndGg/RS5zaGlmdCgpOiIiLChqPSEhKG4uaG9zdCYmbi5ob3N0LmluZGV4T2YoIkAiKT4wKSYmbi5ob3N0LnNwbGl0KCJAIikpJiYobi5hdXRoPWouc2hpZnQoKSxuLmhvc3Q9bi5ob3N0bmFtZT1qLnNoaWZ0KCkpKTtyZXR1cm4odz13fHxuLmhvc3QmJkUubGVuZ3RoKSYmIVQmJkUudW5zaGlmdCgiIiksRS5sZW5ndGg/bi5wYXRobmFtZT1FLmpvaW4oIi8iKToobi5wYXRobmFtZT1udWxsLG4ucGF0aD1udWxsKSxvLmlzTnVsbChuLnBhdGhuYW1lKSYmby5pc051bGwobi5zZWFyY2gpfHwobi5wYXRoPShuLnBhdGhuYW1lP24ucGF0aG5hbWU6IiIpKyhuLnNlYXJjaD9uLnNlYXJjaDoiIikpLG4uYXV0aD1lLmF1dGh8fG4uYXV0aCxuLnNsYXNoZXM9bi5zbGFzaGVzfHxlLnNsYXNoZXMsbi5ocmVmPW4uZm9ybWF0KCksbn0sYS5wcm90b3R5cGUucGFyc2VIb3N0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5ob3N0LHQ9cy5leGVjKGUpO3QmJigiOiIhPT0odD10WzBdKSYmKHRoaXMucG9ydD10LnN1YnN0cigxKSksZT1lLnN1YnN0cigwLGUubGVuZ3RoLXQubGVuZ3RoKSksZSYmKHRoaXMuaG9zdG5hbWU9ZSl9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KSxuLmQodCwiU0hPV19BVVRIX1BPUFVQIiwoZnVuY3Rpb24oKXtyZXR1cm4gaH0pKSxuLmQodCwiQVVUSE9SSVpFIiwoZnVuY3Rpb24oKXtyZXR1cm4gZH0pKSxuLmQodCwiTE9HT1VUIiwoZnVuY3Rpb24oKXtyZXR1cm4gbX0pKSxuLmQodCwiUFJFX0FVVEhPUklaRV9PQVVUSDIiLChmdW5jdGlvbigpe3JldHVybiB2fSkpLG4uZCh0LCJBVVRIT1JJWkVfT0FVVEgyIiwoZnVuY3Rpb24oKXtyZXR1cm4gZ30pKSxuLmQodCwiVkFMSURBVEUiLChmdW5jdGlvbigpe3JldHVybiB5fSkpLG4uZCh0LCJDT05GSUdVUkVfQVVUSCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGJ9KSksbi5kKHQsIlJFU1RPUkVfQVVUSE9SSVpBVElPTiIsKGZ1bmN0aW9uKCl7cmV0dXJuIF99KSksbi5kKHQsInNob3dEZWZpbml0aW9ucyIsKGZ1bmN0aW9uKCl7cmV0dXJuIHd9KSksbi5kKHQsImF1dGhvcml6ZSIsKGZ1bmN0aW9uKCl7cmV0dXJuIHh9KSksbi5kKHQsImF1dGhvcml6ZVdpdGhQZXJzaXN0T3B0aW9uIiwoZnVuY3Rpb24oKXtyZXR1cm4gRX0pKSxuLmQodCwibG9nb3V0IiwoZnVuY3Rpb24oKXtyZXR1cm4gU30pKSxuLmQodCwibG9nb3V0V2l0aFBlcnNpc3RPcHRpb24iLChmdW5jdGlvbigpe3JldHVybiBDfSkpLG4uZCh0LCJwcmVBdXRob3JpemVJbXBsaWNpdCIsKGZ1bmN0aW9uKCl7cmV0dXJuIEF9KSksbi5kKHQsImF1dGhvcml6ZU9hdXRoMiIsKGZ1bmN0aW9uKCl7cmV0dXJuIE99KSksbi5kKHQsImF1dGhvcml6ZU9hdXRoMldpdGhQZXJzaXN0T3B0aW9uIiwoZnVuY3Rpb24oKXtyZXR1cm4ga30pKSxuLmQodCwiYXV0aG9yaXplUGFzc3dvcmQiLChmdW5jdGlvbigpe3JldHVybiBqfSkpLG4uZCh0LCJhdXRob3JpemVBcHBsaWNhdGlvbiIsKGZ1bmN0aW9uKCl7cmV0dXJuIFR9KSksbi5kKHQsImF1dGhvcml6ZUFjY2Vzc0NvZGVXaXRoRm9ybVBhcmFtcyIsKGZ1bmN0aW9uKCl7cmV0dXJuIEl9KSksbi5kKHQsImF1dGhvcml6ZUFjY2Vzc0NvZGVXaXRoQmFzaWNBdXRoZW50aWNhdGlvbiIsKGZ1bmN0aW9uKCl7cmV0dXJuIFB9KSksbi5kKHQsImF1dGhvcml6ZVJlcXVlc3QiLChmdW5jdGlvbigpe3JldHVybiBOfSkpLG4uZCh0LCJjb25maWd1cmVBdXRoIiwoZnVuY3Rpb24oKXtyZXR1cm4gTX0pKSxuLmQodCwicmVzdG9yZUF1dGhvcml6YXRpb24iLChmdW5jdGlvbigpe3JldHVybiBSfSkpLG4uZCh0LCJwZXJzaXN0QXV0aG9yaXphdGlvbklmTmVlZGVkIiwoZnVuY3Rpb24oKXtyZXR1cm4gRH0pKTt2YXIgcj1uKDE4KSxvPW4ubihyKSxhPW4oMzIpLGk9bi5uKGEpLHM9bigyMCksdT1uLm4ocyksYz1uKDkyKSxsPW4ubihjKSxwPW4oMjYpLGY9big1KSxoPSJzaG93X3BvcHVwIixkPSJhdXRob3JpemUiLG09ImxvZ291dCIsdj0icHJlX2F1dGhvcml6ZV9vYXV0aDIiLGc9ImF1dGhvcml6ZV9vYXV0aDIiLHk9InZhbGlkYXRlIixiPSJjb25maWd1cmVfYXV0aCIsXz0icmVzdG9yZV9hdXRob3JpemF0aW9uIjtmdW5jdGlvbiB3KGUpe3JldHVybnt0eXBlOmgscGF5bG9hZDplfX1mdW5jdGlvbiB4KGUpe3JldHVybnt0eXBlOmQscGF5bG9hZDplfX12YXIgRT1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49dC5hdXRoQWN0aW9ucztuLmF1dGhvcml6ZShlKSxuLnBlcnNpc3RBdXRob3JpemF0aW9uSWZOZWVkZWQoKX19O2Z1bmN0aW9uIFMoZSl7cmV0dXJue3R5cGU6bSxwYXlsb2FkOmV9fXZhciBDPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10LmF1dGhBY3Rpb25zO24ubG9nb3V0KGUpLG4ucGVyc2lzdEF1dGhvcml6YXRpb25JZk5lZWRlZCgpfX0sQT1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49dC5hdXRoQWN0aW9ucyxyPXQuZXJyQWN0aW9ucyxvPWUuYXV0aCxhPWUudG9rZW4scz1lLmlzVmFsaWQsdT1vLnNjaGVtYSxjPW8ubmFtZSxsPXUuZ2V0KCJmbG93Iik7ZGVsZXRlIHAuYS5zd2FnZ2VyVUlSZWRpcmVjdE9hdXRoMiwiYWNjZXNzQ29kZSI9PT1sfHxzfHxyLm5ld0F1dGhFcnIoe2F1dGhJZDpjLHNvdXJjZToiYXV0aCIsbGV2ZWw6Indhcm5pbmciLG1lc3NhZ2U6IkF1dGhvcml6YXRpb24gbWF5IGJlIHVuc2FmZSwgcGFzc2VkIHN0YXRlIHdhcyBjaGFuZ2VkIGluIHNlcnZlciBQYXNzZWQgc3RhdGUgd2Fzbid0IHJldHVybmVkIGZyb20gYXV0aCBzZXJ2ZXIifSksYS5lcnJvcj9yLm5ld0F1dGhFcnIoe2F1dGhJZDpjLHNvdXJjZToiYXV0aCIsbGV2ZWw6ImVycm9yIixtZXNzYWdlOmkoKShhKX0pOm4uYXV0aG9yaXplT2F1dGgyV2l0aFBlcnNpc3RPcHRpb24oe2F1dGg6byx0b2tlbjphfSl9fTtmdW5jdGlvbiBPKGUpe3JldHVybnt0eXBlOmcscGF5bG9hZDplfX12YXIgaz1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49dC5hdXRoQWN0aW9ucztuLmF1dGhvcml6ZU9hdXRoMihlKSxuLnBlcnNpc3RBdXRob3JpemF0aW9uSWZOZWVkZWQoKX19LGo9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPXQuYXV0aEFjdGlvbnMscj1lLnNjaGVtYSxvPWUubmFtZSxhPWUudXNlcm5hbWUsaT1lLnBhc3N3b3JkLHM9ZS5wYXNzd29yZFR5cGUsYz1lLmNsaWVudElkLGw9ZS5jbGllbnRTZWNyZXQscD17Z3JhbnRfdHlwZToicGFzc3dvcmQiLHNjb3BlOmUuc2NvcGVzLmpvaW4oIiAiKSx1c2VybmFtZTphLHBhc3N3b3JkOml9LGg9e307c3dpdGNoKHMpe2Nhc2UicmVxdWVzdC1ib2R5IjohZnVuY3Rpb24oZSx0LG4pe3QmJnUoKShlLHtjbGllbnRfaWQ6dH0pO24mJnUoKShlLHtjbGllbnRfc2VjcmV0Om59KX0ocCxjLGwpO2JyZWFrO2Nhc2UiYmFzaWMiOmguQXV0aG9yaXphdGlvbj0iQmFzaWMgIitPYmplY3QoZi5hKShjKyI6IitsKTticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiV2FybmluZzogaW52YWxpZCBwYXNzd29yZFR5cGUgIi5jb25jYXQocywiIHdhcyBwYXNzZWQsIG5vdCBpbmNsdWRpbmcgY2xpZW50IGlkIGFuZCBzZWNyZXQiKSl9cmV0dXJuIG4uYXV0aG9yaXplUmVxdWVzdCh7Ym9keTpPYmplY3QoZi5iKShwKSx1cmw6ci5nZXQoInRva2VuVXJsIiksbmFtZTpvLGhlYWRlcnM6aCxxdWVyeTp7fSxhdXRoOmV9KX19O3ZhciBUPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10LmF1dGhBY3Rpb25zLHI9ZS5zY2hlbWEsbz1lLnNjb3BlcyxhPWUubmFtZSxpPWUuY2xpZW50SWQscz1lLmNsaWVudFNlY3JldCx1PXtBdXRob3JpemF0aW9uOiJCYXNpYyAiK09iamVjdChmLmEpKGkrIjoiK3MpfSxjPXtncmFudF90eXBlOiJjbGllbnRfY3JlZGVudGlhbHMiLHNjb3BlOm8uam9pbigiICIpfTtyZXR1cm4gbi5hdXRob3JpemVSZXF1ZXN0KHtib2R5Ok9iamVjdChmLmIpKGMpLG5hbWU6YSx1cmw6ci5nZXQoInRva2VuVXJsIiksYXV0aDplLGhlYWRlcnM6dX0pfX0sST1mdW5jdGlvbihlKXt2YXIgdD1lLmF1dGgsbj1lLnJlZGlyZWN0VXJsO3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj1lLmF1dGhBY3Rpb25zLG89dC5zY2hlbWEsYT10Lm5hbWUsaT10LmNsaWVudElkLHM9dC5jbGllbnRTZWNyZXQsdT10LmNvZGVWZXJpZmllcixjPXtncmFudF90eXBlOiJhdXRob3JpemF0aW9uX2NvZGUiLGNvZGU6dC5jb2RlLGNsaWVudF9pZDppLGNsaWVudF9zZWNyZXQ6cyxyZWRpcmVjdF91cmk6bixjb2RlX3ZlcmlmaWVyOnV9O3JldHVybiByLmF1dGhvcml6ZVJlcXVlc3Qoe2JvZHk6T2JqZWN0KGYuYikoYyksbmFtZTphLHVybDpvLmdldCgidG9rZW5VcmwiKSxhdXRoOnR9KX19LFA9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hdXRoLG49ZS5yZWRpcmVjdFVybDtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHI9ZS5hdXRoQWN0aW9ucyxvPXQuc2NoZW1hLGE9dC5uYW1lLGk9dC5jbGllbnRJZCxzPXQuY2xpZW50U2VjcmV0LHU9dC5jb2RlVmVyaWZpZXIsYz17QXV0aG9yaXphdGlvbjoiQmFzaWMgIitPYmplY3QoZi5hKShpKyI6IitzKX0sbD17Z3JhbnRfdHlwZToiYXV0aG9yaXphdGlvbl9jb2RlIixjb2RlOnQuY29kZSxjbGllbnRfaWQ6aSxyZWRpcmVjdF91cmk6bixjb2RlX3ZlcmlmaWVyOnV9O3JldHVybiByLmF1dGhvcml6ZVJlcXVlc3Qoe2JvZHk6T2JqZWN0KGYuYikobCksbmFtZTphLHVybDpvLmdldCgidG9rZW5VcmwiKSxhdXRoOnQsaGVhZGVyczpjfSl9fSxOPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbixyPXQuZm4sYT10LmdldENvbmZpZ3Mscz10LmF1dGhBY3Rpb25zLGM9dC5lcnJBY3Rpb25zLHA9dC5vYXMzU2VsZWN0b3JzLGY9dC5zcGVjU2VsZWN0b3JzLGg9dC5hdXRoU2VsZWN0b3JzLGQ9ZS5ib2R5LG09ZS5xdWVyeSx2PXZvaWQgMD09PW0/e306bSxnPWUuaGVhZGVycyx5PXZvaWQgMD09PWc/e306ZyxiPWUubmFtZSxfPWUudXJsLHc9ZS5hdXRoLHg9KGguZ2V0Q29uZmlncygpfHx7fSkuYWRkaXRpb25hbFF1ZXJ5U3RyaW5nUGFyYW1zO2lmKGYuaXNPQVMzKCkpe3ZhciBFPXAuc2VydmVyRWZmZWN0aXZlVmFsdWUocC5zZWxlY3RlZFNlcnZlcigpKTtuPWwoKShfLEUsITApfWVsc2Ugbj1sKCkoXyxmLnVybCgpLCEwKTsib2JqZWN0Ij09PW8oKSh4KSYmKG4ucXVlcnk9dSgpKHt9LG4ucXVlcnkseCkpO3ZhciBTPW4udG9TdHJpbmcoKSxDPXUoKSh7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyoiLCJDb250ZW50LVR5cGUiOiJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLCJYLVJlcXVlc3RlZC1XaXRoIjoiWE1MSHR0cFJlcXVlc3QifSx5KTtyLmZldGNoKHt1cmw6UyxtZXRob2Q6InBvc3QiLGhlYWRlcnM6QyxxdWVyeTp2LGJvZHk6ZCxyZXF1ZXN0SW50ZXJjZXB0b3I6YSgpLnJlcXVlc3RJbnRlcmNlcHRvcixyZXNwb25zZUludGVyY2VwdG9yOmEoKS5yZXNwb25zZUludGVyY2VwdG9yfSkudGhlbigoZnVuY3Rpb24oZSl7dmFyIHQ9SlNPTi5wYXJzZShlLmRhdGEpLG49dCYmKHQuZXJyb3J8fCIiKSxyPXQmJih0LnBhcnNlRXJyb3J8fCIiKTtlLm9rP258fHI/Yy5uZXdBdXRoRXJyKHthdXRoSWQ6YixsZXZlbDoiZXJyb3IiLHNvdXJjZToiYXV0aCIsbWVzc2FnZTppKCkodCl9KTpzLmF1dGhvcml6ZU9hdXRoMldpdGhQZXJzaXN0T3B0aW9uKHthdXRoOncsdG9rZW46dH0pOmMubmV3QXV0aEVycih7YXV0aElkOmIsbGV2ZWw6ImVycm9yIixzb3VyY2U6ImF1dGgiLG1lc3NhZ2U6ZS5zdGF0dXNUZXh0fSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBFcnJvcihlKS5tZXNzYWdlO2lmKGUucmVzcG9uc2UmJmUucmVzcG9uc2UuZGF0YSl7dmFyIG49ZS5yZXNwb25zZS5kYXRhO3RyeXt2YXIgcj0ic3RyaW5nIj09dHlwZW9mIG4/SlNPTi5wYXJzZShuKTpuO3IuZXJyb3ImJih0Kz0iLCBlcnJvcjogIi5jb25jYXQoci5lcnJvcikpLHIuZXJyb3JfZGVzY3JpcHRpb24mJih0Kz0iLCBkZXNjcmlwdGlvbjogIi5jb25jYXQoci5lcnJvcl9kZXNjcmlwdGlvbikpfWNhdGNoKGUpe319Yy5uZXdBdXRoRXJyKHthdXRoSWQ6YixsZXZlbDoiZXJyb3IiLHNvdXJjZToiYXV0aCIsbWVzc2FnZTp0fSl9KSl9fTtmdW5jdGlvbiBNKGUpe3JldHVybnt0eXBlOmIscGF5bG9hZDplfX1mdW5jdGlvbiBSKGUpe3JldHVybnt0eXBlOl8scGF5bG9hZDplfX12YXIgRD1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD1lLmF1dGhTZWxlY3RvcnM7aWYoKDAsZS5nZXRDb25maWdzKSgpLnBlcnNpc3RBdXRob3JpemF0aW9uKXt2YXIgbj10LmF1dGhvcml6ZWQoKTtsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiYXV0aG9yaXplZCIsaSgpKG4udG9KUygpKSl9fX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDEwNDcpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbdF0/T2JqZWN0KGFyZ3VtZW50c1t0XSk6e30sbz1PYmplY3Qua2V5cyhuKTsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyYmKG89by5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhuKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sZSkuZW51bWVyYWJsZX0pKSkpLG8uZm9yRWFjaCgoZnVuY3Rpb24odCl7cihlLHQsblt0XSl9KSl9cmV0dXJuIGV9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMDkpLG89bigxNzkpLGE9big2MiksaT1uKDY5KSxzPW4oMjI0KSx1PVtdLnB1c2gsYz1mdW5jdGlvbihlKXt2YXIgdD0xPT1lLG49Mj09ZSxjPTM9PWUsbD00PT1lLHA9Nj09ZSxmPTc9PWUsaD01PT1lfHxwO3JldHVybiBmdW5jdGlvbihkLG0sdixnKXtmb3IodmFyIHksYixfPWEoZCksdz1vKF8pLHg9cihtLHYsMyksRT1pKHcubGVuZ3RoKSxTPTAsQz1nfHxzLEE9dD9DKGQsRSk6bnx8Zj9DKGQsMCk6dm9pZCAwO0U+UztTKyspaWYoKGh8fFMgaW4gdykmJihiPXgoeT13W1NdLFMsXyksZSkpaWYodClBW1NdPWI7ZWxzZSBpZihiKXN3aXRjaChlKXtjYXNlIDM6cmV0dXJuITA7Y2FzZSA1OnJldHVybiB5O2Nhc2UgNjpyZXR1cm4gUztjYXNlIDI6dS5jYWxsKEEseSl9ZWxzZSBzd2l0Y2goZSl7Y2FzZSA0OnJldHVybiExO2Nhc2UgNzp1LmNhbGwoQSx5KX1yZXR1cm4gcD8tMTpjfHxsP2w6QX19O2UuZXhwb3J0cz17Zm9yRWFjaDpjKDApLG1hcDpjKDEpLGZpbHRlcjpjKDIpLHNvbWU6YygzKSxldmVyeTpjKDQpLGZpbmQ6Yyg1KSxmaW5kSW5kZXg6Yyg2KSxmaWx0ZXJPdXQ6Yyg3KX19LGZ1bmN0aW9uKGUsdCxuKXtuKDE1OCk7dmFyIHI9big1NjcpLG89big0MCksYT1uKDk4KSxpPW4oNjcpLHM9bigxMzEpLHU9big0MSkoInRvU3RyaW5nVGFnIik7Zm9yKHZhciBjIGluIHIpe3ZhciBsPW9bY10scD1sJiZsLnByb3RvdHlwZTtwJiZhKHApIT09dSYmaShwLHUsYyksc1tjXT1zLkFycmF5fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9e2N1cnJlbnQ6bnVsbH19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lJiYib2JqZWN0Ij09dHlwZW9mIGV9fSxmdW5jdGlvbihlLHQpe3ZhciBuLHIsbz1lLmV4cG9ydHM9e307ZnVuY3Rpb24gYSgpe3Rocm93IG5ldyBFcnJvcigic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIGkoKXt0aHJvdyBuZXcgRXJyb3IoImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIHMoZSl7aWYobj09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQoZSwwKTtpZigobj09PWF8fCFuKSYmc2V0VGltZW91dClyZXR1cm4gbj1zZXRUaW1lb3V0LHNldFRpbWVvdXQoZSwwKTt0cnl7cmV0dXJuIG4oZSwwKX1jYXRjaCh0KXt0cnl7cmV0dXJuIG4uY2FsbChudWxsLGUsMCl9Y2F0Y2godCl7cmV0dXJuIG4uY2FsbCh0aGlzLGUsMCl9fX0hZnVuY3Rpb24oKXt0cnl7bj0iZnVuY3Rpb24iPT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0OmF9Y2F0Y2goZSl7bj1hfXRyeXtyPSJmdW5jdGlvbiI9PXR5cGVvZiBjbGVhclRpbWVvdXQ/Y2xlYXJUaW1lb3V0Oml9Y2F0Y2goZSl7cj1pfX0oKTt2YXIgdSxjPVtdLGw9ITEscD0tMTtmdW5jdGlvbiBmKCl7bCYmdSYmKGw9ITEsdS5sZW5ndGg/Yz11LmNvbmNhdChjKTpwPS0xLGMubGVuZ3RoJiZoKCkpfWZ1bmN0aW9uIGgoKXtpZighbCl7dmFyIGU9cyhmKTtsPSEwO2Zvcih2YXIgdD1jLmxlbmd0aDt0Oyl7Zm9yKHU9YyxjPVtdOysrcDx0Oyl1JiZ1W3BdLnJ1bigpO3A9LTEsdD1jLmxlbmd0aH11PW51bGwsbD0hMSxmdW5jdGlvbihlKXtpZihyPT09Y2xlYXJUaW1lb3V0KXJldHVybiBjbGVhclRpbWVvdXQoZSk7aWYoKHI9PT1pfHwhcikmJmNsZWFyVGltZW91dClyZXR1cm4gcj1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KGUpO3RyeXtyKGUpfWNhdGNoKHQpe3RyeXtyZXR1cm4gci5jYWxsKG51bGwsZSl9Y2F0Y2godCl7cmV0dXJuIHIuY2FsbCh0aGlzLGUpfX19KGUpfX1mdW5jdGlvbiBkKGUsdCl7dGhpcy5mdW49ZSx0aGlzLmFycmF5PXR9ZnVuY3Rpb24gbSgpe31vLm5leHRUaWNrPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSlmb3IodmFyIG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXRbbi0xXT1hcmd1bWVudHNbbl07Yy5wdXNoKG5ldyBkKGUsdCkpLDEhPT1jLmxlbmd0aHx8bHx8cyhoKX0sZC5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX0sby50aXRsZT0iYnJvd3NlciIsby5icm93c2VyPSEwLG8uZW52PXt9LG8uYXJndj1bXSxvLnZlcnNpb249IiIsby52ZXJzaW9ucz17fSxvLm9uPW0sby5hZGRMaXN0ZW5lcj1tLG8ub25jZT1tLG8ub2ZmPW0sby5yZW1vdmVMaXN0ZW5lcj1tLG8ucmVtb3ZlQWxsTGlzdGVuZXJzPW0sby5lbWl0PW0sby5wcmVwZW5kTGlzdGVuZXI9bSxvLnByZXBlbmRPbmNlTGlzdGVuZXI9bSxvLmxpc3RlbmVycz1mdW5jdGlvbihlKXtyZXR1cm5bXX0sby5iaW5kaW5nPWZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKX0sby5jd2Q9ZnVuY3Rpb24oKXtyZXR1cm4iLyJ9LG8uY2hkaXI9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQiKX0sby51bWFzaz1mdW5jdGlvbigpe3JldHVybiAwfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDM4KSxvPW4oMTIyKSxhPW4oNzgpLGk9KG4oMzQpLFsiZGlzcGF0Y2hDb25maWciLCJfdGFyZ2V0SW5zdCIsIm5hdGl2ZUV2ZW50IiwiaXNEZWZhdWx0UHJldmVudGVkIiwiaXNQcm9wYWdhdGlvblN0b3BwZWQiLCJfZGlzcGF0Y2hMaXN0ZW5lcnMiLCJfZGlzcGF0Y2hJbnN0YW5jZXMiXSkscz17dHlwZTpudWxsLHRhcmdldDpudWxsLGN1cnJlbnRUYXJnZXQ6YS50aGF0UmV0dXJuc051bGwsZXZlbnRQaGFzZTpudWxsLGJ1YmJsZXM6bnVsbCxjYW5jZWxhYmxlOm51bGwsdGltZVN0YW1wOmZ1bmN0aW9uKGUpe3JldHVybiBlLnRpbWVTdGFtcHx8RGF0ZS5ub3coKX0sZGVmYXVsdFByZXZlbnRlZDpudWxsLGlzVHJ1c3RlZDpudWxsfTtmdW5jdGlvbiB1KGUsdCxuLHIpe3RoaXMuZGlzcGF0Y2hDb25maWc9ZSx0aGlzLl90YXJnZXRJbnN0PXQsdGhpcy5uYXRpdmVFdmVudD1uO3ZhciBvPXRoaXMuY29uc3RydWN0b3IuSW50ZXJmYWNlO2Zvcih2YXIgaSBpbiBvKWlmKG8uaGFzT3duUHJvcGVydHkoaSkpezA7dmFyIHM9b1tpXTtzP3RoaXNbaV09cyhuKToidGFyZ2V0Ij09PWk/dGhpcy50YXJnZXQ9cjp0aGlzW2ldPW5baV19dmFyIHU9bnVsbCE9bi5kZWZhdWx0UHJldmVudGVkP24uZGVmYXVsdFByZXZlbnRlZDohMT09PW4ucmV0dXJuVmFsdWU7cmV0dXJuIHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPXU/YS50aGF0UmV0dXJuc1RydWU6YS50aGF0UmV0dXJuc0ZhbHNlLHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9YS50aGF0UmV0dXJuc0ZhbHNlLHRoaXN9cih1LnByb3RvdHlwZSx7cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITA7dmFyIGU9dGhpcy5uYXRpdmVFdmVudDtlJiYoZS5wcmV2ZW50RGVmYXVsdD9lLnByZXZlbnREZWZhdWx0KCk6InVua25vd24iIT10eXBlb2YgZS5yZXR1cm5WYWx1ZSYmKGUucmV0dXJuVmFsdWU9ITEpLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEudGhhdFJldHVybnNUcnVlKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5uYXRpdmVFdmVudDtlJiYoZS5zdG9wUHJvcGFnYXRpb24/ZS5zdG9wUHJvcGFnYXRpb24oKToidW5rbm93biIhPXR5cGVvZiBlLmNhbmNlbEJ1YmJsZSYmKGUuY2FuY2VsQnViYmxlPSEwKSx0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPWEudGhhdFJldHVybnNUcnVlKX0scGVyc2lzdDpmdW5jdGlvbigpe3RoaXMuaXNQZXJzaXN0ZW50PWEudGhhdFJldHVybnNUcnVlfSxpc1BlcnNpc3RlbnQ6YS50aGF0UmV0dXJuc0ZhbHNlLGRlc3RydWN0b3I6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmNvbnN0cnVjdG9yLkludGVyZmFjZTtmb3IodmFyIHQgaW4gZSl0aGlzW3RdPW51bGw7Zm9yKHZhciBuPTA7bjxpLmxlbmd0aDtuKyspdGhpc1tpW25dXT1udWxsfX0pLHUuSW50ZXJmYWNlPXMsdS5hdWdtZW50Q2xhc3M9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLGE9ZnVuY3Rpb24oKXt9O2EucHJvdG90eXBlPW4ucHJvdG90eXBlO3ZhciBpPW5ldyBhO3IoaSxlLnByb3RvdHlwZSksZS5wcm90b3R5cGU9aSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLGUuSW50ZXJmYWNlPXIoe30sbi5JbnRlcmZhY2UsdCksZS5hdWdtZW50Q2xhc3M9bi5hdWdtZW50Q2xhc3Msby5hZGRQb29saW5nVG8oZSxvLmZvdXJBcmd1bWVudFBvb2xlcil9LG8uYWRkUG9vbGluZ1RvKHUsby5mb3VyQXJndW1lbnRQb29sZXIpLGUuZXhwb3J0cz11fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KSxuLmQodCwibGFzdEVycm9yIiwoZnVuY3Rpb24oKXtyZXR1cm4gTX0pKSxuLmQodCwidXJsIiwoZnVuY3Rpb24oKXtyZXR1cm4gUn0pKSxuLmQodCwic3BlY1N0ciIsKGZ1bmN0aW9uKCl7cmV0dXJuIER9KSksbi5kKHQsInNwZWNTb3VyY2UiLChmdW5jdGlvbigpe3JldHVybiBMfSkpLG4uZCh0LCJzcGVjSnNvbiIsKGZ1bmN0aW9uKCl7cmV0dXJuIEJ9KSksbi5kKHQsInNwZWNSZXNvbHZlZCIsKGZ1bmN0aW9uKCl7cmV0dXJuIEZ9KSksbi5kKHQsInNwZWNSZXNvbHZlZFN1YnRyZWUiLChmdW5jdGlvbigpe3JldHVybiBVfSkpLG4uZCh0LCJzcGVjSnNvbldpdGhSZXNvbHZlZFN1YnRyZWVzIiwoZnVuY3Rpb24oKXtyZXR1cm4gen0pKSxuLmQodCwic3BlYyIsKGZ1bmN0aW9uKCl7cmV0dXJuIFZ9KSksbi5kKHQsImlzT0FTMyIsKGZ1bmN0aW9uKCl7cmV0dXJuIFd9KSksbi5kKHQsImluZm8iLChmdW5jdGlvbigpe3JldHVybiBIfSkpLG4uZCh0LCJleHRlcm5hbERvY3MiLChmdW5jdGlvbigpe3JldHVybiAkfSkpLG4uZCh0LCJ2ZXJzaW9uIiwoZnVuY3Rpb24oKXtyZXR1cm4gSn0pKSxuLmQodCwic2VtdmVyIiwoZnVuY3Rpb24oKXtyZXR1cm4gS30pKSxuLmQodCwicGF0aHMiLChmdW5jdGlvbigpe3JldHVybiBZfSkpLG4uZCh0LCJvcGVyYXRpb25zIiwoZnVuY3Rpb24oKXtyZXR1cm4gR30pKSxuLmQodCwiY29uc3VtZXMiLChmdW5jdGlvbigpe3JldHVybiBafSkpLG4uZCh0LCJwcm9kdWNlcyIsKGZ1bmN0aW9uKCl7cmV0dXJuIFh9KSksbi5kKHQsInNlY3VyaXR5IiwoZnVuY3Rpb24oKXtyZXR1cm4gUX0pKSxuLmQodCwic2VjdXJpdHlEZWZpbml0aW9ucyIsKGZ1bmN0aW9uKCl7cmV0dXJuIGVlfSkpLG4uZCh0LCJmaW5kRGVmaW5pdGlvbiIsKGZ1bmN0aW9uKCl7cmV0dXJuIHRlfSkpLG4uZCh0LCJkZWZpbml0aW9ucyIsKGZ1bmN0aW9uKCl7cmV0dXJuIG5lfSkpLG4uZCh0LCJiYXNlUGF0aCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHJlfSkpLG4uZCh0LCJob3N0IiwoZnVuY3Rpb24oKXtyZXR1cm4gb2V9KSksbi5kKHQsInNjaGVtZXMiLChmdW5jdGlvbigpe3JldHVybiBhZX0pKSxuLmQodCwib3BlcmF0aW9uc1dpdGhSb290SW5oZXJpdGVkIiwoZnVuY3Rpb24oKXtyZXR1cm4gaWV9KSksbi5kKHQsInRhZ3MiLChmdW5jdGlvbigpe3JldHVybiBzZX0pKSxuLmQodCwidGFnRGV0YWlscyIsKGZ1bmN0aW9uKCl7cmV0dXJuIHVlfSkpLG4uZCh0LCJvcGVyYXRpb25zV2l0aFRhZ3MiLChmdW5jdGlvbigpe3JldHVybiBjZX0pKSxuLmQodCwidGFnZ2VkT3BlcmF0aW9ucyIsKGZ1bmN0aW9uKCl7cmV0dXJuIGxlfSkpLG4uZCh0LCJyZXNwb25zZXMiLChmdW5jdGlvbigpe3JldHVybiBwZX0pKSxuLmQodCwicmVxdWVzdHMiLChmdW5jdGlvbigpe3JldHVybiBmZX0pKSxuLmQodCwibXV0YXRlZFJlcXVlc3RzIiwoZnVuY3Rpb24oKXtyZXR1cm4gaGV9KSksbi5kKHQsInJlc3BvbnNlRm9yIiwoZnVuY3Rpb24oKXtyZXR1cm4gZGV9KSksbi5kKHQsInJlcXVlc3RGb3IiLChmdW5jdGlvbigpe3JldHVybiBtZX0pKSxuLmQodCwibXV0YXRlZFJlcXVlc3RGb3IiLChmdW5jdGlvbigpe3JldHVybiB2ZX0pKSxuLmQodCwiYWxsb3dUcnlJdE91dEZvciIsKGZ1bmN0aW9uKCl7cmV0dXJuIGdlfSkpLG4uZCh0LCJwYXJhbWV0ZXJXaXRoTWV0YUJ5SWRlbnRpdHkiLChmdW5jdGlvbigpe3JldHVybiB5ZX0pKSxuLmQodCwicGFyYW1ldGVySW5jbHVzaW9uU2V0dGluZ0ZvciIsKGZ1bmN0aW9uKCl7cmV0dXJuIGJlfSkpLG4uZCh0LCJwYXJhbWV0ZXJXaXRoTWV0YSIsKGZ1bmN0aW9uKCl7cmV0dXJuIF9lfSkpLG4uZCh0LCJvcGVyYXRpb25XaXRoTWV0YSIsKGZ1bmN0aW9uKCl7cmV0dXJuIHdlfSkpLG4uZCh0LCJnZXRQYXJhbWV0ZXIiLChmdW5jdGlvbigpe3JldHVybiB4ZX0pKSxuLmQodCwiaGFzSG9zdCIsKGZ1bmN0aW9uKCl7cmV0dXJuIEVlfSkpLG4uZCh0LCJwYXJhbWV0ZXJWYWx1ZXMiLChmdW5jdGlvbigpe3JldHVybiBTZX0pKSxuLmQodCwicGFyYW1ldGVyc0luY2x1ZGVJbiIsKGZ1bmN0aW9uKCl7cmV0dXJuIENlfSkpLG4uZCh0LCJwYXJhbWV0ZXJzSW5jbHVkZVR5cGUiLChmdW5jdGlvbigpe3JldHVybiBBZX0pKSxuLmQodCwiY29udGVudFR5cGVWYWx1ZXMiLChmdW5jdGlvbigpe3JldHVybiBPZX0pKSxuLmQodCwiY3VycmVudFByb2R1Y2VzRm9yIiwoZnVuY3Rpb24oKXtyZXR1cm4ga2V9KSksbi5kKHQsInByb2R1Y2VzT3B0aW9uc0ZvciIsKGZ1bmN0aW9uKCl7cmV0dXJuIGplfSkpLG4uZCh0LCJjb25zdW1lc09wdGlvbnNGb3IiLChmdW5jdGlvbigpe3JldHVybiBUZX0pKSxuLmQodCwib3BlcmF0aW9uU2NoZW1lIiwoZnVuY3Rpb24oKXtyZXR1cm4gSWV9KSksbi5kKHQsImNhbkV4ZWN1dGVTY2hlbWUiLChmdW5jdGlvbigpe3JldHVybiBQZX0pKSxuLmQodCwidmFsaWRhdGVCZWZvcmVFeGVjdXRlIiwoZnVuY3Rpb24oKXtyZXR1cm4gTmV9KSksbi5kKHQsImdldE9BUzNSZXF1aXJlZFJlcXVlc3RCb2R5Q29udGVudFR5cGUiLChmdW5jdGlvbigpe3JldHVybiBNZX0pKSxuLmQodCwiaXNNZWRpYVR5cGVTY2hlbWFQcm9wZXJ0aWVzRXF1YWwiLChmdW5jdGlvbigpe3JldHVybiBSZX0pKTt2YXIgcj1uKDEzKSxvPW4ubihyKSxhPW4oMTQpLGk9bi5uKGEpLHM9bigyKSx1PW4ubihzKSxjPW4oMTkpLGw9bi5uKGMpLHA9bigyMSksZj1uLm4ocCksaD1uKDE3KSxkPW4ubihoKSxtPW4oNCksdj1uLm4obSksZz1uKDEyKSx5PW4ubihnKSxiPW4oNTgpLF89bi5uKGIpLHc9bigyOSkseD1uLm4odyksRT1uKDIwOSksUz1uLm4oRSksQz1uKDc0KSxBPW4ubihDKSxPPW4oMjMpLGs9bi5uKE8pLGo9bigxNiksVD1uKDUpLEk9bigxKSxQPVsiZ2V0IiwicHV0IiwicG9zdCIsImRlbGV0ZSIsIm9wdGlvbnMiLCJoZWFkIiwicGF0Y2giLCJ0cmFjZSJdLE49ZnVuY3Rpb24oZSl7cmV0dXJuIGV8fE9iamVjdChJLk1hcCkoKX0sTT1PYmplY3Qoai5hKShOLChmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXQoImxhc3RFcnJvciIpfSkpLFI9T2JqZWN0KGouYSkoTiwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0KCJ1cmwiKX0pKSxEPU9iamVjdChqLmEpKE4sKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldCgic3BlYyIpfHwiIn0pKSxMPU9iamVjdChqLmEpKE4sKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldCgic3BlY1NvdXJjZSIpfHwibm90LWVkaXRvciJ9KSksQj1PYmplY3Qoai5hKShOLChmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXQoImpzb24iLE9iamVjdChJLk1hcCkoKSl9KSksRj1PYmplY3Qoai5hKShOLChmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXQoInJlc29sdmVkIixPYmplY3QoSS5NYXApKCkpfSkpLFU9ZnVuY3Rpb24oZSx0KXt2YXIgbjtyZXR1cm4gZS5nZXRJbih1KCkobj1bInJlc29sdmVkU3VidHJlZXMiXSkuY2FsbChuLGkoKSh0KSksdm9pZCAwKX0scT1mdW5jdGlvbiBlKHQsbil7cmV0dXJuIEkuTWFwLmlzTWFwKHQpJiZJLk1hcC5pc01hcChuKT9uLmdldCgiJCRyZWYiKT9uOk9iamVjdChJLk9yZGVyZWRNYXApKCkubWVyZ2VXaXRoKGUsdCxuKTpufSx6PU9iamVjdChqLmEpKE4sKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QoSS5PcmRlcmVkTWFwKSgpLm1lcmdlV2l0aChxLGUuZ2V0KCJqc29uIiksZS5nZXQoInJlc29sdmVkU3VidHJlZXMiKSl9KSksVj1mdW5jdGlvbihlKXtyZXR1cm4gQihlKX0sVz1PYmplY3Qoai5hKShWLChmdW5jdGlvbigpe3JldHVybiExfSkpLEg9T2JqZWN0KGouYSkoViwoZnVuY3Rpb24oZSl7cmV0dXJuIERlKGUmJmUuZ2V0KCJpbmZvIikpfSkpLCQ9T2JqZWN0KGouYSkoViwoZnVuY3Rpb24oZSl7cmV0dXJuIERlKGUmJmUuZ2V0KCJleHRlcm5hbERvY3MiKSl9KSksSj1PYmplY3Qoai5hKShILChmdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5nZXQoInZlcnNpb24iKX0pKSxLPU9iamVjdChqLmEpKEosKGZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiBsKCkodD0vdj8oWzAtOV0qKVwuKFswLTldKilcLihbMC05XSopL2kuZXhlYyhlKSkuY2FsbCh0LDEpfSkpLFk9T2JqZWN0KGouYSkoeiwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0KCJwYXRocyIpfSkpLEc9T2JqZWN0KGouYSkoWSwoZnVuY3Rpb24oZSl7aWYoIWV8fGUuc2l6ZTwxKXJldHVybiBPYmplY3QoSS5MaXN0KSgpO3ZhciB0PU9iamVjdChJLkxpc3QpKCk7cmV0dXJuIGUmJmYoKShlKT8oZigpKGUpLmNhbGwoZSwoZnVuY3Rpb24oZSxuKXtpZighZXx8IWYoKShlKSlyZXR1cm57fTtmKCkoZSkuY2FsbChlLChmdW5jdGlvbihlLHIpe3ZhciBvO2QoKShQKS5jYWxsKFAscik8MHx8KHQ9dC5wdXNoKE9iamVjdChJLmZyb21KUykoe3BhdGg6bixtZXRob2Q6cixvcGVyYXRpb246ZSxpZDp1KCkobz0iIi5jb25jYXQociwiLSIpKS5jYWxsKG8sbil9KSkpfSkpfSkpLHQpOk9iamVjdChJLkxpc3QpKCl9KSksWj1PYmplY3Qoai5hKShWLChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0KEkuU2V0KShlLmdldCgiY29uc3VtZXMiKSl9KSksWD1PYmplY3Qoai5hKShWLChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0KEkuU2V0KShlLmdldCgicHJvZHVjZXMiKSl9KSksUT1PYmplY3Qoai5hKShWLChmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXQoInNlY3VyaXR5IixPYmplY3QoSS5MaXN0KSgpKX0pKSxlZT1PYmplY3Qoai5hKShWLChmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXQoInNlY3VyaXR5RGVmaW5pdGlvbnMiKX0pKSx0ZT1mdW5jdGlvbihlLHQpe3ZhciBuPWUuZ2V0SW4oWyJyZXNvbHZlZFN1YnRyZWVzIiwiZGVmaW5pdGlvbnMiLHRdLG51bGwpLHI9ZS5nZXRJbihbImpzb24iLCJkZWZpbml0aW9ucyIsdF0sbnVsbCk7cmV0dXJuIG58fHJ8fG51bGx9LG5lPU9iamVjdChqLmEpKFYsKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0KCJkZWZpbml0aW9ucyIpO3JldHVybiBJLk1hcC5pc01hcCh0KT90Ok9iamVjdChJLk1hcCkoKX0pKSxyZT1PYmplY3Qoai5hKShWLChmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXQoImJhc2VQYXRoIil9KSksb2U9T2JqZWN0KGouYSkoViwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0KCJob3N0Iil9KSksYWU9T2JqZWN0KGouYSkoViwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0KCJzY2hlbWVzIixPYmplY3QoSS5NYXApKCkpfSkpLGllPU9iamVjdChqLmEpKEcsWixYLChmdW5jdGlvbihlLHQsbil7cmV0dXJuIHYoKShlKS5jYWxsKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBlLnVwZGF0ZSgib3BlcmF0aW9uIiwoZnVuY3Rpb24oZSl7aWYoZSl7aWYoIUkuTWFwLmlzTWFwKGUpKXJldHVybjtyZXR1cm4gZS53aXRoTXV0YXRpb25zKChmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXQoImNvbnN1bWVzIil8fGUudXBkYXRlKCJjb25zdW1lcyIsKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QoSS5TZXQpKGUpLm1lcmdlKHQpfSkpLGUuZ2V0KCJwcm9kdWNlcyIpfHxlLnVwZGF0ZSgicHJvZHVjZXMiLChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0KEkuU2V0KShlKS5tZXJnZShuKX0pKSxlfSkpfXJldHVybiBPYmplY3QoSS5NYXApKCl9KSl9KSl9KSksc2U9T2JqZWN0KGouYSkoViwoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXQoInRhZ3MiLE9iamVjdChJLkxpc3QpKCkpO3JldHVybiBJLkxpc3QuaXNMaXN0KHQpP3koKSh0KS5jYWxsKHQsKGZ1bmN0aW9uKGUpe3JldHVybiBJLk1hcC5pc01hcChlKX0pKTpPYmplY3QoSS5MaXN0KSgpfSkpLHVlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1zZShlKXx8T2JqZWN0KEkuTGlzdCkoKTtyZXR1cm4gXygpKG49eSgpKHIpLmNhbGwocixJLk1hcC5pc01hcCkpLmNhbGwobiwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0KCJuYW1lIik9PT10fSksT2JqZWN0KEkuTWFwKSgpKX0sY2U9T2JqZWN0KGouYSkoaWUsc2UsKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHgoKShlKS5jYWxsKGUsKGZ1bmN0aW9uKGUsdCl7dmFyIG49T2JqZWN0KEkuU2V0KSh0LmdldEluKFsib3BlcmF0aW9uIiwidGFncyJdKSk7cmV0dXJuIG4uY291bnQoKTwxP2UudXBkYXRlKCJkZWZhdWx0IixPYmplY3QoSS5MaXN0KSgpLChmdW5jdGlvbihlKXtyZXR1cm4gZS5wdXNoKHQpfSkpOngoKShuKS5jYWxsKG4sKGZ1bmN0aW9uKGUsbil7cmV0dXJuIGUudXBkYXRlKG4sT2JqZWN0KEkuTGlzdCkoKSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUucHVzaCh0KX0pKX0pLGUpfSkseCgpKHQpLmNhbGwodCwoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5zZXQodC5nZXQoIm5hbWUiKSxPYmplY3QoSS5MaXN0KSgpKX0pLE9iamVjdChJLk9yZGVyZWRNYXApKCkpKX0pKSxsZT1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG4scj0oMCx0LmdldENvbmZpZ3MpKCksbz1yLnRhZ3NTb3J0ZXIsYT1yLm9wZXJhdGlvbnNTb3J0ZXI7cmV0dXJuIHYoKShuPWNlKGUpLnNvcnRCeSgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdH0pLChmdW5jdGlvbihlLHQpe3ZhciBuPSJmdW5jdGlvbiI9PXR5cGVvZiBvP286VC5ILnRhZ3NTb3J0ZXJbb107cmV0dXJuIG4/bihlLHQpOm51bGx9KSkpLmNhbGwobiwoZnVuY3Rpb24odCxuKXt2YXIgcj0iZnVuY3Rpb24iPT10eXBlb2YgYT9hOlQuSC5vcGVyYXRpb25zU29ydGVyW2FdLG89cj9TKCkodCkuY2FsbCh0LHIpOnQ7cmV0dXJuIE9iamVjdChJLk1hcCkoe3RhZ0RldGFpbHM6dWUoZSxuKSxvcGVyYXRpb25zOm99KX0pKX19LHBlPU9iamVjdChqLmEpKE4sKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldCgicmVzcG9uc2VzIixPYmplY3QoSS5NYXApKCkpfSkpLGZlPU9iamVjdChqLmEpKE4sKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldCgicmVxdWVzdHMiLE9iamVjdChJLk1hcCkoKSl9KSksaGU9T2JqZWN0KGouYSkoTiwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0KCJtdXRhdGVkUmVxdWVzdHMiLE9iamVjdChJLk1hcCkoKSl9KSksZGU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBwZShlKS5nZXRJbihbdCxuXSxudWxsKX0sbWU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBmZShlKS5nZXRJbihbdCxuXSxudWxsKX0sdmU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBoZShlKS5nZXRJbihbdCxuXSxudWxsKX0sZ2U9ZnVuY3Rpb24oKXtyZXR1cm4hMH0seWU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLG8sYT16KGUpLmdldEluKHUoKShyPVsicGF0aHMiXSkuY2FsbChyLGkoKSh0KSxbInBhcmFtZXRlcnMiXSksT2JqZWN0KEkuT3JkZXJlZE1hcCkoKSkscz1lLmdldEluKHUoKShvPVsibWV0YSIsInBhdGhzIl0pLmNhbGwobyxpKCkodCksWyJwYXJhbWV0ZXJzIl0pLE9iamVjdChJLk9yZGVyZWRNYXApKCkpLGM9digpKGEpLmNhbGwoYSwoZnVuY3Rpb24oZSl7dmFyIHQscixvLGE9cy5nZXQodSgpKHQ9IiIuY29uY2F0KG4uZ2V0KCJpbiIpLCIuIikpLmNhbGwodCxuLmdldCgibmFtZSIpKSksaT1zLmdldCh1KCkocj11KCkobz0iIi5jb25jYXQobi5nZXQoImluIiksIi4iKSkuY2FsbChvLG4uZ2V0KCJuYW1lIiksIi5oYXNoLSIpKS5jYWxsKHIsbi5oYXNoQ29kZSgpKSk7cmV0dXJuIE9iamVjdChJLk9yZGVyZWRNYXApKCkubWVyZ2UoZSxhLGkpfSkpO3JldHVybiBfKCkoYykuY2FsbChjLChmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXQoImluIik9PT1uLmdldCgiaW4iKSYmZS5nZXQoIm5hbWUiKT09PW4uZ2V0KCJuYW1lIil9KSxPYmplY3QoSS5PcmRlcmVkTWFwKSgpKX0sYmU9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG8sYSxzPXUoKShvPSIiLmNvbmNhdChyLCIuIikpLmNhbGwobyxuKTtyZXR1cm4gZS5nZXRJbih1KCkoYT1bIm1ldGEiLCJwYXRocyJdKS5jYWxsKGEsaSgpKHQpLFsicGFyYW1ldGVyX2luY2x1c2lvbnMiLHNdKSwhMSl9LF9lPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvLGE9eihlKS5nZXRJbih1KCkobz1bInBhdGhzIl0pLmNhbGwobyxpKCkodCksWyJwYXJhbWV0ZXJzIl0pLE9iamVjdChJLk9yZGVyZWRNYXApKCkpLHM9XygpKGEpLmNhbGwoYSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0KCJpbiIpPT09ciYmZS5nZXQoIm5hbWUiKT09PW59KSxPYmplY3QoSS5PcmRlcmVkTWFwKSgpKTtyZXR1cm4geWUoZSx0LHMpfSx3ZT1mdW5jdGlvbihlLHQsbil7dmFyIHIsbz16KGUpLmdldEluKFsicGF0aHMiLHQsbl0sT2JqZWN0KEkuT3JkZXJlZE1hcCkoKSksYT1lLmdldEluKFsibWV0YSIsInBhdGhzIix0LG5dLE9iamVjdChJLk9yZGVyZWRNYXApKCkpLGk9digpKHI9by5nZXQoInBhcmFtZXRlcnMiLE9iamVjdChJLkxpc3QpKCkpKS5jYWxsKHIsKGZ1bmN0aW9uKHIpe3JldHVybiB5ZShlLFt0LG5dLHIpfSkpO3JldHVybiBPYmplY3QoSS5PcmRlcmVkTWFwKSgpLm1lcmdlKG8sYSkuc2V0KCJwYXJhbWV0ZXJzIixpKX07ZnVuY3Rpb24geGUoZSx0LG4scil7dmFyIG87dD10fHxbXTt2YXIgYT1lLmdldEluKHUoKShvPVsibWV0YSIsInBhdGhzIl0pLmNhbGwobyxpKCkodCksWyJwYXJhbWV0ZXJzIl0pLE9iamVjdChJLmZyb21KUykoW10pKTtyZXR1cm4gXygpKGEpLmNhbGwoYSwoZnVuY3Rpb24oZSl7cmV0dXJuIEkuTWFwLmlzTWFwKGUpJiZlLmdldCgibmFtZSIpPT09biYmZS5nZXQoImluIik9PT1yfSkpfHxPYmplY3QoSS5NYXApKCl9dmFyIEVlPU9iamVjdChqLmEpKFYsKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0KCJob3N0Iik7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiZ0Lmxlbmd0aD4wJiYiLyIhPT10WzBdfSkpO2Z1bmN0aW9uIFNlKGUsdCxuKXt2YXIgcjt0PXR8fFtdO3ZhciBvPXdlLmFwcGx5KHZvaWQgMCx1KCkocj1bZV0pLmNhbGwocixpKCkodCkpKS5nZXQoInBhcmFtZXRlcnMiLE9iamVjdChJLkxpc3QpKCkpO3JldHVybiB4KCkobykuY2FsbChvLChmdW5jdGlvbihlLHQpe3ZhciByPW4mJiJib2R5Ij09PXQuZ2V0KCJpbiIpP3QuZ2V0KCJ2YWx1ZV94bWwiKTp0LmdldCgidmFsdWUiKTtyZXR1cm4gZS5zZXQoT2JqZWN0KFQuQSkodCx7YWxsb3dIYXNoZXM6ITF9KSxyKX0pLE9iamVjdChJLmZyb21KUykoe30pKX1mdW5jdGlvbiBDZShlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06IiI7aWYoSS5MaXN0LmlzTGlzdChlKSlyZXR1cm4gQSgpKGUpLmNhbGwoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIEkuTWFwLmlzTWFwKGUpJiZlLmdldCgiaW4iKT09PXR9KSl9ZnVuY3Rpb24gQWUoZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOiIiO2lmKEkuTGlzdC5pc0xpc3QoZSkpcmV0dXJuIEEoKShlKS5jYWxsKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBJLk1hcC5pc01hcChlKSYmZS5nZXQoInR5cGUiKT09PXR9KSl9ZnVuY3Rpb24gT2UoZSx0KXt2YXIgbixyO3Q9dHx8W107dmFyIG89eihlKS5nZXRJbih1KCkobj1bInBhdGhzIl0pLmNhbGwobixpKCkodCkpLE9iamVjdChJLmZyb21KUykoe30pKSxhPWUuZ2V0SW4odSgpKHI9WyJtZXRhIiwicGF0aHMiXSkuY2FsbChyLGkoKSh0KSksT2JqZWN0KEkuZnJvbUpTKSh7fSkpLHM9a2UoZSx0KSxjPW8uZ2V0KCJwYXJhbWV0ZXJzIil8fG5ldyBJLkxpc3QsbD1hLmdldCgiY29uc3VtZXNfdmFsdWUiKT9hLmdldCgiY29uc3VtZXNfdmFsdWUiKTpBZShjLCJmaWxlIik/Im11bHRpcGFydC9mb3JtLWRhdGEiOkFlKGMsImZvcm1EYXRhIik/ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCI6dm9pZCAwO3JldHVybiBPYmplY3QoSS5mcm9tSlMpKHtyZXF1ZXN0Q29udGVudFR5cGU6bCxyZXNwb25zZUNvbnRlbnRUeXBlOnN9KX1mdW5jdGlvbiBrZShlLHQpe3ZhciBuLHI7dD10fHxbXTt2YXIgbz16KGUpLmdldEluKHUoKShuPVsicGF0aHMiXSkuY2FsbChuLGkoKSh0KSksbnVsbCk7aWYobnVsbCE9PW8pe3ZhciBhPWUuZ2V0SW4odSgpKHI9WyJtZXRhIiwicGF0aHMiXSkuY2FsbChyLGkoKSh0KSxbInByb2R1Y2VzX3ZhbHVlIl0pLG51bGwpLHM9by5nZXRJbihbInByb2R1Y2VzIiwwXSxudWxsKTtyZXR1cm4gYXx8c3x8ImFwcGxpY2F0aW9uL2pzb24ifX1mdW5jdGlvbiBqZShlLHQpe3ZhciBuO3Q9dHx8W107dmFyIHI9eihlKSxhPXIuZ2V0SW4odSgpKG49WyJwYXRocyJdKS5jYWxsKG4saSgpKHQpKSxudWxsKTtpZihudWxsIT09YSl7dmFyIHM9dCxjPW8oKShzLDEpWzBdLGw9YS5nZXQoInByb2R1Y2VzIixudWxsKSxwPXIuZ2V0SW4oWyJwYXRocyIsYywicHJvZHVjZXMiXSxudWxsKSxmPXIuZ2V0SW4oWyJwcm9kdWNlcyJdLG51bGwpO3JldHVybiBsfHxwfHxmfX1mdW5jdGlvbiBUZShlLHQpe3ZhciBuO3Q9dHx8W107dmFyIHI9eihlKSxhPXIuZ2V0SW4odSgpKG49WyJwYXRocyJdKS5jYWxsKG4saSgpKHQpKSxudWxsKTtpZihudWxsIT09YSl7dmFyIHM9dCxjPW8oKShzLDEpWzBdLGw9YS5nZXQoImNvbnN1bWVzIixudWxsKSxwPXIuZ2V0SW4oWyJwYXRocyIsYywiY29uc3VtZXMiXSxudWxsKSxmPXIuZ2V0SW4oWyJjb25zdW1lcyJdLG51bGwpO3JldHVybiBsfHxwfHxmfX12YXIgSWU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUuZ2V0KCJ1cmwiKS5tYXRjaCgvXihbYS16XVthLXowLTkrXC0uXSopOi8pLG89aygpKHIpP3JbMV06bnVsbDtyZXR1cm4gZS5nZXRJbihbInNjaGVtZSIsdCxuXSl8fGUuZ2V0SW4oWyJzY2hlbWUiLCJfZGVmYXVsdFNjaGVtZSJdKXx8b3x8IiJ9LFBlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtyZXR1cm4gZCgpKHI9WyJodHRwIiwiaHR0cHMiXSkuY2FsbChyLEllKGUsdCxuKSk+LTF9LE5lPWZ1bmN0aW9uKGUsdCl7dmFyIG47dD10fHxbXTt2YXIgcj1lLmdldEluKHUoKShuPVsibWV0YSIsInBhdGhzIl0pLmNhbGwobixpKCkodCksWyJwYXJhbWV0ZXJzIl0pLE9iamVjdChJLmZyb21KUykoW10pKSxvPSEwO3JldHVybiBmKCkocikuY2FsbChyLChmdW5jdGlvbihlKXt2YXIgdD1lLmdldCgiZXJyb3JzIik7dCYmdC5jb3VudCgpJiYobz0hMSl9KSksb30sTWU9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLG89e3JlcXVlc3RCb2R5OiExLHJlcXVlc3RDb250ZW50VHlwZTp7fX0sYT1lLmdldEluKHUoKShuPVsicmVzb2x2ZWRTdWJ0cmVlcyIsInBhdGhzIl0pLmNhbGwobixpKCkodCksWyJyZXF1ZXN0Qm9keSJdKSxPYmplY3QoSS5mcm9tSlMpKFtdKSk7cmV0dXJuIGEuc2l6ZTwxfHwoYS5nZXRJbihbInJlcXVpcmVkIl0pJiYoby5yZXF1ZXN0Qm9keT1hLmdldEluKFsicmVxdWlyZWQiXSkpLGYoKShyPWEuZ2V0SW4oWyJjb250ZW50Il0pLmVudHJ5U2VxKCkpLmNhbGwociwoZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXTtpZihlWzFdLmdldEluKFsic2NoZW1hIiwicmVxdWlyZWQiXSkpe3ZhciBuPWVbMV0uZ2V0SW4oWyJzY2hlbWEiLCJyZXF1aXJlZCJdKS50b0pTKCk7by5yZXF1ZXN0Q29udGVudFR5cGVbdF09bn19KSkpLG99LFJlPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvO2lmKChufHxyKSYmbj09PXIpcmV0dXJuITA7dmFyIGE9ZS5nZXRJbih1KCkobz1bInJlc29sdmVkU3VidHJlZXMiLCJwYXRocyJdKS5jYWxsKG8saSgpKHQpLFsicmVxdWVzdEJvZHkiLCJjb250ZW50Il0pLE9iamVjdChJLmZyb21KUykoW10pKTtpZihhLnNpemU8Mnx8IW58fCFyKXJldHVybiExO3ZhciBzPWEuZ2V0SW4oW24sInNjaGVtYSIsInByb3BlcnRpZXMiXSxPYmplY3QoSS5mcm9tSlMpKFtdKSksYz1hLmdldEluKFtyLCJzY2hlbWEiLCJwcm9wZXJ0aWVzIl0sT2JqZWN0KEkuZnJvbUpTKShbXSkpO3JldHVybiEhcy5lcXVhbHMoYyl9O2Z1bmN0aW9uIERlKGUpe3JldHVybiBJLk1hcC5pc01hcChlKT9lOm5ldyBJLk1hcH19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7KGZ1bmN0aW9uKHQpe3ZhciByPW4oODg5KSxvPW4oODkwKSxhPS9eW0EtWmEtel1bQS1aYS16MC05Ky0uXSo6XC9cLy8saT0vXihbYS16XVthLXowLTkuKy1dKjopPyhcL1wvKT8oW1xcL10rKT8oW1xTXHNdKikvaSxzPW5ldyBSZWdFeHAoIl5bXFx4MDlcXHgwQVxceDBCXFx4MENcXHgwRFxceDIwXFx4QTBcXHUxNjgwXFx1MTgwRVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBBXFx1MjAyRlxcdTIwNUZcXHUzMDAwXFx1MjAyOFxcdTIwMjlcXHVGRUZGXSsiKTtmdW5jdGlvbiB1KGUpe3JldHVybihlfHwiIikudG9TdHJpbmcoKS5yZXBsYWNlKHMsIiIpfXZhciBjPVtbIiMiLCJoYXNoIl0sWyI/IiwicXVlcnkiXSxmdW5jdGlvbihlLHQpe3JldHVybiBmKHQucHJvdG9jb2wpP2UucmVwbGFjZSgvXFwvZywiLyIpOmV9LFsiLyIsInBhdGhuYW1lIl0sWyJAIiwiYXV0aCIsMV0sW05hTiwiaG9zdCIsdm9pZCAwLDEsMV0sWy86KFxkKykkLywicG9ydCIsdm9pZCAwLDFdLFtOYU4sImhvc3RuYW1lIix2b2lkIDAsMSwxXV0sbD17aGFzaDoxLHF1ZXJ5OjF9O2Z1bmN0aW9uIHAoZSl7dmFyIG4scj0oInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnZvaWQgMCE9PXQ/dDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp7fSkubG9jYXRpb258fHt9LG89e30saT10eXBlb2YoZT1lfHxyKTtpZigiYmxvYjoiPT09ZS5wcm90b2NvbClvPW5ldyBkKHVuZXNjYXBlKGUucGF0aG5hbWUpLHt9KTtlbHNlIGlmKCJzdHJpbmciPT09aSlmb3IobiBpbiBvPW5ldyBkKGUse30pLGwpZGVsZXRlIG9bbl07ZWxzZSBpZigib2JqZWN0Ij09PWkpe2ZvcihuIGluIGUpbiBpbiBsfHwob1tuXT1lW25dKTt2b2lkIDA9PT1vLnNsYXNoZXMmJihvLnNsYXNoZXM9YS50ZXN0KGUuaHJlZikpfXJldHVybiBvfWZ1bmN0aW9uIGYoZSl7cmV0dXJuImZpbGU6Ij09PWV8fCJmdHA6Ij09PWV8fCJodHRwOiI9PT1lfHwiaHR0cHM6Ij09PWV8fCJ3czoiPT09ZXx8IndzczoiPT09ZX1mdW5jdGlvbiBoKGUsdCl7ZT11KGUpLHQ9dHx8e307dmFyIG4scj1pLmV4ZWMoZSksbz1yWzFdP3JbMV0udG9Mb3dlckNhc2UoKToiIixhPSEhclsyXSxzPSEhclszXSxjPTA7cmV0dXJuIGE/cz8obj1yWzJdK3JbM10rcls0XSxjPXJbMl0ubGVuZ3RoK3JbM10ubGVuZ3RoKToobj1yWzJdK3JbNF0sYz1yWzJdLmxlbmd0aCk6cz8obj1yWzNdK3JbNF0sYz1yWzNdLmxlbmd0aCk6bj1yWzRdLCJmaWxlOiI9PT1vP2M+PTImJihuPW4uc2xpY2UoMikpOmYobyk/bj1yWzRdOm8/YSYmKG49bi5zbGljZSgyKSk6Yz49MiYmZih0LnByb3RvY29sKSYmKG49cls0XSkse3Byb3RvY29sOm8sc2xhc2hlczphfHxmKG8pLHNsYXNoZXNDb3VudDpjLHJlc3Q6bn19ZnVuY3Rpb24gZChlLHQsbil7aWYoZT11KGUpLCEodGhpcyBpbnN0YW5jZW9mIGQpKXJldHVybiBuZXcgZChlLHQsbik7dmFyIGEsaSxzLGwsbSx2LGc9Yy5zbGljZSgpLHk9dHlwZW9mIHQsYj10aGlzLF89MDtmb3IoIm9iamVjdCIhPT15JiYic3RyaW5nIiE9PXkmJihuPXQsdD1udWxsKSxuJiYiZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49by5wYXJzZSksYT0hKGk9aChlfHwiIix0PXAodCkpKS5wcm90b2NvbCYmIWkuc2xhc2hlcyxiLnNsYXNoZXM9aS5zbGFzaGVzfHxhJiZ0LnNsYXNoZXMsYi5wcm90b2NvbD1pLnByb3RvY29sfHx0LnByb3RvY29sfHwiIixlPWkucmVzdCwoImZpbGU6Ij09PWIucHJvdG9jb2x8fCFpLnNsYXNoZXMmJihpLnByb3RvY29sfHxpLnNsYXNoZXNDb3VudDwyfHwhZihiLnByb3RvY29sKSkpJiYoZ1szXT1bLyguKikvLCJwYXRobmFtZSJdKTtfPGcubGVuZ3RoO18rKykiZnVuY3Rpb24iIT10eXBlb2YobD1nW19dKT8ocz1sWzBdLHY9bFsxXSxzIT1zP2Jbdl09ZToic3RyaW5nIj09dHlwZW9mIHM/fihtPWUuaW5kZXhPZihzKSkmJigibnVtYmVyIj09dHlwZW9mIGxbMl0/KGJbdl09ZS5zbGljZSgwLG0pLGU9ZS5zbGljZShtK2xbMl0pKTooYlt2XT1lLnNsaWNlKG0pLGU9ZS5zbGljZSgwLG0pKSk6KG09cy5leGVjKGUpKSYmKGJbdl09bVsxXSxlPWUuc2xpY2UoMCxtLmluZGV4KSksYlt2XT1iW3ZdfHxhJiZsWzNdJiZ0W3ZdfHwiIixsWzRdJiYoYlt2XT1iW3ZdLnRvTG93ZXJDYXNlKCkpKTplPWwoZSxiKTtuJiYoYi5xdWVyeT1uKGIucXVlcnkpKSxhJiZ0LnNsYXNoZXMmJiIvIiE9PWIucGF0aG5hbWUuY2hhckF0KDApJiYoIiIhPT1iLnBhdGhuYW1lfHwiIiE9PXQucGF0aG5hbWUpJiYoYi5wYXRobmFtZT1mdW5jdGlvbihlLHQpe2lmKCIiPT09ZSlyZXR1cm4gdDtmb3IodmFyIG49KHR8fCIvIikuc3BsaXQoIi8iKS5zbGljZSgwLC0xKS5jb25jYXQoZS5zcGxpdCgiLyIpKSxyPW4ubGVuZ3RoLG89bltyLTFdLGE9ITEsaT0wO3ItLTspIi4iPT09bltyXT9uLnNwbGljZShyLDEpOiIuLiI9PT1uW3JdPyhuLnNwbGljZShyLDEpLGkrKyk6aSYmKDA9PT1yJiYoYT0hMCksbi5zcGxpY2UociwxKSxpLS0pO3JldHVybiBhJiZuLnVuc2hpZnQoIiIpLCIuIiE9PW8mJiIuLiIhPT1vfHxuLnB1c2goIiIpLG4uam9pbigiLyIpfShiLnBhdGhuYW1lLHQucGF0aG5hbWUpKSwiLyIhPT1iLnBhdGhuYW1lLmNoYXJBdCgwKSYmZihiLnByb3RvY29sKSYmKGIucGF0aG5hbWU9Ii8iK2IucGF0aG5hbWUpLHIoYi5wb3J0LGIucHJvdG9jb2wpfHwoYi5ob3N0PWIuaG9zdG5hbWUsYi5wb3J0PSIiKSxiLnVzZXJuYW1lPWIucGFzc3dvcmQ9IiIsYi5hdXRoJiYobD1iLmF1dGguc3BsaXQoIjoiKSxiLnVzZXJuYW1lPWxbMF18fCIiLGIucGFzc3dvcmQ9bFsxXXx8IiIpLGIub3JpZ2luPSJmaWxlOiIhPT1iLnByb3RvY29sJiZmKGIucHJvdG9jb2wpJiZiLmhvc3Q/Yi5wcm90b2NvbCsiLy8iK2IuaG9zdDoibnVsbCIsYi5ocmVmPWIudG9TdHJpbmcoKX1kLnByb3RvdHlwZT17c2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgYT10aGlzO3N3aXRjaChlKXtjYXNlInF1ZXJ5Ijoic3RyaW5nIj09dHlwZW9mIHQmJnQubGVuZ3RoJiYodD0obnx8by5wYXJzZSkodCkpLGFbZV09dDticmVhaztjYXNlInBvcnQiOmFbZV09dCxyKHQsYS5wcm90b2NvbCk/dCYmKGEuaG9zdD1hLmhvc3RuYW1lKyI6Iit0KTooYS5ob3N0PWEuaG9zdG5hbWUsYVtlXT0iIik7YnJlYWs7Y2FzZSJob3N0bmFtZSI6YVtlXT10LGEucG9ydCYmKHQrPSI6IithLnBvcnQpLGEuaG9zdD10O2JyZWFrO2Nhc2UiaG9zdCI6YVtlXT10LC86XGQrJC8udGVzdCh0KT8odD10LnNwbGl0KCI6IiksYS5wb3J0PXQucG9wKCksYS5ob3N0bmFtZT10LmpvaW4oIjoiKSk6KGEuaG9zdG5hbWU9dCxhLnBvcnQ9IiIpO2JyZWFrO2Nhc2UicHJvdG9jb2wiOmEucHJvdG9jb2w9dC50b0xvd2VyQ2FzZSgpLGEuc2xhc2hlcz0hbjticmVhaztjYXNlInBhdGhuYW1lIjpjYXNlImhhc2giOmlmKHQpe3ZhciBpPSJwYXRobmFtZSI9PT1lPyIvIjoiIyI7YVtlXT10LmNoYXJBdCgwKSE9PWk/aSt0OnR9ZWxzZSBhW2VdPXQ7YnJlYWs7ZGVmYXVsdDphW2VdPXR9Zm9yKHZhciBzPTA7czxjLmxlbmd0aDtzKyspe3ZhciB1PWNbc107dVs0XSYmKGFbdVsxXV09YVt1WzFdXS50b0xvd2VyQ2FzZSgpKX1yZXR1cm4gYS5vcmlnaW49ImZpbGU6IiE9PWEucHJvdG9jb2wmJmYoYS5wcm90b2NvbCkmJmEuaG9zdD9hLnByb3RvY29sKyIvLyIrYS5ob3N0OiJudWxsIixhLmhyZWY9YS50b1N0cmluZygpLGF9LHRvU3RyaW5nOmZ1bmN0aW9uKGUpe2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBlfHwoZT1vLnN0cmluZ2lmeSk7dmFyIHQsbj10aGlzLHI9bi5wcm90b2NvbDtyJiYiOiIhPT1yLmNoYXJBdChyLmxlbmd0aC0xKSYmKHIrPSI6Iik7dmFyIGE9cisobi5zbGFzaGVzfHxmKG4ucHJvdG9jb2wpPyIvLyI6IiIpO3JldHVybiBuLnVzZXJuYW1lJiYoYSs9bi51c2VybmFtZSxuLnBhc3N3b3JkJiYoYSs9IjoiK24ucGFzc3dvcmQpLGErPSJAIiksYSs9bi5ob3N0K24ucGF0aG5hbWUsKHQ9Im9iamVjdCI9PXR5cGVvZiBuLnF1ZXJ5P2Uobi5xdWVyeSk6bi5xdWVyeSkmJihhKz0iPyIhPT10LmNoYXJBdCgwKT8iPyIrdDp0KSxuLmhhc2gmJihhKz1uLmhhc2gpLGF9fSxkLmV4dHJhY3RQcm90b2NvbD1oLGQubG9jYXRpb249cCxkLnRyaW1MZWZ0PXUsZC5xcz1vLGUuZXhwb3J0cz1kfSkuY2FsbCh0aGlzLG4oNTEpKX0sZnVuY3Rpb24oZSx0LG4pe2UuZXhwb3J0cz1uKDEwODApfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24uZCh0LCJiIiwoZnVuY3Rpb24oKXtyZXR1cm4gZWV9KSksbi5kKHQsImEiLChmdW5jdGlvbigpe3JldHVybiBEfSkpO3ZhciByPW4oMTUpLG89bi5uKHIpLGE9bigzMSksaT1uLm4oYSkscz1uKDUxNSksdT1uLm4ocyksYz1uKDUxNiksbD1uLm4oYykscD1uKDg0KSxmPW4ubihwKSxoPW4oMCksZD1uLm4oaCksbT1uKDUxNyksdj1uLm4obSk7dmFyIGc9e307ZnVuY3Rpb24geShlKXtpZigwPT09ZS5sZW5ndGh8fDE9PT1lLmxlbmd0aClyZXR1cm4gZTt2YXIgdCxuLHI9ZS5qb2luKCIuIik7cmV0dXJuIGdbcl18fChnW3JdPTA9PT0obj0odD1lKS5sZW5ndGgpfHwxPT09bj90OjI9PT1uP1t0WzBdLHRbMV0sIiIuY29uY2F0KHRbMF0sIi4iKS5jb25jYXQodFsxXSksIiIuY29uY2F0KHRbMV0sIi4iKS5jb25jYXQodFswXSldOjM9PT1uP1t0WzBdLHRbMV0sdFsyXSwiIi5jb25jYXQodFswXSwiLiIpLmNvbmNhdCh0WzFdKSwiIi5jb25jYXQodFswXSwiLiIpLmNvbmNhdCh0WzJdKSwiIi5jb25jYXQodFsxXSwiLiIpLmNvbmNhdCh0WzBdKSwiIi5jb25jYXQodFsxXSwiLiIpLmNvbmNhdCh0WzJdKSwiIi5jb25jYXQodFsyXSwiLiIpLmNvbmNhdCh0WzBdKSwiIi5jb25jYXQodFsyXSwiLiIpLmNvbmNhdCh0WzFdKSwiIi5jb25jYXQodFswXSwiLiIpLmNvbmNhdCh0WzFdLCIuIikuY29uY2F0KHRbMl0pLCIiLmNvbmNhdCh0WzBdLCIuIikuY29uY2F0KHRbMl0sIi4iKS5jb25jYXQodFsxXSksIiIuY29uY2F0KHRbMV0sIi4iKS5jb25jYXQodFswXSwiLiIpLmNvbmNhdCh0WzJdKSwiIi5jb25jYXQodFsxXSwiLiIpLmNvbmNhdCh0WzJdLCIuIikuY29uY2F0KHRbMF0pLCIiLmNvbmNhdCh0WzJdLCIuIikuY29uY2F0KHRbMF0sIi4iKS5jb25jYXQodFsxXSksIiIuY29uY2F0KHRbMl0sIi4iKS5jb25jYXQodFsxXSwiLiIpLmNvbmNhdCh0WzBdKV06bj49ND9bdFswXSx0WzFdLHRbMl0sdFszXSwiIi5jb25jYXQodFswXSwiLiIpLmNvbmNhdCh0WzFdKSwiIi5jb25jYXQodFswXSwiLiIpLmNvbmNhdCh0WzJdKSwiIi5jb25jYXQodFswXSwiLiIpLmNvbmNhdCh0WzNdKSwiIi5jb25jYXQodFsxXSwiLiIpLmNvbmNhdCh0WzBdKSwiIi5jb25jYXQodFsxXSwiLiIpLmNvbmNhdCh0WzJdKSwiIi5jb25jYXQodFsxXSwiLiIpLmNvbmNhdCh0WzNdKSwiIi5jb25jYXQodFsyXSwiLiIpLmNvbmNhdCh0WzBdKSwiIi5jb25jYXQodFsyXSwiLiIpLmNvbmNhdCh0WzFdKSwiIi5jb25jYXQodFsyXSwiLiIpLmNvbmNhdCh0WzNdKSwiIi5jb25jYXQodFszXSwiLiIpLmNvbmNhdCh0WzBdKSwiIi5jb25jYXQodFszXSwiLiIpLmNvbmNhdCh0WzFdKSwiIi5jb25jYXQodFszXSwiLiIpLmNvbmNhdCh0WzJdKSwiIi5jb25jYXQodFswXSwiLiIpLmNvbmNhdCh0WzFdLCIuIikuY29uY2F0KHRbMl0pLCIiLmNvbmNhdCh0WzBdLCIuIikuY29uY2F0KHRbMV0sIi4iKS5jb25jYXQodFszXSksIiIuY29uY2F0KHRbMF0sIi4iKS5jb25jYXQodFsyXSwiLiIpLmNvbmNhdCh0WzFdKSwiIi5jb25jYXQodFswXSwiLiIpLmNvbmNhdCh0WzJdLCIuIikuY29uY2F0KHRbM10pLCIiLmNvbmNhdCh0WzBdLCIuIikuY29uY2F0KHRbM10sIi4iKS5jb25jYXQodFsxXSksIiIuY29uY2F0KHRbMF0sIi4iKS5jb25jYXQodFszXSwiLiIpLmNvbmNhdCh0WzJdKSwiIi5jb25jYXQodFsxXSwiLiIpLmNvbmNhdCh0WzBdLCIuIikuY29uY2F0KHRbMl0pLCIiLmNvbmNhdCh0WzFdLCIuIikuY29uY2F0KHRbMF0sIi4iKS5jb25jYXQodFszXSksIiIuY29uY2F0KHRbMV0sIi4iKS5jb25jYXQodFsyXSwiLiIpLmNvbmNhdCh0WzBdKSwiIi5jb25jYXQodFsxXSwiLiIpLmNvbmNhdCh0WzJdLCIuIikuY29uY2F0KHRbM10pLCIiLmNvbmNhdCh0WzFdLCIuIikuY29uY2F0KHRbM10sIi4iKS5jb25jYXQodFswXSksIiIuY29uY2F0KHRbMV0sIi4iKS5jb25jYXQodFszXSwiLiIpLmNvbmNhdCh0WzJdKSwiIi5jb25jYXQodFsyXSwiLiIpLmNvbmNhdCh0WzBdLCIuIikuY29uY2F0KHRbMV0pLCIiLmNvbmNhdCh0WzJdLCIuIikuY29uY2F0KHRbMF0sIi4iKS5jb25jYXQodFszXSksIiIuY29uY2F0KHRbMl0sIi4iKS5jb25jYXQodFsxXSwiLiIpLmNvbmNhdCh0WzBdKSwiIi5jb25jYXQodFsyXSwiLiIpLmNvbmNhdCh0WzFdLCIuIikuY29uY2F0KHRbM10pLCIiLmNvbmNhdCh0WzJdLCIuIikuY29uY2F0KHRbM10sIi4iKS5jb25jYXQodFswXSksIiIuY29uY2F0KHRbMl0sIi4iKS5jb25jYXQodFszXSwiLiIpLmNvbmNhdCh0WzFdKSwiIi5jb25jYXQodFszXSwiLiIpLmNvbmNhdCh0WzBdLCIuIikuY29uY2F0KHRbMV0pLCIiLmNvbmNhdCh0WzNdLCIuIikuY29uY2F0KHRbMF0sIi4iKS5jb25jYXQodFsyXSksIiIuY29uY2F0KHRbM10sIi4iKS5jb25jYXQodFsxXSwiLiIpLmNvbmNhdCh0WzBdKSwiIi5jb25jYXQodFszXSwiLiIpLmNvbmNhdCh0WzFdLCIuIikuY29uY2F0KHRbMl0pLCIiLmNvbmNhdCh0WzNdLCIuIikuY29uY2F0KHRbMl0sIi4iKS5jb25jYXQodFswXSksIiIuY29uY2F0KHRbM10sIi4iKS5jb25jYXQodFsyXSwiLiIpLmNvbmNhdCh0WzFdKSwiIi5jb25jYXQodFswXSwiLiIpLmNvbmNhdCh0WzFdLCIuIikuY29uY2F0KHRbMl0sIi4iKS5jb25jYXQodFszXSksIiIuY29uY2F0KHRbMF0sIi4iKS5jb25jYXQodFsxXSwiLiIpLmNvbmNhdCh0WzNdLCIuIikuY29uY2F0KHRbMl0pLCIiLmNvbmNhdCh0WzBdLCIuIikuY29uY2F0KHRbMl0sIi4iKS5jb25jYXQodFsxXSwiLiIpLmNvbmNhdCh0WzNdKSwiIi5jb25jYXQodFswXSwiLiIpLmNvbmNhdCh0WzJdLCIuIikuY29uY2F0KHRbM10sIi4iKS5jb25jYXQodFsxXSksIiIuY29uY2F0KHRbMF0sIi4iKS5jb25jYXQodFszXSwiLiIpLmNvbmNhdCh0WzFdLCIuIikuY29uY2F0KHRbMl0pLCIiLmNvbmNhdCh0WzBdLCIuIikuY29uY2F0KHRbM10sIi4iKS5jb25jYXQodFsyXSwiLiIpLmNvbmNhdCh0WzFdKSwiIi5jb25jYXQodFsxXSwiLiIpLmNvbmNhdCh0WzBdLCIuIikuY29uY2F0KHRbMl0sIi4iKS5jb25jYXQodFszXSksIiIuY29uY2F0KHRbMV0sIi4iKS5jb25jYXQodFswXSwiLiIpLmNvbmNhdCh0WzNdLCIuIikuY29uY2F0KHRbMl0pLCIiLmNvbmNhdCh0WzFdLCIuIikuY29uY2F0KHRbMl0sIi4iKS5jb25jYXQodFswXSwiLiIpLmNvbmNhdCh0WzNdKSwiIi5jb25jYXQodFsxXSwiLiIpLmNvbmNhdCh0WzJdLCIuIikuY29uY2F0KHRbM10sIi4iKS5jb25jYXQodFswXSksIiIuY29uY2F0KHRbMV0sIi4iKS5jb25jYXQodFszXSwiLiIpLmNvbmNhdCh0WzBdLCIuIikuY29uY2F0KHRbMl0pLCIiLmNvbmNhdCh0WzFdLCIuIikuY29uY2F0KHRbM10sIi4iKS5jb25jYXQodFsyXSwiLiIpLmNvbmNhdCh0WzBdKSwiIi5jb25jYXQodFsyXSwiLiIpLmNvbmNhdCh0WzBdLCIuIikuY29uY2F0KHRbMV0sIi4iKS5jb25jYXQodFszXSksIiIuY29uY2F0KHRbMl0sIi4iKS5jb25jYXQodFswXSwiLiIpLmNvbmNhdCh0WzNdLCIuIikuY29uY2F0KHRbMV0pLCIiLmNvbmNhdCh0WzJdLCIuIikuY29uY2F0KHRbMV0sIi4iKS5jb25jYXQodFswXSwiLiIpLmNvbmNhdCh0WzNdKSwiIi5jb25jYXQodFsyXSwiLiIpLmNvbmNhdCh0WzFdLCIuIikuY29uY2F0KHRbM10sIi4iKS5jb25jYXQodFswXSksIiIuY29uY2F0KHRbMl0sIi4iKS5jb25jYXQodFszXSwiLiIpLmNvbmNhdCh0WzBdLCIuIikuY29uY2F0KHRbMV0pLCIiLmNvbmNhdCh0WzJdLCIuIikuY29uY2F0KHRbM10sIi4iKS5jb25jYXQodFsxXSwiLiIpLmNvbmNhdCh0WzBdKSwiIi5jb25jYXQodFszXSwiLiIpLmNvbmNhdCh0WzBdLCIuIikuY29uY2F0KHRbMV0sIi4iKS5jb25jYXQodFsyXSksIiIuY29uY2F0KHRbM10sIi4iKS5jb25jYXQodFswXSwiLiIpLmNvbmNhdCh0WzJdLCIuIikuY29uY2F0KHRbMV0pLCIiLmNvbmNhdCh0WzNdLCIuIikuY29uY2F0KHRbMV0sIi4iKS5jb25jYXQodFswXSwiLiIpLmNvbmNhdCh0WzJdKSwiIi5jb25jYXQodFszXSwiLiIpLmNvbmNhdCh0WzFdLCIuIikuY29uY2F0KHRbMl0sIi4iKS5jb25jYXQodFswXSksIiIuY29uY2F0KHRbM10sIi4iKS5jb25jYXQodFsyXSwiLiIpLmNvbmNhdCh0WzBdLCIuIikuY29uY2F0KHRbMV0pLCIiLmNvbmNhdCh0WzNdLCIuIikuY29uY2F0KHRbMl0sIi4iKS5jb25jYXQodFsxXSwiLiIpLmNvbmNhdCh0WzBdKV06dm9pZCAwKSxnW3JdfWZ1bmN0aW9uIGIoZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9LG49YXJndW1lbnRzLmxlbmd0aD4yP2FyZ3VtZW50c1syXTp2b2lkIDAscj1lLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuInRva2VuIiE9PWV9KSksbz15KHIpO3JldHVybiBvLnJlZHVjZSgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZigpKHt9LGUsblt0XSl9KSx0KX1mdW5jdGlvbiBfKGUpe3JldHVybiBlLmpvaW4oIiAiKX1mdW5jdGlvbiB3KGUpe3ZhciB0PWUubm9kZSxuPWUuc3R5bGVzaGVldCxyPWUuc3R5bGUsbz12b2lkIDA9PT1yP3t9OnIsYT1lLnVzZUlubGluZVN0eWxlcyxpPWUua2V5LHM9dC5wcm9wZXJ0aWVzLHU9dC50eXBlLGM9dC50YWdOYW1lLGw9dC52YWx1ZTtpZigidGV4dCI9PT11KXJldHVybiBsO2lmKGMpe3ZhciBwLGg9ZnVuY3Rpb24oZSx0KXt2YXIgbj0wO3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gbis9MSxyLm1hcCgoZnVuY3Rpb24ocixvKXtyZXR1cm4gdyh7bm9kZTpyLHN0eWxlc2hlZXQ6ZSx1c2VJbmxpbmVTdHlsZXM6dCxrZXk6ImNvZGUtc2VnbWVudC0iLmNvbmNhdChuLCItIikuY29uY2F0KG8pfSl9KSl9fShuLGEpO2lmKGEpe3ZhciBtPU9iamVjdC5rZXlzKG4pLnJlZHVjZSgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5zcGxpdCgiLiIpLmZvckVhY2goKGZ1bmN0aW9uKHQpe2UuaW5jbHVkZXModCl8fGUucHVzaCh0KX0pKSxlfSksW10pLGc9cy5jbGFzc05hbWUmJnMuY2xhc3NOYW1lLmluY2x1ZGVzKCJ0b2tlbiIpP1sidG9rZW4iXTpbXSx5PXMuY2xhc3NOYW1lJiZnLmNvbmNhdChzLmNsYXNzTmFtZS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiFtLmluY2x1ZGVzKGUpfSkpKTtwPWYoKSh7fSxzLHtjbGFzc05hbWU6Xyh5KXx8dm9pZCAwLHN0eWxlOmIocy5jbGFzc05hbWUsT2JqZWN0LmFzc2lnbih7fSxzLnN0eWxlLG8pLG4pfSl9ZWxzZSBwPWYoKSh7fSxzLHtjbGFzc05hbWU6XyhzLmNsYXNzTmFtZSl9KTt2YXIgeD1oKHQuY2hpbGRyZW4pO3JldHVybiBkLmEuY3JlYXRlRWxlbWVudChjLHYoKSh7a2V5Oml9LHApLHgpfX12YXIgeD0vXG4vZztmdW5jdGlvbiBFKGUpe3ZhciB0PWUuY29kZVN0cmluZyxuPWUuY29kZVN0eWxlLHI9ZS5jb250YWluZXJTdHlsZSxvPXZvaWQgMD09PXI/e2Zsb2F0OiJsZWZ0IixwYWRkaW5nUmlnaHQ6IjEwcHgifTpyLGE9ZS5udW1iZXJTdHlsZSxpPXZvaWQgMD09PWE/e306YSxzPWUuc3RhcnRpbmdMaW5lTnVtYmVyO3JldHVybiBkLmEuY3JlYXRlRWxlbWVudCgiY29kZSIse3N0eWxlOk9iamVjdC5hc3NpZ24oe30sbixvKX0sZnVuY3Rpb24oZSl7dmFyIHQ9ZS5saW5lcyxuPWUuc3RhcnRpbmdMaW5lTnVtYmVyLHI9ZS5zdHlsZTtyZXR1cm4gdC5tYXAoKGZ1bmN0aW9uKGUsdCl7dmFyIG89dCtuO3JldHVybiBkLmEuY3JlYXRlRWxlbWVudCgic3BhbiIse2tleToibGluZS0iLmNvbmNhdCh0KSxjbGFzc05hbWU6InJlYWN0LXN5bnRheC1oaWdobGlnaHRlci1saW5lLW51bWJlciIsc3R5bGU6ImZ1bmN0aW9uIj09dHlwZW9mIHI/cihvKTpyfSwiIi5jb25jYXQobywiXG4iKSl9KSl9KHtsaW5lczp0LnJlcGxhY2UoL1xuJC8sIiIpLnNwbGl0KCJcbiIpLHN0eWxlOmksc3RhcnRpbmdMaW5lTnVtYmVyOnN9KSl9ZnVuY3Rpb24gUyhlLHQpe3JldHVybnt0eXBlOiJlbGVtZW50Iix0YWdOYW1lOiJzcGFuIixwcm9wZXJ0aWVzOntrZXk6ImxpbmUtbnVtYmVyLS0iLmNvbmNhdChlKSxjbGFzc05hbWU6WyJjb21tZW50IiwibGluZW51bWJlciIsInJlYWN0LXN5bnRheC1oaWdobGlnaHRlci1saW5lLW51bWJlciJdLHN0eWxlOnR9LGNoaWxkcmVuOlt7dHlwZToidGV4dCIsdmFsdWU6ZX1dfX1mdW5jdGlvbiBDKGUsdCxuKXt2YXIgcixvPXtkaXNwbGF5OiJpbmxpbmUtYmxvY2siLG1pbldpZHRoOihyPW4sIiIuY29uY2F0KHIudG9TdHJpbmcoKS5sZW5ndGgsIi4yNWVtIikpLHBhZGRpbmdSaWdodDoiMWVtIix0ZXh0QWxpZ246InJpZ2h0Iix1c2VyU2VsZWN0OiJub25lIn0sYT0iZnVuY3Rpb24iPT10eXBlb2YgZT9lKHQpOmU7cmV0dXJuIGYoKSh7fSxvLGEpfWZ1bmN0aW9uIEEoZSl7dmFyIHQ9ZS5jaGlsZHJlbixuPWUubGluZU51bWJlcixyPWUubGluZU51bWJlclN0eWxlLG89ZS5sYXJnZXN0TGluZU51bWJlcixhPWUuc2hvd0lubGluZUxpbmVOdW1iZXJzLGk9ZS5saW5lUHJvcHMscz12b2lkIDA9PT1pP3t9OmksdT1lLmNsYXNzTmFtZSxjPXZvaWQgMD09PXU/W106dSxsPWUuc2hvd0xpbmVOdW1iZXJzLHA9ZS53cmFwTG9uZ0xpbmVzLGg9ImZ1bmN0aW9uIj09dHlwZW9mIHM/cyhuKTpzO2lmKGguY2xhc3NOYW1lPWMsbiYmYSl7dmFyIGQ9QyhyLG4sbyk7dC51bnNoaWZ0KFMobixkKSl9cmV0dXJuIHAmbCYmKGguc3R5bGU9ZigpKHt9LGguc3R5bGUse2Rpc3BsYXk6ImZsZXgifSkpLHt0eXBlOiJlbGVtZW50Iix0YWdOYW1lOiJzcGFuIixwcm9wZXJ0aWVzOmgsY2hpbGRyZW46dH19ZnVuY3Rpb24gTyhlKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOltdLG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOltdLHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIG89ZVtyXTtpZigidGV4dCI9PT1vLnR5cGUpbi5wdXNoKEEoe2NoaWxkcmVuOltvXSxjbGFzc05hbWU6bCgpKG5ldyBTZXQodCkpfSkpO2Vsc2UgaWYoby5jaGlsZHJlbil7dmFyIGE9dC5jb25jYXQoby5wcm9wZXJ0aWVzLmNsYXNzTmFtZSk7bj1uLmNvbmNhdChPKG8uY2hpbGRyZW4sYSkpfX1yZXR1cm4gbn1mdW5jdGlvbiBrKGUsdCxuLHIsbyxhLGkscyx1KXt2YXIgYyxsPU8oZS52YWx1ZSkscD1bXSxmPS0xLGg9MDtmdW5jdGlvbiBkKGUsdCl7dmFyIGE9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOltdO3JldHVybiBBKHtjaGlsZHJlbjplLGxpbmVOdW1iZXI6dCxsaW5lTnVtYmVyU3R5bGU6cyxsYXJnZXN0TGluZU51bWJlcjppLHNob3dJbmxpbmVMaW5lTnVtYmVyczpvLGxpbmVQcm9wczpuLGNsYXNzTmFtZTphLHNob3dMaW5lTnVtYmVyczpyLHdyYXBMb25nTGluZXM6dX0pfWZ1bmN0aW9uIG0oZSx0KXtpZihyJiZ0JiZvKXt2YXIgbj1DKHMsdCxpKTtlLnVuc2hpZnQoUyh0LG4pKX1yZXR1cm4gZX1mdW5jdGlvbiB2KGUsbil7dmFyIHI9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOltdO3JldHVybiB0fHxyLmxlbmd0aD4wP2QoZSxuLHIpOm0oZSxuKX1mb3IodmFyIGc9ZnVuY3Rpb24oKXt2YXIgZT1sW2hdLHQ9ZS5jaGlsZHJlblswXS52YWx1ZTtpZih0Lm1hdGNoKHgpKXt2YXIgbj10LnNwbGl0KCJcbiIpO24uZm9yRWFjaCgoZnVuY3Rpb24odCxvKXt2YXIgaT1yJiZwLmxlbmd0aCthLHM9e3R5cGU6InRleHQiLHZhbHVlOiIiLmNvbmNhdCh0LCJcbiIpfTtpZigwPT09byl7dmFyIHU9dihsLnNsaWNlKGYrMSxoKS5jb25jYXQoQSh7Y2hpbGRyZW46W3NdLGNsYXNzTmFtZTplLnByb3BlcnRpZXMuY2xhc3NOYW1lfSkpLGkpO3AucHVzaCh1KX1lbHNlIGlmKG89PT1uLmxlbmd0aC0xKXtpZihsW2grMV0mJmxbaCsxXS5jaGlsZHJlbiYmbFtoKzFdLmNoaWxkcmVuWzBdKXt2YXIgYz1BKHtjaGlsZHJlbjpbe3R5cGU6InRleHQiLHZhbHVlOiIiLmNvbmNhdCh0KX1dLGNsYXNzTmFtZTplLnByb3BlcnRpZXMuY2xhc3NOYW1lfSk7bC5zcGxpY2UoaCsxLDAsYyl9ZWxzZXt2YXIgZD12KFtzXSxpLGUucHJvcGVydGllcy5jbGFzc05hbWUpO3AucHVzaChkKX19ZWxzZXt2YXIgbT12KFtzXSxpLGUucHJvcGVydGllcy5jbGFzc05hbWUpO3AucHVzaChtKX19KSksZj1ofWgrK307aDxsLmxlbmd0aDspZygpO2lmKGYhPT1sLmxlbmd0aC0xKXt2YXIgeT1sLnNsaWNlKGYrMSxsLmxlbmd0aCk7aWYoeSYmeS5sZW5ndGgpe3ZhciBiPXYoeSxyJiZwLmxlbmd0aCthKTtwLnB1c2goYil9fXJldHVybiB0P3A6KGM9W10pLmNvbmNhdC5hcHBseShjLHApfWZ1bmN0aW9uIGooZSl7dmFyIHQ9ZS5yb3dzLG49ZS5zdHlsZXNoZWV0LHI9ZS51c2VJbmxpbmVTdHlsZXM7cmV0dXJuIHQubWFwKChmdW5jdGlvbihlLHQpe3JldHVybiB3KHtub2RlOmUsc3R5bGVzaGVldDpuLHVzZUlubGluZVN0eWxlczpyLGtleToiY29kZS1zZWdlbWVudCIuY29uY2F0KHQpfSl9KSl9ZnVuY3Rpb24gVChlKXtyZXR1cm4gZSYmdm9pZCAwIT09ZS5oaWdobGlnaHRBdXRvfXZhciBJLFAsTj1uKDM1MiksTT1uLm4oTiksUj0oST1NLmEsUD17fSxmdW5jdGlvbihlKXt2YXIgdD1lLmxhbmd1YWdlLG49ZS5jaGlsZHJlbixyPWUuc3R5bGUsbz12b2lkIDA9PT1yP1A6cixhPWUuY3VzdG9tU3R5bGUsaT12b2lkIDA9PT1hP3t9OmEscz1lLmNvZGVUYWdQcm9wcyxjPXZvaWQgMD09PXM/e2NsYXNzTmFtZTp0PyJsYW5ndWFnZS0iLmNvbmNhdCh0KTp2b2lkIDAsc3R5bGU6ZigpKHt9LG9bJ2NvZGVbY2xhc3MqPSJsYW5ndWFnZS0iXSddLG9bJ2NvZGVbY2xhc3MqPSJsYW5ndWFnZS0nLmNvbmNhdCh0LCciXScpXSl9OnMsbD1lLnVzZUlubGluZVN0eWxlcyxwPXZvaWQgMD09PWx8fGwsaD1lLnNob3dMaW5lTnVtYmVycyxtPXZvaWQgMCE9PWgmJmgsdj1lLnNob3dJbmxpbmVMaW5lTnVtYmVycyxnPXZvaWQgMD09PXZ8fHYseT1lLnN0YXJ0aW5nTGluZU51bWJlcixiPXZvaWQgMD09PXk/MTp5LF89ZS5saW5lTnVtYmVyQ29udGFpbmVyU3R5bGUsdz1lLmxpbmVOdW1iZXJTdHlsZSx4PXZvaWQgMD09PXc/e306dyxTPWUud3JhcExpbmVzLEM9ZS53cmFwTG9uZ0xpbmVzLEE9dm9pZCAwIT09QyYmQyxPPWUubGluZVByb3BzLE49dm9pZCAwPT09Tz97fTpPLE09ZS5yZW5kZXJlcixSPWUuUHJlVGFnLEQ9dm9pZCAwPT09Uj8icHJlIjpSLEw9ZS5Db2RlVGFnLEI9dm9pZCAwPT09TD8iY29kZSI6TCxGPWUuY29kZSxVPXZvaWQgMD09PUY/QXJyYXkuaXNBcnJheShuKT9uWzBdOm46RixxPWUuYXN0R2VuZXJhdG9yLHo9dSgpKGUsWyJsYW5ndWFnZSIsImNoaWxkcmVuIiwic3R5bGUiLCJjdXN0b21TdHlsZSIsImNvZGVUYWdQcm9wcyIsInVzZUlubGluZVN0eWxlcyIsInNob3dMaW5lTnVtYmVycyIsInNob3dJbmxpbmVMaW5lTnVtYmVycyIsInN0YXJ0aW5nTGluZU51bWJlciIsImxpbmVOdW1iZXJDb250YWluZXJTdHlsZSIsImxpbmVOdW1iZXJTdHlsZSIsIndyYXBMaW5lcyIsIndyYXBMb25nTGluZXMiLCJsaW5lUHJvcHMiLCJyZW5kZXJlciIsIlByZVRhZyIsIkNvZGVUYWciLCJjb2RlIiwiYXN0R2VuZXJhdG9yIl0pO3E9cXx8STt2YXIgVj1tP2QuYS5jcmVhdGVFbGVtZW50KEUse2NvbnRhaW5lclN0eWxlOl8sY29kZVN0eWxlOmMuc3R5bGV8fHt9LG51bWJlclN0eWxlOngsc3RhcnRpbmdMaW5lTnVtYmVyOmIsY29kZVN0cmluZzpVfSk6bnVsbCxXPW8uaGxqc3x8b1sncHJlW2NsYXNzKj0ibGFuZ3VhZ2UtIl0nXXx8e2JhY2tncm91bmRDb2xvcjoiI2ZmZiJ9LEg9VChxKT8iaGxqcyI6InByaXNtanMiLCQ9cD9PYmplY3QuYXNzaWduKHt9LHose3N0eWxlOk9iamVjdC5hc3NpZ24oe30sVyxpKX0pOk9iamVjdC5hc3NpZ24oe30seix7Y2xhc3NOYW1lOnouY2xhc3NOYW1lPyIiLmNvbmNhdChILCIgIikuY29uY2F0KHouY2xhc3NOYW1lKTpILHN0eWxlOk9iamVjdC5hc3NpZ24oe30saSl9KTtpZighcSlyZXR1cm4gZC5hLmNyZWF0ZUVsZW1lbnQoRCwkLFYsZC5hLmNyZWF0ZUVsZW1lbnQoQixjLFUpKTsodm9pZCAwPT09UyYmTXx8QSkmJihTPSEwKSxNPU18fGo7dmFyIEo9W3t0eXBlOiJ0ZXh0Iix2YWx1ZTpVfV0sSz1mdW5jdGlvbihlKXt2YXIgdD1lLmFzdEdlbmVyYXRvcixuPWUubGFuZ3VhZ2Uscj1lLmNvZGUsbz1lLmRlZmF1bHRDb2RlVmFsdWU7aWYoVCh0KSl7dmFyIGE9ZnVuY3Rpb24oZSx0KXtyZXR1cm4tMSE9PWUubGlzdExhbmd1YWdlcygpLmluZGV4T2YodCl9KHQsbik7cmV0dXJuInRleHQiPT09bj97dmFsdWU6byxsYW5ndWFnZToidGV4dCJ9OmE/dC5oaWdobGlnaHQobixyKTp0LmhpZ2hsaWdodEF1dG8ocil9dHJ5e3JldHVybiBuJiYidGV4dCIhPT1uP3t2YWx1ZTp0LmhpZ2hsaWdodChyLG4pfTp7dmFsdWU6b319Y2F0Y2goZSl7cmV0dXJue3ZhbHVlOm99fX0oe2FzdEdlbmVyYXRvcjpxLGxhbmd1YWdlOnQsY29kZTpVLGRlZmF1bHRDb2RlVmFsdWU6Sn0pO251bGw9PT1LLmxhbmd1YWdlJiYoSy52YWx1ZT1KKTt2YXIgWT1rKEssUyxOLG0sZyxiLEsudmFsdWUubGVuZ3RoK2IseCxBKTtyZXR1cm4gYy5zdHlsZT1BP2YoKSh7fSxjLnN0eWxlLHt3aGl0ZVNwYWNlOiJwcmUtd3JhcCJ9KTpmKCkoe30sYy5zdHlsZSx7d2hpdGVTcGFjZToicHJlIn0pLGQuYS5jcmVhdGVFbGVtZW50KEQsJCxkLmEuY3JlYXRlRWxlbWVudChCLGMsIWcmJlYsTSh7cm93czpZLHN0eWxlc2hlZXQ6byx1c2VJbmxpbmVTdHlsZXM6cH0pKSl9KTtSLnJlZ2lzdGVyTGFuZ3VhZ2U9TS5hLnJlZ2lzdGVyTGFuZ3VhZ2U7dmFyIEQ9UixMPW4oNTE5KSxCPW4ubihMKS5hLEY9big1MTgpLFU9bi5uKEYpLmEscT1uKDUyMCksej1uLm4ocSkuYSxWPW4oNTIzKSxXPW4ubihWKS5hLEg9big1MjEpLCQ9bi5uKEgpLmEsSj1uKDUyMiksSz1uLm4oSikuYSxZPW4oNTI0KSxHPW4ubihZKS5hLFo9e2hsanM6e2Rpc3BsYXk6ImJsb2NrIixvdmVyZmxvd1g6ImF1dG8iLHBhZGRpbmc6IjAuNWVtIixiYWNrZ3JvdW5kOiIjMzMzIixjb2xvcjoid2hpdGUifSwiaGxqcy1uYW1lIjp7Zm9udFdlaWdodDoiYm9sZCJ9LCJobGpzLXN0cm9uZyI6e2ZvbnRXZWlnaHQ6ImJvbGQifSwiaGxqcy1jb2RlIjp7Zm9udFN0eWxlOiJpdGFsaWMiLGNvbG9yOiIjODg4In0sImhsanMtZW1waGFzaXMiOntmb250U3R5bGU6Iml0YWxpYyJ9LCJobGpzLXRhZyI6e2NvbG9yOiIjNjJjOGYzIn0sImhsanMtdmFyaWFibGUiOntjb2xvcjoiI2FkZTVmYyJ9LCJobGpzLXRlbXBsYXRlLXZhcmlhYmxlIjp7Y29sb3I6IiNhZGU1ZmMifSwiaGxqcy1zZWxlY3Rvci1pZCI6e2NvbG9yOiIjYWRlNWZjIn0sImhsanMtc2VsZWN0b3ItY2xhc3MiOntjb2xvcjoiI2FkZTVmYyJ9LCJobGpzLXN0cmluZyI6e2NvbG9yOiIjYTJmY2EyIn0sImhsanMtYnVsbGV0Ijp7Y29sb3I6IiNkMzYzNjMifSwiaGxqcy10eXBlIjp7Y29sb3I6IiNmZmEifSwiaGxqcy10aXRsZSI6e2NvbG9yOiIjZmZhIn0sImhsanMtc2VjdGlvbiI6e2NvbG9yOiIjZmZhIn0sImhsanMtYXR0cmlidXRlIjp7Y29sb3I6IiNmZmEifSwiaGxqcy1xdW90ZSI6e2NvbG9yOiIjZmZhIn0sImhsanMtYnVpbHRfaW4iOntjb2xvcjoiI2ZmYSJ9LCJobGpzLWJ1aWx0aW4tbmFtZSI6e2NvbG9yOiIjZmZhIn0sImhsanMtbnVtYmVyIjp7Y29sb3I6IiNkMzYzNjMifSwiaGxqcy1zeW1ib2wiOntjb2xvcjoiI2QzNjM2MyJ9LCJobGpzLWtleXdvcmQiOntjb2xvcjoiI2ZjYzI4YyJ9LCJobGpzLXNlbGVjdG9yLXRhZyI6e2NvbG9yOiIjZmNjMjhjIn0sImhsanMtbGl0ZXJhbCI6e2NvbG9yOiIjZmNjMjhjIn0sImhsanMtY29tbWVudCI6e2NvbG9yOiIjODg4In0sImhsanMtZGVsZXRpb24iOntjb2xvcjoiIzMzMyIsYmFja2dyb3VuZENvbG9yOiIjZmM5YjliIn0sImhsanMtcmVnZXhwIjp7Y29sb3I6IiNjNmI0ZjAifSwiaGxqcy1saW5rIjp7Y29sb3I6IiNjNmI0ZjAifSwiaGxqcy1tZXRhIjp7Y29sb3I6IiNmYzliOWIifSwiaGxqcy1hZGRpdGlvbiI6e2JhY2tncm91bmRDb2xvcjoiI2EyZmNhMiIsY29sb3I6IiMzMzMifX07RC5yZWdpc3Rlckxhbmd1YWdlKCJqc29uIixVKSxELnJlZ2lzdGVyTGFuZ3VhZ2UoImpzIixCKSxELnJlZ2lzdGVyTGFuZ3VhZ2UoInhtbCIseiksRC5yZWdpc3Rlckxhbmd1YWdlKCJ5YW1sIiwkKSxELnJlZ2lzdGVyTGFuZ3VhZ2UoImh0dHAiLEspLEQucmVnaXN0ZXJMYW5ndWFnZSgiYmFzaCIsVyksRC5yZWdpc3Rlckxhbmd1YWdlKCJwb3dlcnNoZWxsIixHKSxELnJlZ2lzdGVyTGFuZ3VhZ2UoImphdmFzY3JpcHQiLEIpO3ZhciBYPXthZ2F0ZTpaLGFydGE6e2hsanM6e2Rpc3BsYXk6ImJsb2NrIixvdmVyZmxvd1g6ImF1dG8iLHBhZGRpbmc6IjAuNWVtIixiYWNrZ3JvdW5kOiIjMjIyIixjb2xvcjoiI2FhYSJ9LCJobGpzLXN1YnN0Ijp7Y29sb3I6IiNhYWEifSwiaGxqcy1zZWN0aW9uIjp7Y29sb3I6IiNmZmYiLGZvbnRXZWlnaHQ6ImJvbGQifSwiaGxqcy1jb21tZW50Ijp7Y29sb3I6IiM0NDQifSwiaGxqcy1xdW90ZSI6e2NvbG9yOiIjNDQ0In0sImhsanMtbWV0YSI6e2NvbG9yOiIjNDQ0In0sImhsanMtc3RyaW5nIjp7Y29sb3I6IiNmZmNjMzMifSwiaGxqcy1zeW1ib2wiOntjb2xvcjoiI2ZmY2MzMyJ9LCJobGpzLWJ1bGxldCI6e2NvbG9yOiIjZmZjYzMzIn0sImhsanMtcmVnZXhwIjp7Y29sb3I6IiNmZmNjMzMifSwiaGxqcy1udW1iZXIiOntjb2xvcjoiIzAwY2M2NiJ9LCJobGpzLWFkZGl0aW9uIjp7Y29sb3I6IiMwMGNjNjYifSwiaGxqcy1idWlsdF9pbiI6e2NvbG9yOiIjMzJhYWVlIn0sImhsanMtYnVpbHRpbi1uYW1lIjp7Y29sb3I6IiMzMmFhZWUifSwiaGxqcy1saXRlcmFsIjp7Y29sb3I6IiMzMmFhZWUifSwiaGxqcy10eXBlIjp7Y29sb3I6IiMzMmFhZWUifSwiaGxqcy10ZW1wbGF0ZS12YXJpYWJsZSI6e2NvbG9yOiIjMzJhYWVlIn0sImhsanMtYXR0cmlidXRlIjp7Y29sb3I6IiMzMmFhZWUifSwiaGxqcy1saW5rIjp7Y29sb3I6IiMzMmFhZWUifSwiaGxqcy1rZXl3b3JkIjp7Y29sb3I6IiM2NjQ0YWEifSwiaGxqcy1zZWxlY3Rvci10YWciOntjb2xvcjoiIzY2NDRhYSJ9LCJobGpzLW5hbWUiOntjb2xvcjoiIzY2NDRhYSJ9LCJobGpzLXNlbGVjdG9yLWlkIjp7Y29sb3I6IiM2NjQ0YWEifSwiaGxqcy1zZWxlY3Rvci1jbGFzcyI6e2NvbG9yOiIjNjY0NGFhIn0sImhsanMtdGl0bGUiOntjb2xvcjoiI2JiMTE2NiJ9LCJobGpzLXZhcmlhYmxlIjp7Y29sb3I6IiNiYjExNjYifSwiaGxqcy1kZWxldGlvbiI6e2NvbG9yOiIjYmIxMTY2In0sImhsanMtdGVtcGxhdGUtdGFnIjp7Y29sb3I6IiNiYjExNjYifSwiaGxqcy1kb2N0YWciOntmb250V2VpZ2h0OiJib2xkIn0sImhsanMtc3Ryb25nIjp7Zm9udFdlaWdodDoiYm9sZCJ9LCJobGpzLWVtcGhhc2lzIjp7Zm9udFN0eWxlOiJpdGFsaWMifX0sbW9ub2thaTp7aGxqczp7ZGlzcGxheToiYmxvY2siLG92ZXJmbG93WDoiYXV0byIscGFkZGluZzoiMC41ZW0iLGJhY2tncm91bmQ6IiMyNzI4MjIiLGNvbG9yOiIjZGRkIn0sImhsanMtdGFnIjp7Y29sb3I6IiNmOTI2NzIifSwiaGxqcy1rZXl3b3JkIjp7Y29sb3I6IiNmOTI2NzIiLGZvbnRXZWlnaHQ6ImJvbGQifSwiaGxqcy1zZWxlY3Rvci10YWciOntjb2xvcjoiI2Y5MjY3MiIsZm9udFdlaWdodDoiYm9sZCJ9LCJobGpzLWxpdGVyYWwiOntjb2xvcjoiI2Y5MjY3MiIsZm9udFdlaWdodDoiYm9sZCJ9LCJobGpzLXN0cm9uZyI6e2NvbG9yOiIjZjkyNjcyIn0sImhsanMtbmFtZSI6e2NvbG9yOiIjZjkyNjcyIn0sImhsanMtY29kZSI6e2NvbG9yOiIjNjZkOWVmIn0sImhsanMtY2xhc3MgLmhsanMtdGl0bGUiOntjb2xvcjoid2hpdGUifSwiaGxqcy1hdHRyaWJ1dGUiOntjb2xvcjoiI2JmNzlkYiJ9LCJobGpzLXN5bWJvbCI6e2NvbG9yOiIjYmY3OWRiIn0sImhsanMtcmVnZXhwIjp7Y29sb3I6IiNiZjc5ZGIifSwiaGxqcy1saW5rIjp7Y29sb3I6IiNiZjc5ZGIifSwiaGxqcy1zdHJpbmciOntjb2xvcjoiI2E2ZTIyZSJ9LCJobGpzLWJ1bGxldCI6e2NvbG9yOiIjYTZlMjJlIn0sImhsanMtc3Vic3QiOntjb2xvcjoiI2E2ZTIyZSJ9LCJobGpzLXRpdGxlIjp7Y29sb3I6IiNhNmUyMmUiLGZvbnRXZWlnaHQ6ImJvbGQifSwiaGxqcy1zZWN0aW9uIjp7Y29sb3I6IiNhNmUyMmUiLGZvbnRXZWlnaHQ6ImJvbGQifSwiaGxqcy1lbXBoYXNpcyI6e2NvbG9yOiIjYTZlMjJlIn0sImhsanMtdHlwZSI6e2NvbG9yOiIjYTZlMjJlIixmb250V2VpZ2h0OiJib2xkIn0sImhsanMtYnVpbHRfaW4iOntjb2xvcjoiI2E2ZTIyZSJ9LCJobGpzLWJ1aWx0aW4tbmFtZSI6e2NvbG9yOiIjYTZlMjJlIn0sImhsanMtc2VsZWN0b3ItYXR0ciI6e2NvbG9yOiIjYTZlMjJlIn0sImhsanMtc2VsZWN0b3ItcHNldWRvIjp7Y29sb3I6IiNhNmUyMmUifSwiaGxqcy1hZGRpdGlvbiI6e2NvbG9yOiIjYTZlMjJlIn0sImhsanMtdmFyaWFibGUiOntjb2xvcjoiI2E2ZTIyZSJ9LCJobGpzLXRlbXBsYXRlLXRhZyI6e2NvbG9yOiIjYTZlMjJlIn0sImhsanMtdGVtcGxhdGUtdmFyaWFibGUiOntjb2xvcjoiI2E2ZTIyZSJ9LCJobGpzLWNvbW1lbnQiOntjb2xvcjoiIzc1NzE1ZSJ9LCJobGpzLXF1b3RlIjp7Y29sb3I6IiM3NTcxNWUifSwiaGxqcy1kZWxldGlvbiI6e2NvbG9yOiIjNzU3MTVlIn0sImhsanMtbWV0YSI6e2NvbG9yOiIjNzU3MTVlIn0sImhsanMtZG9jdGFnIjp7Zm9udFdlaWdodDoiYm9sZCJ9LCJobGpzLXNlbGVjdG9yLWlkIjp7Zm9udFdlaWdodDoiYm9sZCJ9fSxub3JkOntobGpzOntkaXNwbGF5OiJibG9jayIsb3ZlcmZsb3dYOiJhdXRvIixwYWRkaW5nOiIwLjVlbSIsYmFja2dyb3VuZDoiIzJFMzQ0MCIsY29sb3I6IiNEOERFRTkifSwiaGxqcy1zdWJzdCI6e2NvbG9yOiIjRDhERUU5In0sImhsanMtc2VsZWN0b3ItdGFnIjp7Y29sb3I6IiM4MUExQzEifSwiaGxqcy1zZWxlY3Rvci1pZCI6e2NvbG9yOiIjOEZCQ0JCIixmb250V2VpZ2h0OiJib2xkIn0sImhsanMtc2VsZWN0b3ItY2xhc3MiOntjb2xvcjoiIzhGQkNCQiJ9LCJobGpzLXNlbGVjdG9yLWF0dHIiOntjb2xvcjoiIzhGQkNCQiJ9LCJobGpzLXNlbGVjdG9yLXBzZXVkbyI6e2NvbG9yOiIjODhDMEQwIn0sImhsanMtYWRkaXRpb24iOntiYWNrZ3JvdW5kQ29sb3I6InJnYmEoMTYzLCAxOTAsIDE0MCwgMC41KSJ9LCJobGpzLWRlbGV0aW9uIjp7YmFja2dyb3VuZENvbG9yOiJyZ2JhKDE5MSwgOTcsIDEwNiwgMC41KSJ9LCJobGpzLWJ1aWx0X2luIjp7Y29sb3I6IiM4RkJDQkIifSwiaGxqcy10eXBlIjp7Y29sb3I6IiM4RkJDQkIifSwiaGxqcy1jbGFzcyI6e2NvbG9yOiIjOEZCQ0JCIn0sImhsanMtZnVuY3Rpb24iOntjb2xvcjoiIzg4QzBEMCJ9LCJobGpzLWZ1bmN0aW9uID4gLmhsanMtdGl0bGUiOntjb2xvcjoiIzg4QzBEMCJ9LCJobGpzLWtleXdvcmQiOntjb2xvcjoiIzgxQTFDMSJ9LCJobGpzLWxpdGVyYWwiOntjb2xvcjoiIzgxQTFDMSJ9LCJobGpzLXN5bWJvbCI6e2NvbG9yOiIjODFBMUMxIn0sImhsanMtbnVtYmVyIjp7Y29sb3I6IiNCNDhFQUQifSwiaGxqcy1yZWdleHAiOntjb2xvcjoiI0VCQ0I4QiJ9LCJobGpzLXN0cmluZyI6e2NvbG9yOiIjQTNCRThDIn0sImhsanMtdGl0bGUiOntjb2xvcjoiIzhGQkNCQiJ9LCJobGpzLXBhcmFtcyI6e2NvbG9yOiIjRDhERUU5In0sImhsanMtYnVsbGV0Ijp7Y29sb3I6IiM4MUExQzEifSwiaGxqcy1jb2RlIjp7Y29sb3I6IiM4RkJDQkIifSwiaGxqcy1lbXBoYXNpcyI6e2ZvbnRTdHlsZToiaXRhbGljIn0sImhsanMtZm9ybXVsYSI6e2NvbG9yOiIjOEZCQ0JCIn0sImhsanMtc3Ryb25nIjp7Zm9udFdlaWdodDoiYm9sZCJ9LCJobGpzLWxpbms6aG92ZXIiOnt0ZXh0RGVjb3JhdGlvbjoidW5kZXJsaW5lIn0sImhsanMtcXVvdGUiOntjb2xvcjoiIzRDNTY2QSJ9LCJobGpzLWNvbW1lbnQiOntjb2xvcjoiIzRDNTY2QSJ9LCJobGpzLWRvY3RhZyI6e2NvbG9yOiIjOEZCQ0JCIn0sImhsanMtbWV0YSI6e2NvbG9yOiIjNUU4MUFDIn0sImhsanMtbWV0YS1rZXl3b3JkIjp7Y29sb3I6IiM1RTgxQUMifSwiaGxqcy1tZXRhLXN0cmluZyI6e2NvbG9yOiIjQTNCRThDIn0sImhsanMtYXR0ciI6e2NvbG9yOiIjOEZCQ0JCIn0sImhsanMtYXR0cmlidXRlIjp7Y29sb3I6IiNEOERFRTkifSwiaGxqcy1idWlsdGluLW5hbWUiOntjb2xvcjoiIzgxQTFDMSJ9LCJobGpzLW5hbWUiOntjb2xvcjoiIzgxQTFDMSJ9LCJobGpzLXNlY3Rpb24iOntjb2xvcjoiIzg4QzBEMCJ9LCJobGpzLXRhZyI6e2NvbG9yOiIjODFBMUMxIn0sImhsanMtdmFyaWFibGUiOntjb2xvcjoiI0Q4REVFOSJ9LCJobGpzLXRlbXBsYXRlLXZhcmlhYmxlIjp7Y29sb3I6IiNEOERFRTkifSwiaGxqcy10ZW1wbGF0ZS10YWciOntjb2xvcjoiIzVFODFBQyJ9LCJhYm5mIC5obGpzLWF0dHJpYnV0ZSI6e2NvbG9yOiIjODhDMEQwIn0sImFibmYgLmhsanMtc3ltYm9sIjp7Y29sb3I6IiNFQkNCOEIifSwiYXBhY2hlIC5obGpzLWF0dHJpYnV0ZSI6e2NvbG9yOiIjODhDMEQwIn0sImFwYWNoZSAuaGxqcy1zZWN0aW9uIjp7Y29sb3I6IiM4MUExQzEifSwiYXJkdWlubyAuaGxqcy1idWlsdF9pbiI6e2NvbG9yOiIjODhDMEQwIn0sImFzcGVjdGogLmhsanMtbWV0YSI6e2NvbG9yOiIjRDA4NzcwIn0sImFzcGVjdGogPiAuaGxqcy10aXRsZSI6e2NvbG9yOiIjODhDMEQwIn0sImJuZiAuaGxqcy1hdHRyaWJ1dGUiOntjb2xvcjoiIzhGQkNCQiJ9LCJjbG9qdXJlIC5obGpzLW5hbWUiOntjb2xvcjoiIzg4QzBEMCJ9LCJjbG9qdXJlIC5obGpzLXN5bWJvbCI6e2NvbG9yOiIjRUJDQjhCIn0sImNvcSAuaGxqcy1idWlsdF9pbiI6e2NvbG9yOiIjODhDMEQwIn0sImNwcCAuaGxqcy1tZXRhLXN0cmluZyI6e2NvbG9yOiIjOEZCQ0JCIn0sImNzcyAuaGxqcy1idWlsdF9pbiI6e2NvbG9yOiIjODhDMEQwIn0sImNzcyAuaGxqcy1rZXl3b3JkIjp7Y29sb3I6IiNEMDg3NzAifSwiZGlmZiAuaGxqcy1tZXRhIjp7Y29sb3I6IiM4RkJDQkIifSwiZWJuZiAuaGxqcy1hdHRyaWJ1dGUiOntjb2xvcjoiIzhGQkNCQiJ9LCJnbHNsIC5obGpzLWJ1aWx0X2luIjp7Y29sb3I6IiM4OEMwRDAifSwiZ3Jvb3Z5IC5obGpzLW1ldGE6bm90KDpmaXJzdC1jaGlsZCkiOntjb2xvcjoiI0QwODc3MCJ9LCJoYXhlIC5obGpzLW1ldGEiOntjb2xvcjoiI0QwODc3MCJ9LCJqYXZhIC5obGpzLW1ldGEiOntjb2xvcjoiI0QwODc3MCJ9LCJsZGlmIC5obGpzLWF0dHJpYnV0ZSI6e2NvbG9yOiIjOEZCQ0JCIn0sImxpc3AgLmhsanMtbmFtZSI6e2NvbG9yOiIjODhDMEQwIn0sImx1YSAuaGxqcy1idWlsdF9pbiI6e2NvbG9yOiIjODhDMEQwIn0sIm1vb25zY3JpcHQgLmhsanMtYnVpbHRfaW4iOntjb2xvcjoiIzg4QzBEMCJ9LCJuZ2lueCAuaGxqcy1hdHRyaWJ1dGUiOntjb2xvcjoiIzg4QzBEMCJ9LCJuZ2lueCAuaGxqcy1zZWN0aW9uIjp7Y29sb3I6IiM1RTgxQUMifSwicGYgLmhsanMtYnVpbHRfaW4iOntjb2xvcjoiIzg4QzBEMCJ9LCJwcm9jZXNzaW5nIC5obGpzLWJ1aWx0X2luIjp7Y29sb3I6IiM4OEMwRDAifSwic2NzcyAuaGxqcy1rZXl3b3JkIjp7Y29sb3I6IiM4MUExQzEifSwic3R5bHVzIC5obGpzLWtleXdvcmQiOntjb2xvcjoiIzgxQTFDMSJ9LCJzd2lmdCAuaGxqcy1tZXRhIjp7Y29sb3I6IiNEMDg3NzAifSwidmltIC5obGpzLWJ1aWx0X2luIjp7Y29sb3I6IiM4OEMwRDAiLGZvbnRTdHlsZToiaXRhbGljIn0sInlhbWwgLmhsanMtbWV0YSI6e2NvbG9yOiIjRDA4NzcwIn19LG9ic2lkaWFuOntobGpzOntkaXNwbGF5OiJibG9jayIsb3ZlcmZsb3dYOiJhdXRvIixwYWRkaW5nOiIwLjVlbSIsYmFja2dyb3VuZDoiIzI4MmIyZSIsY29sb3I6IiNlMGUyZTQifSwiaGxqcy1rZXl3b3JkIjp7Y29sb3I6IiM5M2M3NjMiLGZvbnRXZWlnaHQ6ImJvbGQifSwiaGxqcy1zZWxlY3Rvci10YWciOntjb2xvcjoiIzkzYzc2MyIsZm9udFdlaWdodDoiYm9sZCJ9LCJobGpzLWxpdGVyYWwiOntjb2xvcjoiIzkzYzc2MyIsZm9udFdlaWdodDoiYm9sZCJ9LCJobGpzLXNlbGVjdG9yLWlkIjp7Y29sb3I6IiM5M2M3NjMifSwiaGxqcy1udW1iZXIiOntjb2xvcjoiI2ZmY2QyMiJ9LCJobGpzLWF0dHJpYnV0ZSI6e2NvbG9yOiIjNjY4YmIwIn0sImhsanMtY29kZSI6e2NvbG9yOiJ3aGl0ZSJ9LCJobGpzLWNsYXNzIC5obGpzLXRpdGxlIjp7Y29sb3I6IndoaXRlIn0sImhsanMtc2VjdGlvbiI6e2NvbG9yOiJ3aGl0ZSIsZm9udFdlaWdodDoiYm9sZCJ9LCJobGpzLXJlZ2V4cCI6e2NvbG9yOiIjZDM5NzQ1In0sImhsanMtbGluayI6e2NvbG9yOiIjZDM5NzQ1In0sImhsanMtbWV0YSI6e2NvbG9yOiIjNTU3MTgyIn0sImhsanMtdGFnIjp7Y29sb3I6IiM4Y2JiYWQifSwiaGxqcy1uYW1lIjp7Y29sb3I6IiM4Y2JiYWQiLGZvbnRXZWlnaHQ6ImJvbGQifSwiaGxqcy1idWxsZXQiOntjb2xvcjoiIzhjYmJhZCJ9LCJobGpzLXN1YnN0Ijp7Y29sb3I6IiM4Y2JiYWQifSwiaGxqcy1lbXBoYXNpcyI6e2NvbG9yOiIjOGNiYmFkIn0sImhsanMtdHlwZSI6e2NvbG9yOiIjOGNiYmFkIixmb250V2VpZ2h0OiJib2xkIn0sImhsanMtYnVpbHRfaW4iOntjb2xvcjoiIzhjYmJhZCJ9LCJobGpzLXNlbGVjdG9yLWF0dHIiOntjb2xvcjoiIzhjYmJhZCJ9LCJobGpzLXNlbGVjdG9yLXBzZXVkbyI6e2NvbG9yOiIjOGNiYmFkIn0sImhsanMtYWRkaXRpb24iOntjb2xvcjoiIzhjYmJhZCJ9LCJobGpzLXZhcmlhYmxlIjp7Y29sb3I6IiM4Y2JiYWQifSwiaGxqcy10ZW1wbGF0ZS10YWciOntjb2xvcjoiIzhjYmJhZCJ9LCJobGpzLXRlbXBsYXRlLXZhcmlhYmxlIjp7Y29sb3I6IiM4Y2JiYWQifSwiaGxqcy1zdHJpbmciOntjb2xvcjoiI2VjNzYwMCJ9LCJobGpzLXN5bWJvbCI6e2NvbG9yOiIjZWM3NjAwIn0sImhsanMtY29tbWVudCI6e2NvbG9yOiIjODE4ZTk2In0sImhsanMtcXVvdGUiOntjb2xvcjoiIzgxOGU5NiJ9LCJobGpzLWRlbGV0aW9uIjp7Y29sb3I6IiM4MThlOTYifSwiaGxqcy1zZWxlY3Rvci1jbGFzcyI6e2NvbG9yOiIjQTA4MkJEIn0sImhsanMtZG9jdGFnIjp7Zm9udFdlaWdodDoiYm9sZCJ9LCJobGpzLXRpdGxlIjp7Zm9udFdlaWdodDoiYm9sZCJ9LCJobGpzLXN0cm9uZyI6e2ZvbnRXZWlnaHQ6ImJvbGQifX0sInRvbW9ycm93LW5pZ2h0Ijp7ImhsanMtY29tbWVudCI6e2NvbG9yOiIjOTY5ODk2In0sImhsanMtcXVvdGUiOntjb2xvcjoiIzk2OTg5NiJ9LCJobGpzLXZhcmlhYmxlIjp7Y29sb3I6IiNjYzY2NjYifSwiaGxqcy10ZW1wbGF0ZS12YXJpYWJsZSI6e2NvbG9yOiIjY2M2NjY2In0sImhsanMtdGFnIjp7Y29sb3I6IiNjYzY2NjYifSwiaGxqcy1uYW1lIjp7Y29sb3I6IiNjYzY2NjYifSwiaGxqcy1zZWxlY3Rvci1pZCI6e2NvbG9yOiIjY2M2NjY2In0sImhsanMtc2VsZWN0b3ItY2xhc3MiOntjb2xvcjoiI2NjNjY2NiJ9LCJobGpzLXJlZ2V4cCI6e2NvbG9yOiIjY2M2NjY2In0sImhsanMtZGVsZXRpb24iOntjb2xvcjoiI2NjNjY2NiJ9LCJobGpzLW51bWJlciI6e2NvbG9yOiIjZGU5MzVmIn0sImhsanMtYnVpbHRfaW4iOntjb2xvcjoiI2RlOTM1ZiJ9LCJobGpzLWJ1aWx0aW4tbmFtZSI6e2NvbG9yOiIjZGU5MzVmIn0sImhsanMtbGl0ZXJhbCI6e2NvbG9yOiIjZGU5MzVmIn0sImhsanMtdHlwZSI6e2NvbG9yOiIjZGU5MzVmIn0sImhsanMtcGFyYW1zIjp7Y29sb3I6IiNkZTkzNWYifSwiaGxqcy1tZXRhIjp7Y29sb3I6IiNkZTkzNWYifSwiaGxqcy1saW5rIjp7Y29sb3I6IiNkZTkzNWYifSwiaGxqcy1hdHRyaWJ1dGUiOntjb2xvcjoiI2YwYzY3NCJ9LCJobGpzLXN0cmluZyI6e2NvbG9yOiIjYjViZDY4In0sImhsanMtc3ltYm9sIjp7Y29sb3I6IiNiNWJkNjgifSwiaGxqcy1idWxsZXQiOntjb2xvcjoiI2I1YmQ2OCJ9LCJobGpzLWFkZGl0aW9uIjp7Y29sb3I6IiNiNWJkNjgifSwiaGxqcy10aXRsZSI6e2NvbG9yOiIjODFhMmJlIn0sImhsanMtc2VjdGlvbiI6e2NvbG9yOiIjODFhMmJlIn0sImhsanMta2V5d29yZCI6e2NvbG9yOiIjYjI5NGJiIn0sImhsanMtc2VsZWN0b3ItdGFnIjp7Y29sb3I6IiNiMjk0YmIifSxobGpzOntkaXNwbGF5OiJibG9jayIsb3ZlcmZsb3dYOiJhdXRvIixiYWNrZ3JvdW5kOiIjMWQxZjIxIixjb2xvcjoiI2M1YzhjNiIscGFkZGluZzoiMC41ZW0ifSwiaGxqcy1lbXBoYXNpcyI6e2ZvbnRTdHlsZToiaXRhbGljIn0sImhsanMtc3Ryb25nIjp7Zm9udFdlaWdodDoiYm9sZCJ9fX0sUT1vKCkoWCksZWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGkoKShRKS5jYWxsKFEsZSk/WFtlXTooY29uc29sZS53YXJuKCJSZXF1ZXN0IHN0eWxlICciLmNvbmNhdChlLCInIGlzIG5vdCBhdmFpbGFibGUsIHJldHVybmluZyBkZWZhdWx0IGluc3RlYWQiKSksWil9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkZpbGU9dC5CbG9iPXQuRm9ybURhdGE9dm9pZCAwO2NvbnN0IHI9InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWxUaGlzP2dsb2JhbFRoaXM6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6d2luZG93O3QuRm9ybURhdGE9ci5Gb3JtRGF0YSx0LkJsb2I9ci5CbG9iLHQuRmlsZT1yLkZpbGV9LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPSEwfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigyMzUpLG89big2OCkuZixhPW4oNjcpLGk9big1NSkscz1uKDUzOSksdT1uKDQxKSgidG9TdHJpbmdUYWciKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4sYyl7aWYoZSl7dmFyIGw9bj9lOmUucHJvdG90eXBlO2kobCx1KXx8byhsLHUse2NvbmZpZ3VyYWJsZTohMCx2YWx1ZTp0fSksYyYmIXImJmEobCwidG9TdHJpbmciLHMpfX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDIzNSksbz1uKDE1MiksYT1uKDQxKSgidG9TdHJpbmdUYWciKSxpPSJBcmd1bWVudHMiPT1vKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk7ZS5leHBvcnRzPXI/bzpmdW5jdGlvbihlKXt2YXIgdCxuLHI7cmV0dXJuIHZvaWQgMD09PWU/IlVuZGVmaW5lZCI6bnVsbD09PWU/Ik51bGwiOiJzdHJpbmciPT10eXBlb2Yobj1mdW5jdGlvbihlLHQpe3RyeXtyZXR1cm4gZVt0XX1jYXRjaChlKXt9fSh0PU9iamVjdChlKSxhKSk/bjppP28odCk6Ik9iamVjdCI9PShyPW8odCkpJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5jYWxsZWU/IkFyZ3VtZW50cyI6cn19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoZSsiIGlzIG5vdCBhIGZ1bmN0aW9uIik7cmV0dXJuIGV9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big2NzcpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT8iIjpyKGUpfX0sZnVuY3Rpb24oZSx0LG4pe2UuZXhwb3J0cz1uKDY3MCl9LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9bigxMDQ4KX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBmdW5jdGlvbihlKXt0cnl7cmV0dXJuISFKU09OLnBhcnNlKGUpfWNhdGNoKGUpe3JldHVybiBudWxsfX0oZSk/Impzb24iOm51bGx9bi5kKHQsImEiLChmdW5jdGlvbigpe3JldHVybiByfSkpfSxmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPW4oNjY2KX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtuLnIodCksbi5kKHQsIlVQREFURV9MQVlPVVQiLChmdW5jdGlvbigpe3JldHVybiBvfSkpLG4uZCh0LCJVUERBVEVfRklMVEVSIiwoZnVuY3Rpb24oKXtyZXR1cm4gYX0pKSxuLmQodCwiVVBEQVRFX01PREUiLChmdW5jdGlvbigpe3JldHVybiBpfSkpLG4uZCh0LCJTSE9XIiwoZnVuY3Rpb24oKXtyZXR1cm4gc30pKSxuLmQodCwidXBkYXRlTGF5b3V0IiwoZnVuY3Rpb24oKXtyZXR1cm4gdX0pKSxuLmQodCwidXBkYXRlRmlsdGVyIiwoZnVuY3Rpb24oKXtyZXR1cm4gY30pKSxuLmQodCwic2hvdyIsKGZ1bmN0aW9uKCl7cmV0dXJuIGx9KSksbi5kKHQsImNoYW5nZU1vZGUiLChmdW5jdGlvbigpe3JldHVybiBwfSkpO3ZhciByPW4oNSksbz0ibGF5b3V0X3VwZGF0ZV9sYXlvdXQiLGE9ImxheW91dF91cGRhdGVfZmlsdGVyIixpPSJsYXlvdXRfdXBkYXRlX21vZGUiLHM9ImxheW91dF9zaG93IjtmdW5jdGlvbiB1KGUpe3JldHVybnt0eXBlOm8scGF5bG9hZDplfX1mdW5jdGlvbiBjKGUpe3JldHVybnt0eXBlOmEscGF5bG9hZDplfX1mdW5jdGlvbiBsKGUpe3ZhciB0PSEoYXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0pfHxhcmd1bWVudHNbMV07cmV0dXJuIGU9T2JqZWN0KHIudikoZSkse3R5cGU6cyxwYXlsb2FkOnt0aGluZzplLHNob3duOnR9fX1mdW5jdGlvbiBwKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToiIjtyZXR1cm4gZT1PYmplY3Qoci52KShlKSx7dHlwZTppLHBheWxvYWQ6e3RoaW5nOmUsbW9kZTp0fX19fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big0MTkpLG89bigxNjEpLGE9bigxOTQpLGk9big1Nikscz1uKDEzNyksdT1uKDE5NSksYz1uKDE5OCksbD1uKDI0NykscD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZihudWxsPT1lKXJldHVybiEwO2lmKHMoZSkmJihpKGUpfHwic3RyaW5nIj09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlLnNwbGljZXx8dShlKXx8bChlKXx8YShlKSkpcmV0dXJuIWUubGVuZ3RoO3ZhciB0PW8oZSk7aWYoIltvYmplY3QgTWFwXSI9PXR8fCJbb2JqZWN0IFNldF0iPT10KXJldHVybiFlLnNpemU7aWYoYyhlKSlyZXR1cm4hcihlKS5sZW5ndGg7Zm9yKHZhciBuIGluIGUpaWYocC5jYWxsKGUsbikpcmV0dXJuITE7cmV0dXJuITB9fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybntlbnVtZXJhYmxlOiEoMSZlKSxjb25maWd1cmFibGU6ISgyJmUpLHdyaXRhYmxlOiEoNCZlKSx2YWx1ZTp0fX19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKG51bGw9PWUpdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAiK2UpO3JldHVybiBlfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNzYpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsbil7aWYocihlKSx2b2lkIDA9PT10KXJldHVybiBlO3N3aXRjaChuKXtjYXNlIDA6cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUuY2FsbCh0KX07Y2FzZSAxOnJldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gZS5jYWxsKHQsbil9O2Nhc2UgMjpyZXR1cm4gZnVuY3Rpb24obixyKXtyZXR1cm4gZS5jYWxsKHQsbixyKX07Y2FzZSAzOnJldHVybiBmdW5jdGlvbihuLHIsbyl7cmV0dXJuIGUuY2FsbCh0LG4scixvKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodCxhcmd1bWVudHMpfX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDcwKTtlLmV4cG9ydHM9cigibmF2aWdhdG9yIiwidXNlckFnZW50Iil8fCIifSxmdW5jdGlvbihlLHQsbil7dmFyIHIsbz1uKDUyKSxhPW4oMjI4KSxpPW4oMjMxKSxzPW4oMTU3KSx1PW4oMzY1KSxjPW4oMjIzKSxsPW4oMTgzKSxwPWwoIklFX1BST1RPIiksZj1mdW5jdGlvbigpe30saD1mdW5jdGlvbihlKXtyZXR1cm4iPHNjcmlwdD4iK2UrIjwvIisic2NyaXB0PiJ9LGQ9ZnVuY3Rpb24oKXt0cnl7cj1kb2N1bWVudC5kb21haW4mJm5ldyBBY3RpdmVYT2JqZWN0KCJodG1sZmlsZSIpfWNhdGNoKGUpe312YXIgZSx0O2Q9cj9mdW5jdGlvbihlKXtlLndyaXRlKGgoIiIpKSxlLmNsb3NlKCk7dmFyIHQ9ZS5wYXJlbnRXaW5kb3cuT2JqZWN0O3JldHVybiBlPW51bGwsdH0ocik6KCh0PWMoImlmcmFtZSIpKS5zdHlsZS5kaXNwbGF5PSJub25lIix1LmFwcGVuZENoaWxkKHQpLHQuc3JjPVN0cmluZygiamF2YXNjcmlwdDoiKSwoZT10LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQpLm9wZW4oKSxlLndyaXRlKGgoImRvY3VtZW50LkY9T2JqZWN0IikpLGUuY2xvc2UoKSxlLkYpO2Zvcih2YXIgbj1pLmxlbmd0aDtuLS07KWRlbGV0ZSBkLnByb3RvdHlwZVtpW25dXTtyZXR1cm4gZCgpfTtzW3BdPSEwLGUuZXhwb3J0cz1PYmplY3QuY3JlYXRlfHxmdW5jdGlvbihlLHQpe3ZhciBuO3JldHVybiBudWxsIT09ZT8oZi5wcm90b3R5cGU9byhlKSxuPW5ldyBmLGYucHJvdG90eXBlPW51bGwsbltwXT1lKTpuPWQoKSx2b2lkIDA9PT10P246YShuLHQpfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNjcpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixvKXtvJiZvLmVudW1lcmFibGU/ZVt0XT1uOnIoZSx0LG4pfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDM3KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj1bXVtlXTtyZXR1cm4hIW4mJnIoKGZ1bmN0aW9uKCl7bi5jYWxsKG51bGwsdHx8ZnVuY3Rpb24oKXt0aHJvdyAxfSwxKX0pKX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDEzNSksbz1uKDY3OCksYT1uKDY3OSksaT1yP3IudG9TdHJpbmdUYWc6dm9pZCAwO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT92b2lkIDA9PT1lPyJbb2JqZWN0IFVuZGVmaW5lZF0iOiJbb2JqZWN0IE51bGxdIjppJiZpIGluIE9iamVjdChlKT9vKGUpOmEoZSl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big2OTYpLG89big2OTkpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciBuPW8oZSx0KTtyZXR1cm4gcihuKT9uOnZvaWQgMH19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxOTkpLG89T2JqZWN0LmtleXN8fGZ1bmN0aW9uKGUpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiBlKXQucHVzaChuKTtyZXR1cm4gdH07ZS5leHBvcnRzPXA7dmFyIGE9bigxNjMpO2EuaW5oZXJpdHM9big2Myk7dmFyIGk9big0MjYpLHM9bigyNTUpO2EuaW5oZXJpdHMocCxpKTtmb3IodmFyIHU9byhzLnByb3RvdHlwZSksYz0wO2M8dS5sZW5ndGg7YysrKXt2YXIgbD11W2NdO3AucHJvdG90eXBlW2xdfHwocC5wcm90b3R5cGVbbF09cy5wcm90b3R5cGVbbF0pfWZ1bmN0aW9uIHAoZSl7aWYoISh0aGlzIGluc3RhbmNlb2YgcCkpcmV0dXJuIG5ldyBwKGUpO2kuY2FsbCh0aGlzLGUpLHMuY2FsbCh0aGlzLGUpLGUmJiExPT09ZS5yZWFkYWJsZSYmKHRoaXMucmVhZGFibGU9ITEpLGUmJiExPT09ZS53cml0YWJsZSYmKHRoaXMud3JpdGFibGU9ITEpLHRoaXMuYWxsb3dIYWxmT3Blbj0hMCxlJiYhMT09PWUuYWxsb3dIYWxmT3BlbiYmKHRoaXMuYWxsb3dIYWxmT3Blbj0hMSksdGhpcy5vbmNlKCJlbmQiLGYpfWZ1bmN0aW9uIGYoKXt0aGlzLmFsbG93SGFsZk9wZW58fHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWR8fHIubmV4dFRpY2soaCx0aGlzKX1mdW5jdGlvbiBoKGUpe2UuZW5kKCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHAucHJvdG90eXBlLCJ3cml0YWJsZUhpZ2hXYXRlck1hcmsiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcmt9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHAucHJvdG90eXBlLCJkZXN0cm95ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fcmVhZGFibGVTdGF0ZSYmdm9pZCAwIT09dGhpcy5fd3JpdGFibGVTdGF0ZSYmKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkJiZ0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCl9LHNldDpmdW5jdGlvbihlKXt2b2lkIDAhPT10aGlzLl9yZWFkYWJsZVN0YXRlJiZ2b2lkIDAhPT10aGlzLl93cml0YWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ9ZSx0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD1lKX19KSxwLnByb3RvdHlwZS5fZGVzdHJveT1mdW5jdGlvbihlLHQpe3RoaXMucHVzaChudWxsKSx0aGlzLmVuZCgpLHIubmV4dFRpY2sodCxlKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9big3NzUpKCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBlIT09ciYmbnVsbCE9PWV9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNzc2KSxvPU1hdGgubWF4O2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gbygwLHIoZSkpfX0sZnVuY3Rpb24oZSx0LG4pe30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDQzNyksbz1uKDc5MCksYT1uKDQzNCksaT1uKDQzMikscz1uKDc5NCk7KGUuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciBuLG8sdSxjLGw7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mnx8InN0cmluZyIhPXR5cGVvZiBlPyhjPXQsdD1lLGU9bnVsbCk6Yz1hcmd1bWVudHNbMl0scihlKT8obj1zLmNhbGwoZSwiYyIpLG89cy5jYWxsKGUsImUiKSx1PXMuY2FsbChlLCJ3IikpOihuPXU9ITAsbz0hMSksbD17dmFsdWU6dCxjb25maWd1cmFibGU6bixlbnVtZXJhYmxlOm8sd3JpdGFibGU6dX0sYz9hKGkoYyksbCk6bH0pLmdzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgdSxjLGwscDtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGU/KGw9bixuPXQsdD1lLGU9bnVsbCk6bD1hcmd1bWVudHNbM10scih0KT9vKHQpP3Iobik/byhuKXx8KGw9bixuPXZvaWQgMCk6bj12b2lkIDA6KGw9dCx0PW49dm9pZCAwKTp0PXZvaWQgMCxyKGUpPyh1PXMuY2FsbChlLCJjIiksYz1zLmNhbGwoZSwiZSIpKToodT0hMCxjPSExKSxwPXtnZXQ6dCxzZXQ6bixjb25maWd1cmFibGU6dSxlbnVtZXJhYmxlOmN9LGw/YShpKGwpLHApOnB9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big1Miksbz1uKDM5NiksYT1uKDY5KSxpPW4oMTA5KSxzPW4oMTYwKSx1PW4oMzk1KSxjPWZ1bmN0aW9uKGUsdCl7dGhpcy5zdG9wcGVkPWUsdGhpcy5yZXN1bHQ9dH07ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgbCxwLGYsaCxkLG0sdixnPW4mJm4udGhhdCx5PSEoIW58fCFuLkFTX0VOVFJJRVMpLGI9ISghbnx8IW4uSVNfSVRFUkFUT1IpLF89ISghbnx8IW4uSU5URVJSVVBURUQpLHc9aSh0LGcsMSt5K18pLHg9ZnVuY3Rpb24oZSl7cmV0dXJuIGwmJnUobCksbmV3IGMoITAsZSl9LEU9ZnVuY3Rpb24oZSl7cmV0dXJuIHk/KHIoZSksXz93KGVbMF0sZVsxXSx4KTp3KGVbMF0sZVsxXSkpOl8/dyhlLHgpOncoZSl9O2lmKGIpbD1lO2Vsc2V7aWYoImZ1bmN0aW9uIiE9dHlwZW9mKHA9cyhlKSkpdGhyb3cgVHlwZUVycm9yKCJUYXJnZXQgaXMgbm90IGl0ZXJhYmxlIik7aWYobyhwKSl7Zm9yKGY9MCxoPWEoZS5sZW5ndGgpO2g+ZjtmKyspaWYoKGQ9RShlW2ZdKSkmJmQgaW5zdGFuY2VvZiBjKXJldHVybiBkO3JldHVybiBuZXcgYyghMSl9bD1wLmNhbGwoZSl9Zm9yKG09bC5uZXh0OyEodj1tLmNhbGwobCkpLmRvbmU7KXt0cnl7ZD1FKHYudmFsdWUpfWNhdGNoKGUpe3Rocm93IHUobCksZX1pZigib2JqZWN0Ij09dHlwZW9mIGQmJmQmJmQgaW5zdGFuY2VvZiBjKXJldHVybiBkfXJldHVybiBuZXcgYyghMSl9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzApLG89KG4oMjUpLGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7aWYodC5pbnN0YW5jZVBvb2wubGVuZ3RoKXt2YXIgbj10Lmluc3RhbmNlUG9vbC5wb3AoKTtyZXR1cm4gdC5jYWxsKG4sZSksbn1yZXR1cm4gbmV3IHQoZSl9KSxhPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7ZSBpbnN0YW5jZW9mIHR8fHIoIjI1IiksZS5kZXN0cnVjdG9yKCksdC5pbnN0YW5jZVBvb2wubGVuZ3RoPHQucG9vbFNpemUmJnQuaW5zdGFuY2VQb29sLnB1c2goZSl9LGk9byxzPXthZGRQb29saW5nVG86ZnVuY3Rpb24oZSx0KXt2YXIgbj1lO3JldHVybiBuLmluc3RhbmNlUG9vbD1bXSxuLmdldFBvb2xlZD10fHxpLG4ucG9vbFNpemV8fChuLnBvb2xTaXplPTEwKSxuLnJlbGVhc2U9YSxufSxvbmVBcmd1bWVudFBvb2xlcjpvLHR3b0FyZ3VtZW50UG9vbGVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztpZihuLmluc3RhbmNlUG9vbC5sZW5ndGgpe3ZhciByPW4uaW5zdGFuY2VQb29sLnBvcCgpO3JldHVybiBuLmNhbGwocixlLHQpLHJ9cmV0dXJuIG5ldyBuKGUsdCl9LHRocmVlQXJndW1lbnRQb29sZXI6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXM7aWYoci5pbnN0YW5jZVBvb2wubGVuZ3RoKXt2YXIgbz1yLmluc3RhbmNlUG9vbC5wb3AoKTtyZXR1cm4gci5jYWxsKG8sZSx0LG4pLG99cmV0dXJuIG5ldyByKGUsdCxuKX0sZm91ckFyZ3VtZW50UG9vbGVyOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPXRoaXM7aWYoby5pbnN0YW5jZVBvb2wubGVuZ3RoKXt2YXIgYT1vLmluc3RhbmNlUG9vbC5wb3AoKTtyZXR1cm4gby5jYWxsKGEsZSx0LG4sciksYX1yZXR1cm4gbmV3IG8oZSx0LG4scil9fTtlLmV4cG9ydHM9c30sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PXR8fGUhPWUmJnQhPXR9fSxmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPW4oMTA5MSl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7KGZ1bmN0aW9uKHQscil7dmFyIG89NjU1MzYsYT00Mjk0OTY3Mjk1O3ZhciBpPW4oNjQpLkJ1ZmZlcixzPXQuY3J5cHRvfHx0Lm1zQ3J5cHRvO3MmJnMuZ2V0UmFuZG9tVmFsdWVzP2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2lmKGU+YSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigicmVxdWVzdGVkIHRvbyBtYW55IHJhbmRvbSBieXRlcyIpO3ZhciBuPWkuYWxsb2NVbnNhZmUoZSk7aWYoZT4wKWlmKGU+bylmb3IodmFyIHU9MDt1PGU7dSs9bylzLmdldFJhbmRvbVZhbHVlcyhuLnNsaWNlKHUsdStvKSk7ZWxzZSBzLmdldFJhbmRvbVZhbHVlcyhuKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdClyZXR1cm4gci5uZXh0VGljaygoZnVuY3Rpb24oKXt0KG51bGwsbil9KSk7cmV0dXJuIG59OmUuZXhwb3J0cz1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiU2VjdXJlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgYnJvd3Nlci5cblVzZSBDaHJvbWUsIEZpcmVmb3ggb3IgSW50ZXJuZXQgRXhwbG9yZXIgMTEiKX19KS5jYWxsKHRoaXMsbig1MSksbig4OSkpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KSxuLmQodCwiZGVmYXVsdCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGx9KSk7dmFyIHI9bigxMiksbz1uLm4ociksYT1uKDQpLGk9bi5uKGEpLHM9big1MDkpLHU9bi5uKHMpLGM9W24oMjg4KSxuKDI4OSldO2Z1bmN0aW9uIGwoZSl7dmFyIHQsbj17anNTcGVjOnt9fSxyPXUoKShjLChmdW5jdGlvbihlLHQpe3RyeXt2YXIgcj10LnRyYW5zZm9ybShlLG4pO3JldHVybiBvKCkocikuY2FsbChyLChmdW5jdGlvbihlKXtyZXR1cm4hIWV9KSl9Y2F0Y2godCl7cmV0dXJuIGNvbnNvbGUuZXJyb3IoIlRyYW5zZm9ybWVyIGVycm9yOiIsdCksZX19KSxlKTtyZXR1cm4gaSgpKHQ9bygpKHIpLmNhbGwociwoZnVuY3Rpb24oZSl7cmV0dXJuISFlfSkpKS5jYWxsKHQsKGZ1bmN0aW9uKGUpe3JldHVybiFlLmdldCgibGluZSIpJiZlLmdldCgicGF0aCIpLGV9KSl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big0OCksbz1uKDE3OCksYT1uKDEwNyksaT1uKDY2KSxzPW4oMTgwKSx1PW4oNTUpLGM9bigzNjApLGw9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt0LmY9cj9sOmZ1bmN0aW9uKGUsdCl7aWYoZT1pKGUpLHQ9cyh0LCEwKSxjKXRyeXtyZXR1cm4gbChlLHQpfWNhdGNoKGUpe31pZih1KGUsdCkpcmV0dXJuIGEoIW8uZi5jYWxsKGUsdCksZVt0XSl9fSxmdW5jdGlvbihlLHQpe3ZhciBuPU1hdGguY2VpbCxyPU1hdGguZmxvb3I7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBpc05hTihlPStlKT8wOihlPjA/cjpuKShlKX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcixvLGE9big0MCksaT1uKDExMCkscz1hLnByb2Nlc3MsdT1zJiZzLnZlcnNpb25zLGM9dSYmdS52ODtjP289KHI9Yy5zcGxpdCgiLiIpKVswXTw0PzE6clswXStyWzFdOmkmJighKHI9aS5tYXRjaCgvRWRnZVwvKFxkKykvKSl8fHJbMV0+PTc0KSYmKHI9aS5tYXRjaCgvQ2hyb21lXC8oXGQrKS8pKSYmKG89clsxXSksZS5leHBvcnRzPW8mJitvfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzY5KS5jaGFyQXQsbz1uKDc3KSxhPW4oMjM2KSxpPSJTdHJpbmcgSXRlcmF0b3IiLHM9by5zZXQsdT1vLmdldHRlckZvcihpKTthKFN0cmluZywiU3RyaW5nIiwoZnVuY3Rpb24oZSl7cyh0aGlzLHt0eXBlOmksc3RyaW5nOlN0cmluZyhlKSxpbmRleDowfSl9KSwoZnVuY3Rpb24oKXt2YXIgZSx0PXUodGhpcyksbj10LnN0cmluZyxvPXQuaW5kZXg7cmV0dXJuIG8+PW4ubGVuZ3RoP3t2YWx1ZTp2b2lkIDAsZG9uZTohMH06KGU9cihuLG8pLHQuaW5kZXgrPWUubGVuZ3RoLHt2YWx1ZTplLGRvbmU6ITF9KX0pKX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9e319LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7KGZ1bmN0aW9uKGUpe3ZhciByPW4oNTc5KSxvPW4oNTgwKSxhPW4oMzc1KTtmdW5jdGlvbiBpKCl7cmV0dXJuIHUuVFlQRURfQVJSQVlfU1VQUE9SVD8yMTQ3NDgzNjQ3OjEwNzM3NDE4MjN9ZnVuY3Rpb24gcyhlLHQpe2lmKGkoKTx0KXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCIpO3JldHVybiB1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KGU9bmV3IFVpbnQ4QXJyYXkodCkpLl9fcHJvdG9fXz11LnByb3RvdHlwZToobnVsbD09PWUmJihlPW5ldyB1KHQpKSxlLmxlbmd0aD10KSxlfWZ1bmN0aW9uIHUoZSx0LG4pe2lmKCEodS5UWVBFRF9BUlJBWV9TVVBQT1JUfHx0aGlzIGluc3RhbmNlb2YgdSkpcmV0dXJuIG5ldyB1KGUsdCxuKTtpZigibnVtYmVyIj09dHlwZW9mIGUpe2lmKCJzdHJpbmciPT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IoIklmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIik7cmV0dXJuIHAodGhpcyxlKX1yZXR1cm4gYyh0aGlzLGUsdCxuKX1mdW5jdGlvbiBjKGUsdCxuLHIpe2lmKCJudW1iZXIiPT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmdCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyP2Z1bmN0aW9uKGUsdCxuLHIpe2lmKHQuYnl0ZUxlbmd0aCxuPDB8fHQuYnl0ZUxlbmd0aDxuKXRocm93IG5ldyBSYW5nZUVycm9yKCInb2Zmc2V0JyBpcyBvdXQgb2YgYm91bmRzIik7aWYodC5ieXRlTGVuZ3RoPG4rKHJ8fDApKXRocm93IG5ldyBSYW5nZUVycm9yKCInbGVuZ3RoJyBpcyBvdXQgb2YgYm91bmRzIik7dD12b2lkIDA9PT1uJiZ2b2lkIDA9PT1yP25ldyBVaW50OEFycmF5KHQpOnZvaWQgMD09PXI/bmV3IFVpbnQ4QXJyYXkodCxuKTpuZXcgVWludDhBcnJheSh0LG4scik7dS5UWVBFRF9BUlJBWV9TVVBQT1JUPyhlPXQpLl9fcHJvdG9fXz11LnByb3RvdHlwZTplPWYoZSx0KTtyZXR1cm4gZX0oZSx0LG4scik6InN0cmluZyI9PXR5cGVvZiB0P2Z1bmN0aW9uKGUsdCxuKXsic3RyaW5nIj09dHlwZW9mIG4mJiIiIT09bnx8KG49InV0ZjgiKTtpZighdS5pc0VuY29kaW5nKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoJyJlbmNvZGluZyIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpO3ZhciByPTB8ZCh0LG4pLG89KGU9cyhlLHIpKS53cml0ZSh0LG4pO28hPT1yJiYoZT1lLnNsaWNlKDAsbykpO3JldHVybiBlfShlLHQsbik6ZnVuY3Rpb24oZSx0KXtpZih1LmlzQnVmZmVyKHQpKXt2YXIgbj0wfGgodC5sZW5ndGgpO3JldHVybiAwPT09KGU9cyhlLG4pKS5sZW5ndGh8fHQuY29weShlLDAsMCxuKSxlfWlmKHQpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnQuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fCJsZW5ndGgiaW4gdClyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIHQubGVuZ3RofHwocj10Lmxlbmd0aCkhPXI/cyhlLDApOmYoZSx0KTtpZigiQnVmZmVyIj09PXQudHlwZSYmYSh0LmRhdGEpKXJldHVybiBmKGUsdC5kYXRhKX12YXIgcjt0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuIil9KGUsdCl9ZnVuY3Rpb24gbChlKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKTtpZihlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpfWZ1bmN0aW9uIHAoZSx0KXtpZihsKHQpLGU9cyhlLHQ8MD8wOjB8aCh0KSksIXUuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IodmFyIG49MDtuPHQ7KytuKWVbbl09MDtyZXR1cm4gZX1mdW5jdGlvbiBmKGUsdCl7dmFyIG49dC5sZW5ndGg8MD8wOjB8aCh0Lmxlbmd0aCk7ZT1zKGUsbik7Zm9yKHZhciByPTA7cjxuO3IrPTEpZVtyXT0yNTUmdFtyXTtyZXR1cm4gZX1mdW5jdGlvbiBoKGUpe2lmKGU+PWkoKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweCIraSgpLnRvU3RyaW5nKDE2KSsiIGJ5dGVzIik7cmV0dXJuIDB8ZX1mdW5jdGlvbiBkKGUsdCl7aWYodS5pc0J1ZmZlcihlKSlyZXR1cm4gZS5sZW5ndGg7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmImZ1bmN0aW9uIj09dHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyYmKEFycmF5QnVmZmVyLmlzVmlldyhlKXx8ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSlyZXR1cm4gZS5ieXRlTGVuZ3RoOyJzdHJpbmciIT10eXBlb2YgZSYmKGU9IiIrZSk7dmFyIG49ZS5sZW5ndGg7aWYoMD09PW4pcmV0dXJuIDA7Zm9yKHZhciByPSExOzspc3dpdGNoKHQpe2Nhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIG47Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlIHZvaWQgMDpyZXR1cm4gcShlKS5sZW5ndGg7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiAyKm47Y2FzZSJoZXgiOnJldHVybiBuPj4+MTtjYXNlImJhc2U2NCI6cmV0dXJuIHooZSkubGVuZ3RoO2RlZmF1bHQ6aWYocilyZXR1cm4gcShlKS5sZW5ndGg7dD0oIiIrdCkudG9Mb3dlckNhc2UoKSxyPSEwfX1mdW5jdGlvbiBtKGUsdCxuKXt2YXIgcj0hMTtpZigodm9pZCAwPT09dHx8dDwwKSYmKHQ9MCksdD50aGlzLmxlbmd0aClyZXR1cm4iIjtpZigodm9pZCAwPT09bnx8bj50aGlzLmxlbmd0aCkmJihuPXRoaXMubGVuZ3RoKSxuPD0wKXJldHVybiIiO2lmKChuPj4+PTApPD0odD4+Pj0wKSlyZXR1cm4iIjtmb3IoZXx8KGU9InV0ZjgiKTs7KXN3aXRjaChlKXtjYXNlImhleCI6cmV0dXJuIFQodGhpcyx0LG4pO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIEEodGhpcyx0LG4pO2Nhc2UiYXNjaWkiOnJldHVybiBrKHRoaXMsdCxuKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBqKHRoaXMsdCxuKTtjYXNlImJhc2U2NCI6cmV0dXJuIEModGhpcyx0LG4pO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gSSh0aGlzLHQsbik7ZGVmYXVsdDppZihyKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrZSk7ZT0oZSsiIikudG9Mb3dlckNhc2UoKSxyPSEwfX1mdW5jdGlvbiB2KGUsdCxuKXt2YXIgcj1lW3RdO2VbdF09ZVtuXSxlW25dPXJ9ZnVuY3Rpb24gZyhlLHQsbixyLG8pe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4tMTtpZigic3RyaW5nIj09dHlwZW9mIG4/KHI9bixuPTApOm4+MjE0NzQ4MzY0Nz9uPTIxNDc0ODM2NDc6bjwtMjE0NzQ4MzY0OCYmKG49LTIxNDc0ODM2NDgpLG49K24saXNOYU4obikmJihuPW8/MDplLmxlbmd0aC0xKSxuPDAmJihuPWUubGVuZ3RoK24pLG4+PWUubGVuZ3RoKXtpZihvKXJldHVybi0xO249ZS5sZW5ndGgtMX1lbHNlIGlmKG48MCl7aWYoIW8pcmV0dXJuLTE7bj0wfWlmKCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dS5mcm9tKHQscikpLHUuaXNCdWZmZXIodCkpcmV0dXJuIDA9PT10Lmxlbmd0aD8tMTp5KGUsdCxuLHIsbyk7aWYoIm51bWJlciI9PXR5cGVvZiB0KXJldHVybiB0Jj0yNTUsdS5UWVBFRF9BUlJBWV9TVVBQT1JUJiYiZnVuY3Rpb24iPT10eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZj9vP1VpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChlLHQsbik6VWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChlLHQsbik6eShlLFt0XSxuLHIsbyk7dGhyb3cgbmV3IFR5cGVFcnJvcigidmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyIil9ZnVuY3Rpb24geShlLHQsbixyLG8pe3ZhciBhLGk9MSxzPWUubGVuZ3RoLHU9dC5sZW5ndGg7aWYodm9pZCAwIT09ciYmKCJ1Y3MyIj09PShyPVN0cmluZyhyKS50b0xvd2VyQ2FzZSgpKXx8InVjcy0yIj09PXJ8fCJ1dGYxNmxlIj09PXJ8fCJ1dGYtMTZsZSI9PT1yKSl7aWYoZS5sZW5ndGg8Mnx8dC5sZW5ndGg8MilyZXR1cm4tMTtpPTIscy89Mix1Lz0yLG4vPTJ9ZnVuY3Rpb24gYyhlLHQpe3JldHVybiAxPT09aT9lW3RdOmUucmVhZFVJbnQxNkJFKHQqaSl9aWYobyl7dmFyIGw9LTE7Zm9yKGE9bjthPHM7YSsrKWlmKGMoZSxhKT09PWModCwtMT09PWw/MDphLWwpKXtpZigtMT09PWwmJihsPWEpLGEtbCsxPT09dSlyZXR1cm4gbCppfWVsc2UtMSE9PWwmJihhLT1hLWwpLGw9LTF9ZWxzZSBmb3Iobit1PnMmJihuPXMtdSksYT1uO2E+PTA7YS0tKXtmb3IodmFyIHA9ITAsZj0wO2Y8dTtmKyspaWYoYyhlLGErZikhPT1jKHQsZikpe3A9ITE7YnJlYWt9aWYocClyZXR1cm4gYX1yZXR1cm4tMX1mdW5jdGlvbiBiKGUsdCxuLHIpe249TnVtYmVyKG4pfHwwO3ZhciBvPWUubGVuZ3RoLW47cj8ocj1OdW1iZXIocikpPm8mJihyPW8pOnI9bzt2YXIgYT10Lmxlbmd0aDtpZihhJTIhPTApdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBoZXggc3RyaW5nIik7cj5hLzImJihyPWEvMik7Zm9yKHZhciBpPTA7aTxyOysraSl7dmFyIHM9cGFyc2VJbnQodC5zdWJzdHIoMippLDIpLDE2KTtpZihpc05hTihzKSlyZXR1cm4gaTtlW24raV09c31yZXR1cm4gaX1mdW5jdGlvbiBfKGUsdCxuLHIpe3JldHVybiBWKHEodCxlLmxlbmd0aC1uKSxlLG4scil9ZnVuY3Rpb24gdyhlLHQsbixyKXtyZXR1cm4gVihmdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg7KytuKXQucHVzaCgyNTUmZS5jaGFyQ29kZUF0KG4pKTtyZXR1cm4gdH0odCksZSxuLHIpfWZ1bmN0aW9uIHgoZSx0LG4scil7cmV0dXJuIHcoZSx0LG4scil9ZnVuY3Rpb24gRShlLHQsbixyKXtyZXR1cm4gVih6KHQpLGUsbixyKX1mdW5jdGlvbiBTKGUsdCxuLHIpe3JldHVybiBWKGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuLHIsbyxhPVtdLGk9MDtpPGUubGVuZ3RoJiYhKCh0LT0yKTwwKTsrK2kpcj0obj1lLmNoYXJDb2RlQXQoaSkpPj44LG89biUyNTYsYS5wdXNoKG8pLGEucHVzaChyKTtyZXR1cm4gYX0odCxlLmxlbmd0aC1uKSxlLG4scil9ZnVuY3Rpb24gQyhlLHQsbil7cmV0dXJuIDA9PT10JiZuPT09ZS5sZW5ndGg/ci5mcm9tQnl0ZUFycmF5KGUpOnIuZnJvbUJ5dGVBcnJheShlLnNsaWNlKHQsbikpfWZ1bmN0aW9uIEEoZSx0LG4pe249TWF0aC5taW4oZS5sZW5ndGgsbik7Zm9yKHZhciByPVtdLG89dDtvPG47KXt2YXIgYSxpLHMsdSxjPWVbb10sbD1udWxsLHA9Yz4yMzk/NDpjPjIyMz8zOmM+MTkxPzI6MTtpZihvK3A8PW4pc3dpdGNoKHApe2Nhc2UgMTpjPDEyOCYmKGw9Yyk7YnJlYWs7Y2FzZSAyOjEyOD09KDE5MiYoYT1lW28rMV0pKSYmKHU9KDMxJmMpPDw2fDYzJmEpPjEyNyYmKGw9dSk7YnJlYWs7Y2FzZSAzOmE9ZVtvKzFdLGk9ZVtvKzJdLDEyOD09KDE5MiZhKSYmMTI4PT0oMTkyJmkpJiYodT0oMTUmYyk8PDEyfCg2MyZhKTw8Nnw2MyZpKT4yMDQ3JiYodTw1NTI5Nnx8dT41NzM0MykmJihsPXUpO2JyZWFrO2Nhc2UgNDphPWVbbysxXSxpPWVbbysyXSxzPWVbbyszXSwxMjg9PSgxOTImYSkmJjEyOD09KDE5MiZpKSYmMTI4PT0oMTkyJnMpJiYodT0oMTUmYyk8PDE4fCg2MyZhKTw8MTJ8KDYzJmkpPDw2fDYzJnMpPjY1NTM1JiZ1PDExMTQxMTImJihsPXUpfW51bGw9PT1sPyhsPTY1NTMzLHA9MSk6bD42NTUzNSYmKGwtPTY1NTM2LHIucHVzaChsPj4+MTAmMTAyM3w1NTI5NiksbD01NjMyMHwxMDIzJmwpLHIucHVzaChsKSxvKz1wfXJldHVybiBmdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aDtpZih0PD1PKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyxlKTt2YXIgbj0iIixyPTA7Zm9yKDtyPHQ7KW4rPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGUuc2xpY2UocixyKz1PKSk7cmV0dXJuIG59KHIpfXQuQnVmZmVyPXUsdC5TbG93QnVmZmVyPWZ1bmN0aW9uKGUpeytlIT1lJiYoZT0wKTtyZXR1cm4gdS5hbGxvYygrZSl9LHQuSU5TUEVDVF9NQVhfQllURVM9NTAsdS5UWVBFRF9BUlJBWV9TVVBQT1JUPXZvaWQgMCE9PWUuVFlQRURfQVJSQVlfU1VQUE9SVD9lLlRZUEVEX0FSUkFZX1NVUFBPUlQ6ZnVuY3Rpb24oKXt0cnl7dmFyIGU9bmV3IFVpbnQ4QXJyYXkoMSk7cmV0dXJuIGUuX19wcm90b19fPXtfX3Byb3RvX186VWludDhBcnJheS5wcm90b3R5cGUsZm9vOmZ1bmN0aW9uKCl7cmV0dXJuIDQyfX0sNDI9PT1lLmZvbygpJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5zdWJhcnJheSYmMD09PWUuc3ViYXJyYXkoMSwxKS5ieXRlTGVuZ3RofWNhdGNoKGUpe3JldHVybiExfX0oKSx0LmtNYXhMZW5ndGg9aSgpLHUucG9vbFNpemU9ODE5Mix1Ll9hdWdtZW50PWZ1bmN0aW9uKGUpe3JldHVybiBlLl9fcHJvdG9fXz11LnByb3RvdHlwZSxlfSx1LmZyb209ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBjKG51bGwsZSx0LG4pfSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQmJih1LnByb3RvdHlwZS5fX3Byb3RvX189VWludDhBcnJheS5wcm90b3R5cGUsdS5fX3Byb3RvX189VWludDhBcnJheSwidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnNwZWNpZXMmJnVbU3ltYm9sLnNwZWNpZXNdPT09dSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHUsU3ltYm9sLnNwZWNpZXMse3ZhbHVlOm51bGwsY29uZmlndXJhYmxlOiEwfSkpLHUuYWxsb2M9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gbCh0KSx0PD0wP3MoZSx0KTp2b2lkIDAhPT1uPyJzdHJpbmciPT10eXBlb2Ygcj9zKGUsdCkuZmlsbChuLHIpOnMoZSx0KS5maWxsKG4pOnMoZSx0KX0obnVsbCxlLHQsbil9LHUuYWxsb2NVbnNhZmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHAobnVsbCxlKX0sdS5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24oZSl7cmV0dXJuIHAobnVsbCxlKX0sdS5pc0J1ZmZlcj1mdW5jdGlvbihlKXtyZXR1cm4hKG51bGw9PWV8fCFlLl9pc0J1ZmZlcil9LHUuY29tcGFyZT1mdW5jdGlvbihlLHQpe2lmKCF1LmlzQnVmZmVyKGUpfHwhdS5pc0J1ZmZlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzIik7aWYoZT09PXQpcmV0dXJuIDA7Zm9yKHZhciBuPWUubGVuZ3RoLHI9dC5sZW5ndGgsbz0wLGE9TWF0aC5taW4obixyKTtvPGE7KytvKWlmKGVbb10hPT10W29dKXtuPWVbb10scj10W29dO2JyZWFrfXJldHVybiBuPHI/LTE6cjxuPzE6MH0sdS5pc0VuY29kaW5nPWZ1bmN0aW9uKGUpe3N3aXRjaChTdHJpbmcoZSkudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fSx1LmNvbmNhdD1mdW5jdGlvbihlLHQpe2lmKCFhKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIHUuYWxsb2MoMCk7dmFyIG47aWYodm9pZCAwPT09dClmb3IodD0wLG49MDtuPGUubGVuZ3RoOysrbil0Kz1lW25dLmxlbmd0aDt2YXIgcj11LmFsbG9jVW5zYWZlKHQpLG89MDtmb3Iobj0wO248ZS5sZW5ndGg7KytuKXt2YXIgaT1lW25dO2lmKCF1LmlzQnVmZmVyKGkpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtpLmNvcHkocixvKSxvKz1pLmxlbmd0aH1yZXR1cm4gcn0sdS5ieXRlTGVuZ3RoPWQsdS5wcm90b3R5cGUuX2lzQnVmZmVyPSEwLHUucHJvdG90eXBlLnN3YXAxNj1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlMiE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9Mil2KHRoaXMsdCx0KzEpO3JldHVybiB0aGlzfSx1LnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlbmd0aDtpZihlJTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKHZhciB0PTA7dDxlO3QrPTQpdih0aGlzLHQsdCszKSx2KHRoaXMsdCsxLHQrMik7cmV0dXJuIHRoaXN9LHUucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlOCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9OCl2KHRoaXMsdCx0KzcpLHYodGhpcyx0KzEsdCs2KSx2KHRoaXMsdCsyLHQrNSksdih0aGlzLHQrMyx0KzQpO3JldHVybiB0aGlzfSx1LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBlPTB8dGhpcy5sZW5ndGg7cmV0dXJuIDA9PT1lPyIiOjA9PT1hcmd1bWVudHMubGVuZ3RoP0EodGhpcywwLGUpOm0uYXBwbHkodGhpcyxhcmd1bWVudHMpfSx1LnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24oZSl7aWYoIXUuaXNCdWZmZXIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO3JldHVybiB0aGlzPT09ZXx8MD09PXUuY29tcGFyZSh0aGlzLGUpfSx1LnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7dmFyIGU9IiIsbj10LklOU1BFQ1RfTUFYX0JZVEVTO3JldHVybiB0aGlzLmxlbmd0aD4wJiYoZT10aGlzLnRvU3RyaW5nKCJoZXgiLDAsbikubWF0Y2goLy57Mn0vZykuam9pbigiICIpLHRoaXMubGVuZ3RoPm4mJihlKz0iIC4uLiAiKSksIjxCdWZmZXIgIitlKyI+In0sdS5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbihlLHQsbixyLG8pe2lmKCF1LmlzQnVmZmVyKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtpZih2b2lkIDA9PT10JiYodD0wKSx2b2lkIDA9PT1uJiYobj1lP2UubGVuZ3RoOjApLHZvaWQgMD09PXImJihyPTApLHZvaWQgMD09PW8mJihvPXRoaXMubGVuZ3RoKSx0PDB8fG4+ZS5sZW5ndGh8fHI8MHx8bz50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib3V0IG9mIHJhbmdlIGluZGV4Iik7aWYocj49byYmdD49bilyZXR1cm4gMDtpZihyPj1vKXJldHVybi0xO2lmKHQ+PW4pcmV0dXJuIDE7aWYodGhpcz09PWUpcmV0dXJuIDA7Zm9yKHZhciBhPShvPj4+PTApLShyPj4+PTApLGk9KG4+Pj49MCktKHQ+Pj49MCkscz1NYXRoLm1pbihhLGkpLGM9dGhpcy5zbGljZShyLG8pLGw9ZS5zbGljZSh0LG4pLHA9MDtwPHM7KytwKWlmKGNbcF0hPT1sW3BdKXthPWNbcF0saT1sW3BdO2JyZWFrfXJldHVybiBhPGk/LTE6aTxhPzE6MH0sdS5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24oZSx0LG4pe3JldHVybi0xIT09dGhpcy5pbmRleE9mKGUsdCxuKX0sdS5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGcodGhpcyxlLHQsbiwhMCl9LHUucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZyh0aGlzLGUsdCxuLCExKX0sdS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24oZSx0LG4scil7aWYodm9pZCAwPT09dClyPSJ1dGY4IixuPXRoaXMubGVuZ3RoLHQ9MDtlbHNlIGlmKHZvaWQgMD09PW4mJiJzdHJpbmciPT10eXBlb2YgdClyPXQsbj10aGlzLmxlbmd0aCx0PTA7ZWxzZXtpZighaXNGaW5pdGUodCkpdGhyb3cgbmV3IEVycm9yKCJCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCIpO3R8PTAsaXNGaW5pdGUobik/KG58PTAsdm9pZCAwPT09ciYmKHI9InV0ZjgiKSk6KHI9bixuPXZvaWQgMCl9dmFyIG89dGhpcy5sZW5ndGgtdDtpZigodm9pZCAwPT09bnx8bj5vKSYmKG49byksZS5sZW5ndGg+MCYmKG48MHx8dDwwKXx8dD50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMiKTtyfHwocj0idXRmOCIpO2Zvcih2YXIgYT0hMTs7KXN3aXRjaChyKXtjYXNlImhleCI6cmV0dXJuIGIodGhpcyxlLHQsbik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gXyh0aGlzLGUsdCxuKTtjYXNlImFzY2lpIjpyZXR1cm4gdyh0aGlzLGUsdCxuKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiB4KHRoaXMsZSx0LG4pO2Nhc2UiYmFzZTY0IjpyZXR1cm4gRSh0aGlzLGUsdCxuKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIFModGhpcyxlLHQsbik7ZGVmYXVsdDppZihhKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrcik7cj0oIiIrcikudG9Mb3dlckNhc2UoKSxhPSEwfX0sdS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IkJ1ZmZlciIsZGF0YTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnJ8fHRoaXMsMCl9fTt2YXIgTz00MDk2O2Z1bmN0aW9uIGsoZSx0LG4pe3ZhciByPSIiO249TWF0aC5taW4oZS5sZW5ndGgsbik7Zm9yKHZhciBvPXQ7bzxuOysrbylyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyNyZlW29dKTtyZXR1cm4gcn1mdW5jdGlvbiBqKGUsdCxuKXt2YXIgcj0iIjtuPU1hdGgubWluKGUubGVuZ3RoLG4pO2Zvcih2YXIgbz10O288bjsrK28pcis9U3RyaW5nLmZyb21DaGFyQ29kZShlW29dKTtyZXR1cm4gcn1mdW5jdGlvbiBUKGUsdCxuKXt2YXIgcj1lLmxlbmd0aDsoIXR8fHQ8MCkmJih0PTApLCghbnx8bjwwfHxuPnIpJiYobj1yKTtmb3IodmFyIG89IiIsYT10O2E8bjsrK2Epbys9VShlW2FdKTtyZXR1cm4gb31mdW5jdGlvbiBJKGUsdCxuKXtmb3IodmFyIHI9ZS5zbGljZSh0LG4pLG89IiIsYT0wO2E8ci5sZW5ndGg7YSs9MilvKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHJbYV0rMjU2KnJbYSsxXSk7cmV0dXJuIG99ZnVuY3Rpb24gUChlLHQsbil7aWYoZSUxIT0wfHxlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm9mZnNldCBpcyBub3QgdWludCIpO2lmKGUrdD5uKXRocm93IG5ldyBSYW5nZUVycm9yKCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoIil9ZnVuY3Rpb24gTihlLHQsbixyLG8sYSl7aWYoIXUuaXNCdWZmZXIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKHQ+b3x8dDxhKXRocm93IG5ldyBSYW5nZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtpZihuK3I+ZS5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIE0oZSx0LG4scil7dDwwJiYodD02NTUzNSt0KzEpO2Zvcih2YXIgbz0wLGE9TWF0aC5taW4oZS5sZW5ndGgtbiwyKTtvPGE7KytvKWVbbitvXT0odCYyNTU8PDgqKHI/bzoxLW8pKT4+PjgqKHI/bzoxLW8pfWZ1bmN0aW9uIFIoZSx0LG4scil7dDwwJiYodD00Mjk0OTY3Mjk1K3QrMSk7Zm9yKHZhciBvPTAsYT1NYXRoLm1pbihlLmxlbmd0aC1uLDQpO288YTsrK28pZVtuK29dPXQ+Pj44KihyP286My1vKSYyNTV9ZnVuY3Rpb24gRChlLHQsbixyLG8sYSl7aWYobityPmUubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIEwoZSx0LG4scixhKXtyZXR1cm4gYXx8RChlLDAsbiw0KSxvLndyaXRlKGUsdCxuLHIsMjMsNCksbis0fWZ1bmN0aW9uIEIoZSx0LG4scixhKXtyZXR1cm4gYXx8RChlLDAsbiw4KSxvLndyaXRlKGUsdCxuLHIsNTIsOCksbis4fXUucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj10aGlzLmxlbmd0aDtpZigoZT1+fmUpPDA/KGUrPXIpPDAmJihlPTApOmU+ciYmKGU9ciksKHQ9dm9pZCAwPT09dD9yOn5+dCk8MD8odCs9cik8MCYmKHQ9MCk6dD5yJiYodD1yKSx0PGUmJih0PWUpLHUuVFlQRURfQVJSQVlfU1VQUE9SVCkobj10aGlzLnN1YmFycmF5KGUsdCkpLl9fcHJvdG9fXz11LnByb3RvdHlwZTtlbHNle3ZhciBvPXQtZTtuPW5ldyB1KG8sdm9pZCAwKTtmb3IodmFyIGE9MDthPG87KythKW5bYV09dGhpc1thK2VdfXJldHVybiBufSx1LnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uKGUsdCxuKXtlfD0wLHR8PTAsbnx8UChlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW2VdLG89MSxhPTA7KythPHQmJihvKj0yNTYpOylyKz10aGlzW2UrYV0qbztyZXR1cm4gcn0sdS5wcm90b3R5cGUucmVhZFVJbnRCRT1mdW5jdGlvbihlLHQsbil7ZXw9MCx0fD0wLG58fFAoZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dGhpc1tlKy0tdF0sbz0xO3Q+MCYmKG8qPTI1Nik7KXIrPXRoaXNbZSstLXRdKm87cmV0dXJuIHJ9LHUucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxQKGUsMSx0aGlzLmxlbmd0aCksdGhpc1tlXX0sdS5wcm90b3R5cGUucmVhZFVJbnQxNkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fFAoZSwyLHRoaXMubGVuZ3RoKSx0aGlzW2VdfHRoaXNbZSsxXTw8OH0sdS5wcm90b3R5cGUucmVhZFVJbnQxNkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fFAoZSwyLHRoaXMubGVuZ3RoKSx0aGlzW2VdPDw4fHRoaXNbZSsxXX0sdS5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fFAoZSw0LHRoaXMubGVuZ3RoKSwodGhpc1tlXXx0aGlzW2UrMV08PDh8dGhpc1tlKzJdPDwxNikrMTY3NzcyMTYqdGhpc1tlKzNdfSx1LnByb3RvdHlwZS5yZWFkVUludDMyQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8UChlLDQsdGhpcy5sZW5ndGgpLDE2Nzc3MjE2KnRoaXNbZV0rKHRoaXNbZSsxXTw8MTZ8dGhpc1tlKzJdPDw4fHRoaXNbZSszXSl9LHUucHJvdG90eXBlLnJlYWRJbnRMRT1mdW5jdGlvbihlLHQsbil7ZXw9MCx0fD0wLG58fFAoZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dGhpc1tlXSxvPTEsYT0wOysrYTx0JiYobyo9MjU2KTspcis9dGhpc1tlK2FdKm87cmV0dXJuIHI+PShvKj0xMjgpJiYoci09TWF0aC5wb3coMiw4KnQpKSxyfSx1LnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24oZSx0LG4pe2V8PTAsdHw9MCxufHxQKGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXQsbz0xLGE9dGhpc1tlKy0tcl07cj4wJiYobyo9MjU2KTspYSs9dGhpc1tlKy0tcl0qbztyZXR1cm4gYT49KG8qPTEyOCkmJihhLT1NYXRoLnBvdygyLDgqdCkpLGF9LHUucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fFAoZSwxLHRoaXMubGVuZ3RoKSwxMjgmdGhpc1tlXT8tMSooMjU1LXRoaXNbZV0rMSk6dGhpc1tlXX0sdS5wcm90b3R5cGUucmVhZEludDE2TEU9ZnVuY3Rpb24oZSx0KXt0fHxQKGUsMix0aGlzLmxlbmd0aCk7dmFyIG49dGhpc1tlXXx0aGlzW2UrMV08PDg7cmV0dXJuIDMyNzY4Jm4/NDI5NDkwMTc2MHxuOm59LHUucHJvdG90eXBlLnJlYWRJbnQxNkJFPWZ1bmN0aW9uKGUsdCl7dHx8UChlLDIsdGhpcy5sZW5ndGgpO3ZhciBuPXRoaXNbZSsxXXx0aGlzW2VdPDw4O3JldHVybiAzMjc2OCZuPzQyOTQ5MDE3NjB8bjpufSx1LnByb3RvdHlwZS5yZWFkSW50MzJMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxQKGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXXx0aGlzW2UrMV08PDh8dGhpc1tlKzJdPDwxNnx0aGlzW2UrM108PDI0fSx1LnByb3RvdHlwZS5yZWFkSW50MzJCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxQKGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXTw8MjR8dGhpc1tlKzFdPDwxNnx0aGlzW2UrMl08PDh8dGhpc1tlKzNdfSx1LnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxQKGUsNCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsZSwhMCwyMyw0KX0sdS5wcm90b3R5cGUucmVhZEZsb2F0QkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8UChlLDQsdGhpcy5sZW5ndGgpLG8ucmVhZCh0aGlzLGUsITEsMjMsNCl9LHUucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxQKGUsOCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsZSwhMCw1Miw4KX0sdS5wcm90b3R5cGUucmVhZERvdWJsZUJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fFAoZSw4LHRoaXMubGVuZ3RoKSxvLnJlYWQodGhpcyxlLCExLDUyLDgpfSx1LnByb3RvdHlwZS53cml0ZVVJbnRMRT1mdW5jdGlvbihlLHQsbixyKXsoZT0rZSx0fD0wLG58PTAscil8fE4odGhpcyxlLHQsbixNYXRoLnBvdygyLDgqbiktMSwwKTt2YXIgbz0xLGE9MDtmb3IodGhpc1t0XT0yNTUmZTsrK2E8biYmKG8qPTI1Nik7KXRoaXNbdCthXT1lL28mMjU1O3JldHVybiB0K259LHUucHJvdG90eXBlLndyaXRlVUludEJFPWZ1bmN0aW9uKGUsdCxuLHIpeyhlPStlLHR8PTAsbnw9MCxyKXx8Tih0aGlzLGUsdCxuLE1hdGgucG93KDIsOCpuKS0xLDApO3ZhciBvPW4tMSxhPTE7Zm9yKHRoaXNbdCtvXT0yNTUmZTstLW8+PTAmJihhKj0yNTYpOyl0aGlzW3Qrb109ZS9hJjI1NTtyZXR1cm4gdCtufSx1LnByb3RvdHlwZS53cml0ZVVJbnQ4PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fE4odGhpcyxlLHQsMSwyNTUsMCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUfHwoZT1NYXRoLmZsb29yKGUpKSx0aGlzW3RdPTI1NSZlLHQrMX0sdS5wcm90b3R5cGUud3JpdGVVSW50MTZMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxOKHRoaXMsZSx0LDIsNjU1MzUsMCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCk6TSh0aGlzLGUsdCwhMCksdCsyfSx1LnByb3RvdHlwZS53cml0ZVVJbnQxNkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fE4odGhpcyxlLHQsMiw2NTUzNSwwKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjgsdGhpc1t0KzFdPTI1NSZlKTpNKHRoaXMsZSx0LCExKSx0KzJ9LHUucHJvdG90eXBlLndyaXRlVUludDMyTEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8Tih0aGlzLGUsdCw0LDQyOTQ5NjcyOTUsMCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3QrM109ZT4+PjI0LHRoaXNbdCsyXT1lPj4+MTYsdGhpc1t0KzFdPWU+Pj44LHRoaXNbdF09MjU1JmUpOlIodGhpcyxlLHQsITApLHQrNH0sdS5wcm90b3R5cGUud3JpdGVVSW50MzJCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxOKHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSx1LlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjI0LHRoaXNbdCsxXT1lPj4+MTYsdGhpc1t0KzJdPWU+Pj44LHRoaXNbdCszXT0yNTUmZSk6Uih0aGlzLGUsdCwhMSksdCs0fSx1LnByb3RvdHlwZS53cml0ZUludExFPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9K2UsdHw9MCwhcil7dmFyIG89TWF0aC5wb3coMiw4Km4tMSk7Tih0aGlzLGUsdCxuLG8tMSwtbyl9dmFyIGE9MCxpPTEscz0wO2Zvcih0aGlzW3RdPTI1NSZlOysrYTxuJiYoaSo9MjU2KTspZTwwJiYwPT09cyYmMCE9PXRoaXNbdCthLTFdJiYocz0xKSx0aGlzW3QrYV09KGUvaT4+MCktcyYyNTU7cmV0dXJuIHQrbn0sdS5wcm90b3R5cGUud3JpdGVJbnRCRT1mdW5jdGlvbihlLHQsbixyKXtpZihlPStlLHR8PTAsIXIpe3ZhciBvPU1hdGgucG93KDIsOCpuLTEpO04odGhpcyxlLHQsbixvLTEsLW8pfXZhciBhPW4tMSxpPTEscz0wO2Zvcih0aGlzW3QrYV09MjU1JmU7LS1hPj0wJiYoaSo9MjU2KTspZTwwJiYwPT09cyYmMCE9PXRoaXNbdCthKzFdJiYocz0xKSx0aGlzW3QrYV09KGUvaT4+MCktcyYyNTU7cmV0dXJuIHQrbn0sdS5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fE4odGhpcyxlLHQsMSwxMjcsLTEyOCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUfHwoZT1NYXRoLmZsb29yKGUpKSxlPDAmJihlPTI1NStlKzEpLHRoaXNbdF09MjU1JmUsdCsxfSx1LnByb3RvdHlwZS53cml0ZUludDE2TEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8Tih0aGlzLGUsdCwyLDMyNzY3LC0zMjc2OCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCk6TSh0aGlzLGUsdCwhMCksdCsyfSx1LnByb3RvdHlwZS53cml0ZUludDE2QkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8Tih0aGlzLGUsdCwyLDMyNzY3LC0zMjc2OCksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj44LHRoaXNbdCsxXT0yNTUmZSk6TSh0aGlzLGUsdCwhMSksdCsyfSx1LnByb3RvdHlwZS53cml0ZUludDMyTEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8Tih0aGlzLGUsdCw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLHUuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT0yNTUmZSx0aGlzW3QrMV09ZT4+PjgsdGhpc1t0KzJdPWU+Pj4xNix0aGlzW3QrM109ZT4+PjI0KTpSKHRoaXMsZSx0LCEwKSx0KzR9LHUucHJvdG90eXBlLndyaXRlSW50MzJCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxOKHRoaXMsZSx0LDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksZTwwJiYoZT00Mjk0OTY3Mjk1K2UrMSksdS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPWU+Pj4yNCx0aGlzW3QrMV09ZT4+PjE2LHRoaXNbdCsyXT1lPj4+OCx0aGlzW3QrM109MjU1JmUpOlIodGhpcyxlLHQsITEpLHQrNH0sdS5wcm90b3R5cGUud3JpdGVGbG9hdExFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gTCh0aGlzLGUsdCwhMCxuKX0sdS5wcm90b3R5cGUud3JpdGVGbG9hdEJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gTCh0aGlzLGUsdCwhMSxuKX0sdS5wcm90b3R5cGUud3JpdGVEb3VibGVMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIEIodGhpcyxlLHQsITAsbil9LHUucHJvdG90eXBlLndyaXRlRG91YmxlQkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBCKHRoaXMsZSx0LCExLG4pfSx1LnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGUsdCxuLHIpe2lmKG58fChuPTApLHJ8fDA9PT1yfHwocj10aGlzLmxlbmd0aCksdD49ZS5sZW5ndGgmJih0PWUubGVuZ3RoKSx0fHwodD0wKSxyPjAmJnI8biYmKHI9bikscj09PW4pcmV0dXJuIDA7aWYoMD09PWUubGVuZ3RofHwwPT09dGhpcy5sZW5ndGgpcmV0dXJuIDA7aWYodDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJ0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzIik7aWYobjwwfHxuPj10aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKHI8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlRW5kIG91dCBvZiBib3VuZHMiKTtyPnRoaXMubGVuZ3RoJiYocj10aGlzLmxlbmd0aCksZS5sZW5ndGgtdDxyLW4mJihyPWUubGVuZ3RoLXQrbik7dmFyIG8sYT1yLW47aWYodGhpcz09PWUmJm48dCYmdDxyKWZvcihvPWEtMTtvPj0wOy0tbyllW28rdF09dGhpc1tvK25dO2Vsc2UgaWYoYTwxZTN8fCF1LlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKG89MDtvPGE7KytvKWVbbyt0XT10aGlzW28rbl07ZWxzZSBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChlLHRoaXMuc3ViYXJyYXkobixuK2EpLHQpO3JldHVybiBhfSx1LnByb3RvdHlwZS5maWxsPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKCJzdHJpbmciPT10eXBlb2YgZSl7aWYoInN0cmluZyI9PXR5cGVvZiB0PyhyPXQsdD0wLG49dGhpcy5sZW5ndGgpOiJzdHJpbmciPT10eXBlb2YgbiYmKHI9bixuPXRoaXMubGVuZ3RoKSwxPT09ZS5sZW5ndGgpe3ZhciBvPWUuY2hhckNvZGVBdCgwKTtvPDI1NiYmKGU9byl9aWYodm9pZCAwIT09ciYmInN0cmluZyIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoImVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmciKTtpZigic3RyaW5nIj09dHlwZW9mIHImJiF1LmlzRW5jb2RpbmcocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIityKX1lbHNlIm51bWJlciI9PXR5cGVvZiBlJiYoZSY9MjU1KTtpZih0PDB8fHRoaXMubGVuZ3RoPHR8fHRoaXMubGVuZ3RoPG4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk91dCBvZiByYW5nZSBpbmRleCIpO2lmKG48PXQpcmV0dXJuIHRoaXM7dmFyIGE7aWYodD4+Pj0wLG49dm9pZCAwPT09bj90aGlzLmxlbmd0aDpuPj4+MCxlfHwoZT0wKSwibnVtYmVyIj09dHlwZW9mIGUpZm9yKGE9dDthPG47KythKXRoaXNbYV09ZTtlbHNle3ZhciBpPXUuaXNCdWZmZXIoZSk/ZTpxKG5ldyB1KGUscikudG9TdHJpbmcoKSkscz1pLmxlbmd0aDtmb3IoYT0wO2E8bi10OysrYSl0aGlzW2ErdF09aVthJXNdfXJldHVybiB0aGlzfTt2YXIgRj0vW14rXC8wLTlBLVphLXotX10vZztmdW5jdGlvbiBVKGUpe3JldHVybiBlPDE2PyIwIitlLnRvU3RyaW5nKDE2KTplLnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBxKGUsdCl7dmFyIG47dD10fHwxLzA7Zm9yKHZhciByPWUubGVuZ3RoLG89bnVsbCxhPVtdLGk9MDtpPHI7KytpKXtpZigobj1lLmNoYXJDb2RlQXQoaSkpPjU1Mjk1JiZuPDU3MzQ0KXtpZighbyl7aWYobj41NjMxOSl7KHQtPTMpPi0xJiZhLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWlmKGkrMT09PXIpeyh0LT0zKT4tMSYmYS5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1vPW47Y29udGludWV9aWYobjw1NjMyMCl7KHQtPTMpPi0xJiZhLnB1c2goMjM5LDE5MSwxODkpLG89bjtjb250aW51ZX1uPTY1NTM2KyhvLTU1Mjk2PDwxMHxuLTU2MzIwKX1lbHNlIG8mJih0LT0zKT4tMSYmYS5wdXNoKDIzOSwxOTEsMTg5KTtpZihvPW51bGwsbjwxMjgpe2lmKCh0LT0xKTwwKWJyZWFrO2EucHVzaChuKX1lbHNlIGlmKG48MjA0OCl7aWYoKHQtPTIpPDApYnJlYWs7YS5wdXNoKG4+PjZ8MTkyLDYzJm58MTI4KX1lbHNlIGlmKG48NjU1MzYpe2lmKCh0LT0zKTwwKWJyZWFrO2EucHVzaChuPj4xMnwyMjQsbj4+NiY2M3wxMjgsNjMmbnwxMjgpfWVsc2V7aWYoIShuPDExMTQxMTIpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb2RlIHBvaW50Iik7aWYoKHQtPTQpPDApYnJlYWs7YS5wdXNoKG4+PjE4fDI0MCxuPj4xMiY2M3wxMjgsbj4+NiY2M3wxMjgsNjMmbnwxMjgpfX1yZXR1cm4gYX1mdW5jdGlvbiB6KGUpe3JldHVybiByLnRvQnl0ZUFycmF5KGZ1bmN0aW9uKGUpe2lmKChlPWZ1bmN0aW9uKGUpe3JldHVybiBlLnRyaW0/ZS50cmltKCk6ZS5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9KGUpLnJlcGxhY2UoRiwiIikpLmxlbmd0aDwyKXJldHVybiIiO2Zvcig7ZS5sZW5ndGglNCE9MDspZSs9Ij0iO3JldHVybiBlfShlKSl9ZnVuY3Rpb24gVihlLHQsbixyKXtmb3IodmFyIG89MDtvPHImJiEobytuPj10Lmxlbmd0aHx8bz49ZS5sZW5ndGgpOysrbyl0W28rbl09ZVtvXTtyZXR1cm4gb319KS5jYWxsKHRoaXMsbig1MSkpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzgpLG89bigzODIpLGE9big2MDQpLGk9big2MDkpLHM9bigxMzQpLHU9big2MTApLGM9big2MTQpLGw9big2MTUpLHA9big2MTcpLGY9cy5jcmVhdGVFbGVtZW50LGg9cy5jcmVhdGVGYWN0b3J5LGQ9cy5jbG9uZUVsZW1lbnQsbT1yLHY9e0NoaWxkcmVuOnttYXA6YS5tYXAsZm9yRWFjaDphLmZvckVhY2gsY291bnQ6YS5jb3VudCx0b0FycmF5OmEudG9BcnJheSxvbmx5OnB9LENvbXBvbmVudDpvLkNvbXBvbmVudCxQdXJlQ29tcG9uZW50Om8uUHVyZUNvbXBvbmVudCxjcmVhdGVFbGVtZW50OmYsY2xvbmVFbGVtZW50OmQsaXNWYWxpZEVsZW1lbnQ6cy5pc1ZhbGlkRWxlbWVudCxQcm9wVHlwZXM6dSxjcmVhdGVDbGFzczpsLGNyZWF0ZUZhY3Rvcnk6aCxjcmVhdGVNaXhpbjpmdW5jdGlvbihlKXtyZXR1cm4gZX0sRE9NOmksdmVyc2lvbjpjLF9fc3ByZWFkOm19O2UuZXhwb3J0cz12fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzgpLG89big4NyksYT0obigzNCksbigzODQpLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpLGk9bigzODUpLHM9e2tleTohMCxyZWY6ITAsX19zZWxmOiEwLF9fc291cmNlOiEwfTtmdW5jdGlvbiB1KGUpe3JldHVybiB2b2lkIDAhPT1lLnJlZn1mdW5jdGlvbiBjKGUpe3JldHVybiB2b2lkIDAhPT1lLmtleX12YXIgbD1mdW5jdGlvbihlLHQsbixyLG8sYSxzKXtyZXR1cm57JCR0eXBlb2Y6aSx0eXBlOmUsa2V5OnQscmVmOm4scHJvcHM6cyxfb3duZXI6YX19O2wuY3JlYXRlRWxlbWVudD1mdW5jdGlvbihlLHQsbil7dmFyIHIsaT17fSxwPW51bGwsZj1udWxsO2lmKG51bGwhPXQpZm9yKHIgaW4gdSh0KSYmKGY9dC5yZWYpLGModCkmJihwPSIiK3Qua2V5KSx2b2lkIDA9PT10Ll9fc2VsZj9udWxsOnQuX19zZWxmLHZvaWQgMD09PXQuX19zb3VyY2U/bnVsbDp0Ll9fc291cmNlLHQpYS5jYWxsKHQscikmJiFzLmhhc093blByb3BlcnR5KHIpJiYoaVtyXT10W3JdKTt2YXIgaD1hcmd1bWVudHMubGVuZ3RoLTI7aWYoMT09PWgpaS5jaGlsZHJlbj1uO2Vsc2UgaWYoaD4xKXtmb3IodmFyIGQ9QXJyYXkoaCksbT0wO208aDttKyspZFttXT1hcmd1bWVudHNbbSsyXTswLGkuY2hpbGRyZW49ZH1pZihlJiZlLmRlZmF1bHRQcm9wcyl7dmFyIHY9ZS5kZWZhdWx0UHJvcHM7Zm9yKHIgaW4gdil2b2lkIDA9PT1pW3JdJiYoaVtyXT12W3JdKX1yZXR1cm4gbChlLHAsZiwwLDAsby5jdXJyZW50LGkpfSxsLmNyZWF0ZUZhY3Rvcnk9ZnVuY3Rpb24oZSl7dmFyIHQ9bC5jcmVhdGVFbGVtZW50LmJpbmQobnVsbCxlKTtyZXR1cm4gdC50eXBlPWUsdH0sbC5jbG9uZUFuZFJlcGxhY2VLZXk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbChlLnR5cGUsdCxlLnJlZixlLl9zZWxmLGUuX3NvdXJjZSxlLl9vd25lcixlLnByb3BzKX0sbC5jbG9uZUVsZW1lbnQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpLHAsZj1yKHt9LGUucHJvcHMpLGg9ZS5rZXksZD1lLnJlZixtPShlLl9zZWxmLGUuX3NvdXJjZSxlLl9vd25lcik7aWYobnVsbCE9dClmb3IoaSBpbiB1KHQpJiYoZD10LnJlZixtPW8uY3VycmVudCksYyh0KSYmKGg9IiIrdC5rZXkpLGUudHlwZSYmZS50eXBlLmRlZmF1bHRQcm9wcyYmKHA9ZS50eXBlLmRlZmF1bHRQcm9wcyksdClhLmNhbGwodCxpKSYmIXMuaGFzT3duUHJvcGVydHkoaSkmJih2b2lkIDA9PT10W2ldJiZ2b2lkIDAhPT1wP2ZbaV09cFtpXTpmW2ldPXRbaV0pO3ZhciB2PWFyZ3VtZW50cy5sZW5ndGgtMjtpZigxPT09dilmLmNoaWxkcmVuPW47ZWxzZSBpZih2PjEpe2Zvcih2YXIgZz1BcnJheSh2KSx5PTA7eTx2O3krKylnW3ldPWFyZ3VtZW50c1t5KzJdO2YuY2hpbGRyZW49Z31yZXR1cm4gbChlLnR5cGUsaCxkLDAsMCxtLGYpfSxsLmlzVmFsaWRFbGVtZW50PWZ1bmN0aW9uKGUpe3JldHVybiJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9PWUmJmUuJCR0eXBlb2Y9PT1pfSxlLmV4cG9ydHM9bH0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNzEpLlN5bWJvbDtlLmV4cG9ydHM9cn0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNDE4KSxvPW4oNDE5KSxhPW4oMTM3KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGEoZSk/cihlKTpvKGUpfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTcxKSxvPW4oMjQ4KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWUmJm8oZS5sZW5ndGgpJiYhcihlKX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDE4OCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZXx8cihlKSlyZXR1cm4gZTt2YXIgdD1lKyIiO3JldHVybiIwIj09dCYmMS9lPT0tSW5maW5pdHk/Ii0wIjp0fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDExNyk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKCFyKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCB1c2UgbnVsbCBvciB1bmRlZmluZWQiKTtyZXR1cm4gZX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDY0KS5CdWZmZXI7ZnVuY3Rpb24gbyhlLHQpe3RoaXMuX2Jsb2NrPXIuYWxsb2MoZSksdGhpcy5fZmluYWxTaXplPXQsdGhpcy5fYmxvY2tTaXplPWUsdGhpcy5fbGVuPTB9by5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUsdCl7InN0cmluZyI9PXR5cGVvZiBlJiYodD10fHwidXRmOCIsZT1yLmZyb20oZSx0KSk7Zm9yKHZhciBuPXRoaXMuX2Jsb2NrLG89dGhpcy5fYmxvY2tTaXplLGE9ZS5sZW5ndGgsaT10aGlzLl9sZW4scz0wO3M8YTspe2Zvcih2YXIgdT1pJW8sYz1NYXRoLm1pbihhLXMsby11KSxsPTA7bDxjO2wrKyluW3UrbF09ZVtzK2xdO3MrPWMsKGkrPWMpJW89PTAmJnRoaXMuX3VwZGF0ZShuKX1yZXR1cm4gdGhpcy5fbGVuKz1hLHRoaXN9LG8ucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9sZW4ldGhpcy5fYmxvY2tTaXplO3RoaXMuX2Jsb2NrW3RdPTEyOCx0aGlzLl9ibG9jay5maWxsKDAsdCsxKSx0Pj10aGlzLl9maW5hbFNpemUmJih0aGlzLl91cGRhdGUodGhpcy5fYmxvY2spLHRoaXMuX2Jsb2NrLmZpbGwoMCkpO3ZhciBuPTgqdGhpcy5fbGVuO2lmKG48PTQyOTQ5NjcyOTUpdGhpcy5fYmxvY2sud3JpdGVVSW50MzJCRShuLHRoaXMuX2Jsb2NrU2l6ZS00KTtlbHNle3ZhciByPSg0Mjk0OTY3Mjk1Jm4pPj4+MCxvPShuLXIpLzQyOTQ5NjcyOTY7dGhpcy5fYmxvY2sud3JpdGVVSW50MzJCRShvLHRoaXMuX2Jsb2NrU2l6ZS04KSx0aGlzLl9ibG9jay53cml0ZVVJbnQzMkJFKHIsdGhpcy5fYmxvY2tTaXplLTQpfXRoaXMuX3VwZGF0ZSh0aGlzLl9ibG9jayk7dmFyIGE9dGhpcy5faGFzaCgpO3JldHVybiBlP2EudG9TdHJpbmcoZSk6YX0sby5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiX3VwZGF0ZSBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzIil9LGUuZXhwb3J0cz1vfSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsbil7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgVHlwZUVycm9yKCJJbmNvcnJlY3QgIisobj9uKyIgIjoiIikrImludm9jYXRpb24iKTtyZXR1cm4gZX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigzMCk7bigyNSk7ZnVuY3Rpb24gbyhlLHQpe3JldHVybihlJnQpPT09dH12YXIgYT17TVVTVF9VU0VfUFJPUEVSVFk6MSxIQVNfQk9PTEVBTl9WQUxVRTo0LEhBU19OVU1FUklDX1ZBTFVFOjgsSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUU6MjQsSEFTX09WRVJMT0FERURfQk9PTEVBTl9WQUxVRTozMixpbmplY3RET01Qcm9wZXJ0eUNvbmZpZzpmdW5jdGlvbihlKXt2YXIgdD1hLG49ZS5Qcm9wZXJ0aWVzfHx7fSxpPWUuRE9NQXR0cmlidXRlTmFtZXNwYWNlc3x8e30sdT1lLkRPTUF0dHJpYnV0ZU5hbWVzfHx7fSxjPWUuRE9NUHJvcGVydHlOYW1lc3x8e30sbD1lLkRPTU11dGF0aW9uTWV0aG9kc3x8e307Zm9yKHZhciBwIGluIGUuaXNDdXN0b21BdHRyaWJ1dGUmJnMuX2lzQ3VzdG9tQXR0cmlidXRlRnVuY3Rpb25zLnB1c2goZS5pc0N1c3RvbUF0dHJpYnV0ZSksbil7cy5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHApJiZyKCI0OCIscCk7dmFyIGY9cC50b0xvd2VyQ2FzZSgpLGg9bltwXSxkPXthdHRyaWJ1dGVOYW1lOmYsYXR0cmlidXRlTmFtZXNwYWNlOm51bGwscHJvcGVydHlOYW1lOnAsbXV0YXRpb25NZXRob2Q6bnVsbCxtdXN0VXNlUHJvcGVydHk6byhoLHQuTVVTVF9VU0VfUFJPUEVSVFkpLGhhc0Jvb2xlYW5WYWx1ZTpvKGgsdC5IQVNfQk9PTEVBTl9WQUxVRSksaGFzTnVtZXJpY1ZhbHVlOm8oaCx0LkhBU19OVU1FUklDX1ZBTFVFKSxoYXNQb3NpdGl2ZU51bWVyaWNWYWx1ZTpvKGgsdC5IQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRSksaGFzT3ZlcmxvYWRlZEJvb2xlYW5WYWx1ZTpvKGgsdC5IQVNfT1ZFUkxPQURFRF9CT09MRUFOX1ZBTFVFKX07aWYoZC5oYXNCb29sZWFuVmFsdWUrZC5oYXNOdW1lcmljVmFsdWUrZC5oYXNPdmVybG9hZGVkQm9vbGVhblZhbHVlPD0xfHxyKCI1MCIscCksdS5oYXNPd25Qcm9wZXJ0eShwKSl7dmFyIG09dVtwXTtkLmF0dHJpYnV0ZU5hbWU9bX1pLmhhc093blByb3BlcnR5KHApJiYoZC5hdHRyaWJ1dGVOYW1lc3BhY2U9aVtwXSksYy5oYXNPd25Qcm9wZXJ0eShwKSYmKGQucHJvcGVydHlOYW1lPWNbcF0pLGwuaGFzT3duUHJvcGVydHkocCkmJihkLm11dGF0aW9uTWV0aG9kPWxbcF0pLHMucHJvcGVydGllc1twXT1kfX19LGk9IjpBLVpfYS16XFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMkZGXFx1MDM3MC1cXHUwMzdEXFx1MDM3Ri1cXHUxRkZGXFx1MjAwQy1cXHUyMDBEXFx1MjA3MC1cXHUyMThGXFx1MkMwMC1cXHUyRkVGXFx1MzAwMS1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkZEIixzPXtJRF9BVFRSSUJVVEVfTkFNRToiZGF0YS1yZWFjdGlkIixST09UX0FUVFJJQlVURV9OQU1FOiJkYXRhLXJlYWN0cm9vdCIsQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUjppLEFUVFJJQlVURV9OQU1FX0NIQVI6aSsiXFwtLjAtOVxcdTAwQjdcXHUwMzAwLVxcdTAzNkZcXHUyMDNGLVxcdTIwNDAiLHByb3BlcnRpZXM6e30sZ2V0UG9zc2libGVTdGFuZGFyZE5hbWU6bnVsbCxfaXNDdXN0b21BdHRyaWJ1dGVGdW5jdGlvbnM6W10saXNDdXN0b21BdHRyaWJ1dGU6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxzLl9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9ucy5sZW5ndGg7dCsrKXtpZigoMCxzLl9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9uc1t0XSkoZSkpcmV0dXJuITB9cmV0dXJuITF9LGluamVjdGlvbjphfTtlLmV4cG9ydHM9c30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDkyMSk7big3MiksbigzNCk7ZnVuY3Rpb24gbygpe3IuYXR0YWNoUmVmcyh0aGlzLHRoaXMuX2N1cnJlbnRFbGVtZW50KX12YXIgYT17bW91bnRDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4scixhLGkpe3ZhciBzPWUubW91bnRDb21wb25lbnQodCxuLHIsYSxpKTtyZXR1cm4gZS5fY3VycmVudEVsZW1lbnQmJm51bGwhPWUuX2N1cnJlbnRFbGVtZW50LnJlZiYmdC5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKG8sZSksc30sZ2V0SG9zdE5vZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0SG9zdE5vZGUoKX0sdW5tb3VudENvbXBvbmVudDpmdW5jdGlvbihlLHQpe3IuZGV0YWNoUmVmcyhlLGUuX2N1cnJlbnRFbGVtZW50KSxlLnVubW91bnRDb21wb25lbnQodCl9LHJlY2VpdmVDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4sYSl7dmFyIGk9ZS5fY3VycmVudEVsZW1lbnQ7aWYodCE9PWl8fGEhPT1lLl9jb250ZXh0KXswO3ZhciBzPXIuc2hvdWxkVXBkYXRlUmVmcyhpLHQpO3MmJnIuZGV0YWNoUmVmcyhlLGkpLGUucmVjZWl2ZUNvbXBvbmVudCh0LG4sYSkscyYmZS5fY3VycmVudEVsZW1lbnQmJm51bGwhPWUuX2N1cnJlbnRFbGVtZW50LnJlZiYmbi5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKG8sZSl9fSxwZXJmb3JtVXBkYXRlSWZOZWNlc3Nhcnk6ZnVuY3Rpb24oZSx0LG4pe2UuX3VwZGF0ZUJhdGNoTnVtYmVyPT09biYmZS5wZXJmb3JtVXBkYXRlSWZOZWNlc3NhcnkodCl9fTtlLmV4cG9ydHM9YX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDI2Nyksbz1uKDIwNSksYT1uKDI2OCksaT1uKDQ3MSkscz0idW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiYibnVtYmVyIj09dHlwZW9mIGRvY3VtZW50LmRvY3VtZW50TW9kZXx8InVuZGVmaW5lZCIhPXR5cGVvZiBuYXZpZ2F0b3ImJiJzdHJpbmciPT10eXBlb2YgbmF2aWdhdG9yLnVzZXJBZ2VudCYmL1xiRWRnZVwvXGQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7ZnVuY3Rpb24gdShlKXtpZihzKXt2YXIgdD1lLm5vZGUsbj1lLmNoaWxkcmVuO2lmKG4ubGVuZ3RoKWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKWModCxuW3JdLG51bGwpO2Vsc2UgbnVsbCE9ZS5odG1sP28odCxlLmh0bWwpOm51bGwhPWUudGV4dCYmaSh0LGUudGV4dCl9fXZhciBjPWEoKGZ1bmN0aW9uKGUsdCxuKXsxMT09PXQubm9kZS5ub2RlVHlwZXx8MT09PXQubm9kZS5ub2RlVHlwZSYmIm9iamVjdCI9PT10Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmKG51bGw9PXQubm9kZS5uYW1lc3BhY2VVUkl8fHQubm9kZS5uYW1lc3BhY2VVUkk9PT1yLmh0bWwpPyh1KHQpLGUuaW5zZXJ0QmVmb3JlKHQubm9kZSxuKSk6KGUuaW5zZXJ0QmVmb3JlKHQubm9kZSxuKSx1KHQpKX0pKTtmdW5jdGlvbiBsKCl7cmV0dXJuIHRoaXMubm9kZS5ub2RlTmFtZX1mdW5jdGlvbiBwKGUpe3JldHVybntub2RlOmUsY2hpbGRyZW46W10saHRtbDpudWxsLHRleHQ6bnVsbCx0b1N0cmluZzpsfX1wLmluc2VydFRyZWVCZWZvcmU9YyxwLnJlcGxhY2VDaGlsZFdpdGhUcmVlPWZ1bmN0aW9uKGUsdCl7ZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0Lm5vZGUsZSksdSh0KX0scC5xdWV1ZUNoaWxkPWZ1bmN0aW9uKGUsdCl7cz9lLmNoaWxkcmVuLnB1c2godCk6ZS5ub2RlLmFwcGVuZENoaWxkKHQubm9kZSl9LHAucXVldWVIVE1MPWZ1bmN0aW9uKGUsdCl7cz9lLmh0bWw9dDpvKGUubm9kZSx0KX0scC5xdWV1ZVRleHQ9ZnVuY3Rpb24oZSx0KXtzP2UudGV4dD10OmkoZS5ub2RlLHQpfSxlLmV4cG9ydHM9cH0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTE0KSxvPW4oMjc3KSxhPW4oODgpLGk9RnVuY3Rpb24ucHJvdG90eXBlLHM9T2JqZWN0LnByb3RvdHlwZSx1PWkudG9TdHJpbmcsYz1zLmhhc093blByb3BlcnR5LGw9dS5jYWxsKE9iamVjdCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKCFhKGUpfHwiW29iamVjdCBPYmplY3RdIiE9cihlKSlyZXR1cm4hMTt2YXIgdD1vKGUpO2lmKG51bGw9PT10KXJldHVybiEwO3ZhciBuPWMuY2FsbCh0LCJjb25zdHJ1Y3RvciIpJiZ0LmNvbnN0cnVjdG9yO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuJiZuIGluc3RhbmNlb2YgbiYmdS5jYWxsKG4pPT1sfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjsoZnVuY3Rpb24odCl7Y2xhc3MgbiBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKGUpe3N1cGVyKG4uX3ByZXBhcmVTdXBlck1lc3NhZ2UoZSkpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJuYW1lIix7dmFsdWU6Ik5vbkVycm9yIixjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KSxFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSYmRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcyxuKX1zdGF0aWMgX3ByZXBhcmVTdXBlck1lc3NhZ2UoZSl7dHJ5e3JldHVybiBKU09OLnN0cmluZ2lmeShlKX1jYXRjaHtyZXR1cm4gU3RyaW5nKGUpfX19Y29uc3Qgcj1be3Byb3BlcnR5OiJuYW1lIixlbnVtZXJhYmxlOiExfSx7cHJvcGVydHk6Im1lc3NhZ2UiLGVudW1lcmFibGU6ITF9LHtwcm9wZXJ0eToic3RhY2siLGVudW1lcmFibGU6ITF9LHtwcm9wZXJ0eToiY29kZSIsZW51bWVyYWJsZTohMH1dLG89U3ltYm9sKCIudG9KU09OIGNhbGxlZCIpLGE9KHtmcm9tOmUsc2VlbjpuLHRvXzppLGZvcmNlRW51bWVyYWJsZTpzLG1heERlcHRoOnUsZGVwdGg6Y30pPT57Y29uc3QgbD1pfHwoQXJyYXkuaXNBcnJheShlKT9bXTp7fSk7aWYobi5wdXNoKGUpLGM+PXUpcmV0dXJuIGw7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUudG9KU09OJiYhMCE9PWVbb10pcmV0dXJuKGU9PntlW29dPSEwO2NvbnN0IHQ9ZS50b0pTT04oKTtyZXR1cm4gZGVsZXRlIGVbb10sdH0pKGUpO2Zvcihjb25zdFtyLG9db2YgT2JqZWN0LmVudHJpZXMoZSkpImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQuaXNCdWZmZXIobyk/bFtyXT0iW29iamVjdCBCdWZmZXJdIjoiZnVuY3Rpb24iIT10eXBlb2YgbyYmKG8mJiJvYmplY3QiPT10eXBlb2Ygbz9uLmluY2x1ZGVzKGVbcl0pP2xbcl09IltDaXJjdWxhcl0iOihjKyssbFtyXT1hKHtmcm9tOmVbcl0sc2VlbjpuLnNsaWNlKCksZm9yY2VFbnVtZXJhYmxlOnMsbWF4RGVwdGg6dSxkZXB0aDpjfSkpOmxbcl09byk7Zm9yKGNvbnN0e3Byb3BlcnR5OnQsZW51bWVyYWJsZTpufW9mIHIpInN0cmluZyI9PXR5cGVvZiBlW3RdJiZPYmplY3QuZGVmaW5lUHJvcGVydHkobCx0LHt2YWx1ZTplW3RdLGVudW1lcmFibGU6ISFzfHxuLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pO3JldHVybiBsfTtlLmV4cG9ydHM9e3NlcmlhbGl6ZUVycm9yOihlLHQ9e30pPT57Y29uc3R7bWF4RGVwdGg6bj1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFl9PXQ7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT09ZT9hKHtmcm9tOmUsc2VlbjpbXSxmb3JjZUVudW1lcmFibGU6ITAsbWF4RGVwdGg6bixkZXB0aDowfSk6ImZ1bmN0aW9uIj09dHlwZW9mIGU/YFtGdW5jdGlvbjogJHtlLm5hbWV8fCJhbm9ueW1vdXMifV1gOmV9LGRlc2VyaWFsaXplRXJyb3I6KGUsdD17fSk9Pntjb25zdHttYXhEZXB0aDpyPU51bWJlci5QT1NJVElWRV9JTkZJTklUWX09dDtpZihlIGluc3RhbmNlb2YgRXJyb3IpcmV0dXJuIGU7aWYoIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT09ZSYmIUFycmF5LmlzQXJyYXkoZSkpe2NvbnN0IHQ9bmV3IEVycm9yO3JldHVybiBhKHtmcm9tOmUsc2VlbjpbXSx0b186dCxtYXhEZXB0aDpyLGRlcHRoOjB9KSx0fXJldHVybiBuZXcgbihlKX19fSkuY2FsbCh0aGlzLG4oMTMyKS5CdWZmZXIpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KSxuLmQodCwic2FtcGxlRnJvbVNjaGVtYUdlbmVyaWMiLChmdW5jdGlvbigpe3JldHVybiBCfSkpLG4uZCh0LCJpbmZlclNjaGVtYSIsKGZ1bmN0aW9uKCl7cmV0dXJuIEZ9KSksbi5kKHQsImNyZWF0ZVhNTEV4YW1wbGUiLChmdW5jdGlvbigpe3JldHVybiBVfSkpLG4uZCh0LCJzYW1wbGVGcm9tU2NoZW1hIiwoZnVuY3Rpb24oKXtyZXR1cm4gcX0pKSxuLmQodCwibWVtb2l6ZWRDcmVhdGVYTUxFeGFtcGxlIiwoZnVuY3Rpb24oKXtyZXR1cm4gen0pKSxuLmQodCwibWVtb2l6ZWRTYW1wbGVGcm9tU2NoZW1hIiwoZnVuY3Rpb24oKXtyZXR1cm4gVn0pKTt2YXIgcj1uKDE4KSxvPW4ubihyKSxhPW4oMiksaT1uLm4oYSkscz1uKDE3KSx1PW4ubihzKSxjPW4oMjEpLGw9bi5uKGMpLHA9bigyMyksZj1uLm4ocCksaD1uKDMxKSxkPW4ubihoKSxtPW4oNzQpLHY9bi5uKG0pLGc9bigxOSkseT1uLm4oZyksYj1uKDU4KSxfPW4ubihiKSx3PW4oNCkseD1uLm4odyksRT1uKDUpLFM9big1MDYpLEM9bi5uKFMpLEE9bigzNDcpLE89bi5uKEEpLGs9bigxMDYpLGo9bi5uKGspLFQ9e3N0cmluZzpmdW5jdGlvbigpe3JldHVybiJzdHJpbmcifSxzdHJpbmdfZW1haWw6ZnVuY3Rpb24oKXtyZXR1cm4idXNlckBleGFtcGxlLmNvbSJ9LCJzdHJpbmdfZGF0ZS10aW1lIjpmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkudG9JU09TdHJpbmcoKX0sc3RyaW5nX2RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLnRvSVNPU3RyaW5nKCkuc3Vic3RyaW5nKDAsMTApfSxzdHJpbmdfdXVpZDpmdW5jdGlvbigpe3JldHVybiIzZmE4NWY2NC01NzE3LTQ1NjItYjNmYy0yYzk2M2Y2NmFmYTYifSxzdHJpbmdfaG9zdG5hbWU6ZnVuY3Rpb24oKXtyZXR1cm4iZXhhbXBsZS5jb20ifSxzdHJpbmdfaXB2NDpmdW5jdGlvbigpe3JldHVybiIxOTguNTEuMTAwLjQyIn0sc3RyaW5nX2lwdjY6ZnVuY3Rpb24oKXtyZXR1cm4iMjAwMTowZGI4OjViOTY6MDAwMDowMDAwOjQyNmY6OGUxNzo2NDJhIn0sbnVtYmVyOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LG51bWJlcl9mbG9hdDpmdW5jdGlvbigpe3JldHVybiAwfSxpbnRlZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGJvb2xlYW46ZnVuY3Rpb24oZSl7cmV0dXJuImJvb2xlYW4iIT10eXBlb2YgZS5kZWZhdWx0fHxlLmRlZmF1bHR9fSxJPWZ1bmN0aW9uKGUpe3ZhciB0LG49ZT1PYmplY3QoRS56KShlKSxyPW4udHlwZSxvPW4uZm9ybWF0LGE9VFtpKCkodD0iIi5jb25jYXQociwiXyIpKS5jYWxsKHQsbyldfHxUW3JdO3JldHVybiBPYmplY3QoRS5zKShhKT9hKGUpOiJVbmtub3duIFR5cGU6ICIrZS50eXBlfSxQPWZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QoRS5lKShlLCIkJHJlZiIsKGZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmdSgpKGUpLmNhbGwoZSwiIyIpPi0xfSkpfSxOPVsibWF4UHJvcGVydGllcyIsIm1pblByb3BlcnRpZXMiXSxNPVsibWluSXRlbXMiLCJtYXhJdGVtcyJdLFI9WyJtaW5pbXVtIiwibWF4aW11bSIsImV4Y2x1c2l2ZU1pbmltdW0iLCJleGNsdXNpdmVNYXhpbXVtIl0sRD1bIm1pbkxlbmd0aCIsIm1heExlbmd0aCJdLEw9ZnVuY3Rpb24gZSh0LG4pe3ZhciByLG8sYSxzPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp7fSxjPWZ1bmN0aW9uKGUpe3ZvaWQgMD09PW5bZV0mJnZvaWQgMCE9PXRbZV0mJihuW2VdPXRbZV0pfTsobCgpKHI9aSgpKG89WyJleGFtcGxlIiwiZGVmYXVsdCIsImVudW0iLCJ4bWwiLCJ0eXBlIl0pLmNhbGwobyxOLE0sUixEKSkuY2FsbChyLChmdW5jdGlvbihlKXtyZXR1cm4gYyhlKX0pKSx2b2lkIDAhPT10LnJlcXVpcmVkJiZmKCkodC5yZXF1aXJlZCkpJiYodm9pZCAwIT09bi5yZXF1aXJlZCYmbi5yZXF1aXJlZC5sZW5ndGh8fChuLnJlcXVpcmVkPVtdKSxsKCkoYT10LnJlcXVpcmVkKS5jYWxsKGEsKGZ1bmN0aW9uKGUpe3ZhciB0O2QoKSh0PW4ucmVxdWlyZWQpLmNhbGwodCxlKXx8bi5yZXF1aXJlZC5wdXNoKGUpfSkpKTtpZih0LnByb3BlcnRpZXMpe24ucHJvcGVydGllc3x8KG4ucHJvcGVydGllcz17fSk7dmFyIHA9T2JqZWN0KEUueikodC5wcm9wZXJ0aWVzKTtmb3IodmFyIGggaW4gcCl7dmFyIG07aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHAsaCkpaWYoIXBbaF18fCFwW2hdLmRlcHJlY2F0ZWQpaWYoIXBbaF18fCFwW2hdLnJlYWRPbmx5fHxzLmluY2x1ZGVSZWFkT25seSlpZighcFtoXXx8IXBbaF0ud3JpdGVPbmx5fHxzLmluY2x1ZGVXcml0ZU9ubHkpaWYoIW4ucHJvcGVydGllc1toXSluLnByb3BlcnRpZXNbaF09cFtoXSwhdC5yZXF1aXJlZCYmZigpKHQucmVxdWlyZWQpJiYtMSE9PXUoKShtPXQucmVxdWlyZWQpLmNhbGwobSxoKSYmKG4ucmVxdWlyZWQ/bi5yZXF1aXJlZC5wdXNoKGgpOm4ucmVxdWlyZWQ9W2hdKX19cmV0dXJuIHQuaXRlbXMmJihuLml0ZW1zfHwobi5pdGVtcz17fSksbi5pdGVtcz1lKHQuaXRlbXMsbi5pdGVtcyxzKSksbn0sQj1mdW5jdGlvbiBlKHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fSxyPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp2b2lkIDAsYT1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXSYmYXJndW1lbnRzWzNdO3QmJk9iamVjdChFLnMpKHQudG9KUykmJih0PXQudG9KUygpKTt2YXIgcz12b2lkIDAhPT1yfHx0JiZ2b2lkIDAhPT10LmV4YW1wbGV8fHQmJnZvaWQgMCE9PXQuZGVmYXVsdCxjPSFzJiZ0JiZ0Lm9uZU9mJiZ0Lm9uZU9mLmxlbmd0aD4wLHA9IXMmJnQmJnQuYW55T2YmJnQuYW55T2YubGVuZ3RoPjA7aWYoIXMmJihjfHxwKSl7dmFyIGg9T2JqZWN0KEUueikoYz90Lm9uZU9mWzBdOnQuYW55T2ZbMF0pO2lmKEwoaCx0LG4pLCF0LnhtbCYmaC54bWwmJih0LnhtbD1oLnhtbCksdm9pZCAwIT09dC5leGFtcGxlJiZ2b2lkIDAhPT1oLmV4YW1wbGUpcz0hMDtlbHNlIGlmKGgucHJvcGVydGllcyl7dC5wcm9wZXJ0aWVzfHwodC5wcm9wZXJ0aWVzPXt9KTt2YXIgbT1PYmplY3QoRS56KShoLnByb3BlcnRpZXMpO2Zvcih2YXIgZyBpbiBtKXt2YXIgYjtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobSxnKSlpZighbVtnXXx8IW1bZ10uZGVwcmVjYXRlZClpZighbVtnXXx8IW1bZ10ucmVhZE9ubHl8fG4uaW5jbHVkZVJlYWRPbmx5KWlmKCFtW2ddfHwhbVtnXS53cml0ZU9ubHl8fG4uaW5jbHVkZVdyaXRlT25seSlpZighdC5wcm9wZXJ0aWVzW2ddKXQucHJvcGVydGllc1tnXT1tW2ddLCFoLnJlcXVpcmVkJiZmKCkoaC5yZXF1aXJlZCkmJi0xIT09dSgpKGI9aC5yZXF1aXJlZCkuY2FsbChiLGcpJiYodC5yZXF1aXJlZD90LnJlcXVpcmVkLnB1c2goZyk6dC5yZXF1aXJlZD1bZ10pfX19dmFyIHcsUz17fSxDPXR8fHt9LEE9Qy54bWwsTz1DLnR5cGUsaz1DLmV4YW1wbGUsVD1DLnByb3BlcnRpZXMsRD1DLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLEI9Qy5pdGVtcyxGPW4uaW5jbHVkZVJlYWRPbmx5LFU9bi5pbmNsdWRlV3JpdGVPbmx5LHE9QT1BfHx7fSx6PXEubmFtZSxWPXEucHJlZml4LFc9cS5uYW1lc3BhY2UsSD17fTtpZihhJiYodz0oVj9WKyI6IjoiIikrKHo9enx8Im5vdGFnbmFtZSIpLFcpKXt2YXIgJD1WPyJ4bWxuczoiK1Y6InhtbG5zIjtTWyRdPVd9YSYmKEhbd109W10pO3ZhciBKPWZ1bmN0aW9uKGUpe3JldHVybiB2KCkoZSkuY2FsbChlLChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl9KSl9O3QmJiFPJiYoVHx8RHx8SihOKT9PPSJvYmplY3QiOkJ8fEooTSk/Tz0iYXJyYXkiOkooUik/KE89Im51bWJlciIsdC50eXBlPSJudW1iZXIiKTpzfHx0LmVudW18fChPPSJzdHJpbmciLHQudHlwZT0ic3RyaW5nIikpO3ZhciBLLFksRz1mdW5jdGlvbihlKXt2YXIgbixyLG8sYSxpO251bGwhPT0obnVsbD09PShuPXQpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLm1heEl0ZW1zKSYmdm9pZCAwIT09KG51bGw9PT0ocj10KXx8dm9pZCAwPT09cj92b2lkIDA6ci5tYXhJdGVtcykmJihlPXkoKShlKS5jYWxsKGUsMCxudWxsPT09KGk9dCl8fHZvaWQgMD09PWk/dm9pZCAwOmkubWF4SXRlbXMpKTtpZihudWxsIT09KG51bGw9PT0obz10KXx8dm9pZCAwPT09bz92b2lkIDA6by5taW5JdGVtcykmJnZvaWQgMCE9PShudWxsPT09KGE9dCl8fHZvaWQgMD09PWE/dm9pZCAwOmEubWluSXRlbXMpKWZvcih2YXIgcz0wO2UubGVuZ3RoPChudWxsPT09KHU9dCl8fHZvaWQgMD09PXU/dm9pZCAwOnUubWluSXRlbXMpOyl7dmFyIHU7ZS5wdXNoKGVbcysrJWUubGVuZ3RoXSl9cmV0dXJuIGV9LFo9T2JqZWN0KEUueikoVCksWD0wLFE9ZnVuY3Rpb24oKXtyZXR1cm4gdCYmbnVsbCE9PXQubWF4UHJvcGVydGllcyYmdm9pZCAwIT09dC5tYXhQcm9wZXJ0aWVzJiZYPj10Lm1heFByb3BlcnRpZXN9LGVlPWZ1bmN0aW9uKCl7aWYoIXR8fCF0LnJlcXVpcmVkKXJldHVybiAwO3ZhciBlLG4scj0wO2E/bCgpKGU9dC5yZXF1aXJlZCkuY2FsbChlLChmdW5jdGlvbihlKXtyZXR1cm4gcis9dm9pZCAwPT09SFtlXT8wOjF9KSk6bCgpKG49dC5yZXF1aXJlZCkuY2FsbChuLChmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gcis9dm9pZCAwPT09KG51bGw9PT0odD1IW3ddKXx8dm9pZCAwPT09dD92b2lkIDA6XygpKHQpLmNhbGwodCwoZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXRbZV19KSkpPzA6MX0pKTtyZXR1cm4gdC5yZXF1aXJlZC5sZW5ndGgtcn0sdGU9ZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuISh0JiZ0LnJlcXVpcmVkJiZ0LnJlcXVpcmVkLmxlbmd0aCl8fCFkKCkobj10LnJlcXVpcmVkKS5jYWxsKG4sZSl9LG5lPWZ1bmN0aW9uKGUpe3JldHVybiF0fHxudWxsPT09dC5tYXhQcm9wZXJ0aWVzfHx2b2lkIDA9PT10Lm1heFByb3BlcnRpZXN8fCFRKCkmJighdGUoZSl8fHQubWF4UHJvcGVydGllcy1YLWVlKCk+MCl9O2lmKEs9YT9mdW5jdGlvbihyKXt2YXIgbz1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06dm9pZCAwO2lmKHQmJlpbcl0pe2lmKFpbcl0ueG1sPVpbcl0ueG1sfHx7fSxaW3JdLnhtbC5hdHRyaWJ1dGUpe3ZhciBzPWYoKShaW3JdLmVudW0pP1pbcl0uZW51bVswXTp2b2lkIDAsdT1aW3JdLmV4YW1wbGUsYz1aW3JdLmRlZmF1bHQ7cmV0dXJuIHZvaWQoU1taW3JdLnhtbC5uYW1lfHxyXT12b2lkIDAhPT11P3U6dm9pZCAwIT09Yz9jOnZvaWQgMCE9PXM/czpJKFpbcl0pKX1aW3JdLnhtbC5uYW1lPVpbcl0ueG1sLm5hbWV8fHJ9ZWxzZSBaW3JdfHwhMT09PUR8fChaW3JdPXt4bWw6e25hbWU6cn19KTt2YXIgbCxwPWUodCYmWltyXXx8dm9pZCAwLG4sbyxhKTtuZShyKSYmKFgrKyxmKCkocCk/SFt3XT1pKCkobD1IW3ddKS5jYWxsKGwscCk6SFt3XS5wdXNoKHApKX06ZnVuY3Rpb24odCxyKXtuZSh0KSYmKEhbdF09ZShaW3RdLG4scixhKSxYKyspfSxzKXt2YXIgcmU7aWYocmU9UCh2b2lkIDAhPT1yP3I6dm9pZCAwIT09az9rOnQuZGVmYXVsdCksIWEpe2lmKCJudW1iZXIiPT10eXBlb2YgcmUmJiJzdHJpbmciPT09TylyZXR1cm4iIi5jb25jYXQocmUpO2lmKCJzdHJpbmciIT10eXBlb2YgcmV8fCJzdHJpbmciPT09TylyZXR1cm4gcmU7dHJ5e3JldHVybiBKU09OLnBhcnNlKHJlKX1jYXRjaChlKXtyZXR1cm4gcmV9fWlmKHR8fChPPWYoKShyZSk/ImFycmF5IjpvKCkocmUpKSwiYXJyYXkiPT09Tyl7aWYoIWYoKShyZSkpe2lmKCJzdHJpbmciPT10eXBlb2YgcmUpcmV0dXJuIHJlO3JlPVtyZV19dmFyIG9lPXQ/dC5pdGVtczp2b2lkIDA7b2UmJihvZS54bWw9b2UueG1sfHxBfHx7fSxvZS54bWwubmFtZT1vZS54bWwubmFtZXx8QS5uYW1lKTt2YXIgYWU9eCgpKHJlKS5jYWxsKHJlLChmdW5jdGlvbih0KXtyZXR1cm4gZShvZSxuLHQsYSl9KSk7cmV0dXJuIGFlPUcoYWUpLEEud3JhcHBlZD8oSFt3XT1hZSxqKCkoUyl8fEhbd10ucHVzaCh7X2F0dHI6U30pKTpIPWFlLEh9aWYoIm9iamVjdCI9PT1PKXtpZigic3RyaW5nIj09dHlwZW9mIHJlKXJldHVybiByZTtmb3IodmFyIGllIGluIHJlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyZSxpZSkmJih0JiZaW2llXSYmWltpZV0ucmVhZE9ubHkmJiFGfHx0JiZaW2llXSYmWltpZV0ud3JpdGVPbmx5JiYhVXx8KHQmJlpbaWVdJiZaW2llXS54bWwmJlpbaWVdLnhtbC5hdHRyaWJ1dGU/U1taW2llXS54bWwubmFtZXx8aWVdPXJlW2llXTpLKGllLHJlW2llXSkpKTtyZXR1cm4gaigpKFMpfHxIW3ddLnB1c2goe19hdHRyOlN9KSxIfXJldHVybiBIW3ddPWooKShTKT9yZTpbe19hdHRyOlN9LHJlXSxIfWlmKCJvYmplY3QiPT09Tyl7Zm9yKHZhciBzZSBpbiBaKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChaLHNlKSYmKFpbc2VdJiZaW3NlXS5kZXByZWNhdGVkfHxaW3NlXSYmWltzZV0ucmVhZE9ubHkmJiFGfHxaW3NlXSYmWltzZV0ud3JpdGVPbmx5JiYhVXx8SyhzZSkpO2lmKGEmJlMmJkhbd10ucHVzaCh7X2F0dHI6U30pLFEoKSlyZXR1cm4gSDtpZighMD09PUQpYT9IW3ddLnB1c2goe2FkZGl0aW9uYWxQcm9wOiJBbnl0aGluZyBjYW4gYmUgaGVyZSJ9KTpILmFkZGl0aW9uYWxQcm9wMT17fSxYKys7ZWxzZSBpZihEKXt2YXIgdWU9T2JqZWN0KEUueikoRCksY2U9ZSh1ZSxuLHZvaWQgMCxhKTtpZihhJiZ1ZS54bWwmJnVlLnhtbC5uYW1lJiYibm90YWduYW1lIiE9PXVlLnhtbC5uYW1lKUhbd10ucHVzaChjZSk7ZWxzZSBmb3IodmFyIGxlPW51bGwhPT10Lm1pblByb3BlcnRpZXMmJnZvaWQgMCE9PXQubWluUHJvcGVydGllcyYmWDx0Lm1pblByb3BlcnRpZXM/dC5taW5Qcm9wZXJ0aWVzLVg6MyxwZT0xO3BlPD1sZTtwZSsrKXtpZihRKCkpcmV0dXJuIEg7aWYoYSl7dmFyIGZlPXt9O2ZlWyJhZGRpdGlvbmFsUHJvcCIrcGVdPWNlLm5vdGFnbmFtZSxIW3ddLnB1c2goZmUpfWVsc2UgSFsiYWRkaXRpb25hbFByb3AiK3BlXT1jZTtYKyt9fXJldHVybiBIfWlmKCJhcnJheSI9PT1PKXtpZighQilyZXR1cm47dmFyIGhlLGRlLG1lO2lmKGEpQi54bWw9Qi54bWx8fChudWxsPT09KGRlPXQpfHx2b2lkIDA9PT1kZT92b2lkIDA6ZGUueG1sKXx8e30sQi54bWwubmFtZT1CLnhtbC5uYW1lfHxBLm5hbWU7aWYoZigpKEIuYW55T2YpKWhlPXgoKShtZT1CLmFueU9mKS5jYWxsKG1lLChmdW5jdGlvbih0KXtyZXR1cm4gZShMKEIsdCxuKSxuLHZvaWQgMCxhKX0pKTtlbHNlIGlmKGYoKShCLm9uZU9mKSl7dmFyIHZlO2hlPXgoKSh2ZT1CLm9uZU9mKS5jYWxsKHZlLChmdW5jdGlvbih0KXtyZXR1cm4gZShMKEIsdCxuKSxuLHZvaWQgMCxhKX0pKX1lbHNle2lmKCEoIWF8fGEmJkEud3JhcHBlZCkpcmV0dXJuIGUoQixuLHZvaWQgMCxhKTtoZT1bZShCLG4sdm9pZCAwLGEpXX1yZXR1cm4gaGU9RyhoZSksYSYmQS53cmFwcGVkPyhIW3ddPWhlLGooKShTKXx8SFt3XS5wdXNoKHtfYXR0cjpTfSksSCk6aGV9aWYodCYmZigpKHQuZW51bSkpWT1PYmplY3QoRS52KSh0LmVudW0pWzBdO2Vsc2V7aWYoIXQpcmV0dXJuO2lmKCJudW1iZXIiPT10eXBlb2YoWT1JKHQpKSl7dmFyIGdlPXQubWluaW11bTtudWxsIT1nZSYmKHQuZXhjbHVzaXZlTWluaW11bSYmZ2UrKyxZPWdlKTt2YXIgeWU9dC5tYXhpbXVtO251bGwhPXllJiYodC5leGNsdXNpdmVNYXhpbXVtJiZ5ZS0tLFk9eWUpfWlmKCJzdHJpbmciPT10eXBlb2YgWSYmKG51bGwhPT10Lm1heExlbmd0aCYmdm9pZCAwIT09dC5tYXhMZW5ndGgmJihZPXkoKShZKS5jYWxsKFksMCx0Lm1heExlbmd0aCkpLG51bGwhPT10Lm1pbkxlbmd0aCYmdm9pZCAwIT09dC5taW5MZW5ndGgpKWZvcih2YXIgYmU9MDtZLmxlbmd0aDx0Lm1pbkxlbmd0aDspWSs9WVtiZSsrJVkubGVuZ3RoXX1pZigiZmlsZSIhPT1PKXJldHVybiBhPyhIW3ddPWooKShTKT9ZOlt7X2F0dHI6U30sWV0sSCk6WX0sRj1mdW5jdGlvbihlKXtyZXR1cm4gZS5zY2hlbWEmJihlPWUuc2NoZW1hKSxlLnByb3BlcnRpZXMmJihlLnR5cGU9Im9iamVjdCIpLGV9LFU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPUIoZSx0LG4sITApO2lmKHIpcmV0dXJuInN0cmluZyI9PXR5cGVvZiByP3I6QygpKHIse2RlY2xhcmF0aW9uOiEwLGluZGVudDoiXHQifSl9LHE9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBCKGUsdCxuLCExKX0sej1PKCkoVSksVj1PKCkocSl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxMDM2KS5Db3B5VG9DbGlwYm9hcmQ7ci5Db3B5VG9DbGlwYm9hcmQ9cixlLmV4cG9ydHM9cn0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtuLnIodCksbi5kKHQsIlVQREFURV9DT05GSUdTIiwoZnVuY3Rpb24oKXtyZXR1cm4gYX0pKSxuLmQodCwiVE9HR0xFX0NPTkZJR1MiLChmdW5jdGlvbigpe3JldHVybiBpfSkpLG4uZCh0LCJ1cGRhdGUiLChmdW5jdGlvbigpe3JldHVybiBzfSkpLG4uZCh0LCJ0b2dnbGUiLChmdW5jdGlvbigpe3JldHVybiB1fSkpLG4uZCh0LCJsb2FkZWQiLChmdW5jdGlvbigpe3JldHVybiBjfSkpO3ZhciByPW4oMyksbz1uLm4ociksYT0iY29uZmlnc191cGRhdGUiLGk9ImNvbmZpZ3NfdG9nZ2xlIjtmdW5jdGlvbiBzKGUsdCl7cmV0dXJue3R5cGU6YSxwYXlsb2FkOm8oKSh7fSxlLHQpfX1mdW5jdGlvbiB1KGUpe3JldHVybnt0eXBlOmkscGF5bG9hZDplfX12YXIgYz1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgdD1lLmdldENvbmZpZ3Msbj1lLmF1dGhBY3Rpb25zO2lmKHQoKS5wZXJzaXN0QXV0aG9yaXphdGlvbil7dmFyIHI9bG9jYWxTdG9yYWdlLmdldEl0ZW0oImF1dGhvcml6ZWQiKTtyJiZuLnJlc3RvcmVBdXRob3JpemF0aW9uKHthdXRob3JpemVkOkpTT04ucGFyc2Uocil9KX19fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtuLmQodCwiYSIsKGZ1bmN0aW9uKCl7cmV0dXJuIGx9KSk7dmFyIHI9bigxMiksbz1uLm4ociksYT1uKDMxKSxpPW4ubihhKSxzPW4oMSksdT1uLm4ocyksYz11LmEuU2V0Lm9mKCJ0eXBlIiwiZm9ybWF0IiwiaXRlbXMiLCJkZWZhdWx0IiwibWF4aW11bSIsImV4Y2x1c2l2ZU1heGltdW0iLCJtaW5pbXVtIiwiZXhjbHVzaXZlTWluaW11bSIsIm1heExlbmd0aCIsIm1pbkxlbmd0aCIsInBhdHRlcm4iLCJtYXhJdGVtcyIsIm1pbkl0ZW1zIiwidW5pcXVlSXRlbXMiLCJlbnVtIiwibXVsdGlwbGVPZiIpO2Z1bmN0aW9uIGwoZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9LG49dC5pc09BUzM7aWYoIXUuYS5NYXAuaXNNYXAoZSkpcmV0dXJue3NjaGVtYTp1LmEuTWFwKCkscGFyYW1ldGVyQ29udGVudE1lZGlhVHlwZTpudWxsfTtpZighbilyZXR1cm4iYm9keSI9PT1lLmdldCgiaW4iKT97c2NoZW1hOmUuZ2V0KCJzY2hlbWEiLHUuYS5NYXAoKSkscGFyYW1ldGVyQ29udGVudE1lZGlhVHlwZTpudWxsfTp7c2NoZW1hOm8oKShlKS5jYWxsKGUsKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGkoKShjKS5jYWxsKGMsdCl9KSkscGFyYW1ldGVyQ29udGVudE1lZGlhVHlwZTpudWxsfTtpZihlLmdldCgiY29udGVudCIpKXt2YXIgcj1lLmdldCgiY29udGVudCIsdS5hLk1hcCh7fSkpLmtleVNlcSgpLGE9ci5maXJzdCgpO3JldHVybntzY2hlbWE6ZS5nZXRJbihbImNvbnRlbnQiLGEsInNjaGVtYSJdLHUuYS5NYXAoKSkscGFyYW1ldGVyQ29udGVudE1lZGlhVHlwZTphfX1yZXR1cm57c2NoZW1hOmUuZ2V0KCJzY2hlbWEiLHUuYS5NYXAoKSkscGFyYW1ldGVyQ29udGVudE1lZGlhVHlwZTpudWxsfX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpLG4uZCh0LCJjcmVhdGVTdG9yZSIsKGZ1bmN0aW9uKCl7cmV0dXJuIEN9KSksbi5kKHQsImNvbWJpbmVSZWR1Y2VycyIsKGZ1bmN0aW9uKCl7cmV0dXJuIE99KSksbi5kKHQsImJpbmRBY3Rpb25DcmVhdG9ycyIsKGZ1bmN0aW9uKCl7cmV0dXJuIGp9KSksbi5kKHQsImFwcGx5TWlkZGxld2FyZSIsKGZ1bmN0aW9uKCl7cmV0dXJuIFB9KSksbi5kKHQsImNvbXBvc2UiLChmdW5jdGlvbigpe3JldHVybiBUfSkpO3ZhciByPW4oNTAwKSxvPSJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYsYT0oci5hfHxvfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpKS5TeW1ib2wsaT1PYmplY3QucHJvdG90eXBlLHM9aS5oYXNPd25Qcm9wZXJ0eSx1PWkudG9TdHJpbmcsYz1hP2EudG9TdHJpbmdUYWc6dm9pZCAwO3ZhciBsPWZ1bmN0aW9uKGUpe3ZhciB0PXMuY2FsbChlLGMpLG49ZVtjXTt0cnl7ZVtjXT12b2lkIDA7dmFyIHI9ITB9Y2F0Y2goZSl7fXZhciBvPXUuY2FsbChlKTtyZXR1cm4gciYmKHQ/ZVtjXT1uOmRlbGV0ZSBlW2NdKSxvfSxwPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7dmFyIGY9ZnVuY3Rpb24oZSl7cmV0dXJuIHAuY2FsbChlKX0saD1hP2EudG9TdHJpbmdUYWc6dm9pZCAwO3ZhciBkPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP3ZvaWQgMD09PWU/IltvYmplY3QgVW5kZWZpbmVkXSI6IltvYmplY3QgTnVsbF0iOmgmJmggaW4gT2JqZWN0KGUpP2woZSk6ZihlKX07dmFyIG09ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGUodChuKSl9fShPYmplY3QuZ2V0UHJvdG90eXBlT2YsT2JqZWN0KTt2YXIgdj1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZSYmIm9iamVjdCI9PXR5cGVvZiBlfSxnPUZ1bmN0aW9uLnByb3RvdHlwZSx5PU9iamVjdC5wcm90b3R5cGUsYj1nLnRvU3RyaW5nLF89eS5oYXNPd25Qcm9wZXJ0eSx3PWIuY2FsbChPYmplY3QpO3ZhciB4PWZ1bmN0aW9uKGUpe2lmKCF2KGUpfHwiW29iamVjdCBPYmplY3RdIiE9ZChlKSlyZXR1cm4hMTt2YXIgdD1tKGUpO2lmKG51bGw9PT10KXJldHVybiEwO3ZhciBuPV8uY2FsbCh0LCJjb25zdHJ1Y3RvciIpJiZ0LmNvbnN0cnVjdG9yO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuJiZuIGluc3RhbmNlb2YgbiYmYi5jYWxsKG4pPT13fSxFPW4oMzQ1KSxTPSJAQHJlZHV4L0lOSVQiO2Z1bmN0aW9uIEMoZSx0LG4pe3ZhciByO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ2b2lkIDA9PT1uJiYobj10LHQ9dm9pZCAwKSx2b2lkIDAhPT1uKXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIHRoZSBlbmhhbmNlciB0byBiZSBhIGZ1bmN0aW9uLiIpO3JldHVybiBuKEMpKGUsdCl9aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCB0aGUgcmVkdWNlciB0byBiZSBhIGZ1bmN0aW9uLiIpO3ZhciBvPWUsYT10LGk9W10scz1pLHU9ITE7ZnVuY3Rpb24gYygpe3M9PT1pJiYocz1pLnNsaWNlKCkpfWZ1bmN0aW9uIGwoKXtyZXR1cm4gYX1mdW5jdGlvbiBwKGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgbGlzdGVuZXIgdG8gYmUgYSBmdW5jdGlvbi4iKTt2YXIgdD0hMDtyZXR1cm4gYygpLHMucHVzaChlKSxmdW5jdGlvbigpe2lmKHQpe3Q9ITEsYygpO3ZhciBuPXMuaW5kZXhPZihlKTtzLnNwbGljZShuLDEpfX19ZnVuY3Rpb24gZihlKXtpZigheChlKSl0aHJvdyBuZXcgRXJyb3IoIkFjdGlvbnMgbXVzdCBiZSBwbGFpbiBvYmplY3RzLiBVc2UgY3VzdG9tIG1pZGRsZXdhcmUgZm9yIGFzeW5jIGFjdGlvbnMuIik7aWYodm9pZCAwPT09ZS50eXBlKXRocm93IG5ldyBFcnJvcignQWN0aW9ucyBtYXkgbm90IGhhdmUgYW4gdW5kZWZpbmVkICJ0eXBlIiBwcm9wZXJ0eS4gSGF2ZSB5b3UgbWlzc3BlbGxlZCBhIGNvbnN0YW50PycpO2lmKHUpdGhyb3cgbmV3IEVycm9yKCJSZWR1Y2VycyBtYXkgbm90IGRpc3BhdGNoIGFjdGlvbnMuIik7dHJ5e3U9ITAsYT1vKGEsZSl9ZmluYWxseXt1PSExfWZvcih2YXIgdD1pPXMsbj0wO248dC5sZW5ndGg7bisrKXsoMCx0W25dKSgpfXJldHVybiBlfXJldHVybiBmKHt0eXBlOlN9KSwocj17ZGlzcGF0Y2g6ZixzdWJzY3JpYmU6cCxnZXRTdGF0ZTpsLHJlcGxhY2VSZWR1Y2VyOmZ1bmN0aW9uKGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgdGhlIG5leHRSZWR1Y2VyIHRvIGJlIGEgZnVuY3Rpb24uIik7bz1lLGYoe3R5cGU6U30pfX0pW0UuYV09ZnVuY3Rpb24oKXt2YXIgZSx0PXA7cmV0dXJuKGU9e3N1YnNjcmliZTpmdW5jdGlvbihlKXtpZigib2JqZWN0IiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgdGhlIG9ic2VydmVyIHRvIGJlIGFuIG9iamVjdC4iKTtmdW5jdGlvbiBuKCl7ZS5uZXh0JiZlLm5leHQobCgpKX1yZXR1cm4gbigpLHt1bnN1YnNjcmliZTp0KG4pfX19KVtFLmFdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGV9LHJ9ZnVuY3Rpb24gQShlLHQpe3ZhciBuPXQmJnQudHlwZTtyZXR1cm4iR2l2ZW4gYWN0aW9uICIrKG4mJiciJytuLnRvU3RyaW5nKCkrJyInfHwiYW4gYWN0aW9uIikrJywgcmVkdWNlciAiJytlKyciIHJldHVybmVkIHVuZGVmaW5lZC4gVG8gaWdub3JlIGFuIGFjdGlvbiwgeW91IG11c3QgZXhwbGljaXRseSByZXR1cm4gdGhlIHByZXZpb3VzIHN0YXRlLiBJZiB5b3Ugd2FudCB0aGlzIHJlZHVjZXIgdG8gaG9sZCBubyB2YWx1ZSwgeW91IGNhbiByZXR1cm4gbnVsbCBpbnN0ZWFkIG9mIHVuZGVmaW5lZC4nfWZ1bmN0aW9uIE8oZSl7Zm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49e30scj0wO3I8dC5sZW5ndGg7cisrKXt2YXIgbz10W3JdOzAsImZ1bmN0aW9uIj09dHlwZW9mIGVbb10mJihuW29dPWVbb10pfXZhciBhPU9iamVjdC5rZXlzKG4pO3ZhciBpPXZvaWQgMDt0cnl7IWZ1bmN0aW9uKGUpe09iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuPWVbdF07aWYodm9pZCAwPT09bih2b2lkIDAse3R5cGU6U30pKXRocm93IG5ldyBFcnJvcignUmVkdWNlciAiJyt0KyJcIiByZXR1cm5lZCB1bmRlZmluZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiBJZiB0aGUgc3RhdGUgcGFzc2VkIHRvIHRoZSByZWR1Y2VyIGlzIHVuZGVmaW5lZCwgeW91IG11c3QgZXhwbGljaXRseSByZXR1cm4gdGhlIGluaXRpYWwgc3RhdGUuIFRoZSBpbml0aWFsIHN0YXRlIG1heSBub3QgYmUgdW5kZWZpbmVkLiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBzZXQgYSB2YWx1ZSBmb3IgdGhpcyByZWR1Y2VyLCB5b3UgY2FuIHVzZSBudWxsIGluc3RlYWQgb2YgdW5kZWZpbmVkLiIpO2lmKHZvaWQgMD09PW4odm9pZCAwLHt0eXBlOiJAQHJlZHV4L1BST0JFX1VOS05PV05fQUNUSU9OXyIrTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpLnNwbGl0KCIiKS5qb2luKCIuIil9KSl0aHJvdyBuZXcgRXJyb3IoJ1JlZHVjZXIgIicrdCsiXCIgcmV0dXJuZWQgdW5kZWZpbmVkIHdoZW4gcHJvYmVkIHdpdGggYSByYW5kb20gdHlwZS4gRG9uJ3QgdHJ5IHRvIGhhbmRsZSAiK1MrJyBvciBvdGhlciBhY3Rpb25zIGluICJyZWR1eC8qIiBuYW1lc3BhY2UuIFRoZXkgYXJlIGNvbnNpZGVyZWQgcHJpdmF0ZS4gSW5zdGVhZCwgeW91IG11c3QgcmV0dXJuIHRoZSBjdXJyZW50IHN0YXRlIGZvciBhbnkgdW5rbm93biBhY3Rpb25zLCB1bmxlc3MgaXQgaXMgdW5kZWZpbmVkLCBpbiB3aGljaCBjYXNlIHlvdSBtdXN0IHJldHVybiB0aGUgaW5pdGlhbCBzdGF0ZSwgcmVnYXJkbGVzcyBvZiB0aGUgYWN0aW9uIHR5cGUuIFRoZSBpbml0aWFsIHN0YXRlIG1heSBub3QgYmUgdW5kZWZpbmVkLCBidXQgY2FuIGJlIG51bGwuJyl9KSl9KG4pfWNhdGNoKGUpe2k9ZX1yZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30sdD1hcmd1bWVudHNbMV07aWYoaSl0aHJvdyBpO2Zvcih2YXIgcj0hMSxvPXt9LHM9MDtzPGEubGVuZ3RoO3MrKyl7dmFyIHU9YVtzXSxjPW5bdV0sbD1lW3VdLHA9YyhsLHQpO2lmKHZvaWQgMD09PXApe3ZhciBmPUEodSx0KTt0aHJvdyBuZXcgRXJyb3IoZil9b1t1XT1wLHI9cnx8cCE9PWx9cmV0dXJuIHI/bzplfX1mdW5jdGlvbiBrKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQoZS5hcHBseSh2b2lkIDAsYXJndW1lbnRzKSl9fWZ1bmN0aW9uIGooZSx0KXtpZigiZnVuY3Rpb24iPT10eXBlb2YgZSlyZXR1cm4gayhlLHQpO2lmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWUpdGhyb3cgbmV3IEVycm9yKCJiaW5kQWN0aW9uQ3JlYXRvcnMgZXhwZWN0ZWQgYW4gb2JqZWN0IG9yIGEgZnVuY3Rpb24sIGluc3RlYWQgcmVjZWl2ZWQgIisobnVsbD09PWU/Im51bGwiOnR5cGVvZiBlKSsnLiBEaWQgeW91IHdyaXRlICJpbXBvcnQgQWN0aW9uQ3JlYXRvcnMgZnJvbSIgaW5zdGVhZCBvZiAiaW1wb3J0ICogYXMgQWN0aW9uQ3JlYXRvcnMgZnJvbSI/Jyk7Zm9yKHZhciBuPU9iamVjdC5rZXlzKGUpLHI9e30sbz0wO288bi5sZW5ndGg7bysrKXt2YXIgYT1uW29dLGk9ZVthXTsiZnVuY3Rpb24iPT10eXBlb2YgaSYmKHJbYV09ayhpLHQpKX1yZXR1cm4gcn1mdW5jdGlvbiBUKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1BcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gMD09PXQubGVuZ3RoP2Z1bmN0aW9uKGUpe3JldHVybiBlfToxPT09dC5sZW5ndGg/dFswXTp0LnJlZHVjZSgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZSh0LmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpKX19KSl9dmFyIEk9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX07ZnVuY3Rpb24gUCgpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9QXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihuLHIsbyl7dmFyIGEsaT1lKG4scixvKSxzPWkuZGlzcGF0Y2gsdT17Z2V0U3RhdGU6aS5nZXRTdGF0ZSxkaXNwYXRjaDpmdW5jdGlvbihlKXtyZXR1cm4gcyhlKX19O3JldHVybiBhPXQubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZSh1KX0pKSxzPVQuYXBwbHkodm9pZCAwLGEpKGkuZGlzcGF0Y2gpLEkoe30saSx7ZGlzcGF0Y2g6c30pfX19fSxmdW5jdGlvbihlLHQpe3ZhciBuPXt9LnRvU3RyaW5nO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gbi5jYWxsKGUpLnNsaWNlKDgsLTEpfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTUyKTtlLmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oZSl7cmV0dXJuIkFycmF5Ij09cihlKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxODApLG89big2OCksYT1uKDEwNyk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgaT1yKHQpO2kgaW4gZT9vLmYoZSxpLGEoMCxuKSk6ZVtpXT1ufX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMzcpLG89big0MSksYT1uKDEyOSksaT1vKCJzcGVjaWVzIik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBhPj01MXx8IXIoKGZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuKHQuY29uc3RydWN0b3I9e30pW2ldPWZ1bmN0aW9uKCl7cmV0dXJue2ZvbzoxfX0sMSE9PXRbZV0oQm9vbGVhbikuZm9vfSkpfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMzY0KSxvPW4oMjMxKTtlLmV4cG9ydHM9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKGUpe3JldHVybiByKGUsbyl9fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz17fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDY2KSxvPW4oMjM3KSxhPW4oMTMxKSxpPW4oNzcpLHM9bigyMzYpLHU9IkFycmF5IEl0ZXJhdG9yIixjPWkuc2V0LGw9aS5nZXR0ZXJGb3IodSk7ZS5leHBvcnRzPXMoQXJyYXksIkFycmF5IiwoZnVuY3Rpb24oZSx0KXtjKHRoaXMse3R5cGU6dSx0YXJnZXQ6cihlKSxpbmRleDowLGtpbmQ6dH0pfSksKGZ1bmN0aW9uKCl7dmFyIGU9bCh0aGlzKSx0PWUudGFyZ2V0LG49ZS5raW5kLHI9ZS5pbmRleCsrO3JldHVybiF0fHxyPj10Lmxlbmd0aD8oZS50YXJnZXQ9dm9pZCAwLHt2YWx1ZTp2b2lkIDAsZG9uZTohMH0pOiJrZXlzIj09bj97dmFsdWU6cixkb25lOiExfToidmFsdWVzIj09bj97dmFsdWU6dFtyXSxkb25lOiExfTp7dmFsdWU6W3IsdFtyXV0sZG9uZTohMX19KSwidmFsdWVzIiksYS5Bcmd1bWVudHM9YS5BcnJheSxvKCJrZXlzIiksbygidmFsdWVzIiksbygiZW50cmllcyIpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aC0xLG49Ik1pbmlmaWVkIFJlYWN0IGVycm9yICMiK2UrIjsgdmlzaXQgaHR0cDovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL2Vycm9yLWRlY29kZXIuaHRtbD9pbnZhcmlhbnQ9IitlLHI9MDtyPHQ7cisrKW4rPSImYXJnc1tdPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFyZ3VtZW50c1tyKzFdKTtuKz0iIGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4iO3ZhciBvPW5ldyBFcnJvcihuKTt0aHJvdyBvLm5hbWU9IkludmFyaWFudCBWaW9sYXRpb24iLG8uZnJhbWVzVG9Qb3A9MSxvfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oOTgpLG89bigxMzEpLGE9big0MSkoIml0ZXJhdG9yIik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKG51bGwhPWUpcmV0dXJuIGVbYV18fGVbIkBAaXRlcmF0b3IiXXx8b1tyKGUpXX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDczNyksbz1uKDI0MyksYT1uKDczOCksaT1uKDczOSkscz1uKDc0MCksdT1uKDExNCksYz1uKDQxMCksbD0iW29iamVjdCBNYXBdIixwPSJbb2JqZWN0IFByb21pc2VdIixmPSJbb2JqZWN0IFNldF0iLGg9IltvYmplY3QgV2Vha01hcF0iLGQ9IltvYmplY3QgRGF0YVZpZXddIixtPWMociksdj1jKG8pLGc9YyhhKSx5PWMoaSksYj1jKHMpLF89dTsociYmXyhuZXcgcihuZXcgQXJyYXlCdWZmZXIoMSkpKSE9ZHx8byYmXyhuZXcgbykhPWx8fGEmJl8oYS5yZXNvbHZlKCkpIT1wfHxpJiZfKG5ldyBpKSE9Znx8cyYmXyhuZXcgcykhPWgpJiYoXz1mdW5jdGlvbihlKXt2YXIgdD11KGUpLG49IltvYmplY3QgT2JqZWN0XSI9PXQ/ZS5jb25zdHJ1Y3Rvcjp2b2lkIDAscj1uP2Mobik6IiI7aWYocilzd2l0Y2gocil7Y2FzZSBtOnJldHVybiBkO2Nhc2UgdjpyZXR1cm4gbDtjYXNlIGc6cmV0dXJuIHA7Y2FzZSB5OnJldHVybiBmO2Nhc2UgYjpyZXR1cm4gaH1yZXR1cm4gdH0pLGUuZXhwb3J0cz1ffSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big1Niksbz1uKDI1MiksYT1uKDc0MyksaT1uKDEwMCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIoZSk/ZTpvKGUsdCk/W2VdOmEoaShlKSl9fSxmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4oZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX10LmlzQXJyYXk9ZnVuY3Rpb24oZSl7cmV0dXJuIEFycmF5LmlzQXJyYXk/QXJyYXkuaXNBcnJheShlKToiW29iamVjdCBBcnJheV0iPT09bihlKX0sdC5pc0Jvb2xlYW49ZnVuY3Rpb24oZSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZX0sdC5pc051bGw9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PT1lfSx0LmlzTnVsbE9yVW5kZWZpbmVkPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lfSx0LmlzTnVtYmVyPWZ1bmN0aW9uKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZX0sdC5pc1N0cmluZz1mdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV9LHQuaXNTeW1ib2w9ZnVuY3Rpb24oZSl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiBlfSx0LmlzVW5kZWZpbmVkPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lfSx0LmlzUmVnRXhwPWZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IFJlZ0V4cF0iPT09bihlKX0sdC5pc09iamVjdD1mdW5jdGlvbihlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPT1lfSx0LmlzRGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBEYXRlXSI9PT1uKGUpfSx0LmlzRXJyb3I9ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgRXJyb3JdIj09PW4oZSl8fGUgaW5zdGFuY2VvZiBFcnJvcn0sdC5pc0Z1bmN0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlfSx0LmlzUHJpbWl0aXZlPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT09ZXx8ImJvb2xlYW4iPT10eXBlb2YgZXx8Im51bWJlciI9PXR5cGVvZiBlfHwic3RyaW5nIj09dHlwZW9mIGV8fCJzeW1ib2wiPT10eXBlb2YgZXx8dm9pZCAwPT09ZX0sdC5pc0J1ZmZlcj1lLmlzQnVmZmVyfSkuY2FsbCh0aGlzLG4oMTMyKS5CdWZmZXIpfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMTIpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsbil7Zm9yKHZhciBvIGluIHQpbiYmbi51bnNhZmUmJmVbb10/ZVtvXT10W29dOnIoZSxvLHRbb10sbik7cmV0dXJuIGV9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNzYpLG89ZnVuY3Rpb24oZSl7dmFyIHQsbjt0aGlzLnByb21pc2U9bmV3IGUoKGZ1bmN0aW9uKGUscil7aWYodm9pZCAwIT09dHx8dm9pZCAwIT09bil0aHJvdyBUeXBlRXJyb3IoIkJhZCBQcm9taXNlIGNvbnN0cnVjdG9yIik7dD1lLG49cn0pKSx0aGlzLnJlc29sdmU9cih0KSx0aGlzLnJlamVjdD1yKG4pfTtlLmV4cG9ydHMuZj1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IG8oZSl9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTY3KSxvPW4oMjYxKSxhPW4oNDYzKSxpPW4oNDY0KSxzPShuKDM0KSxyLmdldExpc3RlbmVyKTtmdW5jdGlvbiB1KGUsdCxuKXt2YXIgcj1mdW5jdGlvbihlLHQsbil7dmFyIHI9dC5kaXNwYXRjaENvbmZpZy5waGFzZWRSZWdpc3RyYXRpb25OYW1lc1tuXTtyZXR1cm4gcyhlLHIpfShlLG4sdCk7ciYmKG4uX2Rpc3BhdGNoTGlzdGVuZXJzPWEobi5fZGlzcGF0Y2hMaXN0ZW5lcnMsciksbi5fZGlzcGF0Y2hJbnN0YW5jZXM9YShuLl9kaXNwYXRjaEluc3RhbmNlcyxlKSl9ZnVuY3Rpb24gYyhlKXtlJiZlLmRpc3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzJiZvLnRyYXZlcnNlVHdvUGhhc2UoZS5fdGFyZ2V0SW5zdCx1LGUpfWZ1bmN0aW9uIGwoZSl7aWYoZSYmZS5kaXNwYXRjaENvbmZpZy5waGFzZWRSZWdpc3RyYXRpb25OYW1lcyl7dmFyIHQ9ZS5fdGFyZ2V0SW5zdCxuPXQ/by5nZXRQYXJlbnRJbnN0YW5jZSh0KTpudWxsO28udHJhdmVyc2VUd29QaGFzZShuLHUsZSl9fWZ1bmN0aW9uIHAoZSx0LG4pe2lmKG4mJm4uZGlzcGF0Y2hDb25maWcucmVnaXN0cmF0aW9uTmFtZSl7dmFyIHI9bi5kaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lLG89cyhlLHIpO28mJihuLl9kaXNwYXRjaExpc3RlbmVycz1hKG4uX2Rpc3BhdGNoTGlzdGVuZXJzLG8pLG4uX2Rpc3BhdGNoSW5zdGFuY2VzPWEobi5fZGlzcGF0Y2hJbnN0YW5jZXMsZSkpfX1mdW5jdGlvbiBmKGUpe2UmJmUuZGlzcGF0Y2hDb25maWcucmVnaXN0cmF0aW9uTmFtZSYmcChlLl90YXJnZXRJbnN0LDAsZSl9dmFyIGg9e2FjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXM6ZnVuY3Rpb24oZSl7aShlLGMpfSxhY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzU2tpcFRhcmdldDpmdW5jdGlvbihlKXtpKGUsbCl9LGFjY3VtdWxhdGVEaXJlY3REaXNwYXRjaGVzOmZ1bmN0aW9uKGUpe2koZSxmKX0sYWNjdW11bGF0ZUVudGVyTGVhdmVEaXNwYXRjaGVzOmZ1bmN0aW9uKGUsdCxuLHIpe28udHJhdmVyc2VFbnRlckxlYXZlKG4scixwLGUsdCl9fTtlLmV4cG9ydHM9aH0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMwKSxvPW4oMjYwKSxhPW4oMjYxKSxpPW4oMjYyKSxzPW4oNDYzKSx1PW4oNDY0KSxjPShuKDI1KSx7fSksbD1udWxsLHA9ZnVuY3Rpb24oZSx0KXtlJiYoYS5leGVjdXRlRGlzcGF0Y2hlc0luT3JkZXIoZSx0KSxlLmlzUGVyc2lzdGVudCgpfHxlLmNvbnN0cnVjdG9yLnJlbGVhc2UoZSkpfSxmPWZ1bmN0aW9uKGUpe3JldHVybiBwKGUsITApfSxoPWZ1bmN0aW9uKGUpe3JldHVybiBwKGUsITEpfSxkPWZ1bmN0aW9uKGUpe3JldHVybiIuIitlLl9yb290Tm9kZUlEfTt2YXIgbT17aW5qZWN0aW9uOntpbmplY3RFdmVudFBsdWdpbk9yZGVyOm8uaW5qZWN0RXZlbnRQbHVnaW5PcmRlcixpbmplY3RFdmVudFBsdWdpbnNCeU5hbWU6by5pbmplY3RFdmVudFBsdWdpbnNCeU5hbWV9LHB1dExpc3RlbmVyOmZ1bmN0aW9uKGUsdCxuKXsiZnVuY3Rpb24iIT10eXBlb2YgbiYmcigiOTQiLHQsdHlwZW9mIG4pO3ZhciBhPWQoZSk7KGNbdF18fChjW3RdPXt9KSlbYV09bjt2YXIgaT1vLnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW3RdO2kmJmkuZGlkUHV0TGlzdGVuZXImJmkuZGlkUHV0TGlzdGVuZXIoZSx0LG4pfSxnZXRMaXN0ZW5lcjpmdW5jdGlvbihlLHQpe3ZhciBuPWNbdF07aWYoZnVuY3Rpb24oZSx0LG4pe3N3aXRjaChlKXtjYXNlIm9uQ2xpY2siOmNhc2Uib25DbGlja0NhcHR1cmUiOmNhc2Uib25Eb3VibGVDbGljayI6Y2FzZSJvbkRvdWJsZUNsaWNrQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlRG93biI6Y2FzZSJvbk1vdXNlRG93bkNhcHR1cmUiOmNhc2Uib25Nb3VzZU1vdmUiOmNhc2Uib25Nb3VzZU1vdmVDYXB0dXJlIjpjYXNlIm9uTW91c2VVcCI6Y2FzZSJvbk1vdXNlVXBDYXB0dXJlIjpyZXR1cm4hKCFuLmRpc2FibGVkfHwocj10LCJidXR0b24iIT09ciYmImlucHV0IiE9PXImJiJzZWxlY3QiIT09ciYmInRleHRhcmVhIiE9PXIpKTtkZWZhdWx0OnJldHVybiExfXZhciByfSh0LGUuX2N1cnJlbnRFbGVtZW50LnR5cGUsZS5fY3VycmVudEVsZW1lbnQucHJvcHMpKXJldHVybiBudWxsO3ZhciByPWQoZSk7cmV0dXJuIG4mJm5bcl19LGRlbGV0ZUxpc3RlbmVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49by5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1t0XTtuJiZuLndpbGxEZWxldGVMaXN0ZW5lciYmbi53aWxsRGVsZXRlTGlzdGVuZXIoZSx0KTt2YXIgcj1jW3RdO3ImJmRlbGV0ZSByW2QoZSldfSxkZWxldGVBbGxMaXN0ZW5lcnM6ZnVuY3Rpb24oZSl7dmFyIHQ9ZChlKTtmb3IodmFyIG4gaW4gYylpZihjLmhhc093blByb3BlcnR5KG4pJiZjW25dW3RdKXt2YXIgcj1vLnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW25dO3ImJnIud2lsbERlbGV0ZUxpc3RlbmVyJiZyLndpbGxEZWxldGVMaXN0ZW5lcihlLG4pLGRlbGV0ZSBjW25dW3RdfX0sZXh0cmFjdEV2ZW50czpmdW5jdGlvbihlLHQsbixyKXtmb3IodmFyIGEsaT1vLnBsdWdpbnMsdT0wO3U8aS5sZW5ndGg7dSsrKXt2YXIgYz1pW3VdO2lmKGMpe3ZhciBsPWMuZXh0cmFjdEV2ZW50cyhlLHQsbixyKTtsJiYoYT1zKGEsbCkpfX1yZXR1cm4gYX0sZW5xdWV1ZUV2ZW50czpmdW5jdGlvbihlKXtlJiYobD1zKGwsZSkpfSxwcm9jZXNzRXZlbnRRdWV1ZTpmdW5jdGlvbihlKXt2YXIgdD1sO2w9bnVsbCx1KHQsZT9mOmgpLGwmJnIoIjk1IiksaS5yZXRocm93Q2F1Z2h0RXJyb3IoKX0sX19wdXJnZTpmdW5jdGlvbigpe2M9e319LF9fZ2V0TGlzdGVuZXJCYW5rOmZ1bmN0aW9uKCl7cmV0dXJuIGN9fTtlLmV4cG9ydHM9bX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDkwKSxvPW4oMjYzKSxhPXt2aWV3OmZ1bmN0aW9uKGUpe2lmKGUudmlldylyZXR1cm4gZS52aWV3O3ZhciB0PW8oZSk7aWYodC53aW5kb3c9PT10KXJldHVybiB0O3ZhciBuPXQub3duZXJEb2N1bWVudDtyZXR1cm4gbj9uLmRlZmF1bHRWaWV3fHxuLnBhcmVudFdpbmRvdzp3aW5kb3d9LGRldGFpbDpmdW5jdGlvbihlKXtyZXR1cm4gZS5kZXRhaWx8fDB9fTtmdW5jdGlvbiBpKGUsdCxuLG8pe3JldHVybiByLmNhbGwodGhpcyxlLHQsbixvKX1yLmF1Z21lbnRDbGFzcyhpLGEpLGUuZXhwb3J0cz1pfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXtyZW1vdmU6ZnVuY3Rpb24oZSl7ZS5fcmVhY3RJbnRlcm5hbEluc3RhbmNlPXZvaWQgMH0sZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBlLl9yZWFjdEludGVybmFsSW5zdGFuY2V9LGhhczpmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwIT09ZS5fcmVhY3RJbnRlcm5hbEluc3RhbmNlfSxzZXQ6ZnVuY3Rpb24oZSx0KXtlLl9yZWFjdEludGVybmFsSW5zdGFuY2U9dH19O2UuZXhwb3J0cz1yfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigyNTkpLG89big0NTgpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixhKXt2YXIgaT0hbjtufHwobj17fSk7Zm9yKHZhciBzPS0xLHU9dC5sZW5ndGg7KytzPHU7KXt2YXIgYz10W3NdLGw9YT9hKG5bY10sZVtjXSxjLG4sZSk6dm9pZCAwO3ZvaWQgMD09PWwmJihsPWVbY10pLGk/byhuLGMsbCk6cihuLGMsbCl9cmV0dXJuIG59fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMTQpLG89big1OSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKCFvKGUpKXJldHVybiExO3ZhciB0PXIoZSk7cmV0dXJuIltvYmplY3QgRnVuY3Rpb25dIj09dHx8IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIj09dHx8IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iPT10fHwiW29iamVjdCBQcm94eV0iPT10fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtuLnIodCksbi5kKHQsInJlcXVlc3RTbmlwcGV0R2VuZXJhdG9yX2N1cmxfcG93ZXJzaGVsbCIsKGZ1bmN0aW9uKCl7cmV0dXJuIE59KSksbi5kKHQsInJlcXVlc3RTbmlwcGV0R2VuZXJhdG9yX2N1cmxfYmFzaCIsKGZ1bmN0aW9uKCl7cmV0dXJuIE19KSksbi5kKHQsInJlcXVlc3RTbmlwcGV0R2VuZXJhdG9yX2N1cmxfY21kIiwoZnVuY3Rpb24oKXtyZXR1cm4gUn0pKTt2YXIgcj1uKDE0KSxvPW4ubihyKSxhPW4oMTMpLGk9bi5uKGEpLHM9big0OSksdT1uLm4ocyksYz1uKDE3KSxsPW4ubihjKSxwPW4oMTAxKSxmPW4ubihwKSxoPW4oMiksZD1uLm4oaCksbT1uKDMyKSx2PW4ubihtKSxnPW4oNCkseT1uLm4oZyksYj1uKDUxNCksXz1uLm4oYiksdz1uKDgxKSx4PW4ubih3KSxFPW4oMzEpLFM9bi5uKEUpLEM9bigyNiksQT1uKDEpLE89ZnVuY3Rpb24oZSl7dmFyIHQsbj0iXyoqW10iO3JldHVybiBsKCkoZSkuY2FsbChlLG4pPDA/ZTpmKCkodD1lLnNwbGl0KG4pWzBdKS5jYWxsKHQpfSxrPWZ1bmN0aW9uKGUpe3JldHVybiItZCAiPT09ZXx8L15bX1wvLV0vZy50ZXN0KGUpP2U6IiciK2UucmVwbGFjZSgvJy9nLCInXFwnJyIpKyInIn0saj1mdW5jdGlvbihlKXtyZXR1cm4iLWQgIj09PShlPWUucmVwbGFjZSgvXF4vZywiXl4iKS5yZXBsYWNlKC9cXCIvZywnXFxcXCInKS5yZXBsYWNlKC8iL2csJyIiJykucmVwbGFjZSgvXG4vZywiXlxuIikpP2UucmVwbGFjZSgvLWQgL2csIi1kIF5cbiIpOi9eW19cLy1dL2cudGVzdChlKT9lOiciJytlKyciJ30sVD1mdW5jdGlvbihlKXtyZXR1cm4iLWQgIj09PWU/ZTovXG4vLnRlc3QoZSk/J0AiXG4nK2UucmVwbGFjZSgvIi9nLCdcXCInKS5yZXBsYWNlKC9gL2csImBgIikucmVwbGFjZSgvXCQvLCJgJCIpKydcbiJAJzovXltfXC8tXS9nLnRlc3QoZSk/ZToiJyIrZS5yZXBsYWNlKC8iL2csJyIiJykucmVwbGFjZSgvJy9nLCInJyIpKyInIn07ZnVuY3Rpb24gSShlKXt2YXIgdCxuPVtdLHI9dSgpKGUuZ2V0KCJib2R5IikuZW50cnlTZXEoKSk7dHJ5e2ZvcihyLnMoKTshKHQ9ci5uKCkpLmRvbmU7KXt2YXIgbyxhLHMsYz1pKCkodC52YWx1ZSwyKSxsPWNbMF0scD1jWzFdLGY9TyhsKTtpZihwIGluc3RhbmNlb2YgQy5hLkZpbGUpbi5wdXNoKGQoKShvPWQoKShhPScgICInLmNvbmNhdChmLCciOiB7XG4gICAgIm5hbWUiOiAiJykpLmNhbGwoYSxwLm5hbWUsJyInKSkuY2FsbChvLHAudHlwZT8nLFxuICAgICJ0eXBlIjogIicuY29uY2F0KHAudHlwZSwnIicpOiIiLCJcbiAgfSIpKTtlbHNlIG4ucHVzaChkKCkocz0nICAiJy5jb25jYXQoZiwnIjogJykpLmNhbGwocyx2KCkocCxudWxsLDIpLnJlcGxhY2UoLyhcclxufFxyfFxuKS9nLCJcbiAgIikpKX19Y2F0Y2goZSl7ci5lKGUpfWZpbmFsbHl7ci5mKCl9cmV0dXJuIntcbiIuY29uY2F0KG4uam9pbigiLFxuIiksIlxufSIpfXZhciBQPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixhPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXToiIixzPSExLGM9IiIsbD1mdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLG49bmV3IEFycmF5KGUpLHI9MDtyPGU7cisrKW5bcl09YXJndW1lbnRzW3JdO3JldHVybiBjKz0iICIreSgpKG4pLmNhbGwobix0KS5qb2luKCIgIil9LHA9ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheShlKSxyPTA7cjxlO3IrKyluW3JdPWFyZ3VtZW50c1tyXTtyZXR1cm4gYys9eSgpKG4pLmNhbGwobix0KS5qb2luKCIgIil9LGY9ZnVuY3Rpb24oKXtyZXR1cm4gYys9IiAiLmNvbmNhdChuKX0saD1mdW5jdGlvbigpe3ZhciBlLHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOjE7cmV0dXJuIGMrPV8oKShlPSIgICIpLmNhbGwoZSx0KX0sbT1lLmdldCgiaGVhZGVycyIpO2lmKGMrPSJjdXJsIithLGUuaGFzKCJjdXJsT3B0aW9ucyIpJiZsLmFwcGx5KHZvaWQgMCxvKCkoZS5nZXQoImN1cmxPcHRpb25zIikpKSxsKCItWCIsZS5nZXQoIm1ldGhvZCIpKSxmKCksaCgpLHAoIiIuY29uY2F0KGUuZ2V0KCJ1cmwiKSkpLG0mJm0uc2l6ZSl7dmFyIGcsYix3PXUoKSh4KCkoZz1lLmdldCgiaGVhZGVycyIpKS5jYWxsKGcpKTt0cnl7Zm9yKHcucygpOyEoYj13Lm4oKSkuZG9uZTspe3ZhciBFLGs9Yi52YWx1ZTtmKCksaCgpO3ZhciBqPWkoKShrLDIpLFQ9alswXSxQPWpbMV07cCgiLUgiLGQoKShFPSIiLmNvbmNhdChULCI6ICIpKS5jYWxsKEUsUCkpLHM9c3x8L15jb250ZW50LXR5cGUkL2kudGVzdChUKSYmL15tdWx0aXBhcnRcL2Zvcm0tZGF0YSQvaS50ZXN0KFApfX1jYXRjaChlKXt3LmUoZSl9ZmluYWxseXt3LmYoKX19aWYoZS5nZXQoImJvZHkiKSlpZihzJiZTKCkocj1bIlBPU1QiLCJQVVQiLCJQQVRDSCJdKS5jYWxsKHIsZS5nZXQoIm1ldGhvZCIpKSl7dmFyIE4sTT11KCkoZS5nZXQoImJvZHkiKS5lbnRyeVNlcSgpKTt0cnl7Zm9yKE0ucygpOyEoTj1NLm4oKSkuZG9uZTspe3ZhciBSLEQsTCxCPWkoKShOLnZhbHVlLDIpLEY9QlswXSxVPUJbMV0scT1PKEYpO2lmKGYoKSxoKCkscCgiLUYiKSxVIGluc3RhbmNlb2YgQy5hLkZpbGUpbChkKCkoUj1kKCkoRD0iIi5jb25jYXQocSwiPUAiKSkuY2FsbChELFUubmFtZSkpLmNhbGwoUixVLnR5cGU/Ijt0eXBlPSIuY29uY2F0KFUudHlwZSk6IiIpKTtlbHNlIGwoZCgpKEw9IiIuY29uY2F0KHEsIj0iKSkuY2FsbChMLFUpKX19Y2F0Y2goZSl7TS5lKGUpfWZpbmFsbHl7TS5mKCl9fWVsc2V7ZigpLGgoKSxwKCItZCAiKTt2YXIgej1lLmdldCgiYm9keSIpO0EuTWFwLmlzTWFwKHopP3AoSShlKSk6KCJzdHJpbmciIT10eXBlb2YgeiYmKHo9digpKHopKSxwKHopKX1lbHNlIGUuZ2V0KCJib2R5Iil8fCJQT1NUIiE9PWUuZ2V0KCJtZXRob2QiKXx8KGYoKSxoKCkscCgiLWQgJyciKSk7cmV0dXJuIGN9LE49ZnVuY3Rpb24oZSl7cmV0dXJuIFAoZSxULCJgXG4iLCIuZXhlIil9LE09ZnVuY3Rpb24oZSl7cmV0dXJuIFAoZSxrLCJcXFxuIil9LFI9ZnVuY3Rpb24oZSl7cmV0dXJuIFAoZSxqLCJeXG4iKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpLG4uZCh0LCJwYXJzZVlhbWxDb25maWciLChmdW5jdGlvbigpe3JldHVybiBvfSkpO3ZhciByPW4oNzMpLG89ZnVuY3Rpb24oZSx0KXt0cnl7cmV0dXJuIHIuYS5sb2FkKGUpfWNhdGNoKGUpe3JldHVybiB0JiZ0LmVyckFjdGlvbnMubmV3VGhyb3duRXJyKG5ldyBFcnJvcihlKSkse319fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtuLnIodCksbi5kKHQsImdldERlZmF1bHRSZXF1ZXN0Qm9keVZhbHVlIiwoZnVuY3Rpb24oKXtyZXR1cm4gX30pKTt2YXIgcj1uKDEzKSxvPW4ubihyKSxhPW4oNCksaT1uLm4oYSkscz1uKDE3KSx1PW4ubihzKSxjPW4oMzEpLGw9bi5uKGMpLHA9bigyKSxmPW4ubihwKSxoPW4oMjMpLGQ9bi5uKGgpLG09bigwKSx2PW4ubihtKSxnPShuKDExKSxuKDI3KSxuKDEpKSx5PW4oNSksYj1uKDEwMyksXz1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5nZXRJbihbImNvbnRlbnQiLHRdKSxvPXIuZ2V0KCJzY2hlbWEiKS50b0pTKCksYT12b2lkIDAhPT1yLmdldCgiZXhhbXBsZXMiKSxpPXIuZ2V0KCJleGFtcGxlIikscz1hP3IuZ2V0SW4oWyJleGFtcGxlcyIsbiwidmFsdWUiXSk6aSx1PU9iamVjdCh5Lm8pKG8sdCx7aW5jbHVkZVdyaXRlT25seTohMH0scyk7cmV0dXJuIE9iamVjdCh5LkkpKHUpfTt0LmRlZmF1bHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS51c2VySGFzRWRpdGVkQm9keSxuPWUucmVxdWVzdEJvZHkscj1lLnJlcXVlc3RCb2R5VmFsdWUsYT1lLnJlcXVlc3RCb2R5SW5jbHVzaW9uU2V0dGluZyxzPWUucmVxdWVzdEJvZHlFcnJvcnMsYz1lLmdldENvbXBvbmVudCxwPWUuZ2V0Q29uZmlncyxoPWUuc3BlY1NlbGVjdG9ycyxtPWUuZm4sdz1lLmNvbnRlbnRUeXBlLHg9ZS5pc0V4ZWN1dGUsRT1lLnNwZWNQYXRoLFM9ZS5vbkNoYW5nZSxDPWUub25DaGFuZ2VJbmNsdWRlRW1wdHksQT1lLmFjdGl2ZUV4YW1wbGVzS2V5LE89ZS51cGRhdGVBY3RpdmVFeGFtcGxlc0tleSxrPWUuc2V0UmV0YWluUmVxdWVzdEJvZHlWYWx1ZUZsYWcsaj1mdW5jdGlvbihlKXt2YXIgdD17a2V5OmUsc2hvdWxkRGlzcGF0Y2hJbml0OiExLGRlZmF1bHRWYWx1ZTohMH07cmV0dXJuIm5vIHZhbHVlIj09PWEuZ2V0KGUsIm5vIHZhbHVlIikmJih0LnNob3VsZERpc3BhdGNoSW5pdD0hMCksdH0sVD1jKCJNYXJrZG93biIsITApLEk9YygibW9kZWxFeGFtcGxlIiksUD1jKCJSZXF1ZXN0Qm9keUVkaXRvciIpLE49YygiaGlnaGxpZ2h0Q29kZSIpLE09YygiRXhhbXBsZXNTZWxlY3RWYWx1ZVJldGFpbmVyIiksUj1jKCJFeGFtcGxlIiksRD1jKCJQYXJhbWV0ZXJJbmNsdWRlRW1wdHkiKSxMPXAoKS5zaG93Q29tbW9uRXh0ZW5zaW9ucyxCPW4mJm4uZ2V0KCJkZXNjcmlwdGlvbiIpfHxudWxsLEY9biYmbi5nZXQoImNvbnRlbnQiKXx8bmV3IGcuT3JkZXJlZE1hcDt3PXd8fEYua2V5U2VxKCkuZmlyc3QoKXx8IiI7dmFyIFU9Ri5nZXQodyxPYmplY3QoZy5PcmRlcmVkTWFwKSgpKSxxPVUuZ2V0KCJzY2hlbWEiLE9iamVjdChnLk9yZGVyZWRNYXApKCkpLHo9VS5nZXQoImV4YW1wbGVzIixudWxsKSxWPW51bGw9PXo/dm9pZCAwOmkoKSh6KS5jYWxsKHosKGZ1bmN0aW9uKGUsdCl7dmFyIHIsbz1udWxsPT09KHI9ZSl8fHZvaWQgMD09PXI/dm9pZCAwOnIuZ2V0KCJ2YWx1ZSIsbnVsbCk7cmV0dXJuIG8mJihlPWUuc2V0KCJ2YWx1ZSIsXyhuLHcsdCksbykpLGV9KSk7aWYocz1nLkxpc3QuaXNMaXN0KHMpP3M6T2JqZWN0KGcuTGlzdCkoKSwhVS5zaXplKXJldHVybiBudWxsO3ZhciBXPSJvYmplY3QiPT09VS5nZXRJbihbInNjaGVtYSIsInR5cGUiXSksSD0iYmluYXJ5Ij09PVUuZ2V0SW4oWyJzY2hlbWEiLCJmb3JtYXQiXSksJD0iYmFzZTY0Ij09PVUuZ2V0SW4oWyJzY2hlbWEiLCJmb3JtYXQiXSk7aWYoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSI9PT13fHwwPT09dSgpKHcpLmNhbGwodywiaW1hZ2UvIil8fDA9PT11KCkodykuY2FsbCh3LCJhdWRpby8iKXx8MD09PXUoKSh3KS5jYWxsKHcsInZpZGVvLyIpfHxIfHwkKXt2YXIgSj1jKCJJbnB1dCIpO3JldHVybiB4P3YuYS5jcmVhdGVFbGVtZW50KEose3R5cGU6ImZpbGUiLG9uQ2hhbmdlOmZ1bmN0aW9uKGUpe1MoZS50YXJnZXQuZmlsZXNbMF0pfX0pOnYuYS5jcmVhdGVFbGVtZW50KCJpIixudWxsLCJFeGFtcGxlIHZhbHVlcyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgIix2LmEuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCx3KSwiIG1lZGlhIHR5cGVzLiIpfWlmKFcmJigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIj09PXd8fDA9PT11KCkodykuY2FsbCh3LCJtdWx0aXBhcnQvIikpJiZxLmdldCgicHJvcGVydGllcyIsT2JqZWN0KGcuT3JkZXJlZE1hcCkoKSkuc2l6ZT4wKXt2YXIgSyxZPWMoIkpzb25TY2hlbWFGb3JtIiksRz1jKCJQYXJhbWV0ZXJFeHQiKSxaPXEuZ2V0KCJwcm9wZXJ0aWVzIixPYmplY3QoZy5PcmRlcmVkTWFwKSgpKTtyZXR1cm4gcj1nLk1hcC5pc01hcChyKT9yOk9iamVjdChnLk9yZGVyZWRNYXApKCksdi5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToidGFibGUtY29udGFpbmVyIn0sQiYmdi5hLmNyZWF0ZUVsZW1lbnQoVCx7c291cmNlOkJ9KSx2LmEuY3JlYXRlRWxlbWVudCgidGFibGUiLG51bGwsdi5hLmNyZWF0ZUVsZW1lbnQoInRib2R5IixudWxsLGcuTWFwLmlzTWFwKFopJiZpKCkoSz1aLmVudHJ5U2VxKCkpLmNhbGwoSywoZnVuY3Rpb24oZSl7dmFyIHQsbix1PW8oKShlLDIpLHA9dVswXSxoPXVbMV07aWYoIWguZ2V0KCJyZWFkT25seSIpKXt2YXIgYj1MP09iamVjdCh5LmwpKGgpOm51bGwsXz1sKCkodD1xLmdldCgicmVxdWlyZWQiLE9iamVjdChnLkxpc3QpKCkpKS5jYWxsKHQscCksdz1oLmdldCgidHlwZSIpLEU9aC5nZXQoImZvcm1hdCIpLEE9aC5nZXQoImRlc2NyaXB0aW9uIiksTz1yLmdldEluKFtwLCJ2YWx1ZSJdKSxrPXIuZ2V0SW4oW3AsImVycm9ycyJdKXx8cyxJPWEuZ2V0KHApfHwhMSxQPWguaGFzKCJkZWZhdWx0Iil8fGguaGFzKCJleGFtcGxlIil8fGguaGFzSW4oWyJpdGVtcyIsImV4YW1wbGUiXSl8fGguaGFzSW4oWyJpdGVtcyIsImRlZmF1bHQiXSksTj1oLmhhcygiZW51bSIpJiYoMT09PWguZ2V0KCJlbnVtIikuc2l6ZXx8XyksTT1QfHxOLFI9IiI7ImFycmF5IiE9PXd8fE18fChSPVtdKSwoIm9iamVjdCI9PT13fHxNKSYmKFI9T2JqZWN0KHkubykoaCwhMSx7aW5jbHVkZVdyaXRlT25seTohMH0pKSwic3RyaW5nIiE9dHlwZW9mIFImJiJvYmplY3QiPT09dyYmKFI9T2JqZWN0KHkuSSkoUikpLCJzdHJpbmciPT10eXBlb2YgUiYmImFycmF5Ij09PXcmJihSPUpTT04ucGFyc2UoUikpO3ZhciBCPSJzdHJpbmciPT09dyYmKCJiaW5hcnkiPT09RXx8ImJhc2U2NCI9PT1FKTtyZXR1cm4gdi5hLmNyZWF0ZUVsZW1lbnQoInRyIix7a2V5OnAsY2xhc3NOYW1lOiJwYXJhbWV0ZXJzIiwiZGF0YS1wcm9wZXJ0eS1uYW1lIjpwfSx2LmEuY3JlYXRlRWxlbWVudCgidGQiLHtjbGFzc05hbWU6InBhcmFtZXRlcnMtY29sX25hbWUifSx2LmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOl8/InBhcmFtZXRlcl9fbmFtZSByZXF1aXJlZCI6InBhcmFtZXRlcl9fbmFtZSJ9LHAsXz92LmEuY3JlYXRlRWxlbWVudCgic3BhbiIsbnVsbCwiwqAqIik6bnVsbCksdi5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToicGFyYW1ldGVyX190eXBlIn0sdyxFJiZ2LmEuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToicHJvcC1mb3JtYXQifSwiKCQiLEUsIikiKSxMJiZiLnNpemU/aSgpKG49Yi5lbnRyeVNlcSgpKS5jYWxsKG4sKGZ1bmN0aW9uKGUpe3ZhciB0LG49bygpKGUsMikscj1uWzBdLGE9blsxXTtyZXR1cm4gdi5hLmNyZWF0ZUVsZW1lbnQoRyx7a2V5OmYoKSh0PSIiLmNvbmNhdChyLCItIikpLmNhbGwodCxhKSx4S2V5OnIseFZhbDphfSl9KSk6bnVsbCksdi5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToicGFyYW1ldGVyX19kZXByZWNhdGVkIn0saC5nZXQoImRlcHJlY2F0ZWQiKT8iZGVwcmVjYXRlZCI6bnVsbCkpLHYuYS5jcmVhdGVFbGVtZW50KCJ0ZCIse2NsYXNzTmFtZToicGFyYW1ldGVycy1jb2xfZGVzY3JpcHRpb24ifSx2LmEuY3JlYXRlRWxlbWVudChULHtzb3VyY2U6QX0pLHg/di5hLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCx2LmEuY3JlYXRlRWxlbWVudChZLHtmbjptLGRpc3BhdGNoSW5pdGlhbFZhbHVlOiFCLHNjaGVtYTpoLGRlc2NyaXB0aW9uOnAsZ2V0Q29tcG9uZW50OmMsdmFsdWU6dm9pZCAwPT09Tz9SOk8scmVxdWlyZWQ6XyxlcnJvcnM6ayxvbkNoYW5nZTpmdW5jdGlvbihlKXtTKGUsW3BdKX19KSxfP251bGw6di5hLmNyZWF0ZUVsZW1lbnQoRCx7b25DaGFuZ2U6ZnVuY3Rpb24oZSl7cmV0dXJuIEMocCxlKX0saXNJbmNsdWRlZDpJLGlzSW5jbHVkZWRPcHRpb25zOmoocCksaXNEaXNhYmxlZDpkKCkoTyk/MCE9PU8ubGVuZ3RoOiFPYmplY3QoeS5xKShPKX0pKTpudWxsKSl9fSkpKSkpfXZhciBYPV8obix3LEEpLFE9bnVsbDtyZXR1cm4gT2JqZWN0KGIuYSkoWCkmJihRPSJqc29uIiksdi5hLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxCJiZ2LmEuY3JlYXRlRWxlbWVudChULHtzb3VyY2U6Qn0pLFY/di5hLmNyZWF0ZUVsZW1lbnQoTSx7dXNlckhhc0VkaXRlZEJvZHk6dCxleGFtcGxlczpWLGN1cnJlbnRLZXk6QSxjdXJyZW50VXNlcklucHV0VmFsdWU6cixvblNlbGVjdDpmdW5jdGlvbihlKXtPKGUpfSx1cGRhdGVWYWx1ZTpTLGRlZmF1bHRUb0ZpcnN0RXhhbXBsZTohMCxnZXRDb21wb25lbnQ6YyxzZXRSZXRhaW5SZXF1ZXN0Qm9keVZhbHVlRmxhZzprfSk6bnVsbCx4P3YuYS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsdi5hLmNyZWF0ZUVsZW1lbnQoUCx7dmFsdWU6cixlcnJvcnM6cyxkZWZhdWx0VmFsdWU6WCxvbkNoYW5nZTpTLGdldENvbXBvbmVudDpjfSkpOnYuYS5jcmVhdGVFbGVtZW50KEkse2dldENvbXBvbmVudDpjLGdldENvbmZpZ3M6cCxzcGVjU2VsZWN0b3JzOmgsZXhwYW5kRGVwdGg6MSxpc0V4ZWN1dGU6eCxzY2hlbWE6VS5nZXQoInNjaGVtYSIpLHNwZWNQYXRoOkUucHVzaCgiY29udGVudCIsdyksZXhhbXBsZTp2LmEuY3JlYXRlRWxlbWVudChOLHtjbGFzc05hbWU6ImJvZHktcGFyYW1fX2V4YW1wbGUiLGdldENvbmZpZ3M6cCxsYW5ndWFnZTpRLHZhbHVlOk9iamVjdCh5LkkpKHIpfHxYfSksaW5jbHVkZVdyaXRlT25seTohMH0pLFY/di5hLmNyZWF0ZUVsZW1lbnQoUix7ZXhhbXBsZTpWLmdldChBKSxnZXRDb21wb25lbnQ6YyxnZXRDb25maWdzOnB9KTpudWxsKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpLG4uZCh0LCJtYWtlTWFwcGVkQ29udGFpbmVyIiwoZnVuY3Rpb24oKXtyZXR1cm4ga30pKSxuLmQodCwicmVuZGVyIiwoZnVuY3Rpb24oKXtyZXR1cm4gan0pKSxuLmQodCwiZ2V0Q29tcG9uZW50IiwoZnVuY3Rpb24oKXtyZXR1cm4gUH0pKTt2YXIgcj1uKDE4KSxvPW4ubihyKSxhPW4oMjgpLGk9bi5uKGEpLHM9big2KSx1PW4ubihzKSxjPW4oNyksbD1uLm4oYykscD1uKDgpLGY9bi5uKHApLGg9big5KSxkPW4ubihoKSxtPW4oMjApLHY9bi5uKG0pLGc9bigxNSkseT1uLm4oZyksYj1uKDApLF89bi5uKGIpLHc9big1MTIpLHg9bi5uKHcpLEU9bigzNTEpLFM9big1MTMpLEM9bi5uKFMpLEE9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKG4pe2YoKShvLG4pO3ZhciByPWQoKShvKTtmdW5jdGlvbiBvKCl7cmV0dXJuIHUoKSh0aGlzLG8pLHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBsKCkobyxbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBfLmEuY3JlYXRlRWxlbWVudCh0LGkoKSh7fSxlKCksdGhpcy5wcm9wcyx0aGlzLmNvbnRleHQpKX19XSksb30oYi5Db21wb25lbnQpfShlLHQpLG89T2JqZWN0KEUuY29ubmVjdCkoKGZ1bmN0aW9uKG4scil7dmFyIG89digpKHt9LHIsZSgpKTtyZXR1cm4odC5wcm90b3R5cGUubWFwU3RhdGVUb1Byb3BzfHxmdW5jdGlvbihlKXtyZXR1cm57c3RhdGU6ZX19KShuLG8pfSkpKHIpO3JldHVybiBuP2Z1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKG4pe2YoKShvLG4pO3ZhciByPWQoKShvKTtmdW5jdGlvbiBvKCl7cmV0dXJuIHUoKSh0aGlzLG8pLHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBsKCkobyxbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBfLmEuY3JlYXRlRWxlbWVudChFLlByb3ZpZGVyLHtzdG9yZTplfSxfLmEuY3JlYXRlRWxlbWVudCh0LGkoKSh7fSx0aGlzLnByb3BzLHRoaXMuY29udGV4dCkpKX19XSksb30oYi5Db21wb25lbnQpfShuLG8pOm99LE89ZnVuY3Rpb24oZSx0LG4scil7Zm9yKHZhciBvIGluIHQpe3ZhciBhPXRbb107ImZ1bmN0aW9uIj09dHlwZW9mIGEmJmEobltvXSxyW29dLGUoKSl9fSxrPWZ1bmN0aW9uKGUsdCxuLHIsbyxhKXtyZXR1cm4gZnVuY3Rpb24odCl7ZigpKGksdCk7dmFyIHI9ZCgpKGkpO2Z1bmN0aW9uIGkodCxuKXt2YXIgbztyZXR1cm4gdSgpKHRoaXMsaSksbz1yLmNhbGwodGhpcyx0LG4pLE8oZSxhLHQse30pLG99cmV0dXJuIGwoKShpLFt7a2V5OiJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIix2YWx1ZTpmdW5jdGlvbih0KXtPKGUsYSx0LHRoaXMucHJvcHMpfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPUMoKSh0aGlzLnByb3BzLGE/eSgpKGEpOltdKSx0PW4obywicm9vdCIpO3JldHVybiBfLmEuY3JlYXRlRWxlbWVudCh0LGUpfX1dKSxpfShiLkNvbXBvbmVudCl9LGo9ZnVuY3Rpb24oZSx0LG4scixvKXt2YXIgYT1uKGUsdCxyLCJBcHAiLCJyb290Iik7eC5hLnJlbmRlcihfLmEuY3JlYXRlRWxlbWVudChhLG51bGwpLG8pfSxUPWZ1bmN0aW9uKGUpe3ZhciB0PWUubmFtZTtyZXR1cm4gXy5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiZmFsbGJhY2sifSwi8J+YsSAiLF8uYS5jcmVhdGVFbGVtZW50KCJpIixudWxsLCJDb3VsZCBub3QgcmVuZGVyICIsInQiPT09dD8idGhpcyBjb21wb25lbnQiOnQsIiwgc2VlIHRoZSBjb25zb2xlLiIpKX0sST1mdW5jdGlvbihlKXt2YXIgdD1mdW5jdGlvbihlKXtyZXR1cm4hKGUucHJvdG90eXBlJiZlLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50KX0oZSk/ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe2YoKShyLHQpO3ZhciBuPWQoKShyKTtmdW5jdGlvbiByKCl7cmV0dXJuIHUoKSh0aGlzLHIpLG4uYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBsKCkocixbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBlKHRoaXMucHJvcHMpfX1dKSxyfShiLkNvbXBvbmVudCl9KGUpOmUsbj10LnByb3RvdHlwZS5yZW5kZXI7cmV0dXJuIHQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3RyeXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheShlKSxvPTA7bzxlO28rKylyW29dPWFyZ3VtZW50c1tvXTtyZXR1cm4gbi5hcHBseSh0aGlzLHIpfWNhdGNoKGUpe3JldHVybiBjb25zb2xlLmVycm9yKGUpLF8uYS5jcmVhdGVFbGVtZW50KFQse2Vycm9yOmUsbmFtZTp0Lm5hbWV9KX19LHR9LFA9ZnVuY3Rpb24oZSx0LG4scixhKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjUmJnZvaWQgMCE9PWFyZ3VtZW50c1s1XT9hcmd1bWVudHNbNV06e307aWYoInN0cmluZyIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoIk5lZWQgYSBzdHJpbmcsIHRvIGZldGNoIGEgY29tcG9uZW50LiBXYXMgZ2l2ZW4gYSAiK28oKShyKSk7dmFyIHM9bihyKTtyZXR1cm4gcz9hPyJyb290Ij09PWE/QShlLHMsdCgpKTpBKGUsSShzKSk6SShzKTooaS5mYWlsU2lsZW50bHl8fGUoKS5sb2cud2FybigiQ291bGQgbm90IGZpbmQgY29tcG9uZW50OiIsciksbnVsbCl9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KSxuLmQodCwic2V0SGFzaCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KSk7dmFyIHI9ZnVuY3Rpb24oZSl7cmV0dXJuIGU/aGlzdG9yeS5wdXNoU3RhdGUobnVsbCxudWxsLCIjIi5jb25jYXQoZSkpOndpbmRvdy5sb2NhdGlvbi5oYXNoPSIifX0sZnVuY3Rpb24oZSx0LG4pe2UuZXhwb3J0cz1uKDUzNSl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9e30ucHJvcGVydHlJc0VudW1lcmFibGUsbz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLGE9byYmIXIuY2FsbCh7MToyfSwxKTt0LmY9YT9mdW5jdGlvbihlKXt2YXIgdD1vKHRoaXMsZSk7cmV0dXJuISF0JiZ0LmVudW1lcmFibGV9OnJ9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDM3KSxvPW4oMTUyKSxhPSIiLnNwbGl0O2UuZXhwb3J0cz1yKChmdW5jdGlvbigpe3JldHVybiFPYmplY3QoInoiKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKX0pKT9mdW5jdGlvbihlKXtyZXR1cm4iU3RyaW5nIj09byhlKT9hLmNhbGwoZSwiIik6T2JqZWN0KGUpfTpPYmplY3R9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDQ3KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZighcihlKSlyZXR1cm4gZTt2YXIgbixvO2lmKHQmJiJmdW5jdGlvbiI9PXR5cGVvZihuPWUudG9TdHJpbmcpJiYhcihvPW4uY2FsbChlKSkpcmV0dXJuIG87aWYoImZ1bmN0aW9uIj09dHlwZW9mKG49ZS52YWx1ZU9mKSYmIXIobz1uLmNhbGwoZSkpKXJldHVybiBvO2lmKCF0JiYiZnVuY3Rpb24iPT10eXBlb2Yobj1lLnRvU3RyaW5nKSYmIXIobz1uLmNhbGwoZSkpKXJldHVybiBvO3Rocm93IFR5cGVFcnJvcigiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIil9fSxmdW5jdGlvbihlLHQpe3ZhciBuPTAscj1NYXRoLnJhbmRvbSgpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4iU3ltYm9sKCIrU3RyaW5nKHZvaWQgMD09PWU/IiI6ZSkrIilfIisoKytuK3IpLnRvU3RyaW5nKDM2KX19LGZ1bmN0aW9uKGUsdCl7fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigyMjUpLG89bigxODEpLGE9cigia2V5cyIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gYVtlXXx8KGFbZV09byhlKSl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big1NSksbz1uKDYyKSxhPW4oMTgzKSxpPW4oMzcyKSxzPWEoIklFX1BST1RPIiksdT1PYmplY3QucHJvdG90eXBlO2UuZXhwb3J0cz1pP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbihlKXtyZXR1cm4gZT1vKGUpLHIoZSxzKT9lW3NdOiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNvbnN0cnVjdG9yJiZlIGluc3RhbmNlb2YgZS5jb25zdHJ1Y3Rvcj9lLmNvbnN0cnVjdG9yLnByb3RvdHlwZTplIGluc3RhbmNlb2YgT2JqZWN0P3U6bnVsbH19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDUyKSxvPW4oNTY2KTtlLmV4cG9ydHM9T2JqZWN0LnNldFByb3RvdHlwZU9mfHwoIl9fcHJvdG9fXyJpbnt9P2Z1bmN0aW9uKCl7dmFyIGUsdD0hMSxuPXt9O3RyeXsoZT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5wcm90b3R5cGUsIl9fcHJvdG9fXyIpLnNldCkuY2FsbChuLFtdKSx0PW4gaW5zdGFuY2VvZiBBcnJheX1jYXRjaChlKXt9cmV0dXJuIGZ1bmN0aW9uKG4sYSl7cmV0dXJuIHIobiksbyhhKSx0P2UuY2FsbChuLGEpOm4uX19wcm90b19fPWEsbn19KCk6dm9pZCAwKX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTUyKSxvPW4oNDApO2UuZXhwb3J0cz0icHJvY2VzcyI9PXIoby5wcm9jZXNzKX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNjI5KSxvPW4oMzkyKSxhPW4oMzkwKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgbjtpZihlKXtpZigic3RyaW5nIj09dHlwZW9mIGUpcmV0dXJuIGEoZSx0KTt2YXIgaT1yKG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpKS5jYWxsKG4sOCwtMSk7cmV0dXJuIk9iamVjdCI9PT1pJiZlLmNvbnN0cnVjdG9yJiYoaT1lLmNvbnN0cnVjdG9yLm5hbWUpLCJNYXAiPT09aXx8IlNldCI9PT1pP28oZSk6IkFyZ3VtZW50cyI9PT1pfHwvXig/OlVpfEkpbnQoPzo4fDE2fDMyKSg/OkNsYW1wZWQpP0FycmF5JC8udGVzdChpKT9hKGUsdCk6dm9pZCAwfX0sZS5leHBvcnRzLmRlZmF1bHQ9ZS5leHBvcnRzLGUuZXhwb3J0cy5fX2VzTW9kdWxlPSEwfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMTQpLG89big4OCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgZXx8byhlKSYmIltvYmplY3QgU3ltYm9sXSI9PXIoZSl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMTUpKE9iamVjdCwiY3JlYXRlIik7ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDcwNCksbz1uKDcwNSksYT1uKDcwNiksaT1uKDcwNykscz1uKDcwOCk7ZnVuY3Rpb24gdShlKXt2YXIgdD0tMSxuPW51bGw9PWU/MDplLmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrdDxuOyl7dmFyIHI9ZVt0XTt0aGlzLnNldChyWzBdLHJbMV0pfX11LnByb3RvdHlwZS5jbGVhcj1yLHUucHJvdG90eXBlLmRlbGV0ZT1vLHUucHJvdG90eXBlLmdldD1hLHUucHJvdG90eXBlLmhhcz1pLHUucHJvdG90eXBlLnNldD1zLGUuZXhwb3J0cz11fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMjMpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1lLmxlbmd0aDtuLS07KWlmKHIoZVtuXVswXSx0KSlyZXR1cm4gbjtyZXR1cm4tMX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDcxMCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5fX2RhdGFfXztyZXR1cm4gcih0KT9uWyJzdHJpbmciPT10eXBlb2YgdD8ic3RyaW5nIjoiaGFzaCJdOm4ubWFwfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNzE1KSxvPW4oNzQyKSxhPW4oNDIzKSxpPW4oNTYpLHM9big3NDgpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZT9lOm51bGw9PWU/YToib2JqZWN0Ij09dHlwZW9mIGU/aShlKT9vKGVbMF0sZVsxXSk6cihlKTpzKGUpfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNzMzKSxvPW4oODgpLGE9T2JqZWN0LnByb3RvdHlwZSxpPWEuaGFzT3duUHJvcGVydHkscz1hLnByb3BlcnR5SXNFbnVtZXJhYmxlLHU9cihmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpP3I6ZnVuY3Rpb24oZSl7cmV0dXJuIG8oZSkmJmkuY2FsbChlLCJjYWxsZWUiKSYmIXMuY2FsbChlLCJjYWxsZWUiKX07ZS5leHBvcnRzPXV9LGZ1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24oZSl7dmFyIHI9big3MSksbz1uKDczNCksYT10JiYhdC5ub2RlVHlwZSYmdCxpPWEmJiJvYmplY3QiPT10eXBlb2YgZSYmZSYmIWUubm9kZVR5cGUmJmUscz1pJiZpLmV4cG9ydHM9PT1hP3IuQnVmZmVyOnZvaWQgMCx1PShzP3MuaXNCdWZmZXI6dm9pZCAwKXx8bztlLmV4cG9ydHM9dX0pLmNhbGwodGhpcyxuKDE5NikoZSkpfSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gZS53ZWJwYWNrUG9seWZpbGx8fChlLmRlcHJlY2F0ZT1mdW5jdGlvbigpe30sZS5wYXRocz1bXSxlLmNoaWxkcmVufHwoZS5jaGlsZHJlbj1bXSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImxvYWRlZCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGUubH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiaWQiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBlLml9fSksZS53ZWJwYWNrUG9seWZpbGw9MSksZX19LGZ1bmN0aW9uKGUsdCl7dmFyIG49L14oPzowfFsxLTldXGQqKSQvO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciByPXR5cGVvZiBlO3JldHVybiEhKHQ9bnVsbD09dD85MDA3MTk5MjU0NzQwOTkxOnQpJiYoIm51bWJlciI9PXJ8fCJzeW1ib2wiIT1yJiZuLnRlc3QoZSkpJiZlPi0xJiZlJTE9PTAmJmU8dH19LGZ1bmN0aW9uKGUsdCl7dmFyIG49T2JqZWN0LnByb3RvdHlwZTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5jb25zdHJ1Y3RvcjtyZXR1cm4gZT09PSgiZnVuY3Rpb24iPT10eXBlb2YgdCYmdC5wcm90b3R5cGV8fG4pfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjsoZnVuY3Rpb24odCl7IXQudmVyc2lvbnx8MD09PXQudmVyc2lvbi5pbmRleE9mKCJ2MC4iKXx8MD09PXQudmVyc2lvbi5pbmRleE9mKCJ2MS4iKSYmMCE9PXQudmVyc2lvbi5pbmRleE9mKCJ2MS44LiIpP2UuZXhwb3J0cz17bmV4dFRpY2s6ZnVuY3Rpb24oZSxuLHIsbyl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcignImNhbGxiYWNrIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTt2YXIgYSxpLHM9YXJndW1lbnRzLmxlbmd0aDtzd2l0Y2gocyl7Y2FzZSAwOmNhc2UgMTpyZXR1cm4gdC5uZXh0VGljayhlKTtjYXNlIDI6cmV0dXJuIHQubmV4dFRpY2soKGZ1bmN0aW9uKCl7ZS5jYWxsKG51bGwsbil9KSk7Y2FzZSAzOnJldHVybiB0Lm5leHRUaWNrKChmdW5jdGlvbigpe2UuY2FsbChudWxsLG4scil9KSk7Y2FzZSA0OnJldHVybiB0Lm5leHRUaWNrKChmdW5jdGlvbigpe2UuY2FsbChudWxsLG4scixvKX0pKTtkZWZhdWx0OmZvcihhPW5ldyBBcnJheShzLTEpLGk9MDtpPGEubGVuZ3RoOylhW2krK109YXJndW1lbnRzW2ldO3JldHVybiB0Lm5leHRUaWNrKChmdW5jdGlvbigpe2UuYXBwbHkobnVsbCxhKX0pKX19fTplLmV4cG9ydHM9dH0pLmNhbGwodGhpcyxuKDg5KSl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPW4oNzgxKSgiZm9yRWFjaCIpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1uKDgwNCkoKT9nbG9iYWxUaGlzOm4oODA1KX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dHJ5e3JldHVybntlcnJvcjohMSx2YWx1ZTplKCl9fWNhdGNoKGUpe3JldHVybntlcnJvcjohMCx2YWx1ZTplfX19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzApLG89KG4oMjUpLHt9KSxhPXtyZWluaXRpYWxpemVUcmFuc2FjdGlvbjpmdW5jdGlvbigpe3RoaXMudHJhbnNhY3Rpb25XcmFwcGVycz10aGlzLmdldFRyYW5zYWN0aW9uV3JhcHBlcnMoKSx0aGlzLndyYXBwZXJJbml0RGF0YT90aGlzLndyYXBwZXJJbml0RGF0YS5sZW5ndGg9MDp0aGlzLndyYXBwZXJJbml0RGF0YT1bXSx0aGlzLl9pc0luVHJhbnNhY3Rpb249ITF9LF9pc0luVHJhbnNhY3Rpb246ITEsZ2V0VHJhbnNhY3Rpb25XcmFwcGVyczpudWxsLGlzSW5UcmFuc2FjdGlvbjpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5faXNJblRyYW5zYWN0aW9ufSxwZXJmb3JtOmZ1bmN0aW9uKGUsdCxuLG8sYSxpLHMsdSl7dmFyIGMsbDt0aGlzLmlzSW5UcmFuc2FjdGlvbigpJiZyKCIyNyIpO3RyeXt0aGlzLl9pc0luVHJhbnNhY3Rpb249ITAsYz0hMCx0aGlzLmluaXRpYWxpemVBbGwoMCksbD1lLmNhbGwodCxuLG8sYSxpLHMsdSksYz0hMX1maW5hbGx5e3RyeXtpZihjKXRyeXt0aGlzLmNsb3NlQWxsKDApfWNhdGNoKGUpe31lbHNlIHRoaXMuY2xvc2VBbGwoMCl9ZmluYWxseXt0aGlzLl9pc0luVHJhbnNhY3Rpb249ITF9fXJldHVybiBsfSxpbml0aWFsaXplQWxsOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLnRyYW5zYWN0aW9uV3JhcHBlcnMsbj1lO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3RyeXt0aGlzLndyYXBwZXJJbml0RGF0YVtuXT1vLHRoaXMud3JhcHBlckluaXREYXRhW25dPXIuaW5pdGlhbGl6ZT9yLmluaXRpYWxpemUuY2FsbCh0aGlzKTpudWxsfWZpbmFsbHl7aWYodGhpcy53cmFwcGVySW5pdERhdGFbbl09PT1vKXRyeXt0aGlzLmluaXRpYWxpemVBbGwobisxKX1jYXRjaChlKXt9fX19LGNsb3NlQWxsOmZ1bmN0aW9uKGUpe3RoaXMuaXNJblRyYW5zYWN0aW9uKCl8fHIoIjI4Iik7Zm9yKHZhciB0PXRoaXMudHJhbnNhY3Rpb25XcmFwcGVycyxuPWU7bjx0Lmxlbmd0aDtuKyspe3ZhciBhLGk9dFtuXSxzPXRoaXMud3JhcHBlckluaXREYXRhW25dO3RyeXthPSEwLHMhPT1vJiZpLmNsb3NlJiZpLmNsb3NlLmNhbGwodGhpcyxzKSxhPSExfWZpbmFsbHl7aWYoYSl0cnl7dGhpcy5jbG9zZUFsbChuKzEpfWNhdGNoKGUpe319fXRoaXMud3JhcHBlckluaXREYXRhLmxlbmd0aD0wfX07ZS5leHBvcnRzPWF9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNjgpLG89big0NzApLGE9e3NjcmVlblg6bnVsbCxzY3JlZW5ZOm51bGwsY2xpZW50WDpudWxsLGNsaWVudFk6bnVsbCxjdHJsS2V5Om51bGwsc2hpZnRLZXk6bnVsbCxhbHRLZXk6bnVsbCxtZXRhS2V5Om51bGwsZ2V0TW9kaWZpZXJTdGF0ZTpuKDI2NSksYnV0dG9uOmZ1bmN0aW9uKGUpe3ZhciB0PWUuYnV0dG9uO3JldHVybiJ3aGljaCJpbiBlP3Q6Mj09PXQ/Mjo0PT09dD8xOjB9LGJ1dHRvbnM6bnVsbCxyZWxhdGVkVGFyZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlbGF0ZWRUYXJnZXR8fChlLmZyb21FbGVtZW50PT09ZS5zcmNFbGVtZW50P2UudG9FbGVtZW50OmUuZnJvbUVsZW1lbnQpfSxwYWdlWDpmdW5jdGlvbihlKXtyZXR1cm4icGFnZVgiaW4gZT9lLnBhZ2VYOmUuY2xpZW50WCtvLmN1cnJlbnRTY3JvbGxMZWZ0fSxwYWdlWTpmdW5jdGlvbihlKXtyZXR1cm4icGFnZVkiaW4gZT9lLnBhZ2VZOmUuY2xpZW50WStvLmN1cnJlbnRTY3JvbGxUb3B9fTtmdW5jdGlvbiBpKGUsdCxuLG8pe3JldHVybiByLmNhbGwodGhpcyxlLHQsbixvKX1yLmF1Z21lbnRDbGFzcyhpLGEpLGUuZXhwb3J0cz1pfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByLG89big1NyksYT1uKDI2NyksaT0vXlsgXHJcblx0XGZdLyxzPS88KCEtLXxsaW5rfG5vc2NyaXB0fG1ldGF8c2NyaXB0fHN0eWxlKVsgXHJcblx0XGZcLz5dLyx1PW4oMjY4KSgoZnVuY3Rpb24oZSx0KXtpZihlLm5hbWVzcGFjZVVSSSE9PWEuc3ZnfHwiaW5uZXJIVE1MImluIGUpZS5pbm5lckhUTUw9dDtlbHNleyhyPXJ8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKS5pbm5lckhUTUw9Ijxzdmc+Iit0KyI8L3N2Zz4iO2Zvcih2YXIgbj1yLmZpcnN0Q2hpbGQ7bi5maXJzdENoaWxkOyllLmFwcGVuZENoaWxkKG4uZmlyc3RDaGlsZCl9fSkpO2lmKG8uY2FuVXNlRE9NKXt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmlubmVySFRNTD0iICIsIiI9PT1jLmlubmVySFRNTCYmKHU9ZnVuY3Rpb24oZSx0KXtpZihlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZSxlKSxpLnRlc3QodCl8fCI8Ij09PXRbMF0mJnMudGVzdCh0KSl7ZS5pbm5lckhUTUw9U3RyaW5nLmZyb21DaGFyQ29kZSg2NTI3OSkrdDt2YXIgbj1lLmZpcnN0Q2hpbGQ7MT09PW4uZGF0YS5sZW5ndGg/ZS5yZW1vdmVDaGlsZChuKTpuLmRlbGV0ZURhdGEoMCwxKX1lbHNlIGUuaW5uZXJIVE1MPXR9KSxjPW51bGx9ZS5leHBvcnRzPXV9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9L1siJyY8Pl0vO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBlfHwibnVtYmVyIj09dHlwZW9mIGU/IiIrZTpmdW5jdGlvbihlKXt2YXIgdCxuPSIiK2Usbz1yLmV4ZWMobik7aWYoIW8pcmV0dXJuIG47dmFyIGE9IiIsaT0wLHM9MDtmb3IoaT1vLmluZGV4O2k8bi5sZW5ndGg7aSsrKXtzd2l0Y2gobi5jaGFyQ29kZUF0KGkpKXtjYXNlIDM0OnQ9IiZxdW90OyI7YnJlYWs7Y2FzZSAzODp0PSImYW1wOyI7YnJlYWs7Y2FzZSAzOTp0PSImI3gyNzsiO2JyZWFrO2Nhc2UgNjA6dD0iJmx0OyI7YnJlYWs7Y2FzZSA2Mjp0PSImZ3Q7IjticmVhaztkZWZhdWx0OmNvbnRpbnVlfXMhPT1pJiYoYSs9bi5zdWJzdHJpbmcocyxpKSkscz1pKzEsYSs9dH1yZXR1cm4gcyE9PWk/YStuLnN1YnN0cmluZyhzLGkpOmF9KGUpfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcixvPW4oMzgpLGE9bigyNjApLGk9big5NDIpLHM9big0NzApLHU9big5NDMpLGM9bigyNjQpLGw9e30scD0hMSxmPTAsaD17dG9wQWJvcnQ6ImFib3J0Iix0b3BBbmltYXRpb25FbmQ6dSgiYW5pbWF0aW9uZW5kIil8fCJhbmltYXRpb25lbmQiLHRvcEFuaW1hdGlvbkl0ZXJhdGlvbjp1KCJhbmltYXRpb25pdGVyYXRpb24iKXx8ImFuaW1hdGlvbml0ZXJhdGlvbiIsdG9wQW5pbWF0aW9uU3RhcnQ6dSgiYW5pbWF0aW9uc3RhcnQiKXx8ImFuaW1hdGlvbnN0YXJ0Iix0b3BCbHVyOiJibHVyIix0b3BDYW5QbGF5OiJjYW5wbGF5Iix0b3BDYW5QbGF5VGhyb3VnaDoiY2FucGxheXRocm91Z2giLHRvcENoYW5nZToiY2hhbmdlIix0b3BDbGljazoiY2xpY2siLHRvcENvbXBvc2l0aW9uRW5kOiJjb21wb3NpdGlvbmVuZCIsdG9wQ29tcG9zaXRpb25TdGFydDoiY29tcG9zaXRpb25zdGFydCIsdG9wQ29tcG9zaXRpb25VcGRhdGU6ImNvbXBvc2l0aW9udXBkYXRlIix0b3BDb250ZXh0TWVudToiY29udGV4dG1lbnUiLHRvcENvcHk6ImNvcHkiLHRvcEN1dDoiY3V0Iix0b3BEb3VibGVDbGljazoiZGJsY2xpY2siLHRvcERyYWc6ImRyYWciLHRvcERyYWdFbmQ6ImRyYWdlbmQiLHRvcERyYWdFbnRlcjoiZHJhZ2VudGVyIix0b3BEcmFnRXhpdDoiZHJhZ2V4aXQiLHRvcERyYWdMZWF2ZToiZHJhZ2xlYXZlIix0b3BEcmFnT3ZlcjoiZHJhZ292ZXIiLHRvcERyYWdTdGFydDoiZHJhZ3N0YXJ0Iix0b3BEcm9wOiJkcm9wIix0b3BEdXJhdGlvbkNoYW5nZToiZHVyYXRpb25jaGFuZ2UiLHRvcEVtcHRpZWQ6ImVtcHRpZWQiLHRvcEVuY3J5cHRlZDoiZW5jcnlwdGVkIix0b3BFbmRlZDoiZW5kZWQiLHRvcEVycm9yOiJlcnJvciIsdG9wRm9jdXM6ImZvY3VzIix0b3BJbnB1dDoiaW5wdXQiLHRvcEtleURvd246ImtleWRvd24iLHRvcEtleVByZXNzOiJrZXlwcmVzcyIsdG9wS2V5VXA6ImtleXVwIix0b3BMb2FkZWREYXRhOiJsb2FkZWRkYXRhIix0b3BMb2FkZWRNZXRhZGF0YToibG9hZGVkbWV0YWRhdGEiLHRvcExvYWRTdGFydDoibG9hZHN0YXJ0Iix0b3BNb3VzZURvd246Im1vdXNlZG93biIsdG9wTW91c2VNb3ZlOiJtb3VzZW1vdmUiLHRvcE1vdXNlT3V0OiJtb3VzZW91dCIsdG9wTW91c2VPdmVyOiJtb3VzZW92ZXIiLHRvcE1vdXNlVXA6Im1vdXNldXAiLHRvcFBhc3RlOiJwYXN0ZSIsdG9wUGF1c2U6InBhdXNlIix0b3BQbGF5OiJwbGF5Iix0b3BQbGF5aW5nOiJwbGF5aW5nIix0b3BQcm9ncmVzczoicHJvZ3Jlc3MiLHRvcFJhdGVDaGFuZ2U6InJhdGVjaGFuZ2UiLHRvcFNjcm9sbDoic2Nyb2xsIix0b3BTZWVrZWQ6InNlZWtlZCIsdG9wU2Vla2luZzoic2Vla2luZyIsdG9wU2VsZWN0aW9uQ2hhbmdlOiJzZWxlY3Rpb25jaGFuZ2UiLHRvcFN0YWxsZWQ6InN0YWxsZWQiLHRvcFN1c3BlbmQ6InN1c3BlbmQiLHRvcFRleHRJbnB1dDoidGV4dElucHV0Iix0b3BUaW1lVXBkYXRlOiJ0aW1ldXBkYXRlIix0b3BUb3VjaENhbmNlbDoidG91Y2hjYW5jZWwiLHRvcFRvdWNoRW5kOiJ0b3VjaGVuZCIsdG9wVG91Y2hNb3ZlOiJ0b3VjaG1vdmUiLHRvcFRvdWNoU3RhcnQ6InRvdWNoc3RhcnQiLHRvcFRyYW5zaXRpb25FbmQ6dSgidHJhbnNpdGlvbmVuZCIpfHwidHJhbnNpdGlvbmVuZCIsdG9wVm9sdW1lQ2hhbmdlOiJ2b2x1bWVjaGFuZ2UiLHRvcFdhaXRpbmc6IndhaXRpbmciLHRvcFdoZWVsOiJ3aGVlbCJ9LGQ9Il9yZWFjdExpc3RlbmVyc0lEIitTdHJpbmcoTWF0aC5yYW5kb20oKSkuc2xpY2UoMik7dmFyIG09byh7fSxpLHtSZWFjdEV2ZW50TGlzdGVuZXI6bnVsbCxpbmplY3Rpb246e2luamVjdFJlYWN0RXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihlKXtlLnNldEhhbmRsZVRvcExldmVsKG0uaGFuZGxlVG9wTGV2ZWwpLG0uUmVhY3RFdmVudExpc3RlbmVyPWV9fSxzZXRFbmFibGVkOmZ1bmN0aW9uKGUpe20uUmVhY3RFdmVudExpc3RlbmVyJiZtLlJlYWN0RXZlbnRMaXN0ZW5lci5zZXRFbmFibGVkKGUpfSxpc0VuYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hKCFtLlJlYWN0RXZlbnRMaXN0ZW5lcnx8IW0uUmVhY3RFdmVudExpc3RlbmVyLmlzRW5hYmxlZCgpKX0sbGlzdGVuVG86ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49dCxyPWZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxkKXx8KGVbZF09ZisrLGxbZVtkXV09e30pLGxbZVtkXV19KG4pLG89YS5yZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzW2VdLGk9MDtpPG8ubGVuZ3RoO2krKyl7dmFyIHM9b1tpXTtyLmhhc093blByb3BlcnR5KHMpJiZyW3NdfHwoInRvcFdoZWVsIj09PXM/Yygid2hlZWwiKT9tLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KCJ0b3BXaGVlbCIsIndoZWVsIixuKTpjKCJtb3VzZXdoZWVsIik/bS5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudCgidG9wV2hlZWwiLCJtb3VzZXdoZWVsIixuKTptLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KCJ0b3BXaGVlbCIsIkRPTU1vdXNlU2Nyb2xsIixuKToidG9wU2Nyb2xsIj09PXM/Yygic2Nyb2xsIiwhMCk/bS5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcENhcHR1cmVkRXZlbnQoInRvcFNjcm9sbCIsInNjcm9sbCIsbik6bS5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudCgidG9wU2Nyb2xsIiwic2Nyb2xsIixtLlJlYWN0RXZlbnRMaXN0ZW5lci5XSU5ET1dfSEFORExFKToidG9wRm9jdXMiPT09c3x8InRvcEJsdXIiPT09cz8oYygiZm9jdXMiLCEwKT8obS5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcENhcHR1cmVkRXZlbnQoInRvcEZvY3VzIiwiZm9jdXMiLG4pLG0uUmVhY3RFdmVudExpc3RlbmVyLnRyYXBDYXB0dXJlZEV2ZW50KCJ0b3BCbHVyIiwiYmx1ciIsbikpOmMoImZvY3VzaW4iKSYmKG0uUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQoInRvcEZvY3VzIiwiZm9jdXNpbiIsbiksbS5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudCgidG9wQmx1ciIsImZvY3Vzb3V0IixuKSksci50b3BCbHVyPSEwLHIudG9wRm9jdXM9ITApOmguaGFzT3duUHJvcGVydHkocykmJm0uUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQocyxoW3NdLG4pLHJbc109ITApfX0sdHJhcEJ1YmJsZWRFdmVudDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIG0uUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQoZSx0LG4pfSx0cmFwQ2FwdHVyZWRFdmVudDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIG0uUmVhY3RFdmVudExpc3RlbmVyLnRyYXBDYXB0dXJlZEV2ZW50KGUsdCxuKX0sc3VwcG9ydHNFdmVudFBhZ2VYWTpmdW5jdGlvbigpe2lmKCFkb2N1bWVudC5jcmVhdGVFdmVudClyZXR1cm4hMTt2YXIgZT1kb2N1bWVudC5jcmVhdGVFdmVudCgiTW91c2VFdmVudCIpO3JldHVybiBudWxsIT1lJiYicGFnZVgiaW4gZX0sZW5zdXJlU2Nyb2xsVmFsdWVNb25pdG9yaW5nOmZ1bmN0aW9uKCl7aWYodm9pZCAwPT09ciYmKHI9bS5zdXBwb3J0c0V2ZW50UGFnZVhZKCkpLCFyJiYhcCl7dmFyIGU9cy5yZWZyZXNoU2Nyb2xsVmFsdWVzO20uUmVhY3RFdmVudExpc3RlbmVyLm1vbml0b3JTY3JvbGxWYWx1ZShlKSxwPSEwfX19KTtlLmV4cG9ydHM9bX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTU3KSxvPW4oNDcpLGE9big1NSksaT1uKDY4KS5mLHM9bigxODEpLHU9bigxMDcwKSxjPXMoIm1ldGEiKSxsPTAscD1PYmplY3QuaXNFeHRlbnNpYmxlfHxmdW5jdGlvbigpe3JldHVybiEwfSxmPWZ1bmN0aW9uKGUpe2koZSxjLHt2YWx1ZTp7b2JqZWN0SUQ6Ik8iKyArK2wsd2Vha0RhdGE6e319fSl9LGg9ZS5leHBvcnRzPXtSRVFVSVJFRDohMSxmYXN0S2V5OmZ1bmN0aW9uKGUsdCl7aWYoIW8oZSkpcmV0dXJuInN5bWJvbCI9PXR5cGVvZiBlP2U6KCJzdHJpbmciPT10eXBlb2YgZT8iUyI6IlAiKStlO2lmKCFhKGUsYykpe2lmKCFwKGUpKXJldHVybiJGIjtpZighdClyZXR1cm4iRSI7ZihlKX1yZXR1cm4gZVtjXS5vYmplY3RJRH0sZ2V0V2Vha0RhdGE6ZnVuY3Rpb24oZSx0KXtpZighYShlLGMpKXtpZighcChlKSlyZXR1cm4hMDtpZighdClyZXR1cm4hMTtmKGUpfXJldHVybiBlW2NdLndlYWtEYXRhfSxvbkZyZWV6ZTpmdW5jdGlvbihlKXtyZXR1cm4gdSYmaC5SRVFVSVJFRCYmcChlKSYmIWEoZSxjKSYmZihlKSxlfX07cltjXT0hMH0sZnVuY3Rpb24oZSx0LG4pe2UuZXhwb3J0cz1uKDY0MCl9LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9big4NDEpfSxmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPW4oODgzKX0sZnVuY3Rpb24oZSx0LG4pe2UuZXhwb3J0cz1uKDEwNDkpfSxmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPW4oMTA2Myl9LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9bigxMDY3KX0sZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbih0KXshZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybihlIGluc3RhbmNlb2YgdD9lOnQuZnJvbShlLnRvU3RyaW5nKCksImJpbmFyeSIpKS50b1N0cmluZygiYmFzZTY0Iil9fSgpfSkuY2FsbCh0aGlzLG4oMTMyKS5CdWZmZXIpfSxmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPW4oMTA4NSl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5kKHQsImEiLChmdW5jdGlvbigpe3JldHVybiBPfSkpO3ZhciByPW4oMTgpLG89bi5uKHIpLGE9big2KSxpPW4ubihhKSxzPW4oNyksdT1uLm4ocyksYz1uKDEwKSxsPW4ubihjKSxwPW4oOCksZj1uLm4ocCksaD1uKDkpLGQ9bi5uKGgpLG09bigzKSx2PW4ubihtKSxnPW4oMTUpLHk9bi5uKGcpLGI9bigyKSxfPW4ubihiKSx3PW4oMCkseD1uLm4odyksRT1uKDkyKSxTPW4ubihFKSxDPShuKDExKSxuKDUpKSxBPW4oMjYpLE89ZnVuY3Rpb24oZSl7ZigpKG4sZSk7dmFyIHQ9ZCgpKG4pO2Z1bmN0aW9uIG4oZSxyKXt2YXIgbztpKCkodGhpcyxuKSxvPXQuY2FsbCh0aGlzLGUsciksdigpKGwoKShvKSwiZ2V0RGVmaW5pdGlvblVybCIsKGZ1bmN0aW9uKCl7dmFyIGU9by5wcm9wcy5zcGVjU2VsZWN0b3JzO3JldHVybiBuZXcgUy5hKGUudXJsKCksQS5hLmxvY2F0aW9uKS50b1N0cmluZygpfSkpO3ZhciBhPSgwLGUuZ2V0Q29uZmlncykoKS52YWxpZGF0b3JVcmw7cmV0dXJuIG8uc3RhdGU9e3VybDpvLmdldERlZmluaXRpb25VcmwoKSx2YWxpZGF0b3JVcmw6dm9pZCAwPT09YT8iaHR0cHM6Ly92YWxpZGF0b3Iuc3dhZ2dlci5pby92YWxpZGF0b3IiOmF9LG99cmV0dXJuIHUoKShuLFt7a2V5OiJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD0oMCxlLmdldENvbmZpZ3MpKCkudmFsaWRhdG9yVXJsO3RoaXMuc2V0U3RhdGUoe3VybDp0aGlzLmdldERlZmluaXRpb25VcmwoKSx2YWxpZGF0b3JVcmw6dm9pZCAwPT09dD8iaHR0cHM6Ly92YWxpZGF0b3Iuc3dhZ2dlci5pby92YWxpZGF0b3IiOnR9KX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZSx0LG49KDAsdGhpcy5wcm9wcy5nZXRDb25maWdzKSgpLnNwZWMscj1PYmplY3QoQy5GKSh0aGlzLnN0YXRlLnZhbGlkYXRvclVybCk7cmV0dXJuIm9iamVjdCI9PT1vKCkobikmJnkoKShuKS5sZW5ndGg/bnVsbDp0aGlzLnN0YXRlLnVybCYmT2JqZWN0KEMuRSkodGhpcy5zdGF0ZS52YWxpZGF0b3JVcmwpJiZPYmplY3QoQy5FKSh0aGlzLnN0YXRlLnVybCk/eC5hLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6ImZsb2F0LXJpZ2h0In0seC5hLmNyZWF0ZUVsZW1lbnQoImEiLHt0YXJnZXQ6Il9ibGFuayIscmVsOiJub29wZW5lciBub3JlZmVycmVyIixocmVmOl8oKShlPSIiLmNvbmNhdChyLCIvZGVidWc/dXJsPSIpKS5jYWxsKGUsZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuc3RhdGUudXJsKSl9LHguYS5jcmVhdGVFbGVtZW50KGsse3NyYzpfKCkodD0iIi5jb25jYXQociwiP3VybD0iKSkuY2FsbCh0LGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLnN0YXRlLnVybCkpLGFsdDoiT25saW5lIHZhbGlkYXRvciBiYWRnZSJ9KSkpOm51bGx9fV0pLG59KHguYS5Db21wb25lbnQpLGs9ZnVuY3Rpb24oZSl7ZigpKG4sZSk7dmFyIHQ9ZCgpKG4pO2Z1bmN0aW9uIG4oZSl7dmFyIHI7cmV0dXJuIGkoKSh0aGlzLG4pLChyPXQuY2FsbCh0aGlzLGUpKS5zdGF0ZT17bG9hZGVkOiExLGVycm9yOiExfSxyfXJldHVybiB1KCkobixbe2tleToiY29tcG9uZW50RGlkTW91bnQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PW5ldyBJbWFnZTt0Lm9ubG9hZD1mdW5jdGlvbigpe2Uuc2V0U3RhdGUoe2xvYWRlZDohMH0pfSx0Lm9uZXJyb3I9ZnVuY3Rpb24oKXtlLnNldFN0YXRlKHtlcnJvcjohMH0pfSx0LnNyYz10aGlzLnByb3BzLnNyY319LHtrZXk6ImNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7aWYoZS5zcmMhPT10aGlzLnByb3BzLnNyYyl7dmFyIG49bmV3IEltYWdlO24ub25sb2FkPWZ1bmN0aW9uKCl7dC5zZXRTdGF0ZSh7bG9hZGVkOiEwfSl9LG4ub25lcnJvcj1mdW5jdGlvbigpe3Quc2V0U3RhdGUoe2Vycm9yOiEwfSl9LG4uc3JjPWUuc3JjfX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGF0ZS5lcnJvcj94LmEuY3JlYXRlRWxlbWVudCgiaW1nIix7YWx0OiJFcnJvciJ9KTp0aGlzLnN0YXRlLmxvYWRlZD94LmEuY3JlYXRlRWxlbWVudCgiaW1nIix7c3JjOnRoaXMucHJvcHMuc3JjLGFsdDp0aGlzLnByb3BzLmFsdH0pOm51bGx9fV0pLG59KHguYS5Db21wb25lbnQpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByO2Z1bmN0aW9uIG8oZSl7cmV0dXJuKHI9cnx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGV4dGFyZWEiKSkuaW5uZXJIVE1MPSImIitlKyI7IixyLnZhbHVlfW4uZCh0LCJhIiwoZnVuY3Rpb24oKXtyZXR1cm4gT2V9KSk7dmFyIGE9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBpKGUsdCl7cmV0dXJuISFlJiZhLmNhbGwoZSx0KX1mdW5jdGlvbiBzKGUpe3ZhciB0PVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKHQpe2lmKCJvYmplY3QiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKHQrIm11c3QgYmUgb2JqZWN0Iik7T2JqZWN0LmtleXModCkuZm9yRWFjaCgoZnVuY3Rpb24obil7ZVtuXT10W25dfSkpfX0pKSxlfXZhciB1PS9cXChbXFwhIiMkJSYnKCkqKywuXC86Ozw9Pj9AW1xdXl9ge3x9fi1dKS9nO2Z1bmN0aW9uIGMoZSl7cmV0dXJuIGUuaW5kZXhPZigiXFwiKTwwP2U6ZS5yZXBsYWNlKHUsIiQxIil9ZnVuY3Rpb24gbChlKXtyZXR1cm4hKGU+PTU1Mjk2JiZlPD01NzM0MykmJighKGU+PTY0OTc2JiZlPD02NTAwNykmJig2NTUzNSE9KDY1NTM1JmUpJiY2NTUzNCE9KDY1NTM1JmUpJiYoIShlPj0wJiZlPD04KSYmKDExIT09ZSYmKCEoZT49MTQmJmU8PTMxKSYmKCEoZT49MTI3JiZlPD0xNTkpJiYhKGU+MTExNDExMSkpKSkpKSl9ZnVuY3Rpb24gcChlKXtpZihlPjY1NTM1KXt2YXIgdD01NTI5NisoKGUtPTY1NTM2KT4+MTApLG49NTYzMjArKDEwMjMmZSk7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodCxuKX1yZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShlKX12YXIgZj0vJihbYS16I11bYS16MC05XXsxLDMxfSk7L2dpLGg9L14jKCg/OnhbYS1mMC05XXsxLDh9fFswLTldezEsOH0pKS9pO2Z1bmN0aW9uIGQoZSx0KXt2YXIgbj0wLHI9byh0KTtyZXR1cm4gdCE9PXI/cjozNT09PXQuY2hhckNvZGVBdCgwKSYmaC50ZXN0KHQpJiZsKG49IngiPT09dFsxXS50b0xvd2VyQ2FzZSgpP3BhcnNlSW50KHQuc2xpY2UoMiksMTYpOnBhcnNlSW50KHQuc2xpY2UoMSksMTApKT9wKG4pOmV9ZnVuY3Rpb24gbShlKXtyZXR1cm4gZS5pbmRleE9mKCImIik8MD9lOmUucmVwbGFjZShmLGQpfXZhciB2PS9bJjw+Il0vLGc9L1smPD4iXS9nLHk9eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyJ9O2Z1bmN0aW9uIGIoZSl7cmV0dXJuIHlbZV19ZnVuY3Rpb24gXyhlKXtyZXR1cm4gdi50ZXN0KGUpP2UucmVwbGFjZShnLGIpOmV9dmFyIHc9e307ZnVuY3Rpb24geChlLHQpe3JldHVybisrdD49ZS5sZW5ndGgtMj90OiJwYXJhZ3JhcGhfb3BlbiI9PT1lW3RdLnR5cGUmJmVbdF0udGlnaHQmJiJpbmxpbmUiPT09ZVt0KzFdLnR5cGUmJjA9PT1lW3QrMV0uY29udGVudC5sZW5ndGgmJiJwYXJhZ3JhcGhfY2xvc2UiPT09ZVt0KzJdLnR5cGUmJmVbdCsyXS50aWdodD94KGUsdCsyKTp0fXcuYmxvY2txdW90ZV9vcGVuPWZ1bmN0aW9uKCl7cmV0dXJuIjxibG9ja3F1b3RlPlxuIn0sdy5ibG9ja3F1b3RlX2Nsb3NlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIjwvYmxvY2txdW90ZT4iK0UoZSx0KX0sdy5jb2RlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGVbdF0uYmxvY2s/IjxwcmU+PGNvZGU+IitfKGVbdF0uY29udGVudCkrIjwvY29kZT48L3ByZT4iK0UoZSx0KToiPGNvZGU+IitfKGVbdF0uY29udGVudCkrIjwvY29kZT4ifSx3LmZlbmNlPWZ1bmN0aW9uKGUsdCxuLHIsbyl7dmFyIGEscyx1PWVbdF0sbD0iIixwPW4ubGFuZ1ByZWZpeDtpZih1LnBhcmFtcyl7aWYocz0oYT11LnBhcmFtcy5zcGxpdCgvXHMrL2cpKS5qb2luKCIgIiksaShvLnJ1bGVzLmZlbmNlX2N1c3RvbSxhWzBdKSlyZXR1cm4gby5ydWxlcy5mZW5jZV9jdXN0b21bYVswXV0oZSx0LG4scixvKTtsPScgY2xhc3M9IicrcCtfKG0oYyhzKSkpKyciJ31yZXR1cm4iPHByZT48Y29kZSIrbCsiPiIrKG4uaGlnaGxpZ2h0JiZuLmhpZ2hsaWdodC5hcHBseShuLmhpZ2hsaWdodCxbdS5jb250ZW50XS5jb25jYXQoYSkpfHxfKHUuY29udGVudCkpKyI8L2NvZGU+PC9wcmU+IitFKGUsdCl9LHcuZmVuY2VfY3VzdG9tPXt9LHcuaGVhZGluZ19vcGVuPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIjxoIitlW3RdLmhMZXZlbCsiPiJ9LHcuaGVhZGluZ19jbG9zZT1mdW5jdGlvbihlLHQpe3JldHVybiI8L2giK2VbdF0uaExldmVsKyI+XG4ifSx3LmhyPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4obi54aHRtbE91dD8iPGhyIC8+IjoiPGhyPiIpK0UoZSx0KX0sdy5idWxsZXRfbGlzdF9vcGVuPWZ1bmN0aW9uKCl7cmV0dXJuIjx1bD5cbiJ9LHcuYnVsbGV0X2xpc3RfY2xvc2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4iPC91bD4iK0UoZSx0KX0sdy5saXN0X2l0ZW1fb3Blbj1mdW5jdGlvbigpe3JldHVybiI8bGk+In0sdy5saXN0X2l0ZW1fY2xvc2U9ZnVuY3Rpb24oKXtyZXR1cm4iPC9saT5cbiJ9LHcub3JkZXJlZF9saXN0X29wZW49ZnVuY3Rpb24oZSx0KXt2YXIgbj1lW3RdO3JldHVybiI8b2wiKyhuLm9yZGVyPjE/JyBzdGFydD0iJytuLm9yZGVyKyciJzoiIikrIj5cbiJ9LHcub3JkZXJlZF9saXN0X2Nsb3NlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIjwvb2w+IitFKGUsdCl9LHcucGFyYWdyYXBoX29wZW49ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZVt0XS50aWdodD8iIjoiPHA+In0sdy5wYXJhZ3JhcGhfY2xvc2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj0hKGVbdF0udGlnaHQmJnQmJiJpbmxpbmUiPT09ZVt0LTFdLnR5cGUmJiFlW3QtMV0uY29udGVudCk7cmV0dXJuKGVbdF0udGlnaHQ/IiI6IjwvcD4iKSsobj9FKGUsdCk6IiIpfSx3Lmxpbmtfb3Blbj1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZVt0XS50aXRsZT8nIHRpdGxlPSInK18obShlW3RdLnRpdGxlKSkrJyInOiIiLG89bi5saW5rVGFyZ2V0PycgdGFyZ2V0PSInK24ubGlua1RhcmdldCsnIic6IiI7cmV0dXJuJzxhIGhyZWY9IicrXyhlW3RdLmhyZWYpKyciJytyK28rIj4ifSx3LmxpbmtfY2xvc2U9ZnVuY3Rpb24oKXtyZXR1cm4iPC9hPiJ9LHcuaW1hZ2U9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPScgc3JjPSInK18oZVt0XS5zcmMpKyciJyxvPWVbdF0udGl0bGU/JyB0aXRsZT0iJytfKG0oZVt0XS50aXRsZSkpKyciJzoiIjtyZXR1cm4iPGltZyIrcisoJyBhbHQ9IicrKGVbdF0uYWx0P18obShjKGVbdF0uYWx0KSkpOiIiKSsnIicpK28rKG4ueGh0bWxPdXQ/IiAvIjoiIikrIj4ifSx3LnRhYmxlX29wZW49ZnVuY3Rpb24oKXtyZXR1cm4iPHRhYmxlPlxuIn0sdy50YWJsZV9jbG9zZT1mdW5jdGlvbigpe3JldHVybiI8L3RhYmxlPlxuIn0sdy50aGVhZF9vcGVuPWZ1bmN0aW9uKCl7cmV0dXJuIjx0aGVhZD5cbiJ9LHcudGhlYWRfY2xvc2U9ZnVuY3Rpb24oKXtyZXR1cm4iPC90aGVhZD5cbiJ9LHcudGJvZHlfb3Blbj1mdW5jdGlvbigpe3JldHVybiI8dGJvZHk+XG4ifSx3LnRib2R5X2Nsb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIjwvdGJvZHk+XG4ifSx3LnRyX29wZW49ZnVuY3Rpb24oKXtyZXR1cm4iPHRyPiJ9LHcudHJfY2xvc2U9ZnVuY3Rpb24oKXtyZXR1cm4iPC90cj5cbiJ9LHcudGhfb3Blbj1mdW5jdGlvbihlLHQpe3ZhciBuPWVbdF07cmV0dXJuIjx0aCIrKG4uYWxpZ24/JyBzdHlsZT0idGV4dC1hbGlnbjonK24uYWxpZ24rJyInOiIiKSsiPiJ9LHcudGhfY2xvc2U9ZnVuY3Rpb24oKXtyZXR1cm4iPC90aD4ifSx3LnRkX29wZW49ZnVuY3Rpb24oZSx0KXt2YXIgbj1lW3RdO3JldHVybiI8dGQiKyhuLmFsaWduPycgc3R5bGU9InRleHQtYWxpZ246JytuLmFsaWduKyciJzoiIikrIj4ifSx3LnRkX2Nsb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIjwvdGQ+In0sdy5zdHJvbmdfb3Blbj1mdW5jdGlvbigpe3JldHVybiI8c3Ryb25nPiJ9LHcuc3Ryb25nX2Nsb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIjwvc3Ryb25nPiJ9LHcuZW1fb3Blbj1mdW5jdGlvbigpe3JldHVybiI8ZW0+In0sdy5lbV9jbG9zZT1mdW5jdGlvbigpe3JldHVybiI8L2VtPiJ9LHcuZGVsX29wZW49ZnVuY3Rpb24oKXtyZXR1cm4iPGRlbD4ifSx3LmRlbF9jbG9zZT1mdW5jdGlvbigpe3JldHVybiI8L2RlbD4ifSx3Lmluc19vcGVuPWZ1bmN0aW9uKCl7cmV0dXJuIjxpbnM+In0sdy5pbnNfY2xvc2U9ZnVuY3Rpb24oKXtyZXR1cm4iPC9pbnM+In0sdy5tYXJrX29wZW49ZnVuY3Rpb24oKXtyZXR1cm4iPG1hcms+In0sdy5tYXJrX2Nsb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIjwvbWFyaz4ifSx3LnN1Yj1mdW5jdGlvbihlLHQpe3JldHVybiI8c3ViPiIrXyhlW3RdLmNvbnRlbnQpKyI8L3N1Yj4ifSx3LnN1cD1mdW5jdGlvbihlLHQpe3JldHVybiI8c3VwPiIrXyhlW3RdLmNvbnRlbnQpKyI8L3N1cD4ifSx3LmhhcmRicmVhaz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4ueGh0bWxPdXQ/IjxiciAvPlxuIjoiPGJyPlxuIn0sdy5zb2Z0YnJlYWs9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuLmJyZWFrcz9uLnhodG1sT3V0PyI8YnIgLz5cbiI6Ijxicj5cbiI6IlxuIn0sdy50ZXh0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIF8oZVt0XS5jb250ZW50KX0sdy5odG1sYmxvY2s9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZVt0XS5jb250ZW50fSx3Lmh0bWx0YWc9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZVt0XS5jb250ZW50fSx3LmFiYnJfb3Blbj1mdW5jdGlvbihlLHQpe3JldHVybic8YWJiciB0aXRsZT0iJytfKG0oZVt0XS50aXRsZSkpKyciPid9LHcuYWJicl9jbG9zZT1mdW5jdGlvbigpe3JldHVybiI8L2FiYnI+In0sdy5mb290bm90ZV9yZWY9ZnVuY3Rpb24oZSx0KXt2YXIgbj1OdW1iZXIoZVt0XS5pZCsxKS50b1N0cmluZygpLHI9ImZucmVmIituO3JldHVybiBlW3RdLnN1YklkPjAmJihyKz0iOiIrZVt0XS5zdWJJZCksJzxzdXAgY2xhc3M9ImZvb3Rub3RlLXJlZiI+PGEgaHJlZj0iI2ZuJytuKyciIGlkPSInK3IrJyI+WycrbisiXTwvYT48L3N1cD4ifSx3LmZvb3Rub3RlX2Jsb2NrX29wZW49ZnVuY3Rpb24oZSx0LG4pe3JldHVybihuLnhodG1sT3V0Pyc8aHIgY2xhc3M9ImZvb3Rub3Rlcy1zZXAiIC8+XG4nOic8aHIgY2xhc3M9ImZvb3Rub3Rlcy1zZXAiPlxuJykrJzxzZWN0aW9uIGNsYXNzPSJmb290bm90ZXMiPlxuPG9sIGNsYXNzPSJmb290bm90ZXMtbGlzdCI+XG4nfSx3LmZvb3Rub3RlX2Jsb2NrX2Nsb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIjwvb2w+XG48L3NlY3Rpb24+XG4ifSx3LmZvb3Rub3RlX29wZW49ZnVuY3Rpb24oZSx0KXtyZXR1cm4nPGxpIGlkPSJmbicrTnVtYmVyKGVbdF0uaWQrMSkudG9TdHJpbmcoKSsnIiAgY2xhc3M9ImZvb3Rub3RlLWl0ZW0iPid9LHcuZm9vdG5vdGVfY2xvc2U9ZnVuY3Rpb24oKXtyZXR1cm4iPC9saT5cbiJ9LHcuZm9vdG5vdGVfYW5jaG9yPWZ1bmN0aW9uKGUsdCl7dmFyIG49ImZucmVmIitOdW1iZXIoZVt0XS5pZCsxKS50b1N0cmluZygpO3JldHVybiBlW3RdLnN1YklkPjAmJihuKz0iOiIrZVt0XS5zdWJJZCksJyA8YSBocmVmPSIjJytuKyciIGNsYXNzPSJmb290bm90ZS1iYWNrcmVmIj7ihqk8L2E+J30sdy5kbF9vcGVuPWZ1bmN0aW9uKCl7cmV0dXJuIjxkbD5cbiJ9LHcuZHRfb3Blbj1mdW5jdGlvbigpe3JldHVybiI8ZHQ+In0sdy5kZF9vcGVuPWZ1bmN0aW9uKCl7cmV0dXJuIjxkZD4ifSx3LmRsX2Nsb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIjwvZGw+XG4ifSx3LmR0X2Nsb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIjwvZHQ+XG4ifSx3LmRkX2Nsb3NlPWZ1bmN0aW9uKCl7cmV0dXJuIjwvZGQ+XG4ifTt2YXIgRT13LmdldEJyZWFrPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKHQ9eChlLHQpKTxlLmxlbmd0aCYmImxpc3RfaXRlbV9jbG9zZSI9PT1lW3RdLnR5cGU/IiI6IlxuIn07ZnVuY3Rpb24gUygpe3RoaXMucnVsZXM9cyh7fSx3KSx0aGlzLmdldEJyZWFrPXcuZ2V0QnJlYWt9ZnVuY3Rpb24gQygpe3RoaXMuX19ydWxlc19fPVtdLHRoaXMuX19jYWNoZV9fPW51bGx9ZnVuY3Rpb24gQShlLHQsbixyLG8pe3RoaXMuc3JjPWUsdGhpcy5lbnY9cix0aGlzLm9wdGlvbnM9bix0aGlzLnBhcnNlcj10LHRoaXMudG9rZW5zPW8sdGhpcy5wb3M9MCx0aGlzLnBvc01heD10aGlzLnNyYy5sZW5ndGgsdGhpcy5sZXZlbD0wLHRoaXMucGVuZGluZz0iIix0aGlzLnBlbmRpbmdMZXZlbD0wLHRoaXMuY2FjaGU9W10sdGhpcy5pc0luTGFiZWw9ITEsdGhpcy5saW5rTGV2ZWw9MCx0aGlzLmxpbmtDb250ZW50PSIiLHRoaXMubGFiZWxVbm1hdGNoZWRTY29wZXM9MH1mdW5jdGlvbiBPKGUsdCl7dmFyIG4scixvLGE9LTEsaT1lLnBvc01heCxzPWUucG9zLHU9ZS5pc0luTGFiZWw7aWYoZS5pc0luTGFiZWwpcmV0dXJuLTE7aWYoZS5sYWJlbFVubWF0Y2hlZFNjb3BlcylyZXR1cm4gZS5sYWJlbFVubWF0Y2hlZFNjb3Blcy0tLC0xO2ZvcihlLnBvcz10KzEsZS5pc0luTGFiZWw9ITAsbj0xO2UucG9zPGk7KXtpZig5MT09PShvPWUuc3JjLmNoYXJDb2RlQXQoZS5wb3MpKSluKys7ZWxzZSBpZig5Mz09PW8mJjA9PT0tLW4pe3I9ITA7YnJlYWt9ZS5wYXJzZXIuc2tpcFRva2VuKGUpfXJldHVybiByPyhhPWUucG9zLGUubGFiZWxVbm1hdGNoZWRTY29wZXM9MCk6ZS5sYWJlbFVubWF0Y2hlZFNjb3Blcz1uLTEsZS5wb3M9cyxlLmlzSW5MYWJlbD11LGF9ZnVuY3Rpb24gayhlLHQsbixyKXt2YXIgbyxhLGkscyx1LGM7aWYoNDIhPT1lLmNoYXJDb2RlQXQoMCkpcmV0dXJuLTE7aWYoOTEhPT1lLmNoYXJDb2RlQXQoMSkpcmV0dXJuLTE7aWYoLTE9PT1lLmluZGV4T2YoIl06IikpcmV0dXJuLTE7aWYoKGE9TyhvPW5ldyBBKGUsdCxuLHIsW10pLDEpKTwwfHw1OCE9PWUuY2hhckNvZGVBdChhKzEpKXJldHVybi0xO2ZvcihzPW8ucG9zTWF4LGk9YSsyO2k8cyYmMTAhPT1vLnNyYy5jaGFyQ29kZUF0KGkpO2krKyk7cmV0dXJuIHU9ZS5zbGljZSgyLGEpLDA9PT0oYz1lLnNsaWNlKGErMixpKS50cmltKCkpLmxlbmd0aD8tMTooci5hYmJyZXZpYXRpb25zfHwoci5hYmJyZXZpYXRpb25zPXt9KSx2b2lkIDA9PT1yLmFiYnJldmlhdGlvbnNbIjoiK3VdJiYoci5hYmJyZXZpYXRpb25zWyI6Iit1XT1jKSxpKX1mdW5jdGlvbiBqKGUpe3ZhciB0PW0oZSk7dHJ5e3Q9ZGVjb2RlVVJJKHQpfWNhdGNoKGUpe31yZXR1cm4gZW5jb2RlVVJJKHQpfWZ1bmN0aW9uIFQoZSx0KXt2YXIgbixyLG8sYT10LGk9ZS5wb3NNYXg7aWYoNjA9PT1lLnNyYy5jaGFyQ29kZUF0KHQpKXtmb3IodCsrO3Q8aTspe2lmKDEwPT09KG49ZS5zcmMuY2hhckNvZGVBdCh0KSkpcmV0dXJuITE7aWYoNjI9PT1uKXJldHVybiBvPWooYyhlLnNyYy5zbGljZShhKzEsdCkpKSwhIWUucGFyc2VyLnZhbGlkYXRlTGluayhvKSYmKGUucG9zPXQrMSxlLmxpbmtDb250ZW50PW8sITApOzkyPT09biYmdCsxPGk/dCs9Mjp0Kyt9cmV0dXJuITF9Zm9yKHI9MDt0PGkmJjMyIT09KG49ZS5zcmMuY2hhckNvZGVBdCh0KSkmJiEobjwzMnx8MTI3PT09bik7KWlmKDkyPT09biYmdCsxPGkpdCs9MjtlbHNle2lmKDQwPT09biYmKytyPjEpYnJlYWs7aWYoNDE9PT1uJiYtLXI8MClicmVhazt0Kyt9cmV0dXJuIGEhPT10JiYobz1jKGUuc3JjLnNsaWNlKGEsdCkpLCEhZS5wYXJzZXIudmFsaWRhdGVMaW5rKG8pJiYoZS5saW5rQ29udGVudD1vLGUucG9zPXQsITApKX1mdW5jdGlvbiBJKGUsdCl7dmFyIG4scj10LG89ZS5wb3NNYXgsYT1lLnNyYy5jaGFyQ29kZUF0KHQpO2lmKDM0IT09YSYmMzkhPT1hJiY0MCE9PWEpcmV0dXJuITE7Zm9yKHQrKyw0MD09PWEmJihhPTQxKTt0PG87KXtpZigobj1lLnNyYy5jaGFyQ29kZUF0KHQpKT09PWEpcmV0dXJuIGUucG9zPXQrMSxlLmxpbmtDb250ZW50PWMoZS5zcmMuc2xpY2UocisxLHQpKSwhMDs5Mj09PW4mJnQrMTxvP3QrPTI6dCsrfXJldHVybiExfWZ1bmN0aW9uIFAoZSl7cmV0dXJuIGUudHJpbSgpLnJlcGxhY2UoL1xzKy9nLCIgIikudG9VcHBlckNhc2UoKX1mdW5jdGlvbiBOKGUsdCxuLHIpe3ZhciBvLGEsaSxzLHUsYyxsLHAsZjtpZig5MSE9PWUuY2hhckNvZGVBdCgwKSlyZXR1cm4tMTtpZigtMT09PWUuaW5kZXhPZigiXToiKSlyZXR1cm4tMTtpZigoYT1PKG89bmV3IEEoZSx0LG4scixbXSksMCkpPDB8fDU4IT09ZS5jaGFyQ29kZUF0KGErMSkpcmV0dXJuLTE7Zm9yKHM9by5wb3NNYXgsaT1hKzI7aTxzJiYoMzI9PT0odT1vLnNyYy5jaGFyQ29kZUF0KGkpKXx8MTA9PT11KTtpKyspO2lmKCFUKG8saSkpcmV0dXJuLTE7Zm9yKGw9by5saW5rQ29udGVudCxjPWk9by5wb3MsaSs9MTtpPHMmJigzMj09PSh1PW8uc3JjLmNoYXJDb2RlQXQoaSkpfHwxMD09PXUpO2krKyk7Zm9yKGk8cyYmYyE9PWkmJkkobyxpKT8ocD1vLmxpbmtDb250ZW50LGk9by5wb3MpOihwPSIiLGk9Yyk7aTxzJiYzMj09PW8uc3JjLmNoYXJDb2RlQXQoaSk7KWkrKztyZXR1cm4gaTxzJiYxMCE9PW8uc3JjLmNoYXJDb2RlQXQoaSk/LTE6KGY9UChlLnNsaWNlKDEsYSkpLHZvaWQgMD09PXIucmVmZXJlbmNlc1tmXSYmKHIucmVmZXJlbmNlc1tmXT17dGl0bGU6cCxocmVmOmx9KSxpKX1TLnByb3RvdHlwZS5yZW5kZXJJbmxpbmU9ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj10aGlzLnJ1bGVzLG89ZS5sZW5ndGgsYT0wLGk9IiI7by0tOylpKz1yW2VbYV0udHlwZV0oZSxhKyssdCxuLHRoaXMpO3JldHVybiBpfSxTLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj10aGlzLnJ1bGVzLG89ZS5sZW5ndGgsYT0tMSxpPSIiOysrYTxvOykiaW5saW5lIj09PWVbYV0udHlwZT9pKz10aGlzLnJlbmRlcklubGluZShlW2FdLmNoaWxkcmVuLHQsbik6aSs9cltlW2FdLnR5cGVdKGUsYSx0LG4sdGhpcyk7cmV0dXJuIGl9LEMucHJvdG90eXBlLl9fZmluZF9fPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLl9fcnVsZXNfXy5sZW5ndGgsbj0tMTt0LS07KWlmKHRoaXMuX19ydWxlc19fWysrbl0ubmFtZT09PWUpcmV0dXJuIG47cmV0dXJuLTF9LEMucHJvdG90eXBlLl9fY29tcGlsZV9fPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PVsiIl07ZS5fX3J1bGVzX18uZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5lbmFibGVkJiZlLmFsdC5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmluZGV4T2YoZSk8MCYmdC5wdXNoKGUpfSkpfSkpLGUuX19jYWNoZV9fPXt9LHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7ZS5fX2NhY2hlX19bdF09W10sZS5fX3J1bGVzX18uZm9yRWFjaCgoZnVuY3Rpb24obil7bi5lbmFibGVkJiYodCYmbi5hbHQuaW5kZXhPZih0KTwwfHxlLl9fY2FjaGVfX1t0XS5wdXNoKG4uZm4pKX0pKX0pKX0sQy5wcm90b3R5cGUuYXQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuX19maW5kX18oZSksbz1ufHx7fTtpZigtMT09PXIpdGhyb3cgbmV3IEVycm9yKCJQYXJzZXIgcnVsZSBub3QgZm91bmQ6ICIrZSk7dGhpcy5fX3J1bGVzX19bcl0uZm49dCx0aGlzLl9fcnVsZXNfX1tyXS5hbHQ9by5hbHR8fFtdLHRoaXMuX19jYWNoZV9fPW51bGx9LEMucHJvdG90eXBlLmJlZm9yZT1mdW5jdGlvbihlLHQsbixyKXt2YXIgbz10aGlzLl9fZmluZF9fKGUpLGE9cnx8e307aWYoLTE9PT1vKXRocm93IG5ldyBFcnJvcigiUGFyc2VyIHJ1bGUgbm90IGZvdW5kOiAiK2UpO3RoaXMuX19ydWxlc19fLnNwbGljZShvLDAse25hbWU6dCxlbmFibGVkOiEwLGZuOm4sYWx0OmEuYWx0fHxbXX0pLHRoaXMuX19jYWNoZV9fPW51bGx9LEMucHJvdG90eXBlLmFmdGVyPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPXRoaXMuX19maW5kX18oZSksYT1yfHx7fTtpZigtMT09PW8pdGhyb3cgbmV3IEVycm9yKCJQYXJzZXIgcnVsZSBub3QgZm91bmQ6ICIrZSk7dGhpcy5fX3J1bGVzX18uc3BsaWNlKG8rMSwwLHtuYW1lOnQsZW5hYmxlZDohMCxmbjpuLGFsdDphLmFsdHx8W119KSx0aGlzLl9fY2FjaGVfXz1udWxsfSxDLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1ufHx7fTt0aGlzLl9fcnVsZXNfXy5wdXNoKHtuYW1lOmUsZW5hYmxlZDohMCxmbjp0LGFsdDpyLmFsdHx8W119KSx0aGlzLl9fY2FjaGVfXz1udWxsfSxDLnByb3RvdHlwZS5lbmFibGU9ZnVuY3Rpb24oZSx0KXtlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV0sdCYmdGhpcy5fX3J1bGVzX18uZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5lbmFibGVkPSExfSkpLGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fX2ZpbmRfXyhlKTtpZih0PDApdGhyb3cgbmV3IEVycm9yKCJSdWxlcyBtYW5hZ2VyOiBpbnZhbGlkIHJ1bGUgbmFtZSAiK2UpO3RoaXMuX19ydWxlc19fW3RdLmVuYWJsZWQ9ITB9KSx0aGlzKSx0aGlzLl9fY2FjaGVfXz1udWxsfSxDLnByb3RvdHlwZS5kaXNhYmxlPWZ1bmN0aW9uKGUpeyhlPUFycmF5LmlzQXJyYXkoZSk/ZTpbZV0pLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX19maW5kX18oZSk7aWYodDwwKXRocm93IG5ldyBFcnJvcigiUnVsZXMgbWFuYWdlcjogaW52YWxpZCBydWxlIG5hbWUgIitlKTt0aGlzLl9fcnVsZXNfX1t0XS5lbmFibGVkPSExfSksdGhpcyksdGhpcy5fX2NhY2hlX189bnVsbH0sQy5wcm90b3R5cGUuZ2V0UnVsZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PT10aGlzLl9fY2FjaGVfXyYmdGhpcy5fX2NvbXBpbGVfXygpLHRoaXMuX19jYWNoZV9fW2VdfHxbXX0sQS5wcm90b3R5cGUucHVzaFBlbmRpbmc9ZnVuY3Rpb24oKXt0aGlzLnRva2Vucy5wdXNoKHt0eXBlOiJ0ZXh0Iixjb250ZW50OnRoaXMucGVuZGluZyxsZXZlbDp0aGlzLnBlbmRpbmdMZXZlbH0pLHRoaXMucGVuZGluZz0iIn0sQS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihlKXt0aGlzLnBlbmRpbmcmJnRoaXMucHVzaFBlbmRpbmcoKSx0aGlzLnRva2Vucy5wdXNoKGUpLHRoaXMucGVuZGluZ0xldmVsPXRoaXMubGV2ZWx9LEEucHJvdG90eXBlLmNhY2hlU2V0PWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXRoaXMuY2FjaGUubGVuZ3RoO248PWU7bisrKXRoaXMuY2FjaGUucHVzaCgwKTt0aGlzLmNhY2hlW2VdPXR9LEEucHJvdG90eXBlLmNhY2hlR2V0PWZ1bmN0aW9uKGUpe3JldHVybiBlPHRoaXMuY2FjaGUubGVuZ3RoP3RoaXMuY2FjaGVbZV06MH07dmFyIE09IiBcbigpW10nXCIuLCE/LSI7ZnVuY3Rpb24gUihlKXtyZXR1cm4gZS5yZXBsYWNlKC8oWy0oKVxbXF17fSs/Ki4kXF58LDojPCFcXF0pL2csIlxcJDEiKX12YXIgRD0vXCstfFwuXC58XD9cP1w/XD98ISEhIXwsLHwtLS8sTD0vXCgoY3x0bXxyfHApXCkvZ2ksQj17YzoiwqkiLHI6IsKuIixwOiLCpyIsdG06IuKEoiJ9O3ZhciBGPS9bJyJdLyxVPS9bJyJdL2cscT0vWy1ccygpXFtcXV0vO2Z1bmN0aW9uIHooZSx0KXtyZXR1cm4hKHQ8MHx8dD49ZS5sZW5ndGgpJiYhcS50ZXN0KGVbdF0pfWZ1bmN0aW9uIFYoZSx0LG4pe3JldHVybiBlLnN1YnN0cigwLHQpK24rZS5zdWJzdHIodCsxKX12YXIgVz1bWyJibG9jayIsZnVuY3Rpb24oZSl7ZS5pbmxpbmVNb2RlP2UudG9rZW5zLnB1c2goe3R5cGU6ImlubGluZSIsY29udGVudDplLnNyYy5yZXBsYWNlKC9cbi9nLCIgIikudHJpbSgpLGxldmVsOjAsbGluZXM6WzAsMV0sY2hpbGRyZW46W119KTplLmJsb2NrLnBhcnNlKGUuc3JjLGUub3B0aW9ucyxlLmVudixlLnRva2Vucyl9XSxbImFiYnIiLGZ1bmN0aW9uKGUpe3ZhciB0LG4scixvLGE9ZS50b2tlbnM7aWYoIWUuaW5saW5lTW9kZSlmb3IodD0xLG49YS5sZW5ndGgtMTt0PG47dCsrKWlmKCJwYXJhZ3JhcGhfb3BlbiI9PT1hW3QtMV0udHlwZSYmImlubGluZSI9PT1hW3RdLnR5cGUmJiJwYXJhZ3JhcGhfY2xvc2UiPT09YVt0KzFdLnR5cGUpe2ZvcihyPWFbdF0uY29udGVudDtyLmxlbmd0aCYmISgobz1rKHIsZS5pbmxpbmUsZS5vcHRpb25zLGUuZW52KSk8MCk7KXI9ci5zbGljZShvKS50cmltKCk7YVt0XS5jb250ZW50PXIsci5sZW5ndGh8fChhW3QtMV0udGlnaHQ9ITAsYVt0KzFdLnRpZ2h0PSEwKX19XSxbInJlZmVyZW5jZXMiLGZ1bmN0aW9uKGUpe3ZhciB0LG4scixvLGE9ZS50b2tlbnM7aWYoZS5lbnYucmVmZXJlbmNlcz1lLmVudi5yZWZlcmVuY2VzfHx7fSwhZS5pbmxpbmVNb2RlKWZvcih0PTEsbj1hLmxlbmd0aC0xO3Q8bjt0KyspaWYoImlubGluZSI9PT1hW3RdLnR5cGUmJiJwYXJhZ3JhcGhfb3BlbiI9PT1hW3QtMV0udHlwZSYmInBhcmFncmFwaF9jbG9zZSI9PT1hW3QrMV0udHlwZSl7Zm9yKHI9YVt0XS5jb250ZW50O3IubGVuZ3RoJiYhKChvPU4ocixlLmlubGluZSxlLm9wdGlvbnMsZS5lbnYpKTwwKTspcj1yLnNsaWNlKG8pLnRyaW0oKTthW3RdLmNvbnRlbnQ9cixyLmxlbmd0aHx8KGFbdC0xXS50aWdodD0hMCxhW3QrMV0udGlnaHQ9ITApfX1dLFsiaW5saW5lIixmdW5jdGlvbihlKXt2YXIgdCxuLHIsbz1lLnRva2Vucztmb3Iobj0wLHI9by5sZW5ndGg7bjxyO24rKykiaW5saW5lIj09PSh0PW9bbl0pLnR5cGUmJmUuaW5saW5lLnBhcnNlKHQuY29udGVudCxlLm9wdGlvbnMsZS5lbnYsdC5jaGlsZHJlbil9XSxbImZvb3Rub3RlX3RhaWwiLGZ1bmN0aW9uKGUpe3ZhciB0LG4scixvLGEsaSxzLHUsYyxsPTAscD0hMSxmPXt9O2lmKGUuZW52LmZvb3Rub3RlcyYmKGUudG9rZW5zPWUudG9rZW5zLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuImZvb3Rub3RlX3JlZmVyZW5jZV9vcGVuIj09PWUudHlwZT8ocD0hMCx1PVtdLGM9ZS5sYWJlbCwhMSk6ImZvb3Rub3RlX3JlZmVyZW5jZV9jbG9zZSI9PT1lLnR5cGU/KHA9ITEsZlsiOiIrY109dSwhMSk6KHAmJnUucHVzaChlKSwhcCl9KSksZS5lbnYuZm9vdG5vdGVzLmxpc3QpKXtmb3IoaT1lLmVudi5mb290bm90ZXMubGlzdCxlLnRva2Vucy5wdXNoKHt0eXBlOiJmb290bm90ZV9ibG9ja19vcGVuIixsZXZlbDpsKyt9KSx0PTAsbj1pLmxlbmd0aDt0PG47dCsrKXtmb3IoZS50b2tlbnMucHVzaCh7dHlwZToiZm9vdG5vdGVfb3BlbiIsaWQ6dCxsZXZlbDpsKyt9KSxpW3RdLnRva2Vucz8oKHM9W10pLnB1c2goe3R5cGU6InBhcmFncmFwaF9vcGVuIix0aWdodDohMSxsZXZlbDpsKyt9KSxzLnB1c2goe3R5cGU6ImlubGluZSIsY29udGVudDoiIixsZXZlbDpsLGNoaWxkcmVuOmlbdF0udG9rZW5zfSkscy5wdXNoKHt0eXBlOiJwYXJhZ3JhcGhfY2xvc2UiLHRpZ2h0OiExLGxldmVsOi0tbH0pKTppW3RdLmxhYmVsJiYocz1mWyI6IitpW3RdLmxhYmVsXSksZS50b2tlbnM9ZS50b2tlbnMuY29uY2F0KHMpLGE9InBhcmFncmFwaF9jbG9zZSI9PT1lLnRva2Vuc1tlLnRva2Vucy5sZW5ndGgtMV0udHlwZT9lLnRva2Vucy5wb3AoKTpudWxsLG89aVt0XS5jb3VudD4wP2lbdF0uY291bnQ6MSxyPTA7cjxvO3IrKyllLnRva2Vucy5wdXNoKHt0eXBlOiJmb290bm90ZV9hbmNob3IiLGlkOnQsc3ViSWQ6cixsZXZlbDpsfSk7YSYmZS50b2tlbnMucHVzaChhKSxlLnRva2Vucy5wdXNoKHt0eXBlOiJmb290bm90ZV9jbG9zZSIsbGV2ZWw6LS1sfSl9ZS50b2tlbnMucHVzaCh7dHlwZToiZm9vdG5vdGVfYmxvY2tfY2xvc2UiLGxldmVsOi0tbH0pfX1dLFsiYWJicjIiLGZ1bmN0aW9uKGUpe3ZhciB0LG4scixvLGEsaSxzLHUsYyxsLHAsZixoPWUudG9rZW5zO2lmKGUuZW52LmFiYnJldmlhdGlvbnMpZm9yKGUuZW52LmFiYnJSZWdFeHB8fChmPSIoXnxbIitNLnNwbGl0KCIiKS5tYXAoUikuam9pbigiIikrIl0pKCIrT2JqZWN0LmtleXMoZS5lbnYuYWJicmV2aWF0aW9ucykubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS5zdWJzdHIoMSl9KSkuc29ydCgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5sZW5ndGgtZS5sZW5ndGh9KSkubWFwKFIpLmpvaW4oInwiKSsiKSgkfFsiK00uc3BsaXQoIiIpLm1hcChSKS5qb2luKCIiKSsiXSkiLGUuZW52LmFiYnJSZWdFeHA9bmV3IFJlZ0V4cChmLCJnIikpLGw9ZS5lbnYuYWJiclJlZ0V4cCxuPTAscj1oLmxlbmd0aDtuPHI7bisrKWlmKCJpbmxpbmUiPT09aFtuXS50eXBlKWZvcih0PShvPWhbbl0uY2hpbGRyZW4pLmxlbmd0aC0xO3Q+PTA7dC0tKWlmKCJ0ZXh0Ij09PShhPW9bdF0pLnR5cGUpe2Zvcih1PTAsaT1hLmNvbnRlbnQsbC5sYXN0SW5kZXg9MCxjPWEubGV2ZWwscz1bXTtwPWwuZXhlYyhpKTspbC5sYXN0SW5kZXg+dSYmcy5wdXNoKHt0eXBlOiJ0ZXh0Iixjb250ZW50Omkuc2xpY2UodSxwLmluZGV4K3BbMV0ubGVuZ3RoKSxsZXZlbDpjfSkscy5wdXNoKHt0eXBlOiJhYmJyX29wZW4iLHRpdGxlOmUuZW52LmFiYnJldmlhdGlvbnNbIjoiK3BbMl1dLGxldmVsOmMrK30pLHMucHVzaCh7dHlwZToidGV4dCIsY29udGVudDpwWzJdLGxldmVsOmN9KSxzLnB1c2goe3R5cGU6ImFiYnJfY2xvc2UiLGxldmVsOi0tY30pLHU9bC5sYXN0SW5kZXgtcFszXS5sZW5ndGg7cy5sZW5ndGgmJih1PGkubGVuZ3RoJiZzLnB1c2goe3R5cGU6InRleHQiLGNvbnRlbnQ6aS5zbGljZSh1KSxsZXZlbDpjfSksaFtuXS5jaGlsZHJlbj1vPVtdLmNvbmNhdChvLnNsaWNlKDAsdCkscyxvLnNsaWNlKHQrMSkpKX19XSxbInJlcGxhY2VtZW50cyIsZnVuY3Rpb24oZSl7dmFyIHQsbixyLG8sYSxpO2lmKGUub3B0aW9ucy50eXBvZ3JhcGhlcilmb3IoYT1lLnRva2Vucy5sZW5ndGgtMTthPj0wO2EtLSlpZigiaW5saW5lIj09PWUudG9rZW5zW2FdLnR5cGUpZm9yKHQ9KG89ZS50b2tlbnNbYV0uY2hpbGRyZW4pLmxlbmd0aC0xO3Q+PTA7dC0tKSJ0ZXh0Ij09PShuPW9bdF0pLnR5cGUmJihyPW4uY29udGVudCxyPShpPXIpLmluZGV4T2YoIigiKTwwP2k6aS5yZXBsYWNlKEwsKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIEJbdC50b0xvd2VyQ2FzZSgpXX0pKSxELnRlc3QocikmJihyPXIucmVwbGFjZSgvXCstL2csIsKxIikucmVwbGFjZSgvXC57Mix9L2csIuKApiIpLnJlcGxhY2UoLyhbPyFdKeKApi9nLCIkMS4uIikucmVwbGFjZSgvKFs/IV0pezQsfS9nLCIkMSQxJDEiKS5yZXBsYWNlKC8sezIsfS9nLCIsIikucmVwbGFjZSgvKF58W14tXSktLS0oW14tXXwkKS9nbSwiJDHigJQkMiIpLnJlcGxhY2UoLyhefFxzKS0tKFxzfCQpL2dtLCIkMeKAkyQyIikucmVwbGFjZSgvKF58W14tXHNdKS0tKFteLVxzXXwkKS9nbSwiJDHigJMkMiIpKSxuLmNvbnRlbnQ9cil9XSxbInNtYXJ0cXVvdGVzIixmdW5jdGlvbihlKXt2YXIgdCxuLHIsbyxhLGkscyx1LGMsbCxwLGYsaCxkLG0sdixnO2lmKGUub3B0aW9ucy50eXBvZ3JhcGhlcilmb3IoZz1bXSxtPWUudG9rZW5zLmxlbmd0aC0xO20+PTA7bS0tKWlmKCJpbmxpbmUiPT09ZS50b2tlbnNbbV0udHlwZSlmb3Iodj1lLnRva2Vuc1ttXS5jaGlsZHJlbixnLmxlbmd0aD0wLHQ9MDt0PHYubGVuZ3RoO3QrKylpZigidGV4dCI9PT0obj12W3RdKS50eXBlJiYhRi50ZXN0KG4udGV4dCkpe2ZvcihzPXZbdF0ubGV2ZWwsaD1nLmxlbmd0aC0xO2g+PTAmJiEoZ1toXS5sZXZlbDw9cyk7aC0tKTtnLmxlbmd0aD1oKzEsYT0wLGk9KHI9bi5jb250ZW50KS5sZW5ndGg7ZTpmb3IoO2E8aSYmKFUubGFzdEluZGV4PWEsbz1VLmV4ZWMocikpOylpZih1PSF6KHIsby5pbmRleC0xKSxhPW8uaW5kZXgrMSxkPSInIj09PW9bMF0sKGM9IXoocixhKSl8fHUpe2lmKHA9IWMsZj0hdSlmb3IoaD1nLmxlbmd0aC0xO2g+PTAmJihsPWdbaF0sIShnW2hdLmxldmVsPHMpKTtoLS0paWYobC5zaW5nbGU9PT1kJiZnW2hdLmxldmVsPT09cyl7bD1nW2hdLGQ/KHZbbC50b2tlbl0uY29udGVudD1WKHZbbC50b2tlbl0uY29udGVudCxsLnBvcyxlLm9wdGlvbnMucXVvdGVzWzJdKSxuLmNvbnRlbnQ9VihuLmNvbnRlbnQsby5pbmRleCxlLm9wdGlvbnMucXVvdGVzWzNdKSk6KHZbbC50b2tlbl0uY29udGVudD1WKHZbbC50b2tlbl0uY29udGVudCxsLnBvcyxlLm9wdGlvbnMucXVvdGVzWzBdKSxuLmNvbnRlbnQ9VihuLmNvbnRlbnQsby5pbmRleCxlLm9wdGlvbnMucXVvdGVzWzFdKSksZy5sZW5ndGg9aDtjb250aW51ZSBlfXA/Zy5wdXNoKHt0b2tlbjp0LHBvczpvLmluZGV4LHNpbmdsZTpkLGxldmVsOnN9KTpmJiZkJiYobi5jb250ZW50PVYobi5jb250ZW50LG8uaW5kZXgsIuKAmSIpKX1lbHNlIGQmJihuLmNvbnRlbnQ9VihuLmNvbnRlbnQsby5pbmRleCwi4oCZIikpfX1dXTtmdW5jdGlvbiBIKCl7dGhpcy5vcHRpb25zPXt9LHRoaXMucnVsZXI9bmV3IEM7Zm9yKHZhciBlPTA7ZTxXLmxlbmd0aDtlKyspdGhpcy5ydWxlci5wdXNoKFdbZV1bMF0sV1tlXVsxXSl9ZnVuY3Rpb24gJChlLHQsbixyLG8pe3ZhciBhLGkscyx1LGMsbCxwO2Zvcih0aGlzLnNyYz1lLHRoaXMucGFyc2VyPXQsdGhpcy5vcHRpb25zPW4sdGhpcy5lbnY9cix0aGlzLnRva2Vucz1vLHRoaXMuYk1hcmtzPVtdLHRoaXMuZU1hcmtzPVtdLHRoaXMudFNoaWZ0PVtdLHRoaXMuYmxrSW5kZW50PTAsdGhpcy5saW5lPTAsdGhpcy5saW5lTWF4PTAsdGhpcy50aWdodD0hMSx0aGlzLnBhcmVudFR5cGU9InJvb3QiLHRoaXMuZGRJbmRlbnQ9LTEsdGhpcy5sZXZlbD0wLHRoaXMucmVzdWx0PSIiLGw9MCxwPSExLHM9dT1sPTAsYz0oaT10aGlzLnNyYykubGVuZ3RoO3U8Yzt1Kyspe2lmKGE9aS5jaGFyQ29kZUF0KHUpLCFwKXtpZigzMj09PWEpe2wrKztjb250aW51ZX1wPSEwfTEwIT09YSYmdSE9PWMtMXx8KDEwIT09YSYmdSsrLHRoaXMuYk1hcmtzLnB1c2gocyksdGhpcy5lTWFya3MucHVzaCh1KSx0aGlzLnRTaGlmdC5wdXNoKGwpLHA9ITEsbD0wLHM9dSsxKX10aGlzLmJNYXJrcy5wdXNoKGkubGVuZ3RoKSx0aGlzLmVNYXJrcy5wdXNoKGkubGVuZ3RoKSx0aGlzLnRTaGlmdC5wdXNoKDApLHRoaXMubGluZU1heD10aGlzLmJNYXJrcy5sZW5ndGgtMX1mdW5jdGlvbiBKKGUsdCl7dmFyIG4scixvO3JldHVybihyPWUuYk1hcmtzW3RdK2UudFNoaWZ0W3RdKT49KG89ZS5lTWFya3NbdF0pfHw0MiE9PShuPWUuc3JjLmNoYXJDb2RlQXQocisrKSkmJjQ1IT09biYmNDMhPT1ufHxyPG8mJjMyIT09ZS5zcmMuY2hhckNvZGVBdChyKT8tMTpyfWZ1bmN0aW9uIEsoZSx0KXt2YXIgbixyPWUuYk1hcmtzW3RdK2UudFNoaWZ0W3RdLG89ZS5lTWFya3NbdF07aWYocisxPj1vKXJldHVybi0xO2lmKChuPWUuc3JjLmNoYXJDb2RlQXQocisrKSk8NDh8fG4+NTcpcmV0dXJuLTE7Zm9yKDs7KXtpZihyPj1vKXJldHVybi0xO2lmKCEoKG49ZS5zcmMuY2hhckNvZGVBdChyKyspKT49NDgmJm48PTU3KSl7aWYoNDE9PT1ufHw0Nj09PW4pYnJlYWs7cmV0dXJuLTF9fXJldHVybiByPG8mJjMyIT09ZS5zcmMuY2hhckNvZGVBdChyKT8tMTpyfUgucHJvdG90eXBlLnByb2Nlc3M9ZnVuY3Rpb24oZSl7dmFyIHQsbixyO2Zvcih0PTAsbj0ocj10aGlzLnJ1bGVyLmdldFJ1bGVzKCIiKSkubGVuZ3RoO3Q8bjt0Kyspclt0XShlKX0sJC5wcm90b3R5cGUuaXNFbXB0eT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5iTWFya3NbZV0rdGhpcy50U2hpZnRbZV0+PXRoaXMuZU1hcmtzW2VdfSwkLnByb3RvdHlwZS5za2lwRW1wdHlMaW5lcz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy5saW5lTWF4O2U8dCYmISh0aGlzLmJNYXJrc1tlXSt0aGlzLnRTaGlmdFtlXTx0aGlzLmVNYXJrc1tlXSk7ZSsrKTtyZXR1cm4gZX0sJC5wcm90b3R5cGUuc2tpcFNwYWNlcz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy5zcmMubGVuZ3RoO2U8dCYmMzI9PT10aGlzLnNyYy5jaGFyQ29kZUF0KGUpO2UrKyk7cmV0dXJuIGV9LCQucHJvdG90eXBlLnNraXBDaGFycz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj10aGlzLnNyYy5sZW5ndGg7ZTxuJiZ0aGlzLnNyYy5jaGFyQ29kZUF0KGUpPT09dDtlKyspO3JldHVybiBlfSwkLnByb3RvdHlwZS5za2lwQ2hhcnNCYWNrPWZ1bmN0aW9uKGUsdCxuKXtpZihlPD1uKXJldHVybiBlO2Zvcig7ZT5uOylpZih0IT09dGhpcy5zcmMuY2hhckNvZGVBdCgtLWUpKXJldHVybiBlKzE7cmV0dXJuIGV9LCQucHJvdG90eXBlLmdldExpbmVzPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvLGEsaSxzLHUsYz1lO2lmKGU+PXQpcmV0dXJuIiI7aWYoYysxPT09dClyZXR1cm4gYT10aGlzLmJNYXJrc1tjXStNYXRoLm1pbih0aGlzLnRTaGlmdFtjXSxuKSxpPXI/dGhpcy5lTWFya3NbY10rMTp0aGlzLmVNYXJrc1tjXSx0aGlzLnNyYy5zbGljZShhLGkpO2ZvcihzPW5ldyBBcnJheSh0LWUpLG89MDtjPHQ7YysrLG8rKykodT10aGlzLnRTaGlmdFtjXSk+biYmKHU9biksdTwwJiYodT0wKSxhPXRoaXMuYk1hcmtzW2NdK3UsaT1jKzE8dHx8cj90aGlzLmVNYXJrc1tjXSsxOnRoaXMuZU1hcmtzW2NdLHNbb109dGhpcy5zcmMuc2xpY2UoYSxpKTtyZXR1cm4gcy5qb2luKCIiKX07dmFyIFk9e307WyJhcnRpY2xlIiwiYXNpZGUiLCJidXR0b24iLCJibG9ja3F1b3RlIiwiYm9keSIsImNhbnZhcyIsImNhcHRpb24iLCJjb2wiLCJjb2xncm91cCIsImRkIiwiZGl2IiwiZGwiLCJkdCIsImVtYmVkIiwiZmllbGRzZXQiLCJmaWdjYXB0aW9uIiwiZmlndXJlIiwiZm9vdGVyIiwiZm9ybSIsImgxIiwiaDIiLCJoMyIsImg0IiwiaDUiLCJoNiIsImhlYWRlciIsImhncm91cCIsImhyIiwiaWZyYW1lIiwibGkiLCJtYXAiLCJvYmplY3QiLCJvbCIsIm91dHB1dCIsInAiLCJwcmUiLCJwcm9ncmVzcyIsInNjcmlwdCIsInNlY3Rpb24iLCJzdHlsZSIsInRhYmxlIiwidGJvZHkiLCJ0ZCIsInRleHRhcmVhIiwidGZvb3QiLCJ0aCIsInRyIiwidGhlYWQiLCJ1bCIsInZpZGVvIl0uZm9yRWFjaCgoZnVuY3Rpb24oZSl7WVtlXT0hMH0pKTt2YXIgRz0vXjwoW2EtekEtWl17MSwxNX0pW1xzXC8+XS8sWj0vXjxcLyhbYS16QS1aXXsxLDE1fSlbXHM+XS87ZnVuY3Rpb24gWChlLHQpe3ZhciBuPWUuYk1hcmtzW3RdK2UuYmxrSW5kZW50LHI9ZS5lTWFya3NbdF07cmV0dXJuIGUuc3JjLnN1YnN0cihuLHItbil9ZnVuY3Rpb24gUShlLHQpe3ZhciBuLHIsbz1lLmJNYXJrc1t0XStlLnRTaGlmdFt0XSxhPWUuZU1hcmtzW3RdO3JldHVybiBvPj1hfHwxMjYhPT0ocj1lLnNyYy5jaGFyQ29kZUF0KG8rKykpJiY1OCE9PXJ8fG89PT0obj1lLnNraXBTcGFjZXMobykpfHxuPj1hPy0xOm59dmFyIGVlPVtbImNvZGUiLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcixvO2lmKGUudFNoaWZ0W3RdLWUuYmxrSW5kZW50PDQpcmV0dXJuITE7Zm9yKG89cj10KzE7cjxuOylpZihlLmlzRW1wdHkocikpcisrO2Vsc2V7aWYoIShlLnRTaGlmdFtyXS1lLmJsa0luZGVudD49NCkpYnJlYWs7bz0rK3J9cmV0dXJuIGUubGluZT1yLGUudG9rZW5zLnB1c2goe3R5cGU6ImNvZGUiLGNvbnRlbnQ6ZS5nZXRMaW5lcyh0LG8sNCtlLmJsa0luZGVudCwhMCksYmxvY2s6ITAsbGluZXM6W3QsZS5saW5lXSxsZXZlbDplLmxldmVsfSksITB9XSxbImZlbmNlcyIsZnVuY3Rpb24oZSx0LG4scil7dmFyIG8sYSxpLHMsdSxjPSExLGw9ZS5iTWFya3NbdF0rZS50U2hpZnRbdF0scD1lLmVNYXJrc1t0XTtpZihsKzM+cClyZXR1cm4hMTtpZigxMjYhPT0obz1lLnNyYy5jaGFyQ29kZUF0KGwpKSYmOTYhPT1vKXJldHVybiExO2lmKHU9bCwoYT0obD1lLnNraXBDaGFycyhsLG8pKS11KTwzKXJldHVybiExO2lmKChpPWUuc3JjLnNsaWNlKGwscCkudHJpbSgpKS5pbmRleE9mKCJgIik+PTApcmV0dXJuITE7aWYocilyZXR1cm4hMDtmb3Iocz10OyEoKytzPj1uKSYmISgobD11PWUuYk1hcmtzW3NdK2UudFNoaWZ0W3NdKTwocD1lLmVNYXJrc1tzXSkmJmUudFNoaWZ0W3NdPGUuYmxrSW5kZW50KTspaWYoZS5zcmMuY2hhckNvZGVBdChsKT09PW8mJiEoZS50U2hpZnRbc10tZS5ibGtJbmRlbnQ+PTR8fChsPWUuc2tpcENoYXJzKGwsbykpLXU8YXx8KGw9ZS5za2lwU3BhY2VzKGwpKTxwKSl7Yz0hMDticmVha31yZXR1cm4gYT1lLnRTaGlmdFt0XSxlLmxpbmU9cysoYz8xOjApLGUudG9rZW5zLnB1c2goe3R5cGU6ImZlbmNlIixwYXJhbXM6aSxjb250ZW50OmUuZ2V0TGluZXModCsxLHMsYSwhMCksbGluZXM6W3QsZS5saW5lXSxsZXZlbDplLmxldmVsfSksITB9LFsicGFyYWdyYXBoIiwiYmxvY2txdW90ZSIsImxpc3QiXV0sWyJibG9ja3F1b3RlIixmdW5jdGlvbihlLHQsbixyKXt2YXIgbyxhLGkscyx1LGMsbCxwLGYsaCxkLG09ZS5iTWFya3NbdF0rZS50U2hpZnRbdF0sdj1lLmVNYXJrc1t0XTtpZihtPnYpcmV0dXJuITE7aWYoNjIhPT1lLnNyYy5jaGFyQ29kZUF0KG0rKykpcmV0dXJuITE7aWYoZS5sZXZlbD49ZS5vcHRpb25zLm1heE5lc3RpbmcpcmV0dXJuITE7aWYocilyZXR1cm4hMDtmb3IoMzI9PT1lLnNyYy5jaGFyQ29kZUF0KG0pJiZtKyssdT1lLmJsa0luZGVudCxlLmJsa0luZGVudD0wLHM9W2UuYk1hcmtzW3RdXSxlLmJNYXJrc1t0XT1tLGE9KG09bTx2P2Uuc2tpcFNwYWNlcyhtKTptKT49dixpPVtlLnRTaGlmdFt0XV0sZS50U2hpZnRbdF09bS1lLmJNYXJrc1t0XSxwPWUucGFyc2VyLnJ1bGVyLmdldFJ1bGVzKCJibG9ja3F1b3RlIiksbz10KzE7bzxuJiYhKChtPWUuYk1hcmtzW29dK2UudFNoaWZ0W29dKT49KHY9ZS5lTWFya3Nbb10pKTtvKyspaWYoNjIhPT1lLnNyYy5jaGFyQ29kZUF0KG0rKykpe2lmKGEpYnJlYWs7Zm9yKGQ9ITEsZj0wLGg9cC5sZW5ndGg7ZjxoO2YrKylpZihwW2ZdKGUsbyxuLCEwKSl7ZD0hMDticmVha31pZihkKWJyZWFrO3MucHVzaChlLmJNYXJrc1tvXSksaS5wdXNoKGUudFNoaWZ0W29dKSxlLnRTaGlmdFtvXT0tMTMzN31lbHNlIDMyPT09ZS5zcmMuY2hhckNvZGVBdChtKSYmbSsrLHMucHVzaChlLmJNYXJrc1tvXSksZS5iTWFya3Nbb109bSxhPShtPW08dj9lLnNraXBTcGFjZXMobSk6bSk+PXYsaS5wdXNoKGUudFNoaWZ0W29dKSxlLnRTaGlmdFtvXT1tLWUuYk1hcmtzW29dO2ZvcihjPWUucGFyZW50VHlwZSxlLnBhcmVudFR5cGU9ImJsb2NrcXVvdGUiLGUudG9rZW5zLnB1c2goe3R5cGU6ImJsb2NrcXVvdGVfb3BlbiIsbGluZXM6bD1bdCwwXSxsZXZlbDplLmxldmVsKyt9KSxlLnBhcnNlci50b2tlbml6ZShlLHQsbyksZS50b2tlbnMucHVzaCh7dHlwZToiYmxvY2txdW90ZV9jbG9zZSIsbGV2ZWw6LS1lLmxldmVsfSksZS5wYXJlbnRUeXBlPWMsbFsxXT1lLmxpbmUsZj0wO2Y8aS5sZW5ndGg7ZisrKWUuYk1hcmtzW2YrdF09c1tmXSxlLnRTaGlmdFtmK3RdPWlbZl07cmV0dXJuIGUuYmxrSW5kZW50PXUsITB9LFsicGFyYWdyYXBoIiwiYmxvY2txdW90ZSIsImxpc3QiXV0sWyJociIsZnVuY3Rpb24oZSx0LG4scil7dmFyIG8sYSxpLHM9ZS5iTWFya3NbdF0sdT1lLmVNYXJrc1t0XTtpZigocys9ZS50U2hpZnRbdF0pPnUpcmV0dXJuITE7aWYoNDIhPT0obz1lLnNyYy5jaGFyQ29kZUF0KHMrKykpJiY0NSE9PW8mJjk1IT09bylyZXR1cm4hMTtmb3IoYT0xO3M8dTspe2lmKChpPWUuc3JjLmNoYXJDb2RlQXQocysrKSkhPT1vJiYzMiE9PWkpcmV0dXJuITE7aT09PW8mJmErK31yZXR1cm4hKGE8MykmJihyfHwoZS5saW5lPXQrMSxlLnRva2Vucy5wdXNoKHt0eXBlOiJociIsbGluZXM6W3QsZS5saW5lXSxsZXZlbDplLmxldmVsfSkpLCEwKX0sWyJwYXJhZ3JhcGgiLCJibG9ja3F1b3RlIiwibGlzdCJdXSxbImxpc3QiLGZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvLGEsaSxzLHUsYyxsLHAsZixoLGQsbSx2LGcseSxiLF8sdyx4LEUsUyxDPSEwO2lmKChwPUsoZSx0KSk+PTApbT0hMDtlbHNle2lmKCEoKHA9SihlLHQpKT49MCkpcmV0dXJuITE7bT0hMX1pZihlLmxldmVsPj1lLm9wdGlvbnMubWF4TmVzdGluZylyZXR1cm4hMTtpZihkPWUuc3JjLmNoYXJDb2RlQXQocC0xKSxyKXJldHVybiEwO2ZvcihnPWUudG9rZW5zLmxlbmd0aCxtPyhsPWUuYk1hcmtzW3RdK2UudFNoaWZ0W3RdLGg9TnVtYmVyKGUuc3JjLnN1YnN0cihsLHAtbC0xKSksZS50b2tlbnMucHVzaCh7dHlwZToib3JkZXJlZF9saXN0X29wZW4iLG9yZGVyOmgsbGluZXM6Yj1bdCwwXSxsZXZlbDplLmxldmVsKyt9KSk6ZS50b2tlbnMucHVzaCh7dHlwZToiYnVsbGV0X2xpc3Rfb3BlbiIsbGluZXM6Yj1bdCwwXSxsZXZlbDplLmxldmVsKyt9KSxvPXQseT0hMSx3PWUucGFyc2VyLnJ1bGVyLmdldFJ1bGVzKCJsaXN0Iik7ISghKG88bil8fCgoZj0odj1lLnNraXBTcGFjZXMocCkpPj1lLmVNYXJrc1tvXT8xOnYtcCk+NCYmKGY9MSksZjwxJiYoZj0xKSxhPXAtZS5iTWFya3Nbb10rZixlLnRva2Vucy5wdXNoKHt0eXBlOiJsaXN0X2l0ZW1fb3BlbiIsbGluZXM6Xz1bdCwwXSxsZXZlbDplLmxldmVsKyt9KSxzPWUuYmxrSW5kZW50LHU9ZS50aWdodCxpPWUudFNoaWZ0W3RdLGM9ZS5wYXJlbnRUeXBlLGUudFNoaWZ0W3RdPXYtZS5iTWFya3NbdF0sZS5ibGtJbmRlbnQ9YSxlLnRpZ2h0PSEwLGUucGFyZW50VHlwZT0ibGlzdCIsZS5wYXJzZXIudG9rZW5pemUoZSx0LG4sITApLGUudGlnaHQmJiF5fHwoQz0hMSkseT1lLmxpbmUtdD4xJiZlLmlzRW1wdHkoZS5saW5lLTEpLGUuYmxrSW5kZW50PXMsZS50U2hpZnRbdF09aSxlLnRpZ2h0PXUsZS5wYXJlbnRUeXBlPWMsZS50b2tlbnMucHVzaCh7dHlwZToibGlzdF9pdGVtX2Nsb3NlIixsZXZlbDotLWUubGV2ZWx9KSxvPXQ9ZS5saW5lLF9bMV09byx2PWUuYk1hcmtzW3RdLG8+PW4pfHxlLmlzRW1wdHkobyl8fGUudFNoaWZ0W29dPGUuYmxrSW5kZW50KTspe2ZvcihTPSExLHg9MCxFPXcubGVuZ3RoO3g8RTt4KyspaWYod1t4XShlLG8sbiwhMCkpe1M9ITA7YnJlYWt9aWYoUylicmVhaztpZihtKXtpZigocD1LKGUsbykpPDApYnJlYWt9ZWxzZSBpZigocD1KKGUsbykpPDApYnJlYWs7aWYoZCE9PWUuc3JjLmNoYXJDb2RlQXQocC0xKSlicmVha31yZXR1cm4gZS50b2tlbnMucHVzaCh7dHlwZTptPyJvcmRlcmVkX2xpc3RfY2xvc2UiOiJidWxsZXRfbGlzdF9jbG9zZSIsbGV2ZWw6LS1lLmxldmVsfSksYlsxXT1vLGUubGluZT1vLEMmJmZ1bmN0aW9uKGUsdCl7dmFyIG4scixvPWUubGV2ZWwrMjtmb3Iobj10KzIscj1lLnRva2Vucy5sZW5ndGgtMjtuPHI7bisrKWUudG9rZW5zW25dLmxldmVsPT09byYmInBhcmFncmFwaF9vcGVuIj09PWUudG9rZW5zW25dLnR5cGUmJihlLnRva2Vuc1tuKzJdLnRpZ2h0PSEwLGUudG9rZW5zW25dLnRpZ2h0PSEwLG4rPTIpfShlLGcpLCEwfSxbInBhcmFncmFwaCIsImJsb2NrcXVvdGUiXV0sWyJmb290bm90ZSIsZnVuY3Rpb24oZSx0LG4scil7dmFyIG8sYSxpLHMsdSxjPWUuYk1hcmtzW3RdK2UudFNoaWZ0W3RdLGw9ZS5lTWFya3NbdF07aWYoYys0PmwpcmV0dXJuITE7aWYoOTEhPT1lLnNyYy5jaGFyQ29kZUF0KGMpKXJldHVybiExO2lmKDk0IT09ZS5zcmMuY2hhckNvZGVBdChjKzEpKXJldHVybiExO2lmKGUubGV2ZWw+PWUub3B0aW9ucy5tYXhOZXN0aW5nKXJldHVybiExO2ZvcihzPWMrMjtzPGw7cysrKXtpZigzMj09PWUuc3JjLmNoYXJDb2RlQXQocykpcmV0dXJuITE7aWYoOTM9PT1lLnNyYy5jaGFyQ29kZUF0KHMpKWJyZWFrfXJldHVybiBzIT09YysyJiYoIShzKzE+PWx8fDU4IT09ZS5zcmMuY2hhckNvZGVBdCgrK3MpKSYmKHJ8fChzKyssZS5lbnYuZm9vdG5vdGVzfHwoZS5lbnYuZm9vdG5vdGVzPXt9KSxlLmVudi5mb290bm90ZXMucmVmc3x8KGUuZW52LmZvb3Rub3Rlcy5yZWZzPXt9KSx1PWUuc3JjLnNsaWNlKGMrMixzLTIpLGUuZW52LmZvb3Rub3Rlcy5yZWZzWyI6Iit1XT0tMSxlLnRva2Vucy5wdXNoKHt0eXBlOiJmb290bm90ZV9yZWZlcmVuY2Vfb3BlbiIsbGFiZWw6dSxsZXZlbDplLmxldmVsKyt9KSxvPWUuYk1hcmtzW3RdLGE9ZS50U2hpZnRbdF0saT1lLnBhcmVudFR5cGUsZS50U2hpZnRbdF09ZS5za2lwU3BhY2VzKHMpLXMsZS5iTWFya3NbdF09cyxlLmJsa0luZGVudCs9NCxlLnBhcmVudFR5cGU9ImZvb3Rub3RlIixlLnRTaGlmdFt0XTxlLmJsa0luZGVudCYmKGUudFNoaWZ0W3RdKz1lLmJsa0luZGVudCxlLmJNYXJrc1t0XS09ZS5ibGtJbmRlbnQpLGUucGFyc2VyLnRva2VuaXplKGUsdCxuLCEwKSxlLnBhcmVudFR5cGU9aSxlLmJsa0luZGVudC09NCxlLnRTaGlmdFt0XT1hLGUuYk1hcmtzW3RdPW8sZS50b2tlbnMucHVzaCh7dHlwZToiZm9vdG5vdGVfcmVmZXJlbmNlX2Nsb3NlIixsZXZlbDotLWUubGV2ZWx9KSksITApKX0sWyJwYXJhZ3JhcGgiXV0sWyJoZWFkaW5nIixmdW5jdGlvbihlLHQsbixyKXt2YXIgbyxhLGkscz1lLmJNYXJrc1t0XStlLnRTaGlmdFt0XSx1PWUuZU1hcmtzW3RdO2lmKHM+PXUpcmV0dXJuITE7aWYoMzUhPT0obz1lLnNyYy5jaGFyQ29kZUF0KHMpKXx8cz49dSlyZXR1cm4hMTtmb3IoYT0xLG89ZS5zcmMuY2hhckNvZGVBdCgrK3MpOzM1PT09byYmczx1JiZhPD02OylhKyssbz1lLnNyYy5jaGFyQ29kZUF0KCsrcyk7cmV0dXJuIShhPjZ8fHM8dSYmMzIhPT1vKSYmKHJ8fCh1PWUuc2tpcENoYXJzQmFjayh1LDMyLHMpLChpPWUuc2tpcENoYXJzQmFjayh1LDM1LHMpKT5zJiYzMj09PWUuc3JjLmNoYXJDb2RlQXQoaS0xKSYmKHU9aSksZS5saW5lPXQrMSxlLnRva2Vucy5wdXNoKHt0eXBlOiJoZWFkaW5nX29wZW4iLGhMZXZlbDphLGxpbmVzOlt0LGUubGluZV0sbGV2ZWw6ZS5sZXZlbH0pLHM8dSYmZS50b2tlbnMucHVzaCh7dHlwZToiaW5saW5lIixjb250ZW50OmUuc3JjLnNsaWNlKHMsdSkudHJpbSgpLGxldmVsOmUubGV2ZWwrMSxsaW5lczpbdCxlLmxpbmVdLGNoaWxkcmVuOltdfSksZS50b2tlbnMucHVzaCh7dHlwZToiaGVhZGluZ19jbG9zZSIsaExldmVsOmEsbGV2ZWw6ZS5sZXZlbH0pKSwhMCl9LFsicGFyYWdyYXBoIiwiYmxvY2txdW90ZSJdXSxbImxoZWFkaW5nIixmdW5jdGlvbihlLHQsbil7dmFyIHIsbyxhLGk9dCsxO3JldHVybiEoaT49bikmJighKGUudFNoaWZ0W2ldPGUuYmxrSW5kZW50KSYmKCEoZS50U2hpZnRbaV0tZS5ibGtJbmRlbnQ+MykmJighKChvPWUuYk1hcmtzW2ldK2UudFNoaWZ0W2ldKT49KGE9ZS5lTWFya3NbaV0pKSYmKCg0NT09PShyPWUuc3JjLmNoYXJDb2RlQXQobykpfHw2MT09PXIpJiYobz1lLnNraXBDaGFycyhvLHIpLCEoKG89ZS5za2lwU3BhY2VzKG8pKTxhKSYmKG89ZS5iTWFya3NbdF0rZS50U2hpZnRbdF0sZS5saW5lPWkrMSxlLnRva2Vucy5wdXNoKHt0eXBlOiJoZWFkaW5nX29wZW4iLGhMZXZlbDo2MT09PXI/MToyLGxpbmVzOlt0LGUubGluZV0sbGV2ZWw6ZS5sZXZlbH0pLGUudG9rZW5zLnB1c2goe3R5cGU6ImlubGluZSIsY29udGVudDplLnNyYy5zbGljZShvLGUuZU1hcmtzW3RdKS50cmltKCksbGV2ZWw6ZS5sZXZlbCsxLGxpbmVzOlt0LGUubGluZS0xXSxjaGlsZHJlbjpbXX0pLGUudG9rZW5zLnB1c2goe3R5cGU6ImhlYWRpbmdfY2xvc2UiLGhMZXZlbDo2MT09PXI/MToyLGxldmVsOmUubGV2ZWx9KSwhMCkpKSkpKX1dLFsiaHRtbGJsb2NrIixmdW5jdGlvbihlLHQsbixyKXt2YXIgbyxhLGkscz1lLmJNYXJrc1t0XSx1PWUuZU1hcmtzW3RdLGM9ZS50U2hpZnRbdF07aWYocys9YywhZS5vcHRpb25zLmh0bWwpcmV0dXJuITE7aWYoYz4zfHxzKzI+PXUpcmV0dXJuITE7aWYoNjAhPT1lLnNyYy5jaGFyQ29kZUF0KHMpKXJldHVybiExO2lmKDMzPT09KG89ZS5zcmMuY2hhckNvZGVBdChzKzEpKXx8NjM9PT1vKXtpZihyKXJldHVybiEwfWVsc2V7aWYoNDchPT1vJiYhZnVuY3Rpb24oZSl7dmFyIHQ9MzJ8ZTtyZXR1cm4gdD49OTcmJnQ8PTEyMn0obykpcmV0dXJuITE7aWYoNDc9PT1vKXtpZighKGE9ZS5zcmMuc2xpY2Uocyx1KS5tYXRjaChaKSkpcmV0dXJuITF9ZWxzZSBpZighKGE9ZS5zcmMuc2xpY2Uocyx1KS5tYXRjaChHKSkpcmV0dXJuITE7aWYoITAhPT1ZW2FbMV0udG9Mb3dlckNhc2UoKV0pcmV0dXJuITE7aWYocilyZXR1cm4hMH1mb3IoaT10KzE7aTxlLmxpbmVNYXgmJiFlLmlzRW1wdHkoaSk7KWkrKztyZXR1cm4gZS5saW5lPWksZS50b2tlbnMucHVzaCh7dHlwZToiaHRtbGJsb2NrIixsZXZlbDplLmxldmVsLGxpbmVzOlt0LGUubGluZV0sY29udGVudDplLmdldExpbmVzKHQsaSwwLCEwKX0pLCEwfSxbInBhcmFncmFwaCIsImJsb2NrcXVvdGUiXV0sWyJ0YWJsZSIsZnVuY3Rpb24oZSx0LG4scil7dmFyIG8sYSxpLHMsdSxjLGwscCxmLGgsZDtpZih0KzI+bilyZXR1cm4hMTtpZih1PXQrMSxlLnRTaGlmdFt1XTxlLmJsa0luZGVudClyZXR1cm4hMTtpZigoaT1lLmJNYXJrc1t1XStlLnRTaGlmdFt1XSk+PWUuZU1hcmtzW3VdKXJldHVybiExO2lmKDEyNCE9PShvPWUuc3JjLmNoYXJDb2RlQXQoaSkpJiY0NSE9PW8mJjU4IT09bylyZXR1cm4hMTtpZihhPVgoZSx0KzEpLCEvXlstOnwgXSskLy50ZXN0KGEpKXJldHVybiExO2lmKChjPWEuc3BsaXQoInwiKSk8PTIpcmV0dXJuITE7Zm9yKHA9W10scz0wO3M8Yy5sZW5ndGg7cysrKXtpZighKGY9Y1tzXS50cmltKCkpKXtpZigwPT09c3x8cz09PWMubGVuZ3RoLTEpY29udGludWU7cmV0dXJuITF9aWYoIS9eOj8tKzo/JC8udGVzdChmKSlyZXR1cm4hMTs1OD09PWYuY2hhckNvZGVBdChmLmxlbmd0aC0xKT9wLnB1c2goNTg9PT1mLmNoYXJDb2RlQXQoMCk/ImNlbnRlciI6InJpZ2h0Iik6NTg9PT1mLmNoYXJDb2RlQXQoMCk/cC5wdXNoKCJsZWZ0Iik6cC5wdXNoKCIiKX1pZigtMT09PShhPVgoZSx0KS50cmltKCkpLmluZGV4T2YoInwiKSlyZXR1cm4hMTtpZihjPWEucmVwbGFjZSgvXlx8fFx8JC9nLCIiKS5zcGxpdCgifCIpLHAubGVuZ3RoIT09Yy5sZW5ndGgpcmV0dXJuITE7aWYocilyZXR1cm4hMDtmb3IoZS50b2tlbnMucHVzaCh7dHlwZToidGFibGVfb3BlbiIsbGluZXM6aD1bdCwwXSxsZXZlbDplLmxldmVsKyt9KSxlLnRva2Vucy5wdXNoKHt0eXBlOiJ0aGVhZF9vcGVuIixsaW5lczpbdCx0KzFdLGxldmVsOmUubGV2ZWwrK30pLGUudG9rZW5zLnB1c2goe3R5cGU6InRyX29wZW4iLGxpbmVzOlt0LHQrMV0sbGV2ZWw6ZS5sZXZlbCsrfSkscz0wO3M8Yy5sZW5ndGg7cysrKWUudG9rZW5zLnB1c2goe3R5cGU6InRoX29wZW4iLGFsaWduOnBbc10sbGluZXM6W3QsdCsxXSxsZXZlbDplLmxldmVsKyt9KSxlLnRva2Vucy5wdXNoKHt0eXBlOiJpbmxpbmUiLGNvbnRlbnQ6Y1tzXS50cmltKCksbGluZXM6W3QsdCsxXSxsZXZlbDplLmxldmVsLGNoaWxkcmVuOltdfSksZS50b2tlbnMucHVzaCh7dHlwZToidGhfY2xvc2UiLGxldmVsOi0tZS5sZXZlbH0pO2ZvcihlLnRva2Vucy5wdXNoKHt0eXBlOiJ0cl9jbG9zZSIsbGV2ZWw6LS1lLmxldmVsfSksZS50b2tlbnMucHVzaCh7dHlwZToidGhlYWRfY2xvc2UiLGxldmVsOi0tZS5sZXZlbH0pLGUudG9rZW5zLnB1c2goe3R5cGU6InRib2R5X29wZW4iLGxpbmVzOmQ9W3QrMiwwXSxsZXZlbDplLmxldmVsKyt9KSx1PXQrMjt1PG4mJiEoZS50U2hpZnRbdV08ZS5ibGtJbmRlbnQpJiYtMSE9PShhPVgoZSx1KS50cmltKCkpLmluZGV4T2YoInwiKTt1Kyspe2ZvcihjPWEucmVwbGFjZSgvXlx8fFx8JC9nLCIiKS5zcGxpdCgifCIpLGUudG9rZW5zLnB1c2goe3R5cGU6InRyX29wZW4iLGxldmVsOmUubGV2ZWwrK30pLHM9MDtzPGMubGVuZ3RoO3MrKyllLnRva2Vucy5wdXNoKHt0eXBlOiJ0ZF9vcGVuIixhbGlnbjpwW3NdLGxldmVsOmUubGV2ZWwrK30pLGw9Y1tzXS5zdWJzdHJpbmcoMTI0PT09Y1tzXS5jaGFyQ29kZUF0KDApPzE6MCwxMjQ9PT1jW3NdLmNoYXJDb2RlQXQoY1tzXS5sZW5ndGgtMSk/Y1tzXS5sZW5ndGgtMTpjW3NdLmxlbmd0aCkudHJpbSgpLGUudG9rZW5zLnB1c2goe3R5cGU6ImlubGluZSIsY29udGVudDpsLGxldmVsOmUubGV2ZWwsY2hpbGRyZW46W119KSxlLnRva2Vucy5wdXNoKHt0eXBlOiJ0ZF9jbG9zZSIsbGV2ZWw6LS1lLmxldmVsfSk7ZS50b2tlbnMucHVzaCh7dHlwZToidHJfY2xvc2UiLGxldmVsOi0tZS5sZXZlbH0pfXJldHVybiBlLnRva2Vucy5wdXNoKHt0eXBlOiJ0Ym9keV9jbG9zZSIsbGV2ZWw6LS1lLmxldmVsfSksZS50b2tlbnMucHVzaCh7dHlwZToidGFibGVfY2xvc2UiLGxldmVsOi0tZS5sZXZlbH0pLGhbMV09ZFsxXT11LGUubGluZT11LCEwfSxbInBhcmFncmFwaCJdXSxbImRlZmxpc3QiLGZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvLGEsaSxzLHUsYyxsLHAsZixoLGQsbSx2LGc7aWYocilyZXR1cm4hKGUuZGRJbmRlbnQ8MCkmJlEoZSx0KT49MDtpZihsPXQrMSxlLmlzRW1wdHkobCkmJisrbD5uKXJldHVybiExO2lmKGUudFNoaWZ0W2xdPGUuYmxrSW5kZW50KXJldHVybiExO2lmKChvPVEoZSxsKSk8MClyZXR1cm4hMTtpZihlLmxldmVsPj1lLm9wdGlvbnMubWF4TmVzdGluZylyZXR1cm4hMTtjPWUudG9rZW5zLmxlbmd0aCxlLnRva2Vucy5wdXNoKHt0eXBlOiJkbF9vcGVuIixsaW5lczp1PVt0LDBdLGxldmVsOmUubGV2ZWwrK30pLGk9dCxhPWw7ZTpmb3IoOzspe2ZvcihnPSEwLHY9ITEsZS50b2tlbnMucHVzaCh7dHlwZToiZHRfb3BlbiIsbGluZXM6W2ksaV0sbGV2ZWw6ZS5sZXZlbCsrfSksZS50b2tlbnMucHVzaCh7dHlwZToiaW5saW5lIixjb250ZW50OmUuZ2V0TGluZXMoaSxpKzEsZS5ibGtJbmRlbnQsITEpLnRyaW0oKSxsZXZlbDplLmxldmVsKzEsbGluZXM6W2ksaV0sY2hpbGRyZW46W119KSxlLnRva2Vucy5wdXNoKHt0eXBlOiJkdF9jbG9zZSIsbGV2ZWw6LS1lLmxldmVsfSk7Oyl7aWYoZS50b2tlbnMucHVzaCh7dHlwZToiZGRfb3BlbiIsbGluZXM6cz1bbCwwXSxsZXZlbDplLmxldmVsKyt9KSxtPWUudGlnaHQsZj1lLmRkSW5kZW50LHA9ZS5ibGtJbmRlbnQsZD1lLnRTaGlmdFthXSxoPWUucGFyZW50VHlwZSxlLmJsa0luZGVudD1lLmRkSW5kZW50PWUudFNoaWZ0W2FdKzIsZS50U2hpZnRbYV09by1lLmJNYXJrc1thXSxlLnRpZ2h0PSEwLGUucGFyZW50VHlwZT0iZGVmbGlzdCIsZS5wYXJzZXIudG9rZW5pemUoZSxhLG4sITApLGUudGlnaHQmJiF2fHwoZz0hMSksdj1lLmxpbmUtYT4xJiZlLmlzRW1wdHkoZS5saW5lLTEpLGUudFNoaWZ0W2FdPWQsZS50aWdodD1tLGUucGFyZW50VHlwZT1oLGUuYmxrSW5kZW50PXAsZS5kZEluZGVudD1mLGUudG9rZW5zLnB1c2goe3R5cGU6ImRkX2Nsb3NlIixsZXZlbDotLWUubGV2ZWx9KSxzWzFdPWw9ZS5saW5lLGw+PW4pYnJlYWsgZTtpZihlLnRTaGlmdFtsXTxlLmJsa0luZGVudClicmVhayBlO2lmKChvPVEoZSxsKSk8MClicmVhazthPWx9aWYobD49bilicmVhaztpZihpPWwsZS5pc0VtcHR5KGkpKWJyZWFrO2lmKGUudFNoaWZ0W2ldPGUuYmxrSW5kZW50KWJyZWFrO2lmKChhPWkrMSk+PW4pYnJlYWs7aWYoZS5pc0VtcHR5KGEpJiZhKyssYT49bilicmVhaztpZihlLnRTaGlmdFthXTxlLmJsa0luZGVudClicmVhaztpZigobz1RKGUsYSkpPDApYnJlYWt9cmV0dXJuIGUudG9rZW5zLnB1c2goe3R5cGU6ImRsX2Nsb3NlIixsZXZlbDotLWUubGV2ZWx9KSx1WzFdPWwsZS5saW5lPWwsZyYmZnVuY3Rpb24oZSx0KXt2YXIgbixyLG89ZS5sZXZlbCsyO2ZvcihuPXQrMixyPWUudG9rZW5zLmxlbmd0aC0yO248cjtuKyspZS50b2tlbnNbbl0ubGV2ZWw9PT1vJiYicGFyYWdyYXBoX29wZW4iPT09ZS50b2tlbnNbbl0udHlwZSYmKGUudG9rZW5zW24rMl0udGlnaHQ9ITAsZS50b2tlbnNbbl0udGlnaHQ9ITAsbis9Mil9KGUsYyksITB9LFsicGFyYWdyYXBoIl1dLFsicGFyYWdyYXBoIixmdW5jdGlvbihlLHQpe3ZhciBuLHIsbyxhLGkscyx1PXQrMTtpZih1PChuPWUubGluZU1heCkmJiFlLmlzRW1wdHkodSkpZm9yKHM9ZS5wYXJzZXIucnVsZXIuZ2V0UnVsZXMoInBhcmFncmFwaCIpO3U8biYmIWUuaXNFbXB0eSh1KTt1KyspaWYoIShlLnRTaGlmdFt1XS1lLmJsa0luZGVudD4zKSl7Zm9yKG89ITEsYT0wLGk9cy5sZW5ndGg7YTxpO2ErKylpZihzW2FdKGUsdSxuLCEwKSl7bz0hMDticmVha31pZihvKWJyZWFrfXJldHVybiByPWUuZ2V0TGluZXModCx1LGUuYmxrSW5kZW50LCExKS50cmltKCksZS5saW5lPXUsci5sZW5ndGgmJihlLnRva2Vucy5wdXNoKHt0eXBlOiJwYXJhZ3JhcGhfb3BlbiIsdGlnaHQ6ITEsbGluZXM6W3QsZS5saW5lXSxsZXZlbDplLmxldmVsfSksZS50b2tlbnMucHVzaCh7dHlwZToiaW5saW5lIixjb250ZW50OnIsbGV2ZWw6ZS5sZXZlbCsxLGxpbmVzOlt0LGUubGluZV0sY2hpbGRyZW46W119KSxlLnRva2Vucy5wdXNoKHt0eXBlOiJwYXJhZ3JhcGhfY2xvc2UiLHRpZ2h0OiExLGxldmVsOmUubGV2ZWx9KSksITB9XV07ZnVuY3Rpb24gdGUoKXt0aGlzLnJ1bGVyPW5ldyBDO2Zvcih2YXIgZT0wO2U8ZWUubGVuZ3RoO2UrKyl0aGlzLnJ1bGVyLnB1c2goZWVbZV1bMF0sZWVbZV1bMV0se2FsdDooZWVbZV1bMl18fFtdKS5zbGljZSgpfSl9dGUucHJvdG90eXBlLnRva2VuaXplPWZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHIsbz10aGlzLnJ1bGVyLmdldFJ1bGVzKCIiKSxhPW8ubGVuZ3RoLGk9dCxzPSExO2k8biYmKGUubGluZT1pPWUuc2tpcEVtcHR5TGluZXMoaSksIShpPj1uKSkmJiEoZS50U2hpZnRbaV08ZS5ibGtJbmRlbnQpOyl7Zm9yKHI9MDtyPGEmJiFvW3JdKGUsaSxuLCExKTtyKyspO2lmKGUudGlnaHQ9IXMsZS5pc0VtcHR5KGUubGluZS0xKSYmKHM9ITApLChpPWUubGluZSk8biYmZS5pc0VtcHR5KGkpKXtpZihzPSEwLCsraTxuJiYibGlzdCI9PT1lLnBhcmVudFR5cGUmJmUuaXNFbXB0eShpKSlicmVhaztlLmxpbmU9aX19fTt2YXIgbmU9L1tcblx0XS9nLHJlPS9ccltcblx1MDA4NV18W1x1MjQyNFx1MjAyOFx1MDA4NV0vZyxvZT0vXHUwMGEwL2c7ZnVuY3Rpb24gYWUoZSl7c3dpdGNoKGUpe2Nhc2UgMTA6Y2FzZSA5MjpjYXNlIDk2OmNhc2UgNDI6Y2FzZSA5NTpjYXNlIDk0OmNhc2UgOTE6Y2FzZSA5MzpjYXNlIDMzOmNhc2UgMzg6Y2FzZSA2MDpjYXNlIDYyOmNhc2UgMTIzOmNhc2UgMTI1OmNhc2UgMzY6Y2FzZSAzNzpjYXNlIDY0OmNhc2UgMTI2OmNhc2UgNDM6Y2FzZSA2MTpjYXNlIDU4OnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fXRlLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihlLHQsbixyKXt2YXIgbyxhPTAsaT0wO2lmKCFlKXJldHVybltdOyhlPShlPWUucmVwbGFjZShvZSwiICIpKS5yZXBsYWNlKHJlLCJcbiIpKS5pbmRleE9mKCJcdCIpPj0wJiYoZT1lLnJlcGxhY2UobmUsKGZ1bmN0aW9uKHQsbil7dmFyIHI7cmV0dXJuIDEwPT09ZS5jaGFyQ29kZUF0KG4pPyhhPW4rMSxpPTAsdCk6KHI9IiAgICAiLnNsaWNlKChuLWEtaSklNCksaT1uLWErMSxyKX0pKSksbz1uZXcgJChlLHRoaXMsdCxuLHIpLHRoaXMudG9rZW5pemUobyxvLmxpbmUsby5saW5lTWF4KX07Zm9yKHZhciBpZT1bXSxzZT0wO3NlPDI1NjtzZSsrKWllLnB1c2goMCk7ZnVuY3Rpb24gdWUoZSl7cmV0dXJuIGU+PTQ4JiZlPD01N3x8ZT49NjUmJmU8PTkwfHxlPj05NyYmZTw9MTIyfWZ1bmN0aW9uIGNlKGUsdCl7dmFyIG4scixvLGE9dCxpPSEwLHM9ITAsdT1lLnBvc01heCxjPWUuc3JjLmNoYXJDb2RlQXQodCk7Zm9yKG49dD4wP2Uuc3JjLmNoYXJDb2RlQXQodC0xKTotMTthPHUmJmUuc3JjLmNoYXJDb2RlQXQoYSk9PT1jOylhKys7cmV0dXJuIGE+PXUmJihpPSExKSwobz1hLXQpPj00P2k9cz0hMTooMzIhPT0ocj1hPHU/ZS5zcmMuY2hhckNvZGVBdChhKTotMSkmJjEwIT09cnx8KGk9ITEpLDMyIT09biYmMTAhPT1ufHwocz0hMSksOTU9PT1jJiYodWUobikmJihpPSExKSx1ZShyKSYmKHM9ITEpKSkse2Nhbl9vcGVuOmksY2FuX2Nsb3NlOnMsZGVsaW1zOm99fSJcXCFcIiMkJSYnKCkqKywuLzo7PD0+P0BbXV5fYHt8fX4tIi5zcGxpdCgiIikuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWVbZS5jaGFyQ29kZUF0KDApXT0xfSkpO3ZhciBsZT0vXFwoWyBcXCEiIyQlJicoKSorLC5cLzo7PD0+P0BbXF1eX2B7fH1+LV0pL2c7dmFyIHBlPS9cXChbIFxcISIjJCUmJygpKissLlwvOjs8PT4/QFtcXV5fYHt8fX4tXSkvZzt2YXIgZmU9WyJjb2FwIiwiZG9pIiwiamF2YXNjcmlwdCIsImFhYSIsImFhYXMiLCJhYm91dCIsImFjYXAiLCJjYXAiLCJjaWQiLCJjcmlkIiwiZGF0YSIsImRhdiIsImRpY3QiLCJkbnMiLCJmaWxlIiwiZnRwIiwiZ2VvIiwiZ28iLCJnb3BoZXIiLCJoMzIzIiwiaHR0cCIsImh0dHBzIiwiaWF4IiwiaWNhcCIsImltIiwiaW1hcCIsImluZm8iLCJpcHAiLCJpcmlzIiwiaXJpcy5iZWVwIiwiaXJpcy54cGMiLCJpcmlzLnhwY3MiLCJpcmlzLmx3eiIsImxkYXAiLCJtYWlsdG8iLCJtaWQiLCJtc3JwIiwibXNycHMiLCJtdHFwIiwibXVwZGF0ZSIsIm5ld3MiLCJuZnMiLCJuaSIsIm5paCIsIm5udHAiLCJvcGFxdWVsb2NrdG9rZW4iLCJwb3AiLCJwcmVzIiwicnRzcCIsInNlcnZpY2UiLCJzZXNzaW9uIiwic2h0dHAiLCJzaWV2ZSIsInNpcCIsInNpcHMiLCJzbXMiLCJzbm1wIiwic29hcC5iZWVwIiwic29hcC5iZWVwcyIsInRhZyIsInRlbCIsInRlbG5ldCIsInRmdHAiLCJ0aGlzbWVzc2FnZSIsInRuMzI3MCIsInRpcCIsInR2IiwidXJuIiwidmVtbWkiLCJ3cyIsIndzcyIsInhjb24iLCJ4Y29uLXVzZXJpZCIsInhtbHJwYy5iZWVwIiwieG1scnBjLmJlZXBzIiwieG1wcCIsInozOS41MHIiLCJ6MzkuNTBzIiwiYWRpdW14dHJhIiwiYWZwIiwiYWZzIiwiYWltIiwiYXB0IiwiYXR0YWNobWVudCIsImF3IiwiYmVzaGFyZSIsImJpdGNvaW4iLCJib2xvIiwiY2FsbHRvIiwiY2hyb21lIiwiY2hyb21lLWV4dGVuc2lvbiIsImNvbS1ldmVudGJyaXRlLWF0dGVuZGVlIiwiY29udGVudCIsImN2cyIsImRsbmEtcGxheXNpbmdsZSIsImRsbmEtcGxheWNvbnRhaW5lciIsImR0biIsImR2YiIsImVkMmsiLCJmYWNldGltZSIsImZlZWQiLCJmaW5nZXIiLCJmaXNoIiwiZ2ciLCJnaXQiLCJnaXptb3Byb2plY3QiLCJndGFsayIsImhjcCIsImljb24iLCJpcG4iLCJpcmMiLCJpcmM2IiwiaXJjcyIsIml0bXMiLCJqYXIiLCJqbXMiLCJrZXlwYXJjIiwibGFzdGZtIiwibGRhcHMiLCJtYWduZXQiLCJtYXBzIiwibWFya2V0IiwibWVzc2FnZSIsIm1tcyIsIm1zLWhlbHAiLCJtc25pbSIsIm11bWJsZSIsIm12biIsIm5vdGVzIiwib2lkIiwicGFsbSIsInBhcGFyYXp6aSIsInBsYXRmb3JtIiwicHJveHkiLCJwc3ljIiwicXVlcnkiLCJyZXMiLCJyZXNvdXJjZSIsInJtaSIsInJzeW5jIiwicnRtcCIsInNlY29uZGxpZmUiLCJzZnRwIiwic2duIiwic2t5cGUiLCJzbWIiLCJzb2xkYXQiLCJzcG90aWZ5Iiwic3NoIiwic3RlYW0iLCJzdm4iLCJ0ZWFtc3BlYWsiLCJ0aGluZ3MiLCJ1ZHAiLCJ1bnJlYWwiLCJ1dDIwMDQiLCJ2ZW50cmlsbyIsInZpZXctc291cmNlIiwid2ViY2FsIiwid3RhaSIsInd5Y2l3eWciLCJ4ZmlyZSIsInhyaSIsInltc2dyIl0saGU9L148KFthLXpBLVowLTkuISMkJSYnKitcLz0/Xl9ge3x9fi1dK0BbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykqKT4vLGRlPS9ePChbYS16QS1aLlwtXXsxLDI1fSk6KFtePD5ceDAwLVx4MjBdKik+LztmdW5jdGlvbiBtZShlLHQpe3JldHVybiBlPWUuc291cmNlLHQ9dHx8IiIsZnVuY3Rpb24gbihyLG8pe3JldHVybiByPyhvPW8uc291cmNlfHxvLGU9ZS5yZXBsYWNlKHIsbyksbik6bmV3IFJlZ0V4cChlLHQpfX12YXIgdmU9bWUoLyg/OnVucXVvdGVkfHNpbmdsZV9xdW90ZWR8ZG91YmxlX3F1b3RlZCkvKSgidW5xdW90ZWQiLC9bXiInPTw+YFx4MDAtXHgyMF0rLykoInNpbmdsZV9xdW90ZWQiLC8nW14nXSonLykoImRvdWJsZV9xdW90ZWQiLC8iW14iXSoiLykoKSxnZT1tZSgvKD86XHMrYXR0cl9uYW1lKD86XHMqPVxzKmF0dHJfdmFsdWUpPykvKSgiYXR0cl9uYW1lIiwvW2EtekEtWl86XVthLXpBLVowLTk6Ll8tXSovKSgiYXR0cl92YWx1ZSIsdmUpKCkseWU9bWUoLzxbQS1aYS16XVtBLVphLXowLTldKmF0dHJpYnV0ZSpccypcLz8+LykoImF0dHJpYnV0ZSIsZ2UpKCksYmU9bWUoL14oPzpvcGVuX3RhZ3xjbG9zZV90YWd8Y29tbWVudHxwcm9jZXNzaW5nfGRlY2xhcmF0aW9ufGNkYXRhKS8pKCJvcGVuX3RhZyIseWUpKCJjbG9zZV90YWciLC88XC9bQS1aYS16XVtBLVphLXowLTldKlxzKj4vKSgiY29tbWVudCIsLzwhLS0tLT58PCEtLSg/Oi0/W14+LV0pKD86LT9bXi1dKSotLT4vKSgicHJvY2Vzc2luZyIsLzxbP10uKj9bP10+LykoImRlY2xhcmF0aW9uIiwvPCFbQS1aXStccytbXj5dKj4vKSgiY2RhdGEiLC88IVxbQ0RBVEFcW1tcc1xTXSo/XF1cXT4vKSgpO3ZhciBfZT0vXiYjKCg/OnhbYS1mMC05XXsxLDh9fFswLTldezEsOH0pKTsvaSx3ZT0vXiYoW2Etel1bYS16MC05XXsxLDMxfSk7L2k7dmFyIHhlPVtbInRleHQiLGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPWUucG9zO248ZS5wb3NNYXgmJiFhZShlLnNyYy5jaGFyQ29kZUF0KG4pKTspbisrO3JldHVybiBuIT09ZS5wb3MmJih0fHwoZS5wZW5kaW5nKz1lLnNyYy5zbGljZShlLnBvcyxuKSksZS5wb3M9biwhMCl9XSxbIm5ld2xpbmUiLGZ1bmN0aW9uKGUsdCl7dmFyIG4scixvPWUucG9zO2lmKDEwIT09ZS5zcmMuY2hhckNvZGVBdChvKSlyZXR1cm4hMTtpZihuPWUucGVuZGluZy5sZW5ndGgtMSxyPWUucG9zTWF4LCF0KWlmKG4+PTAmJjMyPT09ZS5wZW5kaW5nLmNoYXJDb2RlQXQobikpaWYobj49MSYmMzI9PT1lLnBlbmRpbmcuY2hhckNvZGVBdChuLTEpKXtmb3IodmFyIGE9bi0yO2E+PTA7YS0tKWlmKDMyIT09ZS5wZW5kaW5nLmNoYXJDb2RlQXQoYSkpe2UucGVuZGluZz1lLnBlbmRpbmcuc3Vic3RyaW5nKDAsYSsxKTticmVha31lLnB1c2goe3R5cGU6ImhhcmRicmVhayIsbGV2ZWw6ZS5sZXZlbH0pfWVsc2UgZS5wZW5kaW5nPWUucGVuZGluZy5zbGljZSgwLC0xKSxlLnB1c2goe3R5cGU6InNvZnRicmVhayIsbGV2ZWw6ZS5sZXZlbH0pO2Vsc2UgZS5wdXNoKHt0eXBlOiJzb2Z0YnJlYWsiLGxldmVsOmUubGV2ZWx9KTtmb3IobysrO288ciYmMzI9PT1lLnNyYy5jaGFyQ29kZUF0KG8pOylvKys7cmV0dXJuIGUucG9zPW8sITB9XSxbImVzY2FwZSIsZnVuY3Rpb24oZSx0KXt2YXIgbixyPWUucG9zLG89ZS5wb3NNYXg7aWYoOTIhPT1lLnNyYy5jaGFyQ29kZUF0KHIpKXJldHVybiExO2lmKCsrcjxvKXtpZigobj1lLnNyYy5jaGFyQ29kZUF0KHIpKTwyNTYmJjAhPT1pZVtuXSlyZXR1cm4gdHx8KGUucGVuZGluZys9ZS5zcmNbcl0pLGUucG9zKz0yLCEwO2lmKDEwPT09bil7Zm9yKHR8fGUucHVzaCh7dHlwZToiaGFyZGJyZWFrIixsZXZlbDplLmxldmVsfSkscisrO3I8byYmMzI9PT1lLnNyYy5jaGFyQ29kZUF0KHIpOylyKys7cmV0dXJuIGUucG9zPXIsITB9fXJldHVybiB0fHwoZS5wZW5kaW5nKz0iXFwiKSxlLnBvcysrLCEwfV0sWyJiYWNrdGlja3MiLGZ1bmN0aW9uKGUsdCl7dmFyIG4scixvLGEsaSxzPWUucG9zO2lmKDk2IT09ZS5zcmMuY2hhckNvZGVBdChzKSlyZXR1cm4hMTtmb3Iobj1zLHMrKyxyPWUucG9zTWF4O3M8ciYmOTY9PT1lLnNyYy5jaGFyQ29kZUF0KHMpOylzKys7Zm9yKG89ZS5zcmMuc2xpY2UobixzKSxhPWk9czstMSE9PShhPWUuc3JjLmluZGV4T2YoImAiLGkpKTspe2ZvcihpPWErMTtpPHImJjk2PT09ZS5zcmMuY2hhckNvZGVBdChpKTspaSsrO2lmKGktYT09PW8ubGVuZ3RoKXJldHVybiB0fHxlLnB1c2goe3R5cGU6ImNvZGUiLGNvbnRlbnQ6ZS5zcmMuc2xpY2UocyxhKS5yZXBsYWNlKC9bIFxuXSsvZywiICIpLnRyaW0oKSxibG9jazohMSxsZXZlbDplLmxldmVsfSksZS5wb3M9aSwhMH1yZXR1cm4gdHx8KGUucGVuZGluZys9byksZS5wb3MrPW8ubGVuZ3RoLCEwfV0sWyJkZWwiLGZ1bmN0aW9uKGUsdCl7dmFyIG4scixvLGEsaSxzPWUucG9zTWF4LHU9ZS5wb3M7aWYoMTI2IT09ZS5zcmMuY2hhckNvZGVBdCh1KSlyZXR1cm4hMTtpZih0KXJldHVybiExO2lmKHUrND49cylyZXR1cm4hMTtpZigxMjYhPT1lLnNyYy5jaGFyQ29kZUF0KHUrMSkpcmV0dXJuITE7aWYoZS5sZXZlbD49ZS5vcHRpb25zLm1heE5lc3RpbmcpcmV0dXJuITE7aWYoYT11PjA/ZS5zcmMuY2hhckNvZGVBdCh1LTEpOi0xLGk9ZS5zcmMuY2hhckNvZGVBdCh1KzIpLDEyNj09PWEpcmV0dXJuITE7aWYoMTI2PT09aSlyZXR1cm4hMTtpZigzMj09PWl8fDEwPT09aSlyZXR1cm4hMTtmb3Iocj11KzI7cjxzJiYxMjY9PT1lLnNyYy5jaGFyQ29kZUF0KHIpOylyKys7aWYocj51KzMpcmV0dXJuIGUucG9zKz1yLXUsdHx8KGUucGVuZGluZys9ZS5zcmMuc2xpY2UodSxyKSksITA7Zm9yKGUucG9zPXUrMixvPTE7ZS5wb3MrMTxzOyl7aWYoMTI2PT09ZS5zcmMuY2hhckNvZGVBdChlLnBvcykmJjEyNj09PWUuc3JjLmNoYXJDb2RlQXQoZS5wb3MrMSkmJihhPWUuc3JjLmNoYXJDb2RlQXQoZS5wb3MtMSksMTI2IT09KGk9ZS5wb3MrMjxzP2Uuc3JjLmNoYXJDb2RlQXQoZS5wb3MrMik6LTEpJiYxMjYhPT1hJiYoMzIhPT1hJiYxMCE9PWE/by0tOjMyIT09aSYmMTAhPT1pJiZvKyssbzw9MCkpKXtuPSEwO2JyZWFrfWUucGFyc2VyLnNraXBUb2tlbihlKX1yZXR1cm4gbj8oZS5wb3NNYXg9ZS5wb3MsZS5wb3M9dSsyLHR8fChlLnB1c2goe3R5cGU6ImRlbF9vcGVuIixsZXZlbDplLmxldmVsKyt9KSxlLnBhcnNlci50b2tlbml6ZShlKSxlLnB1c2goe3R5cGU6ImRlbF9jbG9zZSIsbGV2ZWw6LS1lLmxldmVsfSkpLGUucG9zPWUucG9zTWF4KzIsZS5wb3NNYXg9cywhMCk6KGUucG9zPXUsITEpfV0sWyJpbnMiLGZ1bmN0aW9uKGUsdCl7dmFyIG4scixvLGEsaSxzPWUucG9zTWF4LHU9ZS5wb3M7aWYoNDMhPT1lLnNyYy5jaGFyQ29kZUF0KHUpKXJldHVybiExO2lmKHQpcmV0dXJuITE7aWYodSs0Pj1zKXJldHVybiExO2lmKDQzIT09ZS5zcmMuY2hhckNvZGVBdCh1KzEpKXJldHVybiExO2lmKGUubGV2ZWw+PWUub3B0aW9ucy5tYXhOZXN0aW5nKXJldHVybiExO2lmKGE9dT4wP2Uuc3JjLmNoYXJDb2RlQXQodS0xKTotMSxpPWUuc3JjLmNoYXJDb2RlQXQodSsyKSw0Mz09PWEpcmV0dXJuITE7aWYoNDM9PT1pKXJldHVybiExO2lmKDMyPT09aXx8MTA9PT1pKXJldHVybiExO2ZvcihyPXUrMjtyPHMmJjQzPT09ZS5zcmMuY2hhckNvZGVBdChyKTspcisrO2lmKHIhPT11KzIpcmV0dXJuIGUucG9zKz1yLXUsdHx8KGUucGVuZGluZys9ZS5zcmMuc2xpY2UodSxyKSksITA7Zm9yKGUucG9zPXUrMixvPTE7ZS5wb3MrMTxzOyl7aWYoNDM9PT1lLnNyYy5jaGFyQ29kZUF0KGUucG9zKSYmNDM9PT1lLnNyYy5jaGFyQ29kZUF0KGUucG9zKzEpJiYoYT1lLnNyYy5jaGFyQ29kZUF0KGUucG9zLTEpLDQzIT09KGk9ZS5wb3MrMjxzP2Uuc3JjLmNoYXJDb2RlQXQoZS5wb3MrMik6LTEpJiY0MyE9PWEmJigzMiE9PWEmJjEwIT09YT9vLS06MzIhPT1pJiYxMCE9PWkmJm8rKyxvPD0wKSkpe249ITA7YnJlYWt9ZS5wYXJzZXIuc2tpcFRva2VuKGUpfXJldHVybiBuPyhlLnBvc01heD1lLnBvcyxlLnBvcz11KzIsdHx8KGUucHVzaCh7dHlwZToiaW5zX29wZW4iLGxldmVsOmUubGV2ZWwrK30pLGUucGFyc2VyLnRva2VuaXplKGUpLGUucHVzaCh7dHlwZToiaW5zX2Nsb3NlIixsZXZlbDotLWUubGV2ZWx9KSksZS5wb3M9ZS5wb3NNYXgrMixlLnBvc01heD1zLCEwKTooZS5wb3M9dSwhMSl9XSxbIm1hcmsiLGZ1bmN0aW9uKGUsdCl7dmFyIG4scixvLGEsaSxzPWUucG9zTWF4LHU9ZS5wb3M7aWYoNjEhPT1lLnNyYy5jaGFyQ29kZUF0KHUpKXJldHVybiExO2lmKHQpcmV0dXJuITE7aWYodSs0Pj1zKXJldHVybiExO2lmKDYxIT09ZS5zcmMuY2hhckNvZGVBdCh1KzEpKXJldHVybiExO2lmKGUubGV2ZWw+PWUub3B0aW9ucy5tYXhOZXN0aW5nKXJldHVybiExO2lmKGE9dT4wP2Uuc3JjLmNoYXJDb2RlQXQodS0xKTotMSxpPWUuc3JjLmNoYXJDb2RlQXQodSsyKSw2MT09PWEpcmV0dXJuITE7aWYoNjE9PT1pKXJldHVybiExO2lmKDMyPT09aXx8MTA9PT1pKXJldHVybiExO2ZvcihyPXUrMjtyPHMmJjYxPT09ZS5zcmMuY2hhckNvZGVBdChyKTspcisrO2lmKHIhPT11KzIpcmV0dXJuIGUucG9zKz1yLXUsdHx8KGUucGVuZGluZys9ZS5zcmMuc2xpY2UodSxyKSksITA7Zm9yKGUucG9zPXUrMixvPTE7ZS5wb3MrMTxzOyl7aWYoNjE9PT1lLnNyYy5jaGFyQ29kZUF0KGUucG9zKSYmNjE9PT1lLnNyYy5jaGFyQ29kZUF0KGUucG9zKzEpJiYoYT1lLnNyYy5jaGFyQ29kZUF0KGUucG9zLTEpLDYxIT09KGk9ZS5wb3MrMjxzP2Uuc3JjLmNoYXJDb2RlQXQoZS5wb3MrMik6LTEpJiY2MSE9PWEmJigzMiE9PWEmJjEwIT09YT9vLS06MzIhPT1pJiYxMCE9PWkmJm8rKyxvPD0wKSkpe249ITA7YnJlYWt9ZS5wYXJzZXIuc2tpcFRva2VuKGUpfXJldHVybiBuPyhlLnBvc01heD1lLnBvcyxlLnBvcz11KzIsdHx8KGUucHVzaCh7dHlwZToibWFya19vcGVuIixsZXZlbDplLmxldmVsKyt9KSxlLnBhcnNlci50b2tlbml6ZShlKSxlLnB1c2goe3R5cGU6Im1hcmtfY2xvc2UiLGxldmVsOi0tZS5sZXZlbH0pKSxlLnBvcz1lLnBvc01heCsyLGUucG9zTWF4PXMsITApOihlLnBvcz11LCExKX1dLFsiZW1waGFzaXMiLGZ1bmN0aW9uKGUsdCl7dmFyIG4scixvLGEsaSxzLHUsYz1lLnBvc01heCxsPWUucG9zLHA9ZS5zcmMuY2hhckNvZGVBdChsKTtpZig5NSE9PXAmJjQyIT09cClyZXR1cm4hMTtpZih0KXJldHVybiExO2lmKG49KHU9Y2UoZSxsKSkuZGVsaW1zLCF1LmNhbl9vcGVuKXJldHVybiBlLnBvcys9bix0fHwoZS5wZW5kaW5nKz1lLnNyYy5zbGljZShsLGUucG9zKSksITA7aWYoZS5sZXZlbD49ZS5vcHRpb25zLm1heE5lc3RpbmcpcmV0dXJuITE7Zm9yKGUucG9zPWwrbixzPVtuXTtlLnBvczxjOylpZihlLnNyYy5jaGFyQ29kZUF0KGUucG9zKSE9PXApZS5wYXJzZXIuc2tpcFRva2VuKGUpO2Vsc2V7aWYocj0odT1jZShlLGUucG9zKSkuZGVsaW1zLHUuY2FuX2Nsb3NlKXtmb3IoYT1zLnBvcCgpLGk9cjthIT09aTspe2lmKGk8YSl7cy5wdXNoKGEtaSk7YnJlYWt9aWYoaS09YSwwPT09cy5sZW5ndGgpYnJlYWs7ZS5wb3MrPWEsYT1zLnBvcCgpfWlmKDA9PT1zLmxlbmd0aCl7bj1hLG89ITA7YnJlYWt9ZS5wb3MrPXI7Y29udGludWV9dS5jYW5fb3BlbiYmcy5wdXNoKHIpLGUucG9zKz1yfXJldHVybiBvPyhlLnBvc01heD1lLnBvcyxlLnBvcz1sK24sdHx8KDIhPT1uJiYzIT09bnx8ZS5wdXNoKHt0eXBlOiJzdHJvbmdfb3BlbiIsbGV2ZWw6ZS5sZXZlbCsrfSksMSE9PW4mJjMhPT1ufHxlLnB1c2goe3R5cGU6ImVtX29wZW4iLGxldmVsOmUubGV2ZWwrK30pLGUucGFyc2VyLnRva2VuaXplKGUpLDEhPT1uJiYzIT09bnx8ZS5wdXNoKHt0eXBlOiJlbV9jbG9zZSIsbGV2ZWw6LS1lLmxldmVsfSksMiE9PW4mJjMhPT1ufHxlLnB1c2goe3R5cGU6InN0cm9uZ19jbG9zZSIsbGV2ZWw6LS1lLmxldmVsfSkpLGUucG9zPWUucG9zTWF4K24sZS5wb3NNYXg9YywhMCk6KGUucG9zPWwsITEpfV0sWyJzdWIiLGZ1bmN0aW9uKGUsdCl7dmFyIG4scixvPWUucG9zTWF4LGE9ZS5wb3M7aWYoMTI2IT09ZS5zcmMuY2hhckNvZGVBdChhKSlyZXR1cm4hMTtpZih0KXJldHVybiExO2lmKGErMj49bylyZXR1cm4hMTtpZihlLmxldmVsPj1lLm9wdGlvbnMubWF4TmVzdGluZylyZXR1cm4hMTtmb3IoZS5wb3M9YSsxO2UucG9zPG87KXtpZigxMjY9PT1lLnNyYy5jaGFyQ29kZUF0KGUucG9zKSl7bj0hMDticmVha31lLnBhcnNlci5za2lwVG9rZW4oZSl9cmV0dXJuIG4mJmErMSE9PWUucG9zPyhyPWUuc3JjLnNsaWNlKGErMSxlLnBvcykpLm1hdGNoKC8oXnxbXlxcXSkoXFxcXCkqXHMvKT8oZS5wb3M9YSwhMSk6KGUucG9zTWF4PWUucG9zLGUucG9zPWErMSx0fHxlLnB1c2goe3R5cGU6InN1YiIsbGV2ZWw6ZS5sZXZlbCxjb250ZW50OnIucmVwbGFjZShsZSwiJDEiKX0pLGUucG9zPWUucG9zTWF4KzEsZS5wb3NNYXg9bywhMCk6KGUucG9zPWEsITEpfV0sWyJzdXAiLGZ1bmN0aW9uKGUsdCl7dmFyIG4scixvPWUucG9zTWF4LGE9ZS5wb3M7aWYoOTQhPT1lLnNyYy5jaGFyQ29kZUF0KGEpKXJldHVybiExO2lmKHQpcmV0dXJuITE7aWYoYSsyPj1vKXJldHVybiExO2lmKGUubGV2ZWw+PWUub3B0aW9ucy5tYXhOZXN0aW5nKXJldHVybiExO2ZvcihlLnBvcz1hKzE7ZS5wb3M8bzspe2lmKDk0PT09ZS5zcmMuY2hhckNvZGVBdChlLnBvcykpe249ITA7YnJlYWt9ZS5wYXJzZXIuc2tpcFRva2VuKGUpfXJldHVybiBuJiZhKzEhPT1lLnBvcz8ocj1lLnNyYy5zbGljZShhKzEsZS5wb3MpKS5tYXRjaCgvKF58W15cXF0pKFxcXFwpKlxzLyk/KGUucG9zPWEsITEpOihlLnBvc01heD1lLnBvcyxlLnBvcz1hKzEsdHx8ZS5wdXNoKHt0eXBlOiJzdXAiLGxldmVsOmUubGV2ZWwsY29udGVudDpyLnJlcGxhY2UocGUsIiQxIil9KSxlLnBvcz1lLnBvc01heCsxLGUucG9zTWF4PW8sITApOihlLnBvcz1hLCExKX1dLFsibGlua3MiLGZ1bmN0aW9uKGUsdCl7dmFyIG4scixvLGEsaSxzLHUsYyxsPSExLHA9ZS5wb3MsZj1lLnBvc01heCxoPWUucG9zLGQ9ZS5zcmMuY2hhckNvZGVBdChoKTtpZigzMz09PWQmJihsPSEwLGQ9ZS5zcmMuY2hhckNvZGVBdCgrK2gpKSw5MSE9PWQpcmV0dXJuITE7aWYoZS5sZXZlbD49ZS5vcHRpb25zLm1heE5lc3RpbmcpcmV0dXJuITE7aWYobj1oKzEsKHI9TyhlLGgpKTwwKXJldHVybiExO2lmKChzPXIrMSk8ZiYmNDA9PT1lLnNyYy5jaGFyQ29kZUF0KHMpKXtmb3IocysrO3M8ZiYmKDMyPT09KGM9ZS5zcmMuY2hhckNvZGVBdChzKSl8fDEwPT09Yyk7cysrKTtpZihzPj1mKXJldHVybiExO2ZvcihoPXMsVChlLHMpPyhhPWUubGlua0NvbnRlbnQscz1lLnBvcyk6YT0iIixoPXM7czxmJiYoMzI9PT0oYz1lLnNyYy5jaGFyQ29kZUF0KHMpKXx8MTA9PT1jKTtzKyspO2lmKHM8ZiYmaCE9PXMmJkkoZSxzKSlmb3IoaT1lLmxpbmtDb250ZW50LHM9ZS5wb3M7czxmJiYoMzI9PT0oYz1lLnNyYy5jaGFyQ29kZUF0KHMpKXx8MTA9PT1jKTtzKyspO2Vsc2UgaT0iIjtpZihzPj1mfHw0MSE9PWUuc3JjLmNoYXJDb2RlQXQocykpcmV0dXJuIGUucG9zPXAsITE7cysrfWVsc2V7aWYoZS5saW5rTGV2ZWw+MClyZXR1cm4hMTtmb3IoO3M8ZiYmKDMyPT09KGM9ZS5zcmMuY2hhckNvZGVBdChzKSl8fDEwPT09Yyk7cysrKTtpZihzPGYmJjkxPT09ZS5zcmMuY2hhckNvZGVBdChzKSYmKGg9cysxLChzPU8oZSxzKSk+PTA/bz1lLnNyYy5zbGljZShoLHMrKyk6cz1oLTEpLG98fCh2b2lkIDA9PT1vJiYocz1yKzEpLG89ZS5zcmMuc2xpY2UobixyKSksISh1PWUuZW52LnJlZmVyZW5jZXNbUChvKV0pKXJldHVybiBlLnBvcz1wLCExO2E9dS5ocmVmLGk9dS50aXRsZX1yZXR1cm4gdHx8KGUucG9zPW4sZS5wb3NNYXg9cixsP2UucHVzaCh7dHlwZToiaW1hZ2UiLHNyYzphLHRpdGxlOmksYWx0OmUuc3JjLnN1YnN0cihuLHItbiksbGV2ZWw6ZS5sZXZlbH0pOihlLnB1c2goe3R5cGU6Imxpbmtfb3BlbiIsaHJlZjphLHRpdGxlOmksbGV2ZWw6ZS5sZXZlbCsrfSksZS5saW5rTGV2ZWwrKyxlLnBhcnNlci50b2tlbml6ZShlKSxlLmxpbmtMZXZlbC0tLGUucHVzaCh7dHlwZToibGlua19jbG9zZSIsbGV2ZWw6LS1lLmxldmVsfSkpKSxlLnBvcz1zLGUucG9zTWF4PWYsITB9XSxbImZvb3Rub3RlX2lubGluZSIsZnVuY3Rpb24oZSx0KXt2YXIgbixyLG8sYSxpPWUucG9zTWF4LHM9ZS5wb3M7cmV0dXJuIShzKzI+PWkpJiYoOTQ9PT1lLnNyYy5jaGFyQ29kZUF0KHMpJiYoOTE9PT1lLnNyYy5jaGFyQ29kZUF0KHMrMSkmJighKGUubGV2ZWw+PWUub3B0aW9ucy5tYXhOZXN0aW5nKSYmKG49cysyLCEoKHI9TyhlLHMrMSkpPDApJiYodHx8KGUuZW52LmZvb3Rub3Rlc3x8KGUuZW52LmZvb3Rub3Rlcz17fSksZS5lbnYuZm9vdG5vdGVzLmxpc3R8fChlLmVudi5mb290bm90ZXMubGlzdD1bXSksbz1lLmVudi5mb290bm90ZXMubGlzdC5sZW5ndGgsZS5wb3M9bixlLnBvc01heD1yLGUucHVzaCh7dHlwZToiZm9vdG5vdGVfcmVmIixpZDpvLGxldmVsOmUubGV2ZWx9KSxlLmxpbmtMZXZlbCsrLGE9ZS50b2tlbnMubGVuZ3RoLGUucGFyc2VyLnRva2VuaXplKGUpLGUuZW52LmZvb3Rub3Rlcy5saXN0W29dPXt0b2tlbnM6ZS50b2tlbnMuc3BsaWNlKGEpfSxlLmxpbmtMZXZlbC0tKSxlLnBvcz1yKzEsZS5wb3NNYXg9aSwhMCkpKSkpfV0sWyJmb290bm90ZV9yZWYiLGZ1bmN0aW9uKGUsdCl7dmFyIG4scixvLGEsaT1lLnBvc01heCxzPWUucG9zO2lmKHMrMz5pKXJldHVybiExO2lmKCFlLmVudi5mb290bm90ZXN8fCFlLmVudi5mb290bm90ZXMucmVmcylyZXR1cm4hMTtpZig5MSE9PWUuc3JjLmNoYXJDb2RlQXQocykpcmV0dXJuITE7aWYoOTQhPT1lLnNyYy5jaGFyQ29kZUF0KHMrMSkpcmV0dXJuITE7aWYoZS5sZXZlbD49ZS5vcHRpb25zLm1heE5lc3RpbmcpcmV0dXJuITE7Zm9yKHI9cysyO3I8aTtyKyspe2lmKDMyPT09ZS5zcmMuY2hhckNvZGVBdChyKSlyZXR1cm4hMTtpZigxMD09PWUuc3JjLmNoYXJDb2RlQXQocikpcmV0dXJuITE7aWYoOTM9PT1lLnNyYy5jaGFyQ29kZUF0KHIpKWJyZWFrfXJldHVybiByIT09cysyJiYoIShyPj1pKSYmKHIrKyxuPWUuc3JjLnNsaWNlKHMrMixyLTEpLHZvaWQgMCE9PWUuZW52LmZvb3Rub3Rlcy5yZWZzWyI6IituXSYmKHR8fChlLmVudi5mb290bm90ZXMubGlzdHx8KGUuZW52LmZvb3Rub3Rlcy5saXN0PVtdKSxlLmVudi5mb290bm90ZXMucmVmc1siOiIrbl08MD8obz1lLmVudi5mb290bm90ZXMubGlzdC5sZW5ndGgsZS5lbnYuZm9vdG5vdGVzLmxpc3Rbb109e2xhYmVsOm4sY291bnQ6MH0sZS5lbnYuZm9vdG5vdGVzLnJlZnNbIjoiK25dPW8pOm89ZS5lbnYuZm9vdG5vdGVzLnJlZnNbIjoiK25dLGE9ZS5lbnYuZm9vdG5vdGVzLmxpc3Rbb10uY291bnQsZS5lbnYuZm9vdG5vdGVzLmxpc3Rbb10uY291bnQrKyxlLnB1c2goe3R5cGU6ImZvb3Rub3RlX3JlZiIsaWQ6byxzdWJJZDphLGxldmVsOmUubGV2ZWx9KSksZS5wb3M9cixlLnBvc01heD1pLCEwKSkpfV0sWyJhdXRvbGluayIsZnVuY3Rpb24oZSx0KXt2YXIgbixyLG8sYSxpLHM9ZS5wb3M7cmV0dXJuIDYwPT09ZS5zcmMuY2hhckNvZGVBdChzKSYmKCEoKG49ZS5zcmMuc2xpY2UocykpLmluZGV4T2YoIj4iKTwwKSYmKChyPW4ubWF0Y2goZGUpKT8hKGZlLmluZGV4T2YoclsxXS50b0xvd2VyQ2FzZSgpKTwwKSYmKGk9aihhPXJbMF0uc2xpY2UoMSwtMSkpLCEhZS5wYXJzZXIudmFsaWRhdGVMaW5rKGEpJiYodHx8KGUucHVzaCh7dHlwZToibGlua19vcGVuIixocmVmOmksbGV2ZWw6ZS5sZXZlbH0pLGUucHVzaCh7dHlwZToidGV4dCIsY29udGVudDphLGxldmVsOmUubGV2ZWwrMX0pLGUucHVzaCh7dHlwZToibGlua19jbG9zZSIsbGV2ZWw6ZS5sZXZlbH0pKSxlLnBvcys9clswXS5sZW5ndGgsITApKTohIShvPW4ubWF0Y2goaGUpKSYmKGk9aigibWFpbHRvOiIrKGE9b1swXS5zbGljZSgxLC0xKSkpLCEhZS5wYXJzZXIudmFsaWRhdGVMaW5rKGkpJiYodHx8KGUucHVzaCh7dHlwZToibGlua19vcGVuIixocmVmOmksbGV2ZWw6ZS5sZXZlbH0pLGUucHVzaCh7dHlwZToidGV4dCIsY29udGVudDphLGxldmVsOmUubGV2ZWwrMX0pLGUucHVzaCh7dHlwZToibGlua19jbG9zZSIsbGV2ZWw6ZS5sZXZlbH0pKSxlLnBvcys9b1swXS5sZW5ndGgsITApKSkpfV0sWyJodG1sdGFnIixmdW5jdGlvbihlLHQpe3ZhciBuLHIsbyxhPWUucG9zO3JldHVybiEhZS5vcHRpb25zLmh0bWwmJihvPWUucG9zTWF4LCEoNjAhPT1lLnNyYy5jaGFyQ29kZUF0KGEpfHxhKzI+PW8pJiYoISgzMyE9PShuPWUuc3JjLmNoYXJDb2RlQXQoYSsxKSkmJjYzIT09biYmNDchPT1uJiYhZnVuY3Rpb24oZSl7dmFyIHQ9MzJ8ZTtyZXR1cm4gdD49OTcmJnQ8PTEyMn0obikpJiYoISEocj1lLnNyYy5zbGljZShhKS5tYXRjaChiZSkpJiYodHx8ZS5wdXNoKHt0eXBlOiJodG1sdGFnIixjb250ZW50OmUuc3JjLnNsaWNlKGEsYStyWzBdLmxlbmd0aCksbGV2ZWw6ZS5sZXZlbH0pLGUucG9zKz1yWzBdLmxlbmd0aCwhMCkpKSl9XSxbImVudGl0eSIsZnVuY3Rpb24oZSx0KXt2YXIgbixyLGE9ZS5wb3MsaT1lLnBvc01heDtpZigzOCE9PWUuc3JjLmNoYXJDb2RlQXQoYSkpcmV0dXJuITE7aWYoYSsxPGkpaWYoMzU9PT1lLnNyYy5jaGFyQ29kZUF0KGErMSkpe2lmKHI9ZS5zcmMuc2xpY2UoYSkubWF0Y2goX2UpKXJldHVybiB0fHwobj0ieCI9PT1yWzFdWzBdLnRvTG93ZXJDYXNlKCk/cGFyc2VJbnQoclsxXS5zbGljZSgxKSwxNik6cGFyc2VJbnQoclsxXSwxMCksZS5wZW5kaW5nKz1sKG4pP3Aobik6cCg2NTUzMykpLGUucG9zKz1yWzBdLmxlbmd0aCwhMH1lbHNlIGlmKHI9ZS5zcmMuc2xpY2UoYSkubWF0Y2god2UpKXt2YXIgcz1vKHJbMV0pO2lmKHJbMV0hPT1zKXJldHVybiB0fHwoZS5wZW5kaW5nKz1zKSxlLnBvcys9clswXS5sZW5ndGgsITB9cmV0dXJuIHR8fChlLnBlbmRpbmcrPSImIiksZS5wb3MrKywhMH1dXTtmdW5jdGlvbiBFZSgpe3RoaXMucnVsZXI9bmV3IEM7Zm9yKHZhciBlPTA7ZTx4ZS5sZW5ndGg7ZSsrKXRoaXMucnVsZXIucHVzaCh4ZVtlXVswXSx4ZVtlXVsxXSk7dGhpcy52YWxpZGF0ZUxpbms9U2V9ZnVuY3Rpb24gU2UoZSl7dmFyIHQ9ZS50cmltKCkudG9Mb3dlckNhc2UoKTtyZXR1cm4tMT09PSh0PW0odCkpLmluZGV4T2YoIjoiKXx8LTE9PT1bInZic2NyaXB0IiwiamF2YXNjcmlwdCIsImZpbGUiLCJkYXRhIl0uaW5kZXhPZih0LnNwbGl0KCI6IilbMF0pfUVlLnByb3RvdHlwZS5za2lwVG9rZW49ZnVuY3Rpb24oZSl7dmFyIHQsbixyPXRoaXMucnVsZXIuZ2V0UnVsZXMoIiIpLG89ci5sZW5ndGgsYT1lLnBvcztpZigobj1lLmNhY2hlR2V0KGEpKT4wKWUucG9zPW47ZWxzZXtmb3IodD0wO3Q8bzt0KyspaWYoclt0XShlLCEwKSlyZXR1cm4gdm9pZCBlLmNhY2hlU2V0KGEsZS5wb3MpO2UucG9zKyssZS5jYWNoZVNldChhLGUucG9zKX19LEVlLnByb3RvdHlwZS50b2tlbml6ZT1mdW5jdGlvbihlKXtmb3IodmFyIHQsbixyPXRoaXMucnVsZXIuZ2V0UnVsZXMoIiIpLG89ci5sZW5ndGgsYT1lLnBvc01heDtlLnBvczxhOyl7Zm9yKG49MDtuPG8mJiEodD1yW25dKGUsITEpKTtuKyspO2lmKHQpe2lmKGUucG9zPj1hKWJyZWFrfWVsc2UgZS5wZW5kaW5nKz1lLnNyY1tlLnBvcysrXX1lLnBlbmRpbmcmJmUucHVzaFBlbmRpbmcoKX0sRWUucHJvdG90eXBlLnBhcnNlPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPW5ldyBBKGUsdGhpcyx0LG4scik7dGhpcy50b2tlbml6ZShvKX07dmFyIENlPXtkZWZhdWx0OntvcHRpb25zOntodG1sOiExLHhodG1sT3V0OiExLGJyZWFrczohMSxsYW5nUHJlZml4OiJsYW5ndWFnZS0iLGxpbmtUYXJnZXQ6IiIsdHlwb2dyYXBoZXI6ITEscXVvdGVzOiLigJzigJ3igJjigJkiLGhpZ2hsaWdodDpudWxsLG1heE5lc3Rpbmc6MjB9LGNvbXBvbmVudHM6e2NvcmU6e3J1bGVzOlsiYmxvY2siLCJpbmxpbmUiLCJyZWZlcmVuY2VzIiwicmVwbGFjZW1lbnRzIiwic21hcnRxdW90ZXMiLCJyZWZlcmVuY2VzIiwiYWJicjIiLCJmb290bm90ZV90YWlsIl19LGJsb2NrOntydWxlczpbImJsb2NrcXVvdGUiLCJjb2RlIiwiZmVuY2VzIiwiZm9vdG5vdGUiLCJoZWFkaW5nIiwiaHIiLCJodG1sYmxvY2siLCJsaGVhZGluZyIsImxpc3QiLCJwYXJhZ3JhcGgiLCJ0YWJsZSJdfSxpbmxpbmU6e3J1bGVzOlsiYXV0b2xpbmsiLCJiYWNrdGlja3MiLCJkZWwiLCJlbXBoYXNpcyIsImVudGl0eSIsImVzY2FwZSIsImZvb3Rub3RlX3JlZiIsImh0bWx0YWciLCJsaW5rcyIsIm5ld2xpbmUiLCJ0ZXh0Il19fX0sZnVsbDp7b3B0aW9uczp7aHRtbDohMSx4aHRtbE91dDohMSxicmVha3M6ITEsbGFuZ1ByZWZpeDoibGFuZ3VhZ2UtIixsaW5rVGFyZ2V0OiIiLHR5cG9ncmFwaGVyOiExLHF1b3Rlczoi4oCc4oCd4oCY4oCZIixoaWdobGlnaHQ6bnVsbCxtYXhOZXN0aW5nOjIwfSxjb21wb25lbnRzOntjb3JlOnt9LGJsb2NrOnt9LGlubGluZTp7fX19LGNvbW1vbm1hcms6e29wdGlvbnM6e2h0bWw6ITAseGh0bWxPdXQ6ITAsYnJlYWtzOiExLGxhbmdQcmVmaXg6Imxhbmd1YWdlLSIsbGlua1RhcmdldDoiIix0eXBvZ3JhcGhlcjohMSxxdW90ZXM6IuKAnOKAneKAmOKAmSIsaGlnaGxpZ2h0Om51bGwsbWF4TmVzdGluZzoyMH0sY29tcG9uZW50czp7Y29yZTp7cnVsZXM6WyJibG9jayIsImlubGluZSIsInJlZmVyZW5jZXMiLCJhYmJyMiJdfSxibG9jazp7cnVsZXM6WyJibG9ja3F1b3RlIiwiY29kZSIsImZlbmNlcyIsImhlYWRpbmciLCJociIsImh0bWxibG9jayIsImxoZWFkaW5nIiwibGlzdCIsInBhcmFncmFwaCJdfSxpbmxpbmU6e3J1bGVzOlsiYXV0b2xpbmsiLCJiYWNrdGlja3MiLCJlbXBoYXNpcyIsImVudGl0eSIsImVzY2FwZSIsImh0bWx0YWciLCJsaW5rcyIsIm5ld2xpbmUiLCJ0ZXh0Il19fX19O2Z1bmN0aW9uIEFlKGUsdCxuKXt0aGlzLnNyYz10LHRoaXMuZW52PW4sdGhpcy5vcHRpb25zPWUub3B0aW9ucyx0aGlzLnRva2Vucz1bXSx0aGlzLmlubGluZU1vZGU9ITEsdGhpcy5pbmxpbmU9ZS5pbmxpbmUsdGhpcy5ibG9jaz1lLmJsb2NrLHRoaXMucmVuZGVyZXI9ZS5yZW5kZXJlcix0aGlzLnR5cG9ncmFwaGVyPWUudHlwb2dyYXBoZXJ9ZnVuY3Rpb24gT2UoZSx0KXsic3RyaW5nIiE9dHlwZW9mIGUmJih0PWUsZT0iZGVmYXVsdCIpLHQmJm51bGwhPXQubGlua2lmeSYmY29uc29sZS53YXJuKCJsaW5raWZ5IG9wdGlvbiBpcyByZW1vdmVkLiBVc2UgbGlua2lmeSBwbHVnaW4gaW5zdGVhZDpcblxuaW1wb3J0IFJlbWFya2FibGUgZnJvbSAncmVtYXJrYWJsZSc7XG5pbXBvcnQgbGlua2lmeSBmcm9tICdyZW1hcmthYmxlL2xpbmtpZnknO1xubmV3IFJlbWFya2FibGUoKS51c2UobGlua2lmeSlcbiIpLHRoaXMuaW5saW5lPW5ldyBFZSx0aGlzLmJsb2NrPW5ldyB0ZSx0aGlzLmNvcmU9bmV3IEgsdGhpcy5yZW5kZXJlcj1uZXcgUyx0aGlzLnJ1bGVyPW5ldyBDLHRoaXMub3B0aW9ucz17fSx0aGlzLmNvbmZpZ3VyZShDZVtlXSksdGhpcy5zZXQodHx8e30pfU9lLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oZSl7cyh0aGlzLm9wdGlvbnMsZSl9LE9lLnByb3RvdHlwZS5jb25maWd1cmU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZighZSl0aHJvdyBuZXcgRXJyb3IoIldyb25nIGByZW1hcmthYmxlYCBwcmVzZXQsIGNoZWNrIG5hbWUvY29udGVudCIpO2Uub3B0aW9ucyYmdC5zZXQoZS5vcHRpb25zKSxlLmNvbXBvbmVudHMmJk9iamVjdC5rZXlzKGUuY29tcG9uZW50cykuZm9yRWFjaCgoZnVuY3Rpb24obil7ZS5jb21wb25lbnRzW25dLnJ1bGVzJiZ0W25dLnJ1bGVyLmVuYWJsZShlLmNvbXBvbmVudHNbbl0ucnVsZXMsITApfSkpfSxPZS5wcm90b3R5cGUudXNlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUodGhpcyx0KSx0aGlzfSxPZS5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgQWUodGhpcyxlLHQpO3JldHVybiB0aGlzLmNvcmUucHJvY2VzcyhuKSxuLnRva2Vuc30sT2UucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihlLHQpe3JldHVybiB0PXR8fHt9LHRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMucGFyc2UoZSx0KSx0aGlzLm9wdGlvbnMsdCl9LE9lLnByb3RvdHlwZS5wYXJzZUlubGluZT1mdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBBZSh0aGlzLGUsdCk7cmV0dXJuIG4uaW5saW5lTW9kZT0hMCx0aGlzLmNvcmUucHJvY2VzcyhuKSxuLnRva2Vuc30sT2UucHJvdG90eXBlLnJlbmRlcklubGluZT1mdW5jdGlvbihlLHQpe3JldHVybiB0PXR8fHt9LHRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMucGFyc2VJbmxpbmUoZSx0KSx0aGlzLm9wdGlvbnMsdCl9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24uZCh0LCJiIiwoZnVuY3Rpb24oKXtyZXR1cm4gdmV9KSk7dmFyIHI9bigwKSxvPW4ubihyKSxhPShuKDExKSxuKDIxOCkpO2Z1bmN0aW9uIGkoZSx0KXtpZihBcnJheS5wcm90b3R5cGUuaW5kZXhPZilyZXR1cm4gZS5pbmRleE9mKHQpO2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKylpZihlW25dPT09dClyZXR1cm4gbjtyZXR1cm4tMX1mdW5jdGlvbiBzKGUsdCl7Zm9yKHZhciBuPWUubGVuZ3RoLTE7bj49MDtuLS0pITA9PT10KGVbbl0pJiZlLnNwbGljZShuLDEpfWZ1bmN0aW9uIHUoZSl7dGhyb3cgbmV3IEVycm9yKCJVbmhhbmRsZWQgY2FzZSBmb3IgdmFsdWU6ICciK2UrIiciKX12YXIgYz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dm9pZCAwPT09ZSYmKGU9e30pLHRoaXMudGFnTmFtZT0iIix0aGlzLmF0dHJzPXt9LHRoaXMuaW5uZXJIVE1MPSIiLHRoaXMud2hpdGVzcGFjZVJlZ2V4PS9ccysvLHRoaXMudGFnTmFtZT1lLnRhZ05hbWV8fCIiLHRoaXMuYXR0cnM9ZS5hdHRyc3x8e30sdGhpcy5pbm5lckhUTUw9ZS5pbm5lckh0bWx8fGUuaW5uZXJIVE1MfHwiIn1yZXR1cm4gZS5wcm90b3R5cGUuc2V0VGFnTmFtZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy50YWdOYW1lPWUsdGhpc30sZS5wcm90b3R5cGUuZ2V0VGFnTmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRhZ05hbWV8fCIifSxlLnByb3RvdHlwZS5zZXRBdHRyPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZ2V0QXR0cnMoKVtlXT10LHRoaXN9LGUucHJvdG90eXBlLmdldEF0dHI9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZ2V0QXR0cnMoKVtlXX0sZS5wcm90b3R5cGUuc2V0QXR0cnM9ZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5hc3NpZ24odGhpcy5nZXRBdHRycygpLGUpLHRoaXN9LGUucHJvdG90eXBlLmdldEF0dHJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXR0cnN8fCh0aGlzLmF0dHJzPXt9KX0sZS5wcm90b3R5cGUuc2V0Q2xhc3M9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuc2V0QXR0cigiY2xhc3MiLGUpfSxlLnByb3RvdHlwZS5hZGRDbGFzcz1mdW5jdGlvbihlKXtmb3IodmFyIHQsbj10aGlzLmdldENsYXNzKCkscj10aGlzLndoaXRlc3BhY2VSZWdleCxvPW4/bi5zcGxpdChyKTpbXSxhPWUuc3BsaXQocik7dD1hLnNoaWZ0KCk7KS0xPT09aShvLHQpJiZvLnB1c2godCk7cmV0dXJuIHRoaXMuZ2V0QXR0cnMoKS5jbGFzcz1vLmpvaW4oIiAiKSx0aGlzfSxlLnByb3RvdHlwZS5yZW1vdmVDbGFzcz1mdW5jdGlvbihlKXtmb3IodmFyIHQsbj10aGlzLmdldENsYXNzKCkscj10aGlzLndoaXRlc3BhY2VSZWdleCxvPW4/bi5zcGxpdChyKTpbXSxhPWUuc3BsaXQocik7by5sZW5ndGgmJih0PWEuc2hpZnQoKSk7KXt2YXIgcz1pKG8sdCk7LTEhPT1zJiZvLnNwbGljZShzLDEpfXJldHVybiB0aGlzLmdldEF0dHJzKCkuY2xhc3M9by5qb2luKCIgIiksdGhpc30sZS5wcm90b3R5cGUuZ2V0Q2xhc3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRBdHRycygpLmNsYXNzfHwiIn0sZS5wcm90b3R5cGUuaGFzQ2xhc3M9ZnVuY3Rpb24oZSl7cmV0dXJuLTEhPT0oIiAiK3RoaXMuZ2V0Q2xhc3MoKSsiICIpLmluZGV4T2YoIiAiK2UrIiAiKX0sZS5wcm90b3R5cGUuc2V0SW5uZXJIVE1MPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmlubmVySFRNTD1lLHRoaXN9LGUucHJvdG90eXBlLnNldElubmVySHRtbD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5zZXRJbm5lckhUTUwoZSl9LGUucHJvdG90eXBlLmdldElubmVySFRNTD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlubmVySFRNTHx8IiJ9LGUucHJvdG90eXBlLmdldElubmVySHRtbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldElubmVySFRNTCgpfSxlLnByb3RvdHlwZS50b0FuY2hvclN0cmluZz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0VGFnTmFtZSgpLHQ9dGhpcy5idWlsZEF0dHJzU3RyKCk7cmV0dXJuWyI8IixlLHQ9dD8iICIrdDoiIiwiPiIsdGhpcy5nZXRJbm5lckh0bWwoKSwiPC8iLGUsIj4iXS5qb2luKCIiKX0sZS5wcm90b3R5cGUuYnVpbGRBdHRyc1N0cj1mdW5jdGlvbigpe2lmKCF0aGlzLmF0dHJzKXJldHVybiIiO3ZhciBlPXRoaXMuZ2V0QXR0cnMoKSx0PVtdO2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJnQucHVzaChuKyc9IicrZVtuXSsnIicpO3JldHVybiB0LmpvaW4oIiAiKX0sZX0oKTt2YXIgbD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dm9pZCAwPT09ZSYmKGU9e30pLHRoaXMubmV3V2luZG93PSExLHRoaXMudHJ1bmNhdGU9e30sdGhpcy5jbGFzc05hbWU9IiIsdGhpcy5uZXdXaW5kb3c9ZS5uZXdXaW5kb3d8fCExLHRoaXMudHJ1bmNhdGU9ZS50cnVuY2F0ZXx8e30sdGhpcy5jbGFzc05hbWU9ZS5jbGFzc05hbWV8fCIifXJldHVybiBlLnByb3RvdHlwZS5idWlsZD1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IGMoe3RhZ05hbWU6ImEiLGF0dHJzOnRoaXMuY3JlYXRlQXR0cnMoZSksaW5uZXJIdG1sOnRoaXMucHJvY2Vzc0FuY2hvclRleHQoZS5nZXRBbmNob3JUZXh0KCkpfSl9LGUucHJvdG90eXBlLmNyZWF0ZUF0dHJzPWZ1bmN0aW9uKGUpe3ZhciB0PXtocmVmOmUuZ2V0QW5jaG9ySHJlZigpfSxuPXRoaXMuY3JlYXRlQ3NzQ2xhc3MoZSk7cmV0dXJuIG4mJih0LmNsYXNzPW4pLHRoaXMubmV3V2luZG93JiYodC50YXJnZXQ9Il9ibGFuayIsdC5yZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiKSx0aGlzLnRydW5jYXRlJiZ0aGlzLnRydW5jYXRlLmxlbmd0aCYmdGhpcy50cnVuY2F0ZS5sZW5ndGg8ZS5nZXRBbmNob3JUZXh0KCkubGVuZ3RoJiYodC50aXRsZT1lLmdldEFuY2hvckhyZWYoKSksdH0sZS5wcm90b3R5cGUuY3JlYXRlQ3NzQ2xhc3M9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5jbGFzc05hbWU7aWYodCl7Zm9yKHZhciBuPVt0XSxyPWUuZ2V0Q3NzQ2xhc3NTdWZmaXhlcygpLG89MCxhPXIubGVuZ3RoO288YTtvKyspbi5wdXNoKHQrIi0iK3Jbb10pO3JldHVybiBuLmpvaW4oIiAiKX1yZXR1cm4iIn0sZS5wcm90b3R5cGUucHJvY2Vzc0FuY2hvclRleHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dGhpcy5kb1RydW5jYXRlKGUpfSxlLnByb3RvdHlwZS5kb1RydW5jYXRlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMudHJ1bmNhdGU7aWYoIXR8fCF0Lmxlbmd0aClyZXR1cm4gZTt2YXIgbj10Lmxlbmd0aCxyPXQubG9jYXRpb247cmV0dXJuInNtYXJ0Ij09PXI/ZnVuY3Rpb24oZSx0LG4pe3ZhciByLG87bnVsbD09bj8obj0iJmhlbGxpcDsiLG89MyxyPTgpOihvPW4ubGVuZ3RoLHI9bi5sZW5ndGgpO3ZhciBhPWZ1bmN0aW9uKGUpe3ZhciB0PSIiO3JldHVybiBlLnNjaGVtZSYmZS5ob3N0JiYodCs9ZS5zY2hlbWUrIjovLyIpLGUuaG9zdCYmKHQrPWUuaG9zdCksZS5wYXRoJiYodCs9Ii8iK2UucGF0aCksZS5xdWVyeSYmKHQrPSI/IitlLnF1ZXJ5KSxlLmZyYWdtZW50JiYodCs9IiMiK2UuZnJhZ21lbnQpLHR9LGk9ZnVuY3Rpb24oZSx0KXt2YXIgcj10LzIsbz1NYXRoLmNlaWwociksYT0tMSpNYXRoLmZsb29yKHIpLGk9IiI7cmV0dXJuIGE8MCYmKGk9ZS5zdWJzdHIoYSkpLGUuc3Vic3RyKDAsbykrbitpfTtpZihlLmxlbmd0aDw9dClyZXR1cm4gZTt2YXIgcz10LW8sdT1mdW5jdGlvbihlKXt2YXIgdD17fSxuPWUscj1uLm1hdGNoKC9eKFthLXpdKyk6XC9cLy9pKTtyZXR1cm4gciYmKHQuc2NoZW1lPXJbMV0sbj1uLnN1YnN0cihyWzBdLmxlbmd0aCkpLChyPW4ubWF0Y2goL14oLio/KSg/PShcP3wjfFwvfCQpKS9pKSkmJih0Lmhvc3Q9clsxXSxuPW4uc3Vic3RyKHJbMF0ubGVuZ3RoKSksKHI9bi5tYXRjaCgvXlwvKC4qPykoPz0oXD98I3wkKSkvaSkpJiYodC5wYXRoPXJbMV0sbj1uLnN1YnN0cihyWzBdLmxlbmd0aCkpLChyPW4ubWF0Y2goL15cPyguKj8pKD89KCN8JCkpL2kpKSYmKHQucXVlcnk9clsxXSxuPW4uc3Vic3RyKHJbMF0ubGVuZ3RoKSksKHI9bi5tYXRjaCgvXiMoLio/KSQvaSkpJiYodC5mcmFnbWVudD1yWzFdKSx0fShlKTtpZih1LnF1ZXJ5KXt2YXIgYz11LnF1ZXJ5Lm1hdGNoKC9eKC4qPykoPz0oXD98XCMpKSguKj8pJC9pKTtjJiYodS5xdWVyeT11LnF1ZXJ5LnN1YnN0cigwLGNbMV0ubGVuZ3RoKSxlPWEodSkpfWlmKGUubGVuZ3RoPD10KXJldHVybiBlO2lmKHUuaG9zdCYmKHUuaG9zdD11Lmhvc3QucmVwbGFjZSgvXnd3d1wuLywiIiksZT1hKHUpKSxlLmxlbmd0aDw9dClyZXR1cm4gZTt2YXIgbD0iIjtpZih1Lmhvc3QmJihsKz11Lmhvc3QpLGwubGVuZ3RoPj1zKXJldHVybiB1Lmhvc3QubGVuZ3RoPT10Pyh1Lmhvc3Quc3Vic3RyKDAsdC1vKStuKS5zdWJzdHIoMCxzK3IpOmkobCxzKS5zdWJzdHIoMCxzK3IpO3ZhciBwPSIiO2lmKHUucGF0aCYmKHArPSIvIit1LnBhdGgpLHUucXVlcnkmJihwKz0iPyIrdS5xdWVyeSkscCl7aWYoKGwrcCkubGVuZ3RoPj1zKXJldHVybihsK3ApLmxlbmd0aD09dD8obCtwKS5zdWJzdHIoMCx0KToobCtpKHAscy1sLmxlbmd0aCkpLnN1YnN0cigwLHMrcik7bCs9cH1pZih1LmZyYWdtZW50KXt2YXIgZj0iIyIrdS5mcmFnbWVudDtpZigobCtmKS5sZW5ndGg+PXMpcmV0dXJuKGwrZikubGVuZ3RoPT10PyhsK2YpLnN1YnN0cigwLHQpOihsK2koZixzLWwubGVuZ3RoKSkuc3Vic3RyKDAscytyKTtsKz1mfWlmKHUuc2NoZW1lJiZ1Lmhvc3Qpe3ZhciBoPXUuc2NoZW1lKyI6Ly8iO2lmKChsK2gpLmxlbmd0aDxzKXJldHVybihoK2wpLnN1YnN0cigwLHQpfWlmKGwubGVuZ3RoPD10KXJldHVybiBsO3ZhciBkPSIiO3JldHVybiBzPjAmJihkPWwuc3Vic3RyKC0xKk1hdGguZmxvb3Iocy8yKSkpLChsLnN1YnN0cigwLE1hdGguY2VpbChzLzIpKStuK2QpLnN1YnN0cigwLHMrcil9KGUsbik6Im1pZGRsZSI9PT1yP2Z1bmN0aW9uKGUsdCxuKXtpZihlLmxlbmd0aDw9dClyZXR1cm4gZTt2YXIgcixvO251bGw9PW4/KG49IiZoZWxsaXA7IixyPTgsbz0zKToocj1uLmxlbmd0aCxvPW4ubGVuZ3RoKTt2YXIgYT10LW8saT0iIjtyZXR1cm4gYT4wJiYoaT1lLnN1YnN0cigtMSpNYXRoLmZsb29yKGEvMikpKSwoZS5zdWJzdHIoMCxNYXRoLmNlaWwoYS8yKSkrbitpKS5zdWJzdHIoMCxhK3IpfShlLG4pOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24oZSx0LG4pe3ZhciByO3JldHVybiBlLmxlbmd0aD50JiYobnVsbD09bj8obj0iJmhlbGxpcDsiLHI9Myk6cj1uLmxlbmd0aCxlPWUuc3Vic3RyaW5nKDAsdC1yKStuKSxlfShlLHQsbil9KGUsbil9LGV9KCkscD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dGhpcy5fX2pzZHVja0R1bW15RG9jUHJvcD1udWxsLHRoaXMubWF0Y2hlZFRleHQ9IiIsdGhpcy5vZmZzZXQ9MCx0aGlzLnRhZ0J1aWxkZXI9ZS50YWdCdWlsZGVyLHRoaXMubWF0Y2hlZFRleHQ9ZS5tYXRjaGVkVGV4dCx0aGlzLm9mZnNldD1lLm9mZnNldH1yZXR1cm4gZS5wcm90b3R5cGUuZ2V0TWF0Y2hlZFRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXRjaGVkVGV4dH0sZS5wcm90b3R5cGUuc2V0T2Zmc2V0PWZ1bmN0aW9uKGUpe3RoaXMub2Zmc2V0PWV9LGUucHJvdG90eXBlLmdldE9mZnNldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9mZnNldH0sZS5wcm90b3R5cGUuZ2V0Q3NzQ2xhc3NTdWZmaXhlcz1mdW5jdGlvbigpe3JldHVyblt0aGlzLmdldFR5cGUoKV19LGUucHJvdG90eXBlLmJ1aWxkVGFnPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGFnQnVpbGRlci5idWlsZCh0aGlzKX0sZX0oKSxmPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKGY9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKGUsdCl7ZS5fX3Byb3RvX189dH18fGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShuKSYmKGVbbl09dFtuXSl9KShlLHQpfTtmdW5jdGlvbiBoKGUsdCl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9ZX1mKGUsdCksZS5wcm90b3R5cGU9bnVsbD09PXQ/T2JqZWN0LmNyZWF0ZSh0KToobi5wcm90b3R5cGU9dC5wcm90b3R5cGUsbmV3IG4pfXZhciBkPWZ1bmN0aW9uKCl7cmV0dXJuKGQ9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49MSxyPWFyZ3VtZW50cy5sZW5ndGg7bjxyO24rKylmb3IodmFyIG8gaW4gdD1hcmd1bWVudHNbbl0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsbykmJihlW29dPXRbb10pO3JldHVybiBlfSkuYXBwbHkodGhpcyxhcmd1bWVudHMpfTt2YXIgbSx2PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCl7dmFyIG49ZS5jYWxsKHRoaXMsdCl8fHRoaXM7cmV0dXJuIG4uZW1haWw9IiIsbi5lbWFpbD10LmVtYWlsLG59cmV0dXJuIGgodCxlKSx0LnByb3RvdHlwZS5nZXRUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuImVtYWlsIn0sdC5wcm90b3R5cGUuZ2V0RW1haWw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbWFpbH0sdC5wcm90b3R5cGUuZ2V0QW5jaG9ySHJlZj1mdW5jdGlvbigpe3JldHVybiJtYWlsdG86Iit0aGlzLmVtYWlsfSx0LnByb3RvdHlwZS5nZXRBbmNob3JUZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW1haWx9LHR9KHApLGc9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXt2YXIgbj1lLmNhbGwodGhpcyx0KXx8dGhpcztyZXR1cm4gbi5zZXJ2aWNlTmFtZT0iIixuLmhhc2h0YWc9IiIsbi5zZXJ2aWNlTmFtZT10LnNlcnZpY2VOYW1lLG4uaGFzaHRhZz10Lmhhc2h0YWcsbn1yZXR1cm4gaCh0LGUpLHQucHJvdG90eXBlLmdldFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4iaGFzaHRhZyJ9LHQucHJvdG90eXBlLmdldFNlcnZpY2VOYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VydmljZU5hbWV9LHQucHJvdG90eXBlLmdldEhhc2h0YWc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5oYXNodGFnfSx0LnByb3RvdHlwZS5nZXRBbmNob3JIcmVmPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zZXJ2aWNlTmFtZSx0PXRoaXMuaGFzaHRhZztzd2l0Y2goZSl7Y2FzZSJ0d2l0dGVyIjpyZXR1cm4iaHR0cHM6Ly90d2l0dGVyLmNvbS9oYXNodGFnLyIrdDtjYXNlImZhY2Vib29rIjpyZXR1cm4iaHR0cHM6Ly93d3cuZmFjZWJvb2suY29tL2hhc2h0YWcvIit0O2Nhc2UiaW5zdGFncmFtIjpyZXR1cm4iaHR0cHM6Ly9pbnN0YWdyYW0uY29tL2V4cGxvcmUvdGFncy8iK3Q7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gc2VydmljZSBuYW1lIHRvIHBvaW50IGhhc2h0YWcgdG86ICIrZSl9fSx0LnByb3RvdHlwZS5nZXRBbmNob3JUZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIiMiK3RoaXMuaGFzaHRhZ30sdH0ocCkseT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciBuPWUuY2FsbCh0aGlzLHQpfHx0aGlzO3JldHVybiBuLnNlcnZpY2VOYW1lPSJ0d2l0dGVyIixuLm1lbnRpb249IiIsbi5tZW50aW9uPXQubWVudGlvbixuLnNlcnZpY2VOYW1lPXQuc2VydmljZU5hbWUsbn1yZXR1cm4gaCh0LGUpLHQucHJvdG90eXBlLmdldFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4ibWVudGlvbiJ9LHQucHJvdG90eXBlLmdldE1lbnRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tZW50aW9ufSx0LnByb3RvdHlwZS5nZXRTZXJ2aWNlTmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlcnZpY2VOYW1lfSx0LnByb3RvdHlwZS5nZXRBbmNob3JIcmVmPWZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuc2VydmljZU5hbWUpe2Nhc2UidHdpdHRlciI6cmV0dXJuImh0dHBzOi8vdHdpdHRlci5jb20vIit0aGlzLm1lbnRpb247Y2FzZSJpbnN0YWdyYW0iOnJldHVybiJodHRwczovL2luc3RhZ3JhbS5jb20vIit0aGlzLm1lbnRpb247Y2FzZSJzb3VuZGNsb3VkIjpyZXR1cm4iaHR0cHM6Ly9zb3VuZGNsb3VkLmNvbS8iK3RoaXMubWVudGlvbjtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5rbm93biBzZXJ2aWNlIG5hbWUgdG8gcG9pbnQgbWVudGlvbiB0bzogIit0aGlzLnNlcnZpY2VOYW1lKX19LHQucHJvdG90eXBlLmdldEFuY2hvclRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4iQCIrdGhpcy5tZW50aW9ufSx0LnByb3RvdHlwZS5nZXRDc3NDbGFzc1N1ZmZpeGVzPWZ1bmN0aW9uKCl7dmFyIHQ9ZS5wcm90b3R5cGUuZ2V0Q3NzQ2xhc3NTdWZmaXhlcy5jYWxsKHRoaXMpLG49dGhpcy5nZXRTZXJ2aWNlTmFtZSgpO3JldHVybiBuJiZ0LnB1c2gobiksdH0sdH0ocCksYj1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciBuPWUuY2FsbCh0aGlzLHQpfHx0aGlzO3JldHVybiBuLm51bWJlcj0iIixuLnBsdXNTaWduPSExLG4ubnVtYmVyPXQubnVtYmVyLG4ucGx1c1NpZ249dC5wbHVzU2lnbixufXJldHVybiBoKHQsZSksdC5wcm90b3R5cGUuZ2V0VHlwZT1mdW5jdGlvbigpe3JldHVybiJwaG9uZSJ9LHQucHJvdG90eXBlLmdldFBob25lTnVtYmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubnVtYmVyfSx0LnByb3RvdHlwZS5nZXROdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRQaG9uZU51bWJlcigpfSx0LnByb3RvdHlwZS5nZXRBbmNob3JIcmVmPWZ1bmN0aW9uKCl7cmV0dXJuInRlbDoiKyh0aGlzLnBsdXNTaWduPyIrIjoiIikrdGhpcy5udW1iZXJ9LHQucHJvdG90eXBlLmdldEFuY2hvclRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXRjaGVkVGV4dH0sdH0ocCksXz1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciBuPWUuY2FsbCh0aGlzLHQpfHx0aGlzO3JldHVybiBuLnVybD0iIixuLnVybE1hdGNoVHlwZT0ic2NoZW1lIixuLnByb3RvY29sVXJsTWF0Y2g9ITEsbi5wcm90b2NvbFJlbGF0aXZlTWF0Y2g9ITEsbi5zdHJpcFByZWZpeD17c2NoZW1lOiEwLHd3dzohMH0sbi5zdHJpcFRyYWlsaW5nU2xhc2g9ITAsbi5kZWNvZGVQZXJjZW50RW5jb2Rpbmc9ITAsbi5zY2hlbWVQcmVmaXhSZWdleD0vXihodHRwcz86XC9cLyk/L2ksbi53d3dQcmVmaXhSZWdleD0vXihodHRwcz86XC9cLyk/KHd3d1wuKT8vaSxuLnByb3RvY29sUmVsYXRpdmVSZWdleD0vXlwvXC8vLG4ucHJvdG9jb2xQcmVwZW5kZWQ9ITEsbi51cmxNYXRjaFR5cGU9dC51cmxNYXRjaFR5cGUsbi51cmw9dC51cmwsbi5wcm90b2NvbFVybE1hdGNoPXQucHJvdG9jb2xVcmxNYXRjaCxuLnByb3RvY29sUmVsYXRpdmVNYXRjaD10LnByb3RvY29sUmVsYXRpdmVNYXRjaCxuLnN0cmlwUHJlZml4PXQuc3RyaXBQcmVmaXgsbi5zdHJpcFRyYWlsaW5nU2xhc2g9dC5zdHJpcFRyYWlsaW5nU2xhc2gsbi5kZWNvZGVQZXJjZW50RW5jb2Rpbmc9dC5kZWNvZGVQZXJjZW50RW5jb2Rpbmcsbn1yZXR1cm4gaCh0LGUpLHQucHJvdG90eXBlLmdldFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4idXJsIn0sdC5wcm90b3R5cGUuZ2V0VXJsTWF0Y2hUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudXJsTWF0Y2hUeXBlfSx0LnByb3RvdHlwZS5nZXRVcmw9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnVybDtyZXR1cm4gdGhpcy5wcm90b2NvbFJlbGF0aXZlTWF0Y2h8fHRoaXMucHJvdG9jb2xVcmxNYXRjaHx8dGhpcy5wcm90b2NvbFByZXBlbmRlZHx8KGU9dGhpcy51cmw9Imh0dHA6Ly8iK2UsdGhpcy5wcm90b2NvbFByZXBlbmRlZD0hMCksZX0sdC5wcm90b3R5cGUuZ2V0QW5jaG9ySHJlZj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFVybCgpLnJlcGxhY2UoLyZhbXA7L2csIiYiKX0sdC5wcm90b3R5cGUuZ2V0QW5jaG9yVGV4dD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0TWF0Y2hlZFRleHQoKTtyZXR1cm4gdGhpcy5wcm90b2NvbFJlbGF0aXZlTWF0Y2gmJihlPXRoaXMuc3RyaXBQcm90b2NvbFJlbGF0aXZlUHJlZml4KGUpKSx0aGlzLnN0cmlwUHJlZml4LnNjaGVtZSYmKGU9dGhpcy5zdHJpcFNjaGVtZVByZWZpeChlKSksdGhpcy5zdHJpcFByZWZpeC53d3cmJihlPXRoaXMuc3RyaXBXd3dQcmVmaXgoZSkpLHRoaXMuc3RyaXBUcmFpbGluZ1NsYXNoJiYoZT10aGlzLnJlbW92ZVRyYWlsaW5nU2xhc2goZSkpLHRoaXMuZGVjb2RlUGVyY2VudEVuY29kaW5nJiYoZT10aGlzLnJlbW92ZVBlcmNlbnRFbmNvZGluZyhlKSksZX0sdC5wcm90b3R5cGUuc3RyaXBTY2hlbWVQcmVmaXg9ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSh0aGlzLnNjaGVtZVByZWZpeFJlZ2V4LCIiKX0sdC5wcm90b3R5cGUuc3RyaXBXd3dQcmVmaXg9ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSh0aGlzLnd3d1ByZWZpeFJlZ2V4LCIkMSIpfSx0LnByb3RvdHlwZS5zdHJpcFByb3RvY29sUmVsYXRpdmVQcmVmaXg9ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSh0aGlzLnByb3RvY29sUmVsYXRpdmVSZWdleCwiIil9LHQucHJvdG90eXBlLnJlbW92ZVRyYWlsaW5nU2xhc2g9ZnVuY3Rpb24oZSl7cmV0dXJuIi8iPT09ZS5jaGFyQXQoZS5sZW5ndGgtMSkmJihlPWUuc2xpY2UoMCwtMSkpLGV9LHQucHJvdG90eXBlLnJlbW92ZVBlcmNlbnRFbmNvZGluZz1mdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoLyUyMi9naSwiJnF1b3Q7IikucmVwbGFjZSgvJTI2L2dpLCImYW1wOyIpLnJlcGxhY2UoLyUyNy9naSwiJiMzOTsiKS5yZXBsYWNlKC8lM0MvZ2ksIiZsdDsiKS5yZXBsYWNlKC8lM0UvZ2ksIiZndDsiKTt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh0KX1jYXRjaChlKXtyZXR1cm4gdH19LHR9KHApLHc9ZnVuY3Rpb24oZSl7dGhpcy5fX2pzZHVja0R1bW15RG9jUHJvcD1udWxsLHRoaXMudGFnQnVpbGRlcj1lLnRhZ0J1aWxkZXJ9LHg9L1tBLVphLXpdLyxFPS9bXGRdLyxTPS9bXERdLyxDPS9ccy8sQT0vWyciXS8sTz0vW1x4MDAtXHgxRlx4N0ZdLyxrPS9BLVphLXpceEFBXHhCNVx4QkFceEMwLVx4RDZceEQ4LVx4RjZceEY4LVx1MDJDMVx1MDJDNi1cdTAyRDFcdTAyRTAtXHUwMkU0XHUwMkVDXHUwMkVFXHUwMzcwLVx1MDM3NFx1MDM3Nlx1MDM3N1x1MDM3QS1cdTAzN0RcdTAzN0ZcdTAzODZcdTAzODgtXHUwMzhBXHUwMzhDXHUwMzhFLVx1MDNBMVx1MDNBMy1cdTAzRjVcdTAzRjctXHUwNDgxXHUwNDhBLVx1MDUyRlx1MDUzMS1cdTA1NTZcdTA1NTlcdTA1NjEtXHUwNTg3XHUwNUQwLVx1MDVFQVx1MDVGMC1cdTA1RjJcdTA2MjAtXHUwNjRBXHUwNjZFXHUwNjZGXHUwNjcxLVx1MDZEM1x1MDZENVx1MDZFNVx1MDZFNlx1MDZFRVx1MDZFRlx1MDZGQS1cdTA2RkNcdTA2RkZcdTA3MTBcdTA3MTItXHUwNzJGXHUwNzRELVx1MDdBNVx1MDdCMVx1MDdDQS1cdTA3RUFcdTA3RjRcdTA3RjVcdTA3RkFcdTA4MDAtXHUwODE1XHUwODFBXHUwODI0XHUwODI4XHUwODQwLVx1MDg1OFx1MDhBMC1cdTA4QjRcdTA4QjYtXHUwOEJEXHUwOTA0LVx1MDkzOVx1MDkzRFx1MDk1MFx1MDk1OC1cdTA5NjFcdTA5NzEtXHUwOTgwXHUwOTg1LVx1MDk4Q1x1MDk4Rlx1MDk5MFx1MDk5My1cdTA5QThcdTA5QUEtXHUwOUIwXHUwOUIyXHUwOUI2LVx1MDlCOVx1MDlCRFx1MDlDRVx1MDlEQ1x1MDlERFx1MDlERi1cdTA5RTFcdTA5RjBcdTA5RjFcdTBBMDUtXHUwQTBBXHUwQTBGXHUwQTEwXHUwQTEzLVx1MEEyOFx1MEEyQS1cdTBBMzBcdTBBMzJcdTBBMzNcdTBBMzVcdTBBMzZcdTBBMzhcdTBBMzlcdTBBNTktXHUwQTVDXHUwQTVFXHUwQTcyLVx1MEE3NFx1MEE4NS1cdTBBOERcdTBBOEYtXHUwQTkxXHUwQTkzLVx1MEFBOFx1MEFBQS1cdTBBQjBcdTBBQjJcdTBBQjNcdTBBQjUtXHUwQUI5XHUwQUJEXHUwQUQwXHUwQUUwXHUwQUUxXHUwQUY5XHUwQjA1LVx1MEIwQ1x1MEIwRlx1MEIxMFx1MEIxMy1cdTBCMjhcdTBCMkEtXHUwQjMwXHUwQjMyXHUwQjMzXHUwQjM1LVx1MEIzOVx1MEIzRFx1MEI1Q1x1MEI1RFx1MEI1Ri1cdTBCNjFcdTBCNzFcdTBCODNcdTBCODUtXHUwQjhBXHUwQjhFLVx1MEI5MFx1MEI5Mi1cdTBCOTVcdTBCOTlcdTBCOUFcdTBCOUNcdTBCOUVcdTBCOUZcdTBCQTNcdTBCQTRcdTBCQTgtXHUwQkFBXHUwQkFFLVx1MEJCOVx1MEJEMFx1MEMwNS1cdTBDMENcdTBDMEUtXHUwQzEwXHUwQzEyLVx1MEMyOFx1MEMyQS1cdTBDMzlcdTBDM0RcdTBDNTgtXHUwQzVBXHUwQzYwXHUwQzYxXHUwQzgwXHUwQzg1LVx1MEM4Q1x1MEM4RS1cdTBDOTBcdTBDOTItXHUwQ0E4XHUwQ0FBLVx1MENCM1x1MENCNS1cdTBDQjlcdTBDQkRcdTBDREVcdTBDRTBcdTBDRTFcdTBDRjFcdTBDRjJcdTBEMDUtXHUwRDBDXHUwRDBFLVx1MEQxMFx1MEQxMi1cdTBEM0FcdTBEM0RcdTBENEVcdTBENTQtXHUwRDU2XHUwRDVGLVx1MEQ2MVx1MEQ3QS1cdTBEN0ZcdTBEODUtXHUwRDk2XHUwRDlBLVx1MERCMVx1MERCMy1cdTBEQkJcdTBEQkRcdTBEQzAtXHUwREM2XHUwRTAxLVx1MEUzMFx1MEUzMlx1MEUzM1x1MEU0MC1cdTBFNDZcdTBFODFcdTBFODJcdTBFODRcdTBFODdcdTBFODhcdTBFOEFcdTBFOERcdTBFOTQtXHUwRTk3XHUwRTk5LVx1MEU5Rlx1MEVBMS1cdTBFQTNcdTBFQTVcdTBFQTdcdTBFQUFcdTBFQUJcdTBFQUQtXHUwRUIwXHUwRUIyXHUwRUIzXHUwRUJEXHUwRUMwLVx1MEVDNFx1MEVDNlx1MEVEQy1cdTBFREZcdTBGMDBcdTBGNDAtXHUwRjQ3XHUwRjQ5LVx1MEY2Q1x1MEY4OC1cdTBGOENcdTEwMDAtXHUxMDJBXHUxMDNGXHUxMDUwLVx1MTA1NVx1MTA1QS1cdTEwNURcdTEwNjFcdTEwNjVcdTEwNjZcdTEwNkUtXHUxMDcwXHUxMDc1LVx1MTA4MVx1MTA4RVx1MTBBMC1cdTEwQzVcdTEwQzdcdTEwQ0RcdTEwRDAtXHUxMEZBXHUxMEZDLVx1MTI0OFx1MTI0QS1cdTEyNERcdTEyNTAtXHUxMjU2XHUxMjU4XHUxMjVBLVx1MTI1RFx1MTI2MC1cdTEyODhcdTEyOEEtXHUxMjhEXHUxMjkwLVx1MTJCMFx1MTJCMi1cdTEyQjVcdTEyQjgtXHUxMkJFXHUxMkMwXHUxMkMyLVx1MTJDNVx1MTJDOC1cdTEyRDZcdTEyRDgtXHUxMzEwXHUxMzEyLVx1MTMxNVx1MTMxOC1cdTEzNUFcdTEzODAtXHUxMzhGXHUxM0EwLVx1MTNGNVx1MTNGOC1cdTEzRkRcdTE0MDEtXHUxNjZDXHUxNjZGLVx1MTY3Rlx1MTY4MS1cdTE2OUFcdTE2QTAtXHUxNkVBXHUxNkYxLVx1MTZGOFx1MTcwMC1cdTE3MENcdTE3MEUtXHUxNzExXHUxNzIwLVx1MTczMVx1MTc0MC1cdTE3NTFcdTE3NjAtXHUxNzZDXHUxNzZFLVx1MTc3MFx1MTc4MC1cdTE3QjNcdTE3RDdcdTE3RENcdTE4MjAtXHUxODc3XHUxODgwLVx1MTg4NFx1MTg4Ny1cdTE4QThcdTE4QUFcdTE4QjAtXHUxOEY1XHUxOTAwLVx1MTkxRVx1MTk1MC1cdTE5NkRcdTE5NzAtXHUxOTc0XHUxOTgwLVx1MTlBQlx1MTlCMC1cdTE5QzlcdTFBMDAtXHUxQTE2XHUxQTIwLVx1MUE1NFx1MUFBN1x1MUIwNS1cdTFCMzNcdTFCNDUtXHUxQjRCXHUxQjgzLVx1MUJBMFx1MUJBRVx1MUJBRlx1MUJCQS1cdTFCRTVcdTFDMDAtXHUxQzIzXHUxQzRELVx1MUM0Rlx1MUM1QS1cdTFDN0RcdTFDODAtXHUxQzg4XHUxQ0U5LVx1MUNFQ1x1MUNFRS1cdTFDRjFcdTFDRjVcdTFDRjZcdTFEMDAtXHUxREJGXHUxRTAwLVx1MUYxNVx1MUYxOC1cdTFGMURcdTFGMjAtXHUxRjQ1XHUxRjQ4LVx1MUY0RFx1MUY1MC1cdTFGNTdcdTFGNTlcdTFGNUJcdTFGNURcdTFGNUYtXHUxRjdEXHUxRjgwLVx1MUZCNFx1MUZCNi1cdTFGQkNcdTFGQkVcdTFGQzItXHUxRkM0XHUxRkM2LVx1MUZDQ1x1MUZEMC1cdTFGRDNcdTFGRDYtXHUxRkRCXHUxRkUwLVx1MUZFQ1x1MUZGMi1cdTFGRjRcdTFGRjYtXHUxRkZDXHUyMDcxXHUyMDdGXHUyMDkwLVx1MjA5Q1x1MjEwMlx1MjEwN1x1MjEwQS1cdTIxMTNcdTIxMTVcdTIxMTktXHUyMTFEXHUyMTI0XHUyMTI2XHUyMTI4XHUyMTJBLVx1MjEyRFx1MjEyRi1cdTIxMzlcdTIxM0MtXHUyMTNGXHUyMTQ1LVx1MjE0OVx1MjE0RVx1MjE4M1x1MjE4NFx1MkMwMC1cdTJDMkVcdTJDMzAtXHUyQzVFXHUyQzYwLVx1MkNFNFx1MkNFQi1cdTJDRUVcdTJDRjJcdTJDRjNcdTJEMDAtXHUyRDI1XHUyRDI3XHUyRDJEXHUyRDMwLVx1MkQ2N1x1MkQ2Rlx1MkQ4MC1cdTJEOTZcdTJEQTAtXHUyREE2XHUyREE4LVx1MkRBRVx1MkRCMC1cdTJEQjZcdTJEQjgtXHUyREJFXHUyREMwLVx1MkRDNlx1MkRDOC1cdTJEQ0VcdTJERDAtXHUyREQ2XHUyREQ4LVx1MkRERVx1MkUyRlx1MzAwNVx1MzAwNlx1MzAzMS1cdTMwMzVcdTMwM0JcdTMwM0NcdTMwNDEtXHUzMDk2XHUzMDlELVx1MzA5Rlx1MzBBMS1cdTMwRkFcdTMwRkMtXHUzMEZGXHUzMTA1LVx1MzEyRFx1MzEzMS1cdTMxOEVcdTMxQTAtXHUzMUJBXHUzMUYwLVx1MzFGRlx1MzQwMC1cdTREQjVcdTRFMDAtXHU5RkQ1XHVBMDAwLVx1QTQ4Q1x1QTREMC1cdUE0RkRcdUE1MDAtXHVBNjBDXHVBNjEwLVx1QTYxRlx1QTYyQVx1QTYyQlx1QTY0MC1cdUE2NkVcdUE2N0YtXHVBNjlEXHVBNkEwLVx1QTZFNVx1QTcxNy1cdUE3MUZcdUE3MjItXHVBNzg4XHVBNzhCLVx1QTdBRVx1QTdCMC1cdUE3QjdcdUE3RjctXHVBODAxXHVBODAzLVx1QTgwNVx1QTgwNy1cdUE4MEFcdUE4MEMtXHVBODIyXHVBODQwLVx1QTg3M1x1QTg4Mi1cdUE4QjNcdUE4RjItXHVBOEY3XHVBOEZCXHVBOEZEXHVBOTBBLVx1QTkyNVx1QTkzMC1cdUE5NDZcdUE5NjAtXHVBOTdDXHVBOTg0LVx1QTlCMlx1QTlDRlx1QTlFMC1cdUE5RTRcdUE5RTYtXHVBOUVGXHVBOUZBLVx1QTlGRVx1QUEwMC1cdUFBMjhcdUFBNDAtXHVBQTQyXHVBQTQ0LVx1QUE0Qlx1QUE2MC1cdUFBNzZcdUFBN0FcdUFBN0UtXHVBQUFGXHVBQUIxXHVBQUI1XHVBQUI2XHVBQUI5LVx1QUFCRFx1QUFDMFx1QUFDMlx1QUFEQi1cdUFBRERcdUFBRTAtXHVBQUVBXHVBQUYyLVx1QUFGNFx1QUIwMS1cdUFCMDZcdUFCMDktXHVBQjBFXHVBQjExLVx1QUIxNlx1QUIyMC1cdUFCMjZcdUFCMjgtXHVBQjJFXHVBQjMwLVx1QUI1QVx1QUI1Qy1cdUFCNjVcdUFCNzAtXHVBQkUyXHVBQzAwLVx1RDdBM1x1RDdCMC1cdUQ3QzZcdUQ3Q0ItXHVEN0ZCXHVGOTAwLVx1RkE2RFx1RkE3MC1cdUZBRDlcdUZCMDAtXHVGQjA2XHVGQjEzLVx1RkIxN1x1RkIxRFx1RkIxRi1cdUZCMjhcdUZCMkEtXHVGQjM2XHVGQjM4LVx1RkIzQ1x1RkIzRVx1RkI0MFx1RkI0MVx1RkI0M1x1RkI0NFx1RkI0Ni1cdUZCQjFcdUZCRDMtXHVGRDNEXHVGRDUwLVx1RkQ4Rlx1RkQ5Mi1cdUZEQzdcdUZERjAtXHVGREZCXHVGRTcwLVx1RkU3NFx1RkU3Ni1cdUZFRkNcdUZGMjEtXHVGRjNBXHVGRjQxLVx1RkY1QVx1RkY2Ni1cdUZGQkVcdUZGQzItXHVGRkM3XHVGRkNBLVx1RkZDRlx1RkZEMi1cdUZGRDdcdUZGREEtXHVGRkRDLy5zb3VyY2Usaj1rKy9cdTI3MDAtXHUyN2JmXHVkZGU2LVx1ZGRmZlx1ZDgwMC1cdWRiZmZcdWRjMDAtXHVkZmZmXHVmZTBlXHVmZTBmXHUwMzAwLVx1MDM2Zlx1ZmUyMC1cdWZlMjNcdTIwZDAtXHUyMGYwXHVkODNjXHVkZmZiLVx1ZGZmZlx1MjAwZFx1MzI5OVx1MzI5N1x1MzAzZFx1MzAzMFx1MjRjMlx1ZDgzY1x1ZGQ3MC1cdWRkNzFcdWRkN2UtXHVkZDdmXHVkZDhlXHVkZDkxLVx1ZGQ5YVx1ZGRlNi1cdWRkZmZcdWRlMDEtXHVkZTAyXHVkZTFhXHVkZTJmXHVkZTMyLVx1ZGUzYVx1ZGU1MC1cdWRlNTFcdTIwM2NcdTIwNDlcdTI1YWEtXHUyNWFiXHUyNWI2XHUyNWMwXHUyNWZiLVx1MjVmZVx1MDBhOVx1MDBhZVx1MjEyMlx1MjEzOVx1ZGMwNFx1MjYwMC1cdTI2RkZcdTJiMDVcdTJiMDZcdTJiMDdcdTJiMWJcdTJiMWNcdTJiNTBcdTJiNTVcdTIzMWFcdTIzMWJcdTIzMjhcdTIzY2ZcdTIzZTktXHUyM2YzXHUyM2Y4LVx1MjNmYVx1ZGNjZlx1MjkzNVx1MjkzNFx1MjE5MC1cdTIxZmYvLnNvdXJjZSsvXHUwMzAwLVx1MDM2Rlx1MDQ4My1cdTA0ODlcdTA1OTEtXHUwNUJEXHUwNUJGXHUwNUMxXHUwNUMyXHUwNUM0XHUwNUM1XHUwNUM3XHUwNjEwLVx1MDYxQVx1MDY0Qi1cdTA2NUZcdTA2NzBcdTA2RDYtXHUwNkRDXHUwNkRGLVx1MDZFNFx1MDZFN1x1MDZFOFx1MDZFQS1cdTA2RURcdTA3MTFcdTA3MzAtXHUwNzRBXHUwN0E2LVx1MDdCMFx1MDdFQi1cdTA3RjNcdTA4MTYtXHUwODE5XHUwODFCLVx1MDgyM1x1MDgyNS1cdTA4MjdcdTA4MjktXHUwODJEXHUwODU5LVx1MDg1Qlx1MDhENC1cdTA4RTFcdTA4RTMtXHUwOTAzXHUwOTNBLVx1MDkzQ1x1MDkzRS1cdTA5NEZcdTA5NTEtXHUwOTU3XHUwOTYyXHUwOTYzXHUwOTgxLVx1MDk4M1x1MDlCQ1x1MDlCRS1cdTA5QzRcdTA5QzdcdTA5QzhcdTA5Q0ItXHUwOUNEXHUwOUQ3XHUwOUUyXHUwOUUzXHUwQTAxLVx1MEEwM1x1MEEzQ1x1MEEzRS1cdTBBNDJcdTBBNDdcdTBBNDhcdTBBNEItXHUwQTREXHUwQTUxXHUwQTcwXHUwQTcxXHUwQTc1XHUwQTgxLVx1MEE4M1x1MEFCQ1x1MEFCRS1cdTBBQzVcdTBBQzctXHUwQUM5XHUwQUNCLVx1MEFDRFx1MEFFMlx1MEFFM1x1MEIwMS1cdTBCMDNcdTBCM0NcdTBCM0UtXHUwQjQ0XHUwQjQ3XHUwQjQ4XHUwQjRCLVx1MEI0RFx1MEI1Nlx1MEI1N1x1MEI2Mlx1MEI2M1x1MEI4Mlx1MEJCRS1cdTBCQzJcdTBCQzYtXHUwQkM4XHUwQkNBLVx1MEJDRFx1MEJEN1x1MEMwMC1cdTBDMDNcdTBDM0UtXHUwQzQ0XHUwQzQ2LVx1MEM0OFx1MEM0QS1cdTBDNERcdTBDNTVcdTBDNTZcdTBDNjJcdTBDNjNcdTBDODEtXHUwQzgzXHUwQ0JDXHUwQ0JFLVx1MENDNFx1MENDNi1cdTBDQzhcdTBDQ0EtXHUwQ0NEXHUwQ0Q1XHUwQ0Q2XHUwQ0UyXHUwQ0UzXHUwRDAxLVx1MEQwM1x1MEQzRS1cdTBENDRcdTBENDYtXHUwRDQ4XHUwRDRBLVx1MEQ0RFx1MEQ1N1x1MEQ2Mlx1MEQ2M1x1MEQ4Mlx1MEQ4M1x1MERDQVx1MERDRi1cdTBERDRcdTBERDZcdTBERDgtXHUwRERGXHUwREYyXHUwREYzXHUwRTMxXHUwRTM0LVx1MEUzQVx1MEU0Ny1cdTBFNEVcdTBFQjFcdTBFQjQtXHUwRUI5XHUwRUJCXHUwRUJDXHUwRUM4LVx1MEVDRFx1MEYxOFx1MEYxOVx1MEYzNVx1MEYzN1x1MEYzOVx1MEYzRVx1MEYzRlx1MEY3MS1cdTBGODRcdTBGODZcdTBGODdcdTBGOEQtXHUwRjk3XHUwRjk5LVx1MEZCQ1x1MEZDNlx1MTAyQi1cdTEwM0VcdTEwNTYtXHUxMDU5XHUxMDVFLVx1MTA2MFx1MTA2Mi1cdTEwNjRcdTEwNjctXHUxMDZEXHUxMDcxLVx1MTA3NFx1MTA4Mi1cdTEwOERcdTEwOEZcdTEwOUEtXHUxMDlEXHUxMzVELVx1MTM1Rlx1MTcxMi1cdTE3MTRcdTE3MzItXHUxNzM0XHUxNzUyXHUxNzUzXHUxNzcyXHUxNzczXHUxN0I0LVx1MTdEM1x1MTdERFx1MTgwQi1cdTE4MERcdTE4ODVcdTE4ODZcdTE4QTlcdTE5MjAtXHUxOTJCXHUxOTMwLVx1MTkzQlx1MUExNy1cdTFBMUJcdTFBNTUtXHUxQTVFXHUxQTYwLVx1MUE3Q1x1MUE3Rlx1MUFCMC1cdTFBQkVcdTFCMDAtXHUxQjA0XHUxQjM0LVx1MUI0NFx1MUI2Qi1cdTFCNzNcdTFCODAtXHUxQjgyXHUxQkExLVx1MUJBRFx1MUJFNi1cdTFCRjNcdTFDMjQtXHUxQzM3XHUxQ0QwLVx1MUNEMlx1MUNENC1cdTFDRThcdTFDRURcdTFDRjItXHUxQ0Y0XHUxQ0Y4XHUxQ0Y5XHUxREMwLVx1MURGNVx1MURGQi1cdTFERkZcdTIwRDAtXHUyMEYwXHUyQ0VGLVx1MkNGMVx1MkQ3Rlx1MkRFMC1cdTJERkZcdTMwMkEtXHUzMDJGXHUzMDk5XHUzMDlBXHVBNjZGLVx1QTY3Mlx1QTY3NC1cdUE2N0RcdUE2OUVcdUE2OUZcdUE2RjBcdUE2RjFcdUE4MDJcdUE4MDZcdUE4MEJcdUE4MjMtXHVBODI3XHVBODgwXHVBODgxXHVBOEI0LVx1QThDNVx1QThFMC1cdUE4RjFcdUE5MjYtXHVBOTJEXHVBOTQ3LVx1QTk1M1x1QTk4MC1cdUE5ODNcdUE5QjMtXHVBOUMwXHVBOUU1XHVBQTI5LVx1QUEzNlx1QUE0M1x1QUE0Q1x1QUE0RFx1QUE3Qi1cdUFBN0RcdUFBQjBcdUFBQjItXHVBQUI0XHVBQUI3XHVBQUI4XHVBQUJFXHVBQUJGXHVBQUMxXHVBQUVCLVx1QUFFRlx1QUFGNVx1QUFGNlx1QUJFMy1cdUFCRUFcdUFCRUNcdUFCRURcdUZCMUVcdUZFMDAtXHVGRTBGXHVGRTIwLVx1RkUyRi8uc291cmNlLFQ9LzAtOVx1MDY2MC1cdTA2NjlcdTA2RjAtXHUwNkY5XHUwN0MwLVx1MDdDOVx1MDk2Ni1cdTA5NkZcdTA5RTYtXHUwOUVGXHUwQTY2LVx1MEE2Rlx1MEFFNi1cdTBBRUZcdTBCNjYtXHUwQjZGXHUwQkU2LVx1MEJFRlx1MEM2Ni1cdTBDNkZcdTBDRTYtXHUwQ0VGXHUwRDY2LVx1MEQ2Rlx1MERFNi1cdTBERUZcdTBFNTAtXHUwRTU5XHUwRUQwLVx1MEVEOVx1MEYyMC1cdTBGMjlcdTEwNDAtXHUxMDQ5XHUxMDkwLVx1MTA5OVx1MTdFMC1cdTE3RTlcdTE4MTAtXHUxODE5XHUxOTQ2LVx1MTk0Rlx1MTlEMC1cdTE5RDlcdTFBODAtXHUxQTg5XHUxQTkwLVx1MUE5OVx1MUI1MC1cdTFCNTlcdTFCQjAtXHUxQkI5XHUxQzQwLVx1MUM0OVx1MUM1MC1cdTFDNTlcdUE2MjAtXHVBNjI5XHVBOEQwLVx1QThEOVx1QTkwMC1cdUE5MDlcdUE5RDAtXHVBOUQ5XHVBOUYwLVx1QTlGOVx1QUE1MC1cdUFBNTlcdUFCRjAtXHVBQkY5XHVGRjEwLVx1RkYxOS8uc291cmNlLEk9aitULFA9aitULE49Iig/OlsiK1QrIl17MSwzfVxcLil7M31bIitUKyJdezEsM30iLE09IlsiK1ArIl0oPzpbIitQKyJcXC1dezAsNjF9WyIrUCsiXSk/IixSPWZ1bmN0aW9uKGUpe3JldHVybiIoPz0oIitNKyIpKVxcIitlfSxEPWZ1bmN0aW9uKGUpe3JldHVybiIoPzoiK1IoZSkrIig/OlxcLiIrUihlKzEpKyIpezAsMTI2fXwiK04rIikifSxMPShuZXcgUmVnRXhwKCJbIitQKyIuXFwtXSpbIitQKyJcXC1dIiksbmV3IFJlZ0V4cCgiWyIrUCsiXSIpKSxCPS8oPzp4bi0tdmVybWdlbnNiZXJhdHVuZy1wd2J8eG4tLXZlcm1nZW5zYmVyYXRlci1jdGJ8eG4tLWNsY2hjMGVhMGIyZzJhOWdjZHx4bi0tdzRyODVlbDhmaHU1ZG5yYXxub3J0aHdlc3Rlcm5tdXR1YWx8dHJhdmVsZXJzaW5zdXJhbmNlfHZlcm3DtmdlbnNiZXJhdHVuZ3x4bi0tM29xMTh2bDhwbjM2YXx4bi0tNXN1MzRqOTM2YmdzZ3x4bi0tYmNrMWI5YTVkcmU0Y3x4bi0tbWdiYWk5YXpncXA2anx4bi0tbWdiZXJwNGE1ZDRhcnx4bi0teGtjMmRsM2E1ZWUwaHx2ZXJtw7ZnZW5zYmVyYXRlcnx4bi0tZnp5czhkNjl1dmdtfHhuLS1tZ2JhN2MwYmJuMGF8eG4tLXhrYzJhbDNoeWUyYXxhbWVyaWNhbmV4cHJlc3N8a2Vycnlwcm9wZXJ0aWVzfHNhbmR2aWtjb3JvbWFudHx4bi0taTFiNmIxYTZhMmV8eG4tLWtjcng3N2QxeDRhfHhuLS1sZ2JiYXQxYWQ4anx4bi0tbWdiYTNhNGYxNmF8eG4tLW1nYmFha2M3ZHZmfHhuLS1tZ2JjMGE5YXpjZ3x4bi0tbnF2N2ZzMDBlbWF8YWZhbWlseWNvbXBhbnl8YW1lcmljYW5mYW1pbHl8YmFuYW5hcmVwdWJsaWN8Y2FuY2VycmVzZWFyY2h8Y29va2luZ2NoYW5uZWx8a2Vycnlsb2dpc3RpY3N8d2VhdGhlcmNoYW5uZWx8eG4tLTU0YjdmdGEwY2N8eG4tLTZxcTk4NmIzeGx8eG4tLTgwYXFlY2RyMWF8eG4tLWI0dzYwNWZlcmR8eG4tLWZpcTIyOGM1aHN8eG4tLWgyYnJlZzNldmV8eG4tLWpscTYxdTl3N2J8eG4tLW1nYmEzYTNlanR8eG4tLW1nYmFhbTdhOGh8eG4tLW1nYmF5aDdncGF8eG4tLW1nYmI5ZmJwb2J8eG4tLW1nYmJoMWE3MWV8eG4tLW1nYmNhN2R6ZG98eG4tLW1nYmk0ZWNleHB8eG4tLW1nYng0Y2QwYWJ8eG4tLXJ2YzFlMGFtM2V8aW50ZXJuYXRpb25hbHxsaWZlaW5zdXJhbmNlfHNwcmVhZGJldHRpbmd8dHJhdmVsY2hhbm5lbHx3b2x0ZXJza2x1d2VyfHhuLS1lY2t2ZHRjOWR8eG4tLWZwY3JqOWMzZHx4bi0tZnpjMmM5ZTJjfHhuLS1oMmJyajljOGN8eG4tLXRpcTQ5eHF5anx4bi0teWZybzRpNjdvfHhuLS15Z2JpMmFtbXh8Y29uc3RydWN0aW9ufGxwbGZpbmFuY2lhbHxzY2hvbGFyc2hpcHN8dmVyc2ljaGVydW5nfHhuLS0zZTBiNzA3ZXx4bi0tNDVicjVjeWx8eG4tLTgwYWR4aGtzfHhuLS04MGFzZWhkYnx4bi0tOHkwYTA2M2F8eG4tLWdja3IzZjBmfHhuLS1tZ2I5YXdiZnx4bi0tbWdiYWIyYmR8eG4tLW1nYmd1ODJhfHhuLS1tZ2JwbDJmaHx4bi0tbWdidDNkaGR8eG4tLW1rMWJ1NDRjfHhuLS1uZ2JjNWF6ZHx4bi0tbmdiZTllMGF8eG4tLW9nYnBmOGZsfHhuLS1xY2thMXBtY3xhY2NvdW50YW50c3xiYXJjbGF5Y2FyZHxibGFja2ZyaWRheXxibG9ja2J1c3RlcnxicmlkZ2VzdG9uZXxjYWx2aW5rbGVpbnxjb250cmFjdG9yc3xjcmVkaXR1bmlvbnxlbmdpbmVlcmluZ3xlbnRlcnByaXNlc3xmb29kbmV0d29ya3xpbnZlc3RtZW50c3xrZXJyeWhvdGVsc3xsYW1ib3JnaGluaXxtb3RvcmN5Y2xlc3xvbGF5YW5ncm91cHxwaG90b2dyYXBoeXxwbGF5c3RhdGlvbnxwcm9kdWN0aW9uc3xwcm9ncmVzc2l2ZXxyZWR1bWJyZWxsYXxyaWdodGF0aG9tZXx3aWxsaWFtaGlsbHx4bi0tMTFiNGMzZHx4bi0tMWNrMmUxYnx4bi0tMXFxdzIzYXx4bi0tMnNjcmo5Y3x4bi0tM2JzdDAwbXx4bi0tM2RzNDQzZ3x4bi0tM2hjcmo5Y3x4bi0tNDJjMmQ5YXx4bi0tNDVicmo5Y3x4bi0tNTVxdzQyZ3x4bi0tNmZyejgyZ3x4bi0tODBhbzIxYXx4bi0tOWtydDAwYXx4bi0tY2NrMmIzYnx4bi0tY3pyNjk0Ynx4bi0tZDFhY2ozYnx4bi0tZWZ2eTg4aHx4bi0tZXN0djc1Z3x4bi0tZmN0NDI5a3x4bi0tZmpxNzIwYXx4bi0tZmx3MzUxZXx4bi0tZzJ4eDQ4Y3x4bi0tZ2Vjcmo5Y3x4bi0tZ2szYXQxZXx4bi0taDJicmo5Y3x4bi0taHh0ODE0ZXx4bi0taW1yNTEzbnx4bi0tajZ3MTkzZ3x4bi0tanZyMTg5bXx4bi0ta3BydzEzZHx4bi0ta3ByeTU3ZHx4bi0ta3B1NzE2Znx4bi0tbWdiYmgxYXx4bi0tbWdidHgyYnx4bi0tbWl4ODkxZnx4bi0tbnlxeTI2YXx4bi0tb3R1Nzk2ZHx4bi0tcGJ0OTc3Y3x4bi0tcGdiczBkaHx4bi0tcTlqeWI0Y3x4bi0tcmhxdjk2Z3x4bi0tcm92dTg4Ynx4bi0tczlicmo5Y3x4bi0tc2VzNTU0Z3x4bi0tdDYwYjU2YXx4bi0tdnVxODYxYnx4bi0tdzRyczQwbHx4bi0teGhxNTIxYnx4bi0temZyMTY0Ynzgrprgrr/grpngr43grpXgrqrgr43grqrgr4LgrrDgr418YWNjb3VudGFudHxhcGFydG1lbnRzfGFzc29jaWF0ZXN8YmFza2V0YmFsbHxibnBwYXJpYmFzfGJvZWhyaW5nZXJ8Y2FwaXRhbG9uZXxjb25zdWx0aW5nfGNyZWRpdGNhcmR8Y3Vpc2luZWxsYXxldXJvdmlzaW9ufGV4dHJhc3BhY2V8Zm91bmRhdGlvbnxoZWFsdGhjYXJlfGltbW9iaWxpZW58aW5kdXN0cmllc3xtYW5hZ2VtZW50fG1pdHN1YmlzaGl8bmF0aW9ud2lkZXxuZXdob2xsYW5kfG5leHRkaXJlY3R8b255b3Vyc2lkZXxwcm9wZXJ0aWVzfHByb3RlY3Rpb258cHJ1ZGVudGlhbHxyZWFsZXN0YXRlfHJlcHVibGljYW58cmVzdGF1cmFudHxzY2hhZWZmbGVyfHN3aWZ0Y292ZXJ8dGF0YW1vdG9yc3x0ZWNobm9sb2d5fHRlbGVmb25pY2F8dW5pdmVyc2l0eXx2aXN0YXByaW50fHZsYWFuZGVyZW58dm9sa3N3YWdlbnx4bi0tMzBycjd5fHhuLS0zcHh1OGt8eG4tLTQ1cTExY3x4bi0tNGdicmltfHhuLS01NXF4NWR8eG4tLTV0em01Z3x4bi0tODBhc3dnfHhuLS05MGEzYWN8eG4tLTlkYnEyYXx4bi0tOWV0NTJ1fHhuLS1jMmJyN2d8eG4tLWNnNGJraXx4bi0tY3pyczB0fHhuLS1jenJ1MmR8eG4tLWZpcTY0Ynx4bi0tZmlxczhzfHhuLS1maXF6OXN8eG4tLWlvMGE3aXx4bi0ta3B1dDNpfHhuLS1teHRxMW18eG4tLW8zY3c0aHx4bi0tcHNzeTJ1fHhuLS11bnVwNHl8eG4tLXdnYmgxY3x4bi0td2dibDZhfHhuLS15OWEzYXF8YWNjZW50dXJlfGFsZmFyb21lb3xhbGxmaW5hbnp8YW1zdGVyZGFtfGFuYWx5dGljc3xhcXVhcmVsbGV8YmFyY2Vsb25hfGJsb29tYmVyZ3xjaHJpc3RtYXN8Y29tbXVuaXR5fGRpcmVjdG9yeXxlZHVjYXRpb258ZXF1aXBtZW50fGZhaXJ3aW5kc3xmaW5hbmNpYWx8ZmlyZXN0b25lfGZyZXNlbml1c3xmcm9udGRvb3J8ZnVqaXhlcm94fGZ1cm5pdHVyZXxnb2xkcG9pbnR8aGlzYW1pdHN1fGhvbWVkZXBvdHxob21lZ29vZHN8aG9tZXNlbnNlfGhvbmV5d2VsbHxpbnN0aXR1dGV8aW5zdXJhbmNlfGt1b2tncm91cHxsYWRicm9rZXN8bGFuY2FzdGVyfGxhbmRyb3ZlcnxsaWZlc3R5bGV8bWFya2V0aW5nfG1hcnNoYWxsc3xtZWxib3VybmV8bWljcm9zb2Z0fHBhbmFzb25pY3xwYXNzYWdlbnN8cHJhbWVyaWNhfHJpY2hhcmRsaXxzY2pvaG5zb258c2hhbmdyaWxhfHNvbHV0aW9uc3xzdGF0ZWJhbmt8c3RhdGVmYXJtfHN0b2NraG9sbXx0cmF2ZWxlcnN8dmFjYXRpb25zfHhuLS05MGFpc3x4bi0tYzFhdmd8eG4tLWQxYWxmfHhuLS1lMWE0Y3x4bi0tZmhiZWl8eG4tLWoxYWVmfHhuLS1qMWFtaHx4bi0tbDFhY2N8eG4tLW5nYnJ4fHhuLS1ucXY3Znx4bi0tcDFhY2Z8eG4tLXRja3dlfHhuLS12aHF1dnx5b2RvYmFzaGl8YWJ1ZGhhYml8YWlyZm9yY2V8YWxsc3RhdGV8YXR0b3JuZXl8YmFyY2xheXN8YmFyZWZvb3R8YmFyZ2FpbnN8YmFzZWJhbGx8Ym91dGlxdWV8YnJhZGVzY298YnJvYWR3YXl8YnJ1c3NlbHN8YnVkYXBlc3R8YnVpbGRlcnN8YnVzaW5lc3N8Y2FwZXRvd258Y2F0ZXJpbmd8Y2F0aG9saWN8Y2hyeXNsZXJ8Y2lwcmlhbml8Y2l0eWVhdHN8Y2xlYW5pbmd8Y2xpbmlxdWV8Y2xvdGhpbmd8Y29tbWJhbmt8Y29tcHV0ZXJ8ZGVsaXZlcnl8ZGVsb2l0dGV8ZGVtb2NyYXR8ZGlhbW9uZHN8ZGlzY291bnR8ZGlzY292ZXJ8ZG93bmxvYWR8ZW5naW5lZXJ8ZXJpY3Nzb258ZXN1cmFuY2V8ZXRpc2FsYXR8ZXZlcmJhbmt8ZXhjaGFuZ2V8ZmVlZGJhY2t8ZmlkZWxpdHl8ZmlybWRhbGV8Zm9vdGJhbGx8ZnJvbnRpZXJ8Z29vZHllYXJ8Z3JhaW5nZXJ8Z3JhcGhpY3N8Z3VhcmRpYW58aGRmY2Jhbmt8aGVsc2lua2l8aG9sZGluZ3N8aG9zcGl0YWx8aW5maW5pdGl8aXBpcmFuZ2F8aXN0YW5idWx8anBtb3JnYW58bGlnaHRpbmd8bHVuZGJlY2t8bWFycmlvdHR8bWFzZXJhdGl8bWNraW5zZXl8bWVtb3JpYWx8bWVyY2ttc2R8bW9ydGdhZ2V8bW92aXN0YXJ8b2JzZXJ2ZXJ8cGFydG5lcnN8cGhhcm1hY3l8cGljdHVyZXN8cGx1bWJpbmd8cHJvcGVydHl8cmVkc3RvbmV8cmVsaWFuY2V8c2FhcmxhbmR8c2Ftc2NsdWJ8c2VjdXJpdHl8c2VydmljZXN8c2hvcHBpbmd8c2hvd3RpbWV8c29mdGJhbmt8c29mdHdhcmV8c3RjZ3JvdXB8c3VwcGxpZXN8c3ltYW50ZWN8dHJhaW5pbmd8dWNvbm5lY3R8dmFuZ3VhcmR8dmVudHVyZXN8dmVyaXNpZ258d29vZHNpZGV8eG4tLTkwYWV8eG4tLW5vZGV8eG4tLXAxYWl8eG4tLXF4YW18eW9rb2hhbWF82KfZhNiz2LnZiNiv2YrYqXxhYm9nYWRvfGFjYWRlbXl8YWdha2hhbnxhbGliYWJhfGFuZHJvaWR8YXRobGV0YXxhdWN0aW9ufGF1ZGlibGV8YXVzcG9zdHxhdmlhbmNhfGJhbmFtZXh8YmF1aGF1c3xiZW50bGV5fGJlc3RidXl8Ym9va2luZ3xicm90aGVyfGJ1Z2F0dGl8Y2FwaXRhbHxjYXJhdmFufGNhcmVlcnN8Y2FydGllcnxjaGFubmVsfGNoYXJpdHl8Y2hpbnRhaXxjaXRhZGVsfGNsdWJtZWR8Y29sbGVnZXxjb2xvZ25lfGNvbWNhc3R8Y29tcGFueXxjb21wYXJlfGNvbnRhY3R8Y29va2luZ3xjb3JzaWNhfGNvdW50cnl8Y291cG9uc3xjb3Vyc2VzfGNyaWNrZXR8Y3J1aXNlc3xkZW50aXN0fGRpZ2l0YWx8ZG9tYWluc3xleHBvc2VkfGV4cHJlc3N8ZmFybWVyc3xmYXNoaW9ufGZlcnJhcml8ZmVycmVyb3xmaW5hbmNlfGZpc2hpbmd8Zml0bmVzc3xmbGlnaHRzfGZsb3Jpc3R8Zmxvd2Vyc3xmb3JzYWxlfGZyb2dhbnN8ZnVqaXRzdXxnYWxsZXJ5fGdlbnRpbmd8Z29kYWRkeXxncm9jZXJ5fGd1aXRhcnN8aGFtYnVyZ3xoYW5nb3V0fGhpdGFjaGl8aG9saWRheXxob3N0aW5nfGhvdGVsZXN8aG90bWFpbHxoeXVuZGFpfGlzZWxlY3R8aXNtYWlsaXxqZXdlbHJ5fGp1bmlwZXJ8a2l0Y2hlbnxrb21hdHN1fGxhY2FpeGF8bGFuY29tZXxsYW54ZXNzfGxhc2FsbGV8bGF0cm9iZXxsZWNsZXJjfGxpYWlzb258bGltaXRlZHxsaW5jb2xufG1hcmtldHN8bWV0bGlmZXxtb25zdGVyfG5ldGJhbmt8bmV0ZmxpeHxuZXR3b3JrfG5ldXN0YXJ8b2tpbmF3YXxvbGRuYXZ5fG9yZ2FuaWN8b3JpZ2luc3xwaGlsaXBzfHBpb25lZXJ8cG9saXRpZXxyZWFsdG9yfHJlY2lwZXN8cmVudGFsc3xyZXZpZXdzfHJleHJvdGh8c2Ftc3VuZ3xzYW5kdmlrfHNjaG1pZHR8c2Nod2FyenxzY2llbmNlfHNoaWtzaGF8c2hyaXJhbXxzaW5nbGVzfHN0YXBsZXN8c3Rhcmh1YnxzdG9yYWdlfHN1cHBvcnR8c3VyZ2VyeXxzeXN0ZW1zfHRlbWFzZWt8dGhlYXRlcnx0aGVhdHJlfHRpY2tldHN8dGlmZmFueXx0b3NoaWJhfHRyYWRpbmd8d2FsbWFydHx3YW5nZ291fHdhdGNoZXN8d2VhdGhlcnx3ZWJzaXRlfHdlZGRpbmd8d2hvc3dob3x3aW5kb3dzfHdpbm5lcnN8eGZpbml0eXx5YW1heHVufHlvdXR1YmV8enVlcmljaHzQutCw0YLQvtC70LjQunzYp9iq2LXYp9mE2KfYqnzYp9mE2KzYstin2KbYsXzYp9mE2LnZhNmK2KfZhnzZvtin2qnYs9iq2KfZhnzZg9in2KvZiNmE2YrZg3zZhdmI2KjYp9mK2YTZinzgrofgrqjgr43grqTgrr/grq/grr58YWJhcnRofGFiYm90dHxhYmJ2aWV8YWN0aXZlfGFmcmljYXxhZ2VuY3l8YWlyYnVzfGFpcnRlbHxhbGlwYXl8YWxzYWNlfGFsc3RvbXxhbnF1YW58YXJhbWNvfGF1dGhvcnxiYXllcm58YmVhdXR5fGJlcmxpbnxiaGFydGl8YmxhbmNvfGJvc3Rpa3xib3N0b258YnJva2VyfGNhbWVyYXxjYXJlZXJ8Y2FzZWlofGNhc2lub3xjZW50ZXJ8Y2hhbmVsfGNocm9tZXxjaHVyY2h8Y2lyY2xlfGNsYWltc3xjbGluaWN8Y29mZmVlfGNvbXNlY3xjb25kb3N8Y291cG9ufGNyZWRpdHxjcnVpc2V8ZGF0aW5nfGRhdHN1bnxkZWFsZXJ8ZGVncmVlfGRlbnRhbHxkZXNpZ258ZGlyZWN0fGRvY3RvcnxkdW5sb3B8ZHVwb250fGR1cmJhbnxlbWVyY2t8ZW5lcmd5fGVzdGF0ZXxldmVudHN8ZXhwZXJ0fGZhbWlseXxmbGlja3J8ZnV0Ym9sfGdhbGx1cHxnYXJkZW58Z2VvcmdlfGdpdmluZ3xnbG9iYWx8Z29vZ2xlfGdyYXRpc3xoZWFsdGh8aGVybWVzfGhpcGhvcHxob2NrZXl8aG90ZWxzfGh1Z2hlc3xpbWFtYXR8aW5zdXJlfGludHVpdHxqYWd1YXJ8am9idXJnfGp1ZWdvc3xrYXVmZW58a2luZGVyfGtpbmRsZXxrb3NoZXJ8bGFuY2lhfGxhdGlub3xsYXd5ZXJ8bGVmcmFrfGxpdmluZ3xsb2NrZXJ8bG9uZG9ufGx1eHVyeXxtYWRyaWR8bWFpc29ufG1ha2V1cHxtYXJrZXR8bWF0dGVsfG1vYmlsZXxtb2JpbHl8bW9uYXNofG1vcm1vbnxtb3Njb3d8bXVzZXVtfG11dHVhbHxuYWdveWF8bmF0dXJhfG5pc3NhbnxuaXNzYXl8bm9ydG9ufG5vd3J1enxvZmZpY2V8b2xheWFufG9ubGluZXxvcmFjbGV8b3JhbmdlfG90c3VrYXxwZml6ZXJ8cGhvdG9zfHBoeXNpb3xwaWFnZXR8cGljdGV0fHF1ZWJlY3xyYWNpbmd8cmVhbHR5fHJlaXNlbnxyZXBhaXJ8cmVwb3J0fHJldmlld3xyb2NoZXJ8cm9nZXJzfHJ5dWt5dXxzYWZldHl8c2FrdXJhfHNhbm9maXxzY2hvb2x8c2NodWxlfHNlYXJjaHxzZWN1cmV8c2VsZWN0fHNob3VqaXxzb2NjZXJ8c29jaWFsfHN0cmVhbXxzdHVkaW98c3VwcGx5fHN1enVraXxzd2F0Y2h8c3lkbmV5fHRhaXBlaXx0YW9iYW98dGFyZ2V0fHRhdHRvb3x0ZW5uaXN8dGllbmRhfHRqbWF4eHx0a21heHh8dG95b3RhfHRyYXZlbHx1bmljb218dmlhamVzfHZpa2luZ3x2aWxsYXN8dmlyZ2lufHZpc2lvbnx2b3Rpbmd8dm95YWdlfHZ1ZWxvc3x3YWx0ZXJ8d2FybWFufHdlYmNhbXx4aWh1YW58eWFjaHRzfHlhbmRleHx6YXBwb3N80LzQvtGB0LrQstCwfNC+0L3Qu9Cw0LnQvXzYp9io2YjYuNio2Yp82KfYsdin2YXZg9mIfNin2YTYp9ix2K/ZhnzYp9mE2YXYutix2Kh82KfZhdin2LHYp9iqfNmB2YTYs9i32YrZhnzZhdmE2YrYs9mK2Kd84KSt4KS+4KSw4KSk4KSu4KWNfOCuh+CusuCumeCvjeCuleCviHzjg5XjgqHjg4Pjgrfjg6fjg7N8YWN0b3J8YWR1bHR8YWV0bmF8YW1mYW18YW1pY2F8YXBwbGV8YXJjaGl8YXVkaW98YXV0b3N8YXp1cmV8YmFpZHV8YmVhdHN8YmlibGV8YmluZ298YmxhY2t8Ym9hdHN8Ym9zY2h8YnVpbGR8Y2Fub258Y2FyZHN8Y2hhc2V8Y2hlYXB8Y2lzY298Y2l0aWN8Y2xpY2t8Y2xvdWR8Y29hY2h8Y29kZXN8Y3Jvd258Y3ltcnV8ZGFidXJ8ZGFuY2V8ZGVhbHN8ZGVsdGF8ZG9kZ2V8ZHJpdmV8ZHViYWl8ZWFydGh8ZWRla2F8ZW1haWx8ZXBvc3R8ZXBzb258ZmFpdGh8ZmVkZXh8ZmluYWx8Zm9yZXh8Zm9ydW18Z2FsbG98Z2FtZXN8Z2lmdHN8Z2l2ZXN8Z2xhZGV8Z2xhc3N8Z2xvYm98Z21haWx8Z3JlZW58Z3JpcGV8Z3JvdXB8Z3VjY2l8Z3VpZGV8aG9tZXN8aG9uZGF8aG9yc2V8aG91c2V8aHlhdHR8aWthbm98aW50ZWx8aXJpc2h8aXZlY298amV0enR8a29lbG58a3lvdG98bGFtZXJ8bGVhc2V8bGVnYWx8bGV4dXN8bGlsbHl8bGluZGV8bGlwc3l8bGl4aWx8bG9hbnN8bG9jdXN8bG90dGV8bG90dG98bHVwaW58bWFjeXN8bWFuZ298bWVkaWF8bWlhbWl8bW9uZXl8bW9wYXJ8bW92aWV8bmFkZXh8bmV4dXN8bmlrb258bmluamF8bm9raWF8bm93dHZ8b21lZ2F8b3Nha2F8cGFyaXN8cGFydHN8cGFydHl8cGhvbmV8cGhvdG98cGl6emF8cGxhY2V8cG9rZXJ8cHJheGl8cHJlc3N8cHJpbWV8cHJvbW98cXVlc3R8cmFkaW98cmVoYWJ8cmVpc2V8cmljb2h8cm9ja3N8cm9kZW98cnVnYnl8c2Fsb258c2VuZXJ8c2V2ZW58c2hhcnB8c2hlbGx8c2hvZXN8c2t5cGV8c2xpbmd8c21hcnR8c21pbGV8c29sYXJ8c3BhY2V8c3BvcnR8c3RhZGF8c3RvcmV8c3R1ZHl8c3R5bGV8c3Vja3N8c3dpc3N8dGF0YXJ8dGlyZXN8dGlyb2x8dG1hbGx8dG9kYXl8dG9reW98dG9vbHN8dG9yYXl8dG90YWx8dG91cnN8dHJhZGV8dHJ1c3R8dHVuZXN8dHVzaHV8dWJhbmt8dmVnYXN8dmlkZW98dm9ka2F8dm9sdm98d2FsZXN8d2F0Y2h8d2ViZXJ8d2VpYm98d29ya3N8d29ybGR8eGVyb3h8eWFob298emlwcG982KfbjNix2KfZhnzYqNin2LLYp9ixfNio2r7Yp9ix2Kp82LPZiNiv2KfZhnzYs9mI2LHZitipfNmH2YXYsdin2Yd84KSt4KS+4KSw4KWL4KSkfOCkuOCkguCkl+CkoOCkqHzgpqzgpr7gpoLgprLgpr584LCt4LC+4LCw4LCk4LGNfOC0reC0vuC0sOC0pOC0gnzlmInph4zlpKfphZLlupd8YWFycHxhYmxlfGFkYWN8YWVyb3xhaWdvfGFrZG58YWxseXxhbWV4fGFyYWJ8YXJteXxhcnBhfGFydGV8YXNkYXxhc2lhfGF1ZGl8YXV0b3xiYWJ5fGJhbmR8YmFua3xiYnZhfGJlZXJ8YmVzdHxiaWtlfGJpbmd8YmxvZ3xibHVlfGJvZmF8Ym9uZHxib29rfGJ1enp8Y2FmZXxjYWxsfGNhbXB8Y2FyZXxjYXJzfGNhc2F8Y2FzZXxjYXNofGNicmV8Y2VybnxjaGF0fGNpdGl8Y2l0eXxjbHVifGNvb2x8Y29vcHxjeW91fGRhdGF8ZGF0ZXxkY2xrfGRlYWx8ZGVsbHxkZXNpfGRpZXR8ZGlzaHxkb2NzfGRvaGF8ZHVja3xkdW5zfGR2YWd8ZXJuaXxmYWdlfGZhaWx8ZmFuc3xmYXJtfGZhc3R8ZmlhdHxmaWRvfGZpbG18ZmlyZXxmaXNofGZsaXJ8Zm9vZHxmb3JkfGZyZWV8ZnVuZHxnYW1lfGdiaXp8Z2VudHxnZ2VlfGdpZnR8Z21iaHxnb2xkfGdvbGZ8Z29vZ3xndWdlfGd1cnV8aGFpcnxoYXVzfGhkZmN8aGVscHxoZXJlfGhndHZ8aG9zdHxoc2JjfGljYmN8aWVlZXxpbWRifGltbW98aW5mb3xpdGF1fGphdmF8amVlcHxqb2JzfGpwcnN8a2RkaXxraXdpfGtwbWd8a3JlZHxsYW5kfGxlZ298bGdidHxsaWRsfGxpZmV8bGlrZXxsaW1vfGxpbmt8bGl2ZXxsb2FufGxvZnR8bG92ZXxsdGRhfGx1eGV8bWFpZnxtZWV0fG1lbWV8bWVudXxtaW5pfG1pbnR8bW9iaXxtb2RhfG1vdG98bmFtZXxuYXZ5fG5ld3N8bmV4dHxuaWNvfG5pa2V8b2xsb3xvcGVufHBhZ2V8cGFyc3xwY2N3fHBpY3N8cGluZ3xwaW5rfHBsYXl8cGx1c3xwb2hsfHBvcm58cG9zdHxwcm9kfHByb2Z8cXBvbnxyYWlkfHJlYWR8cmVpdHxyZW50fHJlc3R8cmljaHxybWl0fHJvb218cnN2cHxydWhyfHNhZmV8c2FsZXxzYXJsfHNhdmV8c2F4b3xzY29yfHNjb3R8c2VhdHxzZWVrfHNleHl8c2hhd3xzaGlhfHNob3B8c2hvd3xzaWxrfHNpbmF8c2l0ZXxza2lufHNuY2Z8c29odXxzb25nfHNvbnl8c3BvdHxzdGFyfHN1cmZ8dGFsa3x0YXhpfHRlYW18dGVjaHx0ZXZhfHRpYWF8dGlwc3x0b3dufHRveXN8dHViZXx2YW5hfHZpc2F8dml2YXx2aXZvfHZvdGV8dm90b3x3YW5nfHdlaXJ8d2llbnx3aWtpfHdpbmV8d29ya3x4Ym94fHlvZ2F8emFyYXx6ZXJvfHpvbmV80LTQtdGC0Lh80YHQsNC50YJ82KjYp9ix2Kp82KjZitiq2YN82oDYp9ix2Kp82KrZiNmG2LN82LTYqNmD2Kl82LnYsdin2YJ82LnZhdin2YZ82YXZiNmC2Ll84KSt4KS+4KSw4KSkfOCmreCmvuCmsOCmpHzgpq3gpr7gp7DgpqR84Kit4Ki+4Kiw4KikfOCqreCqvuCqsOCqpHzgrK3grL7grLDgrKR84LKt4LK+4LKw4LKkfOC2veC2guC2muC3j3zjgrDjg7zjgrDjg6t844Kv44Op44Km44OJfOODneOCpOODs+ODiHzlpKfkvJfmsb3ovaZ857uE57uH5py65p6EfOmbu+ioiuebiOenkXzpppnmoLzph4zmi4l8YWFhfGFiYnxhYmN8YWNvfGFkc3xhZWd8YWZsfGFpZ3xhbnp8YW9sfGFwcHxhcnR8YXdzfGF4YXxiYXJ8YmJjfGJidHxiY2d8YmNufGJldHxiaWR8YmlvfGJpenxibXN8Ym13fGJubHxib218Ym9vfGJvdHxib3h8YnV5fGJ6aHxjYWJ8Y2FsfGNhbXxjYXJ8Y2F0fGNiYXxjYm58Y2JzfGNlYnxjZW98Y2ZhfGNmZHxjb218Y3JzfGNzY3xkYWR8ZGF5fGRkc3xkZXZ8ZGhsfGRpeXxkbnB8ZG9nfGRvdHxkdHZ8ZHZyfGVhdHxlY298ZWR1fGVzcXxldXN8ZmFufGZpdHxmbHl8Zm9vfGZveHxmcmx8ZnRyfGZ1bnxmeWl8Z2FsfGdhcHxnZG58Z2VhfGdsZXxnbW98Z214fGdvb3xnb3B8Z290fGdvdnxoYm98aGl2fGhrdHxob3R8aG93fGlibXxpY2V8aWN1fGlmbXxpbmN8aW5nfGlua3xpbnR8aXN0fGl0dnxqY2J8amNwfGppb3xqbGx8am1wfGpuanxqb3R8am95fGtmaHxraWF8a2ltfGtwbnxrcmR8bGF0fGxhd3xsZHN8bGxjfGxvbHxscGx8bHRkfG1hbnxtYXB8bWJhfG1lZHxtZW58bWlsfG1pdHxtbGJ8bWxzfG1tYXxtb2V8bW9pfG1vbXxtb3Z8bXNkfG10bnxtdHJ8bmFifG5iYXxuZWN8bmV0fG5ld3xuZmx8bmdvfG5oa3xub3d8bnJhfG5yd3xudHR8bnljfG9iaXxvZmZ8b25lfG9uZ3xvbmx8b29vfG9yZ3xvdHR8b3ZofHBheXxwZXR8cGhkfHBpZHxwaW58cG5jfHByb3xwcnV8cHVifHB3Y3xxdmN8cmVkfHJlbnxyaWx8cmlvfHJpcHxydW58cndlfHNhcHxzYXN8c2JpfHNic3xzY2F8c2NifHNlc3xzZXd8c2V4fHNmcnxza2l8c2t5fHNveXxzcmx8c3J0fHN0Y3x0YWJ8dGF4fHRjaXx0ZGt8dGVsfHRoZHx0anh8dG9wfHRydnx0dWl8dHZzfHVic3x1bm98dW9sfHVwc3x2ZXR8dmlnfHZpbnx2aXB8d2VkfHdpbnx3bWV8d293fHd0Y3x3dGZ8eGlufHh4eHx4eXp8eW91fHl1bnx6aXB80LHQtdC7fNC60L7QvHzSm9Cw0Ld80LzQutC0fNC80L7QvXzQvtGA0LN80YDRg9GBfNGB0YDQsXzRg9C60YB81bDVodW1fNen15XXnXzYudix2Kh82YLYt9ixfNmD2YjZhXzZhdi12LF84KSV4KWJ4KSufOCkqOClh+Ckn3zguITguK3guKF84LmE4LiX4LiifOOCueODiOOConzjgrvjg7zjg6t844G/44KT44GqfOS4reaWh+e9kXzlpKnkuLvmlZl85oiR54ix5L2gfOaWsOWKoOWdoXzmt6HpqazplKF86K+65Z+65LqafOmjnuWIqea1pnxhY3xhZHxhZXxhZnxhZ3xhaXxhbHxhbXxhb3xhcXxhcnxhc3xhdHxhdXxhd3xheHxhenxiYXxiYnxiZHxiZXxiZnxiZ3xiaHxiaXxianxibXxibnxib3xicnxic3xidHxidnxid3xieXxienxjYXxjY3xjZHxjZnxjZ3xjaHxjaXxja3xjbHxjbXxjbnxjb3xjcnxjdXxjdnxjd3xjeHxjeXxjenxkZXxkanxka3xkbXxkb3xkenxlY3xlZXxlZ3xlcnxlc3xldHxldXxmaXxmanxma3xmbXxmb3xmcnxnYXxnYnxnZHxnZXxnZnxnZ3xnaHxnaXxnbHxnbXxnbnxncHxncXxncnxnc3xndHxndXxnd3xneXxoa3xobXxobnxocnxodHxodXxpZHxpZXxpbHxpbXxpbnxpb3xpcXxpcnxpc3xpdHxqZXxqbXxqb3xqcHxrZXxrZ3xraHxraXxrbXxrbnxrcHxrcnxrd3xreXxrenxsYXxsYnxsY3xsaXxsa3xscnxsc3xsdHxsdXxsdnxseXxtYXxtY3xtZHxtZXxtZ3xtaHxta3xtbHxtbXxtbnxtb3xtcHxtcXxtcnxtc3xtdHxtdXxtdnxtd3xteHxteXxtenxuYXxuY3xuZXxuZnxuZ3xuaXxubHxub3xucHxucnxudXxuenxvbXxwYXxwZXxwZnxwZ3xwaHxwa3xwbHxwbXxwbnxwcnxwc3xwdHxwd3xweXxxYXxyZXxyb3xyc3xydXxyd3xzYXxzYnxzY3xzZHxzZXxzZ3xzaHxzaXxzanxza3xzbHxzbXxzbnxzb3xzcnxzdHxzdXxzdnxzeHxzeXxzenx0Y3x0ZHx0Znx0Z3x0aHx0anx0a3x0bHx0bXx0bnx0b3x0cnx0dHx0dnx0d3x0enx1YXx1Z3x1a3x1c3x1eXx1enx2YXx2Y3x2ZXx2Z3x2aXx2bnx2dXx3Znx3c3x5ZXx5dHx6YXx6bXx6d3zOtc67fNCx0LN80LXRjnzRgNGEfOGDkuGDlHzri7frhLd864u37Lu0fOyCvOyEsXztlZzqta1844Kz44OgfOS4lueVjHzkuK3kv6F85Lit5Zu9fOS4reWci3zkvIHkuJp85L2b5bGxfOS/oeaBr3zlgaXlurd85YWr5Y2mfOWFrOWPuHzlhaznm4p85Y+w5rm+fOWPsOeBo3zllYbln4585ZWG5bqXfOWVhuagh3zlmInph4x85Zyo57q/fOWkp+aLv3zlqLHkuZB85a626Zu7fOW3peihjHzlub/kuJx85b6u5Y2afOaFiOWWhHzmiYvmnLp85omL6KGofOaLm+iBmHzmlL/liqF85pS/5bqcfOaWsOmXu3zml7blsJp85pu457GNfOacuuaehHzmuLjmiI985r6z6ZaAfOeCueeci3znj6Dlrp1856e75YqofOe9keWdgHznvZHlupd8572R56uZfOe9kee7nHzogZTpgJp86LC35q2MfOi0reeJqXzpgJrosql86ZuG5ZuifOmjn+WTgXzppJDljoV86aaZ5rivKS8sRj1uZXcgUmVnRXhwKCJbIitQKyIhIyQlJicqKy89P15fYHt8fX4tXSIpLFU9bmV3IFJlZ0V4cCgiXiIrQi5zb3VyY2UrIiQiKSxxPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXt2YXIgdD1udWxsIT09ZSYmZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIHQubG9jYWxQYXJ0Q2hhclJlZ2V4PUYsdC5zdHJpY3RUbGRSZWdleD1VLHR9cmV0dXJuIGgodCxlKSx0LnByb3RvdHlwZS5wYXJzZU1hdGNoZXM9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMudGFnQnVpbGRlcixuPXRoaXMubG9jYWxQYXJ0Q2hhclJlZ2V4LHI9dGhpcy5zdHJpY3RUbGRSZWdleCxvPVtdLGE9ZS5sZW5ndGgsaT1uZXcgeixzPXttOiJhIixhOiJpIixpOiJsIixsOiJ0Iix0OiJvIixvOiI6In0sYz0wLGw9MCxwPWk7YzxhOyl7dmFyIGY9ZS5jaGFyQXQoYyk7c3dpdGNoKGwpe2Nhc2UgMDpoKGYpO2JyZWFrO2Nhc2UgMTptKGUuY2hhckF0KGMtMSksZik7YnJlYWs7Y2FzZSAyOmcoZik7YnJlYWs7Y2FzZSAzOnkoZik7YnJlYWs7Y2FzZSA0OmIoZik7YnJlYWs7Y2FzZSA1Ol8oZik7YnJlYWs7Y2FzZSA2OncoZik7YnJlYWs7Y2FzZSA3OngoZik7YnJlYWs7ZGVmYXVsdDp1KGwpfWMrK31yZXR1cm4gQygpLG87ZnVuY3Rpb24gaChlKXsibSI9PT1lP0UoMSk6bi50ZXN0KGUpJiZFKCl9ZnVuY3Rpb24gbShlLHQpeyI6Ij09PWU/bi50ZXN0KHQpPyhsPTIscD1uZXcgeihkKHt9LHAse2hhc01haWx0b1ByZWZpeDohMH0pKSk6UygpOnNbZV09PT10fHwobi50ZXN0KHQpP2w9MjoiLiI9PT10P2w9MzoiQCI9PT10P2w9NDpTKCkpfWZ1bmN0aW9uIGcoZSl7Ii4iPT09ZT9sPTM6IkAiPT09ZT9sPTQ6bi50ZXN0KGUpfHxTKCl9ZnVuY3Rpb24geShlKXsiLiI9PT1lfHwiQCI9PT1lP1MoKTpuLnRlc3QoZSk/bD0yOlMoKX1mdW5jdGlvbiBiKGUpe0wudGVzdChlKT9sPTU6UygpfWZ1bmN0aW9uIF8oZSl7Ii4iPT09ZT9sPTc6Ii0iPT09ZT9sPTY6TC50ZXN0KGUpfHxDKCl9ZnVuY3Rpb24gdyhlKXsiLSI9PT1lfHwiLiI9PT1lP0MoKTpMLnRlc3QoZSk/bD01OkMoKX1mdW5jdGlvbiB4KGUpeyIuIj09PWV8fCItIj09PWU/QygpOkwudGVzdChlKT8obD01LHA9bmV3IHooZCh7fSxwLHtoYXNEb21haW5Eb3Q6ITB9KSkpOkMoKX1mdW5jdGlvbiBFKGUpe3ZvaWQgMD09PWUmJihlPTIpLGw9ZSxwPW5ldyB6KHtpZHg6Y30pfWZ1bmN0aW9uIFMoKXtsPTAscD1pfWZ1bmN0aW9uIEMoKXtpZihwLmhhc0RvbWFpbkRvdCl7dmFyIG49ZS5zbGljZShwLmlkeCxjKTsvWy0uXSQvLnRlc3QobikmJihuPW4uc2xpY2UoMCwtMSkpO3ZhciBhPXAuaGFzTWFpbHRvUHJlZml4P24uc2xpY2UoIm1haWx0bzoiLmxlbmd0aCk6bjsoZnVuY3Rpb24oZSl7dmFyIHQ9KGUuc3BsaXQoIi4iKS5wb3AoKXx8IiIpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHIudGVzdCh0KX0pKGEpJiZvLnB1c2gobmV3IHYoe3RhZ0J1aWxkZXI6dCxtYXRjaGVkVGV4dDpuLG9mZnNldDpwLmlkeCxlbWFpbDphfSkpfVMoKX19LHR9KHcpLHo9ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9e30pLHRoaXMuaWR4PXZvaWQgMCE9PWUuaWR4P2UuaWR4Oi0xLHRoaXMuaGFzTWFpbHRvUHJlZml4PSEhZS5oYXNNYWlsdG9QcmVmaXgsdGhpcy5oYXNEb21haW5Eb3Q9ISFlLmhhc0RvbWFpbkRvdH0sVj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt9cmV0dXJuIGUuaXNWYWxpZD1mdW5jdGlvbihlLHQpe3JldHVybiEodCYmIXRoaXMuaXNWYWxpZFVyaVNjaGVtZSh0KXx8dGhpcy51cmxNYXRjaERvZXNOb3RIYXZlUHJvdG9jb2xPckRvdChlLHQpfHx0aGlzLnVybE1hdGNoRG9lc05vdEhhdmVBdExlYXN0T25lV29yZENoYXIoZSx0KSYmIXRoaXMuaXNWYWxpZElwQWRkcmVzcyhlKXx8dGhpcy5jb250YWluc011bHRpcGxlRG90cyhlKSl9LGUuaXNWYWxpZElwQWRkcmVzcz1mdW5jdGlvbihlKXt2YXIgdD1uZXcgUmVnRXhwKHRoaXMuaGFzRnVsbFByb3RvY29sUmVnZXguc291cmNlK3RoaXMuaXBSZWdleC5zb3VyY2UpO3JldHVybiBudWxsIT09ZS5tYXRjaCh0KX0sZS5jb250YWluc011bHRpcGxlRG90cz1mdW5jdGlvbihlKXt2YXIgdD1lO3JldHVybiB0aGlzLmhhc0Z1bGxQcm90b2NvbFJlZ2V4LnRlc3QoZSkmJih0PWUuc3BsaXQoIjovLyIpWzFdKSx0LnNwbGl0KCIvIilbMF0uaW5kZXhPZigiLi4iKT4tMX0sZS5pc1ZhbGlkVXJpU2NoZW1lPWZ1bmN0aW9uKGUpe3ZhciB0PWUubWF0Y2godGhpcy51cmlTY2hlbWVSZWdleCksbj10JiZ0WzBdLnRvTG93ZXJDYXNlKCk7cmV0dXJuImphdmFzY3JpcHQ6IiE9PW4mJiJ2YnNjcmlwdDoiIT09bn0sZS51cmxNYXRjaERvZXNOb3RIYXZlUHJvdG9jb2xPckRvdD1mdW5jdGlvbihlLHQpe3JldHVybiEoIWV8fHQmJnRoaXMuaGFzRnVsbFByb3RvY29sUmVnZXgudGVzdCh0KXx8LTEhPT1lLmluZGV4T2YoIi4iKSl9LGUudXJsTWF0Y2hEb2VzTm90SGF2ZUF0TGVhc3RPbmVXb3JkQ2hhcj1mdW5jdGlvbihlLHQpe3JldHVybiEoIWV8fCF0KSYmKCF0aGlzLmhhc0Z1bGxQcm90b2NvbFJlZ2V4LnRlc3QodCkmJiF0aGlzLmhhc1dvcmRDaGFyQWZ0ZXJQcm90b2NvbFJlZ2V4LnRlc3QoZSkpfSxlLmhhc0Z1bGxQcm90b2NvbFJlZ2V4PS9eW0EtWmEtel1bLS4rQS1aYS16MC05XSo6XC9cLy8sZS51cmlTY2hlbWVSZWdleD0vXltBLVphLXpdWy0uK0EtWmEtejAtOV0qOi8sZS5oYXNXb3JkQ2hhckFmdGVyUHJvdG9jb2xSZWdleD1uZXcgUmVnRXhwKCI6W15cXHNdKj9bIitrKyJdIiksZS5pcFJlZ2V4PS9bMC05XVswLTldP1swLTldP1wuWzAtOV1bMC05XT9bMC05XT9cLlswLTldWzAtOV0/WzAtOV0/XC5bMC05XVswLTldP1swLTldPyg6WzAtOV0qKT9cLz8kLyxlfSgpLFc9KG09bmV3IFJlZ0V4cCgiWy8/I10oPzpbIitQKyJcXC0rJkAjLyU9fl8oKXwnJCpcXFtcXF17fT8hOiwuO17inJNdKlsiK1ArIlxcLSsmQCMvJT1+XygpfCckKlxcW1xcXXt94pyTXSk/IiksbmV3IFJlZ0V4cChbIig/OiIsIigiLC8oPzpbQS1aYS16XVstLitBLVphLXowLTldezAsNjN9Oig/IVtBLVphLXpdWy0uK0EtWmEtejAtOV17MCw2M306XC9cLykoPyFcZCtcLz8pKD86XC9cLyk/KS8uc291cmNlLEQoMiksIikiLCJ8IiwiKCIsIigvLyk/IiwvKD86d3d3XC4pLy5zb3VyY2UsRCg2KSwiKSIsInwiLCIoIiwiKC8vKT8iLEQoMTApKyJcXC4iLEIuc291cmNlLCIoPyFbLSIrSSsiXSkiLCIpIiwiKSIsIig/OjpbMC05XSspPyIsIig/OiIrbS5zb3VyY2UrIik/Il0uam9pbigiIiksImdpIikpLEg9bmV3IFJlZ0V4cCgiWyIrUCsiXSIpLCQ9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXt2YXIgbj1lLmNhbGwodGhpcyx0KXx8dGhpcztyZXR1cm4gbi5zdHJpcFByZWZpeD17c2NoZW1lOiEwLHd3dzohMH0sbi5zdHJpcFRyYWlsaW5nU2xhc2g9ITAsbi5kZWNvZGVQZXJjZW50RW5jb2Rpbmc9ITAsbi5tYXRjaGVyUmVnZXg9VyxuLndvcmRDaGFyUmVnRXhwPUgsbi5zdHJpcFByZWZpeD10LnN0cmlwUHJlZml4LG4uc3RyaXBUcmFpbGluZ1NsYXNoPXQuc3RyaXBUcmFpbGluZ1NsYXNoLG4uZGVjb2RlUGVyY2VudEVuY29kaW5nPXQuZGVjb2RlUGVyY2VudEVuY29kaW5nLG59cmV0dXJuIGgodCxlKSx0LnByb3RvdHlwZS5wYXJzZU1hdGNoZXM9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49dGhpcy5tYXRjaGVyUmVnZXgscj10aGlzLnN0cmlwUHJlZml4LG89dGhpcy5zdHJpcFRyYWlsaW5nU2xhc2gsYT10aGlzLmRlY29kZVBlcmNlbnRFbmNvZGluZyxpPXRoaXMudGFnQnVpbGRlcixzPVtdLHU9ZnVuY3Rpb24oKXt2YXIgbj10WzBdLHU9dFsxXSxsPXRbNF0scD10WzVdLGY9dFs5XSxoPXQuaW5kZXgsZD1wfHxmLG09ZS5jaGFyQXQoaC0xKTtpZighVi5pc1ZhbGlkKG4sdSkpcmV0dXJuImNvbnRpbnVlIjtpZihoPjAmJiJAIj09PW0pcmV0dXJuImNvbnRpbnVlIjtpZihoPjAmJmQmJmMud29yZENoYXJSZWdFeHAudGVzdChtKSlyZXR1cm4iY29udGludWUiO2lmKC9cPyQvLnRlc3QobikmJihuPW4uc3Vic3RyKDAsbi5sZW5ndGgtMSkpLGMubWF0Y2hIYXNVbmJhbGFuY2VkQ2xvc2luZ1BhcmVuKG4pKW49bi5zdWJzdHIoMCxuLmxlbmd0aC0xKTtlbHNle3ZhciB2PWMubWF0Y2hIYXNJbnZhbGlkQ2hhckFmdGVyVGxkKG4sdSk7dj4tMSYmKG49bi5zdWJzdHIoMCx2KSl9dmFyIGc9WyJodHRwOi8vIiwiaHR0cHM6Ly8iXS5maW5kKChmdW5jdGlvbihlKXtyZXR1cm4hIXUmJi0xIT09dS5pbmRleE9mKGUpfSkpO2lmKGcpe3ZhciB5PW4uaW5kZXhPZihnKTtuPW4uc3Vic3RyKHkpLHU9dS5zdWJzdHIoeSksaCs9eX12YXIgYj11PyJzY2hlbWUiOmw/Ind3dyI6InRsZCIsdz0hIXU7cy5wdXNoKG5ldyBfKHt0YWdCdWlsZGVyOmksbWF0Y2hlZFRleHQ6bixvZmZzZXQ6aCx1cmxNYXRjaFR5cGU6Yix1cmw6bixwcm90b2NvbFVybE1hdGNoOncscHJvdG9jb2xSZWxhdGl2ZU1hdGNoOiEhZCxzdHJpcFByZWZpeDpyLHN0cmlwVHJhaWxpbmdTbGFzaDpvLGRlY29kZVBlcmNlbnRFbmNvZGluZzphfSkpfSxjPXRoaXM7bnVsbCE9PSh0PW4uZXhlYyhlKSk7KXUoKTtyZXR1cm4gc30sdC5wcm90b3R5cGUubWF0Y2hIYXNVbmJhbGFuY2VkQ2xvc2luZ1BhcmVuPWZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5jaGFyQXQoZS5sZW5ndGgtMSk7aWYoIikiPT09bil0PSIoIjtlbHNlIGlmKCJdIj09PW4pdD0iWyI7ZWxzZXtpZigifSIhPT1uKXJldHVybiExO3Q9InsifWZvcih2YXIgcj0wLG89MCxhPWUubGVuZ3RoLTE7bzxhO28rKyl7dmFyIGk9ZS5jaGFyQXQobyk7aT09PXQ/cisrOmk9PT1uJiYocj1NYXRoLm1heChyLTEsMCkpfXJldHVybiAwPT09cn0sdC5wcm90b3R5cGUubWF0Y2hIYXNJbnZhbGlkQ2hhckFmdGVyVGxkPWZ1bmN0aW9uKGUsdCl7aWYoIWUpcmV0dXJuLTE7dmFyIG49MDt0JiYobj1lLmluZGV4T2YoIjoiKSxlPWUuc2xpY2UobikpO3ZhciByPW5ldyBSZWdFeHAoIl4oKC4/Ly8pP1stLiIrUCsiXSpbLSIrUCsiXVxcLlstIitQKyJdKykiKS5leGVjKGUpO3JldHVybiBudWxsPT09cj8tMToobis9clsxXS5sZW5ndGgsZT1lLnNsaWNlKHJbMV0ubGVuZ3RoKSwvXlteLS5BLVphLXowLTk6XC8/I10vLnRlc3QoZSk/bjotMSl9LHR9KHcpLEo9bmV3IFJlZ0V4cCgiI1tfIitQKyJdezEsMTM5fSg/IVtfIitQKyJdKSIsImciKSxLPW5ldyBSZWdFeHAoIlteIitQKyJdIiksWT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQpe3ZhciBuPWUuY2FsbCh0aGlzLHQpfHx0aGlzO3JldHVybiBuLnNlcnZpY2VOYW1lPSJ0d2l0dGVyIixuLm1hdGNoZXJSZWdleD1KLG4ubm9uV29yZENoYXJSZWdleD1LLG4uc2VydmljZU5hbWU9dC5zZXJ2aWNlTmFtZSxufXJldHVybiBoKHQsZSksdC5wcm90b3R5cGUucGFyc2VNYXRjaGVzPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPXRoaXMubWF0Y2hlclJlZ2V4LHI9dGhpcy5ub25Xb3JkQ2hhclJlZ2V4LG89dGhpcy5zZXJ2aWNlTmFtZSxhPXRoaXMudGFnQnVpbGRlcixpPVtdO251bGwhPT0odD1uLmV4ZWMoZSkpOyl7dmFyIHM9dC5pbmRleCx1PWUuY2hhckF0KHMtMSk7aWYoMD09PXN8fHIudGVzdCh1KSl7dmFyIGM9dFswXSxsPXRbMF0uc2xpY2UoMSk7aS5wdXNoKG5ldyBnKHt0YWdCdWlsZGVyOmEsbWF0Y2hlZFRleHQ6YyxvZmZzZXQ6cyxzZXJ2aWNlTmFtZTpvLGhhc2h0YWc6bH0pKX19cmV0dXJuIGl9LHR9KHcpLEc9Lyg/Oig/Oig/OihcKyk/XGR7MSwzfVstXDA0MC5dPyk/XCg/XGR7M31cKT9bLVwwNDAuXT9cZHszfVstXDA0MC5dP1xkezR9KXwoPzooXCspKD86OVs5NzZdXGR8OFs5ODc1MzBdXGR8Nls5ODddXGR8NVs5MF1cZHw0MlxkfDNbODc1XVxkfDJbOTg2NTQzMjFdXGR8OVs4NTQzMjEwXXw4WzY0MjFdfDZbNjU0MzIxMF18NVs4NzY1NDMyMV18NFs5ODc2NTQzMTBdfDNbOTY0MzIxMF18Mls3MF18N3wxKVstXDA0MC5dPyg/OlxkWy1cMDQwLl0/KXs2LDEyfVxkKykpKFssO10rWzAtOV0rIz8pKi9nLFo9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCgpe3ZhciB0PW51bGwhPT1lJiZlLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gdC5tYXRjaGVyUmVnZXg9Ryx0fXJldHVybiBoKHQsZSksdC5wcm90b3R5cGUucGFyc2VNYXRjaGVzPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPXRoaXMubWF0Y2hlclJlZ2V4LHI9dGhpcy50YWdCdWlsZGVyLG89W107bnVsbCE9PSh0PW4uZXhlYyhlKSk7KXt2YXIgYT10WzBdLGk9YS5yZXBsYWNlKC9bXjAtOSw7I10vZywiIikscz0hKCF0WzFdJiYhdFsyXSksdT0wPT10LmluZGV4PyIiOmUuc3Vic3RyKHQuaW5kZXgtMSwxKSxjPWUuc3Vic3RyKHQuaW5kZXgrYS5sZW5ndGgsMSksbD0hdS5tYXRjaCgvXGQvKSYmIWMubWF0Y2goL1xkLyk7dGhpcy50ZXN0TWF0Y2godFszXSkmJnRoaXMudGVzdE1hdGNoKGEpJiZsJiZvLnB1c2gobmV3IGIoe3RhZ0J1aWxkZXI6cixtYXRjaGVkVGV4dDphLG9mZnNldDp0LmluZGV4LG51bWJlcjppLHBsdXNTaWduOnN9KSl9cmV0dXJuIG99LHQucHJvdG90eXBlLnRlc3RNYXRjaD1mdW5jdGlvbihlKXtyZXR1cm4gUy50ZXN0KGUpfSx0fSh3KSxYPW5ldyBSZWdFeHAoIkBbXyIrUCsiXXsxLDUwfSg/IVtfIitQKyJdKSIsImciKSxRPW5ldyBSZWdFeHAoIkBbXy4iK1ArIl17MSwzMH0oPyFbXyIrUCsiXSkiLCJnIiksZWU9bmV3IFJlZ0V4cCgiQFstXy4iK1ArIl17MSw1MH0oPyFbLV8iK1ArIl0pIiwiZyIpLHRlPW5ldyBSZWdFeHAoIlteIitQKyJdIiksbmU9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0KXt2YXIgbj1lLmNhbGwodGhpcyx0KXx8dGhpcztyZXR1cm4gbi5zZXJ2aWNlTmFtZT0idHdpdHRlciIsbi5tYXRjaGVyUmVnZXhlcz17dHdpdHRlcjpYLGluc3RhZ3JhbTpRLHNvdW5kY2xvdWQ6ZWV9LG4ubm9uV29yZENoYXJSZWdleD10ZSxuLnNlcnZpY2VOYW1lPXQuc2VydmljZU5hbWUsbn1yZXR1cm4gaCh0LGUpLHQucHJvdG90eXBlLnBhcnNlTWF0Y2hlcz1mdW5jdGlvbihlKXt2YXIgdCxuPXRoaXMuc2VydmljZU5hbWUscj10aGlzLm1hdGNoZXJSZWdleGVzW3RoaXMuc2VydmljZU5hbWVdLG89dGhpcy5ub25Xb3JkQ2hhclJlZ2V4LGE9dGhpcy50YWdCdWlsZGVyLGk9W107aWYoIXIpcmV0dXJuIGk7Zm9yKDtudWxsIT09KHQ9ci5leGVjKGUpKTspe3ZhciBzPXQuaW5kZXgsdT1lLmNoYXJBdChzLTEpO2lmKDA9PT1zfHxvLnRlc3QodSkpe3ZhciBjPXRbMF0ucmVwbGFjZSgvXC4rJC9nLCIiKSxsPWMuc2xpY2UoMSk7aS5wdXNoKG5ldyB5KHt0YWdCdWlsZGVyOmEsbWF0Y2hlZFRleHQ6YyxvZmZzZXQ6cyxzZXJ2aWNlTmFtZTpuLG1lbnRpb246bH0pKX19cmV0dXJuIGl9LHR9KHcpO2Z1bmN0aW9uIHJlKGUsdCl7Zm9yKHZhciBuLHI9dC5vbk9wZW5UYWcsbz10Lm9uQ2xvc2VUYWcsYT10Lm9uVGV4dCxpPXQub25Db21tZW50LHM9dC5vbkRvY3R5cGUsYz1uZXcgb2UsbD0wLHA9ZS5sZW5ndGgsZj0wLGg9MCxtPWM7bDxwOyl7dmFyIHY9ZS5jaGFyQXQobCk7c3dpdGNoKGYpe2Nhc2UgMDpnKHYpO2JyZWFrO2Nhc2UgMTp5KHYpO2JyZWFrO2Nhc2UgMjpfKHYpO2JyZWFrO2Nhc2UgMzpiKHYpO2JyZWFrO2Nhc2UgNDp3KHYpO2JyZWFrO2Nhc2UgNTpTKHYpO2JyZWFrO2Nhc2UgNjprKHYpO2JyZWFrO2Nhc2UgNzpqKHYpO2JyZWFrO2Nhc2UgODpUKHYpO2JyZWFrO2Nhc2UgOTpJKHYpO2JyZWFrO2Nhc2UgMTA6UCh2KTticmVhaztjYXNlIDExOk4odik7YnJlYWs7Y2FzZSAxMjpNKHYpO2JyZWFrO2Nhc2UgMTM6Uih2KTticmVhaztjYXNlIDE0OkQodik7YnJlYWs7Y2FzZSAxNTpMKHYpO2JyZWFrO2Nhc2UgMTY6Qih2KTticmVhaztjYXNlIDE3OkYodik7YnJlYWs7Y2FzZSAxODpVKHYpO2JyZWFrO2Nhc2UgMTk6cSh2KTticmVhaztjYXNlIDIwOnoodik7YnJlYWs7ZGVmYXVsdDp1KGYpfWwrK31mdW5jdGlvbiBnKGUpeyI8Ij09PWUmJlcoKX1mdW5jdGlvbiB5KGUpeyIhIj09PWU/Zj0xMzoiLyI9PT1lPyhmPTIsbT1uZXcgb2UoZCh7fSxtLHtpc0Nsb3Npbmc6ITB9KSkpOiI8Ij09PWU/VygpOngudGVzdChlKT8oZj0zLG09bmV3IG9lKGQoe30sbSx7aXNPcGVuaW5nOiEwfSkpKTooZj0wLG09Yyl9ZnVuY3Rpb24gYihlKXtDLnRlc3QoZSk/KG09bmV3IG9lKGQoe30sbSx7bmFtZTokKCl9KSksZj00KToiPCI9PT1lP1coKToiLyI9PT1lPyhtPW5ldyBvZShkKHt9LG0se25hbWU6JCgpfSkpLGY9MTIpOiI+Ij09PWU/KG09bmV3IG9lKGQoe30sbSx7bmFtZTokKCl9KSksSCgpKTp4LnRlc3QoZSl8fEUudGVzdChlKXx8IjoiPT09ZXx8VigpfWZ1bmN0aW9uIF8oZSl7Ij4iPT09ZT9WKCk6eC50ZXN0KGUpP2Y9MzpWKCl9ZnVuY3Rpb24gdyhlKXtDLnRlc3QoZSl8fCgiLyI9PT1lP2Y9MTI6Ij4iPT09ZT9IKCk6IjwiPT09ZT9XKCk6Ij0iPT09ZXx8QS50ZXN0KGUpfHxPLnRlc3QoZSk/VigpOmY9NSl9ZnVuY3Rpb24gUyhlKXtDLnRlc3QoZSk/Zj02OiIvIj09PWU/Zj0xMjoiPSI9PT1lP2Y9NzoiPiI9PT1lP0goKToiPCI9PT1lP1coKTpBLnRlc3QoZSkmJlYoKX1mdW5jdGlvbiBrKGUpe0MudGVzdChlKXx8KCIvIj09PWU/Zj0xMjoiPSI9PT1lP2Y9NzoiPiI9PT1lP0goKToiPCI9PT1lP1coKTpBLnRlc3QoZSk/VigpOmY9NSl9ZnVuY3Rpb24gaihlKXtDLnRlc3QoZSl8fCgnIic9PT1lP2Y9ODoiJyI9PT1lP2Y9OTovWz49YF0vLnRlc3QoZSk/VigpOiI8Ij09PWU/VygpOmY9MTApfWZ1bmN0aW9uIFQoZSl7JyInPT09ZSYmKGY9MTEpfWZ1bmN0aW9uIEkoZSl7IiciPT09ZSYmKGY9MTEpfWZ1bmN0aW9uIFAoZSl7Qy50ZXN0KGUpP2Y9NDoiPiI9PT1lP0goKToiPCI9PT1lJiZXKCl9ZnVuY3Rpb24gTihlKXtDLnRlc3QoZSk/Zj00OiIvIj09PWU/Zj0xMjoiPiI9PT1lP0goKToiPCI9PT1lP1coKTooZj00LGwtLSl9ZnVuY3Rpb24gTShlKXsiPiI9PT1lPyhtPW5ldyBvZShkKHt9LG0se2lzQ2xvc2luZzohMH0pKSxIKCkpOmY9NH1mdW5jdGlvbiBSKHQpeyItLSI9PT1lLnN1YnN0cihsLDIpPyhsKz0yLG09bmV3IG9lKGQoe30sbSx7dHlwZToiY29tbWVudCJ9KSksZj0xNCk6IkRPQ1RZUEUiPT09ZS5zdWJzdHIobCw3KS50b1VwcGVyQ2FzZSgpPyhsKz03LG09bmV3IG9lKGQoe30sbSx7dHlwZToiZG9jdHlwZSJ9KSksZj0yMCk6VigpfWZ1bmN0aW9uIEQoZSl7Ii0iPT09ZT9mPTE1OiI+Ij09PWU/VigpOmY9MTZ9ZnVuY3Rpb24gTChlKXsiLSI9PT1lP2Y9MTg6Ij4iPT09ZT9WKCk6Zj0xNn1mdW5jdGlvbiBCKGUpeyItIj09PWUmJihmPTE3KX1mdW5jdGlvbiBGKGUpe2Y9Ii0iPT09ZT8xODoxNn1mdW5jdGlvbiBVKGUpeyI+Ij09PWU/SCgpOiIhIj09PWU/Zj0xOToiLSI9PT1lfHwoZj0xNil9ZnVuY3Rpb24gcShlKXsiLSI9PT1lP2Y9MTc6Ij4iPT09ZT9IKCk6Zj0xNn1mdW5jdGlvbiB6KGUpeyI+Ij09PWU/SCgpOiI8Ij09PWUmJlcoKX1mdW5jdGlvbiBWKCl7Zj0wLG09Y31mdW5jdGlvbiBXKCl7Zj0xLG09bmV3IG9lKHtpZHg6bH0pfWZ1bmN0aW9uIEgoKXt2YXIgdD1lLnNsaWNlKGgsbS5pZHgpO3QmJmEodCxoKSwiY29tbWVudCI9PT1tLnR5cGU/aShtLmlkeCk6ImRvY3R5cGUiPT09bS50eXBlP3MobS5pZHgpOihtLmlzT3BlbmluZyYmcihtLm5hbWUsbS5pZHgpLG0uaXNDbG9zaW5nJiZvKG0ubmFtZSxtLmlkeCkpLFYoKSxoPWwrMX1mdW5jdGlvbiAkKCl7dmFyIHQ9bS5pZHgrKG0uaXNDbG9zaW5nPzI6MSk7cmV0dXJuIGUuc2xpY2UodCxsKS50b0xvd2VyQ2FzZSgpfWg8bCYmKG49ZS5zbGljZShoLGwpLGEobixoKSxoPWwrMSl9dmFyIG9lPWZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KSx0aGlzLmlkeD12b2lkIDAhPT1lLmlkeD9lLmlkeDotMSx0aGlzLnR5cGU9ZS50eXBlfHwidGFnIix0aGlzLm5hbWU9ZS5uYW1lfHwiIix0aGlzLmlzT3BlbmluZz0hIWUuaXNPcGVuaW5nLHRoaXMuaXNDbG9zaW5nPSEhZS5pc0Nsb3Npbmd9LGFlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXt2b2lkIDA9PT10JiYodD17fSksdGhpcy52ZXJzaW9uPWUudmVyc2lvbix0aGlzLnVybHM9e30sdGhpcy5lbWFpbD0hMCx0aGlzLnBob25lPSEwLHRoaXMuaGFzaHRhZz0hMSx0aGlzLm1lbnRpb249ITEsdGhpcy5uZXdXaW5kb3c9ITAsdGhpcy5zdHJpcFByZWZpeD17c2NoZW1lOiEwLHd3dzohMH0sdGhpcy5zdHJpcFRyYWlsaW5nU2xhc2g9ITAsdGhpcy5kZWNvZGVQZXJjZW50RW5jb2Rpbmc9ITAsdGhpcy50cnVuY2F0ZT17bGVuZ3RoOjAsbG9jYXRpb246ImVuZCJ9LHRoaXMuY2xhc3NOYW1lPSIiLHRoaXMucmVwbGFjZUZuPW51bGwsdGhpcy5jb250ZXh0PXZvaWQgMCx0aGlzLnNhbml0aXplSHRtbD0hMSx0aGlzLm1hdGNoZXJzPW51bGwsdGhpcy50YWdCdWlsZGVyPW51bGwsdGhpcy51cmxzPXRoaXMubm9ybWFsaXplVXJsc0NmZyh0LnVybHMpLHRoaXMuZW1haWw9ImJvb2xlYW4iPT10eXBlb2YgdC5lbWFpbD90LmVtYWlsOnRoaXMuZW1haWwsdGhpcy5waG9uZT0iYm9vbGVhbiI9PXR5cGVvZiB0LnBob25lP3QucGhvbmU6dGhpcy5waG9uZSx0aGlzLmhhc2h0YWc9dC5oYXNodGFnfHx0aGlzLmhhc2h0YWcsdGhpcy5tZW50aW9uPXQubWVudGlvbnx8dGhpcy5tZW50aW9uLHRoaXMubmV3V2luZG93PSJib29sZWFuIj09dHlwZW9mIHQubmV3V2luZG93P3QubmV3V2luZG93OnRoaXMubmV3V2luZG93LHRoaXMuc3RyaXBQcmVmaXg9dGhpcy5ub3JtYWxpemVTdHJpcFByZWZpeENmZyh0LnN0cmlwUHJlZml4KSx0aGlzLnN0cmlwVHJhaWxpbmdTbGFzaD0iYm9vbGVhbiI9PXR5cGVvZiB0LnN0cmlwVHJhaWxpbmdTbGFzaD90LnN0cmlwVHJhaWxpbmdTbGFzaDp0aGlzLnN0cmlwVHJhaWxpbmdTbGFzaCx0aGlzLmRlY29kZVBlcmNlbnRFbmNvZGluZz0iYm9vbGVhbiI9PXR5cGVvZiB0LmRlY29kZVBlcmNlbnRFbmNvZGluZz90LmRlY29kZVBlcmNlbnRFbmNvZGluZzp0aGlzLmRlY29kZVBlcmNlbnRFbmNvZGluZyx0aGlzLnNhbml0aXplSHRtbD10LnNhbml0aXplSHRtbHx8ITE7dmFyIG49dGhpcy5tZW50aW9uO2lmKCExIT09biYmInR3aXR0ZXIiIT09biYmImluc3RhZ3JhbSIhPT1uJiYic291bmRjbG91ZCIhPT1uKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBgbWVudGlvbmAgY2ZnIC0gc2VlIGRvY3MiKTt2YXIgcj10aGlzLmhhc2h0YWc7aWYoITEhPT1yJiYidHdpdHRlciIhPT1yJiYiZmFjZWJvb2siIT09ciYmImluc3RhZ3JhbSIhPT1yKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBgaGFzaHRhZ2AgY2ZnIC0gc2VlIGRvY3MiKTt0aGlzLnRydW5jYXRlPXRoaXMubm9ybWFsaXplVHJ1bmNhdGVDZmcodC50cnVuY2F0ZSksdGhpcy5jbGFzc05hbWU9dC5jbGFzc05hbWV8fHRoaXMuY2xhc3NOYW1lLHRoaXMucmVwbGFjZUZuPXQucmVwbGFjZUZufHx0aGlzLnJlcGxhY2VGbix0aGlzLmNvbnRleHQ9dC5jb250ZXh0fHx0aGlzfXJldHVybiBlLmxpbms9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbmV3IGUobikubGluayh0KX0sZS5wYXJzZT1mdW5jdGlvbih0LG4pe3JldHVybiBuZXcgZShuKS5wYXJzZSh0KX0sZS5wcm90b3R5cGUubm9ybWFsaXplVXJsc0NmZz1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZSYmKGU9ITApLCJib29sZWFuIj09dHlwZW9mIGU/e3NjaGVtZU1hdGNoZXM6ZSx3d3dNYXRjaGVzOmUsdGxkTWF0Y2hlczplfTp7c2NoZW1lTWF0Y2hlczoiYm9vbGVhbiIhPXR5cGVvZiBlLnNjaGVtZU1hdGNoZXN8fGUuc2NoZW1lTWF0Y2hlcyx3d3dNYXRjaGVzOiJib29sZWFuIiE9dHlwZW9mIGUud3d3TWF0Y2hlc3x8ZS53d3dNYXRjaGVzLHRsZE1hdGNoZXM6ImJvb2xlYW4iIT10eXBlb2YgZS50bGRNYXRjaGVzfHxlLnRsZE1hdGNoZXN9fSxlLnByb3RvdHlwZS5ub3JtYWxpemVTdHJpcFByZWZpeENmZz1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZSYmKGU9ITApLCJib29sZWFuIj09dHlwZW9mIGU/e3NjaGVtZTplLHd3dzplfTp7c2NoZW1lOiJib29sZWFuIiE9dHlwZW9mIGUuc2NoZW1lfHxlLnNjaGVtZSx3d3c6ImJvb2xlYW4iIT10eXBlb2YgZS53d3d8fGUud3d3fX0sZS5wcm90b3R5cGUubm9ybWFsaXplVHJ1bmNhdGVDZmc9ZnVuY3Rpb24oZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlP3tsZW5ndGg6ZSxsb2NhdGlvbjoiZW5kIn06ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4gaW4gdCl0Lmhhc093blByb3BlcnR5KG4pJiZ2b2lkIDA9PT1lW25dJiYoZVtuXT10W25dKTtyZXR1cm4gZX0oZXx8e30se2xlbmd0aDpOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksbG9jYXRpb246ImVuZCJ9KX0sZS5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPVsiYSIsInN0eWxlIiwic2NyaXB0Il0scj0wLG89W107cmV0dXJuIHJlKGUse29uT3BlblRhZzpmdW5jdGlvbihlKXtuLmluZGV4T2YoZSk+PTAmJnIrK30sb25UZXh0OmZ1bmN0aW9uKGUsbil7aWYoMD09PXIpe3ZhciBhPWZ1bmN0aW9uKGUsdCl7aWYoIXQuZ2xvYmFsKXRocm93IG5ldyBFcnJvcigiYHNwbGl0UmVnZXhgIG11c3QgaGF2ZSB0aGUgJ2cnIGZsYWcgc2V0Iik7Zm9yKHZhciBuLHI9W10sbz0wO249dC5leGVjKGUpOylyLnB1c2goZS5zdWJzdHJpbmcobyxuLmluZGV4KSksci5wdXNoKG5bMF0pLG89bi5pbmRleCtuWzBdLmxlbmd0aDtyZXR1cm4gci5wdXNoKGUuc3Vic3RyaW5nKG8pKSxyfShlLC8oJm5ic3A7fCYjMTYwO3wmbHQ7fCYjNjA7fCZndDt8JiM2Mjt8JnF1b3Q7fCYjMzQ7fCYjMzk7KS9naSksaT1uO2EuZm9yRWFjaCgoZnVuY3Rpb24oZSxuKXtpZihuJTI9PTApe3ZhciByPXQucGFyc2VUZXh0KGUsaSk7by5wdXNoLmFwcGx5KG8scil9aSs9ZS5sZW5ndGh9KSl9fSxvbkNsb3NlVGFnOmZ1bmN0aW9uKGUpe24uaW5kZXhPZihlKT49MCYmKHI9TWF0aC5tYXgoci0xLDApKX0sb25Db21tZW50OmZ1bmN0aW9uKGUpe30sb25Eb2N0eXBlOmZ1bmN0aW9uKGUpe319KSxvPXRoaXMuY29tcGFjdE1hdGNoZXMobyksbz10aGlzLnJlbW92ZVVud2FudGVkTWF0Y2hlcyhvKX0sZS5wcm90b3R5cGUuY29tcGFjdE1hdGNoZXM9ZnVuY3Rpb24oZSl7ZS5zb3J0KChmdW5jdGlvbihlLHQpe3JldHVybiBlLmdldE9mZnNldCgpLXQuZ2V0T2Zmc2V0KCl9KSk7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aC0xO3QrKyl7dmFyIG49ZVt0XSxyPW4uZ2V0T2Zmc2V0KCksbz1uLmdldE1hdGNoZWRUZXh0KCkubGVuZ3RoLGE9citvO2lmKHQrMTxlLmxlbmd0aCl7aWYoZVt0KzFdLmdldE9mZnNldCgpPT09cil7dmFyIGk9ZVt0KzFdLmdldE1hdGNoZWRUZXh0KCkubGVuZ3RoPm8/dDp0KzE7ZS5zcGxpY2UoaSwxKTtjb250aW51ZX1lW3QrMV0uZ2V0T2Zmc2V0KCk8YSYmZS5zcGxpY2UodCsxLDEpfX1yZXR1cm4gZX0sZS5wcm90b3R5cGUucmVtb3ZlVW53YW50ZWRNYXRjaGVzPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmhhc2h0YWd8fHMoZSwoZnVuY3Rpb24oZSl7cmV0dXJuImhhc2h0YWciPT09ZS5nZXRUeXBlKCl9KSksdGhpcy5lbWFpbHx8cyhlLChmdW5jdGlvbihlKXtyZXR1cm4iZW1haWwiPT09ZS5nZXRUeXBlKCl9KSksdGhpcy5waG9uZXx8cyhlLChmdW5jdGlvbihlKXtyZXR1cm4icGhvbmUiPT09ZS5nZXRUeXBlKCl9KSksdGhpcy5tZW50aW9ufHxzKGUsKGZ1bmN0aW9uKGUpe3JldHVybiJtZW50aW9uIj09PWUuZ2V0VHlwZSgpfSkpLHRoaXMudXJscy5zY2hlbWVNYXRjaGVzfHxzKGUsKGZ1bmN0aW9uKGUpe3JldHVybiJ1cmwiPT09ZS5nZXRUeXBlKCkmJiJzY2hlbWUiPT09ZS5nZXRVcmxNYXRjaFR5cGUoKX0pKSx0aGlzLnVybHMud3d3TWF0Y2hlc3x8cyhlLChmdW5jdGlvbihlKXtyZXR1cm4idXJsIj09PWUuZ2V0VHlwZSgpJiYid3d3Ij09PWUuZ2V0VXJsTWF0Y2hUeXBlKCl9KSksdGhpcy51cmxzLnRsZE1hdGNoZXN8fHMoZSwoZnVuY3Rpb24oZSl7cmV0dXJuInVybCI9PT1lLmdldFR5cGUoKSYmInRsZCI9PT1lLmdldFVybE1hdGNoVHlwZSgpfSkpLGV9LGUucHJvdG90eXBlLnBhcnNlVGV4dD1mdW5jdGlvbihlLHQpe3ZvaWQgMD09PXQmJih0PTApLHQ9dHx8MDtmb3IodmFyIG49dGhpcy5nZXRNYXRjaGVycygpLHI9W10sbz0wLGE9bi5sZW5ndGg7bzxhO28rKyl7Zm9yKHZhciBpPW5bb10ucGFyc2VNYXRjaGVzKGUpLHM9MCx1PWkubGVuZ3RoO3M8dTtzKyspaVtzXS5zZXRPZmZzZXQodCtpW3NdLmdldE9mZnNldCgpKTtyLnB1c2guYXBwbHkocixpKX1yZXR1cm4gcn0sZS5wcm90b3R5cGUubGluaz1mdW5jdGlvbihlKXtpZighZSlyZXR1cm4iIjt0aGlzLnNhbml0aXplSHRtbCYmKGU9ZS5yZXBsYWNlKC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKSk7Zm9yKHZhciB0PXRoaXMucGFyc2UoZSksbj1bXSxyPTAsbz0wLGE9dC5sZW5ndGg7bzxhO28rKyl7dmFyIGk9dFtvXTtuLnB1c2goZS5zdWJzdHJpbmcocixpLmdldE9mZnNldCgpKSksbi5wdXNoKHRoaXMuY3JlYXRlTWF0Y2hSZXR1cm5WYWwoaSkpLHI9aS5nZXRPZmZzZXQoKStpLmdldE1hdGNoZWRUZXh0KCkubGVuZ3RofXJldHVybiBuLnB1c2goZS5zdWJzdHJpbmcocikpLG4uam9pbigiIil9LGUucHJvdG90eXBlLmNyZWF0ZU1hdGNoUmV0dXJuVmFsPWZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiB0aGlzLnJlcGxhY2VGbiYmKHQ9dGhpcy5yZXBsYWNlRm4uY2FsbCh0aGlzLmNvbnRleHQsZSkpLCJzdHJpbmciPT10eXBlb2YgdD90OiExPT09dD9lLmdldE1hdGNoZWRUZXh0KCk6dCBpbnN0YW5jZW9mIGM/dC50b0FuY2hvclN0cmluZygpOmUuYnVpbGRUYWcoKS50b0FuY2hvclN0cmluZygpfSxlLnByb3RvdHlwZS5nZXRNYXRjaGVycz1mdW5jdGlvbigpe2lmKHRoaXMubWF0Y2hlcnMpcmV0dXJuIHRoaXMubWF0Y2hlcnM7dmFyIGU9dGhpcy5nZXRUYWdCdWlsZGVyKCksdD1bbmV3IFkoe3RhZ0J1aWxkZXI6ZSxzZXJ2aWNlTmFtZTp0aGlzLmhhc2h0YWd9KSxuZXcgcSh7dGFnQnVpbGRlcjplfSksbmV3IFooe3RhZ0J1aWxkZXI6ZX0pLG5ldyBuZSh7dGFnQnVpbGRlcjplLHNlcnZpY2VOYW1lOnRoaXMubWVudGlvbn0pLG5ldyAkKHt0YWdCdWlsZGVyOmUsc3RyaXBQcmVmaXg6dGhpcy5zdHJpcFByZWZpeCxzdHJpcFRyYWlsaW5nU2xhc2g6dGhpcy5zdHJpcFRyYWlsaW5nU2xhc2gsZGVjb2RlUGVyY2VudEVuY29kaW5nOnRoaXMuZGVjb2RlUGVyY2VudEVuY29kaW5nfSldO3JldHVybiB0aGlzLm1hdGNoZXJzPXR9LGUucHJvdG90eXBlLmdldFRhZ0J1aWxkZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnRhZ0J1aWxkZXI7cmV0dXJuIGV8fChlPXRoaXMudGFnQnVpbGRlcj1uZXcgbCh7bmV3V2luZG93OnRoaXMubmV3V2luZG93LHRydW5jYXRlOnRoaXMudHJ1bmNhdGUsY2xhc3NOYW1lOnRoaXMuY2xhc3NOYW1lfSkpLGV9LGUudmVyc2lvbj0iMy4xNC4xIixlLkFuY2hvclRhZ0J1aWxkZXI9bCxlLkh0bWxUYWc9YyxlLm1hdGNoZXI9e0VtYWlsOnEsSGFzaHRhZzpZLE1hdGNoZXI6dyxNZW50aW9uOm5lLFBob25lOlosVXJsOiR9LGUubWF0Y2g9e0VtYWlsOnYsSGFzaHRhZzpnLE1hdGNoOnAsTWVudGlvbjp5LFBob25lOmIsVXJsOl99LGV9KCksaWU9L3d3d3xAfFw6XC9cLy87ZnVuY3Rpb24gc2UoZSl7cmV0dXJuL148XC9hXHMqPi9pLnRlc3QoZSl9ZnVuY3Rpb24gdWUoKXt2YXIgZT1bXSx0PW5ldyBhZSh7c3RyaXBQcmVmaXg6ITEsdXJsOiEwLGVtYWlsOiEwLHJlcGxhY2VGbjpmdW5jdGlvbih0KXtzd2l0Y2godC5nZXRUeXBlKCkpe2Nhc2UidXJsIjplLnB1c2goe3RleHQ6dC5tYXRjaGVkVGV4dCx1cmw6dC5nZXRVcmwoKX0pO2JyZWFrO2Nhc2UiZW1haWwiOmUucHVzaCh7dGV4dDp0Lm1hdGNoZWRUZXh0LHVybDoibWFpbHRvOiIrdC5nZXRFbWFpbCgpLnJlcGxhY2UoL15tYWlsdG86L2ksIiIpfSl9cmV0dXJuITF9fSk7cmV0dXJue2xpbmtzOmUsYXV0b2xpbmtlcjp0fX1mdW5jdGlvbiBjZShlKXt2YXIgdCxuLHIsbyxhLGkscyx1LGMsbCxwLGYsaCxkLG09ZS50b2tlbnMsdj1udWxsO2ZvcihuPTAscj1tLmxlbmd0aDtuPHI7bisrKWlmKCJpbmxpbmUiPT09bVtuXS50eXBlKWZvcihwPTAsdD0obz1tW25dLmNoaWxkcmVuKS5sZW5ndGgtMTt0Pj0wO3QtLSlpZigibGlua19jbG9zZSIhPT0oYT1vW3RdKS50eXBlKXtpZigiaHRtbHRhZyI9PT1hLnR5cGUmJihkPWEuY29udGVudCwvXjxhWz5cc10vaS50ZXN0KGQpJiZwPjAmJnAtLSxzZShhLmNvbnRlbnQpJiZwKyspLCEocD4wKSYmInRleHQiPT09YS50eXBlJiZpZS50ZXN0KGEuY29udGVudCkpe2lmKHZ8fChmPSh2PXVlKCkpLmxpbmtzLGg9di5hdXRvbGlua2VyKSxpPWEuY29udGVudCxmLmxlbmd0aD0wLGgubGluayhpKSwhZi5sZW5ndGgpY29udGludWU7Zm9yKHM9W10sbD1hLmxldmVsLHU9MDt1PGYubGVuZ3RoO3UrKyllLmlubGluZS52YWxpZGF0ZUxpbmsoZlt1XS51cmwpJiYoKGM9aS5pbmRleE9mKGZbdV0udGV4dCkpJiZzLnB1c2goe3R5cGU6InRleHQiLGNvbnRlbnQ6aS5zbGljZSgwLGMpLGxldmVsOmx9KSxzLnB1c2goe3R5cGU6Imxpbmtfb3BlbiIsaHJlZjpmW3VdLnVybCx0aXRsZToiIixsZXZlbDpsKyt9KSxzLnB1c2goe3R5cGU6InRleHQiLGNvbnRlbnQ6Zlt1XS50ZXh0LGxldmVsOmx9KSxzLnB1c2goe3R5cGU6ImxpbmtfY2xvc2UiLGxldmVsOi0tbH0pLGk9aS5zbGljZShjK2ZbdV0udGV4dC5sZW5ndGgpKTtpLmxlbmd0aCYmcy5wdXNoKHt0eXBlOiJ0ZXh0Iixjb250ZW50OmksbGV2ZWw6bH0pLG1bbl0uY2hpbGRyZW49bz1bXS5jb25jYXQoby5zbGljZSgwLHQpLHMsby5zbGljZSh0KzEpKX19ZWxzZSBmb3IodC0tO29bdF0ubGV2ZWwhPT1hLmxldmVsJiYibGlua19vcGVuIiE9PW9bdF0udHlwZTspdC0tfWZ1bmN0aW9uIGxlKGUpe2UuY29yZS5ydWxlci5wdXNoKCJsaW5raWZ5IixjZSl9dmFyIHBlPW4oMjIyKSxmZT1uLm4ocGUpLGhlPW4oNTApLGRlPW4ubihoZSk7ZnVuY3Rpb24gbWUoZSl7dmFyIHQ9ZS5zb3VyY2Usbj1lLmNsYXNzTmFtZSxyPXZvaWQgMD09PW4/IiI6bixpPWUuZ2V0Q29uZmlncztpZigic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIG51bGw7dmFyIHM9bmV3IGEuYSh7aHRtbDohMCx0eXBvZ3JhcGhlcjohMCxicmVha3M6ITAsbGlua1RhcmdldDoiX2JsYW5rIn0pLnVzZShsZSk7cy5jb3JlLnJ1bGVyLmRpc2FibGUoWyJyZXBsYWNlbWVudHMiLCJzbWFydHF1b3RlcyJdKTt2YXIgdT1pKCkudXNlVW5zYWZlTWFya2Rvd24sYz1zLnJlbmRlcih0KSxsPXZlKGMse3VzZVVuc2FmZU1hcmtkb3duOnV9KTtyZXR1cm4gdCYmYyYmbD9vLmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOmRlKCkociwibWFya2Rvd24iKSxkYW5nZXJvdXNseVNldElubmVySFRNTDp7X19odG1sOmx9fSk6bnVsbH1mZS5hLmFkZEhvb2smJmZlLmEuYWRkSG9vaygiYmVmb3JlU2FuaXRpemVFbGVtZW50cyIsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmhyZWYmJmUuc2V0QXR0cmlidXRlKCJyZWwiLCJub29wZW5lciBub3JlZmVycmVyIiksZX0pKSxtZS5kZWZhdWx0UHJvcHM9e2dldENvbmZpZ3M6ZnVuY3Rpb24oKXtyZXR1cm57dXNlVW5zYWZlTWFya2Rvd246ITF9fX07dC5hPW1lO2Z1bmN0aW9uIHZlKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fSxuPXQudXNlVW5zYWZlTWFya2Rvd24scj12b2lkIDAhPT1uJiZuLG89cixhPXI/W106WyJzdHlsZSIsImNsYXNzIl07cmV0dXJuIHImJiF2ZS5oYXNXYXJuZWRBYm91dERlcHJlY2F0aW9uJiYoY29uc29sZS53YXJuKCJ1c2VVbnNhZmVNYXJrZG93biBkaXNwbGF5IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGlzIGRlcHJlY2F0ZWQgc2luY2UgPjMuMjYuMCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHY0LjAuMC4iKSx2ZS5oYXNXYXJuZWRBYm91dERlcHJlY2F0aW9uPSEwKSxmZS5hLnNhbml0aXplKGUse0FERF9BVFRSOlsidGFyZ2V0Il0sRk9SQklEX1RBR1M6WyJzdHlsZSIsImZvcm0iXSxBTExPV19EQVRBX0FUVFI6byxGT1JCSURfQVRUUjphfSl9dmUuaGFzV2FybmVkQWJvdXREZXByZWNhdGlvbj0hMX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtuLmQodCwiYSIsKGZ1bmN0aW9uKCl7cmV0dXJuIFJ9KSk7dmFyIHI9bigyOCksbz1uLm4ociksYT1uKDYpLGk9bi5uKGEpLHM9big3KSx1PW4ubihzKSxjPW4oMTApLGw9bi5uKGMpLHA9big4KSxmPW4ubihwKSxoPW4oOSksZD1uLm4oaCksbT1uKDMpLHY9bi5uKG0pLGc9bigyKSx5PW4ubihnKSxiPW4oMTcpLF89bi5uKGIpLHc9big0KSx4PW4ubih3KSxFPW4oMCksUz1uLm4oRSksQz1uKDEpLEE9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX0sTz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX1yZXR1cm4gZnVuY3Rpb24odCxuLHIpe3JldHVybiBuJiZlKHQucHJvdG90eXBlLG4pLHImJmUodCxyKSx0fX0oKTtmdW5jdGlvbiBrKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gaihlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fXZhciBUPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXtyZXR1cm4gayh0aGlzLHQpLGoodGhpcywodC5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSkuYXBwbHkodGhpcyxhcmd1bWVudHMpKX1yZXR1cm4gZnVuY3Rpb24oZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfSh0LGUpLE8odCxbe2tleToic2hvdWxkQ29tcG9uZW50VXBkYXRlIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9LHI9dGhpcy5zdGF0ZXx8e307cmV0dXJuISh0aGlzLnVwZGF0ZU9uUHJvcHN8fE9iamVjdC5rZXlzKEEoe30sZSx0aGlzLnByb3BzKSkpLmV2ZXJ5KChmdW5jdGlvbihuKXtyZXR1cm4gT2JqZWN0KEMuaXMpKGVbbl0sdC5wcm9wc1tuXSl9KSl8fCEodGhpcy51cGRhdGVPblN0YXRlc3x8T2JqZWN0LmtleXMoQSh7fSxuLHIpKSkuZXZlcnkoKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QoQy5pcykobltlXSxyW2VdKX0pKX19XSksdH0oUy5hLkNvbXBvbmVudCksST1uKDI3KSxQPW4ubihJKSxOPW4oMTEpLE09bi5uKE4pLFI9ZnVuY3Rpb24oZSl7ZigpKHIsZSk7dmFyIHQ9ZCgpKHIpO2Z1bmN0aW9uIHIoKXt2YXIgZSxuO2koKSh0aGlzLHIpO2Zvcih2YXIgbz1hcmd1bWVudHMubGVuZ3RoLGE9bmV3IEFycmF5KG8pLHM9MDtzPG87cysrKWFbc109YXJndW1lbnRzW3NdO3JldHVybiBuPXQuY2FsbC5hcHBseSh0LHkoKShlPVt0aGlzXSkuY2FsbChlLGEpKSx2KCkobCgpKG4pLCJnZXRNb2RlbE5hbWUiLChmdW5jdGlvbihlKXtyZXR1cm4tMSE9PV8oKShlKS5jYWxsKGUsIiMvZGVmaW5pdGlvbnMvIik/ZS5yZXBsYWNlKC9eLiojXC9kZWZpbml0aW9uc1wvLywiIik6LTEhPT1fKCkoZSkuY2FsbChlLCIjL2NvbXBvbmVudHMvc2NoZW1hcy8iKT9lLnJlcGxhY2UoL14uKiNcL2NvbXBvbmVudHNcL3NjaGVtYXNcLy8sIiIpOnZvaWQgMH0pKSx2KCkobCgpKG4pLCJnZXRSZWZTY2hlbWEiLChmdW5jdGlvbihlKXtyZXR1cm4gbi5wcm9wcy5zcGVjU2VsZWN0b3JzLmZpbmREZWZpbml0aW9uKGUpfSkpLG59cmV0dXJuIHUoKShyLFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcyx0PWUuZ2V0Q29tcG9uZW50LHI9ZS5nZXRDb25maWdzLGE9ZS5zcGVjU2VsZWN0b3JzLGk9ZS5zY2hlbWEscz1lLnJlcXVpcmVkLHU9ZS5uYW1lLGM9ZS5pc1JlZixsPWUuc3BlY1BhdGgscD1lLmRpc3BsYXlOYW1lLGY9ZS5pbmNsdWRlUmVhZE9ubHksaD1lLmluY2x1ZGVXcml0ZU9ubHksZD10KCJPYmplY3RNb2RlbCIpLG09dCgiQXJyYXlNb2RlbCIpLHY9dCgiUHJpbWl0aXZlTW9kZWwiKSxnPSJvYmplY3QiLHk9aSYmaS5nZXQoIiQkcmVmIik7aWYoIXUmJnkmJih1PXRoaXMuZ2V0TW9kZWxOYW1lKHkpKSwhaSYmeSYmKGk9dGhpcy5nZXRSZWZTY2hlbWEodSkpLCFpKXJldHVybiBTLmEuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToibW9kZWwgbW9kZWwtdGl0bGUifSxTLmEuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToibW9kZWwtdGl0bGVfX3RleHQifSxwfHx1KSxTLmEuY3JlYXRlRWxlbWVudCgiaW1nIix7c3JjOm4oNDk3KSxoZWlnaHQ6IjIwcHgiLHdpZHRoOiIyMHB4In0pKTt2YXIgYj1hLmlzT0FTMygpJiZpLmdldCgiZGVwcmVjYXRlZCIpO3N3aXRjaChjPXZvaWQgMCE9PWM/YzohIXksZz1pJiZpLmdldCgidHlwZSIpfHxnKXtjYXNlIm9iamVjdCI6cmV0dXJuIFMuYS5jcmVhdGVFbGVtZW50KGQsbygpKHtjbGFzc05hbWU6Im9iamVjdCJ9LHRoaXMucHJvcHMse3NwZWNQYXRoOmwsZ2V0Q29uZmlnczpyLHNjaGVtYTppLG5hbWU6dSxkZXByZWNhdGVkOmIsaXNSZWY6YyxpbmNsdWRlUmVhZE9ubHk6ZixpbmNsdWRlV3JpdGVPbmx5Omh9KSk7Y2FzZSJhcnJheSI6cmV0dXJuIFMuYS5jcmVhdGVFbGVtZW50KG0sbygpKHtjbGFzc05hbWU6ImFycmF5In0sdGhpcy5wcm9wcyx7Z2V0Q29uZmlnczpyLHNjaGVtYTppLG5hbWU6dSxkZXByZWNhdGVkOmIscmVxdWlyZWQ6cyxpbmNsdWRlUmVhZE9ubHk6ZixpbmNsdWRlV3JpdGVPbmx5Omh9KSk7Y2FzZSJzdHJpbmciOmNhc2UibnVtYmVyIjpjYXNlImludGVnZXIiOmNhc2UiYm9vbGVhbiI6ZGVmYXVsdDpyZXR1cm4gUy5hLmNyZWF0ZUVsZW1lbnQodixvKCkoe30sdGhpcy5wcm9wcyx7Z2V0Q29tcG9uZW50OnQsZ2V0Q29uZmlnczpyLHNjaGVtYTppLG5hbWU6dSxkZXByZWNhdGVkOmIscmVxdWlyZWQ6c30pKX19fV0pLHJ9KFQpO3YoKShSLCJwcm9wVHlwZXMiLHtzY2hlbWE6eCgpKFAuYSkuaXNSZXF1aXJlZCxnZXRDb21wb25lbnQ6TS5hLmZ1bmMuaXNSZXF1aXJlZCxnZXRDb25maWdzOk0uYS5mdW5jLmlzUmVxdWlyZWQsc3BlY1NlbGVjdG9yczpNLmEub2JqZWN0LmlzUmVxdWlyZWQsbmFtZTpNLmEuc3RyaW5nLGRpc3BsYXlOYW1lOk0uYS5zdHJpbmcsaXNSZWY6TS5hLmJvb2wscmVxdWlyZWQ6TS5hLmJvb2wsZXhwYW5kRGVwdGg6TS5hLm51bWJlcixkZXB0aDpNLmEubnVtYmVyLHNwZWNQYXRoOlAuYS5saXN0LmlzUmVxdWlyZWQsaW5jbHVkZVJlYWRPbmx5Ok0uYS5ib29sLGluY2x1ZGVXcml0ZU9ubHk6TS5hLmJvb2x9KX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDEwNTIpLG89bigxMDYyKSxhPW4oMjgyKTtlLmV4cG9ydHM9e2Zvcm1hdHM6YSxwYXJzZTpvLHN0cmluZ2lmeTpyfX0sZnVuY3Rpb24oZSx0LG4pe2UuZXhwb3J0cz1mdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBlKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpe2Zvcih2YXIgdD0wLG49QXJyYXkoZS5sZW5ndGgpO3Q8ZS5sZW5ndGg7dCsrKW5bdF09ZVt0XTtyZXR1cm4gbn1yZXR1cm4gQXJyYXkuZnJvbShlKX12YXIgdD1PYmplY3QuaGFzT3duUHJvcGVydHksbj1PYmplY3Quc2V0UHJvdG90eXBlT2Yscj1PYmplY3QuaXNGcm96ZW4sbz1PYmplY3QuZ2V0UHJvdG90eXBlT2YsYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLGk9T2JqZWN0LmZyZWV6ZSxzPU9iamVjdC5zZWFsLHU9T2JqZWN0LmNyZWF0ZSxjPSJ1bmRlZmluZWQiIT10eXBlb2YgUmVmbGVjdCYmUmVmbGVjdCxsPWMuYXBwbHkscD1jLmNvbnN0cnVjdDtsfHwobD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGUuYXBwbHkodCxuKX0pLGl8fChpPWZ1bmN0aW9uKGUpe3JldHVybiBlfSksc3x8KHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9KSxwfHwocD1mdW5jdGlvbih0LG4pe3JldHVybiBuZXcoRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQuYXBwbHkodCxbbnVsbF0uY29uY2F0KGUobikpKSl9KTt2YXIgZj14KEFycmF5LnByb3RvdHlwZS5mb3JFYWNoKSxoPXgoQXJyYXkucHJvdG90eXBlLnBvcCksZD14KEFycmF5LnByb3RvdHlwZS5wdXNoKSxtPXgoU3RyaW5nLnByb3RvdHlwZS50b0xvd2VyQ2FzZSksdj14KFN0cmluZy5wcm90b3R5cGUubWF0Y2gpLGc9eChTdHJpbmcucHJvdG90eXBlLnJlcGxhY2UpLHk9eChTdHJpbmcucHJvdG90eXBlLmluZGV4T2YpLGI9eChTdHJpbmcucHJvdG90eXBlLnRyaW0pLF89eChSZWdFeHAucHJvdG90eXBlLnRlc3QpLHc9RShUeXBlRXJyb3IpO2Z1bmN0aW9uIHgoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe2Zvcih2YXIgbj1hcmd1bWVudHMubGVuZ3RoLHI9QXJyYXkobj4xP24tMTowKSxvPTE7bzxuO28rKylyW28tMV09YXJndW1lbnRzW29dO3JldHVybiBsKGUsdCxyKX19ZnVuY3Rpb24gRShlKXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxuPUFycmF5KHQpLHI9MDtyPHQ7cisrKW5bcl09YXJndW1lbnRzW3JdO3JldHVybiBwKGUsbil9fWZ1bmN0aW9uIFMoZSx0KXtuJiZuKGUsbnVsbCk7Zm9yKHZhciBvPXQubGVuZ3RoO28tLTspe3ZhciBhPXRbb107aWYoInN0cmluZyI9PXR5cGVvZiBhKXt2YXIgaT1tKGEpO2khPT1hJiYocih0KXx8KHRbb109aSksYT1pKX1lW2FdPSEwfXJldHVybiBlfWZ1bmN0aW9uIEMoZSl7dmFyIG49dShudWxsKSxyPXZvaWQgMDtmb3IociBpbiBlKWwodCxlLFtyXSkmJihuW3JdPWVbcl0pO3JldHVybiBufWZ1bmN0aW9uIEEoZSx0KXtmb3IoO251bGwhPT1lOyl7dmFyIG49YShlLHQpO2lmKG4pe2lmKG4uZ2V0KXJldHVybiB4KG4uZ2V0KTtpZigiZnVuY3Rpb24iPT10eXBlb2Ygbi52YWx1ZSlyZXR1cm4geChuLnZhbHVlKX1lPW8oZSl9ZnVuY3Rpb24gcihlKXtyZXR1cm4gY29uc29sZS53YXJuKCJmYWxsYmFjayB2YWx1ZSBmb3IiLGUpLG51bGx9cmV0dXJuIHJ9dmFyIE89aShbImEiLCJhYmJyIiwiYWNyb255bSIsImFkZHJlc3MiLCJhcmVhIiwiYXJ0aWNsZSIsImFzaWRlIiwiYXVkaW8iLCJiIiwiYmRpIiwiYmRvIiwiYmlnIiwiYmxpbmsiLCJibG9ja3F1b3RlIiwiYm9keSIsImJyIiwiYnV0dG9uIiwiY2FudmFzIiwiY2FwdGlvbiIsImNlbnRlciIsImNpdGUiLCJjb2RlIiwiY29sIiwiY29sZ3JvdXAiLCJjb250ZW50IiwiZGF0YSIsImRhdGFsaXN0IiwiZGQiLCJkZWNvcmF0b3IiLCJkZWwiLCJkZXRhaWxzIiwiZGZuIiwiZGlhbG9nIiwiZGlyIiwiZGl2IiwiZGwiLCJkdCIsImVsZW1lbnQiLCJlbSIsImZpZWxkc2V0IiwiZmlnY2FwdGlvbiIsImZpZ3VyZSIsImZvbnQiLCJmb290ZXIiLCJmb3JtIiwiaDEiLCJoMiIsImgzIiwiaDQiLCJoNSIsImg2IiwiaGVhZCIsImhlYWRlciIsImhncm91cCIsImhyIiwiaHRtbCIsImkiLCJpbWciLCJpbnB1dCIsImlucyIsImtiZCIsImxhYmVsIiwibGVnZW5kIiwibGkiLCJtYWluIiwibWFwIiwibWFyayIsIm1hcnF1ZWUiLCJtZW51IiwibWVudWl0ZW0iLCJtZXRlciIsIm5hdiIsIm5vYnIiLCJvbCIsIm9wdGdyb3VwIiwib3B0aW9uIiwib3V0cHV0IiwicCIsInBpY3R1cmUiLCJwcmUiLCJwcm9ncmVzcyIsInEiLCJycCIsInJ0IiwicnVieSIsInMiLCJzYW1wIiwic2VjdGlvbiIsInNlbGVjdCIsInNoYWRvdyIsInNtYWxsIiwic291cmNlIiwic3BhY2VyIiwic3BhbiIsInN0cmlrZSIsInN0cm9uZyIsInN0eWxlIiwic3ViIiwic3VtbWFyeSIsInN1cCIsInRhYmxlIiwidGJvZHkiLCJ0ZCIsInRlbXBsYXRlIiwidGV4dGFyZWEiLCJ0Zm9vdCIsInRoIiwidGhlYWQiLCJ0aW1lIiwidHIiLCJ0cmFjayIsInR0IiwidSIsInVsIiwidmFyIiwidmlkZW8iLCJ3YnIiXSksaz1pKFsic3ZnIiwiYSIsImFsdGdseXBoIiwiYWx0Z2x5cGhkZWYiLCJhbHRnbHlwaGl0ZW0iLCJhbmltYXRlY29sb3IiLCJhbmltYXRlbW90aW9uIiwiYW5pbWF0ZXRyYW5zZm9ybSIsImNpcmNsZSIsImNsaXBwYXRoIiwiZGVmcyIsImRlc2MiLCJlbGxpcHNlIiwiZmlsdGVyIiwiZm9udCIsImciLCJnbHlwaCIsImdseXBocmVmIiwiaGtlcm4iLCJpbWFnZSIsImxpbmUiLCJsaW5lYXJncmFkaWVudCIsIm1hcmtlciIsIm1hc2siLCJtZXRhZGF0YSIsIm1wYXRoIiwicGF0aCIsInBhdHRlcm4iLCJwb2x5Z29uIiwicG9seWxpbmUiLCJyYWRpYWxncmFkaWVudCIsInJlY3QiLCJzdG9wIiwic3R5bGUiLCJzd2l0Y2giLCJzeW1ib2wiLCJ0ZXh0IiwidGV4dHBhdGgiLCJ0aXRsZSIsInRyZWYiLCJ0c3BhbiIsInZpZXciLCJ2a2VybiJdKSxqPWkoWyJmZUJsZW5kIiwiZmVDb2xvck1hdHJpeCIsImZlQ29tcG9uZW50VHJhbnNmZXIiLCJmZUNvbXBvc2l0ZSIsImZlQ29udm9sdmVNYXRyaXgiLCJmZURpZmZ1c2VMaWdodGluZyIsImZlRGlzcGxhY2VtZW50TWFwIiwiZmVEaXN0YW50TGlnaHQiLCJmZUZsb29kIiwiZmVGdW5jQSIsImZlRnVuY0IiLCJmZUZ1bmNHIiwiZmVGdW5jUiIsImZlR2F1c3NpYW5CbHVyIiwiZmVNZXJnZSIsImZlTWVyZ2VOb2RlIiwiZmVNb3JwaG9sb2d5IiwiZmVPZmZzZXQiLCJmZVBvaW50TGlnaHQiLCJmZVNwZWN1bGFyTGlnaHRpbmciLCJmZVNwb3RMaWdodCIsImZlVGlsZSIsImZlVHVyYnVsZW5jZSJdKSxUPWkoWyJhbmltYXRlIiwiY29sb3ItcHJvZmlsZSIsImN1cnNvciIsImRpc2NhcmQiLCJmZWRyb3BzaGFkb3ciLCJmZWltYWdlIiwiZm9udC1mYWNlIiwiZm9udC1mYWNlLWZvcm1hdCIsImZvbnQtZmFjZS1uYW1lIiwiZm9udC1mYWNlLXNyYyIsImZvbnQtZmFjZS11cmkiLCJmb3JlaWdub2JqZWN0IiwiaGF0Y2giLCJoYXRjaHBhdGgiLCJtZXNoIiwibWVzaGdyYWRpZW50IiwibWVzaHBhdGNoIiwibWVzaHJvdyIsIm1pc3NpbmctZ2x5cGgiLCJzY3JpcHQiLCJzZXQiLCJzb2xpZGNvbG9yIiwidW5rbm93biIsInVzZSJdKSxJPWkoWyJtYXRoIiwibWVuY2xvc2UiLCJtZXJyb3IiLCJtZmVuY2VkIiwibWZyYWMiLCJtZ2x5cGgiLCJtaSIsIm1sYWJlbGVkdHIiLCJtbXVsdGlzY3JpcHRzIiwibW4iLCJtbyIsIm1vdmVyIiwibXBhZGRlZCIsIm1waGFudG9tIiwibXJvb3QiLCJtcm93IiwibXMiLCJtc3BhY2UiLCJtc3FydCIsIm1zdHlsZSIsIm1zdWIiLCJtc3VwIiwibXN1YnN1cCIsIm10YWJsZSIsIm10ZCIsIm10ZXh0IiwibXRyIiwibXVuZGVyIiwibXVuZGVyb3ZlciJdKSxQPWkoWyJtYWN0aW9uIiwibWFsaWduZ3JvdXAiLCJtYWxpZ25tYXJrIiwibWxvbmdkaXYiLCJtc2NhcnJpZXMiLCJtc2NhcnJ5IiwibXNncm91cCIsIm1zdGFjayIsIm1zbGluZSIsIm1zcm93Iiwic2VtYW50aWNzIiwiYW5ub3RhdGlvbiIsImFubm90YXRpb24teG1sIiwibXByZXNjcmlwdHMiLCJub25lIl0pLE49aShbIiN0ZXh0Il0pLE09aShbImFjY2VwdCIsImFjdGlvbiIsImFsaWduIiwiYWx0IiwiYXV0b2NhcGl0YWxpemUiLCJhdXRvY29tcGxldGUiLCJhdXRvcGljdHVyZWlucGljdHVyZSIsImF1dG9wbGF5IiwiYmFja2dyb3VuZCIsImJnY29sb3IiLCJib3JkZXIiLCJjYXB0dXJlIiwiY2VsbHBhZGRpbmciLCJjZWxsc3BhY2luZyIsImNoZWNrZWQiLCJjaXRlIiwiY2xhc3MiLCJjbGVhciIsImNvbG9yIiwiY29scyIsImNvbHNwYW4iLCJjb250cm9scyIsImNvbnRyb2xzbGlzdCIsImNvb3JkcyIsImNyb3Nzb3JpZ2luIiwiZGF0ZXRpbWUiLCJkZWNvZGluZyIsImRlZmF1bHQiLCJkaXIiLCJkaXNhYmxlZCIsImRpc2FibGVwaWN0dXJlaW5waWN0dXJlIiwiZGlzYWJsZXJlbW90ZXBsYXliYWNrIiwiZG93bmxvYWQiLCJkcmFnZ2FibGUiLCJlbmN0eXBlIiwiZW50ZXJrZXloaW50IiwiZmFjZSIsImZvciIsImhlYWRlcnMiLCJoZWlnaHQiLCJoaWRkZW4iLCJoaWdoIiwiaHJlZiIsImhyZWZsYW5nIiwiaWQiLCJpbnB1dG1vZGUiLCJpbnRlZ3JpdHkiLCJpc21hcCIsImtpbmQiLCJsYWJlbCIsImxhbmciLCJsaXN0IiwibG9hZGluZyIsImxvb3AiLCJsb3ciLCJtYXgiLCJtYXhsZW5ndGgiLCJtZWRpYSIsIm1ldGhvZCIsIm1pbiIsIm1pbmxlbmd0aCIsIm11bHRpcGxlIiwibXV0ZWQiLCJuYW1lIiwibm9zaGFkZSIsIm5vdmFsaWRhdGUiLCJub3dyYXAiLCJvcGVuIiwib3B0aW11bSIsInBhdHRlcm4iLCJwbGFjZWhvbGRlciIsInBsYXlzaW5saW5lIiwicG9zdGVyIiwicHJlbG9hZCIsInB1YmRhdGUiLCJyYWRpb2dyb3VwIiwicmVhZG9ubHkiLCJyZWwiLCJyZXF1aXJlZCIsInJldiIsInJldmVyc2VkIiwicm9sZSIsInJvd3MiLCJyb3dzcGFuIiwic3BlbGxjaGVjayIsInNjb3BlIiwic2VsZWN0ZWQiLCJzaGFwZSIsInNpemUiLCJzaXplcyIsInNwYW4iLCJzcmNsYW5nIiwic3RhcnQiLCJzcmMiLCJzcmNzZXQiLCJzdGVwIiwic3R5bGUiLCJzdW1tYXJ5IiwidGFiaW5kZXgiLCJ0aXRsZSIsInRyYW5zbGF0ZSIsInR5cGUiLCJ1c2VtYXAiLCJ2YWxpZ24iLCJ2YWx1ZSIsIndpZHRoIiwieG1sbnMiLCJzbG90Il0pLFI9aShbImFjY2VudC1oZWlnaHQiLCJhY2N1bXVsYXRlIiwiYWRkaXRpdmUiLCJhbGlnbm1lbnQtYmFzZWxpbmUiLCJhc2NlbnQiLCJhdHRyaWJ1dGVuYW1lIiwiYXR0cmlidXRldHlwZSIsImF6aW11dGgiLCJiYXNlZnJlcXVlbmN5IiwiYmFzZWxpbmUtc2hpZnQiLCJiZWdpbiIsImJpYXMiLCJieSIsImNsYXNzIiwiY2xpcCIsImNsaXBwYXRodW5pdHMiLCJjbGlwLXBhdGgiLCJjbGlwLXJ1bGUiLCJjb2xvciIsImNvbG9yLWludGVycG9sYXRpb24iLCJjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMiLCJjb2xvci1wcm9maWxlIiwiY29sb3ItcmVuZGVyaW5nIiwiY3giLCJjeSIsImQiLCJkeCIsImR5IiwiZGlmZnVzZWNvbnN0YW50IiwiZGlyZWN0aW9uIiwiZGlzcGxheSIsImRpdmlzb3IiLCJkdXIiLCJlZGdlbW9kZSIsImVsZXZhdGlvbiIsImVuZCIsImZpbGwiLCJmaWxsLW9wYWNpdHkiLCJmaWxsLXJ1bGUiLCJmaWx0ZXIiLCJmaWx0ZXJ1bml0cyIsImZsb29kLWNvbG9yIiwiZmxvb2Qtb3BhY2l0eSIsImZvbnQtZmFtaWx5IiwiZm9udC1zaXplIiwiZm9udC1zaXplLWFkanVzdCIsImZvbnQtc3RyZXRjaCIsImZvbnQtc3R5bGUiLCJmb250LXZhcmlhbnQiLCJmb250LXdlaWdodCIsImZ4IiwiZnkiLCJnMSIsImcyIiwiZ2x5cGgtbmFtZSIsImdseXBocmVmIiwiZ3JhZGllbnR1bml0cyIsImdyYWRpZW50dHJhbnNmb3JtIiwiaGVpZ2h0IiwiaHJlZiIsImlkIiwiaW1hZ2UtcmVuZGVyaW5nIiwiaW4iLCJpbjIiLCJrIiwiazEiLCJrMiIsImszIiwiazQiLCJrZXJuaW5nIiwia2V5cG9pbnRzIiwia2V5c3BsaW5lcyIsImtleXRpbWVzIiwibGFuZyIsImxlbmd0aGFkanVzdCIsImxldHRlci1zcGFjaW5nIiwia2VybmVsbWF0cml4Iiwia2VybmVsdW5pdGxlbmd0aCIsImxpZ2h0aW5nLWNvbG9yIiwibG9jYWwiLCJtYXJrZXItZW5kIiwibWFya2VyLW1pZCIsIm1hcmtlci1zdGFydCIsIm1hcmtlcmhlaWdodCIsIm1hcmtlcnVuaXRzIiwibWFya2Vyd2lkdGgiLCJtYXNrY29udGVudHVuaXRzIiwibWFza3VuaXRzIiwibWF4IiwibWFzayIsIm1lZGlhIiwibWV0aG9kIiwibW9kZSIsIm1pbiIsIm5hbWUiLCJudW1vY3RhdmVzIiwib2Zmc2V0Iiwib3BlcmF0b3IiLCJvcGFjaXR5Iiwib3JkZXIiLCJvcmllbnQiLCJvcmllbnRhdGlvbiIsIm9yaWdpbiIsIm92ZXJmbG93IiwicGFpbnQtb3JkZXIiLCJwYXRoIiwicGF0aGxlbmd0aCIsInBhdHRlcm5jb250ZW50dW5pdHMiLCJwYXR0ZXJudHJhbnNmb3JtIiwicGF0dGVybnVuaXRzIiwicG9pbnRzIiwicHJlc2VydmVhbHBoYSIsInByZXNlcnZlYXNwZWN0cmF0aW8iLCJwcmltaXRpdmV1bml0cyIsInIiLCJyeCIsInJ5IiwicmFkaXVzIiwicmVmeCIsInJlZnkiLCJyZXBlYXRjb3VudCIsInJlcGVhdGR1ciIsInJlc3RhcnQiLCJyZXN1bHQiLCJyb3RhdGUiLCJzY2FsZSIsInNlZWQiLCJzaGFwZS1yZW5kZXJpbmciLCJzcGVjdWxhcmNvbnN0YW50Iiwic3BlY3VsYXJleHBvbmVudCIsInNwcmVhZG1ldGhvZCIsInN0YXJ0b2Zmc2V0Iiwic3RkZGV2aWF0aW9uIiwic3RpdGNodGlsZXMiLCJzdG9wLWNvbG9yIiwic3RvcC1vcGFjaXR5Iiwic3Ryb2tlLWRhc2hhcnJheSIsInN0cm9rZS1kYXNob2Zmc2V0Iiwic3Ryb2tlLWxpbmVjYXAiLCJzdHJva2UtbGluZWpvaW4iLCJzdHJva2UtbWl0ZXJsaW1pdCIsInN0cm9rZS1vcGFjaXR5Iiwic3Ryb2tlIiwic3Ryb2tlLXdpZHRoIiwic3R5bGUiLCJzdXJmYWNlc2NhbGUiLCJzeXN0ZW1sYW5ndWFnZSIsInRhYmluZGV4IiwidGFyZ2V0eCIsInRhcmdldHkiLCJ0cmFuc2Zvcm0iLCJ0ZXh0LWFuY2hvciIsInRleHQtZGVjb3JhdGlvbiIsInRleHQtcmVuZGVyaW5nIiwidGV4dGxlbmd0aCIsInR5cGUiLCJ1MSIsInUyIiwidW5pY29kZSIsInZhbHVlcyIsInZpZXdib3giLCJ2aXNpYmlsaXR5IiwidmVyc2lvbiIsInZlcnQtYWR2LXkiLCJ2ZXJ0LW9yaWdpbi14IiwidmVydC1vcmlnaW4teSIsIndpZHRoIiwid29yZC1zcGFjaW5nIiwid3JhcCIsIndyaXRpbmctbW9kZSIsInhjaGFubmVsc2VsZWN0b3IiLCJ5Y2hhbm5lbHNlbGVjdG9yIiwieCIsIngxIiwieDIiLCJ4bWxucyIsInkiLCJ5MSIsInkyIiwieiIsInpvb21hbmRwYW4iXSksRD1pKFsiYWNjZW50IiwiYWNjZW50dW5kZXIiLCJhbGlnbiIsImJldmVsbGVkIiwiY2xvc2UiLCJjb2x1bW5zYWxpZ24iLCJjb2x1bW5saW5lcyIsImNvbHVtbnNwYW4iLCJkZW5vbWFsaWduIiwiZGVwdGgiLCJkaXIiLCJkaXNwbGF5IiwiZGlzcGxheXN0eWxlIiwiZW5jb2RpbmciLCJmZW5jZSIsImZyYW1lIiwiaGVpZ2h0IiwiaHJlZiIsImlkIiwibGFyZ2VvcCIsImxlbmd0aCIsImxpbmV0aGlja25lc3MiLCJsc3BhY2UiLCJscXVvdGUiLCJtYXRoYmFja2dyb3VuZCIsIm1hdGhjb2xvciIsIm1hdGhzaXplIiwibWF0aHZhcmlhbnQiLCJtYXhzaXplIiwibWluc2l6ZSIsIm1vdmFibGVsaW1pdHMiLCJub3RhdGlvbiIsIm51bWFsaWduIiwib3BlbiIsInJvd2FsaWduIiwicm93bGluZXMiLCJyb3dzcGFjaW5nIiwicm93c3BhbiIsInJzcGFjZSIsInJxdW90ZSIsInNjcmlwdGxldmVsIiwic2NyaXB0bWluc2l6ZSIsInNjcmlwdHNpemVtdWx0aXBsaWVyIiwic2VsZWN0aW9uIiwic2VwYXJhdG9yIiwic2VwYXJhdG9ycyIsInN0cmV0Y2h5Iiwic3Vic2NyaXB0c2hpZnQiLCJzdXBzY3JpcHRzaGlmdCIsInN5bW1ldHJpYyIsInZvZmZzZXQiLCJ3aWR0aCIsInhtbG5zIl0pLEw9aShbInhsaW5rOmhyZWYiLCJ4bWw6aWQiLCJ4bGluazp0aXRsZSIsInhtbDpzcGFjZSIsInhtbG5zOnhsaW5rIl0pLEI9cygvXHtce1tcc1xTXSp8W1xzXFNdKlx9XH0vZ20pLEY9cygvPCVbXHNcU10qfFtcc1xTXSolPi9nbSksVT1zKC9eZGF0YS1bXC1cdy5cdTAwQjctXHVGRkZGXS8pLHE9cygvXmFyaWEtW1wtXHddKyQvKSx6PXMoL14oPzooPzooPzpmfGh0KXRwcz98bWFpbHRvfHRlbHxjYWxsdG98Y2lkfHhtcHApOnxbXmEtel18W2EteisuXC1dKyg/OlteYS16Ky5cLTpdfCQpKS9pKSxWPXMoL14oPzpcdytzY3JpcHR8ZGF0YSk6L2kpLFc9cygvW1x1MDAwMC1cdTAwMjBcdTAwQTBcdTE2ODBcdTE4MEVcdTIwMDAtXHUyMDI5XHUyMDVGXHUzMDAwXS9nKSxIPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfTtmdW5jdGlvbiAkKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpe2Zvcih2YXIgdD0wLG49QXJyYXkoZS5sZW5ndGgpO3Q8ZS5sZW5ndGg7dCsrKW5bdF09ZVt0XTtyZXR1cm4gbn1yZXR1cm4gQXJyYXkuZnJvbShlKX12YXIgSj1mdW5jdGlvbigpe3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2Ygd2luZG93P251bGw6d2luZG93fSxLPWZ1bmN0aW9uKGUsdCl7aWYoIm9iamVjdCIhPT0odm9pZCAwPT09ZT8idW5kZWZpbmVkIjpIKGUpKXx8ImZ1bmN0aW9uIiE9dHlwZW9mIGUuY3JlYXRlUG9saWN5KXJldHVybiBudWxsO3ZhciBuPW51bGwscj0iZGF0YS10dC1wb2xpY3ktc3VmZml4Ijt0LmN1cnJlbnRTY3JpcHQmJnQuY3VycmVudFNjcmlwdC5oYXNBdHRyaWJ1dGUocikmJihuPXQuY3VycmVudFNjcmlwdC5nZXRBdHRyaWJ1dGUocikpO3ZhciBvPSJkb21wdXJpZnkiKyhuPyIjIituOiIiKTt0cnl7cmV0dXJuIGUuY3JlYXRlUG9saWN5KG8se2NyZWF0ZUhUTUw6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9fSl9Y2F0Y2goZSl7cmV0dXJuIGNvbnNvbGUud2FybigiVHJ1c3RlZFR5cGVzIHBvbGljeSAiK28rIiBjb3VsZCBub3QgYmUgY3JlYXRlZC4iKSxudWxsfX07ZnVuY3Rpb24gWSgpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpKKCksdD1mdW5jdGlvbihlKXtyZXR1cm4gWShlKX07aWYodC52ZXJzaW9uPSIyLjIuOSIsdC5yZW1vdmVkPVtdLCFlfHwhZS5kb2N1bWVudHx8OSE9PWUuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIHQuaXNTdXBwb3J0ZWQ9ITEsdDt2YXIgbj1lLmRvY3VtZW50LHI9ZS5kb2N1bWVudCxvPWUuRG9jdW1lbnRGcmFnbWVudCxhPWUuSFRNTFRlbXBsYXRlRWxlbWVudCxzPWUuTm9kZSx1PWUuRWxlbWVudCxjPWUuTm9kZUZpbHRlcixsPWUuTmFtZWROb2RlTWFwLHA9dm9pZCAwPT09bD9lLk5hbWVkTm9kZU1hcHx8ZS5Nb3pOYW1lZEF0dHJNYXA6bCx4PWUuVGV4dCxFPWUuQ29tbWVudCxHPWUuRE9NUGFyc2VyLFo9ZS50cnVzdGVkVHlwZXMsWD11LnByb3RvdHlwZSxRPUEoWCwiY2xvbmVOb2RlIiksZWU9QShYLCJuZXh0U2libGluZyIpLHRlPUEoWCwiY2hpbGROb2RlcyIpLG5lPUEoWCwicGFyZW50Tm9kZSIpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXt2YXIgcmU9ci5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpO3JlLmNvbnRlbnQmJnJlLmNvbnRlbnQub3duZXJEb2N1bWVudCYmKHI9cmUuY29udGVudC5vd25lckRvY3VtZW50KX12YXIgb2U9SyhaLG4pLGFlPW9lJiZEZT9vZS5jcmVhdGVIVE1MKCIiKToiIixpZT1yLHNlPWllLmltcGxlbWVudGF0aW9uLHVlPWllLmNyZWF0ZU5vZGVJdGVyYXRvcixjZT1pZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50LGxlPW4uaW1wb3J0Tm9kZSxwZT17fTt0cnl7cGU9QyhyKS5kb2N1bWVudE1vZGU/ci5kb2N1bWVudE1vZGU6e319Y2F0Y2goZSl7fXZhciBmZT17fTt0LmlzU3VwcG9ydGVkPSJmdW5jdGlvbiI9PXR5cGVvZiBuZSYmc2UmJnZvaWQgMCE9PXNlLmNyZWF0ZUhUTUxEb2N1bWVudCYmOSE9PXBlO3ZhciBoZT1CLGRlPUYsbWU9VSx2ZT1xLGdlPVYseWU9VyxiZT16LF9lPW51bGwsd2U9Uyh7fSxbXS5jb25jYXQoJChPKSwkKGspLCQoaiksJChJKSwkKE4pKSkseGU9bnVsbCxFZT1TKHt9LFtdLmNvbmNhdCgkKE0pLCQoUiksJChEKSwkKEwpKSksU2U9bnVsbCxDZT1udWxsLEFlPSEwLE9lPSEwLGtlPSExLGplPSExLFRlPSExLEllPSExLFBlPSExLE5lPSExLE1lPSExLFJlPSEwLERlPSExLExlPSEwLEJlPSEwLEZlPSExLFVlPXt9LHFlPVMoe30sWyJhbm5vdGF0aW9uLXhtbCIsImF1ZGlvIiwiY29sZ3JvdXAiLCJkZXNjIiwiZm9yZWlnbm9iamVjdCIsImhlYWQiLCJpZnJhbWUiLCJtYXRoIiwibWkiLCJtbiIsIm1vIiwibXMiLCJtdGV4dCIsIm5vZW1iZWQiLCJub2ZyYW1lcyIsIm5vc2NyaXB0IiwicGxhaW50ZXh0Iiwic2NyaXB0Iiwic3R5bGUiLCJzdmciLCJ0ZW1wbGF0ZSIsInRoZWFkIiwidGl0bGUiLCJ2aWRlbyIsInhtcCJdKSx6ZT1udWxsLFZlPVMoe30sWyJhdWRpbyIsInZpZGVvIiwiaW1nIiwic291cmNlIiwiaW1hZ2UiLCJ0cmFjayJdKSxXZT1udWxsLEhlPVMoe30sWyJhbHQiLCJjbGFzcyIsImZvciIsImlkIiwibGFiZWwiLCJuYW1lIiwicGF0dGVybiIsInBsYWNlaG9sZGVyIiwic3VtbWFyeSIsInRpdGxlIiwidmFsdWUiLCJzdHlsZSIsInhtbG5zIl0pLCRlPSJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MIixKZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLEtlPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIixZZT1LZSxHZT0hMSxaZT1udWxsLFhlPXIuY3JlYXRlRWxlbWVudCgiZm9ybSIpLFFlPWZ1bmN0aW9uKGUpe1plJiZaZT09PWV8fChlJiYib2JqZWN0Ij09PSh2b2lkIDA9PT1lPyJ1bmRlZmluZWQiOkgoZSkpfHwoZT17fSksZT1DKGUpLF9lPSJBTExPV0VEX1RBR1MiaW4gZT9TKHt9LGUuQUxMT1dFRF9UQUdTKTp3ZSx4ZT0iQUxMT1dFRF9BVFRSImluIGU/Uyh7fSxlLkFMTE9XRURfQVRUUik6RWUsV2U9IkFERF9VUklfU0FGRV9BVFRSImluIGU/UyhDKEhlKSxlLkFERF9VUklfU0FGRV9BVFRSKTpIZSx6ZT0iQUREX0RBVEFfVVJJX1RBR1MiaW4gZT9TKEMoVmUpLGUuQUREX0RBVEFfVVJJX1RBR1MpOlZlLFNlPSJGT1JCSURfVEFHUyJpbiBlP1Moe30sZS5GT1JCSURfVEFHUyk6e30sQ2U9IkZPUkJJRF9BVFRSImluIGU/Uyh7fSxlLkZPUkJJRF9BVFRSKTp7fSxVZT0iVVNFX1BST0ZJTEVTImluIGUmJmUuVVNFX1BST0ZJTEVTLEFlPSExIT09ZS5BTExPV19BUklBX0FUVFIsT2U9ITEhPT1lLkFMTE9XX0RBVEFfQVRUUixrZT1lLkFMTE9XX1VOS05PV05fUFJPVE9DT0xTfHwhMSxqZT1lLlNBRkVfRk9SX1RFTVBMQVRFU3x8ITEsVGU9ZS5XSE9MRV9ET0NVTUVOVHx8ITEsTmU9ZS5SRVRVUk5fRE9NfHwhMSxNZT1lLlJFVFVSTl9ET01fRlJBR01FTlR8fCExLFJlPSExIT09ZS5SRVRVUk5fRE9NX0lNUE9SVCxEZT1lLlJFVFVSTl9UUlVTVEVEX1RZUEV8fCExLFBlPWUuRk9SQ0VfQk9EWXx8ITEsTGU9ITEhPT1lLlNBTklUSVpFX0RPTSxCZT0hMSE9PWUuS0VFUF9DT05URU5ULEZlPWUuSU5fUExBQ0V8fCExLGJlPWUuQUxMT1dFRF9VUklfUkVHRVhQfHxiZSxZZT1lLk5BTUVTUEFDRXx8S2UsamUmJihPZT0hMSksTWUmJihOZT0hMCksVWUmJihfZT1TKHt9LFtdLmNvbmNhdCgkKE4pKSkseGU9W10sITA9PT1VZS5odG1sJiYoUyhfZSxPKSxTKHhlLE0pKSwhMD09PVVlLnN2ZyYmKFMoX2UsayksUyh4ZSxSKSxTKHhlLEwpKSwhMD09PVVlLnN2Z0ZpbHRlcnMmJihTKF9lLGopLFMoeGUsUiksUyh4ZSxMKSksITA9PT1VZS5tYXRoTWwmJihTKF9lLEkpLFMoeGUsRCksUyh4ZSxMKSkpLGUuQUREX1RBR1MmJihfZT09PXdlJiYoX2U9QyhfZSkpLFMoX2UsZS5BRERfVEFHUykpLGUuQUREX0FUVFImJih4ZT09PUVlJiYoeGU9Qyh4ZSkpLFMoeGUsZS5BRERfQVRUUikpLGUuQUREX1VSSV9TQUZFX0FUVFImJlMoV2UsZS5BRERfVVJJX1NBRkVfQVRUUiksQmUmJihfZVsiI3RleHQiXT0hMCksVGUmJlMoX2UsWyJodG1sIiwiaGVhZCIsImJvZHkiXSksX2UudGFibGUmJihTKF9lLFsidGJvZHkiXSksZGVsZXRlIFNlLnRib2R5KSxpJiZpKGUpLFplPWUpfSxldD1TKHt9LFsibWkiLCJtbyIsIm1uIiwibXMiLCJtdGV4dCJdKSx0dD1TKHt9LFsiZm9yZWlnbm9iamVjdCIsImRlc2MiLCJ0aXRsZSIsImFubm90YXRpb24teG1sIl0pLG50PVMoe30sayk7UyhudCxqKSxTKG50LFQpO3ZhciBydD1TKHt9LEkpO1MocnQsUCk7dmFyIG90PWZ1bmN0aW9uKGUpe3ZhciB0PW5lKGUpO3QmJnQudGFnTmFtZXx8KHQ9e25hbWVzcGFjZVVSSTpLZSx0YWdOYW1lOiJ0ZW1wbGF0ZSJ9KTt2YXIgbj1tKGUudGFnTmFtZSkscj1tKHQudGFnTmFtZSk7aWYoZS5uYW1lc3BhY2VVUkk9PT1KZSlyZXR1cm4gdC5uYW1lc3BhY2VVUkk9PT1LZT8ic3ZnIj09PW46dC5uYW1lc3BhY2VVUkk9PT0kZT8ic3ZnIj09PW4mJigiYW5ub3RhdGlvbi14bWwiPT09cnx8ZXRbcl0pOkJvb2xlYW4obnRbbl0pO2lmKGUubmFtZXNwYWNlVVJJPT09JGUpcmV0dXJuIHQubmFtZXNwYWNlVVJJPT09S2U/Im1hdGgiPT09bjp0Lm5hbWVzcGFjZVVSST09PUplPyJtYXRoIj09PW4mJnR0W3JdOkJvb2xlYW4ocnRbbl0pO2lmKGUubmFtZXNwYWNlVVJJPT09S2Upe2lmKHQubmFtZXNwYWNlVVJJPT09SmUmJiF0dFtyXSlyZXR1cm4hMTtpZih0Lm5hbWVzcGFjZVVSST09PSRlJiYhZXRbcl0pcmV0dXJuITE7dmFyIG89Uyh7fSxbInRpdGxlIiwic3R5bGUiLCJmb250IiwiYSIsInNjcmlwdCJdKTtyZXR1cm4hcnRbbl0mJihvW25dfHwhbnRbbl0pfXJldHVybiExfSxhdD1mdW5jdGlvbihlKXtkKHQucmVtb3ZlZCx7ZWxlbWVudDplfSk7dHJ5e2UucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKX1jYXRjaCh0KXt0cnl7ZS5vdXRlckhUTUw9YWV9Y2F0Y2godCl7ZS5yZW1vdmUoKX19fSxpdD1mdW5jdGlvbihlLG4pe3RyeXtkKHQucmVtb3ZlZCx7YXR0cmlidXRlOm4uZ2V0QXR0cmlidXRlTm9kZShlKSxmcm9tOm59KX1jYXRjaChlKXtkKHQucmVtb3ZlZCx7YXR0cmlidXRlOm51bGwsZnJvbTpufSl9aWYobi5yZW1vdmVBdHRyaWJ1dGUoZSksImlzIj09PWUmJiF4ZVtlXSlpZihOZXx8TWUpdHJ5e2F0KG4pfWNhdGNoKGUpe31lbHNlIHRyeXtuLnNldEF0dHJpYnV0ZShlLCIiKX1jYXRjaChlKXt9fSxzdD1mdW5jdGlvbihlKXt2YXIgdD12b2lkIDAsbj12b2lkIDA7aWYoUGUpZT0iPHJlbW92ZT48L3JlbW92ZT4iK2U7ZWxzZXt2YXIgbz12KGUsL15bXHJcblx0IF0rLyk7bj1vJiZvWzBdfXZhciBhPW9lP29lLmNyZWF0ZUhUTUwoZSk6ZTtpZihZZT09PUtlKXRyeXt0PShuZXcgRykucGFyc2VGcm9tU3RyaW5nKGEsInRleHQvaHRtbCIpfWNhdGNoKGUpe31pZighdHx8IXQuZG9jdW1lbnRFbGVtZW50KXt0PXNlLmNyZWF0ZURvY3VtZW50KFllLCJ0ZW1wbGF0ZSIsbnVsbCk7dHJ5e3QuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTD1HZT8iIjphfWNhdGNoKGUpe319dmFyIGk9dC5ib2R5fHx0LmRvY3VtZW50RWxlbWVudDtyZXR1cm4gZSYmbiYmaS5pbnNlcnRCZWZvcmUoci5jcmVhdGVUZXh0Tm9kZShuKSxpLmNoaWxkTm9kZXNbMF18fG51bGwpLFRlP3QuZG9jdW1lbnRFbGVtZW50Oml9LHV0PWZ1bmN0aW9uKGUpe3JldHVybiB1ZS5jYWxsKGUub3duZXJEb2N1bWVudHx8ZSxlLGMuU0hPV19FTEVNRU5UfGMuU0hPV19DT01NRU5UfGMuU0hPV19URVhULG51bGwsITEpfSxjdD1mdW5jdGlvbihlKXtyZXR1cm4hKGUgaW5zdGFuY2VvZiB4fHxlIGluc3RhbmNlb2YgRXx8InN0cmluZyI9PXR5cGVvZiBlLm5vZGVOYW1lJiYic3RyaW5nIj09dHlwZW9mIGUudGV4dENvbnRlbnQmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnJlbW92ZUNoaWxkJiZlLmF0dHJpYnV0ZXMgaW5zdGFuY2VvZiBwJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5yZW1vdmVBdHRyaWJ1dGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnNldEF0dHJpYnV0ZSYmInN0cmluZyI9PXR5cGVvZiBlLm5hbWVzcGFjZVVSSSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuaW5zZXJ0QmVmb3JlKX0sbHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIm9iamVjdCI9PT0odm9pZCAwPT09cz8idW5kZWZpbmVkIjpIKHMpKT9lIGluc3RhbmNlb2YgczplJiYib2JqZWN0Ij09PSh2b2lkIDA9PT1lPyJ1bmRlZmluZWQiOkgoZSkpJiYibnVtYmVyIj09dHlwZW9mIGUubm9kZVR5cGUmJiJzdHJpbmciPT10eXBlb2YgZS5ub2RlTmFtZX0scHQ9ZnVuY3Rpb24oZSxuLHIpe2ZlW2VdJiZmKGZlW2VdLChmdW5jdGlvbihlKXtlLmNhbGwodCxuLHIsWmUpfSkpfSxmdD1mdW5jdGlvbihlKXt2YXIgbj12b2lkIDA7aWYocHQoImJlZm9yZVNhbml0aXplRWxlbWVudHMiLGUsbnVsbCksY3QoZSkpcmV0dXJuIGF0KGUpLCEwO2lmKHYoZS5ub2RlTmFtZSwvW1x1MDA4MC1cdUZGRkZdLykpcmV0dXJuIGF0KGUpLCEwO3ZhciByPW0oZS5ub2RlTmFtZSk7aWYocHQoInVwb25TYW5pdGl6ZUVsZW1lbnQiLGUse3RhZ05hbWU6cixhbGxvd2VkVGFnczpfZX0pLCFsdChlLmZpcnN0RWxlbWVudENoaWxkKSYmKCFsdChlLmNvbnRlbnQpfHwhbHQoZS5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkKSkmJl8oLzxbL1x3XS9nLGUuaW5uZXJIVE1MKSYmXygvPFsvXHddL2csZS50ZXh0Q29udGVudCkpcmV0dXJuIGF0KGUpLCEwO2lmKCFfZVtyXXx8U2Vbcl0pe2lmKEJlJiYhcWVbcl0pe3ZhciBvPW5lKGUpfHxlLnBhcmVudE5vZGUsYT10ZShlKXx8ZS5jaGlsZE5vZGVzO2lmKGEmJm8pZm9yKHZhciBpPWEubGVuZ3RoLTE7aT49MDstLWkpby5pbnNlcnRCZWZvcmUoUShhW2ldLCEwKSxlZShlKSl9cmV0dXJuIGF0KGUpLCEwfXJldHVybiBlIGluc3RhbmNlb2YgdSYmIW90KGUpPyhhdChlKSwhMCk6Im5vc2NyaXB0IiE9PXImJiJub2VtYmVkIiE9PXJ8fCFfKC88XC9ubyhzY3JpcHR8ZW1iZWQpL2ksZS5pbm5lckhUTUwpPyhqZSYmMz09PWUubm9kZVR5cGUmJihuPWUudGV4dENvbnRlbnQsbj1nKG4saGUsIiAiKSxuPWcobixkZSwiICIpLGUudGV4dENvbnRlbnQhPT1uJiYoZCh0LnJlbW92ZWQse2VsZW1lbnQ6ZS5jbG9uZU5vZGUoKX0pLGUudGV4dENvbnRlbnQ9bikpLHB0KCJhZnRlclNhbml0aXplRWxlbWVudHMiLGUsbnVsbCksITEpOihhdChlKSwhMCl9LGh0PWZ1bmN0aW9uKGUsdCxuKXtpZihMZSYmKCJpZCI9PT10fHwibmFtZSI9PT10KSYmKG4gaW4gcnx8biBpbiBYZSkpcmV0dXJuITE7aWYoT2UmJl8obWUsdCkpO2Vsc2UgaWYoQWUmJl8odmUsdCkpO2Vsc2V7aWYoIXhlW3RdfHxDZVt0XSlyZXR1cm4hMTtpZihXZVt0XSk7ZWxzZSBpZihfKGJlLGcobix5ZSwiIikpKTtlbHNlIGlmKCJzcmMiIT09dCYmInhsaW5rOmhyZWYiIT09dCYmImhyZWYiIT09dHx8InNjcmlwdCI9PT1lfHwwIT09eShuLCJkYXRhOiIpfHwhemVbZV0paWYoa2UmJiFfKGdlLGcobix5ZSwiIikpKTtlbHNlIGlmKG4pcmV0dXJuITF9cmV0dXJuITB9LGR0PWZ1bmN0aW9uKGUpe3ZhciBuPXZvaWQgMCxyPXZvaWQgMCxvPXZvaWQgMCxhPXZvaWQgMDtwdCgiYmVmb3JlU2FuaXRpemVBdHRyaWJ1dGVzIixlLG51bGwpO3ZhciBpPWUuYXR0cmlidXRlcztpZihpKXt2YXIgcz17YXR0ck5hbWU6IiIsYXR0clZhbHVlOiIiLGtlZXBBdHRyOiEwLGFsbG93ZWRBdHRyaWJ1dGVzOnhlfTtmb3IoYT1pLmxlbmd0aDthLS07KXt2YXIgdT1uPWlbYV0sYz11Lm5hbWUsbD11Lm5hbWVzcGFjZVVSSTtpZihyPWIobi52YWx1ZSksbz1tKGMpLHMuYXR0ck5hbWU9byxzLmF0dHJWYWx1ZT1yLHMua2VlcEF0dHI9ITAscy5mb3JjZUtlZXBBdHRyPXZvaWQgMCxwdCgidXBvblNhbml0aXplQXR0cmlidXRlIixlLHMpLHI9cy5hdHRyVmFsdWUsIXMuZm9yY2VLZWVwQXR0ciYmKGl0KGMsZSkscy5rZWVwQXR0cikpaWYoXygvXC8+L2kscikpaXQoYyxlKTtlbHNle2plJiYocj1nKHIsaGUsIiAiKSxyPWcocixkZSwiICIpKTt2YXIgcD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7aWYoaHQocCxvLHIpKXRyeXtsP2Uuc2V0QXR0cmlidXRlTlMobCxjLHIpOmUuc2V0QXR0cmlidXRlKGMsciksaCh0LnJlbW92ZWQpfWNhdGNoKGUpe319fXB0KCJhZnRlclNhbml0aXplQXR0cmlidXRlcyIsZSxudWxsKX19LG10PWZ1bmN0aW9uIGUodCl7dmFyIG49dm9pZCAwLHI9dXQodCk7Zm9yKHB0KCJiZWZvcmVTYW5pdGl6ZVNoYWRvd0RPTSIsdCxudWxsKTtuPXIubmV4dE5vZGUoKTspcHQoInVwb25TYW5pdGl6ZVNoYWRvd05vZGUiLG4sbnVsbCksZnQobil8fChuLmNvbnRlbnQgaW5zdGFuY2VvZiBvJiZlKG4uY29udGVudCksZHQobikpO3B0KCJhZnRlclNhbml0aXplU2hhZG93RE9NIix0LG51bGwpfTtyZXR1cm4gdC5zYW5pdGl6ZT1mdW5jdGlvbihyLGEpe3ZhciBpPXZvaWQgMCx1PXZvaWQgMCxjPXZvaWQgMCxsPXZvaWQgMCxwPXZvaWQgMDtpZigoR2U9IXIpJiYocj0iXHgzYyEtLVx4M2UiKSwic3RyaW5nIiE9dHlwZW9mIHImJiFsdChyKSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHIudG9TdHJpbmcpdGhyb3cgdygidG9TdHJpbmcgaXMgbm90IGEgZnVuY3Rpb24iKTtpZigic3RyaW5nIiE9dHlwZW9mKHI9ci50b1N0cmluZygpKSl0aHJvdyB3KCJkaXJ0eSBpcyBub3QgYSBzdHJpbmcsIGFib3J0aW5nIil9aWYoIXQuaXNTdXBwb3J0ZWQpe2lmKCJvYmplY3QiPT09SChlLnRvU3RhdGljSFRNTCl8fCJmdW5jdGlvbiI9PXR5cGVvZiBlLnRvU3RhdGljSFRNTCl7aWYoInN0cmluZyI9PXR5cGVvZiByKXJldHVybiBlLnRvU3RhdGljSFRNTChyKTtpZihsdChyKSlyZXR1cm4gZS50b1N0YXRpY0hUTUwoci5vdXRlckhUTUwpfXJldHVybiByfWlmKEllfHxRZShhKSx0LnJlbW92ZWQ9W10sInN0cmluZyI9PXR5cGVvZiByJiYoRmU9ITEpLEZlKTtlbHNlIGlmKHIgaW5zdGFuY2VvZiBzKTE9PT0odT0oaT1zdCgiXHgzYyEtLS0tXHgzZSIpKS5vd25lckRvY3VtZW50LmltcG9ydE5vZGUociwhMCkpLm5vZGVUeXBlJiYiQk9EWSI9PT11Lm5vZGVOYW1lfHwiSFRNTCI9PT11Lm5vZGVOYW1lP2k9dTppLmFwcGVuZENoaWxkKHUpO2Vsc2V7aWYoIU5lJiYhamUmJiFUZSYmLTE9PT1yLmluZGV4T2YoIjwiKSlyZXR1cm4gb2UmJkRlP29lLmNyZWF0ZUhUTUwocik6cjtpZighKGk9c3QocikpKXJldHVybiBOZT9udWxsOmFlfWkmJlBlJiZhdChpLmZpcnN0Q2hpbGQpO2Zvcih2YXIgZj11dChGZT9yOmkpO2M9Zi5uZXh0Tm9kZSgpOykzPT09Yy5ub2RlVHlwZSYmYz09PWx8fGZ0KGMpfHwoYy5jb250ZW50IGluc3RhbmNlb2YgbyYmbXQoYy5jb250ZW50KSxkdChjKSxsPWMpO2lmKGw9bnVsbCxGZSlyZXR1cm4gcjtpZihOZSl7aWYoTWUpZm9yKHA9Y2UuY2FsbChpLm93bmVyRG9jdW1lbnQpO2kuZmlyc3RDaGlsZDspcC5hcHBlbmRDaGlsZChpLmZpcnN0Q2hpbGQpO2Vsc2UgcD1pO3JldHVybiBSZSYmKHA9bGUuY2FsbChuLHAsITApKSxwfXZhciBoPVRlP2kub3V0ZXJIVE1MOmkuaW5uZXJIVE1MO3JldHVybiBqZSYmKGg9ZyhoLGhlLCIgIiksaD1nKGgsZGUsIiAiKSksb2UmJkRlP29lLmNyZWF0ZUhUTUwoaCk6aH0sdC5zZXRDb25maWc9ZnVuY3Rpb24oZSl7UWUoZSksSWU9ITB9LHQuY2xlYXJDb25maWc9ZnVuY3Rpb24oKXtaZT1udWxsLEllPSExfSx0LmlzVmFsaWRBdHRyaWJ1dGU9ZnVuY3Rpb24oZSx0LG4pe1plfHxRZSh7fSk7dmFyIHI9bShlKSxvPW0odCk7cmV0dXJuIGh0KHIsbyxuKX0sdC5hZGRIb29rPWZ1bmN0aW9uKGUsdCl7ImZ1bmN0aW9uIj09dHlwZW9mIHQmJihmZVtlXT1mZVtlXXx8W10sZChmZVtlXSx0KSl9LHQucmVtb3ZlSG9vaz1mdW5jdGlvbihlKXtmZVtlXSYmaChmZVtlXSl9LHQucmVtb3ZlSG9va3M9ZnVuY3Rpb24oZSl7ZmVbZV0mJihmZVtlXT1bXSl9LHQucmVtb3ZlQWxsSG9va3M9ZnVuY3Rpb24oKXtmZT17fX0sdH1yZXR1cm4gWSgpfSgpfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big0MCksbz1uKDQ3KSxhPXIuZG9jdW1lbnQsaT1vKGEpJiZvKGEuY3JlYXRlRWxlbWVudCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBpP2EuY3JlYXRlRWxlbWVudChlKTp7fX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDQ3KSxvPW4oMTUzKSxhPW4oNDEpKCJzcGVjaWVzIik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIG47cmV0dXJuIG8oZSkmJigiZnVuY3Rpb24iIT10eXBlb2Yobj1lLmNvbnN0cnVjdG9yKXx8biE9PUFycmF5JiYhbyhuLnByb3RvdHlwZSk/cihuKSYmbnVsbD09PShuPW5bYV0pJiYobj12b2lkIDApOm49dm9pZCAwKSxuZXcodm9pZCAwPT09bj9BcnJheTpuKSgwPT09dD8wOnQpfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oOTYpLG89bigyMjYpOyhlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gb1tlXXx8KG9bZV09dm9pZCAwIT09dD90Ont9KX0pKCJ2ZXJzaW9ucyIsW10pLnB1c2goe3ZlcnNpb246IjMuMTUuMSIsbW9kZTpyPyJwdXJlIjoiZ2xvYmFsIixjb3B5cmlnaHQ6IsKpIDIwMjEgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSkifSl9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDQwKSxvPW4oNTM3KSxhPSJfX2NvcmUtanNfc2hhcmVkX18iLGk9clthXXx8byhhLHt9KTtlLmV4cG9ydHM9aX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTI5KSxvPW4oMzcpO2UuZXhwb3J0cz0hIU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMmJiFvKChmdW5jdGlvbigpe3ZhciBlPVN5bWJvbCgpO3JldHVybiFTdHJpbmcoZSl8fCEoT2JqZWN0KGUpaW5zdGFuY2VvZiBTeW1ib2wpfHwhU3ltYm9sLnNoYW0mJnImJnI8NDF9KSl9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDQ4KSxvPW4oNjgpLGE9big1MiksaT1uKDE1Nik7ZS5leHBvcnRzPXI/T2JqZWN0LmRlZmluZVByb3BlcnRpZXM6ZnVuY3Rpb24oZSx0KXthKGUpO2Zvcih2YXIgbixyPWkodCkscz1yLmxlbmd0aCx1PTA7cz51OylvLmYoZSxuPXJbdSsrXSx0W25dKTtyZXR1cm4gZX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDY2KSxvPW4oNjkpLGE9bigyMzApLGk9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQsbixpKXt2YXIgcyx1PXIodCksYz1vKHUubGVuZ3RoKSxsPWEoaSxjKTtpZihlJiZuIT1uKXtmb3IoO2M+bDspaWYoKHM9dVtsKytdKSE9cylyZXR1cm4hMH1lbHNlIGZvcig7Yz5sO2wrKylpZigoZXx8bCBpbiB1KSYmdVtsXT09PW4pcmV0dXJuIGV8fGx8fDA7cmV0dXJuIWUmJi0xfX07ZS5leHBvcnRzPXtpbmNsdWRlczppKCEwKSxpbmRleE9mOmkoITEpfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTI4KSxvPU1hdGgubWF4LGE9TWF0aC5taW47ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIG49cihlKTtyZXR1cm4gbjwwP28obit0LDApOmEobix0KX19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPVsiY29uc3RydWN0b3IiLCJoYXNPd25Qcm9wZXJ0eSIsImlzUHJvdG90eXBlT2YiLCJwcm9wZXJ0eUlzRW51bWVyYWJsZSIsInRvTG9jYWxlU3RyaW5nIiwidG9TdHJpbmciLCJ2YWx1ZU9mIl19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDM2NCksbz1uKDIzMSkuY29uY2F0KCJsZW5ndGgiLCJwcm90b3R5cGUiKTt0LmY9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXN8fGZ1bmN0aW9uKGUpe3JldHVybiByKGUsbyl9fSxmdW5jdGlvbihlLHQpe3QuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big0MSk7dC5mPXJ9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj17fTtyW24oNDEpKCJ0b1N0cmluZ1RhZyIpXT0ieiIsZS5leHBvcnRzPSJbb2JqZWN0IHpdIj09PVN0cmluZyhyKX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDIyKSxvPW4oMzcwKSxhPW4oMTg0KSxpPW4oMTg1KSxzPW4oOTcpLHU9big2NyksYz1uKDExMiksbD1uKDQxKSxwPW4oOTYpLGY9bigxMzEpLGg9bigzNzEpLGQ9aC5JdGVyYXRvclByb3RvdHlwZSxtPWguQlVHR1lfU0FGQVJJX0lURVJBVE9SUyx2PWwoIml0ZXJhdG9yIiksZz0ia2V5cyIseT0idmFsdWVzIixiPSJlbnRyaWVzIixfPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9O2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixsLGgsdyx4KXtvKG4sdCxsKTt2YXIgRSxTLEMsQT1mdW5jdGlvbihlKXtpZihlPT09aCYmSSlyZXR1cm4gSTtpZighbSYmZSBpbiBqKXJldHVybiBqW2VdO3N3aXRjaChlKXtjYXNlIGc6Y2FzZSB5OmNhc2UgYjpyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcyxlKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMpfX0sTz10KyIgSXRlcmF0b3IiLGs9ITEsaj1lLnByb3RvdHlwZSxUPWpbdl18fGpbIkBAaXRlcmF0b3IiXXx8aCYmaltoXSxJPSFtJiZUfHxBKGgpLFA9IkFycmF5Ij09dCYmai5lbnRyaWVzfHxUO2lmKFAmJihFPWEoUC5jYWxsKG5ldyBlKSksZCE9PU9iamVjdC5wcm90b3R5cGUmJkUubmV4dCYmKHB8fGEoRSk9PT1kfHwoaT9pKEUsZCk6ImZ1bmN0aW9uIiE9dHlwZW9mIEVbdl0mJnUoRSx2LF8pKSxzKEUsTywhMCwhMCkscCYmKGZbT109XykpKSxoPT15JiZUJiZULm5hbWUhPT15JiYoaz0hMCxJPWZ1bmN0aW9uKCl7cmV0dXJuIFQuY2FsbCh0aGlzKX0pLHAmJiF4fHxqW3ZdPT09SXx8dShqLHYsSSksZlt0XT1JLGgpaWYoUz17dmFsdWVzOkEoeSksa2V5czp3P0k6QShnKSxlbnRyaWVzOkEoYil9LHgpZm9yKEMgaW4gUykobXx8a3x8IShDIGluIGopKSYmYyhqLEMsU1tDXSk7ZWxzZSByKHt0YXJnZXQ6dCxwcm90bzohMCxmb3JjZWQ6bXx8a30sUyk7cmV0dXJuIFN9fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbigpe319LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9big1ODEpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz17fX0sZnVuY3Rpb24oZSx0LG4pe2UuZXhwb3J0cz1uKDYyNCl9LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9big2MjUpfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big2OTMpLG89big3MDkpLGE9big3MTEpLGk9big3MTIpLHM9big3MTMpO2Z1bmN0aW9uIHUoZSl7dmFyIHQ9LTEsbj1udWxsPT1lPzA6ZS5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK3Q8bjspe3ZhciByPWVbdF07dGhpcy5zZXQoclswXSxyWzFdKX19dS5wcm90b3R5cGUuY2xlYXI9cix1LnByb3RvdHlwZS5kZWxldGU9byx1LnByb3RvdHlwZS5nZXQ9YSx1LnByb3RvdHlwZS5oYXM9aSx1LnByb3RvdHlwZS5zZXQ9cyxlLmV4cG9ydHM9dX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTE1KShuKDcxKSwiTWFwIik7ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDE5MCksbz1uKDcxNyksYT1uKDcxOCksaT1uKDcxOSkscz1uKDcyMCksdT1uKDcyMSk7ZnVuY3Rpb24gYyhlKXt2YXIgdD10aGlzLl9fZGF0YV9fPW5ldyByKGUpO3RoaXMuc2l6ZT10LnNpemV9Yy5wcm90b3R5cGUuY2xlYXI9byxjLnByb3RvdHlwZS5kZWxldGU9YSxjLnByb3RvdHlwZS5nZXQ9aSxjLnByb3RvdHlwZS5oYXM9cyxjLnByb3RvdHlwZS5zZXQ9dSxlLmV4cG9ydHM9Y30sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49LTEscj10Lmxlbmd0aCxvPWUubGVuZ3RoOysrbjxyOyllW28rbl09dFtuXTtyZXR1cm4gZX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDczMSksbz1uKDQxNyksYT1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLGk9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxzPWk/ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/W106KGU9T2JqZWN0KGUpLHIoaShlKSwoZnVuY3Rpb24odCl7cmV0dXJuIGEuY2FsbChlLHQpfSkpKX06bztlLmV4cG9ydHM9c30sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNzM1KSxvPW4oMjQ5KSxhPW4oMjUwKSxpPWEmJmEuaXNUeXBlZEFycmF5LHM9aT9vKGkpOnI7ZS5leHBvcnRzPXN9LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZSYmZT4tMSYmZSUxPT0wJiZlPD05MDA3MTk5MjU0NzQwOTkxfX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlKHQpfX19LGZ1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24oZSl7dmFyIHI9big0MDUpLG89dCYmIXQubm9kZVR5cGUmJnQsYT1vJiYib2JqZWN0Ij09dHlwZW9mIGUmJmUmJiFlLm5vZGVUeXBlJiZlLGk9YSYmYS5leHBvcnRzPT09byYmci5wcm9jZXNzLHM9ZnVuY3Rpb24oKXt0cnl7dmFyIGU9YSYmYS5yZXF1aXJlJiZhLnJlcXVpcmUoInV0aWwiKS50eXBlcztyZXR1cm4gZXx8aSYmaS5iaW5kaW5nJiZpLmJpbmRpbmcoInV0aWwiKX1jYXRjaChlKXt9fSgpO2UuZXhwb3J0cz1zfSkuY2FsbCh0aGlzLG4oMTk2KShlKSl9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDE2Miksbz1uKDEzOCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTAsYT0odD1yKHQsZSkpLmxlbmd0aDtudWxsIT1lJiZuPGE7KWU9ZVtvKHRbbisrXSldO3JldHVybiBuJiZuPT1hP2U6dm9pZCAwfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNTYpLG89bigxODgpLGE9L1wufFxbKD86W15bXF1dKnwoWyInXSkoPzooPyFcMSlbXlxcXXxcXC4pKj9cMSlcXS8saT0vXlx3KiQvO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2lmKHIoZSkpcmV0dXJuITE7dmFyIG49dHlwZW9mIGU7cmV0dXJuISgibnVtYmVyIiE9biYmInN5bWJvbCIhPW4mJiJib29sZWFuIiE9biYmbnVsbCE9ZSYmIW8oZSkpfHwoaS50ZXN0KGUpfHwhYS50ZXN0KGUpfHxudWxsIT10JiZlIGluIE9iamVjdCh0KSl9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByLG89Im9iamVjdCI9PXR5cGVvZiBSZWZsZWN0P1JlZmxlY3Q6bnVsbCxhPW8mJiJmdW5jdGlvbiI9PXR5cGVvZiBvLmFwcGx5P28uYXBwbHk6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHkuY2FsbChlLHQsbil9O3I9byYmImZ1bmN0aW9uIj09dHlwZW9mIG8ub3duS2V5cz9vLm93bktleXM6T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scz9mdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSkuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSkpfTpmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSl9O3ZhciBpPU51bWJlci5pc05hTnx8ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPWV9O2Z1bmN0aW9uIHMoKXtzLmluaXQuY2FsbCh0aGlzKX1lLmV4cG9ydHM9cyxlLmV4cG9ydHMub25jZT1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24obixyKXtmdW5jdGlvbiBvKCl7dm9pZCAwIT09YSYmZS5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLGEpLG4oW10uc2xpY2UuY2FsbChhcmd1bWVudHMpKX12YXIgYTsiZXJyb3IiIT09dCYmKGE9ZnVuY3Rpb24obil7ZS5yZW1vdmVMaXN0ZW5lcih0LG8pLHIobil9LGUub25jZSgiZXJyb3IiLGEpKSxlLm9uY2UodCxvKX0pKX0scy5FdmVudEVtaXR0ZXI9cyxzLnByb3RvdHlwZS5fZXZlbnRzPXZvaWQgMCxzLnByb3RvdHlwZS5fZXZlbnRzQ291bnQ9MCxzLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzPXZvaWQgMDt2YXIgdT0xMDtmdW5jdGlvbiBjKGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSAibGlzdGVuZXIiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBGdW5jdGlvbi4gUmVjZWl2ZWQgdHlwZSAnK3R5cGVvZiBlKX1mdW5jdGlvbiBsKGUpe3JldHVybiB2b2lkIDA9PT1lLl9tYXhMaXN0ZW5lcnM/cy5kZWZhdWx0TWF4TGlzdGVuZXJzOmUuX21heExpc3RlbmVyc31mdW5jdGlvbiBwKGUsdCxuLHIpe3ZhciBvLGEsaSxzO2lmKGMobiksdm9pZCAwPT09KGE9ZS5fZXZlbnRzKT8oYT1lLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSxlLl9ldmVudHNDb3VudD0wKToodm9pZCAwIT09YS5uZXdMaXN0ZW5lciYmKGUuZW1pdCgibmV3TGlzdGVuZXIiLHQsbi5saXN0ZW5lcj9uLmxpc3RlbmVyOm4pLGE9ZS5fZXZlbnRzKSxpPWFbdF0pLHZvaWQgMD09PWkpaT1hW3RdPW4sKytlLl9ldmVudHNDb3VudDtlbHNlIGlmKCJmdW5jdGlvbiI9PXR5cGVvZiBpP2k9YVt0XT1yP1tuLGldOltpLG5dOnI/aS51bnNoaWZ0KG4pOmkucHVzaChuKSwobz1sKGUpKT4wJiZpLmxlbmd0aD5vJiYhaS53YXJuZWQpe2kud2FybmVkPSEwO3ZhciB1PW5ldyBFcnJvcigiUG9zc2libGUgRXZlbnRFbWl0dGVyIG1lbW9yeSBsZWFrIGRldGVjdGVkLiAiK2kubGVuZ3RoKyIgIitTdHJpbmcodCkrIiBsaXN0ZW5lcnMgYWRkZWQuIFVzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvIGluY3JlYXNlIGxpbWl0Iik7dS5uYW1lPSJNYXhMaXN0ZW5lcnNFeGNlZWRlZFdhcm5pbmciLHUuZW1pdHRlcj1lLHUudHlwZT10LHUuY291bnQ9aS5sZW5ndGgscz11LGNvbnNvbGUmJmNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKHMpfXJldHVybiBlfWZ1bmN0aW9uIGYoKXtpZighdGhpcy5maXJlZClyZXR1cm4gdGhpcy50YXJnZXQucmVtb3ZlTGlzdGVuZXIodGhpcy50eXBlLHRoaXMud3JhcEZuKSx0aGlzLmZpcmVkPSEwLDA9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMubGlzdGVuZXIuY2FsbCh0aGlzLnRhcmdldCk6dGhpcy5saXN0ZW5lci5hcHBseSh0aGlzLnRhcmdldCxhcmd1bWVudHMpfWZ1bmN0aW9uIGgoZSx0LG4pe3ZhciByPXtmaXJlZDohMSx3cmFwRm46dm9pZCAwLHRhcmdldDplLHR5cGU6dCxsaXN0ZW5lcjpufSxvPWYuYmluZChyKTtyZXR1cm4gby5saXN0ZW5lcj1uLHIud3JhcEZuPW8sb31mdW5jdGlvbiBkKGUsdCxuKXt2YXIgcj1lLl9ldmVudHM7aWYodm9pZCAwPT09cilyZXR1cm5bXTt2YXIgbz1yW3RdO3JldHVybiB2b2lkIDA9PT1vP1tdOiJmdW5jdGlvbiI9PXR5cGVvZiBvP24/W28ubGlzdGVuZXJ8fG9dOltvXTpuP2Z1bmN0aW9uKGUpe2Zvcih2YXIgdD1uZXcgQXJyYXkoZS5sZW5ndGgpLG49MDtuPHQubGVuZ3RoOysrbil0W25dPWVbbl0ubGlzdGVuZXJ8fGVbbl07cmV0dXJuIHR9KG8pOnYobyxvLmxlbmd0aCl9ZnVuY3Rpb24gbShlKXt2YXIgdD10aGlzLl9ldmVudHM7aWYodm9pZCAwIT09dCl7dmFyIG49dFtlXTtpZigiZnVuY3Rpb24iPT10eXBlb2YgbilyZXR1cm4gMTtpZih2b2lkIDAhPT1uKXJldHVybiBuLmxlbmd0aH1yZXR1cm4gMH1mdW5jdGlvbiB2KGUsdCl7Zm9yKHZhciBuPW5ldyBBcnJheSh0KSxyPTA7cjx0OysrciluW3JdPWVbcl07cmV0dXJuIG59T2JqZWN0LmRlZmluZVByb3BlcnR5KHMsImRlZmF1bHRNYXhMaXN0ZW5lcnMiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB1fSxzZXQ6ZnVuY3Rpb24oZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlfHxlPDB8fGkoZSkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBvZiAiZGVmYXVsdE1heExpc3RlbmVycyIgaXMgb3V0IG9mIHJhbmdlLiBJdCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlci4gUmVjZWl2ZWQgJytlKyIuIik7dT1lfX0pLHMuaW5pdD1mdW5jdGlvbigpe3ZvaWQgMCE9PXRoaXMuX2V2ZW50cyYmdGhpcy5fZXZlbnRzIT09T2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLl9ldmVudHN8fCh0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wKSx0aGlzLl9tYXhMaXN0ZW5lcnM9dGhpcy5fbWF4TGlzdGVuZXJzfHx2b2lkIDB9LHMucHJvdG90eXBlLnNldE1heExpc3RlbmVycz1mdW5jdGlvbihlKXtpZigibnVtYmVyIiE9dHlwZW9mIGV8fGU8MHx8aShlKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mICJuIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnK2UrIi4iKTtyZXR1cm4gdGhpcy5fbWF4TGlzdGVuZXJzPWUsdGhpc30scy5wcm90b3R5cGUuZ2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIGwodGhpcyl9LHMucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXQucHVzaChhcmd1bWVudHNbbl0pO3ZhciByPSJlcnJvciI9PT1lLG89dGhpcy5fZXZlbnRzO2lmKHZvaWQgMCE9PW8pcj1yJiZ2b2lkIDA9PT1vLmVycm9yO2Vsc2UgaWYoIXIpcmV0dXJuITE7aWYocil7dmFyIGk7aWYodC5sZW5ndGg+MCYmKGk9dFswXSksaSBpbnN0YW5jZW9mIEVycm9yKXRocm93IGk7dmFyIHM9bmV3IEVycm9yKCJVbmhhbmRsZWQgZXJyb3IuIisoaT8iICgiK2kubWVzc2FnZSsiKSI6IiIpKTt0aHJvdyBzLmNvbnRleHQ9aSxzfXZhciB1PW9bZV07aWYodm9pZCAwPT09dSlyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdSlhKHUsdGhpcyx0KTtlbHNle3ZhciBjPXUubGVuZ3RoLGw9dih1LGMpO2ZvcihuPTA7bjxjOysrbilhKGxbbl0sdGhpcyx0KX1yZXR1cm4hMH0scy5wcm90b3R5cGUuYWRkTGlzdGVuZXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcCh0aGlzLGUsdCwhMSl9LHMucHJvdG90eXBlLm9uPXMucHJvdG90eXBlLmFkZExpc3RlbmVyLHMucHJvdG90eXBlLnByZXBlbmRMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3JldHVybiBwKHRoaXMsZSx0LCEwKX0scy5wcm90b3R5cGUub25jZT1mdW5jdGlvbihlLHQpe3JldHVybiBjKHQpLHRoaXMub24oZSxoKHRoaXMsZSx0KSksdGhpc30scy5wcm90b3R5cGUucHJlcGVuZE9uY2VMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3JldHVybiBjKHQpLHRoaXMucHJlcGVuZExpc3RlbmVyKGUsaCh0aGlzLGUsdCkpLHRoaXN9LHMucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7dmFyIG4scixvLGEsaTtpZihjKHQpLHZvaWQgMD09PShyPXRoaXMuX2V2ZW50cykpcmV0dXJuIHRoaXM7aWYodm9pZCAwPT09KG49cltlXSkpcmV0dXJuIHRoaXM7aWYobj09PXR8fG4ubGlzdGVuZXI9PT10KTA9PS0tdGhpcy5fZXZlbnRzQ291bnQ/dGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCk6KGRlbGV0ZSByW2VdLHIucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLGUsbi5saXN0ZW5lcnx8dCkpO2Vsc2UgaWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pe2ZvcihvPS0xLGE9bi5sZW5ndGgtMTthPj0wO2EtLSlpZihuW2FdPT09dHx8blthXS5saXN0ZW5lcj09PXQpe2k9blthXS5saXN0ZW5lcixvPWE7YnJlYWt9aWYobzwwKXJldHVybiB0aGlzOzA9PT1vP24uc2hpZnQoKTpmdW5jdGlvbihlLHQpe2Zvcig7dCsxPGUubGVuZ3RoO3QrKyllW3RdPWVbdCsxXTtlLnBvcCgpfShuLG8pLDE9PT1uLmxlbmd0aCYmKHJbZV09blswXSksdm9pZCAwIT09ci5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KCJyZW1vdmVMaXN0ZW5lciIsZSxpfHx0KX1yZXR1cm4gdGhpc30scy5wcm90b3R5cGUub2ZmPXMucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyLHMucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbihlKXt2YXIgdCxuLHI7aWYodm9pZCAwPT09KG49dGhpcy5fZXZlbnRzKSlyZXR1cm4gdGhpcztpZih2b2lkIDA9PT1uLnJlbW92ZUxpc3RlbmVyKXJldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD8odGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5fZXZlbnRzQ291bnQ9MCk6dm9pZCAwIT09bltlXSYmKDA9PS0tdGhpcy5fZXZlbnRzQ291bnQ/dGhpcy5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCk6ZGVsZXRlIG5bZV0pLHRoaXM7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpe3ZhciBvLGE9T2JqZWN0LmtleXMobik7Zm9yKHI9MDtyPGEubGVuZ3RoOysrcikicmVtb3ZlTGlzdGVuZXIiIT09KG89YVtyXSkmJnRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKG8pO3JldHVybiB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygicmVtb3ZlTGlzdGVuZXIiKSx0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wLHRoaXN9aWYoImZ1bmN0aW9uIj09dHlwZW9mKHQ9bltlXSkpdGhpcy5yZW1vdmVMaXN0ZW5lcihlLHQpO2Vsc2UgaWYodm9pZCAwIT09dClmb3Iocj10Lmxlbmd0aC0xO3I+PTA7ci0tKXRoaXMucmVtb3ZlTGlzdGVuZXIoZSx0W3JdKTtyZXR1cm4gdGhpc30scy5wcm90b3R5cGUubGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3JldHVybiBkKHRoaXMsZSwhMCl9LHMucHJvdG90eXBlLnJhd0xpc3RlbmVycz1mdW5jdGlvbihlKXtyZXR1cm4gZCh0aGlzLGUsITEpfSxzLmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZS5saXN0ZW5lckNvdW50P2UubGlzdGVuZXJDb3VudCh0KTptLmNhbGwoZSx0KX0scy5wcm90b3R5cGUubGlzdGVuZXJDb3VudD1tLHMucHJvdG90eXBlLmV2ZW50TmFtZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZXZlbnRzQ291bnQ+MD9yKHRoaXMuX2V2ZW50cyk6W119fSxmdW5jdGlvbihlLHQsbil7KHQ9ZS5leHBvcnRzPW4oNDI2KSkuU3RyZWFtPXQsdC5SZWFkYWJsZT10LHQuV3JpdGFibGU9bigyNTUpLHQuRHVwbGV4PW4oMTE2KSx0LlRyYW5zZm9ybT1uKDQzMSksdC5QYXNzVGhyb3VnaD1uKDc3MCl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7KGZ1bmN0aW9uKHQscixvKXt2YXIgYT1uKDE5OSk7ZnVuY3Rpb24gaShlKXt2YXIgdD10aGlzO3RoaXMubmV4dD1udWxsLHRoaXMuZW50cnk9bnVsbCx0aGlzLmZpbmlzaD1mdW5jdGlvbigpeyFmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5lbnRyeTtlLmVudHJ5PW51bGw7Zm9yKDtyOyl7dmFyIG89ci5jYWxsYmFjazt0LnBlbmRpbmdjYi0tLG8obikscj1yLm5leHR9dC5jb3JrZWRSZXF1ZXN0c0ZyZWU/dC5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dD1lOnQuY29ya2VkUmVxdWVzdHNGcmVlPWV9KHQsZSl9fWUuZXhwb3J0cz15O3ZhciBzLHU9IXQuYnJvd3NlciYmWyJ2MC4xMCIsInYwLjkuIl0uaW5kZXhPZih0LnZlcnNpb24uc2xpY2UoMCw1KSk+LTE/cjphLm5leHRUaWNrO3kuV3JpdGFibGVTdGF0ZT1nO3ZhciBjPW4oMTYzKTtjLmluaGVyaXRzPW4oNjMpO3ZhciBsPXtkZXByZWNhdGU6big3NjkpfSxwPW4oNDI3KSxmPW4oNjQpLkJ1ZmZlcixoPW8uVWludDhBcnJheXx8ZnVuY3Rpb24oKXt9O3ZhciBkLG09big0MjgpO2Z1bmN0aW9uIHYoKXt9ZnVuY3Rpb24gZyhlLHQpe3M9c3x8bigxMTYpLGU9ZXx8e307dmFyIHI9dCBpbnN0YW5jZW9mIHM7dGhpcy5vYmplY3RNb2RlPSEhZS5vYmplY3RNb2RlLHImJih0aGlzLm9iamVjdE1vZGU9dGhpcy5vYmplY3RNb2RlfHwhIWUud3JpdGFibGVPYmplY3RNb2RlKTt2YXIgbz1lLmhpZ2hXYXRlck1hcmssYz1lLndyaXRhYmxlSGlnaFdhdGVyTWFyayxsPXRoaXMub2JqZWN0TW9kZT8xNjoxNjM4NDt0aGlzLmhpZ2hXYXRlck1hcms9b3x8MD09PW8/bzpyJiYoY3x8MD09PWMpP2M6bCx0aGlzLmhpZ2hXYXRlck1hcms9TWF0aC5mbG9vcih0aGlzLmhpZ2hXYXRlck1hcmspLHRoaXMuZmluYWxDYWxsZWQ9ITEsdGhpcy5uZWVkRHJhaW49ITEsdGhpcy5lbmRpbmc9ITEsdGhpcy5lbmRlZD0hMSx0aGlzLmZpbmlzaGVkPSExLHRoaXMuZGVzdHJveWVkPSExO3ZhciBwPSExPT09ZS5kZWNvZGVTdHJpbmdzO3RoaXMuZGVjb2RlU3RyaW5ncz0hcCx0aGlzLmRlZmF1bHRFbmNvZGluZz1lLmRlZmF1bHRFbmNvZGluZ3x8InV0ZjgiLHRoaXMubGVuZ3RoPTAsdGhpcy53cml0aW5nPSExLHRoaXMuY29ya2VkPTAsdGhpcy5zeW5jPSEwLHRoaXMuYnVmZmVyUHJvY2Vzc2luZz0hMSx0aGlzLm9ud3JpdGU9ZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5fd3JpdGFibGVTdGF0ZSxyPW4uc3luYyxvPW4ud3JpdGVjYjtpZihmdW5jdGlvbihlKXtlLndyaXRpbmc9ITEsZS53cml0ZWNiPW51bGwsZS5sZW5ndGgtPWUud3JpdGVsZW4sZS53cml0ZWxlbj0wfShuKSx0KSFmdW5jdGlvbihlLHQsbixyLG8pey0tdC5wZW5kaW5nY2Isbj8oYS5uZXh0VGljayhvLHIpLGEubmV4dFRpY2soUyxlLHQpLGUuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSEwLGUuZW1pdCgiZXJyb3IiLHIpKToobyhyKSxlLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMCxlLmVtaXQoImVycm9yIixyKSxTKGUsdCkpfShlLG4scix0LG8pO2Vsc2V7dmFyIGk9eChuKTtpfHxuLmNvcmtlZHx8bi5idWZmZXJQcm9jZXNzaW5nfHwhbi5idWZmZXJlZFJlcXVlc3R8fHcoZSxuKSxyP3UoXyxlLG4saSxvKTpfKGUsbixpLG8pfX0odCxlKX0sdGhpcy53cml0ZWNiPW51bGwsdGhpcy53cml0ZWxlbj0wLHRoaXMuYnVmZmVyZWRSZXF1ZXN0PW51bGwsdGhpcy5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwsdGhpcy5wZW5kaW5nY2I9MCx0aGlzLnByZWZpbmlzaGVkPSExLHRoaXMuZXJyb3JFbWl0dGVkPSExLHRoaXMuYnVmZmVyZWRSZXF1ZXN0Q291bnQ9MCx0aGlzLmNvcmtlZFJlcXVlc3RzRnJlZT1uZXcgaSh0aGlzKX1mdW5jdGlvbiB5KGUpe2lmKHM9c3x8bigxMTYpLCEoZC5jYWxsKHksdGhpcyl8fHRoaXMgaW5zdGFuY2VvZiBzKSlyZXR1cm4gbmV3IHkoZSk7dGhpcy5fd3JpdGFibGVTdGF0ZT1uZXcgZyhlLHRoaXMpLHRoaXMud3JpdGFibGU9ITAsZSYmKCJmdW5jdGlvbiI9PXR5cGVvZiBlLndyaXRlJiYodGhpcy5fd3JpdGU9ZS53cml0ZSksImZ1bmN0aW9uIj09dHlwZW9mIGUud3JpdGV2JiYodGhpcy5fd3JpdGV2PWUud3JpdGV2KSwiZnVuY3Rpb24iPT10eXBlb2YgZS5kZXN0cm95JiYodGhpcy5fZGVzdHJveT1lLmRlc3Ryb3kpLCJmdW5jdGlvbiI9PXR5cGVvZiBlLmZpbmFsJiYodGhpcy5fZmluYWw9ZS5maW5hbCkpLHAuY2FsbCh0aGlzKX1mdW5jdGlvbiBiKGUsdCxuLHIsbyxhLGkpe3Qud3JpdGVsZW49cix0LndyaXRlY2I9aSx0LndyaXRpbmc9ITAsdC5zeW5jPSEwLG4/ZS5fd3JpdGV2KG8sdC5vbndyaXRlKTplLl93cml0ZShvLGEsdC5vbndyaXRlKSx0LnN5bmM9ITF9ZnVuY3Rpb24gXyhlLHQsbixyKXtufHxmdW5jdGlvbihlLHQpezA9PT10Lmxlbmd0aCYmdC5uZWVkRHJhaW4mJih0Lm5lZWREcmFpbj0hMSxlLmVtaXQoImRyYWluIikpfShlLHQpLHQucGVuZGluZ2NiLS0scigpLFMoZSx0KX1mdW5jdGlvbiB3KGUsdCl7dC5idWZmZXJQcm9jZXNzaW5nPSEwO3ZhciBuPXQuYnVmZmVyZWRSZXF1ZXN0O2lmKGUuX3dyaXRldiYmbiYmbi5uZXh0KXt2YXIgcj10LmJ1ZmZlcmVkUmVxdWVzdENvdW50LG89bmV3IEFycmF5KHIpLGE9dC5jb3JrZWRSZXF1ZXN0c0ZyZWU7YS5lbnRyeT1uO2Zvcih2YXIgcz0wLHU9ITA7bjspb1tzXT1uLG4uaXNCdWZ8fCh1PSExKSxuPW4ubmV4dCxzKz0xO28uYWxsQnVmZmVycz11LGIoZSx0LCEwLHQubGVuZ3RoLG8sIiIsYS5maW5pc2gpLHQucGVuZGluZ2NiKyssdC5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwsYS5uZXh0Pyh0LmNvcmtlZFJlcXVlc3RzRnJlZT1hLm5leHQsYS5uZXh0PW51bGwpOnQuY29ya2VkUmVxdWVzdHNGcmVlPW5ldyBpKHQpLHQuYnVmZmVyZWRSZXF1ZXN0Q291bnQ9MH1lbHNle2Zvcig7bjspe3ZhciBjPW4uY2h1bmssbD1uLmVuY29kaW5nLHA9bi5jYWxsYmFjaztpZihiKGUsdCwhMSx0Lm9iamVjdE1vZGU/MTpjLmxlbmd0aCxjLGwscCksbj1uLm5leHQsdC5idWZmZXJlZFJlcXVlc3RDb3VudC0tLHQud3JpdGluZylicmVha31udWxsPT09biYmKHQubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsKX10LmJ1ZmZlcmVkUmVxdWVzdD1uLHQuYnVmZmVyUHJvY2Vzc2luZz0hMX1mdW5jdGlvbiB4KGUpe3JldHVybiBlLmVuZGluZyYmMD09PWUubGVuZ3RoJiZudWxsPT09ZS5idWZmZXJlZFJlcXVlc3QmJiFlLmZpbmlzaGVkJiYhZS53cml0aW5nfWZ1bmN0aW9uIEUoZSx0KXtlLl9maW5hbCgoZnVuY3Rpb24obil7dC5wZW5kaW5nY2ItLSxuJiZlLmVtaXQoImVycm9yIixuKSx0LnByZWZpbmlzaGVkPSEwLGUuZW1pdCgicHJlZmluaXNoIiksUyhlLHQpfSkpfWZ1bmN0aW9uIFMoZSx0KXt2YXIgbj14KHQpO3JldHVybiBuJiYoIWZ1bmN0aW9uKGUsdCl7dC5wcmVmaW5pc2hlZHx8dC5maW5hbENhbGxlZHx8KCJmdW5jdGlvbiI9PXR5cGVvZiBlLl9maW5hbD8odC5wZW5kaW5nY2IrKyx0LmZpbmFsQ2FsbGVkPSEwLGEubmV4dFRpY2soRSxlLHQpKToodC5wcmVmaW5pc2hlZD0hMCxlLmVtaXQoInByZWZpbmlzaCIpKSl9KGUsdCksMD09PXQucGVuZGluZ2NiJiYodC5maW5pc2hlZD0hMCxlLmVtaXQoImZpbmlzaCIpKSksbn1jLmluaGVyaXRzKHkscCksZy5wcm90b3R5cGUuZ2V0QnVmZmVyPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuYnVmZmVyZWRSZXF1ZXN0LHQ9W107ZTspdC5wdXNoKGUpLGU9ZS5uZXh0O3JldHVybiB0fSxmdW5jdGlvbigpe3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZy5wcm90b3R5cGUsImJ1ZmZlciIse2dldDpsLmRlcHJlY2F0ZSgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRCdWZmZXIoKX0pLCJfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciBpbnN0ZWFkLiIsIkRFUDAwMDMiKX0pfWNhdGNoKGUpe319KCksImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLmhhc0luc3RhbmNlJiYiZnVuY3Rpb24iPT10eXBlb2YgRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV0/KGQ9RnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHksU3ltYm9sLmhhc0luc3RhbmNlLHt2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4hIWQuY2FsbCh0aGlzLGUpfHx0aGlzPT09eSYmKGUmJmUuX3dyaXRhYmxlU3RhdGUgaW5zdGFuY2VvZiBnKX19KSk6ZD1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIHRoaXN9LHkucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24oKXt0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIkNhbm5vdCBwaXBlLCBub3QgcmVhZGFibGUiKSl9LHkucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixvPXRoaXMuX3dyaXRhYmxlU3RhdGUsaT0hMSxzPSFvLm9iamVjdE1vZGUmJihyPWUsZi5pc0J1ZmZlcihyKXx8ciBpbnN0YW5jZW9mIGgpO3JldHVybiBzJiYhZi5pc0J1ZmZlcihlKSYmKGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGYuZnJvbShlKX0oZSkpLCJmdW5jdGlvbiI9PXR5cGVvZiB0JiYobj10LHQ9bnVsbCkscz90PSJidWZmZXIiOnR8fCh0PW8uZGVmYXVsdEVuY29kaW5nKSwiZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49diksby5lbmRlZD9mdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBFcnJvcigid3JpdGUgYWZ0ZXIgZW5kIik7ZS5lbWl0KCJlcnJvciIsbiksYS5uZXh0VGljayh0LG4pfSh0aGlzLG4pOihzfHxmdW5jdGlvbihlLHQsbixyKXt2YXIgbz0hMCxpPSExO3JldHVybiBudWxsPT09bj9pPW5ldyBUeXBlRXJyb3IoIk1heSBub3Qgd3JpdGUgbnVsbCB2YWx1ZXMgdG8gc3RyZWFtIik6InN0cmluZyI9PXR5cGVvZiBufHx2b2lkIDA9PT1ufHx0Lm9iamVjdE1vZGV8fChpPW5ldyBUeXBlRXJyb3IoIkludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsiKSksaSYmKGUuZW1pdCgiZXJyb3IiLGkpLGEubmV4dFRpY2socixpKSxvPSExKSxvfSh0aGlzLG8sZSxuKSkmJihvLnBlbmRpbmdjYisrLGk9ZnVuY3Rpb24oZSx0LG4scixvLGEpe2lmKCFuKXt2YXIgaT1mdW5jdGlvbihlLHQsbil7ZS5vYmplY3RNb2RlfHwhMT09PWUuZGVjb2RlU3RyaW5nc3x8InN0cmluZyIhPXR5cGVvZiB0fHwodD1mLmZyb20odCxuKSk7cmV0dXJuIHR9KHQscixvKTtyIT09aSYmKG49ITAsbz0iYnVmZmVyIixyPWkpfXZhciBzPXQub2JqZWN0TW9kZT8xOnIubGVuZ3RoO3QubGVuZ3RoKz1zO3ZhciB1PXQubGVuZ3RoPHQuaGlnaFdhdGVyTWFyazt1fHwodC5uZWVkRHJhaW49ITApO2lmKHQud3JpdGluZ3x8dC5jb3JrZWQpe3ZhciBjPXQubGFzdEJ1ZmZlcmVkUmVxdWVzdDt0Lmxhc3RCdWZmZXJlZFJlcXVlc3Q9e2NodW5rOnIsZW5jb2Rpbmc6byxpc0J1ZjpuLGNhbGxiYWNrOmEsbmV4dDpudWxsfSxjP2MubmV4dD10Lmxhc3RCdWZmZXJlZFJlcXVlc3Q6dC5idWZmZXJlZFJlcXVlc3Q9dC5sYXN0QnVmZmVyZWRSZXF1ZXN0LHQuYnVmZmVyZWRSZXF1ZXN0Q291bnQrPTF9ZWxzZSBiKGUsdCwhMSxzLHIsbyxhKTtyZXR1cm4gdX0odGhpcyxvLHMsZSx0LG4pKSxpfSx5LnByb3RvdHlwZS5jb3JrPWZ1bmN0aW9uKCl7dGhpcy5fd3JpdGFibGVTdGF0ZS5jb3JrZWQrK30seS5wcm90b3R5cGUudW5jb3JrPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fd3JpdGFibGVTdGF0ZTtlLmNvcmtlZCYmKGUuY29ya2VkLS0sZS53cml0aW5nfHxlLmNvcmtlZHx8ZS5maW5pc2hlZHx8ZS5idWZmZXJQcm9jZXNzaW5nfHwhZS5idWZmZXJlZFJlcXVlc3R8fHcodGhpcyxlKSl9LHkucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZz1mdW5jdGlvbihlKXtpZigic3RyaW5nIj09dHlwZW9mIGUmJihlPWUudG9Mb3dlckNhc2UoKSksIShbImhleCIsInV0ZjgiLCJ1dGYtOCIsImFzY2lpIiwiYmluYXJ5IiwiYmFzZTY0IiwidWNzMiIsInVjcy0yIiwidXRmMTZsZSIsInV0Zi0xNmxlIiwicmF3Il0uaW5kZXhPZigoZSsiIikudG9Mb3dlckNhc2UoKSk+LTEpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrZSk7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nPWUsdGhpc30sT2JqZWN0LmRlZmluZVByb3BlcnR5KHkucHJvdG90eXBlLCJ3cml0YWJsZUhpZ2hXYXRlck1hcmsiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcmt9fSkseS5wcm90b3R5cGUuX3dyaXRlPWZ1bmN0aW9uKGUsdCxuKXtuKG5ldyBFcnJvcigiX3dyaXRlKCkgaXMgbm90IGltcGxlbWVudGVkIikpfSx5LnByb3RvdHlwZS5fd3JpdGV2PW51bGwseS5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLl93cml0YWJsZVN0YXRlOyJmdW5jdGlvbiI9PXR5cGVvZiBlPyhuPWUsZT1udWxsLHQ9bnVsbCk6ImZ1bmN0aW9uIj09dHlwZW9mIHQmJihuPXQsdD1udWxsKSxudWxsIT1lJiZ0aGlzLndyaXRlKGUsdCksci5jb3JrZWQmJihyLmNvcmtlZD0xLHRoaXMudW5jb3JrKCkpLHIuZW5kaW5nfHxyLmZpbmlzaGVkfHxmdW5jdGlvbihlLHQsbil7dC5lbmRpbmc9ITAsUyhlLHQpLG4mJih0LmZpbmlzaGVkP2EubmV4dFRpY2sobik6ZS5vbmNlKCJmaW5pc2giLG4pKTt0LmVuZGVkPSEwLGUud3JpdGFibGU9ITF9KHRoaXMscixuKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHkucHJvdG90eXBlLCJkZXN0cm95ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fd3JpdGFibGVTdGF0ZSYmdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWR9LHNldDpmdW5jdGlvbihlKXt0aGlzLl93cml0YWJsZVN0YXRlJiYodGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ9ZSl9fSkseS5wcm90b3R5cGUuZGVzdHJveT1tLmRlc3Ryb3kseS5wcm90b3R5cGUuX3VuZGVzdHJveT1tLnVuZGVzdHJveSx5LnByb3RvdHlwZS5fZGVzdHJveT1mdW5jdGlvbihlLHQpe3RoaXMuZW5kKCksdChlKX19KS5jYWxsKHRoaXMsbig4OSksbig0MjkpLnNldEltbWVkaWF0ZSxuKDUxKSl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPW4oODAwKSgpP0FycmF5LmZyb206big4MDEpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oODE4KSxvPW4oMTE4KSxhPW4oMTM5KSxpPUFycmF5LnByb3RvdHlwZS5pbmRleE9mLHM9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSx1PU1hdGguYWJzLGM9TWF0aC5mbG9vcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQsbixsLHA7aWYoIXIoZSkpcmV0dXJuIGkuYXBwbHkodGhpcyxhcmd1bWVudHMpO2ZvcihuPW8oYSh0aGlzKS5sZW5ndGgpLGw9YXJndW1lbnRzWzFdLHQ9bD1pc05hTihsKT8wOmw+PTA/YyhsKTpvKHRoaXMubGVuZ3RoKS1jKHUobCkpO3Q8bjsrK3QpaWYocy5jYWxsKHRoaXMsdCkmJihwPXRoaXNbdF0scihwKSkpcmV0dXJuIHQ7cmV0dXJuLTF9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiOyhmdW5jdGlvbih0LG4pe3ZhciByPWZ1bmN0aW9uKGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoZSsiIGlzIG5vdCBhIGZ1bmN0aW9uIik7cmV0dXJuIGV9LG89ZnVuY3Rpb24oZSl7dmFyIHQsbixvPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKSxhPTA7cmV0dXJuIG5ldyBlKChmdW5jdGlvbigpe3ZhciBlO2lmKHQpbiYmKHQ9bi5jb25jYXQodCkpO2Vsc2V7aWYoIW4pcmV0dXJuO3Q9bn1pZihuPXQsdD1udWxsLCJmdW5jdGlvbiI9PXR5cGVvZiBuKXJldHVybiBlPW4sbj1udWxsLHZvaWQgZSgpO2ZvcihvLmRhdGE9YT0rK2ElMjtuOyllPW4uc2hpZnQoKSxuLmxlbmd0aHx8KG49bnVsbCksZSgpfSkpLm9ic2VydmUobyx7Y2hhcmFjdGVyRGF0YTohMH0pLGZ1bmN0aW9uKGUpe3IoZSksdD8iZnVuY3Rpb24iPT10eXBlb2YgdD90PVt0LGVdOnQucHVzaChlKToodD1lLG8uZGF0YT1hPSsrYSUyKX19O2UuZXhwb3J0cz1mdW5jdGlvbigpe2lmKCJvYmplY3QiPT10eXBlb2YgdCYmdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQubmV4dFRpY2spcmV0dXJuIHQubmV4dFRpY2s7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHF1ZXVlTWljcm90YXNrKXJldHVybiBmdW5jdGlvbihlKXtxdWV1ZU1pY3JvdGFzayhyKGUpKX07aWYoIm9iamVjdCI9PXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBNdXRhdGlvbk9ic2VydmVyKXJldHVybiBvKE11dGF0aW9uT2JzZXJ2ZXIpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBXZWJLaXRNdXRhdGlvbk9ic2VydmVyKXJldHVybiBvKFdlYktpdE11dGF0aW9uT2JzZXJ2ZXIpfXJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKGUpe24ocihlKSl9OiJmdW5jdGlvbiI9PXR5cGVvZiBzZXRUaW1lb3V0fHwib2JqZWN0Ij09dHlwZW9mIHNldFRpbWVvdXQ/ZnVuY3Rpb24oZSl7c2V0VGltZW91dChyKGUpLDApfTpudWxsfSgpfSkuY2FsbCh0aGlzLG4oODkpLG4oNDI5KS5zZXRJbW1lZGlhdGUpfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big0NTgpLG89bigxMjMpLGE9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPWVbdF07YS5jYWxsKGUsdCkmJm8oaSxuKSYmKHZvaWQgMCE9PW58fHQgaW4gZSl8fHIoZSx0LG4pfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMwKSxvPShuKDI1KSxudWxsKSxhPXt9O2Z1bmN0aW9uIGkoKXtpZihvKWZvcih2YXIgZSBpbiBhKXt2YXIgdD1hW2VdLG49by5pbmRleE9mKGUpO2lmKG4+LTF8fHIoIjk2IixlKSwhYy5wbHVnaW5zW25dKXt0LmV4dHJhY3RFdmVudHN8fHIoIjk3IixlKSxjLnBsdWdpbnNbbl09dDt2YXIgaT10LmV2ZW50VHlwZXM7Zm9yKHZhciB1IGluIGkpcyhpW3VdLHQsdSl8fHIoIjk4Iix1LGUpfX19ZnVuY3Rpb24gcyhlLHQsbil7Yy5ldmVudE5hbWVEaXNwYXRjaENvbmZpZ3MuaGFzT3duUHJvcGVydHkobikmJnIoIjk5IixuKSxjLmV2ZW50TmFtZURpc3BhdGNoQ29uZmlnc1tuXT1lO3ZhciBvPWUucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM7aWYobyl7Zm9yKHZhciBhIGluIG8pe2lmKG8uaGFzT3duUHJvcGVydHkoYSkpdShvW2FdLHQsbil9cmV0dXJuITB9cmV0dXJuISFlLnJlZ2lzdHJhdGlvbk5hbWUmJih1KGUucmVnaXN0cmF0aW9uTmFtZSx0LG4pLCEwKX1mdW5jdGlvbiB1KGUsdCxuKXtjLnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW2VdJiZyKCIxMDAiLGUpLGMucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbZV09dCxjLnJlZ2lzdHJhdGlvbk5hbWVEZXBlbmRlbmNpZXNbZV09dC5ldmVudFR5cGVzW25dLmRlcGVuZGVuY2llc312YXIgYz17cGx1Z2luczpbXSxldmVudE5hbWVEaXNwYXRjaENvbmZpZ3M6e30scmVnaXN0cmF0aW9uTmFtZU1vZHVsZXM6e30scmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llczp7fSxwb3NzaWJsZVJlZ2lzdHJhdGlvbk5hbWVzOm51bGwsaW5qZWN0RXZlbnRQbHVnaW5PcmRlcjpmdW5jdGlvbihlKXtvJiZyKCIxMDEiKSxvPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUpLGkoKX0saW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1lOmZ1bmN0aW9uKGUpe3ZhciB0PSExO2Zvcih2YXIgbiBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkobikpe3ZhciBvPWVbbl07YS5oYXNPd25Qcm9wZXJ0eShuKSYmYVtuXT09PW98fChhW25dJiZyKCIxMDIiLG4pLGFbbl09byx0PSEwKX10JiZpKCl9LGdldFBsdWdpbk1vZHVsZUZvckV2ZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUuZGlzcGF0Y2hDb25maWc7aWYodC5yZWdpc3RyYXRpb25OYW1lKXJldHVybiBjLnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW3QucmVnaXN0cmF0aW9uTmFtZV18fG51bGw7aWYodm9pZCAwIT09dC5waGFzZWRSZWdpc3RyYXRpb25OYW1lcyl7dmFyIG49dC5waGFzZWRSZWdpc3RyYXRpb25OYW1lcztmb3IodmFyIHIgaW4gbilpZihuLmhhc093blByb3BlcnR5KHIpKXt2YXIgbz1jLnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW25bcl1dO2lmKG8pcmV0dXJuIG99fXJldHVybiBudWxsfSxfcmVzZXRFdmVudFBsdWdpbnM6ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gbz1udWxsLGEpYS5oYXNPd25Qcm9wZXJ0eShlKSYmZGVsZXRlIGFbZV07Yy5wbHVnaW5zLmxlbmd0aD0wO3ZhciB0PWMuZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzO2Zvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJmRlbGV0ZSB0W25dO3ZhciByPWMucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXM7Zm9yKHZhciBpIGluIHIpci5oYXNPd25Qcm9wZXJ0eShpKSYmZGVsZXRlIHJbaV19fTtlLmV4cG9ydHM9Y30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcixvLGE9bigzMCksaT1uKDI2Mik7bigyNSksbigzNCk7ZnVuY3Rpb24gcyhlLHQsbixyKXt2YXIgbz1lLnR5cGV8fCJ1bmtub3duLWV2ZW50IjtlLmN1cnJlbnRUYXJnZXQ9dS5nZXROb2RlRnJvbUluc3RhbmNlKHIpLHQ/aS5pbnZva2VHdWFyZGVkQ2FsbGJhY2tXaXRoQ2F0Y2gobyxuLGUpOmkuaW52b2tlR3VhcmRlZENhbGxiYWNrKG8sbixlKSxlLmN1cnJlbnRUYXJnZXQ9bnVsbH12YXIgdT17aXNFbmRpc2g6ZnVuY3Rpb24oZSl7cmV0dXJuInRvcE1vdXNlVXAiPT09ZXx8InRvcFRvdWNoRW5kIj09PWV8fCJ0b3BUb3VjaENhbmNlbCI9PT1lfSxpc01vdmVpc2g6ZnVuY3Rpb24oZSl7cmV0dXJuInRvcE1vdXNlTW92ZSI9PT1lfHwidG9wVG91Y2hNb3ZlIj09PWV9LGlzU3RhcnRpc2g6ZnVuY3Rpb24oZSl7cmV0dXJuInRvcE1vdXNlRG93biI9PT1lfHwidG9wVG91Y2hTdGFydCI9PT1lfSxleGVjdXRlRGlyZWN0RGlzcGF0Y2g6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5fZGlzcGF0Y2hMaXN0ZW5lcnMsbj1lLl9kaXNwYXRjaEluc3RhbmNlcztBcnJheS5pc0FycmF5KHQpJiZhKCIxMDMiKSxlLmN1cnJlbnRUYXJnZXQ9dD91LmdldE5vZGVGcm9tSW5zdGFuY2Uobik6bnVsbDt2YXIgcj10P3QoZSk6bnVsbDtyZXR1cm4gZS5jdXJyZW50VGFyZ2V0PW51bGwsZS5fZGlzcGF0Y2hMaXN0ZW5lcnM9bnVsbCxlLl9kaXNwYXRjaEluc3RhbmNlcz1udWxsLHJ9LGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlcjpmdW5jdGlvbihlLHQpe3ZhciBuPWUuX2Rpc3BhdGNoTGlzdGVuZXJzLHI9ZS5fZGlzcGF0Y2hJbnN0YW5jZXM7aWYoQXJyYXkuaXNBcnJheShuKSlmb3IodmFyIG89MDtvPG4ubGVuZ3RoJiYhZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpO28rKylzKGUsdCxuW29dLHJbb10pO2Vsc2UgbiYmcyhlLHQsbixyKTtlLl9kaXNwYXRjaExpc3RlbmVycz1udWxsLGUuX2Rpc3BhdGNoSW5zdGFuY2VzPW51bGx9LGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlclN0b3BBdFRydWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5fZGlzcGF0Y2hMaXN0ZW5lcnMsbj1lLl9kaXNwYXRjaEluc3RhbmNlcztpZihBcnJheS5pc0FycmF5KHQpKXtmb3IodmFyIHI9MDtyPHQubGVuZ3RoJiYhZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpO3IrKylpZih0W3JdKGUsbltyXSkpcmV0dXJuIG5bcl19ZWxzZSBpZih0JiZ0KGUsbikpcmV0dXJuIG47cmV0dXJuIG51bGx9KGUpO3JldHVybiBlLl9kaXNwYXRjaEluc3RhbmNlcz1udWxsLGUuX2Rpc3BhdGNoTGlzdGVuZXJzPW51bGwsdH0saGFzRGlzcGF0Y2hlczpmdW5jdGlvbihlKXtyZXR1cm4hIWUuX2Rpc3BhdGNoTGlzdGVuZXJzfSxnZXRJbnN0YW5jZUZyb21Ob2RlOmZ1bmN0aW9uKGUpe3JldHVybiByLmdldEluc3RhbmNlRnJvbU5vZGUoZSl9LGdldE5vZGVGcm9tSW5zdGFuY2U6ZnVuY3Rpb24oZSl7cmV0dXJuIHIuZ2V0Tm9kZUZyb21JbnN0YW5jZShlKX0saXNBbmNlc3RvcjpmdW5jdGlvbihlLHQpe3JldHVybiBvLmlzQW5jZXN0b3IoZSx0KX0sZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3I6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gby5nZXRMb3dlc3RDb21tb25BbmNlc3RvcihlLHQpfSxnZXRQYXJlbnRJbnN0YW5jZTpmdW5jdGlvbihlKXtyZXR1cm4gby5nZXRQYXJlbnRJbnN0YW5jZShlKX0sdHJhdmVyc2VUd29QaGFzZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIG8udHJhdmVyc2VUd29QaGFzZShlLHQsbil9LHRyYXZlcnNlRW50ZXJMZWF2ZTpmdW5jdGlvbihlLHQsbixyLGEpe3JldHVybiBvLnRyYXZlcnNlRW50ZXJMZWF2ZShlLHQsbixyLGEpfSxpbmplY3Rpb246e2luamVjdENvbXBvbmVudFRyZWU6ZnVuY3Rpb24oZSl7cj1lfSxpbmplY3RUcmVlVHJhdmVyc2FsOmZ1bmN0aW9uKGUpe289ZX19fTtlLmV4cG9ydHM9dX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1udWxsO2Z1bmN0aW9uIG8oZSx0LG4pe3RyeXt0KG4pfWNhdGNoKGUpe251bGw9PT1yJiYocj1lKX19dmFyIGE9e2ludm9rZUd1YXJkZWRDYWxsYmFjazpvLGludm9rZUd1YXJkZWRDYWxsYmFja1dpdGhDYXRjaDpvLHJldGhyb3dDYXVnaHRFcnJvcjpmdW5jdGlvbigpe2lmKHIpe3ZhciBlPXI7dGhyb3cgcj1udWxsLGV9fX07ZS5leHBvcnRzPWF9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0fHxlLnNyY0VsZW1lbnR8fHdpbmRvdztyZXR1cm4gdC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCYmKHQ9dC5jb3JyZXNwb25kaW5nVXNlRWxlbWVudCksMz09PXQubm9kZVR5cGU/dC5wYXJlbnROb2RlOnR9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByLG89big1Nyk7by5jYW5Vc2VET00mJihyPWRvY3VtZW50LmltcGxlbWVudGF0aW9uJiZkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlJiYhMCE9PWRvY3VtZW50LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoIiIsIiIpKSxlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZighby5jYW5Vc2VET018fHQmJiEoImFkZEV2ZW50TGlzdGVuZXIiaW4gZG9jdW1lbnQpKXJldHVybiExO3ZhciBuPSJvbiIrZSxhPW4gaW4gZG9jdW1lbnQ7aWYoIWEpe3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2kuc2V0QXR0cmlidXRlKG4sInJldHVybjsiKSxhPSJmdW5jdGlvbiI9PXR5cGVvZiBpW25dfXJldHVybiFhJiZyJiYid2hlZWwiPT09ZSYmKGE9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uaGFzRmVhdHVyZSgiRXZlbnRzLndoZWVsIiwiMy4wIikpLGF9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXtBbHQ6ImFsdEtleSIsQ29udHJvbDoiY3RybEtleSIsTWV0YToibWV0YUtleSIsU2hpZnQ6InNoaWZ0S2V5In07ZnVuY3Rpb24gbyhlKXt2YXIgdD10aGlzLm5hdGl2ZUV2ZW50O2lmKHQuZ2V0TW9kaWZpZXJTdGF0ZSlyZXR1cm4gdC5nZXRNb2RpZmllclN0YXRlKGUpO3ZhciBuPXJbZV07cmV0dXJuISFuJiYhIXRbbl19ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBvfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0NCksbz1uKDkyNyksYT0obig0NSksbig3MiksbigyNjgpKSxpPW4oMjA1KSxzPW4oNDcxKTtmdW5jdGlvbiB1KGUsdCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCkmJih0PXRbMV0pLHQ/dC5uZXh0U2libGluZzplLmZpcnN0Q2hpbGR9dmFyIGM9YSgoZnVuY3Rpb24oZSx0LG4pe2UuaW5zZXJ0QmVmb3JlKHQsbil9KSk7ZnVuY3Rpb24gbChlLHQsbil7ci5pbnNlcnRUcmVlQmVmb3JlKGUsdCxuKX1mdW5jdGlvbiBwKGUsdCxuKXtBcnJheS5pc0FycmF5KHQpP2Z1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPXQ7Zm9yKDs7KXt2YXIgYT1vLm5leHRTaWJsaW5nO2lmKGMoZSxvLHIpLG89PT1uKWJyZWFrO289YX19KGUsdFswXSx0WzFdLG4pOmMoZSx0LG4pfWZ1bmN0aW9uIGYoZSx0KXtpZihBcnJheS5pc0FycmF5KHQpKXt2YXIgbj10WzFdO2goZSx0PXRbMF0sbiksZS5yZW1vdmVDaGlsZChuKX1lLnJlbW92ZUNoaWxkKHQpfWZ1bmN0aW9uIGgoZSx0LG4pe2Zvcig7Oyl7dmFyIHI9dC5uZXh0U2libGluZztpZihyPT09bilicmVhaztlLnJlbW92ZUNoaWxkKHIpfX12YXIgZD17ZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXA6by5kYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cCxyZXBsYWNlRGVsaW1pdGVkVGV4dDpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5wYXJlbnROb2RlLG89ZS5uZXh0U2libGluZztvPT09dD9uJiZjKHIsZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobiksbyk6bj8ocyhvLG4pLGgocixvLHQpKTpoKHIsZSx0KX0scHJvY2Vzc1VwZGF0ZXM6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtzd2l0Y2goci50eXBlKXtjYXNlIklOU0VSVF9NQVJLVVAiOmwoZSxyLmNvbnRlbnQsdShlLHIuYWZ0ZXJOb2RlKSk7YnJlYWs7Y2FzZSJNT1ZFX0VYSVNUSU5HIjpwKGUsci5mcm9tTm9kZSx1KGUsci5hZnRlck5vZGUpKTticmVhaztjYXNlIlNFVF9NQVJLVVAiOmkoZSxyLmNvbnRlbnQpO2JyZWFrO2Nhc2UiVEVYVF9DT05URU5UIjpzKGUsci5jb250ZW50KTticmVhaztjYXNlIlJFTU9WRV9OT0RFIjpmKGUsci5mcm9tTm9kZSl9fX19O2UuZXhwb3J0cz1kfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz17aHRtbDoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsbWF0aG1sOiJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MIixzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIn19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgTVNBcHAmJk1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uP2Z1bmN0aW9uKHQsbixyLG8pe01TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKChmdW5jdGlvbigpe3JldHVybiBlKHQsbixyLG8pfSkpfTplfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMwKSxvPW4oOTQ1KSxhPW4oMzg2KShuKDEzMykuaXNWYWxpZEVsZW1lbnQpLGk9KG4oMjUpLG4oMzQpLHtidXR0b246ITAsY2hlY2tib3g6ITAsaW1hZ2U6ITAsaGlkZGVuOiEwLHJhZGlvOiEwLHJlc2V0OiEwLHN1Ym1pdDohMH0pO2Z1bmN0aW9uIHMoZSl7bnVsbCE9ZS5jaGVja2VkTGluayYmbnVsbCE9ZS52YWx1ZUxpbmsmJnIoIjg3Iil9ZnVuY3Rpb24gdShlKXtzKGUpLChudWxsIT1lLnZhbHVlfHxudWxsIT1lLm9uQ2hhbmdlKSYmcigiODgiKX1mdW5jdGlvbiBjKGUpe3MoZSksKG51bGwhPWUuY2hlY2tlZHx8bnVsbCE9ZS5vbkNoYW5nZSkmJnIoIjg5Iil9dmFyIGw9e3ZhbHVlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4hZVt0XXx8aVtlLnR5cGVdfHxlLm9uQ2hhbmdlfHxlLnJlYWRPbmx5fHxlLmRpc2FibGVkP251bGw6bmV3IEVycm9yKCJZb3UgcHJvdmlkZWQgYSBgdmFsdWVgIHByb3AgdG8gYSBmb3JtIGZpZWxkIHdpdGhvdXQgYW4gYG9uQ2hhbmdlYCBoYW5kbGVyLiBUaGlzIHdpbGwgcmVuZGVyIGEgcmVhZC1vbmx5IGZpZWxkLiBJZiB0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUgdXNlIGBkZWZhdWx0VmFsdWVgLiBPdGhlcndpc2UsIHNldCBlaXRoZXIgYG9uQ2hhbmdlYCBvciBgcmVhZE9ubHlgLiIpfSxjaGVja2VkOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4hZVt0XXx8ZS5vbkNoYW5nZXx8ZS5yZWFkT25seXx8ZS5kaXNhYmxlZD9udWxsOm5ldyBFcnJvcigiWW91IHByb3ZpZGVkIGEgYGNoZWNrZWRgIHByb3AgdG8gYSBmb3JtIGZpZWxkIHdpdGhvdXQgYW4gYG9uQ2hhbmdlYCBoYW5kbGVyLiBUaGlzIHdpbGwgcmVuZGVyIGEgcmVhZC1vbmx5IGZpZWxkLiBJZiB0aGUgZmllbGQgc2hvdWxkIGJlIG11dGFibGUgdXNlIGBkZWZhdWx0Q2hlY2tlZGAuIE90aGVyd2lzZSwgc2V0IGVpdGhlciBgb25DaGFuZ2VgIG9yIGByZWFkT25seWAuIil9LG9uQ2hhbmdlOmEuZnVuY30scD17fTtmdW5jdGlvbiBmKGUpe2lmKGUpe3ZhciB0PWUuZ2V0TmFtZSgpO2lmKHQpcmV0dXJuIiBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgIit0KyJgLiJ9cmV0dXJuIiJ9dmFyIGg9e2NoZWNrUHJvcFR5cGVzOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHIgaW4gbCl7aWYobC5oYXNPd25Qcm9wZXJ0eShyKSl2YXIgYT1sW3JdKHQscixlLCJwcm9wIixudWxsLG8pO2lmKGEgaW5zdGFuY2VvZiBFcnJvciYmIShhLm1lc3NhZ2UgaW4gcCkpe3BbYS5tZXNzYWdlXT0hMDtmKG4pfX19LGdldFZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnZhbHVlTGluaz8odShlKSxlLnZhbHVlTGluay52YWx1ZSk6ZS52YWx1ZX0sZ2V0Q2hlY2tlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5jaGVja2VkTGluaz8oYyhlKSxlLmNoZWNrZWRMaW5rLnZhbHVlKTplLmNoZWNrZWR9LGV4ZWN1dGVPbkNoYW5nZTpmdW5jdGlvbihlLHQpe3JldHVybiBlLnZhbHVlTGluaz8odShlKSxlLnZhbHVlTGluay5yZXF1ZXN0Q2hhbmdlKHQudGFyZ2V0LnZhbHVlKSk6ZS5jaGVja2VkTGluaz8oYyhlKSxlLmNoZWNrZWRMaW5rLnJlcXVlc3RDaGFuZ2UodC50YXJnZXQuY2hlY2tlZCkpOmUub25DaGFuZ2U/ZS5vbkNoYW5nZS5jYWxsKHZvaWQgMCx0KTp2b2lkIDB9fTtlLmV4cG9ydHM9aH0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMwKSxvPShuKDI1KSwhMSksYT17cmVwbGFjZU5vZGVXaXRoTWFya3VwOm51bGwscHJvY2Vzc0NoaWxkcmVuVXBkYXRlczpudWxsLGluamVjdGlvbjp7aW5qZWN0RW52aXJvbm1lbnQ6ZnVuY3Rpb24oZSl7byYmcigiMTA0IiksYS5yZXBsYWNlTm9kZVdpdGhNYXJrdXA9ZS5yZXBsYWNlTm9kZVdpdGhNYXJrdXAsYS5wcm9jZXNzQ2hpbGRyZW5VcGRhdGVzPWUucHJvY2Vzc0NoaWxkcmVuVXBkYXRlcyxvPSEwfX19O2UuZXhwb3J0cz1hfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gbyhlLHQpe3JldHVybiBlPT09dD8wIT09ZXx8MCE9PXR8fDEvZT09MS90OmUhPWUmJnQhPXR9ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7aWYobyhlLHQpKXJldHVybiEwO2lmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWV8fCJvYmplY3QiIT10eXBlb2YgdHx8bnVsbD09PXQpcmV0dXJuITE7dmFyIG49T2JqZWN0LmtleXMoZSksYT1PYmplY3Qua2V5cyh0KTtpZihuLmxlbmd0aCE9PWEubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgaT0wO2k8bi5sZW5ndGg7aSsrKWlmKCFyLmNhbGwodCxuW2ldKXx8IW8oZVtuW2ldXSx0W25baV1dKSlyZXR1cm4hMTtyZXR1cm4hMH19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIG49bnVsbD09PWV8fCExPT09ZSxyPW51bGw9PT10fHwhMT09PXQ7aWYobnx8cilyZXR1cm4gbj09PXI7dmFyIG89dHlwZW9mIGUsYT10eXBlb2YgdDtyZXR1cm4ic3RyaW5nIj09PW98fCJudW1iZXIiPT09bz8ic3RyaW5nIj09PWF8fCJudW1iZXIiPT09YToib2JqZWN0Ij09PWEmJmUudHlwZT09PXQudHlwZSYmZS5rZXk9PT10LmtleX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9e2VzY2FwZTpmdW5jdGlvbihlKXt2YXIgdD17Ij0iOiI9MCIsIjoiOiI9MiJ9O3JldHVybiIkIisoIiIrZSkucmVwbGFjZSgvWz06XS9nLChmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pKX0sdW5lc2NhcGU6ZnVuY3Rpb24oZSl7dmFyIHQ9eyI9MCI6Ij0iLCI9MiI6IjoifTtyZXR1cm4oIiIrKCIuIj09PWVbMF0mJiIkIj09PWVbMV0/ZS5zdWJzdHJpbmcoMik6ZS5zdWJzdHJpbmcoMSkpKS5yZXBsYWNlKC8oPTB8PTIpL2csKGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfSkpfX07ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigzMCksbz0obig4NyksbigxNjkpKSxhPShuKDcyKSxuKDc5KSk7bigyNSksbigzNCk7ZnVuY3Rpb24gaShlKXthLmVucXVldWVVcGRhdGUoZSl9ZnVuY3Rpb24gcyhlLHQpe3ZhciBuPW8uZ2V0KGUpO3JldHVybiBufHxudWxsfXZhciB1PXtpc01vdW50ZWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9by5nZXQoZSk7cmV0dXJuISF0JiYhIXQuX3JlbmRlcmVkQ29tcG9uZW50fSxlbnF1ZXVlQ2FsbGJhY2s6ZnVuY3Rpb24oZSx0LG4pe3UudmFsaWRhdGVDYWxsYmFjayh0LG4pO3ZhciByPXMoZSk7aWYoIXIpcmV0dXJuIG51bGw7ci5fcGVuZGluZ0NhbGxiYWNrcz9yLl9wZW5kaW5nQ2FsbGJhY2tzLnB1c2godCk6ci5fcGVuZGluZ0NhbGxiYWNrcz1bdF0saShyKX0sZW5xdWV1ZUNhbGxiYWNrSW50ZXJuYWw6ZnVuY3Rpb24oZSx0KXtlLl9wZW5kaW5nQ2FsbGJhY2tzP2UuX3BlbmRpbmdDYWxsYmFja3MucHVzaCh0KTplLl9wZW5kaW5nQ2FsbGJhY2tzPVt0XSxpKGUpfSxlbnF1ZXVlRm9yY2VVcGRhdGU6ZnVuY3Rpb24oZSl7dmFyIHQ9cyhlKTt0JiYodC5fcGVuZGluZ0ZvcmNlVXBkYXRlPSEwLGkodCkpfSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1zKGUpO3ImJihyLl9wZW5kaW5nU3RhdGVRdWV1ZT1bdF0sci5fcGVuZGluZ1JlcGxhY2VTdGF0ZT0hMCxudWxsIT1uJiYodS52YWxpZGF0ZUNhbGxiYWNrKG4sInJlcGxhY2VTdGF0ZSIpLHIuX3BlbmRpbmdDYWxsYmFja3M/ci5fcGVuZGluZ0NhbGxiYWNrcy5wdXNoKG4pOnIuX3BlbmRpbmdDYWxsYmFja3M9W25dKSxpKHIpKX0sZW5xdWV1ZVNldFN0YXRlOmZ1bmN0aW9uKGUsdCl7dmFyIG49cyhlKTtuJiYoKG4uX3BlbmRpbmdTdGF0ZVF1ZXVlfHwobi5fcGVuZGluZ1N0YXRlUXVldWU9W10pKS5wdXNoKHQpLGkobikpfSxlbnF1ZXVlRWxlbWVudEludGVybmFsOmZ1bmN0aW9uKGUsdCxuKXtlLl9wZW5kaW5nRWxlbWVudD10LGUuX2NvbnRleHQ9bixpKGUpfSx2YWxpZGF0ZUNhbGxiYWNrOmZ1bmN0aW9uKGUsdCl7ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUmJnIoIjEyMiIsdCxmdW5jdGlvbihlKXt2YXIgdD10eXBlb2YgZTtpZigib2JqZWN0IiE9PXQpcmV0dXJuIHQ7dmFyIG49ZS5jb25zdHJ1Y3RvciYmZS5jb25zdHJ1Y3Rvci5uYW1lfHx0LHI9T2JqZWN0LmtleXMoZSk7cmV0dXJuIHIubGVuZ3RoPjAmJnIubGVuZ3RoPDIwP24rIiAoa2V5czogIityLmpvaW4oIiwgIikrIikiOm59KGUpKX19O2UuZXhwb3J0cz11fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24oMzgpO3ZhciByPW4oNzgpLG89KG4oMzQpLHIpO2UuZXhwb3J0cz1vfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdCxuPWUua2V5Q29kZTtyZXR1cm4iY2hhckNvZGUiaW4gZT8wPT09KHQ9ZS5jaGFyQ29kZSkmJjEzPT09biYmKHQ9MTMpOnQ9bix0Pj0zMnx8MTM9PT10P3Q6MH19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDQyMCkoT2JqZWN0LmdldFByb3RvdHlwZU9mLE9iamVjdCk7ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDQxOCksbz1uKDk5OSksYT1uKDEzNyk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBhKGUpP3IoZSwhMCk6byhlKX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDQxNCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBlLmNvbnN0cnVjdG9yKGUuYnl0ZUxlbmd0aCk7cmV0dXJuIG5ldyByKHQpLnNldChuZXcgcihlKSksdH19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHIsbz1TeW50YXhFcnJvcixhPUZ1bmN0aW9uLGk9VHlwZUVycm9yLHM9ZnVuY3Rpb24oZSl7dHJ5e3JldHVybiBhKCcidXNlIHN0cmljdCI7IHJldHVybiAoJytlKyIpLmNvbnN0cnVjdG9yOyIpKCl9Y2F0Y2goZSl7fX0sdT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO2lmKHUpdHJ5e3Uoe30sIiIpfWNhdGNoKGUpe3U9bnVsbH12YXIgYz1mdW5jdGlvbigpe3Rocm93IG5ldyBpfSxsPXU/ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGN9Y2F0Y2goZSl7dHJ5e3JldHVybiB1KGFyZ3VtZW50cywiY2FsbGVlIikuZ2V0fWNhdGNoKGUpe3JldHVybiBjfX19KCk6YyxwPW4oMTA1NCkoKSxmPU9iamVjdC5nZXRQcm90b3R5cGVPZnx8ZnVuY3Rpb24oZSl7cmV0dXJuIGUuX19wcm90b19ffSxoPXt9LGQ9InVuZGVmaW5lZCI9PXR5cGVvZiBVaW50OEFycmF5P3I6ZihVaW50OEFycmF5KSxtPXsiJUFnZ3JlZ2F0ZUVycm9yJSI6InVuZGVmaW5lZCI9PXR5cGVvZiBBZ2dyZWdhdGVFcnJvcj9yOkFnZ3JlZ2F0ZUVycm9yLCIlQXJyYXklIjpBcnJheSwiJUFycmF5QnVmZmVyJSI6InVuZGVmaW5lZCI9PXR5cGVvZiBBcnJheUJ1ZmZlcj9yOkFycmF5QnVmZmVyLCIlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUiOnA/ZihbXVtTeW1ib2wuaXRlcmF0b3JdKCkpOnIsIiVBc3luY0Zyb21TeW5jSXRlcmF0b3JQcm90b3R5cGUlIjpyLCIlQXN5bmNGdW5jdGlvbiUiOmgsIiVBc3luY0dlbmVyYXRvciUiOmgsIiVBc3luY0dlbmVyYXRvckZ1bmN0aW9uJSI6aCwiJUFzeW5jSXRlcmF0b3JQcm90b3R5cGUlIjpoLCIlQXRvbWljcyUiOiJ1bmRlZmluZWQiPT10eXBlb2YgQXRvbWljcz9yOkF0b21pY3MsIiVCaWdJbnQlIjoidW5kZWZpbmVkIj09dHlwZW9mIEJpZ0ludD9yOkJpZ0ludCwiJUJvb2xlYW4lIjpCb29sZWFuLCIlRGF0YVZpZXclIjoidW5kZWZpbmVkIj09dHlwZW9mIERhdGFWaWV3P3I6RGF0YVZpZXcsIiVEYXRlJSI6RGF0ZSwiJWRlY29kZVVSSSUiOmRlY29kZVVSSSwiJWRlY29kZVVSSUNvbXBvbmVudCUiOmRlY29kZVVSSUNvbXBvbmVudCwiJWVuY29kZVVSSSUiOmVuY29kZVVSSSwiJWVuY29kZVVSSUNvbXBvbmVudCUiOmVuY29kZVVSSUNvbXBvbmVudCwiJUVycm9yJSI6RXJyb3IsIiVldmFsJSI6ZXZhbCwiJUV2YWxFcnJvciUiOkV2YWxFcnJvciwiJUZsb2F0MzJBcnJheSUiOiJ1bmRlZmluZWQiPT10eXBlb2YgRmxvYXQzMkFycmF5P3I6RmxvYXQzMkFycmF5LCIlRmxvYXQ2NEFycmF5JSI6InVuZGVmaW5lZCI9PXR5cGVvZiBGbG9hdDY0QXJyYXk/cjpGbG9hdDY0QXJyYXksIiVGaW5hbGl6YXRpb25SZWdpc3RyeSUiOiJ1bmRlZmluZWQiPT10eXBlb2YgRmluYWxpemF0aW9uUmVnaXN0cnk/cjpGaW5hbGl6YXRpb25SZWdpc3RyeSwiJUZ1bmN0aW9uJSI6YSwiJUdlbmVyYXRvckZ1bmN0aW9uJSI6aCwiJUludDhBcnJheSUiOiJ1bmRlZmluZWQiPT10eXBlb2YgSW50OEFycmF5P3I6SW50OEFycmF5LCIlSW50MTZBcnJheSUiOiJ1bmRlZmluZWQiPT10eXBlb2YgSW50MTZBcnJheT9yOkludDE2QXJyYXksIiVJbnQzMkFycmF5JSI6InVuZGVmaW5lZCI9PXR5cGVvZiBJbnQzMkFycmF5P3I6SW50MzJBcnJheSwiJWlzRmluaXRlJSI6aXNGaW5pdGUsIiVpc05hTiUiOmlzTmFOLCIlSXRlcmF0b3JQcm90b3R5cGUlIjpwP2YoZihbXVtTeW1ib2wuaXRlcmF0b3JdKCkpKTpyLCIlSlNPTiUiOiJvYmplY3QiPT10eXBlb2YgSlNPTj9KU09OOnIsIiVNYXAlIjoidW5kZWZpbmVkIj09dHlwZW9mIE1hcD9yOk1hcCwiJU1hcEl0ZXJhdG9yUHJvdG90eXBlJSI6InVuZGVmaW5lZCIhPXR5cGVvZiBNYXAmJnA/ZigobmV3IE1hcClbU3ltYm9sLml0ZXJhdG9yXSgpKTpyLCIlTWF0aCUiOk1hdGgsIiVOdW1iZXIlIjpOdW1iZXIsIiVPYmplY3QlIjpPYmplY3QsIiVwYXJzZUZsb2F0JSI6cGFyc2VGbG9hdCwiJXBhcnNlSW50JSI6cGFyc2VJbnQsIiVQcm9taXNlJSI6InVuZGVmaW5lZCI9PXR5cGVvZiBQcm9taXNlP3I6UHJvbWlzZSwiJVByb3h5JSI6InVuZGVmaW5lZCI9PXR5cGVvZiBQcm94eT9yOlByb3h5LCIlUmFuZ2VFcnJvciUiOlJhbmdlRXJyb3IsIiVSZWZlcmVuY2VFcnJvciUiOlJlZmVyZW5jZUVycm9yLCIlUmVmbGVjdCUiOiJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdD9yOlJlZmxlY3QsIiVSZWdFeHAlIjpSZWdFeHAsIiVTZXQlIjoidW5kZWZpbmVkIj09dHlwZW9mIFNldD9yOlNldCwiJVNldEl0ZXJhdG9yUHJvdG90eXBlJSI6InVuZGVmaW5lZCIhPXR5cGVvZiBTZXQmJnA/ZigobmV3IFNldClbU3ltYm9sLml0ZXJhdG9yXSgpKTpyLCIlU2hhcmVkQXJyYXlCdWZmZXIlIjoidW5kZWZpbmVkIj09dHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyP3I6U2hhcmVkQXJyYXlCdWZmZXIsIiVTdHJpbmclIjpTdHJpbmcsIiVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUiOnA/ZigiIltTeW1ib2wuaXRlcmF0b3JdKCkpOnIsIiVTeW1ib2wlIjpwP1N5bWJvbDpyLCIlU3ludGF4RXJyb3IlIjpvLCIlVGhyb3dUeXBlRXJyb3IlIjpsLCIlVHlwZWRBcnJheSUiOmQsIiVUeXBlRXJyb3IlIjppLCIlVWludDhBcnJheSUiOiJ1bmRlZmluZWQiPT10eXBlb2YgVWludDhBcnJheT9yOlVpbnQ4QXJyYXksIiVVaW50OENsYW1wZWRBcnJheSUiOiJ1bmRlZmluZWQiPT10eXBlb2YgVWludDhDbGFtcGVkQXJyYXk/cjpVaW50OENsYW1wZWRBcnJheSwiJVVpbnQxNkFycmF5JSI6InVuZGVmaW5lZCI9PXR5cGVvZiBVaW50MTZBcnJheT9yOlVpbnQxNkFycmF5LCIlVWludDMyQXJyYXklIjoidW5kZWZpbmVkIj09dHlwZW9mIFVpbnQzMkFycmF5P3I6VWludDMyQXJyYXksIiVVUklFcnJvciUiOlVSSUVycm9yLCIlV2Vha01hcCUiOiJ1bmRlZmluZWQiPT10eXBlb2YgV2Vha01hcD9yOldlYWtNYXAsIiVXZWFrUmVmJSI6InVuZGVmaW5lZCI9PXR5cGVvZiBXZWFrUmVmP3I6V2Vha1JlZiwiJVdlYWtTZXQlIjoidW5kZWZpbmVkIj09dHlwZW9mIFdlYWtTZXQ/cjpXZWFrU2V0fSx2PWZ1bmN0aW9uIGUodCl7dmFyIG47aWYoIiVBc3luY0Z1bmN0aW9uJSI9PT10KW49cygiYXN5bmMgZnVuY3Rpb24gKCkge30iKTtlbHNlIGlmKCIlR2VuZXJhdG9yRnVuY3Rpb24lIj09PXQpbj1zKCJmdW5jdGlvbiogKCkge30iKTtlbHNlIGlmKCIlQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiUiPT09dCluPXMoImFzeW5jIGZ1bmN0aW9uKiAoKSB7fSIpO2Vsc2UgaWYoIiVBc3luY0dlbmVyYXRvciUiPT09dCl7dmFyIHI9ZSgiJUFzeW5jR2VuZXJhdG9yRnVuY3Rpb24lIik7ciYmKG49ci5wcm90b3R5cGUpfWVsc2UgaWYoIiVBc3luY0l0ZXJhdG9yUHJvdG90eXBlJSI9PT10KXt2YXIgbz1lKCIlQXN5bmNHZW5lcmF0b3IlIik7byYmKG49ZihvLnByb3RvdHlwZSkpfXJldHVybiBtW3RdPW4sbn0sZz17IiVBcnJheUJ1ZmZlclByb3RvdHlwZSUiOlsiQXJyYXlCdWZmZXIiLCJwcm90b3R5cGUiXSwiJUFycmF5UHJvdG90eXBlJSI6WyJBcnJheSIsInByb3RvdHlwZSJdLCIlQXJyYXlQcm90b19lbnRyaWVzJSI6WyJBcnJheSIsInByb3RvdHlwZSIsImVudHJpZXMiXSwiJUFycmF5UHJvdG9fZm9yRWFjaCUiOlsiQXJyYXkiLCJwcm90b3R5cGUiLCJmb3JFYWNoIl0sIiVBcnJheVByb3RvX2tleXMlIjpbIkFycmF5IiwicHJvdG90eXBlIiwia2V5cyJdLCIlQXJyYXlQcm90b192YWx1ZXMlIjpbIkFycmF5IiwicHJvdG90eXBlIiwidmFsdWVzIl0sIiVBc3luY0Z1bmN0aW9uUHJvdG90eXBlJSI6WyJBc3luY0Z1bmN0aW9uIiwicHJvdG90eXBlIl0sIiVBc3luY0dlbmVyYXRvciUiOlsiQXN5bmNHZW5lcmF0b3JGdW5jdGlvbiIsInByb3RvdHlwZSJdLCIlQXN5bmNHZW5lcmF0b3JQcm90b3R5cGUlIjpbIkFzeW5jR2VuZXJhdG9yRnVuY3Rpb24iLCJwcm90b3R5cGUiLCJwcm90b3R5cGUiXSwiJUJvb2xlYW5Qcm90b3R5cGUlIjpbIkJvb2xlYW4iLCJwcm90b3R5cGUiXSwiJURhdGFWaWV3UHJvdG90eXBlJSI6WyJEYXRhVmlldyIsInByb3RvdHlwZSJdLCIlRGF0ZVByb3RvdHlwZSUiOlsiRGF0ZSIsInByb3RvdHlwZSJdLCIlRXJyb3JQcm90b3R5cGUlIjpbIkVycm9yIiwicHJvdG90eXBlIl0sIiVFdmFsRXJyb3JQcm90b3R5cGUlIjpbIkV2YWxFcnJvciIsInByb3RvdHlwZSJdLCIlRmxvYXQzMkFycmF5UHJvdG90eXBlJSI6WyJGbG9hdDMyQXJyYXkiLCJwcm90b3R5cGUiXSwiJUZsb2F0NjRBcnJheVByb3RvdHlwZSUiOlsiRmxvYXQ2NEFycmF5IiwicHJvdG90eXBlIl0sIiVGdW5jdGlvblByb3RvdHlwZSUiOlsiRnVuY3Rpb24iLCJwcm90b3R5cGUiXSwiJUdlbmVyYXRvciUiOlsiR2VuZXJhdG9yRnVuY3Rpb24iLCJwcm90b3R5cGUiXSwiJUdlbmVyYXRvclByb3RvdHlwZSUiOlsiR2VuZXJhdG9yRnVuY3Rpb24iLCJwcm90b3R5cGUiLCJwcm90b3R5cGUiXSwiJUludDhBcnJheVByb3RvdHlwZSUiOlsiSW50OEFycmF5IiwicHJvdG90eXBlIl0sIiVJbnQxNkFycmF5UHJvdG90eXBlJSI6WyJJbnQxNkFycmF5IiwicHJvdG90eXBlIl0sIiVJbnQzMkFycmF5UHJvdG90eXBlJSI6WyJJbnQzMkFycmF5IiwicHJvdG90eXBlIl0sIiVKU09OUGFyc2UlIjpbIkpTT04iLCJwYXJzZSJdLCIlSlNPTlN0cmluZ2lmeSUiOlsiSlNPTiIsInN0cmluZ2lmeSJdLCIlTWFwUHJvdG90eXBlJSI6WyJNYXAiLCJwcm90b3R5cGUiXSwiJU51bWJlclByb3RvdHlwZSUiOlsiTnVtYmVyIiwicHJvdG90eXBlIl0sIiVPYmplY3RQcm90b3R5cGUlIjpbIk9iamVjdCIsInByb3RvdHlwZSJdLCIlT2JqUHJvdG9fdG9TdHJpbmclIjpbIk9iamVjdCIsInByb3RvdHlwZSIsInRvU3RyaW5nIl0sIiVPYmpQcm90b192YWx1ZU9mJSI6WyJPYmplY3QiLCJwcm90b3R5cGUiLCJ2YWx1ZU9mIl0sIiVQcm9taXNlUHJvdG90eXBlJSI6WyJQcm9taXNlIiwicHJvdG90eXBlIl0sIiVQcm9taXNlUHJvdG9fdGhlbiUiOlsiUHJvbWlzZSIsInByb3RvdHlwZSIsInRoZW4iXSwiJVByb21pc2VfYWxsJSI6WyJQcm9taXNlIiwiYWxsIl0sIiVQcm9taXNlX3JlamVjdCUiOlsiUHJvbWlzZSIsInJlamVjdCJdLCIlUHJvbWlzZV9yZXNvbHZlJSI6WyJQcm9taXNlIiwicmVzb2x2ZSJdLCIlUmFuZ2VFcnJvclByb3RvdHlwZSUiOlsiUmFuZ2VFcnJvciIsInByb3RvdHlwZSJdLCIlUmVmZXJlbmNlRXJyb3JQcm90b3R5cGUlIjpbIlJlZmVyZW5jZUVycm9yIiwicHJvdG90eXBlIl0sIiVSZWdFeHBQcm90b3R5cGUlIjpbIlJlZ0V4cCIsInByb3RvdHlwZSJdLCIlU2V0UHJvdG90eXBlJSI6WyJTZXQiLCJwcm90b3R5cGUiXSwiJVNoYXJlZEFycmF5QnVmZmVyUHJvdG90eXBlJSI6WyJTaGFyZWRBcnJheUJ1ZmZlciIsInByb3RvdHlwZSJdLCIlU3RyaW5nUHJvdG90eXBlJSI6WyJTdHJpbmciLCJwcm90b3R5cGUiXSwiJVN5bWJvbFByb3RvdHlwZSUiOlsiU3ltYm9sIiwicHJvdG90eXBlIl0sIiVTeW50YXhFcnJvclByb3RvdHlwZSUiOlsiU3ludGF4RXJyb3IiLCJwcm90b3R5cGUiXSwiJVR5cGVkQXJyYXlQcm90b3R5cGUlIjpbIlR5cGVkQXJyYXkiLCJwcm90b3R5cGUiXSwiJVR5cGVFcnJvclByb3RvdHlwZSUiOlsiVHlwZUVycm9yIiwicHJvdG90eXBlIl0sIiVVaW50OEFycmF5UHJvdG90eXBlJSI6WyJVaW50OEFycmF5IiwicHJvdG90eXBlIl0sIiVVaW50OENsYW1wZWRBcnJheVByb3RvdHlwZSUiOlsiVWludDhDbGFtcGVkQXJyYXkiLCJwcm90b3R5cGUiXSwiJVVpbnQxNkFycmF5UHJvdG90eXBlJSI6WyJVaW50MTZBcnJheSIsInByb3RvdHlwZSJdLCIlVWludDMyQXJyYXlQcm90b3R5cGUlIjpbIlVpbnQzMkFycmF5IiwicHJvdG90eXBlIl0sIiVVUklFcnJvclByb3RvdHlwZSUiOlsiVVJJRXJyb3IiLCJwcm90b3R5cGUiXSwiJVdlYWtNYXBQcm90b3R5cGUlIjpbIldlYWtNYXAiLCJwcm90b3R5cGUiXSwiJVdlYWtTZXRQcm90b3R5cGUlIjpbIldlYWtTZXQiLCJwcm90b3R5cGUiXX0seT1uKDI4MSksYj1uKDEwNTcpLF89eS5jYWxsKEZ1bmN0aW9uLmNhbGwsQXJyYXkucHJvdG90eXBlLmNvbmNhdCksdz15LmNhbGwoRnVuY3Rpb24uYXBwbHksQXJyYXkucHJvdG90eXBlLnNwbGljZSkseD15LmNhbGwoRnVuY3Rpb24uY2FsbCxTdHJpbmcucHJvdG90eXBlLnJlcGxhY2UpLEU9eS5jYWxsKEZ1bmN0aW9uLmNhbGwsU3RyaW5nLnByb3RvdHlwZS5zbGljZSksUz0vW14lLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JSQpKS9nLEM9L1xcKFxcKT8vZyxBPWZ1bmN0aW9uKGUpe3ZhciB0PUUoZSwwLDEpLG49RShlLC0xKTtpZigiJSI9PT10JiYiJSIhPT1uKXRocm93IG5ldyBvKCJpbnZhbGlkIGludHJpbnNpYyBzeW50YXgsIGV4cGVjdGVkIGNsb3NpbmcgYCVgIik7aWYoIiUiPT09biYmIiUiIT09dCl0aHJvdyBuZXcgbygiaW52YWxpZCBpbnRyaW5zaWMgc3ludGF4LCBleHBlY3RlZCBvcGVuaW5nIGAlYCIpO3ZhciByPVtdO3JldHVybiB4KGUsUywoZnVuY3Rpb24oZSx0LG4sbyl7cltyLmxlbmd0aF09bj94KG8sQywiJDEiKTp0fHxlfSkpLHJ9LE89ZnVuY3Rpb24oZSx0KXt2YXIgbixyPWU7aWYoYihnLHIpJiYocj0iJSIrKG49Z1tyXSlbMF0rIiUiKSxiKG0scikpe3ZhciBhPW1bcl07aWYoYT09PWgmJihhPXYocikpLHZvaWQgMD09PWEmJiF0KXRocm93IG5ldyBpKCJpbnRyaW5zaWMgIitlKyIgZXhpc3RzLCBidXQgaXMgbm90IGF2YWlsYWJsZS4gUGxlYXNlIGZpbGUgYW4gaXNzdWUhIik7cmV0dXJue2FsaWFzOm4sbmFtZTpyLHZhbHVlOmF9fXRocm93IG5ldyBvKCJpbnRyaW5zaWMgIitlKyIgZG9lcyBub3QgZXhpc3QhIil9O2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2lmKCJzdHJpbmciIT10eXBlb2YgZXx8MD09PWUubGVuZ3RoKXRocm93IG5ldyBpKCJpbnRyaW5zaWMgbmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZyIpO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSYmImJvb2xlYW4iIT10eXBlb2YgdCl0aHJvdyBuZXcgaSgnImFsbG93TWlzc2luZyIgYXJndW1lbnQgbXVzdCBiZSBhIGJvb2xlYW4nKTt2YXIgbj1BKGUpLHI9bi5sZW5ndGg+MD9uWzBdOiIiLGE9TygiJSIrcisiJSIsdCkscz1hLm5hbWUsYz1hLnZhbHVlLGw9ITEscD1hLmFsaWFzO3AmJihyPXBbMF0sdyhuLF8oWzAsMV0scCkpKTtmb3IodmFyIGY9MSxoPSEwO2Y8bi5sZW5ndGg7Zis9MSl7dmFyIGQ9bltmXSx2PUUoZCwwLDEpLGc9RShkLC0xKTtpZigoJyInPT09dnx8IiciPT09dnx8ImAiPT09dnx8JyInPT09Z3x8IiciPT09Z3x8ImAiPT09ZykmJnYhPT1nKXRocm93IG5ldyBvKCJwcm9wZXJ0eSBuYW1lcyB3aXRoIHF1b3RlcyBtdXN0IGhhdmUgbWF0Y2hpbmcgcXVvdGVzIik7aWYoImNvbnN0cnVjdG9yIiE9PWQmJmh8fChsPSEwKSxiKG0scz0iJSIrKHIrPSIuIitkKSsiJSIpKWM9bVtzXTtlbHNlIGlmKG51bGwhPWMpe2lmKCEoZCBpbiBjKSl7aWYoIXQpdGhyb3cgbmV3IGkoImJhc2UgaW50cmluc2ljIGZvciAiK2UrIiBleGlzdHMsIGJ1dCB0aGUgcHJvcGVydHkgaXMgbm90IGF2YWlsYWJsZS4iKTtyZXR1cm59aWYodSYmZisxPj1uLmxlbmd0aCl7dmFyIHk9dShjLGQpO2M9KGg9ISF5KSYmImdldCJpbiB5JiYhKCJvcmlnaW5hbFZhbHVlImluIHkuZ2V0KT95LmdldDpjW2RdfWVsc2UgaD1iKGMsZCksYz1jW2RdO2gmJiFsJiYobVtzXT1jKX19cmV0dXJuIGN9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTA1Nik7ZS5leHBvcnRzPUZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kfHxyfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPVN0cmluZy5wcm90b3R5cGUucmVwbGFjZSxvPS8lMjAvZyxhPSJSRkMxNzM4IixpPSJSRkMzOTg2IjtlLmV4cG9ydHM9e2RlZmF1bHQ6aSxmb3JtYXR0ZXJzOntSRkMxNzM4OmZ1bmN0aW9uKGUpe3JldHVybiByLmNhbGwoZSxvLCIrIil9LFJGQzM5ODY6ZnVuY3Rpb24oZSl7cmV0dXJuIFN0cmluZyhlKX19LFJGQzE3Mzg6YSxSRkMzOTg2Oml9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24oMTU4KTt2YXIgcj1uKDIyKSxvPW4oNzApLGE9big0OTYpLGk9bigxMTIpLHM9bigxNjQpLHU9big5NyksYz1uKDM3MCksbD1uKDc3KSxwPW4oMTQxKSxmPW4oNTUpLGg9bigxMDkpLGQ9big5OCksbT1uKDUyKSx2PW4oNDcpLGc9bigxMTEpLHk9bigxMDcpLGI9bigxMDc0KSxfPW4oMTYwKSx3PW4oNDEpLHg9bygiZmV0Y2giKSxFPW8oIkhlYWRlcnMiKSxTPXcoIml0ZXJhdG9yIiksQz0iVVJMU2VhcmNoUGFyYW1zIixBPSJVUkxTZWFyY2hQYXJhbXNJdGVyYXRvciIsTz1sLnNldCxrPWwuZ2V0dGVyRm9yKEMpLGo9bC5nZXR0ZXJGb3IoQSksVD0vXCsvZyxJPUFycmF5KDQpLFA9ZnVuY3Rpb24oZSl7cmV0dXJuIElbZS0xXXx8KElbZS0xXT1SZWdFeHAoIigoPzolW1xcZGEtZl17Mn0peyIrZSsifSkiLCJnaSIpKX0sTj1mdW5jdGlvbihlKXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlKX1jYXRjaCh0KXtyZXR1cm4gZX19LE09ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKFQsIiAiKSxuPTQ7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQodCl9Y2F0Y2goZSl7Zm9yKDtuOyl0PXQucmVwbGFjZShQKG4tLSksTik7cmV0dXJuIHR9fSxSPS9bIScoKX5dfCUyMC9nLEQ9eyIhIjoiJTIxIiwiJyI6IiUyNyIsIigiOiIlMjgiLCIpIjoiJTI5IiwifiI6IiU3RSIsIiUyMCI6IisifSxMPWZ1bmN0aW9uKGUpe3JldHVybiBEW2VdfSxCPWZ1bmN0aW9uKGUpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoZSkucmVwbGFjZShSLEwpfSxGPWZ1bmN0aW9uKGUsdCl7aWYodClmb3IodmFyIG4scixvPXQuc3BsaXQoIiYiKSxhPTA7YTxvLmxlbmd0aDspKG49b1thKytdKS5sZW5ndGgmJihyPW4uc3BsaXQoIj0iKSxlLnB1c2goe2tleTpNKHIuc2hpZnQoKSksdmFsdWU6TShyLmpvaW4oIj0iKSl9KSl9LFU9ZnVuY3Rpb24oZSl7dGhpcy5lbnRyaWVzLmxlbmd0aD0wLEYodGhpcy5lbnRyaWVzLGUpfSxxPWZ1bmN0aW9uKGUsdCl7aWYoZTx0KXRocm93IFR5cGVFcnJvcigiTm90IGVub3VnaCBhcmd1bWVudHMiKX0sej1jKChmdW5jdGlvbihlLHQpe08odGhpcyx7dHlwZTpBLGl0ZXJhdG9yOmIoayhlKS5lbnRyaWVzKSxraW5kOnR9KX0pLCJJdGVyYXRvciIsKGZ1bmN0aW9uKCl7dmFyIGU9aih0aGlzKSx0PWUua2luZCxuPWUuaXRlcmF0b3IubmV4dCgpLHI9bi52YWx1ZTtyZXR1cm4gbi5kb25lfHwobi52YWx1ZT0ia2V5cyI9PT10P3Iua2V5OiJ2YWx1ZXMiPT09dD9yLnZhbHVlOltyLmtleSxyLnZhbHVlXSksbn0pKSxWPWZ1bmN0aW9uKCl7cCh0aGlzLFYsQyk7dmFyIGUsdCxuLHIsbyxhLGkscyx1LGM9YXJndW1lbnRzLmxlbmd0aD4wP2FyZ3VtZW50c1swXTp2b2lkIDAsbD10aGlzLGg9W107aWYoTyhsLHt0eXBlOkMsZW50cmllczpoLHVwZGF0ZVVSTDpmdW5jdGlvbigpe30sdXBkYXRlU2VhcmNoUGFyYW1zOlV9KSx2b2lkIDAhPT1jKWlmKHYoYykpaWYoImZ1bmN0aW9uIj09dHlwZW9mKGU9XyhjKSkpZm9yKG49KHQ9ZS5jYWxsKGMpKS5uZXh0OyEocj1uLmNhbGwodCkpLmRvbmU7KXtpZigoaT0oYT0obz1iKG0oci52YWx1ZSkpKS5uZXh0KS5jYWxsKG8pKS5kb25lfHwocz1hLmNhbGwobykpLmRvbmV8fCFhLmNhbGwobykuZG9uZSl0aHJvdyBUeXBlRXJyb3IoIkV4cGVjdGVkIHNlcXVlbmNlIHdpdGggbGVuZ3RoIDIiKTtoLnB1c2goe2tleTppLnZhbHVlKyIiLHZhbHVlOnMudmFsdWUrIiJ9KX1lbHNlIGZvcih1IGluIGMpZihjLHUpJiZoLnB1c2goe2tleTp1LHZhbHVlOmNbdV0rIiJ9KTtlbHNlIEYoaCwic3RyaW5nIj09dHlwZW9mIGM/Ij8iPT09Yy5jaGFyQXQoMCk/Yy5zbGljZSgxKTpjOmMrIiIpfSxXPVYucHJvdG90eXBlO3MoVyx7YXBwZW5kOmZ1bmN0aW9uKGUsdCl7cShhcmd1bWVudHMubGVuZ3RoLDIpO3ZhciBuPWsodGhpcyk7bi5lbnRyaWVzLnB1c2goe2tleTplKyIiLHZhbHVlOnQrIiJ9KSxuLnVwZGF0ZVVSTCgpfSxkZWxldGU6ZnVuY3Rpb24oZSl7cShhcmd1bWVudHMubGVuZ3RoLDEpO2Zvcih2YXIgdD1rKHRoaXMpLG49dC5lbnRyaWVzLHI9ZSsiIixvPTA7bzxuLmxlbmd0aDspbltvXS5rZXk9PT1yP24uc3BsaWNlKG8sMSk6bysrO3QudXBkYXRlVVJMKCl9LGdldDpmdW5jdGlvbihlKXtxKGFyZ3VtZW50cy5sZW5ndGgsMSk7Zm9yKHZhciB0PWsodGhpcykuZW50cmllcyxuPWUrIiIscj0wO3I8dC5sZW5ndGg7cisrKWlmKHRbcl0ua2V5PT09bilyZXR1cm4gdFtyXS52YWx1ZTtyZXR1cm4gbnVsbH0sZ2V0QWxsOmZ1bmN0aW9uKGUpe3EoYXJndW1lbnRzLmxlbmd0aCwxKTtmb3IodmFyIHQ9ayh0aGlzKS5lbnRyaWVzLG49ZSsiIixyPVtdLG89MDtvPHQubGVuZ3RoO28rKyl0W29dLmtleT09PW4mJnIucHVzaCh0W29dLnZhbHVlKTtyZXR1cm4gcn0saGFzOmZ1bmN0aW9uKGUpe3EoYXJndW1lbnRzLmxlbmd0aCwxKTtmb3IodmFyIHQ9ayh0aGlzKS5lbnRyaWVzLG49ZSsiIixyPTA7cjx0Lmxlbmd0aDspaWYodFtyKytdLmtleT09PW4pcmV0dXJuITA7cmV0dXJuITF9LHNldDpmdW5jdGlvbihlLHQpe3EoYXJndW1lbnRzLmxlbmd0aCwxKTtmb3IodmFyIG4scj1rKHRoaXMpLG89ci5lbnRyaWVzLGE9ITEsaT1lKyIiLHM9dCsiIix1PTA7dTxvLmxlbmd0aDt1KyspKG49b1t1XSkua2V5PT09aSYmKGE/by5zcGxpY2UodS0tLDEpOihhPSEwLG4udmFsdWU9cykpO2F8fG8ucHVzaCh7a2V5OmksdmFsdWU6c30pLHIudXBkYXRlVVJMKCl9LHNvcnQ6ZnVuY3Rpb24oKXt2YXIgZSx0LG4scj1rKHRoaXMpLG89ci5lbnRyaWVzLGE9by5zbGljZSgpO2ZvcihvLmxlbmd0aD0wLG49MDtuPGEubGVuZ3RoO24rKyl7Zm9yKGU9YVtuXSx0PTA7dDxuO3QrKylpZihvW3RdLmtleT5lLmtleSl7by5zcGxpY2UodCwwLGUpO2JyZWFrfXQ9PT1uJiZvLnB1c2goZSl9ci51cGRhdGVVUkwoKX0sZm9yRWFjaDpmdW5jdGlvbihlKXtmb3IodmFyIHQsbj1rKHRoaXMpLmVudHJpZXMscj1oKGUsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsMyksbz0wO288bi5sZW5ndGg7KXIoKHQ9bltvKytdKS52YWx1ZSx0LmtleSx0aGlzKX0sa2V5czpmdW5jdGlvbigpe3JldHVybiBuZXcgeih0aGlzLCJrZXlzIil9LHZhbHVlczpmdW5jdGlvbigpe3JldHVybiBuZXcgeih0aGlzLCJ2YWx1ZXMiKX0sZW50cmllczpmdW5jdGlvbigpe3JldHVybiBuZXcgeih0aGlzLCJlbnRyaWVzIil9fSx7ZW51bWVyYWJsZTohMH0pLGkoVyxTLFcuZW50cmllcyksaShXLCJ0b1N0cmluZyIsKGZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9ayh0aGlzKS5lbnRyaWVzLG49W10scj0wO3I8dC5sZW5ndGg7KWU9dFtyKytdLG4ucHVzaChCKGUua2V5KSsiPSIrQihlLnZhbHVlKSk7cmV0dXJuIG4uam9pbigiJiIpfSkse2VudW1lcmFibGU6ITB9KSx1KFYsQykscih7Z2xvYmFsOiEwLGZvcmNlZDohYX0se1VSTFNlYXJjaFBhcmFtczpWfSksYXx8ImZ1bmN0aW9uIiE9dHlwZW9mIHh8fCJmdW5jdGlvbiIhPXR5cGVvZiBFfHxyKHtnbG9iYWw6ITAsZW51bWVyYWJsZTohMCxmb3JjZWQ6ITB9LHtmZXRjaDpmdW5jdGlvbihlKXt2YXIgdCxuLHIsbz1bZV07cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MSYmKHYodD1hcmd1bWVudHNbMV0pJiYobj10LmJvZHksZChuKT09PUMmJigocj10LmhlYWRlcnM/bmV3IEUodC5oZWFkZXJzKTpuZXcgRSkuaGFzKCJjb250ZW50LXR5cGUiKXx8ci5zZXQoImNvbnRlbnQtdHlwZSIsImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PVVURi04IiksdD1nKHQse2JvZHk6eSgwLFN0cmluZyhuKSksaGVhZGVyczp5KDAscil9KSkpLG8ucHVzaCh0KSkseC5hcHBseSh0aGlzLG8pfX0pLGUuZXhwb3J0cz17VVJMU2VhcmNoUGFyYW1zOlYsZ2V0U3RhdGU6a319LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDY4MCkoInRvVXBwZXJDYXNlIik7ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDI0Mik7ZnVuY3Rpb24gbyhlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlfHxudWxsIT10JiYiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCBhIGZ1bmN0aW9uIik7dmFyIG49ZnVuY3Rpb24oKXt2YXIgcj1hcmd1bWVudHMsbz10P3QuYXBwbHkodGhpcyxyKTpyWzBdLGE9bi5jYWNoZTtpZihhLmhhcyhvKSlyZXR1cm4gYS5nZXQobyk7dmFyIGk9ZS5hcHBseSh0aGlzLHIpO3JldHVybiBuLmNhY2hlPWEuc2V0KG8saSl8fGEsaX07cmV0dXJuIG4uY2FjaGU9bmV3KG8uQ2FjaGV8fHIpLG59by5DYWNoZT1yLGUuZXhwb3J0cz1vfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KTt2YXIgcj1uKDI4Nyksbz1uKDYxKSxhPW4oMjkwKTt0LmRlZmF1bHQ9ZnVuY3Rpb24oZSl7cmV0dXJue3N0YXRlUGx1Z2luczp7ZXJyOntyZWR1Y2VyczpPYmplY3Qoci5kZWZhdWx0KShlKSxhY3Rpb25zOm8sc2VsZWN0b3JzOmF9fX19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KTt2YXIgcj1uKDMpLG89bi5uKHIpLGE9bigyMCksaT1uLm4oYSkscz1uKDQpLHU9bi5uKHMpLGM9bigyKSxsPW4ubihjKSxwPW4oMTIpLGY9bi5uKHApLGg9bigyMTApLGQ9bi5uKGgpLG09big2MSksdj1uKDEpLGc9bigxMjYpLHk9e2xpbmU6MCxsZXZlbDoiZXJyb3IiLG1lc3NhZ2U6IlVua25vd24gZXJyb3IifTt0LmRlZmF1bHQ9ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4gZT17fSxvKCkoZSxtLk5FV19USFJPV05fRVJSLChmdW5jdGlvbihlLHQpe3ZhciBuPXQucGF5bG9hZCxyPWkoKSh5LG4se3R5cGU6InRocm93biJ9KTtyZXR1cm4gZS51cGRhdGUoImVycm9ycyIsKGZ1bmN0aW9uKGUpe3JldHVybihlfHxPYmplY3Qodi5MaXN0KSgpKS5wdXNoKE9iamVjdCh2LmZyb21KUykocikpfSkpLnVwZGF0ZSgiZXJyb3JzIiwoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdChnLmRlZmF1bHQpKGUpfSkpfSkpLG8oKShlLG0uTkVXX1RIUk9XTl9FUlJfQkFUQ0gsKGZ1bmN0aW9uKGUsdCl7dmFyIG49dC5wYXlsb2FkO3JldHVybiBuPXUoKShuKS5jYWxsKG4sKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3Qodi5mcm9tSlMpKGkoKSh5LGUse3R5cGU6InRocm93biJ9KSl9KSksZS51cGRhdGUoImVycm9ycyIsKGZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiBsKCkodD1lfHxPYmplY3Qodi5MaXN0KSgpKS5jYWxsKHQsT2JqZWN0KHYuZnJvbUpTKShuKSl9KSkudXBkYXRlKCJlcnJvcnMiLChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0KGcuZGVmYXVsdCkoZSl9KSl9KSksbygpKGUsbS5ORVdfU1BFQ19FUlIsKGZ1bmN0aW9uKGUsdCl7dmFyIG49dC5wYXlsb2FkLHI9T2JqZWN0KHYuZnJvbUpTKShuKTtyZXR1cm4gcj1yLnNldCgidHlwZSIsInNwZWMiKSxlLnVwZGF0ZSgiZXJyb3JzIiwoZnVuY3Rpb24oZSl7cmV0dXJuKGV8fE9iamVjdCh2Lkxpc3QpKCkpLnB1c2goT2JqZWN0KHYuZnJvbUpTKShyKSkuc29ydEJ5KChmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXQoImxpbmUiKX0pKX0pKS51cGRhdGUoImVycm9ycyIsKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QoZy5kZWZhdWx0KShlKX0pKX0pKSxvKCkoZSxtLk5FV19TUEVDX0VSUl9CQVRDSCwoZnVuY3Rpb24oZSx0KXt2YXIgbj10LnBheWxvYWQ7cmV0dXJuIG49dSgpKG4pLmNhbGwobiwoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdCh2LmZyb21KUykoaSgpKHksZSx7dHlwZToic3BlYyJ9KSl9KSksZS51cGRhdGUoImVycm9ycyIsKGZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiBsKCkodD1lfHxPYmplY3Qodi5MaXN0KSgpKS5jYWxsKHQsT2JqZWN0KHYuZnJvbUpTKShuKSl9KSkudXBkYXRlKCJlcnJvcnMiLChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0KGcuZGVmYXVsdCkoZSl9KSl9KSksbygpKGUsbS5ORVdfQVVUSF9FUlIsKGZ1bmN0aW9uKGUsdCl7dmFyIG49dC5wYXlsb2FkLHI9T2JqZWN0KHYuZnJvbUpTKShpKCkoe30sbikpO3JldHVybiByPXIuc2V0KCJ0eXBlIiwiYXV0aCIpLGUudXBkYXRlKCJlcnJvcnMiLChmdW5jdGlvbihlKXtyZXR1cm4oZXx8T2JqZWN0KHYuTGlzdCkoKSkucHVzaChPYmplY3Qodi5mcm9tSlMpKHIpKX0pKS51cGRhdGUoImVycm9ycyIsKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QoZy5kZWZhdWx0KShlKX0pKX0pKSxvKCkoZSxtLkNMRUFSLChmdW5jdGlvbihlLHQpe3ZhciBuLHI9dC5wYXlsb2FkO2lmKCFyfHwhZS5nZXQoImVycm9ycyIpKXJldHVybiBlO3ZhciBvPWYoKShuPWUuZ2V0KCJlcnJvcnMiKSkuY2FsbChuLChmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gZCgpKHQ9ZS5rZXlTZXEoKSkuY2FsbCh0LChmdW5jdGlvbih0KXt2YXIgbj1lLmdldCh0KSxvPXJbdF07cmV0dXJuIW98fG4hPT1vfSkpfSkpO3JldHVybiBlLm1lcmdlKHtlcnJvcnM6b30pfSkpLG8oKShlLG0uQ0xFQVJfQlksKGZ1bmN0aW9uKGUsdCl7dmFyIG4scj10LnBheWxvYWQ7aWYoIXJ8fCJmdW5jdGlvbiIhPXR5cGVvZiByKXJldHVybiBlO3ZhciBvPWYoKShuPWUuZ2V0KCJlcnJvcnMiKSkuY2FsbChuLChmdW5jdGlvbihlKXtyZXR1cm4gcihlKX0pKTtyZXR1cm4gZS5tZXJnZSh7ZXJyb3JzOm99KX0pKSxlfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtuLnIodCksbi5kKHQsInRyYW5zZm9ybSIsKGZ1bmN0aW9uKCl7cmV0dXJuIHB9KSk7dmFyIHI9big0KSxvPW4ubihyKSxhPW4oMTcpLGk9bi5uKGEpLHM9bigxOSksdT1uLm4ocyksYz1uKDI5KSxsPW4ubihjKTtmdW5jdGlvbiBwKGUpe3JldHVybiBvKCkoZSkuY2FsbChlLChmdW5jdGlvbihlKXt2YXIgdCxuPSJpcyBub3Qgb2YgYSB0eXBlKHMpIixyPWkoKSh0PWUuZ2V0KCJtZXNzYWdlIikpLmNhbGwodCxuKTtpZihyPi0xKXt2YXIgbyxhLHM9dSgpKG89ZS5nZXQoIm1lc3NhZ2UiKSkuY2FsbChvLHIrbi5sZW5ndGgpLnNwbGl0KCIsIik7cmV0dXJuIGUuc2V0KCJtZXNzYWdlIix1KCkoYT1lLmdldCgibWVzc2FnZSIpKS5jYWxsKGEsMCxyKStmdW5jdGlvbihlKXtyZXR1cm4gbCgpKGUpLmNhbGwoZSwoZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIG49PT1yLmxlbmd0aC0xJiZyLmxlbmd0aD4xP2UrIm9yICIrdDpyW24rMV0mJnIubGVuZ3RoPjI/ZSt0KyIsICI6cltuKzFdP2UrdCsiICI6ZSt0fSksInNob3VsZCBiZSBhIil9KHMpKX1yZXR1cm4gZX0pKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpLG4uZCh0LCJ0cmFuc2Zvcm0iLChmdW5jdGlvbigpe3JldHVybiByfSkpO24oNCksbigxNyksbig0MyksbigxKTtmdW5jdGlvbiByKGUsdCl7dC5qc1NwZWM7cmV0dXJuIGV9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KSxuLmQodCwiYWxsRXJyb3JzIiwoZnVuY3Rpb24oKXtyZXR1cm4gYX0pKSxuLmQodCwibGFzdEVycm9yIiwoZnVuY3Rpb24oKXtyZXR1cm4gaX0pKTt2YXIgcj1uKDEpLG89bigxNiksYT1PYmplY3Qoby5hKSgoZnVuY3Rpb24oZSl7cmV0dXJuIGV9KSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0KCJlcnJvcnMiLE9iamVjdChyLkxpc3QpKCkpfSkpLGk9T2JqZWN0KG8uYSkoYSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUubGFzdCgpfSkpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KTt2YXIgcj1uKDI5Miksbz1uKDEwNSksYT1uKDI5MyksaT1uKDI5NCk7dC5kZWZhdWx0PWZ1bmN0aW9uKCl7cmV0dXJue3N0YXRlUGx1Z2luczp7bGF5b3V0OntyZWR1Y2VyczpyLmRlZmF1bHQsYWN0aW9uczpvLHNlbGVjdG9yczphfSxzcGVjOnt3cmFwU2VsZWN0b3JzOml9fX19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KTt2YXIgcixvPW4oMyksYT1uLm4obyksaT1uKDIpLHM9bi5uKGkpLHU9bigxKSxjPW4oMTA1KTt0LmRlZmF1bHQ9KHI9e30sYSgpKHIsYy5VUERBVEVfTEFZT1VULChmdW5jdGlvbihlLHQpe3JldHVybiBlLnNldCgibGF5b3V0Iix0LnBheWxvYWQpfSkpLGEoKShyLGMuVVBEQVRFX0ZJTFRFUiwoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5zZXQoImZpbHRlciIsdC5wYXlsb2FkKX0pKSxhKCkocixjLlNIT1csKGZ1bmN0aW9uKGUsdCl7dmFyIG49dC5wYXlsb2FkLnNob3duLHI9T2JqZWN0KHUuZnJvbUpTKSh0LnBheWxvYWQudGhpbmcpO3JldHVybiBlLnVwZGF0ZSgic2hvd24iLE9iamVjdCh1LmZyb21KUykoe30pLChmdW5jdGlvbihlKXtyZXR1cm4gZS5zZXQocixuKX0pKX0pKSxhKCkocixjLlVQREFURV9NT0RFLChmdW5jdGlvbihlLHQpe3ZhciBuLHI9dC5wYXlsb2FkLnRoaW5nLG89dC5wYXlsb2FkLm1vZGU7cmV0dXJuIGUuc2V0SW4ocygpKG49WyJtb2RlcyJdKS5jYWxsKG4sciksKG98fCIiKSsiIil9KSkscil9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpLG4uZCh0LCJjdXJyZW50IiwoZnVuY3Rpb24oKXtyZXR1cm4gbH0pKSxuLmQodCwiY3VycmVudEZpbHRlciIsKGZ1bmN0aW9uKCl7cmV0dXJuIHB9KSksbi5kKHQsImlzU2hvd24iLChmdW5jdGlvbigpe3JldHVybiBmfSkpLG4uZCh0LCJ3aGF0TW9kZSIsKGZ1bmN0aW9uKCl7cmV0dXJuIGh9KSksbi5kKHQsInNob3dTdW1tYXJ5IiwoZnVuY3Rpb24oKXtyZXR1cm4gZH0pKTt2YXIgcj1uKDE0KSxvPW4ubihyKSxhPW4oMiksaT1uLm4oYSkscz1uKDE2KSx1PW4oNSksYz1uKDEpLGw9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0KCJsYXlvdXQiKX0scD1mdW5jdGlvbihlKXtyZXR1cm4gZS5nZXQoImZpbHRlciIpfSxmPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdD1PYmplY3QodS52KSh0KSxlLmdldCgic2hvd24iLE9iamVjdChjLmZyb21KUykoe30pKS5nZXQoT2JqZWN0KGMuZnJvbUpTKSh0KSxuKX0saD1mdW5jdGlvbihlLHQpe3ZhciBuLHI9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOiIiO3JldHVybiB0PU9iamVjdCh1LnYpKHQpLGUuZ2V0SW4oaSgpKG49WyJtb2RlcyJdKS5jYWxsKG4sbygpKHQpKSxyKX0sZD1PYmplY3Qocy5hKSgoZnVuY3Rpb24oZSl7cmV0dXJuIGV9KSwoZnVuY3Rpb24oZSl7cmV0dXJuIWYoZSwiZWRpdG9yIil9KSl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpLG4uZCh0LCJ0YWdnZWRPcGVyYXRpb25zIiwoZnVuY3Rpb24oKXtyZXR1cm4gc30pKTt2YXIgcj1uKDIpLG89bi5uKHIpLGE9bigxOSksaT1uLm4oYSkscz1mdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbihuKXtmb3IodmFyIHIsYT1hcmd1bWVudHMubGVuZ3RoLHM9bmV3IEFycmF5KGE+MT9hLTE6MCksdT0xO3U8YTt1Kyspc1t1LTFdPWFyZ3VtZW50c1t1XTt2YXIgYz1lLmFwcGx5KHZvaWQgMCxvKCkocj1bbl0pLmNhbGwocixzKSksbD10LmdldFN5c3RlbSgpLHA9bC5mbixmPWwubGF5b3V0U2VsZWN0b3JzLGg9bC5nZXRDb25maWdzLGQ9aCgpLG09ZC5tYXhEaXNwbGF5ZWRUYWdzLHY9Zi5jdXJyZW50RmlsdGVyKCk7cmV0dXJuIHYmJiEwIT09diYmInRydWUiIT09diYmImZhbHNlIiE9PXYmJihjPXAub3BzRmlsdGVyKGMsdikpLG0mJiFpc05hTihtKSYmbT49MCYmKGM9aSgpKGMpLmNhbGwoYywwLG0pKSxjfX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpO3ZhciByPW4oMjk2KSxvPW4oNDYpLGE9big5MSksaT1uKDI5Nyk7dC5kZWZhdWx0PWZ1bmN0aW9uKCl7cmV0dXJue3N0YXRlUGx1Z2luczp7c3BlYzp7d3JhcEFjdGlvbnM6aSxyZWR1Y2VyczpyLmRlZmF1bHQsYWN0aW9uczpvLHNlbGVjdG9yczphfX19fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtuLnIodCk7dmFyIHIsbz1uKDMpLGE9bi5uKG8pLGk9bigxNCkscz1uLm4oaSksdT1uKDIpLGM9bi5uKHUpLGw9bigyOSkscD1uLm4obCksZj1uKDQpLGg9bi5uKGYpLGQ9bigyMCksbT1uLm4oZCksdj1uKDEpLGc9big1KSx5PW4oMjYpLGI9big5MSksXz1uKDQ2KTt0LmRlZmF1bHQ9KHI9e30sYSgpKHIsXy5VUERBVEVfU1BFQywoZnVuY3Rpb24oZSx0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQucGF5bG9hZD9lLnNldCgic3BlYyIsdC5wYXlsb2FkKTplfSkpLGEoKShyLF8uVVBEQVRFX1VSTCwoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5zZXQoInVybCIsdC5wYXlsb2FkKyIiKX0pKSxhKCkocixfLlVQREFURV9KU09OLChmdW5jdGlvbihlLHQpe3JldHVybiBlLnNldCgianNvbiIsT2JqZWN0KGcuaSkodC5wYXlsb2FkKSl9KSksYSgpKHIsXy5VUERBVEVfUkVTT0xWRUQsKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuc2V0SW4oWyJyZXNvbHZlZCJdLE9iamVjdChnLmkpKHQucGF5bG9hZCkpfSkpLGEoKShyLF8uVVBEQVRFX1JFU09MVkVEX1NVQlRSRUUsKGZ1bmN0aW9uKGUsdCl7dmFyIG4scj10LnBheWxvYWQsbz1yLnZhbHVlLGE9ci5wYXRoO3JldHVybiBlLnNldEluKGMoKShuPVsicmVzb2x2ZWRTdWJ0cmVlcyJdKS5jYWxsKG4scygpKGEpKSxPYmplY3QoZy5pKShvKSl9KSksYSgpKHIsXy5VUERBVEVfUEFSQU0sKGZ1bmN0aW9uKGUsdCl7dmFyIG4scixvPXQucGF5bG9hZCxhPW8ucGF0aCxpPW8ucGFyYW1OYW1lLHU9by5wYXJhbUluLGw9by5wYXJhbSxwPW8udmFsdWUsZj1vLmlzWG1sLGg9bD9PYmplY3QoZy5BKShsKTpjKCkobj0iIi5jb25jYXQodSwiLiIpKS5jYWxsKG4saSksZD1mPyJ2YWx1ZV94bWwiOiJ2YWx1ZSI7cmV0dXJuIGUuc2V0SW4oYygpKHI9WyJtZXRhIiwicGF0aHMiXSkuY2FsbChyLHMoKShhKSxbInBhcmFtZXRlcnMiLGgsZF0pLHApfSkpLGEoKShyLF8uVVBEQVRFX0VNUFRZX1BBUkFNX0lOQ0xVU0lPTiwoZnVuY3Rpb24oZSx0KXt2YXIgbixyLG89dC5wYXlsb2FkLGE9by5wYXRoTWV0aG9kLGk9by5wYXJhbU5hbWUsdT1vLnBhcmFtSW4sbD1vLmluY2x1ZGVFbXB0eVZhbHVlO2lmKCFpfHwhdSlyZXR1cm4gY29uc29sZS53YXJuKCJXYXJuaW5nOiBVUERBVEVfRU1QVFlfUEFSQU1fSU5DTFVTSU9OIGNvdWxkIG5vdCBnZW5lcmF0ZSBhIHBhcmFtS2V5LiIpLGU7dmFyIHA9YygpKG49IiIuY29uY2F0KHUsIi4iKSkuY2FsbChuLGkpO3JldHVybiBlLnNldEluKGMoKShyPVsibWV0YSIsInBhdGhzIl0pLmNhbGwocixzKCkoYSksWyJwYXJhbWV0ZXJfaW5jbHVzaW9ucyIscF0pLGwpfSkpLGEoKShyLF8uVkFMSURBVEVfUEFSQU1TLChmdW5jdGlvbihlLHQpe3ZhciBuLHIsbz10LnBheWxvYWQsYT1vLnBhdGhNZXRob2QsaT1vLmlzT0FTMyx1PU9iamVjdChiLnNwZWNKc29uV2l0aFJlc29sdmVkU3VidHJlZXMpKGUpLmdldEluKGMoKShuPVsicGF0aHMiXSkuY2FsbChuLHMoKShhKSkpLGw9T2JqZWN0KGIucGFyYW1ldGVyVmFsdWVzKShlLGEpLnRvSlMoKTtyZXR1cm4gZS51cGRhdGVJbihjKCkocj1bIm1ldGEiLCJwYXRocyJdKS5jYWxsKHIscygpKGEpLFsicGFyYW1ldGVycyJdKSxPYmplY3Qodi5mcm9tSlMpKHt9KSwoZnVuY3Rpb24odCl7dmFyIG47cmV0dXJuIHAoKShuPXUuZ2V0KCJwYXJhbWV0ZXJzIixPYmplY3Qodi5MaXN0KSgpKSkuY2FsbChuLChmdW5jdGlvbih0LG4pe3ZhciByPU9iamVjdChnLkIpKG4sbCksbz1PYmplY3QoYi5wYXJhbWV0ZXJJbmNsdXNpb25TZXR0aW5nRm9yKShlLGEsbi5nZXQoIm5hbWUiKSxuLmdldCgiaW4iKSkscz1PYmplY3QoZy5LKShuLHIse2J5cGFzc1JlcXVpcmVkQ2hlY2s6byxpc09BUzM6aX0pO3JldHVybiB0LnNldEluKFtPYmplY3QoZy5BKShuKSwiZXJyb3JzIl0sT2JqZWN0KHYuZnJvbUpTKShzKSl9KSx0KX0pKX0pKSxhKCkocixfLkNMRUFSX1ZBTElEQVRFX1BBUkFNUywoZnVuY3Rpb24oZSx0KXt2YXIgbixyPXQucGF5bG9hZC5wYXRoTWV0aG9kO3JldHVybiBlLnVwZGF0ZUluKGMoKShuPVsibWV0YSIsInBhdGhzIl0pLmNhbGwobixzKCkociksWyJwYXJhbWV0ZXJzIl0pLE9iamVjdCh2LmZyb21KUykoW10pLChmdW5jdGlvbihlKXtyZXR1cm4gaCgpKGUpLmNhbGwoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc2V0KCJlcnJvcnMiLE9iamVjdCh2LmZyb21KUykoW10pKX0pKX0pKX0pKSxhKCkocixfLlNFVF9SRVNQT05TRSwoZnVuY3Rpb24oZSx0KXt2YXIgbixyPXQucGF5bG9hZCxvPXIucmVzLGE9ci5wYXRoLGk9ci5tZXRob2Q7KG49by5lcnJvcj9tKCkoe2Vycm9yOiEwLG5hbWU6by5lcnIubmFtZSxtZXNzYWdlOm8uZXJyLm1lc3NhZ2Usc3RhdHVzQ29kZTpvLmVyci5zdGF0dXNDb2RlfSxvLmVyci5yZXNwb25zZSk6bykuaGVhZGVycz1uLmhlYWRlcnN8fHt9O3ZhciBzPWUuc2V0SW4oWyJyZXNwb25zZXMiLGEsaV0sT2JqZWN0KGcuaSkobikpO3JldHVybiB5LmEuQmxvYiYmby5kYXRhIGluc3RhbmNlb2YgeS5hLkJsb2ImJihzPXMuc2V0SW4oWyJyZXNwb25zZXMiLGEsaSwidGV4dCJdLG8uZGF0YSkpLHN9KSksYSgpKHIsXy5TRVRfUkVRVUVTVCwoZnVuY3Rpb24oZSx0KXt2YXIgbj10LnBheWxvYWQscj1uLnJlcSxvPW4ucGF0aCxhPW4ubWV0aG9kO3JldHVybiBlLnNldEluKFsicmVxdWVzdHMiLG8sYV0sT2JqZWN0KGcuaSkocikpfSkpLGEoKShyLF8uU0VUX01VVEFURURfUkVRVUVTVCwoZnVuY3Rpb24oZSx0KXt2YXIgbj10LnBheWxvYWQscj1uLnJlcSxvPW4ucGF0aCxhPW4ubWV0aG9kO3JldHVybiBlLnNldEluKFsibXV0YXRlZFJlcXVlc3RzIixvLGFdLE9iamVjdChnLmkpKHIpKX0pKSxhKCkocixfLlVQREFURV9PUEVSQVRJT05fTUVUQV9WQUxVRSwoZnVuY3Rpb24oZSx0KXt2YXIgbixyLG8sYSxpLHUsbD10LnBheWxvYWQscD1sLnBhdGgsZj1sLnZhbHVlLGg9bC5rZXksZD1jKCkobj1bInBhdGhzIl0pLmNhbGwobixzKCkocCkpLG09YygpKHI9WyJtZXRhIiwicGF0aHMiXSkuY2FsbChyLHMoKShwKSk7cmV0dXJuIGUuZ2V0SW4oYygpKG89WyJqc29uIl0pLmNhbGwobyxzKCkoZCkpKXx8ZS5nZXRJbihjKCkoYT1bInJlc29sdmVkIl0pLmNhbGwoYSxzKCkoZCkpKXx8ZS5nZXRJbihjKCkoaT1bInJlc29sdmVkU3VidHJlZXMiXSkuY2FsbChpLHMoKShkKSkpP2Uuc2V0SW4oYygpKHU9W10pLmNhbGwodSxzKCkobSksW2hdKSxPYmplY3Qodi5mcm9tSlMpKGYpKTplfSkpLGEoKShyLF8uQ0xFQVJfUkVTUE9OU0UsKGZ1bmN0aW9uKGUsdCl7dmFyIG49dC5wYXlsb2FkLHI9bi5wYXRoLG89bi5tZXRob2Q7cmV0dXJuIGUuZGVsZXRlSW4oWyJyZXNwb25zZXMiLHIsb10pfSkpLGEoKShyLF8uQ0xFQVJfUkVRVUVTVCwoZnVuY3Rpb24oZSx0KXt2YXIgbj10LnBheWxvYWQscj1uLnBhdGgsbz1uLm1ldGhvZDtyZXR1cm4gZS5kZWxldGVJbihbInJlcXVlc3RzIixyLG9dKX0pKSxhKCkocixfLlNFVF9TQ0hFTUUsKGZ1bmN0aW9uKGUsdCl7dmFyIG49dC5wYXlsb2FkLHI9bi5zY2hlbWUsbz1uLnBhdGgsYT1uLm1ldGhvZDtyZXR1cm4gbyYmYT9lLnNldEluKFsic2NoZW1lIixvLGFdLHIpOm98fGE/dm9pZCAwOmUuc2V0SW4oWyJzY2hlbWUiLCJfZGVmYXVsdFNjaGVtZSJdLHIpfSkpLHIpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KSxuLmQodCwidXBkYXRlU3BlYyIsKGZ1bmN0aW9uKCl7cmV0dXJuIGN9KSksbi5kKHQsInVwZGF0ZUpzb25TcGVjIiwoZnVuY3Rpb24oKXtyZXR1cm4gbH0pKSxuLmQodCwiZXhlY3V0ZVJlcXVlc3QiLChmdW5jdGlvbigpe3JldHVybiBwfSkpLG4uZCh0LCJ2YWxpZGF0ZVBhcmFtcyIsKGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KSk7dmFyIHI9bigxNSksbz1uLm4ociksYT1uKDIxKSxpPW4ubihhKSxzPW4oNDMpLHU9bi5uKHMpLGM9ZnVuY3Rpb24oZSx0KXt2YXIgbj10LnNwZWNBY3Rpb25zO3JldHVybiBmdW5jdGlvbigpe2UuYXBwbHkodm9pZCAwLGFyZ3VtZW50cyksbi5wYXJzZVRvSnNvbi5hcHBseShuLGFyZ3VtZW50cyl9fSxsPWZ1bmN0aW9uKGUsdCl7dmFyIG49dC5zcGVjQWN0aW9ucztyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheSh0KSxhPTA7YTx0O2ErKylyW2FdPWFyZ3VtZW50c1thXTtlLmFwcGx5KHZvaWQgMCxyKSxuLmludmFsaWRhdGVSZXNvbHZlZFN1YnRyZWVDYWNoZSgpO3ZhciBzPXJbMF0sYz11KCkocyxbInBhdGhzIl0pfHx7fSxsPW8oKShjKTtpKCkobCkuY2FsbChsLChmdW5jdGlvbihlKXt1KCkoYyxbZV0pLiRyZWYmJm4ucmVxdWVzdFJlc29sdmVkU3VidHJlZShbInBhdGhzIixlXSl9KSksbi5yZXF1ZXN0UmVzb2x2ZWRTdWJ0cmVlKFsiY29tcG9uZW50cyIsInNlY3VyaXR5U2NoZW1lcyJdKX19LHA9ZnVuY3Rpb24oZSx0KXt2YXIgbj10LnNwZWNBY3Rpb25zO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbi5sb2dSZXF1ZXN0KHQpLGUodCl9fSxmPWZ1bmN0aW9uKGUsdCl7dmFyIG49dC5zcGVjU2VsZWN0b3JzO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZSh0LG4uaXNPQVMzKCkpfX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpO3ZhciByPW4oMzYpLG89bi5uKHIpLGE9bigxNzUpLGk9big1KTt0LmRlZmF1bHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRDb21wb25lbnRzLG49ZS5nZXRTdG9yZSxyPWUuZ2V0U3lzdGVtLHM9YS5nZXRDb21wb25lbnQsdT1hLnJlbmRlcixjPWEubWFrZU1hcHBlZENvbnRhaW5lcixsPU9iamVjdChpLnUpKG8oKShzKS5jYWxsKHMsbnVsbCxyLG4sdCkpO3JldHVybntyb290SW5qZWN0czp7Z2V0Q29tcG9uZW50OmwsbWFrZU1hcHBlZENvbnRhaW5lcjpPYmplY3QoaS51KShvKCkoYykuY2FsbChjLG51bGwscixuLGwsdCkpLHJlbmRlcjpvKCkodSkuY2FsbCh1LG51bGwscixuLHMsdCl9fX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpO3ZhciByPW4oMTQ3KTt0LmRlZmF1bHQ9ZnVuY3Rpb24oKXtyZXR1cm57Zm46cn19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KTt2YXIgcj1uKDE3Miksbz1uKDMwMSksYT1uKDMwMik7dC5kZWZhdWx0PWZ1bmN0aW9uKCl7cmV0dXJue2NvbXBvbmVudHM6e1JlcXVlc3RTbmlwcGV0czphLlJlcXVlc3RTbmlwcGV0c30sZm46cixzdGF0ZVBsdWdpbnM6e3JlcXVlc3RTbmlwcGV0czp7c2VsZWN0b3JzOm99fX19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KSxuLmQodCwiZ2V0R2VuZXJhdG9ycyIsKGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KSksbi5kKHQsImdldFNuaXBwZXRHZW5lcmF0b3JzIiwoZnVuY3Rpb24oKXtyZXR1cm4gaH0pKSxuLmQodCwiZ2V0QWN0aXZlTGFuZ3VhZ2UiLChmdW5jdGlvbigpe3JldHVybiBkfSkpLG4uZCh0LCJnZXREZWZhdWx0RXhwYW5kZWQiLChmdW5jdGlvbigpe3JldHVybiBtfSkpO3ZhciByPW4oMTIpLG89bi5uKHIpLGE9bigzMSksaT1uLm4oYSkscz1uKDQpLHU9bi5uKHMpLGM9bigxNiksbD1uKDEpLHA9ZnVuY3Rpb24oZSl7cmV0dXJuIGV8fE9iamVjdChsLk1hcCkoKX0sZj1PYmplY3QoYy5hKShwLChmdW5jdGlvbihlKXt2YXIgdD1lLmdldCgibGFuZ3VhZ2VzIiksbj1lLmdldCgiZ2VuZXJhdG9ycyIsT2JqZWN0KGwuTWFwKSgpKTtyZXR1cm4hdHx8dC5pc0VtcHR5KCk/bjpvKCkobikuY2FsbChuLChmdW5jdGlvbihlLG4pe3JldHVybiBpKCkodCkuY2FsbCh0LG4pfSkpfSkpLGg9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuLHIsYT10LmZuO3JldHVybiBvKCkobj11KCkocj1mKGUpKS5jYWxsKHIsKGZ1bmN0aW9uKGUsdCl7dmFyIG49ZnVuY3Rpb24oZSl7cmV0dXJuIGFbInJlcXVlc3RTbmlwcGV0R2VuZXJhdG9yXyIuY29uY2F0KGUpXX0odCk7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIG4/bnVsbDplLnNldCgiZm4iLG4pfSkpKS5jYWxsKG4sKGZ1bmN0aW9uKGUpe3JldHVybiBlfSkpfX0sZD1PYmplY3QoYy5hKShwLChmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXQoImFjdGl2ZUxhbmd1YWdlIil9KSksbT1PYmplY3QoYy5hKShwLChmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXQoImRlZmF1bHRFeHBhbmRlZCIpfSkpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KSxuLmQodCwiUmVxdWVzdFNuaXBwZXRzIiwoZnVuY3Rpb24oKXtyZXR1cm4gd30pKTt2YXIgcj1uKDEzKSxvPW4ubihyKSxhPW4oNiksaT1uLm4oYSkscz1uKDcpLHU9bi5uKHMpLGM9big4KSxsPW4ubihjKSxwPW4oOSksZj1uLm4ocCksaD1uKDQpLGQ9bi5uKGgpLG09bigwKSx2PW4ubihtKSxnPW4oMTQ4KSx5PShuKDExKSxuKDQzKSksYj1uLm4oeSksXz1uKDk0KSx3PWZ1bmN0aW9uKGUpe2woKShuLGUpO3ZhciB0PWYoKShuKTtmdW5jdGlvbiBuKCl7dmFyIGUscixvLGEscyx1O3JldHVybiBpKCkodGhpcyxuKSwodT10LmNhbGwodGhpcykpLnN0YXRlPXthY3RpdmVMYW5ndWFnZTpudWxsPT09KGU9dS5wcm9wcyl8fHZvaWQgMD09PWV8fG51bGw9PT0ocj1lLnJlcXVlc3RTbmlwcGV0c1NlbGVjdG9ycyl8fHZvaWQgMD09PXJ8fG51bGw9PT0obz1yLmdldFNuaXBwZXRHZW5lcmF0b3JzKCkpfHx2b2lkIDA9PT1vP3ZvaWQgMDpvLmtleVNlcSgpLmZpcnN0KCksZXhwYW5kZWQ6bnVsbD09PShhPXUucHJvcHMpfHx2b2lkIDA9PT1hfHxudWxsPT09KHM9YS5yZXF1ZXN0U25pcHBldHNTZWxlY3RvcnMpfHx2b2lkIDA9PT1zP3ZvaWQgMDpzLmdldERlZmF1bHRFeHBhbmRlZCgpfSx1fXJldHVybiB1KCkobixbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlLHQsbixyLGE9dGhpcyxpPXRoaXMucHJvcHMscz1pLnJlcXVlc3QsdT1pLmdldENvbmZpZ3MsYz1pLnJlcXVlc3RTbmlwcGV0c1NlbGVjdG9ycy5nZXRTbmlwcGV0R2VuZXJhdG9ycygpLGw9dGhpcy5zdGF0ZS5hY3RpdmVMYW5ndWFnZXx8Yy5rZXlTZXEoKS5maXJzdCgpLHA9Yy5nZXQobCksZj1wLmdldCgiZm4iKShzKSxoPXtjdXJzb3I6InBvaW50ZXIiLGxpbmVIZWlnaHQ6MSxkaXNwbGF5OiJpbmxpbmUtZmxleCIsYmFja2dyb3VuZENvbG9yOiJyZ2IoMjUwLCAyNTAsIDI1MCkiLHBhZGRpbmdCb3R0b206IjAiLHBhZGRpbmdUb3A6IjAiLGJvcmRlcjoiMXB4IHNvbGlkIHJnYig1MSwgNTEsIDUxKSIsYm9yZGVyUmFkaXVzOiI0cHggNHB4IDAgMCIsYm94U2hhZG93OiJub25lIixib3JkZXJCb3R0b206Im5vbmUifSxtPXtjdXJzb3I6InBvaW50ZXIiLGxpbmVIZWlnaHQ6MSxkaXNwbGF5OiJpbmxpbmUtZmxleCIsYmFja2dyb3VuZENvbG9yOiJyZ2IoNTEsIDUxLCA1MSkiLGJveFNoYWRvdzoibm9uZSIsYm9yZGVyOiIxcHggc29saWQgcmdiKDUxLCA1MSwgNTEpIixwYWRkaW5nQm90dG9tOiIwIixwYWRkaW5nVG9wOiIwIixib3JkZXJSYWRpdXM6IjRweCA0cHggMCAwIixtYXJnaW5Ub3A6Ii01cHgiLG1hcmdpblJpZ2h0OiItNXB4IixtYXJnaW5MZWZ0OiItNXB4Iix6SW5kZXg6Ijk5OTkiLGJvcmRlckJvdHRvbToibm9uZSJ9LHk9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1sP206aH0sdz11KCkseD1udWxsIT13JiZudWxsIT09KGU9dy5zeW50YXhIaWdobGlnaHQpJiZ2b2lkIDAhPT1lJiZlLmFjdGl2YXRlZD92LmEuY3JlYXRlRWxlbWVudChfLmEse2xhbmd1YWdlOnAuZ2V0KCJzeW50YXgiKSxjbGFzc05hbWU6ImN1cmwgbWljcm9saWdodCIsb25XaGVlbDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wcmV2ZW50WVNjcm9sbGluZ0JleW9uZEVsZW1lbnQoZSl9LHN0eWxlOk9iamVjdChfLmIpKGIoKSh3LCJzeW50YXhIaWdobGlnaHQudGhlbWUiKSl9LGYpOnYuYS5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIse3JlYWRPbmx5OiEwLGNsYXNzTmFtZToiY3VybCIsdmFsdWU6Zn0pLEU9dm9pZCAwPT09dGhpcy5zdGF0ZS5leHBhbmRlZD9udWxsPT09KHQ9dGhpcy5wcm9wcyl8fHZvaWQgMD09PXR8fG51bGw9PT0obj10LnJlcXVlc3RTbmlwcGV0c1NlbGVjdG9ycyl8fHZvaWQgMD09PW4/dm9pZCAwOm4uZ2V0RGVmYXVsdEV4cGFuZGVkKCk6dGhpcy5zdGF0ZS5leHBhbmRlZDtyZXR1cm4gdi5hLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCx2LmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7c3R5bGU6e3dpZHRoOiIxMDAlIixkaXNwbGF5OiJmbGV4IixqdXN0aWZ5Q29udGVudDoiZmxleC1zdGFydCIsYWxpZ25JdGVtczoiY2VudGVyIixtYXJnaW5Cb3R0b206IjE1cHgifX0sdi5hLmNyZWF0ZUVsZW1lbnQoImg0Iix7c3R5bGU6e2N1cnNvcjoicG9pbnRlciJ9LG9uQ2xpY2s6ZnVuY3Rpb24oKXtyZXR1cm4gYS5zZXRTdGF0ZSh7ZXhwYW5kZWQ6IUV9KX19LCJTbmlwcGV0cyIpLHYuYS5jcmVhdGVFbGVtZW50KCJidXR0b24iLHtvbkNsaWNrOmZ1bmN0aW9uKCl7cmV0dXJuIGEuc2V0U3RhdGUoe2V4cGFuZGVkOiFFfSl9LHN0eWxlOntib3JkZXI6Im5vbmUiLGJhY2tncm91bmQ6Im5vbmUifSx0aXRsZTpFPyJDb2xsYXBzZSBvcGVyYXRpb24iOiJFeHBhbmQgb3BlcmF0aW9uIn0sdi5hLmNyZWF0ZUVsZW1lbnQoInN2ZyIse2NsYXNzTmFtZToiYXJyb3ciLHdpZHRoOiIxMCIsaGVpZ2h0OiIxMCJ9LHYuYS5jcmVhdGVFbGVtZW50KCJ1c2UiLHtocmVmOkU/IiNsYXJnZS1hcnJvdy1kb3duIjoiI2xhcmdlLWFycm93Iix4bGlua0hyZWY6RT8iI2xhcmdlLWFycm93LWRvd24iOiIjbGFyZ2UtYXJyb3cifSkpKSksRSYmdi5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiY3VybC1jb21tYW5kIn0sdi5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse3N0eWxlOntwYWRkaW5nTGVmdDoiMTVweCIscGFkZGluZ1JpZ2h0OiIxMHB4Iix3aWR0aDoiMTAwJSIsZGlzcGxheToiZmxleCJ9fSxkKCkocj1jLmVudHJ5U2VxKCkpLmNhbGwociwoZnVuY3Rpb24oZSl7dmFyIHQ9bygpKGUsMiksbj10WzBdLHI9dFsxXTtyZXR1cm4gdi5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse3N0eWxlOnkobiksY2xhc3NOYW1lOiJidG4iLGtleTpuLG9uQ2xpY2s6ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSl7bCE9PWUmJmEuc2V0U3RhdGUoe2FjdGl2ZUxhbmd1YWdlOmV9KX0obil9fSx2LmEuY3JlYXRlRWxlbWVudCgiaDQiLHtzdHlsZTpuPT09bD97Y29sb3I6IndoaXRlIn06e319LHIuZ2V0KCJ0aXRsZSIpKSl9KSkpLHYuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImNvcHktdG8tY2xpcGJvYXJkIn0sdi5hLmNyZWF0ZUVsZW1lbnQoZy5Db3B5VG9DbGlwYm9hcmQse3RleHQ6Zn0sdi5hLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIsbnVsbCkpKSx2LmEuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLHgpKSl9fV0pLG59KHYuYS5Db21wb25lbnQpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KTt2YXIgcj1uKDM2KSxvPW4ubihyKTt0LmRlZmF1bHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb25maWdzLG49e2RlYnVnOjAsaW5mbzoxLGxvZzoyLHdhcm46MyxlcnJvcjo0fSxyPWZ1bmN0aW9uKGUpe3JldHVybiBuW2VdfHwtMX0sYT10LmxvZ0xldmVsLGk9cihhKTtmdW5jdGlvbiBzKGUpe2Zvcih2YXIgdCxuPWFyZ3VtZW50cy5sZW5ndGgsbz1uZXcgQXJyYXkobj4xP24tMTowKSxhPTE7YTxuO2ErKylvW2EtMV09YXJndW1lbnRzW2FdO3IoZSk+PWkmJih0PWNvbnNvbGUpW2VdLmFwcGx5KHQsbyl9cmV0dXJuIHMud2Fybj1vKCkocykuY2FsbChzLG51bGwsIndhcm4iKSxzLmVycm9yPW8oKShzKS5jYWxsKHMsbnVsbCwiZXJyb3IiKSxzLmluZm89bygpKHMpLmNhbGwocyxudWxsLCJpbmZvIikscy5kZWJ1Zz1vKCkocykuY2FsbChzLG51bGwsImRlYnVnIikse3Jvb3RJbmplY3RzOntsb2c6c319fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtuLnIodCksbi5kKHQsImxvYWRlZCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KSk7dmFyIHI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXtlLmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpO3ZhciBuPXQuZ2V0Q29uZmlncygpLndpdGhDcmVkZW50aWFsczt2b2lkIDAhPT1uJiYodC5mbi5mZXRjaC53aXRoQ3JlZGVudGlhbHM9InN0cmluZyI9PXR5cGVvZiBuPyJ0cnVlIj09PW46ISFuKX19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KSxuLmQodCwicHJlYXV0aG9yaXplQmFzaWMiLChmdW5jdGlvbigpe3JldHVybiBofSkpLG4uZCh0LCJwcmVhdXRob3JpemVBcGlLZXkiLChmdW5jdGlvbigpe3JldHVybiBkfSkpO3ZhciByPW4oMyksbz1uLm4ociksYT1uKDM2KSxpPW4ubihhKSxzPW4oMiksdT1uLm4ocyksYz1uKDMwNiksbD1uKDgzKSxwPW4oMzA3KSxmPW4oMzA4KTtmdW5jdGlvbiBoKGUsdCxuLHIpe3ZhciBhLGk9ZS5hdXRoQWN0aW9ucy5hdXRob3JpemUscz1lLnNwZWNTZWxlY3RvcnMsYz1zLnNwZWNKc29uLGw9KDAscy5pc09BUzMpKCk/WyJjb21wb25lbnRzIiwic2VjdXJpdHlTY2hlbWVzIl06WyJzZWN1cml0eURlZmluaXRpb25zIl0scD1jKCkuZ2V0SW4odSgpKGE9W10pLmNhbGwoYSxsLFt0XSkpO3JldHVybiBwP2kobygpKHt9LHQse3ZhbHVlOnt1c2VybmFtZTpuLHBhc3N3b3JkOnJ9LHNjaGVtYTpwLnRvSlMoKX0pKTpudWxsfWZ1bmN0aW9uIGQoZSx0LG4pe3ZhciByLGE9ZS5hdXRoQWN0aW9ucy5hdXRob3JpemUsaT1lLnNwZWNTZWxlY3RvcnMscz1pLnNwZWNKc29uLGM9KDAsaS5pc09BUzMpKCk/WyJjb21wb25lbnRzIiwic2VjdXJpdHlTY2hlbWVzIl06WyJzZWN1cml0eURlZmluaXRpb25zIl0sbD1zKCkuZ2V0SW4odSgpKHI9W10pLmNhbGwocixjLFt0XSkpO3JldHVybiBsP2EobygpKHt9LHQse3ZhbHVlOm4sc2NoZW1hOmwudG9KUygpfSkpOm51bGx9dC5kZWZhdWx0PWZ1bmN0aW9uKCl7cmV0dXJue2FmdGVyTG9hZDpmdW5jdGlvbihlKXt0aGlzLnJvb3RJbmplY3RzPXRoaXMucm9vdEluamVjdHN8fHt9LHRoaXMucm9vdEluamVjdHMuaW5pdE9BdXRoPWUuYXV0aEFjdGlvbnMuY29uZmlndXJlQXV0aCx0aGlzLnJvb3RJbmplY3RzLnByZWF1dGhvcml6ZUFwaUtleT1pKCkoZCkuY2FsbChkLG51bGwsZSksdGhpcy5yb290SW5qZWN0cy5wcmVhdXRob3JpemVCYXNpYz1pKCkoaCkuY2FsbChoLG51bGwsZSl9LHN0YXRlUGx1Z2luczp7YXV0aDp7cmVkdWNlcnM6Yy5kZWZhdWx0LGFjdGlvbnM6bCxzZWxlY3RvcnM6cH0sc3BlYzp7d3JhcEFjdGlvbnM6Zn19fX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpO3ZhciByLG89bigzKSxhPW4ubihvKSxpPW4oMTMpLHM9bi5uKGkpLHU9bigyMSksYz1uLm4odSksbD1uKDIwKSxwPW4ubihsKSxmPW4oMSksaD1uKDUpLGQ9big4Myk7dC5kZWZhdWx0PShyPXt9LGEoKShyLGQuU0hPV19BVVRIX1BPUFVQLChmdW5jdGlvbihlLHQpe3ZhciBuPXQucGF5bG9hZDtyZXR1cm4gZS5zZXQoInNob3dEZWZpbml0aW9ucyIsbil9KSksYSgpKHIsZC5BVVRIT1JJWkUsKGZ1bmN0aW9uKGUsdCl7dmFyIG4scj10LnBheWxvYWQsbz1PYmplY3QoZi5mcm9tSlMpKHIpLGE9ZS5nZXQoImF1dGhvcml6ZWQiKXx8T2JqZWN0KGYuTWFwKSgpO3JldHVybiBjKCkobj1vLmVudHJ5U2VxKCkpLmNhbGwobiwoZnVuY3Rpb24odCl7dmFyIG49cygpKHQsMikscj1uWzBdLG89blsxXTtpZighT2JqZWN0KGgucykoby5nZXRJbikpcmV0dXJuIGUuc2V0KCJhdXRob3JpemVkIixhKTt2YXIgaT1vLmdldEluKFsic2NoZW1hIiwidHlwZSJdKTtpZigiYXBpS2V5Ij09PWl8fCJodHRwIj09PWkpYT1hLnNldChyLG8pO2Vsc2UgaWYoImJhc2ljIj09PWkpe3ZhciB1PW8uZ2V0SW4oWyJ2YWx1ZSIsInVzZXJuYW1lIl0pLGM9by5nZXRJbihbInZhbHVlIiwicGFzc3dvcmQiXSk7YT0oYT1hLnNldEluKFtyLCJ2YWx1ZSJdLHt1c2VybmFtZTp1LGhlYWRlcjoiQmFzaWMgIitPYmplY3QoaC5hKSh1KyI6IitjKX0pKS5zZXRJbihbciwic2NoZW1hIl0sby5nZXQoInNjaGVtYSIpKX19KSksZS5zZXQoImF1dGhvcml6ZWQiLGEpfSkpLGEoKShyLGQuQVVUSE9SSVpFX09BVVRIMiwoZnVuY3Rpb24oZSx0KXt2YXIgbixyPXQucGF5bG9hZCxvPXIuYXV0aCxhPXIudG9rZW47by50b2tlbj1wKCkoe30sYSksbj1PYmplY3QoZi5mcm9tSlMpKG8pO3ZhciBpPWUuZ2V0KCJhdXRob3JpemVkIil8fE9iamVjdChmLk1hcCkoKTtyZXR1cm4gaT1pLnNldChuLmdldCgibmFtZSIpLG4pLGUuc2V0KCJhdXRob3JpemVkIixpKX0pKSxhKCkocixkLkxPR09VVCwoZnVuY3Rpb24oZSx0KXt2YXIgbj10LnBheWxvYWQscj1lLmdldCgiYXV0aG9yaXplZCIpLndpdGhNdXRhdGlvbnMoKGZ1bmN0aW9uKGUpe2MoKShuKS5jYWxsKG4sKGZ1bmN0aW9uKHQpe2UuZGVsZXRlKHQpfSkpfSkpO3JldHVybiBlLnNldCgiYXV0aG9yaXplZCIscil9KSksYSgpKHIsZC5DT05GSUdVUkVfQVVUSCwoZnVuY3Rpb24oZSx0KXt2YXIgbj10LnBheWxvYWQ7cmV0dXJuIGUuc2V0KCJjb25maWdzIixuKX0pKSxhKCkocixkLlJFU1RPUkVfQVVUSE9SSVpBVElPTiwoZnVuY3Rpb24oZSx0KXt2YXIgbj10LnBheWxvYWQ7cmV0dXJuIGUuc2V0KCJhdXRob3JpemVkIixPYmplY3QoZi5mcm9tSlMpKG4uYXV0aG9yaXplZCkpfSkpLHIpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KSxuLmQodCwic2hvd25EZWZpbml0aW9ucyIsKGZ1bmN0aW9uKCl7cmV0dXJuIF99KSksbi5kKHQsImRlZmluaXRpb25zVG9BdXRob3JpemUiLChmdW5jdGlvbigpe3JldHVybiB3fSkpLG4uZCh0LCJnZXREZWZpbml0aW9uc0J5TmFtZXMiLChmdW5jdGlvbigpe3JldHVybiB4fSkpLG4uZCh0LCJkZWZpbml0aW9uc0ZvclJlcXVpcmVtZW50cyIsKGZ1bmN0aW9uKCl7cmV0dXJuIEV9KSksbi5kKHQsImF1dGhvcml6ZWQiLChmdW5jdGlvbigpe3JldHVybiBTfSkpLG4uZCh0LCJpc0F1dGhvcml6ZWQiLChmdW5jdGlvbigpe3JldHVybiBDfSkpLG4uZCh0LCJnZXRDb25maWdzIiwoZnVuY3Rpb24oKXtyZXR1cm4gQX0pKTt2YXIgcj1uKDEzKSxvPW4ubihyKSxhPW4oMjEpLGk9bi5uKGEpLHM9bigxMiksdT1uLm4ocyksYz1uKDc0KSxsPW4ubihjKSxwPW4oMTcpLGY9bi5uKHApLGg9big0KSxkPW4ubihoKSxtPW4oMTUpLHY9bi5uKG0pLGc9bigxNikseT1uKDEpLGI9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LF89T2JqZWN0KGcuYSkoYiwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0KCJzaG93RGVmaW5pdGlvbnMiKX0pKSx3PU9iamVjdChnLmEpKGIsKGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5zcGVjU2VsZWN0b3JzLnNlY3VyaXR5RGVmaW5pdGlvbnMoKXx8T2JqZWN0KHkuTWFwKSh7fSkscj1PYmplY3QoeS5MaXN0KSgpO3JldHVybiBpKCkodD1uLmVudHJ5U2VxKCkpLmNhbGwodCwoZnVuY3Rpb24oZSl7dmFyIHQ9bygpKGUsMiksbj10WzBdLGE9dFsxXSxpPU9iamVjdCh5Lk1hcCkoKTtpPWkuc2V0KG4sYSkscj1yLnB1c2goaSl9KSkscn19KSkseD1mdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgbixyPWUuc3BlY1NlbGVjdG9ycztjb25zb2xlLndhcm4oIldBUk5JTkc6IGdldERlZmluaXRpb25zQnlOYW1lcyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbi4iKTt2YXIgYT1yLnNlY3VyaXR5RGVmaW5pdGlvbnMoKSxzPU9iamVjdCh5Lkxpc3QpKCk7cmV0dXJuIGkoKShuPXQudmFsdWVTZXEoKSkuY2FsbChuLChmdW5jdGlvbihlKXt2YXIgdCxuPU9iamVjdCh5Lk1hcCkoKTtpKCkodD1lLmVudHJ5U2VxKCkpLmNhbGwodCwoZnVuY3Rpb24oZSl7dmFyIHQscixzPW8oKShlLDIpLHU9c1swXSxjPXNbMV0sbD1hLmdldCh1KTsib2F1dGgyIj09PWwuZ2V0KCJ0eXBlIikmJmMuc2l6ZSYmKHQ9bC5nZXQoInNjb3BlcyIpLGkoKShyPXQua2V5U2VxKCkpLmNhbGwociwoZnVuY3Rpb24oZSl7Yy5jb250YWlucyhlKXx8KHQ9dC5kZWxldGUoZSkpfSkpLGw9bC5zZXQoImFsbG93ZWRTY29wZXMiLHQpKTtuPW4uc2V0KHUsbCl9KSkscz1zLnB1c2gobil9KSksc319LEU9ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOk9iamVjdCh5Lkxpc3QpKCk7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPWUuYXV0aFNlbGVjdG9ycy5kZWZpbml0aW9uc1RvQXV0aG9yaXplKCl8fE9iamVjdCh5Lkxpc3QpKCk7cmV0dXJuIHUoKShuKS5jYWxsKG4sKGZ1bmN0aW9uKGUpe3JldHVybiBsKCkodCkuY2FsbCh0LChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXQoZS5rZXlTZXEoKS5maXJzdCgpKX0pKX0pKX19LFM9T2JqZWN0KGcuYSkoYiwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0KCJhdXRob3JpemVkIil8fE9iamVjdCh5Lk1hcCkoKX0pKSxDPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuLHI9ZS5hdXRoU2VsZWN0b3JzLmF1dGhvcml6ZWQoKTtyZXR1cm4geS5MaXN0LmlzTGlzdCh0KT8hIXUoKShuPXQudG9KUygpKS5jYWxsKG4sKGZ1bmN0aW9uKGUpe3ZhciB0LG47cmV0dXJuLTE9PT1mKCkodD1kKCkobj12KCkoZSkpLmNhbGwobiwoZnVuY3Rpb24oZSl7cmV0dXJuISFyLmdldChlKX0pKSkuY2FsbCh0LCExKX0pKS5sZW5ndGg6bnVsbH19LEE9T2JqZWN0KGcuYSkoYiwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0KCJjb25maWdzIil9KSl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpLG4uZCh0LCJleGVjdXRlIiwoZnVuY3Rpb24oKXtyZXR1cm4gYX0pKTt2YXIgcj1uKDI0KSxvPW4ubihyKSxhPWZ1bmN0aW9uKGUsdCl7dmFyIG49dC5hdXRoU2VsZWN0b3JzLHI9dC5zcGVjU2VsZWN0b3JzO3JldHVybiBmdW5jdGlvbih0KXt2YXIgYT10LnBhdGgsaT10Lm1ldGhvZCxzPXQub3BlcmF0aW9uLHU9dC5leHRyYXMsYz17YXV0aG9yaXplZDpuLmF1dGhvcml6ZWQoKSYmbi5hdXRob3JpemVkKCkudG9KUygpLGRlZmluaXRpb25zOnIuc2VjdXJpdHlEZWZpbml0aW9ucygpJiZyLnNlY3VyaXR5RGVmaW5pdGlvbnMoKS50b0pTKCksc3BlY1NlY3VyaXR5OnIuc2VjdXJpdHkoKSYmci5zZWN1cml0eSgpLnRvSlMoKX07cmV0dXJuIGUobygpKHtwYXRoOmEsbWV0aG9kOmksb3BlcmF0aW9uOnMsc2VjdXJpdGllczpjfSx1KSl9fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtuLnIodCk7dmFyIHI9big1KTt0LmRlZmF1bHQ9ZnVuY3Rpb24oKXtyZXR1cm57Zm46e3NoYWxsb3dFcXVhbEtleXM6ci5HfX19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KSxuLmQodCwiZGVmYXVsdCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHZ9KSk7dmFyIHI9bigyMCksbz1uLm4ociksYT1uKDkzKSxpPW4ubihhKSxzPW4oMiksdT1uLm4ocyksYz1uKDE3KSxsPW4ubihjKSxwPW4oMzIpLGY9bi5uKHApLGg9bigxNiksZD1uKDEpLG09bigyNik7ZnVuY3Rpb24gdihlKXt2YXIgdD1lLmZuO3JldHVybntzdGF0ZVBsdWdpbnM6e3NwZWM6e2FjdGlvbnM6e2Rvd25sb2FkOmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgcj1uLmVyckFjdGlvbnMsYT1uLnNwZWNTZWxlY3RvcnMscz1uLnNwZWNBY3Rpb25zLGM9bi5nZXRDb25maWdzLGw9dC5mZXRjaCxwPWMoKTtmdW5jdGlvbiBmKHQpe2lmKHQgaW5zdGFuY2VvZiBFcnJvcnx8dC5zdGF0dXM+PTQwMClyZXR1cm4gcy51cGRhdGVMb2FkaW5nU3RhdHVzKCJmYWlsZWQiKSxyLm5ld1Rocm93bkVycihvKCkobmV3IEVycm9yKCh0Lm1lc3NhZ2V8fHQuc3RhdHVzVGV4dCkrIiAiK2UpLHtzb3VyY2U6ImZldGNoIn0pKSx2b2lkKCF0LnN0YXR1cyYmdCBpbnN0YW5jZW9mIEVycm9yJiZmdW5jdGlvbigpe3RyeXt2YXIgdDtpZigiVVJMImluIG0uYT90PW5ldyBpLmEoZSk6KHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpKS5ocmVmPWUsImh0dHBzOiIhPT10LnByb3RvY29sJiYiaHR0cHM6Ij09PW0uYS5sb2NhdGlvbi5wcm90b2NvbCl7dmFyIG49bygpKG5ldyBFcnJvcigiUG9zc2libGUgbWl4ZWQtY29udGVudCBpc3N1ZT8gVGhlIHBhZ2Ugd2FzIGxvYWRlZCBvdmVyIGh0dHBzOi8vIGJ1dCBhICIuY29uY2F0KHQucHJvdG9jb2wsIi8vIFVSTCB3YXMgc3BlY2lmaWVkLiBDaGVjayB0aGF0IHlvdSBhcmUgbm90IGF0dGVtcHRpbmcgdG8gbG9hZCBtaXhlZCBjb250ZW50LiIpKSx7c291cmNlOiJmZXRjaCJ9KTtyZXR1cm4gdm9pZCByLm5ld1Rocm93bkVycihuKX1pZih0Lm9yaWdpbiE9PW0uYS5sb2NhdGlvbi5vcmlnaW4pe3ZhciBhLHM9bygpKG5ldyBFcnJvcih1KCkoYT0iUG9zc2libGUgY3Jvc3Mtb3JpZ2luIChDT1JTKSBpc3N1ZT8gVGhlIFVSTCBvcmlnaW4gKCIuY29uY2F0KHQub3JpZ2luLCIpIGRvZXMgbm90IG1hdGNoIHRoZSBwYWdlICgiKSkuY2FsbChhLG0uYS5sb2NhdGlvbi5vcmlnaW4sIikuIENoZWNrIHRoZSBzZXJ2ZXIgcmV0dXJucyB0aGUgY29ycmVjdCAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctKicgaGVhZGVycy4iKSkse3NvdXJjZToiZmV0Y2gifSk7ci5uZXdUaHJvd25FcnIocyl9fWNhdGNoKGUpe3JldHVybn19KCkpO3MudXBkYXRlTG9hZGluZ1N0YXR1cygic3VjY2VzcyIpLHMudXBkYXRlU3BlYyh0LnRleHQpLGEudXJsKCkhPT1lJiZzLnVwZGF0ZVVybChlKX1lPWV8fGEudXJsKCkscy51cGRhdGVMb2FkaW5nU3RhdHVzKCJsb2FkaW5nIiksci5jbGVhcih7c291cmNlOiJmZXRjaCJ9KSxsKHt1cmw6ZSxsb2FkU3BlYzohMCxyZXF1ZXN0SW50ZXJjZXB0b3I6cC5yZXF1ZXN0SW50ZXJjZXB0b3J8fGZ1bmN0aW9uKGUpe3JldHVybiBlfSxyZXNwb25zZUludGVyY2VwdG9yOnAucmVzcG9uc2VJbnRlcmNlcHRvcnx8ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LGNyZWRlbnRpYWxzOiJzYW1lLW9yaWdpbiIsaGVhZGVyczp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uLCovKiJ9fSkudGhlbihmLGYpfX0sdXBkYXRlTG9hZGluZ1N0YXR1czpmdW5jdGlvbihlKXt2YXIgdCxuPVtudWxsLCJsb2FkaW5nIiwiZmFpbGVkIiwic3VjY2VzcyIsImZhaWxlZENvbmZpZyJdOy0xPT09bCgpKG4pLmNhbGwobixlKSYmY29uc29sZS5lcnJvcih1KCkodD0iRXJyb3I6ICIuY29uY2F0KGUsIiBpcyBub3Qgb25lIG9mICIpKS5jYWxsKHQsZigpKG4pKSk7cmV0dXJue3R5cGU6InNwZWNfdXBkYXRlX2xvYWRpbmdfc3RhdHVzIixwYXlsb2FkOmV9fX0scmVkdWNlcnM6e3NwZWNfdXBkYXRlX2xvYWRpbmdfc3RhdHVzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0LnBheWxvYWQ/ZS5zZXQoImxvYWRpbmdTdGF0dXMiLHQucGF5bG9hZCk6ZX19LHNlbGVjdG9yczp7bG9hZGluZ1N0YXR1czpPYmplY3QoaC5hKSgoZnVuY3Rpb24oZSl7cmV0dXJuIGV8fE9iamVjdChkLk1hcCkoKX0pLChmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXQoImxvYWRpbmdTdGF0dXMiKXx8bnVsbH0pKX19fX19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KSxuLmQodCwiZG93bmxvYWRDb25maWciLChmdW5jdGlvbigpe3JldHVybiBvfSkpLG4uZCh0LCJnZXRDb25maWdCeVVybCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGF9KSk7dmFyIHI9bigxNzMpLG89ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybigwLHQuZm4uZmV0Y2gpKGUpfX0sYT1mdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgbz1uLnNwZWNBY3Rpb25zO2lmKGUpcmV0dXJuIG8uZG93bmxvYWRDb25maWcoZSkudGhlbihhLGEpO2Z1bmN0aW9uIGEobil7biBpbnN0YW5jZW9mIEVycm9yfHxuLnN0YXR1cz49NDAwPyhvLnVwZGF0ZUxvYWRpbmdTdGF0dXMoImZhaWxlZENvbmZpZyIpLG8udXBkYXRlTG9hZGluZ1N0YXR1cygiZmFpbGVkQ29uZmlnIiksby51cGRhdGVVcmwoIiIpLGNvbnNvbGUuZXJyb3Iobi5zdGF0dXNUZXh0KyIgIitlLnVybCksdChudWxsKSk6dChPYmplY3Qoci5wYXJzZVlhbWxDb25maWcpKG4udGV4dCkpfX19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KSxuLmQodCwiZ2V0IiwoZnVuY3Rpb24oKXtyZXR1cm4gYX0pKTt2YXIgcj1uKDIzKSxvPW4ubihyKSxhPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuZ2V0SW4obygpKHQpP3Q6W3RdKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpO3ZhciByLG89bigzKSxhPW4ubihvKSxpPW4oMSkscz1uKDE0OSk7dC5kZWZhdWx0PShyPXt9LGEoKShyLHMuVVBEQVRFX0NPTkZJR1MsKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUubWVyZ2UoT2JqZWN0KGkuZnJvbUpTKSh0LnBheWxvYWQpKX0pKSxhKCkocixzLlRPR0dMRV9DT05GSUdTLChmdW5jdGlvbihlLHQpe3ZhciBuPXQucGF5bG9hZCxyPWUuZ2V0KG4pO3JldHVybiBlLnNldChuLCFyKX0pKSxyKX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtuLnIodCk7dmFyIHI9bigzMTUpLG89bigzMTYpLGE9bigzMTcpO3QuZGVmYXVsdD1mdW5jdGlvbigpe3JldHVybltyLmRlZmF1bHQse3N0YXRlUGx1Z2luczp7Y29uZmlnczp7d3JhcEFjdGlvbnM6e2xvYWRlZDpmdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbigpe2UuYXBwbHkodm9pZCAwLGFyZ3VtZW50cyk7dmFyIG49ZGVjb2RlVVJJQ29tcG9uZW50KHdpbmRvdy5sb2NhdGlvbi5oYXNoKTt0LmxheW91dEFjdGlvbnMucGFyc2VEZWVwTGlua0hhc2gobil9fX19fSx3cmFwQ29tcG9uZW50czp7b3BlcmF0aW9uOm8uZGVmYXVsdCxPcGVyYXRpb25UYWc6YS5kZWZhdWx0fX1dfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtuLnIodCksbi5kKHQsInNob3ciLChmdW5jdGlvbigpe3JldHVybiBBfSkpLG4uZCh0LCJzY3JvbGxUbyIsKGZ1bmN0aW9uKCl7cmV0dXJuIE99KSksbi5kKHQsInBhcnNlRGVlcExpbmtIYXNoIiwoZnVuY3Rpb24oKXtyZXR1cm4ga30pKSxuLmQodCwicmVhZHlUb1Njcm9sbCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGp9KSksbi5kKHQsInNjcm9sbFRvRWxlbWVudCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFR9KSksbi5kKHQsImNsZWFyU2Nyb2xsVG8iLChmdW5jdGlvbigpe3JldHVybiBJfSkpO3ZhciByLG89bigzKSxhPW4ubihvKSxpPW4oMTMpLHM9bi5uKGkpLHU9bigyMyksYz1uLm4odSksbD1uKDIpLHA9bi5uKGwpLGY9bigxOSksaD1uLm4oZiksZD1uKDQpLG09bi5uKGQpLHY9bigxNyksZz1uLm4odikseT1uKDE3NiksYj1uKDUyOCksXz1uLm4oYiksdz1uKDUpLHg9bigxKSxFPW4ubih4KSxTPSJsYXlvdXRfc2Nyb2xsX3RvIixDPSJsYXlvdXRfY2xlYXJfc2Nyb2xsIixBPWZ1bmN0aW9uKGUsdCl7dmFyIG49dC5nZXRDb25maWdzLHI9dC5sYXlvdXRTZWxlY3RvcnM7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsbz1uZXcgQXJyYXkodCksYT0wO2E8dDthKyspb1thXT1hcmd1bWVudHNbYV07aWYoZS5hcHBseSh2b2lkIDAsbyksbigpLmRlZXBMaW5raW5nKXRyeXt2YXIgaT1vWzBdLHU9b1sxXTtpPWMoKShpKT9pOltpXTt2YXIgbD1yLnVybEhhc2hBcnJheUZyb21Jc1Nob3duS2V5KGkpO2lmKCFsLmxlbmd0aClyZXR1cm47dmFyIGYsaD1zKCkobCwyKSxkPWhbMF0sbT1oWzFdO2lmKCF1KXJldHVybiBPYmplY3QoeS5zZXRIYXNoKSgiLyIpO2lmKDI9PT1sLmxlbmd0aClPYmplY3QoeS5zZXRIYXNoKShPYmplY3Qody5kKShwKCkoZj0iLyIuY29uY2F0KGVuY29kZVVSSUNvbXBvbmVudChkKSwiLyIpKS5jYWxsKGYsZW5jb2RlVVJJQ29tcG9uZW50KG0pKSkpO2Vsc2UgMT09PWwubGVuZ3RoJiZPYmplY3QoeS5zZXRIYXNoKShPYmplY3Qody5kKSgiLyIuY29uY2F0KGVuY29kZVVSSUNvbXBvbmVudChkKSkpKX1jYXRjaChlKXtjb25zb2xlLmVycm9yKGUpfX19LE89ZnVuY3Rpb24oZSl7cmV0dXJue3R5cGU6UyxwYXlsb2FkOmMoKShlKT9lOltlXX19LGs9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBuPXQubGF5b3V0QWN0aW9ucyxyPXQubGF5b3V0U2VsZWN0b3JzO2lmKCgwLHQuZ2V0Q29uZmlncykoKS5kZWVwTGlua2luZyYmZSl7dmFyIG8sYT1oKCkoZSkuY2FsbChlLDEpOyIhIj09PWFbMF0mJihhPWgoKShhKS5jYWxsKGEsMSkpLCIvIj09PWFbMF0mJihhPWgoKShhKS5jYWxsKGEsMSkpO3ZhciBpPW0oKShvPWEuc3BsaXQoIi8iKSkuY2FsbChvLChmdW5jdGlvbihlKXtyZXR1cm4gZXx8IiJ9KSksdT1yLmlzU2hvd25LZXlGcm9tVXJsSGFzaEFycmF5KGkpLGM9cygpKHUsMyksbD1jWzBdLHA9Y1sxXSxmPXZvaWQgMD09PXA/IiI6cCxkPWNbMl0sdj12b2lkIDA9PT1kPyIiOmQ7aWYoIm9wZXJhdGlvbnMiPT09bCl7dmFyIHk9ci5pc1Nob3duS2V5RnJvbVVybEhhc2hBcnJheShbZl0pO2coKShmKS5jYWxsKGYsIl8iKT4tMSYmKGNvbnNvbGUud2FybigiV2FybmluZzogZXNjYXBpbmcgZGVlcCBsaW5rIHdoaXRlc3BhY2Ugd2l0aCBgX2Agd2lsbCBiZSB1bnN1cHBvcnRlZCBpbiB2NC4wLCB1c2UgYCUyMGAgaW5zdGVhZC4iKSxuLnNob3cobSgpKHkpLmNhbGwoeSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvXy9nLCIgIil9KSksITApKSxuLnNob3coeSwhMCl9KGcoKShmKS5jYWxsKGYsIl8iKT4tMXx8ZygpKHYpLmNhbGwodiwiXyIpPi0xKSYmKGNvbnNvbGUud2FybigiV2FybmluZzogZXNjYXBpbmcgZGVlcCBsaW5rIHdoaXRlc3BhY2Ugd2l0aCBgX2Agd2lsbCBiZSB1bnN1cHBvcnRlZCBpbiB2NC4wLCB1c2UgYCUyMGAgaW5zdGVhZC4iKSxuLnNob3cobSgpKHUpLmNhbGwodSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvXy9nLCIgIil9KSksITApKSxuLnNob3codSwhMCksbi5zY3JvbGxUbyh1KX19fSxqPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciByPW4ubGF5b3V0U2VsZWN0b3JzLmdldFNjcm9sbFRvS2V5KCk7RS5hLmlzKHIsT2JqZWN0KHguZnJvbUpTKShlKSkmJihuLmxheW91dEFjdGlvbnMuc2Nyb2xsVG9FbGVtZW50KHQpLG4ubGF5b3V0QWN0aW9ucy5jbGVhclNjcm9sbFRvKCkpfX0sVD1mdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbihuKXt0cnl7dD10fHxuLmZuLmdldFNjcm9sbFBhcmVudChlKSxfLmEuY3JlYXRlU2Nyb2xsZXIodCkudG8oZSl9Y2F0Y2goZSl7Y29uc29sZS5lcnJvcihlKX19fSxJPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6Q319O3QuZGVmYXVsdD17Zm46e2dldFNjcm9sbFBhcmVudDpmdW5jdGlvbihlLHQpe3ZhciBuPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxyPWdldENvbXB1dGVkU3R5bGUoZSksbz0iYWJzb2x1dGUiPT09ci5wb3NpdGlvbixhPXQ/LyhhdXRvfHNjcm9sbHxoaWRkZW4pLzovKGF1dG98c2Nyb2xsKS87aWYoImZpeGVkIj09PXIucG9zaXRpb24pcmV0dXJuIG47Zm9yKHZhciBpPWU7aT1pLnBhcmVudEVsZW1lbnQ7KWlmKHI9Z2V0Q29tcHV0ZWRTdHlsZShpKSwoIW98fCJzdGF0aWMiIT09ci5wb3NpdGlvbikmJmEudGVzdChyLm92ZXJmbG93K3Iub3ZlcmZsb3dZK3Iub3ZlcmZsb3dYKSlyZXR1cm4gaTtyZXR1cm4gbn19LHN0YXRlUGx1Z2luczp7bGF5b3V0OnthY3Rpb25zOntzY3JvbGxUb0VsZW1lbnQ6VCxzY3JvbGxUbzpPLGNsZWFyU2Nyb2xsVG86SSxyZWFkeVRvU2Nyb2xsOmoscGFyc2VEZWVwTGlua0hhc2g6a30sc2VsZWN0b3JzOntnZXRTY3JvbGxUb0tleTpmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXQoInNjcm9sbFRvS2V5Iil9LGlzU2hvd25LZXlGcm9tVXJsSGFzaEFycmF5OmZ1bmN0aW9uKGUsdCl7dmFyIG49cygpKHQsMikscj1uWzBdLG89blsxXTtyZXR1cm4gbz9bIm9wZXJhdGlvbnMiLHIsb106cj9bIm9wZXJhdGlvbnMtdGFnIixyXTpbXX0sdXJsSGFzaEFycmF5RnJvbUlzU2hvd25LZXk6ZnVuY3Rpb24oZSx0KXt2YXIgbj1zKCkodCwzKSxyPW5bMF0sbz1uWzFdLGE9blsyXTtyZXR1cm4ib3BlcmF0aW9ucyI9PXI/W28sYV06Im9wZXJhdGlvbnMtdGFnIj09cj9bb106W119fSxyZWR1Y2Vyczoocj17fSxhKCkocixTLChmdW5jdGlvbihlLHQpe3JldHVybiBlLnNldCgic2Nyb2xsVG9LZXkiLEUuYS5mcm9tSlModC5wYXlsb2FkKSl9KSksYSgpKHIsQywoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZGVsZXRlKCJzY3JvbGxUb0tleSIpfSkpLHIpLHdyYXBBY3Rpb25zOntzaG93OkF9fX19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KTt2YXIgcj1uKDYpLG89bi5uKHIpLGE9big3KSxpPW4ubihhKSxzPW4oMTApLHU9bi5uKHMpLGM9big4KSxsPW4ubihjKSxwPW4oOSksZj1uLm4ocCksaD1uKDMpLGQ9bi5uKGgpLG09bigyKSx2PW4ubihtKSxnPW4oMCkseT1uLm4oZyk7bigyNyk7dC5kZWZhdWx0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKG4pe2woKShhLG4pO3ZhciByPWYoKShhKTtmdW5jdGlvbiBhKCl7dmFyIGUsbjtvKCkodGhpcyxhKTtmb3IodmFyIGk9YXJndW1lbnRzLmxlbmd0aCxzPW5ldyBBcnJheShpKSxjPTA7YzxpO2MrKylzW2NdPWFyZ3VtZW50c1tjXTtyZXR1cm4gbj1yLmNhbGwuYXBwbHkocix2KCkoZT1bdGhpc10pLmNhbGwoZSxzKSksZCgpKHUoKShuKSwib25Mb2FkIiwoZnVuY3Rpb24oZSl7dmFyIHI9bi5wcm9wcy5vcGVyYXRpb24sbz1yLnRvT2JqZWN0KCksYT1vLnRhZyxpPW8ub3BlcmF0aW9uSWQscz1yLnRvT2JqZWN0KCkuaXNTaG93bktleTtzPXN8fFsib3BlcmF0aW9ucyIsYSxpXSx0LmxheW91dEFjdGlvbnMucmVhZHlUb1Njcm9sbChzLGUpfSkpLG59cmV0dXJuIGkoKShhLFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHkuYS5jcmVhdGVFbGVtZW50KCJzcGFuIix7cmVmOnRoaXMub25Mb2FkfSx5LmEuY3JlYXRlRWxlbWVudChlLHRoaXMucHJvcHMpKX19XSksYX0oeS5hLkNvbXBvbmVudCl9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KTt2YXIgcj1uKDYpLG89bi5uKHIpLGE9big3KSxpPW4ubihhKSxzPW4oMTApLHU9bi5uKHMpLGM9big4KSxsPW4ubihjKSxwPW4oOSksZj1uLm4ocCksaD1uKDMpLGQ9bi5uKGgpLG09bigyKSx2PW4ubihtKSxnPW4oMCkseT1uLm4oZyk7bigxMSk7dC5kZWZhdWx0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKG4pe2woKShhLG4pO3ZhciByPWYoKShhKTtmdW5jdGlvbiBhKCl7dmFyIGUsbjtvKCkodGhpcyxhKTtmb3IodmFyIGk9YXJndW1lbnRzLmxlbmd0aCxzPW5ldyBBcnJheShpKSxjPTA7YzxpO2MrKylzW2NdPWFyZ3VtZW50c1tjXTtyZXR1cm4gbj1yLmNhbGwuYXBwbHkocix2KCkoZT1bdGhpc10pLmNhbGwoZSxzKSksZCgpKHUoKShuKSwib25Mb2FkIiwoZnVuY3Rpb24oZSl7dmFyIHI9WyJvcGVyYXRpb25zLXRhZyIsbi5wcm9wcy50YWddO3QubGF5b3V0QWN0aW9ucy5yZWFkeVRvU2Nyb2xsKHIsZSl9KSksbn1yZXR1cm4gaSgpKGEsW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4geS5hLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtyZWY6dGhpcy5vbkxvYWR9LHkuYS5jcmVhdGVFbGVtZW50KGUsdGhpcy5wcm9wcykpfX1dKSxhfSh5LmEuQ29tcG9uZW50KX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpO3ZhciByPW4oMzE5KTt0LmRlZmF1bHQ9ZnVuY3Rpb24oKXtyZXR1cm57Zm46e29wc0ZpbHRlcjpyLmRlZmF1bHR9fX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpO3ZhciByPW4oMTIpLG89bi5uKHIpLGE9bigxNyksaT1uLm4oYSk7dC5kZWZhdWx0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG8oKShlKS5jYWxsKGUsKGZ1bmN0aW9uKGUsbil7cmV0dXJuLTEhPT1pKCkobikuY2FsbChuLHQpfSkpfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtuLnIodCk7dmFyIHI9bigyMTYpLG89bi5uKHIpLGE9ITE7dC5kZWZhdWx0PWZ1bmN0aW9uKCl7cmV0dXJue3N0YXRlUGx1Z2luczp7c3BlYzp7d3JhcEFjdGlvbnM6e3VwZGF0ZVNwZWM6ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGE9ITAsZS5hcHBseSh2b2lkIDAsYXJndW1lbnRzKX19LHVwZGF0ZUpzb25TcGVjOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dC5nZXRDb25maWdzKCkub25Db21wbGV0ZTtyZXR1cm4gYSYmImZ1bmN0aW9uIj09dHlwZW9mIG4mJihvKCkobiwwKSxhPSExKSxlLmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpfX19fX19fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtuLnIodCk7dmFyIHI9bigzMjIpLG89bigzMjMpLGE9bigzMjQpLGk9bigzMjUpLHM9bigzMzMpLHU9big1NCksYz1uKDM0MCksbD1uKDM0MSk7dC5kZWZhdWx0PWZ1bmN0aW9uKCl7cmV0dXJue2NvbXBvbmVudHM6aS5kZWZhdWx0LHdyYXBDb21wb25lbnRzOnMuZGVmYXVsdCxzdGF0ZVBsdWdpbnM6e3NwZWM6e3dyYXBTZWxlY3RvcnM6cixzZWxlY3RvcnM6YX0sYXV0aDp7d3JhcFNlbGVjdG9yczpvfSxvYXMzOnthY3Rpb25zOnUscmVkdWNlcnM6bC5kZWZhdWx0LHNlbGVjdG9yczpjfX19fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtuLnIodCksbi5kKHQsImRlZmluaXRpb25zIiwoZnVuY3Rpb24oKXtyZXR1cm4gaH0pKSxuLmQodCwiaGFzSG9zdCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGR9KSksbi5kKHQsInNlY3VyaXR5RGVmaW5pdGlvbnMiLChmdW5jdGlvbigpe3JldHVybiBtfSkpLG4uZCh0LCJob3N0IiwoZnVuY3Rpb24oKXtyZXR1cm4gdn0pKSxuLmQodCwiYmFzZVBhdGgiLChmdW5jdGlvbigpe3JldHVybiBnfSkpLG4uZCh0LCJjb25zdW1lcyIsKGZ1bmN0aW9uKCl7cmV0dXJuIHl9KSksbi5kKHQsInByb2R1Y2VzIiwoZnVuY3Rpb24oKXtyZXR1cm4gYn0pKSxuLmQodCwic2NoZW1lcyIsKGZ1bmN0aW9uKCl7cmV0dXJuIF99KSksbi5kKHQsInNlcnZlcnMiLChmdW5jdGlvbigpe3JldHVybiB3fSkpLG4uZCh0LCJpc09BUzMiLChmdW5jdGlvbigpe3JldHVybiB4fSkpLG4uZCh0LCJpc1N3YWdnZXIyIiwoZnVuY3Rpb24oKXtyZXR1cm4gRX0pKTt2YXIgcj1uKDE2KSxvPW4oOTEpLGE9bigxKSxpPW4oMzUpO2Z1bmN0aW9uIHMoZSl7cmV0dXJuIGZ1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9bi5nZXRTeXN0ZW0oKS5zcGVjU2VsZWN0b3JzLnNwZWNKc29uKCk7cmV0dXJuIE9iamVjdChpLmlzT0FTMykocik/ZS5hcHBseSh2b2lkIDAsYXJndW1lbnRzKTp0LmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpfX19dmFyIHU9ZnVuY3Rpb24oZSl7cmV0dXJuIGV8fE9iamVjdChhLk1hcCkoKX0sYz1zKE9iamVjdChyLmEpKChmdW5jdGlvbigpe3JldHVybiBudWxsfSkpKSxsPU9iamVjdChyLmEpKHUsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldCgianNvbiIsT2JqZWN0KGEuTWFwKSgpKX0pKSxwPU9iamVjdChyLmEpKHUsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldCgicmVzb2x2ZWQiLE9iamVjdChhLk1hcCkoKSl9KSksZj1mdW5jdGlvbihlKXt2YXIgdD1wKGUpO3JldHVybiB0LmNvdW50KCk8MSYmKHQ9bChlKSksdH0saD1zKE9iamVjdChyLmEpKGYsKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0SW4oWyJjb21wb25lbnRzIiwic2NoZW1hcyJdKTtyZXR1cm4gYS5NYXAuaXNNYXAodCk/dDpPYmplY3QoYS5NYXApKCl9KSkpLGQ9cygoZnVuY3Rpb24oZSl7cmV0dXJuIGYoZSkuaGFzSW4oWyJzZXJ2ZXJzIiwwXSl9KSksbT1zKE9iamVjdChyLmEpKG8uc3BlY0pzb25XaXRoUmVzb2x2ZWRTdWJ0cmVlcywoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0SW4oWyJjb21wb25lbnRzIiwic2VjdXJpdHlTY2hlbWVzIl0pfHxudWxsfSkpKSx2PWMsZz1jLHk9YyxiPWMsXz1jLHc9cyhPYmplY3Qoci5hKShmLChmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRJbihbInNlcnZlcnMiXSl8fE9iamVjdChhLk1hcCkoKX0pKSkseD1mdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQuZ2V0U3lzdGVtKCkuc3BlY1NlbGVjdG9ycy5zcGVjSnNvbigpO3JldHVybiBPYmplY3QoaS5pc09BUzMpKGEuTWFwLmlzTWFwKGUpP2U6T2JqZWN0KGEuTWFwKSgpKX19LEU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10LmdldFN5c3RlbSgpLnNwZWNTZWxlY3RvcnMuc3BlY0pzb24oKTtyZXR1cm4gT2JqZWN0KGkuaXNTd2FnZ2VyMikoYS5NYXAuaXNNYXAoZSk/ZTpPYmplY3QoYS5NYXApKCkpfX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpLG4uZCh0LCJkZWZpbml0aW9uc1RvQXV0aG9yaXplIiwoZnVuY3Rpb24oKXtyZXR1cm4gYn0pKTt2YXIgcj1uKDMpLG89bi5uKHIpLGE9bigxMyksaT1uLm4oYSkscz1uKDIpLHU9bi5uKHMpLGM9bigyMSksbD1uLm4oYykscD1uKDEyKSxmPW4ubihwKSxoPW4oMjkpLGQ9bi5uKGgpLG09bigxNiksdj1uKDEpLGc9bigzNSk7dmFyIHksYj0oeT1PYmplY3QobS5hKSgoZnVuY3Rpb24oZSl7cmV0dXJuIGV9KSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc3BlY1NlbGVjdG9ycy5zZWN1cml0eURlZmluaXRpb25zKCl9KSwoZnVuY3Rpb24oZSx0KXt2YXIgbixyPU9iamVjdCh2Lkxpc3QpKCk7cmV0dXJuIHQ/KGwoKShuPXQuZW50cnlTZXEoKSkuY2FsbChuLChmdW5jdGlvbihlKXt2YXIgdCxuPWkoKShlLDIpLGE9blswXSxzPW5bMV0sdT1zLmdldCgidHlwZSIpO2lmKCJvYXV0aDIiPT09dSYmbCgpKHQ9cy5nZXQoImZsb3dzIikuZW50cnlTZXEoKSkuY2FsbCh0LChmdW5jdGlvbihlKXt2YXIgdD1pKCkoZSwyKSxuPXRbMF0sdT10WzFdLGM9T2JqZWN0KHYuZnJvbUpTKSh7ZmxvdzpuLGF1dGhvcml6YXRpb25Vcmw6dS5nZXQoImF1dGhvcml6YXRpb25VcmwiKSx0b2tlblVybDp1LmdldCgidG9rZW5VcmwiKSxzY29wZXM6dS5nZXQoInNjb3BlcyIpLHR5cGU6cy5nZXQoInR5cGUiKSxkZXNjcmlwdGlvbjpzLmdldCgiZGVzY3JpcHRpb24iKX0pO3I9ci5wdXNoKG5ldyB2Lk1hcChvKCkoe30sYSxmKCkoYykuY2FsbChjLChmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwIT09ZX0pKSkpKX0pKSwiaHR0cCIhPT11JiYiYXBpS2V5IiE9PXV8fChyPXIucHVzaChuZXcgdi5NYXAobygpKHt9LGEscykpKSksIm9wZW5JZENvbm5lY3QiPT09dSYmcy5nZXQoIm9wZW5JZENvbm5lY3REYXRhIikpe3ZhciBjPXMuZ2V0KCJvcGVuSWRDb25uZWN0RGF0YSIpLHA9Yy5nZXQoImdyYW50X3R5cGVzX3N1cHBvcnRlZCIpfHxbImF1dGhvcml6YXRpb25fY29kZSIsImltcGxpY2l0Il07bCgpKHApLmNhbGwocCwoZnVuY3Rpb24oZSl7dmFyIHQsbj1jLmdldCgic2NvcGVzX3N1cHBvcnRlZCIpJiZkKCkodD1jLmdldCgic2NvcGVzX3N1cHBvcnRlZCIpKS5jYWxsKHQsKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuc2V0KHQsIiIpfSksbmV3IHYuTWFwKSxpPU9iamVjdCh2LmZyb21KUykoe2Zsb3c6ZSxhdXRob3JpemF0aW9uVXJsOmMuZ2V0KCJhdXRob3JpemF0aW9uX2VuZHBvaW50IiksdG9rZW5Vcmw6Yy5nZXQoInRva2VuX2VuZHBvaW50Iiksc2NvcGVzOm4sdHlwZToib2F1dGgyIixvcGVuSWRDb25uZWN0VXJsOnMuZ2V0KCJvcGVuSWRDb25uZWN0VXJsIil9KTtyPXIucHVzaChuZXcgdi5NYXAobygpKHt9LGEsZigpKGkpLmNhbGwoaSwoZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMCE9PWV9KSkpKSl9KSl9fSkpLHIpOnJ9KSksZnVuY3Rpb24oZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIG49dC5nZXRTeXN0ZW0oKS5zcGVjU2VsZWN0b3JzLnNwZWNKc29uKCkscj1hcmd1bWVudHMubGVuZ3RoLG89bmV3IEFycmF5KHIpLGE9MDthPHI7YSsrKW9bYV09YXJndW1lbnRzW2FdO2lmKE9iamVjdChnLmlzT0FTMykobikpe3ZhciBpLHM9dC5nZXRTdGF0ZSgpLmdldEluKFsic3BlYyIsInJlc29sdmVkU3VidHJlZXMiLCJjb21wb25lbnRzIiwic2VjdXJpdHlTY2hlbWVzIl0pO3JldHVybiB5LmFwcGx5KHZvaWQgMCx1KCkoaT1bdCxzXSkuY2FsbChpLG8pKX1yZXR1cm4gZS5hcHBseSh2b2lkIDAsbyl9fSl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpLG4uZCh0LCJzZXJ2ZXJzIiwoZnVuY3Rpb24oKXtyZXR1cm4gbH0pKSxuLmQodCwiaXNTd2FnZ2VyMiIsKGZ1bmN0aW9uKCl7cmV0dXJuIHB9KSk7dmFyIHI9bigxNiksbz1uKDEpLGE9bigzNSk7dmFyIGkscz1mdW5jdGlvbihlKXtyZXR1cm4gZXx8T2JqZWN0KG8uTWFwKSgpfSx1PU9iamVjdChyLmEpKHMsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldCgianNvbiIsT2JqZWN0KG8uTWFwKSgpKX0pKSxjPU9iamVjdChyLmEpKHMsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldCgicmVzb2x2ZWQiLE9iamVjdChvLk1hcCkoKSl9KSksbD0oaT1PYmplY3Qoci5hKSgoZnVuY3Rpb24oZSl7dmFyIHQ9YyhlKTtyZXR1cm4gdC5jb3VudCgpPDEmJih0PXUoZSkpLHR9KSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0SW4oWyJzZXJ2ZXJzIl0pfHxPYmplY3Qoby5NYXApKCl9KSksZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRTeXN0ZW0oKS5zcGVjU2VsZWN0b3JzLnNwZWNKc29uKCk7aWYoT2JqZWN0KGEuaXNPQVMzKSh0KSl7Zm9yKHZhciBuPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkobj4xP24tMTowKSxvPTE7bzxuO28rKylyW28tMV09YXJndW1lbnRzW29dO3JldHVybiBpLmFwcGx5KHZvaWQgMCxyKX1yZXR1cm4gbnVsbH19KSxwPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dC5nZXRTeXN0ZW0oKS5zcGVjU2VsZWN0b3JzLnNwZWNKc29uKCk7cmV0dXJuIE9iamVjdChhLmlzU3dhZ2dlcjIpKGUpfX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpO3ZhciByPW4oMzI2KSxvPW4oMTc0KSxhPW4oMzI3KSxpPW4oMzI4KSxzPW4oMzI5KSx1PW4oMzMwKSxjPW4oMzMxKSxsPW4oMzMyKTt0LmRlZmF1bHQ9e0NhbGxiYWNrczpyLmRlZmF1bHQsSHR0cEF1dGg6Yy5kZWZhdWx0LFJlcXVlc3RCb2R5Om8uZGVmYXVsdCxTZXJ2ZXJzOmkuZGVmYXVsdCxTZXJ2ZXJzQ29udGFpbmVyOnMuZGVmYXVsdCxSZXF1ZXN0Qm9keUVkaXRvcjp1LmRlZmF1bHQsT3BlcmF0aW9uU2VydmVyczpsLmRlZmF1bHQsb3BlcmF0aW9uTGluazphLmRlZmF1bHR9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KTt2YXIgcj1uKDI4KSxvPW4ubihyKSxhPW4oMTMpLGk9bi5uKGEpLHM9big0KSx1PW4ubihzKSxjPW4oMCksbD1uLm4oYykscD0obigxMSksbigyNyksbigxKSk7dC5kZWZhdWx0PWZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5jYWxsYmFja3Mscj1lLmdldENvbXBvbmVudCxhPWUuc3BlY1BhdGgscz1yKCJPcGVyYXRpb25Db250YWluZXIiLCEwKTtpZighbilyZXR1cm4gbC5hLmNyZWF0ZUVsZW1lbnQoInNwYW4iLG51bGwsIk5vIGNhbGxiYWNrcyIpO3ZhciBjPXUoKSh0PW4uZW50cnlTZXEoKSkuY2FsbCh0LChmdW5jdGlvbih0KXt2YXIgbixyPWkoKSh0LDIpLGM9clswXSxmPXJbMV07cmV0dXJuIGwuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtrZXk6Y30sbC5hLmNyZWF0ZUVsZW1lbnQoImgyIixudWxsLGMpLHUoKShuPWYuZW50cnlTZXEoKSkuY2FsbChuLChmdW5jdGlvbih0KXt2YXIgbixyPWkoKSh0LDIpLGY9clswXSxoPXJbMV07cmV0dXJuIiQkcmVmIj09PWY/bnVsbDpsLmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7a2V5OmZ9LHUoKShuPWguZW50cnlTZXEoKSkuY2FsbChuLChmdW5jdGlvbih0KXt2YXIgbj1pKCkodCwyKSxyPW5bMF0sdT1uWzFdO2lmKCIkJHJlZiI9PT1yKXJldHVybiBudWxsO3ZhciBoPU9iamVjdChwLmZyb21KUykoe29wZXJhdGlvbjp1fSk7cmV0dXJuIGwuYS5jcmVhdGVFbGVtZW50KHMsbygpKHt9LGUse29wOmgsa2V5OnIsdGFnOiIiLG1ldGhvZDpyLHBhdGg6ZixzcGVjUGF0aDphLnB1c2goYyxmLHIpLGFsbG93VHJ5SXRPdXQ6ITF9KSl9KSkpfSkpKX0pKTtyZXR1cm4gbC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxjKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpO3ZhciByPW4oNiksbz1uLm4ociksYT1uKDcpLGk9bi5uKGEpLHM9big4KSx1PW4ubihzKSxjPW4oOSksbD1uLm4oYykscD1uKDMyKSxmPW4ubihwKSxoPW4oNCksZD1uLm4oaCksbT1uKDApLHY9bi5uKG0pLGc9KG4oMTEpLG4oMjcpLGZ1bmN0aW9uKGUpe3UoKShuLGUpO3ZhciB0PWwoKShuKTtmdW5jdGlvbiBuKCl7cmV0dXJuIG8oKSh0aGlzLG4pLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiBpKCkobixbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsdD1lLmxpbmssbj1lLm5hbWUscj0oMCxlLmdldENvbXBvbmVudCkoIk1hcmtkb3duIiwhMCksbz10LmdldCgib3BlcmF0aW9uSWQiKXx8dC5nZXQoIm9wZXJhdGlvblJlZiIpLGE9dC5nZXQoInBhcmFtZXRlcnMiKSYmdC5nZXQoInBhcmFtZXRlcnMiKS50b0pTKCksaT10LmdldCgiZGVzY3JpcHRpb24iKTtyZXR1cm4gdi5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToib3BlcmF0aW9uLWxpbmsifSx2LmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJkZXNjcmlwdGlvbiJ9LHYuYS5jcmVhdGVFbGVtZW50KCJiIixudWxsLHYuYS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLG4pKSxpP3YuYS5jcmVhdGVFbGVtZW50KHIse3NvdXJjZTppfSk6bnVsbCksdi5hLmNyZWF0ZUVsZW1lbnQoInByZSIsbnVsbCwiT3BlcmF0aW9uIGAiLG8sImAiLHYuYS5jcmVhdGVFbGVtZW50KCJiciIsbnVsbCksdi5hLmNyZWF0ZUVsZW1lbnQoImJyIixudWxsKSwiUGFyYW1ldGVycyAiLGZ1bmN0aW9uKGUsdCl7dmFyIG47aWYoInN0cmluZyIhPXR5cGVvZiB0KXJldHVybiIiO3JldHVybiBkKCkobj10LnNwbGl0KCJcbiIpKS5jYWxsKG4sKGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4+MD9BcnJheShlKzEpLmpvaW4oIiAiKSt0OnR9KSkuam9pbigiXG4iKX0oMCxmKCkoYSxudWxsLDIpKXx8Int9Iix2LmEuY3JlYXRlRWxlbWVudCgiYnIiLG51bGwpKSl9fV0pLG59KG0uQ29tcG9uZW50KSk7dC5kZWZhdWx0PWd9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpLG4uZCh0LCJkZWZhdWx0IiwoZnVuY3Rpb24oKXtyZXR1cm4gQX0pKTt2YXIgcj1uKDEzKSxvPW4ubihyKSxhPW4oNiksaT1uLm4oYSkscz1uKDcpLHU9bi5uKHMpLGM9bigxMCksbD1uLm4oYykscD1uKDgpLGY9bi5uKHApLGg9big5KSxkPW4ubihoKSxtPW4oMyksdj1uLm4obSksZz1uKDIpLHk9bi5uKGcpLGI9big1OCksXz1uLm4oYiksdz1uKDQpLHg9bi5uKHcpLEU9bigwKSxTPW4ubihFKSxDPW4oMSksQT0obigxMSksbigyNyksZnVuY3Rpb24oZSl7ZigpKG4sZSk7dmFyIHQ9ZCgpKG4pO2Z1bmN0aW9uIG4oKXt2YXIgZSxyO2koKSh0aGlzLG4pO2Zvcih2YXIgbz1hcmd1bWVudHMubGVuZ3RoLGE9bmV3IEFycmF5KG8pLHM9MDtzPG87cysrKWFbc109YXJndW1lbnRzW3NdO3JldHVybiByPXQuY2FsbC5hcHBseSh0LHkoKShlPVt0aGlzXSkuY2FsbChlLGEpKSx2KCkobCgpKHIpLCJvblNlcnZlckNoYW5nZSIsKGZ1bmN0aW9uKGUpe3Iuc2V0U2VydmVyKGUudGFyZ2V0LnZhbHVlKX0pKSx2KCkobCgpKHIpLCJvblNlcnZlclZhcmlhYmxlVmFsdWVDaGFuZ2UiLChmdW5jdGlvbihlKXt2YXIgdD1yLnByb3BzLG49dC5zZXRTZXJ2ZXJWYXJpYWJsZVZhbHVlLG89dC5jdXJyZW50U2VydmVyLGE9ZS50YXJnZXQuZ2V0QXR0cmlidXRlKCJkYXRhLXZhcmlhYmxlIiksaT1lLnRhcmdldC52YWx1ZTsiZnVuY3Rpb24iPT10eXBlb2YgbiYmbih7c2VydmVyOm8sa2V5OmEsdmFsOml9KX0pKSx2KCkobCgpKHIpLCJzZXRTZXJ2ZXIiLChmdW5jdGlvbihlKXsoMCxyLnByb3BzLnNldFNlbGVjdGVkU2VydmVyKShlKX0pKSxyfXJldHVybiB1KCkobixbe2tleToiY29tcG9uZW50RGlkTW91bnQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcyx0PWUuc2VydmVycztlLmN1cnJlbnRTZXJ2ZXJ8fHRoaXMuc2V0U2VydmVyKHQuZmlyc3QoKS5nZXQoInVybCIpKX19LHtrZXk6ImNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VydmVycyxuPWUuc2V0U2VydmVyVmFyaWFibGVWYWx1ZSxyPWUuZ2V0U2VydmVyVmFyaWFibGU7aWYodGhpcy5wcm9wcy5jdXJyZW50U2VydmVyIT09ZS5jdXJyZW50U2VydmVyfHx0aGlzLnByb3BzLnNlcnZlcnMhPT1lLnNlcnZlcnMpe3ZhciBvPV8oKSh0KS5jYWxsKHQsKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldCgidXJsIik9PT1lLmN1cnJlbnRTZXJ2ZXJ9KSk7aWYoIW8pcmV0dXJuIHRoaXMuc2V0U2VydmVyKHQuZmlyc3QoKS5nZXQoInVybCIpKTt2YXIgYT1vLmdldCgidmFyaWFibGVzIil8fE9iamVjdChDLk9yZGVyZWRNYXApKCk7eCgpKGEpLmNhbGwoYSwoZnVuY3Rpb24odCxvKXtyKGUuY3VycmVudFNlcnZlcixvKXx8bih7c2VydmVyOmUuY3VycmVudFNlcnZlcixrZXk6byx2YWw6dC5nZXQoImRlZmF1bHQiKXx8IiJ9KX0pKX19fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGUsdCxuPXRoaXMscj10aGlzLnByb3BzLGE9ci5zZXJ2ZXJzLGk9ci5jdXJyZW50U2VydmVyLHM9ci5nZXRTZXJ2ZXJWYXJpYWJsZSx1PXIuZ2V0RWZmZWN0aXZlU2VydmVyVmFsdWUsYz0oXygpKGEpLmNhbGwoYSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0KCJ1cmwiKT09PWl9KSl8fE9iamVjdChDLk9yZGVyZWRNYXApKCkpLmdldCgidmFyaWFibGVzIil8fE9iamVjdChDLk9yZGVyZWRNYXApKCksbD0wIT09Yy5zaXplO3JldHVybiBTLmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJzZXJ2ZXJzIn0sUy5hLmNyZWF0ZUVsZW1lbnQoImxhYmVsIix7aHRtbEZvcjoic2VydmVycyJ9LFMuYS5jcmVhdGVFbGVtZW50KCJzZWxlY3QiLHtvbkNoYW5nZTp0aGlzLm9uU2VydmVyQ2hhbmdlLHZhbHVlOml9LHgoKShlPWEudmFsdWVTZXEoKSkuY2FsbChlLChmdW5jdGlvbihlKXtyZXR1cm4gUy5hLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIse3ZhbHVlOmUuZ2V0KCJ1cmwiKSxrZXk6ZS5nZXQoInVybCIpfSxlLmdldCgidXJsIiksZS5nZXQoImRlc2NyaXB0aW9uIikmJiIgLSAiLmNvbmNhdChlLmdldCgiZGVzY3JpcHRpb24iKSkpfSkpLnRvQXJyYXkoKSkpLGw/Uy5hLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxTLmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJjb21wdXRlZC11cmwifSwiQ29tcHV0ZWQgVVJMOiIsUy5hLmNyZWF0ZUVsZW1lbnQoImNvZGUiLG51bGwsdShpKSkpLFMuYS5jcmVhdGVFbGVtZW50KCJoNCIsbnVsbCwiU2VydmVyIHZhcmlhYmxlcyIpLFMuYS5jcmVhdGVFbGVtZW50KCJ0YWJsZSIsbnVsbCxTLmEuY3JlYXRlRWxlbWVudCgidGJvZHkiLG51bGwseCgpKHQ9Yy5lbnRyeVNlcSgpKS5jYWxsKHQsKGZ1bmN0aW9uKGUpe3ZhciB0LHI9bygpKGUsMiksYT1yWzBdLHU9clsxXTtyZXR1cm4gUy5hLmNyZWF0ZUVsZW1lbnQoInRyIix7a2V5OmF9LFMuYS5jcmVhdGVFbGVtZW50KCJ0ZCIsbnVsbCxhKSxTLmEuY3JlYXRlRWxlbWVudCgidGQiLG51bGwsdS5nZXQoImVudW0iKT9TLmEuY3JlYXRlRWxlbWVudCgic2VsZWN0Iix7ImRhdGEtdmFyaWFibGUiOmEsb25DaGFuZ2U6bi5vblNlcnZlclZhcmlhYmxlVmFsdWVDaGFuZ2V9LHgoKSh0PXUuZ2V0KCJlbnVtIikpLmNhbGwodCwoZnVuY3Rpb24oZSl7cmV0dXJuIFMuYS5jcmVhdGVFbGVtZW50KCJvcHRpb24iLHtzZWxlY3RlZDplPT09cyhpLGEpLGtleTplLHZhbHVlOmV9LGUpfSkpKTpTLmEuY3JlYXRlRWxlbWVudCgiaW5wdXQiLHt0eXBlOiJ0ZXh0Iix2YWx1ZTpzKGksYSl8fCIiLG9uQ2hhbmdlOm4ub25TZXJ2ZXJWYXJpYWJsZVZhbHVlQ2hhbmdlLCJkYXRhLXZhcmlhYmxlIjphfSkpKX0pKSkpKTpudWxsKX19XSksbn0oUy5hLkNvbXBvbmVudCkpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KSxuLmQodCwiZGVmYXVsdCIsKGZ1bmN0aW9uKCl7cmV0dXJuIGh9KSk7dmFyIHI9big2KSxvPW4ubihyKSxhPW4oNyksaT1uLm4oYSkscz1uKDgpLHU9bi5uKHMpLGM9big5KSxsPW4ubihjKSxwPW4oMCksZj1uLm4ocCksaD0obigxMSksZnVuY3Rpb24oZSl7dSgpKG4sZSk7dmFyIHQ9bCgpKG4pO2Z1bmN0aW9uIG4oKXtyZXR1cm4gbygpKHRoaXMsbiksdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIGkoKShuLFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcyx0PWUuc3BlY1NlbGVjdG9ycyxuPWUub2FzM1NlbGVjdG9ycyxyPWUub2FzM0FjdGlvbnMsbz1lLmdldENvbXBvbmVudCxhPXQuc2VydmVycygpLGk9bygiU2VydmVycyIpO3JldHVybiBhJiZhLnNpemU/Zi5hLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxmLmEuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToic2VydmVycy10aXRsZSJ9LCJTZXJ2ZXJzIiksZi5hLmNyZWF0ZUVsZW1lbnQoaSx7c2VydmVyczphLGN1cnJlbnRTZXJ2ZXI6bi5zZWxlY3RlZFNlcnZlcigpLHNldFNlbGVjdGVkU2VydmVyOnIuc2V0U2VsZWN0ZWRTZXJ2ZXIsc2V0U2VydmVyVmFyaWFibGVWYWx1ZTpyLnNldFNlcnZlclZhcmlhYmxlVmFsdWUsZ2V0U2VydmVyVmFyaWFibGU6bi5zZXJ2ZXJWYXJpYWJsZVZhbHVlLGdldEVmZmVjdGl2ZVNlcnZlclZhbHVlOm4uc2VydmVyRWZmZWN0aXZlVmFsdWV9KSk6bnVsbH19XSksbn0oZi5hLkNvbXBvbmVudCkpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KSxuLmQodCwiZGVmYXVsdCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHd9KSk7dmFyIHI9big2KSxvPW4ubihyKSxhPW4oNyksaT1uLm4oYSkscz1uKDEwKSx1PW4ubihzKSxjPW4oOCksbD1uLm4oYykscD1uKDkpLGY9bi5uKHApLGg9bigzKSxkPW4ubihoKSxtPW4oMCksdj1uLm4obSksZz0obigxMSksbig1MCkpLHk9bi5uKGcpLGI9big1KSxfPUZ1bmN0aW9uLnByb3RvdHlwZSx3PWZ1bmN0aW9uKGUpe2woKShuLGUpO3ZhciB0PWYoKShuKTtmdW5jdGlvbiBuKGUscil7dmFyIGE7cmV0dXJuIG8oKSh0aGlzLG4pLGE9dC5jYWxsKHRoaXMsZSxyKSxkKCkodSgpKGEpLCJhcHBseURlZmF1bHRWYWx1ZSIsKGZ1bmN0aW9uKGUpe3ZhciB0PWV8fGEucHJvcHMsbj10Lm9uQ2hhbmdlLHI9dC5kZWZhdWx0VmFsdWU7cmV0dXJuIGEuc2V0U3RhdGUoe3ZhbHVlOnJ9KSxuKHIpfSkpLGQoKSh1KCkoYSksIm9uQ2hhbmdlIiwoZnVuY3Rpb24oZSl7YS5wcm9wcy5vbkNoYW5nZShPYmplY3QoYi5JKShlKSl9KSksZCgpKHUoKShhKSwib25Eb21DaGFuZ2UiLChmdW5jdGlvbihlKXt2YXIgdD1lLnRhcmdldC52YWx1ZTthLnNldFN0YXRlKHt2YWx1ZTp0fSwoZnVuY3Rpb24oKXtyZXR1cm4gYS5vbkNoYW5nZSh0KX0pKX0pKSxhLnN0YXRlPXt2YWx1ZTpPYmplY3QoYi5JKShlLnZhbHVlKXx8ZS5kZWZhdWx0VmFsdWV9LGUub25DaGFuZ2UoZS52YWx1ZSksYX1yZXR1cm4gaSgpKG4sW3trZXk6ImNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMiLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMucHJvcHMudmFsdWUhPT1lLnZhbHVlJiZlLnZhbHVlIT09dGhpcy5zdGF0ZS52YWx1ZSYmdGhpcy5zZXRTdGF0ZSh7dmFsdWU6T2JqZWN0KGIuSSkoZS52YWx1ZSl9KSwhZS52YWx1ZSYmZS5kZWZhdWx0VmFsdWUmJnRoaXMuc3RhdGUudmFsdWUmJnRoaXMuYXBwbHlEZWZhdWx0VmFsdWUoZSl9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcyx0PWUuZ2V0Q29tcG9uZW50LG49ZS5lcnJvcnMscj10aGlzLnN0YXRlLnZhbHVlLG89bi5zaXplPjAsYT10KCJUZXh0QXJlYSIpO3JldHVybiB2LmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJib2R5LXBhcmFtIn0sdi5hLmNyZWF0ZUVsZW1lbnQoYSx7Y2xhc3NOYW1lOnkoKSgiYm9keS1wYXJhbV9fdGV4dCIse2ludmFsaWQ6b30pLHRpdGxlOm4uc2l6ZT9uLmpvaW4oIiwgIik6IiIsdmFsdWU6cixvbkNoYW5nZTp0aGlzLm9uRG9tQ2hhbmdlfSkpfX1dKSxufShtLlB1cmVDb21wb25lbnQpO2QoKSh3LCJkZWZhdWx0UHJvcHMiLHtvbkNoYW5nZTpfLHVzZXJIYXNFZGl0ZWRCb2R5OiExfSl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpLG4uZCh0LCJkZWZhdWx0IiwoZnVuY3Rpb24oKXtyZXR1cm4gRX0pKTt2YXIgcj1uKDYpLG89bi5uKHIpLGE9big3KSxpPW4ubihhKSxzPW4oMTApLHU9bi5uKHMpLGM9big4KSxsPW4ubihjKSxwPW4oOSksZj1uLm4ocCksaD1uKDMpLGQ9bi5uKGgpLG09bigyMCksdj1uLm4obSksZz1uKDEyKSx5PW4ubihnKSxiPW4oNCksXz1uLm4oYiksdz1uKDApLHg9bi5uKHcpLEU9KG4oMTEpLGZ1bmN0aW9uKGUpe2woKShuLGUpO3ZhciB0PWYoKShuKTtmdW5jdGlvbiBuKGUscil7dmFyIGE7bygpKHRoaXMsbiksYT10LmNhbGwodGhpcyxlLHIpLGQoKSh1KCkoYSksIm9uQ2hhbmdlIiwoZnVuY3Rpb24oZSl7dmFyIHQ9YS5wcm9wcy5vbkNoYW5nZSxuPWUudGFyZ2V0LHI9bi52YWx1ZSxvPW4ubmFtZSxpPXYoKSh7fSxhLnN0YXRlLnZhbHVlKTtvP2lbb109cjppPXIsYS5zZXRTdGF0ZSh7dmFsdWU6aX0sKGZ1bmN0aW9uKCl7cmV0dXJuIHQoYS5zdGF0ZSl9KSl9KSk7dmFyIGk9YS5wcm9wcyxzPWkubmFtZSxjPWkuc2NoZW1hLGw9YS5nZXRWYWx1ZSgpO3JldHVybiBhLnN0YXRlPXtuYW1lOnMsc2NoZW1hOmMsdmFsdWU6bH0sYX1yZXR1cm4gaSgpKG4sW3trZXk6ImdldFZhbHVlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsdD1lLm5hbWUsbj1lLmF1dGhvcml6ZWQ7cmV0dXJuIG4mJm4uZ2V0SW4oW3QsInZhbHVlIl0pfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlLHQsbj10aGlzLnByb3BzLHI9bi5zY2hlbWEsbz1uLmdldENvbXBvbmVudCxhPW4uZXJyU2VsZWN0b3JzLGk9bi5uYW1lLHM9bygiSW5wdXQiKSx1PW8oIlJvdyIpLGM9bygiQ29sIiksbD1vKCJhdXRoRXJyb3IiKSxwPW8oIk1hcmtkb3duIiwhMCksZj1vKCJKdW1wVG9QYXRoIiwhMCksaD0oci5nZXQoInNjaGVtZSIpfHwiIikudG9Mb3dlckNhc2UoKSxkPXRoaXMuZ2V0VmFsdWUoKSxtPXkoKShlPWEuYWxsRXJyb3JzKCkpLmNhbGwoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0KCJhdXRoSWQiKT09PWl9KSk7aWYoImJhc2ljIj09PWgpe3ZhciB2LGc9ZD9kLmdldCgidXNlcm5hbWUiKTpudWxsO3JldHVybiB4LmEuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLHguYS5jcmVhdGVFbGVtZW50KCJoNCIsbnVsbCx4LmEuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCxpfHxyLmdldCgibmFtZSIpKSwiwqAgKGh0dHAsIEJhc2ljKSIseC5hLmNyZWF0ZUVsZW1lbnQoZix7cGF0aDpbInNlY3VyaXR5RGVmaW5pdGlvbnMiLGldfSkpLGcmJnguYS5jcmVhdGVFbGVtZW50KCJoNiIsbnVsbCwiQXV0aG9yaXplZCIpLHguYS5jcmVhdGVFbGVtZW50KHUsbnVsbCx4LmEuY3JlYXRlRWxlbWVudChwLHtzb3VyY2U6ci5nZXQoImRlc2NyaXB0aW9uIil9KSkseC5hLmNyZWF0ZUVsZW1lbnQodSxudWxsLHguYS5jcmVhdGVFbGVtZW50KCJsYWJlbCIsbnVsbCwiVXNlcm5hbWU6IiksZz94LmEuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCwiICIsZywiICIpOnguYS5jcmVhdGVFbGVtZW50KGMsbnVsbCx4LmEuY3JlYXRlRWxlbWVudChzLHt0eXBlOiJ0ZXh0IixyZXF1aXJlZDoicmVxdWlyZWQiLG5hbWU6InVzZXJuYW1lIixvbkNoYW5nZTp0aGlzLm9uQ2hhbmdlLGF1dG9Gb2N1czohMH0pKSkseC5hLmNyZWF0ZUVsZW1lbnQodSxudWxsLHguYS5jcmVhdGVFbGVtZW50KCJsYWJlbCIsbnVsbCwiUGFzc3dvcmQ6IiksZz94LmEuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCwiICoqKioqKiAiKTp4LmEuY3JlYXRlRWxlbWVudChjLG51bGwseC5hLmNyZWF0ZUVsZW1lbnQocyx7YXV0b0NvbXBsZXRlOiJuZXctcGFzc3dvcmQiLG5hbWU6InBhc3N3b3JkIix0eXBlOiJwYXNzd29yZCIsb25DaGFuZ2U6dGhpcy5vbkNoYW5nZX0pKSksXygpKHY9bS52YWx1ZVNlcSgpKS5jYWxsKHYsKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHguYS5jcmVhdGVFbGVtZW50KGwse2Vycm9yOmUsa2V5OnR9KX0pKSl9cmV0dXJuImJlYXJlciI9PT1oP3guYS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwseC5hLmNyZWF0ZUVsZW1lbnQoImg0IixudWxsLHguYS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLGl8fHIuZ2V0KCJuYW1lIikpLCLCoCAoaHR0cCwgQmVhcmVyKSIseC5hLmNyZWF0ZUVsZW1lbnQoZix7cGF0aDpbInNlY3VyaXR5RGVmaW5pdGlvbnMiLGldfSkpLGQmJnguYS5jcmVhdGVFbGVtZW50KCJoNiIsbnVsbCwiQXV0aG9yaXplZCIpLHguYS5jcmVhdGVFbGVtZW50KHUsbnVsbCx4LmEuY3JlYXRlRWxlbWVudChwLHtzb3VyY2U6ci5nZXQoImRlc2NyaXB0aW9uIil9KSkseC5hLmNyZWF0ZUVsZW1lbnQodSxudWxsLHguYS5jcmVhdGVFbGVtZW50KCJsYWJlbCIsbnVsbCwiVmFsdWU6IiksZD94LmEuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCwiICoqKioqKiAiKTp4LmEuY3JlYXRlRWxlbWVudChjLG51bGwseC5hLmNyZWF0ZUVsZW1lbnQocyx7dHlwZToidGV4dCIsb25DaGFuZ2U6dGhpcy5vbkNoYW5nZSxhdXRvRm9jdXM6ITB9KSkpLF8oKSh0PW0udmFsdWVTZXEoKSkuY2FsbCh0LChmdW5jdGlvbihlLHQpe3JldHVybiB4LmEuY3JlYXRlRWxlbWVudChsLHtlcnJvcjplLGtleTp0fSl9KSkpOnguYS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwseC5hLmNyZWF0ZUVsZW1lbnQoImVtIixudWxsLHguYS5jcmVhdGVFbGVtZW50KCJiIixudWxsLGkpLCIgSFRUUCBhdXRoZW50aWNhdGlvbjogdW5zdXBwb3J0ZWQgc2NoZW1lICIsIiciLmNvbmNhdChoLCInIikpKX19XSksbn0oeC5hLkNvbXBvbmVudCkpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KSxuLmQodCwiZGVmYXVsdCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHd9KSk7dmFyIHI9bigyNCksbz1uLm4ociksYT1uKDYpLGk9bi5uKGEpLHM9big3KSx1PW4ubihzKSxjPW4oMTApLGw9bi5uKGMpLHA9big4KSxmPW4ubihwKSxoPW4oOSksZD1uLm4oaCksbT1uKDMpLHY9bi5uKG0pLGc9bigyKSx5PW4ubihnKSxiPW4oMCksXz1uLm4oYiksdz0obigxMSksbigyNyksZnVuY3Rpb24oZSl7ZigpKG4sZSk7dmFyIHQ9ZCgpKG4pO2Z1bmN0aW9uIG4oKXt2YXIgZSxyO2koKSh0aGlzLG4pO2Zvcih2YXIgYT1hcmd1bWVudHMubGVuZ3RoLHM9bmV3IEFycmF5KGEpLHU9MDt1PGE7dSsrKXNbdV09YXJndW1lbnRzW3VdO3JldHVybiByPXQuY2FsbC5hcHBseSh0LHkoKShlPVt0aGlzXSkuY2FsbChlLHMpKSx2KCkobCgpKHIpLCJzZXRTZWxlY3RlZFNlcnZlciIsKGZ1bmN0aW9uKGUpe3ZhciB0LG49ci5wcm9wcyxvPW4ucGF0aCxhPW4ubWV0aG9kO3JldHVybiByLmZvcmNlVXBkYXRlKCksci5wcm9wcy5zZXRTZWxlY3RlZFNlcnZlcihlLHkoKSh0PSIiLmNvbmNhdChvLCI6IikpLmNhbGwodCxhKSl9KSksdigpKGwoKShyKSwic2V0U2VydmVyVmFyaWFibGVWYWx1ZSIsKGZ1bmN0aW9uKGUpe3ZhciB0LG49ci5wcm9wcyxhPW4ucGF0aCxpPW4ubWV0aG9kO3JldHVybiByLmZvcmNlVXBkYXRlKCksci5wcm9wcy5zZXRTZXJ2ZXJWYXJpYWJsZVZhbHVlKG8oKShvKCkoe30sZSkse30se25hbWVzcGFjZTp5KCkodD0iIi5jb25jYXQoYSwiOiIpKS5jYWxsKHQsaSl9KSl9KSksdigpKGwoKShyKSwiZ2V0U2VsZWN0ZWRTZXJ2ZXIiLChmdW5jdGlvbigpe3ZhciBlLHQ9ci5wcm9wcyxuPXQucGF0aCxvPXQubWV0aG9kO3JldHVybiByLnByb3BzLmdldFNlbGVjdGVkU2VydmVyKHkoKShlPSIiLmNvbmNhdChuLCI6IikpLmNhbGwoZSxvKSl9KSksdigpKGwoKShyKSwiZ2V0U2VydmVyVmFyaWFibGUiLChmdW5jdGlvbihlLHQpe3ZhciBuLG89ci5wcm9wcyxhPW8ucGF0aCxpPW8ubWV0aG9kO3JldHVybiByLnByb3BzLmdldFNlcnZlclZhcmlhYmxlKHtuYW1lc3BhY2U6eSgpKG49IiIuY29uY2F0KGEsIjoiKSkuY2FsbChuLGkpLHNlcnZlcjplfSx0KX0pKSx2KCkobCgpKHIpLCJnZXRFZmZlY3RpdmVTZXJ2ZXJWYWx1ZSIsKGZ1bmN0aW9uKGUpe3ZhciB0LG49ci5wcm9wcyxvPW4ucGF0aCxhPW4ubWV0aG9kO3JldHVybiByLnByb3BzLmdldEVmZmVjdGl2ZVNlcnZlclZhbHVlKHtzZXJ2ZXI6ZSxuYW1lc3BhY2U6eSgpKHQ9IiIuY29uY2F0KG8sIjoiKSkuY2FsbCh0LGEpfSl9KSkscn1yZXR1cm4gdSgpKG4sW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLHQ9ZS5vcGVyYXRpb25TZXJ2ZXJzLG49ZS5wYXRoU2VydmVycyxyPWUuZ2V0Q29tcG9uZW50O2lmKCF0JiYhbilyZXR1cm4gbnVsbDt2YXIgbz1yKCJTZXJ2ZXJzIiksYT10fHxuLGk9dD8ib3BlcmF0aW9uIjoicGF0aCI7cmV0dXJuIF8uYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Im9wYmxvY2stc2VjdGlvbiBvcGVyYXRpb24tc2VydmVycyJ9LF8uYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Im9wYmxvY2stc2VjdGlvbi1oZWFkZXIifSxfLmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJ0YWItaGVhZGVyIn0sXy5hLmNyZWF0ZUVsZW1lbnQoImg0Iix7Y2xhc3NOYW1lOiJvcGJsb2NrLXRpdGxlIn0sIlNlcnZlcnMiKSkpLF8uYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Im9wYmxvY2stZGVzY3JpcHRpb24td3JhcHBlciJ9LF8uYS5jcmVhdGVFbGVtZW50KCJoNCIse2NsYXNzTmFtZToibWVzc2FnZSJ9LCJUaGVzZSAiLGksIi1sZXZlbCBvcHRpb25zIG92ZXJyaWRlIHRoZSBnbG9iYWwgc2VydmVyIG9wdGlvbnMuIiksXy5hLmNyZWF0ZUVsZW1lbnQobyx7c2VydmVyczphLGN1cnJlbnRTZXJ2ZXI6dGhpcy5nZXRTZWxlY3RlZFNlcnZlcigpLHNldFNlbGVjdGVkU2VydmVyOnRoaXMuc2V0U2VsZWN0ZWRTZXJ2ZXIsc2V0U2VydmVyVmFyaWFibGVWYWx1ZTp0aGlzLnNldFNlcnZlclZhcmlhYmxlVmFsdWUsZ2V0U2VydmVyVmFyaWFibGU6dGhpcy5nZXRTZXJ2ZXJWYXJpYWJsZSxnZXRFZmZlY3RpdmVTZXJ2ZXJWYWx1ZTp0aGlzLmdldEVmZmVjdGl2ZVNlcnZlclZhbHVlfSkpKX19XSksbn0oXy5hLkNvbXBvbmVudCkpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KTt2YXIgcj1uKDMzNCksbz1uKDMzNSksYT1uKDMzNiksaT1uKDMzNykscz1uKDMzOCksdT1uKDMzOSk7dC5kZWZhdWx0PXtNYXJrZG93bjpyLmRlZmF1bHQsQXV0aEl0ZW06by5kZWZhdWx0LEpzb25TY2hlbWFfc3RyaW5nOnUuZGVmYXVsdCxWZXJzaW9uU3RhbXA6YS5kZWZhdWx0LG1vZGVsOnMuZGVmYXVsdCxvbmxpbmVWYWxpZGF0b3JCYWRnZTppLmRlZmF1bHR9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KSxuLmQodCwiTWFya2Rvd24iLChmdW5jdGlvbigpe3JldHVybiBofSkpO3ZhciByPW4oMTAxKSxvPW4ubihyKSxhPW4oMCksaT1uLm4oYSkscz0obigxMSksbig1MCkpLHU9bi5uKHMpLGM9bigyMTgpLGw9bigzNSkscD1uKDIxOSksZj1uZXcgYy5hKCJjb21tb25tYXJrIik7Zi5ibG9jay5ydWxlci5lbmFibGUoWyJ0YWJsZSJdKSxmLnNldCh7bGlua1RhcmdldDoiX2JsYW5rIn0pO3ZhciBoPWZ1bmN0aW9uKGUpe3ZhciB0PWUuc291cmNlLG49ZS5jbGFzc05hbWUscj12b2lkIDA9PT1uPyIiOm4sYT1lLmdldENvbmZpZ3M7aWYoInN0cmluZyIhPXR5cGVvZiB0KXJldHVybiBudWxsO2lmKHQpe3ZhciBzLGM9YSgpLnVzZVVuc2FmZU1hcmtkb3duLGw9Zi5yZW5kZXIodCksaD1PYmplY3QocC5iKShsLHt1c2VVbnNhZmVNYXJrZG93bjpjfSk7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBoJiYocz1vKCkoaCkuY2FsbChoKSksaS5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MOntfX2h0bWw6c30sY2xhc3NOYW1lOnUoKShyLCJyZW5kZXJlZE1hcmtkb3duIil9KX1yZXR1cm4gbnVsbH07aC5kZWZhdWx0UHJvcHM9e2dldENvbmZpZ3M6ZnVuY3Rpb24oKXtyZXR1cm57dXNlVW5zYWZlTWFya2Rvd246ITF9fX0sdC5kZWZhdWx0PU9iamVjdChsLk9BUzNDb21wb25lbnRXcmFwRmFjdG9yeSkoaCl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpO3ZhciByPW4oNTMpLG89bi5uKHIpLGE9bigwKSxpPW4ubihhKSxzPW4oMzUpLHU9WyJPcmkiXTt0LmRlZmF1bHQ9T2JqZWN0KHMuT0FTM0NvbXBvbmVudFdyYXBGYWN0b3J5KSgoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5Pcmksbj1vKCkoZSx1KSxyPW4uc2NoZW1hLGE9bi5nZXRDb21wb25lbnQscz1uLmVyclNlbGVjdG9ycyxjPW4uYXV0aG9yaXplZCxsPW4ub25BdXRoQ2hhbmdlLHA9bi5uYW1lLGY9YSgiSHR0cEF1dGgiKTtyZXR1cm4iaHR0cCI9PT1yLmdldCgidHlwZSIpP2kuYS5jcmVhdGVFbGVtZW50KGYse2tleTpwLHNjaGVtYTpyLG5hbWU6cCxlcnJTZWxlY3RvcnM6cyxhdXRob3JpemVkOmMsZ2V0Q29tcG9uZW50OmEsb25DaGFuZ2U6bH0pOmkuYS5jcmVhdGVFbGVtZW50KHQsbil9KSl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpO3ZhciByPW4oMCksbz1uLm4ociksYT1uKDM1KTt0LmRlZmF1bHQ9T2JqZWN0KGEuT0FTM0NvbXBvbmVudFdyYXBGYWN0b3J5KSgoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5Pcmk7cmV0dXJuIG8uYS5jcmVhdGVFbGVtZW50KCJzcGFuIixudWxsLG8uYS5jcmVhdGVFbGVtZW50KHQsZSksby5hLmNyZWF0ZUVsZW1lbnQoInNtYWxsIix7Y2xhc3NOYW1lOiJ2ZXJzaW9uLXN0YW1wIn0sby5hLmNyZWF0ZUVsZW1lbnQoInByZSIse2NsYXNzTmFtZToidmVyc2lvbiJ9LCJPQVMzIikpKX0pKX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtuLnIodCk7dmFyIHI9bigzNSksbz1uKDIxNyk7dC5kZWZhdWx0PU9iamVjdChyLk9BUzNDb21wb25lbnRXcmFwRmFjdG9yeSkoby5hKX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtuLnIodCk7dmFyIHI9bigyOCksbz1uLm4ociksYT1uKDYpLGk9bi5uKGEpLHM9big3KSx1PW4ubihzKSxjPW4oOCksbD1uLm4oYykscD1uKDkpLGY9bi5uKHApLGg9bigwKSxkPW4ubihoKSxtPShuKDExKSxuKDM1KSksdj1uKDIyMCksZz1mdW5jdGlvbihlKXtsKCkobixlKTt2YXIgdD1mKCkobik7ZnVuY3Rpb24gbigpe3JldHVybiBpKCkodGhpcyxuKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gdSgpKG4sW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLHQ9ZS5nZXRDb25maWdzLG49WyJtb2RlbC1ib3giXSxyPW51bGw7cmV0dXJuITA9PT1lLnNjaGVtYS5nZXQoImRlcHJlY2F0ZWQiKSYmKG4ucHVzaCgiZGVwcmVjYXRlZCIpLHI9ZC5hLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Im1vZGVsLWRlcHJlY2F0ZWQtd2FybmluZyJ9LCJEZXByZWNhdGVkOiIpKSxkLmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOm4uam9pbigiICIpfSxyLGQuYS5jcmVhdGVFbGVtZW50KHYuYSxvKCkoe30sdGhpcy5wcm9wcyx7Z2V0Q29uZmlnczp0LGRlcHRoOjEsZXhwYW5kRGVwdGg6dGhpcy5wcm9wcy5leHBhbmREZXB0aHx8MH0pKSl9fV0pLG59KGguQ29tcG9uZW50KTt0LmRlZmF1bHQ9T2JqZWN0KG0uT0FTM0NvbXBvbmVudFdyYXBGYWN0b3J5KShnKX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtuLnIodCk7dmFyIHI9big1Myksbz1uLm4ociksYT1uKDApLGk9bi5uKGEpLHM9bigzNSksdT1bIk9yaSJdO3QuZGVmYXVsdD1PYmplY3Qocy5PQVMzQ29tcG9uZW50V3JhcEZhY3RvcnkpKChmdW5jdGlvbihlKXt2YXIgdD1lLk9yaSxuPW8oKShlLHUpLHI9bi5zY2hlbWEsYT1uLmdldENvbXBvbmVudCxzPW4uZXJyb3JzLGM9bi5vbkNoYW5nZSxsPXImJnIuZ2V0P3IuZ2V0KCJmb3JtYXQiKTpudWxsLHA9ciYmci5nZXQ/ci5nZXQoInR5cGUiKTpudWxsLGY9YSgiSW5wdXQiKTtyZXR1cm4gcCYmInN0cmluZyI9PT1wJiZsJiYoImJpbmFyeSI9PT1sfHwiYmFzZTY0Ij09PWwpP2kuYS5jcmVhdGVFbGVtZW50KGYse3R5cGU6ImZpbGUiLGNsYXNzTmFtZTpzLmxlbmd0aD8iaW52YWxpZCI6IiIsdGl0bGU6cy5sZW5ndGg/czoiIixvbkNoYW5nZTpmdW5jdGlvbihlKXtjKGUudGFyZ2V0LmZpbGVzWzBdKX0sZGlzYWJsZWQ6dC5pc0Rpc2FibGVkfSk6aS5hLmNyZWF0ZUVsZW1lbnQodCxuKX0pKX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtuLnIodCksbi5kKHQsInNlbGVjdGVkU2VydmVyIiwoZnVuY3Rpb24oKXtyZXR1cm4gd30pKSxuLmQodCwicmVxdWVzdEJvZHlWYWx1ZSIsKGZ1bmN0aW9uKCl7cmV0dXJuIHh9KSksbi5kKHQsInNob3VsZFJldGFpblJlcXVlc3RCb2R5VmFsdWUiLChmdW5jdGlvbigpe3JldHVybiBFfSkpLG4uZCh0LCJoYXNVc2VyRWRpdGVkQm9keSIsKGZ1bmN0aW9uKCl7cmV0dXJuIFN9KSksbi5kKHQsInJlcXVlc3RCb2R5SW5jbHVzaW9uU2V0dGluZyIsKGZ1bmN0aW9uKCl7cmV0dXJuIEN9KSksbi5kKHQsInJlcXVlc3RCb2R5RXJyb3JzIiwoZnVuY3Rpb24oKXtyZXR1cm4gQX0pKSxuLmQodCwiYWN0aXZlRXhhbXBsZXNNZW1iZXIiLChmdW5jdGlvbigpe3JldHVybiBPfSkpLG4uZCh0LCJyZXF1ZXN0Q29udGVudFR5cGUiLChmdW5jdGlvbigpe3JldHVybiBrfSkpLG4uZCh0LCJyZXNwb25zZUNvbnRlbnRUeXBlIiwoZnVuY3Rpb24oKXtyZXR1cm4gan0pKSxuLmQodCwic2VydmVyVmFyaWFibGVWYWx1ZSIsKGZ1bmN0aW9uKCl7cmV0dXJuIFR9KSksbi5kKHQsInNlcnZlclZhcmlhYmxlcyIsKGZ1bmN0aW9uKCl7cmV0dXJuIEl9KSksbi5kKHQsInNlcnZlckVmZmVjdGl2ZVZhbHVlIiwoZnVuY3Rpb24oKXtyZXR1cm4gUH0pKSxuLmQodCwidmFsaWRhdGVCZWZvcmVFeGVjdXRlIiwoZnVuY3Rpb24oKXtyZXR1cm4gTn0pKSxuLmQodCwidmFsaWRhdGVTaGFsbG93UmVxdWlyZWQiLChmdW5jdGlvbigpe3JldHVybiBNfSkpO3ZhciByPW4oMTQpLG89bi5uKHIpLGE9bigyKSxpPW4ubihhKSxzPW4oNCksdT1uLm4ocyksYz1uKDIxKSxsPW4ubihjKSxwPW4oMTUpLGY9bi5uKHApLGg9bigxNyksZD1uLm4oaCksbT1uKDEpLHY9bigzNSksZz1uKDE3NCkseT1uKDUpO2Z1bmN0aW9uIGIoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkodCkscj0wO3I8dDtyKyspbltyXT1hcmd1bWVudHNbcl07cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciByPXQuZ2V0U3lzdGVtKCkuc3BlY1NlbGVjdG9ycy5zcGVjSnNvbigpO3JldHVybiBPYmplY3Qodi5pc09BUzMpKHIpP2UuYXBwbHkodm9pZCAwLG4pOm51bGx9fX12YXIgXyx3PWIoKGZ1bmN0aW9uKGUsdCl7dmFyIG49dD9bdCwic2VsZWN0ZWRTZXJ2ZXIiXTpbInNlbGVjdGVkU2VydmVyIl07cmV0dXJuIGUuZ2V0SW4obil8fCIifSkpLHg9YigoZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLmdldEluKFsicmVxdWVzdERhdGEiLHQsbiwiYm9keVZhbHVlIl0pfHxudWxsfSkpLEU9YigoZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLmdldEluKFsicmVxdWVzdERhdGEiLHQsbiwicmV0YWluQm9keVZhbHVlIl0pfHwhMX0pKSxTPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHI9ZS5nZXRTeXN0ZW0oKSxvPXIub2FzM1NlbGVjdG9ycyxhPXIuc3BlY1NlbGVjdG9ycyxpPWEuc3BlY0pzb24oKTtpZihPYmplY3Qodi5pc09BUzMpKGkpKXt2YXIgcz0hMSx1PW8ucmVxdWVzdENvbnRlbnRUeXBlKHQsbiksYz1vLnJlcXVlc3RCb2R5VmFsdWUodCxuKTtpZihtLk1hcC5pc01hcChjKSYmKGM9T2JqZWN0KHkuSSkoYy5tYXBFbnRyaWVzKChmdW5jdGlvbihlKXtyZXR1cm4gbS5NYXAuaXNNYXAoZVsxXSk/W2VbMF0sZVsxXS5nZXQoInZhbHVlIildOmV9KSkudG9KUygpKSksbS5MaXN0LmlzTGlzdChjKSYmKGM9T2JqZWN0KHkuSSkoYykpLHUpe3ZhciBsPU9iamVjdChnLmdldERlZmF1bHRSZXF1ZXN0Qm9keVZhbHVlKShhLnNwZWNSZXNvbHZlZFN1YnRyZWUoWyJwYXRocyIsdCxuLCJyZXF1ZXN0Qm9keSJdKSx1LG8uYWN0aXZlRXhhbXBsZXNNZW1iZXIodCxuLCJyZXF1ZXN0Qm9keSIsInJlcXVlc3RCb2R5IikpO3M9ISFjJiZjIT09bH1yZXR1cm4gc31yZXR1cm4gbnVsbH19LEM9YigoZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLmdldEluKFsicmVxdWVzdERhdGEiLHQsbiwiYm9keUluY2x1c2lvbiJdKXx8T2JqZWN0KG0uTWFwKSgpfSkpLEE9YigoZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLmdldEluKFsicmVxdWVzdERhdGEiLHQsbiwiZXJyb3JzIl0pfHxudWxsfSkpLE89YigoZnVuY3Rpb24oZSx0LG4scixvKXtyZXR1cm4gZS5nZXRJbihbImV4YW1wbGVzIix0LG4scixvLCJhY3RpdmVFeGFtcGxlIl0pfHxudWxsfSkpLGs9YigoZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLmdldEluKFsicmVxdWVzdERhdGEiLHQsbiwicmVxdWVzdENvbnRlbnRUeXBlIl0pfHxudWxsfSkpLGo9YigoZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLmdldEluKFsicmVxdWVzdERhdGEiLHQsbiwicmVzcG9uc2VDb250ZW50VHlwZSJdKXx8bnVsbH0pKSxUPWIoKGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZigic3RyaW5nIiE9dHlwZW9mIHQpe3ZhciBvPXQuc2VydmVyLGE9dC5uYW1lc3BhY2U7cj1hP1thLCJzZXJ2ZXJWYXJpYWJsZVZhbHVlcyIsbyxuXTpbInNlcnZlclZhcmlhYmxlVmFsdWVzIixvLG5dfWVsc2V7cj1bInNlcnZlclZhcmlhYmxlVmFsdWVzIix0LG5dfXJldHVybiBlLmdldEluKHIpfHxudWxsfSkpLEk9YigoZnVuY3Rpb24oZSx0KXt2YXIgbjtpZigic3RyaW5nIiE9dHlwZW9mIHQpe3ZhciByPXQuc2VydmVyLG89dC5uYW1lc3BhY2U7bj1vP1tvLCJzZXJ2ZXJWYXJpYWJsZVZhbHVlcyIscl06WyJzZXJ2ZXJWYXJpYWJsZVZhbHVlcyIscl19ZWxzZXtuPVsic2VydmVyVmFyaWFibGVWYWx1ZXMiLHRdfXJldHVybiBlLmdldEluKG4pfHxPYmplY3QobS5PcmRlcmVkTWFwKSgpfSkpLFA9YigoZnVuY3Rpb24oZSx0KXt2YXIgbixyO2lmKCJzdHJpbmciIT10eXBlb2YgdCl7dmFyIG89dC5zZXJ2ZXIsYT10Lm5hbWVzcGFjZTtyPW8sbj1hP2UuZ2V0SW4oW2EsInNlcnZlclZhcmlhYmxlVmFsdWVzIixyXSk6ZS5nZXRJbihbInNlcnZlclZhcmlhYmxlVmFsdWVzIixyXSl9ZWxzZSByPXQsbj1lLmdldEluKFsic2VydmVyVmFyaWFibGVWYWx1ZXMiLHJdKTtuPW58fE9iamVjdChtLk9yZGVyZWRNYXApKCk7dmFyIGk9cjtyZXR1cm4gdSgpKG4pLmNhbGwobiwoZnVuY3Rpb24oZSx0KXtpPWkucmVwbGFjZShuZXcgUmVnRXhwKCJ7Ii5jb25jYXQodCwifSIpLCJnIiksZSl9KSksaX0pKSxOPShfPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7dmFyIG47cmV0dXJuIHQ9dHx8W10sISFlLmdldEluKGkoKShuPVsicmVxdWVzdERhdGEiXSkuY2FsbChuLG8oKSh0KSxbImJvZHlWYWx1ZSJdKSl9KGUsdCl9LGZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuLHIsYT1lLmdldFN5c3RlbSgpLnNwZWNTZWxlY3RvcnMuc3BlY0pzb24oKSxzPWkoKShuPVtdKS5jYWxsKG4sdClbMV18fFtdO3JldHVybiFhLmdldEluKGkoKShyPVsicGF0aHMiXSkuY2FsbChyLG8oKShzKSxbInJlcXVlc3RCb2R5IiwicmVxdWlyZWQiXSkpfHxfLmFwcGx5KHZvaWQgMCx0KX19KSxNPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj10Lm9hczNSZXF1aXJlZFJlcXVlc3RCb2R5Q29udGVudFR5cGUsbz10Lm9hczNSZXF1ZXN0Q29udGVudFR5cGUsYT10Lm9hczNSZXF1ZXN0Qm9keVZhbHVlLGk9W107aWYoIW0uTWFwLmlzTWFwKGEpKXJldHVybiBpO3ZhciBzPVtdO3JldHVybiBsKCkobj1mKCkoci5yZXF1ZXN0Q29udGVudFR5cGUpKS5jYWxsKG4sKGZ1bmN0aW9uKGUpe2lmKGU9PT1vKXt2YXIgdD1yLnJlcXVlc3RDb250ZW50VHlwZVtlXTtsKCkodCkuY2FsbCh0LChmdW5jdGlvbihlKXtkKCkocykuY2FsbChzLGUpPDAmJnMucHVzaChlKX0pKX19KSksbCgpKHMpLmNhbGwocywoZnVuY3Rpb24oZSl7YS5nZXRJbihbZSwidmFsdWUiXSl8fGkucHVzaChlKX0pKSxpfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtuLnIodCk7dmFyIHIsbz1uKDMpLGE9bi5uKG8pLGk9bigzNTgpLHM9bi5uKGkpLHU9bigxMyksYz1uLm4odSksbD1uKDEyNCkscD1uLm4obCksZj1uKDE5KSxoPW4ubihmKSxkPW4oMjEpLG09bi5uKGQpLHY9bigyOSksZz1uLm4odikseT1uKDEpLGI9big1NCk7dC5kZWZhdWx0PShyPXt9LGEoKShyLGIuVVBEQVRFX1NFTEVDVEVEX1NFUlZFUiwoZnVuY3Rpb24oZSx0KXt2YXIgbj10LnBheWxvYWQscj1uLnNlbGVjdGVkU2VydmVyVXJsLG89bi5uYW1lc3BhY2UsYT1vP1tvLCJzZWxlY3RlZFNlcnZlciJdOlsic2VsZWN0ZWRTZXJ2ZXIiXTtyZXR1cm4gZS5zZXRJbihhLHIpfSkpLGEoKShyLGIuVVBEQVRFX1JFUVVFU1RfQk9EWV9WQUxVRSwoZnVuY3Rpb24oZSx0KXt2YXIgbj10LnBheWxvYWQscj1uLnZhbHVlLG89bi5wYXRoTWV0aG9kLGE9YygpKG8sMiksaT1hWzBdLHU9YVsxXTtpZigheS5NYXAuaXNNYXAocikpcmV0dXJuIGUuc2V0SW4oWyJyZXF1ZXN0RGF0YSIsaSx1LCJib2R5VmFsdWUiXSxyKTt2YXIgbCxmPWUuZ2V0SW4oWyJyZXF1ZXN0RGF0YSIsaSx1LCJib2R5VmFsdWUiXSl8fE9iamVjdCh5Lk1hcCkoKTt5Lk1hcC5pc01hcChmKXx8KGY9T2JqZWN0KHkuTWFwKSgpKTt2YXIgZD1wKCkocikuY2FsbChyKSx2PXMoKShkKSxnPWgoKSh2KS5jYWxsKHYsMCk7cmV0dXJuIG0oKShnKS5jYWxsKGcsKGZ1bmN0aW9uKGUpe3ZhciB0PXIuZ2V0SW4oW2VdKTtmLmhhcyhlKSYmeS5NYXAuaXNNYXAodCl8fChsPWYuc2V0SW4oW2UsInZhbHVlIl0sdCkpfSkpLGUuc2V0SW4oWyJyZXF1ZXN0RGF0YSIsaSx1LCJib2R5VmFsdWUiXSxsKX0pKSxhKCkocixiLlVQREFURV9SRVFVRVNUX0JPRFlfVkFMVUVfUkVUQUlOX0ZMQUcsKGZ1bmN0aW9uKGUsdCl7dmFyIG49dC5wYXlsb2FkLHI9bi52YWx1ZSxvPW4ucGF0aE1ldGhvZCxhPWMoKShvLDIpLGk9YVswXSxzPWFbMV07cmV0dXJuIGUuc2V0SW4oWyJyZXF1ZXN0RGF0YSIsaSxzLCJyZXRhaW5Cb2R5VmFsdWUiXSxyKX0pKSxhKCkocixiLlVQREFURV9SRVFVRVNUX0JPRFlfSU5DTFVTSU9OLChmdW5jdGlvbihlLHQpe3ZhciBuPXQucGF5bG9hZCxyPW4udmFsdWUsbz1uLnBhdGhNZXRob2QsYT1uLm5hbWUsaT1jKCkobywyKSxzPWlbMF0sdT1pWzFdO3JldHVybiBlLnNldEluKFsicmVxdWVzdERhdGEiLHMsdSwiYm9keUluY2x1c2lvbiIsYV0scil9KSksYSgpKHIsYi5VUERBVEVfQUNUSVZFX0VYQU1QTEVTX01FTUJFUiwoZnVuY3Rpb24oZSx0KXt2YXIgbj10LnBheWxvYWQscj1uLm5hbWUsbz1uLnBhdGhNZXRob2QsYT1uLmNvbnRleHRUeXBlLGk9bi5jb250ZXh0TmFtZSxzPWMoKShvLDIpLHU9c1swXSxsPXNbMV07cmV0dXJuIGUuc2V0SW4oWyJleGFtcGxlcyIsdSxsLGEsaSwiYWN0aXZlRXhhbXBsZSJdLHIpfSkpLGEoKShyLGIuVVBEQVRFX1JFUVVFU1RfQ09OVEVOVF9UWVBFLChmdW5jdGlvbihlLHQpe3ZhciBuPXQucGF5bG9hZCxyPW4udmFsdWUsbz1uLnBhdGhNZXRob2QsYT1jKCkobywyKSxpPWFbMF0scz1hWzFdO3JldHVybiBlLnNldEluKFsicmVxdWVzdERhdGEiLGkscywicmVxdWVzdENvbnRlbnRUeXBlIl0scil9KSksYSgpKHIsYi5VUERBVEVfUkVTUE9OU0VfQ09OVEVOVF9UWVBFLChmdW5jdGlvbihlLHQpe3ZhciBuPXQucGF5bG9hZCxyPW4udmFsdWUsbz1uLnBhdGgsYT1uLm1ldGhvZDtyZXR1cm4gZS5zZXRJbihbInJlcXVlc3REYXRhIixvLGEsInJlc3BvbnNlQ29udGVudFR5cGUiXSxyKX0pKSxhKCkocixiLlVQREFURV9TRVJWRVJfVkFSSUFCTEVfVkFMVUUsKGZ1bmN0aW9uKGUsdCl7dmFyIG49dC5wYXlsb2FkLHI9bi5zZXJ2ZXIsbz1uLm5hbWVzcGFjZSxhPW4ua2V5LGk9bi52YWwscz1vP1tvLCJzZXJ2ZXJWYXJpYWJsZVZhbHVlcyIscixhXTpbInNlcnZlclZhcmlhYmxlVmFsdWVzIixyLGFdO3JldHVybiBlLnNldEluKHMsaSl9KSksYSgpKHIsYi5TRVRfUkVRVUVTVF9CT0RZX1ZBTElEQVRFX0VSUk9SLChmdW5jdGlvbihlLHQpe3ZhciBuPXQucGF5bG9hZCxyPW4ucGF0aCxvPW4ubWV0aG9kLGE9bi52YWxpZGF0aW9uRXJyb3JzLGk9W107aWYoaS5wdXNoKCJSZXF1aXJlZCBmaWVsZCBpcyBub3QgcHJvdmlkZWQiKSxhLm1pc3NpbmdCb2R5VmFsdWUpcmV0dXJuIGUuc2V0SW4oWyJyZXF1ZXN0RGF0YSIscixvLCJlcnJvcnMiXSxPYmplY3QoeS5mcm9tSlMpKGkpKTtpZihhLm1pc3NpbmdSZXF1aXJlZEtleXMmJmEubWlzc2luZ1JlcXVpcmVkS2V5cy5sZW5ndGg+MCl7dmFyIHM9YS5taXNzaW5nUmVxdWlyZWRLZXlzO3JldHVybiBlLnVwZGF0ZUluKFsicmVxdWVzdERhdGEiLHIsbywiYm9keVZhbHVlIl0sT2JqZWN0KHkuZnJvbUpTKSh7fSksKGZ1bmN0aW9uKGUpe3JldHVybiBnKCkocykuY2FsbChzLChmdW5jdGlvbihlLHQpe3JldHVybiBlLnNldEluKFt0LCJlcnJvcnMiXSxPYmplY3QoeS5mcm9tSlMpKGkpKX0pLGUpfSkpfXJldHVybiBjb25zb2xlLndhcm4oInVuZXhwZWN0ZWQgcmVzdWx0OiBTRVRfUkVRVUVTVF9CT0RZX1ZBTElEQVRFX0VSUk9SIiksZX0pKSxhKCkocixiLkNMRUFSX1JFUVVFU1RfQk9EWV9WQUxJREFURV9FUlJPUiwoZnVuY3Rpb24oZSx0KXt2YXIgbj10LnBheWxvYWQscj1uLnBhdGgsbz1uLm1ldGhvZCxhPWUuZ2V0SW4oWyJyZXF1ZXN0RGF0YSIscixvLCJib2R5VmFsdWUiXSk7aWYoIXkuTWFwLmlzTWFwKGEpKXJldHVybiBlLnNldEluKFsicmVxdWVzdERhdGEiLHIsbywiZXJyb3JzIl0sT2JqZWN0KHkuZnJvbUpTKShbXSkpO3ZhciBpPXAoKShhKS5jYWxsKGEpLHU9cygpKGkpLGM9aCgpKHUpLmNhbGwodSwwKTtyZXR1cm4gYz9lLnVwZGF0ZUluKFsicmVxdWVzdERhdGEiLHIsbywiYm9keVZhbHVlIl0sT2JqZWN0KHkuZnJvbUpTKSh7fSksKGZ1bmN0aW9uKGUpe3JldHVybiBnKCkoYykuY2FsbChjLChmdW5jdGlvbihlLHQpe3JldHVybiBlLnNldEluKFt0LCJlcnJvcnMiXSxPYmplY3QoeS5mcm9tSlMpKFtdKSl9KSxlKX0pKTplfSkpLGEoKShyLGIuQ0xFQVJfUkVRVUVTVF9CT0RZX1ZBTFVFLChmdW5jdGlvbihlLHQpe3ZhciBuPXQucGF5bG9hZC5wYXRoTWV0aG9kLHI9YygpKG4sMiksbz1yWzBdLGE9clsxXSxpPWUuZ2V0SW4oWyJyZXF1ZXN0RGF0YSIsbyxhLCJib2R5VmFsdWUiXSk7cmV0dXJuIGk/eS5NYXAuaXNNYXAoaSk/ZS5zZXRJbihbInJlcXVlc3REYXRhIixvLGEsImJvZHlWYWx1ZSJdLE9iamVjdCh5Lk1hcCkoKSk6ZS5zZXRJbihbInJlcXVlc3REYXRhIixvLGEsImJvZHlWYWx1ZSJdLCIiKTplfSkpLHIpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KTt2YXIgcixvPW4oMjEpLGE9bi5uKG8pLGk9bigxMjQpLHM9bi5uKGkpLHU9big1KSxjPW4oMTEwNyksbD17fTthKCkocj1zKCkoYykuY2FsbChjKSkuY2FsbChyLChmdW5jdGlvbihlKXtpZigiLi9pbmRleC5qcyIhPT1lKXt2YXIgdD1jKGUpO2xbT2JqZWN0KHUuRCkoZSldPXQuZGVmYXVsdD90LmRlZmF1bHQ6dH19KSksdC5kZWZhdWx0PWx9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bi5yKHQpO3ZhciByPXt9O24ucihyKSxuLmQociwiSnNvblBhdGNoRXJyb3IiLChmdW5jdGlvbigpe3JldHVybiBCZX0pKSxuLmQociwiZGVlcENsb25lIiwoZnVuY3Rpb24oKXtyZXR1cm4gRmV9KSksbi5kKHIsImdldFZhbHVlQnlQb2ludGVyIiwoZnVuY3Rpb24oKXtyZXR1cm4gemV9KSksbi5kKHIsImFwcGx5T3BlcmF0aW9uIiwoZnVuY3Rpb24oKXtyZXR1cm4gVmV9KSksbi5kKHIsImFwcGx5UGF0Y2giLChmdW5jdGlvbigpe3JldHVybiBXZX0pKSxuLmQociwiYXBwbHlSZWR1Y2VyIiwoZnVuY3Rpb24oKXtyZXR1cm4gSGV9KSksbi5kKHIsInZhbGlkYXRvciIsKGZ1bmN0aW9uKCl7cmV0dXJuICRlfSkpLG4uZChyLCJ2YWxpZGF0ZSIsKGZ1bmN0aW9uKCl7cmV0dXJuIEplfSkpLG4uZChyLCJfYXJlRXF1YWxzIiwoZnVuY3Rpb24oKXtyZXR1cm4gS2V9KSk7dmFyIG89e307bi5yKG8pLG4uZChvLCJ1bm9ic2VydmUiLChmdW5jdGlvbigpe3JldHVybiBYZX0pKSxuLmQobywib2JzZXJ2ZSIsKGZ1bmN0aW9uKCl7cmV0dXJuIFFlfSkpLG4uZChvLCJnZW5lcmF0ZSIsKGZ1bmN0aW9uKCl7cmV0dXJuIGV0fSkpLG4uZChvLCJjb21wYXJlIiwoZnVuY3Rpb24oKXtyZXR1cm4gbnR9KSk7dmFyIGE9e307bi5yKGEpLG4uZChhLCJwYXRoIiwoZnVuY3Rpb24oKXtyZXR1cm4ga259KSksbi5kKGEsInF1ZXJ5IiwoZnVuY3Rpb24oKXtyZXR1cm4gam59KSksbi5kKGEsImhlYWRlciIsKGZ1bmN0aW9uKCl7cmV0dXJuIElufSkpLG4uZChhLCJjb29raWUiLChmdW5jdGlvbigpe3JldHVybiBQbn0pKTt2YXIgaT1uKDIpLHM9bi5uKGkpLHU9big3NSksYz1uLm4odSksbD1uKDM5KSxwPW4ubihsKSxmPW4oNDkpLGg9bi5uKGYpLGQ9bigxOCksbT1uLm4oZCksdj1uKDEzKSxnPW4ubih2KSx5PW4oMzEpLGI9bi5uKHkpLF89big4MSksdz1uLm4oXykseD1uKDEwMiksRT1uLm4oeCksUz1uKDMyKSxDPW4ubihTKSxBPW4oNCksTz1uLm4oQSksaz1uKDE1KSxqPW4ubihrKSxUPW4oMjEyKSxJPW4ubihUKSxQPW4oMTIpLE49bi5uKFApLE09KG4oNDkzKSxuKDIyMSkpLFI9bi5uKE0pLEQ9big3MyksTD1uKDk1KSxCPW4oMTQpLEY9bi5uKEIpLFU9bigxOSkscT1uLm4oVSksej1mdW5jdGlvbihlKXtyZXR1cm4iOi8/I1tdQCEkJicoKSorLDs9Ii5pbmRleE9mKGUpPi0xfSxWPWZ1bmN0aW9uKGUpe3JldHVybi9eW2EtejAtOVwtLl9+XSskL2kudGVzdChlKX07ZnVuY3Rpb24gVyhlKXt2YXIgdCxuPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fSxyPW4uZXNjYXBlLG89YXJndW1lbnRzLmxlbmd0aD4yP2FyZ3VtZW50c1syXTp2b2lkIDA7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlJiYoZT1lLnRvU3RyaW5nKCkpLCJzdHJpbmciPT10eXBlb2YgZSYmZS5sZW5ndGgmJnI/bz9KU09OLnBhcnNlKGUpOk8oKSh0PUYoKShlKSkuY2FsbCh0LChmdW5jdGlvbihlKXt2YXIgdCxuO2lmKFYoZSkpcmV0dXJuIGU7aWYoeihlKSYmInVuc2FmZSI9PT1yKXJldHVybiBlO3ZhciBvPW5ldyBUZXh0RW5jb2RlcjtyZXR1cm4gTygpKHQ9TygpKG49RSgpKG8uZW5jb2RlKGUpKSkuY2FsbChuLChmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gcSgpKHQ9IjAiLmNvbmNhdChlLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKSkuY2FsbCh0LC0yKX0pKSkuY2FsbCh0LChmdW5jdGlvbihlKXtyZXR1cm4iJSIuY29uY2F0KGUpfSkpLmpvaW4oIiIpfSkpLmpvaW4oIiIpOmV9ZnVuY3Rpb24gSChlKXt2YXIgdD1lLnZhbHVlO3JldHVybiBBcnJheS5pc0FycmF5KHQpP2Z1bmN0aW9uKGUpe3ZhciB0PWUua2V5LG49ZS52YWx1ZSxyPWUuc3R5bGUsbz1lLmV4cGxvZGUsYT1lLmVzY2FwZSxpPWZ1bmN0aW9uKGUpe3JldHVybiBXKGUse2VzY2FwZTphfSl9O2lmKCJzaW1wbGUiPT09cilyZXR1cm4gTygpKG4pLmNhbGwobiwoZnVuY3Rpb24oZSl7cmV0dXJuIGkoZSl9KSkuam9pbigiLCIpO2lmKCJsYWJlbCI9PT1yKXJldHVybiIuIi5jb25jYXQoTygpKG4pLmNhbGwobiwoZnVuY3Rpb24oZSl7cmV0dXJuIGkoZSl9KSkuam9pbigiLiIpKTtpZigibWF0cml4Ij09PXIpcmV0dXJuIE8oKShuKS5jYWxsKG4sKGZ1bmN0aW9uKGUpe3JldHVybiBpKGUpfSkpLnJlZHVjZSgoZnVuY3Rpb24oZSxuKXt2YXIgcixhLGk7cmV0dXJuIWV8fG8/cygpKGE9cygpKGk9IiIuY29uY2F0KGV8fCIiLCI7IikpLmNhbGwoaSx0LCI9IikpLmNhbGwoYSxuKTpzKCkocj0iIi5jb25jYXQoZSwiLCIpKS5jYWxsKHIsbil9KSwiIik7aWYoImZvcm0iPT09cil7dmFyIHU9bz8iJiIuY29uY2F0KHQsIj0iKToiLCI7cmV0dXJuIE8oKShuKS5jYWxsKG4sKGZ1bmN0aW9uKGUpe3JldHVybiBpKGUpfSkpLmpvaW4odSl9aWYoInNwYWNlRGVsaW1pdGVkIj09PXIpe3ZhciBjPW8/IiIuY29uY2F0KHQsIj0iKToiIjtyZXR1cm4gTygpKG4pLmNhbGwobiwoZnVuY3Rpb24oZSl7cmV0dXJuIGkoZSl9KSkuam9pbigiICIuY29uY2F0KGMpKX1pZigicGlwZURlbGltaXRlZCI9PT1yKXt2YXIgbD1vPyIiLmNvbmNhdCh0LCI9Iik6IiI7cmV0dXJuIE8oKShuKS5jYWxsKG4sKGZ1bmN0aW9uKGUpe3JldHVybiBpKGUpfSkpLmpvaW4oInwiLmNvbmNhdChsKSl9cmV0dXJufShlKToib2JqZWN0Ij09PW0oKSh0KT9mdW5jdGlvbihlKXt2YXIgdD1lLmtleSxuPWUudmFsdWUscj1lLnN0eWxlLG89ZS5leHBsb2RlLGE9ZS5lc2NhcGUsaT1mdW5jdGlvbihlKXtyZXR1cm4gVyhlLHtlc2NhcGU6YX0pfSx1PWooKShuKTtpZigic2ltcGxlIj09PXIpcmV0dXJuIHUucmVkdWNlKChmdW5jdGlvbihlLHQpe3ZhciByLGEsdSxjPWkoblt0XSksbD1vPyI9IjoiLCIscD1lPyIiLmNvbmNhdChlLCIsIik6IiI7cmV0dXJuIHMoKShyPXMoKShhPXMoKSh1PSIiLmNvbmNhdChwKSkuY2FsbCh1LHQpKS5jYWxsKGEsbCkpLmNhbGwocixjKX0pLCIiKTtpZigibGFiZWwiPT09cilyZXR1cm4gdS5yZWR1Y2UoKGZ1bmN0aW9uKGUsdCl7dmFyIHIsYSx1LGM9aShuW3RdKSxsPW8/Ij0iOiIuIixwPWU/IiIuY29uY2F0KGUsIi4iKToiLiI7cmV0dXJuIHMoKShyPXMoKShhPXMoKSh1PSIiLmNvbmNhdChwKSkuY2FsbCh1LHQpKS5jYWxsKGEsbCkpLmNhbGwocixjKX0pLCIiKTtpZigibWF0cml4Ij09PXImJm8pcmV0dXJuIHUucmVkdWNlKChmdW5jdGlvbihlLHQpe3ZhciByLG8sYT1pKG5bdF0pLHU9ZT8iIi5jb25jYXQoZSwiOyIpOiI7IjtyZXR1cm4gcygpKHI9cygpKG89IiIuY29uY2F0KHUpKS5jYWxsKG8sdCwiPSIpKS5jYWxsKHIsYSl9KSwiIik7aWYoIm1hdHJpeCI9PT1yKXJldHVybiB1LnJlZHVjZSgoZnVuY3Rpb24oZSxyKXt2YXIgbyxhLHU9aShuW3JdKSxjPWU/IiIuY29uY2F0KGUsIiwiKToiOyIuY29uY2F0KHQsIj0iKTtyZXR1cm4gcygpKG89cygpKGE9IiIuY29uY2F0KGMpKS5jYWxsKGEsciwiLCIpKS5jYWxsKG8sdSl9KSwiIik7aWYoImZvcm0iPT09cilyZXR1cm4gdS5yZWR1Y2UoKGZ1bmN0aW9uKGUsdCl7dmFyIHIsYSx1LGMsbD1pKG5bdF0pLHA9ZT9zKCkocj0iIi5jb25jYXQoZSkpLmNhbGwocixvPyImIjoiLCIpOiIiLGY9bz8iPSI6IiwiO3JldHVybiBzKCkoYT1zKCkodT1zKCkoYz0iIi5jb25jYXQocCkpLmNhbGwoYyx0KSkuY2FsbCh1LGYpKS5jYWxsKGEsbCl9KSwiIik7cmV0dXJufShlKTpmdW5jdGlvbihlKXt2YXIgdCxuPWUua2V5LHI9ZS52YWx1ZSxvPWUuc3R5bGUsYT1lLmVzY2FwZSxpPWZ1bmN0aW9uKGUpe3JldHVybiBXKGUse2VzY2FwZTphfSl9O2lmKCJzaW1wbGUiPT09bylyZXR1cm4gaShyKTtpZigibGFiZWwiPT09bylyZXR1cm4iLiIuY29uY2F0KGkocikpO2lmKCJtYXRyaXgiPT09bylyZXR1cm4gcygpKHQ9IjsiLmNvbmNhdChuLCI9IikpLmNhbGwodCxpKHIpKTtpZigiZm9ybSI9PT1vKXJldHVybiBpKHIpO2lmKCJkZWVwT2JqZWN0Ij09PW8pcmV0dXJuIGkocix7fSwhMCk7cmV0dXJufShlKX12YXIgJD1mdW5jdGlvbihlLHQpe3QuYm9keT1lfSxKPXtzZXJpYWxpemVSZXM6WCxtZXJnZUluUXVlcnlPckZvcm06Y2V9O2Z1bmN0aW9uIEsoZSl7cmV0dXJuIFkuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIFkoKXtyZXR1cm4oWT1jKCkocC5hLm1hcmsoKGZ1bmN0aW9uIGUodCl7dmFyIG4scixvLGEsaSxzPWFyZ3VtZW50cztyZXR1cm4gcC5hLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOmlmKG49cy5sZW5ndGg+MSYmdm9pZCAwIT09c1sxXT9zWzFdOnt9LCJvYmplY3QiPT09bSgpKHQpJiYodD0obj10KS51cmwpLG4uaGVhZGVycz1uLmhlYWRlcnN8fHt9LEoubWVyZ2VJblF1ZXJ5T3JGb3JtKG4pLG4uaGVhZGVycyYmaigpKG4uaGVhZGVycykuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHQ9bi5oZWFkZXJzW2VdOyJzdHJpbmciPT10eXBlb2YgdCYmKG4uaGVhZGVyc1tlXT10LnJlcGxhY2UoL1xuKy9nLCIgIikpfSkpLCFuLnJlcXVlc3RJbnRlcmNlcHRvcil7ZS5uZXh0PTEyO2JyZWFrfXJldHVybiBlLm5leHQ9OCxuLnJlcXVlc3RJbnRlcmNlcHRvcihuKTtjYXNlIDg6aWYoZS50MD1lLnNlbnQsZS50MCl7ZS5uZXh0PTExO2JyZWFrfWUudDA9bjtjYXNlIDExOm49ZS50MDtjYXNlIDEyOnJldHVybiByPW4uaGVhZGVyc1siY29udGVudC10eXBlIl18fG4uaGVhZGVyc1siQ29udGVudC1UeXBlIl0sL211bHRpcGFydFwvZm9ybS1kYXRhL2kudGVzdChyKSYmbi5ib2R5IGluc3RhbmNlb2YgTC5Gb3JtRGF0YSYmKGRlbGV0ZSBuLmhlYWRlcnNbImNvbnRlbnQtdHlwZSJdLGRlbGV0ZSBuLmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdKSxlLnByZXY9MTQsZS5uZXh0PTE3LChuLnVzZXJGZXRjaHx8ZmV0Y2gpKG4udXJsLG4pO2Nhc2UgMTc6cmV0dXJuIG89ZS5zZW50LGUubmV4dD0yMCxKLnNlcmlhbGl6ZVJlcyhvLHQsbik7Y2FzZSAyMDppZihvPWUuc2VudCwhbi5yZXNwb25zZUludGVyY2VwdG9yKXtlLm5leHQ9Mjg7YnJlYWt9cmV0dXJuIGUubmV4dD0yNCxuLnJlc3BvbnNlSW50ZXJjZXB0b3Iobyk7Y2FzZSAyNDppZihlLnQxPWUuc2VudCxlLnQxKXtlLm5leHQ9Mjc7YnJlYWt9ZS50MT1vO2Nhc2UgMjc6bz1lLnQxO2Nhc2UgMjg6ZS5uZXh0PTM5O2JyZWFrO2Nhc2UgMzA6aWYoZS5wcmV2PTMwLGUudDI9ZS5jYXRjaCgxNCksbyl7ZS5uZXh0PTM0O2JyZWFrfXRocm93IGUudDI7Y2FzZSAzNDp0aHJvdyhhPW5ldyBFcnJvcihvLnN0YXR1c1RleHR8fCJyZXNwb25zZSBzdGF0dXMgaXMgIi5jb25jYXQoby5zdGF0dXMpKSkuc3RhdHVzPW8uc3RhdHVzLGEuc3RhdHVzQ29kZT1vLnN0YXR1cyxhLnJlc3BvbnNlRXJyb3I9ZS50MixhO2Nhc2UgMzk6aWYoby5vayl7ZS5uZXh0PTQ1O2JyZWFrfXRocm93KGk9bmV3IEVycm9yKG8uc3RhdHVzVGV4dHx8InJlc3BvbnNlIHN0YXR1cyBpcyAiLmNvbmNhdChvLnN0YXR1cykpKS5zdGF0dXM9by5zdGF0dXMsaS5zdGF0dXNDb2RlPW8uc3RhdHVzLGkucmVzcG9uc2U9byxpO2Nhc2UgNDU6cmV0dXJuIGUuYWJydXB0KCJyZXR1cm4iLG8pO2Nhc2UgNDY6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlLG51bGwsW1sxNCwzMF1dKX0pKSkpLmFwcGx5KHRoaXMsYXJndW1lbnRzKX12YXIgRz1mdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXToiIjtyZXR1cm4vKGpzb258eG1sfHlhbWx8dGV4dClcYi8udGVzdChlKX07ZnVuY3Rpb24gWihlLHQpe3JldHVybiB0JiYoMD09PXQuaW5kZXhPZigiYXBwbGljYXRpb24vanNvbiIpfHx0LmluZGV4T2YoIitqc29uIik+MCk/SlNPTi5wYXJzZShlKTpELmEubG9hZChlKX1mdW5jdGlvbiBYKGUsdCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LHI9bi5sb2FkU3BlYyxvPXZvaWQgMCE9PXImJnIsYT17b2s6ZS5vayx1cmw6ZS51cmx8fHQsc3RhdHVzOmUuc3RhdHVzLHN0YXR1c1RleHQ6ZS5zdGF0dXNUZXh0LGhlYWRlcnM6ZWUoZS5oZWFkZXJzKX0saT1hLmhlYWRlcnNbImNvbnRlbnQtdHlwZSJdLHM9b3x8RyhpKSx1PXM/ZS50ZXh0OmUuYmxvYnx8ZS5idWZmZXI7cmV0dXJuIHUuY2FsbChlKS50aGVuKChmdW5jdGlvbihlKXtpZihhLnRleHQ9ZSxhLmRhdGE9ZSxzKXRyeXt2YXIgdD1aKGUsaSk7YS5ib2R5PXQsYS5vYmo9dH1jYXRjaChlKXthLnBhcnNlRXJyb3I9ZX1yZXR1cm4gYX0pKX1mdW5jdGlvbiBRKGUpe3JldHVybiBiKCkoZSkuY2FsbChlLCIsICIpP2Uuc3BsaXQoIiwgIik6ZX1mdW5jdGlvbiBlZSgpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdygpKGUpP3t9OkUoKSh3KCkoZSkuY2FsbChlKSkucmVkdWNlKChmdW5jdGlvbihlLHQpe3ZhciBuPWcoKSh0LDIpLHI9blswXSxvPW5bMV07cmV0dXJuIGVbcl09UShvKSxlfSkse30pfWZ1bmN0aW9uIHRlKGUsdCl7cmV0dXJuIHR8fCJ1bmRlZmluZWQiPT10eXBlb2YgbmF2aWdhdG9yfHwodD1uYXZpZ2F0b3IpLHQmJiJSZWFjdE5hdGl2ZSI9PT10LnByb2R1Y3Q/ISghZXx8Im9iamVjdCIhPT1tKCkoZSl8fCJzdHJpbmciIT10eXBlb2YgZS51cmkpOnZvaWQgMCE9PUwuRmlsZSYmZSBpbnN0YW5jZW9mIEwuRmlsZXx8KHZvaWQgMCE9PUwuQmxvYiYmZSBpbnN0YW5jZW9mIEwuQmxvYnx8KCEhQXJyYXlCdWZmZXIuaXNWaWV3KGUpfHxudWxsIT09ZSYmIm9iamVjdCI9PT1tKCkoZSkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnBpcGUpKX1mdW5jdGlvbiBuZShlLHQpe3JldHVybiBBcnJheS5pc0FycmF5KGUpJiZlLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiB0ZShlLHQpfSkpfXZhciByZT17Zm9ybToiLCIsc3BhY2VEZWxpbWl0ZWQ6IiUyMCIscGlwZURlbGltaXRlZDoifCJ9LG9lPXtjc3Y6IiwiLHNzdjoiJTIwIix0c3Y6IiUwOSIscGlwZXM6InwifTtmdW5jdGlvbiBhZShlLHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl0scj10LmNvbGxlY3Rpb25Gb3JtYXQsbz10LmFsbG93RW1wdHlWYWx1ZSxhPXQuc2VyaWFsaXphdGlvbk9wdGlvbixpPXQuZW5jb2Rpbmcscz0ib2JqZWN0IiE9PW0oKSh0KXx8QXJyYXkuaXNBcnJheSh0KT90OnQudmFsdWUsdT1uP2Z1bmN0aW9uKGUpe3JldHVybiBlLnRvU3RyaW5nKCl9OmZ1bmN0aW9uKGUpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoZSl9LGM9dShlKTtpZih2b2lkIDA9PT1zJiZvKXJldHVybltbYywiIl1dO2lmKHRlKHMpfHxuZShzKSlyZXR1cm5bW2Msc11dO2lmKGEpcmV0dXJuIGllKGUscyxuLGEpO2lmKGkpe2lmKFttKCkoaS5zdHlsZSksbSgpKGkuZXhwbG9kZSksbSgpKGkuYWxsb3dSZXNlcnZlZCldLnNvbWUoKGZ1bmN0aW9uKGUpe3JldHVybiJ1bmRlZmluZWQiIT09ZX0pKSl7dmFyIGw9aS5zdHlsZSxwPWkuZXhwbG9kZSxmPWkuYWxsb3dSZXNlcnZlZDtyZXR1cm4gaWUoZSxzLG4se3N0eWxlOmwsZXhwbG9kZTpwLGFsbG93UmVzZXJ2ZWQ6Zn0pfWlmKGkuY29udGVudFR5cGUpe2lmKCJhcHBsaWNhdGlvbi9qc29uIj09PWkuY29udGVudFR5cGUpe3ZhciBoPSJzdHJpbmciPT10eXBlb2Ygcz9zOkMoKShzKTtyZXR1cm5bW2MsdShoKV1dfXJldHVybltbYyx1KHMudG9TdHJpbmcoKSldXX1yZXR1cm4ib2JqZWN0IiE9PW0oKShzKT9bW2MsdShzKV1dOkFycmF5LmlzQXJyYXkocykmJnMuZXZlcnkoKGZ1bmN0aW9uKGUpe3JldHVybiJvYmplY3QiIT09bSgpKGUpfSkpP1tbYyxPKCkocykuY2FsbChzLHUpLmpvaW4oIiwiKV1dOltbYyx1KEMoKShzKSldXX1yZXR1cm4ib2JqZWN0IiE9PW0oKShzKT9bW2MsdShzKV1dOkFycmF5LmlzQXJyYXkocyk/Im11bHRpIj09PXI/W1tjLE8oKShzKS5jYWxsKHMsdSldXTpbW2MsTygpKHMpLmNhbGwocyx1KS5qb2luKG9lW3J8fCJjc3YiXSldXTpbW2MsIiJdXX1mdW5jdGlvbiBpZShlLHQsbixyKXt2YXIgbyxhLGksdT1yLnN0eWxlfHwiZm9ybSIsYz12b2lkIDA9PT1yLmV4cGxvZGU/ImZvcm0iPT09dTpyLmV4cGxvZGUsbD0hbiYmKHImJnIuYWxsb3dSZXNlcnZlZD8idW5zYWZlIjoicmVzZXJ2ZWQiKSxwPWZ1bmN0aW9uKGUpe3JldHVybiBXKGUse2VzY2FwZTpsfSl9LGY9bj9mdW5jdGlvbihlKXtyZXR1cm4gZX06ZnVuY3Rpb24oZSl7cmV0dXJuIFcoZSx7ZXNjYXBlOmx9KX07cmV0dXJuIm9iamVjdCIhPT1tKCkodCk/W1tmKGUpLHAodCldXTpBcnJheS5pc0FycmF5KHQpP2M/W1tmKGUpLE8oKSh0KS5jYWxsKHQscCldXTpbW2YoZSksTygpKHQpLmNhbGwodCxwKS5qb2luKHJlW3VdKV1dOiJkZWVwT2JqZWN0Ij09PXU/TygpKGE9aigpKHQpKS5jYWxsKGEsKGZ1bmN0aW9uKG4pe3ZhciByO3JldHVybltmKHMoKShyPSIiLmNvbmNhdChlLCJbIikpLmNhbGwocixuLCJdIikpLHAodFtuXSldfSkpOmM/TygpKGk9aigpKHQpKS5jYWxsKGksKGZ1bmN0aW9uKGUpe3JldHVybltmKGUpLHAodFtlXSldfSkpOltbZihlKSxPKCkobz1qKCkodCkpLmNhbGwobywoZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuW3MoKShuPSIiLmNvbmNhdChmKGUpLCIsIikpLmNhbGwobixwKHRbZV0pKV19KSkuam9pbigiLCIpXV19ZnVuY3Rpb24gc2UoZSl7cmV0dXJuIEkoKShlKS5yZWR1Y2UoKGZ1bmN0aW9uKGUsdCl7dmFyIG4scj1nKCkodCwyKSxvPXJbMF0sYT1yWzFdLGk9aCgpKGFlKG8sYSwhMCkpO3RyeXtmb3IoaS5zKCk7IShuPWkubigpKS5kb25lOyl7dmFyIHM9ZygpKG4udmFsdWUsMiksdT1zWzBdLGM9c1sxXTtpZihBcnJheS5pc0FycmF5KGMpKXt2YXIgbCxwPWgoKShjKTt0cnl7Zm9yKHAucygpOyEobD1wLm4oKSkuZG9uZTspe3ZhciBmPWwudmFsdWU7aWYoQXJyYXlCdWZmZXIuaXNWaWV3KGYpKXt2YXIgZD1uZXcgTC5CbG9iKFtmXSk7ZS5hcHBlbmQodSxkKX1lbHNlIGUuYXBwZW5kKHUsZil9fWNhdGNoKGUpe3AuZShlKX1maW5hbGx5e3AuZigpfX1lbHNlIGlmKEFycmF5QnVmZmVyLmlzVmlldyhjKSl7dmFyIG09bmV3IEwuQmxvYihbY10pO2UuYXBwZW5kKHUsbSl9ZWxzZSBlLmFwcGVuZCh1LGMpfX1jYXRjaChlKXtpLmUoZSl9ZmluYWxseXtpLmYoKX1yZXR1cm4gZX0pLG5ldyBMLkZvcm1EYXRhKX1mdW5jdGlvbiB1ZShlKXt2YXIgdD1qKCkoZSkucmVkdWNlKChmdW5jdGlvbih0LG4pe3ZhciByLG89aCgpKGFlKG4sZVtuXSkpO3RyeXtmb3Ioby5zKCk7IShyPW8ubigpKS5kb25lOyl7dmFyIGE9ZygpKHIudmFsdWUsMiksaT1hWzBdLHM9YVsxXTt0W2ldPXN9fWNhdGNoKGUpe28uZShlKX1maW5hbGx5e28uZigpfXJldHVybiB0fSkse30pO3JldHVybiBSLmEuc3RyaW5naWZ5KHQse2VuY29kZTohMSxpbmRpY2VzOiExfSl8fCIifWZ1bmN0aW9uIGNlKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9LHQ9ZS51cmwsbj12b2lkIDA9PT10PyIiOnQscj1lLnF1ZXJ5LG89ZS5mb3JtLGE9ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTt2YXIgcj1OKCkodCkuY2FsbCh0LChmdW5jdGlvbihlKXtyZXR1cm4gZX0pKS5qb2luKCImIik7cmV0dXJuIHI/Ij8iLmNvbmNhdChyKToiIn07aWYobyl7dmFyIGk9aigpKG8pLnNvbWUoKGZ1bmN0aW9uKGUpe3ZhciB0PW9bZV0udmFsdWU7cmV0dXJuIHRlKHQpfHxuZSh0KX0pKSxzPWUuaGVhZGVyc1siY29udGVudC10eXBlIl18fGUuaGVhZGVyc1siQ29udGVudC1UeXBlIl07aWYoaXx8L211bHRpcGFydFwvZm9ybS1kYXRhL2kudGVzdChzKSl7dmFyIHU9c2UoZS5mb3JtKTskKHUsZSl9ZWxzZSBlLmJvZHk9dWUobyk7ZGVsZXRlIGUuZm9ybX1pZihyKXt2YXIgYz1uLnNwbGl0KCI/IiksbD1nKCkoYywyKSxwPWxbMF0sZj1sWzFdLGg9IiI7aWYoZil7dmFyIGQ9Ui5hLnBhcnNlKGYpLG09aigpKHIpO20uZm9yRWFjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIGRlbGV0ZSBkW2VdfSkpLGg9Ui5hLnN0cmluZ2lmeShkLHtlbmNvZGU6ITB9KX12YXIgdj1hKGgsdWUocikpO2UudXJsPXArdixkZWxldGUgZS5xdWVyeX1yZXR1cm4gZX12YXIgbGUscGU9bigyNCksZmU9bi5uKHBlKSxoZT1uKDYpLGRlPW4ubihoZSksbWU9big3KSx2ZT1uLm4obWUpLGdlPW4oMjApLHllPW4ubihnZSksYmU9big1OCksX2U9bi5uKGJlKSx3ZT1uKDY1KSx4ZT1uLm4od2UpLEVlPW4oMjEzKSxTZT1uLm4oRWUpLENlPW4oMyksQWU9bi5uKENlKSxPZT0obGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4obGU9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKGUsdCl7ZS5fX3Byb3RvX189dH18fGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShuKSYmKGVbbl09dFtuXSl9KShlLHQpfSxmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPWV9bGUoZSx0KSxlLnByb3RvdHlwZT1udWxsPT09dD9PYmplY3QuY3JlYXRlKHQpOihuLnByb3RvdHlwZT10LnByb3RvdHlwZSxuZXcgbil9KSxrZT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIGplKGUsdCl7cmV0dXJuIGtlLmNhbGwoZSx0KX1mdW5jdGlvbiBUZShlKXtpZihBcnJheS5pc0FycmF5KGUpKXtmb3IodmFyIHQ9bmV3IEFycmF5KGUubGVuZ3RoKSxuPTA7bjx0Lmxlbmd0aDtuKyspdFtuXT0iIituO3JldHVybiB0fWlmKE9iamVjdC5rZXlzKXJldHVybiBPYmplY3Qua2V5cyhlKTt0PVtdO2Zvcih2YXIgciBpbiBlKWplKGUscikmJnQucHVzaChyKTtyZXR1cm4gdH1mdW5jdGlvbiBJZShlKXtzd2l0Y2godHlwZW9mIGUpe2Nhc2Uib2JqZWN0IjpyZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlKSk7Y2FzZSJ1bmRlZmluZWQiOnJldHVybiBudWxsO2RlZmF1bHQ6cmV0dXJuIGV9fWZ1bmN0aW9uIFBlKGUpe2Zvcih2YXIgdCxuPTAscj1lLmxlbmd0aDtuPHI7KXtpZighKCh0PWUuY2hhckNvZGVBdChuKSk+PTQ4JiZ0PD01NykpcmV0dXJuITE7bisrfXJldHVybiEwfWZ1bmN0aW9uIE5lKGUpe3JldHVybi0xPT09ZS5pbmRleE9mKCIvIikmJi0xPT09ZS5pbmRleE9mKCJ+Iik/ZTplLnJlcGxhY2UoL34vZywifjAiKS5yZXBsYWNlKC9cLy9nLCJ+MSIpfWZ1bmN0aW9uIE1lKGUpe3JldHVybiBlLnJlcGxhY2UoL34xL2csIi8iKS5yZXBsYWNlKC9+MC9nLCJ+Iil9ZnVuY3Rpb24gUmUoZSl7aWYodm9pZCAwPT09ZSlyZXR1cm4hMDtpZihlKWlmKEFycmF5LmlzQXJyYXkoZSkpe2Zvcih2YXIgdD0wLG49ZS5sZW5ndGg7dDxuO3QrKylpZihSZShlW3RdKSlyZXR1cm4hMH1lbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgZSl7dmFyIHI9VGUoZSksbz1yLmxlbmd0aDtmb3IodD0wO3Q8bzt0KyspaWYoUmUoZVtyW3RdXSkpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gRGUoZSx0KXt2YXIgbj1bZV07Zm9yKHZhciByIGluIHQpe3ZhciBvPSJvYmplY3QiPT10eXBlb2YgdFtyXT9KU09OLnN0cmluZ2lmeSh0W3JdLG51bGwsMik6dFtyXTt2b2lkIDAhPT1vJiZuLnB1c2gocisiOiAiK28pfXJldHVybiBuLmpvaW4oIlxuIil9dmFyIExlPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCxuLHIsbyxhKXt2YXIgaT10aGlzLmNvbnN0cnVjdG9yLHM9ZS5jYWxsKHRoaXMsRGUodCx7bmFtZTpuLGluZGV4OnIsb3BlcmF0aW9uOm8sdHJlZTphfSkpfHx0aGlzO3JldHVybiBzLm5hbWU9bixzLmluZGV4PXIscy5vcGVyYXRpb249byxzLnRyZWU9YSxPYmplY3Quc2V0UHJvdG90eXBlT2YocyxpLnByb3RvdHlwZSkscy5tZXNzYWdlPURlKHQse25hbWU6bixpbmRleDpyLG9wZXJhdGlvbjpvLHRyZWU6YX0pLHN9cmV0dXJuIE9lKHQsZSksdH0oRXJyb3IpLEJlPUxlLEZlPUllLFVlPXthZGQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlW3RdPXRoaXMudmFsdWUse25ld0RvY3VtZW50Om59fSxyZW1vdmU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWVbdF07cmV0dXJuIGRlbGV0ZSBlW3RdLHtuZXdEb2N1bWVudDpuLHJlbW92ZWQ6cn19LHJlcGxhY2U6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWVbdF07cmV0dXJuIGVbdF09dGhpcy52YWx1ZSx7bmV3RG9jdW1lbnQ6bixyZW1vdmVkOnJ9fSxtb3ZlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj16ZShuLHRoaXMucGF0aCk7ciYmKHI9SWUocikpO3ZhciBvPVZlKG4se29wOiJyZW1vdmUiLHBhdGg6dGhpcy5mcm9tfSkucmVtb3ZlZDtyZXR1cm4gVmUobix7b3A6ImFkZCIscGF0aDp0aGlzLnBhdGgsdmFsdWU6b30pLHtuZXdEb2N1bWVudDpuLHJlbW92ZWQ6cn19LGNvcHk6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXplKG4sdGhpcy5mcm9tKTtyZXR1cm4gVmUobix7b3A6ImFkZCIscGF0aDp0aGlzLnBhdGgsdmFsdWU6SWUocil9KSx7bmV3RG9jdW1lbnQ6bn19LHRlc3Q6ZnVuY3Rpb24oZSx0LG4pe3JldHVybntuZXdEb2N1bWVudDpuLHRlc3Q6S2UoZVt0XSx0aGlzLnZhbHVlKX19LF9nZXQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLnZhbHVlPWVbdF0se25ld0RvY3VtZW50Om59fX0scWU9e2FkZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIFBlKHQpP2Uuc3BsaWNlKHQsMCx0aGlzLnZhbHVlKTplW3RdPXRoaXMudmFsdWUse25ld0RvY3VtZW50Om4saW5kZXg6dH19LHJlbW92ZTpmdW5jdGlvbihlLHQsbil7cmV0dXJue25ld0RvY3VtZW50Om4scmVtb3ZlZDplLnNwbGljZSh0LDEpWzBdfX0scmVwbGFjZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZVt0XTtyZXR1cm4gZVt0XT10aGlzLnZhbHVlLHtuZXdEb2N1bWVudDpuLHJlbW92ZWQ6cn19LG1vdmU6VWUubW92ZSxjb3B5OlVlLmNvcHksdGVzdDpVZS50ZXN0LF9nZXQ6VWUuX2dldH07ZnVuY3Rpb24gemUoZSx0KXtpZigiIj09dClyZXR1cm4gZTt2YXIgbj17b3A6Il9nZXQiLHBhdGg6dH07cmV0dXJuIFZlKGUsbiksbi52YWx1ZX1mdW5jdGlvbiBWZShlLHQsbixyLG8sYSl7aWYodm9pZCAwPT09biYmKG49ITEpLHZvaWQgMD09PXImJihyPSEwKSx2b2lkIDA9PT1vJiYobz0hMCksdm9pZCAwPT09YSYmKGE9MCksbiYmKCJmdW5jdGlvbiI9PXR5cGVvZiBuP24odCwwLGUsdC5wYXRoKTokZSh0LDApKSwiIj09PXQucGF0aCl7dmFyIGk9e25ld0RvY3VtZW50OmV9O2lmKCJhZGQiPT09dC5vcClyZXR1cm4gaS5uZXdEb2N1bWVudD10LnZhbHVlLGk7aWYoInJlcGxhY2UiPT09dC5vcClyZXR1cm4gaS5uZXdEb2N1bWVudD10LnZhbHVlLGkucmVtb3ZlZD1lLGk7aWYoIm1vdmUiPT09dC5vcHx8ImNvcHkiPT09dC5vcClyZXR1cm4gaS5uZXdEb2N1bWVudD16ZShlLHQuZnJvbSksIm1vdmUiPT09dC5vcCYmKGkucmVtb3ZlZD1lKSxpO2lmKCJ0ZXN0Ij09PXQub3Ape2lmKGkudGVzdD1LZShlLHQudmFsdWUpLCExPT09aS50ZXN0KXRocm93IG5ldyBCZSgiVGVzdCBvcGVyYXRpb24gZmFpbGVkIiwiVEVTVF9PUEVSQVRJT05fRkFJTEVEIixhLHQsZSk7cmV0dXJuIGkubmV3RG9jdW1lbnQ9ZSxpfWlmKCJyZW1vdmUiPT09dC5vcClyZXR1cm4gaS5yZW1vdmVkPWUsaS5uZXdEb2N1bWVudD1udWxsLGk7aWYoIl9nZXQiPT09dC5vcClyZXR1cm4gdC52YWx1ZT1lLGk7aWYobil0aHJvdyBuZXcgQmUoIk9wZXJhdGlvbiBgb3BgIHByb3BlcnR5IGlzIG5vdCBvbmUgb2Ygb3BlcmF0aW9ucyBkZWZpbmVkIGluIFJGQy02OTAyIiwiT1BFUkFUSU9OX09QX0lOVkFMSUQiLGEsdCxlKTtyZXR1cm4gaX1yfHwoZT1JZShlKSk7dmFyIHM9KHQucGF0aHx8IiIpLnNwbGl0KCIvIiksdT1lLGM9MSxsPXMubGVuZ3RoLHA9dm9pZCAwLGY9dm9pZCAwLGg9dm9pZCAwO2ZvcihoPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246JGU7Oyl7aWYoKGY9c1tjXSkmJi0xIT1mLmluZGV4T2YoIn4iKSYmKGY9TWUoZikpLG8mJiJfX3Byb3RvX18iPT1mKXRocm93IG5ldyBUeXBlRXJyb3IoIkpTT04tUGF0Y2g6IG1vZGlmeWluZyBgX19wcm90b19fYCBwcm9wIGlzIGJhbm5lZCBmb3Igc2VjdXJpdHkgcmVhc29ucywgaWYgdGhpcyB3YXMgb24gcHVycG9zZSwgcGxlYXNlIHNldCBgYmFuUHJvdG90eXBlTW9kaWZpY2F0aW9uc2AgZmxhZyBmYWxzZSBhbmQgcGFzcyBpdCB0byB0aGlzIGZ1bmN0aW9uLiBNb3JlIGluZm8gaW4gZmFzdC1qc29uLXBhdGNoIFJFQURNRSIpO2lmKG4mJnZvaWQgMD09PXAmJih2b2lkIDA9PT11W2ZdP3A9cy5zbGljZSgwLGMpLmpvaW4oIi8iKTpjPT1sLTEmJihwPXQucGF0aCksdm9pZCAwIT09cCYmaCh0LDAsZSxwKSksYysrLEFycmF5LmlzQXJyYXkodSkpe2lmKCItIj09PWYpZj11Lmxlbmd0aDtlbHNle2lmKG4mJiFQZShmKSl0aHJvdyBuZXcgQmUoIkV4cGVjdGVkIGFuIHVuc2lnbmVkIGJhc2UtMTAgaW50ZWdlciB2YWx1ZSwgbWFraW5nIHRoZSBuZXcgcmVmZXJlbmNlZCB2YWx1ZSB0aGUgYXJyYXkgZWxlbWVudCB3aXRoIHRoZSB6ZXJvLWJhc2VkIGluZGV4IiwiT1BFUkFUSU9OX1BBVEhfSUxMRUdBTF9BUlJBWV9JTkRFWCIsYSx0LGUpO1BlKGYpJiYoZj1+fmYpfWlmKGM+PWwpe2lmKG4mJiJhZGQiPT09dC5vcCYmZj51Lmxlbmd0aCl0aHJvdyBuZXcgQmUoIlRoZSBzcGVjaWZpZWQgaW5kZXggTVVTVCBOT1QgYmUgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5IiwiT1BFUkFUSU9OX1ZBTFVFX09VVF9PRl9CT1VORFMiLGEsdCxlKTtpZighMT09PShpPXFlW3Qub3BdLmNhbGwodCx1LGYsZSkpLnRlc3QpdGhyb3cgbmV3IEJlKCJUZXN0IG9wZXJhdGlvbiBmYWlsZWQiLCJURVNUX09QRVJBVElPTl9GQUlMRUQiLGEsdCxlKTtyZXR1cm4gaX19ZWxzZSBpZihjPj1sKXtpZighMT09PShpPVVlW3Qub3BdLmNhbGwodCx1LGYsZSkpLnRlc3QpdGhyb3cgbmV3IEJlKCJUZXN0IG9wZXJhdGlvbiBmYWlsZWQiLCJURVNUX09QRVJBVElPTl9GQUlMRUQiLGEsdCxlKTtyZXR1cm4gaX1pZih1PXVbZl0sbiYmYzxsJiYoIXV8fCJvYmplY3QiIT10eXBlb2YgdSkpdGhyb3cgbmV3IEJlKCJDYW5ub3QgcGVyZm9ybSBvcGVyYXRpb24gYXQgdGhlIGRlc2lyZWQgcGF0aCIsIk9QRVJBVElPTl9QQVRIX1VOUkVTT0xWQUJMRSIsYSx0LGUpfX1mdW5jdGlvbiBXZShlLHQsbixyLG8pe2lmKHZvaWQgMD09PXImJihyPSEwKSx2b2lkIDA9PT1vJiYobz0hMCksbiYmIUFycmF5LmlzQXJyYXkodCkpdGhyb3cgbmV3IEJlKCJQYXRjaCBzZXF1ZW5jZSBtdXN0IGJlIGFuIGFycmF5IiwiU0VRVUVOQ0VfTk9UX0FOX0FSUkFZIik7cnx8KGU9SWUoZSkpO2Zvcih2YXIgYT1uZXcgQXJyYXkodC5sZW5ndGgpLGk9MCxzPXQubGVuZ3RoO2k8cztpKyspYVtpXT1WZShlLHRbaV0sbiwhMCxvLGkpLGU9YVtpXS5uZXdEb2N1bWVudDtyZXR1cm4gYS5uZXdEb2N1bWVudD1lLGF9ZnVuY3Rpb24gSGUoZSx0LG4pe3ZhciByPVZlKGUsdCk7aWYoITE9PT1yLnRlc3QpdGhyb3cgbmV3IEJlKCJUZXN0IG9wZXJhdGlvbiBmYWlsZWQiLCJURVNUX09QRVJBVElPTl9GQUlMRUQiLG4sdCxlKTtyZXR1cm4gci5uZXdEb2N1bWVudH1mdW5jdGlvbiAkZShlLHQsbixyKXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lfHxBcnJheS5pc0FycmF5KGUpKXRocm93IG5ldyBCZSgiT3BlcmF0aW9uIGlzIG5vdCBhbiBvYmplY3QiLCJPUEVSQVRJT05fTk9UX0FOX09CSkVDVCIsdCxlLG4pO2lmKCFVZVtlLm9wXSl0aHJvdyBuZXcgQmUoIk9wZXJhdGlvbiBgb3BgIHByb3BlcnR5IGlzIG5vdCBvbmUgb2Ygb3BlcmF0aW9ucyBkZWZpbmVkIGluIFJGQy02OTAyIiwiT1BFUkFUSU9OX09QX0lOVkFMSUQiLHQsZSxuKTtpZigic3RyaW5nIiE9dHlwZW9mIGUucGF0aCl0aHJvdyBuZXcgQmUoIk9wZXJhdGlvbiBgcGF0aGAgcHJvcGVydHkgaXMgbm90IGEgc3RyaW5nIiwiT1BFUkFUSU9OX1BBVEhfSU5WQUxJRCIsdCxlLG4pO2lmKDAhPT1lLnBhdGguaW5kZXhPZigiLyIpJiZlLnBhdGgubGVuZ3RoPjApdGhyb3cgbmV3IEJlKCdPcGVyYXRpb24gYHBhdGhgIHByb3BlcnR5IG11c3Qgc3RhcnQgd2l0aCAiLyInLCJPUEVSQVRJT05fUEFUSF9JTlZBTElEIix0LGUsbik7aWYoKCJtb3ZlIj09PWUub3B8fCJjb3B5Ij09PWUub3ApJiYic3RyaW5nIiE9dHlwZW9mIGUuZnJvbSl0aHJvdyBuZXcgQmUoIk9wZXJhdGlvbiBgZnJvbWAgcHJvcGVydHkgaXMgbm90IHByZXNlbnQgKGFwcGxpY2FibGUgaW4gYG1vdmVgIGFuZCBgY29weWAgb3BlcmF0aW9ucykiLCJPUEVSQVRJT05fRlJPTV9SRVFVSVJFRCIsdCxlLG4pO2lmKCgiYWRkIj09PWUub3B8fCJyZXBsYWNlIj09PWUub3B8fCJ0ZXN0Ij09PWUub3ApJiZ2b2lkIDA9PT1lLnZhbHVlKXRocm93IG5ldyBCZSgiT3BlcmF0aW9uIGB2YWx1ZWAgcHJvcGVydHkgaXMgbm90IHByZXNlbnQgKGFwcGxpY2FibGUgaW4gYGFkZGAsIGByZXBsYWNlYCBhbmQgYHRlc3RgIG9wZXJhdGlvbnMpIiwiT1BFUkFUSU9OX1ZBTFVFX1JFUVVJUkVEIix0LGUsbik7aWYoKCJhZGQiPT09ZS5vcHx8InJlcGxhY2UiPT09ZS5vcHx8InRlc3QiPT09ZS5vcCkmJlJlKGUudmFsdWUpKXRocm93IG5ldyBCZSgiT3BlcmF0aW9uIGB2YWx1ZWAgcHJvcGVydHkgaXMgbm90IHByZXNlbnQgKGFwcGxpY2FibGUgaW4gYGFkZGAsIGByZXBsYWNlYCBhbmQgYHRlc3RgIG9wZXJhdGlvbnMpIiwiT1BFUkFUSU9OX1ZBTFVFX0NBTk5PVF9DT05UQUlOX1VOREVGSU5FRCIsdCxlLG4pO2lmKG4paWYoImFkZCI9PWUub3Ape3ZhciBvPWUucGF0aC5zcGxpdCgiLyIpLmxlbmd0aCxhPXIuc3BsaXQoIi8iKS5sZW5ndGg7aWYobyE9PWErMSYmbyE9PWEpdGhyb3cgbmV3IEJlKCJDYW5ub3QgcGVyZm9ybSBhbiBgYWRkYCBvcGVyYXRpb24gYXQgdGhlIGRlc2lyZWQgcGF0aCIsIk9QRVJBVElPTl9QQVRIX0NBTk5PVF9BREQiLHQsZSxuKX1lbHNlIGlmKCJyZXBsYWNlIj09PWUub3B8fCJyZW1vdmUiPT09ZS5vcHx8Il9nZXQiPT09ZS5vcCl7aWYoZS5wYXRoIT09cil0aHJvdyBuZXcgQmUoIkNhbm5vdCBwZXJmb3JtIHRoZSBvcGVyYXRpb24gYXQgYSBwYXRoIHRoYXQgZG9lcyBub3QgZXhpc3QiLCJPUEVSQVRJT05fUEFUSF9VTlJFU09MVkFCTEUiLHQsZSxuKX1lbHNlIGlmKCJtb3ZlIj09PWUub3B8fCJjb3B5Ij09PWUub3Ape3ZhciBpPUplKFt7b3A6Il9nZXQiLHBhdGg6ZS5mcm9tLHZhbHVlOnZvaWQgMH1dLG4pO2lmKGkmJiJPUEVSQVRJT05fUEFUSF9VTlJFU09MVkFCTEUiPT09aS5uYW1lKXRocm93IG5ldyBCZSgiQ2Fubm90IHBlcmZvcm0gdGhlIG9wZXJhdGlvbiBmcm9tIGEgcGF0aCB0aGF0IGRvZXMgbm90IGV4aXN0IiwiT1BFUkFUSU9OX0ZST01fVU5SRVNPTFZBQkxFIix0LGUsbil9fWZ1bmN0aW9uIEplKGUsdCxuKXt0cnl7aWYoIUFycmF5LmlzQXJyYXkoZSkpdGhyb3cgbmV3IEJlKCJQYXRjaCBzZXF1ZW5jZSBtdXN0IGJlIGFuIGFycmF5IiwiU0VRVUVOQ0VfTk9UX0FOX0FSUkFZIik7aWYodClXZShJZSh0KSxJZShlKSxufHwhMCk7ZWxzZXtuPW58fCRlO2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKW4oZVtyXSxyLHQsdm9pZCAwKX19Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIEJlKXJldHVybiBlO3Rocm93IGV9fWZ1bmN0aW9uIEtlKGUsdCl7aWYoZT09PXQpcmV0dXJuITA7aWYoZSYmdCYmIm9iamVjdCI9PXR5cGVvZiBlJiYib2JqZWN0Ij09dHlwZW9mIHQpe3ZhciBuLHIsbyxhPUFycmF5LmlzQXJyYXkoZSksaT1BcnJheS5pc0FycmF5KHQpO2lmKGEmJmkpe2lmKChyPWUubGVuZ3RoKSE9dC5sZW5ndGgpcmV0dXJuITE7Zm9yKG49cjswIT1uLS07KWlmKCFLZShlW25dLHRbbl0pKXJldHVybiExO3JldHVybiEwfWlmKGEhPWkpcmV0dXJuITE7dmFyIHM9T2JqZWN0LmtleXMoZSk7aWYoKHI9cy5sZW5ndGgpIT09T2JqZWN0LmtleXModCkubGVuZ3RoKXJldHVybiExO2ZvcihuPXI7MCE9bi0tOylpZighdC5oYXNPd25Qcm9wZXJ0eShzW25dKSlyZXR1cm4hMTtmb3Iobj1yOzAhPW4tLTspaWYoIUtlKGVbbz1zW25dXSx0W29dKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4gZSE9ZSYmdCE9dH12YXIgWWU9bmV3IFdlYWtNYXAsR2U9ZnVuY3Rpb24oZSl7dGhpcy5vYnNlcnZlcnM9bmV3IE1hcCx0aGlzLm9iaj1lfSxaZT1mdW5jdGlvbihlLHQpe3RoaXMuY2FsbGJhY2s9ZSx0aGlzLm9ic2VydmVyPXR9O2Z1bmN0aW9uIFhlKGUsdCl7dC51bm9ic2VydmUoKX1mdW5jdGlvbiBRZShlLHQpe3ZhciBuLHI9ZnVuY3Rpb24oZSl7cmV0dXJuIFllLmdldChlKX0oZSk7aWYocil7dmFyIG89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5vYnNlcnZlcnMuZ2V0KHQpfShyLHQpO249byYmby5vYnNlcnZlcn1lbHNlIHI9bmV3IEdlKGUpLFllLnNldChlLHIpO2lmKG4pcmV0dXJuIG47aWYobj17fSxyLnZhbHVlPUllKGUpLHQpe24uY2FsbGJhY2s9dCxuLm5leHQ9bnVsbDt2YXIgYT1mdW5jdGlvbigpe2V0KG4pfSxpPWZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KG4ubmV4dCksbi5uZXh0PXNldFRpbWVvdXQoYSl9OyJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYod2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLGkpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsaSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsaSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGkpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLGkpKX1yZXR1cm4gbi5wYXRjaGVzPVtdLG4ub2JqZWN0PWUsbi51bm9ic2VydmU9ZnVuY3Rpb24oKXtldChuKSxjbGVhclRpbWVvdXQobi5uZXh0KSxmdW5jdGlvbihlLHQpe2Uub2JzZXJ2ZXJzLmRlbGV0ZSh0LmNhbGxiYWNrKX0ocixuKSwidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmKHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIixpKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5dXAiLGkpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLGkpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixpKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlIixpKSl9LHIub2JzZXJ2ZXJzLnNldCh0LG5ldyBaZSh0LG4pKSxufWZ1bmN0aW9uIGV0KGUsdCl7dm9pZCAwPT09dCYmKHQ9ITEpO3ZhciBuPVllLmdldChlLm9iamVjdCk7dHQobi52YWx1ZSxlLm9iamVjdCxlLnBhdGNoZXMsIiIsdCksZS5wYXRjaGVzLmxlbmd0aCYmV2Uobi52YWx1ZSxlLnBhdGNoZXMpO3ZhciByPWUucGF0Y2hlcztyZXR1cm4gci5sZW5ndGg+MCYmKGUucGF0Y2hlcz1bXSxlLmNhbGxiYWNrJiZlLmNhbGxiYWNrKHIpKSxyfWZ1bmN0aW9uIHR0KGUsdCxuLHIsbyl7aWYodCE9PWUpeyJmdW5jdGlvbiI9PXR5cGVvZiB0LnRvSlNPTiYmKHQ9dC50b0pTT04oKSk7Zm9yKHZhciBhPVRlKHQpLGk9VGUoZSkscz0hMSx1PWkubGVuZ3RoLTE7dT49MDt1LS0pe3ZhciBjPWVbcD1pW3VdXTtpZighamUodCxwKXx8dm9pZCAwPT09dFtwXSYmdm9pZCAwIT09YyYmITE9PT1BcnJheS5pc0FycmF5KHQpKUFycmF5LmlzQXJyYXkoZSk9PT1BcnJheS5pc0FycmF5KHQpPyhvJiZuLnB1c2goe29wOiJ0ZXN0IixwYXRoOnIrIi8iK05lKHApLHZhbHVlOkllKGMpfSksbi5wdXNoKHtvcDoicmVtb3ZlIixwYXRoOnIrIi8iK05lKHApfSkscz0hMCk6KG8mJm4ucHVzaCh7b3A6InRlc3QiLHBhdGg6cix2YWx1ZTplfSksbi5wdXNoKHtvcDoicmVwbGFjZSIscGF0aDpyLHZhbHVlOnR9KSwhMCk7ZWxzZXt2YXIgbD10W3BdOyJvYmplY3QiPT10eXBlb2YgYyYmbnVsbCE9YyYmIm9iamVjdCI9PXR5cGVvZiBsJiZudWxsIT1sJiZBcnJheS5pc0FycmF5KGMpPT09QXJyYXkuaXNBcnJheShsKT90dChjLGwsbixyKyIvIitOZShwKSxvKTpjIT09bCYmKCEwLG8mJm4ucHVzaCh7b3A6InRlc3QiLHBhdGg6cisiLyIrTmUocCksdmFsdWU6SWUoYyl9KSxuLnB1c2goe29wOiJyZXBsYWNlIixwYXRoOnIrIi8iK05lKHApLHZhbHVlOkllKGwpfSkpfX1pZihzfHxhLmxlbmd0aCE9aS5sZW5ndGgpZm9yKHU9MDt1PGEubGVuZ3RoO3UrKyl7dmFyIHA7amUoZSxwPWFbdV0pfHx2b2lkIDA9PT10W3BdfHxuLnB1c2goe29wOiJhZGQiLHBhdGg6cisiLyIrTmUocCksdmFsdWU6SWUodFtwXSl9KX19fWZ1bmN0aW9uIG50KGUsdCxuKXt2b2lkIDA9PT1uJiYobj0hMSk7dmFyIHI9W107cmV0dXJuIHR0KGUsdCxyLCIiLG4pLHJ9T2JqZWN0LmFzc2lnbih7fSxyLG8se0pzb25QYXRjaEVycm9yOkxlLGRlZXBDbG9uZTpJZSxlc2NhcGVQYXRoQ29tcG9uZW50Ok5lLHVuZXNjYXBlUGF0aENvbXBvbmVudDpNZX0pO3ZhciBydD1uKDgwKSxvdD1uLm4ocnQpLGF0PW4oNTI1KSxpdD1uLm4oYXQpLHN0PXthZGQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm57b3A6ImFkZCIscGF0aDplLHZhbHVlOnR9fSxyZXBsYWNlOmN0LHJlbW92ZTpmdW5jdGlvbihlKXtyZXR1cm57b3A6InJlbW92ZSIscGF0aDplfX0sbWVyZ2U6ZnVuY3Rpb24oZSx0KXtyZXR1cm57dHlwZToibXV0YXRpb24iLG9wOiJtZXJnZSIscGF0aDplLHZhbHVlOnR9fSxtZXJnZURlZXA6ZnVuY3Rpb24oZSx0KXtyZXR1cm57dHlwZToibXV0YXRpb24iLG9wOiJtZXJnZURlZXAiLHBhdGg6ZSx2YWx1ZTp0fX0sY29udGV4dDpmdW5jdGlvbihlLHQpe3JldHVybnt0eXBlOiJjb250ZXh0IixwYXRoOmUsdmFsdWU6dH19LGdldEluOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQucmVkdWNlKChmdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDAhPT10JiZlP2VbdF06ZX0pLGUpfSxhcHBseVBhdGNoOmZ1bmN0aW9uKGUsdCxuKXtpZihuPW58fHt9LCJtZXJnZSI9PT0odD1mZSgpKGZlKCkoe30sdCkse30se3BhdGg6dC5wYXRoJiZ1dCh0LnBhdGgpfSkpLm9wKXt2YXIgcj14dChlLHQucGF0aCk7eWUoKShyLHQudmFsdWUpLFdlKGUsW2N0KHQucGF0aCxyKV0pfWVsc2UgaWYoIm1lcmdlRGVlcCI9PT10Lm9wKXt2YXIgbz14dChlLHQucGF0aCk7Zm9yKHZhciBhIGluIHQudmFsdWUpe3ZhciBpPXQudmFsdWVbYV0sdT1BcnJheS5pc0FycmF5KGkpO2lmKHUpe3ZhciBjPW9bYV18fFtdO29bYV09cygpKGMpLmNhbGwoYyxpKX1lbHNlIGlmKHZ0KGkpJiYhdSl7dmFyIGw9ZmUoKSh7fSxvW2FdKTtmb3IodmFyIHAgaW4gaSl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGwscCkpe2w9b3QoKShpdCgpKGwpLGkpO2JyZWFrfXllKCkobCxBZSgpKHt9LHAsaVtwXSkpfW9bYV09bH1lbHNlIG9bYV09aX19ZWxzZSBpZigiYWRkIj09PXQub3AmJiIiPT09dC5wYXRoJiZ2dCh0LnZhbHVlKSl7dmFyIGY9aigpKHQudmFsdWUpLnJlZHVjZSgoZnVuY3Rpb24oZSxuKXtyZXR1cm4gZS5wdXNoKHtvcDoiYWRkIixwYXRoOiIvIi5jb25jYXQodXQobikpLHZhbHVlOnQudmFsdWVbbl19KSxlfSksW10pO1dlKGUsZil9ZWxzZSBpZigicmVwbGFjZSI9PT10Lm9wJiYiIj09PXQucGF0aCl7dmFyIGg9dC52YWx1ZTtuLmFsbG93TWV0YVBhdGNoZXMmJnQubWV0YSYmX3QodCkmJihBcnJheS5pc0FycmF5KHQudmFsdWUpfHx2dCh0LnZhbHVlKSkmJihoPWZlKCkoZmUoKSh7fSxoKSx0Lm1ldGEpKSxlPWh9ZWxzZSBpZihXZShlLFt0XSksbi5hbGxvd01ldGFQYXRjaGVzJiZ0Lm1ldGEmJl90KHQpJiYoQXJyYXkuaXNBcnJheSh0LnZhbHVlKXx8dnQodC52YWx1ZSkpKXt2YXIgZD14dChlLHQucGF0aCksbT1mZSgpKGZlKCkoe30sZCksdC5tZXRhKTtXZShlLFtjdCh0LnBhdGgsbSldKX1yZXR1cm4gZX0scGFyZW50UGF0aE1hdGNoOmZ1bmN0aW9uKGUsdCl7aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuITE7Zm9yKHZhciBuPTAscj10Lmxlbmd0aDtuPHI7bis9MSlpZih0W25dIT09ZVtuXSlyZXR1cm4hMTtyZXR1cm4hMH0sZmxhdHRlbjpkdCxmdWxseU5vcm1hbGl6ZUFycmF5OmZ1bmN0aW9uKGUpe3JldHVybiBtdChkdChodChlKSkpfSxub3JtYWxpemVBcnJheTpodCxpc1Byb21pc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIHZ0KGUpJiZndChlLnRoZW4pfSxmb3JFYWNoTmV3OmZ1bmN0aW9uKGUsdCl7dHJ5e3JldHVybiBsdChlLGZ0LHQpfWNhdGNoKGUpe3JldHVybiBlfX0sZm9yRWFjaE5ld1ByaW1pdGl2ZTpmdW5jdGlvbihlLHQpe3RyeXtyZXR1cm4gbHQoZSxwdCx0KX1jYXRjaChlKXtyZXR1cm4gZX19LGlzSnNvblBhdGNoOnl0LGlzQ29udGV4dFBhdGNoOmZ1bmN0aW9uKGUpe3JldHVybiB3dChlKSYmImNvbnRleHQiPT09ZS50eXBlfSxpc1BhdGNoOnd0LGlzTXV0YXRpb246YnQsaXNBZGRpdGl2ZU11dGF0aW9uOl90LGlzR2VuZXJhdG9yOmZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9LGlzRnVuY3Rpb246Z3QsaXNPYmplY3Q6dnQsaXNFcnJvcjpmdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEVycm9yfX07ZnVuY3Rpb24gdXQoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZS5sZW5ndGg8MT8iIjoiLyIuY29uY2F0KE8oKShlKS5jYWxsKGUsKGZ1bmN0aW9uKGUpe3JldHVybihlKyIiKS5yZXBsYWNlKC9+L2csIn4wIikucmVwbGFjZSgvXC8vZywifjEiKX0pKS5qb2luKCIvIikpOmV9ZnVuY3Rpb24gY3QoZSx0LG4pe3JldHVybntvcDoicmVwbGFjZSIscGF0aDplLHZhbHVlOnQsbWV0YTpufX1mdW5jdGlvbiBsdChlLHQsbil7dmFyIHI7cmV0dXJuIG10KGR0KE8oKShyPU4oKShlKS5jYWxsKGUsX3QpKS5jYWxsKHIsKGZ1bmN0aW9uKGUpe3JldHVybiB0KGUudmFsdWUsbixlLnBhdGgpfSkpfHxbXSkpfWZ1bmN0aW9uIHB0KGUsdCxuKXtyZXR1cm4gbj1ufHxbXSxBcnJheS5pc0FycmF5KGUpP08oKShlKS5jYWxsKGUsKGZ1bmN0aW9uKGUscil7cmV0dXJuIHB0KGUsdCxzKCkobikuY2FsbChuLHIpKX0pKTp2dChlKT9PKCkocj1qKCkoZSkpLmNhbGwociwoZnVuY3Rpb24ocil7cmV0dXJuIHB0KGVbcl0sdCxzKCkobikuY2FsbChuLHIpKX0pKTp0KGUsbltuLmxlbmd0aC0xXSxuKTt2YXIgcn1mdW5jdGlvbiBmdChlLHQsbil7dmFyIHI9W107aWYoKG49bnx8W10pLmxlbmd0aD4wKXt2YXIgbz10KGUsbltuLmxlbmd0aC0xXSxuKTtvJiYocj1zKCkocikuY2FsbChyLG8pKX1pZihBcnJheS5pc0FycmF5KGUpKXt2YXIgYT1PKCkoZSkuY2FsbChlLChmdW5jdGlvbihlLHIpe3JldHVybiBmdChlLHQscygpKG4pLmNhbGwobixyKSl9KSk7YSYmKHI9cygpKHIpLmNhbGwocixhKSl9ZWxzZSBpZih2dChlKSl7dmFyIGksdT1PKCkoaT1qKCkoZSkpLmNhbGwoaSwoZnVuY3Rpb24ocil7cmV0dXJuIGZ0KGVbcl0sdCxzKCkobikuY2FsbChuLHIpKX0pKTt1JiYocj1zKCkocikuY2FsbChyLHUpKX1yZXR1cm4gcj1kdChyKX1mdW5jdGlvbiBodChlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lOltlXX1mdW5jdGlvbiBkdChlKXt2YXIgdDtyZXR1cm4gcygpKHQ9W10pLmFwcGx5KHQsRigpKE8oKShlKS5jYWxsKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2R0KGUpOmV9KSkpKX1mdW5jdGlvbiBtdChlKXtyZXR1cm4gTigpKGUpLmNhbGwoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMCE9PWV9KSl9ZnVuY3Rpb24gdnQoZSl7cmV0dXJuIGUmJiJvYmplY3QiPT09bSgpKGUpfWZ1bmN0aW9uIGd0KGUpe3JldHVybiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgZX1mdW5jdGlvbiB5dChlKXtpZih3dChlKSl7dmFyIHQ9ZS5vcDtyZXR1cm4iYWRkIj09PXR8fCJyZW1vdmUiPT09dHx8InJlcGxhY2UiPT09dH1yZXR1cm4hMX1mdW5jdGlvbiBidChlKXtyZXR1cm4geXQoZSl8fHd0KGUpJiYibXV0YXRpb24iPT09ZS50eXBlfWZ1bmN0aW9uIF90KGUpe3JldHVybiBidChlKSYmKCJhZGQiPT09ZS5vcHx8InJlcGxhY2UiPT09ZS5vcHx8Im1lcmdlIj09PWUub3B8fCJtZXJnZURlZXAiPT09ZS5vcCl9ZnVuY3Rpb24gd3QoZSl7cmV0dXJuIGUmJiJvYmplY3QiPT09bSgpKGUpfWZ1bmN0aW9uIHh0KGUsdCl7dHJ5e3JldHVybiB6ZShlLHQpfWNhdGNoKGUpe3JldHVybiBjb25zb2xlLmVycm9yKGUpLHt9fX12YXIgRXQ9bigyMTQpLFN0PW4ubihFdCksQ3Q9bigzNTMpLEF0PW4ubihDdCksT3Q9big4Miksa3Q9bi5uKE90KTtmdW5jdGlvbiBqdChlLHQpe2Z1bmN0aW9uIG4oKXtFcnJvci5jYXB0dXJlU3RhY2tUcmFjZT9FcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLHRoaXMuY29uc3RydWN0b3IpOnRoaXMuc3RhY2s9KG5ldyBFcnJvcikuc3RhY2s7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsbj1uZXcgQXJyYXkoZSkscj0wO3I8ZTtyKyspbltyXT1hcmd1bWVudHNbcl07dGhpcy5tZXNzYWdlPW5bMF0sdCYmdC5hcHBseSh0aGlzLG4pfXJldHVybiBuLnByb3RvdHlwZT1uZXcgRXJyb3Isbi5wcm90b3R5cGUubmFtZT1lLG4ucHJvdG90eXBlLmNvbnN0cnVjdG9yPW4sbn12YXIgVHQ9big1MjYpLEl0PW4ubihUdCksUHQ9WyJwcm9wZXJ0aWVzIl0sTnQ9WyJwcm9wZXJ0aWVzIl0sTXQ9WyJkZWZpbml0aW9ucyIsInBhcmFtZXRlcnMiLCJyZXNwb25zZXMiLCJzZWN1cml0eURlZmluaXRpb25zIiwiY29tcG9uZW50cy9zY2hlbWFzIiwiY29tcG9uZW50cy9yZXNwb25zZXMiLCJjb21wb25lbnRzL3BhcmFtZXRlcnMiLCJjb21wb25lbnRzL3NlY3VyaXR5U2NoZW1lcyJdLFJ0PVsic2NoZW1hL2V4YW1wbGUiLCJpdGVtcy9leGFtcGxlIl07ZnVuY3Rpb24gRHQoZSl7dmFyIHQ9ZVtlLmxlbmd0aC0xXSxuPWVbZS5sZW5ndGgtMl0scj1lLmpvaW4oIi8iKTtyZXR1cm4gUHQuaW5kZXhPZih0KT4tMSYmLTE9PT1OdC5pbmRleE9mKG4pfHxNdC5pbmRleE9mKHIpPi0xfHxSdC5zb21lKChmdW5jdGlvbihlKXtyZXR1cm4gci5pbmRleE9mKGUpPi0xfSkpfWZ1bmN0aW9uIEx0KGUsdCl7dmFyIG4scj1lLnNwbGl0KCIjIiksbz1nKCkociwyKSxhPW9bMF0saT1vWzFdLHU9a3QuYS5yZXNvbHZlKGF8fCIiLHR8fCIiKTtyZXR1cm4gaT9zKCkobj0iIi5jb25jYXQodSwiIyIpKS5jYWxsKG4saSk6dX12YXIgQnQ9ImFwcGxpY2F0aW9uL2pzb24sIGFwcGxpY2F0aW9uL3lhbWwiLEZ0PW5ldyBSZWdFeHAoIl4oW2Etel0rOi8vfC8vKSIsImkiKSxVdD1qdCgiSlNPTlJlZkVycm9yIiwoZnVuY3Rpb24oZSx0LG4pe3RoaXMub3JpZ2luYWxFcnJvcj1uLHllKCkodGhpcyx0fHx7fSl9KSkscXQ9e30senQ9bmV3IFN0LmEsVnQ9W2Z1bmN0aW9uKGUpe3JldHVybiJwYXRocyI9PT1lWzBdJiYicmVzcG9uc2VzIj09PWVbM10mJiJleGFtcGxlcyI9PT1lWzVdfSxmdW5jdGlvbihlKXtyZXR1cm4icGF0aHMiPT09ZVswXSYmInJlc3BvbnNlcyI9PT1lWzNdJiYiY29udGVudCI9PT1lWzVdJiYiZXhhbXBsZSI9PT1lWzddfSxmdW5jdGlvbihlKXtyZXR1cm4icGF0aHMiPT09ZVswXSYmInJlc3BvbnNlcyI9PT1lWzNdJiYiY29udGVudCI9PT1lWzVdJiYiZXhhbXBsZXMiPT09ZVs3XSYmInZhbHVlIj09PWVbOV19LGZ1bmN0aW9uKGUpe3JldHVybiJwYXRocyI9PT1lWzBdJiYicmVxdWVzdEJvZHkiPT09ZVszXSYmImNvbnRlbnQiPT09ZVs0XSYmImV4YW1wbGUiPT09ZVs2XX0sZnVuY3Rpb24oZSl7cmV0dXJuInBhdGhzIj09PWVbMF0mJiJyZXF1ZXN0Qm9keSI9PT1lWzNdJiYiY29udGVudCI9PT1lWzRdJiYiZXhhbXBsZXMiPT09ZVs2XSYmInZhbHVlIj09PWVbOF19LGZ1bmN0aW9uKGUpe3JldHVybiJwYXRocyI9PT1lWzBdJiYicGFyYW1ldGVycyI9PT1lWzJdJiYiZXhhbXBsZSI9PT1lWzRdfSxmdW5jdGlvbihlKXtyZXR1cm4icGF0aHMiPT09ZVswXSYmInBhcmFtZXRlcnMiPT09ZVszXSYmImV4YW1wbGUiPT09ZVs1XX0sZnVuY3Rpb24oZSl7cmV0dXJuInBhdGhzIj09PWVbMF0mJiJwYXJhbWV0ZXJzIj09PWVbMl0mJiJleGFtcGxlcyI9PT1lWzRdJiYidmFsdWUiPT09ZVs2XX0sZnVuY3Rpb24oZSl7cmV0dXJuInBhdGhzIj09PWVbMF0mJiJwYXJhbWV0ZXJzIj09PWVbM10mJiJleGFtcGxlcyI9PT1lWzVdJiYidmFsdWUiPT09ZVs3XX0sZnVuY3Rpb24oZSl7cmV0dXJuInBhdGhzIj09PWVbMF0mJiJwYXJhbWV0ZXJzIj09PWVbMl0mJiJjb250ZW50Ij09PWVbNF0mJiJleGFtcGxlIj09PWVbNl19LGZ1bmN0aW9uKGUpe3JldHVybiJwYXRocyI9PT1lWzBdJiYicGFyYW1ldGVycyI9PT1lWzJdJiYiY29udGVudCI9PT1lWzRdJiYiZXhhbXBsZXMiPT09ZVs2XSYmInZhbHVlIj09PWVbOF19LGZ1bmN0aW9uKGUpe3JldHVybiJwYXRocyI9PT1lWzBdJiYicGFyYW1ldGVycyI9PT1lWzNdJiYiY29udGVudCI9PT1lWzRdJiYiZXhhbXBsZSI9PT1lWzddfSxmdW5jdGlvbihlKXtyZXR1cm4icGF0aHMiPT09ZVswXSYmInBhcmFtZXRlcnMiPT09ZVszXSYmImNvbnRlbnQiPT09ZVs1XSYmImV4YW1wbGVzIj09PWVbN10mJiJ2YWx1ZSI9PT1lWzldfV0sV3Q9e2tleToiJHJlZiIscGx1Z2luOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPXIuZ2V0SW5zdGFuY2UoKSxhPXEoKShuKS5jYWxsKG4sMCwtMSk7aWYoIUR0KGEpJiYoaT1hLCFWdC5zb21lKChmdW5jdGlvbihlKXtyZXR1cm4gZShpKX0pKSkpe3ZhciBpLHU9ci5nZXRDb250ZXh0KG4pLmJhc2VEb2M7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBuZXcgVXQoIiRyZWY6IG11c3QgYmUgYSBzdHJpbmcgKEpTT04tUmVmKSIseyRyZWY6ZSxiYXNlRG9jOnUsZnVsbFBhdGg6bn0pO3ZhciBjLGwscCxmPVl0KGUpLGg9ZlswXSxkPWZbMV18fCIiO3RyeXtjPXV8fGg/SnQoaCx1KTpudWxsfWNhdGNoKHQpe3JldHVybiBLdCh0LHtwb2ludGVyOmQsJHJlZjplLGJhc2VQYXRoOmMsZnVsbFBhdGg6bn0pfWlmKGZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvLGEsaT16dC5nZXQocik7aXx8KGk9e30senQuc2V0KHIsaSkpO3ZhciB1PWZ1bmN0aW9uKGUpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4iIjtyZXR1cm4iLyIuY29uY2F0KE8oKShlKS5jYWxsKGUsdG4pLmpvaW4oIi8iKSl9KG4pLGM9cygpKG89IiIuY29uY2F0KHR8fCI8c3BlY21hcC1iYXNlPiIsIiMiKSkuY2FsbChvLGUpLGw9dS5yZXBsYWNlKC9hbGxPZlwvXGQrXC8/L2csIiIpLHA9ci5jb250ZXh0VHJlZS5nZXQoW10pLmJhc2VEb2M7aWYodD09PXAmJm5uKGwsZSkpcmV0dXJuITA7dmFyIGY9IiI7aWYobi5zb21lKChmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gZj1zKCkodD0iIi5jb25jYXQoZiwiLyIpKS5jYWxsKHQsdG4oZSkpLGlbZl0mJmlbZl0uc29tZSgoZnVuY3Rpb24oZSl7cmV0dXJuIG5uKGUsYyl8fG5uKGMsZSl9KSl9KSkpcmV0dXJuITA7cmV0dXJuIHZvaWQoaVtsXT1zKCkoYT1pW2xdfHxbXSkuY2FsbChhLGMpKX0oZCxjLGEscikmJiFvLnVzZUNpcmN1bGFyU3RydWN0dXJlcyl7dmFyIG09THQoZSxjKTtyZXR1cm4gZT09PW0/bnVsbDpzdC5yZXBsYWNlKG4sbSl9aWYobnVsbD09Yz8ocD1RdChkKSx2b2lkIDA9PT0obD1yLmdldChwKSkmJihsPW5ldyBVdCgiQ291bGQgbm90IHJlc29sdmUgcmVmZXJlbmNlOiAiLmNvbmNhdChlKSx7cG9pbnRlcjpkLCRyZWY6ZSxiYXNlRG9jOnUsZnVsbFBhdGg6bn0pKSk6bD1udWxsIT0obD1HdChjLGQpKS5fX3ZhbHVlP2wuX192YWx1ZTpsLmNhdGNoKChmdW5jdGlvbih0KXt0aHJvdyBLdCh0LHtwb2ludGVyOmQsJHJlZjplLGJhc2VEb2M6dSxmdWxsUGF0aDpufSl9KSksbCBpbnN0YW5jZW9mIEVycm9yKXJldHVybltzdC5yZW1vdmUobiksbF07dmFyIHY9THQoZSxjKSxnPXN0LnJlcGxhY2UoYSxsLHskJHJlZjp2fSk7aWYoYyYmYyE9PXUpcmV0dXJuW2csc3QuY29udGV4dChhLHtiYXNlRG9jOmN9KV07dHJ5e2lmKCFmdW5jdGlvbihlLHQpe3ZhciBuPVtlXTtyZXR1cm4gdC5wYXRoLnJlZHVjZSgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gbi5wdXNoKGVbdF0pLGVbdF19KSxlKSxyKHQudmFsdWUpO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIHN0LmlzT2JqZWN0KGUpJiYobi5pbmRleE9mKGUpPj0wfHxqKCkoZSkuc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIHIoZVt0XSl9KSkpfX0oci5zdGF0ZSxnKXx8by51c2VDaXJjdWxhclN0cnVjdHVyZXMpcmV0dXJuIGd9Y2F0Y2goZSl7cmV0dXJuIG51bGx9fX19LEh0PXllKCkoV3Qse2RvY0NhY2hlOnF0LGFic29sdXRlaWZ5Okp0LGNsZWFyQ2FjaGU6ZnVuY3Rpb24oZSl7dm9pZCAwIT09ZT9kZWxldGUgcXRbZV06aigpKHF0KS5mb3JFYWNoKChmdW5jdGlvbihlKXtkZWxldGUgcXRbZV19KSl9LEpTT05SZWZFcnJvcjpVdCx3cmFwRXJyb3I6S3QsZ2V0RG9jOlp0LHNwbGl0Oll0LGV4dHJhY3RGcm9tRG9jOkd0LGZldGNoSlNPTjpmdW5jdGlvbihlKXtyZXR1cm4gZmV0Y2goZSx7aGVhZGVyczp7QWNjZXB0OkJ0fSxsb2FkU3BlYzohMH0pLnRoZW4oKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRleHQoKX0pKS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4gRC5hLmxvYWQoZSl9KSl9LGV4dHJhY3Q6WHQsanNvblBvaW50ZXJUb0FycmF5OlF0LHVuZXNjYXBlSnNvblBvaW50ZXJUb2tlbjplbn0pLCR0PUh0O2Z1bmN0aW9uIEp0KGUsdCl7aWYoIUZ0LnRlc3QoZSkpe3ZhciBuO2lmKCF0KXRocm93IG5ldyBVdChzKCkobj0iVHJpZWQgdG8gcmVzb2x2ZSBhIHJlbGF0aXZlIFVSTCwgd2l0aG91dCBoYXZpbmcgYSBiYXNlUGF0aC4gcGF0aDogJyIuY29uY2F0KGUsIicgYmFzZVBhdGg6ICciKSkuY2FsbChuLHQsIiciKSk7cmV0dXJuIGt0LmEucmVzb2x2ZSh0LGUpfXJldHVybiBlfWZ1bmN0aW9uIEt0KGUsdCl7dmFyIG4scjtlJiZlLnJlc3BvbnNlJiZlLnJlc3BvbnNlLmJvZHk/bj1zKCkocj0iIi5jb25jYXQoZS5yZXNwb25zZS5ib2R5LmNvZGUsIiAiKSkuY2FsbChyLGUucmVzcG9uc2UuYm9keS5tZXNzYWdlKTpuPWUubWVzc2FnZTtyZXR1cm4gbmV3IFV0KCJDb3VsZCBub3QgcmVzb2x2ZSByZWZlcmVuY2U6ICIuY29uY2F0KG4pLHQsZSl9ZnVuY3Rpb24gWXQoZSl7cmV0dXJuKGUrIiIpLnNwbGl0KCIjIil9ZnVuY3Rpb24gR3QoZSx0KXt2YXIgbj1xdFtlXTtpZihuJiYhc3QuaXNQcm9taXNlKG4pKXRyeXt2YXIgcj1YdCh0LG4pO3JldHVybiB5ZSgpKHhlLmEucmVzb2x2ZShyKSx7X192YWx1ZTpyfSl9Y2F0Y2goZSl7cmV0dXJuIHhlLmEucmVqZWN0KGUpfXJldHVybiBadChlKS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4gWHQodCxlKX0pKX1mdW5jdGlvbiBadChlKXt2YXIgdD1xdFtlXTtyZXR1cm4gdD9zdC5pc1Byb21pc2UodCk/dDp4ZS5hLnJlc29sdmUodCk6KHF0W2VdPUh0LmZldGNoSlNPTihlKS50aGVuKChmdW5jdGlvbih0KXtyZXR1cm4gcXRbZV09dCx0fSkpLHF0W2VdKX1mdW5jdGlvbiBYdChlLHQpe3ZhciBuPVF0KGUpO2lmKG4ubGVuZ3RoPDEpcmV0dXJuIHQ7dmFyIHI9c3QuZ2V0SW4odCxuKTtpZih2b2lkIDA9PT1yKXRocm93IG5ldyBVdCgiQ291bGQgbm90IHJlc29sdmUgcG9pbnRlcjogIi5jb25jYXQoZSwiIGRvZXMgbm90IGV4aXN0IGluIGRvY3VtZW50Iikse3BvaW50ZXI6ZX0pO3JldHVybiByfWZ1bmN0aW9uIFF0KGUpe3ZhciB0O2lmKCJzdHJpbmciIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCBhIHN0cmluZywgZ290IGEgIi5jb25jYXQobSgpKGUpKSk7cmV0dXJuIi8iPT09ZVswXSYmKGU9ZS5zdWJzdHIoMSkpLCIiPT09ZT9bXTpPKCkodD1lLnNwbGl0KCIvIikpLmNhbGwodCxlbil9ZnVuY3Rpb24gZW4oZSl7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBlP2U6bmV3IEF0LmEoIj0iLmNvbmNhdChlLnJlcGxhY2UoL34xL2csIi8iKS5yZXBsYWNlKC9+MC9nLCJ+IikpKS5nZXQoIiIpfWZ1bmN0aW9uIHRuKGUpe3ZhciB0LG49bmV3IEF0LmEoW1siIixlLnJlcGxhY2UoL34vZywifjAiKS5yZXBsYWNlKC9cLy9nLCJ+MSIpXV0pO3JldHVybiBxKCkodD1uLnRvU3RyaW5nKCkpLmNhbGwodCwxKX1mdW5jdGlvbiBubihlLHQpe2lmKCEobj10KXx8Ii8iPT09bnx8IiMiPT09bilyZXR1cm4hMDt2YXIgbixyPWUuY2hhckF0KHQubGVuZ3RoKSxvPXEoKSh0KS5jYWxsKHQsLTEpO3JldHVybiAwPT09ZS5pbmRleE9mKHQpJiYoIXJ8fCIvIj09PXJ8fCIjIj09PXIpJiYiIyIhPT1vfXZhciBybj1uKDEwNiksb249bi5uKHJuKSxhbj17a2V5OiJhbGxPZiIscGx1Z2luOmZ1bmN0aW9uKGUsdCxuLHIsbyl7aWYoIW8ubWV0YXx8IW8ubWV0YS4kJHJlZil7dmFyIGE9cSgpKG4pLmNhbGwobiwwLC0xKTtpZighRHQoYSkpe2lmKCFBcnJheS5pc0FycmF5KGUpKXt2YXIgaT1uZXcgVHlwZUVycm9yKCJhbGxPZiBtdXN0IGJlIGFuIGFycmF5Iik7cmV0dXJuIGkuZnVsbFBhdGg9bixpfXZhciB1PSExLGM9by52YWx1ZTtpZihhLmZvckVhY2goKGZ1bmN0aW9uKGUpe2MmJihjPWNbZV0pfSkpLGM9ZmUoKSh7fSxjKSwhb24oKShjKSl7ZGVsZXRlIGMuYWxsT2Y7dmFyIGwscD1bXTtpZihwLnB1c2goci5yZXBsYWNlKGEse30pKSxlLmZvckVhY2goKGZ1bmN0aW9uKGUsdCl7aWYoIXIuaXNPYmplY3QoZSkpe2lmKHUpcmV0dXJuIG51bGw7dT0hMDt2YXIgbz1uZXcgVHlwZUVycm9yKCJFbGVtZW50cyBpbiBhbGxPZiBtdXN0IGJlIG9iamVjdHMiKTtyZXR1cm4gby5mdWxsUGF0aD1uLHAucHVzaChvKX1wLnB1c2goci5tZXJnZURlZXAoYSxlKSk7dmFyIGk9ZnVuY3Rpb24oZSx0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e30scj1uLnNwZWNtYXAsbz1uLmdldEJhc2VVcmxGb3JOb2RlUGF0aCxhPXZvaWQgMD09PW8/ZnVuY3Rpb24oZSl7dmFyIG47cmV0dXJuIHIuZ2V0Q29udGV4dChzKCkobj1bXSkuY2FsbChuLEYoKSh0KSxGKCkoZSkpKS5iYXNlRG9jfTpvLGk9bi50YXJnZXRLZXlzLHU9dm9pZCAwPT09aT9bIiRyZWYiLCIkJHJlZiJdOmksYz1bXTtyZXR1cm4gSXQoKShlKS5mb3JFYWNoKChmdW5jdGlvbigpe2lmKGIoKSh1KS5jYWxsKHUsdGhpcy5rZXkpJiYic3RyaW5nIj09dHlwZW9mIHRoaXMubm9kZSl7dmFyIGU9dGhpcy5wYXRoLG49cygpKHQpLmNhbGwodCx0aGlzLnBhdGgpLG89THQodGhpcy5ub2RlLGEoZSkpO2MucHVzaChyLnJlcGxhY2UobixvKSl9fSkpLGN9KGUscSgpKG4pLmNhbGwobiwwLC0xKSx7Z2V0QmFzZVVybEZvck5vZGVQYXRoOmZ1bmN0aW9uKGUpe3ZhciBvO3JldHVybiByLmdldENvbnRleHQocygpKG89W10pLmNhbGwobyxGKCkobiksW3RdLEYoKShlKSkpLmJhc2VEb2N9LHNwZWNtYXA6cn0pO3AucHVzaC5hcHBseShwLEYoKShpKSl9KSkscC5wdXNoKHIubWVyZ2VEZWVwKGEsYykpLCFjLiQkcmVmKXAucHVzaChyLnJlbW92ZShzKCkobD1bXSkuY2FsbChsLGEsIiQkcmVmIikpKTtyZXR1cm4gcH19fX19LHNuPXtrZXk6InBhcmFtZXRlcnMiLHBsdWdpbjpmdW5jdGlvbihlLHQsbixyKXtpZihBcnJheS5pc0FycmF5KGUpJiZlLmxlbmd0aCl7dmFyIG89eWUoKShbXSxlKSxhPXEoKShuKS5jYWxsKG4sMCwtMSksaT1mZSgpKHt9LHN0LmdldEluKHIuc3BlYyxhKSk7cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSx0KXt0cnl7b1t0XS5kZWZhdWx0PXIucGFyYW1ldGVyTWFjcm8oaSxlKX1jYXRjaChlKXt2YXIgYT1uZXcgRXJyb3IoZSk7cmV0dXJuIGEuZnVsbFBhdGg9bixhfX0pKSxzdC5yZXBsYWNlKG4sbyl9cmV0dXJuIHN0LnJlcGxhY2UobixlKX19LHVuPXtrZXk6InByb3BlcnRpZXMiLHBsdWdpbjpmdW5jdGlvbihlLHQsbixyKXt2YXIgbz1mZSgpKHt9LGUpO2Zvcih2YXIgYSBpbiBlKXRyeXtvW2FdLmRlZmF1bHQ9ci5tb2RlbFByb3BlcnR5TWFjcm8ob1thXSl9Y2F0Y2goZSl7dmFyIGk9bmV3IEVycm9yKGUpO3JldHVybiBpLmZ1bGxQYXRoPW4saX1yZXR1cm4gc3QucmVwbGFjZShuLG8pfX0sY249ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe2RlKCkodGhpcyxlKSx0aGlzLnJvb3Q9bG4odHx8e30pfXJldHVybiB2ZSgpKGUsW3trZXk6InNldCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmdldFBhcmVudChlLCEwKTtpZihuKXt2YXIgcj1lW2UubGVuZ3RoLTFdLG89bi5jaGlsZHJlbjtvW3JdP3BuKG9bcl0sdCxuKTpvW3JdPWxuKHQsbil9ZWxzZSBwbih0aGlzLnJvb3QsdCxudWxsKX19LHtrZXk6ImdldCIsdmFsdWU6ZnVuY3Rpb24oZSl7aWYoKGU9ZXx8W10pLmxlbmd0aDwxKXJldHVybiB0aGlzLnJvb3QudmFsdWU7Zm9yKHZhciB0LG4scj10aGlzLnJvb3Qsbz0wO288ZS5sZW5ndGgmJihuPWVbb10sKHQ9ci5jaGlsZHJlbilbbl0pO28rPTEpcj10W25dO3JldHVybiByJiZyLnByb3RvVmFsdWV9fSx7a2V5OiJnZXRQYXJlbnQiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIWV8fGUubGVuZ3RoPDE/bnVsbDplLmxlbmd0aDwyP3RoaXMucm9vdDpxKCkoZSkuY2FsbChlLDAsLTEpLnJlZHVjZSgoZnVuY3Rpb24oZSxuKXtpZighZSlyZXR1cm4gZTt2YXIgcj1lLmNoaWxkcmVuO3JldHVybiFyW25dJiZ0JiYocltuXT1sbihudWxsLGUpKSxyW25dfSksdGhpcy5yb290KX19XSksZX0oKTtmdW5jdGlvbiBsbihlLHQpe3JldHVybiBwbih7Y2hpbGRyZW46e319LGUsdCl9ZnVuY3Rpb24gcG4oZSx0LG4pe3JldHVybiBlLnZhbHVlPXR8fHt9LGUucHJvdG9WYWx1ZT1uP2ZlKCkoZmUoKSh7fSxuLnByb3RvVmFsdWUpLGUudmFsdWUpOmUudmFsdWUsaigpKGUuY2hpbGRyZW4pLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciBuPWUuY2hpbGRyZW5bdF07ZS5jaGlsZHJlblt0XT1wbihuLG4udmFsdWUsZSl9KSksZX12YXIgZm49ZnVuY3Rpb24oKXt9LGhuPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXt2YXIgbixyLG89dGhpcztkZSgpKHRoaXMsZSkseWUoKSh0aGlzLHtzcGVjOiIiLGRlYnVnTGV2ZWw6ImluZm8iLHBsdWdpbnM6W10scGx1Z2luSGlzdG9yeTp7fSxlcnJvcnM6W10sbXV0YXRpb25zOltdLHByb21pc2VkUGF0Y2hlczpbXSxzdGF0ZTp7fSxwYXRjaGVzOltdLGNvbnRleHQ6e30sY29udGV4dFRyZWU6bmV3IGNuLHNob3dEZWJ1ZzohMSxhbGxQYXRjaGVzOltdLHBsdWdpblByb3A6InNwZWNNYXAiLGxpYk1ldGhvZHM6eWUoKShPYmplY3QuY3JlYXRlKHRoaXMpLHN0LHtnZXRJbnN0YW5jZTpmdW5jdGlvbigpe3JldHVybiBvfX0pLGFsbG93TWV0YVBhdGNoZXM6ITF9LHQpLHRoaXMuZ2V0PXRoaXMuX2dldC5iaW5kKHRoaXMpLHRoaXMuZ2V0Q29udGV4dD10aGlzLl9nZXRDb250ZXh0LmJpbmQodGhpcyksdGhpcy5oYXNSdW49dGhpcy5faGFzUnVuLmJpbmQodGhpcyksdGhpcy53cmFwcGVkUGx1Z2lucz1OKCkobj1PKCkocj10aGlzLnBsdWdpbnMpLmNhbGwocix0aGlzLndyYXBQbHVnaW4uYmluZCh0aGlzKSkpLmNhbGwobixzdC5pc0Z1bmN0aW9uKSx0aGlzLnBhdGNoZXMucHVzaChzdC5hZGQoW10sdGhpcy5zcGVjKSksdGhpcy5wYXRjaGVzLnB1c2goc3QuY29udGV4dChbXSx0aGlzLmNvbnRleHQpKSx0aGlzLnVwZGF0ZVBhdGNoZXModGhpcy5wYXRjaGVzKX1yZXR1cm4gdmUoKShlLFt7a2V5OiJkZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24oZSl7aWYodGhpcy5kZWJ1Z0xldmVsPT09ZSl7Zm9yKHZhciB0LG49YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheShuPjE/bi0xOjApLG89MTtvPG47bysrKXJbby0xXT1hcmd1bWVudHNbb107KHQ9Y29uc29sZSkubG9nLmFwcGx5KHQscil9fX0se2tleToidmVyYm9zZSIsdmFsdWU6ZnVuY3Rpb24oZSl7aWYoInZlcmJvc2UiPT09dGhpcy5kZWJ1Z0xldmVsKXtmb3IodmFyIHQsbixyPWFyZ3VtZW50cy5sZW5ndGgsbz1uZXcgQXJyYXkocj4xP3ItMTowKSxhPTE7YTxyO2ErKylvW2EtMV09YXJndW1lbnRzW2FdOyh0PWNvbnNvbGUpLmxvZy5hcHBseSh0LHMoKShuPVsiWyIuY29uY2F0KGUsIl0gICAiKV0pLmNhbGwobixvKSl9fX0se2tleToid3JhcFBsdWdpbiIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLG8sYT10aGlzLnBhdGhEaXNjcmltaW5hdG9yLGk9bnVsbDtyZXR1cm4gZVt0aGlzLnBsdWdpblByb3BdPyhpPWUsbj1lW3RoaXMucGx1Z2luUHJvcF0pOnN0LmlzRnVuY3Rpb24oZSk/bj1lOnN0LmlzT2JqZWN0KGUpJiYocj1lLG89ZnVuY3Rpb24oZSx0KXtyZXR1cm4hQXJyYXkuaXNBcnJheShlKXx8ZS5ldmVyeSgoZnVuY3Rpb24oZSxuKXtyZXR1cm4gZT09PXRbbl19KSl9LG49cC5hLm1hcmsoKGZ1bmN0aW9uIGUodCxuKXt2YXIgaSx1LGMsbCxmLGQ7cmV0dXJuIHAuYS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpkPWZ1bmN0aW9uKGUsdCxjKXt2YXIgbCxmLGgsbSx2LGcseSxiLF8sdyx4LEUsUztyZXR1cm4gcC5hLndyYXAoKGZ1bmN0aW9uKGkpe2Zvcig7Oylzd2l0Y2goaS5wcmV2PWkubmV4dCl7Y2FzZSAwOmlmKHN0LmlzT2JqZWN0KGUpKXtpLm5leHQ9NjticmVha31pZihyLmtleSE9PXRbdC5sZW5ndGgtMV0pe2kubmV4dD00O2JyZWFrfXJldHVybiBpLm5leHQ9NCxyLnBsdWdpbihlLHIua2V5LHQsbik7Y2FzZSA0OmkubmV4dD0zMDticmVhaztjYXNlIDY6bD10Lmxlbmd0aC0xLGY9dFtsXSxoPXQuaW5kZXhPZigicHJvcGVydGllcyIpLG09InByb3BlcnRpZXMiPT09ZiYmbD09PWgsdj1uLmFsbG93TWV0YVBhdGNoZXMmJnVbZS4kJHJlZl0sZz0wLHk9aigpKGUpO2Nhc2UgMTI6aWYoIShnPHkubGVuZ3RoKSl7aS5uZXh0PTMwO2JyZWFrfWlmKGI9eVtnXSxfPWVbYl0sdz1zKCkodCkuY2FsbCh0LGIpLHg9c3QuaXNPYmplY3QoXyksRT1lLiQkcmVmLHYpe2kubmV4dD0yMjticmVha31pZigheCl7aS5uZXh0PTIyO2JyZWFrfXJldHVybiBuLmFsbG93TWV0YVBhdGNoZXMmJkUmJih1W0VdPSEwKSxpLmRlbGVnYXRlWWllbGQoZChfLHcsYyksInQwIiwyMik7Y2FzZSAyMjppZihtfHxiIT09ci5rZXkpe2kubmV4dD0yNzticmVha31pZihTPW8oYSx0KSxhJiYhUyl7aS5uZXh0PTI3O2JyZWFrfXJldHVybiBpLm5leHQ9Mjcsci5wbHVnaW4oXyxiLHcsbixjKTtjYXNlIDI3OmcrKyxpLm5leHQ9MTI7YnJlYWs7Y2FzZSAzMDpjYXNlImVuZCI6cmV0dXJuIGkuc3RvcCgpfX0pLGkpfSxpPXAuYS5tYXJrKGQpLHU9e30sYz1oKCkoTigpKHQpLmNhbGwodCxzdC5pc0FkZGl0aXZlTXV0YXRpb24pKSxlLnByZXY9NCxjLnMoKTtjYXNlIDY6aWYoKGw9Yy5uKCkpLmRvbmUpe2UubmV4dD0xMTticmVha31yZXR1cm4gZj1sLnZhbHVlLGUuZGVsZWdhdGVZaWVsZChkKGYudmFsdWUsZi5wYXRoLGYpLCJ0MCIsOSk7Y2FzZSA5OmUubmV4dD02O2JyZWFrO2Nhc2UgMTE6ZS5uZXh0PTE2O2JyZWFrO2Nhc2UgMTM6ZS5wcmV2PTEzLGUudDE9ZS5jYXRjaCg0KSxjLmUoZS50MSk7Y2FzZSAxNjpyZXR1cm4gZS5wcmV2PTE2LGMuZigpLGUuZmluaXNoKDE2KTtjYXNlIDE5OmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSxudWxsLFtbNCwxMywxNiwxOV1dKX0pKSkseWUoKShuLmJpbmQoaSkse3BsdWdpbk5hbWU6ZS5uYW1lfHx0LGlzR2VuZXJhdG9yOnN0LmlzR2VuZXJhdG9yKG4pfSl9fSx7a2V5OiJuZXh0UGx1Z2luIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlLHQ9dGhpcztyZXR1cm4gX2UoKShlPXRoaXMud3JhcHBlZFBsdWdpbnMpLmNhbGwoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIHQuZ2V0TXV0YXRpb25zRm9yUGx1Z2luKGUpLmxlbmd0aD4wfSkpfX0se2tleToibmV4dFByb21pc2VkUGF0Y2giLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU7aWYodGhpcy5wcm9taXNlZFBhdGNoZXMubGVuZ3RoPjApcmV0dXJuIHhlLmEucmFjZShPKCkoZT10aGlzLnByb21pc2VkUGF0Y2hlcykuY2FsbChlLChmdW5jdGlvbihlKXtyZXR1cm4gZS52YWx1ZX0pKSl9fSx7a2V5OiJnZXRQbHVnaW5IaXN0b3J5Iix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmNvbnN0cnVjdG9yLmdldFBsdWdpbk5hbWUoZSk7cmV0dXJuIHRoaXMucGx1Z2luSGlzdG9yeVt0XXx8W119fSx7a2V5OiJnZXRQbHVnaW5SdW5Db3VudCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZ2V0UGx1Z2luSGlzdG9yeShlKS5sZW5ndGh9fSx7a2V5OiJnZXRQbHVnaW5IaXN0b3J5VGlwIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmdldFBsdWdpbkhpc3RvcnkoZSk7cmV0dXJuIHQmJnRbdC5sZW5ndGgtMV18fHt9fX0se2tleToiZ2V0UGx1Z2luTXV0YXRpb25JbmRleCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXRQbHVnaW5IaXN0b3J5VGlwKGUpLm11dGF0aW9uSW5kZXg7cmV0dXJuIm51bWJlciIhPXR5cGVvZiB0Py0xOnR9fSx7a2V5OiJ1cGRhdGVQbHVnaW5IaXN0b3J5Iix2YWx1ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuY29uc3RydWN0b3IuZ2V0UGx1Z2luTmFtZShlKTt0aGlzLnBsdWdpbkhpc3Rvcnlbbl09dGhpcy5wbHVnaW5IaXN0b3J5W25dfHxbXSx0aGlzLnBsdWdpbkhpc3Rvcnlbbl0ucHVzaCh0KX19LHtrZXk6InVwZGF0ZVBhdGNoZXMiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7c3Qubm9ybWFsaXplQXJyYXkoZSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYoZSBpbnN0YW5jZW9mIEVycm9yKXQuZXJyb3JzLnB1c2goZSk7ZWxzZSB0cnl7aWYoIXN0LmlzT2JqZWN0KGUpKXJldHVybiB2b2lkIHQuZGVidWcoInVwZGF0ZVBhdGNoZXMiLCJHb3QgYSBub24tb2JqZWN0IHBhdGNoIixlKTtpZih0LnNob3dEZWJ1ZyYmdC5hbGxQYXRjaGVzLnB1c2goZSksc3QuaXNQcm9taXNlKGUudmFsdWUpKXJldHVybiB0LnByb21pc2VkUGF0Y2hlcy5wdXNoKGUpLHZvaWQgdC5wcm9taXNlZFBhdGNoVGhlbihlKTtpZihzdC5pc0NvbnRleHRQYXRjaChlKSlyZXR1cm4gdm9pZCB0LnNldENvbnRleHQoZS5wYXRoLGUudmFsdWUpO2lmKHN0LmlzTXV0YXRpb24oZSkpcmV0dXJuIHZvaWQgdC51cGRhdGVNdXRhdGlvbnMoZSl9Y2F0Y2goZSl7Y29uc29sZS5lcnJvcihlKSx0LmVycm9ycy5wdXNoKGUpfX0pKX19LHtrZXk6InVwZGF0ZU11dGF0aW9ucyIsdmFsdWU6ZnVuY3Rpb24oZSl7Im9iamVjdCI9PT1tKCkoZS52YWx1ZSkmJiFBcnJheS5pc0FycmF5KGUudmFsdWUpJiZ0aGlzLmFsbG93TWV0YVBhdGNoZXMmJihlLnZhbHVlPWZlKCkoe30sZS52YWx1ZSkpO3ZhciB0PXN0LmFwcGx5UGF0Y2godGhpcy5zdGF0ZSxlLHthbGxvd01ldGFQYXRjaGVzOnRoaXMuYWxsb3dNZXRhUGF0Y2hlc30pO3QmJih0aGlzLm11dGF0aW9ucy5wdXNoKGUpLHRoaXMuc3RhdGU9dCl9fSx7a2V5OiJyZW1vdmVQcm9taXNlZFBhdGNoIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdCxuPXRoaXMucHJvbWlzZWRQYXRjaGVzLmluZGV4T2YoZSk7bjwwP3RoaXMuZGVidWcoIlRyaWVkIHRvIHJlbW92ZSBhIHByb21pc2VkUGF0Y2ggdGhhdCBpc24ndCB0aGVyZSEiKTpTZSgpKHQ9dGhpcy5wcm9taXNlZFBhdGNoZXMpLmNhbGwodCxuLDEpfX0se2tleToicHJvbWlzZWRQYXRjaFRoZW4iLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIGUudmFsdWU9ZS52YWx1ZS50aGVuKChmdW5jdGlvbihuKXt2YXIgcj1mZSgpKGZlKCkoe30sZSkse30se3ZhbHVlOm59KTt0LnJlbW92ZVByb21pc2VkUGF0Y2goZSksdC51cGRhdGVQYXRjaGVzKHIpfSkpLmNhdGNoKChmdW5jdGlvbihuKXt0LnJlbW92ZVByb21pc2VkUGF0Y2goZSksdC51cGRhdGVQYXRjaGVzKG4pfSkpLGUudmFsdWV9fSx7a2V5OiJnZXRNdXRhdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG47cmV0dXJuIGU9ZXx8MCwibnVtYmVyIiE9dHlwZW9mIHQmJih0PXRoaXMubXV0YXRpb25zLmxlbmd0aCkscSgpKG49dGhpcy5tdXRhdGlvbnMpLmNhbGwobixlLHQpfX0se2tleToiZ2V0Q3VycmVudE11dGF0aW9ucyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRNdXRhdGlvbnNGb3JQbHVnaW4odGhpcy5nZXRDdXJyZW50UGx1Z2luKCkpfX0se2tleToiZ2V0TXV0YXRpb25zRm9yUGx1Z2luIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmdldFBsdWdpbk11dGF0aW9uSW5kZXgoZSk7cmV0dXJuIHRoaXMuZ2V0TXV0YXRpb25zKHQrMSl9fSx7a2V5OiJnZXRDdXJyZW50UGx1Z2luIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmN1cnJlbnRQbHVnaW59fSx7a2V5OiJnZXRMaWIiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGliTWV0aG9kc319LHtrZXk6Il9nZXQiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBzdC5nZXRJbih0aGlzLnN0YXRlLGUpfX0se2tleToiX2dldENvbnRleHQiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNvbnRleHRUcmVlLmdldChlKX19LHtrZXk6InNldENvbnRleHQiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuY29udGV4dFRyZWUuc2V0KGUsdCl9fSx7a2V5OiJfaGFzUnVuIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5nZXRQbHVnaW5SdW5Db3VudCh0aGlzLmdldEN1cnJlbnRQbHVnaW4oKSk+KGV8fDApfX0se2tleToiZGlzcGF0Y2giLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzLG49dGhpcyxyPXRoaXMubmV4dFBsdWdpbigpO2lmKCFyKXt2YXIgbz10aGlzLm5leHRQcm9taXNlZFBhdGNoKCk7aWYobylyZXR1cm4gby50aGVuKChmdW5jdGlvbigpe3JldHVybiB0LmRpc3BhdGNoKCl9KSkuY2F0Y2goKGZ1bmN0aW9uKCl7cmV0dXJuIHQuZGlzcGF0Y2goKX0pKTt2YXIgYT17c3BlYzp0aGlzLnN0YXRlLGVycm9yczp0aGlzLmVycm9yc307cmV0dXJuIHRoaXMuc2hvd0RlYnVnJiYoYS5wYXRjaGVzPXRoaXMuYWxsUGF0Y2hlcykseGUuYS5yZXNvbHZlKGEpfWlmKG4ucGx1Z2luQ291bnQ9bi5wbHVnaW5Db3VudHx8e30sbi5wbHVnaW5Db3VudFtyXT0obi5wbHVnaW5Db3VudFtyXXx8MCkrMSxuLnBsdWdpbkNvdW50W3JdPjEwMClyZXR1cm4geGUuYS5yZXNvbHZlKHtzcGVjOm4uc3RhdGUsZXJyb3JzOnMoKShlPW4uZXJyb3JzKS5jYWxsKGUsbmV3IEVycm9yKCJXZSd2ZSByZWFjaGVkIGEgaGFyZCBsaW1pdCBvZiAiLmNvbmNhdCgxMDAsIiBwbHVnaW4gcnVucyIpKSl9KTtpZihyIT09dGhpcy5jdXJyZW50UGx1Z2luJiZ0aGlzLnByb21pc2VkUGF0Y2hlcy5sZW5ndGgpe3ZhciBpLHU9TygpKGk9dGhpcy5wcm9taXNlZFBhdGNoZXMpLmNhbGwoaSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUudmFsdWV9KSk7cmV0dXJuIHhlLmEuYWxsKE8oKSh1KS5jYWxsKHUsKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRoZW4oZm4sZm4pfSkpKS50aGVuKChmdW5jdGlvbigpe3JldHVybiB0LmRpc3BhdGNoKCl9KSl9cmV0dXJuIGZ1bmN0aW9uKCl7bi5jdXJyZW50UGx1Z2luPXI7dmFyIGU9bi5nZXRDdXJyZW50TXV0YXRpb25zKCksdD1uLm11dGF0aW9ucy5sZW5ndGgtMTt0cnl7aWYoci5pc0dlbmVyYXRvcil7dmFyIG8sYT1oKCkocihlLG4uZ2V0TGliKCkpKTt0cnl7Zm9yKGEucygpOyEobz1hLm4oKSkuZG9uZTspe2Moby52YWx1ZSl9fWNhdGNoKGUpe2EuZShlKX1maW5hbGx5e2EuZigpfX1lbHNle2MocihlLG4uZ2V0TGliKCkpKX19Y2F0Y2goZSl7Y29uc29sZS5lcnJvcihlKSxjKFt5ZSgpKE9iamVjdC5jcmVhdGUoZSkse3BsdWdpbjpyfSldKX1maW5hbGx5e24udXBkYXRlUGx1Z2luSGlzdG9yeShyLHttdXRhdGlvbkluZGV4OnR9KX1yZXR1cm4gbi5kaXNwYXRjaCgpfSgpO2Z1bmN0aW9uIGMoZSl7ZSYmKGU9c3QuZnVsbHlOb3JtYWxpemVBcnJheShlKSxuLnVwZGF0ZVBhdGNoZXMoZSxyKSl9fX1dLFt7a2V5OiJnZXRQbHVnaW5OYW1lIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5wbHVnaW5OYW1lfX0se2tleToiZ2V0UGF0Y2hlc09mVHlwZSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gTigpKGUpLmNhbGwoZSx0KX19XSksZX0oKTt2YXIgZG49e3JlZnM6JHQsYWxsT2Y6YW4scGFyYW1ldGVyczpzbixwcm9wZXJ0aWVzOnVufSxtbj1uKDYwKTtmdW5jdGlvbiB2bihlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e30sbj10LnJlcXVlc3RJbnRlcmNlcHRvcixyPXQucmVzcG9uc2VJbnRlcmNlcHRvcixvPWUud2l0aENyZWRlbnRpYWxzPyJpbmNsdWRlIjoic2FtZS1vcmlnaW4iO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZSh7dXJsOnQsbG9hZFNwZWM6ITAscmVxdWVzdEludGVyY2VwdG9yOm4scmVzcG9uc2VJbnRlcmNlcHRvcjpyLGhlYWRlcnM6e0FjY2VwdDpCdH0sY3JlZGVudGlhbHM6b30pLnRoZW4oKGZ1bmN0aW9uKGUpe3JldHVybiBlLmJvZHl9KSl9fWZ1bmN0aW9uIGduKGUpe3ZhciB0PWUuZmV0Y2gsbj1lLnNwZWMscj1lLnVybCxvPWUubW9kZSxhPWUuYWxsb3dNZXRhUGF0Y2hlcyxpPXZvaWQgMD09PWF8fGEscz1lLnBhdGhEaXNjcmltaW5hdG9yLHU9ZS5tb2RlbFByb3BlcnR5TWFjcm8sbD1lLnBhcmFtZXRlck1hY3JvLGY9ZS5yZXF1ZXN0SW50ZXJjZXB0b3IsaD1lLnJlc3BvbnNlSW50ZXJjZXB0b3IsZD1lLnNraXBOb3JtYWxpemF0aW9uLG09ZS51c2VDaXJjdWxhclN0cnVjdHVyZXMsdj1lLmh0dHAsZz1lLmJhc2VEb2M7cmV0dXJuIGc9Z3x8cix2PXR8fHZ8fEssbj95KG4pOnZuKHYse3JlcXVlc3RJbnRlcmNlcHRvcjpmLHJlc3BvbnNlSW50ZXJjZXB0b3I6aH0pKGcpLnRoZW4oeSk7ZnVuY3Rpb24geShlKXtnJiYoZG4ucmVmcy5kb2NDYWNoZVtnXT1lKSxkbi5yZWZzLmZldGNoSlNPTj12bih2LHtyZXF1ZXN0SW50ZXJjZXB0b3I6ZixyZXNwb25zZUludGVyY2VwdG9yOmh9KTt2YXIgdCxuPVtkbi5yZWZzXTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgbCYmbi5wdXNoKGRuLnBhcmFtZXRlcnMpLCJmdW5jdGlvbiI9PXR5cGVvZiB1JiZuLnB1c2goZG4ucHJvcGVydGllcyksInN0cmljdCIhPT1vJiZuLnB1c2goZG4uYWxsT2YpLCh0PXtzcGVjOmUsY29udGV4dDp7YmFzZURvYzpnfSxwbHVnaW5zOm4sYWxsb3dNZXRhUGF0Y2hlczppLHBhdGhEaXNjcmltaW5hdG9yOnMscGFyYW1ldGVyTWFjcm86bCxtb2RlbFByb3BlcnR5TWFjcm86dSx1c2VDaXJjdWxhclN0cnVjdHVyZXM6bX0sbmV3IGhuKHQpLmRpc3BhdGNoKCkpLnRoZW4oZD9mdW5jdGlvbigpe3ZhciBlPWMoKShwLmEubWFyaygoZnVuY3Rpb24gZSh0KXtyZXR1cm4gcC5hLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOnJldHVybiBlLmFicnVwdCgicmV0dXJuIix0KTtjYXNlIDE6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlKX0pKSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KCk6bW4uZCl9fXZhciB5bj1uKDUzKSxibj1uLm4oeW4pLF9uPW4oNDMpLHduPW4ubihfbikseG49bigxNDUpLEVuPW4ubih4biksU249big1MjcpLENuPW4ubihTbiksQW49e2JvZHk6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXEsbj1lLnZhbHVlO3QuYm9keT1ufSxoZWFkZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXEsbj1lLnBhcmFtZXRlcixyPWUudmFsdWU7dC5oZWFkZXJzPXQuaGVhZGVyc3x8e30sdm9pZCAwIT09ciYmKHQuaGVhZGVyc1tuLm5hbWVdPXIpfSxxdWVyeTpmdW5jdGlvbihlKXt2YXIgdD1lLnJlcSxuPWUudmFsdWUscj1lLnBhcmFtZXRlcjt0LnF1ZXJ5PXQucXVlcnl8fHt9LCExPT09biYmImJvb2xlYW4iPT09ci50eXBlJiYobj0iZmFsc2UiKTswPT09biYmWyJudW1iZXIiLCJpbnRlZ2VyIl0uaW5kZXhPZihyLnR5cGUpPi0xJiYobj0iMCIpO2lmKG4pdC5xdWVyeVtyLm5hbWVdPXtjb2xsZWN0aW9uRm9ybWF0OnIuY29sbGVjdGlvbkZvcm1hdCx2YWx1ZTpufTtlbHNlIGlmKHIuYWxsb3dFbXB0eVZhbHVlJiZ2b2lkIDAhPT1uKXt2YXIgbz1yLm5hbWU7dC5xdWVyeVtvXT10LnF1ZXJ5W29dfHx7fSx0LnF1ZXJ5W29dLmFsbG93RW1wdHlWYWx1ZT0hMH19LHBhdGg6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXEsbj1lLnZhbHVlLHI9ZS5wYXJhbWV0ZXI7dC51cmw9dC51cmwuc3BsaXQoInsiLmNvbmNhdChyLm5hbWUsIn0iKSkuam9pbihlbmNvZGVVUklDb21wb25lbnQobikpfSxmb3JtRGF0YTpmdW5jdGlvbihlKXt2YXIgdD1lLnJlcSxuPWUudmFsdWUscj1lLnBhcmFtZXRlcjsobnx8ci5hbGxvd0VtcHR5VmFsdWUpJiYodC5mb3JtPXQuZm9ybXx8e30sdC5mb3JtW3IubmFtZV09e3ZhbHVlOm4sYWxsb3dFbXB0eVZhbHVlOnIuYWxsb3dFbXB0eVZhbHVlLGNvbGxlY3Rpb25Gb3JtYXQ6ci5jb2xsZWN0aW9uRm9ybWF0fSl9fTtmdW5jdGlvbiBPbihlLHQpe3JldHVybiBiKCkodCkuY2FsbCh0LCJhcHBsaWNhdGlvbi9qc29uIik/InN0cmluZyI9PXR5cGVvZiBlP2U6QygpKGUpOmUudG9TdHJpbmcoKX1mdW5jdGlvbiBrbihlKXt2YXIgdD1lLnJlcSxuPWUudmFsdWUscj1lLnBhcmFtZXRlcixvPXIubmFtZSxhPXIuc3R5bGUsaT1yLmV4cGxvZGUscz1yLmNvbnRlbnQ7aWYocyl7dmFyIHU9aigpKHMpWzBdO3QudXJsPXQudXJsLnNwbGl0KCJ7Ii5jb25jYXQobywifSIpKS5qb2luKFcoT24obix1KSx7ZXNjYXBlOiEwfSkpfWVsc2V7dmFyIGM9SCh7a2V5OnIubmFtZSx2YWx1ZTpuLHN0eWxlOmF8fCJzaW1wbGUiLGV4cGxvZGU6aXx8ITEsZXNjYXBlOiEwfSk7dC51cmw9dC51cmwuc3BsaXQoInsiLmNvbmNhdChvLCJ9IikpLmpvaW4oYyl9fWZ1bmN0aW9uIGpuKGUpe3ZhciB0PWUucmVxLG49ZS52YWx1ZSxyPWUucGFyYW1ldGVyO2lmKHQucXVlcnk9dC5xdWVyeXx8e30sci5jb250ZW50KXt2YXIgbz1qKCkoci5jb250ZW50KVswXTt0LnF1ZXJ5W3IubmFtZV09T24obixvKX1lbHNlIGlmKCExPT09biYmKG49ImZhbHNlIiksMD09PW4mJihuPSIwIiksbil7dmFyIGE9ci5zdHlsZSxpPXIuZXhwbG9kZSxzPXIuYWxsb3dSZXNlcnZlZDt0LnF1ZXJ5W3IubmFtZV09e3ZhbHVlOm4sc2VyaWFsaXphdGlvbk9wdGlvbjp7c3R5bGU6YSxleHBsb2RlOmksYWxsb3dSZXNlcnZlZDpzfX19ZWxzZSBpZihyLmFsbG93RW1wdHlWYWx1ZSYmdm9pZCAwIT09bil7dmFyIHU9ci5uYW1lO3QucXVlcnlbdV09dC5xdWVyeVt1XXx8e30sdC5xdWVyeVt1XS5hbGxvd0VtcHR5VmFsdWU9ITB9fXZhciBUbj1bImFjY2VwdCIsImF1dGhvcml6YXRpb24iLCJjb250ZW50LXR5cGUiXTtmdW5jdGlvbiBJbihlKXt2YXIgdD1lLnJlcSxuPWUucGFyYW1ldGVyLHI9ZS52YWx1ZTtpZih0LmhlYWRlcnM9dC5oZWFkZXJzfHx7fSwhKFRuLmluZGV4T2Yobi5uYW1lLnRvTG93ZXJDYXNlKCkpPi0xKSlpZihuLmNvbnRlbnQpe3ZhciBvPWooKShuLmNvbnRlbnQpWzBdO3QuaGVhZGVyc1tuLm5hbWVdPU9uKHIsbyl9ZWxzZSB2b2lkIDAhPT1yJiYodC5oZWFkZXJzW24ubmFtZV09SCh7a2V5Om4ubmFtZSx2YWx1ZTpyLHN0eWxlOm4uc3R5bGV8fCJzaW1wbGUiLGV4cGxvZGU6dm9pZCAwIT09bi5leHBsb2RlJiZuLmV4cGxvZGUsZXNjYXBlOiExfSkpfWZ1bmN0aW9uIFBuKGUpe3ZhciB0PWUucmVxLG49ZS5wYXJhbWV0ZXIscj1lLnZhbHVlO3QuaGVhZGVycz10LmhlYWRlcnN8fHt9O3ZhciBvPW0oKShyKTtpZihuLmNvbnRlbnQpe3ZhciBhLGk9aigpKG4uY29udGVudClbMF07dC5oZWFkZXJzLkNvb2tpZT1zKCkoYT0iIi5jb25jYXQobi5uYW1lLCI9IikpLmNhbGwoYSxPbihyLGkpKX1lbHNlIGlmKCJ1bmRlZmluZWQiIT09byl7dmFyIHU9Im9iamVjdCI9PT1vJiYhQXJyYXkuaXNBcnJheShyKSYmbi5leHBsb2RlPyIiOiIiLmNvbmNhdChuLm5hbWUsIj0iKTt0LmhlYWRlcnMuQ29va2llPXUrSCh7a2V5Om4ubmFtZSx2YWx1ZTpyLGVzY2FwZTohMSxzdHlsZTpuLnN0eWxlfHwiZm9ybSIsZXhwbG9kZTp2b2lkIDAhPT1uLmV4cGxvZGUmJm4uZXhwbG9kZX0pfX12YXIgTm49bigyMTUpLE1uPW4ubihObik7ZnVuY3Rpb24gUm4oZSx0KXt2YXIgbj1lLm9wZXJhdGlvbixyPWUucmVxdWVzdEJvZHksbz1lLnNlY3VyaXRpZXMsYT1lLnNwZWMsaT1lLmF0dGFjaENvbnRlbnRUeXBlRm9yRW1wdHlQYXlsb2FkLHU9ZS5yZXF1ZXN0Q29udGVudFR5cGU7dD1mdW5jdGlvbihlKXt2YXIgdD1lLnJlcXVlc3Qsbj1lLnNlY3VyaXRpZXMscj12b2lkIDA9PT1uP3t9Om4sbz1lLm9wZXJhdGlvbixhPXZvaWQgMD09PW8/e306byxpPWUuc3BlYyx1PWZlKCkoe30sdCksYz1yLmF1dGhvcml6ZWQsbD12b2lkIDA9PT1jP3t9OmMscD1hLnNlY3VyaXR5fHxpLnNlY3VyaXR5fHxbXSxmPWwmJiEhaigpKGwpLmxlbmd0aCxoPXduKCkoaSxbImNvbXBvbmVudHMiLCJzZWN1cml0eVNjaGVtZXMiXSl8fHt9O2lmKHUuaGVhZGVycz11LmhlYWRlcnN8fHt9LHUucXVlcnk9dS5xdWVyeXx8e30sIWooKShyKS5sZW5ndGh8fCFmfHwhcHx8QXJyYXkuaXNBcnJheShhLnNlY3VyaXR5KSYmIWEuc2VjdXJpdHkubGVuZ3RoKXJldHVybiB0O3JldHVybiBwLmZvckVhY2goKGZ1bmN0aW9uKGUpe2ooKShlKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgdD1sW2VdLG49aFtlXTtpZih0KXt2YXIgcj10LnZhbHVlfHx0LG89bi50eXBlO2lmKHQpaWYoImFwaUtleSI9PT1vKSJxdWVyeSI9PT1uLmluJiYodS5xdWVyeVtuLm5hbWVdPXIpLCJoZWFkZXIiPT09bi5pbiYmKHUuaGVhZGVyc1tuLm5hbWVdPXIpLCJjb29raWUiPT09bi5pbiYmKHUuY29va2llc1tuLm5hbWVdPXIpO2Vsc2UgaWYoImh0dHAiPT09byl7aWYoL15iYXNpYyQvaS50ZXN0KG4uc2NoZW1lKSl7dmFyIGEsaT1yLnVzZXJuYW1lfHwiIixjPXIucGFzc3dvcmR8fCIiLHA9TW4oKShzKCkoYT0iIi5jb25jYXQoaSwiOiIpKS5jYWxsKGEsYykpO3UuaGVhZGVycy5BdXRob3JpemF0aW9uPSJCYXNpYyAiLmNvbmNhdChwKX0vXmJlYXJlciQvaS50ZXN0KG4uc2NoZW1lKSYmKHUuaGVhZGVycy5BdXRob3JpemF0aW9uPSJCZWFyZXIgIi5jb25jYXQocikpfWVsc2UgaWYoIm9hdXRoMiI9PT1vfHwib3BlbklkQ29ubmVjdCI9PT1vKXt2YXIgZixkPXQudG9rZW58fHt9LG09ZFtuWyJ4LXRva2VuTmFtZSJdfHwiYWNjZXNzX3Rva2VuIl0sdj1kLnRva2VuX3R5cGU7diYmImJlYXJlciIhPT12LnRvTG93ZXJDYXNlKCl8fCh2PSJCZWFyZXIiKSx1LmhlYWRlcnMuQXV0aG9yaXphdGlvbj1zKCkoZj0iIi5jb25jYXQodiwiICIpKS5jYWxsKGYsbSl9fX0pKX0pKSx1fSh7cmVxdWVzdDp0LHNlY3VyaXRpZXM6byxvcGVyYXRpb246bixzcGVjOmF9KTt2YXIgYz1uLnJlcXVlc3RCb2R5fHx7fSxsPWooKShjLmNvbnRlbnR8fHt9KSxwPXUmJmwuaW5kZXhPZih1KT4tMTtpZihyfHxpKXtpZih1JiZwKXQuaGVhZGVyc1siQ29udGVudC1UeXBlIl09dTtlbHNlIGlmKCF1KXt2YXIgZj1sWzBdO2YmJih0LmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdPWYsdT1mKX19ZWxzZSB1JiZwJiYodC5oZWFkZXJzWyJDb250ZW50LVR5cGUiXT11KTtpZighZS5yZXNwb25zZUNvbnRlbnRUeXBlJiZuLnJlc3BvbnNlcyl7dmFyIGgsZD1OKCkoaD1JKCkobi5yZXNwb25zZXMpKS5jYWxsKGgsKGZ1bmN0aW9uKGUpe3ZhciB0PWcoKShlLDIpLG49dFswXSxyPXRbMV0sbz1wYXJzZUludChuLDEwKTtyZXR1cm4gbz49MjAwJiZvPDMwMCYmRW4oKShyLmNvbnRlbnQpfSkpLnJlZHVjZSgoZnVuY3Rpb24oZSx0KXt2YXIgbj1nKCkodCwyKVsxXTtyZXR1cm4gcygpKGUpLmNhbGwoZSxqKCkobi5jb250ZW50KSl9KSxbXSk7ZC5sZW5ndGg+MCYmKHQuaGVhZGVycy5hY2NlcHQ9ZC5qb2luKCIsICIpKX1pZihyKWlmKHUpe2lmKGwuaW5kZXhPZih1KT4tMSlpZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIj09PXV8fCJtdWx0aXBhcnQvZm9ybS1kYXRhIj09PXUpaWYoIm9iamVjdCI9PT1tKCkocikpe3ZhciB2PShjLmNvbnRlbnRbdV18fHt9KS5lbmNvZGluZ3x8e307dC5mb3JtPXt9LGooKShyKS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmZvcm1bZV09e3ZhbHVlOnJbZV0sZW5jb2Rpbmc6dltlXXx8e319fSkpfWVsc2UgdC5mb3JtPXI7ZWxzZSB0LmJvZHk9cn1lbHNlIHQuYm9keT1yO3JldHVybiB0fWZ1bmN0aW9uIERuKGUsdCl7dmFyIG4scixvPWUuc3BlYyxhPWUub3BlcmF0aW9uLGk9ZS5zZWN1cml0aWVzLHU9ZS5yZXF1ZXN0Q29udGVudFR5cGUsYz1lLnJlc3BvbnNlQ29udGVudFR5cGUsbD1lLmF0dGFjaENvbnRlbnRUeXBlRm9yRW1wdHlQYXlsb2FkO2lmKCh0PWZ1bmN0aW9uKGUpe3ZhciB0PWUucmVxdWVzdCxuPWUuc2VjdXJpdGllcyxyPXZvaWQgMD09PW4/e306bixvPWUub3BlcmF0aW9uLGE9dm9pZCAwPT09bz97fTpvLGk9ZS5zcGVjLHU9ZmUoKSh7fSx0KSxjPXIuYXV0aG9yaXplZCxsPXZvaWQgMD09PWM/e306YyxwPXIuc3BlY1NlY3VyaXR5LGY9dm9pZCAwPT09cD9bXTpwLGg9YS5zZWN1cml0eXx8ZixkPWwmJiEhaigpKGwpLmxlbmd0aCxtPWkuc2VjdXJpdHlEZWZpbml0aW9ucztpZih1LmhlYWRlcnM9dS5oZWFkZXJzfHx7fSx1LnF1ZXJ5PXUucXVlcnl8fHt9LCFqKCkocikubGVuZ3RofHwhZHx8IWh8fEFycmF5LmlzQXJyYXkoYS5zZWN1cml0eSkmJiFhLnNlY3VyaXR5Lmxlbmd0aClyZXR1cm4gdDtyZXR1cm4gaC5mb3JFYWNoKChmdW5jdGlvbihlKXtqKCkoZSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHQ9bFtlXTtpZih0KXt2YXIgbj10LnRva2VuLHI9dC52YWx1ZXx8dCxvPW1bZV0sYT1vLnR5cGUsaT1vWyJ4LXRva2VuTmFtZSJdfHwiYWNjZXNzX3Rva2VuIixjPW4mJm5baV0scD1uJiZuLnRva2VuX3R5cGU7aWYodClpZigiYXBpS2V5Ij09PWEpe3ZhciBmPSJxdWVyeSI9PT1vLmluPyJxdWVyeSI6ImhlYWRlcnMiO3VbZl09dVtmXXx8e30sdVtmXVtvLm5hbWVdPXJ9ZWxzZSBpZigiYmFzaWMiPT09YSlpZihyLmhlYWRlcil1LmhlYWRlcnMuYXV0aG9yaXphdGlvbj1yLmhlYWRlcjtlbHNle3ZhciBoLGQ9ci51c2VybmFtZXx8IiIsdj1yLnBhc3N3b3JkfHwiIjtyLmJhc2U2ND1NbigpKHMoKShoPSIiLmNvbmNhdChkLCI6IikpLmNhbGwoaCx2KSksdS5oZWFkZXJzLmF1dGhvcml6YXRpb249IkJhc2ljICIuY29uY2F0KHIuYmFzZTY0KX1lbHNlIGlmKCJvYXV0aDIiPT09YSYmYyl7dmFyIGc7cD1wJiYiYmVhcmVyIiE9PXAudG9Mb3dlckNhc2UoKT9wOiJCZWFyZXIiLHUuaGVhZGVycy5hdXRob3JpemF0aW9uPXMoKShnPSIiLmNvbmNhdChwLCIgIikpLmNhbGwoZyxjKX19fSkpfSkpLHV9KHtyZXF1ZXN0OnQsc2VjdXJpdGllczppLG9wZXJhdGlvbjphLHNwZWM6b30pKS5ib2R5fHx0LmZvcm18fGwpaWYodSl0LmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdPXU7ZWxzZSBpZihBcnJheS5pc0FycmF5KGEuY29uc3VtZXMpKXt2YXIgcD1nKCkoYS5jb25zdW1lcywxKTt0LmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdPXBbMF19ZWxzZSBpZihBcnJheS5pc0FycmF5KG8uY29uc3VtZXMpKXt2YXIgZj1nKCkoby5jb25zdW1lcywxKTt0LmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdPWZbMF19ZWxzZSBhLnBhcmFtZXRlcnMmJk4oKShuPWEucGFyYW1ldGVycykuY2FsbChuLChmdW5jdGlvbihlKXtyZXR1cm4iZmlsZSI9PT1lLnR5cGV9KSkubGVuZ3RoP3QuaGVhZGVyc1siQ29udGVudC1UeXBlIl09Im11bHRpcGFydC9mb3JtLWRhdGEiOmEucGFyYW1ldGVycyYmTigpKHI9YS5wYXJhbWV0ZXJzKS5jYWxsKHIsKGZ1bmN0aW9uKGUpe3JldHVybiJmb3JtRGF0YSI9PT1lLmlufSkpLmxlbmd0aCYmKHQuaGVhZGVyc1siQ29udGVudC1UeXBlIl09ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpO2Vsc2UgaWYodSl7dmFyIGgsZCxtPWEucGFyYW1ldGVycyYmTigpKGg9YS5wYXJhbWV0ZXJzKS5jYWxsKGgsKGZ1bmN0aW9uKGUpe3JldHVybiJib2R5Ij09PWUuaW59KSkubGVuZ3RoPjAsdj1hLnBhcmFtZXRlcnMmJk4oKShkPWEucGFyYW1ldGVycykuY2FsbChkLChmdW5jdGlvbihlKXtyZXR1cm4iZm9ybURhdGEiPT09ZS5pbn0pKS5sZW5ndGg+MDsobXx8dikmJih0LmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdPXUpfXJldHVybiFjJiZBcnJheS5pc0FycmF5KGEucHJvZHVjZXMpJiZhLnByb2R1Y2VzLmxlbmd0aD4wJiYodC5oZWFkZXJzLmFjY2VwdD1hLnByb2R1Y2VzLmpvaW4oIiwgIikpLHR9dmFyIExuPVsiaHR0cCIsImZldGNoIiwic3BlYyIsIm9wZXJhdGlvbklkIiwicGF0aE5hbWUiLCJtZXRob2QiLCJwYXJhbWV0ZXJzIiwic2VjdXJpdGllcyJdLEJuPWZ1bmN0aW9uKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2U6W119LEZuPWp0KCJPcGVyYXRpb25Ob3RGb3VuZEVycm9yIiwoZnVuY3Rpb24oZSx0LG4pe3RoaXMub3JpZ2luYWxFcnJvcj1uLHllKCkodGhpcyx0fHx7fSl9KSksVW49e2J1aWxkUmVxdWVzdDp6bn07ZnVuY3Rpb24gcW4oZSl7dmFyIHQ9ZS5odHRwLG49ZS5mZXRjaCxyPWUuc3BlYyxvPWUub3BlcmF0aW9uSWQsYT1lLnBhdGhOYW1lLGk9ZS5tZXRob2Qscz1lLnBhcmFtZXRlcnMsdT1lLnNlY3VyaXRpZXMsYz1ibigpKGUsTG4pLGw9dHx8bnx8SzthJiZpJiYhbyYmKG89T2JqZWN0KG1uLmMpKGEsaSkpO3ZhciBwPVVuLmJ1aWxkUmVxdWVzdChmZSgpKHtzcGVjOnIsb3BlcmF0aW9uSWQ6byxwYXJhbWV0ZXJzOnMsc2VjdXJpdGllczp1LGh0dHA6bH0sYykpO3JldHVybiBwLmJvZHkmJihFbigpKHAuYm9keSl8fEFycmF5LmlzQXJyYXkocC5ib2R5KSkmJihwLmJvZHk9QygpKHAuYm9keSkpLGwocCl9ZnVuY3Rpb24gem4oZSl7dmFyIHQsbixyPWUuc3BlYyxvPWUub3BlcmF0aW9uSWQsaT1lLnJlc3BvbnNlQ29udGVudFR5cGUsdT1lLnNjaGVtZSxjPWUucmVxdWVzdEludGVyY2VwdG9yLGw9ZS5yZXNwb25zZUludGVyY2VwdG9yLHA9ZS5jb250ZXh0VXJsLGY9ZS51c2VyRmV0Y2gsaD1lLnNlcnZlcixkPWUuc2VydmVyVmFyaWFibGVzLG09ZS5odHRwLHY9ZS5wYXJhbWV0ZXJzLHk9ZS5wYXJhbWV0ZXJCdWlsZGVycyxiPU9iamVjdChtbi5iKShyKTt5fHwoeT1iP2E6QW4pO3ZhciBfPXt1cmw6IiIsY3JlZGVudGlhbHM6bSYmbS53aXRoQ3JlZGVudGlhbHM/ImluY2x1ZGUiOiJzYW1lLW9yaWdpbiIsaGVhZGVyczp7fSxjb29raWVzOnt9fTtjJiYoXy5yZXF1ZXN0SW50ZXJjZXB0b3I9YyksbCYmKF8ucmVzcG9uc2VJbnRlcmNlcHRvcj1sKSxmJiYoXy51c2VyRmV0Y2g9Zik7dmFyIHc9T2JqZWN0KG1uLmEpKHIsbyk7aWYoIXcpdGhyb3cgbmV3IEZuKCJPcGVyYXRpb24gIi5jb25jYXQobywiIG5vdCBmb3VuZCIpKTt2YXIgeCxFPXcub3BlcmF0aW9uLFM9dm9pZCAwPT09RT97fTpFLEM9dy5tZXRob2QsQT13LnBhdGhOYW1lO2lmKF8udXJsKz0oeD17c3BlYzpyLHNjaGVtZTp1LGNvbnRleHRVcmw6cCxzZXJ2ZXI6aCxzZXJ2ZXJWYXJpYWJsZXM6ZCxwYXRoTmFtZTpBLG1ldGhvZDpDfSxPYmplY3QobW4uYikoeC5zcGVjKT9mdW5jdGlvbihlKXt2YXIgdD1lLnNwZWMsbj1lLnBhdGhOYW1lLHI9ZS5tZXRob2Qsbz1lLnNlcnZlcixhPWUuY29udGV4dFVybCxpPWUuc2VydmVyVmFyaWFibGVzLHU9dm9pZCAwPT09aT97fTppLGM9d24oKSh0LFsicGF0aHMiLG4sKHJ8fCIiKS50b0xvd2VyQ2FzZSgpLCJzZXJ2ZXJzIl0pfHx3bigpKHQsWyJwYXRocyIsbiwic2VydmVycyJdKXx8d24oKSh0LFsic2VydmVycyJdKSxsPSIiLHA9bnVsbDtpZihvJiZjJiZjLmxlbmd0aCl7dmFyIGY9TygpKGMpLmNhbGwoYywoZnVuY3Rpb24oZSl7cmV0dXJuIGUudXJsfSkpO2YuaW5kZXhPZihvKT4tMSYmKGw9byxwPWNbZi5pbmRleE9mKG8pXSl9aWYoIWwmJmMmJmMubGVuZ3RoKXtsPWNbMF0udXJsO3ZhciBoPWcoKShjLDEpO3A9aFswXX1yZXR1cm4gbC5pbmRleE9mKCJ7Iik+LTEmJmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPVtdLHI9L3soW159XSspfS9nO3Q9ci5leGVjKGUpOyluLnB1c2godFsxXSk7cmV0dXJuIG59KGwpLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKHAudmFyaWFibGVzJiZwLnZhcmlhYmxlc1tlXSl7dmFyIHQ9cC52YXJpYWJsZXNbZV0sbj11W2VdfHx0LmRlZmF1bHQscj1uZXcgUmVnRXhwKCJ7Ii5jb25jYXQoZSwifSIpLCJnIik7bD1sLnJlcGxhY2UocixuKX19KSksZnVuY3Rpb24oKXt2YXIgZSx0LG49YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOiIiLHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOiIiLG89biYmcj9rdC5hLnBhcnNlKGt0LmEucmVzb2x2ZShyLG4pKTprdC5hLnBhcnNlKG4pLGE9a3QuYS5wYXJzZShyKSxpPVZuKG8ucHJvdG9jb2wpfHxWbihhLnByb3RvY29sKXx8IiIsdT1vLmhvc3R8fGEuaG9zdCxjPW8ucGF0aG5hbWV8fCIiO3JldHVybiIvIj09PShlPWkmJnU/cygpKHQ9IiIuY29uY2F0KGksIjovLyIpKS5jYWxsKHQsdStjKTpjKVtlLmxlbmd0aC0xXT9xKCkoZSkuY2FsbChlLDAsLTEpOmV9KGwsYSl9KHgpOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj1lLnNwZWMsbz1lLnNjaGVtZSxhPWUuY29udGV4dFVybCxpPXZvaWQgMD09PWE/IiI6YSx1PWt0LmEucGFyc2UoaSksYz1BcnJheS5pc0FycmF5KHIuc2NoZW1lcyk/ci5zY2hlbWVzWzBdOm51bGwsbD1vfHxjfHxWbih1LnByb3RvY29sKXx8Imh0dHAiLHA9ci5ob3N0fHx1Lmhvc3R8fCIiLGY9ci5iYXNlUGF0aHx8IiI7cmV0dXJuIi8iPT09KHQ9bCYmcD9zKCkobj0iIi5jb25jYXQobCwiOi8vIikpLmNhbGwobixwK2YpOmYpW3QubGVuZ3RoLTFdP3EoKSh0KS5jYWxsKHQsMCwtMSk6dH0oeCkpLCFvKXJldHVybiBkZWxldGUgXy5jb29raWVzLF87Xy51cmwrPUEsXy5tZXRob2Q9IiIuY29uY2F0KEMpLnRvVXBwZXJDYXNlKCksdj12fHx7fTt2YXIgaz1yLnBhdGhzW0FdfHx7fTtpJiYoXy5oZWFkZXJzLmFjY2VwdD1pKTt2YXIgVD1mdW5jdGlvbihlKXt2YXIgdD17fTtlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3RbZS5pbl18fCh0W2UuaW5dPXt9KSx0W2UuaW5dW2UubmFtZV09ZX0pKTt2YXIgbj1bXTtyZXR1cm4gaigpKHQpLmZvckVhY2goKGZ1bmN0aW9uKGUpe2ooKSh0W2VdKS5mb3JFYWNoKChmdW5jdGlvbihyKXtuLnB1c2godFtlXVtyXSl9KSl9KSksbn0ocygpKHQ9cygpKG49W10pLmNhbGwobixCbihTLnBhcmFtZXRlcnMpKSkuY2FsbCh0LEJuKGsucGFyYW1ldGVycykpKTtULmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciB0LG4sbz15W2UuaW5dO2lmKCJib2R5Ij09PWUuaW4mJmUuc2NoZW1hJiZlLnNjaGVtYS5wcm9wZXJ0aWVzJiYodD12KSx2b2lkIDA9PT0odD1lJiZlLm5hbWUmJnZbZS5uYW1lXSkpdD1lJiZlLm5hbWUmJnZbcygpKG49IiIuY29uY2F0KGUuaW4sIi4iKSkuY2FsbChuLGUubmFtZSldO2Vsc2UgaWYoZnVuY3Rpb24oZSx0KXtyZXR1cm4gTigpKHQpLmNhbGwodCwoZnVuY3Rpb24odCl7cmV0dXJuIHQubmFtZT09PWV9KSl9KGUubmFtZSxUKS5sZW5ndGg+MSl7dmFyIGE7Y29uc29sZS53YXJuKHMoKShhPSJQYXJhbWV0ZXIgJyIuY29uY2F0KGUubmFtZSwiJyBpcyBhbWJpZ3VvdXMgYmVjYXVzZSB0aGUgZGVmaW5lZCBzcGVjIGhhcyBtb3JlIHRoYW4gb25lIHBhcmFtZXRlciB3aXRoIHRoZSBuYW1lOiAnIikpLmNhbGwoYSxlLm5hbWUsIicgYW5kIHRoZSBwYXNzZWQtaW4gcGFyYW1ldGVyIHZhbHVlcyBkaWQgbm90IGRlZmluZSBhbiAnaW4nIHZhbHVlLiIpKX1pZihudWxsIT09dCl7aWYodm9pZCAwIT09ZS5kZWZhdWx0JiZ2b2lkIDA9PT10JiYodD1lLmRlZmF1bHQpLHZvaWQgMD09PXQmJmUucmVxdWlyZWQmJiFlLmFsbG93RW1wdHlWYWx1ZSl0aHJvdyBuZXcgRXJyb3IoIlJlcXVpcmVkIHBhcmFtZXRlciAiLmNvbmNhdChlLm5hbWUsIiBpcyBub3QgcHJvdmlkZWQiKSk7aWYoYiYmZS5zY2hlbWEmJiJvYmplY3QiPT09ZS5zY2hlbWEudHlwZSYmInN0cmluZyI9PXR5cGVvZiB0KXRyeXt0PUpTT04ucGFyc2UodCl9Y2F0Y2goZSl7dGhyb3cgbmV3IEVycm9yKCJDb3VsZCBub3QgcGFyc2Ugb2JqZWN0IHBhcmFtZXRlciB2YWx1ZSBzdHJpbmcgYXMgSlNPTiIpfW8mJm8oe3JlcTpfLHBhcmFtZXRlcjplLHZhbHVlOnQsb3BlcmF0aW9uOlMsc3BlYzpyfSl9fSkpO3ZhciBJPWZlKCkoZmUoKSh7fSxlKSx7fSx7b3BlcmF0aW9uOlN9KTtpZigoXz1iP1JuKEksXyk6RG4oSSxfKSkuY29va2llcyYmaigpKF8uY29va2llcykubGVuZ3RoKXt2YXIgUD1qKCkoXy5jb29raWVzKS5yZWR1Y2UoKGZ1bmN0aW9uKGUsdCl7dmFyIG49Xy5jb29raWVzW3RdO3JldHVybiBlKyhlPyImIjoiIikrQ24uYS5zZXJpYWxpemUodCxuKX0pLCIiKTtfLmhlYWRlcnMuQ29va2llPVB9cmV0dXJuIF8uY29va2llcyYmZGVsZXRlIF8uY29va2llcyxjZShfKSxffXZhciBWbj1mdW5jdGlvbihlKXtyZXR1cm4gZT9lLnJlcGxhY2UoL1xXL2csIiIpOm51bGx9O2Z1bmN0aW9uIFduKGUsdCl7cmV0dXJuIEhuLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBIbigpe3JldHVybihIbj1jKCkocC5hLm1hcmsoKGZ1bmN0aW9uIGUodCxuKXt2YXIgcixvLGEsaSxzLHUsYyxsLGYsaCxkLG0sdj1hcmd1bWVudHM7cmV0dXJuIHAuYS53cmFwKChmdW5jdGlvbihlKXtmb3IoOzspc3dpdGNoKGUucHJldj1lLm5leHQpe2Nhc2UgMDpyZXR1cm4gcj12Lmxlbmd0aD4yJiZ2b2lkIDAhPT12WzJdP3ZbMl06e30sbz1yLnJldHVybkVudGlyZVRyZWUsYT1yLmJhc2VEb2MsaT1yLnJlcXVlc3RJbnRlcmNlcHRvcixzPXIucmVzcG9uc2VJbnRlcmNlcHRvcix1PXIucGFyYW1ldGVyTWFjcm8sYz1yLm1vZGVsUHJvcGVydHlNYWNybyxsPXIudXNlQ2lyY3VsYXJTdHJ1Y3R1cmVzLGY9e3BhdGhEaXNjcmltaW5hdG9yOm4sYmFzZURvYzphLHJlcXVlc3RJbnRlcmNlcHRvcjppLHJlc3BvbnNlSW50ZXJjZXB0b3I6cyxwYXJhbWV0ZXJNYWNybzp1LG1vZGVsUHJvcGVydHlNYWNybzpjLHVzZUNpcmN1bGFyU3RydWN0dXJlczpsfSxoPU9iamVjdChtbi5kKSh7c3BlYzp0fSksZD1oLnNwZWMsZS5uZXh0PTYsZ24oZmUoKShmZSgpKHt9LGYpLHt9LHtzcGVjOmQsYWxsb3dNZXRhUGF0Y2hlczohMCxza2lwTm9ybWFsaXphdGlvbjohMH0pKTtjYXNlIDY6cmV0dXJuIG09ZS5zZW50LCFvJiZBcnJheS5pc0FycmF5KG4pJiZuLmxlbmd0aCYmKG0uc3BlYz13bigpKG0uc3BlYyxuKXx8bnVsbCksZS5hYnJ1cHQoInJldHVybiIsbSk7Y2FzZSA5OmNhc2UiZW5kIjpyZXR1cm4gZS5zdG9wKCl9fSksZSl9KSkpKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dmFyICRuPW4oMzA0KTt0LmRlZmF1bHQ9ZnVuY3Rpb24oZSl7dmFyIHQsbixyLG89ZS5jb25maWdzLGE9ZS5nZXRDb25maWdzO3JldHVybntmbjp7ZmV0Y2g6KHQ9SyxuPW8ucHJlRmV0Y2gscj1vLnBvc3RGZXRjaCxyPXJ8fGZ1bmN0aW9uKGUpe3JldHVybiBlfSxuPW58fGZ1bmN0aW9uKGUpe3JldHVybiBlfSxmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJihlPXt1cmw6ZX0pLEoubWVyZ2VJblF1ZXJ5T3JGb3JtKGUpLGU9bihlKSxyKHQoZSkpfSksYnVpbGRSZXF1ZXN0OnpuLGV4ZWN1dGU6cW4scmVzb2x2ZTpnbixyZXNvbHZlU3VidHJlZTpmdW5jdGlvbihlLHQsbil7dmFyIHI7aWYodm9pZCAwPT09bil7dmFyIG89YSgpO249e21vZGVsUHJvcGVydHlNYWNybzpvLm1vZGVsUHJvcGVydHlNYWNybyxwYXJhbWV0ZXJNYWNybzpvLnBhcmFtZXRlck1hY3JvLHJlcXVlc3RJbnRlcmNlcHRvcjpvLnJlcXVlc3RJbnRlcmNlcHRvcixyZXNwb25zZUludGVyY2VwdG9yOm8ucmVzcG9uc2VJbnRlcmNlcHRvcn19Zm9yKHZhciBpPWFyZ3VtZW50cy5sZW5ndGgsdT1uZXcgQXJyYXkoaT4zP2ktMzowKSxjPTM7YzxpO2MrKyl1W2MtM109YXJndW1lbnRzW2NdO3JldHVybiBXbi5hcHBseSh2b2lkIDAscygpKHI9W2UsdCxuXSkuY2FsbChyLHUpKX0sc2VyaWFsaXplUmVzOlgsb3BJZDptbi5lfSxzdGF0ZVBsdWdpbnM6e2NvbmZpZ3M6e3dyYXBBY3Rpb25zOiRufX19fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtuLnIodCksbi5kKHQsImRlZmF1bHQiLChmdW5jdGlvbigpe3JldHVybiBjfSkpO3ZhciByPW4oMTczKSxvPW4oMTQ5KSxhPW4oMzExKSxpPW4oMzEyKSxzPW4oMzEzKSx1PXtnZXRMb2NhbENvbmZpZzpmdW5jdGlvbigpe3JldHVybiBPYmplY3Qoci5wYXJzZVlhbWxDb25maWcpKCctLS1cbnVybDogImh0dHBzOi8vcGV0c3RvcmUuc3dhZ2dlci5pby92Mi9zd2FnZ2VyLmpzb24iXG5kb21faWQ6ICIjc3dhZ2dlci11aSJcbnZhbGlkYXRvclVybDogImh0dHBzOi8vdmFsaWRhdG9yLnN3YWdnZXIuaW8vdmFsaWRhdG9yIlxuJyl9fTtmdW5jdGlvbiBjKCl7cmV0dXJue3N0YXRlUGx1Z2luczp7c3BlYzp7YWN0aW9uczphLHNlbGVjdG9yczp1fSxjb25maWdzOntyZWR1Y2VyczpzLmRlZmF1bHQsYWN0aW9uczpvLHNlbGVjdG9yczppfX19fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjsoZnVuY3Rpb24oZSxyKXt2YXIgbyxhPW4oNDk5KTtvPSJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp2b2lkIDAhPT1lP2U6cjt2YXIgaT1PYmplY3QoYS5hKShvKTt0LmE9aX0pLmNhbGwodGhpcyxuKDUxKSxuKDYxOCkoZSkpfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big0MTMpLG89bigxOTMpLGE9big3NTcpLGk9big1Nikscz1uKDc2Mik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgdT1pKGUpP3I6YTtyZXR1cm4gbiYmcyhlLHQsbikmJih0PXZvaWQgMCksdShlLG8odCwzKSl9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNDMyKSxvPW4oNDMzKSxhPW4oNzgwKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQsaT1yKGFyZ3VtZW50c1sxXSk7cmV0dXJuIGkubm9ybWFsaXplcnx8MCE9PSh0PWkubGVuZ3RoPW8oaS5sZW5ndGgsZS5sZW5ndGgsaS5hc3luYykpJiYoaS5wcmltaXRpdmU/ITE9PT10P2kubm9ybWFsaXplcj1uKDgxNSk6dD4xJiYoaS5ub3JtYWxpemVyPW4oODE2KSh0KSk6aS5ub3JtYWxpemVyPSExPT09dD9uKDgxNykoKToxPT09dD9uKDgyMSkoKTpuKDgyMikodCkpLGkuYXN5bmMmJm4oODIzKSxpLnByb21pc2UmJm4oODI0KSxpLmRpc3Bvc2UmJm4oODMwKSxpLm1heEFnZSYmbig4MzEpLGkubWF4JiZuKDgzNCksaS5yZWZDb3VudGVyJiZuKDgzNiksYShlLGkpfX0sZnVuY3Rpb24oZSx0LG4pe2UuZXhwb3J0cz1uKDg4MSl9LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9big4ODYpfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big4OTIpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG51bGw9PWU/ZTpyKGUsdCxuKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dC5fX2VzTW9kdWxlPSEwLHQuY29ubmVjdD10LlByb3ZpZGVyPXZvaWQgMDt2YXIgcj1hKG4oOTg5KSksbz1hKG4oOTkxKSk7ZnVuY3Rpb24gYShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6e2RlZmF1bHQ6ZX19dC5Qcm92aWRlcj1yLmRlZmF1bHQsdC5jb25uZWN0PW8uZGVmYXVsdH0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDEwMzkpLG89bigxMDQwKTt0LmhpZ2hsaWdodD1pLHQuaGlnaGxpZ2h0QXV0bz1mdW5jdGlvbihlLHQpe3ZhciBuLHMsdSxjLGw9dHx8e30scD1sLnN1YnNldHx8ci5saXN0TGFuZ3VhZ2VzKCksZj1sLnByZWZpeCxoPXAubGVuZ3RoLGQ9LTE7bnVsbD09ZiYmKGY9YSk7aWYoInN0cmluZyIhPXR5cGVvZiBlKXRocm93IG8oIkV4cGVjdGVkIGBzdHJpbmdgIGZvciB2YWx1ZSwgZ290IGAlc2AiLGUpO3M9e3JlbGV2YW5jZTowLGxhbmd1YWdlOm51bGwsdmFsdWU6W119LG49e3JlbGV2YW5jZTowLGxhbmd1YWdlOm51bGwsdmFsdWU6W119O2Zvcig7KytkPGg7KWM9cFtkXSxyLmdldExhbmd1YWdlKGMpJiYoKHU9aShjLGUsdCkpLmxhbmd1YWdlPWMsdS5yZWxldmFuY2U+cy5yZWxldmFuY2UmJihzPXUpLHUucmVsZXZhbmNlPm4ucmVsZXZhbmNlJiYocz1uLG49dSkpO3MubGFuZ3VhZ2UmJihuLnNlY29uZEJlc3Q9cyk7cmV0dXJuIG59LHQucmVnaXN0ZXJMYW5ndWFnZT1mdW5jdGlvbihlLHQpe3IucmVnaXN0ZXJMYW5ndWFnZShlLHQpfSx0Lmxpc3RMYW5ndWFnZXM9ZnVuY3Rpb24oKXtyZXR1cm4gci5saXN0TGFuZ3VhZ2VzKCl9LHQucmVnaXN0ZXJBbGlhcz1mdW5jdGlvbihlLHQpe3ZhciBuLG89ZTt0JiYoKG89e30pW2VdPXQpO2ZvcihuIGluIG8pci5yZWdpc3RlckFsaWFzZXMob1tuXSx7bGFuZ3VhZ2VOYW1lOm59KX0scy5wcm90b3R5cGUuYWRkVGV4dD1mdW5jdGlvbihlKXt2YXIgdCxuLHI9dGhpcy5zdGFjaztpZigiIj09PWUpcmV0dXJuO3Q9cltyLmxlbmd0aC0xXSwobj10LmNoaWxkcmVuW3QuY2hpbGRyZW4ubGVuZ3RoLTFdKSYmInRleHQiPT09bi50eXBlP24udmFsdWUrPWU6dC5jaGlsZHJlbi5wdXNoKHt0eXBlOiJ0ZXh0Iix2YWx1ZTplfSl9LHMucHJvdG90eXBlLmFkZEtleXdvcmQ9ZnVuY3Rpb24oZSx0KXt0aGlzLm9wZW5Ob2RlKHQpLHRoaXMuYWRkVGV4dChlKSx0aGlzLmNsb3NlTm9kZSgpfSxzLnByb3RvdHlwZS5hZGRTdWJsYW5ndWFnZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuc3RhY2sscj1uW24ubGVuZ3RoLTFdLG89ZS5yb290Tm9kZS5jaGlsZHJlbixhPXQ/e3R5cGU6ImVsZW1lbnQiLHRhZ05hbWU6InNwYW4iLHByb3BlcnRpZXM6e2NsYXNzTmFtZTpbdF19LGNoaWxkcmVuOm99Om87ci5jaGlsZHJlbj1yLmNoaWxkcmVuLmNvbmNhdChhKX0scy5wcm90b3R5cGUub3Blbk5vZGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zdGFjayxuPXRoaXMub3B0aW9ucy5jbGFzc1ByZWZpeCtlLHI9dFt0Lmxlbmd0aC0xXSxvPXt0eXBlOiJlbGVtZW50Iix0YWdOYW1lOiJzcGFuIixwcm9wZXJ0aWVzOntjbGFzc05hbWU6W25dfSxjaGlsZHJlbjpbXX07ci5jaGlsZHJlbi5wdXNoKG8pLHQucHVzaChvKX0scy5wcm90b3R5cGUuY2xvc2VOb2RlPWZ1bmN0aW9uKCl7dGhpcy5zdGFjay5wb3AoKX0scy5wcm90b3R5cGUuY2xvc2VBbGxOb2Rlcz11LHMucHJvdG90eXBlLmZpbmFsaXplPXUscy5wcm90b3R5cGUudG9IVE1MPWZ1bmN0aW9uKCl7cmV0dXJuIiJ9O3ZhciBhPSJobGpzLSI7ZnVuY3Rpb24gaShlLHQsbil7dmFyIGksdT1yLmNvbmZpZ3VyZSh7fSksYz0obnx8e30pLnByZWZpeDtpZigic3RyaW5nIiE9dHlwZW9mIGUpdGhyb3cgbygiRXhwZWN0ZWQgYHN0cmluZ2AgZm9yIG5hbWUsIGdvdCBgJXNgIixlKTtpZighci5nZXRMYW5ndWFnZShlKSl0aHJvdyBvKCJVbmtub3duIGxhbmd1YWdlOiBgJXNgIGlzIG5vdCByZWdpc3RlcmVkIixlKTtpZigic3RyaW5nIiE9dHlwZW9mIHQpdGhyb3cgbygiRXhwZWN0ZWQgYHN0cmluZ2AgZm9yIHZhbHVlLCBnb3QgYCVzYCIsdCk7aWYobnVsbD09YyYmKGM9YSksci5jb25maWd1cmUoe19fZW1pdHRlcjpzLGNsYXNzUHJlZml4OmN9KSxpPXIuaGlnaGxpZ2h0KGUsdCwhMCksci5jb25maWd1cmUodXx8e30pLGkuZXJyb3JSYWlzZWQpdGhyb3cgaS5lcnJvclJhaXNlZDtyZXR1cm57cmVsZXZhbmNlOmkucmVsZXZhbmNlLGxhbmd1YWdlOmkubGFuZ3VhZ2UsdmFsdWU6aS5lbWl0dGVyLnJvb3ROb2RlLmNoaWxkcmVufX1mdW5jdGlvbiBzKGUpe3RoaXMub3B0aW9ucz1lLHRoaXMucm9vdE5vZGU9e2NoaWxkcmVuOltdfSx0aGlzLnN0YWNrPVt0aGlzLnJvb3ROb2RlXX1mdW5jdGlvbiB1KCl7fX0sZnVuY3Rpb24oZSx0LG4pe2UuZXhwb3J0cz1uKDEwNzIpfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMDk0KSxvPW4oNDk4KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj1vKGUsdCwiZ2V0Iik7cmV0dXJuIHIoZSxuKX0sZS5leHBvcnRzLmRlZmF1bHQ9ZS5leHBvcnRzLGUuZXhwb3J0cy5fX2VzTW9kdWxlPSEwfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMDk1KSxvPW4oNDk4KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe3ZhciBhPW8oZSx0LCJzZXQiKTtyZXR1cm4gcihlLGEsbiksbn0sZS5leHBvcnRzLmRlZmF1bHQ9ZS5leHBvcnRzLGUuZXhwb3J0cy5fX2VzTW9kdWxlPSEwfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMDApO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gcihlKS50b0xvd2VyQ2FzZSgpfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDExMDUpLkRlYm91bmNlSW5wdXQ7ci5EZWJvdW5jZUlucHV0PXIsZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDM5OCksbz1uKDM5MSksYT1uKDE4NyksaT1uKDM5OSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiByKGUpfHxvKGUpfHxhKGUpfHxpKCl9LGUuZXhwb3J0cy5kZWZhdWx0PWUuZXhwb3J0cyxlLmV4cG9ydHMuX19lc01vZHVsZT0hMH0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDIyKSxvPW4oMzcpLGE9bigxNTMpLGk9big0Nykscz1uKDYyKSx1PW4oNjkpLGM9bigxNTQpLGw9bigyMjQpLHA9bigxNTUpLGY9big0MSksaD1uKDEyOSksZD1mKCJpc0NvbmNhdFNwcmVhZGFibGUiKSxtPTkwMDcxOTkyNTQ3NDA5OTEsdj0iTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkIixnPWg+PTUxfHwhbygoZnVuY3Rpb24oKXt2YXIgZT1bXTtyZXR1cm4gZVtkXT0hMSxlLmNvbmNhdCgpWzBdIT09ZX0pKSx5PXAoImNvbmNhdCIpLGI9ZnVuY3Rpb24oZSl7aWYoIWkoZSkpcmV0dXJuITE7dmFyIHQ9ZVtkXTtyZXR1cm4gdm9pZCAwIT09dD8hIXQ6YShlKX07cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOiFnfHwheX0se2NvbmNhdDpmdW5jdGlvbihlKXt2YXIgdCxuLHIsbyxhLGk9cyh0aGlzKSxwPWwoaSwwKSxmPTA7Zm9yKHQ9LTEscj1hcmd1bWVudHMubGVuZ3RoO3Q8cjt0KyspaWYoYihhPS0xPT09dD9pOmFyZ3VtZW50c1t0XSkpe2lmKGYrKG89dShhLmxlbmd0aCkpPm0pdGhyb3cgVHlwZUVycm9yKHYpO2ZvcihuPTA7bjxvO24rKyxmKyspbiBpbiBhJiZjKHAsZixhW25dKX1lbHNle2lmKGY+PW0pdGhyb3cgVHlwZUVycm9yKHYpO2MocCxmKyssYSl9cmV0dXJuIHAubGVuZ3RoPWYscH19KX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNDgpLG89bigzNyksYT1uKDIyMyk7ZS5leHBvcnRzPSFyJiYhbygoZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KGEoImRpdiIpLCJhIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSkuYX0pKX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMzcpLG89LyN8XC5wcm90b3R5cGVcLi8sYT1mdW5jdGlvbihlLHQpe3ZhciBuPXNbaShlKV07cmV0dXJuIG49PWN8fG4hPXUmJigiZnVuY3Rpb24iPT10eXBlb2YgdD9yKHQpOiEhdCl9LGk9YS5ub3JtYWxpemU9ZnVuY3Rpb24oZSl7cmV0dXJuIFN0cmluZyhlKS5yZXBsYWNlKG8sIi4iKS50b0xvd2VyQ2FzZSgpfSxzPWEuZGF0YT17fSx1PWEuTkFUSVZFPSJOIixjPWEuUE9MWUZJTEw9IlAiO2UuZXhwb3J0cz1hfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigyMjcpO2UuZXhwb3J0cz1yJiYhU3ltYm9sLnNoYW0mJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMjIpLG89big0MCksYT1uKDcwKSxpPW4oOTYpLHM9big0OCksdT1uKDIyNyksYz1uKDM2MiksbD1uKDM3KSxwPW4oNTUpLGY9bigxNTMpLGg9big0NyksZD1uKDUyKSxtPW4oNjIpLHY9big2NiksZz1uKDE4MCkseT1uKDEwNyksYj1uKDExMSksXz1uKDE1Niksdz1uKDIzMikseD1uKDUzOCksRT1uKDIzMyksUz1uKDEyNyksQz1uKDY4KSxBPW4oMTc4KSxPPW4oNjcpLGs9bigxMTIpLGo9bigyMjUpLFQ9bigxODMpLEk9bigxNTcpLFA9bigxODEpLE49big0MSksTT1uKDIzNCksUj1uKDQ0KSxEPW4oOTcpLEw9big3NyksQj1uKDg1KS5mb3JFYWNoLEY9VCgiaGlkZGVuIiksVT0iU3ltYm9sIixxPU4oInRvUHJpbWl0aXZlIiksej1MLnNldCxWPUwuZ2V0dGVyRm9yKFUpLFc9T2JqZWN0LnByb3RvdHlwZSxIPW8uU3ltYm9sLCQ9YSgiSlNPTiIsInN0cmluZ2lmeSIpLEo9Uy5mLEs9Qy5mLFk9eC5mLEc9QS5mLFo9aigic3ltYm9scyIpLFg9aigib3Atc3ltYm9scyIpLFE9aigic3RyaW5nLXRvLXN5bWJvbC1yZWdpc3RyeSIpLGVlPWooInN5bWJvbC10by1zdHJpbmctcmVnaXN0cnkiKSx0ZT1qKCJ3a3MiKSxuZT1vLlFPYmplY3QscmU9IW5lfHwhbmUucHJvdG90eXBlfHwhbmUucHJvdG90eXBlLmZpbmRDaGlsZCxvZT1zJiZsKChmdW5jdGlvbigpe3JldHVybiA3IT1iKEsoe30sImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gSyh0aGlzLCJhIix7dmFsdWU6N30pLmF9fSkpLmF9KSk/ZnVuY3Rpb24oZSx0LG4pe3ZhciByPUooVyx0KTtyJiZkZWxldGUgV1t0XSxLKGUsdCxuKSxyJiZlIT09VyYmSyhXLHQscil9OkssYWU9ZnVuY3Rpb24oZSx0KXt2YXIgbj1aW2VdPWIoSC5wcm90b3R5cGUpO3JldHVybiB6KG4se3R5cGU6VSx0YWc6ZSxkZXNjcmlwdGlvbjp0fSksc3x8KG4uZGVzY3JpcHRpb249dCksbn0saWU9Yz9mdW5jdGlvbihlKXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIGV9OmZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QoZSlpbnN0YW5jZW9mIEh9LHNlPWZ1bmN0aW9uKGUsdCxuKXtlPT09VyYmc2UoWCx0LG4pLGQoZSk7dmFyIHI9Zyh0LCEwKTtyZXR1cm4gZChuKSxwKFoscik/KG4uZW51bWVyYWJsZT8ocChlLEYpJiZlW0ZdW3JdJiYoZVtGXVtyXT0hMSksbj1iKG4se2VudW1lcmFibGU6eSgwLCExKX0pKToocChlLEYpfHxLKGUsRix5KDEse30pKSxlW0ZdW3JdPSEwKSxvZShlLHIsbikpOksoZSxyLG4pfSx1ZT1mdW5jdGlvbihlLHQpe2QoZSk7dmFyIG49dih0KSxyPV8obikuY29uY2F0KGZlKG4pKTtyZXR1cm4gQihyLChmdW5jdGlvbih0KXtzJiYhY2UuY2FsbChuLHQpfHxzZShlLHQsblt0XSl9KSksZX0sY2U9ZnVuY3Rpb24oZSl7dmFyIHQ9ZyhlLCEwKSxuPUcuY2FsbCh0aGlzLHQpO3JldHVybiEodGhpcz09PVcmJnAoWix0KSYmIXAoWCx0KSkmJighKG58fCFwKHRoaXMsdCl8fCFwKFosdCl8fHAodGhpcyxGKSYmdGhpc1tGXVt0XSl8fG4pfSxsZT1mdW5jdGlvbihlLHQpe3ZhciBuPXYoZSkscj1nKHQsITApO2lmKG4hPT1XfHwhcChaLHIpfHxwKFgscikpe3ZhciBvPUoobixyKTtyZXR1cm4hb3x8IXAoWixyKXx8cChuLEYpJiZuW0ZdW3JdfHwoby5lbnVtZXJhYmxlPSEwKSxvfX0scGU9ZnVuY3Rpb24oZSl7dmFyIHQ9WSh2KGUpKSxuPVtdO3JldHVybiBCKHQsKGZ1bmN0aW9uKGUpe3AoWixlKXx8cChJLGUpfHxuLnB1c2goZSl9KSksbn0sZmU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZT09PVcsbj1ZKHQ/WDp2KGUpKSxyPVtdO3JldHVybiBCKG4sKGZ1bmN0aW9uKGUpeyFwKFosZSl8fHQmJiFwKFcsZSl8fHIucHVzaChaW2VdKX0pKSxyfTsodXx8KGsoKEg9ZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2YgSCl0aHJvdyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3ZhciBlPWFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9TdHJpbmcoYXJndW1lbnRzWzBdKTp2b2lkIDAsdD1QKGUpLG49ZnVuY3Rpb24oZSl7dGhpcz09PVcmJm4uY2FsbChYLGUpLHAodGhpcyxGKSYmcCh0aGlzW0ZdLHQpJiYodGhpc1tGXVt0XT0hMSksb2UodGhpcyx0LHkoMSxlKSl9O3JldHVybiBzJiZyZSYmb2UoVyx0LHtjb25maWd1cmFibGU6ITAsc2V0Om59KSxhZSh0LGUpfSkucHJvdG90eXBlLCJ0b1N0cmluZyIsKGZ1bmN0aW9uKCl7cmV0dXJuIFYodGhpcykudGFnfSkpLGsoSCwid2l0aG91dFNldHRlciIsKGZ1bmN0aW9uKGUpe3JldHVybiBhZShQKGUpLGUpfSkpLEEuZj1jZSxDLmY9c2UsUy5mPWxlLHcuZj14LmY9cGUsRS5mPWZlLE0uZj1mdW5jdGlvbihlKXtyZXR1cm4gYWUoTihlKSxlKX0scyYmKEsoSC5wcm90b3R5cGUsImRlc2NyaXB0aW9uIix7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBWKHRoaXMpLmRlc2NyaXB0aW9ufX0pLGl8fGsoVywicHJvcGVydHlJc0VudW1lcmFibGUiLGNlLHt1bnNhZmU6ITB9KSkpLHIoe2dsb2JhbDohMCx3cmFwOiEwLGZvcmNlZDohdSxzaGFtOiF1fSx7U3ltYm9sOkh9KSxCKF8odGUpLChmdW5jdGlvbihlKXtSKGUpfSkpLHIoe3RhcmdldDpVLHN0YXQ6ITAsZm9yY2VkOiF1fSx7Zm9yOmZ1bmN0aW9uKGUpe3ZhciB0PVN0cmluZyhlKTtpZihwKFEsdCkpcmV0dXJuIFFbdF07dmFyIG49SCh0KTtyZXR1cm4gUVt0XT1uLGVlW25dPXQsbn0sa2V5Rm9yOmZ1bmN0aW9uKGUpe2lmKCFpZShlKSl0aHJvdyBUeXBlRXJyb3IoZSsiIGlzIG5vdCBhIHN5bWJvbCIpO2lmKHAoZWUsZSkpcmV0dXJuIGVlW2VdfSx1c2VTZXR0ZXI6ZnVuY3Rpb24oKXtyZT0hMH0sdXNlU2ltcGxlOmZ1bmN0aW9uKCl7cmU9ITF9fSkscih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOiF1LHNoYW06IXN9LHtjcmVhdGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dD9iKGUpOnVlKGIoZSksdCl9LGRlZmluZVByb3BlcnR5OnNlLGRlZmluZVByb3BlcnRpZXM6dWUsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOmxlfSkscih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOiF1fSx7Z2V0T3duUHJvcGVydHlOYW1lczpwZSxnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ZmV9KSxyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6bCgoZnVuY3Rpb24oKXtFLmYoMSl9KSl9LHtnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ZnVuY3Rpb24oZSl7cmV0dXJuIEUuZihtKGUpKX19KSwkKSYmcih7dGFyZ2V0OiJKU09OIixzdGF0OiEwLGZvcmNlZDohdXx8bCgoZnVuY3Rpb24oKXt2YXIgZT1IKCk7cmV0dXJuIltudWxsXSIhPSQoW2VdKXx8Int9IiE9JCh7YTplfSl8fCJ7fSIhPSQoT2JqZWN0KGUpKX0pKX0se3N0cmluZ2lmeTpmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByLG89W2VdLGE9MTthcmd1bWVudHMubGVuZ3RoPmE7KW8ucHVzaChhcmd1bWVudHNbYSsrXSk7aWYocj10LChoKHQpfHx2b2lkIDAhPT1lKSYmIWllKGUpKXJldHVybiBmKHQpfHwodD1mdW5jdGlvbihlLHQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiByJiYodD1yLmNhbGwodGhpcyxlLHQpKSwhaWUodCkpcmV0dXJuIHR9KSxvWzFdPXQsJC5hcHBseShudWxsLG8pfX0pO0gucHJvdG90eXBlW3FdfHxPKEgucHJvdG90eXBlLHEsSC5wcm90b3R5cGUudmFsdWVPZiksRChILFUpLElbRl09ITB9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDU1KSxvPW4oNjYpLGE9bigyMjkpLmluZGV4T2YsaT1uKDE1Nyk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIG4scz1vKGUpLHU9MCxjPVtdO2ZvcihuIGluIHMpIXIoaSxuKSYmcihzLG4pJiZjLnB1c2gobik7Zm9yKDt0Lmxlbmd0aD51OylyKHMsbj10W3UrK10pJiYofmEoYyxuKXx8Yy5wdXNoKG4pKTtyZXR1cm4gY319LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDcwKTtlLmV4cG9ydHM9cigiZG9jdW1lbnQiLCJkb2N1bWVudEVsZW1lbnQiKX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNDApLG89bigzNjcpLGE9ci5XZWFrTWFwO2UuZXhwb3J0cz0iZnVuY3Rpb24iPT10eXBlb2YgYSYmL25hdGl2ZSBjb2RlLy50ZXN0KG8oYSkpfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigyMjYpLG89RnVuY3Rpb24udG9TdHJpbmc7ImZ1bmN0aW9uIiE9dHlwZW9mIHIuaW5zcGVjdFNvdXJjZSYmKHIuaW5zcGVjdFNvdXJjZT1mdW5jdGlvbihlKXtyZXR1cm4gby5jYWxsKGUpfSksZS5leHBvcnRzPXIuaW5zcGVjdFNvdXJjZX0sZnVuY3Rpb24oZSx0LG4pe24oNDQpKCJpdGVyYXRvciIpfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMjgpLG89bigxMDgpLGE9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQsbil7dmFyIGEsaSxzPVN0cmluZyhvKHQpKSx1PXIobiksYz1zLmxlbmd0aDtyZXR1cm4gdTwwfHx1Pj1jP2U/IiI6dm9pZCAwOihhPXMuY2hhckNvZGVBdCh1KSk8NTUyOTZ8fGE+NTYzMTl8fHUrMT09PWN8fChpPXMuY2hhckNvZGVBdCh1KzEpKTw1NjMyMHx8aT41NzM0Mz9lP3MuY2hhckF0KHUpOmE6ZT9zLnNsaWNlKHUsdSsyKTppLTU2MzIwKyhhLTU1Mjk2PDwxMCkrNjU1MzZ9fTtlLmV4cG9ydHM9e2NvZGVBdDphKCExKSxjaGFyQXQ6YSghMCl9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzcxKS5JdGVyYXRvclByb3RvdHlwZSxvPW4oMTExKSxhPW4oMTA3KSxpPW4oOTcpLHM9bigxMzEpLHU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgYz10KyIgSXRlcmF0b3IiO3JldHVybiBlLnByb3RvdHlwZT1vKHIse25leHQ6YSgxLG4pfSksaShlLGMsITEsITApLHNbY109dSxlfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcixvLGEsaT1uKDM3KSxzPW4oMTg0KSx1PW4oNjcpLGM9big1NSksbD1uKDQxKSxwPW4oOTYpLGY9bCgiaXRlcmF0b3IiKSxoPSExO1tdLmtleXMmJigibmV4dCJpbihhPVtdLmtleXMoKSk/KG89cyhzKGEpKSkhPT1PYmplY3QucHJvdG90eXBlJiYocj1vKTpoPSEwKTt2YXIgZD1udWxsPT1yfHxpKChmdW5jdGlvbigpe3ZhciBlPXt9O3JldHVybiByW2ZdLmNhbGwoZSkhPT1lfSkpO2QmJihyPXt9KSxwJiYhZHx8YyhyLGYpfHx1KHIsZiwoZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pKSxlLmV4cG9ydHM9e0l0ZXJhdG9yUHJvdG90eXBlOnIsQlVHR1lfU0FGQVJJX0lURVJBVE9SUzpofX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMzcpO2UuZXhwb3J0cz0hcigoZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7fXJldHVybiBlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1udWxsLE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXcgZSkhPT1lLnByb3RvdHlwZX0pKX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNTcyKSxvPUFycmF5LnByb3RvdHlwZTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5maWx0ZXI7cmV0dXJuIGU9PT1vfHxlIGluc3RhbmNlb2YgQXJyYXkmJnQ9PT1vLmZpbHRlcj9yOnR9fSxmdW5jdGlvbihlLHQsbil7big1NzUpO3ZhciByPW4oMzMpO2UuZXhwb3J0cz1yLk9iamVjdC5rZXlzfSxmdW5jdGlvbihlLHQpe3ZhciBuPXt9LnRvU3RyaW5nO2UuZXhwb3J0cz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1uLmNhbGwoZSl9fSxmdW5jdGlvbihlLHQsbil7big1ODIpO3ZhciByPW4oMzMpLk9iamVjdCxvPWUuZXhwb3J0cz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHIuZGVmaW5lUHJvcGVydHkoZSx0LG4pfTtyLmRlZmluZVByb3BlcnR5LnNoYW0mJihvLnNoYW09ITApfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNzYpLG89big0NyksYT1bXS5zbGljZSxpPXt9LHM9ZnVuY3Rpb24oZSx0LG4pe2lmKCEodCBpbiBpKSl7Zm9yKHZhciByPVtdLG89MDtvPHQ7bysrKXJbb109ImFbIitvKyJdIjtpW3RdPUZ1bmN0aW9uKCJDLGEiLCJyZXR1cm4gbmV3IEMoIityLmpvaW4oIiwiKSsiKSIpfXJldHVybiBpW3RdKGUsbil9O2UuZXhwb3J0cz1GdW5jdGlvbi5iaW5kfHxmdW5jdGlvbihlKXt2YXIgdD1yKHRoaXMpLG49YS5jYWxsKGFyZ3VtZW50cywxKSxpPWZ1bmN0aW9uKCl7dmFyIHI9bi5jb25jYXQoYS5jYWxsKGFyZ3VtZW50cykpO3JldHVybiB0aGlzIGluc3RhbmNlb2YgaT9zKHQsci5sZW5ndGgscik6dC5hcHBseShlLHIpfTtyZXR1cm4gbyh0LnByb3RvdHlwZSkmJihpLnByb3RvdHlwZT10LnByb3RvdHlwZSksaX19LGZ1bmN0aW9uKGUsdCxuKXtuKDU4OCk7dmFyIHI9bigzMyk7ZS5leHBvcnRzPXIuT2JqZWN0LmFzc2lnbn0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDQ4KSxvPW4oMzcpLGE9bigxNTYpLGk9bigyMzMpLHM9bigxNzgpLHU9big2MiksYz1uKDE3OSksbD1PYmplY3QuYXNzaWduLHA9T2JqZWN0LmRlZmluZVByb3BlcnR5O2UuZXhwb3J0cz0hbHx8bygoZnVuY3Rpb24oKXtpZihyJiYxIT09bCh7YjoxfSxsKHAoe30sImEiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3AodGhpcywiYiIse3ZhbHVlOjMsZW51bWVyYWJsZTohMX0pfX0pLHtiOjJ9KSkuYilyZXR1cm4hMDt2YXIgZT17fSx0PXt9LG49U3ltYm9sKCksbz0iYWJjZGVmZ2hpamtsbW5vcHFyc3QiO3JldHVybiBlW25dPTcsby5zcGxpdCgiIikuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dFtlXT1lfSkpLDchPWwoe30sZSlbbl18fGEobCh7fSx0KSkuam9pbigiIikhPW99KSk/ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49dShlKSxvPWFyZ3VtZW50cy5sZW5ndGgsbD0xLHA9aS5mLGY9cy5mO28+bDspZm9yKHZhciBoLGQ9Yyhhcmd1bWVudHNbbCsrXSksbT1wP2EoZCkuY29uY2F0KHAoZCkpOmEoZCksdj1tLmxlbmd0aCxnPTA7dj5nOyloPW1bZysrXSxyJiYhZi5jYWxsKGQsaCl8fChuW2hdPWRbaF0pO3JldHVybiBufTpsfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big1OTApLG89QXJyYXkucHJvdG90eXBlO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1lLnNsaWNlO3JldHVybiBlPT09b3x8ZSBpbnN0YW5jZW9mIEFycmF5JiZ0PT09by5zbGljZT9yOnR9fSxmdW5jdGlvbihlLHQsbil7big1OTMpO3ZhciByPW4oMzMpO2UuZXhwb3J0cz1yLkFycmF5LmlzQXJyYXl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNTkpLG89bigzOCksYT1uKDM4MyksaT0obigzODQpLG4oMjM5KSk7bigyNSksbig2MDMpO2Z1bmN0aW9uIHMoZSx0LG4pe3RoaXMucHJvcHM9ZSx0aGlzLmNvbnRleHQ9dCx0aGlzLnJlZnM9aSx0aGlzLnVwZGF0ZXI9bnx8YX1mdW5jdGlvbiB1KGUsdCxuKXt0aGlzLnByb3BzPWUsdGhpcy5jb250ZXh0PXQsdGhpcy5yZWZzPWksdGhpcy51cGRhdGVyPW58fGF9ZnVuY3Rpb24gYygpe31zLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PXt9LHMucHJvdG90eXBlLnNldFN0YXRlPWZ1bmN0aW9uKGUsdCl7Im9iamVjdCIhPXR5cGVvZiBlJiYiZnVuY3Rpb24iIT10eXBlb2YgZSYmbnVsbCE9ZSYmcigiODUiKSx0aGlzLnVwZGF0ZXIuZW5xdWV1ZVNldFN0YXRlKHRoaXMsZSksdCYmdGhpcy51cGRhdGVyLmVucXVldWVDYWxsYmFjayh0aGlzLHQsInNldFN0YXRlIil9LHMucHJvdG90eXBlLmZvcmNlVXBkYXRlPWZ1bmN0aW9uKGUpe3RoaXMudXBkYXRlci5lbnF1ZXVlRm9yY2VVcGRhdGUodGhpcyksZSYmdGhpcy51cGRhdGVyLmVucXVldWVDYWxsYmFjayh0aGlzLGUsImZvcmNlVXBkYXRlIil9LGMucHJvdG90eXBlPXMucHJvdG90eXBlLHUucHJvdG90eXBlPW5ldyBjLHUucHJvdG90eXBlLmNvbnN0cnVjdG9yPXUsbyh1LnByb3RvdHlwZSxzLnByb3RvdHlwZSksdS5wcm90b3R5cGUuaXNQdXJlUmVhY3RDb21wb25lbnQ9ITAsZS5leHBvcnRzPXtDb21wb25lbnQ6cyxQdXJlQ29tcG9uZW50OnV9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24oMzQpO3ZhciByPXtpc01vdW50ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuITF9LGVucXVldWVDYWxsYmFjazpmdW5jdGlvbihlLHQpe30sZW5xdWV1ZUZvcmNlVXBkYXRlOmZ1bmN0aW9uKGUpe30sZW5xdWV1ZVJlcGxhY2VTdGF0ZTpmdW5jdGlvbihlLHQpe30sZW5xdWV1ZVNldFN0YXRlOmZ1bmN0aW9uKGUsdCl7fX07ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPSExfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5mb3ImJlN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKXx8NjAxMDM7ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9big2MTEpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gcihlLCExKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPW4oNjEyKX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9IlNFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEIn0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5kZWZhdWx0PWZ1bmN0aW9uKGUpe3JldHVybiBlJiYiQEByZWR1eC9JTklUIj09PWUudHlwZT8iaW5pdGlhbFN0YXRlIGFyZ3VtZW50IHBhc3NlZCB0byBjcmVhdGVTdG9yZSI6InByZXZpb3VzIHN0YXRlIHJlY2VpdmVkIGJ5IHRoZSByZWR1Y2VyIn0sZS5leHBvcnRzPXQuZGVmYXVsdH0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXsobnVsbD09dHx8dD5lLmxlbmd0aCkmJih0PWUubGVuZ3RoKTtmb3IodmFyIG49MCxyPW5ldyBBcnJheSh0KTtuPHQ7bisrKXJbbl09ZVtuXTtyZXR1cm4gcn0sZS5leHBvcnRzLmRlZmF1bHQ9ZS5leHBvcnRzLGUuZXhwb3J0cy5fX2VzTW9kdWxlPSEwfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxNzcpLG89bigyNDEpLGE9bigzOTIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZih2b2lkIDAhPT1yJiZudWxsIT1vKGUpfHxudWxsIT1lWyJAQGl0ZXJhdG9yIl0pcmV0dXJuIGEoZSl9LGUuZXhwb3J0cy5kZWZhdWx0PWUuZXhwb3J0cyxlLmV4cG9ydHMuX19lc01vZHVsZT0hMH0sZnVuY3Rpb24oZSx0LG4pe2UuZXhwb3J0cz1uKDYyNil9LGZ1bmN0aW9uKGUsdCxuKXtuKDEzMCksbig2MjcpO3ZhciByPW4oMzMpO2UuZXhwb3J0cz1yLkFycmF5LmZyb219LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxMDkpLG89big2MiksYT1uKDYyOCksaT1uKDM5Nikscz1uKDY5KSx1PW4oMTU0KSxjPW4oMTYwKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQsbixsLHAsZixoLGQ9byhlKSxtPSJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzP3RoaXM6QXJyYXksdj1hcmd1bWVudHMubGVuZ3RoLGc9dj4xP2FyZ3VtZW50c1sxXTp2b2lkIDAseT12b2lkIDAhPT1nLGI9YyhkKSxfPTA7aWYoeSYmKGc9cihnLHY+Mj9hcmd1bWVudHNbMl06dm9pZCAwLDIpKSxudWxsPT1ifHxtPT1BcnJheSYmaShiKSlmb3Iobj1uZXcgbSh0PXMoZC5sZW5ndGgpKTt0Pl87XysrKWg9eT9nKGRbX10sXyk6ZFtfXSx1KG4sXyxoKTtlbHNlIGZvcihmPShwPWIuY2FsbChkKSkubmV4dCxuPW5ldyBtOyEobD1mLmNhbGwocCkpLmRvbmU7XysrKWg9eT9hKHAsZyxbbC52YWx1ZSxfXSwhMCk6bC52YWx1ZSx1KG4sXyxoKTtyZXR1cm4gbi5sZW5ndGg9XyxufX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNTIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1lLnJldHVybjtpZih2b2lkIDAhPT10KXJldHVybiByKHQuY2FsbChlKSkudmFsdWV9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big0MSksbz1uKDEzMSksYT1yKCJpdGVyYXRvciIpLGk9QXJyYXkucHJvdG90eXBlO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwIT09ZSYmKG8uQXJyYXk9PT1lfHxpW2FdPT09ZSl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big0MSkoIml0ZXJhdG9yIiksbz0hMTt0cnl7dmFyIGE9MCxpPXtuZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6ISFhKyt9fSxyZXR1cm46ZnVuY3Rpb24oKXtvPSEwfX07aVtyXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxBcnJheS5mcm9tKGksKGZ1bmN0aW9uKCl7dGhyb3cgMn0pKX1jYXRjaChlKXt9ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7aWYoIXQmJiFvKXJldHVybiExO3ZhciBuPSExO3RyeXt2YXIgYT17fTthW3JdPWZ1bmN0aW9uKCl7cmV0dXJue25leHQ6ZnVuY3Rpb24oKXtyZXR1cm57ZG9uZTpuPSEwfX19fSxlKGEpfWNhdGNoKGUpe31yZXR1cm4gbn19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDI0MCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKHIoZSkpcmV0dXJuIGV9LGUuZXhwb3J0cy5kZWZhdWx0PWUuZXhwb3J0cyxlLmV4cG9ydHMuX19lc01vZHVsZT0hMH0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfSxlLmV4cG9ydHMuZGVmYXVsdD1lLmV4cG9ydHMsZS5leHBvcnRzLl9fZXNNb2R1bGU9ITB9LGZ1bmN0aW9uKGUsdCxuKXtuKDg2KTt2YXIgcj1uKDYzNiksbz1uKDk4KSxhPUFycmF5LnByb3RvdHlwZSxpPXtET01Ub2tlbkxpc3Q6ITAsTm9kZUxpc3Q6ITB9O2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1lLmZvckVhY2g7cmV0dXJuIGU9PT1hfHxlIGluc3RhbmNlb2YgQXJyYXkmJnQ9PT1hLmZvckVhY2h8fGkuaGFzT3duUHJvcGVydHkobyhlKSk/cjp0fX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNjU4KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYocihlKSl0aHJvdyBUeXBlRXJyb3IoIlRoZSBtZXRob2QgZG9lc24ndCBhY2NlcHQgcmVndWxhciBleHByZXNzaW9ucyIpO3JldHVybiBlfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNDEpKCJtYXRjaCIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD0vLi87dHJ5eyIvLi8iW2VdKHQpfWNhdGNoKG4pe3RyeXtyZXR1cm4gdFtyXT0hMSwiLy4vIltlXSh0KX1jYXRjaChlKXt9fXJldHVybiExfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNjYwKSxvPUFycmF5LnByb3RvdHlwZTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5pbmRleE9mO3JldHVybiBlPT09b3x8ZSBpbnN0YW5jZW9mIEFycmF5JiZ0PT09by5pbmRleE9mP3I6dH19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPSJcdFxuXHZcZlxyIMKg4ZqA4oCA4oCB4oCC4oCD4oCE4oCF4oCG4oCH4oCI4oCJ4oCK4oCv4oGf44CAXHUyMDI4XHUyMDI5XHVmZWZmIn0sZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbih0KXt2YXIgbj0ib2JqZWN0Ij09dHlwZW9mIHQmJnQmJnQuT2JqZWN0PT09T2JqZWN0JiZ0O2UuZXhwb3J0cz1ufSkuY2FsbCh0aGlzLG4oNTEpKX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49LTEscj1udWxsPT1lPzA6ZS5sZW5ndGgsbz1BcnJheShyKTsrK248cjspb1tuXT10KGVbbl0sbixlKTtyZXR1cm4gb319LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0tMSxvPWUubGVuZ3RoO3Q8MCYmKHQ9LXQ+bz8wOm8rdCksKG49bj5vP286bik8MCYmKG4rPW8pLG89dD5uPzA6bi10Pj4+MCx0Pj4+PTA7Zm9yKHZhciBhPUFycmF5KG8pOysrcjxvOylhW3JdPWVbcit0XTtyZXR1cm4gYX19LGZ1bmN0aW9uKGUsdCl7dmFyIG49UmVnRXhwKCJbXFx1MjAwZFxcdWQ4MDAtXFx1ZGZmZlxcdTAzMDAtXFx1MDM2ZlxcdWZlMjAtXFx1ZmUyZlxcdTIwZDAtXFx1MjBmZlxcdWZlMGVcXHVmZTBmXSIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gbi50ZXN0KGUpfX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89LTEsYT1udWxsPT1lPzA6ZS5sZW5ndGg7Zm9yKHImJmEmJihuPWVbKytvXSk7KytvPGE7KW49dChuLGVbb10sbyxlKTtyZXR1cm4gbn19LGZ1bmN0aW9uKGUsdCl7dmFyIG49RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZihudWxsIT1lKXt0cnl7cmV0dXJuIG4uY2FsbChlKX1jYXRjaChlKXt9dHJ5e3JldHVybiBlKyIifWNhdGNoKGUpe319cmV0dXJuIiJ9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big3MjIpLG89big4OCk7ZS5leHBvcnRzPWZ1bmN0aW9uIGUodCxuLGEsaSxzKXtyZXR1cm4gdD09PW58fChudWxsPT10fHxudWxsPT1ufHwhbyh0KSYmIW8obik/dCE9dCYmbiE9bjpyKHQsbixhLGksZSxzKSl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big3MjMpLG89big0MTMpLGE9big3MjYpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixpLHMsdSl7dmFyIGM9MSZuLGw9ZS5sZW5ndGgscD10Lmxlbmd0aDtpZihsIT1wJiYhKGMmJnA+bCkpcmV0dXJuITE7dmFyIGY9dS5nZXQoZSksaD11LmdldCh0KTtpZihmJiZoKXJldHVybiBmPT10JiZoPT1lO3ZhciBkPS0xLG09ITAsdj0yJm4/bmV3IHI6dm9pZCAwO2Zvcih1LnNldChlLHQpLHUuc2V0KHQsZSk7KytkPGw7KXt2YXIgZz1lW2RdLHk9dFtkXTtpZihpKXZhciBiPWM/aSh5LGcsZCx0LGUsdSk6aShnLHksZCxlLHQsdSk7aWYodm9pZCAwIT09Yil7aWYoYiljb250aW51ZTttPSExO2JyZWFrfWlmKHYpe2lmKCFvKHQsKGZ1bmN0aW9uKGUsdCl7aWYoIWEodix0KSYmKGc9PT1lfHxzKGcsZSxuLGksdSkpKXJldHVybiB2LnB1c2godCl9KSkpe209ITE7YnJlYWt9fWVsc2UgaWYoZyE9PXkmJiFzKGcseSxuLGksdSkpe209ITE7YnJlYWt9fXJldHVybiB1LmRlbGV0ZShlKSx1LmRlbGV0ZSh0KSxtfX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49LTEscj1udWxsPT1lPzA6ZS5sZW5ndGg7KytuPHI7KWlmKHQoZVtuXSxuLGUpKXJldHVybiEwO3JldHVybiExfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNzEpLlVpbnQ4QXJyYXk7ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDQxNiksbz1uKDI0NiksYT1uKDEzNik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiByKGUsYSxvKX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDI0NSksbz1uKDU2KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe3ZhciBhPXQoZSk7cmV0dXJuIG8oZSk/YTpyKGEsbihlKSl9fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbigpe3JldHVybltdfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNzMyKSxvPW4oMTk0KSxhPW4oNTYpLGk9bigxOTUpLHM9bigxOTcpLHU9bigyNDcpLGM9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj1hKGUpLGw9IW4mJm8oZSkscD0hbiYmIWwmJmkoZSksZj0hbiYmIWwmJiFwJiZ1KGUpLGg9bnx8bHx8cHx8ZixkPWg/cihlLmxlbmd0aCxTdHJpbmcpOltdLG09ZC5sZW5ndGg7Zm9yKHZhciB2IGluIGUpIXQmJiFjLmNhbGwoZSx2KXx8aCYmKCJsZW5ndGgiPT12fHxwJiYoIm9mZnNldCI9PXZ8fCJwYXJlbnQiPT12KXx8ZiYmKCJidWZmZXIiPT12fHwiYnl0ZUxlbmd0aCI9PXZ8fCJieXRlT2Zmc2V0Ij09dil8fHModixtKSl8fGQucHVzaCh2KTtyZXR1cm4gZH19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDE5OCksbz1uKDczNiksYT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZighcihlKSlyZXR1cm4gbyhlKTt2YXIgdD1bXTtmb3IodmFyIG4gaW4gT2JqZWN0KGUpKWEuY2FsbChlLG4pJiYiY29uc3RydWN0b3IiIT1uJiZ0LnB1c2gobik7cmV0dXJuIHR9fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gZSh0KG4pKX19fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big1OSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBlPT1lJiYhcihlKX19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBudWxsIT1uJiYobltlXT09PXQmJih2b2lkIDAhPT10fHxlIGluIE9iamVjdChuKSkpfX19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBlfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNzU1KSxvPW4oNTkpLGE9bigxODgpLGk9L15bLStdMHhbMC05YS1mXSskL2kscz0vXjBiWzAxXSskL2ksdT0vXjBvWzAtN10rJC9pLGM9cGFyc2VJbnQ7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKCJudW1iZXIiPT10eXBlb2YgZSlyZXR1cm4gZTtpZihhKGUpKXJldHVybiBOYU47aWYobyhlKSl7dmFyIHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGUudmFsdWVPZj9lLnZhbHVlT2YoKTplO2U9byh0KT90KyIiOnR9aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiAwPT09ZT9lOitlO2U9cihlKTt2YXIgbj1zLnRlc3QoZSk7cmV0dXJuIG58fHUudGVzdChlKT9jKGUuc2xpY2UoMiksbj8yOjgpOmkudGVzdChlKT9OYU46K2V9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big3NTgpLG89big3NjEpKHIpO2UuZXhwb3J0cz1vfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiOyhmdW5jdGlvbih0LHIpe3ZhciBvPW4oMTk5KTtlLmV4cG9ydHM9Yjt2YXIgYSxpPW4oMzc1KTtiLlJlYWRhYmxlU3RhdGU9eTtuKDI1MykuRXZlbnRFbWl0dGVyO3ZhciBzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUubGlzdGVuZXJzKHQpLmxlbmd0aH0sdT1uKDQyNyksYz1uKDY0KS5CdWZmZXIsbD10LlVpbnQ4QXJyYXl8fGZ1bmN0aW9uKCl7fTt2YXIgcD1uKDE2Myk7cC5pbmhlcml0cz1uKDYzKTt2YXIgZj1uKDc2NSksaD12b2lkIDA7aD1mJiZmLmRlYnVnbG9nP2YuZGVidWdsb2coInN0cmVhbSIpOmZ1bmN0aW9uKCl7fTt2YXIgZCxtPW4oNzY2KSx2PW4oNDI4KTtwLmluaGVyaXRzKGIsdSk7dmFyIGc9WyJlcnJvciIsImNsb3NlIiwiZGVzdHJveSIsInBhdXNlIiwicmVzdW1lIl07ZnVuY3Rpb24geShlLHQpe2U9ZXx8e307dmFyIHI9dCBpbnN0YW5jZW9mKGE9YXx8bigxMTYpKTt0aGlzLm9iamVjdE1vZGU9ISFlLm9iamVjdE1vZGUsciYmKHRoaXMub2JqZWN0TW9kZT10aGlzLm9iamVjdE1vZGV8fCEhZS5yZWFkYWJsZU9iamVjdE1vZGUpO3ZhciBvPWUuaGlnaFdhdGVyTWFyayxpPWUucmVhZGFibGVIaWdoV2F0ZXJNYXJrLHM9dGhpcy5vYmplY3RNb2RlPzE2OjE2Mzg0O3RoaXMuaGlnaFdhdGVyTWFyaz1vfHwwPT09bz9vOnImJihpfHwwPT09aSk/aTpzLHRoaXMuaGlnaFdhdGVyTWFyaz1NYXRoLmZsb29yKHRoaXMuaGlnaFdhdGVyTWFyayksdGhpcy5idWZmZXI9bmV3IG0sdGhpcy5sZW5ndGg9MCx0aGlzLnBpcGVzPW51bGwsdGhpcy5waXBlc0NvdW50PTAsdGhpcy5mbG93aW5nPW51bGwsdGhpcy5lbmRlZD0hMSx0aGlzLmVuZEVtaXR0ZWQ9ITEsdGhpcy5yZWFkaW5nPSExLHRoaXMuc3luYz0hMCx0aGlzLm5lZWRSZWFkYWJsZT0hMSx0aGlzLmVtaXR0ZWRSZWFkYWJsZT0hMSx0aGlzLnJlYWRhYmxlTGlzdGVuaW5nPSExLHRoaXMucmVzdW1lU2NoZWR1bGVkPSExLHRoaXMuZGVzdHJveWVkPSExLHRoaXMuZGVmYXVsdEVuY29kaW5nPWUuZGVmYXVsdEVuY29kaW5nfHwidXRmOCIsdGhpcy5hd2FpdERyYWluPTAsdGhpcy5yZWFkaW5nTW9yZT0hMSx0aGlzLmRlY29kZXI9bnVsbCx0aGlzLmVuY29kaW5nPW51bGwsZS5lbmNvZGluZyYmKGR8fChkPW4oNDMwKS5TdHJpbmdEZWNvZGVyKSx0aGlzLmRlY29kZXI9bmV3IGQoZS5lbmNvZGluZyksdGhpcy5lbmNvZGluZz1lLmVuY29kaW5nKX1mdW5jdGlvbiBiKGUpe2lmKGE9YXx8bigxMTYpLCEodGhpcyBpbnN0YW5jZW9mIGIpKXJldHVybiBuZXcgYihlKTt0aGlzLl9yZWFkYWJsZVN0YXRlPW5ldyB5KGUsdGhpcyksdGhpcy5yZWFkYWJsZT0hMCxlJiYoImZ1bmN0aW9uIj09dHlwZW9mIGUucmVhZCYmKHRoaXMuX3JlYWQ9ZS5yZWFkKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5kZXN0cm95JiYodGhpcy5fZGVzdHJveT1lLmRlc3Ryb3kpKSx1LmNhbGwodGhpcyl9ZnVuY3Rpb24gXyhlLHQsbixyLG8pe3ZhciBhLGk9ZS5fcmVhZGFibGVTdGF0ZTtudWxsPT09dD8oaS5yZWFkaW5nPSExLGZ1bmN0aW9uKGUsdCl7aWYodC5lbmRlZClyZXR1cm47aWYodC5kZWNvZGVyKXt2YXIgbj10LmRlY29kZXIuZW5kKCk7biYmbi5sZW5ndGgmJih0LmJ1ZmZlci5wdXNoKG4pLHQubGVuZ3RoKz10Lm9iamVjdE1vZGU/MTpuLmxlbmd0aCl9dC5lbmRlZD0hMCxTKGUpfShlLGkpKToob3x8KGE9ZnVuY3Rpb24oZSx0KXt2YXIgbjtyPXQsYy5pc0J1ZmZlcihyKXx8ciBpbnN0YW5jZW9mIGx8fCJzdHJpbmciPT10eXBlb2YgdHx8dm9pZCAwPT09dHx8ZS5vYmplY3RNb2RlfHwobj1uZXcgVHlwZUVycm9yKCJJbnZhbGlkIG5vbi1zdHJpbmcvYnVmZmVyIGNodW5rIikpO3ZhciByO3JldHVybiBufShpLHQpKSxhP2UuZW1pdCgiZXJyb3IiLGEpOmkub2JqZWN0TW9kZXx8dCYmdC5sZW5ndGg+MD8oInN0cmluZyI9PXR5cGVvZiB0fHxpLm9iamVjdE1vZGV8fE9iamVjdC5nZXRQcm90b3R5cGVPZih0KT09PWMucHJvdG90eXBlfHwodD1mdW5jdGlvbihlKXtyZXR1cm4gYy5mcm9tKGUpfSh0KSkscj9pLmVuZEVtaXR0ZWQ/ZS5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJzdHJlYW0udW5zaGlmdCgpIGFmdGVyIGVuZCBldmVudCIpKTp3KGUsaSx0LCEwKTppLmVuZGVkP2UuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigic3RyZWFtLnB1c2goKSBhZnRlciBFT0YiKSk6KGkucmVhZGluZz0hMSxpLmRlY29kZXImJiFuPyh0PWkuZGVjb2Rlci53cml0ZSh0KSxpLm9iamVjdE1vZGV8fDAhPT10Lmxlbmd0aD93KGUsaSx0LCExKTpBKGUsaSkpOncoZSxpLHQsITEpKSk6cnx8KGkucmVhZGluZz0hMSkpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4hZS5lbmRlZCYmKGUubmVlZFJlYWRhYmxlfHxlLmxlbmd0aDxlLmhpZ2hXYXRlck1hcmt8fDA9PT1lLmxlbmd0aCl9KGkpfWZ1bmN0aW9uIHcoZSx0LG4scil7dC5mbG93aW5nJiYwPT09dC5sZW5ndGgmJiF0LnN5bmM/KGUuZW1pdCgiZGF0YSIsbiksZS5yZWFkKDApKToodC5sZW5ndGgrPXQub2JqZWN0TW9kZT8xOm4ubGVuZ3RoLHI/dC5idWZmZXIudW5zaGlmdChuKTp0LmJ1ZmZlci5wdXNoKG4pLHQubmVlZFJlYWRhYmxlJiZTKGUpKSxBKGUsdCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KGIucHJvdG90eXBlLCJkZXN0cm95ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fcmVhZGFibGVTdGF0ZSYmdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWR9LHNldDpmdW5jdGlvbihlKXt0aGlzLl9yZWFkYWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ9ZSl9fSksYi5wcm90b3R5cGUuZGVzdHJveT12LmRlc3Ryb3ksYi5wcm90b3R5cGUuX3VuZGVzdHJveT12LnVuZGVzdHJveSxiLnByb3RvdHlwZS5fZGVzdHJveT1mdW5jdGlvbihlLHQpe3RoaXMucHVzaChudWxsKSx0KGUpfSxiLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj10aGlzLl9yZWFkYWJsZVN0YXRlO3JldHVybiByLm9iamVjdE1vZGU/bj0hMDoic3RyaW5nIj09dHlwZW9mIGUmJigodD10fHxyLmRlZmF1bHRFbmNvZGluZykhPT1yLmVuY29kaW5nJiYoZT1jLmZyb20oZSx0KSx0PSIiKSxuPSEwKSxfKHRoaXMsZSx0LCExLG4pfSxiLnByb3RvdHlwZS51bnNoaWZ0PWZ1bmN0aW9uKGUpe3JldHVybiBfKHRoaXMsZSxudWxsLCEwLCExKX0sYi5wcm90b3R5cGUuaXNQYXVzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMT09PXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZ30sYi5wcm90b3R5cGUuc2V0RW5jb2Rpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuIGR8fChkPW4oNDMwKS5TdHJpbmdEZWNvZGVyKSx0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXI9bmV3IGQoZSksdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmNvZGluZz1lLHRoaXN9O3ZhciB4PTgzODg2MDg7ZnVuY3Rpb24gRShlLHQpe3JldHVybiBlPD0wfHwwPT09dC5sZW5ndGgmJnQuZW5kZWQ/MDp0Lm9iamVjdE1vZGU/MTplIT1lP3QuZmxvd2luZyYmdC5sZW5ndGg/dC5idWZmZXIuaGVhZC5kYXRhLmxlbmd0aDp0Lmxlbmd0aDooZT50LmhpZ2hXYXRlck1hcmsmJih0LmhpZ2hXYXRlck1hcms9ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PXg/ZT14OihlLS0sZXw9ZT4+PjEsZXw9ZT4+PjIsZXw9ZT4+PjQsZXw9ZT4+PjgsZXw9ZT4+PjE2LGUrKyksZX0oZSkpLGU8PXQubGVuZ3RoP2U6dC5lbmRlZD90Lmxlbmd0aDoodC5uZWVkUmVhZGFibGU9ITAsMCkpfWZ1bmN0aW9uIFMoZSl7dmFyIHQ9ZS5fcmVhZGFibGVTdGF0ZTt0Lm5lZWRSZWFkYWJsZT0hMSx0LmVtaXR0ZWRSZWFkYWJsZXx8KGgoImVtaXRSZWFkYWJsZSIsdC5mbG93aW5nKSx0LmVtaXR0ZWRSZWFkYWJsZT0hMCx0LnN5bmM/by5uZXh0VGljayhDLGUpOkMoZSkpfWZ1bmN0aW9uIEMoZSl7aCgiZW1pdCByZWFkYWJsZSIpLGUuZW1pdCgicmVhZGFibGUiKSxUKGUpfWZ1bmN0aW9uIEEoZSx0KXt0LnJlYWRpbmdNb3JlfHwodC5yZWFkaW5nTW9yZT0hMCxvLm5leHRUaWNrKE8sZSx0KSl9ZnVuY3Rpb24gTyhlLHQpe2Zvcih2YXIgbj10Lmxlbmd0aDshdC5yZWFkaW5nJiYhdC5mbG93aW5nJiYhdC5lbmRlZCYmdC5sZW5ndGg8dC5oaWdoV2F0ZXJNYXJrJiYoaCgibWF5YmVSZWFkTW9yZSByZWFkIDAiKSxlLnJlYWQoMCksbiE9PXQubGVuZ3RoKTspbj10Lmxlbmd0aDt0LnJlYWRpbmdNb3JlPSExfWZ1bmN0aW9uIGsoZSl7aCgicmVhZGFibGUgbmV4dHRpY2sgcmVhZCAwIiksZS5yZWFkKDApfWZ1bmN0aW9uIGooZSx0KXt0LnJlYWRpbmd8fChoKCJyZXN1bWUgcmVhZCAwIiksZS5yZWFkKDApKSx0LnJlc3VtZVNjaGVkdWxlZD0hMSx0LmF3YWl0RHJhaW49MCxlLmVtaXQoInJlc3VtZSIpLFQoZSksdC5mbG93aW5nJiYhdC5yZWFkaW5nJiZlLnJlYWQoMCl9ZnVuY3Rpb24gVChlKXt2YXIgdD1lLl9yZWFkYWJsZVN0YXRlO2ZvcihoKCJmbG93Iix0LmZsb3dpbmcpO3QuZmxvd2luZyYmbnVsbCE9PWUucmVhZCgpOyk7fWZ1bmN0aW9uIEkoZSx0KXtyZXR1cm4gMD09PXQubGVuZ3RoP251bGw6KHQub2JqZWN0TW9kZT9uPXQuYnVmZmVyLnNoaWZ0KCk6IWV8fGU+PXQubGVuZ3RoPyhuPXQuZGVjb2Rlcj90LmJ1ZmZlci5qb2luKCIiKToxPT09dC5idWZmZXIubGVuZ3RoP3QuYnVmZmVyLmhlYWQuZGF0YTp0LmJ1ZmZlci5jb25jYXQodC5sZW5ndGgpLHQuYnVmZmVyLmNsZWFyKCkpOm49ZnVuY3Rpb24oZSx0LG4pe3ZhciByO2U8dC5oZWFkLmRhdGEubGVuZ3RoPyhyPXQuaGVhZC5kYXRhLnNsaWNlKDAsZSksdC5oZWFkLmRhdGE9dC5oZWFkLmRhdGEuc2xpY2UoZSkpOnI9ZT09PXQuaGVhZC5kYXRhLmxlbmd0aD90LnNoaWZ0KCk6bj9mdW5jdGlvbihlLHQpe3ZhciBuPXQuaGVhZCxyPTEsbz1uLmRhdGE7ZS09by5sZW5ndGg7Zm9yKDtuPW4ubmV4dDspe3ZhciBhPW4uZGF0YSxpPWU+YS5sZW5ndGg/YS5sZW5ndGg6ZTtpZihpPT09YS5sZW5ndGg/bys9YTpvKz1hLnNsaWNlKDAsZSksMD09PShlLT1pKSl7aT09PWEubGVuZ3RoPygrK3Isbi5uZXh0P3QuaGVhZD1uLm5leHQ6dC5oZWFkPXQudGFpbD1udWxsKToodC5oZWFkPW4sbi5kYXRhPWEuc2xpY2UoaSkpO2JyZWFrfSsrcn1yZXR1cm4gdC5sZW5ndGgtPXIsb30oZSx0KTpmdW5jdGlvbihlLHQpe3ZhciBuPWMuYWxsb2NVbnNhZmUoZSkscj10LmhlYWQsbz0xO3IuZGF0YS5jb3B5KG4pLGUtPXIuZGF0YS5sZW5ndGg7Zm9yKDtyPXIubmV4dDspe3ZhciBhPXIuZGF0YSxpPWU+YS5sZW5ndGg/YS5sZW5ndGg6ZTtpZihhLmNvcHkobixuLmxlbmd0aC1lLDAsaSksMD09PShlLT1pKSl7aT09PWEubGVuZ3RoPygrK28sci5uZXh0P3QuaGVhZD1yLm5leHQ6dC5oZWFkPXQudGFpbD1udWxsKToodC5oZWFkPXIsci5kYXRhPWEuc2xpY2UoaSkpO2JyZWFrfSsrb31yZXR1cm4gdC5sZW5ndGgtPW8sbn0oZSx0KTtyZXR1cm4gcn0oZSx0LmJ1ZmZlcix0LmRlY29kZXIpLG4pO3ZhciBufWZ1bmN0aW9uIFAoZSl7dmFyIHQ9ZS5fcmVhZGFibGVTdGF0ZTtpZih0Lmxlbmd0aD4wKXRocm93IG5ldyBFcnJvcignImVuZFJlYWRhYmxlKCkiIGNhbGxlZCBvbiBub24tZW1wdHkgc3RyZWFtJyk7dC5lbmRFbWl0dGVkfHwodC5lbmRlZD0hMCxvLm5leHRUaWNrKE4sdCxlKSl9ZnVuY3Rpb24gTihlLHQpe2UuZW5kRW1pdHRlZHx8MCE9PWUubGVuZ3RofHwoZS5lbmRFbWl0dGVkPSEwLHQucmVhZGFibGU9ITEsdC5lbWl0KCJlbmQiKSl9ZnVuY3Rpb24gTShlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKylpZihlW25dPT09dClyZXR1cm4gbjtyZXR1cm4tMX1iLnByb3RvdHlwZS5yZWFkPWZ1bmN0aW9uKGUpe2goInJlYWQiLGUpLGU9cGFyc2VJbnQoZSwxMCk7dmFyIHQ9dGhpcy5fcmVhZGFibGVTdGF0ZSxuPWU7aWYoMCE9PWUmJih0LmVtaXR0ZWRSZWFkYWJsZT0hMSksMD09PWUmJnQubmVlZFJlYWRhYmxlJiYodC5sZW5ndGg+PXQuaGlnaFdhdGVyTWFya3x8dC5lbmRlZCkpcmV0dXJuIGgoInJlYWQ6IGVtaXRSZWFkYWJsZSIsdC5sZW5ndGgsdC5lbmRlZCksMD09PXQubGVuZ3RoJiZ0LmVuZGVkP1AodGhpcyk6Uyh0aGlzKSxudWxsO2lmKDA9PT0oZT1FKGUsdCkpJiZ0LmVuZGVkKXJldHVybiAwPT09dC5sZW5ndGgmJlAodGhpcyksbnVsbDt2YXIgcixvPXQubmVlZFJlYWRhYmxlO3JldHVybiBoKCJuZWVkIHJlYWRhYmxlIixvKSwoMD09PXQubGVuZ3RofHx0Lmxlbmd0aC1lPHQuaGlnaFdhdGVyTWFyaykmJmgoImxlbmd0aCBsZXNzIHRoYW4gd2F0ZXJtYXJrIixvPSEwKSx0LmVuZGVkfHx0LnJlYWRpbmc/aCgicmVhZGluZyBvciBlbmRlZCIsbz0hMSk6byYmKGgoImRvIHJlYWQiKSx0LnJlYWRpbmc9ITAsdC5zeW5jPSEwLDA9PT10Lmxlbmd0aCYmKHQubmVlZFJlYWRhYmxlPSEwKSx0aGlzLl9yZWFkKHQuaGlnaFdhdGVyTWFyayksdC5zeW5jPSExLHQucmVhZGluZ3x8KGU9RShuLHQpKSksbnVsbD09PShyPWU+MD9JKGUsdCk6bnVsbCk/KHQubmVlZFJlYWRhYmxlPSEwLGU9MCk6dC5sZW5ndGgtPWUsMD09PXQubGVuZ3RoJiYodC5lbmRlZHx8KHQubmVlZFJlYWRhYmxlPSEwKSxuIT09ZSYmdC5lbmRlZCYmUCh0aGlzKSksbnVsbCE9PXImJnRoaXMuZW1pdCgiZGF0YSIscikscn0sYi5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24oZSl7dGhpcy5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJfcmVhZCgpIGlzIG5vdCBpbXBsZW1lbnRlZCIpKX0sYi5wcm90b3R5cGUucGlwZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMsYT10aGlzLl9yZWFkYWJsZVN0YXRlO3N3aXRjaChhLnBpcGVzQ291bnQpe2Nhc2UgMDphLnBpcGVzPWU7YnJlYWs7Y2FzZSAxOmEucGlwZXM9W2EucGlwZXMsZV07YnJlYWs7ZGVmYXVsdDphLnBpcGVzLnB1c2goZSl9YS5waXBlc0NvdW50Kz0xLGgoInBpcGUgY291bnQ9JWQgb3B0cz0laiIsYS5waXBlc0NvdW50LHQpO3ZhciB1PSghdHx8ITEhPT10LmVuZCkmJmUhPT1yLnN0ZG91dCYmZSE9PXIuc3RkZXJyP2w6YjtmdW5jdGlvbiBjKHQscil7aCgib251bnBpcGUiKSx0PT09biYmciYmITE9PT1yLmhhc1VucGlwZWQmJihyLmhhc1VucGlwZWQ9ITAsaCgiY2xlYW51cCIpLGUucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixnKSxlLnJlbW92ZUxpc3RlbmVyKCJmaW5pc2giLHkpLGUucmVtb3ZlTGlzdGVuZXIoImRyYWluIixwKSxlLnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsdiksZS5yZW1vdmVMaXN0ZW5lcigidW5waXBlIixjKSxuLnJlbW92ZUxpc3RlbmVyKCJlbmQiLGwpLG4ucmVtb3ZlTGlzdGVuZXIoImVuZCIsYiksbi5yZW1vdmVMaXN0ZW5lcigiZGF0YSIsbSksZj0hMCwhYS5hd2FpdERyYWlufHxlLl93cml0YWJsZVN0YXRlJiYhZS5fd3JpdGFibGVTdGF0ZS5uZWVkRHJhaW58fHAoKSl9ZnVuY3Rpb24gbCgpe2goIm9uZW5kIiksZS5lbmQoKX1hLmVuZEVtaXR0ZWQ/by5uZXh0VGljayh1KTpuLm9uY2UoImVuZCIsdSksZS5vbigidW5waXBlIixjKTt2YXIgcD1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD1lLl9yZWFkYWJsZVN0YXRlO2goInBpcGVPbkRyYWluIix0LmF3YWl0RHJhaW4pLHQuYXdhaXREcmFpbiYmdC5hd2FpdERyYWluLS0sMD09PXQuYXdhaXREcmFpbiYmcyhlLCJkYXRhIikmJih0LmZsb3dpbmc9ITAsVChlKSl9fShuKTtlLm9uKCJkcmFpbiIscCk7dmFyIGY9ITE7dmFyIGQ9ITE7ZnVuY3Rpb24gbSh0KXtoKCJvbmRhdGEiKSxkPSExLCExIT09ZS53cml0ZSh0KXx8ZHx8KCgxPT09YS5waXBlc0NvdW50JiZhLnBpcGVzPT09ZXx8YS5waXBlc0NvdW50PjEmJi0xIT09TShhLnBpcGVzLGUpKSYmIWYmJihoKCJmYWxzZSB3cml0ZSByZXNwb25zZSwgcGF1c2UiLG4uX3JlYWRhYmxlU3RhdGUuYXdhaXREcmFpbiksbi5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKyssZD0hMCksbi5wYXVzZSgpKX1mdW5jdGlvbiB2KHQpe2goIm9uZXJyb3IiLHQpLGIoKSxlLnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsdiksMD09PXMoZSwiZXJyb3IiKSYmZS5lbWl0KCJlcnJvciIsdCl9ZnVuY3Rpb24gZygpe2UucmVtb3ZlTGlzdGVuZXIoImZpbmlzaCIseSksYigpfWZ1bmN0aW9uIHkoKXtoKCJvbmZpbmlzaCIpLGUucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixnKSxiKCl9ZnVuY3Rpb24gYigpe2goInVucGlwZSIpLG4udW5waXBlKGUpfXJldHVybiBuLm9uKCJkYXRhIixtKSxmdW5jdGlvbihlLHQsbil7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUucHJlcGVuZExpc3RlbmVyKXJldHVybiBlLnByZXBlbmRMaXN0ZW5lcih0LG4pO2UuX2V2ZW50cyYmZS5fZXZlbnRzW3RdP2koZS5fZXZlbnRzW3RdKT9lLl9ldmVudHNbdF0udW5zaGlmdChuKTplLl9ldmVudHNbdF09W24sZS5fZXZlbnRzW3RdXTplLm9uKHQsbil9KGUsImVycm9yIix2KSxlLm9uY2UoImNsb3NlIixnKSxlLm9uY2UoImZpbmlzaCIseSksZS5lbWl0KCJwaXBlIixuKSxhLmZsb3dpbmd8fChoKCJwaXBlIHJlc3VtZSIpLG4ucmVzdW1lKCkpLGV9LGIucHJvdG90eXBlLnVucGlwZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9yZWFkYWJsZVN0YXRlLG49e2hhc1VucGlwZWQ6ITF9O2lmKDA9PT10LnBpcGVzQ291bnQpcmV0dXJuIHRoaXM7aWYoMT09PXQucGlwZXNDb3VudClyZXR1cm4gZSYmZSE9PXQucGlwZXN8fChlfHwoZT10LnBpcGVzKSx0LnBpcGVzPW51bGwsdC5waXBlc0NvdW50PTAsdC5mbG93aW5nPSExLGUmJmUuZW1pdCgidW5waXBlIix0aGlzLG4pKSx0aGlzO2lmKCFlKXt2YXIgcj10LnBpcGVzLG89dC5waXBlc0NvdW50O3QucGlwZXM9bnVsbCx0LnBpcGVzQ291bnQ9MCx0LmZsb3dpbmc9ITE7Zm9yKHZhciBhPTA7YTxvO2ErKylyW2FdLmVtaXQoInVucGlwZSIsdGhpcyxuKTtyZXR1cm4gdGhpc312YXIgaT1NKHQucGlwZXMsZSk7cmV0dXJuLTE9PT1pfHwodC5waXBlcy5zcGxpY2UoaSwxKSx0LnBpcGVzQ291bnQtPTEsMT09PXQucGlwZXNDb3VudCYmKHQucGlwZXM9dC5waXBlc1swXSksZS5lbWl0KCJ1bnBpcGUiLHRoaXMsbikpLHRoaXN9LGIucHJvdG90eXBlLm9uPWZ1bmN0aW9uKGUsdCl7dmFyIG49dS5wcm90b3R5cGUub24uY2FsbCh0aGlzLGUsdCk7aWYoImRhdGEiPT09ZSkhMSE9PXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyYmdGhpcy5yZXN1bWUoKTtlbHNlIGlmKCJyZWFkYWJsZSI9PT1lKXt2YXIgcj10aGlzLl9yZWFkYWJsZVN0YXRlO3IuZW5kRW1pdHRlZHx8ci5yZWFkYWJsZUxpc3RlbmluZ3x8KHIucmVhZGFibGVMaXN0ZW5pbmc9ci5uZWVkUmVhZGFibGU9ITAsci5lbWl0dGVkUmVhZGFibGU9ITEsci5yZWFkaW5nP3IubGVuZ3RoJiZTKHRoaXMpOm8ubmV4dFRpY2soayx0aGlzKSl9cmV0dXJuIG59LGIucHJvdG90eXBlLmFkZExpc3RlbmVyPWIucHJvdG90eXBlLm9uLGIucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGU7cmV0dXJuIGUuZmxvd2luZ3x8KGgoInJlc3VtZSIpLGUuZmxvd2luZz0hMCxmdW5jdGlvbihlLHQpe3QucmVzdW1lU2NoZWR1bGVkfHwodC5yZXN1bWVTY2hlZHVsZWQ9ITAsby5uZXh0VGljayhqLGUsdCkpfSh0aGlzLGUpKSx0aGlzfSxiLnByb3RvdHlwZS5wYXVzZT1mdW5jdGlvbigpe3JldHVybiBoKCJjYWxsIHBhdXNlIGZsb3dpbmc9JWoiLHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyksITEhPT10aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcmJihoKCJwYXVzZSIpLHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZz0hMSx0aGlzLmVtaXQoInBhdXNlIikpLHRoaXN9LGIucHJvdG90eXBlLndyYXA9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXRoaXMuX3JlYWRhYmxlU3RhdGUscj0hMTtmb3IodmFyIG8gaW4gZS5vbigiZW5kIiwoZnVuY3Rpb24oKXtpZihoKCJ3cmFwcGVkIGVuZCIpLG4uZGVjb2RlciYmIW4uZW5kZWQpe3ZhciBlPW4uZGVjb2Rlci5lbmQoKTtlJiZlLmxlbmd0aCYmdC5wdXNoKGUpfXQucHVzaChudWxsKX0pKSxlLm9uKCJkYXRhIiwoZnVuY3Rpb24obyl7KGgoIndyYXBwZWQgZGF0YSIpLG4uZGVjb2RlciYmKG89bi5kZWNvZGVyLndyaXRlKG8pKSxuLm9iamVjdE1vZGUmJm51bGw9PW8pfHwobi5vYmplY3RNb2RlfHxvJiZvLmxlbmd0aCkmJih0LnB1c2gobyl8fChyPSEwLGUucGF1c2UoKSkpfSkpLGUpdm9pZCAwPT09dGhpc1tvXSYmImZ1bmN0aW9uIj09dHlwZW9mIGVbb10mJih0aGlzW29dPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlW3RdLmFwcGx5KGUsYXJndW1lbnRzKX19KG8pKTtmb3IodmFyIGE9MDthPGcubGVuZ3RoO2ErKyllLm9uKGdbYV0sdGhpcy5lbWl0LmJpbmQodGhpcyxnW2FdKSk7cmV0dXJuIHRoaXMuX3JlYWQ9ZnVuY3Rpb24odCl7aCgid3JhcHBlZCBfcmVhZCIsdCksciYmKHI9ITEsZS5yZXN1bWUoKSl9LHRoaXN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLnByb3RvdHlwZSwicmVhZGFibGVIaWdoV2F0ZXJNYXJrIix7ZW51bWVyYWJsZTohMSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVhZGFibGVTdGF0ZS5oaWdoV2F0ZXJNYXJrfX0pLGIuX2Zyb21MaXN0PUl9KS5jYWxsKHRoaXMsbig1MSksbig4OSkpfSxmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPW4oMjUzKS5FdmVudEVtaXR0ZXJ9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxOTkpO2Z1bmN0aW9uIG8oZSx0KXtlLmVtaXQoImVycm9yIix0KX1lLmV4cG9ydHM9e2Rlc3Ryb3k6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLGE9dGhpcy5fcmVhZGFibGVTdGF0ZSYmdGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQsaT10aGlzLl93cml0YWJsZVN0YXRlJiZ0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZDtyZXR1cm4gYXx8aT8odD90KGUpOiFlfHx0aGlzLl93cml0YWJsZVN0YXRlJiZ0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZHx8ci5uZXh0VGljayhvLHRoaXMsZSksdGhpcyk6KHRoaXMuX3JlYWRhYmxlU3RhdGUmJih0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZD0hMCksdGhpcy5fd3JpdGFibGVTdGF0ZSYmKHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkPSEwKSx0aGlzLl9kZXN0cm95KGV8fG51bGwsKGZ1bmN0aW9uKGUpeyF0JiZlPyhyLm5leHRUaWNrKG8sbixlKSxuLl93cml0YWJsZVN0YXRlJiYobi5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITApKTp0JiZ0KGUpfSkpLHRoaXMpfSx1bmRlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLl9yZWFkYWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ9ITEsdGhpcy5fcmVhZGFibGVTdGF0ZS5yZWFkaW5nPSExLHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kZWQ9ITEsdGhpcy5fcmVhZGFibGVTdGF0ZS5lbmRFbWl0dGVkPSExKSx0aGlzLl93cml0YWJsZVN0YXRlJiYodGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRlZD0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmVuZGluZz0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmZpbmlzaGVkPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSExKX19fSxmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKGUpe3ZhciByPXZvaWQgMCE9PWUmJmV8fCJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZiYmc2VsZnx8d2luZG93LG89RnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5O2Z1bmN0aW9uIGEoZSx0KXt0aGlzLl9pZD1lLHRoaXMuX2NsZWFyRm49dH10LnNldFRpbWVvdXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGEoby5jYWxsKHNldFRpbWVvdXQscixhcmd1bWVudHMpLGNsZWFyVGltZW91dCl9LHQuc2V0SW50ZXJ2YWw9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGEoby5jYWxsKHNldEludGVydmFsLHIsYXJndW1lbnRzKSxjbGVhckludGVydmFsKX0sdC5jbGVhclRpbWVvdXQ9dC5jbGVhckludGVydmFsPWZ1bmN0aW9uKGUpe2UmJmUuY2xvc2UoKX0sYS5wcm90b3R5cGUudW5yZWY9YS5wcm90b3R5cGUucmVmPWZ1bmN0aW9uKCl7fSxhLnByb3RvdHlwZS5jbG9zZT1mdW5jdGlvbigpe3RoaXMuX2NsZWFyRm4uY2FsbChyLHRoaXMuX2lkKX0sdC5lbnJvbGw9ZnVuY3Rpb24oZSx0KXtjbGVhclRpbWVvdXQoZS5faWRsZVRpbWVvdXRJZCksZS5faWRsZVRpbWVvdXQ9dH0sdC51bmVucm9sbD1mdW5jdGlvbihlKXtjbGVhclRpbWVvdXQoZS5faWRsZVRpbWVvdXRJZCksZS5faWRsZVRpbWVvdXQ9LTF9LHQuX3VucmVmQWN0aXZlPXQuYWN0aXZlPWZ1bmN0aW9uKGUpe2NsZWFyVGltZW91dChlLl9pZGxlVGltZW91dElkKTt2YXIgdD1lLl9pZGxlVGltZW91dDt0Pj0wJiYoZS5faWRsZVRpbWVvdXRJZD1zZXRUaW1lb3V0KChmdW5jdGlvbigpe2UuX29uVGltZW91dCYmZS5fb25UaW1lb3V0KCl9KSx0KSl9LG4oNzY4KSx0LnNldEltbWVkaWF0ZT0idW5kZWZpbmVkIiE9dHlwZW9mIHNlbGYmJnNlbGYuc2V0SW1tZWRpYXRlfHx2b2lkIDAhPT1lJiZlLnNldEltbWVkaWF0ZXx8dGhpcyYmdGhpcy5zZXRJbW1lZGlhdGUsdC5jbGVhckltbWVkaWF0ZT0idW5kZWZpbmVkIiE9dHlwZW9mIHNlbGYmJnNlbGYuY2xlYXJJbW1lZGlhdGV8fHZvaWQgMCE9PWUmJmUuY2xlYXJJbW1lZGlhdGV8fHRoaXMmJnRoaXMuY2xlYXJJbW1lZGlhdGV9KS5jYWxsKHRoaXMsbig1MSkpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNjQpLkJ1ZmZlcixvPXIuaXNFbmNvZGluZ3x8ZnVuY3Rpb24oZSl7c3dpdGNoKChlPSIiK2UpJiZlLnRvTG93ZXJDYXNlKCkpe2Nhc2UiaGV4IjpjYXNlInV0ZjgiOmNhc2UidXRmLTgiOmNhc2UiYXNjaWkiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOmNhc2UicmF3IjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX07ZnVuY3Rpb24gYShlKXt2YXIgdDtzd2l0Y2godGhpcy5lbmNvZGluZz1mdW5jdGlvbihlKXt2YXIgdD1mdW5jdGlvbihlKXtpZighZSlyZXR1cm4idXRmOCI7Zm9yKHZhciB0Ozspc3dpdGNoKGUpe2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuInV0ZjgiO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4idXRmMTZsZSI7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4ibGF0aW4xIjtjYXNlImJhc2U2NCI6Y2FzZSJhc2NpaSI6Y2FzZSJoZXgiOnJldHVybiBlO2RlZmF1bHQ6aWYodClyZXR1cm47ZT0oIiIrZSkudG9Mb3dlckNhc2UoKSx0PSEwfX0oZSk7aWYoInN0cmluZyIhPXR5cGVvZiB0JiYoci5pc0VuY29kaW5nPT09b3x8IW8oZSkpKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBlbmNvZGluZzogIitlKTtyZXR1cm4gdHx8ZX0oZSksdGhpcy5lbmNvZGluZyl7Y2FzZSJ1dGYxNmxlIjp0aGlzLnRleHQ9dSx0aGlzLmVuZD1jLHQ9NDticmVhaztjYXNlInV0ZjgiOnRoaXMuZmlsbExhc3Q9cyx0PTQ7YnJlYWs7Y2FzZSJiYXNlNjQiOnRoaXMudGV4dD1sLHRoaXMuZW5kPXAsdD0zO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIHRoaXMud3JpdGU9Zix2b2lkKHRoaXMuZW5kPWgpfXRoaXMubGFzdE5lZWQ9MCx0aGlzLmxhc3RUb3RhbD0wLHRoaXMubGFzdENoYXI9ci5hbGxvY1Vuc2FmZSh0KX1mdW5jdGlvbiBpKGUpe3JldHVybiBlPD0xMjc/MDplPj41PT02PzI6ZT4+ND09MTQ/MzplPj4zPT0zMD80OmU+PjY9PTI/LTE6LTJ9ZnVuY3Rpb24gcyhlKXt2YXIgdD10aGlzLmxhc3RUb3RhbC10aGlzLmxhc3ROZWVkLG49ZnVuY3Rpb24oZSx0LG4pe2lmKDEyOCE9KDE5MiZ0WzBdKSlyZXR1cm4gZS5sYXN0TmVlZD0wLCLvv70iO2lmKGUubGFzdE5lZWQ+MSYmdC5sZW5ndGg+MSl7aWYoMTI4IT0oMTkyJnRbMV0pKXJldHVybiBlLmxhc3ROZWVkPTEsIu+/vSI7aWYoZS5sYXN0TmVlZD4yJiZ0Lmxlbmd0aD4yJiYxMjghPSgxOTImdFsyXSkpcmV0dXJuIGUubGFzdE5lZWQ9Miwi77+9In19KHRoaXMsZSk7cmV0dXJuIHZvaWQgMCE9PW4/bjp0aGlzLmxhc3ROZWVkPD1lLmxlbmd0aD8oZS5jb3B5KHRoaXMubGFzdENoYXIsdCwwLHRoaXMubGFzdE5lZWQpLHRoaXMubGFzdENoYXIudG9TdHJpbmcodGhpcy5lbmNvZGluZywwLHRoaXMubGFzdFRvdGFsKSk6KGUuY29weSh0aGlzLmxhc3RDaGFyLHQsMCxlLmxlbmd0aCksdm9pZCh0aGlzLmxhc3ROZWVkLT1lLmxlbmd0aCkpfWZ1bmN0aW9uIHUoZSx0KXtpZigoZS5sZW5ndGgtdCklMj09MCl7dmFyIG49ZS50b1N0cmluZygidXRmMTZsZSIsdCk7aWYobil7dmFyIHI9bi5jaGFyQ29kZUF0KG4ubGVuZ3RoLTEpO2lmKHI+PTU1Mjk2JiZyPD01NjMxOSlyZXR1cm4gdGhpcy5sYXN0TmVlZD0yLHRoaXMubGFzdFRvdGFsPTQsdGhpcy5sYXN0Q2hhclswXT1lW2UubGVuZ3RoLTJdLHRoaXMubGFzdENoYXJbMV09ZVtlLmxlbmd0aC0xXSxuLnNsaWNlKDAsLTEpfXJldHVybiBufXJldHVybiB0aGlzLmxhc3ROZWVkPTEsdGhpcy5sYXN0VG90YWw9Mix0aGlzLmxhc3RDaGFyWzBdPWVbZS5sZW5ndGgtMV0sZS50b1N0cmluZygidXRmMTZsZSIsdCxlLmxlbmd0aC0xKX1mdW5jdGlvbiBjKGUpe3ZhciB0PWUmJmUubGVuZ3RoP3RoaXMud3JpdGUoZSk6IiI7aWYodGhpcy5sYXN0TmVlZCl7dmFyIG49dGhpcy5sYXN0VG90YWwtdGhpcy5sYXN0TmVlZDtyZXR1cm4gdCt0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKCJ1dGYxNmxlIiwwLG4pfXJldHVybiB0fWZ1bmN0aW9uIGwoZSx0KXt2YXIgbj0oZS5sZW5ndGgtdCklMztyZXR1cm4gMD09PW4/ZS50b1N0cmluZygiYmFzZTY0Iix0KToodGhpcy5sYXN0TmVlZD0zLW4sdGhpcy5sYXN0VG90YWw9MywxPT09bj90aGlzLmxhc3RDaGFyWzBdPWVbZS5sZW5ndGgtMV06KHRoaXMubGFzdENoYXJbMF09ZVtlLmxlbmd0aC0yXSx0aGlzLmxhc3RDaGFyWzFdPWVbZS5sZW5ndGgtMV0pLGUudG9TdHJpbmcoImJhc2U2NCIsdCxlLmxlbmd0aC1uKSl9ZnVuY3Rpb24gcChlKXt2YXIgdD1lJiZlLmxlbmd0aD90aGlzLndyaXRlKGUpOiIiO3JldHVybiB0aGlzLmxhc3ROZWVkP3QrdGhpcy5sYXN0Q2hhci50b1N0cmluZygiYmFzZTY0IiwwLDMtdGhpcy5sYXN0TmVlZCk6dH1mdW5jdGlvbiBmKGUpe3JldHVybiBlLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcpfWZ1bmN0aW9uIGgoZSl7cmV0dXJuIGUmJmUubGVuZ3RoP3RoaXMud3JpdGUoZSk6IiJ9dC5TdHJpbmdEZWNvZGVyPWEsYS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24oZSl7aWYoMD09PWUubGVuZ3RoKXJldHVybiIiO3ZhciB0LG47aWYodGhpcy5sYXN0TmVlZCl7aWYodm9pZCAwPT09KHQ9dGhpcy5maWxsTGFzdChlKSkpcmV0dXJuIiI7bj10aGlzLmxhc3ROZWVkLHRoaXMubGFzdE5lZWQ9MH1lbHNlIG49MDtyZXR1cm4gbjxlLmxlbmd0aD90P3QrdGhpcy50ZXh0KGUsbik6dGhpcy50ZXh0KGUsbik6dHx8IiJ9LGEucHJvdG90eXBlLmVuZD1mdW5jdGlvbihlKXt2YXIgdD1lJiZlLmxlbmd0aD90aGlzLndyaXRlKGUpOiIiO3JldHVybiB0aGlzLmxhc3ROZWVkP3QrIu+/vSI6dH0sYS5wcm90b3R5cGUudGV4dD1mdW5jdGlvbihlLHQpe3ZhciBuPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10Lmxlbmd0aC0xO2lmKHI8bilyZXR1cm4gMDt2YXIgbz1pKHRbcl0pO2lmKG8+PTApcmV0dXJuIG8+MCYmKGUubGFzdE5lZWQ9by0xKSxvO2lmKC0tcjxufHwtMj09PW8pcmV0dXJuIDA7aWYoKG89aSh0W3JdKSk+PTApcmV0dXJuIG8+MCYmKGUubGFzdE5lZWQ9by0yKSxvO2lmKC0tcjxufHwtMj09PW8pcmV0dXJuIDA7aWYoKG89aSh0W3JdKSk+PTApcmV0dXJuIG8+MCYmKDI9PT1vP289MDplLmxhc3ROZWVkPW8tMyksbztyZXR1cm4gMH0odGhpcyxlLHQpO2lmKCF0aGlzLmxhc3ROZWVkKXJldHVybiBlLnRvU3RyaW5nKCJ1dGY4Iix0KTt0aGlzLmxhc3RUb3RhbD1uO3ZhciByPWUubGVuZ3RoLShuLXRoaXMubGFzdE5lZWQpO3JldHVybiBlLmNvcHkodGhpcy5sYXN0Q2hhciwwLHIpLGUudG9TdHJpbmcoInV0ZjgiLHQscil9LGEucHJvdG90eXBlLmZpbGxMYXN0PWZ1bmN0aW9uKGUpe2lmKHRoaXMubGFzdE5lZWQ8PWUubGVuZ3RoKXJldHVybiBlLmNvcHkodGhpcy5sYXN0Q2hhcix0aGlzLmxhc3RUb3RhbC10aGlzLmxhc3ROZWVkLDAsdGhpcy5sYXN0TmVlZCksdGhpcy5sYXN0Q2hhci50b1N0cmluZyh0aGlzLmVuY29kaW5nLDAsdGhpcy5sYXN0VG90YWwpO2UuY29weSh0aGlzLmxhc3RDaGFyLHRoaXMubGFzdFRvdGFsLXRoaXMubGFzdE5lZWQsMCxlLmxlbmd0aCksdGhpcy5sYXN0TmVlZC09ZS5sZW5ndGh9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1pO3ZhciByPW4oMTE2KSxvPW4oMTYzKTtmdW5jdGlvbiBhKGUsdCl7dmFyIG49dGhpcy5fdHJhbnNmb3JtU3RhdGU7bi50cmFuc2Zvcm1pbmc9ITE7dmFyIHI9bi53cml0ZWNiO2lmKCFyKXJldHVybiB0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIndyaXRlIGNhbGxiYWNrIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyIpKTtuLndyaXRlY2h1bms9bnVsbCxuLndyaXRlY2I9bnVsbCxudWxsIT10JiZ0aGlzLnB1c2godCkscihlKTt2YXIgbz10aGlzLl9yZWFkYWJsZVN0YXRlO28ucmVhZGluZz0hMSwoby5uZWVkUmVhZGFibGV8fG8ubGVuZ3RoPG8uaGlnaFdhdGVyTWFyaykmJnRoaXMuX3JlYWQoby5oaWdoV2F0ZXJNYXJrKX1mdW5jdGlvbiBpKGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIGkpKXJldHVybiBuZXcgaShlKTtyLmNhbGwodGhpcyxlKSx0aGlzLl90cmFuc2Zvcm1TdGF0ZT17YWZ0ZXJUcmFuc2Zvcm06YS5iaW5kKHRoaXMpLG5lZWRUcmFuc2Zvcm06ITEsdHJhbnNmb3JtaW5nOiExLHdyaXRlY2I6bnVsbCx3cml0ZWNodW5rOm51bGwsd3JpdGVlbmNvZGluZzpudWxsfSx0aGlzLl9yZWFkYWJsZVN0YXRlLm5lZWRSZWFkYWJsZT0hMCx0aGlzLl9yZWFkYWJsZVN0YXRlLnN5bmM9ITEsZSYmKCJmdW5jdGlvbiI9PXR5cGVvZiBlLnRyYW5zZm9ybSYmKHRoaXMuX3RyYW5zZm9ybT1lLnRyYW5zZm9ybSksImZ1bmN0aW9uIj09dHlwZW9mIGUuZmx1c2gmJih0aGlzLl9mbHVzaD1lLmZsdXNoKSksdGhpcy5vbigicHJlZmluaXNoIixzKX1mdW5jdGlvbiBzKCl7dmFyIGU9dGhpczsiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5fZmx1c2g/dGhpcy5fZmx1c2goKGZ1bmN0aW9uKHQsbil7dShlLHQsbil9KSk6dSh0aGlzLG51bGwsbnVsbCl9ZnVuY3Rpb24gdShlLHQsbil7aWYodClyZXR1cm4gZS5lbWl0KCJlcnJvciIsdCk7aWYobnVsbCE9biYmZS5wdXNoKG4pLGUuX3dyaXRhYmxlU3RhdGUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHdzLmxlbmd0aCAhPSAwIik7aWYoZS5fdHJhbnNmb3JtU3RhdGUudHJhbnNmb3JtaW5nKXRocm93IG5ldyBFcnJvcigiQ2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHN0aWxsIHRyYW5zZm9ybWluZyIpO3JldHVybiBlLnB1c2gobnVsbCl9by5pbmhlcml0cz1uKDYzKSxvLmluaGVyaXRzKGksciksaS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtPSExLHIucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLGUsdCl9LGkucHJvdG90eXBlLl90cmFuc2Zvcm09ZnVuY3Rpb24oZSx0LG4pe3Rocm93IG5ldyBFcnJvcigiX3RyYW5zZm9ybSgpIGlzIG5vdCBpbXBsZW1lbnRlZCIpfSxpLnByb3RvdHlwZS5fd3JpdGU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuX3RyYW5zZm9ybVN0YXRlO2lmKHIud3JpdGVjYj1uLHIud3JpdGVjaHVuaz1lLHIud3JpdGVlbmNvZGluZz10LCFyLnRyYW5zZm9ybWluZyl7dmFyIG89dGhpcy5fcmVhZGFibGVTdGF0ZTsoci5uZWVkVHJhbnNmb3JtfHxvLm5lZWRSZWFkYWJsZXx8by5sZW5ndGg8by5oaWdoV2F0ZXJNYXJrKSYmdGhpcy5fcmVhZChvLmhpZ2hXYXRlck1hcmspfX0saS5wcm90b3R5cGUuX3JlYWQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fdHJhbnNmb3JtU3RhdGU7bnVsbCE9PXQud3JpdGVjaHVuayYmdC53cml0ZWNiJiYhdC50cmFuc2Zvcm1pbmc/KHQudHJhbnNmb3JtaW5nPSEwLHRoaXMuX3RyYW5zZm9ybSh0LndyaXRlY2h1bmssdC53cml0ZWVuY29kaW5nLHQuYWZ0ZXJUcmFuc2Zvcm0pKTp0Lm5lZWRUcmFuc2Zvcm09ITB9LGkucHJvdG90eXBlLl9kZXN0cm95PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztyLnByb3RvdHlwZS5fZGVzdHJveS5jYWxsKHRoaXMsZSwoZnVuY3Rpb24oZSl7dChlKSxuLmVtaXQoImNsb3NlIil9KSl9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTE3KSxvPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoLGE9T2JqZWN0LmNyZWF0ZSxpPWZ1bmN0aW9uKGUsdCl7dmFyIG47Zm9yKG4gaW4gZSl0W25dPWVbbl19O2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1hKG51bGwpO3JldHVybiBvLmNhbGwoYXJndW1lbnRzLChmdW5jdGlvbihlKXtyKGUpJiZpKE9iamVjdChlKSx0KX0pKSx0fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDExOCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgbztyZXR1cm4gaXNOYU4oZSk/KG89dCk+PTA/biYmbz9vLTE6bzoxOiExIT09ZSYmcihlKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPW4oNzg0KSgpP09iamVjdC5hc3NpZ246big3ODUpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByLG8sYSxpLHMsdT1uKDExOCksYz1mdW5jdGlvbihlLHQpe3JldHVybiB0fTt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGMsImxlbmd0aCIse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiExLHZhbHVlOjF9KX1jYXRjaChlKXt9MT09PWMubGVuZ3RoPyhyPXtjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITEsZW51bWVyYWJsZTohMX0sbz1PYmplY3QuZGVmaW5lUHJvcGVydHksZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ9dSh0KSxlLmxlbmd0aD09PXQ/ZTooci52YWx1ZT10LG8oZSwibGVuZ3RoIixyKSl9KTooaT1uKDQzNikscz1bXSxhPWZ1bmN0aW9uKGUpe3ZhciB0LG49MDtpZihzW2VdKXJldHVybiBzW2VdO2Zvcih0PVtdO2UtLTspdC5wdXNoKCJhIisoKytuKS50b1N0cmluZygzNikpO3JldHVybiBuZXcgRnVuY3Rpb24oImZuIiwicmV0dXJuIGZ1bmN0aW9uICgiK3Quam9pbigiLCAiKSsiKSB7IHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9OyIpfSxlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgbjtpZih0PXUodCksZS5sZW5ndGg9PT10KXJldHVybiBlO249YSh0KShlKTt0cnl7aShuLGUpfWNhdGNoKGUpe31yZXR1cm4gbn0pfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTM5KSxvPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsaT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyxzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIG4sdT1PYmplY3Qocih0KSk7aWYoZT1PYmplY3QocihlKSksaSh1KS5mb3JFYWNoKChmdW5jdGlvbihyKXt0cnl7byhlLHIsYSh0LHIpKX1jYXRjaChlKXtuPWV9fSkpLCJmdW5jdGlvbiI9PXR5cGVvZiBzJiZzKHUpLmZvckVhY2goKGZ1bmN0aW9uKHIpe3RyeXtvKGUscixhKHQscikpfWNhdGNoKGUpe249ZX19KSksdm9pZCAwIT09bil0aHJvdyBuO3JldHVybiBlfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWV9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oODA3KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYoIXIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihlKyIgaXMgbm90IGEgc3ltYm9sIik7cmV0dXJuIGV9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oOTkpLG89bigyMDApLGE9RnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIG49e30saT1hcmd1bWVudHNbMl07cmV0dXJuIHIodCksbyhlLChmdW5jdGlvbihlLHIsbyxzKXtuW3JdPWEuY2FsbCh0LGksZSxyLG8scyl9KSksbn19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlfX0sZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUpe3JldHVybiEhZSYmKCJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGUpJiYiZnVuY3Rpb24iPT10eXBlb2YgZS50aGVufWUuZXhwb3J0cz1uLGUuZXhwb3J0cy5kZWZhdWx0PW59LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDYzKSxvPW4oMTQwKSxhPW4oNjQpLkJ1ZmZlcixpPVsxMTE2MzUyNDA4LDE4OTk0NDc0NDEsMzA0OTMyMzQ3MSwzOTIxMDA5NTczLDk2MTk4NzE2MywxNTA4OTcwOTkzLDI0NTM2MzU3NDgsMjg3MDc2MzIyMSwzNjI0MzgxMDgwLDMxMDU5ODQwMSw2MDcyMjUyNzgsMTQyNjg4MTk4NywxOTI1MDc4Mzg4LDIxNjIwNzgyMDYsMjYxNDg4ODEwMywzMjQ4MjIyNTgwLDM4MzUzOTA0MDEsNDAyMjIyNDc3NCwyNjQzNDcwNzgsNjA0ODA3NjI4LDc3MDI1NTk4MywxMjQ5MTUwMTIyLDE1NTUwODE2OTIsMTk5NjA2NDk4NiwyNTU0MjIwODgyLDI4MjE4MzQzNDksMjk1Mjk5NjgwOCwzMjEwMzEzNjcxLDMzMzY1NzE4OTEsMzU4NDUyODcxMSwxMTM5MjY5OTMsMzM4MjQxODk1LDY2NjMwNzIwNSw3NzM1Mjk5MTIsMTI5NDc1NzM3MiwxMzk2MTgyMjkxLDE2OTUxODM3MDAsMTk4NjY2MTA1MSwyMTc3MDI2MzUwLDI0NTY5NTYwMzcsMjczMDQ4NTkyMSwyODIwMzAyNDExLDMyNTk3MzA4MDAsMzM0NTc2NDc3MSwzNTE2MDY1ODE3LDM2MDAzNTI4MDQsNDA5NDU3MTkwOSwyNzU0MjMzNDQsNDMwMjI3NzM0LDUwNjk0ODYxNiw2NTkwNjA1NTYsODgzOTk3ODc3LDk1ODEzOTU3MSwxMzIyODIyMjE4LDE1MzcwMDIwNjMsMTc0Nzg3Mzc3OSwxOTU1NTYyMjIyLDIwMjQxMDQ4MTUsMjIyNzczMDQ1MiwyMzYxODUyNDI0LDI0Mjg0MzY0NzQsMjc1NjczNDE4NywzMjA0MDMxNDc5LDMzMjkzMjUyOThdLHM9bmV3IEFycmF5KDY0KTtmdW5jdGlvbiB1KCl7dGhpcy5pbml0KCksdGhpcy5fdz1zLG8uY2FsbCh0aGlzLDY0LDU2KX1mdW5jdGlvbiBjKGUsdCxuKXtyZXR1cm4gbl5lJih0Xm4pfWZ1bmN0aW9uIGwoZSx0LG4pe3JldHVybiBlJnR8biYoZXx0KX1mdW5jdGlvbiBwKGUpe3JldHVybihlPj4+MnxlPDwzMCleKGU+Pj4xM3xlPDwxOSleKGU+Pj4yMnxlPDwxMCl9ZnVuY3Rpb24gZihlKXtyZXR1cm4oZT4+PjZ8ZTw8MjYpXihlPj4+MTF8ZTw8MjEpXihlPj4+MjV8ZTw8Nyl9ZnVuY3Rpb24gaChlKXtyZXR1cm4oZT4+Pjd8ZTw8MjUpXihlPj4+MTh8ZTw8MTQpXmU+Pj4zfXIodSxvKSx1LnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2E9MTc3OTAzMzcwMyx0aGlzLl9iPTMxNDQxMzQyNzcsdGhpcy5fYz0xMDEzOTA0MjQyLHRoaXMuX2Q9Mjc3MzQ4MDc2Mix0aGlzLl9lPTEzNTk4OTMxMTksdGhpcy5fZj0yNjAwODIyOTI0LHRoaXMuX2c9NTI4NzM0NjM1LHRoaXMuX2g9MTU0MTQ1OTIyNSx0aGlzfSx1LnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPXRoaXMuX3cscj0wfHRoaXMuX2Esbz0wfHRoaXMuX2IsYT0wfHRoaXMuX2Mscz0wfHRoaXMuX2QsdT0wfHRoaXMuX2UsZD0wfHRoaXMuX2YsbT0wfHRoaXMuX2csdj0wfHRoaXMuX2gsZz0wO2c8MTY7KytnKW5bZ109ZS5yZWFkSW50MzJCRSg0KmcpO2Zvcig7Zzw2NDsrK2cpbltnXT0wfCgoKHQ9bltnLTJdKT4+PjE3fHQ8PDE1KV4odD4+PjE5fHQ8PDEzKV50Pj4+MTApK25bZy03XStoKG5bZy0xNV0pK25bZy0xNl07Zm9yKHZhciB5PTA7eTw2NDsrK3kpe3ZhciBiPXYrZih1KStjKHUsZCxtKStpW3ldK25beV18MCxfPXAocikrbChyLG8sYSl8MDt2PW0sbT1kLGQ9dSx1PXMrYnwwLHM9YSxhPW8sbz1yLHI9YitffDB9dGhpcy5fYT1yK3RoaXMuX2F8MCx0aGlzLl9iPW8rdGhpcy5fYnwwLHRoaXMuX2M9YSt0aGlzLl9jfDAsdGhpcy5fZD1zK3RoaXMuX2R8MCx0aGlzLl9lPXUrdGhpcy5fZXwwLHRoaXMuX2Y9ZCt0aGlzLl9mfDAsdGhpcy5fZz1tK3RoaXMuX2d8MCx0aGlzLl9oPXYrdGhpcy5faHwwfSx1LnByb3RvdHlwZS5faGFzaD1mdW5jdGlvbigpe3ZhciBlPWEuYWxsb2NVbnNhZmUoMzIpO3JldHVybiBlLndyaXRlSW50MzJCRSh0aGlzLl9hLDApLGUud3JpdGVJbnQzMkJFKHRoaXMuX2IsNCksZS53cml0ZUludDMyQkUodGhpcy5fYyw4KSxlLndyaXRlSW50MzJCRSh0aGlzLl9kLDEyKSxlLndyaXRlSW50MzJCRSh0aGlzLl9lLDE2KSxlLndyaXRlSW50MzJCRSh0aGlzLl9mLDIwKSxlLndyaXRlSW50MzJCRSh0aGlzLl9nLDI0KSxlLndyaXRlSW50MzJCRSh0aGlzLl9oLDI4KSxlfSxlLmV4cG9ydHM9dX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNjMpLG89bigxNDApLGE9big2NCkuQnVmZmVyLGk9WzExMTYzNTI0MDgsMzYwOTc2NzQ1OCwxODk5NDQ3NDQxLDYwMjg5MTcyNSwzMDQ5MzIzNDcxLDM5NjQ0ODQzOTksMzkyMTAwOTU3MywyMTczMjk1NTQ4LDk2MTk4NzE2Myw0MDgxNjI4NDcyLDE1MDg5NzA5OTMsMzA1MzgzNDI2NSwyNDUzNjM1NzQ4LDI5Mzc2NzE1NzksMjg3MDc2MzIyMSwzNjY0NjA5NTYwLDM2MjQzODEwODAsMjczNDg4MzM5NCwzMTA1OTg0MDEsMTE2NDk5NjU0Miw2MDcyMjUyNzgsMTMyMzYxMDc2NCwxNDI2ODgxOTg3LDM1OTAzMDQ5OTQsMTkyNTA3ODM4OCw0MDY4MTgyMzgzLDIxNjIwNzgyMDYsOTkxMzM2MTEzLDI2MTQ4ODgxMDMsNjMzODAzMzE3LDMyNDgyMjI1ODAsMzQ3OTc3NDg2OCwzODM1MzkwNDAxLDI2NjY2MTM0NTgsNDAyMjIyNDc3NCw5NDQ3MTExMzksMjY0MzQ3MDc4LDIzNDEyNjI3NzMsNjA0ODA3NjI4LDIwMDc4MDA5MzMsNzcwMjU1OTgzLDE0OTU5OTA5MDEsMTI0OTE1MDEyMiwxODU2NDMxMjM1LDE1NTUwODE2OTIsMzE3NTIxODEzMiwxOTk2MDY0OTg2LDIxOTg5NTA4MzcsMjU1NDIyMDg4MiwzOTk5NzE5MzM5LDI4MjE4MzQzNDksNzY2Nzg0MDE2LDI5NTI5OTY4MDgsMjU2NjU5NDg3OSwzMjEwMzEzNjcxLDMyMDMzMzc5NTYsMzMzNjU3MTg5MSwxMDM0NDU3MDI2LDM1ODQ1Mjg3MTEsMjQ2Njk0ODkwMSwxMTM5MjY5OTMsMzc1ODMyNjM4MywzMzgyNDE4OTUsMTY4NzE3OTM2LDY2NjMwNzIwNSwxMTg4MTc5OTY0LDc3MzUyOTkxMiwxNTQ2MDQ1NzM0LDEyOTQ3NTczNzIsMTUyMjgwNTQ4NSwxMzk2MTgyMjkxLDI2NDM4MzM4MjMsMTY5NTE4MzcwMCwyMzQzNTI3MzkwLDE5ODY2NjEwNTEsMTAxNDQ3NzQ4MCwyMTc3MDI2MzUwLDEyMDY3NTkxNDIsMjQ1Njk1NjAzNywzNDQwNzc2MjcsMjczMDQ4NTkyMSwxMjkwODYzNDYwLDI4MjAzMDI0MTEsMzE1ODQ1NDI3MywzMjU5NzMwODAwLDM1MDU5NTI2NTcsMzM0NTc2NDc3MSwxMDYyMTcwMDgsMzUxNjA2NTgxNywzNjA2MDA4MzQ0LDM2MDAzNTI4MDQsMTQzMjcyNTc3Niw0MDk0NTcxOTA5LDE0NjcwMzE1OTQsMjc1NDIzMzQ0LDg1MTE2OTcyMCw0MzAyMjc3MzQsMzEwMDgyMzc1Miw1MDY5NDg2MTYsMTM2MzI1ODE5NSw2NTkwNjA1NTYsMzc1MDY4NTU5Myw4ODM5OTc4NzcsMzc4NTA1MDI4MCw5NTgxMzk1NzEsMzMxODMwNzQyNywxMzIyODIyMjE4LDM4MTI3MjM0MDMsMTUzNzAwMjA2MywyMDAzMDM0OTk1LDE3NDc4NzM3NzksMzYwMjAzNjg5OSwxOTU1NTYyMjIyLDE1NzU5OTAwMTIsMjAyNDEwNDgxNSwxMTI1NTkyOTI4LDIyMjc3MzA0NTIsMjcxNjkwNDMwNiwyMzYxODUyNDI0LDQ0Mjc3NjA0NCwyNDI4NDM2NDc0LDU5MzY5ODM0NCwyNzU2NzM0MTg3LDM3MzMxMTAyNDksMzIwNDAzMTQ3OSwyOTk5MzUxNTczLDMzMjkzMjUyOTgsMzgxNTkyMDQyNywzMzkxNTY5NjE0LDM5MjgzODM5MDAsMzUxNTI2NzI3MSw1NjYyODA3MTEsMzk0MDE4NzYwNiwzNDU0MDY5NTM0LDQxMTg2MzAyNzEsNDAwMDIzOTk5MiwxMTY0MTg0NzQsMTkxNDEzODU1NCwxNzQyOTI0MjEsMjczMTA1NTI3MCwyODkzODAzNTYsMzIwMzk5MzAwNiw0NjAzOTMyNjksMzIwNjIwMzE1LDY4NTQ3MTczMyw1ODc0OTY4MzYsODUyMTQyOTcxLDEwODY3OTI4NTEsMTAxNzAzNjI5OCwzNjU1NDMxMDAsMTEyNjAwMDU4MCwyNjE4Mjk3Njc2LDEyODgwMzM0NzAsMzQwOTg1NTE1OCwxNTAxNTA1OTQ4LDQyMzQ1MDk4NjYsMTYwNzE2NzkxNSw5ODcxNjc0NjgsMTgxNjQwMjMxNiwxMjQ2MTg5NTkxXSxzPW5ldyBBcnJheSgxNjApO2Z1bmN0aW9uIHUoKXt0aGlzLmluaXQoKSx0aGlzLl93PXMsby5jYWxsKHRoaXMsMTI4LDExMil9ZnVuY3Rpb24gYyhlLHQsbil7cmV0dXJuIG5eZSYodF5uKX1mdW5jdGlvbiBsKGUsdCxuKXtyZXR1cm4gZSZ0fG4mKGV8dCl9ZnVuY3Rpb24gcChlLHQpe3JldHVybihlPj4+Mjh8dDw8NCleKHQ+Pj4yfGU8PDMwKV4odD4+Pjd8ZTw8MjUpfWZ1bmN0aW9uIGYoZSx0KXtyZXR1cm4oZT4+PjE0fHQ8PDE4KV4oZT4+PjE4fHQ8PDE0KV4odD4+Pjl8ZTw8MjMpfWZ1bmN0aW9uIGgoZSx0KXtyZXR1cm4oZT4+PjF8dDw8MzEpXihlPj4+OHx0PDwyNCleZT4+Pjd9ZnVuY3Rpb24gZChlLHQpe3JldHVybihlPj4+MXx0PDwzMSleKGU+Pj44fHQ8PDI0KV4oZT4+Pjd8dDw8MjUpfWZ1bmN0aW9uIG0oZSx0KXtyZXR1cm4oZT4+PjE5fHQ8PDEzKV4odD4+PjI5fGU8PDMpXmU+Pj42fWZ1bmN0aW9uIHYoZSx0KXtyZXR1cm4oZT4+PjE5fHQ8PDEzKV4odD4+PjI5fGU8PDMpXihlPj4+Nnx0PDwyNil9ZnVuY3Rpb24gZyhlLHQpe3JldHVybiBlPj4+MDx0Pj4+MD8xOjB9cih1LG8pLHUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYWg9MTc3OTAzMzcwMyx0aGlzLl9iaD0zMTQ0MTM0Mjc3LHRoaXMuX2NoPTEwMTM5MDQyNDIsdGhpcy5fZGg9Mjc3MzQ4MDc2Mix0aGlzLl9laD0xMzU5ODkzMTE5LHRoaXMuX2ZoPTI2MDA4MjI5MjQsdGhpcy5fZ2g9NTI4NzM0NjM1LHRoaXMuX2hoPTE1NDE0NTkyMjUsdGhpcy5fYWw9NDA4OTIzNTcyMCx0aGlzLl9ibD0yMjI3ODczNTk1LHRoaXMuX2NsPTQyNzExNzU3MjMsdGhpcy5fZGw9MTU5NTc1MDEyOSx0aGlzLl9lbD0yOTE3NTY1MTM3LHRoaXMuX2ZsPTcyNTUxMTE5OSx0aGlzLl9nbD00MjE1Mzg5NTQ3LHRoaXMuX2hsPTMyNzAzMzIwOSx0aGlzfSx1LnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLl93LG49MHx0aGlzLl9haCxyPTB8dGhpcy5fYmgsbz0wfHRoaXMuX2NoLGE9MHx0aGlzLl9kaCxzPTB8dGhpcy5fZWgsdT0wfHRoaXMuX2ZoLHk9MHx0aGlzLl9naCxiPTB8dGhpcy5faGgsXz0wfHRoaXMuX2FsLHc9MHx0aGlzLl9ibCx4PTB8dGhpcy5fY2wsRT0wfHRoaXMuX2RsLFM9MHx0aGlzLl9lbCxDPTB8dGhpcy5fZmwsQT0wfHRoaXMuX2dsLE89MHx0aGlzLl9obCxrPTA7azwzMjtrKz0yKXRba109ZS5yZWFkSW50MzJCRSg0KmspLHRbaysxXT1lLnJlYWRJbnQzMkJFKDQqays0KTtmb3IoO2s8MTYwO2srPTIpe3ZhciBqPXRbay0zMF0sVD10W2stMzArMV0sST1oKGosVCksUD1kKFQsaiksTj1tKGo9dFtrLTRdLFQ9dFtrLTQrMV0pLE09dihULGopLFI9dFtrLTE0XSxEPXRbay0xNCsxXSxMPXRbay0zMl0sQj10W2stMzIrMV0sRj1QK0R8MCxVPUkrUitnKEYsUCl8MDtVPShVPVUrTitnKEY9RitNfDAsTSl8MCkrTCtnKEY9RitCfDAsQil8MCx0W2tdPVUsdFtrKzFdPUZ9Zm9yKHZhciBxPTA7cTwxNjA7cSs9Mil7VT10W3FdLEY9dFtxKzFdO3ZhciB6PWwobixyLG8pLFY9bChfLHcseCksVz1wKG4sXyksSD1wKF8sbiksJD1mKHMsUyksSj1mKFMscyksSz1pW3FdLFk9aVtxKzFdLEc9YyhzLHUseSksWj1jKFMsQyxBKSxYPU8rSnwwLFE9YiskK2coWCxPKXwwO1E9KFE9KFE9UStHK2coWD1YK1p8MCxaKXwwKStLK2coWD1YK1l8MCxZKXwwKStVK2coWD1YK0Z8MCxGKXwwO3ZhciBlZT1IK1Z8MCx0ZT1XK3orZyhlZSxIKXwwO2I9eSxPPUEseT11LEE9Qyx1PXMsQz1TLHM9YStRK2coUz1FK1h8MCxFKXwwLGE9byxFPXgsbz1yLHg9dyxyPW4sdz1fLG49USt0ZStnKF89WCtlZXwwLFgpfDB9dGhpcy5fYWw9dGhpcy5fYWwrX3wwLHRoaXMuX2JsPXRoaXMuX2JsK3d8MCx0aGlzLl9jbD10aGlzLl9jbCt4fDAsdGhpcy5fZGw9dGhpcy5fZGwrRXwwLHRoaXMuX2VsPXRoaXMuX2VsK1N8MCx0aGlzLl9mbD10aGlzLl9mbCtDfDAsdGhpcy5fZ2w9dGhpcy5fZ2wrQXwwLHRoaXMuX2hsPXRoaXMuX2hsK098MCx0aGlzLl9haD10aGlzLl9haCtuK2codGhpcy5fYWwsXyl8MCx0aGlzLl9iaD10aGlzLl9iaCtyK2codGhpcy5fYmwsdyl8MCx0aGlzLl9jaD10aGlzLl9jaCtvK2codGhpcy5fY2wseCl8MCx0aGlzLl9kaD10aGlzLl9kaCthK2codGhpcy5fZGwsRSl8MCx0aGlzLl9laD10aGlzLl9laCtzK2codGhpcy5fZWwsUyl8MCx0aGlzLl9maD10aGlzLl9maCt1K2codGhpcy5fZmwsQyl8MCx0aGlzLl9naD10aGlzLl9naCt5K2codGhpcy5fZ2wsQSl8MCx0aGlzLl9oaD10aGlzLl9oaCtiK2codGhpcy5faGwsTyl8MH0sdS5wcm90b3R5cGUuX2hhc2g9ZnVuY3Rpb24oKXt2YXIgZT1hLmFsbG9jVW5zYWZlKDY0KTtmdW5jdGlvbiB0KHQsbixyKXtlLndyaXRlSW50MzJCRSh0LHIpLGUud3JpdGVJbnQzMkJFKG4scis0KX1yZXR1cm4gdCh0aGlzLl9haCx0aGlzLl9hbCwwKSx0KHRoaXMuX2JoLHRoaXMuX2JsLDgpLHQodGhpcy5fY2gsdGhpcy5fY2wsMTYpLHQodGhpcy5fZGgsdGhpcy5fZGwsMjQpLHQodGhpcy5fZWgsdGhpcy5fZWwsMzIpLHQodGhpcy5fZmgsdGhpcy5fZmwsNDApLHQodGhpcy5fZ2gsdGhpcy5fZ2wsNDgpLHQodGhpcy5faGgsdGhpcy5faGwsNTYpLGV9LGUuZXhwb3J0cz11fSxmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPW4oODQ2KX0sZnVuY3Rpb24oZSx0LG4pe2UuZXhwb3J0cz1uKDg0Nyl9LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9big4NjYpfSxmdW5jdGlvbihlLHQsbil7big0NDgpLG4oMTgyKSxuKDg3MCksbig0NTUpLG4oNDU2KSxuKDg3NSksbigxMzApLG4oODYpO3ZhciByPW4oMzMpO2UuZXhwb3J0cz1yLlByb21pc2V9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyMiksbz1uKDE4NCksYT1uKDE4NSksaT1uKDExMSkscz1uKDY3KSx1PW4oMTA3KSxjPW4oMTIxKSxsPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztpZighKG4gaW5zdGFuY2VvZiBsKSlyZXR1cm4gbmV3IGwoZSx0KTthJiYobj1hKG5ldyBFcnJvcih2b2lkIDApLG8obikpKSx2b2lkIDAhPT10JiZzKG4sIm1lc3NhZ2UiLFN0cmluZyh0KSk7dmFyIHI9W107cmV0dXJuIGMoZSxyLnB1c2gse3RoYXQ6cn0pLHMobiwiZXJyb3JzIixyKSxufTtsLnByb3RvdHlwZT1pKEVycm9yLnByb3RvdHlwZSx7Y29uc3RydWN0b3I6dSg1LGwpLG1lc3NhZ2U6dSg1LCIiKSxuYW1lOnUoNSwiQWdncmVnYXRlRXJyb3IiKX0pLHIoe2dsb2JhbDohMH0se0FnZ3JlZ2F0ZUVycm9yOmx9KX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNDApO2UuZXhwb3J0cz1yLlByb21pc2V9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9big3MCksbz1uKDY4KSxhPW4oNDEpLGk9big0OCkscz1hKCJzcGVjaWVzIik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PXIoZSksbj1vLmY7aSYmdCYmIXRbc10mJm4odCxzLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9fSl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big1Miksbz1uKDc2KSxhPW4oNDEpKCJzcGVjaWVzIik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIG4saT1yKGUpLmNvbnN0cnVjdG9yO3JldHVybiB2b2lkIDA9PT1pfHxudWxsPT0obj1yKGkpW2FdKT90Om8obil9fSxmdW5jdGlvbihlLHQsbil7dmFyIHIsbyxhLGk9big0MCkscz1uKDM3KSx1PW4oMTA5KSxjPW4oMzY1KSxsPW4oMjIzKSxwPW4oNDUzKSxmPW4oMTg2KSxoPWkubG9jYXRpb24sZD1pLnNldEltbWVkaWF0ZSxtPWkuY2xlYXJJbW1lZGlhdGUsdj1pLnByb2Nlc3MsZz1pLk1lc3NhZ2VDaGFubmVsLHk9aS5EaXNwYXRjaCxiPTAsXz17fSx3PSJvbnJlYWR5c3RhdGVjaGFuZ2UiLHg9ZnVuY3Rpb24oZSl7aWYoXy5oYXNPd25Qcm9wZXJ0eShlKSl7dmFyIHQ9X1tlXTtkZWxldGUgX1tlXSx0KCl9fSxFPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe3goZSl9fSxTPWZ1bmN0aW9uKGUpe3goZS5kYXRhKX0sQz1mdW5jdGlvbihlKXtpLnBvc3RNZXNzYWdlKGUrIiIsaC5wcm90b2NvbCsiLy8iK2guaG9zdCl9O2QmJm18fChkPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTE7YXJndW1lbnRzLmxlbmd0aD5uOyl0LnB1c2goYXJndW1lbnRzW24rK10pO3JldHVybiBfWysrYl09ZnVuY3Rpb24oKXsoImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpGdW5jdGlvbihlKSkuYXBwbHkodm9pZCAwLHQpfSxyKGIpLGJ9LG09ZnVuY3Rpb24oZSl7ZGVsZXRlIF9bZV19LGY/cj1mdW5jdGlvbihlKXt2Lm5leHRUaWNrKEUoZSkpfTp5JiZ5Lm5vdz9yPWZ1bmN0aW9uKGUpe3kubm93KEUoZSkpfTpnJiYhcD8oYT0obz1uZXcgZykucG9ydDIsby5wb3J0MS5vbm1lc3NhZ2U9UyxyPXUoYS5wb3N0TWVzc2FnZSxhLDEpKTppLmFkZEV2ZW50TGlzdGVuZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBwb3N0TWVzc2FnZSYmIWkuaW1wb3J0U2NyaXB0cyYmaCYmImZpbGU6IiE9PWgucHJvdG9jb2wmJiFzKEMpPyhyPUMsaS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixTLCExKSk6cj13IGluIGwoInNjcmlwdCIpP2Z1bmN0aW9uKGUpe2MuYXBwZW5kQ2hpbGQobCgic2NyaXB0IikpLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2MucmVtb3ZlQ2hpbGQodGhpcykseChlKX19OmZ1bmN0aW9uKGUpe3NldFRpbWVvdXQoRShlKSwwKX0pLGUuZXhwb3J0cz17c2V0OmQsY2xlYXI6bX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDExMCk7ZS5leHBvcnRzPS8oPzppcGhvbmV8aXBvZHxpcGFkKS4qYXBwbGV3ZWJraXQvaS50ZXN0KHIpfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big1Miksbz1uKDQ3KSxhPW4oMTY1KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZihyKGUpLG8odCkmJnQuY29uc3RydWN0b3I9PT1lKXJldHVybiB0O3ZhciBuPWEuZihlKTtyZXR1cm4oMCxuLnJlc29sdmUpKHQpLG4ucHJvbWlzZX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyMiksbz1uKDc2KSxhPW4oMTY1KSxpPW4oMjAyKSxzPW4oMTIxKTtyKHt0YXJnZXQ6IlByb21pc2UiLHN0YXQ6ITB9LHthbGxTZXR0bGVkOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1hLmYodCkscj1uLnJlc29sdmUsdT1uLnJlamVjdCxjPWkoKGZ1bmN0aW9uKCl7dmFyIG49byh0LnJlc29sdmUpLGE9W10saT0wLHU9MTtzKGUsKGZ1bmN0aW9uKGUpe3ZhciBvPWkrKyxzPSExO2EucHVzaCh2b2lkIDApLHUrKyxuLmNhbGwodCxlKS50aGVuKChmdW5jdGlvbihlKXtzfHwocz0hMCxhW29dPXtzdGF0dXM6ImZ1bGZpbGxlZCIsdmFsdWU6ZX0sLS11fHxyKGEpKX0pLChmdW5jdGlvbihlKXtzfHwocz0hMCxhW29dPXtzdGF0dXM6InJlamVjdGVkIixyZWFzb246ZX0sLS11fHxyKGEpKX0pKX0pKSwtLXV8fHIoYSl9KSk7cmV0dXJuIGMuZXJyb3ImJnUoYy52YWx1ZSksbi5wcm9taXNlfX0pfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMjIpLG89big3NiksYT1uKDcwKSxpPW4oMTY1KSxzPW4oMjAyKSx1PW4oMTIxKSxjPSJObyBvbmUgcHJvbWlzZSByZXNvbHZlZCI7cih7dGFyZ2V0OiJQcm9taXNlIixzdGF0OiEwfSx7YW55OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1pLmYodCkscj1uLnJlc29sdmUsbD1uLnJlamVjdCxwPXMoKGZ1bmN0aW9uKCl7dmFyIG49byh0LnJlc29sdmUpLGk9W10scz0wLHA9MSxmPSExO3UoZSwoZnVuY3Rpb24oZSl7dmFyIG89cysrLHU9ITE7aS5wdXNoKHZvaWQgMCkscCsrLG4uY2FsbCh0LGUpLnRoZW4oKGZ1bmN0aW9uKGUpe3V8fGZ8fChmPSEwLHIoZSkpfSksKGZ1bmN0aW9uKGUpe3V8fGZ8fCh1PSEwLGlbb109ZSwtLXB8fGwobmV3KGEoIkFnZ3JlZ2F0ZUVycm9yIikpKGksYykpKX0pKX0pKSwtLXB8fGwobmV3KGEoIkFnZ3JlZ2F0ZUVycm9yIikpKGksYykpfSkpO3JldHVybiBwLmVycm9yJiZsKHAudmFsdWUpLG4ucHJvbWlzZX19KX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNDgpLG89bigxNTYpLGE9big2NiksaT1uKDE3OCkuZixzPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIG4scz1hKHQpLHU9byhzKSxjPXUubGVuZ3RoLGw9MCxwPVtdO2M+bDspbj11W2wrK10sciYmIWkuY2FsbChzLG4pfHxwLnB1c2goZT9bbixzW25dXTpzW25dKTtyZXR1cm4gcH19O2UuZXhwb3J0cz17ZW50cmllczpzKCEwKSx2YWx1ZXM6cyghMSl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big0NTkpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsbil7Il9fcHJvdG9fXyI9PXQmJnI/cihlLHQse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm4sd3JpdGFibGU6ITB9KTplW3RdPW59fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMTUpLG89ZnVuY3Rpb24oKXt0cnl7dmFyIGU9cihPYmplY3QsImRlZmluZVByb3BlcnR5Iik7cmV0dXJuIGUoe30sIiIse30pLGV9Y2F0Y2goZSl7fX0oKTtlLmV4cG9ydHM9b30sZnVuY3Rpb24oZSx0LG4pe2UuZXhwb3J0cz1uKDkwMCl9LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9big5MDMpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz17aGFzQ2FjaGVkQ2hpbGROb2RlczoxfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMwKTtuKDI1KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbnVsbD09dCYmcigiMzAiKSxudWxsPT1lP3Q6QXJyYXkuaXNBcnJheShlKT9BcnJheS5pc0FycmF5KHQpPyhlLnB1c2guYXBwbHkoZSx0KSxlKTooZS5wdXNoKHQpLGUpOkFycmF5LmlzQXJyYXkodCk/W2VdLmNvbmNhdCh0KTpbZSx0XX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXtBcnJheS5pc0FycmF5KGUpP2UuZm9yRWFjaCh0LG4pOmUmJnQuY2FsbChuLGUpfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDU3KSxvPW51bGw7ZS5leHBvcnRzPWZ1bmN0aW9uKCl7cmV0dXJuIW8mJnIuY2FuVXNlRE9NJiYobz0idGV4dENvbnRlbnQiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50PyJ0ZXh0Q29udGVudCI6ImlubmVyVGV4dCIpLG99fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzApO3ZhciBvPW4oMTIyKSxhPShuKDI1KSxmdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7IWZ1bmN0aW9uKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsZSksdGhpcy5fY2FsbGJhY2tzPW51bGwsdGhpcy5fY29udGV4dHM9bnVsbCx0aGlzLl9hcmc9dH1yZXR1cm4gZS5wcm90b3R5cGUuZW5xdWV1ZT1mdW5jdGlvbihlLHQpe3RoaXMuX2NhbGxiYWNrcz10aGlzLl9jYWxsYmFja3N8fFtdLHRoaXMuX2NhbGxiYWNrcy5wdXNoKGUpLHRoaXMuX2NvbnRleHRzPXRoaXMuX2NvbnRleHRzfHxbXSx0aGlzLl9jb250ZXh0cy5wdXNoKHQpfSxlLnByb3RvdHlwZS5ub3RpZnlBbGw9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9jYWxsYmFja3MsdD10aGlzLl9jb250ZXh0cyxuPXRoaXMuX2FyZztpZihlJiZ0KXtlLmxlbmd0aCE9PXQubGVuZ3RoJiZyKCIyNCIpLHRoaXMuX2NhbGxiYWNrcz1udWxsLHRoaXMuX2NvbnRleHRzPW51bGw7Zm9yKHZhciBvPTA7bzxlLmxlbmd0aDtvKyspZVtvXS5jYWxsKHRbb10sbik7ZS5sZW5ndGg9MCx0Lmxlbmd0aD0wfX0sZS5wcm90b3R5cGUuY2hlY2twb2ludD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jYWxsYmFja3M/dGhpcy5fY2FsbGJhY2tzLmxlbmd0aDowfSxlLnByb3RvdHlwZS5yb2xsYmFjaz1mdW5jdGlvbihlKXt0aGlzLl9jYWxsYmFja3MmJnRoaXMuX2NvbnRleHRzJiYodGhpcy5fY2FsbGJhY2tzLmxlbmd0aD1lLHRoaXMuX2NvbnRleHRzLmxlbmd0aD1lKX0sZS5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLl9jYWxsYmFja3M9bnVsbCx0aGlzLl9jb250ZXh0cz1udWxsfSxlLnByb3RvdHlwZS5kZXN0cnVjdG9yPWZ1bmN0aW9uKCl7dGhpcy5yZXNldCgpfSxlfSgpKTtlLmV4cG9ydHM9by5hZGRQb29saW5nVG8oYSl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXtsb2dUb3BMZXZlbFJlbmRlcnM6ITF9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNDUpO2Z1bmN0aW9uIG8oZSl7dmFyIHQ9ZS50eXBlLG49ZS5ub2RlTmFtZTtyZXR1cm4gbiYmImlucHV0Ij09PW4udG9Mb3dlckNhc2UoKSYmKCJjaGVja2JveCI9PT10fHwicmFkaW8iPT09dCl9ZnVuY3Rpb24gYShlKXtyZXR1cm4gZS5fd3JhcHBlclN0YXRlLnZhbHVlVHJhY2tlcn12YXIgaT17X2dldFRyYWNrZXJGcm9tTm9kZTpmdW5jdGlvbihlKXtyZXR1cm4gYShyLmdldEluc3RhbmNlRnJvbU5vZGUoZSkpfSx0cmFjazpmdW5jdGlvbihlKXtpZighYShlKSl7dmFyIHQ9ci5nZXROb2RlRnJvbUluc3RhbmNlKGUpLG49byh0KT8iY2hlY2tlZCI6InZhbHVlIixpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsbikscz0iIit0W25dO3QuaGFzT3duUHJvcGVydHkobil8fCJmdW5jdGlvbiIhPXR5cGVvZiBpLmdldHx8ImZ1bmN0aW9uIiE9dHlwZW9mIGkuc2V0fHwoT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbix7ZW51bWVyYWJsZTppLmVudW1lcmFibGUsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBpLmdldC5jYWxsKHRoaXMpfSxzZXQ6ZnVuY3Rpb24oZSl7cz0iIitlLGkuc2V0LmNhbGwodGhpcyxlKX19KSxmdW5jdGlvbihlLHQpe2UuX3dyYXBwZXJTdGF0ZS52YWx1ZVRyYWNrZXI9dH0oZSx7Z2V0VmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gc30sc2V0VmFsdWU6ZnVuY3Rpb24oZSl7cz0iIitlfSxzdG9wVHJhY2tpbmc6ZnVuY3Rpb24oKXshZnVuY3Rpb24oZSl7ZS5fd3JhcHBlclN0YXRlLnZhbHVlVHJhY2tlcj1udWxsfShlKSxkZWxldGUgdFtuXX19KSl9fSx1cGRhdGVWYWx1ZUlmQ2hhbmdlZDpmdW5jdGlvbihlKXtpZighZSlyZXR1cm4hMTt2YXIgdD1hKGUpO2lmKCF0KXJldHVybiBpLnRyYWNrKGUpLCEwO3ZhciBuLHMsdT10LmdldFZhbHVlKCksYz0oKG49ci5nZXROb2RlRnJvbUluc3RhbmNlKGUpKSYmKHM9byhuKT8iIituLmNoZWNrZWQ6bi52YWx1ZSkscyk7cmV0dXJuIGMhPT11JiYodC5zZXRWYWx1ZShjKSwhMCl9LHN0b3BUcmFja2luZzpmdW5jdGlvbihlKXt2YXIgdD1hKGUpO3QmJnQuc3RvcFRyYWNraW5nKCl9fTtlLmV4cG9ydHM9aX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj17Y29sb3I6ITAsZGF0ZTohMCxkYXRldGltZTohMCwiZGF0ZXRpbWUtbG9jYWwiOiEwLGVtYWlsOiEwLG1vbnRoOiEwLG51bWJlcjohMCxwYXNzd29yZDohMCxyYW5nZTohMCxzZWFyY2g6ITAsdGVsOiEwLHRleHQ6ITAsdGltZTohMCx1cmw6ITAsd2VlazohMH07ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PWUmJmUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09dD8hIXJbZS50eXBlXToidGV4dGFyZWEiPT09dH19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9e2N1cnJlbnRTY3JvbGxMZWZ0OjAsY3VycmVudFNjcm9sbFRvcDowLHJlZnJlc2hTY3JvbGxWYWx1ZXM6ZnVuY3Rpb24oZSl7ci5jdXJyZW50U2Nyb2xsTGVmdD1lLngsci5jdXJyZW50U2Nyb2xsVG9wPWUueX19O2UuZXhwb3J0cz1yfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNTcpLG89bigyMDYpLGE9bigyMDUpLGk9ZnVuY3Rpb24oZSx0KXtpZih0KXt2YXIgbj1lLmZpcnN0Q2hpbGQ7aWYobiYmbj09PWUubGFzdENoaWxkJiYzPT09bi5ub2RlVHlwZSlyZXR1cm4gdm9pZChuLm5vZGVWYWx1ZT10KX1lLnRleHRDb250ZW50PXR9O3IuY2FuVXNlRE9NJiYoInRleHRDb250ZW50ImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8KGk9ZnVuY3Rpb24oZSx0KXszIT09ZS5ub2RlVHlwZT9hKGUsbyh0KSk6ZS5ub2RlVmFsdWU9dH0pKSxlLmV4cG9ydHM9aX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dHJ5e2UuZm9jdXMoKX1jYXRjaChlKXt9fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj17YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsYm9yZGVySW1hZ2VPdXRzZXQ6ITAsYm9yZGVySW1hZ2VTbGljZTohMCxib3JkZXJJbWFnZVdpZHRoOiEwLGJveEZsZXg6ITAsYm94RmxleEdyb3VwOiEwLGJveE9yZGluYWxHcm91cDohMCxjb2x1bW5Db3VudDohMCxjb2x1bW5zOiEwLGZsZXg6ITAsZmxleEdyb3c6ITAsZmxleFBvc2l0aXZlOiEwLGZsZXhTaHJpbms6ITAsZmxleE5lZ2F0aXZlOiEwLGZsZXhPcmRlcjohMCxncmlkUm93OiEwLGdyaWRSb3dFbmQ6ITAsZ3JpZFJvd1NwYW46ITAsZ3JpZFJvd1N0YXJ0OiEwLGdyaWRDb2x1bW46ITAsZ3JpZENvbHVtbkVuZDohMCxncmlkQ29sdW1uU3BhbjohMCxncmlkQ29sdW1uU3RhcnQ6ITAsZm9udFdlaWdodDohMCxsaW5lQ2xhbXA6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsdGFiU2l6ZTohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITAsZmlsbE9wYWNpdHk6ITAsZmxvb2RPcGFjaXR5OiEwLHN0b3BPcGFjaXR5OiEwLHN0cm9rZURhc2hhcnJheTohMCxzdHJva2VEYXNob2Zmc2V0OiEwLHN0cm9rZU1pdGVybGltaXQ6ITAsc3Ryb2tlT3BhY2l0eTohMCxzdHJva2VXaWR0aDohMH07dmFyIG89WyJXZWJraXQiLCJtcyIsIk1veiIsIk8iXTtPYmplY3Qua2V5cyhyKS5mb3JFYWNoKChmdW5jdGlvbihlKXtvLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JbZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSt0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK3Quc3Vic3RyaW5nKDEpfSh0LGUpXT1yW2VdfSkpfSkpO3ZhciBhPXtpc1VuaXRsZXNzTnVtYmVyOnIsc2hvcnRoYW5kUHJvcGVydHlFeHBhbnNpb25zOntiYWNrZ3JvdW5kOntiYWNrZ3JvdW5kQXR0YWNobWVudDohMCxiYWNrZ3JvdW5kQ29sb3I6ITAsYmFja2dyb3VuZEltYWdlOiEwLGJhY2tncm91bmRQb3NpdGlvblg6ITAsYmFja2dyb3VuZFBvc2l0aW9uWTohMCxiYWNrZ3JvdW5kUmVwZWF0OiEwfSxiYWNrZ3JvdW5kUG9zaXRpb246e2JhY2tncm91bmRQb3NpdGlvblg6ITAsYmFja2dyb3VuZFBvc2l0aW9uWTohMH0sYm9yZGVyOntib3JkZXJXaWR0aDohMCxib3JkZXJTdHlsZTohMCxib3JkZXJDb2xvcjohMH0sYm9yZGVyQm90dG9tOntib3JkZXJCb3R0b21XaWR0aDohMCxib3JkZXJCb3R0b21TdHlsZTohMCxib3JkZXJCb3R0b21Db2xvcjohMH0sYm9yZGVyTGVmdDp7Ym9yZGVyTGVmdFdpZHRoOiEwLGJvcmRlckxlZnRTdHlsZTohMCxib3JkZXJMZWZ0Q29sb3I6ITB9LGJvcmRlclJpZ2h0Ontib3JkZXJSaWdodFdpZHRoOiEwLGJvcmRlclJpZ2h0U3R5bGU6ITAsYm9yZGVyUmlnaHRDb2xvcjohMH0sYm9yZGVyVG9wOntib3JkZXJUb3BXaWR0aDohMCxib3JkZXJUb3BTdHlsZTohMCxib3JkZXJUb3BDb2xvcjohMH0sZm9udDp7Zm9udFN0eWxlOiEwLGZvbnRWYXJpYW50OiEwLGZvbnRXZWlnaHQ6ITAsZm9udFNpemU6ITAsbGluZUhlaWdodDohMCxmb250RmFtaWx5OiEwfSxvdXRsaW5lOntvdXRsaW5lV2lkdGg6ITAsb3V0bGluZVN0eWxlOiEwLG91dGxpbmVDb2xvcjohMH19fTtlLmV4cG9ydHM9YX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0Miksbz0obig0NSksbig3Miksbig5NDEpKSxhPShuKDM0KSxuZXcgUmVnRXhwKCJeWyIrci5BVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSKyJdWyIrci5BVFRSSUJVVEVfTkFNRV9DSEFSKyJdKiQiKSksaT17fSxzPXt9O2Z1bmN0aW9uIHUoZSl7cmV0dXJuISFzLmhhc093blByb3BlcnR5KGUpfHwhaS5oYXNPd25Qcm9wZXJ0eShlKSYmKGEudGVzdChlKT8oc1tlXT0hMCwhMCk6KGlbZV09ITAsITEpKX1mdW5jdGlvbiBjKGUsdCl7cmV0dXJuIG51bGw9PXR8fGUuaGFzQm9vbGVhblZhbHVlJiYhdHx8ZS5oYXNOdW1lcmljVmFsdWUmJmlzTmFOKHQpfHxlLmhhc1Bvc2l0aXZlTnVtZXJpY1ZhbHVlJiZ0PDF8fGUuaGFzT3ZlcmxvYWRlZEJvb2xlYW5WYWx1ZSYmITE9PT10fXZhciBsPXtjcmVhdGVNYXJrdXBGb3JJRDpmdW5jdGlvbihlKXtyZXR1cm4gci5JRF9BVFRSSUJVVEVfTkFNRSsiPSIrbyhlKX0sc2V0QXR0cmlidXRlRm9ySUQ6ZnVuY3Rpb24oZSx0KXtlLnNldEF0dHJpYnV0ZShyLklEX0FUVFJJQlVURV9OQU1FLHQpfSxjcmVhdGVNYXJrdXBGb3JSb290OmZ1bmN0aW9uKCl7cmV0dXJuIHIuUk9PVF9BVFRSSUJVVEVfTkFNRSsnPSIiJ30sc2V0QXR0cmlidXRlRm9yUm9vdDpmdW5jdGlvbihlKXtlLnNldEF0dHJpYnV0ZShyLlJPT1RfQVRUUklCVVRFX05BTUUsIiIpfSxjcmVhdGVNYXJrdXBGb3JQcm9wZXJ0eTpmdW5jdGlvbihlLHQpe3ZhciBuPXIucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShlKT9yLnByb3BlcnRpZXNbZV06bnVsbDtpZihuKXtpZihjKG4sdCkpcmV0dXJuIiI7dmFyIGE9bi5hdHRyaWJ1dGVOYW1lO3JldHVybiBuLmhhc0Jvb2xlYW5WYWx1ZXx8bi5oYXNPdmVybG9hZGVkQm9vbGVhblZhbHVlJiYhMD09PXQ/YSsnPSIiJzphKyI9IitvKHQpfXJldHVybiByLmlzQ3VzdG9tQXR0cmlidXRlKGUpP251bGw9PXQ/IiI6ZSsiPSIrbyh0KTpudWxsfSxjcmVhdGVNYXJrdXBGb3JDdXN0b21BdHRyaWJ1dGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdShlKSYmbnVsbCE9dD9lKyI9IitvKHQpOiIifSxzZXRWYWx1ZUZvclByb3BlcnR5OmZ1bmN0aW9uKGUsdCxuKXt2YXIgbz1yLnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkodCk/ci5wcm9wZXJ0aWVzW3RdOm51bGw7aWYobyl7dmFyIGE9by5tdXRhdGlvbk1ldGhvZDtpZihhKWEoZSxuKTtlbHNle2lmKGMobyxuKSlyZXR1cm4gdm9pZCB0aGlzLmRlbGV0ZVZhbHVlRm9yUHJvcGVydHkoZSx0KTtpZihvLm11c3RVc2VQcm9wZXJ0eSllW28ucHJvcGVydHlOYW1lXT1uO2Vsc2V7dmFyIGk9by5hdHRyaWJ1dGVOYW1lLHM9by5hdHRyaWJ1dGVOYW1lc3BhY2U7cz9lLnNldEF0dHJpYnV0ZU5TKHMsaSwiIituKTpvLmhhc0Jvb2xlYW5WYWx1ZXx8by5oYXNPdmVybG9hZGVkQm9vbGVhblZhbHVlJiYhMD09PW4/ZS5zZXRBdHRyaWJ1dGUoaSwiIik6ZS5zZXRBdHRyaWJ1dGUoaSwiIituKX19fWVsc2UgaWYoci5pc0N1c3RvbUF0dHJpYnV0ZSh0KSlyZXR1cm4gdm9pZCBsLnNldFZhbHVlRm9yQXR0cmlidXRlKGUsdCxuKX0sc2V0VmFsdWVGb3JBdHRyaWJ1dGU6ZnVuY3Rpb24oZSx0LG4pe3UodCkmJihudWxsPT1uP2UucmVtb3ZlQXR0cmlidXRlKHQpOmUuc2V0QXR0cmlidXRlKHQsIiIrbikpfSxkZWxldGVWYWx1ZUZvckF0dHJpYnV0ZTpmdW5jdGlvbihlLHQpe2UucmVtb3ZlQXR0cmlidXRlKHQpfSxkZWxldGVWYWx1ZUZvclByb3BlcnR5OmZ1bmN0aW9uKGUsdCl7dmFyIG49ci5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KHQpP3IucHJvcGVydGllc1t0XTpudWxsO2lmKG4pe3ZhciBvPW4ubXV0YXRpb25NZXRob2Q7aWYobylvKGUsdm9pZCAwKTtlbHNlIGlmKG4ubXVzdFVzZVByb3BlcnR5KXt2YXIgYT1uLnByb3BlcnR5TmFtZTtuLmhhc0Jvb2xlYW5WYWx1ZT9lW2FdPSExOmVbYV09IiJ9ZWxzZSBlLnJlbW92ZUF0dHJpYnV0ZShuLmF0dHJpYnV0ZU5hbWUpfWVsc2Ugci5pc0N1c3RvbUF0dHJpYnV0ZSh0KSYmZS5yZW1vdmVBdHRyaWJ1dGUodCl9fTtlLmV4cG9ydHM9bH0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDM4KSxvPW4oMjY5KSxhPW4oNDUpLGk9big3OSkscz0obigzNCksITEpO2Z1bmN0aW9uIHUoKXtpZih0aGlzLl9yb290Tm9kZUlEJiZ0aGlzLl93cmFwcGVyU3RhdGUucGVuZGluZ1VwZGF0ZSl7dGhpcy5fd3JhcHBlclN0YXRlLnBlbmRpbmdVcGRhdGU9ITE7dmFyIGU9dGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHMsdD1vLmdldFZhbHVlKGUpO251bGwhPXQmJmModGhpcyxCb29sZWFuKGUubXVsdGlwbGUpLHQpfX1mdW5jdGlvbiBjKGUsdCxuKXt2YXIgcixvLGk9YS5nZXROb2RlRnJvbUluc3RhbmNlKGUpLm9wdGlvbnM7aWYodCl7Zm9yKHI9e30sbz0wO288bi5sZW5ndGg7bysrKXJbIiIrbltvXV09ITA7Zm9yKG89MDtvPGkubGVuZ3RoO28rKyl7dmFyIHM9ci5oYXNPd25Qcm9wZXJ0eShpW29dLnZhbHVlKTtpW29dLnNlbGVjdGVkIT09cyYmKGlbb10uc2VsZWN0ZWQ9cyl9fWVsc2V7Zm9yKHI9IiIrbixvPTA7bzxpLmxlbmd0aDtvKyspaWYoaVtvXS52YWx1ZT09PXIpcmV0dXJuIHZvaWQoaVtvXS5zZWxlY3RlZD0hMCk7aS5sZW5ndGgmJihpWzBdLnNlbGVjdGVkPSEwKX19dmFyIGw9e2dldEhvc3RQcm9wczpmdW5jdGlvbihlLHQpe3JldHVybiByKHt9LHQse29uQ2hhbmdlOmUuX3dyYXBwZXJTdGF0ZS5vbkNoYW5nZSx2YWx1ZTp2b2lkIDB9KX0sbW91bnRXcmFwcGVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49by5nZXRWYWx1ZSh0KTtlLl93cmFwcGVyU3RhdGU9e3BlbmRpbmdVcGRhdGU6ITEsaW5pdGlhbFZhbHVlOm51bGwhPW4/bjp0LmRlZmF1bHRWYWx1ZSxsaXN0ZW5lcnM6bnVsbCxvbkNoYW5nZTpwLmJpbmQoZSksd2FzTXVsdGlwbGU6Qm9vbGVhbih0Lm11bHRpcGxlKX0sdm9pZCAwPT09dC52YWx1ZXx8dm9pZCAwPT09dC5kZWZhdWx0VmFsdWV8fHN8fChzPSEwKX0sZ2V0U2VsZWN0VmFsdWVDb250ZXh0OmZ1bmN0aW9uKGUpe3JldHVybiBlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlfSxwb3N0VXBkYXRlV3JhcHBlcjpmdW5jdGlvbihlKXt2YXIgdD1lLl9jdXJyZW50RWxlbWVudC5wcm9wcztlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlPXZvaWQgMDt2YXIgbj1lLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU7ZS5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlPUJvb2xlYW4odC5tdWx0aXBsZSk7dmFyIHI9by5nZXRWYWx1ZSh0KTtudWxsIT1yPyhlLl93cmFwcGVyU3RhdGUucGVuZGluZ1VwZGF0ZT0hMSxjKGUsQm9vbGVhbih0Lm11bHRpcGxlKSxyKSk6biE9PUJvb2xlYW4odC5tdWx0aXBsZSkmJihudWxsIT10LmRlZmF1bHRWYWx1ZT9jKGUsQm9vbGVhbih0Lm11bHRpcGxlKSx0LmRlZmF1bHRWYWx1ZSk6YyhlLEJvb2xlYW4odC5tdWx0aXBsZSksdC5tdWx0aXBsZT9bXToiIikpfX07ZnVuY3Rpb24gcChlKXt2YXIgdD10aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcyxuPW8uZXhlY3V0ZU9uQ2hhbmdlKHQsZSk7cmV0dXJuIHRoaXMuX3Jvb3ROb2RlSUQmJih0aGlzLl93cmFwcGVyU3RhdGUucGVuZGluZ1VwZGF0ZT0hMCksaS5hc2FwKHUsdGhpcyksbn1lLmV4cG9ydHM9bH0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMwKSxvPW4oMzgpLGE9big5NTApLGk9big0NzgpLHM9big0NzkpLHU9KG4oOTUxKSxuKDI1KSxuKDM0KSxmdW5jdGlvbihlKXt0aGlzLmNvbnN0cnVjdChlKX0pO2Z1bmN0aW9uIGMoZSx0KXt2YXIgbjtpZihudWxsPT09ZXx8ITE9PT1lKW49aS5jcmVhdGUoYyk7ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIGUpe3ZhciBvPWUsYT1vLnR5cGU7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGEmJiJzdHJpbmciIT10eXBlb2YgYSl7dmFyIGw9IiI7MCxsKz1mdW5jdGlvbihlKXtpZihlKXt2YXIgdD1lLmdldE5hbWUoKTtpZih0KXJldHVybiIgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCIrdCsiYC4ifXJldHVybiIifShvLl9vd25lcikscigiMTMwIixudWxsPT1hP2E6dHlwZW9mIGEsbCl9InN0cmluZyI9PXR5cGVvZiBvLnR5cGU/bj1zLmNyZWF0ZUludGVybmFsQ29tcG9uZW50KG8pOiFmdW5jdGlvbihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZSYmdm9pZCAwIT09ZS5wcm90b3R5cGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnByb3RvdHlwZS5tb3VudENvbXBvbmVudCYmImZ1bmN0aW9uIj09dHlwZW9mIGUucHJvdG90eXBlLnJlY2VpdmVDb21wb25lbnR9KG8udHlwZSk/bj1uZXcgdShvKToobj1uZXcgby50eXBlKG8pKS5nZXRIb3N0Tm9kZXx8KG4uZ2V0SG9zdE5vZGU9bi5nZXROYXRpdmVOb2RlKX1lbHNlInN0cmluZyI9PXR5cGVvZiBlfHwibnVtYmVyIj09dHlwZW9mIGU/bj1zLmNyZWF0ZUluc3RhbmNlRm9yVGV4dChlKTpyKCIxMzEiLHR5cGVvZiBlKTtyZXR1cm4gbi5fbW91bnRJbmRleD0wLG4uX21vdW50SW1hZ2U9bnVsbCxufW8odS5wcm90b3R5cGUsYSx7X2luc3RhbnRpYXRlUmVhY3RDb21wb25lbnQ6Y30pLGUuZXhwb3J0cz1jfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzApLG89bigxMzMpLGE9KG4oMjUpLHtIT1NUOjAsQ09NUE9TSVRFOjEsRU1QVFk6MixnZXRUeXBlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT09ZXx8ITE9PT1lP2EuRU1QVFk6by5pc1ZhbGlkRWxlbWVudChlKT8iZnVuY3Rpb24iPT10eXBlb2YgZS50eXBlP2EuQ09NUE9TSVRFOmEuSE9TVDp2b2lkIHIoIjI2IixlKX19KTtlLmV4cG9ydHM9YX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcixvPXtpbmplY3RFbXB0eUNvbXBvbmVudEZhY3Rvcnk6ZnVuY3Rpb24oZSl7cj1lfX0sYT17Y3JlYXRlOmZ1bmN0aW9uKGUpe3JldHVybiByKGUpfX07YS5pbmplY3Rpb249byxlLmV4cG9ydHM9YX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMwKSxvPShuKDI1KSxudWxsKSxhPW51bGw7dmFyIGk9e2NyZWF0ZUludGVybmFsQ29tcG9uZW50OmZ1bmN0aW9uKGUpe3JldHVybiBvfHxyKCIxMTEiLGUudHlwZSksbmV3IG8oZSl9LGNyZWF0ZUluc3RhbmNlRm9yVGV4dDpmdW5jdGlvbihlKXtyZXR1cm4gbmV3IGEoZSl9LGlzVGV4dENvbXBvbmVudDpmdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGF9LGluamVjdGlvbjp7aW5qZWN0R2VuZXJpY0NvbXBvbmVudENsYXNzOmZ1bmN0aW9uKGUpe289ZX0saW5qZWN0VGV4dENvbXBvbmVudENsYXNzOmZ1bmN0aW9uKGUpe2E9ZX19fTtlLmV4cG9ydHM9aX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMwKSxvPShuKDg3KSxuKDk1MikpLGE9big5NTMpLGk9KG4oMjUpLG4oMjczKSk7bigzNCk7ZnVuY3Rpb24gcyhlLHQpe3JldHVybiBlJiYib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPWUua2V5P2kuZXNjYXBlKGUua2V5KTp0LnRvU3RyaW5nKDM2KX1mdW5jdGlvbiB1KGUsdCxuLGMpe3ZhciBsLHA9dHlwZW9mIGU7aWYoInVuZGVmaW5lZCIhPT1wJiYiYm9vbGVhbiIhPT1wfHwoZT1udWxsKSxudWxsPT09ZXx8InN0cmluZyI9PT1wfHwibnVtYmVyIj09PXB8fCJvYmplY3QiPT09cCYmZS4kJHR5cGVvZj09PW8pcmV0dXJuIG4oYyxlLCIiPT09dD8iLiIrcyhlLDApOnQpLDE7dmFyIGY9MCxoPSIiPT09dD8iLiI6dCsiOiI7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIGQ9MDtkPGUubGVuZ3RoO2QrKylmKz11KGw9ZVtkXSxoK3MobCxkKSxuLGMpO2Vsc2V7dmFyIG09YShlKTtpZihtKXt2YXIgdixnPW0uY2FsbChlKTtpZihtIT09ZS5lbnRyaWVzKWZvcih2YXIgeT0wOyEodj1nLm5leHQoKSkuZG9uZTspZis9dShsPXYudmFsdWUsaCtzKGwseSsrKSxuLGMpO2Vsc2UgZm9yKDshKHY9Zy5uZXh0KCkpLmRvbmU7KXt2YXIgYj12LnZhbHVlO2ImJihmKz11KGw9YlsxXSxoK2kuZXNjYXBlKGJbMF0pKyI6IitzKGwsMCksbixjKSl9fWVsc2UgaWYoIm9iamVjdCI9PT1wKXt2YXIgXz1TdHJpbmcoZSk7cigiMzEiLCJbb2JqZWN0IE9iamVjdF0iPT09Xz8ib2JqZWN0IHdpdGgga2V5cyB7IitPYmplY3Qua2V5cyhlKS5qb2luKCIsICIpKyJ9IjpfLCIiKX19cmV0dXJuIGZ9ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnVsbD09ZT8wOnUoZSwiIix0LG4pfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcixvLGEsaSxzLHUsYyxsPW4oMTU5KSxwPW4oODcpO24oMjUpLG4oMzQpO2Z1bmN0aW9uIGYoZSl7dmFyIHQ9RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nLG49T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxyPVJlZ0V4cCgiXiIrdC5jYWxsKG4pLnJlcGxhY2UoL1tcXF4kLiorPygpW1xde318XS9nLCJcXCQmIikucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywiJDEuKj8iKSsiJCIpO3RyeXt2YXIgbz10LmNhbGwoZSk7cmV0dXJuIHIudGVzdChvKX1jYXRjaChlKXtyZXR1cm4hMX19aWYoImZ1bmN0aW9uIj09dHlwZW9mIEFycmF5LmZyb20mJiJmdW5jdGlvbiI9PXR5cGVvZiBNYXAmJmYoTWFwKSYmbnVsbCE9TWFwLnByb3RvdHlwZSYmImZ1bmN0aW9uIj09dHlwZW9mIE1hcC5wcm90b3R5cGUua2V5cyYmZihNYXAucHJvdG90eXBlLmtleXMpJiYiZnVuY3Rpb24iPT10eXBlb2YgU2V0JiZmKFNldCkmJm51bGwhPVNldC5wcm90b3R5cGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTZXQucHJvdG90eXBlLmtleXMmJmYoU2V0LnByb3RvdHlwZS5rZXlzKSl7dmFyIGg9bmV3IE1hcCxkPW5ldyBTZXQ7cj1mdW5jdGlvbihlLHQpe2guc2V0KGUsdCl9LG89ZnVuY3Rpb24oZSl7cmV0dXJuIGguZ2V0KGUpfSxhPWZ1bmN0aW9uKGUpe2guZGVsZXRlKGUpfSxpPWZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5LmZyb20oaC5rZXlzKCkpfSxzPWZ1bmN0aW9uKGUpe2QuYWRkKGUpfSx1PWZ1bmN0aW9uKGUpe2QuZGVsZXRlKGUpfSxjPWZ1bmN0aW9uKCl7cmV0dXJuIEFycmF5LmZyb20oZC5rZXlzKCkpfX1lbHNle3ZhciBtPXt9LHY9e30sZz1mdW5jdGlvbihlKXtyZXR1cm4iLiIrZX0seT1mdW5jdGlvbihlKXtyZXR1cm4gcGFyc2VJbnQoZS5zdWJzdHIoMSksMTApfTtyPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZyhlKTttW25dPXR9LG89ZnVuY3Rpb24oZSl7dmFyIHQ9ZyhlKTtyZXR1cm4gbVt0XX0sYT1mdW5jdGlvbihlKXt2YXIgdD1nKGUpO2RlbGV0ZSBtW3RdfSxpPWZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5rZXlzKG0pLm1hcCh5KX0scz1mdW5jdGlvbihlKXt2YXIgdD1nKGUpO3ZbdF09ITB9LHU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZyhlKTtkZWxldGUgdlt0XX0sYz1mdW5jdGlvbigpe3JldHVybiBPYmplY3Qua2V5cyh2KS5tYXAoeSl9fXZhciBiPVtdO2Z1bmN0aW9uIF8oZSl7dmFyIHQ9byhlKTtpZih0KXt2YXIgbj10LmNoaWxkSURzO2EoZSksbi5mb3JFYWNoKF8pfX1mdW5jdGlvbiB3KGUsdCxuKXtyZXR1cm4iXG4gICAgaW4gIisoZXx8IlVua25vd24iKSsodD8iIChhdCAiK3QuZmlsZU5hbWUucmVwbGFjZSgvXi4qW1xcXC9dLywiIikrIjoiK3QubGluZU51bWJlcisiKSI6bj8iIChjcmVhdGVkIGJ5ICIrbisiKSI6IiIpfWZ1bmN0aW9uIHgoZSl7cmV0dXJuIG51bGw9PWU/IiNlbXB0eSI6InN0cmluZyI9PXR5cGVvZiBlfHwibnVtYmVyIj09dHlwZW9mIGU/IiN0ZXh0Ijoic3RyaW5nIj09dHlwZW9mIGUudHlwZT9lLnR5cGU6ZS50eXBlLmRpc3BsYXlOYW1lfHxlLnR5cGUubmFtZXx8IlVua25vd24ifWZ1bmN0aW9uIEUoZSl7dmFyIHQsbj1TLmdldERpc3BsYXlOYW1lKGUpLHI9Uy5nZXRFbGVtZW50KGUpLG89Uy5nZXRPd25lcklEKGUpO3JldHVybiBvJiYodD1TLmdldERpc3BsYXlOYW1lKG8pKSx3KG4sciYmci5fc291cmNlLHQpfXZhciBTPXtvblNldENoaWxkcmVuOmZ1bmN0aW9uKGUsdCl7dmFyIG49byhlKTtufHxsKCIxNDQiKSxuLmNoaWxkSURzPXQ7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBhPXRbcl0saT1vKGEpO2l8fGwoIjE0MCIpLG51bGw9PWkuY2hpbGRJRHMmJiJvYmplY3QiPT10eXBlb2YgaS5lbGVtZW50JiZudWxsIT1pLmVsZW1lbnQmJmwoIjE0MSIpLGkuaXNNb3VudGVkfHxsKCI3MSIpLG51bGw9PWkucGFyZW50SUQmJihpLnBhcmVudElEPWUpLGkucGFyZW50SUQhPT1lJiZsKCIxNDIiLGEsaS5wYXJlbnRJRCxlKX19LG9uQmVmb3JlTW91bnRDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4pe3IoZSx7ZWxlbWVudDp0LHBhcmVudElEOm4sdGV4dDpudWxsLGNoaWxkSURzOltdLGlzTW91bnRlZDohMSx1cGRhdGVDb3VudDowfSl9LG9uQmVmb3JlVXBkYXRlQ29tcG9uZW50OmZ1bmN0aW9uKGUsdCl7dmFyIG49byhlKTtuJiZuLmlzTW91bnRlZCYmKG4uZWxlbWVudD10KX0sb25Nb3VudENvbXBvbmVudDpmdW5jdGlvbihlKXt2YXIgdD1vKGUpO3R8fGwoIjE0NCIpLHQuaXNNb3VudGVkPSEwLDA9PT10LnBhcmVudElEJiZzKGUpfSxvblVwZGF0ZUNvbXBvbmVudDpmdW5jdGlvbihlKXt2YXIgdD1vKGUpO3QmJnQuaXNNb3VudGVkJiZ0LnVwZGF0ZUNvdW50Kyt9LG9uVW5tb3VudENvbXBvbmVudDpmdW5jdGlvbihlKXt2YXIgdD1vKGUpO3QmJih0LmlzTW91bnRlZD0hMSwwPT09dC5wYXJlbnRJRCYmdShlKSk7Yi5wdXNoKGUpfSxwdXJnZVVubW91bnRlZENvbXBvbmVudHM6ZnVuY3Rpb24oKXtpZighUy5fcHJldmVudFB1cmdpbmcpe2Zvcih2YXIgZT0wO2U8Yi5sZW5ndGg7ZSsrKXtfKGJbZV0pfWIubGVuZ3RoPTB9fSxpc01vdW50ZWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9byhlKTtyZXR1cm4hIXQmJnQuaXNNb3VudGVkfSxnZXRDdXJyZW50U3RhY2tBZGRlbmR1bTpmdW5jdGlvbihlKXt2YXIgdD0iIjtpZihlKXt2YXIgbj14KGUpLHI9ZS5fb3duZXI7dCs9dyhuLGUuX3NvdXJjZSxyJiZyLmdldE5hbWUoKSl9dmFyIG89cC5jdXJyZW50LGE9byYmby5fZGVidWdJRDtyZXR1cm4gdCs9Uy5nZXRTdGFja0FkZGVuZHVtQnlJRChhKX0sZ2V0U3RhY2tBZGRlbmR1bUJ5SUQ6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PSIiO2U7KXQrPUUoZSksZT1TLmdldFBhcmVudElEKGUpO3JldHVybiB0fSxnZXRDaGlsZElEczpmdW5jdGlvbihlKXt2YXIgdD1vKGUpO3JldHVybiB0P3QuY2hpbGRJRHM6W119LGdldERpc3BsYXlOYW1lOmZ1bmN0aW9uKGUpe3ZhciB0PVMuZ2V0RWxlbWVudChlKTtyZXR1cm4gdD94KHQpOm51bGx9LGdldEVsZW1lbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9byhlKTtyZXR1cm4gdD90LmVsZW1lbnQ6bnVsbH0sZ2V0T3duZXJJRDpmdW5jdGlvbihlKXt2YXIgdD1TLmdldEVsZW1lbnQoZSk7cmV0dXJuIHQmJnQuX293bmVyP3QuX293bmVyLl9kZWJ1Z0lEOm51bGx9LGdldFBhcmVudElEOmZ1bmN0aW9uKGUpe3ZhciB0PW8oZSk7cmV0dXJuIHQ/dC5wYXJlbnRJRDpudWxsfSxnZXRTb3VyY2U6ZnVuY3Rpb24oZSl7dmFyIHQ9byhlKSxuPXQ/dC5lbGVtZW50Om51bGw7cmV0dXJuIG51bGwhPW4/bi5fc291cmNlOm51bGx9LGdldFRleHQ6ZnVuY3Rpb24oZSl7dmFyIHQ9Uy5nZXRFbGVtZW50KGUpO3JldHVybiJzdHJpbmciPT10eXBlb2YgdD90OiJudW1iZXIiPT10eXBlb2YgdD8iIit0Om51bGx9LGdldFVwZGF0ZUNvdW50OmZ1bmN0aW9uKGUpe3ZhciB0PW8oZSk7cmV0dXJuIHQ/dC51cGRhdGVDb3VudDowfSxnZXRSb290SURzOmMsZ2V0UmVnaXN0ZXJlZElEczppLHB1c2hOb25TdGFuZGFyZFdhcm5pbmdTdGFjazpmdW5jdGlvbihlLHQpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBjb25zb2xlLnJlYWN0U3RhY2spe3ZhciBuPVtdLHI9cC5jdXJyZW50LG89ciYmci5fZGVidWdJRDt0cnl7Zm9yKGUmJm4ucHVzaCh7bmFtZTpvP1MuZ2V0RGlzcGxheU5hbWUobyk6bnVsbCxmaWxlTmFtZTp0P3QuZmlsZU5hbWU6bnVsbCxsaW5lTnVtYmVyOnQ/dC5saW5lTnVtYmVyOm51bGx9KTtvOyl7dmFyIGE9Uy5nZXRFbGVtZW50KG8pLGk9Uy5nZXRQYXJlbnRJRChvKSxzPVMuZ2V0T3duZXJJRChvKSx1PXM/Uy5nZXREaXNwbGF5TmFtZShzKTpudWxsLGM9YSYmYS5fc291cmNlO24ucHVzaCh7bmFtZTp1LGZpbGVOYW1lOmM/Yy5maWxlTmFtZTpudWxsLGxpbmVOdW1iZXI6Yz9jLmxpbmVOdW1iZXI6bnVsbH0pLG89aX19Y2F0Y2goZSl7fWNvbnNvbGUucmVhY3RTdGFjayhuKX19LHBvcE5vblN0YW5kYXJkV2FybmluZ1N0YWNrOmZ1bmN0aW9uKCl7ImZ1bmN0aW9uIj09dHlwZW9mIGNvbnNvbGUucmVhY3RTdGFja0VuZCYmY29uc29sZS5yZWFjdFN0YWNrRW5kKCl9fTtlLmV4cG9ydHM9U30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDc4KSxvPXtsaXN0ZW46ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLmFkZEV2ZW50TGlzdGVuZXI/KGUuYWRkRXZlbnRMaXN0ZW5lcih0LG4sITEpLHtyZW1vdmU6ZnVuY3Rpb24oKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuLCExKX19KTplLmF0dGFjaEV2ZW50PyhlLmF0dGFjaEV2ZW50KCJvbiIrdCxuKSx7cmVtb3ZlOmZ1bmN0aW9uKCl7ZS5kZXRhY2hFdmVudCgib24iK3Qsbil9fSk6dm9pZCAwfSxjYXB0dXJlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZS5hZGRFdmVudExpc3RlbmVyPyhlLmFkZEV2ZW50TGlzdGVuZXIodCxuLCEwKSx7cmVtb3ZlOmZ1bmN0aW9uKCl7ZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbiwhMCl9fSk6e3JlbW92ZTpyfX0scmVnaXN0ZXJEZWZhdWx0OmZ1bmN0aW9uKCl7fX07ZS5leHBvcnRzPW99LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9big5NjUpLG89big5NjcpLGE9big0NzIpLGk9big0ODQpO3ZhciBzPXtoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXM6ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiB0JiYoImlucHV0Ij09PXQmJiJ0ZXh0Ij09PWUudHlwZXx8InRleHRhcmVhIj09PXR8fCJ0cnVlIj09PWUuY29udGVudEVkaXRhYmxlKX0sZ2V0U2VsZWN0aW9uSW5mb3JtYXRpb246ZnVuY3Rpb24oKXt2YXIgZT1pKCk7cmV0dXJue2ZvY3VzZWRFbGVtOmUsc2VsZWN0aW9uUmFuZ2U6cy5oYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMoZSk/cy5nZXRTZWxlY3Rpb24oZSk6bnVsbH19LHJlc3RvcmVTZWxlY3Rpb246ZnVuY3Rpb24oZSl7dmFyIHQsbj1pKCkscj1lLmZvY3VzZWRFbGVtLHU9ZS5zZWxlY3Rpb25SYW5nZTtuIT09ciYmKHQ9cixvKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCx0KSkmJihzLmhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhyKSYmcy5zZXRTZWxlY3Rpb24ocix1KSxhKHIpKX0sZ2V0U2VsZWN0aW9uOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKCJzZWxlY3Rpb25TdGFydCJpbiBlKXQ9e3N0YXJ0OmUuc2VsZWN0aW9uU3RhcnQsZW5kOmUuc2VsZWN0aW9uRW5kfTtlbHNlIGlmKGRvY3VtZW50LnNlbGVjdGlvbiYmZS5ub2RlTmFtZSYmImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7dmFyIG49ZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7bi5wYXJlbnRFbGVtZW50KCk9PT1lJiYodD17c3RhcnQ6LW4ubW92ZVN0YXJ0KCJjaGFyYWN0ZXIiLC1lLnZhbHVlLmxlbmd0aCksZW5kOi1uLm1vdmVFbmQoImNoYXJhY3RlciIsLWUudmFsdWUubGVuZ3RoKX0pfWVsc2UgdD1yLmdldE9mZnNldHMoZSk7cmV0dXJuIHR8fHtzdGFydDowLGVuZDowfX0sc2V0U2VsZWN0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5zdGFydCxvPXQuZW5kO2lmKHZvaWQgMD09PW8mJihvPW4pLCJzZWxlY3Rpb25TdGFydCJpbiBlKWUuc2VsZWN0aW9uU3RhcnQ9bixlLnNlbGVjdGlvbkVuZD1NYXRoLm1pbihvLGUudmFsdWUubGVuZ3RoKTtlbHNlIGlmKGRvY3VtZW50LnNlbGVjdGlvbiYmZS5ub2RlTmFtZSYmImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7dmFyIGE9ZS5jcmVhdGVUZXh0UmFuZ2UoKTthLmNvbGxhcHNlKCEwKSxhLm1vdmVTdGFydCgiY2hhcmFjdGVyIixuKSxhLm1vdmVFbmQoImNoYXJhY3RlciIsby1uKSxhLnNlbGVjdCgpfWVsc2Ugci5zZXRPZmZzZXRzKGUsdCl9fTtlLmV4cG9ydHM9c30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09KGU9ZXx8KCJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQ/ZG9jdW1lbnQ6dm9pZCAwKSkpcmV0dXJuIG51bGw7dHJ5e3JldHVybiBlLmFjdGl2ZUVsZW1lbnR8fGUuYm9keX1jYXRjaCh0KXtyZXR1cm4gZS5ib2R5fX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigzMCksbz1uKDE0NCksYT1uKDE0MiksaT1uKDEzMykscz1uKDIwNyksdT0obig4Nyksbig0NSkpLGM9big5ODIpLGw9big5ODMpLHA9big0NjcpLGY9bigxNjkpLGg9KG4oNzIpLG4oOTg0KSksZD1uKDE0MyksbT1uKDI3NCksdj1uKDc5KSxnPW4oMjM5KSx5PW4oNDc2KSxiPShuKDI1KSxuKDIwNSkpLF89bigyNzIpLHc9KG4oMzQpLGEuSURfQVRUUklCVVRFX05BTUUpLHg9YS5ST09UX0FUVFJJQlVURV9OQU1FLEU9e307ZnVuY3Rpb24gUyhlKXtyZXR1cm4gZT85PT09ZS5ub2RlVHlwZT9lLmRvY3VtZW50RWxlbWVudDplLmZpcnN0Q2hpbGQ6bnVsbH1mdW5jdGlvbiBDKGUsdCxuLHIsbyl7dmFyIGE7aWYocC5sb2dUb3BMZXZlbFJlbmRlcnMpe3ZhciBpPWUuX2N1cnJlbnRFbGVtZW50LnByb3BzLmNoaWxkLnR5cGU7YT0iUmVhY3QgbW91bnQ6ICIrKCJzdHJpbmciPT10eXBlb2YgaT9pOmkuZGlzcGxheU5hbWV8fGkubmFtZSksY29uc29sZS50aW1lKGEpfXZhciBzPWQubW91bnRDb21wb25lbnQoZSxuLG51bGwsYyhlLHQpLG8sMCk7YSYmY29uc29sZS50aW1lRW5kKGEpLGUuX3JlbmRlcmVkQ29tcG9uZW50Ll90b3BMZXZlbFdyYXBwZXI9ZSxOLl9tb3VudEltYWdlSW50b05vZGUocyx0LGUscixuKX1mdW5jdGlvbiBBKGUsdCxuLHIpe3ZhciBvPXYuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbi5nZXRQb29sZWQoIW4mJmwudXNlQ3JlYXRlRWxlbWVudCk7by5wZXJmb3JtKEMsbnVsbCxlLHQsbyxuLHIpLHYuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbi5yZWxlYXNlKG8pfWZ1bmN0aW9uIE8oZSx0LG4pe2ZvcigwLGQudW5tb3VudENvbXBvbmVudChlLG4pLDk9PT10Lm5vZGVUeXBlJiYodD10LmRvY3VtZW50RWxlbWVudCk7dC5sYXN0Q2hpbGQ7KXQucmVtb3ZlQ2hpbGQodC5sYXN0Q2hpbGQpfWZ1bmN0aW9uIGsoZSl7dmFyIHQ9UyhlKTtpZih0KXt2YXIgbj11LmdldEluc3RhbmNlRnJvbU5vZGUodCk7cmV0dXJuISghbnx8IW4uX2hvc3RQYXJlbnQpfX1mdW5jdGlvbiBqKGUpe3JldHVybiEoIWV8fDEhPT1lLm5vZGVUeXBlJiY5IT09ZS5ub2RlVHlwZSYmMTEhPT1lLm5vZGVUeXBlKX1mdW5jdGlvbiBUKGUpe3ZhciB0PWZ1bmN0aW9uKGUpe3ZhciB0PVMoZSksbj10JiZ1LmdldEluc3RhbmNlRnJvbU5vZGUodCk7cmV0dXJuIG4mJiFuLl9ob3N0UGFyZW50P246bnVsbH0oZSk7cmV0dXJuIHQ/dC5faG9zdENvbnRhaW5lckluZm8uX3RvcExldmVsV3JhcHBlcjpudWxsfXZhciBJPTEsUD1mdW5jdGlvbigpe3RoaXMucm9vdElEPUkrK307UC5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudD17fSxQLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcm9wcy5jaGlsZH0sUC5pc1JlYWN0VG9wTGV2ZWxXcmFwcGVyPSEwO3ZhciBOPXtUb3BMZXZlbFdyYXBwZXI6UCxfaW5zdGFuY2VzQnlSZWFjdFJvb3RJRDpFLHNjcm9sbE1vbml0b3I6ZnVuY3Rpb24oZSx0KXt0KCl9LF91cGRhdGVSb290Q29tcG9uZW50OmZ1bmN0aW9uKGUsdCxuLHIsbyl7cmV0dXJuIE4uc2Nyb2xsTW9uaXRvcihyLChmdW5jdGlvbigpe20uZW5xdWV1ZUVsZW1lbnRJbnRlcm5hbChlLHQsbiksbyYmbS5lbnF1ZXVlQ2FsbGJhY2tJbnRlcm5hbChlLG8pfSkpLGV9LF9yZW5kZXJOZXdSb290Q29tcG9uZW50OmZ1bmN0aW9uKGUsdCxuLG8pe2oodCl8fHIoIjM3Iikscy5lbnN1cmVTY3JvbGxWYWx1ZU1vbml0b3JpbmcoKTt2YXIgYT15KGUsITEpO3YuYmF0Y2hlZFVwZGF0ZXMoQSxhLHQsbixvKTt2YXIgaT1hLl9pbnN0YW5jZS5yb290SUQ7cmV0dXJuIEVbaV09YSxhfSxyZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcjpmdW5jdGlvbihlLHQsbixvKXtyZXR1cm4gbnVsbCE9ZSYmZi5oYXMoZSl8fHIoIjM4IiksTi5fcmVuZGVyU3VidHJlZUludG9Db250YWluZXIoZSx0LG4sbyl9LF9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcjpmdW5jdGlvbihlLHQsbixvKXttLnZhbGlkYXRlQ2FsbGJhY2sobywiUmVhY3RET00ucmVuZGVyIiksaS5pc1ZhbGlkRWxlbWVudCh0KXx8cigiMzkiLCJzdHJpbmciPT10eXBlb2YgdD8iIEluc3RlYWQgb2YgcGFzc2luZyBhIHN0cmluZyBsaWtlICdkaXYnLCBwYXNzIFJlYWN0LmNyZWF0ZUVsZW1lbnQoJ2RpdicpIG9yIDxkaXYgLz4uIjoiZnVuY3Rpb24iPT10eXBlb2YgdD8iIEluc3RlYWQgb2YgcGFzc2luZyBhIGNsYXNzIGxpa2UgRm9vLCBwYXNzIFJlYWN0LmNyZWF0ZUVsZW1lbnQoRm9vKSBvciA8Rm9vIC8+LiI6bnVsbCE9dCYmdm9pZCAwIT09dC5wcm9wcz8iIFRoaXMgbWF5IGJlIGNhdXNlZCBieSB1bmludGVudGlvbmFsbHkgbG9hZGluZyB0d28gaW5kZXBlbmRlbnQgY29waWVzIG9mIFJlYWN0LiI6IiIpO3ZhciBhLHM9aS5jcmVhdGVFbGVtZW50KFAse2NoaWxkOnR9KTtpZihlKXt2YXIgdT1mLmdldChlKTthPXUuX3Byb2Nlc3NDaGlsZENvbnRleHQodS5fY29udGV4dCl9ZWxzZSBhPWc7dmFyIGM9VChuKTtpZihjKXt2YXIgbD1jLl9jdXJyZW50RWxlbWVudC5wcm9wcy5jaGlsZDtpZihfKGwsdCkpe3ZhciBwPWMuX3JlbmRlcmVkQ29tcG9uZW50LmdldFB1YmxpY0luc3RhbmNlKCksaD1vJiZmdW5jdGlvbigpe28uY2FsbChwKX07cmV0dXJuIE4uX3VwZGF0ZVJvb3RDb21wb25lbnQoYyxzLGEsbixoKSxwfU4udW5tb3VudENvbXBvbmVudEF0Tm9kZShuKX12YXIgZCx2PVMobikseT12JiYhKCEoZD12KS5nZXRBdHRyaWJ1dGV8fCFkLmdldEF0dHJpYnV0ZSh3KSksYj1rKG4pLHg9eSYmIWMmJiFiLEU9Ti5fcmVuZGVyTmV3Um9vdENvbXBvbmVudChzLG4seCxhKS5fcmVuZGVyZWRDb21wb25lbnQuZ2V0UHVibGljSW5zdGFuY2UoKTtyZXR1cm4gbyYmby5jYWxsKEUpLEV9LHJlbmRlcjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIE4uX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKG51bGwsZSx0LG4pfSx1bm1vdW50Q29tcG9uZW50QXROb2RlOmZ1bmN0aW9uKGUpe2ooZSl8fHIoIjQwIik7dmFyIHQ9VChlKTtpZighdCl7ayhlKSwxPT09ZS5ub2RlVHlwZSYmZS5oYXNBdHRyaWJ1dGUoeCk7cmV0dXJuITF9cmV0dXJuIGRlbGV0ZSBFW3QuX2luc3RhbmNlLnJvb3RJRF0sdi5iYXRjaGVkVXBkYXRlcyhPLHQsZSwhMSksITB9LF9tb3VudEltYWdlSW50b05vZGU6ZnVuY3Rpb24oZSx0LG4sYSxpKXtpZihqKHQpfHxyKCI0MSIpLGEpe3ZhciBzPVModCk7aWYoaC5jYW5SZXVzZU1hcmt1cChlLHMpKXJldHVybiB2b2lkIHUucHJlY2FjaGVOb2RlKG4scyk7dmFyIGM9cy5nZXRBdHRyaWJ1dGUoaC5DSEVDS1NVTV9BVFRSX05BTUUpO3MucmVtb3ZlQXR0cmlidXRlKGguQ0hFQ0tTVU1fQVRUUl9OQU1FKTt2YXIgbD1zLm91dGVySFRNTDtzLnNldEF0dHJpYnV0ZShoLkNIRUNLU1VNX0FUVFJfTkFNRSxjKTt2YXIgcD1lLGY9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49TWF0aC5taW4oZS5sZW5ndGgsdC5sZW5ndGgpLHI9MDtyPG47cisrKWlmKGUuY2hhckF0KHIpIT09dC5jaGFyQXQocikpcmV0dXJuIHI7cmV0dXJuIGUubGVuZ3RoPT09dC5sZW5ndGg/LTE6bn0ocCxsKSxkPSIgKGNsaWVudCkgIitwLnN1YnN0cmluZyhmLTIwLGYrMjApKyJcbiAoc2VydmVyKSAiK2wuc3Vic3RyaW5nKGYtMjAsZisyMCk7OT09PXQubm9kZVR5cGUmJnIoIjQyIixkKX1pZig5PT09dC5ub2RlVHlwZSYmcigiNDMiKSxpLnVzZUNyZWF0ZUVsZW1lbnQpe2Zvcig7dC5sYXN0Q2hpbGQ7KXQucmVtb3ZlQ2hpbGQodC5sYXN0Q2hpbGQpO28uaW5zZXJ0VHJlZUJlZm9yZSh0LGUsbnVsbCl9ZWxzZSBiKHQsZSksdS5wcmVjYWNoZU5vZGUobix0LmZpcnN0Q2hpbGQpfX07ZS5leHBvcnRzPU59LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9big0NzcpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtmb3IodmFyIHQ7KHQ9ZS5fcmVuZGVyZWROb2RlVHlwZSk9PT1yLkNPTVBPU0lURTspZT1lLl9yZW5kZXJlZENvbXBvbmVudDtyZXR1cm4gdD09PXIuSE9TVD9lLl9yZW5kZXJlZENvbXBvbmVudDp0PT09ci5FTVBUWT9udWxsOnZvaWQgMH19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dC5fX2VzTW9kdWxlPSEwO3ZhciByLG89bigxMSksYT0ocj1vKSYmci5fX2VzTW9kdWxlP3I6e2RlZmF1bHQ6cn07dC5kZWZhdWx0PWEuZGVmYXVsdC5zaGFwZSh7c3Vic2NyaWJlOmEuZGVmYXVsdC5mdW5jLmlzUmVxdWlyZWQsZGlzcGF0Y2g6YS5kZWZhdWx0LmZ1bmMuaXNSZXF1aXJlZCxnZXRTdGF0ZTphLmRlZmF1bHQuZnVuYy5pc1JlcXVpcmVkfSl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dC5fX2VzTW9kdWxlPSEwLHQuZGVmYXVsdD1mdW5jdGlvbihlKXsidW5kZWZpbmVkIiE9dHlwZW9mIGNvbnNvbGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBjb25zb2xlLmVycm9yJiZjb25zb2xlLmVycm9yKGUpO3RyeXt0aHJvdyBuZXcgRXJyb3IoZSl9Y2F0Y2goZSl7fX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDI0NCksbz1uKDk5NiksYT1uKDI1OSksaT1uKDk5Nykscz1uKDk5OCksdT1uKDEwMDEpLGM9bigxMDAyKSxsPW4oMTAwMykscD1uKDEwMDQpLGY9big0MTUpLGg9big0OTEpLGQ9bigxNjEpLG09bigxMDA1KSx2PW4oMTAwNiksZz1uKDEwMTEpLHk9big1NiksYj1uKDE5NSksXz1uKDEwMTMpLHc9big1OSkseD1uKDEwMTUpLEU9bigxMzYpLFM9bigyNzgpLEM9IltvYmplY3QgQXJndW1lbnRzXSIsQT0iW29iamVjdCBGdW5jdGlvbl0iLE89IltvYmplY3QgT2JqZWN0XSIsaz17fTtrW0NdPWtbIltvYmplY3QgQXJyYXldIl09a1siW29iamVjdCBBcnJheUJ1ZmZlcl0iXT1rWyJbb2JqZWN0IERhdGFWaWV3XSJdPWtbIltvYmplY3QgQm9vbGVhbl0iXT1rWyJbb2JqZWN0IERhdGVdIl09a1siW29iamVjdCBGbG9hdDMyQXJyYXldIl09a1siW29iamVjdCBGbG9hdDY0QXJyYXldIl09a1siW29iamVjdCBJbnQ4QXJyYXldIl09a1siW29iamVjdCBJbnQxNkFycmF5XSJdPWtbIltvYmplY3QgSW50MzJBcnJheV0iXT1rWyJbb2JqZWN0IE1hcF0iXT1rWyJbb2JqZWN0IE51bWJlcl0iXT1rW09dPWtbIltvYmplY3QgUmVnRXhwXSJdPWtbIltvYmplY3QgU2V0XSJdPWtbIltvYmplY3QgU3RyaW5nXSJdPWtbIltvYmplY3QgU3ltYm9sXSJdPWtbIltvYmplY3QgVWludDhBcnJheV0iXT1rWyJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSJdPWtbIltvYmplY3QgVWludDE2QXJyYXldIl09a1siW29iamVjdCBVaW50MzJBcnJheV0iXT0hMCxrWyJbb2JqZWN0IEVycm9yXSJdPWtbQV09a1siW29iamVjdCBXZWFrTWFwXSJdPSExLGUuZXhwb3J0cz1mdW5jdGlvbiBlKHQsbixqLFQsSSxQKXt2YXIgTixNPTEmbixSPTImbixEPTQmbjtpZihqJiYoTj1JP2oodCxULEksUCk6aih0KSksdm9pZCAwIT09TilyZXR1cm4gTjtpZighdyh0KSlyZXR1cm4gdDt2YXIgTD15KHQpO2lmKEwpe2lmKE49bSh0KSwhTSlyZXR1cm4gYyh0LE4pfWVsc2V7dmFyIEI9ZCh0KSxGPUI9PUF8fCJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXSI9PUI7aWYoYih0KSlyZXR1cm4gdSh0LE0pO2lmKEI9PU98fEI9PUN8fEYmJiFJKXtpZihOPVJ8fEY/e306Zyh0KSwhTSlyZXR1cm4gUj9wKHQscyhOLHQpKTpsKHQsaShOLHQpKX1lbHNle2lmKCFrW0JdKXJldHVybiBJP3Q6e307Tj12KHQsQixNKX19UHx8KFA9bmV3IHIpO3ZhciBVPVAuZ2V0KHQpO2lmKFUpcmV0dXJuIFU7UC5zZXQodCxOKSx4KHQpP3QuZm9yRWFjaCgoZnVuY3Rpb24ocil7Ti5hZGQoZShyLG4saixyLHQsUCkpfSkpOl8odCkmJnQuZm9yRWFjaCgoZnVuY3Rpb24ocixvKXtOLnNldChvLGUocixuLGosbyx0LFApKX0pKTt2YXIgcT1MP3ZvaWQgMDooRD9SP2g6ZjpSP1M6RSkodCk7cmV0dXJuIG8ocXx8dCwoZnVuY3Rpb24ocixvKXtxJiYocj10W289cl0pLGEoTixvLGUocixuLGosbyx0LFApKX0pKSxOfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMjQ1KSxvPW4oMjc3KSxhPW4oMjQ2KSxpPW4oNDE3KSxzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM/ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdO2U7KXIodCxhKGUpKSxlPW8oZSk7cmV0dXJuIHR9Omk7ZS5leHBvcnRzPXN9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDQxNiksbz1uKDQ5MCksYT1uKDI3OCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiByKGUsYSxvKX19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7KG51bGw9PXR8fHQ+ZS5sZW5ndGgpJiYodD1lLmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkodCk7bjx0O24rKylyW25dPWVbbl07cmV0dXJuIHJ9fSxmdW5jdGlvbihlLHQpeyFmdW5jdGlvbihlKXshZnVuY3Rpb24odCl7dmFyIG49IlVSTFNlYXJjaFBhcmFtcyJpbiBlLHI9IlN5bWJvbCJpbiBlJiYiaXRlcmF0b3IiaW4gU3ltYm9sLG89IkZpbGVSZWFkZXIiaW4gZSYmIkJsb2IiaW4gZSYmZnVuY3Rpb24oKXt0cnl7cmV0dXJuIG5ldyBCbG9iLCEwfWNhdGNoKGUpe3JldHVybiExfX0oKSxhPSJGb3JtRGF0YSJpbiBlLGk9IkFycmF5QnVmZmVyImluIGU7aWYoaSl2YXIgcz1bIltvYmplY3QgSW50OEFycmF5XSIsIltvYmplY3QgVWludDhBcnJheV0iLCJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsIltvYmplY3QgSW50MTZBcnJheV0iLCJbb2JqZWN0IFVpbnQxNkFycmF5XSIsIltvYmplY3QgSW50MzJBcnJheV0iLCJbb2JqZWN0IFVpbnQzMkFycmF5XSIsIltvYmplY3QgRmxvYXQzMkFycmF5XSIsIltvYmplY3QgRmxvYXQ2NEFycmF5XSJdLHU9QXJyYXlCdWZmZXIuaXNWaWV3fHxmdW5jdGlvbihlKXtyZXR1cm4gZSYmcy5pbmRleE9mKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSk+LTF9O2Z1bmN0aW9uIGMoZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlJiYoZT1TdHJpbmcoZSkpLC9bXmEtejAtOVwtIyQlJicqKy5eX2B8fl0vaS50ZXN0KGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgY2hhcmFjdGVyIGluIGhlYWRlciBmaWVsZCBuYW1lIik7cmV0dXJuIGUudG9Mb3dlckNhc2UoKX1mdW5jdGlvbiBsKGUpe3JldHVybiJzdHJpbmciIT10eXBlb2YgZSYmKGU9U3RyaW5nKGUpKSxlfWZ1bmN0aW9uIHAoZSl7dmFyIHQ9e25leHQ6ZnVuY3Rpb24oKXt2YXIgdD1lLnNoaWZ0KCk7cmV0dXJue2RvbmU6dm9pZCAwPT09dCx2YWx1ZTp0fX19O3JldHVybiByJiYodFtTeW1ib2wuaXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHR9KSx0fWZ1bmN0aW9uIGYoZSl7dGhpcy5tYXA9e30sZSBpbnN0YW5jZW9mIGY/ZS5mb3JFYWNoKChmdW5jdGlvbihlLHQpe3RoaXMuYXBwZW5kKHQsZSl9KSx0aGlzKTpBcnJheS5pc0FycmF5KGUpP2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dGhpcy5hcHBlbmQoZVswXSxlWzFdKX0pLHRoaXMpOmUmJk9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3RoaXMuYXBwZW5kKHQsZVt0XSl9KSx0aGlzKX1mdW5jdGlvbiBoKGUpe2lmKGUuYm9keVVzZWQpcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBUeXBlRXJyb3IoIkFscmVhZHkgcmVhZCIpKTtlLmJvZHlVc2VkPSEwfWZ1bmN0aW9uIGQoZSl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbih0LG4pe2Uub25sb2FkPWZ1bmN0aW9uKCl7dChlLnJlc3VsdCl9LGUub25lcnJvcj1mdW5jdGlvbigpe24oZS5lcnJvcil9fSkpfWZ1bmN0aW9uIG0oZSl7dmFyIHQ9bmV3IEZpbGVSZWFkZXIsbj1kKHQpO3JldHVybiB0LnJlYWRBc0FycmF5QnVmZmVyKGUpLG59ZnVuY3Rpb24gdihlKXtpZihlLnNsaWNlKXJldHVybiBlLnNsaWNlKDApO3ZhciB0PW5ldyBVaW50OEFycmF5KGUuYnl0ZUxlbmd0aCk7cmV0dXJuIHQuc2V0KG5ldyBVaW50OEFycmF5KGUpKSx0LmJ1ZmZlcn1mdW5jdGlvbiBnKCl7cmV0dXJuIHRoaXMuYm9keVVzZWQ9ITEsdGhpcy5faW5pdEJvZHk9ZnVuY3Rpb24oZSl7dmFyIHQ7dGhpcy5fYm9keUluaXQ9ZSxlPyJzdHJpbmciPT10eXBlb2YgZT90aGlzLl9ib2R5VGV4dD1lOm8mJkJsb2IucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoZSk/dGhpcy5fYm9keUJsb2I9ZTphJiZGb3JtRGF0YS5wcm90b3R5cGUuaXNQcm90b3R5cGVPZihlKT90aGlzLl9ib2R5Rm9ybURhdGE9ZTpuJiZVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoZSk/dGhpcy5fYm9keVRleHQ9ZS50b1N0cmluZygpOmkmJm8mJigodD1lKSYmRGF0YVZpZXcucHJvdG90eXBlLmlzUHJvdG90eXBlT2YodCkpPyh0aGlzLl9ib2R5QXJyYXlCdWZmZXI9dihlLmJ1ZmZlciksdGhpcy5fYm9keUluaXQ9bmV3IEJsb2IoW3RoaXMuX2JvZHlBcnJheUJ1ZmZlcl0pKTppJiYoQXJyYXlCdWZmZXIucHJvdG90eXBlLmlzUHJvdG90eXBlT2YoZSl8fHUoZSkpP3RoaXMuX2JvZHlBcnJheUJ1ZmZlcj12KGUpOnRoaXMuX2JvZHlUZXh0PWU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpOnRoaXMuX2JvZHlUZXh0PSIiLHRoaXMuaGVhZGVycy5nZXQoImNvbnRlbnQtdHlwZSIpfHwoInN0cmluZyI9PXR5cGVvZiBlP3RoaXMuaGVhZGVycy5zZXQoImNvbnRlbnQtdHlwZSIsInRleHQvcGxhaW47Y2hhcnNldD1VVEYtOCIpOnRoaXMuX2JvZHlCbG9iJiZ0aGlzLl9ib2R5QmxvYi50eXBlP3RoaXMuaGVhZGVycy5zZXQoImNvbnRlbnQtdHlwZSIsdGhpcy5fYm9keUJsb2IudHlwZSk6biYmVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS5pc1Byb3RvdHlwZU9mKGUpJiZ0aGlzLmhlYWRlcnMuc2V0KCJjb250ZW50LXR5cGUiLCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCIpKX0sbyYmKHRoaXMuYmxvYj1mdW5jdGlvbigpe3ZhciBlPWgodGhpcyk7aWYoZSlyZXR1cm4gZTtpZih0aGlzLl9ib2R5QmxvYilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2JvZHlCbG9iKTtpZih0aGlzLl9ib2R5QXJyYXlCdWZmZXIpcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgQmxvYihbdGhpcy5fYm9keUFycmF5QnVmZmVyXSkpO2lmKHRoaXMuX2JvZHlGb3JtRGF0YSl0aHJvdyBuZXcgRXJyb3IoImNvdWxkIG5vdCByZWFkIEZvcm1EYXRhIGJvZHkgYXMgYmxvYiIpO3JldHVybiBQcm9taXNlLnJlc29sdmUobmV3IEJsb2IoW3RoaXMuX2JvZHlUZXh0XSkpfSx0aGlzLmFycmF5QnVmZmVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JvZHlBcnJheUJ1ZmZlcj9oKHRoaXMpfHxQcm9taXNlLnJlc29sdmUodGhpcy5fYm9keUFycmF5QnVmZmVyKTp0aGlzLmJsb2IoKS50aGVuKG0pfSksdGhpcy50ZXh0PWZ1bmN0aW9uKCl7dmFyIGUsdCxuLHI9aCh0aGlzKTtpZihyKXJldHVybiByO2lmKHRoaXMuX2JvZHlCbG9iKXJldHVybiBlPXRoaXMuX2JvZHlCbG9iLHQ9bmV3IEZpbGVSZWFkZXIsbj1kKHQpLHQucmVhZEFzVGV4dChlKSxuO2lmKHRoaXMuX2JvZHlBcnJheUJ1ZmZlcilyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1uZXcgVWludDhBcnJheShlKSxuPW5ldyBBcnJheSh0Lmxlbmd0aCkscj0wO3I8dC5sZW5ndGg7cisrKW5bcl09U3RyaW5nLmZyb21DaGFyQ29kZSh0W3JdKTtyZXR1cm4gbi5qb2luKCIiKX0odGhpcy5fYm9keUFycmF5QnVmZmVyKSk7aWYodGhpcy5fYm9keUZvcm1EYXRhKXRocm93IG5ldyBFcnJvcigiY291bGQgbm90IHJlYWQgRm9ybURhdGEgYm9keSBhcyB0ZXh0Iik7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9ib2R5VGV4dCl9LGEmJih0aGlzLmZvcm1EYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGV4dCgpLnRoZW4oXyl9KSx0aGlzLmpzb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50ZXh0KCkudGhlbihKU09OLnBhcnNlKX0sdGhpc31mLnByb3RvdHlwZS5hcHBlbmQ9ZnVuY3Rpb24oZSx0KXtlPWMoZSksdD1sKHQpO3ZhciBuPXRoaXMubWFwW2VdO3RoaXMubWFwW2VdPW4/bisiLCAiK3Q6dH0sZi5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKGUpe2RlbGV0ZSB0aGlzLm1hcFtjKGUpXX0sZi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGUpe3JldHVybiBlPWMoZSksdGhpcy5oYXMoZSk/dGhpcy5tYXBbZV06bnVsbH0sZi5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eShjKGUpKX0sZi5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKGUsdCl7dGhpcy5tYXBbYyhlKV09bCh0KX0sZi5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0aGlzLm1hcCl0aGlzLm1hcC5oYXNPd25Qcm9wZXJ0eShuKSYmZS5jYWxsKHQsdGhpcy5tYXBbbl0sbix0aGlzKX0sZi5wcm90b3R5cGUua2V5cz1mdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybiB0aGlzLmZvckVhY2goKGZ1bmN0aW9uKHQsbil7ZS5wdXNoKG4pfSkpLHAoZSl9LGYucHJvdG90eXBlLnZhbHVlcz1mdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybiB0aGlzLmZvckVhY2goKGZ1bmN0aW9uKHQpe2UucHVzaCh0KX0pKSxwKGUpfSxmLnByb3RvdHlwZS5lbnRyaWVzPWZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuIHRoaXMuZm9yRWFjaCgoZnVuY3Rpb24odCxuKXtlLnB1c2goW24sdF0pfSkpLHAoZSl9LHImJihmLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdPWYucHJvdG90eXBlLmVudHJpZXMpO3ZhciB5PVsiREVMRVRFIiwiR0VUIiwiSEVBRCIsIk9QVElPTlMiLCJQT1NUIiwiUFVUIl07ZnVuY3Rpb24gYihlLHQpe3ZhciBuLHIsbz0odD10fHx7fSkuYm9keTtpZihlIGluc3RhbmNlb2YgYil7aWYoZS5ib2R5VXNlZCl0aHJvdyBuZXcgVHlwZUVycm9yKCJBbHJlYWR5IHJlYWQiKTt0aGlzLnVybD1lLnVybCx0aGlzLmNyZWRlbnRpYWxzPWUuY3JlZGVudGlhbHMsdC5oZWFkZXJzfHwodGhpcy5oZWFkZXJzPW5ldyBmKGUuaGVhZGVycykpLHRoaXMubWV0aG9kPWUubWV0aG9kLHRoaXMubW9kZT1lLm1vZGUsdGhpcy5zaWduYWw9ZS5zaWduYWwsb3x8bnVsbD09ZS5fYm9keUluaXR8fChvPWUuX2JvZHlJbml0LGUuYm9keVVzZWQ9ITApfWVsc2UgdGhpcy51cmw9U3RyaW5nKGUpO2lmKHRoaXMuY3JlZGVudGlhbHM9dC5jcmVkZW50aWFsc3x8dGhpcy5jcmVkZW50aWFsc3x8InNhbWUtb3JpZ2luIiwhdC5oZWFkZXJzJiZ0aGlzLmhlYWRlcnN8fCh0aGlzLmhlYWRlcnM9bmV3IGYodC5oZWFkZXJzKSksdGhpcy5tZXRob2Q9KG49dC5tZXRob2R8fHRoaXMubWV0aG9kfHwiR0VUIixyPW4udG9VcHBlckNhc2UoKSx5LmluZGV4T2Yocik+LTE/cjpuKSx0aGlzLm1vZGU9dC5tb2RlfHx0aGlzLm1vZGV8fG51bGwsdGhpcy5zaWduYWw9dC5zaWduYWx8fHRoaXMuc2lnbmFsLHRoaXMucmVmZXJyZXI9bnVsbCwoIkdFVCI9PT10aGlzLm1ldGhvZHx8IkhFQUQiPT09dGhpcy5tZXRob2QpJiZvKXRocm93IG5ldyBUeXBlRXJyb3IoIkJvZHkgbm90IGFsbG93ZWQgZm9yIEdFVCBvciBIRUFEIHJlcXVlc3RzIik7dGhpcy5faW5pdEJvZHkobyl9ZnVuY3Rpb24gXyhlKXt2YXIgdD1uZXcgRm9ybURhdGE7cmV0dXJuIGUudHJpbSgpLnNwbGl0KCImIikuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYoZSl7dmFyIG49ZS5zcGxpdCgiPSIpLHI9bi5zaGlmdCgpLnJlcGxhY2UoL1wrL2csIiAiKSxvPW4uam9pbigiPSIpLnJlcGxhY2UoL1wrL2csIiAiKTt0LmFwcGVuZChkZWNvZGVVUklDb21wb25lbnQociksZGVjb2RlVVJJQ29tcG9uZW50KG8pKX19KSksdH1mdW5jdGlvbiB3KGUsdCl7dHx8KHQ9e30pLHRoaXMudHlwZT0iZGVmYXVsdCIsdGhpcy5zdGF0dXM9dm9pZCAwPT09dC5zdGF0dXM/MjAwOnQuc3RhdHVzLHRoaXMub2s9dGhpcy5zdGF0dXM+PTIwMCYmdGhpcy5zdGF0dXM8MzAwLHRoaXMuc3RhdHVzVGV4dD0ic3RhdHVzVGV4dCJpbiB0P3Quc3RhdHVzVGV4dDoiT0siLHRoaXMuaGVhZGVycz1uZXcgZih0LmhlYWRlcnMpLHRoaXMudXJsPXQudXJsfHwiIix0aGlzLl9pbml0Qm9keShlKX1iLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBuZXcgYih0aGlzLHtib2R5OnRoaXMuX2JvZHlJbml0fSl9LGcuY2FsbChiLnByb3RvdHlwZSksZy5jYWxsKHcucHJvdG90eXBlKSx3LnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBuZXcgdyh0aGlzLl9ib2R5SW5pdCx7c3RhdHVzOnRoaXMuc3RhdHVzLHN0YXR1c1RleHQ6dGhpcy5zdGF0dXNUZXh0LGhlYWRlcnM6bmV3IGYodGhpcy5oZWFkZXJzKSx1cmw6dGhpcy51cmx9KX0sdy5lcnJvcj1mdW5jdGlvbigpe3ZhciBlPW5ldyB3KG51bGwse3N0YXR1czowLHN0YXR1c1RleHQ6IiJ9KTtyZXR1cm4gZS50eXBlPSJlcnJvciIsZX07dmFyIHg9WzMwMSwzMDIsMzAzLDMwNywzMDhdO3cucmVkaXJlY3Q9ZnVuY3Rpb24oZSx0KXtpZigtMT09PXguaW5kZXhPZih0KSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCBzdGF0dXMgY29kZSIpO3JldHVybiBuZXcgdyhudWxsLHtzdGF0dXM6dCxoZWFkZXJzOntsb2NhdGlvbjplfX0pfSx0LkRPTUV4Y2VwdGlvbj1lLkRPTUV4Y2VwdGlvbjt0cnl7bmV3IHQuRE9NRXhjZXB0aW9ufWNhdGNoKGUpe3QuRE9NRXhjZXB0aW9uPWZ1bmN0aW9uKGUsdCl7dGhpcy5tZXNzYWdlPWUsdGhpcy5uYW1lPXQ7dmFyIG49RXJyb3IoZSk7dGhpcy5zdGFjaz1uLnN0YWNrfSx0LkRPTUV4Y2VwdGlvbi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUpLHQuRE9NRXhjZXB0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10LkRPTUV4Y2VwdGlvbn1mdW5jdGlvbiBFKGUsbil7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLGEpe3ZhciBpPW5ldyBiKGUsbik7aWYoaS5zaWduYWwmJmkuc2lnbmFsLmFib3J0ZWQpcmV0dXJuIGEobmV3IHQuRE9NRXhjZXB0aW9uKCJBYm9ydGVkIiwiQWJvcnRFcnJvciIpKTt2YXIgcz1uZXcgWE1MSHR0cFJlcXVlc3Q7ZnVuY3Rpb24gdSgpe3MuYWJvcnQoKX1zLm9ubG9hZD1mdW5jdGlvbigpe3ZhciBlLHQsbj17c3RhdHVzOnMuc3RhdHVzLHN0YXR1c1RleHQ6cy5zdGF0dXNUZXh0LGhlYWRlcnM6KGU9cy5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKXx8IiIsdD1uZXcgZixlLnJlcGxhY2UoL1xyP1xuW1x0IF0rL2csIiAiKS5zcGxpdCgvXHI/XG4vKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1lLnNwbGl0KCI6Iikscj1uLnNoaWZ0KCkudHJpbSgpO2lmKHIpe3ZhciBvPW4uam9pbigiOiIpLnRyaW0oKTt0LmFwcGVuZChyLG8pfX0pKSx0KX07bi51cmw9InJlc3BvbnNlVVJMImluIHM/cy5yZXNwb25zZVVSTDpuLmhlYWRlcnMuZ2V0KCJYLVJlcXVlc3QtVVJMIik7dmFyIG89InJlc3BvbnNlImluIHM/cy5yZXNwb25zZTpzLnJlc3BvbnNlVGV4dDtyKG5ldyB3KG8sbikpfSxzLm9uZXJyb3I9ZnVuY3Rpb24oKXthKG5ldyBUeXBlRXJyb3IoIk5ldHdvcmsgcmVxdWVzdCBmYWlsZWQiKSl9LHMub250aW1lb3V0PWZ1bmN0aW9uKCl7YShuZXcgVHlwZUVycm9yKCJOZXR3b3JrIHJlcXVlc3QgZmFpbGVkIikpfSxzLm9uYWJvcnQ9ZnVuY3Rpb24oKXthKG5ldyB0LkRPTUV4Y2VwdGlvbigiQWJvcnRlZCIsIkFib3J0RXJyb3IiKSl9LHMub3BlbihpLm1ldGhvZCxpLnVybCwhMCksImluY2x1ZGUiPT09aS5jcmVkZW50aWFscz9zLndpdGhDcmVkZW50aWFscz0hMDoib21pdCI9PT1pLmNyZWRlbnRpYWxzJiYocy53aXRoQ3JlZGVudGlhbHM9ITEpLCJyZXNwb25zZVR5cGUiaW4gcyYmbyYmKHMucmVzcG9uc2VUeXBlPSJibG9iIiksaS5oZWFkZXJzLmZvckVhY2goKGZ1bmN0aW9uKGUsdCl7cy5zZXRSZXF1ZXN0SGVhZGVyKHQsZSl9KSksaS5zaWduYWwmJihpLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsdSkscy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXs0PT09cy5yZWFkeVN0YXRlJiZpLnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsdSl9KSxzLnNlbmQodm9pZCAwPT09aS5fYm9keUluaXQ/bnVsbDppLl9ib2R5SW5pdCl9KSl9RS5wb2x5ZmlsbD0hMCxlLmZldGNofHwoZS5mZXRjaD1FLGUuSGVhZGVycz1mLGUuUmVxdWVzdD1iLGUuUmVzcG9uc2U9dyksdC5IZWFkZXJzPWYsdC5SZXF1ZXN0PWIsdC5SZXNwb25zZT13LHQuZmV0Y2g9RSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9KHt9KX0oInVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6dGhpcyl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyODIpLG89T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxhPUFycmF5LmlzQXJyYXksaT1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PTA7dDwyNTY7Kyt0KWUucHVzaCgiJSIrKCh0PDE2PyIwIjoiIikrdC50b1N0cmluZygxNikpLnRvVXBwZXJDYXNlKCkpO3JldHVybiBlfSgpLHM9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49dCYmdC5wbGFpbk9iamVjdHM/T2JqZWN0LmNyZWF0ZShudWxsKTp7fSxyPTA7cjxlLmxlbmd0aDsrK3Ipdm9pZCAwIT09ZVtyXSYmKG5bcl09ZVtyXSk7cmV0dXJuIG59O2UuZXhwb3J0cz17YXJyYXlUb09iamVjdDpzLGFzc2lnbjpmdW5jdGlvbihlLHQpe3JldHVybiBPYmplY3Qua2V5cyh0KS5yZWR1Y2UoKGZ1bmN0aW9uKGUsbil7cmV0dXJuIGVbbl09dFtuXSxlfSksZSl9LGNvbWJpbmU6ZnVuY3Rpb24oZSx0KXtyZXR1cm5bXS5jb25jYXQoZSx0KX0sY29tcGFjdDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9W3tvYmo6e286ZX0scHJvcDoibyJ9XSxuPVtdLHI9MDtyPHQubGVuZ3RoOysrcilmb3IodmFyIG89dFtyXSxpPW8ub2JqW28ucHJvcF0scz1PYmplY3Qua2V5cyhpKSx1PTA7dTxzLmxlbmd0aDsrK3Upe3ZhciBjPXNbdV0sbD1pW2NdOyJvYmplY3QiPT10eXBlb2YgbCYmbnVsbCE9PWwmJi0xPT09bi5pbmRleE9mKGwpJiYodC5wdXNoKHtvYmo6aSxwcm9wOmN9KSxuLnB1c2gobCkpfXJldHVybiBmdW5jdGlvbihlKXtmb3IoO2UubGVuZ3RoPjE7KXt2YXIgdD1lLnBvcCgpLG49dC5vYmpbdC5wcm9wXTtpZihhKG4pKXtmb3IodmFyIHI9W10sbz0wO288bi5sZW5ndGg7KytvKXZvaWQgMCE9PW5bb10mJnIucHVzaChuW29dKTt0Lm9ialt0LnByb3BdPXJ9fX0odCksZX0sZGVjb2RlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLnJlcGxhY2UoL1wrL2csIiAiKTtpZigiaXNvLTg4NTktMSI9PT1uKXJldHVybiByLnJlcGxhY2UoLyVbMC05YS1mXXsyfS9naSx1bmVzY2FwZSk7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQocil9Y2F0Y2goZSl7cmV0dXJuIHJ9fSxlbmNvZGU6ZnVuY3Rpb24oZSx0LG4sbyxhKXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIGU7dmFyIHM9ZTtpZigic3ltYm9sIj09dHlwZW9mIGU/cz1TeW1ib2wucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk6InN0cmluZyIhPXR5cGVvZiBlJiYocz1TdHJpbmcoZSkpLCJpc28tODg1OS0xIj09PW4pcmV0dXJuIGVzY2FwZShzKS5yZXBsYWNlKC8ldVswLTlhLWZdezR9L2dpLChmdW5jdGlvbihlKXtyZXR1cm4iJTI2JTIzIitwYXJzZUludChlLnNsaWNlKDIpLDE2KSsiJTNCIn0pKTtmb3IodmFyIHU9IiIsYz0wO2M8cy5sZW5ndGg7KytjKXt2YXIgbD1zLmNoYXJDb2RlQXQoYyk7NDU9PT1sfHw0Nj09PWx8fDk1PT09bHx8MTI2PT09bHx8bD49NDgmJmw8PTU3fHxsPj02NSYmbDw9OTB8fGw+PTk3JiZsPD0xMjJ8fGE9PT1yLlJGQzE3MzgmJig0MD09PWx8fDQxPT09bCk/dSs9cy5jaGFyQXQoYyk6bDwxMjg/dSs9aVtsXTpsPDIwNDg/dSs9aVsxOTJ8bD4+Nl0raVsxMjh8NjMmbF06bDw1NTI5Nnx8bD49NTczNDQ/dSs9aVsyMjR8bD4+MTJdK2lbMTI4fGw+PjYmNjNdK2lbMTI4fDYzJmxdOihjKz0xLGw9NjU1MzYrKCgxMDIzJmwpPDwxMHwxMDIzJnMuY2hhckNvZGVBdChjKSksdSs9aVsyNDB8bD4+MThdK2lbMTI4fGw+PjEyJjYzXStpWzEyOHxsPj42JjYzXStpWzEyOHw2MyZsXSl9cmV0dXJuIHV9LGlzQnVmZmVyOmZ1bmN0aW9uKGUpe3JldHVybiEoIWV8fCJvYmplY3QiIT10eXBlb2YgZSkmJiEhKGUuY29uc3RydWN0b3ImJmUuY29uc3RydWN0b3IuaXNCdWZmZXImJmUuY29uc3RydWN0b3IuaXNCdWZmZXIoZSkpfSxpc1JlZ0V4cDpmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBSZWdFeHBdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX0sbWF5YmVNYXA6ZnVuY3Rpb24oZSx0KXtpZihhKGUpKXtmb3IodmFyIG49W10scj0wO3I8ZS5sZW5ndGg7cis9MSluLnB1c2godChlW3JdKSk7cmV0dXJuIG59cmV0dXJuIHQoZSl9LG1lcmdlOmZ1bmN0aW9uIGUodCxuLHIpe2lmKCFuKXJldHVybiB0O2lmKCJvYmplY3QiIT10eXBlb2Ygbil7aWYoYSh0KSl0LnB1c2gobik7ZWxzZXtpZighdHx8Im9iamVjdCIhPXR5cGVvZiB0KXJldHVyblt0LG5dOyhyJiYoci5wbGFpbk9iamVjdHN8fHIuYWxsb3dQcm90b3R5cGVzKXx8IW8uY2FsbChPYmplY3QucHJvdG90eXBlLG4pKSYmKHRbbl09ITApfXJldHVybiB0fWlmKCF0fHwib2JqZWN0IiE9dHlwZW9mIHQpcmV0dXJuW3RdLmNvbmNhdChuKTt2YXIgaT10O3JldHVybiBhKHQpJiYhYShuKSYmKGk9cyh0LHIpKSxhKHQpJiZhKG4pPyhuLmZvckVhY2goKGZ1bmN0aW9uKG4sYSl7aWYoby5jYWxsKHQsYSkpe3ZhciBpPXRbYV07aSYmIm9iamVjdCI9PXR5cGVvZiBpJiZuJiYib2JqZWN0Ij09dHlwZW9mIG4/dFthXT1lKGksbixyKTp0LnB1c2gobil9ZWxzZSB0W2FdPW59KSksdCk6T2JqZWN0LmtleXMobikucmVkdWNlKChmdW5jdGlvbih0LGEpe3ZhciBpPW5bYV07cmV0dXJuIG8uY2FsbCh0LGEpP3RbYV09ZSh0W2FdLGkscik6dFthXT1pLHR9KSxpKX19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMjIpLG89big0MCksYT1uKDIwOCksaT1uKDM3KSxzPW4oNjcpLHU9bigxMjEpLGM9bigxNDEpLGw9big0NykscD1uKDk3KSxmPW4oNjgpLmYsaD1uKDg1KS5mb3JFYWNoLGQ9big0OCksbT1uKDc3KSx2PW0uc2V0LGc9bS5nZXR0ZXJGb3I7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgbSx5PS0xIT09ZS5pbmRleE9mKCJNYXAiKSxiPS0xIT09ZS5pbmRleE9mKCJXZWFrIiksXz15PyJzZXQiOiJhZGQiLHc9b1tlXSx4PXcmJncucHJvdG90eXBlLEU9e307aWYoZCYmImZ1bmN0aW9uIj09dHlwZW9mIHcmJihifHx4LmZvckVhY2gmJiFpKChmdW5jdGlvbigpeyhuZXcgdykuZW50cmllcygpLm5leHQoKX0pKSkpe209dCgoZnVuY3Rpb24odCxuKXt2KGModCxtLGUpLHt0eXBlOmUsY29sbGVjdGlvbjpuZXcgd30pLG51bGwhPW4mJnUobix0W19dLHt0aGF0OnQsQVNfRU5UUklFUzp5fSl9KSk7dmFyIFM9ZyhlKTtoKFsiYWRkIiwiY2xlYXIiLCJkZWxldGUiLCJmb3JFYWNoIiwiZ2V0IiwiaGFzIiwic2V0Iiwia2V5cyIsInZhbHVlcyIsImVudHJpZXMiXSwoZnVuY3Rpb24oZSl7dmFyIHQ9ImFkZCI9PWV8fCJzZXQiPT1lOyEoZSBpbiB4KXx8YiYmImNsZWFyIj09ZXx8cyhtLnByb3RvdHlwZSxlLChmdW5jdGlvbihuLHIpe3ZhciBvPVModGhpcykuY29sbGVjdGlvbjtpZighdCYmYiYmIWwobikpcmV0dXJuImdldCI9PWUmJnZvaWQgMDt2YXIgYT1vW2VdKDA9PT1uPzA6bixyKTtyZXR1cm4gdD90aGlzOmF9KSl9KSksYnx8ZihtLnByb3RvdHlwZSwic2l6ZSIse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUyh0aGlzKS5jb2xsZWN0aW9uLnNpemV9fSl9ZWxzZSBtPW4uZ2V0Q29uc3RydWN0b3IodCxlLHksXyksYS5SRVFVSVJFRD0hMDtyZXR1cm4gcChtLGUsITEsITApLEVbZV09bSxyKHtnbG9iYWw6ITAsZm9yY2VkOiEwfSxFKSxifHxuLnNldFN0cm9uZyhtLGUseSksbX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDM3KSxvPW4oNDEpLGE9big5NiksaT1vKCJpdGVyYXRvciIpO2UuZXhwb3J0cz0hcigoZnVuY3Rpb24oKXt2YXIgZT1uZXcgVVJMKCJiP2E9MSZiPTImYz0zIiwiaHR0cDovL2EiKSx0PWUuc2VhcmNoUGFyYW1zLG49IiI7cmV0dXJuIGUucGF0aG5hbWU9ImMlMjBkIix0LmZvckVhY2goKGZ1bmN0aW9uKGUscil7dC5kZWxldGUoImIiKSxuKz1yK2V9KSksYSYmIWUudG9KU09OfHwhdC5zb3J0fHwiaHR0cDovL2EvYyUyMGQ/YT0xJmM9MyIhPT1lLmhyZWZ8fCIzIiE9PXQuZ2V0KCJjIil8fCJhPTEiIT09U3RyaW5nKG5ldyBVUkxTZWFyY2hQYXJhbXMoIj9hPTEiKSl8fCF0W2ldfHwiYSIhPT1uZXcgVVJMKCJodHRwczovL2FAYiIpLnVzZXJuYW1lfHwiYiIhPT1uZXcgVVJMU2VhcmNoUGFyYW1zKG5ldyBVUkxTZWFyY2hQYXJhbXMoImE9YiIpKS5nZXQoImEiKXx8InhuLS1lMWF5YmMiIT09bmV3IFVSTCgiaHR0cDovL9GC0LXRgdGCIikuaG9zdHx8IiMlRDAlQjEiIT09bmV3IFVSTCgiaHR0cDovL2Ej0LEiKS5oYXNofHwiYTFjMyIhPT1ufHwieCIhPT1uZXcgVVJMKCJodHRwOi8veCIsdm9pZCAwKS5ob3N0fSkpfSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz0iZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCxQSE4yWnlCM2FXUjBhRDBpTWpBd2NIZ2lJQ0JvWldsbmFIUTlJakl3TUhCNElpQWdlRzFzYm5NOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkx6SXdNREF2YzNabklpQjJhV1YzUW05NFBTSXdJREFnTVRBd0lERXdNQ0lnY0hKbGMyVnlkbVZCYzNCbFkzUlNZWFJwYnowaWVFMXBaRmxOYVdRaUlHTnNZWE56UFNKc1pITXRjbTlzYkdsdVp5SWdjM1I1YkdVOUltSmhZMnRuY205MWJtUXRhVzFoWjJVNklHNXZibVU3SUdKaFkydG5jbTkxYm1RdGNHOXphWFJwYjI0NklHbHVhWFJwWVd3Z2FXNXBkR2xoYkRzZ1ltRmphMmR5YjNWdVpDMXlaWEJsWVhRNklHbHVhWFJwWVd3Z2FXNXBkR2xoYkRzaVBqeGphWEpqYkdVZ1kzZzlJalV3SWlCamVUMGlOVEFpSUdacGJHdzlJbTV2Ym1VaUlHNW5MV0YwZEhJdGMzUnliMnRsUFNKN2UyTnZibVpwWnk1amIyeHZjbjE5SWlCdVp5MWhkSFJ5TFhOMGNtOXJaUzEzYVdSMGFEMGllM3RqYjI1bWFXY3VkMmxrZEdoOWZTSWdibWN0WVhSMGNpMXlQU0o3ZTJOdmJtWnBaeTV5WVdScGRYTjlmU0lnYm1jdFlYUjBjaTF6ZEhKdmEyVXRaR0Z6YUdGeWNtRjVQU0o3ZTJOdmJtWnBaeTVrWVhOb1lYSnlZWGw5ZlNJZ2MzUnliMnRsUFNJak5UVTFOVFUxSWlCemRISnZhMlV0ZDJsa2RHZzlJakV3SWlCeVBTSXpOU0lnYzNSeWIydGxMV1JoYzJoaGNuSmhlVDBpTVRZMExqa3pNell4TkRNeE16UTJOREUxSURVMkxqazNOemczTVRRek56Z3lNVE00SWo0OFlXNXBiV0YwWlZSeVlXNXpabTl5YlNCaGRIUnlhV0oxZEdWT1lXMWxQU0owY21GdWMyWnZjbTBpSUhSNWNHVTlJbkp2ZEdGMFpTSWdZMkZzWTAxdlpHVTlJbXhwYm1WaGNpSWdkbUZzZFdWelBTSXdJRFV3SURVd096TTJNQ0ExTUNBMU1DSWdhMlY1VkdsdFpYTTlJakE3TVNJZ1pIVnlQU0l4Y3lJZ1ltVm5hVzQ5SWpCeklpQnlaWEJsWVhSRGIzVnVkRDBpYVc1a1pXWnBibWwwWlNJK1BDOWhibWx0WVhSbFZISmhibk5tYjNKdFBqd3ZZMmx5WTJ4bFBqd3ZjM1puUGdvPSJ9LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXtpZighdC5oYXMoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiYXR0ZW1wdGVkIHRvICIrbisiIHByaXZhdGUgZmllbGQgb24gbm9uLWluc3RhbmNlIik7cmV0dXJuIHQuZ2V0KGUpfSxlLmV4cG9ydHMuZGVmYXVsdD1lLmV4cG9ydHMsZS5leHBvcnRzLl9fZXNNb2R1bGU9ITB9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXt2YXIgdCxuPWUuU3ltYm9sO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP24ub2JzZXJ2YWJsZT90PW4ub2JzZXJ2YWJsZToodD1uKCJvYnNlcnZhYmxlIiksbi5vYnNlcnZhYmxlPXQpOnQ9IkBAb2JzZXJ2YWJsZSIsdH1uLmQodCwiYSIsKGZ1bmN0aW9uKCl7cmV0dXJuIHJ9KSl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7KGZ1bmN0aW9uKGUpe3ZhciBuPSJvYmplY3QiPT10eXBlb2YgZSYmZSYmZS5PYmplY3Q9PT1PYmplY3QmJmU7dC5hPW59KS5jYWxsKHRoaXMsbig1MSkpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmNvbWJpbmVSZWR1Y2Vycz12b2lkIDA7dmFyIHIsbz1uKDYxOSksYT0ocj1vKSYmci5fX2VzTW9kdWxlP3I6e2RlZmF1bHQ6cn07dC5jb21iaW5lUmVkdWNlcnM9YS5kZWZhdWx0fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfTtmdW5jdGlvbiBvKGUpe3JldHVybiBudWxsPT09ZT8ibnVsbCI6dm9pZCAwPT09ZT8idW5kZWZpbmVkIjoib2JqZWN0Ij09PSh2b2lkIDA9PT1lPyJ1bmRlZmluZWQiOnIoZSkpP0FycmF5LmlzQXJyYXkoZSk/ImFycmF5Ijoib2JqZWN0Ijp2b2lkIDA9PT1lPyJ1bmRlZmluZWQiOnIoZSl9ZnVuY3Rpb24gYShlKXtyZXR1cm4ib2JqZWN0Ij09PW8oZSk/cyhlKToiYXJyYXkiPT09byhlKT9pKGUpOmV9ZnVuY3Rpb24gaShlKXtyZXR1cm4gZS5tYXAoYSl9ZnVuY3Rpb24gcyhlKXt2YXIgdD17fTtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1hKGVbbl0pKTtyZXR1cm4gdH1mdW5jdGlvbiB1KGUpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06W10sbj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e30scj17YXJyYXlCZWhhdmlvdXI6bi5hcnJheUJlaGF2aW91cnx8InJlcGxhY2UifSxhPXQubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZXx8e319KSksYz1lfHx7fSxsPTA7bDxhLmxlbmd0aDtsKyspZm9yKHZhciBwPWFbbF0sZj1PYmplY3Qua2V5cyhwKSxoPTA7aDxmLmxlbmd0aDtoKyspe3ZhciBkPWZbaF0sbT1wW2RdLHY9byhtKSxnPW8oY1tkXSk7aWYoIm9iamVjdCI9PT12KWlmKCJ1bmRlZmluZWQiIT09Zyl7dmFyIHk9Im9iamVjdCI9PT1nP2NbZF06e307Y1tkXT11KHt9LFt5LHMobSldLHIpfWVsc2UgY1tkXT1zKG0pO2Vsc2UgaWYoImFycmF5Ij09PXYpaWYoImFycmF5Ij09PWcpe3ZhciBiPWkobSk7Y1tkXT0ibWVyZ2UiPT09ci5hcnJheUJlaGF2aW91cj9jW2RdLmNvbmNhdChiKTpifWVsc2UgY1tkXT1pKG0pO2Vsc2UgY1tkXT1tfXJldHVybiBjfWUuZXhwb3J0cz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxuPUFycmF5KHQ+MT90LTE6MCkscj0xO3I8dDtyKyspbltyLTFdPWFyZ3VtZW50c1tyXTtyZXR1cm4gdShlLG4pfSxlLmV4cG9ydHMubm9NdXRhdGU9ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PUFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiB1KHt9LHQpfSxlLmV4cG9ydHMud2l0aE9wdGlvbnM9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB1KGUsdCxuKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuc2FuaXRpemVVcmw9dm9pZCAwO3ZhciByPS9eKFteXHddKikoamF2YXNjcmlwdHxkYXRhfHZic2NyaXB0KS9pbSxvPS9bXHUwMDAwLVx1MDAxRlx1MDA3Ri1cdTAwOUZcdTIwMDAtXHUyMDBEXHVGRUZGXS9naW0sYT0vXihbXjpdKyk6L2dtLGk9WyIuIiwiLyJdO3Quc2FuaXRpemVVcmw9ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuImFib3V0OmJsYW5rIjt2YXIgdD1lLnJlcGxhY2UobywiIikudHJpbSgpO2lmKGZ1bmN0aW9uKGUpe3JldHVybiBpLmluZGV4T2YoZVswXSk+LTF9KHQpKXJldHVybiB0O3ZhciBuPXQubWF0Y2goYSk7aWYoIW4pcmV0dXJuIHQ7dmFyIHM9blswXTtyZXR1cm4gci50ZXN0KHMpPyJhYm91dDpibGFuayI6dH19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDY3Niksbz1uKDY4NSkoKGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdD10LnRvTG93ZXJDYXNlKCksZSsobj9yKHQpOnQpfSkpO2UuZXhwb3J0cz1vfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big3MTQpKG4oNzUxKSk7ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24odCl7dmFyIHI9big3NjMpLG89big3NjQpLlN0cmVhbTtmdW5jdGlvbiBhKGUsdCxuKXtuPW58fDA7dmFyIG8saSxzPShvPXQsbmV3IEFycmF5KG58fDApLmpvaW4ob3x8IiIpKSx1PWU7aWYoIm9iamVjdCI9PXR5cGVvZiBlJiYoKHU9ZVtpPU9iamVjdC5rZXlzKGUpWzBdXSkmJnUuX2VsZW0pKXJldHVybiB1Ll9lbGVtLm5hbWU9aSx1Ll9lbGVtLmljb3VudD1uLHUuX2VsZW0uaW5kZW50PXQsdS5fZWxlbS5pbmRlbnRzPXMsdS5fZWxlbS5pbnRlcnJ1cHQ9dSx1Ll9lbGVtO3ZhciBjLGw9W10scD1bXTtmdW5jdGlvbiBmKGUpe09iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKHQpe2wucHVzaChmdW5jdGlvbihlLHQpe3JldHVybiBlKyc9Iicrcih0KSsnIid9KHQsZVt0XSkpfSkpfXN3aXRjaCh0eXBlb2YgdSl7Y2FzZSJvYmplY3QiOmlmKG51bGw9PT11KWJyZWFrO3UuX2F0dHImJmYodS5fYXR0ciksdS5fY2RhdGEmJnAucHVzaCgoIjwhW0NEQVRBWyIrdS5fY2RhdGEpLnJlcGxhY2UoL1xdXF0+L2csIl1dXV0+PCFbQ0RBVEFbPiIpKyJdXT4iKSx1LmZvckVhY2gmJihjPSExLHAucHVzaCgiIiksdS5mb3JFYWNoKChmdW5jdGlvbihlKXsib2JqZWN0Ij09dHlwZW9mIGU/Il9hdHRyIj09T2JqZWN0LmtleXMoZSlbMF0/ZihlLl9hdHRyKTpwLnB1c2goYShlLHQsbisxKSk6KHAucG9wKCksYz0hMCxwLnB1c2gocihlKSkpfSkpLGN8fHAucHVzaCgiIikpO2JyZWFrO2RlZmF1bHQ6cC5wdXNoKHIodSkpfXJldHVybntuYW1lOmksaW50ZXJydXB0OiExLGF0dHJpYnV0ZXM6bCxjb250ZW50OnAsaWNvdW50Om4saW5kZW50czpzLGluZGVudDp0fX1mdW5jdGlvbiBpKGUsdCxuKXtpZigib2JqZWN0IiE9dHlwZW9mIHQpcmV0dXJuIGUoITEsdCk7dmFyIHI9dC5pbnRlcnJ1cHQ/MTp0LmNvbnRlbnQubGVuZ3RoO2Z1bmN0aW9uIG8oKXtmb3IoO3QuY29udGVudC5sZW5ndGg7KXt2YXIgbz10LmNvbnRlbnQuc2hpZnQoKTtpZih2b2lkIDAhPT1vKXtpZihhKG8pKXJldHVybjtpKGUsbyl9fWUoITEsKHI+MT90LmluZGVudHM6IiIpKyh0Lm5hbWU/IjwvIit0Lm5hbWUrIj4iOiIiKSsodC5pbmRlbnQmJiFuPyJcbiI6IiIpKSxuJiZuKCl9ZnVuY3Rpb24gYSh0KXtyZXR1cm4hIXQuaW50ZXJydXB0JiYodC5pbnRlcnJ1cHQuYXBwZW5kPWUsdC5pbnRlcnJ1cHQuZW5kPW8sdC5pbnRlcnJ1cHQ9ITEsZSghMCksITApfWlmKGUoITEsdC5pbmRlbnRzKyh0Lm5hbWU/IjwiK3QubmFtZToiIikrKHQuYXR0cmlidXRlcy5sZW5ndGg/IiAiK3QuYXR0cmlidXRlcy5qb2luKCIgIik6IiIpKyhyP3QubmFtZT8iPiI6IiI6dC5uYW1lPyIvPiI6IiIpKyh0LmluZGVudCYmcj4xPyJcbiI6IiIpKSwhcilyZXR1cm4gZSghMSx0LmluZGVudD8iXG4iOiIiKTthKHQpfHxvKCl9ZS5leHBvcnRzPWZ1bmN0aW9uKGUsbil7Im9iamVjdCIhPXR5cGVvZiBuJiYobj17aW5kZW50Om59KTt2YXIgcixzLHU9bi5zdHJlYW0/bmV3IG86bnVsbCxjPSIiLGw9ITEscD1uLmluZGVudD8hMD09PW4uaW5kZW50PyIgICAgIjpuLmluZGVudDoiIixmPSEwO2Z1bmN0aW9uIGgoZSl7Zj90Lm5leHRUaWNrKGUpOmUoKX1mdW5jdGlvbiBkKGUsdCl7aWYodm9pZCAwIT09dCYmKGMrPXQpLGUmJiFsJiYodT11fHxuZXcgbyxsPSEwKSxlJiZsKXt2YXIgbj1jO2goKGZ1bmN0aW9uKCl7dS5lbWl0KCJkYXRhIixuKX0pKSxjPSIifX1mdW5jdGlvbiBtKGUsdCl7aShkLGEoZSxwLHA/MTowKSx0KX1mdW5jdGlvbiB2KCl7aWYodSl7dmFyIGU9YztoKChmdW5jdGlvbigpe3UuZW1pdCgiZGF0YSIsZSksdS5lbWl0KCJlbmQiKSx1LnJlYWRhYmxlPSExLHUuZW1pdCgiY2xvc2UiKX0pKX19cmV0dXJuIGgoKGZ1bmN0aW9uKCl7Zj0hMX0pKSxuLmRlY2xhcmF0aW9uJiYocj1uLmRlY2xhcmF0aW9uLHM9e3ZlcnNpb246IjEuMCIsZW5jb2Rpbmc6ci5lbmNvZGluZ3x8IlVURi04In0sci5zdGFuZGFsb25lJiYocy5zdGFuZGFsb25lPXIuc3RhbmRhbG9uZSksbSh7Ij94bWwiOntfYXR0cjpzfX0pLGM9Yy5yZXBsYWNlKCIvPiIsIj8+IikpLGUmJmUuZm9yRWFjaD9lLmZvckVhY2goKGZ1bmN0aW9uKHQsbil7dmFyIHI7bisxPT09ZS5sZW5ndGgmJihyPXYpLG0odCxyKX0pKTptKGUsdiksdT8odS5yZWFkYWJsZT0hMCx1KTpjfSxlLmV4cG9ydHMuZWxlbWVudD1lLmV4cG9ydHMuRWxlbWVudD1mdW5jdGlvbigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyksdD17X2VsZW06YShlKSxwdXNoOmZ1bmN0aW9uKGUpe2lmKCF0aGlzLmFwcGVuZCl0aHJvdyBuZXcgRXJyb3IoIm5vdCBhc3NpZ25lZCB0byBhIHBhcmVudCEiKTt2YXIgdD10aGlzLG49dGhpcy5fZWxlbS5pbmRlbnQ7aSh0aGlzLmFwcGVuZCxhKGUsbix0aGlzLl9lbGVtLmljb3VudCsobj8xOjApKSwoZnVuY3Rpb24oKXt0LmFwcGVuZCghMCl9KSl9LGNsb3NlOmZ1bmN0aW9uKGUpe3ZvaWQgMCE9PWUmJnRoaXMucHVzaChlKSx0aGlzLmVuZCYmdGhpcy5lbmQoKX19O3JldHVybiB0fX0pLmNhbGwodGhpcyxuKDg5KSl9LGZ1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24odCl7dmFyIG47bj12b2lkIDAhPT10P3Q6dGhpcyxlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYoZS5DU1MmJmUuQ1NTLmVzY2FwZSlyZXR1cm4gZS5DU1MuZXNjYXBlO3ZhciB0PWZ1bmN0aW9uKGUpe2lmKDA9PWFyZ3VtZW50cy5sZW5ndGgpdGhyb3cgbmV3IFR5cGVFcnJvcigiYENTUy5lc2NhcGVgIHJlcXVpcmVzIGFuIGFyZ3VtZW50LiIpO2Zvcih2YXIgdCxuPVN0cmluZyhlKSxyPW4ubGVuZ3RoLG89LTEsYT0iIixpPW4uY2hhckNvZGVBdCgwKTsrK288cjspMCE9KHQ9bi5jaGFyQ29kZUF0KG8pKT9hKz10Pj0xJiZ0PD0zMXx8MTI3PT10fHwwPT1vJiZ0Pj00OCYmdDw9NTd8fDE9PW8mJnQ+PTQ4JiZ0PD01NyYmNDU9PWk/IlxcIit0LnRvU3RyaW5nKDE2KSsiICI6MD09byYmMT09ciYmNDU9PXR8fCEodD49MTI4fHw0NT09dHx8OTU9PXR8fHQ+PTQ4JiZ0PD01N3x8dD49NjUmJnQ8PTkwfHx0Pj05NyYmdDw9MTIyKT8iXFwiK24uY2hhckF0KG8pOm4uY2hhckF0KG8pOmErPSLvv70iO3JldHVybiBhfTtyZXR1cm4gZS5DU1N8fChlLkNTUz17fSksZS5DU1MuZXNjYXBlPXQsdH0obil9KS5jYWxsKHRoaXMsbig1MSkpfSxmdW5jdGlvbihlLHQsbil7KHQ9ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2U9ZS50b0xvd2VyQ2FzZSgpO3ZhciBuPXRbZV07aWYoIW4pdGhyb3cgbmV3IEVycm9yKGUrIiBpcyBub3Qgc3VwcG9ydGVkICh3ZSBhY2NlcHQgcHVsbCByZXF1ZXN0cykiKTtyZXR1cm4gbmV3IG59KS5zaGE9big4MzcpLHQuc2hhMT1uKDgzOCksdC5zaGEyMjQ9big4MzkpLHQuc2hhMjU2PW4oNDQyKSx0LnNoYTM4ND1uKDg0MCksdC5zaGE1MTI9big0NDMpfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big0MDkpLG89big0MjUpLGE9bigxOTMpLGk9big4NDUpLHM9big1Nik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgdT1zKGUpP3I6aSxjPWFyZ3VtZW50cy5sZW5ndGg8MztyZXR1cm4gdShlLGEodCw0KSxuLGMsbyl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMTQpLG89big1NiksYT1uKDg4KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlfHwhbyhlKSYmYShlKSYmIltvYmplY3QgU3RyaW5nXSI9PXIoZSl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big1OSksbz1uKDg5MSksYT1uKDQyNCksaT1NYXRoLm1heCxzPU1hdGgubWluO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsbil7dmFyIHUsYyxsLHAsZixoLGQ9MCxtPSExLHY9ITEsZz0hMDtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCBhIGZ1bmN0aW9uIik7ZnVuY3Rpb24geSh0KXt2YXIgbj11LHI9YztyZXR1cm4gdT1jPXZvaWQgMCxkPXQscD1lLmFwcGx5KHIsbil9ZnVuY3Rpb24gYihlKXtyZXR1cm4gZD1lLGY9c2V0VGltZW91dCh3LHQpLG0/eShlKTpwfWZ1bmN0aW9uIF8oZSl7dmFyIG49ZS1oO3JldHVybiB2b2lkIDA9PT1ofHxuPj10fHxuPDB8fHYmJmUtZD49bH1mdW5jdGlvbiB3KCl7dmFyIGU9bygpO2lmKF8oZSkpcmV0dXJuIHgoZSk7Zj1zZXRUaW1lb3V0KHcsZnVuY3Rpb24oZSl7dmFyIG49dC0oZS1oKTtyZXR1cm4gdj9zKG4sbC0oZS1kKSk6bn0oZSkpfWZ1bmN0aW9uIHgoZSl7cmV0dXJuIGY9dm9pZCAwLGcmJnU/eShlKToodT1jPXZvaWQgMCxwKX1mdW5jdGlvbiBFKCl7dmFyIGU9bygpLG49XyhlKTtpZih1PWFyZ3VtZW50cyxjPXRoaXMsaD1lLG4pe2lmKHZvaWQgMD09PWYpcmV0dXJuIGIoaCk7aWYodilyZXR1cm4gY2xlYXJUaW1lb3V0KGYpLGY9c2V0VGltZW91dCh3LHQpLHkoaCl9cmV0dXJuIHZvaWQgMD09PWYmJihmPXNldFRpbWVvdXQodyx0KSkscH1yZXR1cm4gdD1hKHQpfHwwLHIobikmJihtPSEhbi5sZWFkaW5nLGw9KHY9Im1heFdhaXQiaW4gbik/aShhKG4ubWF4V2FpdCl8fDAsdCk6bCxnPSJ0cmFpbGluZyJpbiBuPyEhbi50cmFpbGluZzpnKSxFLmNhbmNlbD1mdW5jdGlvbigpe3ZvaWQgMCE9PWYmJmNsZWFyVGltZW91dChmKSxkPTAsdT1oPWM9Zj12b2lkIDB9LEUuZmx1c2g9ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09Zj9wOngobygpKX0sRX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPW4oOTEzKX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNDA2KSxvPW4oNDg5KSxhPW4oMTAxNyksaT1uKDE2Mikscz1uKDE3MCksdT1uKDEwMjApLGM9bigxMDIxKSxsPW4oNDkxKSxwPWMoKGZ1bmN0aW9uKGUsdCl7dmFyIG49e307aWYobnVsbD09ZSlyZXR1cm4gbjt2YXIgYz0hMTt0PXIodCwoZnVuY3Rpb24odCl7cmV0dXJuIHQ9aSh0LGUpLGN8fChjPXQubGVuZ3RoPjEpLHR9KSkscyhlLGwoZSksbiksYyYmKG49byhuLDcsdSkpO2Zvcih2YXIgcD10Lmxlbmd0aDtwLS07KWEobix0W3BdKTtyZXR1cm4gbn0pKTtlLmV4cG9ydHM9cH0sZnVuY3Rpb24oZSx0LG4pe2UuZXhwb3J0cz1uKDEwMzEpfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMDQyKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZihudWxsPT1lKXJldHVybnt9O3ZhciBuLG8sYT1yKGUsdCk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIGk9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtmb3Iobz0wO288aS5sZW5ndGg7bysrKW49aVtvXSx0LmluZGV4T2Yobik+PTB8fE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLG4pJiYoYVtuXT1lW25dKX1yZXR1cm4gYX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDEwNDMpLG89bigxMDQ0KSxhPW4oMTA0NSksaT1uKDEwNDYpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gcihlKXx8byhlKXx8YShlKXx8aSgpfX0sZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKCl7cmV0dXJuIGUuZXhwb3J0cz1uPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKGVbcl09bltyXSl9cmV0dXJuIGV9LG4uYXBwbHkodGhpcyxhcmd1bWVudHMpfWUuZXhwb3J0cz1ufSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbihlKXtjb25zdCB0PXtsaXRlcmFsOiJ0cnVlIGZhbHNlIG51bGwifSxuPVtlLkNfTElORV9DT01NRU5UX01PREUsZS5DX0JMT0NLX0NPTU1FTlRfTU9ERV0scj1bZS5RVU9URV9TVFJJTkdfTU9ERSxlLkNfTlVNQkVSX01PREVdLG89e2VuZDoiLCIsZW5kc1dpdGhQYXJlbnQ6ITAsZXhjbHVkZUVuZDohMCxjb250YWluczpyLGtleXdvcmRzOnR9LGE9e2JlZ2luOi9cey8sZW5kOi9cfS8sY29udGFpbnM6W3tjbGFzc05hbWU6ImF0dHIiLGJlZ2luOi8iLyxlbmQ6LyIvLGNvbnRhaW5zOltlLkJBQ0tTTEFTSF9FU0NBUEVdLGlsbGVnYWw6IlxcbiJ9LGUuaW5oZXJpdChvLHtiZWdpbjovOi99KV0uY29uY2F0KG4pLGlsbGVnYWw6IlxcUyJ9LGk9e2JlZ2luOiJcXFsiLGVuZDoiXFxdIixjb250YWluczpbZS5pbmhlcml0KG8pXSxpbGxlZ2FsOiJcXFMifTtyZXR1cm4gci5wdXNoKGEsaSksbi5mb3JFYWNoKChmdW5jdGlvbihlKXtyLnB1c2goZSl9KSkse25hbWU6IkpTT04iLGNvbnRhaW5zOnIsa2V5d29yZHM6dCxpbGxlZ2FsOiJcXFMifX19LGZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj0iW0EtWmEteiRfXVswLTlBLVphLXokX10qIixyPVsiYXMiLCJpbiIsIm9mIiwiaWYiLCJmb3IiLCJ3aGlsZSIsImZpbmFsbHkiLCJ2YXIiLCJuZXciLCJmdW5jdGlvbiIsImRvIiwicmV0dXJuIiwidm9pZCIsImVsc2UiLCJicmVhayIsImNhdGNoIiwiaW5zdGFuY2VvZiIsIndpdGgiLCJ0aHJvdyIsImNhc2UiLCJkZWZhdWx0IiwidHJ5Iiwic3dpdGNoIiwiY29udGludWUiLCJ0eXBlb2YiLCJkZWxldGUiLCJsZXQiLCJ5aWVsZCIsImNvbnN0IiwiY2xhc3MiLCJkZWJ1Z2dlciIsImFzeW5jIiwiYXdhaXQiLCJzdGF0aWMiLCJpbXBvcnQiLCJmcm9tIiwiZXhwb3J0IiwiZXh0ZW5kcyJdLG89WyJ0cnVlIiwiZmFsc2UiLCJudWxsIiwidW5kZWZpbmVkIiwiTmFOIiwiSW5maW5pdHkiXSxhPVtdLmNvbmNhdChbInNldEludGVydmFsIiwic2V0VGltZW91dCIsImNsZWFySW50ZXJ2YWwiLCJjbGVhclRpbWVvdXQiLCJyZXF1aXJlIiwiZXhwb3J0cyIsImV2YWwiLCJpc0Zpbml0ZSIsImlzTmFOIiwicGFyc2VGbG9hdCIsInBhcnNlSW50IiwiZGVjb2RlVVJJIiwiZGVjb2RlVVJJQ29tcG9uZW50IiwiZW5jb2RlVVJJIiwiZW5jb2RlVVJJQ29tcG9uZW50IiwiZXNjYXBlIiwidW5lc2NhcGUiXSxbImFyZ3VtZW50cyIsInRoaXMiLCJzdXBlciIsImNvbnNvbGUiLCJ3aW5kb3ciLCJkb2N1bWVudCIsImxvY2FsU3RvcmFnZSIsIm1vZHVsZSIsImdsb2JhbCJdLFsiSW50bCIsIkRhdGFWaWV3IiwiTnVtYmVyIiwiTWF0aCIsIkRhdGUiLCJTdHJpbmciLCJSZWdFeHAiLCJPYmplY3QiLCJGdW5jdGlvbiIsIkJvb2xlYW4iLCJFcnJvciIsIlN5bWJvbCIsIlNldCIsIk1hcCIsIldlYWtTZXQiLCJXZWFrTWFwIiwiUHJveHkiLCJSZWZsZWN0IiwiSlNPTiIsIlByb21pc2UiLCJGbG9hdDY0QXJyYXkiLCJJbnQxNkFycmF5IiwiSW50MzJBcnJheSIsIkludDhBcnJheSIsIlVpbnQxNkFycmF5IiwiVWludDMyQXJyYXkiLCJGbG9hdDMyQXJyYXkiLCJBcnJheSIsIlVpbnQ4QXJyYXkiLCJVaW50OENsYW1wZWRBcnJheSIsIkFycmF5QnVmZmVyIl0sWyJFdmFsRXJyb3IiLCJJbnRlcm5hbEVycm9yIiwiUmFuZ2VFcnJvciIsIlJlZmVyZW5jZUVycm9yIiwiU3ludGF4RXJyb3IiLCJUeXBlRXJyb3IiLCJVUklFcnJvciJdKTtmdW5jdGlvbiBpKGUpe3JldHVybiBzKCIoPz0iLGUsIikiKX1mdW5jdGlvbiBzKC4uLmUpe3JldHVybiBlLm1hcCgoZT0+e3JldHVybih0PWUpPyJzdHJpbmciPT10eXBlb2YgdD90OnQuc291cmNlOm51bGw7dmFyIHR9KSkuam9pbigiIil9ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2NvbnN0IHQ9bix1PSI8PiIsYz0iPC8+IixsPXtiZWdpbjovPFtBLVphLXowLTlcXC5fOi1dKy8sZW5kOi9cL1tBLVphLXowLTlcXC5fOi1dKz58XC8+Lyxpc1RydWx5T3BlbmluZ1RhZzooZSx0KT0+e2NvbnN0IG49ZVswXS5sZW5ndGgrZS5pbmRleCxyPWUuaW5wdXRbbl07IjwiIT09cj8iPiI9PT1yJiYoKChlLHthZnRlcjp0fSk9Pntjb25zdCBuPSI8LyIrZVswXS5zbGljZSgxKTtyZXR1cm4tMSE9PWUuaW5wdXQuaW5kZXhPZihuLHQpfSkoZSx7YWZ0ZXI6bn0pfHx0Lmlnbm9yZU1hdGNoKCkpOnQuaWdub3JlTWF0Y2goKX19LHA9eyRwYXR0ZXJuOm4sa2V5d29yZDpyLmpvaW4oIiAiKSxsaXRlcmFsOm8uam9pbigiICIpLGJ1aWx0X2luOmEuam9pbigiICIpfSxmPSJcXC4oWzAtOV0oXz9bMC05XSkqKSIsaD0iMHxbMS05XShfP1swLTldKSp8MFswLTddKls4OV1bMC05XSoiLGQ9e2NsYXNzTmFtZToibnVtYmVyIix2YXJpYW50czpbe2JlZ2luOmAoXFxiKCR7aH0pKCgke2Z9KXxcXC4pP3woJHtmfSkpW2VFXVsrLV0/KFswLTldKF8/WzAtOV0pKilcXGJgfSx7YmVnaW46YFxcYigke2h9KVxcYigoJHtmfSlcXGJ8XFwuKT98KCR7Zn0pXFxiYH0se2JlZ2luOiJcXGIoMHxbMS05XShfP1swLTldKSopblxcYiJ9LHtiZWdpbjoiXFxiMFt4WF1bMC05YS1mQS1GXShfP1swLTlhLWZBLUZdKSpuP1xcYiJ9LHtiZWdpbjoiXFxiMFtiQl1bMC0xXShfP1swLTFdKSpuP1xcYiJ9LHtiZWdpbjoiXFxiMFtvT11bMC03XShfP1swLTddKSpuP1xcYiJ9LHtiZWdpbjoiXFxiMFswLTddK24/XFxiIn1dLHJlbGV2YW5jZTowfSxtPXtjbGFzc05hbWU6InN1YnN0IixiZWdpbjoiXFwkXFx7IixlbmQ6IlxcfSIsa2V5d29yZHM6cCxjb250YWluczpbXX0sdj17YmVnaW46Imh0bWxgIixlbmQ6IiIsc3RhcnRzOntlbmQ6ImAiLHJldHVybkVuZDohMSxjb250YWluczpbZS5CQUNLU0xBU0hfRVNDQVBFLG1dLHN1Ykxhbmd1YWdlOiJ4bWwifX0sZz17YmVnaW46ImNzc2AiLGVuZDoiIixzdGFydHM6e2VuZDoiYCIscmV0dXJuRW5kOiExLGNvbnRhaW5zOltlLkJBQ0tTTEFTSF9FU0NBUEUsbV0sc3ViTGFuZ3VhZ2U6ImNzcyJ9fSx5PXtjbGFzc05hbWU6InN0cmluZyIsYmVnaW46ImAiLGVuZDoiYCIsY29udGFpbnM6W2UuQkFDS1NMQVNIX0VTQ0FQRSxtXX0sYj17Y2xhc3NOYW1lOiJjb21tZW50Iix2YXJpYW50czpbZS5DT01NRU5UKCIvXFwqXFwqIiwiXFwqLyIse3JlbGV2YW5jZTowLGNvbnRhaW5zOlt7Y2xhc3NOYW1lOiJkb2N0YWciLGJlZ2luOiJAW0EtWmEtel0rIixjb250YWluczpbe2NsYXNzTmFtZToidHlwZSIsYmVnaW46IlxceyIsZW5kOiJcXH0iLHJlbGV2YW5jZTowfSx7Y2xhc3NOYW1lOiJ2YXJpYWJsZSIsYmVnaW46dCsiKD89XFxzKigtKXwkKSIsZW5kc1BhcmVudDohMCxyZWxldmFuY2U6MH0se2JlZ2luOi8oPz1bXlxuXSlccy8scmVsZXZhbmNlOjB9XX1dfSksZS5DX0JMT0NLX0NPTU1FTlRfTU9ERSxlLkNfTElORV9DT01NRU5UX01PREVdfSxfPVtlLkFQT1NfU1RSSU5HX01PREUsZS5RVU9URV9TVFJJTkdfTU9ERSx2LGcseSxkLGUuUkVHRVhQX01PREVdO20uY29udGFpbnM9Xy5jb25jYXQoe2JlZ2luOi9cey8sZW5kOi9cfS8sa2V5d29yZHM6cCxjb250YWluczpbInNlbGYiXS5jb25jYXQoXyl9KTtjb25zdCB3PVtdLmNvbmNhdChiLG0uY29udGFpbnMpLHg9dy5jb25jYXQoW3tiZWdpbjovXCgvLGVuZDovXCkvLGtleXdvcmRzOnAsY29udGFpbnM6WyJzZWxmIl0uY29uY2F0KHcpfV0pLEU9e2NsYXNzTmFtZToicGFyYW1zIixiZWdpbjovXCgvLGVuZDovXCkvLGV4Y2x1ZGVCZWdpbjohMCxleGNsdWRlRW5kOiEwLGtleXdvcmRzOnAsY29udGFpbnM6eH07cmV0dXJue25hbWU6IkphdmFzY3JpcHQiLGFsaWFzZXM6WyJqcyIsImpzeCIsIm1qcyIsImNqcyJdLGtleXdvcmRzOnAsZXhwb3J0czp7UEFSQU1TX0NPTlRBSU5TOnh9LGlsbGVnYWw6LyMoPyFbJF9BLXpdKS8sY29udGFpbnM6W2UuU0hFQkFORyh7bGFiZWw6InNoZWJhbmciLGJpbmFyeToibm9kZSIscmVsZXZhbmNlOjV9KSx7bGFiZWw6InVzZV9zdHJpY3QiLGNsYXNzTmFtZToibWV0YSIscmVsZXZhbmNlOjEwLGJlZ2luOi9eXHMqWyciXXVzZSAoc3RyaWN0fGFzbSlbJyJdL30sZS5BUE9TX1NUUklOR19NT0RFLGUuUVVPVEVfU1RSSU5HX01PREUsdixnLHksYixkLHtiZWdpbjpzKC9beyxcbl1ccyovLGkocygvKCgoXC9cLy4qJCl8KFwvXCooXCpbXi9dfFteKl0pKlwqXC8pKVxzKikqLyx0KyJcXHMqOiIpKSkscmVsZXZhbmNlOjAsY29udGFpbnM6W3tjbGFzc05hbWU6ImF0dHIiLGJlZ2luOnQraSgiXFxzKjoiKSxyZWxldmFuY2U6MH1dfSx7YmVnaW46IigiK2UuUkVfU1RBUlRFUlNfUkUrInxcXGIoY2FzZXxyZXR1cm58dGhyb3cpXFxiKVxccyoiLGtleXdvcmRzOiJyZXR1cm4gdGhyb3cgY2FzZSIsY29udGFpbnM6W2IsZS5SRUdFWFBfTU9ERSx7Y2xhc3NOYW1lOiJmdW5jdGlvbiIsYmVnaW46IihcXChbXigpXSooXFwoW14oKV0qKFxcKFteKCldKlxcKVteKCldKikqXFwpW14oKV0qKSpcXCl8IitlLlVOREVSU0NPUkVfSURFTlRfUkUrIilcXHMqPT4iLHJldHVybkJlZ2luOiEwLGVuZDoiXFxzKj0+Iixjb250YWluczpbe2NsYXNzTmFtZToicGFyYW1zIix2YXJpYW50czpbe2JlZ2luOmUuVU5ERVJTQ09SRV9JREVOVF9SRSxyZWxldmFuY2U6MH0se2NsYXNzTmFtZTpudWxsLGJlZ2luOi9cKFxzKlwpLyxza2lwOiEwfSx7YmVnaW46L1woLyxlbmQ6L1wpLyxleGNsdWRlQmVnaW46ITAsZXhjbHVkZUVuZDohMCxrZXl3b3JkczpwLGNvbnRhaW5zOnh9XX1dfSx7YmVnaW46LywvLHJlbGV2YW5jZTowfSx7Y2xhc3NOYW1lOiIiLGJlZ2luOi9ccy8sZW5kOi9ccyovLHNraXA6ITB9LHt2YXJpYW50czpbe2JlZ2luOnUsZW5kOmN9LHtiZWdpbjpsLmJlZ2luLCJvbjpiZWdpbiI6bC5pc1RydWx5T3BlbmluZ1RhZyxlbmQ6bC5lbmR9XSxzdWJMYW5ndWFnZToieG1sIixjb250YWluczpbe2JlZ2luOmwuYmVnaW4sZW5kOmwuZW5kLHNraXA6ITAsY29udGFpbnM6WyJzZWxmIl19XX1dLHJlbGV2YW5jZTowfSx7Y2xhc3NOYW1lOiJmdW5jdGlvbiIsYmVnaW5LZXl3b3JkczoiZnVuY3Rpb24iLGVuZDovW3s7XS8sZXhjbHVkZUVuZDohMCxrZXl3b3JkczpwLGNvbnRhaW5zOlsic2VsZiIsZS5pbmhlcml0KGUuVElUTEVfTU9ERSx7YmVnaW46dH0pLEVdLGlsbGVnYWw6LyUvfSx7YmVnaW5LZXl3b3Jkczoid2hpbGUgaWYgc3dpdGNoIGNhdGNoIGZvciJ9LHtjbGFzc05hbWU6ImZ1bmN0aW9uIixiZWdpbjplLlVOREVSU0NPUkVfSURFTlRfUkUrIlxcKFteKCldKihcXChbXigpXSooXFwoW14oKV0qXFwpW14oKV0qKSpcXClbXigpXSopKlxcKVxccypcXHsiLHJldHVybkJlZ2luOiEwLGNvbnRhaW5zOltFLGUuaW5oZXJpdChlLlRJVExFX01PREUse2JlZ2luOnR9KV19LHt2YXJpYW50czpbe2JlZ2luOiJcXC4iK3R9LHtiZWdpbjoiXFwkIit0fV0scmVsZXZhbmNlOjB9LHtjbGFzc05hbWU6ImNsYXNzIixiZWdpbktleXdvcmRzOiJjbGFzcyIsZW5kOi9bezs9XS8sZXhjbHVkZUVuZDohMCxpbGxlZ2FsOi9bOiJbXF1dLyxjb250YWluczpbe2JlZ2luS2V5d29yZHM6ImV4dGVuZHMifSxlLlVOREVSU0NPUkVfVElUTEVfTU9ERV19LHtiZWdpbjovXGIoPz1jb25zdHJ1Y3RvcikvLGVuZDovW3s7XS8sZXhjbHVkZUVuZDohMCxjb250YWluczpbZS5pbmhlcml0KGUuVElUTEVfTU9ERSx7YmVnaW46dH0pLCJzZWxmIixFXX0se2JlZ2luOiIoZ2V0fHNldClcXHMrKD89Iit0KyJcXCgpIixlbmQ6L1x7LyxrZXl3b3JkczoiZ2V0IHNldCIsY29udGFpbnM6W2UuaW5oZXJpdChlLlRJVExFX01PREUse2JlZ2luOnR9KSx7YmVnaW46L1woXCkvfSxFXX0se2JlZ2luOi9cJFsoLl0vfV19fX0sZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKGUpe3JldHVybiBlPyJzdHJpbmciPT10eXBlb2YgZT9lOmUuc291cmNlOm51bGx9ZnVuY3Rpb24gcihlKXtyZXR1cm4gbygiKD89IixlLCIpIil9ZnVuY3Rpb24gbyguLi5lKXtyZXR1cm4gZS5tYXAoKGU9Pm4oZSkpKS5qb2luKCIiKX1mdW5jdGlvbiBhKC4uLmUpe3JldHVybiIoIitlLm1hcCgoZT0+bihlKSkpLmpvaW4oInwiKSsiKSJ9ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2NvbnN0IHQ9bygvW0EtWl9dLyxvKCIoIiwvW0EtWjAtOV8uLV0rOi8sIik/IiksL1tBLVowLTlfLi1dKi8pLG49e2NsYXNzTmFtZToic3ltYm9sIixiZWdpbjoiJlthLXpdKzt8JiNbMC05XSs7fCYjeFthLWYwLTldKzsifSxpPXtiZWdpbjoiXFxzIixjb250YWluczpbe2NsYXNzTmFtZToibWV0YS1rZXl3b3JkIixiZWdpbjoiIz9bYS16X11bYS16MS05Xy1dKyIsaWxsZWdhbDoiXFxuIn1dfSxzPWUuaW5oZXJpdChpLHtiZWdpbjoiXFwoIixlbmQ6IlxcKSJ9KSx1PWUuaW5oZXJpdChlLkFQT1NfU1RSSU5HX01PREUse2NsYXNzTmFtZToibWV0YS1zdHJpbmcifSksYz1lLmluaGVyaXQoZS5RVU9URV9TVFJJTkdfTU9ERSx7Y2xhc3NOYW1lOiJtZXRhLXN0cmluZyJ9KSxsPXtlbmRzV2l0aFBhcmVudDohMCxpbGxlZ2FsOi88LyxyZWxldmFuY2U6MCxjb250YWluczpbe2NsYXNzTmFtZToiYXR0ciIsYmVnaW46IltBLVphLXowLTlcXC5fOi1dKyIscmVsZXZhbmNlOjB9LHtiZWdpbjovPVxzKi8scmVsZXZhbmNlOjAsY29udGFpbnM6W3tjbGFzc05hbWU6InN0cmluZyIsZW5kc1BhcmVudDohMCx2YXJpYW50czpbe2JlZ2luOi8iLyxlbmQ6LyIvLGNvbnRhaW5zOltuXX0se2JlZ2luOi8nLyxlbmQ6LycvLGNvbnRhaW5zOltuXX0se2JlZ2luOi9bXlxzIic9PD5gXSsvfV19XX1dfTtyZXR1cm57bmFtZToiSFRNTCwgWE1MIixhbGlhc2VzOlsiaHRtbCIsInhodG1sIiwicnNzIiwiYXRvbSIsInhqYiIsInhzZCIsInhzbCIsInBsaXN0Iiwid3NmIiwic3ZnIl0sY2FzZV9pbnNlbnNpdGl2ZTohMCxjb250YWluczpbe2NsYXNzTmFtZToibWV0YSIsYmVnaW46IjwhW2Etel0iLGVuZDoiPiIscmVsZXZhbmNlOjEwLGNvbnRhaW5zOltpLGMsdSxzLHtiZWdpbjoiXFxbIixlbmQ6IlxcXSIsY29udGFpbnM6W3tjbGFzc05hbWU6Im1ldGEiLGJlZ2luOiI8IVthLXpdIixlbmQ6Ij4iLGNvbnRhaW5zOltpLHMsYyx1XX1dfV19LGUuQ09NTUVOVCgiXHgzYyEtLSIsIi0tXHgzZSIse3JlbGV2YW5jZToxMH0pLHtiZWdpbjoiPCFcXFtDREFUQVxcWyIsZW5kOiJcXF1cXF0+IixyZWxldmFuY2U6MTB9LG4se2NsYXNzTmFtZToibWV0YSIsYmVnaW46LzxcP3htbC8sZW5kOi9cPz4vLHJlbGV2YW5jZToxMH0se2NsYXNzTmFtZToidGFnIixiZWdpbjoiPHN0eWxlKD89XFxzfD4pIixlbmQ6Ij4iLGtleXdvcmRzOntuYW1lOiJzdHlsZSJ9LGNvbnRhaW5zOltsXSxzdGFydHM6e2VuZDoiPC9zdHlsZT4iLHJldHVybkVuZDohMCxzdWJMYW5ndWFnZTpbImNzcyIsInhtbCJdfX0se2NsYXNzTmFtZToidGFnIixiZWdpbjoiPHNjcmlwdCg/PVxcc3w+KSIsZW5kOiI+IixrZXl3b3Jkczp7bmFtZToic2NyaXB0In0sY29udGFpbnM6W2xdLHN0YXJ0czp7ZW5kOi88XC9zY3JpcHQ+LyxyZXR1cm5FbmQ6ITAsc3ViTGFuZ3VhZ2U6WyJqYXZhc2NyaXB0IiwiaGFuZGxlYmFycyIsInhtbCJdfX0se2NsYXNzTmFtZToidGFnIixiZWdpbjovPD58PFwvPi99LHtjbGFzc05hbWU6InRhZyIsYmVnaW46bygvPC8scihvKHQsYSgvXC8+LywvPi8sL1xzLykpKSksZW5kOi9cLz8+Lyxjb250YWluczpbe2NsYXNzTmFtZToibmFtZSIsYmVnaW46dCxyZWxldmFuY2U6MCxzdGFydHM6bH1dfSx7Y2xhc3NOYW1lOiJ0YWciLGJlZ2luOm8oLzxcLy8scihvKHQsLz4vKSkpLGNvbnRhaW5zOlt7Y2xhc3NOYW1lOiJuYW1lIixiZWdpbjp0LHJlbGV2YW5jZTowfSx7YmVnaW46Lz4vLHJlbGV2YW5jZTowfV19XX19fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD0idHJ1ZSBmYWxzZSB5ZXMgbm8gbnVsbCIsbj0iW1xcdyM7Lz86QCY9KyQsLn4qJygpW1xcXV0rIixyPXtjbGFzc05hbWU6InN0cmluZyIscmVsZXZhbmNlOjAsdmFyaWFudHM6W3tiZWdpbjovJy8sZW5kOi8nL30se2JlZ2luOi8iLyxlbmQ6LyIvfSx7YmVnaW46L1xTKy99XSxjb250YWluczpbZS5CQUNLU0xBU0hfRVNDQVBFLHtjbGFzc05hbWU6InRlbXBsYXRlLXZhcmlhYmxlIix2YXJpYW50czpbe2JlZ2luOi9ce1x7LyxlbmQ6L1x9XH0vfSx7YmVnaW46LyVcey8sZW5kOi9cfS99XX1dfSxvPWUuaW5oZXJpdChyLHt2YXJpYW50czpbe2JlZ2luOi8nLyxlbmQ6LycvfSx7YmVnaW46LyIvLGVuZDovIi99LHtiZWdpbjovW15ccyx7fVtcXV0rL31dfSksYT17Y2xhc3NOYW1lOiJudW1iZXIiLGJlZ2luOiJcXGJbMC05XXs0fSgtWzAtOV1bMC05XSl7MCwyfShbVHQgXFx0XVswLTldWzAtOV0/KDpbMC05XVswLTldKXsyfSk/KFxcLlswLTldKik/KFsgXFx0XSkqKFp8Wy0rXVswLTldWzAtOV0/KDpbMC05XVswLTldKT8pP1xcYiJ9LGk9e2VuZDoiLCIsZW5kc1dpdGhQYXJlbnQ6ITAsZXhjbHVkZUVuZDohMCxjb250YWluczpbXSxrZXl3b3Jkczp0LHJlbGV2YW5jZTowfSxzPXtiZWdpbjovXHsvLGVuZDovXH0vLGNvbnRhaW5zOltpXSxpbGxlZ2FsOiJcXG4iLHJlbGV2YW5jZTowfSx1PXtiZWdpbjoiXFxbIixlbmQ6IlxcXSIsY29udGFpbnM6W2ldLGlsbGVnYWw6IlxcbiIscmVsZXZhbmNlOjB9LGM9W3tjbGFzc05hbWU6ImF0dHIiLHZhcmlhbnRzOlt7YmVnaW46Ilxcd1tcXHcgOlxcLy4tXSo6KD89WyBcdF18JCkifSx7YmVnaW46JyJcXHdbXFx3IDpcXC8uLV0qIjooPz1bIFx0XXwkKSd9LHtiZWdpbjoiJ1xcd1tcXHcgOlxcLy4tXSonOig/PVsgXHRdfCQpIn1dfSx7Y2xhc3NOYW1lOiJtZXRhIixiZWdpbjoiXi0tLVxccyokIixyZWxldmFuY2U6MTB9LHtjbGFzc05hbWU6InN0cmluZyIsYmVnaW46IltcXHw+XShbMS05XT9bKy1dKT9bIF0qXFxuKCArKVteIF1bXlxcbl0qXFxuKFxcMlteXFxuXStcXG4/KSoifSx7YmVnaW46IjwlWyU9LV0/IixlbmQ6IlslLV0/JT4iLHN1Ykxhbmd1YWdlOiJydWJ5IixleGNsdWRlQmVnaW46ITAsZXhjbHVkZUVuZDohMCxyZWxldmFuY2U6MH0se2NsYXNzTmFtZToidHlwZSIsYmVnaW46IiFcXHcrISIrbn0se2NsYXNzTmFtZToidHlwZSIsYmVnaW46IiE8IituKyI+In0se2NsYXNzTmFtZToidHlwZSIsYmVnaW46IiEiK259LHtjbGFzc05hbWU6InR5cGUiLGJlZ2luOiIhISIrbn0se2NsYXNzTmFtZToibWV0YSIsYmVnaW46IiYiK2UuVU5ERVJTQ09SRV9JREVOVF9SRSsiJCJ9LHtjbGFzc05hbWU6Im1ldGEiLGJlZ2luOiJcXCoiK2UuVU5ERVJTQ09SRV9JREVOVF9SRSsiJCJ9LHtjbGFzc05hbWU6ImJ1bGxldCIsYmVnaW46Ii0oPz1bIF18JCkiLHJlbGV2YW5jZTowfSxlLkhBU0hfQ09NTUVOVF9NT0RFLHtiZWdpbktleXdvcmRzOnQsa2V5d29yZHM6e2xpdGVyYWw6dH19LGEse2NsYXNzTmFtZToibnVtYmVyIixiZWdpbjplLkNfTlVNQkVSX1JFKyJcXGIiLHJlbGV2YW5jZTowfSxzLHUscl0sbD1bLi4uY107cmV0dXJuIGwucG9wKCksbC5wdXNoKG8pLGkuY29udGFpbnM9bCx7bmFtZToiWUFNTCIsY2FzZV9pbnNlbnNpdGl2ZTohMCxhbGlhc2VzOlsieW1sIiwiWUFNTCJdLGNvbnRhaW5zOmN9fX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9IkhUVFAvWzAtOVxcLl0rIjtyZXR1cm57bmFtZToiSFRUUCIsYWxpYXNlczpbImh0dHBzIl0saWxsZWdhbDoiXFxTIixjb250YWluczpbe2JlZ2luOiJeIit0LGVuZDoiJCIsY29udGFpbnM6W3tjbGFzc05hbWU6Im51bWJlciIsYmVnaW46IlxcYlxcZHszfVxcYiJ9XX0se2JlZ2luOiJeW0EtWl0rICguKj8pICIrdCsiJCIscmV0dXJuQmVnaW46ITAsZW5kOiIkIixjb250YWluczpbe2NsYXNzTmFtZToic3RyaW5nIixiZWdpbjoiICIsZW5kOiIgIixleGNsdWRlQmVnaW46ITAsZXhjbHVkZUVuZDohMH0se2JlZ2luOnR9LHtjbGFzc05hbWU6ImtleXdvcmQiLGJlZ2luOiJbQS1aXSsifV19LHtjbGFzc05hbWU6ImF0dHJpYnV0ZSIsYmVnaW46Il5cXHciLGVuZDoiOiAiLGV4Y2x1ZGVFbmQ6ITAsaWxsZWdhbDoiXFxufFxcc3w9IixzdGFydHM6e2VuZDoiJCIscmVsZXZhbmNlOjB9fSx7YmVnaW46IlxcblxcbiIsc3RhcnRzOntzdWJMYW5ndWFnZTpbXSxlbmRzV2l0aFBhcmVudDohMH19XX19fSxmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oLi4uZSl7cmV0dXJuIGUubWFwKChlPT57cmV0dXJuKHQ9ZSk/InN0cmluZyI9PXR5cGVvZiB0P3Q6dC5zb3VyY2U6bnVsbDt2YXIgdH0pKS5qb2luKCIiKX1lLmV4cG9ydHM9ZnVuY3Rpb24oZSl7Y29uc3QgdD17fSxyPXtiZWdpbjovXCRcey8sZW5kOi9cfS8sY29udGFpbnM6WyJzZWxmIix7YmVnaW46LzotLyxjb250YWluczpbdF19XX07T2JqZWN0LmFzc2lnbih0LHtjbGFzc05hbWU6InZhcmlhYmxlIix2YXJpYW50czpbe2JlZ2luOm4oL1wkW1x3XGQjQF1bXHdcZF9dKi8sIig/IVtcXHdcXGRdKSg/IVskXSkiKX0scl19KTtjb25zdCBvPXtjbGFzc05hbWU6InN1YnN0IixiZWdpbjovXCRcKC8sZW5kOi9cKS8sY29udGFpbnM6W2UuQkFDS1NMQVNIX0VTQ0FQRV19LGE9e2JlZ2luOi88PC0/XHMqKD89XHcrKS8sc3RhcnRzOntjb250YWluczpbZS5FTkRfU0FNRV9BU19CRUdJTih7YmVnaW46LyhcdyspLyxlbmQ6LyhcdyspLyxjbGFzc05hbWU6InN0cmluZyJ9KV19fSxpPXtjbGFzc05hbWU6InN0cmluZyIsYmVnaW46LyIvLGVuZDovIi8sY29udGFpbnM6W2UuQkFDS1NMQVNIX0VTQ0FQRSx0LG9dfTtvLmNvbnRhaW5zLnB1c2goaSk7Y29uc3Qgcz17YmVnaW46L1wkXChcKC8sZW5kOi9cKVwpLyxjb250YWluczpbe2JlZ2luOi9cZCsjWzAtOWEtZl0rLyxjbGFzc05hbWU6Im51bWJlciJ9LGUuTlVNQkVSX01PREUsdF19LHU9ZS5TSEVCQU5HKHtiaW5hcnk6YCgke1siZmlzaCIsImJhc2giLCJ6c2giLCJzaCIsImNzaCIsImtzaCIsInRjc2giLCJkYXNoIiwic2NzaCJdLmpvaW4oInwiKX0pYCxyZWxldmFuY2U6MTB9KSxjPXtjbGFzc05hbWU6ImZ1bmN0aW9uIixiZWdpbjovXHdbXHdcZF9dKlxzKlwoXHMqXClccypcey8scmV0dXJuQmVnaW46ITAsY29udGFpbnM6W2UuaW5oZXJpdChlLlRJVExFX01PREUse2JlZ2luOi9cd1tcd1xkX10qL30pXSxyZWxldmFuY2U6MH07cmV0dXJue25hbWU6IkJhc2giLGFsaWFzZXM6WyJzaCIsInpzaCJdLGtleXdvcmRzOnskcGF0dGVybjovXGJbYS16Ll8tXStcYi8sa2V5d29yZDoiaWYgdGhlbiBlbHNlIGVsaWYgZmkgZm9yIHdoaWxlIGluIGRvIGRvbmUgY2FzZSBlc2FjIGZ1bmN0aW9uIixsaXRlcmFsOiJ0cnVlIGZhbHNlIixidWlsdF9pbjoiYnJlYWsgY2QgY29udGludWUgZXZhbCBleGVjIGV4aXQgZXhwb3J0IGdldG9wdHMgaGFzaCBwd2QgcmVhZG9ubHkgcmV0dXJuIHNoaWZ0IHRlc3QgdGltZXMgdHJhcCB1bWFzayB1bnNldCBhbGlhcyBiaW5kIGJ1aWx0aW4gY2FsbGVyIGNvbW1hbmQgZGVjbGFyZSBlY2hvIGVuYWJsZSBoZWxwIGxldCBsb2NhbCBsb2dvdXQgbWFwZmlsZSBwcmludGYgcmVhZCByZWFkYXJyYXkgc291cmNlIHR5cGUgdHlwZXNldCB1bGltaXQgdW5hbGlhcyBzZXQgc2hvcHQgYXV0b2xvYWQgYmcgYmluZGtleSBieWUgY2FwIGNoZGlyIGNsb25lIGNvbXBhcmd1bWVudHMgY29tcGNhbGwgY29tcGN0bCBjb21wZGVzY3JpYmUgY29tcGZpbGVzIGNvbXBncm91cHMgY29tcHF1b3RlIGNvbXB0YWdzIGNvbXB0cnkgY29tcHZhbHVlcyBkaXJzIGRpc2FibGUgZGlzb3duIGVjaG90YyBlY2hvdGkgZW11bGF0ZSBmYyBmZyBmbG9hdCBmdW5jdGlvbnMgZ2V0Y2FwIGdldGxuIGhpc3RvcnkgaW50ZWdlciBqb2JzIGtpbGwgbGltaXQgbG9nIG5vZ2xvYiBwb3BkIHByaW50IHB1c2hkIHB1c2hsbiByZWhhc2ggc2NoZWQgc2V0Y2FwIHNldG9wdCBzdGF0IHN1c3BlbmQgdHR5Y3RsIHVuZnVuY3Rpb24gdW5oYXNoIHVubGltaXQgdW5zZXRvcHQgdmFyZWQgd2FpdCB3aGVuY2Ugd2hlcmUgd2hpY2ggemNvbXBpbGUgemZvcm1hdCB6ZnRwIHpsZSB6bW9kbG9hZCB6cGFyc2VvcHRzIHpwcm9mIHpwdHkgenJlZ2V4cGFyc2UgenNvY2tldCB6c3R5bGUgenRjcCJ9LGNvbnRhaW5zOlt1LGUuU0hFQkFORygpLGMscyxlLkhBU0hfQ09NTUVOVF9NT0RFLGEsaSx7Y2xhc3NOYW1lOiIiLGJlZ2luOi9cXCIvfSx7Y2xhc3NOYW1lOiJzdHJpbmciLGJlZ2luOi8nLyxlbmQ6LycvfSx0XX19fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbihlKXtjb25zdCB0PXskcGF0dGVybjovLT9bQS16XC5cLV0rXGIvLGtleXdvcmQ6ImlmIGVsc2UgZm9yZWFjaCByZXR1cm4gZG8gd2hpbGUgdW50aWwgZWxzZWlmIGJlZ2luIGZvciB0cmFwIGRhdGEgZHluYW1pY3BhcmFtIGVuZCBicmVhayB0aHJvdyBwYXJhbSBjb250aW51ZSBmaW5hbGx5IGluIHN3aXRjaCBleGl0IGZpbHRlciB0cnkgcHJvY2VzcyBjYXRjaCBoaWRkZW4gc3RhdGljIHBhcmFtZXRlciIsYnVpbHRfaW46ImFjIGFzbnAgY2F0IGNkIENGUyBjaGRpciBjbGMgY2xlYXIgY2xoeSBjbGkgY2xwIGNscyBjbHYgY25zbiBjb21wYXJlIGNvcHkgY3AgY3BpIGNwcCBjdXJsIGN2cGEgZGJwIGRlbCBkaWZmIGRpciBkbnNuIGVicCBlY2hvfDAgZXBhbCBlcGNzdiBlcHNuIGVyYXNlIGV0c24gZXhzbiBmYyBmaHggZmwgZnQgZncgZ2FsIGdicCBnYyBnY2IgZ2NpIGdjbSBnY3MgZ2RyIGdlcnIgZ2h5IGdpIGdpbiBnamIgZ2wgZ20gZ21vIGdwIGdwcyBncHYgZ3JvdXAgZ3NuIGdzbnAgZ3N2IGd0eiBndSBndiBnd21pIGggaGlzdG9yeSBpY20gaWV4IGloeSBpaSBpcGFsIGlwY3N2IGlwbW8gaXBzbiBpcm0gaXNlIGl3bWkgaXdyIGtpbGwgbHAgbHMgbWFuIG1kIG1lYXN1cmUgbWkgbW91bnQgbW92ZSBtcCBtdiBuYWwgbmRyIG5pIG5tbyBucHNzYyBuc24gbnYgb2d2IG9oIHBvcGQgcHMgcHVzaGQgcHdkIHIgcmJwIHJjamIgcmNzbiByZCByZHIgcmVuIHJpIHJqYiBybSBybWRpciBybW8gcm5pIHJucCBycCByc24gcnNucCBydWpiIHJ2IHJ2cGEgcndtaSBzYWpiIHNhbCBzYXBzIHNhc3Ygc2JwIHNjIHNjYiBzZWxlY3Qgc2V0IHNoY20gc2kgc2wgc2xlZXAgc2xzIHNvcnQgc3Agc3BqYiBzcHBzIHNwc3Ygc3RhcnQgc3R6IHN1amIgc3Ygc3dtaSB0ZWUgdHJjbSB0eXBlIHdnZXQgd2hlcmUgd2piIHdyaXRlIn0sbj17YmVnaW46ImBbXFxzXFxTXSIscmVsZXZhbmNlOjB9LHI9e2NsYXNzTmFtZToidmFyaWFibGUiLHZhcmlhbnRzOlt7YmVnaW46L1wkXEIvfSx7Y2xhc3NOYW1lOiJrZXl3b3JkIixiZWdpbjovXCR0aGlzL30se2JlZ2luOi9cJFtcd1xkXVtcd1xkXzpdKi99XX0sbz17Y2xhc3NOYW1lOiJzdHJpbmciLHZhcmlhbnRzOlt7YmVnaW46LyIvLGVuZDovIi99LHtiZWdpbjovQCIvLGVuZDovXiJAL31dLGNvbnRhaW5zOltuLHIse2NsYXNzTmFtZToidmFyaWFibGUiLGJlZ2luOi9cJFtBLXpdLyxlbmQ6L1teQS16XS99XX0sYT17Y2xhc3NOYW1lOiJzdHJpbmciLHZhcmlhbnRzOlt7YmVnaW46LycvLGVuZDovJy99LHtiZWdpbjovQCcvLGVuZDovXidAL31dfSxpPWUuaW5oZXJpdChlLkNPTU1FTlQobnVsbCxudWxsKSx7dmFyaWFudHM6W3tiZWdpbjovIy8sZW5kOi8kL30se2JlZ2luOi88Iy8sZW5kOi8jPi99XSxjb250YWluczpbe2NsYXNzTmFtZToiZG9jdGFnIix2YXJpYW50czpbe2JlZ2luOi9cLihzeW5vcHNpc3xkZXNjcmlwdGlvbnxleGFtcGxlfGlucHV0c3xvdXRwdXRzfG5vdGVzfGxpbmt8Y29tcG9uZW50fHJvbGV8ZnVuY3Rpb25hbGl0eSkvfSx7YmVnaW46L1wuKHBhcmFtZXRlcnxmb3J3YXJkaGVscHRhcmdldG5hbWV8Zm9yd2FyZGhlbHBjYXRlZ29yeXxyZW1vdGVoZWxwcnVuc3BhY2V8ZXh0ZXJuYWxoZWxwKVxzK1xTKy99XX1dfSkscz17Y2xhc3NOYW1lOiJidWlsdF9pbiIsdmFyaWFudHM6W3tiZWdpbjoiKCIuY29uY2F0KCJBZGR8Q2xlYXJ8Q2xvc2V8Q29weXxFbnRlcnxFeGl0fEZpbmR8Rm9ybWF0fEdldHxIaWRlfEpvaW58TG9ja3xNb3ZlfE5ld3xPcGVufE9wdGltaXplfFBvcHxQdXNofFJlZG98UmVtb3ZlfFJlbmFtZXxSZXNldHxSZXNpemV8U2VhcmNofFNlbGVjdHxTZXR8U2hvd3xTa2lwfFNwbGl0fFN0ZXB8U3dpdGNofFVuZG98VW5sb2NrfFdhdGNofEJhY2t1cHxDaGVja3BvaW50fENvbXBhcmV8Q29tcHJlc3N8Q29udmVydHxDb252ZXJ0RnJvbXxDb252ZXJ0VG98RGlzbW91bnR8RWRpdHxFeHBhbmR8RXhwb3J0fEdyb3VwfEltcG9ydHxJbml0aWFsaXplfExpbWl0fE1lcmdlfE91dHxQdWJsaXNofFJlc3RvcmV8U2F2ZXxTeW5jfFVucHVibGlzaHxVcGRhdGV8QXBwcm92ZXxBc3NlcnR8Q29tcGxldGV8Q29uZmlybXxEZW55fERpc2FibGV8RW5hYmxlfEluc3RhbGx8SW52b2tlfFJlZ2lzdGVyfFJlcXVlc3R8UmVzdGFydHxSZXN1bWV8U3RhcnR8U3RvcHxTdWJtaXR8U3VzcGVuZHxVbmluc3RhbGx8VW5yZWdpc3RlcnxXYWl0fERlYnVnfE1lYXN1cmV8UGluZ3xSZXBhaXJ8UmVzb2x2ZXxUZXN0fFRyYWNlfENvbm5lY3R8RGlzY29ubmVjdHxSZWFkfFJlY2VpdmV8U2VuZHxXcml0ZXxCbG9ja3xHcmFudHxQcm90ZWN0fFJldm9rZXxVbmJsb2NrfFVucHJvdGVjdHxVc2V8Rm9yRWFjaHxTb3J0fFRlZXxXaGVyZSIsIikrKC0pW1xcd1xcZF0rIil9XX0sdT17Y2xhc3NOYW1lOiJjbGFzcyIsYmVnaW5LZXl3b3JkczoiY2xhc3MgZW51bSIsZW5kOi9ccypbe10vLGV4Y2x1ZGVFbmQ6ITAscmVsZXZhbmNlOjAsY29udGFpbnM6W2UuVElUTEVfTU9ERV19LGM9e2NsYXNzTmFtZToiZnVuY3Rpb24iLGJlZ2luOi9mdW5jdGlvblxzKy8sZW5kOi9ccypce3wkLyxleGNsdWRlRW5kOiEwLHJldHVybkJlZ2luOiEwLHJlbGV2YW5jZTowLGNvbnRhaW5zOlt7YmVnaW46ImZ1bmN0aW9uIixyZWxldmFuY2U6MCxjbGFzc05hbWU6ImtleXdvcmQifSx7Y2xhc3NOYW1lOiJ0aXRsZSIsYmVnaW46L1x3W1x3XGRdKigoLSlbXHdcZF0rKSovLHJlbGV2YW5jZTowfSx7YmVnaW46L1woLyxlbmQ6L1wpLyxjbGFzc05hbWU6InBhcmFtcyIscmVsZXZhbmNlOjAsY29udGFpbnM6W3JdfV19LGw9e2JlZ2luOi91c2luZ1xzLyxlbmQ6LyQvLHJldHVybkJlZ2luOiEwLGNvbnRhaW5zOltvLGEse2NsYXNzTmFtZToia2V5d29yZCIsYmVnaW46Lyh1c2luZ3xhc3NlbWJseXxjb21tYW5kfG1vZHVsZXxuYW1lc3BhY2V8dHlwZSkvfV19LHA9e3ZhcmlhbnRzOlt7Y2xhc3NOYW1lOiJvcGVyYXRvciIsYmVnaW46IigiLmNvbmNhdCgiLWFuZHwtYXN8LWJhbmR8LWJub3R8LWJvcnwtYnhvcnwtY2FzZXNlbnNpdGl2ZXwtY2NvbnRhaW5zfC1jZXF8LWNnZXwtY2d0fC1jbGV8LWNsaWtlfC1jbHR8LWNtYXRjaHwtY25lfC1jbm90Y29udGFpbnN8LWNub3RsaWtlfC1jbm90bWF0Y2h8LWNvbnRhaW5zfC1jcmVwbGFjZXwtY3NwbGl0fC1lcXwtZXhhY3R8LWZ8LWZpbGV8LWdlfC1ndHwtaWNvbnRhaW5zfC1pZXF8LWlnZXwtaWd0fC1pbGV8LWlsaWtlfC1pbHR8LWltYXRjaHwtaW58LWluZXwtaW5vdGNvbnRhaW5zfC1pbm90bGlrZXwtaW5vdG1hdGNofC1pcmVwbGFjZXwtaXN8LWlzbm90fC1pc3BsaXR8LWpvaW58LWxlfC1saWtlfC1sdHwtbWF0Y2h8LW5lfC1ub3R8LW5vdGNvbnRhaW5zfC1ub3Rpbnwtbm90bGlrZXwtbm90bWF0Y2h8LW9yfC1yZWdleHwtcmVwbGFjZXwtc2hsfC1zaHJ8LXNwbGl0fC13aWxkY2FyZHwteG9yIiwiKVxcYiIpfSx7Y2xhc3NOYW1lOiJsaXRlcmFsIixiZWdpbjovKC0pW1x3XGRdKy8scmVsZXZhbmNlOjB9XX0sZj17Y2xhc3NOYW1lOiJmdW5jdGlvbiIsYmVnaW46L1xbLipcXVxzKltcd10rWyBdPz9cKC8sZW5kOi8kLyxyZXR1cm5CZWdpbjohMCxyZWxldmFuY2U6MCxjb250YWluczpbe2NsYXNzTmFtZToia2V5d29yZCIsYmVnaW46IigiLmNvbmNhdCh0LmtleXdvcmQudG9TdHJpbmcoKS5yZXBsYWNlKC9ccy9nLCJ8IiksIilcXGIiKSxlbmRzUGFyZW50OiEwLHJlbGV2YW5jZTowfSxlLmluaGVyaXQoZS5USVRMRV9NT0RFLHtlbmRzUGFyZW50OiEwfSldfSxoPVtmLGksbixlLk5VTUJFUl9NT0RFLG8sYSxzLHIse2NsYXNzTmFtZToibGl0ZXJhbCIsYmVnaW46L1wkKG51bGx8dHJ1ZXxmYWxzZSlcYi99LHtjbGFzc05hbWU6InNlbGVjdG9yLXRhZyIsYmVnaW46L0BcQi8scmVsZXZhbmNlOjB9XSxkPXtiZWdpbjovXFsvLGVuZDovXF0vLGV4Y2x1ZGVCZWdpbjohMCxleGNsdWRlRW5kOiEwLHJlbGV2YW5jZTowLGNvbnRhaW5zOltdLmNvbmNhdCgic2VsZiIsaCx7YmVnaW46IigiK1sic3RyaW5nIiwiY2hhciIsImJ5dGUiLCJpbnQiLCJsb25nIiwiYm9vbCIsImRlY2ltYWwiLCJzaW5nbGUiLCJkb3VibGUiLCJEYXRlVGltZSIsInhtbCIsImFycmF5IiwiaGFzaHRhYmxlIiwidm9pZCJdLmpvaW4oInwiKSsiKSIsY2xhc3NOYW1lOiJidWlsdF9pbiIscmVsZXZhbmNlOjB9LHtjbGFzc05hbWU6InR5cGUiLGJlZ2luOi9bXC5cd1xkXSsvLHJlbGV2YW5jZTowfSl9O3JldHVybiBmLmNvbnRhaW5zLnVuc2hpZnQoZCkse25hbWU6IlBvd2VyU2hlbGwiLGFsaWFzZXM6WyJwcyIsInBzMSJdLGNhc2VfaW5zZW5zaXRpdmU6ITAsa2V5d29yZHM6dCxjb250YWluczpoLmNvbmNhdCh1LGMsbCxwLGQpfX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDQ4OSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiByKGUsNSl9fSxmdW5jdGlvbihlLHQpe3ZhciBuPWUuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHIoZSl9O2Z1bmN0aW9uIHIoZSl7dGhpcy52YWx1ZT1lfWZ1bmN0aW9uIG8oZSx0LG4pe3ZhciByPVtdLG89W10scz0hMDtyZXR1cm4gZnVuY3Rpb24gZShwKXt2YXIgZj1uP2EocCk6cCxoPXt9LGQ9ITAsbT17bm9kZTpmLG5vZGVfOnAscGF0aDpbXS5jb25jYXQocikscGFyZW50Om9bby5sZW5ndGgtMV0scGFyZW50czpvLGtleTpyLnNsaWNlKC0xKVswXSxpc1Jvb3Q6MD09PXIubGVuZ3RoLGxldmVsOnIubGVuZ3RoLGNpcmN1bGFyOm51bGwsdXBkYXRlOmZ1bmN0aW9uKGUsdCl7bS5pc1Jvb3R8fChtLnBhcmVudC5ub2RlW20ua2V5XT1lKSxtLm5vZGU9ZSx0JiYoZD0hMSl9LGRlbGV0ZTpmdW5jdGlvbihlKXtkZWxldGUgbS5wYXJlbnQubm9kZVttLmtleV0sZSYmKGQ9ITEpfSxyZW1vdmU6ZnVuY3Rpb24oZSl7dShtLnBhcmVudC5ub2RlKT9tLnBhcmVudC5ub2RlLnNwbGljZShtLmtleSwxKTpkZWxldGUgbS5wYXJlbnQubm9kZVttLmtleV0sZSYmKGQ9ITEpfSxrZXlzOm51bGwsYmVmb3JlOmZ1bmN0aW9uKGUpe2guYmVmb3JlPWV9LGFmdGVyOmZ1bmN0aW9uKGUpe2guYWZ0ZXI9ZX0scHJlOmZ1bmN0aW9uKGUpe2gucHJlPWV9LHBvc3Q6ZnVuY3Rpb24oZSl7aC5wb3N0PWV9LHN0b3A6ZnVuY3Rpb24oKXtzPSExfSxibG9jazpmdW5jdGlvbigpe2Q9ITF9fTtpZighcylyZXR1cm4gbTtmdW5jdGlvbiB2KCl7aWYoIm9iamVjdCI9PXR5cGVvZiBtLm5vZGUmJm51bGwhPT1tLm5vZGUpe20ua2V5cyYmbS5ub2RlXz09PW0ubm9kZXx8KG0ua2V5cz1pKG0ubm9kZSkpLG0uaXNMZWFmPTA9PW0ua2V5cy5sZW5ndGg7Zm9yKHZhciBlPTA7ZTxvLmxlbmd0aDtlKyspaWYob1tlXS5ub2RlXz09PXApe20uY2lyY3VsYXI9b1tlXTticmVha319ZWxzZSBtLmlzTGVhZj0hMCxtLmtleXM9bnVsbDttLm5vdExlYWY9IW0uaXNMZWFmLG0ubm90Um9vdD0hbS5pc1Jvb3R9digpO3ZhciBnPXQuY2FsbChtLG0ubm9kZSk7cmV0dXJuIHZvaWQgMCE9PWcmJm0udXBkYXRlJiZtLnVwZGF0ZShnKSxoLmJlZm9yZSYmaC5iZWZvcmUuY2FsbChtLG0ubm9kZSksZD8oIm9iamVjdCIhPXR5cGVvZiBtLm5vZGV8fG51bGw9PT1tLm5vZGV8fG0uY2lyY3VsYXJ8fChvLnB1c2gobSksdigpLGMobS5rZXlzLChmdW5jdGlvbih0LG8pe3IucHVzaCh0KSxoLnByZSYmaC5wcmUuY2FsbChtLG0ubm9kZVt0XSx0KTt2YXIgYT1lKG0ubm9kZVt0XSk7biYmbC5jYWxsKG0ubm9kZSx0KSYmKG0ubm9kZVt0XT1hLm5vZGUpLGEuaXNMYXN0PW89PW0ua2V5cy5sZW5ndGgtMSxhLmlzRmlyc3Q9MD09byxoLnBvc3QmJmgucG9zdC5jYWxsKG0sYSksci5wb3AoKX0pKSxvLnBvcCgpKSxoLmFmdGVyJiZoLmFmdGVyLmNhbGwobSxtLm5vZGUpLG0pOm19KGUpLm5vZGV9ZnVuY3Rpb24gYShlKXtpZigib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPT1lKXt2YXIgdDtpZih1KGUpKXQ9W107ZWxzZSBpZigiW29iamVjdCBEYXRlXSI9PT1zKGUpKXQ9bmV3IERhdGUoZS5nZXRUaW1lP2UuZ2V0VGltZSgpOmUpO2Vsc2UgaWYoZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgUmVnRXhwXSI9PT1zKGUpfShlKSl0PW5ldyBSZWdFeHAoZSk7ZWxzZSBpZihmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBFcnJvcl0iPT09cyhlKX0oZSkpdD17bWVzc2FnZTplLm1lc3NhZ2V9O2Vsc2UgaWYoZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgQm9vbGVhbl0iPT09cyhlKX0oZSkpdD1uZXcgQm9vbGVhbihlKTtlbHNlIGlmKGZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IE51bWJlcl0iPT09cyhlKX0oZSkpdD1uZXcgTnVtYmVyKGUpO2Vsc2UgaWYoZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgU3RyaW5nXSI9PT1zKGUpfShlKSl0PW5ldyBTdHJpbmcoZSk7ZWxzZSBpZihPYmplY3QuY3JlYXRlJiZPYmplY3QuZ2V0UHJvdG90eXBlT2YpdD1PYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZihlKSk7ZWxzZSBpZihlLmNvbnN0cnVjdG9yPT09T2JqZWN0KXQ9e307ZWxzZXt2YXIgbj1lLmNvbnN0cnVjdG9yJiZlLmNvbnN0cnVjdG9yLnByb3RvdHlwZXx8ZS5fX3Byb3RvX198fHt9LHI9ZnVuY3Rpb24oKXt9O3IucHJvdG90eXBlPW4sdD1uZXcgcn1yZXR1cm4gYyhpKGUpLChmdW5jdGlvbihuKXt0W25dPWVbbl19KSksdH1yZXR1cm4gZX1yLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMudmFsdWUsbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO2lmKCF0fHwhbC5jYWxsKHQscikpe3Q9dm9pZCAwO2JyZWFrfXQ9dFtyXX1yZXR1cm4gdH0sci5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLnZhbHVlLG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtpZighdHx8IWwuY2FsbCh0LHIpKXJldHVybiExO3Q9dFtyXX1yZXR1cm4hMH0sci5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXRoaXMudmFsdWUscj0wO3I8ZS5sZW5ndGgtMTtyKyspe3ZhciBvPWVbcl07bC5jYWxsKG4sbyl8fChuW29dPXt9KSxuPW5bb119cmV0dXJuIG5bZVtyXV09dCx0fSxyLnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24oZSl7cmV0dXJuIG8odGhpcy52YWx1ZSxlLCEwKX0sci5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy52YWx1ZT1vKHRoaXMudmFsdWUsZSwhMSksdGhpcy52YWx1ZX0sci5wcm90b3R5cGUucmVkdWNlPWZ1bmN0aW9uKGUsdCl7dmFyIG49MT09PWFyZ3VtZW50cy5sZW5ndGgscj1uP3RoaXMudmFsdWU6dDtyZXR1cm4gdGhpcy5mb3JFYWNoKChmdW5jdGlvbih0KXt0aGlzLmlzUm9vdCYmbnx8KHI9ZS5jYWxsKHRoaXMscix0KSl9KSkscn0sci5wcm90b3R5cGUucGF0aHM9ZnVuY3Rpb24oKXt2YXIgZT1bXTtyZXR1cm4gdGhpcy5mb3JFYWNoKChmdW5jdGlvbih0KXtlLnB1c2godGhpcy5wYXRoKX0pKSxlfSxyLnByb3RvdHlwZS5ub2Rlcz1mdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybiB0aGlzLmZvckVhY2goKGZ1bmN0aW9uKHQpe2UucHVzaCh0aGlzLm5vZGUpfSkpLGV9LHIucHJvdG90eXBlLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGU9W10sdD1bXTtyZXR1cm4gZnVuY3Rpb24gbihyKXtmb3IodmFyIG89MDtvPGUubGVuZ3RoO28rKylpZihlW29dPT09cilyZXR1cm4gdFtvXTtpZigib2JqZWN0Ij09dHlwZW9mIHImJm51bGwhPT1yKXt2YXIgcz1hKHIpO3JldHVybiBlLnB1c2gociksdC5wdXNoKHMpLGMoaShyKSwoZnVuY3Rpb24oZSl7c1tlXT1uKHJbZV0pfSkpLGUucG9wKCksdC5wb3AoKSxzfXJldHVybiByfSh0aGlzLnZhbHVlKX07dmFyIGk9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKGUpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiBlKXQucHVzaChuKTtyZXR1cm4gdH07ZnVuY3Rpb24gcyhlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfXZhciB1PUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9LGM9ZnVuY3Rpb24oZSx0KXtpZihlLmZvckVhY2gpcmV0dXJuIGUuZm9yRWFjaCh0KTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl0KGVbbl0sbixlKX07YyhpKHIucHJvdG90eXBlKSwoZnVuY3Rpb24oZSl7bltlXT1mdW5jdGlvbih0KXt2YXIgbj1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxvPW5ldyByKHQpO3JldHVybiBvW2VdLmFwcGx5KG8sbil9fSkpO3ZhciBsPU9iamVjdC5oYXNPd25Qcm9wZXJ0eXx8ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdCBpbiBlfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt0LnBhcnNlPWZ1bmN0aW9uKGUsdCl7aWYoInN0cmluZyIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoImFyZ3VtZW50IHN0ciBtdXN0IGJlIGEgc3RyaW5nIik7Zm9yKHZhciBuPXt9LG89dHx8e30saT1lLnNwbGl0KGEpLHU9by5kZWNvZGV8fHIsYz0wO2M8aS5sZW5ndGg7YysrKXt2YXIgbD1pW2NdLHA9bC5pbmRleE9mKCI9Iik7aWYoIShwPDApKXt2YXIgZj1sLnN1YnN0cigwLHApLnRyaW0oKSxoPWwuc3Vic3RyKCsrcCxsLmxlbmd0aCkudHJpbSgpOyciJz09aFswXSYmKGg9aC5zbGljZSgxLC0xKSksbnVsbD09bltmXSYmKG5bZl09cyhoLHUpKX19cmV0dXJuIG59LHQuc2VyaWFsaXplPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1ufHx7fSxhPXIuZW5jb2RlfHxvO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBhKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbiBlbmNvZGUgaXMgaW52YWxpZCIpO2lmKCFpLnRlc3QoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiYXJndW1lbnQgbmFtZSBpcyBpbnZhbGlkIik7dmFyIHM9YSh0KTtpZihzJiYhaS50ZXN0KHMpKXRocm93IG5ldyBUeXBlRXJyb3IoImFyZ3VtZW50IHZhbCBpcyBpbnZhbGlkIik7dmFyIHU9ZSsiPSIrcztpZihudWxsIT1yLm1heEFnZSl7dmFyIGM9ci5tYXhBZ2UtMDtpZihpc05hTihjKXx8IWlzRmluaXRlKGMpKXRocm93IG5ldyBUeXBlRXJyb3IoIm9wdGlvbiBtYXhBZ2UgaXMgaW52YWxpZCIpO3UrPSI7IE1heC1BZ2U9IitNYXRoLmZsb29yKGMpfWlmKHIuZG9tYWluKXtpZighaS50ZXN0KHIuZG9tYWluKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb24gZG9tYWluIGlzIGludmFsaWQiKTt1Kz0iOyBEb21haW49IityLmRvbWFpbn1pZihyLnBhdGgpe2lmKCFpLnRlc3Qoci5wYXRoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb24gcGF0aCBpcyBpbnZhbGlkIik7dSs9IjsgUGF0aD0iK3IucGF0aH1pZihyLmV4cGlyZXMpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiByLmV4cGlyZXMudG9VVENTdHJpbmcpdGhyb3cgbmV3IFR5cGVFcnJvcigib3B0aW9uIGV4cGlyZXMgaXMgaW52YWxpZCIpO3UrPSI7IEV4cGlyZXM9IityLmV4cGlyZXMudG9VVENTdHJpbmcoKX1yLmh0dHBPbmx5JiYodSs9IjsgSHR0cE9ubHkiKTtyLnNlY3VyZSYmKHUrPSI7IFNlY3VyZSIpO2lmKHIuc2FtZVNpdGUpe3N3aXRjaCgic3RyaW5nIj09dHlwZW9mIHIuc2FtZVNpdGU/ci5zYW1lU2l0ZS50b0xvd2VyQ2FzZSgpOnIuc2FtZVNpdGUpe2Nhc2UhMDp1Kz0iOyBTYW1lU2l0ZT1TdHJpY3QiO2JyZWFrO2Nhc2UibGF4Ijp1Kz0iOyBTYW1lU2l0ZT1MYXgiO2JyZWFrO2Nhc2Uic3RyaWN0Ijp1Kz0iOyBTYW1lU2l0ZT1TdHJpY3QiO2JyZWFrO2Nhc2Uibm9uZSI6dSs9IjsgU2FtZVNpdGU9Tm9uZSI7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb24gc2FtZVNpdGUgaXMgaW52YWxpZCIpfX1yZXR1cm4gdX07dmFyIHI9ZGVjb2RlVVJJQ29tcG9uZW50LG89ZW5jb2RlVVJJQ29tcG9uZW50LGE9LzsgKi8saT0vXltcdTAwMDlcdTAwMjAtXHUwMDdlXHUwMDgwLVx1MDBmZl0rJC87ZnVuY3Rpb24gcyhlLHQpe3RyeXtyZXR1cm4gdChlKX1jYXRjaCh0KXtyZXR1cm4gZX19fSxmdW5jdGlvbihlLHQsbil7dmFyIHIsbyxhO289W10scj1mdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgZT1mdW5jdGlvbihlKXtyZXR1cm4gZSYmImdldENvbXB1dGVkU3R5bGUiaW4gd2luZG93JiYic21vb3RoIj09PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpWyJzY3JvbGwtYmVoYXZpb3IiXX07aWYoInVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3d8fCEoImRvY3VtZW50ImluIHdpbmRvdykpcmV0dXJue307dmFyIHQ9ZnVuY3Rpb24odCxuLHIpe3ZhciBvO249bnx8OTk5LHJ8fDA9PT1yfHwocj05KTt2YXIgYT1mdW5jdGlvbihlKXtvPWV9LGk9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQobyksYSgwKX0scz1mdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5tYXgoMCx0LmdldFRvcE9mKGUpLXIpfSx1PWZ1bmN0aW9uKHIsbyxzKXtpZihpKCksMD09PW98fG8mJm88MHx8ZSh0LmJvZHkpKXQudG9ZKHIpLHMmJnMoKTtlbHNle3ZhciB1PXQuZ2V0WSgpLGM9TWF0aC5tYXgoMCxyKS11LGw9KG5ldyBEYXRlKS5nZXRUaW1lKCk7bz1vfHxNYXRoLm1pbihNYXRoLmFicyhjKSxuKSxmdW5jdGlvbiBlKCl7YShzZXRUaW1lb3V0KChmdW5jdGlvbigpe3ZhciBuPU1hdGgubWluKDEsKChuZXcgRGF0ZSkuZ2V0VGltZSgpLWwpL28pLHI9TWF0aC5tYXgoMCxNYXRoLmZsb29yKHUrYyoobjwuNT8yKm4qbjpuKig0LTIqbiktMSkpKTt0LnRvWShyKSxuPDEmJnQuZ2V0SGVpZ2h0KCkrcjx0LmJvZHkuc2Nyb2xsSGVpZ2h0P2UoKTooc2V0VGltZW91dChpLDk5KSxzJiZzKCkpfSksOSkpfSgpfX0sYz1mdW5jdGlvbihlLHQsbil7dShzKGUpLHQsbil9LGw9ZnVuY3Rpb24oZSxuLG8pe3ZhciBhPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0LGk9dC5nZXRUb3BPZihlKSthLGw9dC5nZXRIZWlnaHQoKSxwPXQuZ2V0WSgpLGY9cCtsO3MoZSk8cHx8YStyPmw/YyhlLG4sbyk6aStyPmY/dShpLWwrcixuLG8pOm8mJm8oKX0scD1mdW5jdGlvbihlLG4scixvKXt1KE1hdGgubWF4KDAsdC5nZXRUb3BPZihlKS10LmdldEhlaWdodCgpLzIrKHJ8fGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0LzIpKSxuLG8pfTtyZXR1cm57c2V0dXA6ZnVuY3Rpb24oZSx0KXtyZXR1cm4oMD09PWV8fGUpJiYobj1lKSwoMD09PXR8fHQpJiYocj10KSx7ZGVmYXVsdER1cmF0aW9uOm4sZWRnZU9mZnNldDpyfX0sdG86Yyx0b1k6dSxpbnRvVmlldzpsLGNlbnRlcjpwLHN0b3A6aSxtb3Zpbmc6ZnVuY3Rpb24oKXtyZXR1cm4hIW99LGdldFk6dC5nZXRZLGdldFRvcE9mOnQuZ2V0VG9wT2Z9fSxuPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxyPWZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5zY3JvbGxZfHxuLnNjcm9sbFRvcH0sbz10KHtib2R5OmRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnR8fGRvY3VtZW50LmJvZHksdG9ZOmZ1bmN0aW9uKGUpe3dpbmRvdy5zY3JvbGxUbygwLGUpfSxnZXRZOnIsZ2V0SGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5pbm5lckhlaWdodHx8bi5jbGllbnRIZWlnaHR9LGdldFRvcE9mOmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCtyKCktbi5vZmZzZXRUb3B9fSk7aWYoby5jcmVhdGVTY3JvbGxlcj1mdW5jdGlvbihlLHIsbyl7cmV0dXJuIHQoe2JvZHk6ZSx0b1k6ZnVuY3Rpb24odCl7ZS5zY3JvbGxUb3A9dH0sZ2V0WTpmdW5jdGlvbigpe3JldHVybiBlLnNjcm9sbFRvcH0sZ2V0SGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubWluKGUuY2xpZW50SGVpZ2h0LHdpbmRvdy5pbm5lckhlaWdodHx8bi5jbGllbnRIZWlnaHQpfSxnZXRUb3BPZjpmdW5jdGlvbihlKXtyZXR1cm4gZS5vZmZzZXRUb3B9fSxyLG8pfSwiYWRkRXZlbnRMaXN0ZW5lciJpbiB3aW5kb3cmJiF3aW5kb3cubm9aZW5zbW9vdGgmJiFlKGRvY3VtZW50LmJvZHkpKXt2YXIgYT0iaGlzdG9yeSJpbiB3aW5kb3cmJiJwdXNoU3RhdGUiaW4gaGlzdG9yeSxpPWEmJiJzY3JvbGxSZXN0b3JhdGlvbiJpbiBoaXN0b3J5O2kmJihoaXN0b3J5LnNjcm9sbFJlc3RvcmF0aW9uPSJhdXRvIiksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpe2kmJihzZXRUaW1lb3V0KChmdW5jdGlvbigpe2hpc3Rvcnkuc2Nyb2xsUmVzdG9yYXRpb249Im1hbnVhbCJ9KSw5KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicG9wc3RhdGUiLChmdW5jdGlvbihlKXtlLnN0YXRlJiYiemVuc2Nyb2xsWSJpbiBlLnN0YXRlJiZvLnRvWShlLnN0YXRlLnplbnNjcm9sbFkpfSksITEpKSx3aW5kb3cubG9jYXRpb24uaGFzaCYmc2V0VGltZW91dCgoZnVuY3Rpb24oKXt2YXIgZT1vLnNldHVwKCkuZWRnZU9mZnNldDtpZihlKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdCgiIyIpWzFdKTtpZih0KXt2YXIgbj1NYXRoLm1heCgwLG8uZ2V0VG9wT2YodCktZSkscj1vLmdldFkoKS1uOzA8PXImJnI8OSYmd2luZG93LnNjcm9sbFRvKDAsbil9fX0pLDkpfSksITEpO3ZhciBzPW5ldyBSZWdFeHAoIihefFxccylub1plbnNtb290aChcXHN8JCkiKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLChmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS50YXJnZXQ7dCYmIkEiIT09dC50YWdOYW1lOyl0PXQucGFyZW50Tm9kZTtpZighKCF0fHwxIT09ZS53aGljaHx8ZS5zaGlmdEtleXx8ZS5tZXRhS2V5fHxlLmN0cmxLZXl8fGUuYWx0S2V5KSl7aWYoaSl7dmFyIG49aGlzdG9yeS5zdGF0ZSYmIm9iamVjdCI9PXR5cGVvZiBoaXN0b3J5LnN0YXRlP2hpc3Rvcnkuc3RhdGU6e307bi56ZW5zY3JvbGxZPW8uZ2V0WSgpO3RyeXtoaXN0b3J5LnJlcGxhY2VTdGF0ZShuLCIiKX1jYXRjaChlKXt9fXZhciByPXQuZ2V0QXR0cmlidXRlKCJocmVmIil8fCIiO2lmKDA9PT1yLmluZGV4T2YoIiMiKSYmIXMudGVzdCh0LmNsYXNzTmFtZSkpe3ZhciB1PTAsYz1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChyLnN1YnN0cmluZygxKSk7aWYoIiMiIT09cil7aWYoIWMpcmV0dXJuO3U9by5nZXRUb3BPZihjKX1lLnByZXZlbnREZWZhdWx0KCk7dmFyIGw9ZnVuY3Rpb24oKXt3aW5kb3cubG9jYXRpb249cn0scD1vLnNldHVwKCkuZWRnZU9mZnNldDtwJiYodT1NYXRoLm1heCgwLHUtcCksYSYmKGw9ZnVuY3Rpb24oKXtoaXN0b3J5LnB1c2hTdGF0ZSh7fSwiIixyKX0pKSxvLnRvWSh1LG51bGwsbCl9fX0pLCExKX1yZXR1cm4gb30oKSx2b2lkIDA9PT0oYT0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yLmFwcGx5KHQsbyk6cil8fChlLmV4cG9ydHM9YSl9LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9bigxMDg3KX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89bmV3IEJsb2Iodm9pZCAwIT09cj9bcixlXTpbZV0se3R5cGU6bnx8ImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSJ9KTtpZih2b2lkIDAhPT13aW5kb3cubmF2aWdhdG9yLm1zU2F2ZUJsb2Ipd2luZG93Lm5hdmlnYXRvci5tc1NhdmVCbG9iKG8sdCk7ZWxzZXt2YXIgYT13aW5kb3cuVVJMJiZ3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTD93aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChvKTp3aW5kb3cud2Via2l0VVJMLmNyZWF0ZU9iamVjdFVSTChvKSxpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtpLnN0eWxlLmRpc3BsYXk9Im5vbmUiLGkuaHJlZj1hLGkuc2V0QXR0cmlidXRlKCJkb3dubG9hZCIsdCksdm9pZCAwPT09aS5kb3dubG9hZCYmaS5zZXRBdHRyaWJ1dGUoInRhcmdldCIsIl9ibGFuayIpLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaSksaS5jbGljaygpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChpKSx3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTChhKX0pLDIwMCl9fX0sZnVuY3Rpb24oZSx0LG4pe2UuZXhwb3J0cz1uKDEwOTYpfSxmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPW4oMTA5OSl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxMTA0KSxvPWZ1bmN0aW9uKGUpe3JldHVybi88XC8rW14+XSs+Ly50ZXN0KGUpfSxhPWZ1bmN0aW9uKGUpe3JldHVybi88W14+XStcLz4vLnRlc3QoZSl9O2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGUuc3BsaXQoLyg8XC8/W14+XSs+KS9nKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiIiIT09ZS50cmltKCl9KSkubWFwKChmdW5jdGlvbihlKXtyZXR1cm57dmFsdWU6ZSx0eXBlOnMoZSl9fSkpfWZ1bmN0aW9uIHMoZSl7cmV0dXJuIG8oZSk/IkNsb3NpbmdUYWciOmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4vPFtePiFdKz4vLnRlc3QoZSl9KGUpJiYhbyhlKSYmIWEoZSl9KGUpPyJPcGVuaW5nVGFnIjphKGUpPyJTZWxmQ2xvc2luZ1RhZyI6IlRleHQifWUuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e30sbj10LmluZGVudG9yLG89dC50ZXh0Tm9kZXNPblNhbWVMaW5lLGE9MCxzPVtdO249bnx8IiAgICAiO3ZhciB1PWkoZSkubWFwKChmdW5jdGlvbihlLHQsaSl7dmFyIHU9ZS52YWx1ZSxjPWUudHlwZTsiQ2xvc2luZ1RhZyI9PT1jJiZhLS07dmFyIGw9cihuLGEpLHA9bCt1O2lmKCJPcGVuaW5nVGFnIj09PWMmJmErKyxvKXt2YXIgZj1pW3QtMV0saD1pW3QtMl07IkNsb3NpbmdUYWciPT09YyYmIlRleHQiPT09Zi50eXBlJiYiT3BlbmluZ1RhZyI9PT1oLnR5cGUmJihwPSIiK2wraC52YWx1ZStmLnZhbHVlK3Uscy5wdXNoKHQtMix0LTEpKX1yZXR1cm4gcH0pKTtyZXR1cm4gcy5mb3JFYWNoKChmdW5jdGlvbihlKXtyZXR1cm4gdVtlXT1udWxsfSkpLHUuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4hIWV9KSkuam9pbigiXG4iKX19LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9bigxMTA4KX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNTM2KTtuKDU1Niksbig1NTcpLG4oNTU4KSxuKDU1OSksbig1NjApLG4oNTYxKSxuKDU2MiksZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXtuKDM1OSksbigxODIpLG4oMzYzKSxuKDU0MCksbig1NDEpLG4oNTQyKSxuKDU0MyksbigzNjgpLG4oNTQ0KSxuKDU0NSksbig1NDYpLG4oNTQ3KSxuKDU0OCksbig1NDkpLG4oNTUwKSxuKDU1MSksbig1NTIpLG4oNTUzKSxuKDU1NCksbig1NTUpO3ZhciByPW4oMzMpO2UuZXhwb3J0cz1yLlN5bWJvbH0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNDApLG89big2Nyk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dHJ5e28ocixlLHQpfWNhdGNoKG4pe3JbZV09dH1yZXR1cm4gdH19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDY2KSxvPW4oMjMyKS5mLGE9e30udG9TdHJpbmcsaT0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93JiZPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcz9PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpOltdO2UuZXhwb3J0cy5mPWZ1bmN0aW9uKGUpe3JldHVybiBpJiYiW29iamVjdCBXaW5kb3ddIj09YS5jYWxsKGUpP2Z1bmN0aW9uKGUpe3RyeXtyZXR1cm4gbyhlKX1jYXRjaChlKXtyZXR1cm4gaS5zbGljZSgpfX0oZSk6byhyKGUpKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyMzUpLG89big5OCk7ZS5leHBvcnRzPXI/e30udG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4iW29iamVjdCAiK28odGhpcykrIl0ifX0sZnVuY3Rpb24oZSx0LG4pe24oNDQpKCJhc3luY0l0ZXJhdG9yIil9LGZ1bmN0aW9uKGUsdCl7fSxmdW5jdGlvbihlLHQsbil7big0NCkoImhhc0luc3RhbmNlIil9LGZ1bmN0aW9uKGUsdCxuKXtuKDQ0KSgiaXNDb25jYXRTcHJlYWRhYmxlIil9LGZ1bmN0aW9uKGUsdCxuKXtuKDQ0KSgibWF0Y2giKX0sZnVuY3Rpb24oZSx0LG4pe24oNDQpKCJtYXRjaEFsbCIpfSxmdW5jdGlvbihlLHQsbil7big0NCkoInJlcGxhY2UiKX0sZnVuY3Rpb24oZSx0LG4pe24oNDQpKCJzZWFyY2giKX0sZnVuY3Rpb24oZSx0LG4pe24oNDQpKCJzcGVjaWVzIil9LGZ1bmN0aW9uKGUsdCxuKXtuKDQ0KSgic3BsaXQiKX0sZnVuY3Rpb24oZSx0LG4pe24oNDQpKCJ0b1ByaW1pdGl2ZSIpfSxmdW5jdGlvbihlLHQsbil7big0NCkoInRvU3RyaW5nVGFnIil9LGZ1bmN0aW9uKGUsdCxuKXtuKDQ0KSgidW5zY29wYWJsZXMiKX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNDApO24oOTcpKHIuSlNPTiwiSlNPTiIsITApfSxmdW5jdGlvbihlLHQpe30sZnVuY3Rpb24oZSx0KXt9LGZ1bmN0aW9uKGUsdCxuKXtuKDQ0KSgiYXN5bmNEaXNwb3NlIil9LGZ1bmN0aW9uKGUsdCxuKXtuKDQ0KSgiZGlzcG9zZSIpfSxmdW5jdGlvbihlLHQsbil7big0NCkoIm1hdGNoZXIiKX0sZnVuY3Rpb24oZSx0LG4pe24oNDQpKCJtZXRhZGF0YSIpfSxmdW5jdGlvbihlLHQsbil7big0NCkoIm9ic2VydmFibGUiKX0sZnVuY3Rpb24oZSx0LG4pe24oNDQpKCJwYXR0ZXJuTWF0Y2giKX0sZnVuY3Rpb24oZSx0LG4pe24oNDQpKCJyZXBsYWNlQWxsIil9LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9big1NjQpfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big1NjUpO2UuZXhwb3J0cz1yfSxmdW5jdGlvbihlLHQsbil7bigzNjgpLG4oMTMwKSxuKDg2KTt2YXIgcj1uKDIzNCk7ZS5leHBvcnRzPXIuZigiaXRlcmF0b3IiKX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNDcpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZighcihlKSYmbnVsbCE9PWUpdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBzZXQgIitTdHJpbmcoZSkrIiBhcyBhIHByb3RvdHlwZSIpO3JldHVybiBlfX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9e0NTU1J1bGVMaXN0OjAsQ1NTU3R5bGVEZWNsYXJhdGlvbjowLENTU1ZhbHVlTGlzdDowLENsaWVudFJlY3RMaXN0OjAsRE9NUmVjdExpc3Q6MCxET01TdHJpbmdMaXN0OjAsRE9NVG9rZW5MaXN0OjEsRGF0YVRyYW5zZmVySXRlbUxpc3Q6MCxGaWxlTGlzdDowLEhUTUxBbGxDb2xsZWN0aW9uOjAsSFRNTENvbGxlY3Rpb246MCxIVE1MRm9ybUVsZW1lbnQ6MCxIVE1MU2VsZWN0RWxlbWVudDowLE1lZGlhTGlzdDowLE1pbWVUeXBlQXJyYXk6MCxOYW1lZE5vZGVNYXA6MCxOb2RlTGlzdDoxLFBhaW50UmVxdWVzdExpc3Q6MCxQbHVnaW46MCxQbHVnaW5BcnJheTowLFNWR0xlbmd0aExpc3Q6MCxTVkdOdW1iZXJMaXN0OjAsU1ZHUGF0aFNlZ0xpc3Q6MCxTVkdQb2ludExpc3Q6MCxTVkdTdHJpbmdMaXN0OjAsU1ZHVHJhbnNmb3JtTGlzdDowLFNvdXJjZUJ1ZmZlckxpc3Q6MCxTdHlsZVNoZWV0TGlzdDowLFRleHRUcmFja0N1ZUxpc3Q6MCxUZXh0VHJhY2tMaXN0OjAsVG91Y2hMaXN0OjB9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big1NjkpO2UuZXhwb3J0cz1yfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big1NzApLG89QXJyYXkucHJvdG90eXBlO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1lLmNvbmNhdDtyZXR1cm4gZT09PW98fGUgaW5zdGFuY2VvZiBBcnJheSYmdD09PW8uY29uY2F0P3I6dH19LGZ1bmN0aW9uKGUsdCxuKXtuKDM1OSk7dmFyIHI9big0Mik7ZS5leHBvcnRzPXIoIkFycmF5IikuY29uY2F0fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigzNzMpO2UuZXhwb3J0cz1yfSxmdW5jdGlvbihlLHQsbil7big1NzMpO3ZhciByPW4oNDIpO2UuZXhwb3J0cz1yKCJBcnJheSIpLmZpbHRlcn0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDIyKSxvPW4oODUpLmZpbHRlcjtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6IW4oMTU1KSgiZmlsdGVyIil9LHtmaWx0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIG8odGhpcyxlLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMzc0KTtlLmV4cG9ydHM9cn0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMjIpLG89big2MiksYT1uKDE1Nik7cih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOm4oMzcpKChmdW5jdGlvbigpe2EoMSl9KSl9LHtrZXlzOmZ1bmN0aW9uKGUpe3JldHVybiBhKG8oZSkpfX0pfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big1NzcpO2UuZXhwb3J0cz1yfSxmdW5jdGlvbihlLHQsbil7big1NzgpO3ZhciByPW4oMzMpO3IuSlNPTnx8KHIuSlNPTj17c3RyaW5naWZ5OkpTT04uc3RyaW5naWZ5fSksZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gci5KU09OLnN0cmluZ2lmeS5hcHBseShudWxsLGFyZ3VtZW50cyl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigyMiksbz1uKDcwKSxhPW4oMzcpLGk9bygiSlNPTiIsInN0cmluZ2lmeSIpLHM9L1tcdUQ4MDAtXHVERkZGXS9nLHU9L15bXHVEODAwLVx1REJGRl0kLyxjPS9eW1x1REMwMC1cdURGRkZdJC8sbD1mdW5jdGlvbihlLHQsbil7dmFyIHI9bi5jaGFyQXQodC0xKSxvPW4uY2hhckF0KHQrMSk7cmV0dXJuIHUudGVzdChlKSYmIWMudGVzdChvKXx8Yy50ZXN0KGUpJiYhdS50ZXN0KHIpPyJcXHUiK2UuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNik6ZX0scD1hKChmdW5jdGlvbigpe3JldHVybiciXFx1ZGYwNlxcdWQ4MzQiJyE9PWkoIlx1ZGYwNlx1ZDgzNCIpfHwnIlxcdWRlYWQiJyE9PWkoIlx1ZGVhZCIpfSkpO2kmJnIoe3RhcmdldDoiSlNPTiIsc3RhdDohMCxmb3JjZWQ6cH0se3N0cmluZ2lmeTpmdW5jdGlvbihlLHQsbil7dmFyIHI9aS5hcHBseShudWxsLGFyZ3VtZW50cyk7cmV0dXJuInN0cmluZyI9PXR5cGVvZiByP3IucmVwbGFjZShzLGwpOnJ9fSl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dC5ieXRlTGVuZ3RoPWZ1bmN0aW9uKGUpe3ZhciB0PWMoZSksbj10WzBdLHI9dFsxXTtyZXR1cm4gMyoobityKS80LXJ9LHQudG9CeXRlQXJyYXk9ZnVuY3Rpb24oZSl7dmFyIHQsbixyPWMoZSksaT1yWzBdLHM9clsxXSx1PW5ldyBhKGZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gMyoodCtuKS80LW59KDAsaSxzKSksbD0wLHA9cz4wP2ktNDppO2ZvcihuPTA7bjxwO24rPTQpdD1vW2UuY2hhckNvZGVBdChuKV08PDE4fG9bZS5jaGFyQ29kZUF0KG4rMSldPDwxMnxvW2UuY2hhckNvZGVBdChuKzIpXTw8NnxvW2UuY2hhckNvZGVBdChuKzMpXSx1W2wrK109dD4+MTYmMjU1LHVbbCsrXT10Pj44JjI1NSx1W2wrK109MjU1JnQ7Mj09PXMmJih0PW9bZS5jaGFyQ29kZUF0KG4pXTw8MnxvW2UuY2hhckNvZGVBdChuKzEpXT4+NCx1W2wrK109MjU1JnQpOzE9PT1zJiYodD1vW2UuY2hhckNvZGVBdChuKV08PDEwfG9bZS5jaGFyQ29kZUF0KG4rMSldPDw0fG9bZS5jaGFyQ29kZUF0KG4rMildPj4yLHVbbCsrXT10Pj44JjI1NSx1W2wrK109MjU1JnQpO3JldHVybiB1fSx0LmZyb21CeXRlQXJyYXk9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49ZS5sZW5ndGgsbz1uJTMsYT1bXSxpPTE2MzgzLHM9MCx1PW4tbztzPHU7cys9aSlhLnB1c2gobChlLHMscytpPnU/dTpzK2kpKTsxPT09bz8odD1lW24tMV0sYS5wdXNoKHJbdD4+Ml0rclt0PDw0JjYzXSsiPT0iKSk6Mj09PW8mJih0PShlW24tMl08PDgpK2Vbbi0xXSxhLnB1c2goclt0Pj4xMF0rclt0Pj40JjYzXStyW3Q8PDImNjNdKyI9IikpO3JldHVybiBhLmpvaW4oIiIpfTtmb3IodmFyIHI9W10sbz1bXSxhPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheT9VaW50OEFycmF5OkFycmF5LGk9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLHM9MCx1PWkubGVuZ3RoO3M8dTsrK3MpcltzXT1pW3NdLG9baS5jaGFyQ29kZUF0KHMpXT1zO2Z1bmN0aW9uIGMoZSl7dmFyIHQ9ZS5sZW5ndGg7aWYodCU0PjApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0Iik7dmFyIG49ZS5pbmRleE9mKCI9Iik7cmV0dXJuLTE9PT1uJiYobj10KSxbbixuPT09dD8wOjQtbiU0XX1mdW5jdGlvbiBsKGUsdCxuKXtmb3IodmFyIG8sYSxpPVtdLHM9dDtzPG47cys9MylvPShlW3NdPDwxNiYxNjcxMTY4MCkrKGVbcysxXTw8OCY2NTI4MCkrKDI1NSZlW3MrMl0pLGkucHVzaChyWyhhPW8pPj4xOCY2M10rclthPj4xMiY2M10rclthPj42JjYzXStyWzYzJmFdKTtyZXR1cm4gaS5qb2luKCIiKX1vWyItIi5jaGFyQ29kZUF0KDApXT02MixvWyJfIi5jaGFyQ29kZUF0KDApXT02M30sZnVuY3Rpb24oZSx0KXt0LnJlYWQ9ZnVuY3Rpb24oZSx0LG4scixvKXt2YXIgYSxpLHM9OCpvLXItMSx1PSgxPDxzKS0xLGM9dT4+MSxsPS03LHA9bj9vLTE6MCxmPW4/LTE6MSxoPWVbdCtwXTtmb3IocCs9ZixhPWgmKDE8PC1sKS0xLGg+Pj0tbCxsKz1zO2w+MDthPTI1NiphK2VbdCtwXSxwKz1mLGwtPTgpO2ZvcihpPWEmKDE8PC1sKS0xLGE+Pj0tbCxsKz1yO2w+MDtpPTI1NippK2VbdCtwXSxwKz1mLGwtPTgpO2lmKDA9PT1hKWE9MS1jO2Vsc2V7aWYoYT09PXUpcmV0dXJuIGk/TmFOOjEvMCooaD8tMToxKTtpKz1NYXRoLnBvdygyLHIpLGEtPWN9cmV0dXJuKGg/LTE6MSkqaSpNYXRoLnBvdygyLGEtcil9LHQud3JpdGU9ZnVuY3Rpb24oZSx0LG4scixvLGEpe3ZhciBpLHMsdSxjPTgqYS1vLTEsbD0oMTw8YyktMSxwPWw+PjEsZj0yMz09PW8/TWF0aC5wb3coMiwtMjQpLU1hdGgucG93KDIsLTc3KTowLGg9cj8wOmEtMSxkPXI/MTotMSxtPXQ8MHx8MD09PXQmJjEvdDwwPzE6MDtmb3IodD1NYXRoLmFicyh0KSxpc05hTih0KXx8dD09PTEvMD8ocz1pc05hTih0KT8xOjAsaT1sKTooaT1NYXRoLmZsb29yKE1hdGgubG9nKHQpL01hdGguTE4yKSx0Kih1PU1hdGgucG93KDIsLWkpKTwxJiYoaS0tLHUqPTIpLCh0Kz1pK3A+PTE/Zi91OmYqTWF0aC5wb3coMiwxLXApKSp1Pj0yJiYoaSsrLHUvPTIpLGkrcD49bD8ocz0wLGk9bCk6aStwPj0xPyhzPSh0KnUtMSkqTWF0aC5wb3coMixvKSxpKz1wKToocz10Kk1hdGgucG93KDIscC0xKSpNYXRoLnBvdygyLG8pLGk9MCkpO28+PTg7ZVtuK2hdPTI1NSZzLGgrPWQscy89MjU2LG8tPTgpO2ZvcihpPWk8PG98cyxjKz1vO2M+MDtlW24raF09MjU1JmksaCs9ZCxpLz0yNTYsYy09OCk7ZVtuK2gtZF18PTEyOCptfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMzc2KTtlLmV4cG9ydHM9cn0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMjIpLG89big0OCk7cih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOiFvLHNoYW06IW99LHtkZWZpbmVQcm9wZXJ0eTpuKDY4KS5mfSl9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDU4NCk7ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDU4NSksbz1GdW5jdGlvbi5wcm90b3R5cGU7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PWUuYmluZDtyZXR1cm4gZT09PW98fGUgaW5zdGFuY2VvZiBGdW5jdGlvbiYmdD09PW8uYmluZD9yOnR9fSxmdW5jdGlvbihlLHQsbil7big1ODYpO3ZhciByPW4oNDIpO2UuZXhwb3J0cz1yKCJGdW5jdGlvbiIpLmJpbmR9LGZ1bmN0aW9uKGUsdCxuKXtuKDIyKSh7dGFyZ2V0OiJGdW5jdGlvbiIscHJvdG86ITB9LHtiaW5kOm4oMzc3KX0pfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigzNzgpO2UuZXhwb3J0cz1yfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigyMiksbz1uKDM3OSk7cih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOk9iamVjdC5hc3NpZ24hPT1vfSx7YXNzaWduOm99KX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMzgwKTtlLmV4cG9ydHM9cn0sZnVuY3Rpb24oZSx0LG4pe24oNTkxKTt2YXIgcj1uKDQyKTtlLmV4cG9ydHM9cigiQXJyYXkiKS5zbGljZX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDIyKSxvPW4oNDcpLGE9bigxNTMpLGk9bigyMzApLHM9big2OSksdT1uKDY2KSxjPW4oMTU0KSxsPW4oNDEpLHA9bigxNTUpKCJzbGljZSIpLGY9bCgic3BlY2llcyIpLGg9W10uc2xpY2UsZD1NYXRoLm1heDtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6IXB9LHtzbGljZTpmdW5jdGlvbihlLHQpe3ZhciBuLHIsbCxwPXUodGhpcyksbT1zKHAubGVuZ3RoKSx2PWkoZSxtKSxnPWkodm9pZCAwPT09dD9tOnQsbSk7aWYoYShwKSYmKCJmdW5jdGlvbiIhPXR5cGVvZihuPXAuY29uc3RydWN0b3IpfHxuIT09QXJyYXkmJiFhKG4ucHJvdG90eXBlKT9vKG4pJiZudWxsPT09KG49bltmXSkmJihuPXZvaWQgMCk6bj12b2lkIDAsbj09PUFycmF5fHx2b2lkIDA9PT1uKSlyZXR1cm4gaC5jYWxsKHAsdixnKTtmb3Iocj1uZXcodm9pZCAwPT09bj9BcnJheTpuKShkKGctdiwwKSksbD0wO3Y8Zzt2KyssbCsrKXYgaW4gcCYmYyhyLGwscFt2XSk7cmV0dXJuIHIubGVuZ3RoPWwscn19KX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMzgxKTtlLmV4cG9ydHM9cn0sZnVuY3Rpb24oZSx0LG4pe24oMjIpKHt0YXJnZXQ6IkFycmF5IixzdGF0OiEwfSx7aXNBcnJheTpuKDE1Myl9KX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNTk1KTtlLmV4cG9ydHM9cn0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNTk2KSxvPUFycmF5LnByb3RvdHlwZTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZWR1Y2U7cmV0dXJuIGU9PT1vfHxlIGluc3RhbmNlb2YgQXJyYXkmJnQ9PT1vLnJlZHVjZT9yOnR9fSxmdW5jdGlvbihlLHQsbil7big1OTcpO3ZhciByPW4oNDIpO2UuZXhwb3J0cz1yKCJBcnJheSIpLnJlZHVjZX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDIyKSxvPW4oNTk4KS5sZWZ0LGE9bigxMTMpLGk9bigxMjkpLHM9bigxODYpO3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDohYSgicmVkdWNlIil8fCFzJiZpPjc5JiZpPDgzfSx7cmVkdWNlOmZ1bmN0aW9uKGUpe3JldHVybiBvKHRoaXMsZSxhcmd1bWVudHMubGVuZ3RoLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNzYpLG89big2MiksYT1uKDE3OSksaT1uKDY5KSxzPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0LG4scyx1KXtyKG4pO3ZhciBjPW8odCksbD1hKGMpLHA9aShjLmxlbmd0aCksZj1lP3AtMTowLGg9ZT8tMToxO2lmKHM8Milmb3IoOzspe2lmKGYgaW4gbCl7dT1sW2ZdLGYrPWg7YnJlYWt9aWYoZis9aCxlP2Y8MDpwPD1mKXRocm93IFR5cGVFcnJvcigiUmVkdWNlIG9mIGVtcHR5IGFycmF5IHdpdGggbm8gaW5pdGlhbCB2YWx1ZSIpfWZvcig7ZT9mPj0wOnA+ZjtmKz1oKWYgaW4gbCYmKHU9bih1LGxbZl0sZixjKSk7cmV0dXJuIHV9fTtlLmV4cG9ydHM9e2xlZnQ6cyghMSkscmlnaHQ6cyghMCl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big2MDApO2UuZXhwb3J0cz1yfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big2MDEpLG89QXJyYXkucHJvdG90eXBlO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1lLm1hcDtyZXR1cm4gZT09PW98fGUgaW5zdGFuY2VvZiBBcnJheSYmdD09PW8ubWFwP3I6dH19LGZ1bmN0aW9uKGUsdCxuKXtuKDYwMik7dmFyIHI9big0Mik7ZS5leHBvcnRzPXIoIkFycmF5IikubWFwfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMjIpLG89big4NSkubWFwO3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDohbigxNTUpKCJtYXAiKX0se21hcDpmdW5jdGlvbihlKXtyZXR1cm4gbyh0aGlzLGUsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1mdW5jdGlvbigpe319LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9big2MDUpLG89bigxMzQpLGE9big3OCksaT1uKDYwNikscz1yLnR3b0FyZ3VtZW50UG9vbGVyLHU9ci5mb3VyQXJndW1lbnRQb29sZXIsYz0vXC8rL2c7ZnVuY3Rpb24gbChlKXtyZXR1cm4oIiIrZSkucmVwbGFjZShjLCIkJi8iKX1mdW5jdGlvbiBwKGUsdCl7dGhpcy5mdW5jPWUsdGhpcy5jb250ZXh0PXQsdGhpcy5jb3VudD0wfWZ1bmN0aW9uIGYoZSx0LG4pe3ZhciByPWUuZnVuYyxvPWUuY29udGV4dDtyLmNhbGwobyx0LGUuY291bnQrKyl9ZnVuY3Rpb24gaChlLHQsbixyKXt0aGlzLnJlc3VsdD1lLHRoaXMua2V5UHJlZml4PXQsdGhpcy5mdW5jPW4sdGhpcy5jb250ZXh0PXIsdGhpcy5jb3VudD0wfWZ1bmN0aW9uIGQoZSx0LG4pe3ZhciByPWUucmVzdWx0LGk9ZS5rZXlQcmVmaXgscz1lLmZ1bmMsdT1lLmNvbnRleHQsYz1zLmNhbGwodSx0LGUuY291bnQrKyk7QXJyYXkuaXNBcnJheShjKT9tKGMscixuLGEudGhhdFJldHVybnNBcmd1bWVudCk6bnVsbCE9YyYmKG8uaXNWYWxpZEVsZW1lbnQoYykmJihjPW8uY2xvbmVBbmRSZXBsYWNlS2V5KGMsaSsoIWMua2V5fHx0JiZ0LmtleT09PWMua2V5PyIiOmwoYy5rZXkpKyIvIikrbikpLHIucHVzaChjKSl9ZnVuY3Rpb24gbShlLHQsbixyLG8pe3ZhciBhPSIiO251bGwhPW4mJihhPWwobikrIi8iKTt2YXIgcz1oLmdldFBvb2xlZCh0LGEscixvKTtpKGUsZCxzKSxoLnJlbGVhc2Uocyl9ZnVuY3Rpb24gdihlLHQsbil7cmV0dXJuIG51bGx9cC5wcm90b3R5cGUuZGVzdHJ1Y3Rvcj1mdW5jdGlvbigpe3RoaXMuZnVuYz1udWxsLHRoaXMuY29udGV4dD1udWxsLHRoaXMuY291bnQ9MH0sci5hZGRQb29saW5nVG8ocCxzKSxoLnByb3RvdHlwZS5kZXN0cnVjdG9yPWZ1bmN0aW9uKCl7dGhpcy5yZXN1bHQ9bnVsbCx0aGlzLmtleVByZWZpeD1udWxsLHRoaXMuZnVuYz1udWxsLHRoaXMuY29udGV4dD1udWxsLHRoaXMuY291bnQ9MH0sci5hZGRQb29saW5nVG8oaCx1KTt2YXIgZz17Zm9yRWFjaDpmdW5jdGlvbihlLHQsbil7aWYobnVsbD09ZSlyZXR1cm4gZTt2YXIgcj1wLmdldFBvb2xlZCh0LG4pO2koZSxmLHIpLHAucmVsZWFzZShyKX0sbWFwOmZ1bmN0aW9uKGUsdCxuKXtpZihudWxsPT1lKXJldHVybiBlO3ZhciByPVtdO3JldHVybiBtKGUscixudWxsLHQsbikscn0sbWFwSW50b1dpdGhLZXlQcmVmaXhJbnRlcm5hbDptLGNvdW50OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGkoZSx2LG51bGwpfSx0b0FycmF5OmZ1bmN0aW9uKGUpe3ZhciB0PVtdO3JldHVybiBtKGUsdCxudWxsLGEudGhhdFJldHVybnNBcmd1bWVudCksdH19O2UuZXhwb3J0cz1nfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTU5KSxvPShuKDI1KSxmdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKHQuaW5zdGFuY2VQb29sLmxlbmd0aCl7dmFyIG49dC5pbnN0YW5jZVBvb2wucG9wKCk7cmV0dXJuIHQuY2FsbChuLGUpLG59cmV0dXJuIG5ldyB0KGUpfSksYT1mdW5jdGlvbihlKXt2YXIgdD10aGlzO2UgaW5zdGFuY2VvZiB0fHxyKCIyNSIpLGUuZGVzdHJ1Y3RvcigpLHQuaW5zdGFuY2VQb29sLmxlbmd0aDx0LnBvb2xTaXplJiZ0Lmluc3RhbmNlUG9vbC5wdXNoKGUpfSxpPW8scz17YWRkUG9vbGluZ1RvOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZTtyZXR1cm4gbi5pbnN0YW5jZVBvb2w9W10sbi5nZXRQb29sZWQ9dHx8aSxuLnBvb2xTaXplfHwobi5wb29sU2l6ZT0xMCksbi5yZWxlYXNlPWEsbn0sb25lQXJndW1lbnRQb29sZXI6byx0d29Bcmd1bWVudFBvb2xlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7aWYobi5pbnN0YW5jZVBvb2wubGVuZ3RoKXt2YXIgcj1uLmluc3RhbmNlUG9vbC5wb3AoKTtyZXR1cm4gbi5jYWxsKHIsZSx0KSxyfXJldHVybiBuZXcgbihlLHQpfSx0aHJlZUFyZ3VtZW50UG9vbGVyOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzO2lmKHIuaW5zdGFuY2VQb29sLmxlbmd0aCl7dmFyIG89ci5pbnN0YW5jZVBvb2wucG9wKCk7cmV0dXJuIHIuY2FsbChvLGUsdCxuKSxvfXJldHVybiBuZXcgcihlLHQsbil9LGZvdXJBcmd1bWVudFBvb2xlcjpmdW5jdGlvbihlLHQsbixyKXt2YXIgbz10aGlzO2lmKG8uaW5zdGFuY2VQb29sLmxlbmd0aCl7dmFyIGE9by5pbnN0YW5jZVBvb2wucG9wKCk7cmV0dXJuIG8uY2FsbChhLGUsdCxuLHIpLGF9cmV0dXJuIG5ldyBvKGUsdCxuLHIpfX07ZS5leHBvcnRzPXN9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNTkpLG89KG4oODcpLG4oMzg1KSksYT1uKDYwNyksaT0obigyNSksbig2MDgpKTtuKDM0KTtmdW5jdGlvbiBzKGUsdCl7cmV0dXJuIGUmJiJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9ZS5rZXk/aS5lc2NhcGUoZS5rZXkpOnQudG9TdHJpbmcoMzYpfWZ1bmN0aW9uIHUoZSx0LG4sYyl7dmFyIGwscD10eXBlb2YgZTtpZigidW5kZWZpbmVkIiE9PXAmJiJib29sZWFuIiE9PXB8fChlPW51bGwpLG51bGw9PT1lfHwic3RyaW5nIj09PXB8fCJudW1iZXIiPT09cHx8Im9iamVjdCI9PT1wJiZlLiQkdHlwZW9mPT09bylyZXR1cm4gbihjLGUsIiI9PT10PyIuIitzKGUsMCk6dCksMTt2YXIgZj0wLGg9IiI9PT10PyIuIjp0KyI6IjtpZihBcnJheS5pc0FycmF5KGUpKWZvcih2YXIgZD0wO2Q8ZS5sZW5ndGg7ZCsrKWYrPXUobD1lW2RdLGgrcyhsLGQpLG4sYyk7ZWxzZXt2YXIgbT1hKGUpO2lmKG0pe3ZhciB2LGc9bS5jYWxsKGUpO2lmKG0hPT1lLmVudHJpZXMpZm9yKHZhciB5PTA7ISh2PWcubmV4dCgpKS5kb25lOylmKz11KGw9di52YWx1ZSxoK3MobCx5KyspLG4sYyk7ZWxzZSBmb3IoOyEodj1nLm5leHQoKSkuZG9uZTspe3ZhciBiPXYudmFsdWU7YiYmKGYrPXUobD1iWzFdLGgraS5lc2NhcGUoYlswXSkrIjoiK3MobCwwKSxuLGMpKX19ZWxzZSBpZigib2JqZWN0Ij09PXApe3ZhciBfPVN0cmluZyhlKTtyKCIzMSIsIltvYmplY3QgT2JqZWN0XSI9PT1fPyJvYmplY3Qgd2l0aCBrZXlzIHsiK09iamVjdC5rZXlzKGUpLmpvaW4oIiwgIikrIn0iOl8sIiIpfX1yZXR1cm4gZn1lLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBudWxsPT1lPzA6dShlLCIiLHQsbil9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmKHImJmVbcl18fGVbIkBAaXRlcmF0b3IiXSk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQpcmV0dXJuIHR9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXtlc2NhcGU6ZnVuY3Rpb24oZSl7dmFyIHQ9eyI9IjoiPTAiLCI6IjoiPTIifTtyZXR1cm4iJCIrKCIiK2UpLnJlcGxhY2UoL1s9Ol0vZywoZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19KSl9LHVuZXNjYXBlOmZ1bmN0aW9uKGUpe3ZhciB0PXsiPTAiOiI9IiwiPTIiOiI6In07cmV0dXJuKCIiKygiLiI9PT1lWzBdJiYiJCI9PT1lWzFdP2Uuc3Vic3RyaW5nKDIpOmUuc3Vic3RyaW5nKDEpKSkucmVwbGFjZSgvKD0wfD0yKS9nLChmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pKX19O2UuZXhwb3J0cz1yfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTM0KS5jcmVhdGVGYWN0b3J5LG89e2E6cigiYSIpLGFiYnI6cigiYWJiciIpLGFkZHJlc3M6cigiYWRkcmVzcyIpLGFyZWE6cigiYXJlYSIpLGFydGljbGU6cigiYXJ0aWNsZSIpLGFzaWRlOnIoImFzaWRlIiksYXVkaW86cigiYXVkaW8iKSxiOnIoImIiKSxiYXNlOnIoImJhc2UiKSxiZGk6cigiYmRpIiksYmRvOnIoImJkbyIpLGJpZzpyKCJiaWciKSxibG9ja3F1b3RlOnIoImJsb2NrcXVvdGUiKSxib2R5OnIoImJvZHkiKSxicjpyKCJiciIpLGJ1dHRvbjpyKCJidXR0b24iKSxjYW52YXM6cigiY2FudmFzIiksY2FwdGlvbjpyKCJjYXB0aW9uIiksY2l0ZTpyKCJjaXRlIiksY29kZTpyKCJjb2RlIiksY29sOnIoImNvbCIpLGNvbGdyb3VwOnIoImNvbGdyb3VwIiksZGF0YTpyKCJkYXRhIiksZGF0YWxpc3Q6cigiZGF0YWxpc3QiKSxkZDpyKCJkZCIpLGRlbDpyKCJkZWwiKSxkZXRhaWxzOnIoImRldGFpbHMiKSxkZm46cigiZGZuIiksZGlhbG9nOnIoImRpYWxvZyIpLGRpdjpyKCJkaXYiKSxkbDpyKCJkbCIpLGR0OnIoImR0IiksZW06cigiZW0iKSxlbWJlZDpyKCJlbWJlZCIpLGZpZWxkc2V0OnIoImZpZWxkc2V0IiksZmlnY2FwdGlvbjpyKCJmaWdjYXB0aW9uIiksZmlndXJlOnIoImZpZ3VyZSIpLGZvb3RlcjpyKCJmb290ZXIiKSxmb3JtOnIoImZvcm0iKSxoMTpyKCJoMSIpLGgyOnIoImgyIiksaDM6cigiaDMiKSxoNDpyKCJoNCIpLGg1OnIoImg1IiksaDY6cigiaDYiKSxoZWFkOnIoImhlYWQiKSxoZWFkZXI6cigiaGVhZGVyIiksaGdyb3VwOnIoImhncm91cCIpLGhyOnIoImhyIiksaHRtbDpyKCJodG1sIiksaTpyKCJpIiksaWZyYW1lOnIoImlmcmFtZSIpLGltZzpyKCJpbWciKSxpbnB1dDpyKCJpbnB1dCIpLGluczpyKCJpbnMiKSxrYmQ6cigia2JkIiksa2V5Z2VuOnIoImtleWdlbiIpLGxhYmVsOnIoImxhYmVsIiksbGVnZW5kOnIoImxlZ2VuZCIpLGxpOnIoImxpIiksbGluazpyKCJsaW5rIiksbWFpbjpyKCJtYWluIiksbWFwOnIoIm1hcCIpLG1hcms6cigibWFyayIpLG1lbnU6cigibWVudSIpLG1lbnVpdGVtOnIoIm1lbnVpdGVtIiksbWV0YTpyKCJtZXRhIiksbWV0ZXI6cigibWV0ZXIiKSxuYXY6cigibmF2Iiksbm9zY3JpcHQ6cigibm9zY3JpcHQiKSxvYmplY3Q6cigib2JqZWN0Iiksb2w6cigib2wiKSxvcHRncm91cDpyKCJvcHRncm91cCIpLG9wdGlvbjpyKCJvcHRpb24iKSxvdXRwdXQ6cigib3V0cHV0IikscDpyKCJwIikscGFyYW06cigicGFyYW0iKSxwaWN0dXJlOnIoInBpY3R1cmUiKSxwcmU6cigicHJlIikscHJvZ3Jlc3M6cigicHJvZ3Jlc3MiKSxxOnIoInEiKSxycDpyKCJycCIpLHJ0OnIoInJ0IikscnVieTpyKCJydWJ5IiksczpyKCJzIiksc2FtcDpyKCJzYW1wIiksc2NyaXB0OnIoInNjcmlwdCIpLHNlY3Rpb246cigic2VjdGlvbiIpLHNlbGVjdDpyKCJzZWxlY3QiKSxzbWFsbDpyKCJzbWFsbCIpLHNvdXJjZTpyKCJzb3VyY2UiKSxzcGFuOnIoInNwYW4iKSxzdHJvbmc6cigic3Ryb25nIiksc3R5bGU6cigic3R5bGUiKSxzdWI6cigic3ViIiksc3VtbWFyeTpyKCJzdW1tYXJ5Iiksc3VwOnIoInN1cCIpLHRhYmxlOnIoInRhYmxlIiksdGJvZHk6cigidGJvZHkiKSx0ZDpyKCJ0ZCIpLHRleHRhcmVhOnIoInRleHRhcmVhIiksdGZvb3Q6cigidGZvb3QiKSx0aDpyKCJ0aCIpLHRoZWFkOnIoInRoZWFkIiksdGltZTpyKCJ0aW1lIiksdGl0bGU6cigidGl0bGUiKSx0cjpyKCJ0ciIpLHRyYWNrOnIoInRyYWNrIiksdTpyKCJ1IiksdWw6cigidWwiKSx2YXI6cigidmFyIiksdmlkZW86cigidmlkZW8iKSx3YnI6cigid2JyIiksY2lyY2xlOnIoImNpcmNsZSIpLGNsaXBQYXRoOnIoImNsaXBQYXRoIiksZGVmczpyKCJkZWZzIiksZWxsaXBzZTpyKCJlbGxpcHNlIiksZzpyKCJnIiksaW1hZ2U6cigiaW1hZ2UiKSxsaW5lOnIoImxpbmUiKSxsaW5lYXJHcmFkaWVudDpyKCJsaW5lYXJHcmFkaWVudCIpLG1hc2s6cigibWFzayIpLHBhdGg6cigicGF0aCIpLHBhdHRlcm46cigicGF0dGVybiIpLHBvbHlnb246cigicG9seWdvbiIpLHBvbHlsaW5lOnIoInBvbHlsaW5lIikscmFkaWFsR3JhZGllbnQ6cigicmFkaWFsR3JhZGllbnQiKSxyZWN0OnIoInJlY3QiKSxzdG9wOnIoInN0b3AiKSxzdmc6cigic3ZnIiksdGV4dDpyKCJ0ZXh0IiksdHNwYW46cigidHNwYW4iKX07ZS5leHBvcnRzPW99LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxMzQpLmlzVmFsaWRFbGVtZW50LG89bigzODYpO2UuZXhwb3J0cz1vKHIpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzg3KSxvPW4oMzgpLGE9bigzODgpLGk9big2MTMpLHM9RnVuY3Rpb24uY2FsbC5iaW5kKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO2Z1bmN0aW9uIHUoKXtyZXR1cm4gbnVsbH1lLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3I7dmFyIGM9Ijw8YW5vbnltb3VzPj4iLGw9e2FycmF5OmQoImFycmF5IiksYm9vbDpkKCJib29sZWFuIiksZnVuYzpkKCJmdW5jdGlvbiIpLG51bWJlcjpkKCJudW1iZXIiKSxvYmplY3Q6ZCgib2JqZWN0Iiksc3RyaW5nOmQoInN0cmluZyIpLHN5bWJvbDpkKCJzeW1ib2wiKSxhbnk6aCh1KSxhcnJheU9mOmZ1bmN0aW9uKGUpe3JldHVybiBoKChmdW5jdGlvbih0LG4scixvLGkpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXJldHVybiBuZXcgZigiUHJvcGVydHkgYCIraSsiYCBvZiBjb21wb25lbnQgYCIrcisiYCBoYXMgaW52YWxpZCBQcm9wVHlwZSBub3RhdGlvbiBpbnNpZGUgYXJyYXlPZi4iKTt2YXIgcz10W25dO2lmKCFBcnJheS5pc0FycmF5KHMpKXJldHVybiBuZXcgZigiSW52YWxpZCAiK28rIiBgIitpKyJgIG9mIHR5cGUgYCIrdihzKSsiYCBzdXBwbGllZCB0byBgIityKyJgLCBleHBlY3RlZCBhbiBhcnJheS4iKTtmb3IodmFyIHU9MDt1PHMubGVuZ3RoO3UrKyl7dmFyIGM9ZShzLHUscixvLGkrIlsiK3UrIl0iLGEpO2lmKGMgaW5zdGFuY2VvZiBFcnJvcilyZXR1cm4gY31yZXR1cm4gbnVsbH0pKX0sZWxlbWVudDpoKChmdW5jdGlvbih0LG4scixvLGEpe3ZhciBpPXRbbl07cmV0dXJuIGUoaSk/bnVsbDpuZXcgZigiSW52YWxpZCAiK28rIiBgIithKyJgIG9mIHR5cGUgYCIrdihpKSsiYCBzdXBwbGllZCB0byBgIityKyJgLCBleHBlY3RlZCBhIHNpbmdsZSBSZWFjdEVsZW1lbnQuIil9KSksZWxlbWVudFR5cGU6aCgoZnVuY3Rpb24oZSx0LG4sbyxhKXt2YXIgaT1lW3RdO3JldHVybiByLmlzVmFsaWRFbGVtZW50VHlwZShpKT9udWxsOm5ldyBmKCJJbnZhbGlkICIrbysiIGAiK2ErImAgb2YgdHlwZSBgIit2KGkpKyJgIHN1cHBsaWVkIHRvIGAiK24rImAsIGV4cGVjdGVkIGEgc2luZ2xlIFJlYWN0RWxlbWVudCB0eXBlLiIpfSkpLGluc3RhbmNlT2Y6ZnVuY3Rpb24oZSl7cmV0dXJuIGgoKGZ1bmN0aW9uKHQsbixyLG8sYSl7aWYoISh0W25daW5zdGFuY2VvZiBlKSl7dmFyIGk9ZS5uYW1lfHxjO3JldHVybiBuZXcgZigiSW52YWxpZCAiK28rIiBgIithKyJgIG9mIHR5cGUgYCIrKCgocz10W25dKS5jb25zdHJ1Y3RvciYmcy5jb25zdHJ1Y3Rvci5uYW1lP3MuY29uc3RydWN0b3IubmFtZTpjKSsiYCBzdXBwbGllZCB0byBgIikrcisiYCwgZXhwZWN0ZWQgaW5zdGFuY2Ugb2YgYCIraSsiYC4iKX12YXIgcztyZXR1cm4gbnVsbH0pKX0sbm9kZTpoKChmdW5jdGlvbihlLHQsbixyLG8pe3JldHVybiBtKGVbdF0pP251bGw6bmV3IGYoIkludmFsaWQgIityKyIgYCIrbysiYCBzdXBwbGllZCB0byBgIituKyJgLCBleHBlY3RlZCBhIFJlYWN0Tm9kZS4iKX0pKSxvYmplY3RPZjpmdW5jdGlvbihlKXtyZXR1cm4gaCgoZnVuY3Rpb24odCxuLHIsbyxpKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSlyZXR1cm4gbmV3IGYoIlByb3BlcnR5IGAiK2krImAgb2YgY29tcG9uZW50IGAiK3IrImAgaGFzIGludmFsaWQgUHJvcFR5cGUgbm90YXRpb24gaW5zaWRlIG9iamVjdE9mLiIpO3ZhciB1PXRbbl0sYz12KHUpO2lmKCJvYmplY3QiIT09YylyZXR1cm4gbmV3IGYoIkludmFsaWQgIitvKyIgYCIraSsiYCBvZiB0eXBlIGAiK2MrImAgc3VwcGxpZWQgdG8gYCIrcisiYCwgZXhwZWN0ZWQgYW4gb2JqZWN0LiIpO2Zvcih2YXIgbCBpbiB1KWlmKHModSxsKSl7dmFyIHA9ZSh1LGwscixvLGkrIi4iK2wsYSk7aWYocCBpbnN0YW5jZW9mIEVycm9yKXJldHVybiBwfXJldHVybiBudWxsfSkpfSxvbmVPZjpmdW5jdGlvbihlKXtpZighQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gdTtyZXR1cm4gaCgoZnVuY3Rpb24odCxuLHIsbyxhKXtmb3IodmFyIGk9dFtuXSxzPTA7czxlLmxlbmd0aDtzKyspaWYocChpLGVbc10pKXJldHVybiBudWxsO3ZhciB1PUpTT04uc3RyaW5naWZ5KGUsKGZ1bmN0aW9uKGUsdCl7cmV0dXJuInN5bWJvbCI9PT1nKHQpP1N0cmluZyh0KTp0fSkpO3JldHVybiBuZXcgZigiSW52YWxpZCAiK28rIiBgIithKyJgIG9mIHZhbHVlIGAiK1N0cmluZyhpKSsiYCBzdXBwbGllZCB0byBgIityKyJgLCBleHBlY3RlZCBvbmUgb2YgIit1KyIuIil9KSl9LG9uZU9mVHlwZTpmdW5jdGlvbihlKXtpZighQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gdTtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyl7dmFyIG49ZVt0XTtpZigiZnVuY3Rpb24iIT10eXBlb2YgbilyZXR1cm4geShuKSx1fXJldHVybiBoKChmdW5jdGlvbih0LG4scixvLGkpe2Zvcih2YXIgcz0wO3M8ZS5sZW5ndGg7cysrKWlmKG51bGw9PSgwLGVbc10pKHQsbixyLG8saSxhKSlyZXR1cm4gbnVsbDtyZXR1cm4gbmV3IGYoIkludmFsaWQgIitvKyIgYCIraSsiYCBzdXBwbGllZCB0byBgIityKyJgLiIpfSkpfSxzaGFwZTpmdW5jdGlvbihlKXtyZXR1cm4gaCgoZnVuY3Rpb24odCxuLHIsbyxpKXt2YXIgcz10W25dLHU9dihzKTtpZigib2JqZWN0IiE9PXUpcmV0dXJuIG5ldyBmKCJJbnZhbGlkICIrbysiIGAiK2krImAgb2YgdHlwZSBgIit1KyJgIHN1cHBsaWVkIHRvIGAiK3IrImAsIGV4cGVjdGVkIGBvYmplY3RgLiIpO2Zvcih2YXIgYyBpbiBlKXt2YXIgbD1lW2NdO2lmKGwpe3ZhciBwPWwocyxjLHIsbyxpKyIuIitjLGEpO2lmKHApcmV0dXJuIHB9fXJldHVybiBudWxsfSkpfSxleGFjdDpmdW5jdGlvbihlKXtyZXR1cm4gaCgoZnVuY3Rpb24odCxuLHIsaSxzKXt2YXIgdT10W25dLGM9dih1KTtpZigib2JqZWN0IiE9PWMpcmV0dXJuIG5ldyBmKCJJbnZhbGlkICIraSsiIGAiK3MrImAgb2YgdHlwZSBgIitjKyJgIHN1cHBsaWVkIHRvIGAiK3IrImAsIGV4cGVjdGVkIGBvYmplY3RgLiIpO3ZhciBsPW8oe30sdFtuXSxlKTtmb3IodmFyIHAgaW4gbCl7dmFyIGg9ZVtwXTtpZighaClyZXR1cm4gbmV3IGYoIkludmFsaWQgIitpKyIgYCIrcysiYCBrZXkgYCIrcCsiYCBzdXBwbGllZCB0byBgIityKyJgLlxuQmFkIG9iamVjdDogIitKU09OLnN0cmluZ2lmeSh0W25dLG51bGwsIiAgIikrIlxuVmFsaWQga2V5czogIitKU09OLnN0cmluZ2lmeShPYmplY3Qua2V5cyhlKSxudWxsLCIgICIpKTt2YXIgZD1oKHUscCxyLGkscysiLiIrcCxhKTtpZihkKXJldHVybiBkfXJldHVybiBudWxsfSkpfX07ZnVuY3Rpb24gcChlLHQpe3JldHVybiBlPT09dD8wIT09ZXx8MS9lPT0xL3Q6ZSE9ZSYmdCE9dH1mdW5jdGlvbiBmKGUpe3RoaXMubWVzc2FnZT1lLHRoaXMuc3RhY2s9IiJ9ZnVuY3Rpb24gaChlKXtmdW5jdGlvbiBuKG4scixvLGkscyx1LGwpe2lmKChpPWl8fGMsdT11fHxvLGwhPT1hKSYmdCl7dmFyIHA9bmV3IEVycm9yKCJDYWxsaW5nIFByb3BUeXBlcyB2YWxpZGF0b3JzIGRpcmVjdGx5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiBVc2UgYFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcygpYCB0byBjYWxsIHRoZW0uIFJlYWQgbW9yZSBhdCBodHRwOi8vZmIubWUvdXNlLWNoZWNrLXByb3AtdHlwZXMiKTt0aHJvdyBwLm5hbWU9IkludmFyaWFudCBWaW9sYXRpb24iLHB9cmV0dXJuIG51bGw9PXJbb10/bj9udWxsPT09cltvXT9uZXcgZigiVGhlICIrcysiIGAiK3UrImAgaXMgbWFya2VkIGFzIHJlcXVpcmVkIGluIGAiK2krImAsIGJ1dCBpdHMgdmFsdWUgaXMgYG51bGxgLiIpOm5ldyBmKCJUaGUgIitzKyIgYCIrdSsiYCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQgaW4gYCIraSsiYCwgYnV0IGl0cyB2YWx1ZSBpcyBgdW5kZWZpbmVkYC4iKTpudWxsOmUocixvLGkscyx1KX12YXIgcj1uLmJpbmQobnVsbCwhMSk7cmV0dXJuIHIuaXNSZXF1aXJlZD1uLmJpbmQobnVsbCwhMCkscn1mdW5jdGlvbiBkKGUpe3JldHVybiBoKChmdW5jdGlvbih0LG4scixvLGEsaSl7dmFyIHM9dFtuXTtyZXR1cm4gdihzKSE9PWU/bmV3IGYoIkludmFsaWQgIitvKyIgYCIrYSsiYCBvZiB0eXBlIGAiK2cocykrImAgc3VwcGxpZWQgdG8gYCIrcisiYCwgZXhwZWN0ZWQgYCIrZSsiYC4iKTpudWxsfSkpfWZ1bmN0aW9uIG0odCl7c3dpdGNoKHR5cGVvZiB0KXtjYXNlIm51bWJlciI6Y2FzZSJzdHJpbmciOmNhc2UidW5kZWZpbmVkIjpyZXR1cm4hMDtjYXNlImJvb2xlYW4iOnJldHVybiF0O2Nhc2Uib2JqZWN0IjppZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0LmV2ZXJ5KG0pO2lmKG51bGw9PT10fHxlKHQpKXJldHVybiEwO3ZhciByPWZ1bmN0aW9uKGUpe3ZhciB0PWUmJihuJiZlW25dfHxlWyJAQGl0ZXJhdG9yIl0pO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0KXJldHVybiB0fSh0KTtpZighcilyZXR1cm4hMTt2YXIgbyxhPXIuY2FsbCh0KTtpZihyIT09dC5lbnRyaWVzKXtmb3IoOyEobz1hLm5leHQoKSkuZG9uZTspaWYoIW0oby52YWx1ZSkpcmV0dXJuITF9ZWxzZSBmb3IoOyEobz1hLm5leHQoKSkuZG9uZTspe3ZhciBpPW8udmFsdWU7aWYoaSYmIW0oaVsxXSkpcmV0dXJuITF9cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gdihlKXt2YXIgdD10eXBlb2YgZTtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT8iYXJyYXkiOmUgaW5zdGFuY2VvZiBSZWdFeHA/Im9iamVjdCI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4ic3ltYm9sIj09PWV8fCEhdCYmKCJTeW1ib2wiPT09dFsiQEB0b1N0cmluZ1RhZyJdfHwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0IGluc3RhbmNlb2YgU3ltYm9sKX0odCxlKT8ic3ltYm9sIjp0fWZ1bmN0aW9uIGcoZSl7aWYobnVsbD09ZSlyZXR1cm4iIitlO3ZhciB0PXYoZSk7aWYoIm9iamVjdCI9PT10KXtpZihlIGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4iZGF0ZSI7aWYoZSBpbnN0YW5jZW9mIFJlZ0V4cClyZXR1cm4icmVnZXhwIn1yZXR1cm4gdH1mdW5jdGlvbiB5KGUpe3ZhciB0PWcoZSk7c3dpdGNoKHQpe2Nhc2UiYXJyYXkiOmNhc2Uib2JqZWN0IjpyZXR1cm4iYW4gIit0O2Nhc2UiYm9vbGVhbiI6Y2FzZSJkYXRlIjpjYXNlInJlZ2V4cCI6cmV0dXJuImEgIit0O2RlZmF1bHQ6cmV0dXJuIHR9fXJldHVybiBmLnByb3RvdHlwZT1FcnJvci5wcm90b3R5cGUsbC5jaGVja1Byb3BUeXBlcz1pLGwucmVzZXRXYXJuaW5nQ2FjaGU9aS5yZXNldFdhcm5pbmdDYWNoZSxsLlByb3BUeXBlcz1sLGx9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuZm9yLG89cj9TeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50Iik6NjAxMDMsYT1yP1N5bWJvbC5mb3IoInJlYWN0LnBvcnRhbCIpOjYwMTA2LGk9cj9TeW1ib2wuZm9yKCJyZWFjdC5mcmFnbWVudCIpOjYwMTA3LHM9cj9TeW1ib2wuZm9yKCJyZWFjdC5zdHJpY3RfbW9kZSIpOjYwMTA4LHU9cj9TeW1ib2wuZm9yKCJyZWFjdC5wcm9maWxlciIpOjYwMTE0LGM9cj9TeW1ib2wuZm9yKCJyZWFjdC5wcm92aWRlciIpOjYwMTA5LGw9cj9TeW1ib2wuZm9yKCJyZWFjdC5jb250ZXh0Iik6NjAxMTAscD1yP1N5bWJvbC5mb3IoInJlYWN0LmFzeW5jX21vZGUiKTo2MDExMSxmPXI/U3ltYm9sLmZvcigicmVhY3QuY29uY3VycmVudF9tb2RlIik6NjAxMTEsaD1yP1N5bWJvbC5mb3IoInJlYWN0LmZvcndhcmRfcmVmIik6NjAxMTIsZD1yP1N5bWJvbC5mb3IoInJlYWN0LnN1c3BlbnNlIik6NjAxMTMsbT1yP1N5bWJvbC5mb3IoInJlYWN0Lm1lbW8iKTo2MDExNSx2PXI/U3ltYm9sLmZvcigicmVhY3QubGF6eSIpOjYwMTE2O2Z1bmN0aW9uIGcoZSl7aWYoIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT09ZSl7dmFyIHQ9ZS4kJHR5cGVvZjtzd2l0Y2godCl7Y2FzZSBvOnN3aXRjaChlPWUudHlwZSl7Y2FzZSBwOmNhc2UgZjpjYXNlIGk6Y2FzZSB1OmNhc2UgczpjYXNlIGQ6cmV0dXJuIGU7ZGVmYXVsdDpzd2l0Y2goZT1lJiZlLiQkdHlwZW9mKXtjYXNlIGw6Y2FzZSBoOmNhc2UgYzpyZXR1cm4gZTtkZWZhdWx0OnJldHVybiB0fX1jYXNlIHY6Y2FzZSBtOmNhc2UgYTpyZXR1cm4gdH19fWZ1bmN0aW9uIHkoZSl7cmV0dXJuIGcoZSk9PT1mfXQudHlwZU9mPWcsdC5Bc3luY01vZGU9cCx0LkNvbmN1cnJlbnRNb2RlPWYsdC5Db250ZXh0Q29uc3VtZXI9bCx0LkNvbnRleHRQcm92aWRlcj1jLHQuRWxlbWVudD1vLHQuRm9yd2FyZFJlZj1oLHQuRnJhZ21lbnQ9aSx0Lkxhenk9dix0Lk1lbW89bSx0LlBvcnRhbD1hLHQuUHJvZmlsZXI9dSx0LlN0cmljdE1vZGU9cyx0LlN1c3BlbnNlPWQsdC5pc1ZhbGlkRWxlbWVudFR5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZXx8ZT09PWl8fGU9PT1mfHxlPT09dXx8ZT09PXN8fGU9PT1kfHwib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPT1lJiYoZS4kJHR5cGVvZj09PXZ8fGUuJCR0eXBlb2Y9PT1tfHxlLiQkdHlwZW9mPT09Y3x8ZS4kJHR5cGVvZj09PWx8fGUuJCR0eXBlb2Y9PT1oKX0sdC5pc0FzeW5jTW9kZT1mdW5jdGlvbihlKXtyZXR1cm4geShlKXx8ZyhlKT09PXB9LHQuaXNDb25jdXJyZW50TW9kZT15LHQuaXNDb250ZXh0Q29uc3VtZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIGcoZSk9PT1sfSx0LmlzQ29udGV4dFByb3ZpZGVyPWZ1bmN0aW9uKGUpe3JldHVybiBnKGUpPT09Y30sdC5pc0VsZW1lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT09ZSYmZS4kJHR5cGVvZj09PW99LHQuaXNGb3J3YXJkUmVmPWZ1bmN0aW9uKGUpe3JldHVybiBnKGUpPT09aH0sdC5pc0ZyYWdtZW50PWZ1bmN0aW9uKGUpe3JldHVybiBnKGUpPT09aX0sdC5pc0xhenk9ZnVuY3Rpb24oZSl7cmV0dXJuIGcoZSk9PT12fSx0LmlzTWVtbz1mdW5jdGlvbihlKXtyZXR1cm4gZyhlKT09PW19LHQuaXNQb3J0YWw9ZnVuY3Rpb24oZSl7cmV0dXJuIGcoZSk9PT1hfSx0LmlzUHJvZmlsZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIGcoZSk9PT11fSx0LmlzU3RyaWN0TW9kZT1mdW5jdGlvbihlKXtyZXR1cm4gZyhlKT09PXN9LHQuaXNTdXNwZW5zZT1mdW5jdGlvbihlKXtyZXR1cm4gZyhlKT09PWR9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4scixvKXt9ci5yZXNldFdhcm5pbmdDYWNoZT1mdW5jdGlvbigpezB9LGUuZXhwb3J0cz1yfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz0iMTUuNy4wIn0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDM4MikuQ29tcG9uZW50LG89bigxMzQpLmlzVmFsaWRFbGVtZW50LGE9bigzODMpLGk9big2MTYpO2UuZXhwb3J0cz1pKHIsbyxhKX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDM4KSxvPXt9O2Z1bmN0aW9uIGEoZSx0LG4scixvLGEsaSxzKXtpZighZSl7dmFyIHU7aWYodm9pZCAwPT09dCl1PW5ldyBFcnJvcigiTWluaWZpZWQgZXhjZXB0aW9uIG9jY3VycmVkOyB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIHRoZSBmdWxsIGVycm9yIG1lc3NhZ2UgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4iKTtlbHNle3ZhciBjPVtuLHIsbyxhLGksc10sbD0wOyh1PW5ldyBFcnJvcih0LnJlcGxhY2UoLyVzL2csKGZ1bmN0aW9uKCl7cmV0dXJuIGNbbCsrXX0pKSkpLm5hbWU9IkludmFyaWFudCBWaW9sYXRpb24ifXRocm93IHUuZnJhbWVzVG9Qb3A9MSx1fX12YXIgaT0ibWl4aW5zIjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe3ZhciBzPVtdLHU9e21peGluczoiREVGSU5FX01BTlkiLHN0YXRpY3M6IkRFRklORV9NQU5ZIixwcm9wVHlwZXM6IkRFRklORV9NQU5ZIixjb250ZXh0VHlwZXM6IkRFRklORV9NQU5ZIixjaGlsZENvbnRleHRUeXBlczoiREVGSU5FX01BTlkiLGdldERlZmF1bHRQcm9wczoiREVGSU5FX01BTllfTUVSR0VEIixnZXRJbml0aWFsU3RhdGU6IkRFRklORV9NQU5ZX01FUkdFRCIsZ2V0Q2hpbGRDb250ZXh0OiJERUZJTkVfTUFOWV9NRVJHRUQiLHJlbmRlcjoiREVGSU5FX09OQ0UiLGNvbXBvbmVudFdpbGxNb3VudDoiREVGSU5FX01BTlkiLGNvbXBvbmVudERpZE1vdW50OiJERUZJTkVfTUFOWSIsY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wczoiREVGSU5FX01BTlkiLHNob3VsZENvbXBvbmVudFVwZGF0ZToiREVGSU5FX09OQ0UiLGNvbXBvbmVudFdpbGxVcGRhdGU6IkRFRklORV9NQU5ZIixjb21wb25lbnREaWRVcGRhdGU6IkRFRklORV9NQU5ZIixjb21wb25lbnRXaWxsVW5tb3VudDoiREVGSU5FX01BTlkiLFVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQ6IkRFRklORV9NQU5ZIixVTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wczoiREVGSU5FX01BTlkiLFVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlOiJERUZJTkVfTUFOWSIsdXBkYXRlQ29tcG9uZW50OiJPVkVSUklERV9CQVNFIn0sYz17Z2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOiJERUZJTkVfTUFOWV9NRVJHRUQifSxsPXtkaXNwbGF5TmFtZTpmdW5jdGlvbihlLHQpe2UuZGlzcGxheU5hbWU9dH0sbWl4aW5zOmZ1bmN0aW9uKGUsdCl7aWYodClmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylmKGUsdFtuXSl9LGNoaWxkQ29udGV4dFR5cGVzOmZ1bmN0aW9uKGUsdCl7ZS5jaGlsZENvbnRleHRUeXBlcz1yKHt9LGUuY2hpbGRDb250ZXh0VHlwZXMsdCl9LGNvbnRleHRUeXBlczpmdW5jdGlvbihlLHQpe2UuY29udGV4dFR5cGVzPXIoe30sZS5jb250ZXh0VHlwZXMsdCl9LGdldERlZmF1bHRQcm9wczpmdW5jdGlvbihlLHQpe2UuZ2V0RGVmYXVsdFByb3BzP2UuZ2V0RGVmYXVsdFByb3BzPWQoZS5nZXREZWZhdWx0UHJvcHMsdCk6ZS5nZXREZWZhdWx0UHJvcHM9dH0scHJvcFR5cGVzOmZ1bmN0aW9uKGUsdCl7ZS5wcm9wVHlwZXM9cih7fSxlLnByb3BUeXBlcyx0KX0sc3RhdGljczpmdW5jdGlvbihlLHQpeyFmdW5jdGlvbihlLHQpe2lmKCF0KXJldHVybjtmb3IodmFyIG4gaW4gdCl7dmFyIHI9dFtuXTtpZih0Lmhhc093blByb3BlcnR5KG4pKXtpZihhKCEobiBpbiBsKSwnUmVhY3RDbGFzczogWW91IGFyZSBhdHRlbXB0aW5nIHRvIGRlZmluZSBhIHJlc2VydmVkIHByb3BlcnR5LCBgJXNgLCB0aGF0IHNob3VsZG5cJ3QgYmUgb24gdGhlICJzdGF0aWNzIiBrZXkuIERlZmluZSBpdCBhcyBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBpbnN0ZWFkOyBpdCB3aWxsIHN0aWxsIGJlIGFjY2Vzc2libGUgb24gdGhlIGNvbnN0cnVjdG9yLicsbiksbiBpbiBlKXJldHVybiBhKCJERUZJTkVfTUFOWV9NRVJHRUQiPT09KGMuaGFzT3duUHJvcGVydHkobik/Y1tuXTpudWxsKSwiUmVhY3RDbGFzczogWW91IGFyZSBhdHRlbXB0aW5nIHRvIGRlZmluZSBgJXNgIG9uIHlvdXIgY29tcG9uZW50IG1vcmUgdGhhbiBvbmNlLiBUaGlzIGNvbmZsaWN0IG1heSBiZSBkdWUgdG8gYSBtaXhpbi4iLG4pLHZvaWQoZVtuXT1kKGVbbl0scikpO2Vbbl09cn19fShlLHQpfSxhdXRvYmluZDpmdW5jdGlvbigpe319O2Z1bmN0aW9uIHAoZSx0KXt2YXIgbj11Lmhhc093blByb3BlcnR5KHQpP3VbdF06bnVsbDtiLmhhc093blByb3BlcnR5KHQpJiZhKCJPVkVSUklERV9CQVNFIj09PW4sIlJlYWN0Q2xhc3NJbnRlcmZhY2U6IFlvdSBhcmUgYXR0ZW1wdGluZyB0byBvdmVycmlkZSBgJXNgIGZyb20geW91ciBjbGFzcyBzcGVjaWZpY2F0aW9uLiBFbnN1cmUgdGhhdCB5b3VyIG1ldGhvZCBuYW1lcyBkbyBub3Qgb3ZlcmxhcCB3aXRoIFJlYWN0IG1ldGhvZHMuIix0KSxlJiZhKCJERUZJTkVfTUFOWSI9PT1ufHwiREVGSU5FX01BTllfTUVSR0VEIj09PW4sIlJlYWN0Q2xhc3NJbnRlcmZhY2U6IFlvdSBhcmUgYXR0ZW1wdGluZyB0byBkZWZpbmUgYCVzYCBvbiB5b3VyIGNvbXBvbmVudCBtb3JlIHRoYW4gb25jZS4gVGhpcyBjb25mbGljdCBtYXkgYmUgZHVlIHRvIGEgbWl4aW4uIix0KX1mdW5jdGlvbiBmKGUsbil7aWYobil7YSgiZnVuY3Rpb24iIT10eXBlb2YgbiwiUmVhY3RDbGFzczogWW91J3JlIGF0dGVtcHRpbmcgdG8gdXNlIGEgY29tcG9uZW50IGNsYXNzIG9yIGZ1bmN0aW9uIGFzIGEgbWl4aW4uIEluc3RlYWQsIGp1c3QgdXNlIGEgcmVndWxhciBvYmplY3QuIiksYSghdChuKSwiUmVhY3RDbGFzczogWW91J3JlIGF0dGVtcHRpbmcgdG8gdXNlIGEgY29tcG9uZW50IGFzIGEgbWl4aW4uIEluc3RlYWQsIGp1c3QgdXNlIGEgcmVndWxhciBvYmplY3QuIik7dmFyIHI9ZS5wcm90b3R5cGUsbz1yLl9fcmVhY3RBdXRvQmluZFBhaXJzO2Zvcih2YXIgcyBpbiBuLmhhc093blByb3BlcnR5KGkpJiZsLm1peGlucyhlLG4ubWl4aW5zKSxuKWlmKG4uaGFzT3duUHJvcGVydHkocykmJnMhPT1pKXt2YXIgYz1uW3NdLGY9ci5oYXNPd25Qcm9wZXJ0eShzKTtpZihwKGYscyksbC5oYXNPd25Qcm9wZXJ0eShzKSlsW3NdKGUsYyk7ZWxzZXt2YXIgaD11Lmhhc093blByb3BlcnR5KHMpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBjJiYhaCYmIWYmJiExIT09bi5hdXRvYmluZClvLnB1c2gocyxjKSxyW3NdPWM7ZWxzZSBpZihmKXt2YXIgdj11W3NdO2EoaCYmKCJERUZJTkVfTUFOWV9NRVJHRUQiPT09dnx8IkRFRklORV9NQU5ZIj09PXYpLCJSZWFjdENsYXNzOiBVbmV4cGVjdGVkIHNwZWMgcG9saWN5ICVzIGZvciBrZXkgJXMgd2hlbiBtaXhpbmcgaW4gY29tcG9uZW50IHNwZWNzLiIsdixzKSwiREVGSU5FX01BTllfTUVSR0VEIj09PXY/cltzXT1kKHJbc10sYyk6IkRFRklORV9NQU5ZIj09PXYmJihyW3NdPW0ocltzXSxjKSl9ZWxzZSByW3NdPWN9fX1lbHNlO31mdW5jdGlvbiBoKGUsdCl7Zm9yKHZhciBuIGluIGEoZSYmdCYmIm9iamVjdCI9PXR5cGVvZiBlJiYib2JqZWN0Ij09dHlwZW9mIHQsIm1lcmdlSW50b1dpdGhOb0R1cGxpY2F0ZUtleXMoKTogQ2Fubm90IG1lcmdlIG5vbi1vYmplY3RzLiIpLHQpdC5oYXNPd25Qcm9wZXJ0eShuKSYmKGEodm9pZCAwPT09ZVtuXSwibWVyZ2VJbnRvV2l0aE5vRHVwbGljYXRlS2V5cygpOiBUcmllZCB0byBtZXJnZSB0d28gb2JqZWN0cyB3aXRoIHRoZSBzYW1lIGtleTogYCVzYC4gVGhpcyBjb25mbGljdCBtYXkgYmUgZHVlIHRvIGEgbWl4aW47IGluIHBhcnRpY3VsYXIsIHRoaXMgbWF5IGJlIGNhdXNlZCBieSB0d28gZ2V0SW5pdGlhbFN0YXRlKCkgb3IgZ2V0RGVmYXVsdFByb3BzKCkgbWV0aG9kcyByZXR1cm5pbmcgb2JqZWN0cyB3aXRoIGNsYXNoaW5nIGtleXMuIixuKSxlW25dPXRbbl0pO3JldHVybiBlfWZ1bmN0aW9uIGQoZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKG51bGw9PW4pcmV0dXJuIHI7aWYobnVsbD09cilyZXR1cm4gbjt2YXIgbz17fTtyZXR1cm4gaChvLG4pLGgobyxyKSxvfX1mdW5jdGlvbiBtKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIHYoZSx0KXtyZXR1cm4gdC5iaW5kKGUpfXZhciBnPXtjb21wb25lbnREaWRNb3VudDpmdW5jdGlvbigpe3RoaXMuX19pc01vdW50ZWQ9ITB9fSx5PXtjb21wb25lbnRXaWxsVW5tb3VudDpmdW5jdGlvbigpe3RoaXMuX19pc01vdW50ZWQ9ITF9fSxiPXtyZXBsYWNlU3RhdGU6ZnVuY3Rpb24oZSx0KXt0aGlzLnVwZGF0ZXIuZW5xdWV1ZVJlcGxhY2VTdGF0ZSh0aGlzLGUsdCl9LGlzTW91bnRlZDpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5fX2lzTW91bnRlZH19LF89ZnVuY3Rpb24oKXt9O3JldHVybiByKF8ucHJvdG90eXBlLGUucHJvdG90eXBlLGIpLGZ1bmN0aW9uKGUpe3ZhciB0PWZ1bmN0aW9uKGUscixpKXt0aGlzLl9fcmVhY3RBdXRvQmluZFBhaXJzLmxlbmd0aCYmZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUuX19yZWFjdEF1dG9CaW5kUGFpcnMsbj0wO248dC5sZW5ndGg7bis9Mil7dmFyIHI9dFtuXSxvPXRbbisxXTtlW3JdPXYoZSxvKX19KHRoaXMpLHRoaXMucHJvcHM9ZSx0aGlzLmNvbnRleHQ9cix0aGlzLnJlZnM9byx0aGlzLnVwZGF0ZXI9aXx8bix0aGlzLnN0YXRlPW51bGw7dmFyIHM9dGhpcy5nZXRJbml0aWFsU3RhdGU/dGhpcy5nZXRJbml0aWFsU3RhdGUoKTpudWxsO2EoIm9iamVjdCI9PXR5cGVvZiBzJiYhQXJyYXkuaXNBcnJheShzKSwiJXMuZ2V0SW5pdGlhbFN0YXRlKCk6IG11c3QgcmV0dXJuIGFuIG9iamVjdCBvciBudWxsIix0LmRpc3BsYXlOYW1lfHwiUmVhY3RDb21wb3NpdGVDb21wb25lbnQiKSx0aGlzLnN0YXRlPXN9O2Zvcih2YXIgciBpbiB0LnByb3RvdHlwZT1uZXcgXyx0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj10LHQucHJvdG90eXBlLl9fcmVhY3RBdXRvQmluZFBhaXJzPVtdLHMuZm9yRWFjaChmLmJpbmQobnVsbCx0KSksZih0LGcpLGYodCxlKSxmKHQseSksdC5nZXREZWZhdWx0UHJvcHMmJih0LmRlZmF1bHRQcm9wcz10LmdldERlZmF1bHRQcm9wcygpKSxhKHQucHJvdG90eXBlLnJlbmRlciwiY3JlYXRlQ2xhc3MoLi4uKTogQ2xhc3Mgc3BlY2lmaWNhdGlvbiBtdXN0IGltcGxlbWVudCBhIGByZW5kZXJgIG1ldGhvZC4iKSx1KXQucHJvdG90eXBlW3JdfHwodC5wcm90b3R5cGVbcl09bnVsbCk7cmV0dXJuIHR9fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE1OSksbz1uKDEzNCk7bigyNSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBvLmlzVmFsaWRFbGVtZW50KGUpfHxyKCIxNDMiKSxlfX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYoIWUud2VicGFja1BvbHlmaWxsKXt2YXIgdD1PYmplY3QuY3JlYXRlKGUpO3QuY2hpbGRyZW58fCh0LmNoaWxkcmVuPVtdKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwibG9hZGVkIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdC5sfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJpZCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHQuaX19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiZXhwb3J0cyIse2VudW1lcmFibGU6ITB9KSx0LndlYnBhY2tQb2x5ZmlsbD0xfXJldHVybiB0fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHIsbz1uKDEpLGE9KHI9bykmJnIuX19lc01vZHVsZT9yOntkZWZhdWx0OnJ9LGk9big2MjApO3QuZGVmYXVsdD1mdW5jdGlvbihlKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06YS5kZWZhdWx0Lk1hcCxuPU9iamVjdC5rZXlzKGUpO3JldHVybiBmdW5jdGlvbigpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp0KCksbz1hcmd1bWVudHNbMV07cmV0dXJuIHIud2l0aE11dGF0aW9ucygoZnVuY3Rpb24odCl7bi5mb3JFYWNoKChmdW5jdGlvbihuKXt2YXIgcj0oMCxlW25dKSh0LmdldChuKSxvKTsoMCxpLnZhbGlkYXRlTmV4dFN0YXRlKShyLG4sbyksdC5zZXQobixyKX0pKX0pKX19LGUuZXhwb3J0cz10LmRlZmF1bHR9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQudmFsaWRhdGVOZXh0U3RhdGU9dC5nZXRVbmV4cGVjdGVkSW52b2NhdGlvblBhcmFtZXRlck1lc3NhZ2U9dC5nZXRTdGF0ZU5hbWU9dm9pZCAwO3ZhciByPWkobigzODkpKSxvPWkobig2MjEpKSxhPWkobig2MjIpKTtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX10LmdldFN0YXRlTmFtZT1yLmRlZmF1bHQsdC5nZXRVbmV4cGVjdGVkSW52b2NhdGlvblBhcmFtZXRlck1lc3NhZ2U9by5kZWZhdWx0LHQudmFsaWRhdGVOZXh0U3RhdGU9YS5kZWZhdWx0fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1hKG4oMSkpLG89YShuKDM4OSkpO2Z1bmN0aW9uIGEoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fXQuZGVmYXVsdD1mdW5jdGlvbihlLHQsbil7dmFyIGE9T2JqZWN0LmtleXModCk7aWYoIWEubGVuZ3RoKXJldHVybiJTdG9yZSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgcmVkdWNlci4gTWFrZSBzdXJlIHRoZSBhcmd1bWVudCBwYXNzZWQgdG8gY29tYmluZVJlZHVjZXJzIGlzIGFuIG9iamVjdCB3aG9zZSB2YWx1ZXMgYXJlIHJlZHVjZXJzLiI7dmFyIGk9KDAsby5kZWZhdWx0KShuKTtpZighci5kZWZhdWx0Lkl0ZXJhYmxlLmlzSXRlcmFibGUoZSkpcmV0dXJuIlRoZSAiK2krJyBpcyBvZiB1bmV4cGVjdGVkIHR5cGUuIEV4cGVjdGVkIGFyZ3VtZW50IHRvIGJlIGFuIGluc3RhbmNlIG9mIEltbXV0YWJsZS5JdGVyYWJsZSB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczogIicrYS5qb2luKCciLCAiJykrJyIuJzt2YXIgcz1lLmtleVNlcSgpLnRvQXJyYXkoKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiF0Lmhhc093blByb3BlcnR5KGUpfSkpO3JldHVybiBzLmxlbmd0aD4wPyJVbmV4cGVjdGVkICIrKDE9PT1zLmxlbmd0aD8icHJvcGVydHkiOiJwcm9wZXJ0aWVzIikrJyAiJytzLmpvaW4oJyIsICInKSsnIiBmb3VuZCBpbiAnK2krJy4gRXhwZWN0ZWQgdG8gZmluZCBvbmUgb2YgdGhlIGtub3duIHJlZHVjZXIgcHJvcGVydHkgbmFtZXMgaW5zdGVhZDogIicrYS5qb2luKCciLCAiJykrJyIuIFVuZXhwZWN0ZWQgcHJvcGVydGllcyB3aWxsIGJlIGlnbm9yZWQuJzpudWxsfSxlLmV4cG9ydHM9dC5kZWZhdWx0fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmRlZmF1bHQ9ZnVuY3Rpb24oZSx0LG4pe2lmKHZvaWQgMD09PWUpdGhyb3cgbmV3IEVycm9yKCdSZWR1Y2VyICInK3QrJyIgcmV0dXJuZWQgdW5kZWZpbmVkIHdoZW4gaGFuZGxpbmcgIicrbi50eXBlKyciIGFjdGlvbi4gVG8gaWdub3JlIGFuIGFjdGlvbiwgeW91IG11c3QgZXhwbGljaXRseSByZXR1cm4gdGhlIHByZXZpb3VzIHN0YXRlLicpfSxlLmV4cG9ydHM9dC5kZWZhdWx0fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigyNDApLG89bigzOTApO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZihyKGUpKXJldHVybiBvKGUpfSxlLmV4cG9ydHMuZGVmYXVsdD1lLmV4cG9ydHMsZS5leHBvcnRzLl9fZXNNb2R1bGU9ITB9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDM4MSk7ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXtuKDg2KSxuKDEzMCk7dmFyIHI9bigxNjApO2UuZXhwb3J0cz1yfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigzOTMpO2UuZXhwb3J0cz1yfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigyMiksbz1uKDM5NCk7cih7dGFyZ2V0OiJBcnJheSIsc3RhdDohMCxmb3JjZWQ6IW4oMzk3KSgoZnVuY3Rpb24oZSl7QXJyYXkuZnJvbShlKX0pKX0se2Zyb206b30pfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big1Miksbz1uKDM5NSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLGEpe3RyeXtyZXR1cm4gYT90KHIobilbMF0sblsxXSk6dChuKX1jYXRjaCh0KXt0aHJvdyBvKGUpLHR9fX0sZnVuY3Rpb24oZSx0LG4pe2UuZXhwb3J0cz1uKDYzMCl9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDM4MCk7ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9LGUuZXhwb3J0cy5kZWZhdWx0PWUuZXhwb3J0cyxlLmV4cG9ydHMuX19lc01vZHVsZT0hMH0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTc3KSxvPW4oMjQxKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj1udWxsPT1lP251bGw6dm9pZCAwIT09ciYmbyhlKXx8ZVsiQEBpdGVyYXRvciJdO2lmKG51bGwhPW4pe3ZhciBhLGkscz1bXSx1PSEwLGM9ITE7dHJ5e2ZvcihuPW4uY2FsbChlKTshKHU9KGE9bi5uZXh0KCkpLmRvbmUpJiYocy5wdXNoKGEudmFsdWUpLCF0fHxzLmxlbmd0aCE9PXQpO3U9ITApO31jYXRjaChlKXtjPSEwLGk9ZX1maW5hbGx5e3RyeXt1fHxudWxsPT1uLnJldHVybnx8bi5yZXR1cm4oKX1maW5hbGx5e2lmKGMpdGhyb3cgaX19cmV0dXJuIHN9fSxlLmV4cG9ydHMuZGVmYXVsdD1lLmV4cG9ydHMsZS5leHBvcnRzLl9fZXNNb2R1bGU9ITB9LGZ1bmN0aW9uKGUsdCxuKXtuKDg2KTt2YXIgcj1uKDYzNCksbz1uKDk4KSxhPUFycmF5LnByb3RvdHlwZSxpPXtET01Ub2tlbkxpc3Q6ITAsTm9kZUxpc3Q6ITB9O2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1lLmVudHJpZXM7cmV0dXJuIGU9PT1hfHxlIGluc3RhbmNlb2YgQXJyYXkmJnQ9PT1hLmVudHJpZXN8fGkuaGFzT3duUHJvcGVydHkobyhlKSk/cjp0fX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNjM1KTtlLmV4cG9ydHM9cn0sZnVuY3Rpb24oZSx0LG4pe24oMTU4KTt2YXIgcj1uKDQyKTtlLmV4cG9ydHM9cigiQXJyYXkiKS5lbnRyaWVzfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big2MzcpO2UuZXhwb3J0cz1yfSxmdW5jdGlvbihlLHQsbil7big2MzgpO3ZhciByPW4oNDIpO2UuZXhwb3J0cz1yKCJBcnJheSIpLmZvckVhY2h9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyMiksbz1uKDYzOSk7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOltdLmZvckVhY2ghPW99LHtmb3JFYWNoOm99KX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDg1KS5mb3JFYWNoLG89bigxMTMpKCJmb3JFYWNoIik7ZS5leHBvcnRzPW8/W10uZm9yRWFjaDpmdW5jdGlvbihlKXtyZXR1cm4gcih0aGlzLGUsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNjQxKTtlLmV4cG9ydHM9cn0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNjQyKSxvPUFycmF5LnByb3RvdHlwZTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zb3J0O3JldHVybiBlPT09b3x8ZSBpbnN0YW5jZW9mIEFycmF5JiZ0PT09by5zb3J0P3I6dH19LGZ1bmN0aW9uKGUsdCxuKXtuKDY0Myk7dmFyIHI9big0Mik7ZS5leHBvcnRzPXIoIkFycmF5Iikuc29ydH0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDIyKSxvPW4oNzYpLGE9big2MiksaT1uKDY5KSxzPW4oMzcpLHU9big2NDQpLGM9bigxMTMpLGw9big2NDUpLHA9big2NDYpLGY9bigxMjkpLGg9big2NDcpLGQ9W10sbT1kLnNvcnQsdj1zKChmdW5jdGlvbigpe2Quc29ydCh2b2lkIDApfSkpLGc9cygoZnVuY3Rpb24oKXtkLnNvcnQobnVsbCl9KSkseT1jKCJzb3J0IiksYj0hcygoZnVuY3Rpb24oKXtpZihmKXJldHVybiBmPDcwO2lmKCEobCYmbD4zKSl7aWYocClyZXR1cm4hMDtpZihoKXJldHVybiBoPDYwMzt2YXIgZSx0LG4scixvPSIiO2ZvcihlPTY1O2U8NzY7ZSsrKXtzd2l0Y2godD1TdHJpbmcuZnJvbUNoYXJDb2RlKGUpLGUpe2Nhc2UgNjY6Y2FzZSA2OTpjYXNlIDcwOmNhc2UgNzI6bj0zO2JyZWFrO2Nhc2UgNjg6Y2FzZSA3MTpuPTQ7YnJlYWs7ZGVmYXVsdDpuPTJ9Zm9yKHI9MDtyPDQ3O3IrKylkLnB1c2goe2s6dCtyLHY6bn0pfWZvcihkLnNvcnQoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQudi1lLnZ9KSkscj0wO3I8ZC5sZW5ndGg7cisrKXQ9ZFtyXS5rLmNoYXJBdCgwKSxvLmNoYXJBdChvLmxlbmd0aC0xKSE9PXQmJihvKz10KTtyZXR1cm4iREdCRUZIQUNJSksiIT09b319KSk7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOnZ8fCFnfHwheXx8IWJ9LHtzb3J0OmZ1bmN0aW9uKGUpe3ZvaWQgMCE9PWUmJm8oZSk7dmFyIHQ9YSh0aGlzKTtpZihiKXJldHVybiB2b2lkIDA9PT1lP20uY2FsbCh0KTptLmNhbGwodCxlKTt2YXIgbixyLHM9W10sYz1pKHQubGVuZ3RoKTtmb3Iocj0wO3I8YztyKyspciBpbiB0JiZzLnB1c2godFtyXSk7Zm9yKG49KHM9dShzLGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0LG4pe3JldHVybiB2b2lkIDA9PT1uPy0xOnZvaWQgMD09PXQ/MTp2b2lkIDAhPT1lPytlKHQsbil8fDA6U3RyaW5nKHQpPlN0cmluZyhuKT8xOi0xfX0oZSkpKS5sZW5ndGgscj0wO3I8bjspdFtyXT1zW3IrK107Zm9yKDtyPGM7KWRlbGV0ZSB0W3IrK107cmV0dXJuIHR9fSl9LGZ1bmN0aW9uKGUsdCl7dmFyIG49TWF0aC5mbG9vcixyPWZ1bmN0aW9uKGUsdCl7dmFyIGk9ZS5sZW5ndGgscz1uKGkvMik7cmV0dXJuIGk8OD9vKGUsdCk6YShyKGUuc2xpY2UoMCxzKSx0KSxyKGUuc2xpY2UocyksdCksdCl9LG89ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4scixvPWUubGVuZ3RoLGE9MTthPG87KXtmb3Iocj1hLG49ZVthXTtyJiZ0KGVbci0xXSxuKT4wOyllW3JdPWVbLS1yXTtyIT09YSsrJiYoZVtyXT1uKX1yZXR1cm4gZX0sYT1mdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPWUubGVuZ3RoLG89dC5sZW5ndGgsYT0wLGk9MCxzPVtdO2E8cnx8aTxvOylhPHImJmk8bz9zLnB1c2gobihlW2FdLHRbaV0pPD0wP2VbYSsrXTp0W2krK10pOnMucHVzaChhPHI/ZVthKytdOnRbaSsrXSk7cmV0dXJuIHN9O2UuZXhwb3J0cz1yfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMTApLm1hdGNoKC9maXJlZm94XC8oXGQrKS9pKTtlLmV4cG9ydHM9ISFyJiYrclsxXX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTEwKTtlLmV4cG9ydHM9L01TSUV8VHJpZGVudC8udGVzdChyKX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTEwKS5tYXRjaCgvQXBwbGVXZWJLaXRcLyhcZCspXC4vKTtlLmV4cG9ydHM9ISFyJiYrclsxXX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNjQ5KTtlLmV4cG9ydHM9cn0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNjUwKSxvPUFycmF5LnByb3RvdHlwZTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zb21lO3JldHVybiBlPT09b3x8ZSBpbnN0YW5jZW9mIEFycmF5JiZ0PT09by5zb21lP3I6dH19LGZ1bmN0aW9uKGUsdCxuKXtuKDY1MSk7dmFyIHI9big0Mik7ZS5leHBvcnRzPXIoIkFycmF5Iikuc29tZX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDIyKSxvPW4oODUpLnNvbWU7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOiFuKDExMykoInNvbWUiKX0se3NvbWU6ZnVuY3Rpb24oZSl7cmV0dXJuIG8odGhpcyxlLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNjUzKTtlLmV4cG9ydHM9cn0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNjU0KSxvPW4oNjU2KSxhPUFycmF5LnByb3RvdHlwZSxpPVN0cmluZy5wcm90b3R5cGU7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PWUuaW5jbHVkZXM7cmV0dXJuIGU9PT1hfHxlIGluc3RhbmNlb2YgQXJyYXkmJnQ9PT1hLmluY2x1ZGVzP3I6InN0cmluZyI9PXR5cGVvZiBlfHxlPT09aXx8ZSBpbnN0YW5jZW9mIFN0cmluZyYmdD09PWkuaW5jbHVkZXM/bzp0fX0sZnVuY3Rpb24oZSx0LG4pe24oNjU1KTt2YXIgcj1uKDQyKTtlLmV4cG9ydHM9cigiQXJyYXkiKS5pbmNsdWRlc30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDIyKSxvPW4oMjI5KS5pbmNsdWRlcyxhPW4oMjM3KTtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMH0se2luY2x1ZGVzOmZ1bmN0aW9uKGUpe3JldHVybiBvKHRoaXMsZSxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSksYSgiaW5jbHVkZXMiKX0sZnVuY3Rpb24oZSx0LG4pe24oNjU3KTt2YXIgcj1uKDQyKTtlLmV4cG9ydHM9cigiU3RyaW5nIikuaW5jbHVkZXN9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyMiksbz1uKDQwMSksYT1uKDEwOCk7cih7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwLGZvcmNlZDohbig0MDIpKCJpbmNsdWRlcyIpfSx7aW5jbHVkZXM6ZnVuY3Rpb24oZSl7cmV0dXJuISF+U3RyaW5nKGEodGhpcykpLmluZGV4T2YobyhlKSxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSl9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDQ3KSxvPW4oMTUyKSxhPW4oNDEpKCJtYXRjaCIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gcihlKSYmKHZvaWQgMCE9PSh0PWVbYV0pPyEhdDoiUmVnRXhwIj09byhlKSl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big0MDMpO2UuZXhwb3J0cz1yfSxmdW5jdGlvbihlLHQsbil7big2NjEpO3ZhciByPW4oNDIpO2UuZXhwb3J0cz1yKCJBcnJheSIpLmluZGV4T2Z9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyMiksbz1uKDIyOSkuaW5kZXhPZixhPW4oMTEzKSxpPVtdLmluZGV4T2Yscz0hIWkmJjEvWzFdLmluZGV4T2YoMSwtMCk8MCx1PWEoImluZGV4T2YiKTtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6c3x8IXV9LHtpbmRleE9mOmZ1bmN0aW9uKGUpe3JldHVybiBzP2kuYXBwbHkodGhpcyxhcmd1bWVudHMpfHwwOm8odGhpcyxlLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNjYzKTtlLmV4cG9ydHM9cn0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNjY0KSxvPUFycmF5LnByb3RvdHlwZTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5maW5kO3JldHVybiBlPT09b3x8ZSBpbnN0YW5jZW9mIEFycmF5JiZ0PT09by5maW5kP3I6dH19LGZ1bmN0aW9uKGUsdCxuKXtuKDY2NSk7dmFyIHI9big0Mik7ZS5leHBvcnRzPXIoIkFycmF5IikuZmluZH0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDIyKSxvPW4oODUpLmZpbmQsYT1uKDIzNyksaT0iZmluZCIscz0hMDtpIGluW10mJkFycmF5KDEpLmZpbmQoKGZ1bmN0aW9uKCl7cz0hMX0pKSxyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6c30se2ZpbmQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG8odGhpcyxlLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KSxhKGkpfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big2NjcpO2UuZXhwb3J0cz1yfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big2NjgpLG89U3RyaW5nLnByb3RvdHlwZTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdGFydHNXaXRoO3JldHVybiJzdHJpbmciPT10eXBlb2YgZXx8ZT09PW98fGUgaW5zdGFuY2VvZiBTdHJpbmcmJnQ9PT1vLnN0YXJ0c1dpdGg/cjp0fX0sZnVuY3Rpb24oZSx0LG4pe24oNjY5KTt2YXIgcj1uKDQyKTtlLmV4cG9ydHM9cigiU3RyaW5nIikuc3RhcnRzV2l0aH0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcixvPW4oMjIpLGE9bigxMjcpLmYsaT1uKDY5KSxzPW4oNDAxKSx1PW4oMTA4KSxjPW4oNDAyKSxsPW4oOTYpLHA9IiIuc3RhcnRzV2l0aCxmPU1hdGgubWluLGg9Yygic3RhcnRzV2l0aCIpO28oe3RhcmdldDoiU3RyaW5nIixwcm90bzohMCxmb3JjZWQ6ISEobHx8aHx8KHI9YShTdHJpbmcucHJvdG90eXBlLCJzdGFydHNXaXRoIiksIXJ8fHIud3JpdGFibGUpKSYmIWh9LHtzdGFydHNXaXRoOmZ1bmN0aW9uKGUpe3ZhciB0PVN0cmluZyh1KHRoaXMpKTtzKGUpO3ZhciBuPWkoZihhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCx0Lmxlbmd0aCkpLHI9U3RyaW5nKGUpO3JldHVybiBwP3AuY2FsbCh0LHIsbik6dC5zbGljZShuLG4rci5sZW5ndGgpPT09cn19KX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNjcxKTtlLmV4cG9ydHM9cn0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNjcyKSxvPVN0cmluZy5wcm90b3R5cGU7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PWUudHJpbTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV8fGU9PT1vfHxlIGluc3RhbmNlb2YgU3RyaW5nJiZ0PT09by50cmltP3I6dH19LGZ1bmN0aW9uKGUsdCxuKXtuKDY3Myk7dmFyIHI9big0Mik7ZS5leHBvcnRzPXIoIlN0cmluZyIpLnRyaW19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyMiksbz1uKDY3NCkudHJpbTtyKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITAsZm9yY2VkOm4oNjc1KSgidHJpbSIpfSx7dHJpbTpmdW5jdGlvbigpe3JldHVybiBvKHRoaXMpfX0pfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMDgpLG89IlsiK24oNDA0KSsiXSIsYT1SZWdFeHAoIl4iK28rbysiKiIpLGk9UmVnRXhwKG8rbysiKiQiKSxzPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj1TdHJpbmcocih0KSk7cmV0dXJuIDEmZSYmKG49bi5yZXBsYWNlKGEsIiIpKSwyJmUmJihuPW4ucmVwbGFjZShpLCIiKSksbn19O2UuZXhwb3J0cz17c3RhcnQ6cygxKSxlbmQ6cygyKSx0cmltOnMoMyl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigzNyksbz1uKDQwNCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiByKChmdW5jdGlvbigpe3JldHVybiEhb1tlXSgpfHwi4oCLwoXhoI4iIT0i4oCLwoXhoI4iW2VdKCl8fG9bZV0ubmFtZSE9PWV9KSl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMDApLG89bigyODQpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gbyhyKGUpLnRvTG93ZXJDYXNlKCkpfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTM1KSxvPW4oNDA2KSxhPW4oNTYpLGk9bigxODgpLHM9cj9yLnByb3RvdHlwZTp2b2lkIDAsdT1zP3MudG9TdHJpbmc6dm9pZCAwO2UuZXhwb3J0cz1mdW5jdGlvbiBlKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gdDtpZihhKHQpKXJldHVybiBvKHQsZSkrIiI7aWYoaSh0KSlyZXR1cm4gdT91LmNhbGwodCk6IiI7dmFyIG49dCsiIjtyZXR1cm4iMCI9PW4mJjEvdD09LUluZmluaXR5PyItMCI6bn19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDEzNSksbz1PYmplY3QucHJvdG90eXBlLGE9by5oYXNPd25Qcm9wZXJ0eSxpPW8udG9TdHJpbmcscz1yP3IudG9TdHJpbmdUYWc6dm9pZCAwO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1hLmNhbGwoZSxzKSxuPWVbc107dHJ5e2Vbc109dm9pZCAwO3ZhciByPSEwfWNhdGNoKGUpe312YXIgbz1pLmNhbGwoZSk7cmV0dXJuIHImJih0P2Vbc109bjpkZWxldGUgZVtzXSksb319LGZ1bmN0aW9uKGUsdCl7dmFyIG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIG4uY2FsbChlKX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDY4MSksbz1uKDQwOCksYT1uKDY4MiksaT1uKDEwMCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXt0PWkodCk7dmFyIG49byh0KT9hKHQpOnZvaWQgMCxzPW4/blswXTp0LmNoYXJBdCgwKSx1PW4/cihuLDEpLmpvaW4oIiIpOnQuc2xpY2UoMSk7cmV0dXJuIHNbZV0oKSt1fX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDQwNyk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgbz1lLmxlbmd0aDtyZXR1cm4gbj12b2lkIDA9PT1uP286biwhdCYmbj49bz9lOnIoZSx0LG4pfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNjgzKSxvPW4oNDA4KSxhPW4oNjg0KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIG8oZSk/YShlKTpyKGUpfX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuc3BsaXQoIiIpfX0sZnVuY3Rpb24oZSx0KXt2YXIgbj0iW1xcdWQ4MDAtXFx1ZGZmZl0iLHI9IltcXHUwMzAwLVxcdTAzNmZcXHVmZTIwLVxcdWZlMmZcXHUyMGQwLVxcdTIwZmZdIixvPSJcXHVkODNjW1xcdWRmZmItXFx1ZGZmZl0iLGE9IlteXFx1ZDgwMC1cXHVkZmZmXSIsaT0iKD86XFx1ZDgzY1tcXHVkZGU2LVxcdWRkZmZdKXsyfSIscz0iW1xcdWQ4MDAtXFx1ZGJmZl1bXFx1ZGMwMC1cXHVkZmZmXSIsdT0iKD86IityKyJ8IitvKyIpIisiPyIsYz0iW1xcdWZlMGVcXHVmZTBmXT8iLGw9Yyt1KygiKD86XFx1MjAwZCg/OiIrW2EsaSxzXS5qb2luKCJ8IikrIikiK2MrdSsiKSoiKSxwPSIoPzoiK1thK3IrIj8iLHIsaSxzLG5dLmpvaW4oInwiKSsiKSIsZj1SZWdFeHAobysiKD89IitvKyIpfCIrcCtsLCJnIik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBlLm1hdGNoKGYpfHxbXX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDQwOSksbz1uKDY4NiksYT1uKDY4OSksaT1SZWdFeHAoIlsn4oCZXSIsImciKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiByKGEobyh0KS5yZXBsYWNlKGksIiIpKSxlLCIiKX19fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big2ODcpLG89bigxMDApLGE9L1tceGMwLVx4ZDZceGQ4LVx4ZjZceGY4LVx4ZmZcdTAxMDAtXHUwMTdmXS9nLGk9UmVnRXhwKCJbXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXSIsImciKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuKGU9byhlKSkmJmUucmVwbGFjZShhLHIpLnJlcGxhY2UoaSwiIil9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big2ODgpKHsiw4AiOiJBIiwiw4EiOiJBIiwiw4IiOiJBIiwiw4MiOiJBIiwiw4QiOiJBIiwiw4UiOiJBIiwiw6AiOiJhIiwiw6EiOiJhIiwiw6IiOiJhIiwiw6MiOiJhIiwiw6QiOiJhIiwiw6UiOiJhIiwiw4ciOiJDIiwiw6ciOiJjIiwiw5AiOiJEIiwiw7AiOiJkIiwiw4giOiJFIiwiw4kiOiJFIiwiw4oiOiJFIiwiw4siOiJFIiwiw6giOiJlIiwiw6kiOiJlIiwiw6oiOiJlIiwiw6siOiJlIiwiw4wiOiJJIiwiw40iOiJJIiwiw44iOiJJIiwiw48iOiJJIiwiw6wiOiJpIiwiw60iOiJpIiwiw64iOiJpIiwiw68iOiJpIiwiw5EiOiJOIiwiw7EiOiJuIiwiw5IiOiJPIiwiw5MiOiJPIiwiw5QiOiJPIiwiw5UiOiJPIiwiw5YiOiJPIiwiw5giOiJPIiwiw7IiOiJvIiwiw7MiOiJvIiwiw7QiOiJvIiwiw7UiOiJvIiwiw7YiOiJvIiwiw7giOiJvIiwiw5kiOiJVIiwiw5oiOiJVIiwiw5siOiJVIiwiw5wiOiJVIiwiw7kiOiJ1Iiwiw7oiOiJ1Iiwiw7siOiJ1Iiwiw7wiOiJ1Iiwiw50iOiJZIiwiw70iOiJ5Iiwiw78iOiJ5Iiwiw4YiOiJBZSIsIsOmIjoiYWUiLCLDniI6IlRoIiwiw74iOiJ0aCIsIsOfIjoic3MiLCLEgCI6IkEiLCLEgiI6IkEiLCLEhCI6IkEiLCLEgSI6ImEiLCLEgyI6ImEiLCLEhSI6ImEiLCLEhiI6IkMiLCLEiCI6IkMiLCLEiiI6IkMiLCLEjCI6IkMiLCLEhyI6ImMiLCLEiSI6ImMiLCLEiyI6ImMiLCLEjSI6ImMiLCLEjiI6IkQiLCLEkCI6IkQiLCLEjyI6ImQiLCLEkSI6ImQiLCLEkiI6IkUiLCLElCI6IkUiLCLEliI6IkUiLCLEmCI6IkUiLCLEmiI6IkUiLCLEkyI6ImUiLCLElSI6ImUiLCLElyI6ImUiLCLEmSI6ImUiLCLEmyI6ImUiLCLEnCI6IkciLCLEniI6IkciLCLEoCI6IkciLCLEoiI6IkciLCLEnSI6ImciLCLEnyI6ImciLCLEoSI6ImciLCLEoyI6ImciLCLEpCI6IkgiLCLEpiI6IkgiLCLEpSI6ImgiLCLEpyI6ImgiLCLEqCI6IkkiLCLEqiI6IkkiLCLErCI6IkkiLCLEriI6IkkiLCLEsCI6IkkiLCLEqSI6ImkiLCLEqyI6ImkiLCLErSI6ImkiLCLEryI6ImkiLCLEsSI6ImkiLCLEtCI6IkoiLCLEtSI6ImoiLCLEtiI6IksiLCLEtyI6ImsiLCLEuCI6ImsiLCLEuSI6IkwiLCLEuyI6IkwiLCLEvSI6IkwiLCLEvyI6IkwiLCLFgSI6IkwiLCLEuiI6ImwiLCLEvCI6ImwiLCLEviI6ImwiLCLFgCI6ImwiLCLFgiI6ImwiLCLFgyI6Ik4iLCLFhSI6Ik4iLCLFhyI6Ik4iLCLFiiI6Ik4iLCLFhCI6Im4iLCLFhiI6Im4iLCLFiCI6Im4iLCLFiyI6Im4iLCLFjCI6Ik8iLCLFjiI6Ik8iLCLFkCI6Ik8iLCLFjSI6Im8iLCLFjyI6Im8iLCLFkSI6Im8iLCLFlCI6IlIiLCLFliI6IlIiLCLFmCI6IlIiLCLFlSI6InIiLCLFlyI6InIiLCLFmSI6InIiLCLFmiI6IlMiLCLFnCI6IlMiLCLFniI6IlMiLCLFoCI6IlMiLCLFmyI6InMiLCLFnSI6InMiLCLFnyI6InMiLCLFoSI6InMiLCLFoiI6IlQiLCLFpCI6IlQiLCLFpiI6IlQiLCLFoyI6InQiLCLFpSI6InQiLCLFpyI6InQiLCLFqCI6IlUiLCLFqiI6IlUiLCLFrCI6IlUiLCLFriI6IlUiLCLFsCI6IlUiLCLFsiI6IlUiLCLFqSI6InUiLCLFqyI6InUiLCLFrSI6InUiLCLFryI6InUiLCLFsSI6InUiLCLFsyI6InUiLCLFtCI6IlciLCLFtSI6InciLCLFtiI6IlkiLCLFtyI6InkiLCLFuCI6IlkiLCLFuSI6IloiLCLFuyI6IloiLCLFvSI6IloiLCLFuiI6InoiLCLFvCI6InoiLCLFviI6InoiLCLEsiI6IklKIiwixLMiOiJpaiIsIsWSIjoiT2UiLCLFkyI6Im9lIiwixYkiOiInbiIsIsW/IjoicyJ9KTtlLmV4cG9ydHM9cn0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT1lP3ZvaWQgMDplW3RdfX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDY5MCksbz1uKDY5MSksYT1uKDEwMCksaT1uKDY5Mik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT1hKGUpLHZvaWQgMD09PSh0PW4/dm9pZCAwOnQpP28oZSk/aShlKTpyKGUpOmUubWF0Y2godCl8fFtdfX0sZnVuY3Rpb24oZSx0KXt2YXIgbj0vW15ceDAwLVx4MmZceDNhLVx4NDBceDViLVx4NjBceDdiLVx4N2ZdKy9nO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gZS5tYXRjaChuKXx8W119fSxmdW5jdGlvbihlLHQpe3ZhciBuPS9bYS16XVtBLVpdfFtBLVpdezJ9W2Etel18WzAtOV1bYS16QS1aXXxbYS16QS1aXVswLTldfFteYS16QS1aMC05IF0vO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gbi50ZXN0KGUpfX0sZnVuY3Rpb24oZSx0KXt2YXIgbj0iXFx1MjcwMC1cXHUyN2JmIixyPSJhLXpcXHhkZi1cXHhmNlxceGY4LVxceGZmIixvPSJBLVpcXHhjMC1cXHhkNlxceGQ4LVxceGRlIixhPSJcXHhhY1xceGIxXFx4ZDdcXHhmN1xceDAwLVxceDJmXFx4M2EtXFx4NDBcXHg1Yi1cXHg2MFxceDdiLVxceGJmXFx1MjAwMC1cXHUyMDZmIFxcdFxceDBiXFxmXFx4YTBcXHVmZWZmXFxuXFxyXFx1MjAyOFxcdTIwMjlcXHUxNjgwXFx1MTgwZVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBhXFx1MjAyZlxcdTIwNWZcXHUzMDAwIixpPSJbIithKyJdIixzPSJcXGQrIix1PSJbXFx1MjcwMC1cXHUyN2JmXSIsYz0iWyIrcisiXSIsbD0iW15cXHVkODAwLVxcdWRmZmYiK2ErcytuK3IrbysiXSIscD0iKD86XFx1ZDgzY1tcXHVkZGU2LVxcdWRkZmZdKXsyfSIsZj0iW1xcdWQ4MDAtXFx1ZGJmZl1bXFx1ZGMwMC1cXHVkZmZmXSIsaD0iWyIrbysiXSIsZD0iKD86IitjKyJ8IitsKyIpIixtPSIoPzoiK2grInwiK2wrIikiLHY9Iig/Olsn4oCZXSg/OmR8bGx8bXxyZXxzfHR8dmUpKT8iLGc9Iig/Olsn4oCZXSg/OkR8TEx8TXxSRXxTfFR8VkUpKT8iLHk9Iig/OltcXHUwMzAwLVxcdTAzNmZcXHVmZTIwLVxcdWZlMmZcXHUyMGQwLVxcdTIwZmZdfFxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSk/IixiPSJbXFx1ZmUwZVxcdWZlMGZdPyIsXz1iK3krKCIoPzpcXHUyMDBkKD86IitbIlteXFx1ZDgwMC1cXHVkZmZmXSIscCxmXS5qb2luKCJ8IikrIikiK2IreSsiKSoiKSx3PSIoPzoiK1t1LHAsZl0uam9pbigifCIpKyIpIitfLHg9UmVnRXhwKFtoKyI/IitjKyIrIit2KyIoPz0iK1tpLGgsIiQiXS5qb2luKCJ8IikrIikiLG0rIisiK2crIig/PSIrW2ksaCtkLCIkIl0uam9pbigifCIpKyIpIixoKyI/IitkKyIrIit2LGgrIisiK2csIlxcZCooPzoxU1R8Mk5EfDNSRHwoPyFbMTIzXSlcXGRUSCkoPz1cXGJ8W2Etel9dKSIsIlxcZCooPzoxc3R8Mm5kfDNyZHwoPyFbMTIzXSlcXGR0aCkoPz1cXGJ8W0EtWl9dKSIscyx3XS5qb2luKCJ8IiksImciKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUubWF0Y2goeCl8fFtdfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNjk0KSxvPW4oMTkwKSxhPW4oMjQzKTtlLmV4cG9ydHM9ZnVuY3Rpb24oKXt0aGlzLnNpemU9MCx0aGlzLl9fZGF0YV9fPXtoYXNoOm5ldyByLG1hcDpuZXcoYXx8byksc3RyaW5nOm5ldyByfX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDY5NSksbz1uKDcwMCksYT1uKDcwMSksaT1uKDcwMikscz1uKDcwMyk7ZnVuY3Rpb24gdShlKXt2YXIgdD0tMSxuPW51bGw9PWU/MDplLmxlbmd0aDtmb3IodGhpcy5jbGVhcigpOysrdDxuOyl7dmFyIHI9ZVt0XTt0aGlzLnNldChyWzBdLHJbMV0pfX11LnByb3RvdHlwZS5jbGVhcj1yLHUucHJvdG90eXBlLmRlbGV0ZT1vLHUucHJvdG90eXBlLmdldD1hLHUucHJvdG90eXBlLmhhcz1pLHUucHJvdG90eXBlLnNldD1zLGUuZXhwb3J0cz11fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxODkpO2UuZXhwb3J0cz1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189cj9yKG51bGwpOnt9LHRoaXMuc2l6ZT0wfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTcxKSxvPW4oNjk3KSxhPW4oNTkpLGk9big0MTApLHM9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sdT1GdW5jdGlvbi5wcm90b3R5cGUsYz1PYmplY3QucHJvdG90eXBlLGw9dS50b1N0cmluZyxwPWMuaGFzT3duUHJvcGVydHksZj1SZWdFeHAoIl4iK2wuY2FsbChwKS5yZXBsYWNlKC9bXFxeJC4qKz8oKVtcXXt9fF0vZywiXFwkJiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuISghYShlKXx8byhlKSkmJihyKGUpP2Y6cykudGVzdChpKGUpKX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcixvPW4oNjk4KSxhPShyPS9bXi5dKyQvLmV4ZWMobyYmby5rZXlzJiZvLmtleXMuSUVfUFJPVE98fCIiKSk/IlN5bWJvbChzcmMpXzEuIityOiIiO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4hIWEmJmEgaW4gZX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDcxKVsiX19jb3JlLWpzX3NoYXJlZF9fIl07ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG51bGw9PWU/dm9pZCAwOmVbdF19fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmhhcyhlKSYmZGVsZXRlIHRoaXMuX19kYXRhX19bZV07cmV0dXJuIHRoaXMuc2l6ZS09dD8xOjAsdH19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDE4OSksbz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9fZGF0YV9fO2lmKHIpe3ZhciBuPXRbZV07cmV0dXJuIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iPT09bj92b2lkIDA6bn1yZXR1cm4gby5jYWxsKHQsZSk/dFtlXTp2b2lkIDB9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxODkpLG89T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fX2RhdGFfXztyZXR1cm4gcj92b2lkIDAhPT10W2VdOm8uY2FsbCh0LGUpfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTg5KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9fZGF0YV9fO3JldHVybiB0aGlzLnNpemUrPXRoaXMuaGFzKGUpPzA6MSxuW2VdPXImJnZvaWQgMD09PXQ/Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iOnQsdGhpc319LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDE5MSksbz1BcnJheS5wcm90b3R5cGUuc3BsaWNlO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9fZGF0YV9fLG49cih0LGUpO3JldHVybiEobjwwKSYmKG49PXQubGVuZ3RoLTE/dC5wb3AoKTpvLmNhbGwodCxuLDEpLC0tdGhpcy5zaXplLCEwKX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDE5MSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX19kYXRhX18sbj1yKHQsZSk7cmV0dXJuIG48MD92b2lkIDA6dFtuXVsxXX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDE5MSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiByKHRoaXMuX19kYXRhX18sZSk+LTF9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxOTEpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX19kYXRhX18sbz1yKG4sZSk7cmV0dXJuIG88MD8oKyt0aGlzLnNpemUsbi5wdXNoKFtlLHRdKSk6bltvXVsxXT10LHRoaXN9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxOTIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1yKHRoaXMsZSkuZGVsZXRlKGUpO3JldHVybiB0aGlzLnNpemUtPXQ/MTowLHR9fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD10eXBlb2YgZTtyZXR1cm4ic3RyaW5nIj09dHx8Im51bWJlciI9PXR8fCJzeW1ib2wiPT10fHwiYm9vbGVhbiI9PXQ/Il9fcHJvdG9fXyIhPT1lOm51bGw9PT1lfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTkyKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHIodGhpcyxlKS5nZXQoZSl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxOTIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gcih0aGlzLGUpLmhhcyhlKX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDE5Mik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIG49cih0aGlzLGUpLG89bi5zaXplO3JldHVybiBuLnNldChlLHQpLHRoaXMuc2l6ZSs9bi5zaXplPT1vPzA6MSx0aGlzfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTkzKSxvPW4oMTM3KSxhPW4oMTM2KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQsbixpKXt2YXIgcz1PYmplY3QodCk7aWYoIW8odCkpe3ZhciB1PXIobiwzKTt0PWEodCksbj1mdW5jdGlvbihlKXtyZXR1cm4gdShzW2VdLGUscyl9fXZhciBjPWUodCxuLGkpO3JldHVybiBjPi0xP3NbdT90W2NdOmNdOnZvaWQgMH19fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big3MTYpLG89big3NDEpLGE9big0MjIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1vKGUpO3JldHVybiAxPT10Lmxlbmd0aCYmdFswXVsyXT9hKHRbMF1bMF0sdFswXVsxXSk6ZnVuY3Rpb24obil7cmV0dXJuIG49PT1lfHxyKG4sZSx0KX19fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigyNDQpLG89big0MTEpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixhKXt2YXIgaT1uLmxlbmd0aCxzPWksdT0hYTtpZihudWxsPT1lKXJldHVybiFzO2ZvcihlPU9iamVjdChlKTtpLS07KXt2YXIgYz1uW2ldO2lmKHUmJmNbMl0/Y1sxXSE9PWVbY1swXV06IShjWzBdaW4gZSkpcmV0dXJuITF9Zm9yKDsrK2k8czspe3ZhciBsPShjPW5baV0pWzBdLHA9ZVtsXSxmPWNbMV07aWYodSYmY1syXSl7aWYodm9pZCAwPT09cCYmIShsIGluIGUpKXJldHVybiExfWVsc2V7dmFyIGg9bmV3IHI7aWYoYSl2YXIgZD1hKHAsZixsLGUsdCxoKTtpZighKHZvaWQgMD09PWQ/byhmLHAsMyxhLGgpOmQpKXJldHVybiExfX1yZXR1cm4hMH19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDE5MCk7ZS5leHBvcnRzPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1uZXcgcix0aGlzLnNpemU9MH19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX19kYXRhX18sbj10LmRlbGV0ZShlKTtyZXR1cm4gdGhpcy5zaXplPXQuc2l6ZSxufX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KGUpfX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKGUpfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTkwKSxvPW4oMjQzKSxhPW4oMjQyKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9fZGF0YV9fO2lmKG4gaW5zdGFuY2VvZiByKXt2YXIgaT1uLl9fZGF0YV9fO2lmKCFvfHxpLmxlbmd0aDwxOTkpcmV0dXJuIGkucHVzaChbZSx0XSksdGhpcy5zaXplPSsrbi5zaXplLHRoaXM7bj10aGlzLl9fZGF0YV9fPW5ldyBhKGkpfXJldHVybiBuLnNldChlLHQpLHRoaXMuc2l6ZT1uLnNpemUsdGhpc319LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDI0NCksbz1uKDQxMiksYT1uKDcyNyksaT1uKDczMCkscz1uKDE2MSksdT1uKDU2KSxjPW4oMTk1KSxsPW4oMjQ3KSxwPSJbb2JqZWN0IEFyZ3VtZW50c10iLGY9IltvYmplY3QgQXJyYXldIixoPSJbb2JqZWN0IE9iamVjdF0iLGQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4sbSx2LGcpe3ZhciB5PXUoZSksYj11KHQpLF89eT9mOnMoZSksdz1iP2Y6cyh0KSx4PShfPV89PXA/aDpfKT09aCxFPSh3PXc9PXA/aDp3KT09aCxTPV89PXc7aWYoUyYmYyhlKSl7aWYoIWModCkpcmV0dXJuITE7eT0hMCx4PSExfWlmKFMmJiF4KXJldHVybiBnfHwoZz1uZXcgcikseXx8bChlKT9vKGUsdCxuLG0sdixnKTphKGUsdCxfLG4sbSx2LGcpO2lmKCEoMSZuKSl7dmFyIEM9eCYmZC5jYWxsKGUsIl9fd3JhcHBlZF9fIiksQT1FJiZkLmNhbGwodCwiX193cmFwcGVkX18iKTtpZihDfHxBKXt2YXIgTz1DP2UudmFsdWUoKTplLGs9QT90LnZhbHVlKCk6dDtyZXR1cm4gZ3x8KGc9bmV3IHIpLHYoTyxrLG4sbSxnKX19cmV0dXJuISFTJiYoZ3x8KGc9bmV3IHIpLGkoZSx0LG4sbSx2LGcpKX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDI0Miksbz1uKDcyNCksYT1uKDcyNSk7ZnVuY3Rpb24gaShlKXt2YXIgdD0tMSxuPW51bGw9PWU/MDplLmxlbmd0aDtmb3IodGhpcy5fX2RhdGFfXz1uZXcgcjsrK3Q8bjspdGhpcy5hZGQoZVt0XSl9aS5wcm90b3R5cGUuYWRkPWkucHJvdG90eXBlLnB1c2g9byxpLnByb3RvdHlwZS5oYXM9YSxlLmV4cG9ydHM9aX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX19kYXRhX18uc2V0KGUsIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iKSx0aGlzfX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKGUpfX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5oYXModCl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMzUpLG89big0MTQpLGE9bigxMjMpLGk9big0MTIpLHM9big3MjgpLHU9big3MjkpLGM9cj9yLnByb3RvdHlwZTp2b2lkIDAsbD1jP2MudmFsdWVPZjp2b2lkIDA7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLHIsYyxwLGYpe3N3aXRjaChuKXtjYXNlIltvYmplY3QgRGF0YVZpZXddIjppZihlLmJ5dGVMZW5ndGghPXQuYnl0ZUxlbmd0aHx8ZS5ieXRlT2Zmc2V0IT10LmJ5dGVPZmZzZXQpcmV0dXJuITE7ZT1lLmJ1ZmZlcix0PXQuYnVmZmVyO2Nhc2UiW29iamVjdCBBcnJheUJ1ZmZlcl0iOnJldHVybiEoZS5ieXRlTGVuZ3RoIT10LmJ5dGVMZW5ndGh8fCFwKG5ldyBvKGUpLG5ldyBvKHQpKSk7Y2FzZSJbb2JqZWN0IEJvb2xlYW5dIjpjYXNlIltvYmplY3QgRGF0ZV0iOmNhc2UiW29iamVjdCBOdW1iZXJdIjpyZXR1cm4gYSgrZSwrdCk7Y2FzZSJbb2JqZWN0IEVycm9yXSI6cmV0dXJuIGUubmFtZT09dC5uYW1lJiZlLm1lc3NhZ2U9PXQubWVzc2FnZTtjYXNlIltvYmplY3QgUmVnRXhwXSI6Y2FzZSJbb2JqZWN0IFN0cmluZ10iOnJldHVybiBlPT10KyIiO2Nhc2UiW29iamVjdCBNYXBdIjp2YXIgaD1zO2Nhc2UiW29iamVjdCBTZXRdIjp2YXIgZD0xJnI7aWYoaHx8KGg9dSksZS5zaXplIT10LnNpemUmJiFkKXJldHVybiExO3ZhciBtPWYuZ2V0KGUpO2lmKG0pcmV0dXJuIG09PXQ7cnw9MixmLnNldChlLHQpO3ZhciB2PWkoaChlKSxoKHQpLHIsYyxwLGYpO3JldHVybiBmLmRlbGV0ZShlKSx2O2Nhc2UiW29iamVjdCBTeW1ib2xdIjppZihsKXJldHVybiBsLmNhbGwoZSk9PWwuY2FsbCh0KX1yZXR1cm4hMX19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PS0xLG49QXJyYXkoZS5zaXplKTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlLHIpe25bKyt0XT1bcixlXX0pKSxufX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9LTEsbj1BcnJheShlLnNpemUpO3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKGUpe25bKyt0XT1lfSkpLG59fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big0MTUpLG89T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4sYSxpLHMpe3ZhciB1PTEmbixjPXIoZSksbD1jLmxlbmd0aDtpZihsIT1yKHQpLmxlbmd0aCYmIXUpcmV0dXJuITE7Zm9yKHZhciBwPWw7cC0tOyl7dmFyIGY9Y1twXTtpZighKHU/ZiBpbiB0Om8uY2FsbCh0LGYpKSlyZXR1cm4hMX12YXIgaD1zLmdldChlKSxkPXMuZ2V0KHQpO2lmKGgmJmQpcmV0dXJuIGg9PXQmJmQ9PWU7dmFyIG09ITA7cy5zZXQoZSx0KSxzLnNldCh0LGUpO2Zvcih2YXIgdj11OysrcDxsOyl7dmFyIGc9ZVtmPWNbcF1dLHk9dFtmXTtpZihhKXZhciBiPXU/YSh5LGcsZix0LGUscyk6YShnLHksZixlLHQscyk7aWYoISh2b2lkIDA9PT1iP2c9PT15fHxpKGcseSxuLGEscyk6Yikpe209ITE7YnJlYWt9dnx8KHY9ImNvbnN0cnVjdG9yIj09Zil9aWYobSYmIXYpe3ZhciBfPWUuY29uc3RydWN0b3Isdz10LmNvbnN0cnVjdG9yO189PXd8fCEoImNvbnN0cnVjdG9yImluIGUpfHwhKCJjb25zdHJ1Y3RvciJpbiB0KXx8ImZ1bmN0aW9uIj09dHlwZW9mIF8mJl8gaW5zdGFuY2VvZiBfJiYiZnVuY3Rpb24iPT10eXBlb2YgdyYmdyBpbnN0YW5jZW9mIHd8fChtPSExKX1yZXR1cm4gcy5kZWxldGUoZSkscy5kZWxldGUodCksbX19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPS0xLHI9bnVsbD09ZT8wOmUubGVuZ3RoLG89MCxhPVtdOysrbjxyOyl7dmFyIGk9ZVtuXTt0KGksbixlKSYmKGFbbysrXT1pKX1yZXR1cm4gYX19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPS0xLHI9QXJyYXkoZSk7KytuPGU7KXJbbl09dChuKTtyZXR1cm4gcn19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDExNCksbz1uKDg4KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIG8oZSkmJiJbb2JqZWN0IEFyZ3VtZW50c10iPT1yKGUpfX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oKXtyZXR1cm4hMX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDExNCksbz1uKDI0OCksYT1uKDg4KSxpPXt9O2lbIltvYmplY3QgRmxvYXQzMkFycmF5XSJdPWlbIltvYmplY3QgRmxvYXQ2NEFycmF5XSJdPWlbIltvYmplY3QgSW50OEFycmF5XSJdPWlbIltvYmplY3QgSW50MTZBcnJheV0iXT1pWyJbb2JqZWN0IEludDMyQXJyYXldIl09aVsiW29iamVjdCBVaW50OEFycmF5XSJdPWlbIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldIl09aVsiW29iamVjdCBVaW50MTZBcnJheV0iXT1pWyJbb2JqZWN0IFVpbnQzMkFycmF5XSJdPSEwLGlbIltvYmplY3QgQXJndW1lbnRzXSJdPWlbIltvYmplY3QgQXJyYXldIl09aVsiW29iamVjdCBBcnJheUJ1ZmZlcl0iXT1pWyJbb2JqZWN0IEJvb2xlYW5dIl09aVsiW29iamVjdCBEYXRhVmlld10iXT1pWyJbb2JqZWN0IERhdGVdIl09aVsiW29iamVjdCBFcnJvcl0iXT1pWyJbb2JqZWN0IEZ1bmN0aW9uXSJdPWlbIltvYmplY3QgTWFwXSJdPWlbIltvYmplY3QgTnVtYmVyXSJdPWlbIltvYmplY3QgT2JqZWN0XSJdPWlbIltvYmplY3QgUmVnRXhwXSJdPWlbIltvYmplY3QgU2V0XSJdPWlbIltvYmplY3QgU3RyaW5nXSJdPWlbIltvYmplY3QgV2Vha01hcF0iXT0hMSxlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGEoZSkmJm8oZS5sZW5ndGgpJiYhIWlbcihlKV19fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big0MjApKE9iamVjdC5rZXlzLE9iamVjdCk7ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDExNSkobig3MSksIkRhdGFWaWV3Iik7ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDExNSkobig3MSksIlByb21pc2UiKTtlLmV4cG9ydHM9cn0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTE1KShuKDcxKSwiU2V0Iik7ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDExNSkobig3MSksIldlYWtNYXAiKTtlLmV4cG9ydHM9cn0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNDIxKSxvPW4oMTM2KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PW8oZSksbj10Lmxlbmd0aDtuLS07KXt2YXIgYT10W25dLGk9ZVthXTt0W25dPVthLGkscihpKV19cmV0dXJuIHR9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big0MTEpLG89big0MyksYT1uKDc0NSksaT1uKDI1Mikscz1uKDQyMSksdT1uKDQyMiksYz1uKDEzOCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGkoZSkmJnModCk/dShjKGUpLHQpOmZ1bmN0aW9uKG4pe3ZhciBpPW8obixlKTtyZXR1cm4gdm9pZCAwPT09aSYmaT09PXQ/YShuLGUpOnIodCxpLDMpfX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDc0NCksbz0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxhPS9cXChcXCk/L2csaT1yKChmdW5jdGlvbihlKXt2YXIgdD1bXTtyZXR1cm4gNDY9PT1lLmNoYXJDb2RlQXQoMCkmJnQucHVzaCgiIiksZS5yZXBsYWNlKG8sKGZ1bmN0aW9uKGUsbixyLG8pe3QucHVzaChyP28ucmVwbGFjZShhLCIkMSIpOm58fGUpfSkpLHR9KSk7ZS5leHBvcnRzPWl9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDI4NSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PXIoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIDUwMD09PW4uc2l6ZSYmbi5jbGVhcigpLGV9KSksbj10LmNhY2hlO3JldHVybiB0fX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNzQ2KSxvPW4oNzQ3KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbnVsbCE9ZSYmbyhlLHQscil9fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiBudWxsIT1lJiZ0IGluIE9iamVjdChlKX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDE2Miksbz1uKDE5NCksYT1uKDU2KSxpPW4oMTk3KSxzPW4oMjQ4KSx1PW4oMTM4KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgYz0tMSxsPSh0PXIodCxlKSkubGVuZ3RoLHA9ITE7KytjPGw7KXt2YXIgZj11KHRbY10pO2lmKCEocD1udWxsIT1lJiZuKGUsZikpKWJyZWFrO2U9ZVtmXX1yZXR1cm4gcHx8KytjIT1sP3A6ISEobD1udWxsPT1lPzA6ZS5sZW5ndGgpJiZzKGwpJiZpKGYsbCkmJihhKGUpfHxvKGUpKX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDc0OSksbz1uKDc1MCksYT1uKDI1MiksaT1uKDEzOCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBhKGUpP3IoaShlKSk6byhlKX19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD92b2lkIDA6dFtlXX19fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigyNTEpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIodCxlKX19fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big3NTIpLG89bigxOTMpLGE9big3NTMpLGk9TWF0aC5tYXg7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcz1udWxsPT1lPzA6ZS5sZW5ndGg7aWYoIXMpcmV0dXJuLTE7dmFyIHU9bnVsbD09bj8wOmEobik7cmV0dXJuIHU8MCYmKHU9aShzK3UsMCkpLHIoZSxvKHQsMyksdSl9fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixyKXtmb3IodmFyIG89ZS5sZW5ndGgsYT1uKyhyPzE6LTEpO3I/YS0tOisrYTxvOylpZih0KGVbYV0sYSxlKSlyZXR1cm4gYTtyZXR1cm4tMX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDc1NCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PXIoZSksbj10JTE7cmV0dXJuIHQ9PXQ/bj90LW46dDowfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNDI0KSxvPTEvMDtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGU/KGU9cihlKSk9PT1vfHxlPT09LTEvMD8xNzk3NjkzMTM0ODYyMzE1N2UyOTIqKGU8MD8tMToxKTplPT1lP2U6MDowPT09ZT9lOjB9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big3NTYpLG89L15ccysvO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gZT9lLnNsaWNlKDAscihlKSsxKS5yZXBsYWNlKG8sIiIpOmV9fSxmdW5jdGlvbihlLHQpe3ZhciBuPS9ccy87ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLmxlbmd0aDt0LS0mJm4udGVzdChlLmNoYXJBdCh0KSk7KTtyZXR1cm4gdH19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDQyNSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIG47cmV0dXJuIHIoZSwoZnVuY3Rpb24oZSxyLG8pe3JldHVybiEobj10KGUscixvKSl9KSksISFufX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNzU5KSxvPW4oMTM2KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmcihlLHQsbyl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big3NjApKCk7ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0LG4scil7Zm9yKHZhciBvPS0xLGE9T2JqZWN0KHQpLGk9cih0KSxzPWkubGVuZ3RoO3MtLTspe3ZhciB1PWlbZT9zOisrb107aWYoITE9PT1uKGFbdV0sdSxhKSlicmVha31yZXR1cm4gdH19fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMzcpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbihuLG8pe2lmKG51bGw9PW4pcmV0dXJuIG47aWYoIXIobikpcmV0dXJuIGUobixvKTtmb3IodmFyIGE9bi5sZW5ndGgsaT10P2E6LTEscz1PYmplY3Qobik7KHQ/aS0tOisraTxhKSYmITEhPT1vKHNbaV0saSxzKTspO3JldHVybiBufX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDEyMyksbz1uKDEzNyksYT1uKDE5NyksaT1uKDU5KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe2lmKCFpKG4pKXJldHVybiExO3ZhciBzPXR5cGVvZiB0O3JldHVybiEhKCJudW1iZXIiPT1zP28obikmJmEodCxuLmxlbmd0aCk6InN0cmluZyI9PXMmJnQgaW4gbikmJnIoblt0XSxlKX19LGZ1bmN0aW9uKGUsdCl7dmFyIG49eyImIjoiJmFtcDsiLCciJzoiJnF1b3Q7IiwiJyI6IiZhcG9zOyIsIjwiOiImbHQ7IiwiPiI6IiZndDsifTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUucmVwbGFjZT9lLnJlcGxhY2UoLyhbJiI8PiddKS9nLChmdW5jdGlvbihlLHQpe3JldHVybiBuW3RdfSkpOmV9fSxmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPW87dmFyIHI9bigyNTMpLkV2ZW50RW1pdHRlcjtmdW5jdGlvbiBvKCl7ci5jYWxsKHRoaXMpfW4oNjMpKG8sciksby5SZWFkYWJsZT1uKDI1NCksby5Xcml0YWJsZT1uKDc3MSksby5EdXBsZXg9big3NzIpLG8uVHJhbnNmb3JtPW4oNzczKSxvLlBhc3NUaHJvdWdoPW4oNzc0KSxvLlN0cmVhbT1vLG8ucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2Z1bmN0aW9uIG8odCl7ZS53cml0YWJsZSYmITE9PT1lLndyaXRlKHQpJiZuLnBhdXNlJiZuLnBhdXNlKCl9ZnVuY3Rpb24gYSgpe24ucmVhZGFibGUmJm4ucmVzdW1lJiZuLnJlc3VtZSgpfW4ub24oImRhdGEiLG8pLGUub24oImRyYWluIixhKSxlLl9pc1N0ZGlvfHx0JiYhMT09PXQuZW5kfHwobi5vbigiZW5kIixzKSxuLm9uKCJjbG9zZSIsdSkpO3ZhciBpPSExO2Z1bmN0aW9uIHMoKXtpfHwoaT0hMCxlLmVuZCgpKX1mdW5jdGlvbiB1KCl7aXx8KGk9ITAsImZ1bmN0aW9uIj09dHlwZW9mIGUuZGVzdHJveSYmZS5kZXN0cm95KCkpfWZ1bmN0aW9uIGMoZSl7aWYobCgpLDA9PT1yLmxpc3RlbmVyQ291bnQodGhpcywiZXJyb3IiKSl0aHJvdyBlfWZ1bmN0aW9uIGwoKXtuLnJlbW92ZUxpc3RlbmVyKCJkYXRhIixvKSxlLnJlbW92ZUxpc3RlbmVyKCJkcmFpbiIsYSksbi5yZW1vdmVMaXN0ZW5lcigiZW5kIixzKSxuLnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsdSksbi5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLGMpLGUucmVtb3ZlTGlzdGVuZXIoImVycm9yIixjKSxuLnJlbW92ZUxpc3RlbmVyKCJlbmQiLGwpLG4ucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixsKSxlLnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsbCl9cmV0dXJuIG4ub24oImVycm9yIixjKSxlLm9uKCJlcnJvciIsYyksbi5vbigiZW5kIixsKSxuLm9uKCJjbG9zZSIsbCksZS5vbigiY2xvc2UiLGwpLGUuZW1pdCgicGlwZSIsbiksZX19LGZ1bmN0aW9uKGUsdCl7fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNjQpLkJ1ZmZlcixvPW4oNzY3KTtlLmV4cG9ydHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7IWZ1bmN0aW9uKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsZSksdGhpcy5oZWFkPW51bGwsdGhpcy50YWlsPW51bGwsdGhpcy5sZW5ndGg9MH1yZXR1cm4gZS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihlKXt2YXIgdD17ZGF0YTplLG5leHQ6bnVsbH07dGhpcy5sZW5ndGg+MD90aGlzLnRhaWwubmV4dD10OnRoaXMuaGVhZD10LHRoaXMudGFpbD10LCsrdGhpcy5sZW5ndGh9LGUucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24oZSl7dmFyIHQ9e2RhdGE6ZSxuZXh0OnRoaXMuaGVhZH07MD09PXRoaXMubGVuZ3RoJiYodGhpcy50YWlsPXQpLHRoaXMuaGVhZD10LCsrdGhpcy5sZW5ndGh9LGUucHJvdG90eXBlLnNoaWZ0PWZ1bmN0aW9uKCl7aWYoMCE9PXRoaXMubGVuZ3RoKXt2YXIgZT10aGlzLmhlYWQuZGF0YTtyZXR1cm4gMT09PXRoaXMubGVuZ3RoP3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbDp0aGlzLmhlYWQ9dGhpcy5oZWFkLm5leHQsLS10aGlzLmxlbmd0aCxlfX0sZS5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmhlYWQ9dGhpcy50YWlsPW51bGwsdGhpcy5sZW5ndGg9MH0sZS5wcm90b3R5cGUuam9pbj1mdW5jdGlvbihlKXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIiI7Zm9yKHZhciB0PXRoaXMuaGVhZCxuPSIiK3QuZGF0YTt0PXQubmV4dDspbis9ZSt0LmRhdGE7cmV0dXJuIG59LGUucHJvdG90eXBlLmNvbmNhdD1mdW5jdGlvbihlKXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIHIuYWxsb2MoMCk7aWYoMT09PXRoaXMubGVuZ3RoKXJldHVybiB0aGlzLmhlYWQuZGF0YTtmb3IodmFyIHQsbixvLGE9ci5hbGxvY1Vuc2FmZShlPj4+MCksaT10aGlzLmhlYWQscz0wO2k7KXQ9aS5kYXRhLG49YSxvPXMsdC5jb3B5KG4sbykscys9aS5kYXRhLmxlbmd0aCxpPWkubmV4dDtyZXR1cm4gYX0sZX0oKSxvJiZvLmluc3BlY3QmJm8uaW5zcGVjdC5jdXN0b20mJihlLmV4cG9ydHMucHJvdG90eXBlW28uaW5zcGVjdC5jdXN0b21dPWZ1bmN0aW9uKCl7dmFyIGU9by5pbnNwZWN0KHtsZW5ndGg6dGhpcy5sZW5ndGh9KTtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lKyIgIitlfSl9LGZ1bmN0aW9uKGUsdCl7fSxmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKGUsdCl7IWZ1bmN0aW9uKGUsbil7InVzZSBzdHJpY3QiO2lmKCFlLnNldEltbWVkaWF0ZSl7dmFyIHIsbyxhLGkscyx1PTEsYz17fSxsPSExLHA9ZS5kb2N1bWVudCxmPU9iamVjdC5nZXRQcm90b3R5cGVPZiYmT2JqZWN0LmdldFByb3RvdHlwZU9mKGUpO2Y9ZiYmZi5zZXRUaW1lb3V0P2Y6ZSwiW29iamVjdCBwcm9jZXNzXSI9PT17fS50b1N0cmluZy5jYWxsKGUucHJvY2Vzcyk/cj1mdW5jdGlvbihlKXt0Lm5leHRUaWNrKChmdW5jdGlvbigpe2QoZSl9KSl9OiFmdW5jdGlvbigpe2lmKGUucG9zdE1lc3NhZ2UmJiFlLmltcG9ydFNjcmlwdHMpe3ZhciB0PSEwLG49ZS5vbm1lc3NhZ2U7cmV0dXJuIGUub25tZXNzYWdlPWZ1bmN0aW9uKCl7dD0hMX0sZS5wb3N0TWVzc2FnZSgiIiwiKiIpLGUub25tZXNzYWdlPW4sdH19KCk/ZS5NZXNzYWdlQ2hhbm5lbD8oKGE9bmV3IE1lc3NhZ2VDaGFubmVsKS5wb3J0MS5vbm1lc3NhZ2U9ZnVuY3Rpb24oZSl7ZChlLmRhdGEpfSxyPWZ1bmN0aW9uKGUpe2EucG9ydDIucG9zdE1lc3NhZ2UoZSl9KTpwJiYib25yZWFkeXN0YXRlY2hhbmdlImluIHAuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik/KG89cC5kb2N1bWVudEVsZW1lbnQscj1mdW5jdGlvbihlKXt2YXIgdD1wLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO3Qub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7ZChlKSx0Lm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLG8ucmVtb3ZlQ2hpbGQodCksdD1udWxsfSxvLmFwcGVuZENoaWxkKHQpfSk6cj1mdW5jdGlvbihlKXtzZXRUaW1lb3V0KGQsMCxlKX06KGk9InNldEltbWVkaWF0ZSQiK01hdGgucmFuZG9tKCkrIiQiLHM9ZnVuY3Rpb24odCl7dC5zb3VyY2U9PT1lJiYic3RyaW5nIj09dHlwZW9mIHQuZGF0YSYmMD09PXQuZGF0YS5pbmRleE9mKGkpJiZkKCt0LmRhdGEuc2xpY2UoaS5sZW5ndGgpKX0sZS5hZGRFdmVudExpc3RlbmVyP2UuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIscywhMSk6ZS5hdHRhY2hFdmVudCgib25tZXNzYWdlIixzKSxyPWZ1bmN0aW9uKHQpe2UucG9zdE1lc3NhZ2UoaSt0LCIqIil9KSxmLnNldEltbWVkaWF0ZT1mdW5jdGlvbihlKXsiZnVuY3Rpb24iIT10eXBlb2YgZSYmKGU9bmV3IEZ1bmN0aW9uKCIiK2UpKTtmb3IodmFyIHQ9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSksbj0wO248dC5sZW5ndGg7bisrKXRbbl09YXJndW1lbnRzW24rMV07dmFyIG89e2NhbGxiYWNrOmUsYXJnczp0fTtyZXR1cm4gY1t1XT1vLHIodSksdSsrfSxmLmNsZWFySW1tZWRpYXRlPWh9ZnVuY3Rpb24gaChlKXtkZWxldGUgY1tlXX1mdW5jdGlvbiBkKGUpe2lmKGwpc2V0VGltZW91dChkLDAsZSk7ZWxzZXt2YXIgdD1jW2VdO2lmKHQpe2w9ITA7dHJ5eyFmdW5jdGlvbihlKXt2YXIgdD1lLmNhbGxiYWNrLG49ZS5hcmdzO3N3aXRjaChuLmxlbmd0aCl7Y2FzZSAwOnQoKTticmVhaztjYXNlIDE6dChuWzBdKTticmVhaztjYXNlIDI6dChuWzBdLG5bMV0pO2JyZWFrO2Nhc2UgMzp0KG5bMF0sblsxXSxuWzJdKTticmVhaztkZWZhdWx0OnQuYXBwbHkodm9pZCAwLG4pfX0odCl9ZmluYWxseXtoKGUpLGw9ITF9fX19fSgidW5kZWZpbmVkIj09dHlwZW9mIHNlbGY/dm9pZCAwPT09ZT90aGlzOmU6c2VsZil9KS5jYWxsKHRoaXMsbig1MSksbig4OSkpfSxmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4oZSl7dHJ5e2lmKCF0LmxvY2FsU3RvcmFnZSlyZXR1cm4hMX1jYXRjaChlKXtyZXR1cm4hMX12YXIgbj10LmxvY2FsU3RvcmFnZVtlXTtyZXR1cm4gbnVsbCE9biYmInRydWUiPT09U3RyaW5nKG4pLnRvTG93ZXJDYXNlKCl9ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7aWYobigibm9EZXByZWNhdGlvbiIpKXJldHVybiBlO3ZhciByPSExO3JldHVybiBmdW5jdGlvbigpe2lmKCFyKXtpZihuKCJ0aHJvd0RlcHJlY2F0aW9uIikpdGhyb3cgbmV3IEVycm9yKHQpO24oInRyYWNlRGVwcmVjYXRpb24iKT9jb25zb2xlLnRyYWNlKHQpOmNvbnNvbGUud2Fybih0KSxyPSEwfXJldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19fSkuY2FsbCh0aGlzLG4oNTEpKX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9YTt2YXIgcj1uKDQzMSksbz1uKDE2Myk7ZnVuY3Rpb24gYShlKXtpZighKHRoaXMgaW5zdGFuY2VvZiBhKSlyZXR1cm4gbmV3IGEoZSk7ci5jYWxsKHRoaXMsZSl9by5pbmhlcml0cz1uKDYzKSxvLmluaGVyaXRzKGEsciksYS5wcm90b3R5cGUuX3RyYW5zZm9ybT1mdW5jdGlvbihlLHQsbil7bihudWxsLGUpfX0sZnVuY3Rpb24oZSx0LG4pe2UuZXhwb3J0cz1uKDI1NSl9LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9bigxMTYpfSxmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPW4oMjU0KS5UcmFuc2Zvcm19LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9bigyNTQpLlBhc3NUaHJvdWdofSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1mdW5jdGlvbigpe319LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9big3NzcpLG89TWF0aC5hYnMsYT1NYXRoLmZsb29yO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gaXNOYU4oZSk/MDowIT09KGU9TnVtYmVyKGUpKSYmaXNGaW5pdGUoZSk/cihlKSphKG8oZSkpOmV9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1uKDc3OCkoKT9NYXRoLnNpZ246big3NzkpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1mdW5jdGlvbigpe3ZhciBlPU1hdGguc2lnbjtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZSYmKDE9PT1lKDEwKSYmLTE9PT1lKC0yMCkpfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9TnVtYmVyKGUpLGlzTmFOKGUpfHwwPT09ZT9lOmU+MD8xOi0xfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDk5KSxvPW4oMjAwKSxhPW4oMTE5KSxpPW4oNzgyKSxzPW4oNDMzKTtlLmV4cG9ydHM9ZnVuY3Rpb24gZSh0KXt2YXIgbix1LGM7aWYocih0KSwobj1PYmplY3QoYXJndW1lbnRzWzFdKSkuYXN5bmMmJm4ucHJvbWlzZSl0aHJvdyBuZXcgRXJyb3IoIk9wdGlvbnMgJ2FzeW5jJyBhbmQgJ3Byb21pc2UnIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyIik7cmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwodCwiX19tZW1vaXplZF9fIikmJiFuLmZvcmNlP3Q6KHU9cyhuLmxlbmd0aCx0Lmxlbmd0aCxuLmFzeW5jJiZhLmFzeW5jKSxjPWkodCx1LG4pLG8oYSwoZnVuY3Rpb24oZSx0KXtuW3RdJiZlKG5bdF0sYyxuKX0pKSxlLl9fcHJvZmlsZXJfXyYmZS5fX3Byb2ZpbGVyX18oYyksYy51cGRhdGVFbnYoKSxjLm1lbW9pemVkKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9big5OSksbz1uKDEzOSksYT1GdW5jdGlvbi5wcm90b3R5cGUuYmluZCxpPUZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsLHM9T2JqZWN0LmtleXMsdT1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbihuLGMpe3ZhciBsLHA9YXJndW1lbnRzWzJdLGY9YXJndW1lbnRzWzNdO3JldHVybiBuPU9iamVjdChvKG4pKSxyKGMpLGw9cyhuKSxmJiZsLnNvcnQoImZ1bmN0aW9uIj09dHlwZW9mIGY/YS5jYWxsKGYsbik6dm9pZCAwKSwiZnVuY3Rpb24iIT10eXBlb2YgZSYmKGU9bFtlXSksaS5jYWxsKGUsbCwoZnVuY3Rpb24oZSxyKXtyZXR1cm4gdS5jYWxsKG4sZSk/aS5jYWxsKGMscCxuW2VdLGUsbixyKTp0fSkpfX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9big3ODMpLG89big0MzUpLGE9bigxMjApLGk9big3OTcpLm1ldGhvZHMscz1uKDc5OCksdT1uKDgxNCksYz1GdW5jdGlvbi5wcm90b3R5cGUuYXBwbHksbD1GdW5jdGlvbi5wcm90b3R5cGUuY2FsbCxwPU9iamVjdC5jcmVhdGUsZj1PYmplY3QuZGVmaW5lUHJvcGVydGllcyxoPWkub24sZD1pLmVtaXQ7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgaSxtLHYsZyx5LGIsXyx3LHgsRSxTLEMsQSxPLGssaj1wKG51bGwpO3JldHVybiBtPSExIT09dD90OmlzTmFOKGUubGVuZ3RoKT8xOmUubGVuZ3RoLG4ubm9ybWFsaXplciYmKEU9dShuLm5vcm1hbGl6ZXIpLHY9RS5nZXQsZz1FLnNldCx5PUUuZGVsZXRlLGI9RS5jbGVhciksbnVsbCE9bi5yZXNvbHZlcnMmJihrPXMobi5yZXNvbHZlcnMpKSxPPXY/bygoZnVuY3Rpb24odCl7dmFyIG4sbyxhPWFyZ3VtZW50cztpZihrJiYoYT1rKGEpKSxudWxsIT09KG49dihhKSkmJmhhc093blByb3BlcnR5LmNhbGwoaixuKSlyZXR1cm4gUyYmaS5lbWl0KCJnZXQiLG4sYSx0aGlzKSxqW25dO2lmKG89MT09PWEubGVuZ3RoP2wuY2FsbChlLHRoaXMsYVswXSk6Yy5jYWxsKGUsdGhpcyxhKSxudWxsPT09bil7aWYobnVsbCE9PShuPXYoYSkpKXRocm93IHIoIkNpcmN1bGFyIGludm9jYXRpb24iLCJDSVJDVUxBUl9JTlZPQ0FUSU9OIik7bj1nKGEpfWVsc2UgaWYoaGFzT3duUHJvcGVydHkuY2FsbChqLG4pKXRocm93IHIoIkNpcmN1bGFyIGludm9jYXRpb24iLCJDSVJDVUxBUl9JTlZPQ0FUSU9OIik7cmV0dXJuIGpbbl09byxDJiZpLmVtaXQoInNldCIsbixudWxsLG8pLG99KSxtKTowPT09dD9mdW5jdGlvbigpe3ZhciB0O2lmKGhhc093blByb3BlcnR5LmNhbGwoaiwiZGF0YSIpKXJldHVybiBTJiZpLmVtaXQoImdldCIsImRhdGEiLGFyZ3VtZW50cyx0aGlzKSxqLmRhdGE7aWYodD1hcmd1bWVudHMubGVuZ3RoP2MuY2FsbChlLHRoaXMsYXJndW1lbnRzKTpsLmNhbGwoZSx0aGlzKSxoYXNPd25Qcm9wZXJ0eS5jYWxsKGosImRhdGEiKSl0aHJvdyByKCJDaXJjdWxhciBpbnZvY2F0aW9uIiwiQ0lSQ1VMQVJfSU5WT0NBVElPTiIpO3JldHVybiBqLmRhdGE9dCxDJiZpLmVtaXQoInNldCIsImRhdGEiLG51bGwsdCksdH06ZnVuY3Rpb24odCl7dmFyIG4sbyxhPWFyZ3VtZW50cztpZihrJiYoYT1rKGFyZ3VtZW50cykpLG89U3RyaW5nKGFbMF0pLGhhc093blByb3BlcnR5LmNhbGwoaixvKSlyZXR1cm4gUyYmaS5lbWl0KCJnZXQiLG8sYSx0aGlzKSxqW29dO2lmKG49MT09PWEubGVuZ3RoP2wuY2FsbChlLHRoaXMsYVswXSk6Yy5jYWxsKGUsdGhpcyxhKSxoYXNPd25Qcm9wZXJ0eS5jYWxsKGosbykpdGhyb3cgcigiQ2lyY3VsYXIgaW52b2NhdGlvbiIsIkNJUkNVTEFSX0lOVk9DQVRJT04iKTtyZXR1cm4galtvXT1uLEMmJmkuZW1pdCgic2V0IixvLG51bGwsbiksbn0saT17b3JpZ2luYWw6ZSxtZW1vaXplZDpPLHByb2ZpbGVOYW1lOm4ucHJvZmlsZU5hbWUsZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBrJiYoZT1rKGUpKSx2P3YoZSk6U3RyaW5nKGVbMF0pfSxoYXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoaixlKX0sZGVsZXRlOmZ1bmN0aW9uKGUpe3ZhciB0O2hhc093blByb3BlcnR5LmNhbGwoaixlKSYmKHkmJnkoZSksdD1qW2VdLGRlbGV0ZSBqW2VdLEEmJmkuZW1pdCgiZGVsZXRlIixlLHQpKX0sY2xlYXI6ZnVuY3Rpb24oKXt2YXIgZT1qO2ImJmIoKSxqPXAobnVsbCksaS5lbWl0KCJjbGVhciIsZSl9LG9uOmZ1bmN0aW9uKGUsdCl7cmV0dXJuImdldCI9PT1lP1M9ITA6InNldCI9PT1lP0M9ITA6ImRlbGV0ZSI9PT1lJiYoQT0hMCksaC5jYWxsKHRoaXMsZSx0KX0sZW1pdDpkLHVwZGF0ZUVudjpmdW5jdGlvbigpe2U9aS5vcmlnaW5hbH19LF89dj9vKChmdW5jdGlvbihlKXt2YXIgdCxuPWFyZ3VtZW50cztrJiYobj1rKG4pKSxudWxsIT09KHQ9dihuKSkmJmkuZGVsZXRlKHQpfSksbSk6MD09PXQ/ZnVuY3Rpb24oKXtyZXR1cm4gaS5kZWxldGUoImRhdGEiKX06ZnVuY3Rpb24oZSl7cmV0dXJuIGsmJihlPWsoYXJndW1lbnRzKVswXSksaS5kZWxldGUoZSl9LHc9bygoZnVuY3Rpb24oKXt2YXIgZSxuPWFyZ3VtZW50cztyZXR1cm4gMD09PXQ/ai5kYXRhOihrJiYobj1rKG4pKSxlPXY/dihuKTpTdHJpbmcoblswXSksaltlXSl9KSkseD1vKChmdW5jdGlvbigpe3ZhciBlLG49YXJndW1lbnRzO3JldHVybiAwPT09dD9pLmhhcygiZGF0YSIpOihrJiYobj1rKG4pKSxudWxsIT09KGU9dj92KG4pOlN0cmluZyhuWzBdKSkmJmkuaGFzKGUpKX0pKSxmKE8se19fbWVtb2l6ZWRfXzphKCEwKSxkZWxldGU6YShfKSxjbGVhcjphKGkuY2xlYXIpLF9nZXQ6YSh3KSxfaGFzOmEoeCl9KSxpfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDQzNCksbz1uKDc4OSksYT1uKDExNyksaT1FcnJvci5jYXB0dXJlU3RhY2tUcmFjZTtlLmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIG49bmV3IEVycm9yKHQpLHM9YXJndW1lbnRzWzFdLHU9YXJndW1lbnRzWzJdO3JldHVybiBhKHUpfHxvKHMpJiYodT1zLHM9bnVsbCksYSh1KSYmcihuLHUpLGEocykmJihuLmNvZGU9cyksaSYmaShuLGUuZXhwb3J0cyksbn19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKCl7dmFyIGUsdD1PYmplY3QuYXNzaWduO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYodChlPXtmb286InJheiJ9LHtiYXI6ImR3YSJ9LHt0cnp5OiJ0cnp5In0pLGUuZm9vK2UuYmFyK2UudHJ6eT09PSJyYXpkd2F0cnp5Iil9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNzg2KSxvPW4oMTM5KSxhPU1hdGgubWF4O2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciBuLGkscyx1PWEoYXJndW1lbnRzLmxlbmd0aCwyKTtmb3IoZT1PYmplY3QobyhlKSkscz1mdW5jdGlvbihyKXt0cnl7ZVtyXT10W3JdfWNhdGNoKGUpe258fChuPWUpfX0saT0xO2k8dTsrK2kpcih0PWFyZ3VtZW50c1tpXSkuZm9yRWFjaChzKTtpZih2b2lkIDAhPT1uKXRocm93IG47cmV0dXJuIGV9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1uKDc4NykoKT9PYmplY3Qua2V5czpuKDc4OCl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBPYmplY3Qua2V5cygicHJpbWl0aXZlIiksITB9Y2F0Y2goZSl7cmV0dXJuITF9fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDExNyksbz1PYmplY3Qua2V5cztlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIG8ocihlKT9PYmplY3QoZSk6ZSl9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTE3KSxvPXtmdW5jdGlvbjohMCxvYmplY3Q6ITB9O2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gcihlKSYmb1t0eXBlb2YgZV18fCExfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDc5MSksbz0vXlxzKmNsYXNzW1xzey99XS8sYT1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiEhcihlKSYmIW8udGVzdChhLmNhbGwoZSkpfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDc5Mik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXJldHVybiExO2lmKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKGUsImxlbmd0aCIpKXJldHVybiExO3RyeXtpZigibnVtYmVyIiE9dHlwZW9mIGUubGVuZ3RoKXJldHVybiExO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlLmNhbGwpcmV0dXJuITE7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUuYXBwbHkpcmV0dXJuITF9Y2F0Y2goZSl7cmV0dXJuITF9cmV0dXJuIXIoZSl9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNzkzKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYoIXIoZSkpcmV0dXJuITE7dHJ5e3JldHVybiEhZS5jb25zdHJ1Y3RvciYmZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGU9PT1lfWNhdGNoKGUpe3JldHVybiExfX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9big0MzcpLG89e29iamVjdDohMCxmdW5jdGlvbjohMCx1bmRlZmluZWQ6ITB9O2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4hIXIoZSkmJmhhc093blByb3BlcnR5LmNhbGwobyx0eXBlb2YgZSl9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1uKDc5NSkoKT9TdHJpbmcucHJvdG90eXBlLmNvbnRhaW5zOm4oNzk2KX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj0icmF6ZHdhdHJ6eSI7ZS5leHBvcnRzPWZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHIuY29udGFpbnMmJighMD09PXIuY29udGFpbnMoImR3YSIpJiYhMT09PXIuY29udGFpbnMoImZvbyIpKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9U3RyaW5nLnByb3RvdHlwZS5pbmRleE9mO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gci5jYWxsKHRoaXMsZSxhcmd1bWVudHNbMV0pPi0xfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcixvLGEsaSxzLHUsYyxsPW4oMTIwKSxwPW4oOTkpLGY9RnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LGg9RnVuY3Rpb24ucHJvdG90eXBlLmNhbGwsZD1PYmplY3QuY3JlYXRlLG09T2JqZWN0LmRlZmluZVByb3BlcnR5LHY9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMsZz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHk9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwfTtvPWZ1bmN0aW9uKGUsdCl7dmFyIG4sbztyZXR1cm4gcCh0KSxvPXRoaXMsci5jYWxsKHRoaXMsZSxuPWZ1bmN0aW9uKCl7YS5jYWxsKG8sZSxuKSxmLmNhbGwodCx0aGlzLGFyZ3VtZW50cyl9KSxuLl9fZWVPbmNlTGlzdGVuZXJfXz10LHRoaXN9LHM9e29uOnI9ZnVuY3Rpb24oZSx0KXt2YXIgbjtyZXR1cm4gcCh0KSxnLmNhbGwodGhpcywiX19lZV9fIik/bj10aGlzLl9fZWVfXzoobj15LnZhbHVlPWQobnVsbCksbSh0aGlzLCJfX2VlX18iLHkpLHkudmFsdWU9bnVsbCksbltlXT8ib2JqZWN0Ij09dHlwZW9mIG5bZV0/bltlXS5wdXNoKHQpOm5bZV09W25bZV0sdF06bltlXT10LHRoaXN9LG9uY2U6byxvZmY6YT1mdW5jdGlvbihlLHQpe3ZhciBuLHIsbyxhO2lmKHAodCksIWcuY2FsbCh0aGlzLCJfX2VlX18iKSlyZXR1cm4gdGhpcztpZighKG49dGhpcy5fX2VlX18pW2VdKXJldHVybiB0aGlzO2lmKCJvYmplY3QiPT10eXBlb2Yocj1uW2VdKSlmb3IoYT0wO289clthXTsrK2EpbyE9PXQmJm8uX19lZU9uY2VMaXN0ZW5lcl9fIT09dHx8KDI9PT1yLmxlbmd0aD9uW2VdPXJbYT8wOjFdOnIuc3BsaWNlKGEsMSkpO2Vsc2UgciE9PXQmJnIuX19lZU9uY2VMaXN0ZW5lcl9fIT09dHx8ZGVsZXRlIG5bZV07cmV0dXJuIHRoaXN9LGVtaXQ6aT1mdW5jdGlvbihlKXt2YXIgdCxuLHIsbyxhO2lmKGcuY2FsbCh0aGlzLCJfX2VlX18iKSYmKG89dGhpcy5fX2VlX19bZV0pKWlmKCJvYmplY3QiPT10eXBlb2Ygbyl7Zm9yKG49YXJndW1lbnRzLmxlbmd0aCxhPW5ldyBBcnJheShuLTEpLHQ9MTt0PG47Kyt0KWFbdC0xXT1hcmd1bWVudHNbdF07Zm9yKG89by5zbGljZSgpLHQ9MDtyPW9bdF07Kyt0KWYuY2FsbChyLHRoaXMsYSl9ZWxzZSBzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAxOmguY2FsbChvLHRoaXMpO2JyZWFrO2Nhc2UgMjpoLmNhbGwobyx0aGlzLGFyZ3VtZW50c1sxXSk7YnJlYWs7Y2FzZSAzOmguY2FsbChvLHRoaXMsYXJndW1lbnRzWzFdLGFyZ3VtZW50c1syXSk7YnJlYWs7ZGVmYXVsdDpmb3Iobj1hcmd1bWVudHMubGVuZ3RoLGE9bmV3IEFycmF5KG4tMSksdD0xO3Q8bjsrK3QpYVt0LTFdPWFyZ3VtZW50c1t0XTtmLmNhbGwobyx0aGlzLGEpfX19LHU9e29uOmwociksb25jZTpsKG8pLG9mZjpsKGEpLGVtaXQ6bChpKX0sYz12KHt9LHUpLGUuZXhwb3J0cz10PWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP2QoYyk6dihPYmplY3QoZSksdSl9LHQubWV0aG9kcz1zfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByLG89big3OTkpLGE9bigxMTcpLGk9big5OSkscz1BcnJheS5wcm90b3R5cGUuc2xpY2U7cj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5tYXAoKGZ1bmN0aW9uKHQsbil7cmV0dXJuIHQ/dChlW25dKTplW25dfSkpLmNvbmNhdChzLmNhbGwoZSx0aGlzLmxlbmd0aCkpfSxlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuKGU9byhlKSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7YShlKSYmaShlKX0pKSxyLmJpbmQoZSl9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMjU2KSxvPUFycmF5LmlzQXJyYXk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBvKGUpP2U6cihlKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKCl7dmFyIGUsdCxuPUFycmF5LmZyb207cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG4mJih0PW4oZT1bInJheiIsImR3YSJdKSxCb29sZWFuKHQmJnQhPT1lJiYiZHdhIj09PXRbMV0pKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9big4MDIpLml0ZXJhdG9yLG89big4MTEpLGE9big4MTIpLGk9bigxMTgpLHM9big5OSksdT1uKDEzOSksYz1uKDExNyksbD1uKDgxMykscD1BcnJheS5pc0FycmF5LGY9RnVuY3Rpb24ucHJvdG90eXBlLmNhbGwsaD17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bnVsbH0sZD1PYmplY3QuZGVmaW5lUHJvcGVydHk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0LG4sbSx2LGcseSxiLF8sdyx4LEU9YXJndW1lbnRzWzFdLFM9YXJndW1lbnRzWzJdO2lmKGU9T2JqZWN0KHUoZSkpLGMoRSkmJnMoRSksdGhpcyYmdGhpcyE9PUFycmF5JiZhKHRoaXMpKXQ9dGhpcztlbHNle2lmKCFFKXtpZihvKGUpKXJldHVybiAxIT09KGc9ZS5sZW5ndGgpP0FycmF5LmFwcGx5KG51bGwsZSk6KCh2PW5ldyBBcnJheSgxKSlbMF09ZVswXSx2KTtpZihwKGUpKXtmb3Iodj1uZXcgQXJyYXkoZz1lLmxlbmd0aCksbj0wO248ZzsrK24pdltuXT1lW25dO3JldHVybiB2fX12PVtdfWlmKCFwKGUpKWlmKHZvaWQgMCE9PSh3PWVbcl0pKXtmb3IoYj1zKHcpLmNhbGwoZSksdCYmKHY9bmV3IHQpLF89Yi5uZXh0KCksbj0wOyFfLmRvbmU7KXg9RT9mLmNhbGwoRSxTLF8udmFsdWUsbik6Xy52YWx1ZSx0PyhoLnZhbHVlPXgsZCh2LG4saCkpOnZbbl09eCxfPWIubmV4dCgpLCsrbjtnPW59ZWxzZSBpZihsKGUpKXtmb3IoZz1lLmxlbmd0aCx0JiYodj1uZXcgdCksbj0wLG09MDtuPGc7KytuKXg9ZVtuXSxuKzE8ZyYmKHk9eC5jaGFyQ29kZUF0KDApKT49NTUyOTYmJnk8PTU2MzE5JiYoeCs9ZVsrK25dKSx4PUU/Zi5jYWxsKEUsUyx4LG0pOngsdD8oaC52YWx1ZT14LGQodixtLGgpKTp2W21dPXgsKyttO2c9bX1pZih2b2lkIDA9PT1nKWZvcihnPWkoZS5sZW5ndGgpLHQmJih2PW5ldyB0KGcpKSxuPTA7bjxnOysrbil4PUU/Zi5jYWxsKEUsUyxlW25dLG4pOmVbbl0sdD8oaC52YWx1ZT14LGQodixuLGgpKTp2W25dPXg7cmV0dXJuIHQmJihoLnZhbHVlPW51bGwsdi5sZW5ndGg9Zyksdn19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPW4oODAzKSgpP24oMjAxKS5TeW1ib2w6big4MDYpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMjAxKSxvPXtvYmplY3Q6ITAsc3ltYm9sOiEwfTtlLmV4cG9ydHM9ZnVuY3Rpb24oKXt2YXIgZSx0PXIuU3ltYm9sO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXJldHVybiExO2U9dCgidGVzdCBzeW1ib2wiKTt0cnl7U3RyaW5nKGUpfWNhdGNoKGUpe3JldHVybiExfXJldHVybiEhb1t0eXBlb2YgdC5pdGVyYXRvcl0mJighIW9bdHlwZW9mIHQudG9QcmltaXRpdmVdJiYhIW9bdHlwZW9mIHQudG9TdHJpbmdUYWddKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiYoISFnbG9iYWxUaGlzJiZnbG9iYWxUaGlzLkFycmF5PT09QXJyYXkpfX0sZnVuY3Rpb24oZSx0KXt2YXIgbj1mdW5jdGlvbigpe2lmKCJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZilyZXR1cm4gc2VsZjtpZigib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93KXJldHVybiB3aW5kb3c7dGhyb3cgbmV3IEVycm9yKCJVbmFibGUgdG8gcmVzb2x2ZSBnbG9iYWwgYHRoaXNgIil9O2UuZXhwb3J0cz1mdW5jdGlvbigpe2lmKHRoaXMpcmV0dXJuIHRoaXM7dHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eShPYmplY3QucHJvdG90eXBlLCJfX2dsb2JhbF9fIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGNvbmZpZ3VyYWJsZTohMH0pfWNhdGNoKGUpe3JldHVybiBuKCl9dHJ5e3JldHVybiBfX2dsb2JhbF9ffHxuKCl9ZmluYWxseXtkZWxldGUgT2JqZWN0LnByb3RvdHlwZS5fX2dsb2JhbF9ffX0oKX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcixvLGEsaT1uKDEyMCkscz1uKDQzOCksdT1uKDIwMSkuU3ltYm9sLGM9big4MDgpLGw9big4MDkpLHA9big4MTApLGY9T2JqZWN0LmNyZWF0ZSxoPU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLGQ9T2JqZWN0LmRlZmluZVByb3BlcnR5O2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB1KXRyeXtTdHJpbmcodSgpKSxhPSEwfWNhdGNoKGUpe31lbHNlIHU9bnVsbDtvPWZ1bmN0aW9uKGUpe2lmKHRoaXMgaW5zdGFuY2VvZiBvKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiByKGUpfSxlLmV4cG9ydHM9cj1mdW5jdGlvbiBlKHQpe3ZhciBuO2lmKHRoaXMgaW5zdGFuY2VvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3JldHVybiBhP3UodCk6KG49ZihvLnByb3RvdHlwZSksdD12b2lkIDA9PT10PyIiOlN0cmluZyh0KSxoKG4se19fZGVzY3JpcHRpb25fXzppKCIiLHQpLF9fbmFtZV9fOmkoIiIsYyh0KSl9KSl9LGwocikscChyKSxoKG8ucHJvdG90eXBlLHtjb25zdHJ1Y3RvcjppKHIpLHRvU3RyaW5nOmkoIiIsKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19uYW1lX199KSl9KSxoKHIucHJvdG90eXBlLHt0b1N0cmluZzppKChmdW5jdGlvbigpe3JldHVybiJTeW1ib2wgKCIrcyh0aGlzKS5fX2Rlc2NyaXB0aW9uX18rIikifSkpLHZhbHVlT2Y6aSgoZnVuY3Rpb24oKXtyZXR1cm4gcyh0aGlzKX0pKX0pLGQoci5wcm90b3R5cGUsci50b1ByaW1pdGl2ZSxpKCIiLChmdW5jdGlvbigpe3ZhciBlPXModGhpcyk7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiBlP2U6ZS50b1N0cmluZygpfSkpKSxkKHIucHJvdG90eXBlLHIudG9TdHJpbmdUYWcsaSgiYyIsIlN5bWJvbCIpKSxkKG8ucHJvdG90eXBlLHIudG9TdHJpbmdUYWcsaSgiYyIsci5wcm90b3R5cGVbci50b1N0cmluZ1RhZ10pKSxkKG8ucHJvdG90eXBlLHIudG9QcmltaXRpdmUsaSgiYyIsci5wcm90b3R5cGVbci50b1ByaW1pdGl2ZV0pKX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuISFlJiYoInN5bWJvbCI9PXR5cGVvZiBlfHwhIWUuY29uc3RydWN0b3ImJigiU3ltYm9sIj09PWUuY29uc3RydWN0b3IubmFtZSYmIlN5bWJvbCI9PT1lW2UuY29uc3RydWN0b3IudG9TdHJpbmdUYWddKSl9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTIwKSxvPU9iamVjdC5jcmVhdGUsYT1PYmplY3QuZGVmaW5lUHJvcGVydHksaT1PYmplY3QucHJvdG90eXBlLHM9byhudWxsKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG4sbz0wO3NbZSsob3x8IiIpXTspKytvO3JldHVybiBzW2UrPW98fCIiXT0hMCxhKGksdD0iQEAiK2Usci5ncyhudWxsLChmdW5jdGlvbihlKXtufHwobj0hMCxhKHRoaXMsdCxyKGUpKSxuPSExKX0pKSksdH19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxMjApLG89bigyMDEpLlN5bWJvbDtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUse2hhc0luc3RhbmNlOnIoIiIsbyYmby5oYXNJbnN0YW5jZXx8ZSgiaGFzSW5zdGFuY2UiKSksaXNDb25jYXRTcHJlYWRhYmxlOnIoIiIsbyYmby5pc0NvbmNhdFNwcmVhZGFibGV8fGUoImlzQ29uY2F0U3ByZWFkYWJsZSIpKSxpdGVyYXRvcjpyKCIiLG8mJm8uaXRlcmF0b3J8fGUoIml0ZXJhdG9yIikpLG1hdGNoOnIoIiIsbyYmby5tYXRjaHx8ZSgibWF0Y2giKSkscmVwbGFjZTpyKCIiLG8mJm8ucmVwbGFjZXx8ZSgicmVwbGFjZSIpKSxzZWFyY2g6cigiIixvJiZvLnNlYXJjaHx8ZSgic2VhcmNoIikpLHNwZWNpZXM6cigiIixvJiZvLnNwZWNpZXN8fGUoInNwZWNpZXMiKSksc3BsaXQ6cigiIixvJiZvLnNwbGl0fHxlKCJzcGxpdCIpKSx0b1ByaW1pdGl2ZTpyKCIiLG8mJm8udG9QcmltaXRpdmV8fGUoInRvUHJpbWl0aXZlIikpLHRvU3RyaW5nVGFnOnIoIiIsbyYmby50b1N0cmluZ1RhZ3x8ZSgidG9TdHJpbmdUYWciKSksdW5zY29wYWJsZXM6cigiIixvJiZvLnVuc2NvcGFibGVzfHxlKCJ1bnNjb3BhYmxlcyIpKX0pfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDEyMCksbz1uKDQzOCksYT1PYmplY3QuY3JlYXRlKG51bGwpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSx7Zm9yOnIoKGZ1bmN0aW9uKHQpe3JldHVybiBhW3RdP2FbdF06YVt0XT1lKFN0cmluZyh0KSl9KSksa2V5Rm9yOnIoKGZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0IGluIG8oZSksYSlpZihhW3RdPT09ZSlyZXR1cm4gdH0pKX0pfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLG89ci5jYWxsKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiByLmNhbGwoZSk9PT1vfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLG89UmVnRXhwLnByb3RvdHlwZS50ZXN0LmJpbmQoL15bb2JqZWN0IFtBLVphLXowLTldKkZ1bmN0aW9uXSQvKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUmJm8oci5jYWxsKGUpKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxvPXIuY2FsbCgiIik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZXx8ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYoZSBpbnN0YW5jZW9mIFN0cmluZ3x8ci5jYWxsKGUpPT09byl8fCExfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDk5KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGU/e3NldDplLGdldDplfToodD17Z2V0OnIoZS5nZXQpfSx2b2lkIDAhPT1lLnNldD8odC5zZXQ9cihlLnNldCksZS5kZWxldGUmJih0LmRlbGV0ZT1yKGUuZGVsZXRlKSksZS5jbGVhciYmKHQuY2xlYXI9cihlLmNsZWFyKSksdCk6KHQuc2V0PXQuZ2V0LHQpKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0LG4scj1lLmxlbmd0aDtpZighcilyZXR1cm4iAiI7Zm9yKHQ9U3RyaW5nKGVbbj0wXSk7LS1yOyl0Kz0iASIrZVsrK25dO3JldHVybiB0fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGU/ZnVuY3Rpb24odCl7Zm9yKHZhciBuPVN0cmluZyh0WzBdKSxyPTAsbz1lOy0tbzspbis9IgEiK3RbKytyXTtyZXR1cm4gbn06ZnVuY3Rpb24oKXtyZXR1cm4iIn19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMjU3KSxvPU9iamVjdC5jcmVhdGU7ZS5leHBvcnRzPWZ1bmN0aW9uKCl7dmFyIGU9MCx0PVtdLG49byhudWxsKTtyZXR1cm57Z2V0OmZ1bmN0aW9uKGUpe3ZhciBuLG89MCxhPXQsaT1lLmxlbmd0aDtpZigwPT09aSlyZXR1cm4gYVtpXXx8bnVsbDtpZihhPWFbaV0pe2Zvcig7bzxpLTE7KXtpZigtMT09PShuPXIuY2FsbChhWzBdLGVbb10pKSlyZXR1cm4gbnVsbDthPWFbMV1bbl0sKytvfXJldHVybi0xPT09KG49ci5jYWxsKGFbMF0sZVtvXSkpP251bGw6YVsxXVtuXXx8bnVsbH1yZXR1cm4gbnVsbH0sc2V0OmZ1bmN0aW9uKG8pe3ZhciBhLGk9MCxzPXQsdT1vLmxlbmd0aDtpZigwPT09dSlzW3VdPSsrZTtlbHNle2ZvcihzW3VdfHwoc1t1XT1bW10sW11dKSxzPXNbdV07aTx1LTE7KS0xPT09KGE9ci5jYWxsKHNbMF0sb1tpXSkpJiYoYT1zWzBdLnB1c2gob1tpXSktMSxzWzFdLnB1c2goW1tdLFtdXSkpLHM9c1sxXVthXSwrK2k7LTE9PT0oYT1yLmNhbGwoc1swXSxvW2ldKSkmJihhPXNbMF0ucHVzaChvW2ldKS0xKSxzWzFdW2FdPSsrZX1yZXR1cm4gbltlXT1vLGV9LGRlbGV0ZTpmdW5jdGlvbihlKXt2YXIgbyxhPTAsaT10LHM9bltlXSx1PXMubGVuZ3RoLGM9W107aWYoMD09PXUpZGVsZXRlIGlbdV07ZWxzZSBpZihpPWlbdV0pe2Zvcig7YTx1LTE7KXtpZigtMT09PShvPXIuY2FsbChpWzBdLHNbYV0pKSlyZXR1cm47Yy5wdXNoKGksbyksaT1pWzFdW29dLCsrYX1pZigtMT09PShvPXIuY2FsbChpWzBdLHNbYV0pKSlyZXR1cm47Zm9yKGU9aVsxXVtvXSxpWzBdLnNwbGljZShvLDEpLGlbMV0uc3BsaWNlKG8sMSk7IWlbMF0ubGVuZ3RoJiZjLmxlbmd0aDspbz1jLnBvcCgpLChpPWMucG9wKCkpWzBdLnNwbGljZShvLDEpLGlbMV0uc3BsaWNlKG8sMSl9ZGVsZXRlIG5bZV19LGNsZWFyOmZ1bmN0aW9uKCl7dD1bXSxuPW8obnVsbCl9fX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPW4oODE5KSgpP051bWJlci5pc05hTjpuKDgyMCl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKCl7dmFyIGU9TnVtYmVyLmlzTmFOO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYoIWUoe30pJiZlKE5hTikmJiFlKDM0KSl9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gZSE9ZX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyNTcpO2UuZXhwb3J0cz1mdW5jdGlvbigpe3ZhciBlPTAsdD1bXSxuPVtdO3JldHVybntnZXQ6ZnVuY3Rpb24oZSl7dmFyIG89ci5jYWxsKHQsZVswXSk7cmV0dXJuLTE9PT1vP251bGw6bltvXX0sc2V0OmZ1bmN0aW9uKHIpe3JldHVybiB0LnB1c2goclswXSksbi5wdXNoKCsrZSksZX0sZGVsZXRlOmZ1bmN0aW9uKGUpe3ZhciBvPXIuY2FsbChuLGUpOy0xIT09byYmKHQuc3BsaWNlKG8sMSksbi5zcGxpY2UobywxKSl9LGNsZWFyOmZ1bmN0aW9uKCl7dD1bXSxuPVtdfX19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMjU3KSxvPU9iamVjdC5jcmVhdGU7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PTAsbj1bW10sW11dLGE9byhudWxsKTtyZXR1cm57Z2V0OmZ1bmN0aW9uKHQpe2Zvcih2YXIgbyxhPTAsaT1uO2E8ZS0xOyl7aWYoLTE9PT0obz1yLmNhbGwoaVswXSx0W2FdKSkpcmV0dXJuIG51bGw7aT1pWzFdW29dLCsrYX1yZXR1cm4tMT09PShvPXIuY2FsbChpWzBdLHRbYV0pKT9udWxsOmlbMV1bb118fG51bGx9LHNldDpmdW5jdGlvbihvKXtmb3IodmFyIGkscz0wLHU9bjtzPGUtMTspLTE9PT0oaT1yLmNhbGwodVswXSxvW3NdKSkmJihpPXVbMF0ucHVzaChvW3NdKS0xLHVbMV0ucHVzaChbW10sW11dKSksdT11WzFdW2ldLCsrcztyZXR1cm4tMT09PShpPXIuY2FsbCh1WzBdLG9bc10pKSYmKGk9dVswXS5wdXNoKG9bc10pLTEpLHVbMV1baV09Kyt0LGFbdF09byx0fSxkZWxldGU6ZnVuY3Rpb24odCl7Zm9yKHZhciBvLGk9MCxzPW4sdT1bXSxjPWFbdF07aTxlLTE7KXtpZigtMT09PShvPXIuY2FsbChzWzBdLGNbaV0pKSlyZXR1cm47dS5wdXNoKHMsbykscz1zWzFdW29dLCsraX1pZigtMSE9PShvPXIuY2FsbChzWzBdLGNbaV0pKSl7Zm9yKHQ9c1sxXVtvXSxzWzBdLnNwbGljZShvLDEpLHNbMV0uc3BsaWNlKG8sMSk7IXNbMF0ubGVuZ3RoJiZ1Lmxlbmd0aDspbz11LnBvcCgpLChzPXUucG9wKCkpWzBdLnNwbGljZShvLDEpLHNbMV0uc3BsaWNlKG8sMSk7ZGVsZXRlIGFbdF19fSxjbGVhcjpmdW5jdGlvbigpe249W1tdLFtdXSxhPW8obnVsbCl9fX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyNTYpLG89big0MzkpLGE9big0MzYpLGk9big0MzUpLHM9bigyNTgpLHU9QXJyYXkucHJvdG90eXBlLnNsaWNlLGM9RnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LGw9T2JqZWN0LmNyZWF0ZTtuKDExOSkuYXN5bmM9ZnVuY3Rpb24oZSx0KXt2YXIgbixwLGYsaD1sKG51bGwpLGQ9bChudWxsKSxtPXQubWVtb2l6ZWQsdj10Lm9yaWdpbmFsO3QubWVtb2l6ZWQ9aSgoZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLHI9dFt0Lmxlbmd0aC0xXTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgciYmKG49cix0PXUuY2FsbCh0LDAsLTEpKSxtLmFwcGx5KHA9dGhpcyxmPXQpfSksbSk7dHJ5e2EodC5tZW1vaXplZCxtKX1jYXRjaChlKXt9dC5vbigiZ2V0IiwoZnVuY3Rpb24oZSl7dmFyIHIsbyxhO2lmKG4pe2lmKGhbZV0pcmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGhbZV0/aFtlXT1baFtlXSxuXTpoW2VdLnB1c2gobiksdm9pZChuPW51bGwpO3I9bixvPXAsYT1mLG49cD1mPW51bGwscygoZnVuY3Rpb24oKXt2YXIgaTtoYXNPd25Qcm9wZXJ0eS5jYWxsKGQsZSk/KGk9ZFtlXSx0LmVtaXQoImdldGFzeW5jIixlLGEsbyksYy5jYWxsKHIsaS5jb250ZXh0LGkuYXJncykpOihuPXIscD1vLGY9YSxtLmFwcGx5KG8sYSkpfSkpfX0pKSx0Lm9yaWdpbmFsPWZ1bmN0aW9uKCl7dmFyIGUsbyxhLGk7cmV0dXJuIG4/KGU9cihhcmd1bWVudHMpLG89ZnVuY3Rpb24gZShuKXt2YXIgbyxhLHU9ZS5pZDtpZihudWxsIT11KXtpZihkZWxldGUgZS5pZCxvPWhbdV0sZGVsZXRlIGhbdV0sbylyZXR1cm4gYT1yKGFyZ3VtZW50cyksdC5oYXModSkmJihuP3QuZGVsZXRlKHUpOihkW3VdPXtjb250ZXh0OnRoaXMsYXJnczphfSx0LmVtaXQoInNldGFzeW5jIix1LCJmdW5jdGlvbiI9PXR5cGVvZiBvPzE6by5sZW5ndGgpKSksImZ1bmN0aW9uIj09dHlwZW9mIG8/aT1jLmNhbGwobyx0aGlzLGEpOm8uZm9yRWFjaCgoZnVuY3Rpb24oZSl7aT1jLmNhbGwoZSx0aGlzLGEpfSksdGhpcyksaX1lbHNlIHMoYy5iaW5kKGUsdGhpcyxhcmd1bWVudHMpKX0sYT1uLG49cD1mPW51bGwsZS5wdXNoKG8pLGk9Yy5jYWxsKHYsdGhpcyxlKSxvLmNiPWEsbj1vLGkpOmMuY2FsbCh2LHRoaXMsYXJndW1lbnRzKX0sdC5vbigic2V0IiwoZnVuY3Rpb24oZSl7bj8oaFtlXT8iZnVuY3Rpb24iPT10eXBlb2YgaFtlXT9oW2VdPVtoW2VdLG4uY2JdOmhbZV0ucHVzaChuLmNiKTpoW2VdPW4uY2IsZGVsZXRlIG4uY2Isbi5pZD1lLG49bnVsbCk6dC5kZWxldGUoZSl9KSksdC5vbigiZGVsZXRlIiwoZnVuY3Rpb24oZSl7dmFyIG47aGFzT3duUHJvcGVydHkuY2FsbChoLGUpfHxkW2VdJiYobj1kW2VdLGRlbGV0ZSBkW2VdLHQuZW1pdCgiZGVsZXRlYXN5bmMiLGUsdS5jYWxsKG4uYXJncywxKSkpfSkpLHQub24oImNsZWFyIiwoZnVuY3Rpb24oKXt2YXIgZT1kO2Q9bChudWxsKSx0LmVtaXQoImNsZWFyYXN5bmMiLG8oZSwoZnVuY3Rpb24oZSl7cmV0dXJuIHUuY2FsbChlLmFyZ3MsMSl9KSkpfSkpfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDQzOSksbz1uKDgyNSksYT1uKDgyNiksaT1uKDgyOCkscz1uKDQ0MSksdT1uKDI1OCksYz1PYmplY3QuY3JlYXRlLGw9bygidGhlbiIsInRoZW46ZmluYWxseSIsImRvbmUiLCJkb25lOmZpbmFsbHkiKTtuKDExOSkucHJvbWlzZT1mdW5jdGlvbihlLHQpe3ZhciBuPWMobnVsbCksbz1jKG51bGwpLHA9YyhudWxsKTtpZighMD09PWUpZT1udWxsO2Vsc2UgaWYoZT1hKGUpLCFsW2VdKXRocm93IG5ldyBUeXBlRXJyb3IoIiciK2koZSkrIicgaXMgbm90IHZhbGlkIHByb21pc2UgbW9kZSIpO3Qub24oInNldCIsKGZ1bmN0aW9uKHIsYSxpKXt2YXIgYz0hMTtpZighcyhpKSlyZXR1cm4gb1tyXT1pLHZvaWQgdC5lbWl0KCJzZXRhc3luYyIsciwxKTtuW3JdPTEscFtyXT1pO3ZhciBsPWZ1bmN0aW9uKGUpe3ZhciBhPW5bcl07aWYoYyl0aHJvdyBuZXcgRXJyb3IoIk1lbW9pemVlIGVycm9yOiBEZXRlY3RlZCB1bm9yZGVyZWQgdGhlbnxkb25lICYgZmluYWxseSByZXNvbHV0aW9uLCB3aGljaCBpbiB0dXJuIG1ha2VzIHByb3BlciBkZXRlY3Rpb24gb2Ygc3VjY2Vzcy9mYWlsdXJlIGltcG9zc2libGUgKHdoZW4gaW4gJ2RvbmU6ZmluYWxseScgbW9kZSlcbkNvbnNpZGVyIHRvIHJlbHkgb24gJ3RoZW4nIG9yICdkb25lJyBtb2RlIGluc3RlYWQuIik7YSYmKGRlbGV0ZSBuW3JdLG9bcl09ZSx0LmVtaXQoInNldGFzeW5jIixyLGEpKX0sZj1mdW5jdGlvbigpe2M9ITAsbltyXSYmKGRlbGV0ZSBuW3JdLGRlbGV0ZSBwW3JdLHQuZGVsZXRlKHIpKX0saD1lO2lmKGh8fChoPSJ0aGVuIiksInRoZW4iPT09aCl7dmFyIGQ9ZnVuY3Rpb24oKXt1KGYpfTsiZnVuY3Rpb24iPT10eXBlb2YoaT1pLnRoZW4oKGZ1bmN0aW9uKGUpe3UobC5iaW5kKHRoaXMsZSkpfSksZCkpLmZpbmFsbHkmJmkuZmluYWxseShkKX1lbHNlIGlmKCJkb25lIj09PWgpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBpLmRvbmUpdGhyb3cgbmV3IEVycm9yKCJNZW1vaXplZSBlcnJvcjogUmV0cmlldmVkIHByb21pc2UgZG9lcyBub3QgaW1wbGVtZW50ICdkb25lJyBpbiAnZG9uZScgbW9kZSIpO2kuZG9uZShsLGYpfWVsc2UgaWYoImRvbmU6ZmluYWxseSI9PT1oKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgaS5kb25lKXRocm93IG5ldyBFcnJvcigiTWVtb2l6ZWUgZXJyb3I6IFJldHJpZXZlZCBwcm9taXNlIGRvZXMgbm90IGltcGxlbWVudCAnZG9uZScgaW4gJ2RvbmU6ZmluYWxseScgbW9kZSIpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBpLmZpbmFsbHkpdGhyb3cgbmV3IEVycm9yKCJNZW1vaXplZSBlcnJvcjogUmV0cmlldmVkIHByb21pc2UgZG9lcyBub3QgaW1wbGVtZW50ICdmaW5hbGx5JyBpbiAnZG9uZTpmaW5hbGx5JyBtb2RlIik7aS5kb25lKGwpLGkuZmluYWxseShmKX19KSksdC5vbigiZ2V0IiwoZnVuY3Rpb24oZSxyLG8pe3ZhciBhO2lmKG5bZV0pKytuW2VdO2Vsc2V7YT1wW2VdO3ZhciBpPWZ1bmN0aW9uKCl7dC5lbWl0KCJnZXRhc3luYyIsZSxyLG8pfTtzKGEpPyJmdW5jdGlvbiI9PXR5cGVvZiBhLmRvbmU/YS5kb25lKGkpOmEudGhlbigoZnVuY3Rpb24oKXt1KGkpfSkpOmkoKX19KSksdC5vbigiZGVsZXRlIiwoZnVuY3Rpb24oZSl7aWYoZGVsZXRlIHBbZV0sbltlXSlkZWxldGUgbltlXTtlbHNlIGlmKGhhc093blByb3BlcnR5LmNhbGwobyxlKSl7dmFyIHI9b1tlXTtkZWxldGUgb1tlXSx0LmVtaXQoImRlbGV0ZWFzeW5jIixlLFtyXSl9fSkpLHQub24oImNsZWFyIiwoZnVuY3Rpb24oKXt2YXIgZT1vO289YyhudWxsKSxuPWMobnVsbCkscD1jKG51bGwpLHQuZW1pdCgiY2xlYXJhc3luYyIscihlLChmdW5jdGlvbihlKXtyZXR1cm5bZV19KSkpfSkpfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1BcnJheS5wcm90b3R5cGUuZm9yRWFjaCxvPU9iamVjdC5jcmVhdGU7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PW8obnVsbCk7cmV0dXJuIHIuY2FsbChhcmd1bWVudHMsKGZ1bmN0aW9uKGUpe3RbZV09ITB9KSksdH19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxMzkpLG89big4MjcpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gbyhyKGUpKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9big0NDApO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt0cnl7cmV0dXJuIGUmJnIoZS50b1N0cmluZyk/ZS50b1N0cmluZygpOlN0cmluZyhlKX1jYXRjaChlKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJQYXNzZWQgYXJndW1lbnQgY2Fubm90IGJlIHN0cmluZ2lmZWQiKX19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oODI5KSxvPS9bXG5cclx1MjAyOFx1MjAyOV0vZztlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9cihlKTtyZXR1cm4gdC5sZW5ndGg+MTAwJiYodD10LnNsaWNlKDAsOTkpKyLigKYiKSx0PXQucmVwbGFjZShvLChmdW5jdGlvbihlKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSkuc2xpY2UoMSwtMSl9KSl9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNDQwKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dHJ5e3JldHVybiBlJiZyKGUudG9TdHJpbmcpP2UudG9TdHJpbmcoKTpTdHJpbmcoZSl9Y2F0Y2goZSl7cmV0dXJuIjxOb24tY29lcmNpYmxlIHRvIHN0cmluZyB2YWx1ZT4ifX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9big5OSksbz1uKDIwMCksYT1uKDExOSksaT1GdW5jdGlvbi5wcm90b3R5cGUuYXBwbHk7YS5kaXNwb3NlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcztpZihyKGUpLG4uYXN5bmMmJmEuYXN5bmN8fG4ucHJvbWlzZSYmYS5wcm9taXNlKXJldHVybiB0Lm9uKCJkZWxldGVhc3luYyIscz1mdW5jdGlvbih0LG4pe2kuY2FsbChlLG51bGwsbil9KSx2b2lkIHQub24oImNsZWFyYXN5bmMiLChmdW5jdGlvbihlKXtvKGUsKGZ1bmN0aW9uKGUsdCl7cyh0LGUpfSkpfSkpO3Qub24oImRlbGV0ZSIscz1mdW5jdGlvbih0LG4pe2Uobil9KSx0Lm9uKCJjbGVhciIsKGZ1bmN0aW9uKGUpe28oZSwoZnVuY3Rpb24oZSx0KXtzKHQsZSl9KSl9KSl9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMjU2KSxvPW4oMjAwKSxhPW4oMjU4KSxpPW4oNDQxKSxzPW4oODMyKSx1PW4oMTE5KSxjPUZ1bmN0aW9uLnByb3RvdHlwZSxsPU1hdGgubWF4LHA9TWF0aC5taW4sZj1PYmplY3QuY3JlYXRlO3UubWF4QWdlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgaCxkLG0sdjsoZT1zKGUpKSYmKGg9ZihudWxsKSxkPW4uYXN5bmMmJnUuYXN5bmN8fG4ucHJvbWlzZSYmdS5wcm9taXNlPyJhc3luYyI6IiIsdC5vbigic2V0IitkLChmdW5jdGlvbihuKXtoW25dPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dC5kZWxldGUobil9KSxlKSwiZnVuY3Rpb24iPT10eXBlb2YgaFtuXS51bnJlZiYmaFtuXS51bnJlZigpLHYmJih2W25dJiYibmV4dFRpY2siIT09dltuXSYmY2xlYXJUaW1lb3V0KHZbbl0pLHZbbl09c2V0VGltZW91dCgoZnVuY3Rpb24oKXtkZWxldGUgdltuXX0pLG0pLCJmdW5jdGlvbiI9PXR5cGVvZiB2W25dLnVucmVmJiZ2W25dLnVucmVmKCkpfSkpLHQub24oImRlbGV0ZSIrZCwoZnVuY3Rpb24oZSl7Y2xlYXJUaW1lb3V0KGhbZV0pLGRlbGV0ZSBoW2VdLHYmJigibmV4dFRpY2siIT09dltlXSYmY2xlYXJUaW1lb3V0KHZbZV0pLGRlbGV0ZSB2W2VdKX0pKSxuLnByZUZldGNoJiYobT0hMD09PW4ucHJlRmV0Y2h8fGlzTmFOKG4ucHJlRmV0Y2gpPy4zMzM6bChwKE51bWJlcihuLnByZUZldGNoKSwxKSwwKSkmJih2PXt9LG09KDEtbSkqZSx0Lm9uKCJnZXQiK2QsKGZ1bmN0aW9uKGUsbyxzKXt2W2VdfHwodltlXT0ibmV4dFRpY2siLGEoKGZ1bmN0aW9uKCl7dmFyIGE7Im5leHRUaWNrIj09PXZbZV0mJihkZWxldGUgdltlXSx0LmRlbGV0ZShlKSxuLmFzeW5jJiYobz1yKG8pKS5wdXNoKGMpLGE9dC5tZW1vaXplZC5hcHBseShzLG8pLG4ucHJvbWlzZSYmaShhKSYmKCJmdW5jdGlvbiI9PXR5cGVvZiBhLmRvbmU/YS5kb25lKGMsYyk6YS50aGVuKGMsYykpKX0pKSl9KSkpLHQub24oImNsZWFyIitkLChmdW5jdGlvbigpe28oaCwoZnVuY3Rpb24oZSl7Y2xlYXJUaW1lb3V0KGUpfSkpLGg9e30sdiYmKG8odiwoZnVuY3Rpb24oZSl7Im5leHRUaWNrIiE9PWUmJmNsZWFyVGltZW91dChlKX0pKSx2PXt9KX0pKSl9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTE4KSxvPW4oODMzKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYoKGU9cihlKSk+byl0aHJvdyBuZXcgVHlwZUVycm9yKGUrIiBleGNlZWRzIG1heGltdW0gcG9zc2libGUgdGltZW91dCIpO3JldHVybiBlfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9MjE0NzQ4MzY0N30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDExOCksbz1uKDgzNSksYT1uKDExOSk7YS5tYXg9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpLHMsdTsoZT1yKGUpKSYmKHM9byhlKSxpPW4uYXN5bmMmJmEuYXN5bmN8fG4ucHJvbWlzZSYmYS5wcm9taXNlPyJhc3luYyI6IiIsdC5vbigic2V0IitpLHU9ZnVuY3Rpb24oZSl7dm9pZCAwIT09KGU9cy5oaXQoZSkpJiZ0LmRlbGV0ZShlKX0pLHQub24oImdldCIraSx1KSx0Lm9uKCJkZWxldGUiK2kscy5kZWxldGUpLHQub24oImNsZWFyIitpLHMuY2xlYXIpKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxMTgpLG89T2JqZWN0LmNyZWF0ZSxhPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0LG49MCxpPTEscz1vKG51bGwpLHU9byhudWxsKSxjPTA7cmV0dXJuIGU9cihlKSx7aGl0OmZ1bmN0aW9uKHIpe3ZhciBvPXVbcl0sbD0rK2M7aWYoc1tsXT1yLHVbcl09bCwhbyl7aWYoKytuPD1lKXJldHVybjtyZXR1cm4gcj1zW2ldLHQocikscn1pZihkZWxldGUgc1tvXSxpPT09bylmb3IoOyFhLmNhbGwocywrK2kpOyljb250aW51ZX0sZGVsZXRlOnQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dVtlXTtpZih0JiYoZGVsZXRlIHNbdF0sZGVsZXRlIHVbZV0sLS1uLGk9PT10KSl7aWYoIW4pcmV0dXJuIGM9MCx2b2lkKGk9MSk7Zm9yKDshYS5jYWxsKHMsKytpKTspY29udGludWV9fSxjbGVhcjpmdW5jdGlvbigpe249MCxpPTEscz1vKG51bGwpLHU9byhudWxsKSxjPTB9fX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxMjApLG89bigxMTkpLGE9T2JqZWN0LmNyZWF0ZSxpPU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzO28ucmVmQ291bnRlcj1mdW5jdGlvbihlLHQsbil7dmFyIHMsdTtzPWEobnVsbCksdT1uLmFzeW5jJiZvLmFzeW5jfHxuLnByb21pc2UmJm8ucHJvbWlzZT8iYXN5bmMiOiIiLHQub24oInNldCIrdSwoZnVuY3Rpb24oZSx0KXtzW2VdPXR8fDF9KSksdC5vbigiZ2V0Iit1LChmdW5jdGlvbihlKXsrK3NbZV19KSksdC5vbigiZGVsZXRlIit1LChmdW5jdGlvbihlKXtkZWxldGUgc1tlXX0pKSx0Lm9uKCJjbGVhciIrdSwoZnVuY3Rpb24oKXtzPXt9fSkpLGkodC5tZW1vaXplZCx7ZGVsZXRlUmVmOnIoKGZ1bmN0aW9uKCl7dmFyIGU9dC5nZXQoYXJndW1lbnRzKTtyZXR1cm4gbnVsbD09PWU/bnVsbDpzW2VdPyEtLXNbZV0mJih0LmRlbGV0ZShlKSwhMCk6bnVsbH0pKSxnZXRSZWZDb3VudDpyKChmdW5jdGlvbigpe3ZhciBlPXQuZ2V0KGFyZ3VtZW50cyk7cmV0dXJuIG51bGw9PT1lPzA6c1tlXT9zW2VdOjB9KSl9KX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDYzKSxvPW4oMTQwKSxhPW4oNjQpLkJ1ZmZlcixpPVsxNTE4NTAwMjQ5LDE4NTk3NzUzOTMsLTE4OTQwMDc1ODgsLTg5OTQ5NzUxNF0scz1uZXcgQXJyYXkoODApO2Z1bmN0aW9uIHUoKXt0aGlzLmluaXQoKSx0aGlzLl93PXMsby5jYWxsKHRoaXMsNjQsNTYpfWZ1bmN0aW9uIGMoZSl7cmV0dXJuIGU8PDMwfGU+Pj4yfWZ1bmN0aW9uIGwoZSx0LG4scil7cmV0dXJuIDA9PT1lP3Qmbnx+dCZyOjI9PT1lP3Qmbnx0JnJ8biZyOnRebl5yfXIodSxvKSx1LnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2E9MTczMjU4NDE5Myx0aGlzLl9iPTQwMjMyMzM0MTcsdGhpcy5fYz0yNTYyMzgzMTAyLHRoaXMuX2Q9MjcxNzMzODc4LHRoaXMuX2U9MzI4NTM3NzUyMCx0aGlzfSx1LnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPXRoaXMuX3cscj0wfHRoaXMuX2Esbz0wfHRoaXMuX2IsYT0wfHRoaXMuX2Mscz0wfHRoaXMuX2QsdT0wfHRoaXMuX2UscD0wO3A8MTY7KytwKW5bcF09ZS5yZWFkSW50MzJCRSg0KnApO2Zvcig7cDw4MDsrK3ApbltwXT1uW3AtM11ebltwLThdXm5bcC0xNF1ebltwLTE2XTtmb3IodmFyIGY9MDtmPDgwOysrZil7dmFyIGg9fn4oZi8yMCksZD0wfCgodD1yKTw8NXx0Pj4+MjcpK2woaCxvLGEscykrdStuW2ZdK2lbaF07dT1zLHM9YSxhPWMobyksbz1yLHI9ZH10aGlzLl9hPXIrdGhpcy5fYXwwLHRoaXMuX2I9byt0aGlzLl9ifDAsdGhpcy5fYz1hK3RoaXMuX2N8MCx0aGlzLl9kPXMrdGhpcy5fZHwwLHRoaXMuX2U9dSt0aGlzLl9lfDB9LHUucHJvdG90eXBlLl9oYXNoPWZ1bmN0aW9uKCl7dmFyIGU9YS5hbGxvY1Vuc2FmZSgyMCk7cmV0dXJuIGUud3JpdGVJbnQzMkJFKDB8dGhpcy5fYSwwKSxlLndyaXRlSW50MzJCRSgwfHRoaXMuX2IsNCksZS53cml0ZUludDMyQkUoMHx0aGlzLl9jLDgpLGUud3JpdGVJbnQzMkJFKDB8dGhpcy5fZCwxMiksZS53cml0ZUludDMyQkUoMHx0aGlzLl9lLDE2KSxlfSxlLmV4cG9ydHM9dX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNjMpLG89bigxNDApLGE9big2NCkuQnVmZmVyLGk9WzE1MTg1MDAyNDksMTg1OTc3NTM5MywtMTg5NDAwNzU4OCwtODk5NDk3NTE0XSxzPW5ldyBBcnJheSg4MCk7ZnVuY3Rpb24gdSgpe3RoaXMuaW5pdCgpLHRoaXMuX3c9cyxvLmNhbGwodGhpcyw2NCw1Nil9ZnVuY3Rpb24gYyhlKXtyZXR1cm4gZTw8NXxlPj4+Mjd9ZnVuY3Rpb24gbChlKXtyZXR1cm4gZTw8MzB8ZT4+PjJ9ZnVuY3Rpb24gcChlLHQsbixyKXtyZXR1cm4gMD09PWU/dCZufH50JnI6Mj09PWU/dCZufHQmcnxuJnI6dF5uXnJ9cih1LG8pLHUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYT0xNzMyNTg0MTkzLHRoaXMuX2I9NDAyMzIzMzQxNyx0aGlzLl9jPTI1NjIzODMxMDIsdGhpcy5fZD0yNzE3MzM4NzgsdGhpcy5fZT0zMjg1Mzc3NTIwLHRoaXN9LHUucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG49dGhpcy5fdyxyPTB8dGhpcy5fYSxvPTB8dGhpcy5fYixhPTB8dGhpcy5fYyxzPTB8dGhpcy5fZCx1PTB8dGhpcy5fZSxmPTA7ZjwxNjsrK2YpbltmXT1lLnJlYWRJbnQzMkJFKDQqZik7Zm9yKDtmPDgwOysrZiluW2ZdPSh0PW5bZi0zXV5uW2YtOF1ebltmLTE0XV5uW2YtMTZdKTw8MXx0Pj4+MzE7Zm9yKHZhciBoPTA7aDw4MDsrK2gpe3ZhciBkPX5+KGgvMjApLG09YyhyKStwKGQsbyxhLHMpK3UrbltoXStpW2RdfDA7dT1zLHM9YSxhPWwobyksbz1yLHI9bX10aGlzLl9hPXIrdGhpcy5fYXwwLHRoaXMuX2I9byt0aGlzLl9ifDAsdGhpcy5fYz1hK3RoaXMuX2N8MCx0aGlzLl9kPXMrdGhpcy5fZHwwLHRoaXMuX2U9dSt0aGlzLl9lfDB9LHUucHJvdG90eXBlLl9oYXNoPWZ1bmN0aW9uKCl7dmFyIGU9YS5hbGxvY1Vuc2FmZSgyMCk7cmV0dXJuIGUud3JpdGVJbnQzMkJFKDB8dGhpcy5fYSwwKSxlLndyaXRlSW50MzJCRSgwfHRoaXMuX2IsNCksZS53cml0ZUludDMyQkUoMHx0aGlzLl9jLDgpLGUud3JpdGVJbnQzMkJFKDB8dGhpcy5fZCwxMiksZS53cml0ZUludDMyQkUoMHx0aGlzLl9lLDE2KSxlfSxlLmV4cG9ydHM9dX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNjMpLG89big0NDIpLGE9bigxNDApLGk9big2NCkuQnVmZmVyLHM9bmV3IEFycmF5KDY0KTtmdW5jdGlvbiB1KCl7dGhpcy5pbml0KCksdGhpcy5fdz1zLGEuY2FsbCh0aGlzLDY0LDU2KX1yKHUsbyksdS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hPTMyMzgzNzEwMzIsdGhpcy5fYj05MTQxNTA2NjMsdGhpcy5fYz04MTI3MDI5OTksdGhpcy5fZD00MTQ0OTEyNjk3LHRoaXMuX2U9NDI5MDc3NTg1Nyx0aGlzLl9mPTE3NTA2MDMwMjUsdGhpcy5fZz0xNjk0MDc2ODM5LHRoaXMuX2g9MzIwNDA3NTQyOCx0aGlzfSx1LnByb3RvdHlwZS5faGFzaD1mdW5jdGlvbigpe3ZhciBlPWkuYWxsb2NVbnNhZmUoMjgpO3JldHVybiBlLndyaXRlSW50MzJCRSh0aGlzLl9hLDApLGUud3JpdGVJbnQzMkJFKHRoaXMuX2IsNCksZS53cml0ZUludDMyQkUodGhpcy5fYyw4KSxlLndyaXRlSW50MzJCRSh0aGlzLl9kLDEyKSxlLndyaXRlSW50MzJCRSh0aGlzLl9lLDE2KSxlLndyaXRlSW50MzJCRSh0aGlzLl9mLDIwKSxlLndyaXRlSW50MzJCRSh0aGlzLl9nLDI0KSxlfSxlLmV4cG9ydHM9dX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNjMpLG89big0NDMpLGE9bigxNDApLGk9big2NCkuQnVmZmVyLHM9bmV3IEFycmF5KDE2MCk7ZnVuY3Rpb24gdSgpe3RoaXMuaW5pdCgpLHRoaXMuX3c9cyxhLmNhbGwodGhpcywxMjgsMTEyKX1yKHUsbyksdS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9haD0zNDE4MDcwMzY1LHRoaXMuX2JoPTE2NTQyNzAyNTAsdGhpcy5fY2g9MjQzODUyOTM3MCx0aGlzLl9kaD0zNTU0NjIzNjAsdGhpcy5fZWg9MTczMTQwNTQxNSx0aGlzLl9maD0yMzk0MTgwMjMxLHRoaXMuX2doPTM2NzUwMDg1MjUsdGhpcy5faGg9MTIwMzA2MjgxMyx0aGlzLl9hbD0zMjM4MzcxMDMyLHRoaXMuX2JsPTkxNDE1MDY2Myx0aGlzLl9jbD04MTI3MDI5OTksdGhpcy5fZGw9NDE0NDkxMjY5Nyx0aGlzLl9lbD00MjkwNzc1ODU3LHRoaXMuX2ZsPTE3NTA2MDMwMjUsdGhpcy5fZ2w9MTY5NDA3NjgzOSx0aGlzLl9obD0zMjA0MDc1NDI4LHRoaXN9LHUucHJvdG90eXBlLl9oYXNoPWZ1bmN0aW9uKCl7dmFyIGU9aS5hbGxvY1Vuc2FmZSg0OCk7ZnVuY3Rpb24gdCh0LG4scil7ZS53cml0ZUludDMyQkUodCxyKSxlLndyaXRlSW50MzJCRShuLHIrNCl9cmV0dXJuIHQodGhpcy5fYWgsdGhpcy5fYWwsMCksdCh0aGlzLl9iaCx0aGlzLl9ibCw4KSx0KHRoaXMuX2NoLHRoaXMuX2NsLDE2KSx0KHRoaXMuX2RoLHRoaXMuX2RsLDI0KSx0KHRoaXMuX2VoLHRoaXMuX2VsLDMyKSx0KHRoaXMuX2ZoLHRoaXMuX2ZsLDQwKSxlfSxlLmV4cG9ydHM9dX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oODQyKTtlLmV4cG9ydHM9cn0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oODQzKSxvPUFycmF5LnByb3RvdHlwZTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ldmVyeTtyZXR1cm4gZT09PW98fGUgaW5zdGFuY2VvZiBBcnJheSYmdD09PW8uZXZlcnk/cjp0fX0sZnVuY3Rpb24oZSx0LG4pe24oODQ0KTt2YXIgcj1uKDQyKTtlLmV4cG9ydHM9cigiQXJyYXkiKS5ldmVyeX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDIyKSxvPW4oODUpLmV2ZXJ5O3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDohbigxMTMpKCJldmVyeSIpfSx7ZXZlcnk6ZnVuY3Rpb24oZSl7cmV0dXJuIG8odGhpcyxlLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4scixvKXtyZXR1cm4gbyhlLChmdW5jdGlvbihlLG8sYSl7bj1yPyhyPSExLGUpOnQobixlLG8sYSl9KSksbn19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDM3NCk7ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDg0OCk7ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXtuKDM2Myk7dmFyIHI9bigzMyk7ZS5leHBvcnRzPXIuT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sc30sZnVuY3Rpb24oZSx0LG4pe2UuZXhwb3J0cz1uKDg1MCl9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDM3Myk7ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9big4NTIpfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big4NTMpO2UuZXhwb3J0cz1yfSxmdW5jdGlvbihlLHQsbil7big4NTQpO3ZhciByPW4oMzMpLk9iamVjdCxvPWUuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiByLmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpfTtyLmdldE93blByb3BlcnR5RGVzY3JpcHRvci5zaGFtJiYoby5zaGFtPSEwKX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMjIpLG89bigzNyksYT1uKDY2KSxpPW4oMTI3KS5mLHM9big0OCksdT1vKChmdW5jdGlvbigpe2koMSl9KSk7cih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOiFzfHx1LHNoYW06IXN9LHtnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaShhKGUpLHQpfX0pfSxmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPW4oODU2KX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNDAwKTtlLmV4cG9ydHM9cn0sZnVuY3Rpb24oZSx0LG4pe2UuZXhwb3J0cz1uKDg1OCl9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDg1OSk7ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXtuKDg2MCk7dmFyIHI9bigzMyk7ZS5leHBvcnRzPXIuT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnN9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDIyKSxvPW4oNDgpLGE9big4NjEpLGk9big2Nikscz1uKDEyNyksdT1uKDE1NCk7cih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsc2hhbTohb30se2dldE93blByb3BlcnR5RGVzY3JpcHRvcnM6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG4scj1pKGUpLG89cy5mLGM9YShyKSxsPXt9LHA9MDtjLmxlbmd0aD5wOyl2b2lkIDAhPT0obj1vKHIsdD1jW3ArK10pKSYmdShsLHQsbik7cmV0dXJuIGx9fSl9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDcwKSxvPW4oMjMyKSxhPW4oMjMzKSxpPW4oNTIpO2UuZXhwb3J0cz1yKCJSZWZsZWN0Iiwib3duS2V5cyIpfHxmdW5jdGlvbihlKXt2YXIgdD1vLmYoaShlKSksbj1hLmY7cmV0dXJuIG4/dC5jb25jYXQobihlKSk6dH19LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9big4NjMpfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big4NjQpO2UuZXhwb3J0cz1yfSxmdW5jdGlvbihlLHQsbil7big4NjUpO3ZhciByPW4oMzMpLk9iamVjdCxvPWUuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiByLmRlZmluZVByb3BlcnRpZXMoZSx0KX07ci5kZWZpbmVQcm9wZXJ0aWVzLnNoYW0mJihvLnNoYW09ITApfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigyMiksbz1uKDQ4KTtyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6IW8sc2hhbTohb30se2RlZmluZVByb3BlcnRpZXM6bigyMjgpfSl9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDQwMyk7ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDQ0NCksbz1uKDQ0Nik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7aWYobnVsbD09ZSlyZXR1cm57fTt2YXIgbixhLGk9e30scz1yKGUpO2ZvcihhPTA7YTxzLmxlbmd0aDthKyspbj1zW2FdLG8odCkuY2FsbCh0LG4pPj0wfHwoaVtuXT1lW25dKTtyZXR1cm4gaX0sZS5leHBvcnRzLmRlZmF1bHQ9ZS5leHBvcnRzLGUuZXhwb3J0cy5fX2VzTW9kdWxlPSEwfSxmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPW4oODY5KX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNDQ3KTtuKDg3Niksbig4NzcpLG4oODc4KSxuKDg3OSksZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHIsbyxhLGkscz1uKDIyKSx1PW4oOTYpLGM9big0MCksbD1uKDcwKSxwPW4oNDQ5KSxmPW4oMTEyKSxoPW4oMTY0KSxkPW4oMTg1KSxtPW4oOTcpLHY9big0NTApLGc9big0NykseT1uKDc2KSxiPW4oMTQxKSxfPW4oMzY3KSx3PW4oMTIxKSx4PW4oMzk3KSxFPW4oNDUxKSxTPW4oNDUyKS5zZXQsQz1uKDg3MSksQT1uKDQ1NCksTz1uKDg3Myksaz1uKDE2NSksaj1uKDIwMiksVD1uKDc3KSxJPW4oMzYxKSxQPW4oNDEpLE49big4NzQpLE09bigxODYpLFI9bigxMjkpLEQ9UCgic3BlY2llcyIpLEw9IlByb21pc2UiLEI9VC5nZXQsRj1ULnNldCxVPVQuZ2V0dGVyRm9yKEwpLHE9cCYmcC5wcm90b3R5cGUsej1wLFY9cSxXPWMuVHlwZUVycm9yLEg9Yy5kb2N1bWVudCwkPWMucHJvY2VzcyxKPWsuZixLPUosWT0hIShIJiZILmNyZWF0ZUV2ZW50JiZjLmRpc3BhdGNoRXZlbnQpLEc9ImZ1bmN0aW9uIj09dHlwZW9mIFByb21pc2VSZWplY3Rpb25FdmVudCxaPSJ1bmhhbmRsZWRyZWplY3Rpb24iLFg9ITEsUT1JKEwsKGZ1bmN0aW9uKCl7dmFyIGU9Xyh6KSE9PVN0cmluZyh6KTtpZighZSYmNjY9PT1SKXJldHVybiEwO2lmKHUmJiFWLmZpbmFsbHkpcmV0dXJuITA7aWYoUj49NTEmJi9uYXRpdmUgY29kZS8udGVzdCh6KSlyZXR1cm4hMTt2YXIgdD1uZXcgeigoZnVuY3Rpb24oZSl7ZSgxKX0pKSxuPWZ1bmN0aW9uKGUpe2UoKGZ1bmN0aW9uKCl7fSksKGZ1bmN0aW9uKCl7fSkpfTtyZXR1cm4odC5jb25zdHJ1Y3Rvcj17fSlbRF09biwhKFg9dC50aGVuKChmdW5jdGlvbigpe30pKWluc3RhbmNlb2Ygbil8fCFlJiZOJiYhR30pKSxlZT1RfHwheCgoZnVuY3Rpb24oZSl7ei5hbGwoZSkuY2F0Y2goKGZ1bmN0aW9uKCl7fSkpfSkpLHRlPWZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiEoIWcoZSl8fCJmdW5jdGlvbiIhPXR5cGVvZih0PWUudGhlbikpJiZ0fSxuZT1mdW5jdGlvbihlLHQpe2lmKCFlLm5vdGlmaWVkKXtlLm5vdGlmaWVkPSEwO3ZhciBuPWUucmVhY3Rpb25zO0MoKGZ1bmN0aW9uKCl7Zm9yKHZhciByPWUudmFsdWUsbz0xPT1lLnN0YXRlLGE9MDtuLmxlbmd0aD5hOyl7dmFyIGkscyx1LGM9blthKytdLGw9bz9jLm9rOmMuZmFpbCxwPWMucmVzb2x2ZSxmPWMucmVqZWN0LGg9Yy5kb21haW47dHJ5e2w/KG98fCgyPT09ZS5yZWplY3Rpb24mJmllKGUpLGUucmVqZWN0aW9uPTEpLCEwPT09bD9pPXI6KGgmJmguZW50ZXIoKSxpPWwociksaCYmKGguZXhpdCgpLHU9ITApKSxpPT09Yy5wcm9taXNlP2YoVygiUHJvbWlzZS1jaGFpbiBjeWNsZSIpKToocz10ZShpKSk/cy5jYWxsKGkscCxmKTpwKGkpKTpmKHIpfWNhdGNoKGUpe2gmJiF1JiZoLmV4aXQoKSxmKGUpfX1lLnJlYWN0aW9ucz1bXSxlLm5vdGlmaWVkPSExLHQmJiFlLnJlamVjdGlvbiYmb2UoZSl9KSl9fSxyZT1mdW5jdGlvbihlLHQsbil7dmFyIHIsbztZPygocj1ILmNyZWF0ZUV2ZW50KCJFdmVudCIpKS5wcm9taXNlPXQsci5yZWFzb249bixyLmluaXRFdmVudChlLCExLCEwKSxjLmRpc3BhdGNoRXZlbnQocikpOnI9e3Byb21pc2U6dCxyZWFzb246bn0sIUcmJihvPWNbIm9uIitlXSk/byhyKTplPT09WiYmTygiVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uIixuKX0sb2U9ZnVuY3Rpb24oZSl7Uy5jYWxsKGMsKGZ1bmN0aW9uKCl7dmFyIHQsbj1lLmZhY2FkZSxyPWUudmFsdWU7aWYoYWUoZSkmJih0PWooKGZ1bmN0aW9uKCl7TT8kLmVtaXQoInVuaGFuZGxlZFJlamVjdGlvbiIscixuKTpyZShaLG4scil9KSksZS5yZWplY3Rpb249TXx8YWUoZSk/MjoxLHQuZXJyb3IpKXRocm93IHQudmFsdWV9KSl9LGFlPWZ1bmN0aW9uKGUpe3JldHVybiAxIT09ZS5yZWplY3Rpb24mJiFlLnBhcmVudH0saWU9ZnVuY3Rpb24oZSl7Uy5jYWxsKGMsKGZ1bmN0aW9uKCl7dmFyIHQ9ZS5mYWNhZGU7TT8kLmVtaXQoInJlamVjdGlvbkhhbmRsZWQiLHQpOnJlKCJyZWplY3Rpb25oYW5kbGVkIix0LGUudmFsdWUpfSkpfSxzZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKHIpe2UodCxyLG4pfX0sdWU9ZnVuY3Rpb24oZSx0LG4pe2UuZG9uZXx8KGUuZG9uZT0hMCxuJiYoZT1uKSxlLnZhbHVlPXQsZS5zdGF0ZT0yLG5lKGUsITApKX0sY2U9ZnVuY3Rpb24oZSx0LG4pe2lmKCFlLmRvbmUpe2UuZG9uZT0hMCxuJiYoZT1uKTt0cnl7aWYoZS5mYWNhZGU9PT10KXRocm93IFcoIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmIik7dmFyIHI9dGUodCk7cj9DKChmdW5jdGlvbigpe3ZhciBuPXtkb25lOiExfTt0cnl7ci5jYWxsKHQsc2UoY2UsbixlKSxzZSh1ZSxuLGUpKX1jYXRjaCh0KXt1ZShuLHQsZSl9fSkpOihlLnZhbHVlPXQsZS5zdGF0ZT0xLG5lKGUsITEpKX1jYXRjaCh0KXt1ZSh7ZG9uZTohMX0sdCxlKX19fTtpZihRJiYoVj0oej1mdW5jdGlvbihlKXtiKHRoaXMseixMKSx5KGUpLHIuY2FsbCh0aGlzKTt2YXIgdD1CKHRoaXMpO3RyeXtlKHNlKGNlLHQpLHNlKHVlLHQpKX1jYXRjaChlKXt1ZSh0LGUpfX0pLnByb3RvdHlwZSwocj1mdW5jdGlvbihlKXtGKHRoaXMse3R5cGU6TCxkb25lOiExLG5vdGlmaWVkOiExLHBhcmVudDohMSxyZWFjdGlvbnM6W10scmVqZWN0aW9uOiExLHN0YXRlOjAsdmFsdWU6dm9pZCAwfSl9KS5wcm90b3R5cGU9aChWLHt0aGVuOmZ1bmN0aW9uKGUsdCl7dmFyIG49VSh0aGlzKSxyPUooRSh0aGlzLHopKTtyZXR1cm4gci5vaz0iZnVuY3Rpb24iIT10eXBlb2YgZXx8ZSxyLmZhaWw9ImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQsci5kb21haW49TT8kLmRvbWFpbjp2b2lkIDAsbi5wYXJlbnQ9ITAsbi5yZWFjdGlvbnMucHVzaChyKSwwIT1uLnN0YXRlJiZuZShuLCExKSxyLnByb21pc2V9LGNhdGNoOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRoZW4odm9pZCAwLGUpfX0pLG89ZnVuY3Rpb24oKXt2YXIgZT1uZXcgcix0PUIoZSk7dGhpcy5wcm9taXNlPWUsdGhpcy5yZXNvbHZlPXNlKGNlLHQpLHRoaXMucmVqZWN0PXNlKHVlLHQpfSxrLmY9Sj1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXp8fGU9PT1hP25ldyBvKGUpOksoZSl9LCF1JiYiZnVuY3Rpb24iPT10eXBlb2YgcCYmcSE9PU9iamVjdC5wcm90b3R5cGUpKXtpPXEudGhlbixYfHwoZihxLCJ0aGVuIiwoZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3JldHVybiBuZXcgeigoZnVuY3Rpb24oZSx0KXtpLmNhbGwobixlLHQpfSkpLnRoZW4oZSx0KX0pLHt1bnNhZmU6ITB9KSxmKHEsImNhdGNoIixWLmNhdGNoLHt1bnNhZmU6ITB9KSk7dHJ5e2RlbGV0ZSBxLmNvbnN0cnVjdG9yfWNhdGNoKGUpe31kJiZkKHEsVil9cyh7Z2xvYmFsOiEwLHdyYXA6ITAsZm9yY2VkOlF9LHtQcm9taXNlOnp9KSxtKHosTCwhMSwhMCksdihMKSxhPWwoTCkscyh7dGFyZ2V0Okwsc3RhdDohMCxmb3JjZWQ6UX0se3JlamVjdDpmdW5jdGlvbihlKXt2YXIgdD1KKHRoaXMpO3JldHVybiB0LnJlamVjdC5jYWxsKHZvaWQgMCxlKSx0LnByb21pc2V9fSkscyh7dGFyZ2V0Okwsc3RhdDohMCxmb3JjZWQ6dXx8UX0se3Jlc29sdmU6ZnVuY3Rpb24oZSl7cmV0dXJuIEEodSYmdGhpcz09PWE/ejp0aGlzLGUpfX0pLHMoe3RhcmdldDpMLHN0YXQ6ITAsZm9yY2VkOmVlfSx7YWxsOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1KKHQpLHI9bi5yZXNvbHZlLG89bi5yZWplY3QsYT1qKChmdW5jdGlvbigpe3ZhciBuPXkodC5yZXNvbHZlKSxhPVtdLGk9MCxzPTE7dyhlLChmdW5jdGlvbihlKXt2YXIgdT1pKyssYz0hMTthLnB1c2godm9pZCAwKSxzKyssbi5jYWxsKHQsZSkudGhlbigoZnVuY3Rpb24oZSl7Y3x8KGM9ITAsYVt1XT1lLC0tc3x8cihhKSl9KSxvKX0pKSwtLXN8fHIoYSl9KSk7cmV0dXJuIGEuZXJyb3ImJm8oYS52YWx1ZSksbi5wcm9taXNlfSxyYWNlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj1KKHQpLHI9bi5yZWplY3Qsbz1qKChmdW5jdGlvbigpe3ZhciBvPXkodC5yZXNvbHZlKTt3KGUsKGZ1bmN0aW9uKGUpe28uY2FsbCh0LGUpLnRoZW4obi5yZXNvbHZlLHIpfSkpfSkpO3JldHVybiBvLmVycm9yJiZyKG8udmFsdWUpLG4ucHJvbWlzZX19KX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByLG8sYSxpLHMsdSxjLGwscD1uKDQwKSxmPW4oMTI3KS5mLGg9big0NTIpLnNldCxkPW4oNDUzKSxtPW4oODcyKSx2PW4oMTg2KSxnPXAuTXV0YXRpb25PYnNlcnZlcnx8cC5XZWJLaXRNdXRhdGlvbk9ic2VydmVyLHk9cC5kb2N1bWVudCxiPXAucHJvY2VzcyxfPXAuUHJvbWlzZSx3PWYocCwicXVldWVNaWNyb3Rhc2siKSx4PXcmJncudmFsdWU7eHx8KHI9ZnVuY3Rpb24oKXt2YXIgZSx0O2Zvcih2JiYoZT1iLmRvbWFpbikmJmUuZXhpdCgpO287KXt0PW8uZm4sbz1vLm5leHQ7dHJ5e3QoKX1jYXRjaChlKXt0aHJvdyBvP2koKTphPXZvaWQgMCxlfX1hPXZvaWQgMCxlJiZlLmVudGVyKCl9LGR8fHZ8fG18fCFnfHwheT9fJiZfLnJlc29sdmU/KChjPV8ucmVzb2x2ZSh2b2lkIDApKS5jb25zdHJ1Y3Rvcj1fLGw9Yy50aGVuLGk9ZnVuY3Rpb24oKXtsLmNhbGwoYyxyKX0pOmk9dj9mdW5jdGlvbigpe2IubmV4dFRpY2socil9OmZ1bmN0aW9uKCl7aC5jYWxsKHAscil9OihzPSEwLHU9eS5jcmVhdGVUZXh0Tm9kZSgiIiksbmV3IGcocikub2JzZXJ2ZSh1LHtjaGFyYWN0ZXJEYXRhOiEwfSksaT1mdW5jdGlvbigpe3UuZGF0YT1zPSFzfSkpLGUuZXhwb3J0cz14fHxmdW5jdGlvbihlKXt2YXIgdD17Zm46ZSxuZXh0OnZvaWQgMH07YSYmKGEubmV4dD10KSxvfHwobz10LGkoKSksYT10fX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTEwKTtlLmV4cG9ydHM9L3dlYjBzKD8hLipjaHJvbWUpL2kudGVzdChyKX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNDApO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciBuPXIuY29uc29sZTtuJiZuLmVycm9yJiYoMT09PWFyZ3VtZW50cy5sZW5ndGg/bi5lcnJvcihlKTpuLmVycm9yKGUsdCkpfX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3d9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyMiksbz1uKDk2KSxhPW4oNDQ5KSxpPW4oMzcpLHM9big3MCksdT1uKDQ1MSksYz1uKDQ1NCksbD1uKDExMik7aWYocih7dGFyZ2V0OiJQcm9taXNlIixwcm90bzohMCxyZWFsOiEwLGZvcmNlZDohIWEmJmkoKGZ1bmN0aW9uKCl7YS5wcm90b3R5cGUuZmluYWxseS5jYWxsKHt0aGVuOmZ1bmN0aW9uKCl7fX0sKGZ1bmN0aW9uKCl7fSkpfSkpfSx7ZmluYWxseTpmdW5jdGlvbihlKXt2YXIgdD11KHRoaXMscygiUHJvbWlzZSIpKSxuPSJmdW5jdGlvbiI9PXR5cGVvZiBlO3JldHVybiB0aGlzLnRoZW4obj9mdW5jdGlvbihuKXtyZXR1cm4gYyh0LGUoKSkudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gbn0pKX06ZSxuP2Z1bmN0aW9uKG4pe3JldHVybiBjKHQsZSgpKS50aGVuKChmdW5jdGlvbigpe3Rocm93IG59KSl9OmUpfX0pLCFvJiYiZnVuY3Rpb24iPT10eXBlb2YgYSl7dmFyIHA9cygiUHJvbWlzZSIpLnByb3RvdHlwZS5maW5hbGx5O2EucHJvdG90eXBlLmZpbmFsbHkhPT1wJiZsKGEucHJvdG90eXBlLCJmaW5hbGx5IixwLHt1bnNhZmU6ITB9KX19LGZ1bmN0aW9uKGUsdCxuKXtuKDQ0OCl9LGZ1bmN0aW9uKGUsdCxuKXtuKDQ1NSl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyMiksbz1uKDE2NSksYT1uKDIwMik7cih7dGFyZ2V0OiJQcm9taXNlIixzdGF0OiEwfSx7dHJ5OmZ1bmN0aW9uKGUpe3ZhciB0PW8uZih0aGlzKSxuPWEoZSk7cmV0dXJuKG4uZXJyb3I/dC5yZWplY3Q6dC5yZXNvbHZlKShuLnZhbHVlKSx0LnByb21pc2V9fSl9LGZ1bmN0aW9uKGUsdCxuKXtuKDQ1Nil9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1mdW5jdGlvbihlKXsidXNlIHN0cmljdCI7dmFyIHQsbj1PYmplY3QucHJvdG90eXBlLHI9bi5oYXNPd25Qcm9wZXJ0eSxvPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2w/U3ltYm9sOnt9LGE9by5pdGVyYXRvcnx8IkBAaXRlcmF0b3IiLGk9by5hc3luY0l0ZXJhdG9yfHwiQEBhc3luY0l0ZXJhdG9yIixzPW8udG9TdHJpbmdUYWd8fCJAQHRvU3RyaW5nVGFnIjtmdW5jdGlvbiB1KGUsdCxuKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pLGVbdF19dHJ5e3Uoe30sIiIpfWNhdGNoKGUpe3U9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlW3RdPW59fWZ1bmN0aW9uIGMoZSx0LG4scil7dmFyIG89dCYmdC5wcm90b3R5cGUgaW5zdGFuY2VvZiB2P3Q6dixhPU9iamVjdC5jcmVhdGUoby5wcm90b3R5cGUpLGk9bmV3IGsocnx8W10pO3JldHVybiBhLl9pbnZva2U9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXA7cmV0dXJuIGZ1bmN0aW9uKG8sYSl7aWYocj09PWgpdGhyb3cgbmV3IEVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nIik7aWYocj09PWQpe2lmKCJ0aHJvdyI9PT1vKXRocm93IGE7cmV0dXJuIFQoKX1mb3Iobi5tZXRob2Q9byxuLmFyZz1hOzspe3ZhciBpPW4uZGVsZWdhdGU7aWYoaSl7dmFyIHM9QyhpLG4pO2lmKHMpe2lmKHM9PT1tKWNvbnRpbnVlO3JldHVybiBzfX1pZigibmV4dCI9PT1uLm1ldGhvZCluLnNlbnQ9bi5fc2VudD1uLmFyZztlbHNlIGlmKCJ0aHJvdyI9PT1uLm1ldGhvZCl7aWYocj09PXApdGhyb3cgcj1kLG4uYXJnO24uZGlzcGF0Y2hFeGNlcHRpb24obi5hcmcpfWVsc2UicmV0dXJuIj09PW4ubWV0aG9kJiZuLmFicnVwdCgicmV0dXJuIixuLmFyZyk7cj1oO3ZhciB1PWwoZSx0LG4pO2lmKCJub3JtYWwiPT09dS50eXBlKXtpZihyPW4uZG9uZT9kOmYsdS5hcmc9PT1tKWNvbnRpbnVlO3JldHVybnt2YWx1ZTp1LmFyZyxkb25lOm4uZG9uZX19InRocm93Ij09PXUudHlwZSYmKHI9ZCxuLm1ldGhvZD0idGhyb3ciLG4uYXJnPXUuYXJnKX19fShlLG4saSksYX1mdW5jdGlvbiBsKGUsdCxuKXt0cnl7cmV0dXJue3R5cGU6Im5vcm1hbCIsYXJnOmUuY2FsbCh0LG4pfX1jYXRjaChlKXtyZXR1cm57dHlwZToidGhyb3ciLGFyZzplfX19ZS53cmFwPWM7dmFyIHA9InN1c3BlbmRlZFN0YXJ0IixmPSJzdXNwZW5kZWRZaWVsZCIsaD0iZXhlY3V0aW5nIixkPSJjb21wbGV0ZWQiLG09e307ZnVuY3Rpb24gdigpe31mdW5jdGlvbiBnKCl7fWZ1bmN0aW9uIHkoKXt9dmFyIGI9e307YlthXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTt2YXIgXz1PYmplY3QuZ2V0UHJvdG90eXBlT2Ysdz1fJiZfKF8oaihbXSkpKTt3JiZ3IT09biYmci5jYWxsKHcsYSkmJihiPXcpO3ZhciB4PXkucHJvdG90eXBlPXYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoYik7ZnVuY3Rpb24gRShlKXtbIm5leHQiLCJ0aHJvdyIsInJldHVybiJdLmZvckVhY2goKGZ1bmN0aW9uKHQpe3UoZSx0LChmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5faW52b2tlKHQsZSl9KSl9KSl9ZnVuY3Rpb24gUyhlLHQpe2Z1bmN0aW9uIG4obyxhLGkscyl7dmFyIHU9bChlW29dLGUsYSk7aWYoInRocm93IiE9PXUudHlwZSl7dmFyIGM9dS5hcmcscD1jLnZhbHVlO3JldHVybiBwJiYib2JqZWN0Ij09dHlwZW9mIHAmJnIuY2FsbChwLCJfX2F3YWl0Iik/dC5yZXNvbHZlKHAuX19hd2FpdCkudGhlbigoZnVuY3Rpb24oZSl7bigibmV4dCIsZSxpLHMpfSksKGZ1bmN0aW9uKGUpe24oInRocm93IixlLGkscyl9KSk6dC5yZXNvbHZlKHApLnRoZW4oKGZ1bmN0aW9uKGUpe2MudmFsdWU9ZSxpKGMpfSksKGZ1bmN0aW9uKGUpe3JldHVybiBuKCJ0aHJvdyIsZSxpLHMpfSkpfXModS5hcmcpfXZhciBvO3RoaXMuX2ludm9rZT1mdW5jdGlvbihlLHIpe2Z1bmN0aW9uIGEoKXtyZXR1cm4gbmV3IHQoKGZ1bmN0aW9uKHQsbyl7bihlLHIsdCxvKX0pKX1yZXR1cm4gbz1vP28udGhlbihhLGEpOmEoKX19ZnVuY3Rpb24gQyhlLG4pe3ZhciByPWUuaXRlcmF0b3Jbbi5tZXRob2RdO2lmKHI9PT10KXtpZihuLmRlbGVnYXRlPW51bGwsInRocm93Ij09PW4ubWV0aG9kKXtpZihlLml0ZXJhdG9yLnJldHVybiYmKG4ubWV0aG9kPSJyZXR1cm4iLG4uYXJnPXQsQyhlLG4pLCJ0aHJvdyI9PT1uLm1ldGhvZCkpcmV0dXJuIG07bi5tZXRob2Q9InRocm93IixuLmFyZz1uZXcgVHlwZUVycm9yKCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICd0aHJvdycgbWV0aG9kIil9cmV0dXJuIG19dmFyIG89bChyLGUuaXRlcmF0b3Isbi5hcmcpO2lmKCJ0aHJvdyI9PT1vLnR5cGUpcmV0dXJuIG4ubWV0aG9kPSJ0aHJvdyIsbi5hcmc9by5hcmcsbi5kZWxlZ2F0ZT1udWxsLG07dmFyIGE9by5hcmc7cmV0dXJuIGE/YS5kb25lPyhuW2UucmVzdWx0TmFtZV09YS52YWx1ZSxuLm5leHQ9ZS5uZXh0TG9jLCJyZXR1cm4iIT09bi5tZXRob2QmJihuLm1ldGhvZD0ibmV4dCIsbi5hcmc9dCksbi5kZWxlZ2F0ZT1udWxsLG0pOmE6KG4ubWV0aG9kPSJ0aHJvdyIsbi5hcmc9bmV3IFR5cGVFcnJvcigiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3QiKSxuLmRlbGVnYXRlPW51bGwsbSl9ZnVuY3Rpb24gQShlKXt2YXIgdD17dHJ5TG9jOmVbMF19OzEgaW4gZSYmKHQuY2F0Y2hMb2M9ZVsxXSksMiBpbiBlJiYodC5maW5hbGx5TG9jPWVbMl0sdC5hZnRlckxvYz1lWzNdKSx0aGlzLnRyeUVudHJpZXMucHVzaCh0KX1mdW5jdGlvbiBPKGUpe3ZhciB0PWUuY29tcGxldGlvbnx8e307dC50eXBlPSJub3JtYWwiLGRlbGV0ZSB0LmFyZyxlLmNvbXBsZXRpb249dH1mdW5jdGlvbiBrKGUpe3RoaXMudHJ5RW50cmllcz1be3RyeUxvYzoicm9vdCJ9XSxlLmZvckVhY2goQSx0aGlzKSx0aGlzLnJlc2V0KCEwKX1mdW5jdGlvbiBqKGUpe2lmKGUpe3ZhciBuPWVbYV07aWYobilyZXR1cm4gbi5jYWxsKGUpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBlLm5leHQpcmV0dXJuIGU7aWYoIWlzTmFOKGUubGVuZ3RoKSl7dmFyIG89LTEsaT1mdW5jdGlvbiBuKCl7Zm9yKDsrK288ZS5sZW5ndGg7KWlmKHIuY2FsbChlLG8pKXJldHVybiBuLnZhbHVlPWVbb10sbi5kb25lPSExLG47cmV0dXJuIG4udmFsdWU9dCxuLmRvbmU9ITAsbn07cmV0dXJuIGkubmV4dD1pfX1yZXR1cm57bmV4dDpUfX1mdW5jdGlvbiBUKCl7cmV0dXJue3ZhbHVlOnQsZG9uZTohMH19cmV0dXJuIGcucHJvdG90eXBlPXguY29uc3RydWN0b3I9eSx5LmNvbnN0cnVjdG9yPWcsZy5kaXNwbGF5TmFtZT11KHkscywiR2VuZXJhdG9yRnVuY3Rpb24iKSxlLmlzR2VuZXJhdG9yRnVuY3Rpb249ZnVuY3Rpb24oZSl7dmFyIHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUuY29uc3RydWN0b3I7cmV0dXJuISF0JiYodD09PWd8fCJHZW5lcmF0b3JGdW5jdGlvbiI9PT0odC5kaXNwbGF5TmFtZXx8dC5uYW1lKSl9LGUubWFyaz1mdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHkpOihlLl9fcHJvdG9fXz15LHUoZSxzLCJHZW5lcmF0b3JGdW5jdGlvbiIpKSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHgpLGV9LGUuYXdyYXA9ZnVuY3Rpb24oZSl7cmV0dXJue19fYXdhaXQ6ZX19LEUoUy5wcm90b3R5cGUpLFMucHJvdG90eXBlW2ldPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGUuQXN5bmNJdGVyYXRvcj1TLGUuYXN5bmM9ZnVuY3Rpb24odCxuLHIsbyxhKXt2b2lkIDA9PT1hJiYoYT1Qcm9taXNlKTt2YXIgaT1uZXcgUyhjKHQsbixyLG8pLGEpO3JldHVybiBlLmlzR2VuZXJhdG9yRnVuY3Rpb24obik/aTppLm5leHQoKS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4gZS5kb25lP2UudmFsdWU6aS5uZXh0KCl9KSl9LEUoeCksdSh4LHMsIkdlbmVyYXRvciIpLHhbYV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30seC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJbb2JqZWN0IEdlbmVyYXRvcl0ifSxlLmtleXM9ZnVuY3Rpb24oZSl7dmFyIHQ9W107Zm9yKHZhciBuIGluIGUpdC5wdXNoKG4pO3JldHVybiB0LnJldmVyc2UoKSxmdW5jdGlvbiBuKCl7Zm9yKDt0Lmxlbmd0aDspe3ZhciByPXQucG9wKCk7aWYociBpbiBlKXJldHVybiBuLnZhbHVlPXIsbi5kb25lPSExLG59cmV0dXJuIG4uZG9uZT0hMCxufX0sZS52YWx1ZXM9aixrLnByb3RvdHlwZT17Y29uc3RydWN0b3I6ayxyZXNldDpmdW5jdGlvbihlKXtpZih0aGlzLnByZXY9MCx0aGlzLm5leHQ9MCx0aGlzLnNlbnQ9dGhpcy5fc2VudD10LHRoaXMuZG9uZT0hMSx0aGlzLmRlbGVnYXRlPW51bGwsdGhpcy5tZXRob2Q9Im5leHQiLHRoaXMuYXJnPXQsdGhpcy50cnlFbnRyaWVzLmZvckVhY2goTyksIWUpZm9yKHZhciBuIGluIHRoaXMpInQiPT09bi5jaGFyQXQoMCkmJnIuY2FsbCh0aGlzLG4pJiYhaXNOYU4oK24uc2xpY2UoMSkpJiYodGhpc1tuXT10KX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuZG9uZT0hMDt2YXIgZT10aGlzLnRyeUVudHJpZXNbMF0uY29tcGxldGlvbjtpZigidGhyb3ciPT09ZS50eXBlKXRocm93IGUuYXJnO3JldHVybiB0aGlzLnJ2YWx9LGRpc3BhdGNoRXhjZXB0aW9uOmZ1bmN0aW9uKGUpe2lmKHRoaXMuZG9uZSl0aHJvdyBlO3ZhciBuPXRoaXM7ZnVuY3Rpb24gbyhyLG8pe3JldHVybiBzLnR5cGU9InRocm93IixzLmFyZz1lLG4ubmV4dD1yLG8mJihuLm1ldGhvZD0ibmV4dCIsbi5hcmc9dCksISFvfWZvcih2YXIgYT10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7YT49MDstLWEpe3ZhciBpPXRoaXMudHJ5RW50cmllc1thXSxzPWkuY29tcGxldGlvbjtpZigicm9vdCI9PT1pLnRyeUxvYylyZXR1cm4gbygiZW5kIik7aWYoaS50cnlMb2M8PXRoaXMucHJldil7dmFyIHU9ci5jYWxsKGksImNhdGNoTG9jIiksYz1yLmNhbGwoaSwiZmluYWxseUxvYyIpO2lmKHUmJmMpe2lmKHRoaXMucHJldjxpLmNhdGNoTG9jKXJldHVybiBvKGkuY2F0Y2hMb2MsITApO2lmKHRoaXMucHJldjxpLmZpbmFsbHlMb2MpcmV0dXJuIG8oaS5maW5hbGx5TG9jKX1lbHNlIGlmKHUpe2lmKHRoaXMucHJldjxpLmNhdGNoTG9jKXJldHVybiBvKGkuY2F0Y2hMb2MsITApfWVsc2V7aWYoIWMpdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpO2lmKHRoaXMucHJldjxpLmZpbmFsbHlMb2MpcmV0dXJuIG8oaS5maW5hbGx5TG9jKX19fX0sYWJydXB0OmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtuPj0wOy0tbil7dmFyIG89dGhpcy50cnlFbnRyaWVzW25dO2lmKG8udHJ5TG9jPD10aGlzLnByZXYmJnIuY2FsbChvLCJmaW5hbGx5TG9jIikmJnRoaXMucHJldjxvLmZpbmFsbHlMb2Mpe3ZhciBhPW87YnJlYWt9fWEmJigiYnJlYWsiPT09ZXx8ImNvbnRpbnVlIj09PWUpJiZhLnRyeUxvYzw9dCYmdDw9YS5maW5hbGx5TG9jJiYoYT1udWxsKTt2YXIgaT1hP2EuY29tcGxldGlvbjp7fTtyZXR1cm4gaS50eXBlPWUsaS5hcmc9dCxhPyh0aGlzLm1ldGhvZD0ibmV4dCIsdGhpcy5uZXh0PWEuZmluYWxseUxvYyxtKTp0aGlzLmNvbXBsZXRlKGkpfSxjb21wbGV0ZTpmdW5jdGlvbihlLHQpe2lmKCJ0aHJvdyI9PT1lLnR5cGUpdGhyb3cgZS5hcmc7cmV0dXJuImJyZWFrIj09PWUudHlwZXx8ImNvbnRpbnVlIj09PWUudHlwZT90aGlzLm5leHQ9ZS5hcmc6InJldHVybiI9PT1lLnR5cGU/KHRoaXMucnZhbD10aGlzLmFyZz1lLmFyZyx0aGlzLm1ldGhvZD0icmV0dXJuIix0aGlzLm5leHQ9ImVuZCIpOiJub3JtYWwiPT09ZS50eXBlJiZ0JiYodGhpcy5uZXh0PXQpLG19LGZpbmlzaDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO3Q+PTA7LS10KXt2YXIgbj10aGlzLnRyeUVudHJpZXNbdF07aWYobi5maW5hbGx5TG9jPT09ZSlyZXR1cm4gdGhpcy5jb21wbGV0ZShuLmNvbXBsZXRpb24sbi5hZnRlckxvYyksTyhuKSxtfX0sY2F0Y2g6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTt0Pj0wOy0tdCl7dmFyIG49dGhpcy50cnlFbnRyaWVzW3RdO2lmKG4udHJ5TG9jPT09ZSl7dmFyIHI9bi5jb21wbGV0aW9uO2lmKCJ0aHJvdyI9PT1yLnR5cGUpe3ZhciBvPXIuYXJnO08obil9cmV0dXJuIG99fXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCBjYXRjaCBhdHRlbXB0Iil9LGRlbGVnYXRlWWllbGQ6ZnVuY3Rpb24oZSxuLHIpe3JldHVybiB0aGlzLmRlbGVnYXRlPXtpdGVyYXRvcjpqKGUpLHJlc3VsdE5hbWU6bixuZXh0TG9jOnJ9LCJuZXh0Ij09PXRoaXMubWV0aG9kJiYodGhpcy5hcmc9dCksbX19LGV9KGUuZXhwb3J0cyk7dHJ5e3JlZ2VuZXJhdG9yUnVudGltZT1yfWNhdGNoKGUpe0Z1bmN0aW9uKCJyIiwicmVnZW5lcmF0b3JSdW50aW1lID0gciIpKHIpfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMzc2KTtlLmV4cG9ydHM9cn0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNDQ3KTtlLmV4cG9ydHM9cn0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oODg0KTtlLmV4cG9ydHM9cn0sZnVuY3Rpb24oZSx0LG4pe24oODg1KTt2YXIgcj1uKDMzKTtlLmV4cG9ydHM9ci5PYmplY3QudmFsdWVzfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigyMiksbz1uKDQ1NykudmFsdWVzO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwfSx7dmFsdWVzOmZ1bmN0aW9uKGUpe3JldHVybiBvKGUpfX0pfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big4ODcpO2UuZXhwb3J0cz1yfSxmdW5jdGlvbihlLHQsbil7big4ODgpO3ZhciByPW4oMzMpO2UuZXhwb3J0cz1yLkRhdGUubm93fSxmdW5jdGlvbihlLHQsbil7bigyMikoe3RhcmdldDoiRGF0ZSIsc3RhdDohMH0se25vdzpmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfX0pfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2lmKHQ9dC5zcGxpdCgiOiIpWzBdLCEoZT0rZSkpcmV0dXJuITE7c3dpdGNoKHQpe2Nhc2UiaHR0cCI6Y2FzZSJ3cyI6cmV0dXJuIDgwIT09ZTtjYXNlImh0dHBzIjpjYXNlIndzcyI6cmV0dXJuIDQ0MyE9PWU7Y2FzZSJmdHAiOnJldHVybiAyMSE9PWU7Y2FzZSJnb3BoZXIiOnJldHVybiA3MCE9PWU7Y2FzZSJmaWxlIjpyZXR1cm4hMX1yZXR1cm4gMCE9PWV9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZnVuY3Rpb24gbyhlKXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlLnJlcGxhY2UoL1wrL2csIiAiKSl9Y2F0Y2goZSl7cmV0dXJuIG51bGx9fWZ1bmN0aW9uIGEoZSl7dHJ5e3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoZSl9Y2F0Y2goZSl7cmV0dXJuIG51bGx9fXQuc3RyaW5naWZ5PWZ1bmN0aW9uKGUsdCl7dD10fHwiIjt2YXIgbixvLGk9W107Zm9yKG8gaW4ic3RyaW5nIiE9dHlwZW9mIHQmJih0PSI/IiksZSlpZihyLmNhbGwoZSxvKSl7aWYoKG49ZVtvXSl8fG51bGwhPW4mJiFpc05hTihuKXx8KG49IiIpLG89YShvKSxuPWEobiksbnVsbD09PW98fG51bGw9PT1uKWNvbnRpbnVlO2kucHVzaChvKyI9IituKX1yZXR1cm4gaS5sZW5ndGg/dCtpLmpvaW4oIiYiKToiIn0sdC5wYXJzZT1mdW5jdGlvbihlKXtmb3IodmFyIHQsbj0vKFtePT8jJl0rKT0/KFteJl0qKS9nLHI9e307dD1uLmV4ZWMoZSk7KXt2YXIgYT1vKHRbMV0pLGk9byh0WzJdKTtudWxsPT09YXx8bnVsbD09PWl8fGEgaW4gcnx8KHJbYV09aSl9cmV0dXJuIHJ9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big3MSk7ZS5leHBvcnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHIuRGF0ZS5ub3coKX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDI1OSksbz1uKDE2MiksYT1uKDE5NyksaT1uKDU5KSxzPW4oMTM4KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4sdSl7aWYoIWkoZSkpcmV0dXJuIGU7Zm9yKHZhciBjPS0xLGw9KHQ9byh0LGUpKS5sZW5ndGgscD1sLTEsZj1lO251bGwhPWYmJisrYzxsOyl7dmFyIGg9cyh0W2NdKSxkPW47aWYoIl9fcHJvdG9fXyI9PT1ofHwiY29uc3RydWN0b3IiPT09aHx8InByb3RvdHlwZSI9PT1oKXJldHVybiBlO2lmKGMhPXApe3ZhciBtPWZbaF07dm9pZCAwPT09KGQ9dT91KG0saCxmKTp2b2lkIDApJiYoZD1pKG0pP206YSh0W2MrMV0pP1tdOnt9KX1yKGYsaCxkKSxmPWZbaF19cmV0dXJuIGV9fSxmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPW4oODk0KX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMzc4KTtlLmV4cG9ydHM9cn0sZnVuY3Rpb24oZSx0LG4pe2UuZXhwb3J0cz1uKDg5Nil9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDg5Nyk7ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXtuKDg5OCk7dmFyIHI9bigzMykuT2JqZWN0O2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiByLmNyZWF0ZShlLHQpfX0sZnVuY3Rpb24oZSx0LG4pe24oMjIpKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxzaGFtOiFuKDQ4KX0se2NyZWF0ZTpuKDExMSl9KX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNDYwKTtmdW5jdGlvbiBvKHQsbil7cmV0dXJuIGUuZXhwb3J0cz1vPXJ8fGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuX19wcm90b19fPXQsZX0sZS5leHBvcnRzLmRlZmF1bHQ9ZS5leHBvcnRzLGUuZXhwb3J0cy5fX2VzTW9kdWxlPSEwLG8odCxuKX1lLmV4cG9ydHM9byxlLmV4cG9ydHMuZGVmYXVsdD1lLmV4cG9ydHMsZS5leHBvcnRzLl9fZXNNb2R1bGU9ITB9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDkwMSk7ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXtuKDkwMik7dmFyIHI9bigzMyk7ZS5leHBvcnRzPXIuT2JqZWN0LnNldFByb3RvdHlwZU9mfSxmdW5jdGlvbihlLHQsbil7bigyMikoe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwfSx7c2V0UHJvdG90eXBlT2Y6bigxODUpfSl9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDkwNCk7ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXtuKDkwNSk7dmFyIHI9bigzMyk7ZS5leHBvcnRzPXIuUmVmbGVjdC5jb25zdHJ1Y3R9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDIyKSxvPW4oNzApLGE9big3NiksaT1uKDUyKSxzPW4oNDcpLHU9bigxMTEpLGM9bigzNzcpLGw9bigzNykscD1vKCJSZWZsZWN0IiwiY29uc3RydWN0IiksZj1sKChmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt9cmV0dXJuIShwKChmdW5jdGlvbigpe30pLFtdLGUpaW5zdGFuY2VvZiBlKX0pKSxoPSFsKChmdW5jdGlvbigpe3AoKGZ1bmN0aW9uKCl7fSkpfSkpLGQ9Znx8aDtyKHt0YXJnZXQ6IlJlZmxlY3QiLHN0YXQ6ITAsZm9yY2VkOmQsc2hhbTpkfSx7Y29uc3RydWN0OmZ1bmN0aW9uKGUsdCl7YShlKSxpKHQpO3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg8Mz9lOmEoYXJndW1lbnRzWzJdKTtpZihoJiYhZilyZXR1cm4gcChlLHQsbik7aWYoZT09bil7c3dpdGNoKHQubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIG5ldyBlO2Nhc2UgMTpyZXR1cm4gbmV3IGUodFswXSk7Y2FzZSAyOnJldHVybiBuZXcgZSh0WzBdLHRbMV0pO2Nhc2UgMzpyZXR1cm4gbmV3IGUodFswXSx0WzFdLHRbMl0pO2Nhc2UgNDpyZXR1cm4gbmV3IGUodFswXSx0WzFdLHRbMl0sdFszXSl9dmFyIHI9W251bGxdO3JldHVybiByLnB1c2guYXBwbHkocix0KSxuZXcoYy5hcHBseShlLHIpKX12YXIgbz1uLnByb3RvdHlwZSxsPXUocyhvKT9vOk9iamVjdC5wcm90b3R5cGUpLGQ9RnVuY3Rpb24uYXBwbHkuY2FsbChlLGwsdCk7cmV0dXJuIHMoZCk/ZDpsfX0pfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big0NjApLG89big5MDcpO2Z1bmN0aW9uIGEodCl7cmV0dXJuIGUuZXhwb3J0cz1hPXI/bzpmdW5jdGlvbihlKXtyZXR1cm4gZS5fX3Byb3RvX198fG8oZSl9LGUuZXhwb3J0cy5kZWZhdWx0PWUuZXhwb3J0cyxlLmV4cG9ydHMuX19lc01vZHVsZT0hMCxhKHQpfWUuZXhwb3J0cz1hLGUuZXhwb3J0cy5kZWZhdWx0PWUuZXhwb3J0cyxlLmV4cG9ydHMuX19lc01vZHVsZT0hMH0sZnVuY3Rpb24oZSx0LG4pe2UuZXhwb3J0cz1uKDkwOCl9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDkwOSk7ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXtuKDkxMCk7dmFyIHI9bigzMyk7ZS5leHBvcnRzPXIuT2JqZWN0LmdldFByb3RvdHlwZU9mfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigyMiksbz1uKDM3KSxhPW4oNjIpLGk9bigxODQpLHM9bigzNzIpO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpvKChmdW5jdGlvbigpe2koMSl9KSksc2hhbTohc30se2dldFByb3RvdHlwZU9mOmZ1bmN0aW9uKGUpe3JldHVybiBpKGEoZSkpfX0pfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big0NjEpO2UuZXhwb3J0cz1mdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IXIpcmV0dXJuITE7aWYoci5zaGFtKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBQcm94eSlyZXR1cm4hMDt0cnl7cmV0dXJuIEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YuY2FsbChyKEJvb2xlYW4sW10sKGZ1bmN0aW9uKCl7fSkpKSwhMH1jYXRjaChlKXtyZXR1cm4hMX19LGUuZXhwb3J0cy5kZWZhdWx0PWUuZXhwb3J0cyxlLmV4cG9ydHMuX19lc01vZHVsZT0hMH0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTgpLmRlZmF1bHQsbz1uKDEwKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4hdHx8Im9iamVjdCIhPT1yKHQpJiYiZnVuY3Rpb24iIT10eXBlb2YgdD9vKGUpOnR9LGUuZXhwb3J0cy5kZWZhdWx0PWUuZXhwb3J0cyxlLmV4cG9ydHMuX19lc01vZHVsZT0hMH0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDQ1KSxvPW4oOTE0KSxhPW4oNDg1KSxpPW4oMTQzKSxzPW4oNzkpLHU9big5ODYpLGM9big5ODcpLGw9big0ODYpLHA9big5ODgpO24oMzQpO28uaW5qZWN0KCk7dmFyIGY9e2ZpbmRET01Ob2RlOmMscmVuZGVyOmEucmVuZGVyLHVubW91bnRDb21wb25lbnRBdE5vZGU6YS51bm1vdW50Q29tcG9uZW50QXROb2RlLHZlcnNpb246dSx1bnN0YWJsZV9iYXRjaGVkVXBkYXRlczpzLmJhdGNoZWRVcGRhdGVzLHVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyOnB9OyJ1bmRlZmluZWQiIT10eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fJiYiZnVuY3Rpb24iPT10eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmluamVjdCYmX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmluamVjdCh7Q29tcG9uZW50VHJlZTp7Z2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGU6ci5nZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSxnZXROb2RlRnJvbUluc3RhbmNlOmZ1bmN0aW9uKGUpe3JldHVybiBlLl9yZW5kZXJlZENvbXBvbmVudCYmKGU9bChlKSksZT9yLmdldE5vZGVGcm9tSW5zdGFuY2UoZSk6bnVsbH19LE1vdW50OmEsUmVjb25jaWxlcjppfSksZS5leHBvcnRzPWZ9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9big5MTUpLG89big5MTYpLGE9big5MjApLGk9big5MjMpLHM9big5MjQpLHU9big5MjUpLGM9big5MjYpLGw9big5MzIpLHA9big0NSksZj1uKDk1NyksaD1uKDk1OCksZD1uKDk1OSksbT1uKDk2MCksdj1uKDk2MSksZz1uKDk2MykseT1uKDk2NCksYj1uKDk3MCksXz1uKDk3MSksdz1uKDk3MikseD0hMTtlLmV4cG9ydHM9e2luamVjdDpmdW5jdGlvbigpe3h8fCh4PSEwLGcuRXZlbnRFbWl0dGVyLmluamVjdFJlYWN0RXZlbnRMaXN0ZW5lcih2KSxnLkV2ZW50UGx1Z2luSHViLmluamVjdEV2ZW50UGx1Z2luT3JkZXIoaSksZy5FdmVudFBsdWdpblV0aWxzLmluamVjdENvbXBvbmVudFRyZWUocCksZy5FdmVudFBsdWdpblV0aWxzLmluamVjdFRyZWVUcmF2ZXJzYWwoaCksZy5FdmVudFBsdWdpbkh1Yi5pbmplY3RFdmVudFBsdWdpbnNCeU5hbWUoe1NpbXBsZUV2ZW50UGx1Z2luOncsRW50ZXJMZWF2ZUV2ZW50UGx1Z2luOnMsQ2hhbmdlRXZlbnRQbHVnaW46YSxTZWxlY3RFdmVudFBsdWdpbjpfLEJlZm9yZUlucHV0RXZlbnRQbHVnaW46b30pLGcuSG9zdENvbXBvbmVudC5pbmplY3RHZW5lcmljQ29tcG9uZW50Q2xhc3MobCksZy5Ib3N0Q29tcG9uZW50LmluamVjdFRleHRDb21wb25lbnRDbGFzcyhkKSxnLkRPTVByb3BlcnR5LmluamVjdERPTVByb3BlcnR5Q29uZmlnKHIpLGcuRE9NUHJvcGVydHkuaW5qZWN0RE9NUHJvcGVydHlDb25maWcodSksZy5ET01Qcm9wZXJ0eS5pbmplY3RET01Qcm9wZXJ0eUNvbmZpZyhiKSxnLkVtcHR5Q29tcG9uZW50LmluamVjdEVtcHR5Q29tcG9uZW50RmFjdG9yeSgoZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBmKGUpfSkpLGcuVXBkYXRlcy5pbmplY3RSZWNvbmNpbGVUcmFuc2FjdGlvbih5KSxnLlVwZGF0ZXMuaW5qZWN0QmF0Y2hpbmdTdHJhdGVneShtKSxnLkNvbXBvbmVudC5pbmplY3RFbnZpcm9ubWVudChjKSl9fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9e1Byb3BlcnRpZXM6eyJhcmlhLWN1cnJlbnQiOjAsImFyaWEtZGV0YWlscyI6MCwiYXJpYS1kaXNhYmxlZCI6MCwiYXJpYS1oaWRkZW4iOjAsImFyaWEtaW52YWxpZCI6MCwiYXJpYS1rZXlzaG9ydGN1dHMiOjAsImFyaWEtbGFiZWwiOjAsImFyaWEtcm9sZWRlc2NyaXB0aW9uIjowLCJhcmlhLWF1dG9jb21wbGV0ZSI6MCwiYXJpYS1jaGVja2VkIjowLCJhcmlhLWV4cGFuZGVkIjowLCJhcmlhLWhhc3BvcHVwIjowLCJhcmlhLWxldmVsIjowLCJhcmlhLW1vZGFsIjowLCJhcmlhLW11bHRpbGluZSI6MCwiYXJpYS1tdWx0aXNlbGVjdGFibGUiOjAsImFyaWEtb3JpZW50YXRpb24iOjAsImFyaWEtcGxhY2Vob2xkZXIiOjAsImFyaWEtcHJlc3NlZCI6MCwiYXJpYS1yZWFkb25seSI6MCwiYXJpYS1yZXF1aXJlZCI6MCwiYXJpYS1zZWxlY3RlZCI6MCwiYXJpYS1zb3J0IjowLCJhcmlhLXZhbHVlbWF4IjowLCJhcmlhLXZhbHVlbWluIjowLCJhcmlhLXZhbHVlbm93IjowLCJhcmlhLXZhbHVldGV4dCI6MCwiYXJpYS1hdG9taWMiOjAsImFyaWEtYnVzeSI6MCwiYXJpYS1saXZlIjowLCJhcmlhLXJlbGV2YW50IjowLCJhcmlhLWRyb3BlZmZlY3QiOjAsImFyaWEtZ3JhYmJlZCI6MCwiYXJpYS1hY3RpdmVkZXNjZW5kYW50IjowLCJhcmlhLWNvbGNvdW50IjowLCJhcmlhLWNvbGluZGV4IjowLCJhcmlhLWNvbHNwYW4iOjAsImFyaWEtY29udHJvbHMiOjAsImFyaWEtZGVzY3JpYmVkYnkiOjAsImFyaWEtZXJyb3JtZXNzYWdlIjowLCJhcmlhLWZsb3d0byI6MCwiYXJpYS1sYWJlbGxlZGJ5IjowLCJhcmlhLW93bnMiOjAsImFyaWEtcG9zaW5zZXQiOjAsImFyaWEtcm93Y291bnQiOjAsImFyaWEtcm93aW5kZXgiOjAsImFyaWEtcm93c3BhbiI6MCwiYXJpYS1zZXRzaXplIjowfSxET01BdHRyaWJ1dGVOYW1lczp7fSxET01Qcm9wZXJ0eU5hbWVzOnt9fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE2Niksbz1uKDU3KSxhPW4oOTE3KSxpPW4oOTE4KSxzPW4oOTE5KSx1PVs5LDEzLDI3LDMyXSxjPW8uY2FuVXNlRE9NJiYiQ29tcG9zaXRpb25FdmVudCJpbiB3aW5kb3csbD1udWxsO28uY2FuVXNlRE9NJiYiZG9jdW1lbnRNb2RlImluIGRvY3VtZW50JiYobD1kb2N1bWVudC5kb2N1bWVudE1vZGUpO3ZhciBwLGY9by5jYW5Vc2VET00mJiJUZXh0RXZlbnQiaW4gd2luZG93JiYhbCYmISgib2JqZWN0Ij09dHlwZW9mKHA9d2luZG93Lm9wZXJhKSYmImZ1bmN0aW9uIj09dHlwZW9mIHAudmVyc2lvbiYmcGFyc2VJbnQocC52ZXJzaW9uKCksMTApPD0xMiksaD1vLmNhblVzZURPTSYmKCFjfHxsJiZsPjgmJmw8PTExKTt2YXIgZD1TdHJpbmcuZnJvbUNoYXJDb2RlKDMyKSxtPXtiZWZvcmVJbnB1dDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Im9uQmVmb3JlSW5wdXQiLGNhcHR1cmVkOiJvbkJlZm9yZUlucHV0Q2FwdHVyZSJ9LGRlcGVuZGVuY2llczpbInRvcENvbXBvc2l0aW9uRW5kIiwidG9wS2V5UHJlc3MiLCJ0b3BUZXh0SW5wdXQiLCJ0b3BQYXN0ZSJdfSxjb21wb3NpdGlvbkVuZDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Im9uQ29tcG9zaXRpb25FbmQiLGNhcHR1cmVkOiJvbkNvbXBvc2l0aW9uRW5kQ2FwdHVyZSJ9LGRlcGVuZGVuY2llczpbInRvcEJsdXIiLCJ0b3BDb21wb3NpdGlvbkVuZCIsInRvcEtleURvd24iLCJ0b3BLZXlQcmVzcyIsInRvcEtleVVwIiwidG9wTW91c2VEb3duIl19LGNvbXBvc2l0aW9uU3RhcnQ6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOiJvbkNvbXBvc2l0aW9uU3RhcnQiLGNhcHR1cmVkOiJvbkNvbXBvc2l0aW9uU3RhcnRDYXB0dXJlIn0sZGVwZW5kZW5jaWVzOlsidG9wQmx1ciIsInRvcENvbXBvc2l0aW9uU3RhcnQiLCJ0b3BLZXlEb3duIiwidG9wS2V5UHJlc3MiLCJ0b3BLZXlVcCIsInRvcE1vdXNlRG93biJdfSxjb21wb3NpdGlvblVwZGF0ZTp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Im9uQ29tcG9zaXRpb25VcGRhdGUiLGNhcHR1cmVkOiJvbkNvbXBvc2l0aW9uVXBkYXRlQ2FwdHVyZSJ9LGRlcGVuZGVuY2llczpbInRvcEJsdXIiLCJ0b3BDb21wb3NpdGlvblVwZGF0ZSIsInRvcEtleURvd24iLCJ0b3BLZXlQcmVzcyIsInRvcEtleVVwIiwidG9wTW91c2VEb3duIl19fSx2PSExO2Z1bmN0aW9uIGcoZSx0KXtzd2l0Y2goZSl7Y2FzZSJ0b3BLZXlVcCI6cmV0dXJuLTEhPT11LmluZGV4T2YodC5rZXlDb2RlKTtjYXNlInRvcEtleURvd24iOnJldHVybiAyMjkhPT10LmtleUNvZGU7Y2FzZSJ0b3BLZXlQcmVzcyI6Y2FzZSJ0b3BNb3VzZURvd24iOmNhc2UidG9wQmx1ciI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24geShlKXt2YXIgdD1lLmRldGFpbDtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJiJkYXRhImluIHQ/dC5kYXRhOm51bGx9dmFyIGI9bnVsbDtmdW5jdGlvbiBfKGUsdCxuLG8pe3ZhciBzLHU7aWYoYz9zPWZ1bmN0aW9uKGUpe3N3aXRjaChlKXtjYXNlInRvcENvbXBvc2l0aW9uU3RhcnQiOnJldHVybiBtLmNvbXBvc2l0aW9uU3RhcnQ7Y2FzZSJ0b3BDb21wb3NpdGlvbkVuZCI6cmV0dXJuIG0uY29tcG9zaXRpb25FbmQ7Y2FzZSJ0b3BDb21wb3NpdGlvblVwZGF0ZSI6cmV0dXJuIG0uY29tcG9zaXRpb25VcGRhdGV9fShlKTpiP2coZSxuKSYmKHM9bS5jb21wb3NpdGlvbkVuZCk6ZnVuY3Rpb24oZSx0KXtyZXR1cm4idG9wS2V5RG93biI9PT1lJiYyMjk9PT10LmtleUNvZGV9KGUsbikmJihzPW0uY29tcG9zaXRpb25TdGFydCksIXMpcmV0dXJuIG51bGw7aCYmKGJ8fHMhPT1tLmNvbXBvc2l0aW9uU3RhcnQ/cz09PW0uY29tcG9zaXRpb25FbmQmJmImJih1PWIuZ2V0RGF0YSgpKTpiPWEuZ2V0UG9vbGVkKG8pKTt2YXIgbD1pLmdldFBvb2xlZChzLHQsbixvKTtpZih1KWwuZGF0YT11O2Vsc2V7dmFyIHA9eShuKTtudWxsIT09cCYmKGwuZGF0YT1wKX1yZXR1cm4gci5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKGwpLGx9ZnVuY3Rpb24gdyhlLHQsbixvKXt2YXIgaTtpZighKGk9Zj9mdW5jdGlvbihlLHQpe3N3aXRjaChlKXtjYXNlInRvcENvbXBvc2l0aW9uRW5kIjpyZXR1cm4geSh0KTtjYXNlInRvcEtleVByZXNzIjpyZXR1cm4gMzIhPT10LndoaWNoP251bGw6KHY9ITAsZCk7Y2FzZSJ0b3BUZXh0SW5wdXQiOnZhciBuPXQuZGF0YTtyZXR1cm4gbj09PWQmJnY/bnVsbDpuO2RlZmF1bHQ6cmV0dXJuIG51bGx9fShlLG4pOmZ1bmN0aW9uKGUsdCl7aWYoYil7aWYoInRvcENvbXBvc2l0aW9uRW5kIj09PWV8fCFjJiZnKGUsdCkpe3ZhciBuPWIuZ2V0RGF0YSgpO3JldHVybiBhLnJlbGVhc2UoYiksYj1udWxsLG59cmV0dXJuIG51bGx9c3dpdGNoKGUpe2Nhc2UidG9wUGFzdGUiOnJldHVybiBudWxsO2Nhc2UidG9wS2V5UHJlc3MiOnJldHVybiB0LndoaWNoJiYhZnVuY3Rpb24oZSl7cmV0dXJuKGUuY3RybEtleXx8ZS5hbHRLZXl8fGUubWV0YUtleSkmJiEoZS5jdHJsS2V5JiZlLmFsdEtleSl9KHQpP1N0cmluZy5mcm9tQ2hhckNvZGUodC53aGljaCk6bnVsbDtjYXNlInRvcENvbXBvc2l0aW9uRW5kIjpyZXR1cm4gaD9udWxsOnQuZGF0YTtkZWZhdWx0OnJldHVybiBudWxsfX0oZSxuKSkpcmV0dXJuIG51bGw7dmFyIHU9cy5nZXRQb29sZWQobS5iZWZvcmVJbnB1dCx0LG4sbyk7cmV0dXJuIHUuZGF0YT1pLHIuYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcyh1KSx1fXZhciB4PXtldmVudFR5cGVzOm0sZXh0cmFjdEV2ZW50czpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm5bXyhlLHQsbixyKSx3KGUsdCxuLHIpXX19O2UuZXhwb3J0cz14fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzgpLG89bigxMjIpLGE9big0NjUpO2Z1bmN0aW9uIGkoZSl7dGhpcy5fcm9vdD1lLHRoaXMuX3N0YXJ0VGV4dD10aGlzLmdldFRleHQoKSx0aGlzLl9mYWxsYmFja1RleHQ9bnVsbH1yKGkucHJvdG90eXBlLHtkZXN0cnVjdG9yOmZ1bmN0aW9uKCl7dGhpcy5fcm9vdD1udWxsLHRoaXMuX3N0YXJ0VGV4dD1udWxsLHRoaXMuX2ZhbGxiYWNrVGV4dD1udWxsfSxnZXRUZXh0OmZ1bmN0aW9uKCl7cmV0dXJuInZhbHVlImluIHRoaXMuX3Jvb3Q/dGhpcy5fcm9vdC52YWx1ZTp0aGlzLl9yb290W2EoKV19LGdldERhdGE6ZnVuY3Rpb24oKXtpZih0aGlzLl9mYWxsYmFja1RleHQpcmV0dXJuIHRoaXMuX2ZhbGxiYWNrVGV4dDt2YXIgZSx0LG49dGhpcy5fc3RhcnRUZXh0LHI9bi5sZW5ndGgsbz10aGlzLmdldFRleHQoKSxhPW8ubGVuZ3RoO2ZvcihlPTA7ZTxyJiZuW2VdPT09b1tlXTtlKyspO3ZhciBpPXItZTtmb3IodD0xO3Q8PWkmJm5bci10XT09PW9bYS10XTt0KyspO3ZhciBzPXQ+MT8xLXQ6dm9pZCAwO3JldHVybiB0aGlzLl9mYWxsYmFja1RleHQ9by5zbGljZShlLHMpLHRoaXMuX2ZhbGxiYWNrVGV4dH19KSxvLmFkZFBvb2xpbmdUbyhpKSxlLmV4cG9ydHM9aX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDkwKTtmdW5jdGlvbiBvKGUsdCxuLG8pe3JldHVybiByLmNhbGwodGhpcyxlLHQsbixvKX1yLmF1Z21lbnRDbGFzcyhvLHtkYXRhOm51bGx9KSxlLmV4cG9ydHM9b30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDkwKTtmdW5jdGlvbiBvKGUsdCxuLG8pe3JldHVybiByLmNhbGwodGhpcyxlLHQsbixvKX1yLmF1Z21lbnRDbGFzcyhvLHtkYXRhOm51bGx9KSxlLmV4cG9ydHM9b30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE2Nyksbz1uKDE2NiksYT1uKDU3KSxpPW4oNDUpLHM9big3OSksdT1uKDkwKSxjPW4oNDY4KSxsPW4oMjYzKSxwPW4oMjY0KSxmPW4oNDY5KSxoPXtjaGFuZ2U6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOiJvbkNoYW5nZSIsY2FwdHVyZWQ6Im9uQ2hhbmdlQ2FwdHVyZSJ9LGRlcGVuZGVuY2llczpbInRvcEJsdXIiLCJ0b3BDaGFuZ2UiLCJ0b3BDbGljayIsInRvcEZvY3VzIiwidG9wSW5wdXQiLCJ0b3BLZXlEb3duIiwidG9wS2V5VXAiLCJ0b3BTZWxlY3Rpb25DaGFuZ2UiXX19O2Z1bmN0aW9uIGQoZSx0LG4pe3ZhciByPXUuZ2V0UG9vbGVkKGguY2hhbmdlLGUsdCxuKTtyZXR1cm4gci50eXBlPSJjaGFuZ2UiLG8uYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcyhyKSxyfXZhciBtPW51bGwsdj1udWxsO3ZhciBnPSExO2Z1bmN0aW9uIHkoZSl7dmFyIHQ9ZCh2LGUsbChlKSk7cy5iYXRjaGVkVXBkYXRlcyhiLHQpfWZ1bmN0aW9uIGIoZSl7ci5lbnF1ZXVlRXZlbnRzKGUpLHIucHJvY2Vzc0V2ZW50UXVldWUoITEpfWZ1bmN0aW9uIF8oKXttJiYobS5kZXRhY2hFdmVudCgib25jaGFuZ2UiLHkpLG09bnVsbCx2PW51bGwpfWZ1bmN0aW9uIHcoZSx0KXt2YXIgbj1jLnVwZGF0ZVZhbHVlSWZDaGFuZ2VkKGUpLHI9ITA9PT10LnNpbXVsYXRlZCYmSS5fYWxsb3dTaW11bGF0ZWRQYXNzVGhyb3VnaDtpZihufHxyKXJldHVybiBlfWZ1bmN0aW9uIHgoZSx0KXtpZigidG9wQ2hhbmdlIj09PWUpcmV0dXJuIHR9ZnVuY3Rpb24gRShlLHQsbil7InRvcEZvY3VzIj09PWU/KF8oKSxmdW5jdGlvbihlLHQpe3Y9dCwobT1lKS5hdHRhY2hFdmVudCgib25jaGFuZ2UiLHkpfSh0LG4pKToidG9wQmx1ciI9PT1lJiZfKCl9YS5jYW5Vc2VET00mJihnPXAoImNoYW5nZSIpJiYoIWRvY3VtZW50LmRvY3VtZW50TW9kZXx8ZG9jdW1lbnQuZG9jdW1lbnRNb2RlPjgpKTt2YXIgUz0hMTtmdW5jdGlvbiBDKCl7bSYmKG0uZGV0YWNoRXZlbnQoIm9ucHJvcGVydHljaGFuZ2UiLEEpLG09bnVsbCx2PW51bGwpfWZ1bmN0aW9uIEEoZSl7InZhbHVlIj09PWUucHJvcGVydHlOYW1lJiZ3KHYsZSkmJnkoZSl9ZnVuY3Rpb24gTyhlLHQsbil7InRvcEZvY3VzIj09PWU/KEMoKSxmdW5jdGlvbihlLHQpe3Y9dCwobT1lKS5hdHRhY2hFdmVudCgib25wcm9wZXJ0eWNoYW5nZSIsQSl9KHQsbikpOiJ0b3BCbHVyIj09PWUmJkMoKX1mdW5jdGlvbiBrKGUsdCxuKXtpZigidG9wU2VsZWN0aW9uQ2hhbmdlIj09PWV8fCJ0b3BLZXlVcCI9PT1lfHwidG9wS2V5RG93biI9PT1lKXJldHVybiB3KHYsbil9ZnVuY3Rpb24gaihlLHQsbil7aWYoInRvcENsaWNrIj09PWUpcmV0dXJuIHcodCxuKX1mdW5jdGlvbiBUKGUsdCxuKXtpZigidG9wSW5wdXQiPT09ZXx8InRvcENoYW5nZSI9PT1lKXJldHVybiB3KHQsbil9YS5jYW5Vc2VET00mJihTPXAoImlucHV0IikmJighZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHxkb2N1bWVudC5kb2N1bWVudE1vZGU+OSkpO3ZhciBJPXtldmVudFR5cGVzOmgsX2FsbG93U2ltdWxhdGVkUGFzc1Rocm91Z2g6ITAsX2lzSW5wdXRFdmVudFN1cHBvcnRlZDpTLGV4dHJhY3RFdmVudHM6ZnVuY3Rpb24oZSx0LG4scil7dmFyIG8sYSxzLHUsYz10P2kuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0KTp3aW5kb3c7aWYoInNlbGVjdCI9PT0odT0ocz1jKS5ub2RlTmFtZSYmcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXx8ImlucHV0Ij09PXUmJiJmaWxlIj09PXMudHlwZT9nP289eDphPUU6ZihjKT9TP289VDoobz1rLGE9Tyk6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub2RlTmFtZTtyZXR1cm4gdCYmImlucHV0Ij09PXQudG9Mb3dlckNhc2UoKSYmKCJjaGVja2JveCI9PT1lLnR5cGV8fCJyYWRpbyI9PT1lLnR5cGUpfShjKSYmKG89aiksbyl7dmFyIGw9byhlLHQsbik7aWYobClyZXR1cm4gZChsLG4scil9YSYmYShlLGMsdCksInRvcEJsdXIiPT09ZSYmZnVuY3Rpb24oZSx0KXtpZihudWxsIT1lKXt2YXIgbj1lLl93cmFwcGVyU3RhdGV8fHQuX3dyYXBwZXJTdGF0ZTtpZihuJiZuLmNvbnRyb2xsZWQmJiJudW1iZXIiPT09dC50eXBlKXt2YXIgcj0iIit0LnZhbHVlO3QuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpIT09ciYmdC5zZXRBdHRyaWJ1dGUoInZhbHVlIixyKX19fSh0LGMpfX07ZS5leHBvcnRzPUl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9big5MjIpLG89e307by5hdHRhY2hSZWZzPWZ1bmN0aW9uKGUsdCl7aWYobnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdCl7dmFyIG49dC5yZWY7bnVsbCE9biYmZnVuY3Rpb24oZSx0LG4peyJmdW5jdGlvbiI9PXR5cGVvZiBlP2UodC5nZXRQdWJsaWNJbnN0YW5jZSgpKTpyLmFkZENvbXBvbmVudEFzUmVmVG8odCxlLG4pfShuLGUsdC5fb3duZXIpfX0sby5zaG91bGRVcGRhdGVSZWZzPWZ1bmN0aW9uKGUsdCl7dmFyIG49bnVsbCxyPW51bGw7bnVsbCE9PWUmJiJvYmplY3QiPT10eXBlb2YgZSYmKG49ZS5yZWYscj1lLl9vd25lcik7dmFyIG89bnVsbCxhPW51bGw7cmV0dXJuIG51bGwhPT10JiYib2JqZWN0Ij09dHlwZW9mIHQmJihvPXQucmVmLGE9dC5fb3duZXIpLG4hPT1vfHwic3RyaW5nIj09dHlwZW9mIG8mJmEhPT1yfSxvLmRldGFjaFJlZnM9ZnVuY3Rpb24oZSx0KXtpZihudWxsIT09dCYmIm9iamVjdCI9PXR5cGVvZiB0KXt2YXIgbj10LnJlZjtudWxsIT1uJiZmdW5jdGlvbihlLHQsbil7ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZShudWxsKTpyLnJlbW92ZUNvbXBvbmVudEFzUmVmRnJvbSh0LGUsbil9KG4sZSx0Ll9vd25lcil9fSxlLmV4cG9ydHM9b30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMwKTtuKDI1KTtmdW5jdGlvbiBvKGUpe3JldHVybiEoIWV8fCJmdW5jdGlvbiIhPXR5cGVvZiBlLmF0dGFjaFJlZnx8ImZ1bmN0aW9uIiE9dHlwZW9mIGUuZGV0YWNoUmVmKX12YXIgYT17YWRkQ29tcG9uZW50QXNSZWZUbzpmdW5jdGlvbihlLHQsbil7byhuKXx8cigiMTE5Iiksbi5hdHRhY2hSZWYodCxlKX0scmVtb3ZlQ29tcG9uZW50QXNSZWZGcm9tOmZ1bmN0aW9uKGUsdCxuKXtvKG4pfHxyKCIxMjAiKTt2YXIgYT1uLmdldFB1YmxpY0luc3RhbmNlKCk7YSYmYS5yZWZzW3RdPT09ZS5nZXRQdWJsaWNJbnN0YW5jZSgpJiZuLmRldGFjaFJlZih0KX19O2UuZXhwb3J0cz1hfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1bIlJlc3BvbmRlckV2ZW50UGx1Z2luIiwiU2ltcGxlRXZlbnRQbHVnaW4iLCJUYXBFdmVudFBsdWdpbiIsIkVudGVyTGVhdmVFdmVudFBsdWdpbiIsIkNoYW5nZUV2ZW50UGx1Z2luIiwiU2VsZWN0RXZlbnRQbHVnaW4iLCJCZWZvcmVJbnB1dEV2ZW50UGx1Z2luIl19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNjYpLG89big0NSksYT1uKDIwNCksaT17bW91c2VFbnRlcjp7cmVnaXN0cmF0aW9uTmFtZToib25Nb3VzZUVudGVyIixkZXBlbmRlbmNpZXM6WyJ0b3BNb3VzZU91dCIsInRvcE1vdXNlT3ZlciJdfSxtb3VzZUxlYXZlOntyZWdpc3RyYXRpb25OYW1lOiJvbk1vdXNlTGVhdmUiLGRlcGVuZGVuY2llczpbInRvcE1vdXNlT3V0IiwidG9wTW91c2VPdmVyIl19fSxzPXtldmVudFR5cGVzOmksZXh0cmFjdEV2ZW50czpmdW5jdGlvbihlLHQsbixzKXtpZigidG9wTW91c2VPdmVyIj09PWUmJihuLnJlbGF0ZWRUYXJnZXR8fG4uZnJvbUVsZW1lbnQpKXJldHVybiBudWxsO2lmKCJ0b3BNb3VzZU91dCIhPT1lJiYidG9wTW91c2VPdmVyIiE9PWUpcmV0dXJuIG51bGw7dmFyIHUsYyxsO2lmKHMud2luZG93PT09cyl1PXM7ZWxzZXt2YXIgcD1zLm93bmVyRG9jdW1lbnQ7dT1wP3AuZGVmYXVsdFZpZXd8fHAucGFyZW50V2luZG93OndpbmRvd31pZigidG9wTW91c2VPdXQiPT09ZSl7Yz10O3ZhciBmPW4ucmVsYXRlZFRhcmdldHx8bi50b0VsZW1lbnQ7bD1mP28uZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUoZik6bnVsbH1lbHNlIGM9bnVsbCxsPXQ7aWYoYz09PWwpcmV0dXJuIG51bGw7dmFyIGg9bnVsbD09Yz91Om8uZ2V0Tm9kZUZyb21JbnN0YW5jZShjKSxkPW51bGw9PWw/dTpvLmdldE5vZGVGcm9tSW5zdGFuY2UobCksbT1hLmdldFBvb2xlZChpLm1vdXNlTGVhdmUsYyxuLHMpO20udHlwZT0ibW91c2VsZWF2ZSIsbS50YXJnZXQ9aCxtLnJlbGF0ZWRUYXJnZXQ9ZDt2YXIgdj1hLmdldFBvb2xlZChpLm1vdXNlRW50ZXIsbCxuLHMpO3JldHVybiB2LnR5cGU9Im1vdXNlZW50ZXIiLHYudGFyZ2V0PWQsdi5yZWxhdGVkVGFyZ2V0PWgsci5hY2N1bXVsYXRlRW50ZXJMZWF2ZURpc3BhdGNoZXMobSx2LGMsbCksW20sdl19fTtlLmV4cG9ydHM9c30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE0Miksbz1yLmluamVjdGlvbi5NVVNUX1VTRV9QUk9QRVJUWSxhPXIuaW5qZWN0aW9uLkhBU19CT09MRUFOX1ZBTFVFLGk9ci5pbmplY3Rpb24uSEFTX05VTUVSSUNfVkFMVUUscz1yLmluamVjdGlvbi5IQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRSx1PXIuaW5qZWN0aW9uLkhBU19PVkVSTE9BREVEX0JPT0xFQU5fVkFMVUUsYz17aXNDdXN0b21BdHRyaWJ1dGU6UmVnRXhwLnByb3RvdHlwZS50ZXN0LmJpbmQobmV3IFJlZ0V4cCgiXihkYXRhfGFyaWEpLVsiK3IuQVRUUklCVVRFX05BTUVfQ0hBUisiXSokIikpLFByb3BlcnRpZXM6e2FjY2VwdDowLGFjY2VwdENoYXJzZXQ6MCxhY2Nlc3NLZXk6MCxhY3Rpb246MCxhbGxvd0Z1bGxTY3JlZW46YSxhbGxvd1RyYW5zcGFyZW5jeTowLGFsdDowLGFzOjAsYXN5bmM6YSxhdXRvQ29tcGxldGU6MCxhdXRvUGxheTphLGNhcHR1cmU6YSxjZWxsUGFkZGluZzowLGNlbGxTcGFjaW5nOjAsY2hhclNldDowLGNoYWxsZW5nZTowLGNoZWNrZWQ6b3xhLGNpdGU6MCxjbGFzc0lEOjAsY2xhc3NOYW1lOjAsY29sczpzLGNvbFNwYW46MCxjb250ZW50OjAsY29udGVudEVkaXRhYmxlOjAsY29udGV4dE1lbnU6MCxjb250cm9sczphLGNvbnRyb2xzTGlzdDowLGNvb3JkczowLGNyb3NzT3JpZ2luOjAsZGF0YTowLGRhdGVUaW1lOjAsZGVmYXVsdDphLGRlZmVyOmEsZGlyOjAsZGlzYWJsZWQ6YSxkb3dubG9hZDp1LGRyYWdnYWJsZTowLGVuY1R5cGU6MCxmb3JtOjAsZm9ybUFjdGlvbjowLGZvcm1FbmNUeXBlOjAsZm9ybU1ldGhvZDowLGZvcm1Ob1ZhbGlkYXRlOmEsZm9ybVRhcmdldDowLGZyYW1lQm9yZGVyOjAsaGVhZGVyczowLGhlaWdodDowLGhpZGRlbjphLGhpZ2g6MCxocmVmOjAsaHJlZkxhbmc6MCxodG1sRm9yOjAsaHR0cEVxdWl2OjAsaWNvbjowLGlkOjAsaW5wdXRNb2RlOjAsaW50ZWdyaXR5OjAsaXM6MCxrZXlQYXJhbXM6MCxrZXlUeXBlOjAsa2luZDowLGxhYmVsOjAsbGFuZzowLGxpc3Q6MCxsb29wOmEsbG93OjAsbWFuaWZlc3Q6MCxtYXJnaW5IZWlnaHQ6MCxtYXJnaW5XaWR0aDowLG1heDowLG1heExlbmd0aDowLG1lZGlhOjAsbWVkaWFHcm91cDowLG1ldGhvZDowLG1pbjowLG1pbkxlbmd0aDowLG11bHRpcGxlOm98YSxtdXRlZDpvfGEsbmFtZTowLG5vbmNlOjAsbm9WYWxpZGF0ZTphLG9wZW46YSxvcHRpbXVtOjAscGF0dGVybjowLHBsYWNlaG9sZGVyOjAscGxheXNJbmxpbmU6YSxwb3N0ZXI6MCxwcmVsb2FkOjAscHJvZmlsZTowLHJhZGlvR3JvdXA6MCxyZWFkT25seTphLHJlZmVycmVyUG9saWN5OjAscmVsOjAscmVxdWlyZWQ6YSxyZXZlcnNlZDphLHJvbGU6MCxyb3dzOnMscm93U3BhbjppLHNhbmRib3g6MCxzY29wZTowLHNjb3BlZDphLHNjcm9sbGluZzowLHNlYW1sZXNzOmEsc2VsZWN0ZWQ6b3xhLHNoYXBlOjAsc2l6ZTpzLHNpemVzOjAsc3BhbjpzLHNwZWxsQ2hlY2s6MCxzcmM6MCxzcmNEb2M6MCxzcmNMYW5nOjAsc3JjU2V0OjAsc3RhcnQ6aSxzdGVwOjAsc3R5bGU6MCxzdW1tYXJ5OjAsdGFiSW5kZXg6MCx0YXJnZXQ6MCx0aXRsZTowLHR5cGU6MCx1c2VNYXA6MCx2YWx1ZTowLHdpZHRoOjAsd21vZGU6MCx3cmFwOjAsYWJvdXQ6MCxkYXRhdHlwZTowLGlubGlzdDowLHByZWZpeDowLHByb3BlcnR5OjAscmVzb3VyY2U6MCx0eXBlb2Y6MCx2b2NhYjowLGF1dG9DYXBpdGFsaXplOjAsYXV0b0NvcnJlY3Q6MCxhdXRvU2F2ZTowLGNvbG9yOjAsaXRlbVByb3A6MCxpdGVtU2NvcGU6YSxpdGVtVHlwZTowLGl0ZW1JRDowLGl0ZW1SZWY6MCxyZXN1bHRzOjAsc2VjdXJpdHk6MCx1bnNlbGVjdGFibGU6MH0sRE9NQXR0cmlidXRlTmFtZXM6e2FjY2VwdENoYXJzZXQ6ImFjY2VwdC1jaGFyc2V0IixjbGFzc05hbWU6ImNsYXNzIixodG1sRm9yOiJmb3IiLGh0dHBFcXVpdjoiaHR0cC1lcXVpdiJ9LERPTVByb3BlcnR5TmFtZXM6e30sRE9NTXV0YXRpb25NZXRob2RzOnt2YWx1ZTpmdW5jdGlvbihlLHQpe2lmKG51bGw9PXQpcmV0dXJuIGUucmVtb3ZlQXR0cmlidXRlKCJ2YWx1ZSIpOygibnVtYmVyIiE9PWUudHlwZXx8ITE9PT1lLmhhc0F0dHJpYnV0ZSgidmFsdWUiKXx8ZS52YWxpZGl0eSYmIWUudmFsaWRpdHkuYmFkSW5wdXQmJmUub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50IT09ZSkmJmUuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIrdCl9fX07ZS5leHBvcnRzPWN9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyNjYpLG89e3Byb2Nlc3NDaGlsZHJlblVwZGF0ZXM6big5MzEpLmRhbmdlcm91c2x5UHJvY2Vzc0NoaWxkcmVuVXBkYXRlcyxyZXBsYWNlTm9kZVdpdGhNYXJrdXA6ci5kYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cH07ZS5leHBvcnRzPW99LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigzMCksbz1uKDE0NCksYT1uKDU3KSxpPW4oOTI4KSxzPW4oNzgpLHU9KG4oMjUpLHtkYW5nZXJvdXNseVJlcGxhY2VOb2RlV2l0aE1hcmt1cDpmdW5jdGlvbihlLHQpe2lmKGEuY2FuVXNlRE9NfHxyKCI1NiIpLHR8fHIoIjU3IiksIkhUTUwiPT09ZS5ub2RlTmFtZSYmcigiNTgiKSwic3RyaW5nIj09dHlwZW9mIHQpe3ZhciBuPWkodCxzKVswXTtlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG4sZSl9ZWxzZSBvLnJlcGxhY2VDaGlsZFdpdGhUcmVlKGUsdCl9fSk7ZS5leHBvcnRzPXV9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9big1Nyksbz1uKDkyOSksYT1uKDkzMCksaT1uKDI1KSxzPXIuY2FuVXNlRE9NP2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOm51bGwsdT0vXlxzKjwoXHcrKS87ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIG49cztzfHxpKCExKTt2YXIgcj1mdW5jdGlvbihlKXt2YXIgdD1lLm1hdGNoKHUpO3JldHVybiB0JiZ0WzFdLnRvTG93ZXJDYXNlKCl9KGUpLGM9ciYmYShyKTtpZihjKXtuLmlubmVySFRNTD1jWzFdK2UrY1syXTtmb3IodmFyIGw9Y1swXTtsLS07KW49bi5sYXN0Q2hpbGR9ZWxzZSBuLmlubmVySFRNTD1lO3ZhciBwPW4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpO3AubGVuZ3RoJiYodHx8aSghMSksbyhwKS5mb3JFYWNoKHQpKTtmb3IodmFyIGY9QXJyYXkuZnJvbShuLmNoaWxkTm9kZXMpO24ubGFzdENoaWxkOyluLnJlbW92ZUNoaWxkKG4ubGFzdENoaWxkKTtyZXR1cm4gZn19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyNSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4hIWUmJigib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlKSYmImxlbmd0aCJpbiBlJiYhKCJzZXRJbnRlcnZhbCJpbiBlKSYmIm51bWJlciIhPXR5cGVvZiBlLm5vZGVUeXBlJiYoQXJyYXkuaXNBcnJheShlKXx8ImNhbGxlZSJpbiBlfHwiaXRlbSJpbiBlKX0oZSk/QXJyYXkuaXNBcnJheShlKT9lLnNsaWNlKCk6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGg7aWYoKEFycmF5LmlzQXJyYXkoZSl8fCJvYmplY3QiIT10eXBlb2YgZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpJiZyKCExKSwibnVtYmVyIiE9dHlwZW9mIHQmJnIoITEpLDA9PT10fHx0LTEgaW4gZXx8cighMSksImZ1bmN0aW9uIj09dHlwZW9mIGUuY2FsbGVlJiZyKCExKSxlLmhhc093blByb3BlcnR5KXRyeXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZSl9Y2F0Y2goZSl7fWZvcih2YXIgbj1BcnJheSh0KSxvPTA7bzx0O28rKyluW29dPWVbb107cmV0dXJuIG59KGUpOltlXX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9big1Nyksbz1uKDI1KSxhPXIuY2FuVXNlRE9NP2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOm51bGwsaT17fSxzPVsxLCc8c2VsZWN0IG11bHRpcGxlPSJ0cnVlIj4nLCI8L3NlbGVjdD4iXSx1PVsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSxjPVszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxsPVsxLCc8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+JywiPC9zdmc+Il0scD17IioiOlsxLCI/PGRpdj4iLCI8L2Rpdj4iXSxhcmVhOlsxLCI8bWFwPiIsIjwvbWFwPiJdLGNvbDpbMiwiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4iLCI8L2NvbGdyb3VwPjwvdGFibGU+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXSxwYXJhbTpbMSwiPG9iamVjdD4iLCI8L29iamVjdD4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sb3B0Z3JvdXA6cyxvcHRpb246cyxjYXB0aW9uOnUsY29sZ3JvdXA6dSx0Ym9keTp1LHRmb290OnUsdGhlYWQ6dSx0ZDpjLHRoOmN9O1siY2lyY2xlIiwiY2xpcFBhdGgiLCJkZWZzIiwiZWxsaXBzZSIsImciLCJpbWFnZSIsImxpbmUiLCJsaW5lYXJHcmFkaWVudCIsIm1hc2siLCJwYXRoIiwicGF0dGVybiIsInBvbHlnb24iLCJwb2x5bGluZSIsInJhZGlhbEdyYWRpZW50IiwicmVjdCIsInN0b3AiLCJ0ZXh0IiwidHNwYW4iXS5mb3JFYWNoKChmdW5jdGlvbihlKXtwW2VdPWwsaVtlXT0hMH0pKSxlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGF8fG8oITEpLHAuaGFzT3duUHJvcGVydHkoZSl8fChlPSIqIiksaS5oYXNPd25Qcm9wZXJ0eShlKXx8KGEuaW5uZXJIVE1MPSIqIj09PWU/IjxsaW5rIC8+IjoiPCIrZSsiPjwvIitlKyI+IixpW2VdPSFhLmZpcnN0Q2hpbGQpLGlbZV0/cFtlXTpudWxsfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDI2Niksbz1uKDQ1KSxhPXtkYW5nZXJvdXNseVByb2Nlc3NDaGlsZHJlblVwZGF0ZXM6ZnVuY3Rpb24oZSx0KXt2YXIgbj1vLmdldE5vZGVGcm9tSW5zdGFuY2UoZSk7ci5wcm9jZXNzVXBkYXRlcyhuLHQpfX07ZS5leHBvcnRzPWF9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigzMCksbz1uKDM4KSxhPW4oOTMzKSxpPW4oOTM0KSxzPW4oMTQ0KSx1PW4oMjY3KSxjPW4oMTQyKSxsPW4oNDc0KSxwPW4oMTY3KSxmPW4oMjYwKSxoPW4oMjA3KSxkPW4oNDYyKSxtPW4oNDUpLHY9big5NDQpLGc9big5NDYpLHk9big0NzUpLGI9big5NDcpLF89KG4oNzIpLG4oOTQ4KSksdz1uKDk1NSkseD0obig3OCksbigyMDYpKSxFPShuKDI1KSxuKDI2NCksbigyNzEpLG4oNDY4KSksUz0obigyNzUpLG4oMzQpLGQpLEM9cC5kZWxldGVMaXN0ZW5lcixBPW0uZ2V0Tm9kZUZyb21JbnN0YW5jZSxPPWgubGlzdGVuVG8saz1mLnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzLGo9e3N0cmluZzohMCxudW1iZXI6ITB9LFQ9InN0eWxlIixJPXtjaGlsZHJlbjpudWxsLGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOm51bGwsc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nOm51bGx9O2Z1bmN0aW9uIFAoZSx0KXt0JiYoV1tlLl90YWddJiYobnVsbCE9dC5jaGlsZHJlbnx8bnVsbCE9dC5kYW5nZXJvdXNseVNldElubmVySFRNTCkmJnIoIjEzNyIsZS5fdGFnLGUuX2N1cnJlbnRFbGVtZW50Ll9vd25lcj8iIENoZWNrIHRoZSByZW5kZXIgbWV0aG9kIG9mICIrZS5fY3VycmVudEVsZW1lbnQuX293bmVyLmdldE5hbWUoKSsiLiI6IiIpLG51bGwhPXQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwmJihudWxsIT10LmNoaWxkcmVuJiZyKCI2MCIpLCJvYmplY3QiPT10eXBlb2YgdC5kYW5nZXJvdXNseVNldElubmVySFRNTCYmIl9faHRtbCJpbiB0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MfHxyKCI2MSIpKSxudWxsIT10LnN0eWxlJiYib2JqZWN0IiE9dHlwZW9mIHQuc3R5bGUmJnIoIjYyIixmdW5jdGlvbihlKXtpZihlKXt2YXIgdD1lLl9jdXJyZW50RWxlbWVudC5fb3duZXJ8fG51bGw7aWYodCl7dmFyIG49dC5nZXROYW1lKCk7aWYobilyZXR1cm4iIFRoaXMgRE9NIG5vZGUgd2FzIHJlbmRlcmVkIGJ5IGAiK24rImAuIn19cmV0dXJuIiJ9KGUpKSl9ZnVuY3Rpb24gTihlLHQsbixyKXtpZighKHIgaW5zdGFuY2VvZiB3KSl7MDt2YXIgbz1lLl9ob3N0Q29udGFpbmVySW5mbyxhPW8uX25vZGUmJjExPT09by5fbm9kZS5ub2RlVHlwZT9vLl9ub2RlOm8uX293bmVyRG9jdW1lbnQ7Tyh0LGEpLHIuZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShNLHtpbnN0OmUscmVnaXN0cmF0aW9uTmFtZTp0LGxpc3RlbmVyOm59KX19ZnVuY3Rpb24gTSgpe3ZhciBlPXRoaXM7cC5wdXRMaXN0ZW5lcihlLmluc3QsZS5yZWdpc3RyYXRpb25OYW1lLGUubGlzdGVuZXIpfWZ1bmN0aW9uIFIoKXt2LnBvc3RNb3VudFdyYXBwZXIodGhpcyl9ZnVuY3Rpb24gRCgpe2IucG9zdE1vdW50V3JhcHBlcih0aGlzKX1mdW5jdGlvbiBMKCl7Zy5wb3N0TW91bnRXcmFwcGVyKHRoaXMpfXZhciBCPXt0b3BBYm9ydDoiYWJvcnQiLHRvcENhblBsYXk6ImNhbnBsYXkiLHRvcENhblBsYXlUaHJvdWdoOiJjYW5wbGF5dGhyb3VnaCIsdG9wRHVyYXRpb25DaGFuZ2U6ImR1cmF0aW9uY2hhbmdlIix0b3BFbXB0aWVkOiJlbXB0aWVkIix0b3BFbmNyeXB0ZWQ6ImVuY3J5cHRlZCIsdG9wRW5kZWQ6ImVuZGVkIix0b3BFcnJvcjoiZXJyb3IiLHRvcExvYWRlZERhdGE6ImxvYWRlZGRhdGEiLHRvcExvYWRlZE1ldGFkYXRhOiJsb2FkZWRtZXRhZGF0YSIsdG9wTG9hZFN0YXJ0OiJsb2Fkc3RhcnQiLHRvcFBhdXNlOiJwYXVzZSIsdG9wUGxheToicGxheSIsdG9wUGxheWluZzoicGxheWluZyIsdG9wUHJvZ3Jlc3M6InByb2dyZXNzIix0b3BSYXRlQ2hhbmdlOiJyYXRlY2hhbmdlIix0b3BTZWVrZWQ6InNlZWtlZCIsdG9wU2Vla2luZzoic2Vla2luZyIsdG9wU3RhbGxlZDoic3RhbGxlZCIsdG9wU3VzcGVuZDoic3VzcGVuZCIsdG9wVGltZVVwZGF0ZToidGltZXVwZGF0ZSIsdG9wVm9sdW1lQ2hhbmdlOiJ2b2x1bWVjaGFuZ2UiLHRvcFdhaXRpbmc6IndhaXRpbmcifTtmdW5jdGlvbiBGKCl7RS50cmFjayh0aGlzKX1mdW5jdGlvbiBVKCl7dmFyIGU9dGhpcztlLl9yb290Tm9kZUlEfHxyKCI2MyIpO3ZhciB0PUEoZSk7c3dpdGNoKHR8fHIoIjY0IiksZS5fdGFnKXtjYXNlImlmcmFtZSI6Y2FzZSJvYmplY3QiOmUuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnM9W2gudHJhcEJ1YmJsZWRFdmVudCgidG9wTG9hZCIsImxvYWQiLHQpXTticmVhaztjYXNlInZpZGVvIjpjYXNlImF1ZGlvIjpmb3IodmFyIG4gaW4gZS5fd3JhcHBlclN0YXRlLmxpc3RlbmVycz1bXSxCKUIuaGFzT3duUHJvcGVydHkobikmJmUuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnMucHVzaChoLnRyYXBCdWJibGVkRXZlbnQobixCW25dLHQpKTticmVhaztjYXNlInNvdXJjZSI6ZS5fd3JhcHBlclN0YXRlLmxpc3RlbmVycz1baC50cmFwQnViYmxlZEV2ZW50KCJ0b3BFcnJvciIsImVycm9yIix0KV07YnJlYWs7Y2FzZSJpbWciOmUuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnM9W2gudHJhcEJ1YmJsZWRFdmVudCgidG9wRXJyb3IiLCJlcnJvciIsdCksaC50cmFwQnViYmxlZEV2ZW50KCJ0b3BMb2FkIiwibG9hZCIsdCldO2JyZWFrO2Nhc2UiZm9ybSI6ZS5fd3JhcHBlclN0YXRlLmxpc3RlbmVycz1baC50cmFwQnViYmxlZEV2ZW50KCJ0b3BSZXNldCIsInJlc2V0Iix0KSxoLnRyYXBCdWJibGVkRXZlbnQoInRvcFN1Ym1pdCIsInN1Ym1pdCIsdCldO2JyZWFrO2Nhc2UiaW5wdXQiOmNhc2Uic2VsZWN0IjpjYXNlInRleHRhcmVhIjplLl93cmFwcGVyU3RhdGUubGlzdGVuZXJzPVtoLnRyYXBCdWJibGVkRXZlbnQoInRvcEludmFsaWQiLCJpbnZhbGlkIix0KV19fWZ1bmN0aW9uIHEoKXt5LnBvc3RVcGRhdGVXcmFwcGVyKHRoaXMpfXZhciB6PXthcmVhOiEwLGJhc2U6ITAsYnI6ITAsY29sOiEwLGVtYmVkOiEwLGhyOiEwLGltZzohMCxpbnB1dDohMCxrZXlnZW46ITAsbGluazohMCxtZXRhOiEwLHBhcmFtOiEwLHNvdXJjZTohMCx0cmFjazohMCx3YnI6ITB9LFY9e2xpc3Rpbmc6ITAscHJlOiEwLHRleHRhcmVhOiEwfSxXPW8oe21lbnVpdGVtOiEwfSx6KSxIPS9eW2EtekEtWl1bYS16QS1aOl9cLlwtXGRdKiQvLCQ9e30sSj17fS5oYXNPd25Qcm9wZXJ0eTtmdW5jdGlvbiBLKGUsdCl7cmV0dXJuIGUuaW5kZXhPZigiLSIpPj0wfHxudWxsIT10LmlzfXZhciBZPTE7ZnVuY3Rpb24gRyhlKXt2YXIgdD1lLnR5cGU7IWZ1bmN0aW9uKGUpe0ouY2FsbCgkLGUpfHwoSC50ZXN0KGUpfHxyKCI2NSIsZSksJFtlXT0hMCl9KHQpLHRoaXMuX2N1cnJlbnRFbGVtZW50PWUsdGhpcy5fdGFnPXQudG9Mb3dlckNhc2UoKSx0aGlzLl9uYW1lc3BhY2VVUkk9bnVsbCx0aGlzLl9yZW5kZXJlZENoaWxkcmVuPW51bGwsdGhpcy5fcHJldmlvdXNTdHlsZT1udWxsLHRoaXMuX3ByZXZpb3VzU3R5bGVDb3B5PW51bGwsdGhpcy5faG9zdE5vZGU9bnVsbCx0aGlzLl9ob3N0UGFyZW50PW51bGwsdGhpcy5fcm9vdE5vZGVJRD0wLHRoaXMuX2RvbUlEPTAsdGhpcy5faG9zdENvbnRhaW5lckluZm89bnVsbCx0aGlzLl93cmFwcGVyU3RhdGU9bnVsbCx0aGlzLl90b3BMZXZlbFdyYXBwZXI9bnVsbCx0aGlzLl9mbGFncz0wfUcuZGlzcGxheU5hbWU9IlJlYWN0RE9NQ29tcG9uZW50IixHLk1peGluPXttb3VudENvbXBvbmVudDpmdW5jdGlvbihlLHQsbixyKXt0aGlzLl9yb290Tm9kZUlEPVkrKyx0aGlzLl9kb21JRD1uLl9pZENvdW50ZXIrKyx0aGlzLl9ob3N0UGFyZW50PXQsdGhpcy5faG9zdENvbnRhaW5lckluZm89bjt2YXIgbyxpLGMscD10aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcztzd2l0Y2godGhpcy5fdGFnKXtjYXNlImF1ZGlvIjpjYXNlImZvcm0iOmNhc2UiaWZyYW1lIjpjYXNlImltZyI6Y2FzZSJsaW5rIjpjYXNlIm9iamVjdCI6Y2FzZSJzb3VyY2UiOmNhc2UidmlkZW8iOnRoaXMuX3dyYXBwZXJTdGF0ZT17bGlzdGVuZXJzOm51bGx9LGUuZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShVLHRoaXMpO2JyZWFrO2Nhc2UiaW5wdXQiOnYubW91bnRXcmFwcGVyKHRoaXMscCx0KSxwPXYuZ2V0SG9zdFByb3BzKHRoaXMscCksZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKEYsdGhpcyksZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKFUsdGhpcyk7YnJlYWs7Y2FzZSJvcHRpb24iOmcubW91bnRXcmFwcGVyKHRoaXMscCx0KSxwPWcuZ2V0SG9zdFByb3BzKHRoaXMscCk7YnJlYWs7Y2FzZSJzZWxlY3QiOnkubW91bnRXcmFwcGVyKHRoaXMscCx0KSxwPXkuZ2V0SG9zdFByb3BzKHRoaXMscCksZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKFUsdGhpcyk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6Yi5tb3VudFdyYXBwZXIodGhpcyxwLHQpLHA9Yi5nZXRIb3N0UHJvcHModGhpcyxwKSxlLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoRix0aGlzKSxlLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoVSx0aGlzKX1pZihQKHRoaXMscCksbnVsbCE9dD8obz10Ll9uYW1lc3BhY2VVUkksaT10Ll90YWcpOm4uX3RhZyYmKG89bi5fbmFtZXNwYWNlVVJJLGk9bi5fdGFnKSwobnVsbD09b3x8bz09PXUuc3ZnJiYiZm9yZWlnbm9iamVjdCI9PT1pKSYmKG89dS5odG1sKSxvPT09dS5odG1sJiYoInN2ZyI9PT10aGlzLl90YWc/bz11LnN2ZzoibWF0aCI9PT10aGlzLl90YWcmJihvPXUubWF0aG1sKSksdGhpcy5fbmFtZXNwYWNlVVJJPW8sZS51c2VDcmVhdGVFbGVtZW50KXt2YXIgZixoPW4uX293bmVyRG9jdW1lbnQ7aWYobz09PXUuaHRtbClpZigic2NyaXB0Ij09PXRoaXMuX3RhZyl7dmFyIGQ9aC5jcmVhdGVFbGVtZW50KCJkaXYiKSxfPXRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7ZC5pbm5lckhUTUw9IjwiK18rIj48LyIrXysiPiIsZj1kLnJlbW92ZUNoaWxkKGQuZmlyc3RDaGlsZCl9ZWxzZSBmPXAuaXM/aC5jcmVhdGVFbGVtZW50KHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGUscC5pcyk6aC5jcmVhdGVFbGVtZW50KHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGUpO2Vsc2UgZj1oLmNyZWF0ZUVsZW1lbnROUyhvLHRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGUpO20ucHJlY2FjaGVOb2RlKHRoaXMsZiksdGhpcy5fZmxhZ3N8PVMuaGFzQ2FjaGVkQ2hpbGROb2Rlcyx0aGlzLl9ob3N0UGFyZW50fHxsLnNldEF0dHJpYnV0ZUZvclJvb3QoZiksdGhpcy5fdXBkYXRlRE9NUHJvcGVydGllcyhudWxsLHAsZSk7dmFyIHc9cyhmKTt0aGlzLl9jcmVhdGVJbml0aWFsQ2hpbGRyZW4oZSxwLHIsdyksYz13fWVsc2V7dmFyIHg9dGhpcy5fY3JlYXRlT3BlblRhZ01hcmt1cEFuZFB1dExpc3RlbmVycyhlLHApLEU9dGhpcy5fY3JlYXRlQ29udGVudE1hcmt1cChlLHAscik7Yz0hRSYmelt0aGlzLl90YWddP3grIi8+Ijp4KyI+IitFKyI8LyIrdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSsiPiJ9c3dpdGNoKHRoaXMuX3RhZyl7Y2FzZSJpbnB1dCI6ZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKFIsdGhpcykscC5hdXRvRm9jdXMmJmUuZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShhLmZvY3VzRE9NQ29tcG9uZW50LHRoaXMpO2JyZWFrO2Nhc2UidGV4dGFyZWEiOmUuZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShELHRoaXMpLHAuYXV0b0ZvY3VzJiZlLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoYS5mb2N1c0RPTUNvbXBvbmVudCx0aGlzKTticmVhaztjYXNlInNlbGVjdCI6Y2FzZSJidXR0b24iOnAuYXV0b0ZvY3VzJiZlLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoYS5mb2N1c0RPTUNvbXBvbmVudCx0aGlzKTticmVhaztjYXNlIm9wdGlvbiI6ZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKEwsdGhpcyl9cmV0dXJuIGN9LF9jcmVhdGVPcGVuVGFnTWFya3VwQW5kUHV0TGlzdGVuZXJzOmZ1bmN0aW9uKGUsdCl7dmFyIG49IjwiK3RoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7Zm9yKHZhciByIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShyKSl7dmFyIGE9dFtyXTtpZihudWxsIT1hKWlmKGsuaGFzT3duUHJvcGVydHkocikpYSYmTih0aGlzLHIsYSxlKTtlbHNle3I9PT1UJiYoYSYmKGE9dGhpcy5fcHJldmlvdXNTdHlsZUNvcHk9byh7fSx0LnN0eWxlKSksYT1pLmNyZWF0ZU1hcmt1cEZvclN0eWxlcyhhLHRoaXMpKTt2YXIgcz1udWxsO251bGwhPXRoaXMuX3RhZyYmSyh0aGlzLl90YWcsdCk/SS5oYXNPd25Qcm9wZXJ0eShyKXx8KHM9bC5jcmVhdGVNYXJrdXBGb3JDdXN0b21BdHRyaWJ1dGUocixhKSk6cz1sLmNyZWF0ZU1hcmt1cEZvclByb3BlcnR5KHIsYSkscyYmKG4rPSIgIitzKX19cmV0dXJuIGUucmVuZGVyVG9TdGF0aWNNYXJrdXA/bjoodGhpcy5faG9zdFBhcmVudHx8KG4rPSIgIitsLmNyZWF0ZU1hcmt1cEZvclJvb3QoKSksbis9IiAiK2wuY3JlYXRlTWFya3VwRm9ySUQodGhpcy5fZG9tSUQpKX0sX2NyZWF0ZUNvbnRlbnRNYXJrdXA6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPSIiLG89dC5kYW5nZXJvdXNseVNldElubmVySFRNTDtpZihudWxsIT1vKW51bGwhPW8uX19odG1sJiYocj1vLl9faHRtbCk7ZWxzZXt2YXIgYT1qW3R5cGVvZiB0LmNoaWxkcmVuXT90LmNoaWxkcmVuOm51bGwsaT1udWxsIT1hP251bGw6dC5jaGlsZHJlbjtpZihudWxsIT1hKXI9eChhKTtlbHNlIGlmKG51bGwhPWkpe3I9dGhpcy5tb3VudENoaWxkcmVuKGksZSxuKS5qb2luKCIiKX19cmV0dXJuIFZbdGhpcy5fdGFnXSYmIlxuIj09PXIuY2hhckF0KDApPyJcbiIrcjpyfSxfY3JlYXRlSW5pdGlhbENoaWxkcmVuOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPXQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw7aWYobnVsbCE9byludWxsIT1vLl9faHRtbCYmcy5xdWV1ZUhUTUwocixvLl9faHRtbCk7ZWxzZXt2YXIgYT1qW3R5cGVvZiB0LmNoaWxkcmVuXT90LmNoaWxkcmVuOm51bGwsaT1udWxsIT1hP251bGw6dC5jaGlsZHJlbjtpZihudWxsIT1hKSIiIT09YSYmcy5xdWV1ZVRleHQocixhKTtlbHNlIGlmKG51bGwhPWkpZm9yKHZhciB1PXRoaXMubW91bnRDaGlsZHJlbihpLGUsbiksYz0wO2M8dS5sZW5ndGg7YysrKXMucXVldWVDaGlsZChyLHVbY10pfX0scmVjZWl2ZUNvbXBvbmVudDpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5fY3VycmVudEVsZW1lbnQ7dGhpcy5fY3VycmVudEVsZW1lbnQ9ZSx0aGlzLnVwZGF0ZUNvbXBvbmVudCh0LHIsZSxuKX0sdXBkYXRlQ29tcG9uZW50OmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPXQucHJvcHMsYT10aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcztzd2l0Y2godGhpcy5fdGFnKXtjYXNlImlucHV0IjpvPXYuZ2V0SG9zdFByb3BzKHRoaXMsbyksYT12LmdldEhvc3RQcm9wcyh0aGlzLGEpO2JyZWFrO2Nhc2Uib3B0aW9uIjpvPWcuZ2V0SG9zdFByb3BzKHRoaXMsbyksYT1nLmdldEhvc3RQcm9wcyh0aGlzLGEpO2JyZWFrO2Nhc2Uic2VsZWN0IjpvPXkuZ2V0SG9zdFByb3BzKHRoaXMsbyksYT15LmdldEhvc3RQcm9wcyh0aGlzLGEpO2JyZWFrO2Nhc2UidGV4dGFyZWEiOm89Yi5nZXRIb3N0UHJvcHModGhpcyxvKSxhPWIuZ2V0SG9zdFByb3BzKHRoaXMsYSl9c3dpdGNoKFAodGhpcyxhKSx0aGlzLl91cGRhdGVET01Qcm9wZXJ0aWVzKG8sYSxlKSx0aGlzLl91cGRhdGVET01DaGlsZHJlbihvLGEsZSxyKSx0aGlzLl90YWcpe2Nhc2UiaW5wdXQiOnYudXBkYXRlV3JhcHBlcih0aGlzKSxFLnVwZGF0ZVZhbHVlSWZDaGFuZ2VkKHRoaXMpO2JyZWFrO2Nhc2UidGV4dGFyZWEiOmIudXBkYXRlV3JhcHBlcih0aGlzKTticmVhaztjYXNlInNlbGVjdCI6ZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHEsdGhpcyl9fSxfdXBkYXRlRE9NUHJvcGVydGllczpmdW5jdGlvbihlLHQsbil7dmFyIHIsYSxzO2ZvcihyIGluIGUpaWYoIXQuaGFzT3duUHJvcGVydHkocikmJmUuaGFzT3duUHJvcGVydHkocikmJm51bGwhPWVbcl0paWYocj09PVQpe3ZhciB1PXRoaXMuX3ByZXZpb3VzU3R5bGVDb3B5O2ZvcihhIGluIHUpdS5oYXNPd25Qcm9wZXJ0eShhKSYmKChzPXN8fHt9KVthXT0iIik7dGhpcy5fcHJldmlvdXNTdHlsZUNvcHk9bnVsbH1lbHNlIGsuaGFzT3duUHJvcGVydHkocik/ZVtyXSYmQyh0aGlzLHIpOksodGhpcy5fdGFnLGUpP0kuaGFzT3duUHJvcGVydHkocil8fGwuZGVsZXRlVmFsdWVGb3JBdHRyaWJ1dGUoQSh0aGlzKSxyKTooYy5wcm9wZXJ0aWVzW3JdfHxjLmlzQ3VzdG9tQXR0cmlidXRlKHIpKSYmbC5kZWxldGVWYWx1ZUZvclByb3BlcnR5KEEodGhpcykscik7Zm9yKHIgaW4gdCl7dmFyIHA9dFtyXSxmPXI9PT1UP3RoaXMuX3ByZXZpb3VzU3R5bGVDb3B5Om51bGwhPWU/ZVtyXTp2b2lkIDA7aWYodC5oYXNPd25Qcm9wZXJ0eShyKSYmcCE9PWYmJihudWxsIT1wfHxudWxsIT1mKSlpZihyPT09VClpZihwP3A9dGhpcy5fcHJldmlvdXNTdHlsZUNvcHk9byh7fSxwKTp0aGlzLl9wcmV2aW91c1N0eWxlQ29weT1udWxsLGYpe2ZvcihhIGluIGYpIWYuaGFzT3duUHJvcGVydHkoYSl8fHAmJnAuaGFzT3duUHJvcGVydHkoYSl8fCgocz1zfHx7fSlbYV09IiIpO2ZvcihhIGluIHApcC5oYXNPd25Qcm9wZXJ0eShhKSYmZlthXSE9PXBbYV0mJigocz1zfHx7fSlbYV09cFthXSl9ZWxzZSBzPXA7ZWxzZSBpZihrLmhhc093blByb3BlcnR5KHIpKXA/Tih0aGlzLHIscCxuKTpmJiZDKHRoaXMscik7ZWxzZSBpZihLKHRoaXMuX3RhZyx0KSlJLmhhc093blByb3BlcnR5KHIpfHxsLnNldFZhbHVlRm9yQXR0cmlidXRlKEEodGhpcykscixwKTtlbHNlIGlmKGMucHJvcGVydGllc1tyXXx8Yy5pc0N1c3RvbUF0dHJpYnV0ZShyKSl7dmFyIGg9QSh0aGlzKTtudWxsIT1wP2wuc2V0VmFsdWVGb3JQcm9wZXJ0eShoLHIscCk6bC5kZWxldGVWYWx1ZUZvclByb3BlcnR5KGgscil9fXMmJmkuc2V0VmFsdWVGb3JTdHlsZXMoQSh0aGlzKSxzLHRoaXMpfSxfdXBkYXRlRE9NQ2hpbGRyZW46ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89alt0eXBlb2YgZS5jaGlsZHJlbl0/ZS5jaGlsZHJlbjpudWxsLGE9alt0eXBlb2YgdC5jaGlsZHJlbl0/dC5jaGlsZHJlbjpudWxsLGk9ZS5kYW5nZXJvdXNseVNldElubmVySFRNTCYmZS5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWwscz10LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MJiZ0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MLl9faHRtbCx1PW51bGwhPW8/bnVsbDplLmNoaWxkcmVuLGM9bnVsbCE9YT9udWxsOnQuY2hpbGRyZW4sbD1udWxsIT1vfHxudWxsIT1pLHA9bnVsbCE9YXx8bnVsbCE9cztudWxsIT11JiZudWxsPT1jP3RoaXMudXBkYXRlQ2hpbGRyZW4obnVsbCxuLHIpOmwmJiFwJiZ0aGlzLnVwZGF0ZVRleHRDb250ZW50KCIiKSxudWxsIT1hP28hPT1hJiZ0aGlzLnVwZGF0ZVRleHRDb250ZW50KCIiK2EpOm51bGwhPXM/aSE9PXMmJnRoaXMudXBkYXRlTWFya3VwKCIiK3MpOm51bGwhPWMmJnRoaXMudXBkYXRlQ2hpbGRyZW4oYyxuLHIpfSxnZXRIb3N0Tm9kZTpmdW5jdGlvbigpe3JldHVybiBBKHRoaXMpfSx1bm1vdW50Q29tcG9uZW50OmZ1bmN0aW9uKGUpe3N3aXRjaCh0aGlzLl90YWcpe2Nhc2UiYXVkaW8iOmNhc2UiZm9ybSI6Y2FzZSJpZnJhbWUiOmNhc2UiaW1nIjpjYXNlImxpbmsiOmNhc2Uib2JqZWN0IjpjYXNlInNvdXJjZSI6Y2FzZSJ2aWRlbyI6dmFyIHQ9dGhpcy5fd3JhcHBlclN0YXRlLmxpc3RlbmVycztpZih0KWZvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXRbbl0ucmVtb3ZlKCk7YnJlYWs7Y2FzZSJpbnB1dCI6Y2FzZSJ0ZXh0YXJlYSI6RS5zdG9wVHJhY2tpbmcodGhpcyk7YnJlYWs7Y2FzZSJodG1sIjpjYXNlImhlYWQiOmNhc2UiYm9keSI6cigiNjYiLHRoaXMuX3RhZyl9dGhpcy51bm1vdW50Q2hpbGRyZW4oZSksbS51bmNhY2hlTm9kZSh0aGlzKSxwLmRlbGV0ZUFsbExpc3RlbmVycyh0aGlzKSx0aGlzLl9yb290Tm9kZUlEPTAsdGhpcy5fZG9tSUQ9MCx0aGlzLl93cmFwcGVyU3RhdGU9bnVsbH0sZ2V0UHVibGljSW5zdGFuY2U6ZnVuY3Rpb24oKXtyZXR1cm4gQSh0aGlzKX19LG8oRy5wcm90b3R5cGUsRy5NaXhpbixfLk1peGluKSxlLmV4cG9ydHM9R30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDQ1KSxvPW4oNDcyKSxhPXtmb2N1c0RPTUNvbXBvbmVudDpmdW5jdGlvbigpe28oci5nZXROb2RlRnJvbUluc3RhbmNlKHRoaXMpKX19O2UuZXhwb3J0cz1hfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNDczKSxvPW4oNTcpLGE9KG4oNzIpLG4oOTM1KSxuKDkzNykpLGk9big5MzgpLHM9big5NDApLHU9KG4oMzQpLHMoKGZ1bmN0aW9uKGUpe3JldHVybiBpKGUpfSkpKSxjPSExLGw9ImNzc0Zsb2F0IjtpZihvLmNhblVzZURPTSl7dmFyIHA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGU7dHJ5e3AuZm9udD0iIn1jYXRjaChlKXtjPSEwfXZvaWQgMD09PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5jc3NGbG9hdCYmKGw9InN0eWxlRmxvYXQiKX12YXIgZj17Y3JlYXRlTWFya3VwRm9yU3R5bGVzOmZ1bmN0aW9uKGUsdCl7dmFyIG49IiI7Zm9yKHZhciByIGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eShyKSl7dmFyIG89MD09PXIuaW5kZXhPZigiLS0iKSxpPWVbcl07MCxudWxsIT1pJiYobis9dShyKSsiOiIsbis9YShyLGksdCxvKSsiOyIpfXJldHVybiBufHxudWxsfSxzZXRWYWx1ZUZvclN0eWxlczpmdW5jdGlvbihlLHQsbil7dmFyIG89ZS5zdHlsZTtmb3IodmFyIGkgaW4gdClpZih0Lmhhc093blByb3BlcnR5KGkpKXt2YXIgcz0wPT09aS5pbmRleE9mKCItLSIpOzA7dmFyIHU9YShpLHRbaV0sbixzKTtpZigiZmxvYXQiIT09aSYmImNzc0Zsb2F0IiE9PWl8fChpPWwpLHMpby5zZXRQcm9wZXJ0eShpLHUpO2Vsc2UgaWYodSlvW2ldPXU7ZWxzZXt2YXIgcD1jJiZyLnNob3J0aGFuZFByb3BlcnR5RXhwYW5zaW9uc1tpXTtpZihwKWZvcih2YXIgZiBpbiBwKW9bZl09IiI7ZWxzZSBvW2ldPSIifX19fTtlLmV4cG9ydHM9Zn0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDkzNiksbz0vXi1tcy0vO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gcihlLnJlcGxhY2UobywibXMtIikpfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj0vLSguKS9nO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKHIsKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQudG9VcHBlckNhc2UoKX0pKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9big0NzMpLG89KG4oMzQpLHIuaXNVbml0bGVzc051bWJlcik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKG51bGw9PXR8fCJib29sZWFuIj09dHlwZW9mIHR8fCIiPT09dClyZXR1cm4iIjt2YXIgYT1pc05hTih0KTtyZXR1cm4gcnx8YXx8MD09PXR8fG8uaGFzT3duUHJvcGVydHkoZSkmJm9bZV0/IiIrdDooInN0cmluZyI9PXR5cGVvZiB0JiYodD10LnRyaW0oKSksdCsicHgiKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9big5MzkpLG89L15tcy0vO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gcihlKS5yZXBsYWNlKG8sIi1tcy0iKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9LyhbQS1aXSkvZztlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShyLCItJDEiKS50b0xvd2VyQ2FzZSgpfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0Lmhhc093blByb3BlcnR5KG4pfHwodFtuXT1lLmNhbGwodGhpcyxuKSksdFtuXX19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMjA2KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuJyInK3IoZSkrJyInfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE2Nyk7dmFyIG89e2hhbmRsZVRvcExldmVsOmZ1bmN0aW9uKGUsdCxuLG8peyFmdW5jdGlvbihlKXtyLmVucXVldWVFdmVudHMoZSksci5wcm9jZXNzRXZlbnRRdWV1ZSghMSl9KHIuZXh0cmFjdEV2ZW50cyhlLHQsbixvKSl9fTtlLmV4cG9ydHM9b30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDU3KTtmdW5jdGlvbiBvKGUsdCl7dmFyIG49e307cmV0dXJuIG5bZS50b0xvd2VyQ2FzZSgpXT10LnRvTG93ZXJDYXNlKCksblsiV2Via2l0IitlXT0id2Via2l0Iit0LG5bIk1veiIrZV09Im1veiIrdCxuWyJtcyIrZV09Ik1TIit0LG5bIk8iK2VdPSJvIit0LnRvTG93ZXJDYXNlKCksbn12YXIgYT17YW5pbWF0aW9uZW5kOm8oIkFuaW1hdGlvbiIsIkFuaW1hdGlvbkVuZCIpLGFuaW1hdGlvbml0ZXJhdGlvbjpvKCJBbmltYXRpb24iLCJBbmltYXRpb25JdGVyYXRpb24iKSxhbmltYXRpb25zdGFydDpvKCJBbmltYXRpb24iLCJBbmltYXRpb25TdGFydCIpLHRyYW5zaXRpb25lbmQ6bygiVHJhbnNpdGlvbiIsIlRyYW5zaXRpb25FbmQiKX0saT17fSxzPXt9O3IuY2FuVXNlRE9NJiYocz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZSwiQW5pbWF0aW9uRXZlbnQiaW4gd2luZG93fHwoZGVsZXRlIGEuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbixkZWxldGUgYS5hbmltYXRpb25pdGVyYXRpb24uYW5pbWF0aW9uLGRlbGV0ZSBhLmFuaW1hdGlvbnN0YXJ0LmFuaW1hdGlvbiksIlRyYW5zaXRpb25FdmVudCJpbiB3aW5kb3d8fGRlbGV0ZSBhLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbiksZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKGlbZV0pcmV0dXJuIGlbZV07aWYoIWFbZV0pcmV0dXJuIGU7dmFyIHQ9YVtlXTtmb3IodmFyIG4gaW4gdClpZih0Lmhhc093blByb3BlcnR5KG4pJiZuIGluIHMpcmV0dXJuIGlbZV09dFtuXTtyZXR1cm4iIn19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigzMCksbz1uKDM4KSxhPW4oNDc0KSxpPW4oMjY5KSxzPW4oNDUpLHU9big3OSk7bigyNSksbigzNCk7ZnVuY3Rpb24gYygpe3RoaXMuX3Jvb3ROb2RlSUQmJnAudXBkYXRlV3JhcHBlcih0aGlzKX1mdW5jdGlvbiBsKGUpe3JldHVybiJjaGVja2JveCI9PT1lLnR5cGV8fCJyYWRpbyI9PT1lLnR5cGU/bnVsbCE9ZS5jaGVja2VkOm51bGwhPWUudmFsdWV9dmFyIHA9e2dldEhvc3RQcm9wczpmdW5jdGlvbihlLHQpe3ZhciBuPWkuZ2V0VmFsdWUodCkscj1pLmdldENoZWNrZWQodCk7cmV0dXJuIG8oe3R5cGU6dm9pZCAwLHN0ZXA6dm9pZCAwLG1pbjp2b2lkIDAsbWF4OnZvaWQgMH0sdCx7ZGVmYXVsdENoZWNrZWQ6dm9pZCAwLGRlZmF1bHRWYWx1ZTp2b2lkIDAsdmFsdWU6bnVsbCE9bj9uOmUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUsY2hlY2tlZDpudWxsIT1yP3I6ZS5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkLG9uQ2hhbmdlOmUuX3dyYXBwZXJTdGF0ZS5vbkNoYW5nZX0pfSxtb3VudFdyYXBwZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmRlZmF1bHRWYWx1ZTtlLl93cmFwcGVyU3RhdGU9e2luaXRpYWxDaGVja2VkOm51bGwhPXQuY2hlY2tlZD90LmNoZWNrZWQ6dC5kZWZhdWx0Q2hlY2tlZCxpbml0aWFsVmFsdWU6bnVsbCE9dC52YWx1ZT90LnZhbHVlOm4sbGlzdGVuZXJzOm51bGwsb25DaGFuZ2U6Zi5iaW5kKGUpLGNvbnRyb2xsZWQ6bCh0KX19LHVwZGF0ZVdyYXBwZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5fY3VycmVudEVsZW1lbnQucHJvcHMsbj10LmNoZWNrZWQ7bnVsbCE9biYmYS5zZXRWYWx1ZUZvclByb3BlcnR5KHMuZ2V0Tm9kZUZyb21JbnN0YW5jZShlKSwiY2hlY2tlZCIsbnx8ITEpO3ZhciByPXMuZ2V0Tm9kZUZyb21JbnN0YW5jZShlKSxvPWkuZ2V0VmFsdWUodCk7aWYobnVsbCE9bylpZigwPT09byYmIiI9PT1yLnZhbHVlKXIudmFsdWU9IjAiO2Vsc2UgaWYoIm51bWJlciI9PT10LnR5cGUpe3ZhciB1PXBhcnNlRmxvYXQoci52YWx1ZSwxMCl8fDA7KG8hPXV8fG89PXUmJnIudmFsdWUhPW8pJiYoci52YWx1ZT0iIitvKX1lbHNlIHIudmFsdWUhPT0iIitvJiYoci52YWx1ZT0iIitvKTtlbHNlIG51bGw9PXQudmFsdWUmJm51bGwhPXQuZGVmYXVsdFZhbHVlJiZyLmRlZmF1bHRWYWx1ZSE9PSIiK3QuZGVmYXVsdFZhbHVlJiYoci5kZWZhdWx0VmFsdWU9IiIrdC5kZWZhdWx0VmFsdWUpLG51bGw9PXQuY2hlY2tlZCYmbnVsbCE9dC5kZWZhdWx0Q2hlY2tlZCYmKHIuZGVmYXVsdENoZWNrZWQ9ISF0LmRlZmF1bHRDaGVja2VkKX0scG9zdE1vdW50V3JhcHBlcjpmdW5jdGlvbihlKXt2YXIgdD1lLl9jdXJyZW50RWxlbWVudC5wcm9wcyxuPXMuZ2V0Tm9kZUZyb21JbnN0YW5jZShlKTtzd2l0Y2godC50eXBlKXtjYXNlInN1Ym1pdCI6Y2FzZSJyZXNldCI6YnJlYWs7Y2FzZSJjb2xvciI6Y2FzZSJkYXRlIjpjYXNlImRhdGV0aW1lIjpjYXNlImRhdGV0aW1lLWxvY2FsIjpjYXNlIm1vbnRoIjpjYXNlInRpbWUiOmNhc2Uid2VlayI6bi52YWx1ZT0iIixuLnZhbHVlPW4uZGVmYXVsdFZhbHVlO2JyZWFrO2RlZmF1bHQ6bi52YWx1ZT1uLnZhbHVlfXZhciByPW4ubmFtZTsiIiE9PXImJihuLm5hbWU9IiIpLG4uZGVmYXVsdENoZWNrZWQ9IW4uZGVmYXVsdENoZWNrZWQsbi5kZWZhdWx0Q2hlY2tlZD0hbi5kZWZhdWx0Q2hlY2tlZCwiIiE9PXImJihuLm5hbWU9cil9fTtmdW5jdGlvbiBmKGUpe3ZhciB0PXRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzLG49aS5leGVjdXRlT25DaGFuZ2UodCxlKTt1LmFzYXAoYyx0aGlzKTt2YXIgbz10Lm5hbWU7aWYoInJhZGlvIj09PXQudHlwZSYmbnVsbCE9byl7Zm9yKHZhciBhPXMuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0aGlzKSxsPWE7bC5wYXJlbnROb2RlOylsPWwucGFyZW50Tm9kZTtmb3IodmFyIHA9bC5xdWVyeVNlbGVjdG9yQWxsKCJpbnB1dFtuYW1lPSIrSlNPTi5zdHJpbmdpZnkoIiIrbykrJ11bdHlwZT0icmFkaW8iXScpLGY9MDtmPHAubGVuZ3RoO2YrKyl7dmFyIGg9cFtmXTtpZihoIT09YSYmaC5mb3JtPT09YS5mb3JtKXt2YXIgZD1zLmdldEluc3RhbmNlRnJvbU5vZGUoaCk7ZHx8cigiOTAiKSx1LmFzYXAoYyxkKX19fXJldHVybiBufWUuZXhwb3J0cz1wfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz0iU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQifSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzgpLG89bigxMzMpLGE9big0NSksaT1uKDQ3NSkscz0obigzNCksITEpO2Z1bmN0aW9uIHUoZSl7dmFyIHQ9IiI7cmV0dXJuIG8uQ2hpbGRyZW4uZm9yRWFjaChlLChmdW5jdGlvbihlKXtudWxsIT1lJiYoInN0cmluZyI9PXR5cGVvZiBlfHwibnVtYmVyIj09dHlwZW9mIGU/dCs9ZTpzfHwocz0hMCkpfSkpLHR9dmFyIGM9e21vdW50V3JhcHBlcjpmdW5jdGlvbihlLHQsbil7dmFyIHI9bnVsbDtpZihudWxsIT1uKXt2YXIgbz1uOyJvcHRncm91cCI9PT1vLl90YWcmJihvPW8uX2hvc3RQYXJlbnQpLG51bGwhPW8mJiJzZWxlY3QiPT09by5fdGFnJiYocj1pLmdldFNlbGVjdFZhbHVlQ29udGV4dChvKSl9dmFyIGEscz1udWxsO2lmKG51bGwhPXIpaWYoYT1udWxsIT10LnZhbHVlP3QudmFsdWUrIiI6dSh0LmNoaWxkcmVuKSxzPSExLEFycmF5LmlzQXJyYXkocikpe2Zvcih2YXIgYz0wO2M8ci5sZW5ndGg7YysrKWlmKCIiK3JbY109PT1hKXtzPSEwO2JyZWFrfX1lbHNlIHM9IiIrcj09PWE7ZS5fd3JhcHBlclN0YXRlPXtzZWxlY3RlZDpzfX0scG9zdE1vdW50V3JhcHBlcjpmdW5jdGlvbihlKXt2YXIgdD1lLl9jdXJyZW50RWxlbWVudC5wcm9wcztudWxsIT10LnZhbHVlJiZhLmdldE5vZGVGcm9tSW5zdGFuY2UoZSkuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsdC52YWx1ZSl9LGdldEhvc3RQcm9wczpmdW5jdGlvbihlLHQpe3ZhciBuPXIoe3NlbGVjdGVkOnZvaWQgMCxjaGlsZHJlbjp2b2lkIDB9LHQpO251bGwhPWUuX3dyYXBwZXJTdGF0ZS5zZWxlY3RlZCYmKG4uc2VsZWN0ZWQ9ZS5fd3JhcHBlclN0YXRlLnNlbGVjdGVkKTt2YXIgbz11KHQuY2hpbGRyZW4pO3JldHVybiBvJiYobi5jaGlsZHJlbj1vKSxufX07ZS5leHBvcnRzPWN9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigzMCksbz1uKDM4KSxhPW4oMjY5KSxpPW4oNDUpLHM9big3OSk7bigyNSksbigzNCk7ZnVuY3Rpb24gdSgpe3RoaXMuX3Jvb3ROb2RlSUQmJmMudXBkYXRlV3JhcHBlcih0aGlzKX12YXIgYz17Z2V0SG9zdFByb3BzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG51bGwhPXQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwmJnIoIjkxIiksbyh7fSx0LHt2YWx1ZTp2b2lkIDAsZGVmYXVsdFZhbHVlOnZvaWQgMCxjaGlsZHJlbjoiIitlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlLG9uQ2hhbmdlOmUuX3dyYXBwZXJTdGF0ZS5vbkNoYW5nZX0pfSxtb3VudFdyYXBwZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj1hLmdldFZhbHVlKHQpLG89bjtpZihudWxsPT1uKXt2YXIgaT10LmRlZmF1bHRWYWx1ZSxzPXQuY2hpbGRyZW47bnVsbCE9cyYmKG51bGwhPWkmJnIoIjkyIiksQXJyYXkuaXNBcnJheShzKSYmKHMubGVuZ3RoPD0xfHxyKCI5MyIpLHM9c1swXSksaT0iIitzKSxudWxsPT1pJiYoaT0iIiksbz1pfWUuX3dyYXBwZXJTdGF0ZT17aW5pdGlhbFZhbHVlOiIiK28sbGlzdGVuZXJzOm51bGwsb25DaGFuZ2U6bC5iaW5kKGUpfX0sdXBkYXRlV3JhcHBlcjpmdW5jdGlvbihlKXt2YXIgdD1lLl9jdXJyZW50RWxlbWVudC5wcm9wcyxuPWkuZ2V0Tm9kZUZyb21JbnN0YW5jZShlKSxyPWEuZ2V0VmFsdWUodCk7aWYobnVsbCE9cil7dmFyIG89IiIrcjtvIT09bi52YWx1ZSYmKG4udmFsdWU9byksbnVsbD09dC5kZWZhdWx0VmFsdWUmJihuLmRlZmF1bHRWYWx1ZT1vKX1udWxsIT10LmRlZmF1bHRWYWx1ZSYmKG4uZGVmYXVsdFZhbHVlPXQuZGVmYXVsdFZhbHVlKX0scG9zdE1vdW50V3JhcHBlcjpmdW5jdGlvbihlKXt2YXIgdD1pLmdldE5vZGVGcm9tSW5zdGFuY2UoZSksbj10LnRleHRDb250ZW50O249PT1lLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlJiYodC52YWx1ZT1uKX19O2Z1bmN0aW9uIGwoZSl7dmFyIHQ9dGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHMsbj1hLmV4ZWN1dGVPbkNoYW5nZSh0LGUpO3JldHVybiBzLmFzYXAodSx0aGlzKSxufWUuZXhwb3J0cz1jfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzApLG89bigyNzApLGE9KG4oMTY5KSxuKDcyKSxuKDg3KSxuKDE0MykpLGk9big5NDkpLHM9KG4oNzgpLG4oOTU0KSk7bigyNSk7ZnVuY3Rpb24gdShlLHQpe3JldHVybiB0JiYoZT1lfHxbXSkucHVzaCh0KSxlfWZ1bmN0aW9uIGMoZSx0KXtvLnByb2Nlc3NDaGlsZHJlblVwZGF0ZXMoZSx0KX12YXIgbD17TWl4aW46e19yZWNvbmNpbGVySW5zdGFudGlhdGVDaGlsZHJlbjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGkuaW5zdGFudGlhdGVDaGlsZHJlbihlLHQsbil9LF9yZWNvbmNpbGVyVXBkYXRlQ2hpbGRyZW46ZnVuY3Rpb24oZSx0LG4scixvLGEpe3ZhciB1O3JldHVybiB1PXModCwwKSxpLnVwZGF0ZUNoaWxkcmVuKGUsdSxuLHIsbyx0aGlzLHRoaXMuX2hvc3RDb250YWluZXJJbmZvLGEsMCksdX0sbW91bnRDaGlsZHJlbjpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5fcmVjb25jaWxlckluc3RhbnRpYXRlQ2hpbGRyZW4oZSx0LG4pO3RoaXMuX3JlbmRlcmVkQ2hpbGRyZW49cjt2YXIgbz1bXSxpPTA7Zm9yKHZhciBzIGluIHIpaWYoci5oYXNPd25Qcm9wZXJ0eShzKSl7dmFyIHU9cltzXTswO3ZhciBjPWEubW91bnRDb21wb25lbnQodSx0LHRoaXMsdGhpcy5faG9zdENvbnRhaW5lckluZm8sbiwwKTt1Ll9tb3VudEluZGV4PWkrKyxvLnB1c2goYyl9cmV0dXJuIG99LHVwZGF0ZVRleHRDb250ZW50OmZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcy5fcmVuZGVyZWRDaGlsZHJlbjtmb3IodmFyIG8gaW4gaS51bm1vdW50Q2hpbGRyZW4obiwhMSksbiluLmhhc093blByb3BlcnR5KG8pJiZyKCIxMTgiKTtjKHRoaXMsWyh0PWUse3R5cGU6IlRFWFRfQ09OVEVOVCIsY29udGVudDp0LGZyb21JbmRleDpudWxsLGZyb21Ob2RlOm51bGwsdG9JbmRleDpudWxsLGFmdGVyTm9kZTpudWxsfSldKX0sdXBkYXRlTWFya3VwOmZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcy5fcmVuZGVyZWRDaGlsZHJlbjtmb3IodmFyIG8gaW4gaS51bm1vdW50Q2hpbGRyZW4obiwhMSksbiluLmhhc093blByb3BlcnR5KG8pJiZyKCIxMTgiKTtjKHRoaXMsWyh0PWUse3R5cGU6IlNFVF9NQVJLVVAiLGNvbnRlbnQ6dCxmcm9tSW5kZXg6bnVsbCxmcm9tTm9kZTpudWxsLHRvSW5kZXg6bnVsbCxhZnRlck5vZGU6bnVsbH0pXSl9LHVwZGF0ZUNoaWxkcmVuOmZ1bmN0aW9uKGUsdCxuKXt0aGlzLl91cGRhdGVDaGlsZHJlbihlLHQsbil9LF91cGRhdGVDaGlsZHJlbjpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5fcmVuZGVyZWRDaGlsZHJlbixvPXt9LGk9W10scz10aGlzLl9yZWNvbmNpbGVyVXBkYXRlQ2hpbGRyZW4ocixlLGksbyx0LG4pO2lmKHN8fHIpe3ZhciBsLHA9bnVsbCxmPTAsaD0wLGQ9MCxtPW51bGw7Zm9yKGwgaW4gcylpZihzLmhhc093blByb3BlcnR5KGwpKXt2YXIgdj1yJiZyW2xdLGc9c1tsXTt2PT09Zz8ocD11KHAsdGhpcy5tb3ZlQ2hpbGQodixtLGYsaCkpLGg9TWF0aC5tYXgodi5fbW91bnRJbmRleCxoKSx2Ll9tb3VudEluZGV4PWYpOih2JiYoaD1NYXRoLm1heCh2Ll9tb3VudEluZGV4LGgpKSxwPXUocCx0aGlzLl9tb3VudENoaWxkQXRJbmRleChnLGlbZF0sbSxmLHQsbikpLGQrKyksZisrLG09YS5nZXRIb3N0Tm9kZShnKX1mb3IobCBpbiBvKW8uaGFzT3duUHJvcGVydHkobCkmJihwPXUocCx0aGlzLl91bm1vdW50Q2hpbGQocltsXSxvW2xdKSkpO3AmJmModGhpcyxwKSx0aGlzLl9yZW5kZXJlZENoaWxkcmVuPXN9fSx1bm1vdW50Q2hpbGRyZW46ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fcmVuZGVyZWRDaGlsZHJlbjtpLnVubW91bnRDaGlsZHJlbih0LGUpLHRoaXMuX3JlbmRlcmVkQ2hpbGRyZW49bnVsbH0sbW92ZUNoaWxkOmZ1bmN0aW9uKGUsdCxuLHIpe2lmKGUuX21vdW50SW5kZXg8cilyZXR1cm4gZnVuY3Rpb24oZSx0LG4pe3JldHVybnt0eXBlOiJNT1ZFX0VYSVNUSU5HIixjb250ZW50Om51bGwsZnJvbUluZGV4OmUuX21vdW50SW5kZXgsZnJvbU5vZGU6YS5nZXRIb3N0Tm9kZShlKSx0b0luZGV4Om4sYWZ0ZXJOb2RlOnR9fShlLHQsbil9LGNyZWF0ZUNoaWxkOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24oZSx0LG4pe3JldHVybnt0eXBlOiJJTlNFUlRfTUFSS1VQIixjb250ZW50OmUsZnJvbUluZGV4Om51bGwsZnJvbU5vZGU6bnVsbCx0b0luZGV4Om4sYWZ0ZXJOb2RlOnR9fShuLHQsZS5fbW91bnRJbmRleCl9LHJlbW92ZUNoaWxkOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7cmV0dXJue3R5cGU6IlJFTU9WRV9OT0RFIixjb250ZW50Om51bGwsZnJvbUluZGV4OmUuX21vdW50SW5kZXgsZnJvbU5vZGU6dCx0b0luZGV4Om51bGwsYWZ0ZXJOb2RlOm51bGx9fShlLHQpfSxfbW91bnRDaGlsZEF0SW5kZXg6ZnVuY3Rpb24oZSx0LG4scixvLGEpe3JldHVybiBlLl9tb3VudEluZGV4PXIsdGhpcy5jcmVhdGVDaGlsZChlLG4sdCl9LF91bm1vdW50Q2hpbGQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnJlbW92ZUNoaWxkKGUsdCk7cmV0dXJuIGUuX21vdW50SW5kZXg9bnVsbCxufX19O2UuZXhwb3J0cz1sfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiOyhmdW5jdGlvbih0KXt2YXIgcj1uKDE0Myksbz1uKDQ3NiksYT0obigyNzMpLG4oMjcyKSksaT1uKDQ4MCk7bigzNCk7ZnVuY3Rpb24gcyhlLHQsbixyKXt2YXIgYT12b2lkIDA9PT1lW25dO251bGwhPXQmJmEmJihlW25dPW8odCwhMCkpfXZvaWQgMCE9PXQmJnQuZW52O3ZhciB1PXtpbnN0YW50aWF0ZUNoaWxkcmVuOmZ1bmN0aW9uKGUsdCxuLHIpe2lmKG51bGw9PWUpcmV0dXJuIG51bGw7dmFyIG89e307cmV0dXJuIGkoZSxzLG8pLG99LHVwZGF0ZUNoaWxkcmVuOmZ1bmN0aW9uKGUsdCxuLGkscyx1LGMsbCxwKXtpZih0fHxlKXt2YXIgZixoO2ZvcihmIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShmKSl7dmFyIGQ9KGg9ZSYmZVtmXSkmJmguX2N1cnJlbnRFbGVtZW50LG09dFtmXTtpZihudWxsIT1oJiZhKGQsbSkpci5yZWNlaXZlQ29tcG9uZW50KGgsbSxzLGwpLHRbZl09aDtlbHNle2gmJihpW2ZdPXIuZ2V0SG9zdE5vZGUoaCksci51bm1vdW50Q29tcG9uZW50KGgsITEpKTt2YXIgdj1vKG0sITApO3RbZl09djt2YXIgZz1yLm1vdW50Q29tcG9uZW50KHYscyx1LGMsbCxwKTtuLnB1c2goZyl9fWZvcihmIGluIGUpIWUuaGFzT3duUHJvcGVydHkoZil8fHQmJnQuaGFzT3duUHJvcGVydHkoZil8fChoPWVbZl0saVtmXT1yLmdldEhvc3ROb2RlKGgpLHIudW5tb3VudENvbXBvbmVudChoLCExKSl9fSx1bm1vdW50Q2hpbGRyZW46ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4gaW4gZSlpZihlLmhhc093blByb3BlcnR5KG4pKXt2YXIgbz1lW25dO3IudW5tb3VudENvbXBvbmVudChvLHQpfX19O2UuZXhwb3J0cz11fSkuY2FsbCh0aGlzLG4oODkpKX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMwKSxvPW4oMzgpLGE9bigxMzMpLGk9bigyNzApLHM9big4NyksdT1uKDI2MiksYz1uKDE2OSksbD0obig3Miksbig0NzcpKSxwPW4oMTQzKSxmPW4oMjM5KSxoPShuKDI1KSxuKDI3MSkpLGQ9bigyNzIpLG09KG4oMzQpLDApLHY9MSxnPTI7ZnVuY3Rpb24geShlKXt9ZnVuY3Rpb24gYihlLHQpezB9eS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGU9Yy5nZXQodGhpcykuX2N1cnJlbnRFbGVtZW50LnR5cGUsdD1lKHRoaXMucHJvcHMsdGhpcy5jb250ZXh0LHRoaXMudXBkYXRlcik7cmV0dXJuIGIoZSx0KSx0fTt2YXIgXz0xLHc9e2NvbnN0cnVjdDpmdW5jdGlvbihlKXt0aGlzLl9jdXJyZW50RWxlbWVudD1lLHRoaXMuX3Jvb3ROb2RlSUQ9MCx0aGlzLl9jb21wb3NpdGVUeXBlPW51bGwsdGhpcy5faW5zdGFuY2U9bnVsbCx0aGlzLl9ob3N0UGFyZW50PW51bGwsdGhpcy5faG9zdENvbnRhaW5lckluZm89bnVsbCx0aGlzLl91cGRhdGVCYXRjaE51bWJlcj1udWxsLHRoaXMuX3BlbmRpbmdFbGVtZW50PW51bGwsdGhpcy5fcGVuZGluZ1N0YXRlUXVldWU9bnVsbCx0aGlzLl9wZW5kaW5nUmVwbGFjZVN0YXRlPSExLHRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZT0hMSx0aGlzLl9yZW5kZXJlZE5vZGVUeXBlPW51bGwsdGhpcy5fcmVuZGVyZWRDb21wb25lbnQ9bnVsbCx0aGlzLl9jb250ZXh0PW51bGwsdGhpcy5fbW91bnRPcmRlcj0wLHRoaXMuX3RvcExldmVsV3JhcHBlcj1udWxsLHRoaXMuX3BlbmRpbmdDYWxsYmFja3M9bnVsbCx0aGlzLl9jYWxsZWRDb21wb25lbnRXaWxsVW5tb3VudD0hMX0sbW91bnRDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4sbyl7dGhpcy5fY29udGV4dD1vLHRoaXMuX21vdW50T3JkZXI9XysrLHRoaXMuX2hvc3RQYXJlbnQ9dCx0aGlzLl9ob3N0Q29udGFpbmVySW5mbz1uO3ZhciBpLHM9dGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHMsdT10aGlzLl9wcm9jZXNzQ29udGV4dChvKSxsPXRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGUscD1lLmdldFVwZGF0ZVF1ZXVlKCksaD1mdW5jdGlvbihlKXtyZXR1cm4hKCFlLnByb3RvdHlwZXx8IWUucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQpfShsKSxkPXRoaXMuX2NvbnN0cnVjdENvbXBvbmVudChoLHMsdSxwKTtofHxudWxsIT1kJiZudWxsIT1kLnJlbmRlcj8hZnVuY3Rpb24oZSl7cmV0dXJuISghZS5wcm90b3R5cGV8fCFlLnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudCl9KGwpP3RoaXMuX2NvbXBvc2l0ZVR5cGU9bTp0aGlzLl9jb21wb3NpdGVUeXBlPXY6KGk9ZCxiKCksbnVsbD09PWR8fCExPT09ZHx8YS5pc1ZhbGlkRWxlbWVudChkKXx8cigiMTA1IixsLmRpc3BsYXlOYW1lfHxsLm5hbWV8fCJDb21wb25lbnQiKSxkPW5ldyB5KGwpLHRoaXMuX2NvbXBvc2l0ZVR5cGU9ZyksZC5wcm9wcz1zLGQuY29udGV4dD11LGQucmVmcz1mLGQudXBkYXRlcj1wLHRoaXMuX2luc3RhbmNlPWQsYy5zZXQoZCx0aGlzKTt2YXIgdyx4PWQuc3RhdGU7cmV0dXJuIHZvaWQgMD09PXgmJihkLnN0YXRlPXg9bnVsbCksKCJvYmplY3QiIT10eXBlb2YgeHx8QXJyYXkuaXNBcnJheSh4KSkmJnIoIjEwNiIsdGhpcy5nZXROYW1lKCl8fCJSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCIpLHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlPW51bGwsdGhpcy5fcGVuZGluZ1JlcGxhY2VTdGF0ZT0hMSx0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGU9ITEsdz1kLnVuc3RhYmxlX2hhbmRsZUVycm9yP3RoaXMucGVyZm9ybUluaXRpYWxNb3VudFdpdGhFcnJvckhhbmRsaW5nKGksdCxuLGUsbyk6dGhpcy5wZXJmb3JtSW5pdGlhbE1vdW50KGksdCxuLGUsbyksZC5jb21wb25lbnREaWRNb3VudCYmZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGQuY29tcG9uZW50RGlkTW91bnQsZCksd30sX2NvbnN0cnVjdENvbXBvbmVudDpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5fY29uc3RydWN0Q29tcG9uZW50V2l0aG91dE93bmVyKGUsdCxuLHIpfSxfY29uc3RydWN0Q29tcG9uZW50V2l0aG91dE93bmVyOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPXRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7cmV0dXJuIGU/bmV3IG8odCxuLHIpOm8odCxuLHIpfSxwZXJmb3JtSW5pdGlhbE1vdW50V2l0aEVycm9ySGFuZGxpbmc6ZnVuY3Rpb24oZSx0LG4scixvKXt2YXIgYSxpPXIuY2hlY2twb2ludCgpO3RyeXthPXRoaXMucGVyZm9ybUluaXRpYWxNb3VudChlLHQsbixyLG8pfWNhdGNoKHMpe3Iucm9sbGJhY2soaSksdGhpcy5faW5zdGFuY2UudW5zdGFibGVfaGFuZGxlRXJyb3IocyksdGhpcy5fcGVuZGluZ1N0YXRlUXVldWUmJih0aGlzLl9pbnN0YW5jZS5zdGF0ZT10aGlzLl9wcm9jZXNzUGVuZGluZ1N0YXRlKHRoaXMuX2luc3RhbmNlLnByb3BzLHRoaXMuX2luc3RhbmNlLmNvbnRleHQpKSxpPXIuY2hlY2twb2ludCgpLHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50LnVubW91bnRDb21wb25lbnQoITApLHIucm9sbGJhY2soaSksYT10aGlzLnBlcmZvcm1Jbml0aWFsTW91bnQoZSx0LG4scixvKX1yZXR1cm4gYX0scGVyZm9ybUluaXRpYWxNb3VudDpmdW5jdGlvbihlLHQsbixyLG8pe3ZhciBhPXRoaXMuX2luc3RhbmNlO2EuY29tcG9uZW50V2lsbE1vdW50JiYoYS5jb21wb25lbnRXaWxsTW91bnQoKSx0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZSYmKGEuc3RhdGU9dGhpcy5fcHJvY2Vzc1BlbmRpbmdTdGF0ZShhLnByb3BzLGEuY29udGV4dCkpKSx2b2lkIDA9PT1lJiYoZT10aGlzLl9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnQoKSk7dmFyIGk9bC5nZXRUeXBlKGUpO3RoaXMuX3JlbmRlcmVkTm9kZVR5cGU9aTt2YXIgcz10aGlzLl9pbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50KGUsaSE9PWwuRU1QVFkpO3JldHVybiB0aGlzLl9yZW5kZXJlZENvbXBvbmVudD1zLHAubW91bnRDb21wb25lbnQocyxyLHQsbix0aGlzLl9wcm9jZXNzQ2hpbGRDb250ZXh0KG8pLDApfSxnZXRIb3N0Tm9kZTpmdW5jdGlvbigpe3JldHVybiBwLmdldEhvc3ROb2RlKHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50KX0sdW5tb3VudENvbXBvbmVudDpmdW5jdGlvbihlKXtpZih0aGlzLl9yZW5kZXJlZENvbXBvbmVudCl7dmFyIHQ9dGhpcy5faW5zdGFuY2U7aWYodC5jb21wb25lbnRXaWxsVW5tb3VudCYmIXQuX2NhbGxlZENvbXBvbmVudFdpbGxVbm1vdW50KWlmKHQuX2NhbGxlZENvbXBvbmVudFdpbGxVbm1vdW50PSEwLGUpe3ZhciBuPXRoaXMuZ2V0TmFtZSgpKyIuY29tcG9uZW50V2lsbFVubW91bnQoKSI7dS5pbnZva2VHdWFyZGVkQ2FsbGJhY2sobix0LmNvbXBvbmVudFdpbGxVbm1vdW50LmJpbmQodCkpfWVsc2UgdC5jb21wb25lbnRXaWxsVW5tb3VudCgpO3RoaXMuX3JlbmRlcmVkQ29tcG9uZW50JiYocC51bm1vdW50Q29tcG9uZW50KHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50LGUpLHRoaXMuX3JlbmRlcmVkTm9kZVR5cGU9bnVsbCx0aGlzLl9yZW5kZXJlZENvbXBvbmVudD1udWxsLHRoaXMuX2luc3RhbmNlPW51bGwpLHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlPW51bGwsdGhpcy5fcGVuZGluZ1JlcGxhY2VTdGF0ZT0hMSx0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGU9ITEsdGhpcy5fcGVuZGluZ0NhbGxiYWNrcz1udWxsLHRoaXMuX3BlbmRpbmdFbGVtZW50PW51bGwsdGhpcy5fY29udGV4dD1udWxsLHRoaXMuX3Jvb3ROb2RlSUQ9MCx0aGlzLl90b3BMZXZlbFdyYXBwZXI9bnVsbCxjLnJlbW92ZSh0KX19LF9tYXNrQ29udGV4dDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9jdXJyZW50RWxlbWVudC50eXBlLmNvbnRleHRUeXBlcztpZighdClyZXR1cm4gZjt2YXIgbj17fTtmb3IodmFyIHIgaW4gdCluW3JdPWVbcl07cmV0dXJuIG59LF9wcm9jZXNzQ29udGV4dDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fbWFza0NvbnRleHQoZSl9LF9wcm9jZXNzQ2hpbGRDb250ZXh0OmZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSxhPXRoaXMuX2luc3RhbmNlO2lmKGEuZ2V0Q2hpbGRDb250ZXh0JiYodD1hLmdldENoaWxkQ29udGV4dCgpKSx0KXtmb3IodmFyIGkgaW4ib2JqZWN0IiE9dHlwZW9mIG4uY2hpbGRDb250ZXh0VHlwZXMmJnIoIjEwNyIsdGhpcy5nZXROYW1lKCl8fCJSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCIpLHQpaSBpbiBuLmNoaWxkQ29udGV4dFR5cGVzfHxyKCIxMDgiLHRoaXMuZ2V0TmFtZSgpfHwiUmVhY3RDb21wb3NpdGVDb21wb25lbnQiLGkpO3JldHVybiBvKHt9LGUsdCl9cmV0dXJuIGV9LF9jaGVja0NvbnRleHRUeXBlczpmdW5jdGlvbihlLHQsbil7MH0scmVjZWl2ZUNvbXBvbmVudDpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5fY3VycmVudEVsZW1lbnQsbz10aGlzLl9jb250ZXh0O3RoaXMuX3BlbmRpbmdFbGVtZW50PW51bGwsdGhpcy51cGRhdGVDb21wb25lbnQodCxyLGUsbyxuKX0scGVyZm9ybVVwZGF0ZUlmTmVjZXNzYXJ5OmZ1bmN0aW9uKGUpe251bGwhPXRoaXMuX3BlbmRpbmdFbGVtZW50P3AucmVjZWl2ZUNvbXBvbmVudCh0aGlzLHRoaXMuX3BlbmRpbmdFbGVtZW50LGUsdGhpcy5fY29udGV4dCk6bnVsbCE9PXRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlfHx0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGU/dGhpcy51cGRhdGVDb21wb25lbnQoZSx0aGlzLl9jdXJyZW50RWxlbWVudCx0aGlzLl9jdXJyZW50RWxlbWVudCx0aGlzLl9jb250ZXh0LHRoaXMuX2NvbnRleHQpOnRoaXMuX3VwZGF0ZUJhdGNoTnVtYmVyPW51bGx9LHVwZGF0ZUNvbXBvbmVudDpmdW5jdGlvbihlLHQsbixvLGEpe3ZhciBpPXRoaXMuX2luc3RhbmNlO251bGw9PWkmJnIoIjEzNiIsdGhpcy5nZXROYW1lKCl8fCJSZWFjdENvbXBvc2l0ZUNvbXBvbmVudCIpO3ZhciBzLHU9ITE7dGhpcy5fY29udGV4dD09PWE/cz1pLmNvbnRleHQ6KHM9dGhpcy5fcHJvY2Vzc0NvbnRleHQoYSksdT0hMCk7dmFyIGM9dC5wcm9wcyxsPW4ucHJvcHM7dCE9PW4mJih1PSEwKSx1JiZpLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMmJmkuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhsLHMpO3ZhciBwPXRoaXMuX3Byb2Nlc3NQZW5kaW5nU3RhdGUobCxzKSxmPSEwO3RoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZXx8KGkuc2hvdWxkQ29tcG9uZW50VXBkYXRlP2Y9aS5zaG91bGRDb21wb25lbnRVcGRhdGUobCxwLHMpOnRoaXMuX2NvbXBvc2l0ZVR5cGU9PT12JiYoZj0haChjLGwpfHwhaChpLnN0YXRlLHApKSksdGhpcy5fdXBkYXRlQmF0Y2hOdW1iZXI9bnVsbCxmPyh0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGU9ITEsdGhpcy5fcGVyZm9ybUNvbXBvbmVudFVwZGF0ZShuLGwscCxzLGUsYSkpOih0aGlzLl9jdXJyZW50RWxlbWVudD1uLHRoaXMuX2NvbnRleHQ9YSxpLnByb3BzPWwsaS5zdGF0ZT1wLGkuY29udGV4dD1zKX0sX3Byb2Nlc3NQZW5kaW5nU3RhdGU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9pbnN0YW5jZSxyPXRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlLGE9dGhpcy5fcGVuZGluZ1JlcGxhY2VTdGF0ZTtpZih0aGlzLl9wZW5kaW5nUmVwbGFjZVN0YXRlPSExLHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlPW51bGwsIXIpcmV0dXJuIG4uc3RhdGU7aWYoYSYmMT09PXIubGVuZ3RoKXJldHVybiByWzBdO2Zvcih2YXIgaT1vKHt9LGE/clswXTpuLnN0YXRlKSxzPWE/MTowO3M8ci5sZW5ndGg7cysrKXt2YXIgdT1yW3NdO28oaSwiZnVuY3Rpb24iPT10eXBlb2YgdT91LmNhbGwobixpLGUsdCk6dSl9cmV0dXJuIGl9LF9wZXJmb3JtQ29tcG9uZW50VXBkYXRlOmZ1bmN0aW9uKGUsdCxuLHIsbyxhKXt2YXIgaSxzLHUsYz10aGlzLl9pbnN0YW5jZSxsPUJvb2xlYW4oYy5jb21wb25lbnREaWRVcGRhdGUpO2wmJihpPWMucHJvcHMscz1jLnN0YXRlLHU9Yy5jb250ZXh0KSxjLmNvbXBvbmVudFdpbGxVcGRhdGUmJmMuY29tcG9uZW50V2lsbFVwZGF0ZSh0LG4sciksdGhpcy5fY3VycmVudEVsZW1lbnQ9ZSx0aGlzLl9jb250ZXh0PWEsYy5wcm9wcz10LGMuc3RhdGU9bixjLmNvbnRleHQ9cix0aGlzLl91cGRhdGVSZW5kZXJlZENvbXBvbmVudChvLGEpLGwmJm8uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShjLmNvbXBvbmVudERpZFVwZGF0ZS5iaW5kKGMsaSxzLHUpLGMpfSxfdXBkYXRlUmVuZGVyZWRDb21wb25lbnQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9yZW5kZXJlZENvbXBvbmVudCxyPW4uX2N1cnJlbnRFbGVtZW50LG89dGhpcy5fcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50KCk7aWYoZChyLG8pKXAucmVjZWl2ZUNvbXBvbmVudChuLG8sZSx0aGlzLl9wcm9jZXNzQ2hpbGRDb250ZXh0KHQpKTtlbHNle3ZhciBhPXAuZ2V0SG9zdE5vZGUobik7cC51bm1vdW50Q29tcG9uZW50KG4sITEpO3ZhciBpPWwuZ2V0VHlwZShvKTt0aGlzLl9yZW5kZXJlZE5vZGVUeXBlPWk7dmFyIHM9dGhpcy5faW5zdGFudGlhdGVSZWFjdENvbXBvbmVudChvLGkhPT1sLkVNUFRZKTt0aGlzLl9yZW5kZXJlZENvbXBvbmVudD1zO3ZhciB1PXAubW91bnRDb21wb25lbnQocyxlLHRoaXMuX2hvc3RQYXJlbnQsdGhpcy5faG9zdENvbnRhaW5lckluZm8sdGhpcy5fcHJvY2Vzc0NoaWxkQ29udGV4dCh0KSwwKTt0aGlzLl9yZXBsYWNlTm9kZVdpdGhNYXJrdXAoYSx1LG4pfX0sX3JlcGxhY2VOb2RlV2l0aE1hcmt1cDpmdW5jdGlvbihlLHQsbil7aS5yZXBsYWNlTm9kZVdpdGhNYXJrdXAoZSx0LG4pfSxfcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50V2l0aG91dE93bmVyT3JDb250ZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2luc3RhbmNlLnJlbmRlcigpfSxfcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50OmZ1bmN0aW9uKCl7dmFyIGU7aWYodGhpcy5fY29tcG9zaXRlVHlwZSE9PWcpe3MuY3VycmVudD10aGlzO3RyeXtlPXRoaXMuX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudFdpdGhvdXRPd25lck9yQ29udGV4dCgpfWZpbmFsbHl7cy5jdXJyZW50PW51bGx9fWVsc2UgZT10aGlzLl9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnRXaXRob3V0T3duZXJPckNvbnRleHQoKTtyZXR1cm4gbnVsbD09PWV8fCExPT09ZXx8YS5pc1ZhbGlkRWxlbWVudChlKXx8cigiMTA5Iix0aGlzLmdldE5hbWUoKXx8IlJlYWN0Q29tcG9zaXRlQ29tcG9uZW50IiksZX0sYXR0YWNoUmVmOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5nZXRQdWJsaWNJbnN0YW5jZSgpO251bGw9PW4mJnIoIjExMCIpO3ZhciBvPXQuZ2V0UHVibGljSW5zdGFuY2UoKTsobi5yZWZzPT09Zj9uLnJlZnM9e306bi5yZWZzKVtlXT1vfSxkZXRhY2hSZWY6ZnVuY3Rpb24oZSl7ZGVsZXRlIHRoaXMuZ2V0UHVibGljSW5zdGFuY2UoKS5yZWZzW2VdfSxnZXROYW1lOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSx0PXRoaXMuX2luc3RhbmNlJiZ0aGlzLl9pbnN0YW5jZS5jb25zdHJ1Y3RvcjtyZXR1cm4gZS5kaXNwbGF5TmFtZXx8dCYmdC5kaXNwbGF5TmFtZXx8ZS5uYW1lfHx0JiZ0Lm5hbWV8fG51bGx9LGdldFB1YmxpY0luc3RhbmNlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5faW5zdGFuY2U7cmV0dXJuIHRoaXMuX2NvbXBvc2l0ZVR5cGU9PT1nP251bGw6ZX0sX2luc3RhbnRpYXRlUmVhY3RDb21wb25lbnQ6bnVsbH07ZS5leHBvcnRzPXd9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9MTtlLmV4cG9ydHM9ZnVuY3Rpb24oKXtyZXR1cm4gcisrfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuZm9yJiZTeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50Iil8fDYwMTAzO2UuZXhwb3J0cz1yfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvcjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmKHImJmVbcl18fGVbIkBAaXRlcmF0b3IiXSk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQpcmV0dXJuIHR9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiOyhmdW5jdGlvbih0KXtuKDI3Myk7dmFyIHI9big0ODApO24oMzQpO2Z1bmN0aW9uIG8oZSx0LG4scil7aWYoZSYmIm9iamVjdCI9PXR5cGVvZiBlKXt2YXIgbz1lOzAsdm9pZCAwPT09b1tuXSYmbnVsbCE9dCYmKG9bbl09dCl9fXZvaWQgMCE9PXQmJnQuZW52LGUuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2lmKG51bGw9PWUpcmV0dXJuIGU7dmFyIG49e307cmV0dXJuIHIoZSxvLG4pLG59fSkuY2FsbCh0aGlzLG4oODkpKX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDM4KSxvPW4oMTIyKSxhPW4oMjAzKSxpPShuKDcyKSxuKDk1NikpLHM9W107dmFyIHU9e2VucXVldWU6ZnVuY3Rpb24oKXt9fTtmdW5jdGlvbiBjKGUpe3RoaXMucmVpbml0aWFsaXplVHJhbnNhY3Rpb24oKSx0aGlzLnJlbmRlclRvU3RhdGljTWFya3VwPWUsdGhpcy51c2VDcmVhdGVFbGVtZW50PSExLHRoaXMudXBkYXRlUXVldWU9bmV3IGkodGhpcyl9dmFyIGw9e2dldFRyYW5zYWN0aW9uV3JhcHBlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gc30sZ2V0UmVhY3RNb3VudFJlYWR5OmZ1bmN0aW9uKCl7cmV0dXJuIHV9LGdldFVwZGF0ZVF1ZXVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudXBkYXRlUXVldWV9LGRlc3RydWN0b3I6ZnVuY3Rpb24oKXt9LGNoZWNrcG9pbnQ6ZnVuY3Rpb24oKXt9LHJvbGxiYWNrOmZ1bmN0aW9uKCl7fX07cihjLnByb3RvdHlwZSxhLGwpLG8uYWRkUG9vbGluZ1RvKGMpLGUuZXhwb3J0cz1jfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMjc0KTtuKDM0KTt2YXIgbz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7IWZ1bmN0aW9uKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsZSksdGhpcy50cmFuc2FjdGlvbj10fXJldHVybiBlLnByb3RvdHlwZS5pc01vdW50ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuITF9LGUucHJvdG90eXBlLmVucXVldWVDYWxsYmFjaz1mdW5jdGlvbihlLHQsbil7dGhpcy50cmFuc2FjdGlvbi5pc0luVHJhbnNhY3Rpb24oKSYmci5lbnF1ZXVlQ2FsbGJhY2soZSx0LG4pfSxlLnByb3RvdHlwZS5lbnF1ZXVlRm9yY2VVcGRhdGU9ZnVuY3Rpb24oZSl7dGhpcy50cmFuc2FjdGlvbi5pc0luVHJhbnNhY3Rpb24oKSYmci5lbnF1ZXVlRm9yY2VVcGRhdGUoZSl9LGUucHJvdG90eXBlLmVucXVldWVSZXBsYWNlU3RhdGU9ZnVuY3Rpb24oZSx0KXt0aGlzLnRyYW5zYWN0aW9uLmlzSW5UcmFuc2FjdGlvbigpJiZyLmVucXVldWVSZXBsYWNlU3RhdGUoZSx0KX0sZS5wcm90b3R5cGUuZW5xdWV1ZVNldFN0YXRlPWZ1bmN0aW9uKGUsdCl7dGhpcy50cmFuc2FjdGlvbi5pc0luVHJhbnNhY3Rpb24oKSYmci5lbnF1ZXVlU2V0U3RhdGUoZSx0KX0sZX0oKTtlLmV4cG9ydHM9b30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDM4KSxvPW4oMTQ0KSxhPW4oNDUpLGk9ZnVuY3Rpb24oZSl7dGhpcy5fY3VycmVudEVsZW1lbnQ9bnVsbCx0aGlzLl9ob3N0Tm9kZT1udWxsLHRoaXMuX2hvc3RQYXJlbnQ9bnVsbCx0aGlzLl9ob3N0Q29udGFpbmVySW5mbz1udWxsLHRoaXMuX2RvbUlEPTB9O3IoaS5wcm90b3R5cGUse21vdW50Q29tcG9uZW50OmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPW4uX2lkQ291bnRlcisrO3RoaXMuX2RvbUlEPWksdGhpcy5faG9zdFBhcmVudD10LHRoaXMuX2hvc3RDb250YWluZXJJbmZvPW47dmFyIHM9IiByZWFjdC1lbXB0eTogIit0aGlzLl9kb21JRCsiICI7aWYoZS51c2VDcmVhdGVFbGVtZW50KXt2YXIgdT1uLl9vd25lckRvY3VtZW50LmNyZWF0ZUNvbW1lbnQocyk7cmV0dXJuIGEucHJlY2FjaGVOb2RlKHRoaXMsdSksbyh1KX1yZXR1cm4gZS5yZW5kZXJUb1N0YXRpY01hcmt1cD8iIjoiXHgzYyEtLSIrcysiLS1ceDNlIn0scmVjZWl2ZUNvbXBvbmVudDpmdW5jdGlvbigpe30sZ2V0SG9zdE5vZGU6ZnVuY3Rpb24oKXtyZXR1cm4gYS5nZXROb2RlRnJvbUluc3RhbmNlKHRoaXMpfSx1bm1vdW50Q29tcG9uZW50OmZ1bmN0aW9uKCl7YS51bmNhY2hlTm9kZSh0aGlzKX19KSxlLmV4cG9ydHM9aX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMwKTtuKDI1KTtmdW5jdGlvbiBvKGUsdCl7Il9ob3N0Tm9kZSJpbiBlfHxyKCIzMyIpLCJfaG9zdE5vZGUiaW4gdHx8cigiMzMiKTtmb3IodmFyIG49MCxvPWU7bztvPW8uX2hvc3RQYXJlbnQpbisrO2Zvcih2YXIgYT0wLGk9dDtpO2k9aS5faG9zdFBhcmVudClhKys7Zm9yKDtuLWE+MDspZT1lLl9ob3N0UGFyZW50LG4tLTtmb3IoO2Etbj4wOyl0PXQuX2hvc3RQYXJlbnQsYS0tO2Zvcih2YXIgcz1uO3MtLTspe2lmKGU9PT10KXJldHVybiBlO2U9ZS5faG9zdFBhcmVudCx0PXQuX2hvc3RQYXJlbnR9cmV0dXJuIG51bGx9ZS5leHBvcnRzPXtpc0FuY2VzdG9yOmZ1bmN0aW9uKGUsdCl7Il9ob3N0Tm9kZSJpbiBlfHxyKCIzNSIpLCJfaG9zdE5vZGUiaW4gdHx8cigiMzUiKTtmb3IoO3Q7KXtpZih0PT09ZSlyZXR1cm4hMDt0PXQuX2hvc3RQYXJlbnR9cmV0dXJuITF9LGdldExvd2VzdENvbW1vbkFuY2VzdG9yOm8sZ2V0UGFyZW50SW5zdGFuY2U6ZnVuY3Rpb24oZSl7cmV0dXJuIl9ob3N0Tm9kZSJpbiBlfHxyKCIzNiIpLGUuX2hvc3RQYXJlbnR9LHRyYXZlcnNlVHdvUGhhc2U6ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcixvPVtdO2U7KW8ucHVzaChlKSxlPWUuX2hvc3RQYXJlbnQ7Zm9yKHI9by5sZW5ndGg7ci0tID4wOyl0KG9bcl0sImNhcHR1cmVkIixuKTtmb3Iocj0wO3I8by5sZW5ndGg7cisrKXQob1tyXSwiYnViYmxlZCIsbil9LHRyYXZlcnNlRW50ZXJMZWF2ZTpmdW5jdGlvbihlLHQsbixyLGEpe2Zvcih2YXIgaT1lJiZ0P28oZSx0KTpudWxsLHM9W107ZSYmZSE9PWk7KXMucHVzaChlKSxlPWUuX2hvc3RQYXJlbnQ7Zm9yKHZhciB1LGM9W107dCYmdCE9PWk7KWMucHVzaCh0KSx0PXQuX2hvc3RQYXJlbnQ7Zm9yKHU9MDt1PHMubGVuZ3RoO3UrKyluKHNbdV0sImJ1YmJsZWQiLHIpO2Zvcih1PWMubGVuZ3RoO3UtLSA+MDspbihjW3VdLCJjYXB0dXJlZCIsYSl9fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMwKSxvPW4oMzgpLGE9bigyNjYpLGk9bigxNDQpLHM9big0NSksdT1uKDIwNiksYz0obigyNSksbigyNzUpLGZ1bmN0aW9uKGUpe3RoaXMuX2N1cnJlbnRFbGVtZW50PWUsdGhpcy5fc3RyaW5nVGV4dD0iIitlLHRoaXMuX2hvc3ROb2RlPW51bGwsdGhpcy5faG9zdFBhcmVudD1udWxsLHRoaXMuX2RvbUlEPTAsdGhpcy5fbW91bnRJbmRleD0wLHRoaXMuX2Nsb3NpbmdDb21tZW50PW51bGwsdGhpcy5fY29tbWVudE5vZGVzPW51bGx9KTtvKGMucHJvdG90eXBlLHttb3VudENvbXBvbmVudDpmdW5jdGlvbihlLHQsbixyKXt2YXIgbz1uLl9pZENvdW50ZXIrKyxhPSIgcmVhY3QtdGV4dDogIitvKyIgIixjPSIgL3JlYWN0LXRleHQgIjtpZih0aGlzLl9kb21JRD1vLHRoaXMuX2hvc3RQYXJlbnQ9dCxlLnVzZUNyZWF0ZUVsZW1lbnQpe3ZhciBsPW4uX293bmVyRG9jdW1lbnQscD1sLmNyZWF0ZUNvbW1lbnQoYSksZj1sLmNyZWF0ZUNvbW1lbnQoYyksaD1pKGwuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKTtyZXR1cm4gaS5xdWV1ZUNoaWxkKGgsaShwKSksdGhpcy5fc3RyaW5nVGV4dCYmaS5xdWV1ZUNoaWxkKGgsaShsLmNyZWF0ZVRleHROb2RlKHRoaXMuX3N0cmluZ1RleHQpKSksaS5xdWV1ZUNoaWxkKGgsaShmKSkscy5wcmVjYWNoZU5vZGUodGhpcyxwKSx0aGlzLl9jbG9zaW5nQ29tbWVudD1mLGh9dmFyIGQ9dSh0aGlzLl9zdHJpbmdUZXh0KTtyZXR1cm4gZS5yZW5kZXJUb1N0YXRpY01hcmt1cD9kOiJceDNjIS0tIithKyItLVx4M2UiK2QrIlx4M2MhLS0iKyIgL3JlYWN0LXRleHQgLS1ceDNlIn0scmVjZWl2ZUNvbXBvbmVudDpmdW5jdGlvbihlLHQpe2lmKGUhPT10aGlzLl9jdXJyZW50RWxlbWVudCl7dGhpcy5fY3VycmVudEVsZW1lbnQ9ZTt2YXIgbj0iIitlO2lmKG4hPT10aGlzLl9zdHJpbmdUZXh0KXt0aGlzLl9zdHJpbmdUZXh0PW47dmFyIHI9dGhpcy5nZXRIb3N0Tm9kZSgpO2EucmVwbGFjZURlbGltaXRlZFRleHQoclswXSxyWzFdLG4pfX19LGdldEhvc3ROb2RlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fY29tbWVudE5vZGVzO2lmKGUpcmV0dXJuIGU7aWYoIXRoaXMuX2Nsb3NpbmdDb21tZW50KWZvcih2YXIgdD1zLmdldE5vZGVGcm9tSW5zdGFuY2UodGhpcykubmV4dFNpYmxpbmc7Oyl7aWYobnVsbD09dCYmcigiNjciLHRoaXMuX2RvbUlEKSw4PT09dC5ub2RlVHlwZSYmIiAvcmVhY3QtdGV4dCAiPT09dC5ub2RlVmFsdWUpe3RoaXMuX2Nsb3NpbmdDb21tZW50PXQ7YnJlYWt9dD10Lm5leHRTaWJsaW5nfXJldHVybiBlPVt0aGlzLl9ob3N0Tm9kZSx0aGlzLl9jbG9zaW5nQ29tbWVudF0sdGhpcy5fY29tbWVudE5vZGVzPWUsZX0sdW5tb3VudENvbXBvbmVudDpmdW5jdGlvbigpe3RoaXMuX2Nsb3NpbmdDb21tZW50PW51bGwsdGhpcy5fY29tbWVudE5vZGVzPW51bGwscy51bmNhY2hlTm9kZSh0aGlzKX19KSxlLmV4cG9ydHM9Y30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDM4KSxvPW4oNzkpLGE9bigyMDMpLGk9big3OCkscz17aW5pdGlhbGl6ZTppLGNsb3NlOmZ1bmN0aW9uKCl7cC5pc0JhdGNoaW5nVXBkYXRlcz0hMX19LHU9W3tpbml0aWFsaXplOmksY2xvc2U6by5mbHVzaEJhdGNoZWRVcGRhdGVzLmJpbmQobyl9LHNdO2Z1bmN0aW9uIGMoKXt0aGlzLnJlaW5pdGlhbGl6ZVRyYW5zYWN0aW9uKCl9cihjLnByb3RvdHlwZSxhLHtnZXRUcmFuc2FjdGlvbldyYXBwZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHV9fSk7dmFyIGw9bmV3IGMscD17aXNCYXRjaGluZ1VwZGF0ZXM6ITEsYmF0Y2hlZFVwZGF0ZXM6ZnVuY3Rpb24oZSx0LG4scixvLGEpe3ZhciBpPXAuaXNCYXRjaGluZ1VwZGF0ZXM7cmV0dXJuIHAuaXNCYXRjaGluZ1VwZGF0ZXM9ITAsaT9lKHQsbixyLG8sYSk6bC5wZXJmb3JtKGUsbnVsbCx0LG4scixvLGEpfX07ZS5leHBvcnRzPXB9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigzOCksbz1uKDQ4MiksYT1uKDU3KSxpPW4oMTIyKSxzPW4oNDUpLHU9big3OSksYz1uKDI2MyksbD1uKDk2Mik7ZnVuY3Rpb24gcChlKXtmb3IoO2UuX2hvc3RQYXJlbnQ7KWU9ZS5faG9zdFBhcmVudDt2YXIgdD1zLmdldE5vZGVGcm9tSW5zdGFuY2UoZSkucGFyZW50Tm9kZTtyZXR1cm4gcy5nZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSh0KX1mdW5jdGlvbiBmKGUsdCl7dGhpcy50b3BMZXZlbFR5cGU9ZSx0aGlzLm5hdGl2ZUV2ZW50PXQsdGhpcy5hbmNlc3RvcnM9W119ZnVuY3Rpb24gaChlKXt2YXIgdD1jKGUubmF0aXZlRXZlbnQpLG49cy5nZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSh0KSxyPW47ZG97ZS5hbmNlc3RvcnMucHVzaChyKSxyPXImJnAocil9d2hpbGUocik7Zm9yKHZhciBvPTA7bzxlLmFuY2VzdG9ycy5sZW5ndGg7bysrKW49ZS5hbmNlc3RvcnNbb10sbS5faGFuZGxlVG9wTGV2ZWwoZS50b3BMZXZlbFR5cGUsbixlLm5hdGl2ZUV2ZW50LGMoZS5uYXRpdmVFdmVudCkpfWZ1bmN0aW9uIGQoZSl7ZShsKHdpbmRvdykpfXIoZi5wcm90b3R5cGUse2Rlc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLnRvcExldmVsVHlwZT1udWxsLHRoaXMubmF0aXZlRXZlbnQ9bnVsbCx0aGlzLmFuY2VzdG9ycy5sZW5ndGg9MH19KSxpLmFkZFBvb2xpbmdUbyhmLGkudHdvQXJndW1lbnRQb29sZXIpO3ZhciBtPXtfZW5hYmxlZDohMCxfaGFuZGxlVG9wTGV2ZWw6bnVsbCxXSU5ET1dfSEFORExFOmEuY2FuVXNlRE9NP3dpbmRvdzpudWxsLHNldEhhbmRsZVRvcExldmVsOmZ1bmN0aW9uKGUpe20uX2hhbmRsZVRvcExldmVsPWV9LHNldEVuYWJsZWQ6ZnVuY3Rpb24oZSl7bS5fZW5hYmxlZD0hIWV9LGlzRW5hYmxlZDpmdW5jdGlvbigpe3JldHVybiBtLl9lbmFibGVkfSx0cmFwQnViYmxlZEV2ZW50OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj9vLmxpc3RlbihuLHQsbS5kaXNwYXRjaEV2ZW50LmJpbmQobnVsbCxlKSk6bnVsbH0sdHJhcENhcHR1cmVkRXZlbnQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuP28uY2FwdHVyZShuLHQsbS5kaXNwYXRjaEV2ZW50LmJpbmQobnVsbCxlKSk6bnVsbH0sbW9uaXRvclNjcm9sbFZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWQuYmluZChudWxsLGUpO28ubGlzdGVuKHdpbmRvdywic2Nyb2xsIix0KX0sZGlzcGF0Y2hFdmVudDpmdW5jdGlvbihlLHQpe2lmKG0uX2VuYWJsZWQpe3ZhciBuPWYuZ2V0UG9vbGVkKGUsdCk7dHJ5e3UuYmF0Y2hlZFVwZGF0ZXMoaCxuKX1maW5hbGx5e2YucmVsZWFzZShuKX19fX07ZS5leHBvcnRzPW19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBlLldpbmRvdyYmZSBpbnN0YW5jZW9mIGUuV2luZG93P3t4OmUucGFnZVhPZmZzZXR8fGUuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQseTplLnBhZ2VZT2Zmc2V0fHxlLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3B9Ont4OmUuc2Nyb2xsTGVmdCx5OmUuc2Nyb2xsVG9wfX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNDIpLG89bigxNjcpLGE9bigyNjEpLGk9bigyNzApLHM9big0NzgpLHU9bigyMDcpLGM9big0NzkpLGw9big3OSkscD17Q29tcG9uZW50OmkuaW5qZWN0aW9uLERPTVByb3BlcnR5OnIuaW5qZWN0aW9uLEVtcHR5Q29tcG9uZW50OnMuaW5qZWN0aW9uLEV2ZW50UGx1Z2luSHViOm8uaW5qZWN0aW9uLEV2ZW50UGx1Z2luVXRpbHM6YS5pbmplY3Rpb24sRXZlbnRFbWl0dGVyOnUuaW5qZWN0aW9uLEhvc3RDb21wb25lbnQ6Yy5pbmplY3Rpb24sVXBkYXRlczpsLmluamVjdGlvbn07ZS5leHBvcnRzPXB9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigzOCksbz1uKDQ2NiksYT1uKDEyMiksaT1uKDIwNykscz1uKDQ4MyksdT0obig3MiksbigyMDMpKSxjPW4oMjc0KSxsPVt7aW5pdGlhbGl6ZTpzLmdldFNlbGVjdGlvbkluZm9ybWF0aW9uLGNsb3NlOnMucmVzdG9yZVNlbGVjdGlvbn0se2luaXRpYWxpemU6ZnVuY3Rpb24oKXt2YXIgZT1pLmlzRW5hYmxlZCgpO3JldHVybiBpLnNldEVuYWJsZWQoITEpLGV9LGNsb3NlOmZ1bmN0aW9uKGUpe2kuc2V0RW5hYmxlZChlKX19LHtpbml0aWFsaXplOmZ1bmN0aW9uKCl7dGhpcy5yZWFjdE1vdW50UmVhZHkucmVzZXQoKX0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLnJlYWN0TW91bnRSZWFkeS5ub3RpZnlBbGwoKX19XTtmdW5jdGlvbiBwKGUpe3RoaXMucmVpbml0aWFsaXplVHJhbnNhY3Rpb24oKSx0aGlzLnJlbmRlclRvU3RhdGljTWFya3VwPSExLHRoaXMucmVhY3RNb3VudFJlYWR5PW8uZ2V0UG9vbGVkKG51bGwpLHRoaXMudXNlQ3JlYXRlRWxlbWVudD1lfXZhciBmPXtnZXRUcmFuc2FjdGlvbldyYXBwZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIGx9LGdldFJlYWN0TW91bnRSZWFkeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWN0TW91bnRSZWFkeX0sZ2V0VXBkYXRlUXVldWU6ZnVuY3Rpb24oKXtyZXR1cm4gY30sY2hlY2twb2ludDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJlYWN0TW91bnRSZWFkeS5jaGVja3BvaW50KCl9LHJvbGxiYWNrOmZ1bmN0aW9uKGUpe3RoaXMucmVhY3RNb3VudFJlYWR5LnJvbGxiYWNrKGUpfSxkZXN0cnVjdG9yOmZ1bmN0aW9uKCl7by5yZWxlYXNlKHRoaXMucmVhY3RNb3VudFJlYWR5KSx0aGlzLnJlYWN0TW91bnRSZWFkeT1udWxsfX07cihwLnByb3RvdHlwZSx1LGYpLGEuYWRkUG9vbGluZ1RvKHApLGUuZXhwb3J0cz1wfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNTcpLG89big5NjYpLGE9big0NjUpO2Z1bmN0aW9uIGkoZSx0LG4scil7cmV0dXJuIGU9PT1uJiZ0PT09cn12YXIgcz1yLmNhblVzZURPTSYmInNlbGVjdGlvbiJpbiBkb2N1bWVudCYmISgiZ2V0U2VsZWN0aW9uImluIHdpbmRvdyksdT17Z2V0T2Zmc2V0czpzP2Z1bmN0aW9uKGUpe3ZhciB0PWRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLG49dC50ZXh0Lmxlbmd0aCxyPXQuZHVwbGljYXRlKCk7ci5tb3ZlVG9FbGVtZW50VGV4dChlKSxyLnNldEVuZFBvaW50KCJFbmRUb1N0YXJ0Iix0KTt2YXIgbz1yLnRleHQubGVuZ3RoO3JldHVybntzdGFydDpvLGVuZDpvK259fTpmdW5jdGlvbihlKXt2YXIgdD13aW5kb3cuZ2V0U2VsZWN0aW9uJiZ3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7aWYoIXR8fDA9PT10LnJhbmdlQ291bnQpcmV0dXJuIG51bGw7dmFyIG49dC5hbmNob3JOb2RlLHI9dC5hbmNob3JPZmZzZXQsbz10LmZvY3VzTm9kZSxhPXQuZm9jdXNPZmZzZXQscz10LmdldFJhbmdlQXQoMCk7dHJ5e3Muc3RhcnRDb250YWluZXIubm9kZVR5cGUscy5lbmRDb250YWluZXIubm9kZVR5cGV9Y2F0Y2goZSl7cmV0dXJuIG51bGx9dmFyIHU9aSh0LmFuY2hvck5vZGUsdC5hbmNob3JPZmZzZXQsdC5mb2N1c05vZGUsdC5mb2N1c09mZnNldCk/MDpzLnRvU3RyaW5nKCkubGVuZ3RoLGM9cy5jbG9uZVJhbmdlKCk7Yy5zZWxlY3ROb2RlQ29udGVudHMoZSksYy5zZXRFbmQocy5zdGFydENvbnRhaW5lcixzLnN0YXJ0T2Zmc2V0KTt2YXIgbD1pKGMuc3RhcnRDb250YWluZXIsYy5zdGFydE9mZnNldCxjLmVuZENvbnRhaW5lcixjLmVuZE9mZnNldCk/MDpjLnRvU3RyaW5nKCkubGVuZ3RoLHA9bCt1LGY9ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtmLnNldFN0YXJ0KG4sciksZi5zZXRFbmQobyxhKTt2YXIgaD1mLmNvbGxhcHNlZDtyZXR1cm57c3RhcnQ6aD9wOmwsZW5kOmg/bDpwfX0sc2V0T2Zmc2V0czpzP2Z1bmN0aW9uKGUsdCl7dmFyIG4scixvPWRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpLmR1cGxpY2F0ZSgpO3ZvaWQgMD09PXQuZW5kP3I9bj10LnN0YXJ0OnQuc3RhcnQ+dC5lbmQ/KG49dC5lbmQscj10LnN0YXJ0KToobj10LnN0YXJ0LHI9dC5lbmQpLG8ubW92ZVRvRWxlbWVudFRleHQoZSksby5tb3ZlU3RhcnQoImNoYXJhY3RlciIsbiksby5zZXRFbmRQb2ludCgiRW5kVG9TdGFydCIsbyksby5tb3ZlRW5kKCJjaGFyYWN0ZXIiLHItbiksby5zZWxlY3QoKX06ZnVuY3Rpb24oZSx0KXtpZih3aW5kb3cuZ2V0U2VsZWN0aW9uKXt2YXIgbj13aW5kb3cuZ2V0U2VsZWN0aW9uKCkscj1lW2EoKV0ubGVuZ3RoLGk9TWF0aC5taW4odC5zdGFydCxyKSxzPXZvaWQgMD09PXQuZW5kP2k6TWF0aC5taW4odC5lbmQscik7aWYoIW4uZXh0ZW5kJiZpPnMpe3ZhciB1PXM7cz1pLGk9dX12YXIgYz1vKGUsaSksbD1vKGUscyk7aWYoYyYmbCl7dmFyIHA9ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtwLnNldFN0YXJ0KGMubm9kZSxjLm9mZnNldCksbi5yZW1vdmVBbGxSYW5nZXMoKSxpPnM/KG4uYWRkUmFuZ2UocCksbi5leHRlbmQobC5ub2RlLGwub2Zmc2V0KSk6KHAuc2V0RW5kKGwubm9kZSxsLm9mZnNldCksbi5hZGRSYW5nZShwKSl9fX19O2UuZXhwb3J0cz11fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7Zm9yKDtlJiZlLmZpcnN0Q2hpbGQ7KWU9ZS5maXJzdENoaWxkO3JldHVybiBlfWZ1bmN0aW9uIG8oZSl7Zm9yKDtlOyl7aWYoZS5uZXh0U2libGluZylyZXR1cm4gZS5uZXh0U2libGluZztlPWUucGFyZW50Tm9kZX19ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXIoZSksYT0wLGk9MDtuOyl7aWYoMz09PW4ubm9kZVR5cGUpe2lmKGk9YStuLnRleHRDb250ZW50Lmxlbmd0aCxhPD10JiZpPj10KXJldHVybntub2RlOm4sb2Zmc2V0OnQtYX07YT1pfW49cihvKG4pKX19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oOTY4KTtlLmV4cG9ydHM9ZnVuY3Rpb24gZSh0LG4pe3JldHVybiEoIXR8fCFuKSYmKHQ9PT1ufHwhcih0KSYmKHIobik/ZSh0LG4ucGFyZW50Tm9kZSk6ImNvbnRhaW5zImluIHQ/dC5jb250YWlucyhuKTohIXQuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJiEhKDE2JnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24obikpKSl9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oOTY5KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHIoZSkmJjM9PWUubm9kZVR5cGV9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD0oZT9lLm93bmVyRG9jdW1lbnR8fGU6ZG9jdW1lbnQpLmRlZmF1bHRWaWV3fHx3aW5kb3c7cmV0dXJuISghZXx8ISgiZnVuY3Rpb24iPT10eXBlb2YgdC5Ob2RlP2UgaW5zdGFuY2VvZiB0Lk5vZGU6Im9iamVjdCI9PXR5cGVvZiBlJiYibnVtYmVyIj09dHlwZW9mIGUubm9kZVR5cGUmJiJzdHJpbmciPT10eXBlb2YgZS5ub2RlTmFtZSkpfX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsbz0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIixhPXthY2NlbnRIZWlnaHQ6ImFjY2VudC1oZWlnaHQiLGFjY3VtdWxhdGU6MCxhZGRpdGl2ZTowLGFsaWdubWVudEJhc2VsaW5lOiJhbGlnbm1lbnQtYmFzZWxpbmUiLGFsbG93UmVvcmRlcjoiYWxsb3dSZW9yZGVyIixhbHBoYWJldGljOjAsYW1wbGl0dWRlOjAsYXJhYmljRm9ybToiYXJhYmljLWZvcm0iLGFzY2VudDowLGF0dHJpYnV0ZU5hbWU6ImF0dHJpYnV0ZU5hbWUiLGF0dHJpYnV0ZVR5cGU6ImF0dHJpYnV0ZVR5cGUiLGF1dG9SZXZlcnNlOiJhdXRvUmV2ZXJzZSIsYXppbXV0aDowLGJhc2VGcmVxdWVuY3k6ImJhc2VGcmVxdWVuY3kiLGJhc2VQcm9maWxlOiJiYXNlUHJvZmlsZSIsYmFzZWxpbmVTaGlmdDoiYmFzZWxpbmUtc2hpZnQiLGJib3g6MCxiZWdpbjowLGJpYXM6MCxieTowLGNhbGNNb2RlOiJjYWxjTW9kZSIsY2FwSGVpZ2h0OiJjYXAtaGVpZ2h0IixjbGlwOjAsY2xpcFBhdGg6ImNsaXAtcGF0aCIsY2xpcFJ1bGU6ImNsaXAtcnVsZSIsY2xpcFBhdGhVbml0czoiY2xpcFBhdGhVbml0cyIsY29sb3JJbnRlcnBvbGF0aW9uOiJjb2xvci1pbnRlcnBvbGF0aW9uIixjb2xvckludGVycG9sYXRpb25GaWx0ZXJzOiJjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMiLGNvbG9yUHJvZmlsZToiY29sb3ItcHJvZmlsZSIsY29sb3JSZW5kZXJpbmc6ImNvbG9yLXJlbmRlcmluZyIsY29udGVudFNjcmlwdFR5cGU6ImNvbnRlbnRTY3JpcHRUeXBlIixjb250ZW50U3R5bGVUeXBlOiJjb250ZW50U3R5bGVUeXBlIixjdXJzb3I6MCxjeDowLGN5OjAsZDowLGRlY2VsZXJhdGU6MCxkZXNjZW50OjAsZGlmZnVzZUNvbnN0YW50OiJkaWZmdXNlQ29uc3RhbnQiLGRpcmVjdGlvbjowLGRpc3BsYXk6MCxkaXZpc29yOjAsZG9taW5hbnRCYXNlbGluZToiZG9taW5hbnQtYmFzZWxpbmUiLGR1cjowLGR4OjAsZHk6MCxlZGdlTW9kZToiZWRnZU1vZGUiLGVsZXZhdGlvbjowLGVuYWJsZUJhY2tncm91bmQ6ImVuYWJsZS1iYWNrZ3JvdW5kIixlbmQ6MCxleHBvbmVudDowLGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQ6ImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQiLGZpbGw6MCxmaWxsT3BhY2l0eToiZmlsbC1vcGFjaXR5IixmaWxsUnVsZToiZmlsbC1ydWxlIixmaWx0ZXI6MCxmaWx0ZXJSZXM6ImZpbHRlclJlcyIsZmlsdGVyVW5pdHM6ImZpbHRlclVuaXRzIixmbG9vZENvbG9yOiJmbG9vZC1jb2xvciIsZmxvb2RPcGFjaXR5OiJmbG9vZC1vcGFjaXR5Iixmb2N1c2FibGU6MCxmb250RmFtaWx5OiJmb250LWZhbWlseSIsZm9udFNpemU6ImZvbnQtc2l6ZSIsZm9udFNpemVBZGp1c3Q6ImZvbnQtc2l6ZS1hZGp1c3QiLGZvbnRTdHJldGNoOiJmb250LXN0cmV0Y2giLGZvbnRTdHlsZToiZm9udC1zdHlsZSIsZm9udFZhcmlhbnQ6ImZvbnQtdmFyaWFudCIsZm9udFdlaWdodDoiZm9udC13ZWlnaHQiLGZvcm1hdDowLGZyb206MCxmeDowLGZ5OjAsZzE6MCxnMjowLGdseXBoTmFtZToiZ2x5cGgtbmFtZSIsZ2x5cGhPcmllbnRhdGlvbkhvcml6b250YWw6ImdseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwiLGdseXBoT3JpZW50YXRpb25WZXJ0aWNhbDoiZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwiLGdseXBoUmVmOiJnbHlwaFJlZiIsZ3JhZGllbnRUcmFuc2Zvcm06ImdyYWRpZW50VHJhbnNmb3JtIixncmFkaWVudFVuaXRzOiJncmFkaWVudFVuaXRzIixoYW5naW5nOjAsaG9yaXpBZHZYOiJob3Jpei1hZHYteCIsaG9yaXpPcmlnaW5YOiJob3Jpei1vcmlnaW4teCIsaWRlb2dyYXBoaWM6MCxpbWFnZVJlbmRlcmluZzoiaW1hZ2UtcmVuZGVyaW5nIixpbjowLGluMjowLGludGVyY2VwdDowLGs6MCxrMTowLGsyOjAsazM6MCxrNDowLGtlcm5lbE1hdHJpeDoia2VybmVsTWF0cml4IixrZXJuZWxVbml0TGVuZ3RoOiJrZXJuZWxVbml0TGVuZ3RoIixrZXJuaW5nOjAsa2V5UG9pbnRzOiJrZXlQb2ludHMiLGtleVNwbGluZXM6ImtleVNwbGluZXMiLGtleVRpbWVzOiJrZXlUaW1lcyIsbGVuZ3RoQWRqdXN0OiJsZW5ndGhBZGp1c3QiLGxldHRlclNwYWNpbmc6ImxldHRlci1zcGFjaW5nIixsaWdodGluZ0NvbG9yOiJsaWdodGluZy1jb2xvciIsbGltaXRpbmdDb25lQW5nbGU6ImxpbWl0aW5nQ29uZUFuZ2xlIixsb2NhbDowLG1hcmtlckVuZDoibWFya2VyLWVuZCIsbWFya2VyTWlkOiJtYXJrZXItbWlkIixtYXJrZXJTdGFydDoibWFya2VyLXN0YXJ0IixtYXJrZXJIZWlnaHQ6Im1hcmtlckhlaWdodCIsbWFya2VyVW5pdHM6Im1hcmtlclVuaXRzIixtYXJrZXJXaWR0aDoibWFya2VyV2lkdGgiLG1hc2s6MCxtYXNrQ29udGVudFVuaXRzOiJtYXNrQ29udGVudFVuaXRzIixtYXNrVW5pdHM6Im1hc2tVbml0cyIsbWF0aGVtYXRpY2FsOjAsbW9kZTowLG51bU9jdGF2ZXM6Im51bU9jdGF2ZXMiLG9mZnNldDowLG9wYWNpdHk6MCxvcGVyYXRvcjowLG9yZGVyOjAsb3JpZW50OjAsb3JpZW50YXRpb246MCxvcmlnaW46MCxvdmVyZmxvdzowLG92ZXJsaW5lUG9zaXRpb246Im92ZXJsaW5lLXBvc2l0aW9uIixvdmVybGluZVRoaWNrbmVzczoib3ZlcmxpbmUtdGhpY2tuZXNzIixwYWludE9yZGVyOiJwYWludC1vcmRlciIscGFub3NlMToicGFub3NlLTEiLHBhdGhMZW5ndGg6InBhdGhMZW5ndGgiLHBhdHRlcm5Db250ZW50VW5pdHM6InBhdHRlcm5Db250ZW50VW5pdHMiLHBhdHRlcm5UcmFuc2Zvcm06InBhdHRlcm5UcmFuc2Zvcm0iLHBhdHRlcm5Vbml0czoicGF0dGVyblVuaXRzIixwb2ludGVyRXZlbnRzOiJwb2ludGVyLWV2ZW50cyIscG9pbnRzOjAscG9pbnRzQXRYOiJwb2ludHNBdFgiLHBvaW50c0F0WToicG9pbnRzQXRZIixwb2ludHNBdFo6InBvaW50c0F0WiIscHJlc2VydmVBbHBoYToicHJlc2VydmVBbHBoYSIscHJlc2VydmVBc3BlY3RSYXRpbzoicHJlc2VydmVBc3BlY3RSYXRpbyIscHJpbWl0aXZlVW5pdHM6InByaW1pdGl2ZVVuaXRzIixyOjAscmFkaXVzOjAscmVmWDoicmVmWCIscmVmWToicmVmWSIscmVuZGVyaW5nSW50ZW50OiJyZW5kZXJpbmctaW50ZW50IixyZXBlYXRDb3VudDoicmVwZWF0Q291bnQiLHJlcGVhdER1cjoicmVwZWF0RHVyIixyZXF1aXJlZEV4dGVuc2lvbnM6InJlcXVpcmVkRXh0ZW5zaW9ucyIscmVxdWlyZWRGZWF0dXJlczoicmVxdWlyZWRGZWF0dXJlcyIscmVzdGFydDowLHJlc3VsdDowLHJvdGF0ZTowLHJ4OjAscnk6MCxzY2FsZTowLHNlZWQ6MCxzaGFwZVJlbmRlcmluZzoic2hhcGUtcmVuZGVyaW5nIixzbG9wZTowLHNwYWNpbmc6MCxzcGVjdWxhckNvbnN0YW50OiJzcGVjdWxhckNvbnN0YW50IixzcGVjdWxhckV4cG9uZW50OiJzcGVjdWxhckV4cG9uZW50IixzcGVlZDowLHNwcmVhZE1ldGhvZDoic3ByZWFkTWV0aG9kIixzdGFydE9mZnNldDoic3RhcnRPZmZzZXQiLHN0ZERldmlhdGlvbjoic3RkRGV2aWF0aW9uIixzdGVtaDowLHN0ZW12OjAsc3RpdGNoVGlsZXM6InN0aXRjaFRpbGVzIixzdG9wQ29sb3I6InN0b3AtY29sb3IiLHN0b3BPcGFjaXR5OiJzdG9wLW9wYWNpdHkiLHN0cmlrZXRocm91Z2hQb3NpdGlvbjoic3RyaWtldGhyb3VnaC1wb3NpdGlvbiIsc3RyaWtldGhyb3VnaFRoaWNrbmVzczoic3RyaWtldGhyb3VnaC10aGlja25lc3MiLHN0cmluZzowLHN0cm9rZTowLHN0cm9rZURhc2hhcnJheToic3Ryb2tlLWRhc2hhcnJheSIsc3Ryb2tlRGFzaG9mZnNldDoic3Ryb2tlLWRhc2hvZmZzZXQiLHN0cm9rZUxpbmVjYXA6InN0cm9rZS1saW5lY2FwIixzdHJva2VMaW5lam9pbjoic3Ryb2tlLWxpbmVqb2luIixzdHJva2VNaXRlcmxpbWl0OiJzdHJva2UtbWl0ZXJsaW1pdCIsc3Ryb2tlT3BhY2l0eToic3Ryb2tlLW9wYWNpdHkiLHN0cm9rZVdpZHRoOiJzdHJva2Utd2lkdGgiLHN1cmZhY2VTY2FsZToic3VyZmFjZVNjYWxlIixzeXN0ZW1MYW5ndWFnZToic3lzdGVtTGFuZ3VhZ2UiLHRhYmxlVmFsdWVzOiJ0YWJsZVZhbHVlcyIsdGFyZ2V0WDoidGFyZ2V0WCIsdGFyZ2V0WToidGFyZ2V0WSIsdGV4dEFuY2hvcjoidGV4dC1hbmNob3IiLHRleHREZWNvcmF0aW9uOiJ0ZXh0LWRlY29yYXRpb24iLHRleHRSZW5kZXJpbmc6InRleHQtcmVuZGVyaW5nIix0ZXh0TGVuZ3RoOiJ0ZXh0TGVuZ3RoIix0bzowLHRyYW5zZm9ybTowLHUxOjAsdTI6MCx1bmRlcmxpbmVQb3NpdGlvbjoidW5kZXJsaW5lLXBvc2l0aW9uIix1bmRlcmxpbmVUaGlja25lc3M6InVuZGVybGluZS10aGlja25lc3MiLHVuaWNvZGU6MCx1bmljb2RlQmlkaToidW5pY29kZS1iaWRpIix1bmljb2RlUmFuZ2U6InVuaWNvZGUtcmFuZ2UiLHVuaXRzUGVyRW06InVuaXRzLXBlci1lbSIsdkFscGhhYmV0aWM6InYtYWxwaGFiZXRpYyIsdkhhbmdpbmc6InYtaGFuZ2luZyIsdklkZW9ncmFwaGljOiJ2LWlkZW9ncmFwaGljIix2TWF0aGVtYXRpY2FsOiJ2LW1hdGhlbWF0aWNhbCIsdmFsdWVzOjAsdmVjdG9yRWZmZWN0OiJ2ZWN0b3ItZWZmZWN0Iix2ZXJzaW9uOjAsdmVydEFkdlk6InZlcnQtYWR2LXkiLHZlcnRPcmlnaW5YOiJ2ZXJ0LW9yaWdpbi14Iix2ZXJ0T3JpZ2luWToidmVydC1vcmlnaW4teSIsdmlld0JveDoidmlld0JveCIsdmlld1RhcmdldDoidmlld1RhcmdldCIsdmlzaWJpbGl0eTowLHdpZHRoczowLHdvcmRTcGFjaW5nOiJ3b3JkLXNwYWNpbmciLHdyaXRpbmdNb2RlOiJ3cml0aW5nLW1vZGUiLHg6MCx4SGVpZ2h0OiJ4LWhlaWdodCIseDE6MCx4MjowLHhDaGFubmVsU2VsZWN0b3I6InhDaGFubmVsU2VsZWN0b3IiLHhsaW5rQWN0dWF0ZToieGxpbms6YWN0dWF0ZSIseGxpbmtBcmNyb2xlOiJ4bGluazphcmNyb2xlIix4bGlua0hyZWY6InhsaW5rOmhyZWYiLHhsaW5rUm9sZToieGxpbms6cm9sZSIseGxpbmtTaG93OiJ4bGluazpzaG93Iix4bGlua1RpdGxlOiJ4bGluazp0aXRsZSIseGxpbmtUeXBlOiJ4bGluazp0eXBlIix4bWxCYXNlOiJ4bWw6YmFzZSIseG1sbnM6MCx4bWxuc1hsaW5rOiJ4bWxuczp4bGluayIseG1sTGFuZzoieG1sOmxhbmciLHhtbFNwYWNlOiJ4bWw6c3BhY2UiLHk6MCx5MTowLHkyOjAseUNoYW5uZWxTZWxlY3RvcjoieUNoYW5uZWxTZWxlY3RvciIsejowLHpvb21BbmRQYW46Inpvb21BbmRQYW4ifSxpPXtQcm9wZXJ0aWVzOnt9LERPTUF0dHJpYnV0ZU5hbWVzcGFjZXM6e3hsaW5rQWN0dWF0ZTpyLHhsaW5rQXJjcm9sZTpyLHhsaW5rSHJlZjpyLHhsaW5rUm9sZTpyLHhsaW5rU2hvdzpyLHhsaW5rVGl0bGU6cix4bGlua1R5cGU6cix4bWxCYXNlOm8seG1sTGFuZzpvLHhtbFNwYWNlOm99LERPTUF0dHJpYnV0ZU5hbWVzOnt9fTtPYmplY3Qua2V5cyhhKS5mb3JFYWNoKChmdW5jdGlvbihlKXtpLlByb3BlcnRpZXNbZV09MCxhW2VdJiYoaS5ET01BdHRyaWJ1dGVOYW1lc1tlXT1hW2VdKX0pKSxlLmV4cG9ydHM9aX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE2Niksbz1uKDU3KSxhPW4oNDUpLGk9big0ODMpLHM9big5MCksdT1uKDQ4NCksYz1uKDQ2OSksbD1uKDI3MSkscD1vLmNhblVzZURPTSYmImRvY3VtZW50TW9kZSJpbiBkb2N1bWVudCYmZG9jdW1lbnQuZG9jdW1lbnRNb2RlPD0xMSxmPXtzZWxlY3Q6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOiJvblNlbGVjdCIsY2FwdHVyZWQ6Im9uU2VsZWN0Q2FwdHVyZSJ9LGRlcGVuZGVuY2llczpbInRvcEJsdXIiLCJ0b3BDb250ZXh0TWVudSIsInRvcEZvY3VzIiwidG9wS2V5RG93biIsInRvcEtleVVwIiwidG9wTW91c2VEb3duIiwidG9wTW91c2VVcCIsInRvcFNlbGVjdGlvbkNoYW5nZSJdfX0saD1udWxsLGQ9bnVsbCxtPW51bGwsdj0hMSxnPSExO2Z1bmN0aW9uIHkoZSx0KXtpZih2fHxudWxsPT1ofHxoIT09dSgpKXJldHVybiBudWxsO3ZhciBuPWZ1bmN0aW9uKGUpe2lmKCJzZWxlY3Rpb25TdGFydCJpbiBlJiZpLmhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhlKSlyZXR1cm57c3RhcnQ6ZS5zZWxlY3Rpb25TdGFydCxlbmQ6ZS5zZWxlY3Rpb25FbmR9O2lmKHdpbmRvdy5nZXRTZWxlY3Rpb24pe3ZhciB0PXdpbmRvdy5nZXRTZWxlY3Rpb24oKTtyZXR1cm57YW5jaG9yTm9kZTp0LmFuY2hvck5vZGUsYW5jaG9yT2Zmc2V0OnQuYW5jaG9yT2Zmc2V0LGZvY3VzTm9kZTp0LmZvY3VzTm9kZSxmb2N1c09mZnNldDp0LmZvY3VzT2Zmc2V0fX1pZihkb2N1bWVudC5zZWxlY3Rpb24pe3ZhciBuPWRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpO3JldHVybntwYXJlbnRFbGVtZW50Om4ucGFyZW50RWxlbWVudCgpLHRleHQ6bi50ZXh0LHRvcDpuLmJvdW5kaW5nVG9wLGxlZnQ6bi5ib3VuZGluZ0xlZnR9fX0oaCk7aWYoIW18fCFsKG0sbikpe209bjt2YXIgbz1zLmdldFBvb2xlZChmLnNlbGVjdCxkLGUsdCk7cmV0dXJuIG8udHlwZT0ic2VsZWN0IixvLnRhcmdldD1oLHIuYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcyhvKSxvfXJldHVybiBudWxsfXZhciBiPXtldmVudFR5cGVzOmYsZXh0cmFjdEV2ZW50czpmdW5jdGlvbihlLHQsbixyKXtpZighZylyZXR1cm4gbnVsbDt2YXIgbz10P2EuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0KTp3aW5kb3c7c3dpdGNoKGUpe2Nhc2UidG9wRm9jdXMiOihjKG8pfHwidHJ1ZSI9PT1vLmNvbnRlbnRFZGl0YWJsZSkmJihoPW8sZD10LG09bnVsbCk7YnJlYWs7Y2FzZSJ0b3BCbHVyIjpoPW51bGwsZD1udWxsLG09bnVsbDticmVhaztjYXNlInRvcE1vdXNlRG93biI6dj0hMDticmVhaztjYXNlInRvcENvbnRleHRNZW51IjpjYXNlInRvcE1vdXNlVXAiOnJldHVybiB2PSExLHkobixyKTtjYXNlInRvcFNlbGVjdGlvbkNoYW5nZSI6aWYocClicmVhaztjYXNlInRvcEtleURvd24iOmNhc2UidG9wS2V5VXAiOnJldHVybiB5KG4scil9cmV0dXJuIG51bGx9LGRpZFB1dExpc3RlbmVyOmZ1bmN0aW9uKGUsdCxuKXsib25TZWxlY3QiPT09dCYmKGc9ITApfX07ZS5leHBvcnRzPWJ9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigzMCksbz1uKDQ4MiksYT1uKDE2NiksaT1uKDQ1KSxzPW4oOTczKSx1PW4oOTc0KSxjPW4oOTApLGw9big5NzUpLHA9big5NzYpLGY9bigyMDQpLGg9big5NzgpLGQ9big5NzkpLG09big5ODApLHY9bigxNjgpLGc9big5ODEpLHk9big3OCksYj1uKDI3NiksXz0obigyNSkse30pLHc9e307WyJhYm9ydCIsImFuaW1hdGlvbkVuZCIsImFuaW1hdGlvbkl0ZXJhdGlvbiIsImFuaW1hdGlvblN0YXJ0IiwiYmx1ciIsImNhblBsYXkiLCJjYW5QbGF5VGhyb3VnaCIsImNsaWNrIiwiY29udGV4dE1lbnUiLCJjb3B5IiwiY3V0IiwiZG91YmxlQ2xpY2siLCJkcmFnIiwiZHJhZ0VuZCIsImRyYWdFbnRlciIsImRyYWdFeGl0IiwiZHJhZ0xlYXZlIiwiZHJhZ092ZXIiLCJkcmFnU3RhcnQiLCJkcm9wIiwiZHVyYXRpb25DaGFuZ2UiLCJlbXB0aWVkIiwiZW5jcnlwdGVkIiwiZW5kZWQiLCJlcnJvciIsImZvY3VzIiwiaW5wdXQiLCJpbnZhbGlkIiwia2V5RG93biIsImtleVByZXNzIiwia2V5VXAiLCJsb2FkIiwibG9hZGVkRGF0YSIsImxvYWRlZE1ldGFkYXRhIiwibG9hZFN0YXJ0IiwibW91c2VEb3duIiwibW91c2VNb3ZlIiwibW91c2VPdXQiLCJtb3VzZU92ZXIiLCJtb3VzZVVwIiwicGFzdGUiLCJwYXVzZSIsInBsYXkiLCJwbGF5aW5nIiwicHJvZ3Jlc3MiLCJyYXRlQ2hhbmdlIiwicmVzZXQiLCJzY3JvbGwiLCJzZWVrZWQiLCJzZWVraW5nIiwic3RhbGxlZCIsInN1Ym1pdCIsInN1c3BlbmQiLCJ0aW1lVXBkYXRlIiwidG91Y2hDYW5jZWwiLCJ0b3VjaEVuZCIsInRvdWNoTW92ZSIsInRvdWNoU3RhcnQiLCJ0cmFuc2l0aW9uRW5kIiwidm9sdW1lQ2hhbmdlIiwid2FpdGluZyIsIndoZWVsIl0uZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSksbj0ib24iK3Qscj0idG9wIit0LG89e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOm4sY2FwdHVyZWQ6bisiQ2FwdHVyZSJ9LGRlcGVuZGVuY2llczpbcl19O19bZV09byx3W3JdPW99KSk7dmFyIHg9e307ZnVuY3Rpb24gRShlKXtyZXR1cm4iLiIrZS5fcm9vdE5vZGVJRH1mdW5jdGlvbiBTKGUpe3JldHVybiJidXR0b24iPT09ZXx8ImlucHV0Ij09PWV8fCJzZWxlY3QiPT09ZXx8InRleHRhcmVhIj09PWV9dmFyIEM9e2V2ZW50VHlwZXM6XyxleHRyYWN0RXZlbnRzOmZ1bmN0aW9uKGUsdCxuLG8pe3ZhciBpLHk9d1tlXTtpZigheSlyZXR1cm4gbnVsbDtzd2l0Y2goZSl7Y2FzZSJ0b3BBYm9ydCI6Y2FzZSJ0b3BDYW5QbGF5IjpjYXNlInRvcENhblBsYXlUaHJvdWdoIjpjYXNlInRvcER1cmF0aW9uQ2hhbmdlIjpjYXNlInRvcEVtcHRpZWQiOmNhc2UidG9wRW5jcnlwdGVkIjpjYXNlInRvcEVuZGVkIjpjYXNlInRvcEVycm9yIjpjYXNlInRvcElucHV0IjpjYXNlInRvcEludmFsaWQiOmNhc2UidG9wTG9hZCI6Y2FzZSJ0b3BMb2FkZWREYXRhIjpjYXNlInRvcExvYWRlZE1ldGFkYXRhIjpjYXNlInRvcExvYWRTdGFydCI6Y2FzZSJ0b3BQYXVzZSI6Y2FzZSJ0b3BQbGF5IjpjYXNlInRvcFBsYXlpbmciOmNhc2UidG9wUHJvZ3Jlc3MiOmNhc2UidG9wUmF0ZUNoYW5nZSI6Y2FzZSJ0b3BSZXNldCI6Y2FzZSJ0b3BTZWVrZWQiOmNhc2UidG9wU2Vla2luZyI6Y2FzZSJ0b3BTdGFsbGVkIjpjYXNlInRvcFN1Ym1pdCI6Y2FzZSJ0b3BTdXNwZW5kIjpjYXNlInRvcFRpbWVVcGRhdGUiOmNhc2UidG9wVm9sdW1lQ2hhbmdlIjpjYXNlInRvcFdhaXRpbmciOmk9YzticmVhaztjYXNlInRvcEtleVByZXNzIjppZigwPT09YihuKSlyZXR1cm4gbnVsbDtjYXNlInRvcEtleURvd24iOmNhc2UidG9wS2V5VXAiOmk9cDticmVhaztjYXNlInRvcEJsdXIiOmNhc2UidG9wRm9jdXMiOmk9bDticmVhaztjYXNlInRvcENsaWNrIjppZigyPT09bi5idXR0b24pcmV0dXJuIG51bGw7Y2FzZSJ0b3BEb3VibGVDbGljayI6Y2FzZSJ0b3BNb3VzZURvd24iOmNhc2UidG9wTW91c2VNb3ZlIjpjYXNlInRvcE1vdXNlVXAiOmNhc2UidG9wTW91c2VPdXQiOmNhc2UidG9wTW91c2VPdmVyIjpjYXNlInRvcENvbnRleHRNZW51IjppPWY7YnJlYWs7Y2FzZSJ0b3BEcmFnIjpjYXNlInRvcERyYWdFbmQiOmNhc2UidG9wRHJhZ0VudGVyIjpjYXNlInRvcERyYWdFeGl0IjpjYXNlInRvcERyYWdMZWF2ZSI6Y2FzZSJ0b3BEcmFnT3ZlciI6Y2FzZSJ0b3BEcmFnU3RhcnQiOmNhc2UidG9wRHJvcCI6aT1oO2JyZWFrO2Nhc2UidG9wVG91Y2hDYW5jZWwiOmNhc2UidG9wVG91Y2hFbmQiOmNhc2UidG9wVG91Y2hNb3ZlIjpjYXNlInRvcFRvdWNoU3RhcnQiOmk9ZDticmVhaztjYXNlInRvcEFuaW1hdGlvbkVuZCI6Y2FzZSJ0b3BBbmltYXRpb25JdGVyYXRpb24iOmNhc2UidG9wQW5pbWF0aW9uU3RhcnQiOmk9czticmVhaztjYXNlInRvcFRyYW5zaXRpb25FbmQiOmk9bTticmVhaztjYXNlInRvcFNjcm9sbCI6aT12O2JyZWFrO2Nhc2UidG9wV2hlZWwiOmk9ZzticmVhaztjYXNlInRvcENvcHkiOmNhc2UidG9wQ3V0IjpjYXNlInRvcFBhc3RlIjppPXV9aXx8cigiODYiLGUpO3ZhciBfPWkuZ2V0UG9vbGVkKHksdCxuLG8pO3JldHVybiBhLmFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMoXyksX30sZGlkUHV0TGlzdGVuZXI6ZnVuY3Rpb24oZSx0LG4pe2lmKCJvbkNsaWNrIj09PXQmJiFTKGUuX3RhZykpe3ZhciByPUUoZSksYT1pLmdldE5vZGVGcm9tSW5zdGFuY2UoZSk7eFtyXXx8KHhbcl09by5saXN0ZW4oYSwiY2xpY2siLHkpKX19LHdpbGxEZWxldGVMaXN0ZW5lcjpmdW5jdGlvbihlLHQpe2lmKCJvbkNsaWNrIj09PXQmJiFTKGUuX3RhZykpe3ZhciBuPUUoZSk7eFtuXS5yZW1vdmUoKSxkZWxldGUgeFtuXX19fTtlLmV4cG9ydHM9Q30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDkwKTtmdW5jdGlvbiBvKGUsdCxuLG8pe3JldHVybiByLmNhbGwodGhpcyxlLHQsbixvKX1yLmF1Z21lbnRDbGFzcyhvLHthbmltYXRpb25OYW1lOm51bGwsZWxhcHNlZFRpbWU6bnVsbCxwc2V1ZG9FbGVtZW50Om51bGx9KSxlLmV4cG9ydHM9b30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDkwKSxvPXtjbGlwYm9hcmREYXRhOmZ1bmN0aW9uKGUpe3JldHVybiJjbGlwYm9hcmREYXRhImluIGU/ZS5jbGlwYm9hcmREYXRhOndpbmRvdy5jbGlwYm9hcmREYXRhfX07ZnVuY3Rpb24gYShlLHQsbixvKXtyZXR1cm4gci5jYWxsKHRoaXMsZSx0LG4sbyl9ci5hdWdtZW50Q2xhc3MoYSxvKSxlLmV4cG9ydHM9YX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE2OCk7ZnVuY3Rpb24gbyhlLHQsbixvKXtyZXR1cm4gci5jYWxsKHRoaXMsZSx0LG4sbyl9ci5hdWdtZW50Q2xhc3Mobyx7cmVsYXRlZFRhcmdldDpudWxsfSksZS5leHBvcnRzPW99LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNjgpLG89bigyNzYpLGE9e2tleTpuKDk3NyksbG9jYXRpb246bnVsbCxjdHJsS2V5Om51bGwsc2hpZnRLZXk6bnVsbCxhbHRLZXk6bnVsbCxtZXRhS2V5Om51bGwscmVwZWF0Om51bGwsbG9jYWxlOm51bGwsZ2V0TW9kaWZpZXJTdGF0ZTpuKDI2NSksY2hhckNvZGU6ZnVuY3Rpb24oZSl7cmV0dXJuImtleXByZXNzIj09PWUudHlwZT9vKGUpOjB9LGtleUNvZGU6ZnVuY3Rpb24oZSl7cmV0dXJuImtleWRvd24iPT09ZS50eXBlfHwia2V5dXAiPT09ZS50eXBlP2Uua2V5Q29kZTowfSx3aGljaDpmdW5jdGlvbihlKXtyZXR1cm4ia2V5cHJlc3MiPT09ZS50eXBlP28oZSk6ImtleWRvd24iPT09ZS50eXBlfHwia2V5dXAiPT09ZS50eXBlP2Uua2V5Q29kZTowfX07ZnVuY3Rpb24gaShlLHQsbixvKXtyZXR1cm4gci5jYWxsKHRoaXMsZSx0LG4sbyl9ci5hdWdtZW50Q2xhc3MoaSxhKSxlLmV4cG9ydHM9aX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDI3Niksbz17RXNjOiJFc2NhcGUiLFNwYWNlYmFyOiIgIixMZWZ0OiJBcnJvd0xlZnQiLFVwOiJBcnJvd1VwIixSaWdodDoiQXJyb3dSaWdodCIsRG93bjoiQXJyb3dEb3duIixEZWw6IkRlbGV0ZSIsV2luOiJPUyIsTWVudToiQ29udGV4dE1lbnUiLEFwcHM6IkNvbnRleHRNZW51IixTY3JvbGw6IlNjcm9sbExvY2siLE1velByaW50YWJsZUtleToiVW5pZGVudGlmaWVkIn0sYT17ODoiQmFja3NwYWNlIiw5OiJUYWIiLDEyOiJDbGVhciIsMTM6IkVudGVyIiwxNjoiU2hpZnQiLDE3OiJDb250cm9sIiwxODoiQWx0IiwxOToiUGF1c2UiLDIwOiJDYXBzTG9jayIsMjc6IkVzY2FwZSIsMzI6IiAiLDMzOiJQYWdlVXAiLDM0OiJQYWdlRG93biIsMzU6IkVuZCIsMzY6IkhvbWUiLDM3OiJBcnJvd0xlZnQiLDM4OiJBcnJvd1VwIiwzOToiQXJyb3dSaWdodCIsNDA6IkFycm93RG93biIsNDU6Ikluc2VydCIsNDY6IkRlbGV0ZSIsMTEyOiJGMSIsMTEzOiJGMiIsMTE0OiJGMyIsMTE1OiJGNCIsMTE2OiJGNSIsMTE3OiJGNiIsMTE4OiJGNyIsMTE5OiJGOCIsMTIwOiJGOSIsMTIxOiJGMTAiLDEyMjoiRjExIiwxMjM6IkYxMiIsMTQ0OiJOdW1Mb2NrIiwxNDU6IlNjcm9sbExvY2siLDIyNDoiTWV0YSJ9O2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZihlLmtleSl7dmFyIHQ9b1tlLmtleV18fGUua2V5O2lmKCJVbmlkZW50aWZpZWQiIT09dClyZXR1cm4gdH1pZigia2V5cHJlc3MiPT09ZS50eXBlKXt2YXIgbj1yKGUpO3JldHVybiAxMz09PW4/IkVudGVyIjpTdHJpbmcuZnJvbUNoYXJDb2RlKG4pfXJldHVybiJrZXlkb3duIj09PWUudHlwZXx8ImtleXVwIj09PWUudHlwZT9hW2Uua2V5Q29kZV18fCJVbmlkZW50aWZpZWQiOiIifX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDIwNCk7ZnVuY3Rpb24gbyhlLHQsbixvKXtyZXR1cm4gci5jYWxsKHRoaXMsZSx0LG4sbyl9ci5hdWdtZW50Q2xhc3Mobyx7ZGF0YVRyYW5zZmVyOm51bGx9KSxlLmV4cG9ydHM9b30sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE2OCksbz17dG91Y2hlczpudWxsLHRhcmdldFRvdWNoZXM6bnVsbCxjaGFuZ2VkVG91Y2hlczpudWxsLGFsdEtleTpudWxsLG1ldGFLZXk6bnVsbCxjdHJsS2V5Om51bGwsc2hpZnRLZXk6bnVsbCxnZXRNb2RpZmllclN0YXRlOm4oMjY1KX07ZnVuY3Rpb24gYShlLHQsbixvKXtyZXR1cm4gci5jYWxsKHRoaXMsZSx0LG4sbyl9ci5hdWdtZW50Q2xhc3MoYSxvKSxlLmV4cG9ydHM9YX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDkwKTtmdW5jdGlvbiBvKGUsdCxuLG8pe3JldHVybiByLmNhbGwodGhpcyxlLHQsbixvKX1yLmF1Z21lbnRDbGFzcyhvLHtwcm9wZXJ0eU5hbWU6bnVsbCxlbGFwc2VkVGltZTpudWxsLHBzZXVkb0VsZW1lbnQ6bnVsbH0pLGUuZXhwb3J0cz1vfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMjA0KTtmdW5jdGlvbiBvKGUsdCxuLG8pe3JldHVybiByLmNhbGwodGhpcyxlLHQsbixvKX1yLmF1Z21lbnRDbGFzcyhvLHtkZWx0YVg6ZnVuY3Rpb24oZSl7cmV0dXJuImRlbHRhWCJpbiBlP2UuZGVsdGFYOiJ3aGVlbERlbHRhWCJpbiBlPy1lLndoZWVsRGVsdGFYOjB9LGRlbHRhWTpmdW5jdGlvbihlKXtyZXR1cm4iZGVsdGFZImluIGU/ZS5kZWx0YVk6IndoZWVsRGVsdGFZImluIGU/LWUud2hlZWxEZWx0YVk6IndoZWVsRGVsdGEiaW4gZT8tZS53aGVlbERlbHRhOjB9LGRlbHRhWjpudWxsLGRlbHRhTW9kZTpudWxsfSksZS5leHBvcnRzPW99LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7bigyNzUpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybntfdG9wTGV2ZWxXcmFwcGVyOmUsX2lkQ291bnRlcjoxLF9vd25lckRvY3VtZW50OnQ/OT09PXQubm9kZVR5cGU/dDp0Lm93bmVyRG9jdW1lbnQ6bnVsbCxfbm9kZTp0LF90YWc6dD90Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk6bnVsbCxfbmFtZXNwYWNlVVJJOnQ/dC5uYW1lc3BhY2VVUkk6bnVsbH19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz17dXNlQ3JlYXRlRWxlbWVudDohMCx1c2VGaWJlcjohMX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9big5ODUpLG89L1wvPz4vLGE9L148XCFcLVwtLyxpPXtDSEVDS1NVTV9BVFRSX05BTUU6ImRhdGEtcmVhY3QtY2hlY2tzdW0iLGFkZENoZWNrc3VtVG9NYXJrdXA6ZnVuY3Rpb24oZSl7dmFyIHQ9cihlKTtyZXR1cm4gYS50ZXN0KGUpP2U6ZS5yZXBsYWNlKG8sIiAiK2kuQ0hFQ0tTVU1fQVRUUl9OQU1FKyc9IicrdCsnIiQmJyl9LGNhblJldXNlTWFya3VwOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5nZXRBdHRyaWJ1dGUoaS5DSEVDS1NVTV9BVFRSX05BTUUpO3JldHVybiBuPW4mJnBhcnNlSW50KG4sMTApLHIoZSk9PT1ufX07ZS5leHBvcnRzPWl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9NjU1MjE7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xLG49MCxvPTAsYT1lLmxlbmd0aCxpPS00JmE7bzxpOyl7Zm9yKHZhciBzPU1hdGgubWluKG8rNDA5NixpKTtvPHM7bys9NCluKz0odCs9ZS5jaGFyQ29kZUF0KG8pKSsodCs9ZS5jaGFyQ29kZUF0KG8rMSkpKyh0Kz1lLmNoYXJDb2RlQXQobysyKSkrKHQrPWUuY2hhckNvZGVBdChvKzMpKTt0JT1yLG4lPXJ9Zm9yKDtvPGE7bysrKW4rPXQrPWUuY2hhckNvZGVBdChvKTtyZXR1cm4odCU9cil8KG4lPXIpPDwxNn19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPSIxNS42LjIifSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzApLG89KG4oODcpLG4oNDUpKSxhPW4oMTY5KSxpPW4oNDg2KTtuKDI1KSxuKDM0KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYobnVsbD09ZSlyZXR1cm4gbnVsbDtpZigxPT09ZS5ub2RlVHlwZSlyZXR1cm4gZTt2YXIgdD1hLmdldChlKTtpZih0KXJldHVybih0PWkodCkpP28uZ2V0Tm9kZUZyb21JbnN0YW5jZSh0KTpudWxsOyJmdW5jdGlvbiI9PXR5cGVvZiBlLnJlbmRlcj9yKCI0NCIpOnIoIjQ1IixPYmplY3Qua2V5cyhlKSl9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNDg1KTtlLmV4cG9ydHM9ci5yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcn0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt0Ll9fZXNNb2R1bGU9ITAsdC5kZWZhdWx0PXZvaWQgMDt2YXIgcj1uKDApLG89aShuKDExKSksYT1pKG4oNDg3KSk7aShuKDQ4OCkpO2Z1bmN0aW9uIGkoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fXZhciBzPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobixyKXshZnVuY3Rpb24oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyx0KTt2YXIgbz1mdW5jdGlvbihlLHQpe2lmKCFlKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIXR8fCJvYmplY3QiIT10eXBlb2YgdCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp0fSh0aGlzLGUuY2FsbCh0aGlzLG4scikpO3JldHVybiBvLnN0b3JlPW4uc3RvcmUsb31yZXR1cm4gZnVuY3Rpb24oZSx0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCYmbnVsbCE9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24sIG5vdCAiK3R5cGVvZiB0KTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiYoT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLHQpOmUuX19wcm90b19fPXQpfSh0LGUpLHQucHJvdG90eXBlLmdldENoaWxkQ29udGV4dD1mdW5jdGlvbigpe3JldHVybntzdG9yZTp0aGlzLnN0b3JlfX0sdC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHIuQ2hpbGRyZW4ub25seSh0aGlzLnByb3BzLmNoaWxkcmVuKX0sdH0oci5Db21wb25lbnQpO3QuZGVmYXVsdD1zLHMucHJvcFR5cGVzPXtzdG9yZTphLmRlZmF1bHQuaXNSZXF1aXJlZCxjaGlsZHJlbjpvLmRlZmF1bHQuZWxlbWVudC5pc1JlcXVpcmVkfSxzLmNoaWxkQ29udGV4dFR5cGVzPXtzdG9yZTphLmRlZmF1bHQuaXNSZXF1aXJlZH19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigzODgpO2Z1bmN0aW9uIG8oKXt9ZnVuY3Rpb24gYSgpe31hLnJlc2V0V2FybmluZ0NhY2hlPW8sZS5leHBvcnRzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQsbixvLGEsaSl7aWYoaSE9PXIpe3ZhciBzPW5ldyBFcnJvcigiQ2FsbGluZyBQcm9wVHlwZXMgdmFsaWRhdG9ycyBkaXJlY3RseSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBgcHJvcC10eXBlc2AgcGFja2FnZS4gVXNlIFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcygpIHRvIGNhbGwgdGhlbS4gUmVhZCBtb3JlIGF0IGh0dHA6Ly9mYi5tZS91c2UtY2hlY2stcHJvcC10eXBlcyIpO3Rocm93IHMubmFtZT0iSW52YXJpYW50IFZpb2xhdGlvbiIsc319ZnVuY3Rpb24gdCgpe3JldHVybiBlfWUuaXNSZXF1aXJlZD1lO3ZhciBuPXthcnJheTplLGJvb2w6ZSxmdW5jOmUsbnVtYmVyOmUsb2JqZWN0OmUsc3RyaW5nOmUsc3ltYm9sOmUsYW55OmUsYXJyYXlPZjp0LGVsZW1lbnQ6ZSxlbGVtZW50VHlwZTplLGluc3RhbmNlT2Y6dCxub2RlOmUsb2JqZWN0T2Y6dCxvbmVPZjp0LG9uZU9mVHlwZTp0LHNoYXBlOnQsZXhhY3Q6dCxjaGVja1Byb3BUeXBlczphLHJlc2V0V2FybmluZ0NhY2hlOm99O3JldHVybiBuLlByb3BUeXBlcz1uLG59fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3QuX19lc01vZHVsZT0hMDt2YXIgcj1PYmplY3QuYXNzaWdufHxmdW5jdGlvbihlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1hcmd1bWVudHNbdF07Zm9yKHZhciByIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJihlW3JdPW5bcl0pfXJldHVybiBlfTt0LmRlZmF1bHQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciBsPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fSx3PUJvb2xlYW4oZSkseD1lfHxkLEU9dm9pZCAwO0U9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp0PygwLHMuZGVmYXVsdCkodCk6bTt2YXIgUz1ufHx2LEM9bC5wdXJlLEE9dm9pZCAwPT09Q3x8QyxPPWwud2l0aFJlZixrPXZvaWQgMCE9PU8mJk8saj1BJiZTIT09dixUPV8rKztyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9IkNvbm5lY3QoIitnKGUpKyIpIjt2YXIgbj1mdW5jdGlvbihuKXtmdW5jdGlvbiBhKGUscil7cCh0aGlzLGEpO3ZhciBvPWYodGhpcyxuLmNhbGwodGhpcyxlLHIpKTtvLnZlcnNpb249VCxvLnN0b3JlPWUuc3RvcmV8fHIuc3RvcmUsKDAsYy5kZWZhdWx0KShvLnN0b3JlLCdDb3VsZCBub3QgZmluZCAic3RvcmUiIGluIGVpdGhlciB0aGUgY29udGV4dCBvciBwcm9wcyBvZiAiJyt0KyciLiBFaXRoZXIgd3JhcCB0aGUgcm9vdCBjb21wb25lbnQgaW4gYSA8UHJvdmlkZXI+LCBvciBleHBsaWNpdGx5IHBhc3MgInN0b3JlIiBhcyBhIHByb3AgdG8gIicrdCsnIi4nKTt2YXIgaT1vLnN0b3JlLmdldFN0YXRlKCk7cmV0dXJuIG8uc3RhdGU9e3N0b3JlU3RhdGU6aX0sby5jbGVhckNhY2hlKCksb31yZXR1cm4gaChhLG4pLGEucHJvdG90eXBlLnNob3VsZENvbXBvbmVudFVwZGF0ZT1mdW5jdGlvbigpe3JldHVybiFBfHx0aGlzLmhhdmVPd25Qcm9wc0NoYW5nZWR8fHRoaXMuaGFzU3RvcmVTdGF0ZUNoYW5nZWR9LGEucHJvdG90eXBlLmNvbXB1dGVTdGF0ZVByb3BzPWZ1bmN0aW9uKGUsdCl7aWYoIXRoaXMuZmluYWxNYXBTdGF0ZVRvUHJvcHMpcmV0dXJuIHRoaXMuY29uZmlndXJlRmluYWxNYXBTdGF0ZShlLHQpO3ZhciBuPWUuZ2V0U3RhdGUoKTtyZXR1cm4gdGhpcy5kb1N0YXRlUHJvcHNEZXBlbmRPbk93blByb3BzP3RoaXMuZmluYWxNYXBTdGF0ZVRvUHJvcHMobix0KTp0aGlzLmZpbmFsTWFwU3RhdGVUb1Byb3BzKG4pfSxhLnByb3RvdHlwZS5jb25maWd1cmVGaW5hbE1hcFN0YXRlPWZ1bmN0aW9uKGUsdCl7dmFyIG49eChlLmdldFN0YXRlKCksdCkscj0iZnVuY3Rpb24iPT10eXBlb2YgbjtyZXR1cm4gdGhpcy5maW5hbE1hcFN0YXRlVG9Qcm9wcz1yP246eCx0aGlzLmRvU3RhdGVQcm9wc0RlcGVuZE9uT3duUHJvcHM9MSE9PXRoaXMuZmluYWxNYXBTdGF0ZVRvUHJvcHMubGVuZ3RoLHI/dGhpcy5jb21wdXRlU3RhdGVQcm9wcyhlLHQpOm59LGEucHJvdG90eXBlLmNvbXB1dGVEaXNwYXRjaFByb3BzPWZ1bmN0aW9uKGUsdCl7aWYoIXRoaXMuZmluYWxNYXBEaXNwYXRjaFRvUHJvcHMpcmV0dXJuIHRoaXMuY29uZmlndXJlRmluYWxNYXBEaXNwYXRjaChlLHQpO3ZhciBuPWUuZGlzcGF0Y2g7cmV0dXJuIHRoaXMuZG9EaXNwYXRjaFByb3BzRGVwZW5kT25Pd25Qcm9wcz90aGlzLmZpbmFsTWFwRGlzcGF0Y2hUb1Byb3BzKG4sdCk6dGhpcy5maW5hbE1hcERpc3BhdGNoVG9Qcm9wcyhuKX0sYS5wcm90b3R5cGUuY29uZmlndXJlRmluYWxNYXBEaXNwYXRjaD1mdW5jdGlvbihlLHQpe3ZhciBuPUUoZS5kaXNwYXRjaCx0KSxyPSJmdW5jdGlvbiI9PXR5cGVvZiBuO3JldHVybiB0aGlzLmZpbmFsTWFwRGlzcGF0Y2hUb1Byb3BzPXI/bjpFLHRoaXMuZG9EaXNwYXRjaFByb3BzRGVwZW5kT25Pd25Qcm9wcz0xIT09dGhpcy5maW5hbE1hcERpc3BhdGNoVG9Qcm9wcy5sZW5ndGgscj90aGlzLmNvbXB1dGVEaXNwYXRjaFByb3BzKGUsdCk6bn0sYS5wcm90b3R5cGUudXBkYXRlU3RhdGVQcm9wc0lmTmVlZGVkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5jb21wdXRlU3RhdGVQcm9wcyh0aGlzLnN0b3JlLHRoaXMucHJvcHMpO3JldHVybighdGhpcy5zdGF0ZVByb3BzfHwhKDAsaS5kZWZhdWx0KShlLHRoaXMuc3RhdGVQcm9wcykpJiYodGhpcy5zdGF0ZVByb3BzPWUsITApfSxhLnByb3RvdHlwZS51cGRhdGVEaXNwYXRjaFByb3BzSWZOZWVkZWQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmNvbXB1dGVEaXNwYXRjaFByb3BzKHRoaXMuc3RvcmUsdGhpcy5wcm9wcyk7cmV0dXJuKCF0aGlzLmRpc3BhdGNoUHJvcHN8fCEoMCxpLmRlZmF1bHQpKGUsdGhpcy5kaXNwYXRjaFByb3BzKSkmJih0aGlzLmRpc3BhdGNoUHJvcHM9ZSwhMCl9LGEucHJvdG90eXBlLnVwZGF0ZU1lcmdlZFByb3BzSWZOZWVkZWQ9ZnVuY3Rpb24oKXt2YXIgZSx0LG4scj0oZT10aGlzLnN0YXRlUHJvcHMsdD10aGlzLmRpc3BhdGNoUHJvcHMsbj10aGlzLnByb3BzLFMoZSx0LG4pKTtyZXR1cm4hKHRoaXMubWVyZ2VkUHJvcHMmJmomJigwLGkuZGVmYXVsdCkocix0aGlzLm1lcmdlZFByb3BzKSkmJih0aGlzLm1lcmdlZFByb3BzPXIsITApfSxhLnByb3RvdHlwZS5pc1N1YnNjcmliZWQ9ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdGhpcy51bnN1YnNjcmliZX0sYS5wcm90b3R5cGUudHJ5U3Vic2NyaWJlPWZ1bmN0aW9uKCl7dyYmIXRoaXMudW5zdWJzY3JpYmUmJih0aGlzLnVuc3Vic2NyaWJlPXRoaXMuc3RvcmUuc3Vic2NyaWJlKHRoaXMuaGFuZGxlQ2hhbmdlLmJpbmQodGhpcykpLHRoaXMuaGFuZGxlQ2hhbmdlKCkpfSxhLnByb3RvdHlwZS50cnlVbnN1YnNjcmliZT1mdW5jdGlvbigpe3RoaXMudW5zdWJzY3JpYmUmJih0aGlzLnVuc3Vic2NyaWJlKCksdGhpcy51bnN1YnNjcmliZT1udWxsKX0sYS5wcm90b3R5cGUuY29tcG9uZW50RGlkTW91bnQ9ZnVuY3Rpb24oKXt0aGlzLnRyeVN1YnNjcmliZSgpfSxhLnByb3RvdHlwZS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzPWZ1bmN0aW9uKGUpe0EmJigwLGkuZGVmYXVsdCkoZSx0aGlzLnByb3BzKXx8KHRoaXMuaGF2ZU93blByb3BzQ2hhbmdlZD0hMCl9LGEucHJvdG90eXBlLmNvbXBvbmVudFdpbGxVbm1vdW50PWZ1bmN0aW9uKCl7dGhpcy50cnlVbnN1YnNjcmliZSgpLHRoaXMuY2xlYXJDYWNoZSgpfSxhLnByb3RvdHlwZS5jbGVhckNhY2hlPWZ1bmN0aW9uKCl7dGhpcy5kaXNwYXRjaFByb3BzPW51bGwsdGhpcy5zdGF0ZVByb3BzPW51bGwsdGhpcy5tZXJnZWRQcm9wcz1udWxsLHRoaXMuaGF2ZU93blByb3BzQ2hhbmdlZD0hMCx0aGlzLmhhc1N0b3JlU3RhdGVDaGFuZ2VkPSEwLHRoaXMuaGF2ZVN0YXRlUHJvcHNCZWVuUHJlY2FsY3VsYXRlZD0hMSx0aGlzLnN0YXRlUHJvcHNQcmVjYWxjdWxhdGlvbkVycm9yPW51bGwsdGhpcy5yZW5kZXJlZEVsZW1lbnQ9bnVsbCx0aGlzLmZpbmFsTWFwRGlzcGF0Y2hUb1Byb3BzPW51bGwsdGhpcy5maW5hbE1hcFN0YXRlVG9Qcm9wcz1udWxsfSxhLnByb3RvdHlwZS5oYW5kbGVDaGFuZ2U9ZnVuY3Rpb24oKXtpZih0aGlzLnVuc3Vic2NyaWJlKXt2YXIgZT10aGlzLnN0b3JlLmdldFN0YXRlKCksdD10aGlzLnN0YXRlLnN0b3JlU3RhdGU7aWYoIUF8fHQhPT1lKXtpZihBJiYhdGhpcy5kb1N0YXRlUHJvcHNEZXBlbmRPbk93blByb3BzKXt2YXIgbj1iKHRoaXMudXBkYXRlU3RhdGVQcm9wc0lmTmVlZGVkLHRoaXMpO2lmKCFuKXJldHVybjtuPT09eSYmKHRoaXMuc3RhdGVQcm9wc1ByZWNhbGN1bGF0aW9uRXJyb3I9eS52YWx1ZSksdGhpcy5oYXZlU3RhdGVQcm9wc0JlZW5QcmVjYWxjdWxhdGVkPSEwfXRoaXMuaGFzU3RvcmVTdGF0ZUNoYW5nZWQ9ITAsdGhpcy5zZXRTdGF0ZSh7c3RvcmVTdGF0ZTplfSl9fX0sYS5wcm90b3R5cGUuZ2V0V3JhcHBlZEluc3RhbmNlPWZ1bmN0aW9uKCl7cmV0dXJuKDAsYy5kZWZhdWx0KShrLCJUbyBhY2Nlc3MgdGhlIHdyYXBwZWQgaW5zdGFuY2UsIHlvdSBuZWVkIHRvIHNwZWNpZnkgeyB3aXRoUmVmOiB0cnVlIH0gYXMgdGhlIGZvdXJ0aCBhcmd1bWVudCBvZiB0aGUgY29ubmVjdCgpIGNhbGwuIiksdGhpcy5yZWZzLndyYXBwZWRJbnN0YW5jZX0sYS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5oYXZlT3duUHJvcHNDaGFuZ2VkLG49dGhpcy5oYXNTdG9yZVN0YXRlQ2hhbmdlZCxhPXRoaXMuaGF2ZVN0YXRlUHJvcHNCZWVuUHJlY2FsY3VsYXRlZCxpPXRoaXMuc3RhdGVQcm9wc1ByZWNhbGN1bGF0aW9uRXJyb3Iscz10aGlzLnJlbmRlcmVkRWxlbWVudDtpZih0aGlzLmhhdmVPd25Qcm9wc0NoYW5nZWQ9ITEsdGhpcy5oYXNTdG9yZVN0YXRlQ2hhbmdlZD0hMSx0aGlzLmhhdmVTdGF0ZVByb3BzQmVlblByZWNhbGN1bGF0ZWQ9ITEsdGhpcy5zdGF0ZVByb3BzUHJlY2FsY3VsYXRpb25FcnJvcj1udWxsLGkpdGhyb3cgaTt2YXIgdT0hMCxjPSEwO0EmJnMmJih1PW58fHQmJnRoaXMuZG9TdGF0ZVByb3BzRGVwZW5kT25Pd25Qcm9wcyxjPXQmJnRoaXMuZG9EaXNwYXRjaFByb3BzRGVwZW5kT25Pd25Qcm9wcyk7dmFyIGw9ITEscD0hMTthP2w9ITA6dSYmKGw9dGhpcy51cGRhdGVTdGF0ZVByb3BzSWZOZWVkZWQoKSksYyYmKHA9dGhpcy51cGRhdGVEaXNwYXRjaFByb3BzSWZOZWVkZWQoKSk7cmV0dXJuISghIShsfHxwfHx0KSYmdGhpcy51cGRhdGVNZXJnZWRQcm9wc0lmTmVlZGVkKCkpJiZzP3M6KHRoaXMucmVuZGVyZWRFbGVtZW50PWs/KDAsby5jcmVhdGVFbGVtZW50KShlLHIoe30sdGhpcy5tZXJnZWRQcm9wcyx7cmVmOiJ3cmFwcGVkSW5zdGFuY2UifSkpOigwLG8uY3JlYXRlRWxlbWVudCkoZSx0aGlzLm1lcmdlZFByb3BzKSx0aGlzLnJlbmRlcmVkRWxlbWVudCl9LGF9KG8uQ29tcG9uZW50KTtyZXR1cm4gbi5kaXNwbGF5TmFtZT10LG4uV3JhcHBlZENvbXBvbmVudD1lLG4uY29udGV4dFR5cGVzPXtzdG9yZTphLmRlZmF1bHR9LG4ucHJvcFR5cGVzPXtzdG9yZTphLmRlZmF1bHR9LCgwLHUuZGVmYXVsdCkobixlKX19O3ZhciBvPW4oMCksYT1sKG4oNDg3KSksaT1sKG4oOTkyKSkscz1sKG4oOTkzKSksdT0obChuKDQ4OCkpLGwobigxNDUpKSxsKG4oOTk0KSkpLGM9bChuKDk5NSkpO2Z1bmN0aW9uIGwoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fWZ1bmN0aW9uIHAoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBmKGUsdCl7aWYoIWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4hdHx8Im9iamVjdCIhPXR5cGVvZiB0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOnR9ZnVuY3Rpb24gaChlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90ICIrdHlwZW9mIHQpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJihPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsdCk6ZS5fX3Byb3RvX189dCl9dmFyIGQ9ZnVuY3Rpb24oZSl7cmV0dXJue319LG09ZnVuY3Rpb24oZSl7cmV0dXJue2Rpc3BhdGNoOmV9fSx2PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gcih7fSxuLGUsdCl9O2Z1bmN0aW9uIGcoZSl7cmV0dXJuIGUuZGlzcGxheU5hbWV8fGUubmFtZXx8IkNvbXBvbmVudCJ9dmFyIHk9e3ZhbHVlOm51bGx9O2Z1bmN0aW9uIGIoZSx0KXt0cnl7cmV0dXJuIGUuYXBwbHkodCl9Y2F0Y2goZSl7cmV0dXJuIHkudmFsdWU9ZSx5fX12YXIgXz0wfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3QuX19lc01vZHVsZT0hMCx0LmRlZmF1bHQ9ZnVuY3Rpb24oZSx0KXtpZihlPT09dClyZXR1cm4hMDt2YXIgbj1PYmplY3Qua2V5cyhlKSxyPU9iamVjdC5rZXlzKHQpO2lmKG4ubGVuZ3RoIT09ci5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBvPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksYT0wO2E8bi5sZW5ndGg7YSsrKWlmKCFvLmNhbGwodCxuW2FdKXx8ZVtuW2FdXSE9PXRbblthXV0pcmV0dXJuITE7cmV0dXJuITB9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3QuX19lc01vZHVsZT0hMCx0LmRlZmF1bHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybigwLHIuYmluZEFjdGlvbkNyZWF0b3JzKShlLHQpfX07dmFyIHI9bigxNTEpfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzg3KSxvPXtjaGlsZENvbnRleHRUeXBlczohMCxjb250ZXh0VHlwZTohMCxjb250ZXh0VHlwZXM6ITAsZGVmYXVsdFByb3BzOiEwLGRpc3BsYXlOYW1lOiEwLGdldERlZmF1bHRQcm9wczohMCxnZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I6ITAsZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOiEwLG1peGluczohMCxwcm9wVHlwZXM6ITAsdHlwZTohMH0sYT17bmFtZTohMCxsZW5ndGg6ITAscHJvdG90eXBlOiEwLGNhbGxlcjohMCxjYWxsZWU6ITAsYXJndW1lbnRzOiEwLGFyaXR5OiEwfSxpPXskJHR5cGVvZjohMCxjb21wYXJlOiEwLGRlZmF1bHRQcm9wczohMCxkaXNwbGF5TmFtZTohMCxwcm9wVHlwZXM6ITAsdHlwZTohMH0scz17fTtmdW5jdGlvbiB1KGUpe3JldHVybiByLmlzTWVtbyhlKT9pOnNbZS4kJHR5cGVvZl18fG99c1tyLkZvcndhcmRSZWZdPXskJHR5cGVvZjohMCxyZW5kZXI6ITAsZGVmYXVsdFByb3BzOiEwLGRpc3BsYXlOYW1lOiEwLHByb3BUeXBlczohMH0sc1tyLk1lbW9dPWk7dmFyIGM9T2JqZWN0LmRlZmluZVByb3BlcnR5LGw9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMscD1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLGY9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcixoPU9iamVjdC5nZXRQcm90b3R5cGVPZixkPU9iamVjdC5wcm90b3R5cGU7ZS5leHBvcnRzPWZ1bmN0aW9uIGUodCxuLHIpe2lmKCJzdHJpbmciIT10eXBlb2Ygbil7aWYoZCl7dmFyIG89aChuKTtvJiZvIT09ZCYmZSh0LG8scil9dmFyIGk9bChuKTtwJiYoaT1pLmNvbmNhdChwKG4pKSk7Zm9yKHZhciBzPXUodCksbT11KG4pLHY9MDt2PGkubGVuZ3RoOysrdil7dmFyIGc9aVt2XTtpZighKGFbZ118fHImJnJbZ118fG0mJm1bZ118fHMmJnNbZ10pKXt2YXIgeT1mKG4sZyk7dHJ5e2ModCxnLHkpfWNhdGNoKGUpe319fX1yZXR1cm4gdH19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLHIsbyxhLGkscyl7aWYoIWUpe3ZhciB1O2lmKHZvaWQgMD09PXQpdT1uZXcgRXJyb3IoIk1pbmlmaWVkIGV4Y2VwdGlvbiBvY2N1cnJlZDsgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciB0aGUgZnVsbCBlcnJvciBtZXNzYWdlIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuIik7ZWxzZXt2YXIgYz1bbixyLG8sYSxpLHNdLGw9MDsodT1uZXcgRXJyb3IodC5yZXBsYWNlKC8lcy9nLChmdW5jdGlvbigpe3JldHVybiBjW2wrK119KSkpKS5uYW1lPSJJbnZhcmlhbnQgVmlvbGF0aW9uIn10aHJvdyB1LmZyYW1lc1RvUG9wPTEsdX19fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0tMSxyPW51bGw9PWU/MDplLmxlbmd0aDsrK248ciYmITEhPT10KGVbbl0sbixlKTspO3JldHVybiBlfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTcwKSxvPW4oMTM2KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmcih0LG8odCksZSl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxNzApLG89bigyNzgpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiBlJiZyKHQsbyh0KSxlKX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDU5KSxvPW4oMTk4KSxhPW4oMWUzKSxpPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKCFyKGUpKXJldHVybiBhKGUpO3ZhciB0PW8oZSksbj1bXTtmb3IodmFyIHMgaW4gZSkoImNvbnN0cnVjdG9yIiE9c3x8IXQmJmkuY2FsbChlLHMpKSYmbi5wdXNoKHMpO3JldHVybiBufX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9W107aWYobnVsbCE9ZSlmb3IodmFyIG4gaW4gT2JqZWN0KGUpKXQucHVzaChuKTtyZXR1cm4gdH19LGZ1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24oZSl7dmFyIHI9big3MSksbz10JiYhdC5ub2RlVHlwZSYmdCxhPW8mJiJvYmplY3QiPT10eXBlb2YgZSYmZSYmIWUubm9kZVR5cGUmJmUsaT1hJiZhLmV4cG9ydHM9PT1vP3IuQnVmZmVyOnZvaWQgMCxzPWk/aS5hbGxvY1Vuc2FmZTp2b2lkIDA7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7aWYodClyZXR1cm4gZS5zbGljZSgpO3ZhciBuPWUubGVuZ3RoLHI9cz9zKG4pOm5ldyBlLmNvbnN0cnVjdG9yKG4pO3JldHVybiBlLmNvcHkocikscn19KS5jYWxsKHRoaXMsbigxOTYpKGUpKX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj0tMSxyPWUubGVuZ3RoO2Zvcih0fHwodD1BcnJheShyKSk7KytuPHI7KXRbbl09ZVtuXTtyZXR1cm4gdH19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDE3MCksbz1uKDI0Nik7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIoZSxvKGUpLHQpfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTcwKSxvPW4oNDkwKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcihlLG8oZSksdCl9fSxmdW5jdGlvbihlLHQpe3ZhciBuPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PWUubGVuZ3RoLHI9bmV3IGUuY29uc3RydWN0b3IodCk7cmV0dXJuIHQmJiJzdHJpbmciPT10eXBlb2YgZVswXSYmbi5jYWxsKGUsImluZGV4IikmJihyLmluZGV4PWUuaW5kZXgsci5pbnB1dD1lLmlucHV0KSxyfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMjc5KSxvPW4oMTAwNyksYT1uKDEwMDgpLGk9bigxMDA5KSxzPW4oMTAxMCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgdT1lLmNvbnN0cnVjdG9yO3N3aXRjaCh0KXtjYXNlIltvYmplY3QgQXJyYXlCdWZmZXJdIjpyZXR1cm4gcihlKTtjYXNlIltvYmplY3QgQm9vbGVhbl0iOmNhc2UiW29iamVjdCBEYXRlXSI6cmV0dXJuIG5ldyB1KCtlKTtjYXNlIltvYmplY3QgRGF0YVZpZXddIjpyZXR1cm4gbyhlLG4pO2Nhc2UiW29iamVjdCBGbG9hdDMyQXJyYXldIjpjYXNlIltvYmplY3QgRmxvYXQ2NEFycmF5XSI6Y2FzZSJbb2JqZWN0IEludDhBcnJheV0iOmNhc2UiW29iamVjdCBJbnQxNkFycmF5XSI6Y2FzZSJbb2JqZWN0IEludDMyQXJyYXldIjpjYXNlIltvYmplY3QgVWludDhBcnJheV0iOmNhc2UiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iOmNhc2UiW29iamVjdCBVaW50MTZBcnJheV0iOmNhc2UiW29iamVjdCBVaW50MzJBcnJheV0iOnJldHVybiBzKGUsbik7Y2FzZSJbb2JqZWN0IE1hcF0iOnJldHVybiBuZXcgdTtjYXNlIltvYmplY3QgTnVtYmVyXSI6Y2FzZSJbb2JqZWN0IFN0cmluZ10iOnJldHVybiBuZXcgdShlKTtjYXNlIltvYmplY3QgUmVnRXhwXSI6cmV0dXJuIGEoZSk7Y2FzZSJbb2JqZWN0IFNldF0iOnJldHVybiBuZXcgdTtjYXNlIltvYmplY3QgU3ltYm9sXSI6cmV0dXJuIGkoZSl9fX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMjc5KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj10P3IoZS5idWZmZXIpOmUuYnVmZmVyO3JldHVybiBuZXcgZS5jb25zdHJ1Y3RvcihuLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgpfX0sZnVuY3Rpb24oZSx0KXt2YXIgbj0vXHcqJC87ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBlLmNvbnN0cnVjdG9yKGUuc291cmNlLG4uZXhlYyhlKSk7cmV0dXJuIHQubGFzdEluZGV4PWUubGFzdEluZGV4LHR9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMzUpLG89cj9yLnByb3RvdHlwZTp2b2lkIDAsYT1vP28udmFsdWVPZjp2b2lkIDA7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBhP09iamVjdChhLmNhbGwoZSkpOnt9fX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMjc5KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj10P3IoZS5idWZmZXIpOmUuYnVmZmVyO3JldHVybiBuZXcgZS5jb25zdHJ1Y3RvcihuLGUuYnl0ZU9mZnNldCxlLmxlbmd0aCl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMDEyKSxvPW4oMjc3KSxhPW4oMTk4KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIGUuY29uc3RydWN0b3J8fGEoZSk/e306cihvKGUpKX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDU5KSxvPU9iamVjdC5jcmVhdGUsYT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt9cmV0dXJuIGZ1bmN0aW9uKHQpe2lmKCFyKHQpKXJldHVybnt9O2lmKG8pcmV0dXJuIG8odCk7ZS5wcm90b3R5cGU9dDt2YXIgbj1uZXcgZTtyZXR1cm4gZS5wcm90b3R5cGU9dm9pZCAwLG59fSgpO2UuZXhwb3J0cz1hfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMDE0KSxvPW4oMjQ5KSxhPW4oMjUwKSxpPWEmJmEuaXNNYXAscz1pP28oaSk6cjtlLmV4cG9ydHM9c30sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTYxKSxvPW4oODgpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gbyhlKSYmIltvYmplY3QgTWFwXSI9PXIoZSl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMDE2KSxvPW4oMjQ5KSxhPW4oMjUwKSxpPWEmJmEuaXNTZXQscz1pP28oaSk6cjtlLmV4cG9ydHM9c30sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTYxKSxvPW4oODgpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gbyhlKSYmIltvYmplY3QgU2V0XSI9PXIoZSl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxNjIpLG89bigxMDE4KSxhPW4oMTAxOSksaT1uKDEzOCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ9cih0LGUpLG51bGw9PShlPWEoZSx0KSl8fGRlbGV0ZSBlW2kobyh0KSldfX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9bnVsbD09ZT8wOmUubGVuZ3RoO3JldHVybiB0P2VbdC0xXTp2b2lkIDB9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigyNTEpLG89big0MDcpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiB0Lmxlbmd0aDwyP2U6cihlLG8odCwwLC0xKSl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxNDUpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gcihlKT92b2lkIDA6ZX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDEwMjIpLG89bigxMDI1KSxhPW4oMTAyNyk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBhKG8oZSx2b2lkIDAsciksZSsiIil9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMDIzKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuKG51bGw9PWU/MDplLmxlbmd0aCk/cihlLDEpOltdfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMjQ1KSxvPW4oMTAyNCk7ZS5leHBvcnRzPWZ1bmN0aW9uIGUodCxuLGEsaSxzKXt2YXIgdT0tMSxjPXQubGVuZ3RoO2ZvcihhfHwoYT1vKSxzfHwocz1bXSk7Kyt1PGM7KXt2YXIgbD10W3VdO24+MCYmYShsKT9uPjE/ZShsLG4tMSxhLGkscyk6cihzLGwpOml8fChzW3MubGVuZ3RoXT1sKX1yZXR1cm4gc319LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDEzNSksbz1uKDE5NCksYT1uKDU2KSxpPXI/ci5pc0NvbmNhdFNwcmVhZGFibGU6dm9pZCAwO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gYShlKXx8byhlKXx8ISEoaSYmZSYmZVtpXSl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMDI2KSxvPU1hdGgubWF4O2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHQ9byh2b2lkIDA9PT10P2UubGVuZ3RoLTE6dCwwKSxmdW5jdGlvbigpe2Zvcih2YXIgYT1hcmd1bWVudHMsaT0tMSxzPW8oYS5sZW5ndGgtdCwwKSx1PUFycmF5KHMpOysraTxzOyl1W2ldPWFbdCtpXTtpPS0xO2Zvcih2YXIgYz1BcnJheSh0KzEpOysraTx0OyljW2ldPWFbaV07cmV0dXJuIGNbdF09bih1KSxyKGUsdGhpcyxjKX19fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsbil7c3dpdGNoKG4ubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIGUuY2FsbCh0KTtjYXNlIDE6cmV0dXJuIGUuY2FsbCh0LG5bMF0pO2Nhc2UgMjpyZXR1cm4gZS5jYWxsKHQsblswXSxuWzFdKTtjYXNlIDM6cmV0dXJuIGUuY2FsbCh0LG5bMF0sblsxXSxuWzJdKX1yZXR1cm4gZS5hcHBseSh0LG4pfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTAyOCksbz1uKDEwMzApKHIpO2UuZXhwb3J0cz1vfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMDI5KSxvPW4oNDU5KSxhPW4oNDIzKSxpPW8/ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbyhlLCJ0b1N0cmluZyIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHZhbHVlOnIodCksd3JpdGFibGU6ITB9KX06YTtlLmV4cG9ydHM9aX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGV9fX0sZnVuY3Rpb24oZSx0KXt2YXIgbj1EYXRlLm5vdztlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9MCxyPTA7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89bigpLGE9MTYtKG8tcik7aWYocj1vLGE+MCl7aWYoKyt0Pj04MDApcmV0dXJuIGFyZ3VtZW50c1swXX1lbHNlIHQ9MDtyZXR1cm4gZS5hcHBseSh2b2lkIDAsYXJndW1lbnRzKX19fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMDMyKTtlLmV4cG9ydHM9cn0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTAzMyksbz1TdHJpbmcucHJvdG90eXBlO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1lLnJlcGVhdDtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV8fGU9PT1vfHxlIGluc3RhbmNlb2YgU3RyaW5nJiZ0PT09by5yZXBlYXQ/cjp0fX0sZnVuY3Rpb24oZSx0LG4pe24oMTAzNCk7dmFyIHI9big0Mik7ZS5leHBvcnRzPXIoIlN0cmluZyIpLnJlcGVhdH0sZnVuY3Rpb24oZSx0LG4pe24oMjIpKHt0YXJnZXQ6IlN0cmluZyIscHJvdG86ITB9LHtyZXBlYXQ6bigxMDM1KX0pfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTI4KSxvPW4oMTA4KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9U3RyaW5nKG8odGhpcykpLG49IiIsYT1yKGUpO2lmKGE8MHx8YT09MS8wKXRocm93IFJhbmdlRXJyb3IoIldyb25nIG51bWJlciBvZiByZXBldGl0aW9ucyIpO2Zvcig7YT4wOyhhPj4+PTEpJiYodCs9dCkpMSZhJiYobis9dCk7cmV0dXJuIG59fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LkNvcHlUb0NsaXBib2FyZD12b2lkIDA7dmFyIHI9YShuKDApKSxvPWEobigxMDM3KSk7ZnVuY3Rpb24gYShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6e2RlZmF1bHQ6ZX19ZnVuY3Rpb24gaShlKXtyZXR1cm4oaT0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGV9OmZ1bmN0aW9uKGUpe3JldHVybiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZlLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZlIT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgZX0pKGUpfWZ1bmN0aW9uIHMoZSx0KXt2YXIgbj1PYmplY3Qua2V5cyhlKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO3QmJihyPXIuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpLmVudW1lcmFibGV9KSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIHUoZSx0KXtpZihudWxsPT1lKXJldHVybnt9O3ZhciBuLHIsbz1mdW5jdGlvbihlLHQpe2lmKG51bGw9PWUpcmV0dXJue307dmFyIG4scixvPXt9LGE9T2JqZWN0LmtleXMoZSk7Zm9yKHI9MDtyPGEubGVuZ3RoO3IrKyluPWFbcl0sdC5pbmRleE9mKG4pPj0wfHwob1tuXT1lW25dKTtyZXR1cm4gb30oZSx0KTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgYT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO2ZvcihyPTA7cjxhLmxlbmd0aDtyKyspbj1hW3JdLHQuaW5kZXhPZihuKT49MHx8T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsbikmJihvW25dPWVbbl0pfXJldHVybiBvfWZ1bmN0aW9uIGMoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBsKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19ZnVuY3Rpb24gcChlLHQpe3JldHVybiF0fHwib2JqZWN0IiE9PWkodCkmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2goZSk6dH1mdW5jdGlvbiBmKGUpe3JldHVybihmPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSl9KShlKX1mdW5jdGlvbiBoKGUpe2lmKHZvaWQgMD09PWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gZX1mdW5jdGlvbiBkKGUsdCl7cmV0dXJuKGQ9T2JqZWN0LnNldFByb3RvdHlwZU9mfHxmdW5jdGlvbihlLHQpe3JldHVybiBlLl9fcHJvdG9fXz10LGV9KShlLHQpfWZ1bmN0aW9uIG0oZSx0LG4pe3JldHVybiB0IGluIGU/T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOmVbdF09bixlfXZhciB2PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXt2YXIgZSxuO2ModGhpcyx0KTtmb3IodmFyIGE9YXJndW1lbnRzLmxlbmd0aCxpPW5ldyBBcnJheShhKSxzPTA7czxhO3MrKylpW3NdPWFyZ3VtZW50c1tzXTtyZXR1cm4gbShoKG49cCh0aGlzLChlPWYodCkpLmNhbGwuYXBwbHkoZSxbdGhpc10uY29uY2F0KGkpKSkpLCJvbkNsaWNrIiwoZnVuY3Rpb24oZSl7dmFyIHQ9bi5wcm9wcyxhPXQudGV4dCxpPXQub25Db3B5LHM9dC5jaGlsZHJlbix1PXQub3B0aW9ucyxjPXIuZGVmYXVsdC5DaGlsZHJlbi5vbmx5KHMpLGw9KDAsby5kZWZhdWx0KShhLHUpO2kmJmkoYSxsKSxjJiZjLnByb3BzJiYiZnVuY3Rpb24iPT10eXBlb2YgYy5wcm9wcy5vbkNsaWNrJiZjLnByb3BzLm9uQ2xpY2soZSl9KSksbn12YXIgbixhLGk7cmV0dXJuIGZ1bmN0aW9uKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJmQoZSx0KX0odCxlKSxuPXQsKGE9W3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLHQ9KGUudGV4dCxlLm9uQ29weSxlLm9wdGlvbnMsZS5jaGlsZHJlbiksbj11KGUsWyJ0ZXh0Iiwib25Db3B5Iiwib3B0aW9ucyIsImNoaWxkcmVuIl0pLG89ci5kZWZhdWx0LkNoaWxkcmVuLm9ubHkodCk7cmV0dXJuIHIuZGVmYXVsdC5jbG9uZUVsZW1lbnQobyxmdW5jdGlvbihlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbdF0/YXJndW1lbnRzW3RdOnt9O3QlMj9zKG4sITApLmZvckVhY2goKGZ1bmN0aW9uKHQpe20oZSx0LG5bdF0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOnMobikuZm9yRWFjaCgoZnVuY3Rpb24odCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sdCkpfSkpfXJldHVybiBlfSh7fSxuLHtvbkNsaWNrOnRoaXMub25DbGlja30pKX19XSkmJmwobi5wcm90b3R5cGUsYSksaSYmbChuLGkpLHR9KHIuZGVmYXVsdC5QdXJlQ29tcG9uZW50KTt0LkNvcHlUb0NsaXBib2FyZD12LG0odiwiZGVmYXVsdFByb3BzIix7b25Db3B5OnZvaWQgMCxvcHRpb25zOnZvaWQgMH0pfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTAzOCksbz17InRleHQvcGxhaW4iOiJUZXh0IiwidGV4dC9odG1sIjoiVXJsIixkZWZhdWx0OiJUZXh0In07ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7dmFyIG4sYSxpLHMsdSxjLGw9ITE7dHx8KHQ9e30pLG49dC5kZWJ1Z3x8ITE7dHJ5e2lmKGk9cigpLHM9ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKSx1PWRvY3VtZW50LmdldFNlbGVjdGlvbigpLChjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKSkudGV4dENvbnRlbnQ9ZSxjLnN0eWxlLmFsbD0idW5zZXQiLGMuc3R5bGUucG9zaXRpb249ImZpeGVkIixjLnN0eWxlLnRvcD0wLGMuc3R5bGUuY2xpcD0icmVjdCgwLCAwLCAwLCAwKSIsYy5zdHlsZS53aGl0ZVNwYWNlPSJwcmUiLGMuc3R5bGUud2Via2l0VXNlclNlbGVjdD0idGV4dCIsYy5zdHlsZS5Nb3pVc2VyU2VsZWN0PSJ0ZXh0IixjLnN0eWxlLm1zVXNlclNlbGVjdD0idGV4dCIsYy5zdHlsZS51c2VyU2VsZWN0PSJ0ZXh0IixjLmFkZEV2ZW50TGlzdGVuZXIoImNvcHkiLChmdW5jdGlvbihyKXtpZihyLnN0b3BQcm9wYWdhdGlvbigpLHQuZm9ybWF0KWlmKHIucHJldmVudERlZmF1bHQoKSx2b2lkIDA9PT1yLmNsaXBib2FyZERhdGEpe24mJmNvbnNvbGUud2FybigidW5hYmxlIHRvIHVzZSBlLmNsaXBib2FyZERhdGEiKSxuJiZjb25zb2xlLndhcm4oInRyeWluZyBJRSBzcGVjaWZpYyBzdHVmZiIpLHdpbmRvdy5jbGlwYm9hcmREYXRhLmNsZWFyRGF0YSgpO3ZhciBhPW9bdC5mb3JtYXRdfHxvLmRlZmF1bHQ7d2luZG93LmNsaXBib2FyZERhdGEuc2V0RGF0YShhLGUpfWVsc2Ugci5jbGlwYm9hcmREYXRhLmNsZWFyRGF0YSgpLHIuY2xpcGJvYXJkRGF0YS5zZXREYXRhKHQuZm9ybWF0LGUpO3Qub25Db3B5JiYoci5wcmV2ZW50RGVmYXVsdCgpLHQub25Db3B5KHIuY2xpcGJvYXJkRGF0YSkpfSkpLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYykscy5zZWxlY3ROb2RlQ29udGVudHMoYyksdS5hZGRSYW5nZShzKSwhZG9jdW1lbnQuZXhlY0NvbW1hbmQoImNvcHkiKSl0aHJvdyBuZXcgRXJyb3IoImNvcHkgY29tbWFuZCB3YXMgdW5zdWNjZXNzZnVsIik7bD0hMH1jYXRjaChyKXtuJiZjb25zb2xlLmVycm9yKCJ1bmFibGUgdG8gY29weSB1c2luZyBleGVjQ29tbWFuZDogIixyKSxuJiZjb25zb2xlLndhcm4oInRyeWluZyBJRSBzcGVjaWZpYyBzdHVmZiIpO3RyeXt3aW5kb3cuY2xpcGJvYXJkRGF0YS5zZXREYXRhKHQuZm9ybWF0fHwidGV4dCIsZSksdC5vbkNvcHkmJnQub25Db3B5KHdpbmRvdy5jbGlwYm9hcmREYXRhKSxsPSEwfWNhdGNoKHIpe24mJmNvbnNvbGUuZXJyb3IoInVuYWJsZSB0byBjb3B5IHVzaW5nIGNsaXBib2FyZERhdGE6ICIsciksbiYmY29uc29sZS5lcnJvcigiZmFsbGluZyBiYWNrIHRvIHByb21wdCIpLGE9ZnVuY3Rpb24oZSl7dmFyIHQ9KC9tYWMgb3MgeC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk/IuKMmCI6IkN0cmwiKSsiK0MiO3JldHVybiBlLnJlcGxhY2UoLyN7XHMqa2V5XHMqfS9nLHQpfSgibWVzc2FnZSJpbiB0P3QubWVzc2FnZToiQ29weSB0byBjbGlwYm9hcmQ6ICN7a2V5fSwgRW50ZXIiKSx3aW5kb3cucHJvbXB0KGEsZSl9fWZpbmFsbHl7dSYmKCJmdW5jdGlvbiI9PXR5cGVvZiB1LnJlbW92ZVJhbmdlP3UucmVtb3ZlUmFuZ2Uocyk6dS5yZW1vdmVBbGxSYW5nZXMoKSksYyYmZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChjKSxpKCl9cmV0dXJuIGx9fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbigpe3ZhciBlPWRvY3VtZW50LmdldFNlbGVjdGlvbigpO2lmKCFlLnJhbmdlQ291bnQpcmV0dXJuIGZ1bmN0aW9uKCl7fTtmb3IodmFyIHQ9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCxuPVtdLHI9MDtyPGUucmFuZ2VDb3VudDtyKyspbi5wdXNoKGUuZ2V0UmFuZ2VBdChyKSk7c3dpdGNoKHQudGFnTmFtZS50b1VwcGVyQ2FzZSgpKXtjYXNlIklOUFVUIjpjYXNlIlRFWFRBUkVBIjp0LmJsdXIoKTticmVhaztkZWZhdWx0OnQ9bnVsbH1yZXR1cm4gZS5yZW1vdmVBbGxSYW5nZXMoKSxmdW5jdGlvbigpeyJDYXJldCI9PT1lLnR5cGUmJmUucmVtb3ZlQWxsUmFuZ2VzKCksZS5yYW5nZUNvdW50fHxuLmZvckVhY2goKGZ1bmN0aW9uKHQpe2UuYWRkUmFuZ2UodCl9KSksdCYmdC5mb2N1cygpfX19LGZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIE1hcD9lLmNsZWFyPWUuZGVsZXRlPWUuc2V0PWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJtYXAgaXMgcmVhZC1vbmx5Iil9OmUgaW5zdGFuY2VvZiBTZXQmJihlLmFkZD1lLmNsZWFyPWUuZGVsZXRlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJzZXQgaXMgcmVhZC1vbmx5Iil9KSxPYmplY3QuZnJlZXplKGUpLE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3ZhciByPWVbdF07Im9iamVjdCIhPXR5cGVvZiByfHxPYmplY3QuaXNGcm96ZW4ocil8fG4ocil9KSksZX12YXIgcj1uLG89bjtyLmRlZmF1bHQ9bztjbGFzcyBhe2NvbnN0cnVjdG9yKGUpe3ZvaWQgMD09PWUuZGF0YSYmKGUuZGF0YT17fSksdGhpcy5kYXRhPWUuZGF0YX1pZ25vcmVNYXRjaCgpe3RoaXMuaWdub3JlPSEwfX1mdW5jdGlvbiBpKGUpe3JldHVybiBlLnJlcGxhY2UoLyYvZywiJmFtcDsiKS5yZXBsYWNlKC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKS5yZXBsYWNlKC8iL2csIiZxdW90OyIpLnJlcGxhY2UoLycvZywiJiN4Mjc7Iil9ZnVuY3Rpb24gcyhlLC4uLnQpe2NvbnN0IG49T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IoY29uc3QgdCBpbiBlKW5bdF09ZVt0XTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbihlKXtmb3IoY29uc3QgdCBpbiBlKW5bdF09ZVt0XX0pKSxufWZ1bmN0aW9uIHUoZSl7cmV0dXJuIGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKX12YXIgYz1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxlc2NhcGVIVE1MOmksaW5oZXJpdDpzLG5vZGVTdHJlYW06ZnVuY3Rpb24oZSl7Y29uc3QgdD1bXTtyZXR1cm4gZnVuY3Rpb24gZShuLHIpe2ZvcihsZXQgbz1uLmZpcnN0Q2hpbGQ7bztvPW8ubmV4dFNpYmxpbmcpMz09PW8ubm9kZVR5cGU/cis9by5ub2RlVmFsdWUubGVuZ3RoOjE9PT1vLm5vZGVUeXBlJiYodC5wdXNoKHtldmVudDoic3RhcnQiLG9mZnNldDpyLG5vZGU6b30pLHI9ZShvLHIpLHUobykubWF0Y2goL2JyfGhyfGltZ3xpbnB1dC8pfHx0LnB1c2goe2V2ZW50OiJzdG9wIixvZmZzZXQ6cixub2RlOm99KSk7cmV0dXJuIHJ9KGUsMCksdH0sbWVyZ2VTdHJlYW1zOmZ1bmN0aW9uKGUsdCxuKXtsZXQgcj0wLG89IiI7Y29uc3QgYT1bXTtmdW5jdGlvbiBzKCl7cmV0dXJuIGUubGVuZ3RoJiZ0Lmxlbmd0aD9lWzBdLm9mZnNldCE9PXRbMF0ub2Zmc2V0P2VbMF0ub2Zmc2V0PHRbMF0ub2Zmc2V0P2U6dDoic3RhcnQiPT09dFswXS5ldmVudD9lOnQ6ZS5sZW5ndGg/ZTp0fWZ1bmN0aW9uIGMoZSl7bys9IjwiK3UoZSkrW10ubWFwLmNhbGwoZS5hdHRyaWJ1dGVzLChmdW5jdGlvbihlKXtyZXR1cm4iICIrZS5ub2RlTmFtZSsnPSInK2koZS52YWx1ZSkrJyInfSkpLmpvaW4oIiIpKyI+In1mdW5jdGlvbiBsKGUpe28rPSI8LyIrdShlKSsiPiJ9ZnVuY3Rpb24gcChlKXsoInN0YXJ0Ij09PWUuZXZlbnQ/YzpsKShlLm5vZGUpfWZvcig7ZS5sZW5ndGh8fHQubGVuZ3RoOyl7bGV0IHQ9cygpO2lmKG8rPWkobi5zdWJzdHJpbmcocix0WzBdLm9mZnNldCkpLHI9dFswXS5vZmZzZXQsdD09PWUpe2EucmV2ZXJzZSgpLmZvckVhY2gobCk7ZG97cCh0LnNwbGljZSgwLDEpWzBdKSx0PXMoKX13aGlsZSh0PT09ZSYmdC5sZW5ndGgmJnRbMF0ub2Zmc2V0PT09cik7YS5yZXZlcnNlKCkuZm9yRWFjaChjKX1lbHNlInN0YXJ0Ij09PXRbMF0uZXZlbnQ/YS5wdXNoKHRbMF0ubm9kZSk6YS5wb3AoKSxwKHQuc3BsaWNlKDAsMSlbMF0pfXJldHVybiBvK2kobi5zdWJzdHIocikpfX0pO2NvbnN0IGw9ZT0+ISFlLmtpbmQ7Y2xhc3MgcHtjb25zdHJ1Y3RvcihlLHQpe3RoaXMuYnVmZmVyPSIiLHRoaXMuY2xhc3NQcmVmaXg9dC5jbGFzc1ByZWZpeCxlLndhbGsodGhpcyl9YWRkVGV4dChlKXt0aGlzLmJ1ZmZlcis9aShlKX1vcGVuTm9kZShlKXtpZighbChlKSlyZXR1cm47bGV0IHQ9ZS5raW5kO2Uuc3VibGFuZ3VhZ2V8fCh0PWAke3RoaXMuY2xhc3NQcmVmaXh9JHt0fWApLHRoaXMuc3Bhbih0KX1jbG9zZU5vZGUoZSl7bChlKSYmKHRoaXMuYnVmZmVyKz0iPC9zcGFuPiIpfXZhbHVlKCl7cmV0dXJuIHRoaXMuYnVmZmVyfXNwYW4oZSl7dGhpcy5idWZmZXIrPWA8c3BhbiBjbGFzcz0iJHtlfSI+YH19Y2xhc3MgZntjb25zdHJ1Y3Rvcigpe3RoaXMucm9vdE5vZGU9e2NoaWxkcmVuOltdfSx0aGlzLnN0YWNrPVt0aGlzLnJvb3ROb2RlXX1nZXQgdG9wKCl7cmV0dXJuIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV19Z2V0IHJvb3QoKXtyZXR1cm4gdGhpcy5yb290Tm9kZX1hZGQoZSl7dGhpcy50b3AuY2hpbGRyZW4ucHVzaChlKX1vcGVuTm9kZShlKXtjb25zdCB0PXtraW5kOmUsY2hpbGRyZW46W119O3RoaXMuYWRkKHQpLHRoaXMuc3RhY2sucHVzaCh0KX1jbG9zZU5vZGUoKXtpZih0aGlzLnN0YWNrLmxlbmd0aD4xKXJldHVybiB0aGlzLnN0YWNrLnBvcCgpfWNsb3NlQWxsTm9kZXMoKXtmb3IoO3RoaXMuY2xvc2VOb2RlKCk7KTt9dG9KU09OKCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMucm9vdE5vZGUsbnVsbCw0KX13YWxrKGUpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLl93YWxrKGUsdGhpcy5yb290Tm9kZSl9c3RhdGljIF93YWxrKGUsdCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P2UuYWRkVGV4dCh0KTp0LmNoaWxkcmVuJiYoZS5vcGVuTm9kZSh0KSx0LmNoaWxkcmVuLmZvckVhY2goKHQ9PnRoaXMuX3dhbGsoZSx0KSkpLGUuY2xvc2VOb2RlKHQpKSxlfXN0YXRpYyBfY29sbGFwc2UoZSl7InN0cmluZyIhPXR5cGVvZiBlJiZlLmNoaWxkcmVuJiYoZS5jaGlsZHJlbi5ldmVyeSgoZT0+InN0cmluZyI9PXR5cGVvZiBlKSk/ZS5jaGlsZHJlbj1bZS5jaGlsZHJlbi5qb2luKCIiKV06ZS5jaGlsZHJlbi5mb3JFYWNoKChlPT57Zi5fY29sbGFwc2UoZSl9KSkpfX1jbGFzcyBoIGV4dGVuZHMgZntjb25zdHJ1Y3RvcihlKXtzdXBlcigpLHRoaXMub3B0aW9ucz1lfWFkZEtleXdvcmQoZSx0KXsiIiE9PWUmJih0aGlzLm9wZW5Ob2RlKHQpLHRoaXMuYWRkVGV4dChlKSx0aGlzLmNsb3NlTm9kZSgpKX1hZGRUZXh0KGUpeyIiIT09ZSYmdGhpcy5hZGQoZSl9YWRkU3VibGFuZ3VhZ2UoZSx0KXtjb25zdCBuPWUucm9vdDtuLmtpbmQ9dCxuLnN1Ymxhbmd1YWdlPSEwLHRoaXMuYWRkKG4pfXRvSFRNTCgpe3JldHVybiBuZXcgcCh0aGlzLHRoaXMub3B0aW9ucykudmFsdWUoKX1maW5hbGl6ZSgpe3JldHVybiEwfX1mdW5jdGlvbiBkKGUpe3JldHVybiBlPyJzdHJpbmciPT10eXBlb2YgZT9lOmUuc291cmNlOm51bGx9Y29uc3QgbT0iW2EtekEtWl1cXHcqIix2PSJbYS16QS1aX11cXHcqIixnPSJcXGJcXGQrKFxcLlxcZCspPyIseT0iKC0/KShcXGIwW3hYXVthLWZBLUYwLTldK3woXFxiXFxkKyhcXC5cXGQqKT98XFwuXFxkKykoW2VFXVstK10/XFxkKyk/KSIsYj0iXFxiKDBiWzAxXSspIixfPXtiZWdpbjoiXFxcXFtcXHNcXFNdIixyZWxldmFuY2U6MH0sdz17Y2xhc3NOYW1lOiJzdHJpbmciLGJlZ2luOiInIixlbmQ6IiciLGlsbGVnYWw6IlxcbiIsY29udGFpbnM6W19dfSx4PXtjbGFzc05hbWU6InN0cmluZyIsYmVnaW46JyInLGVuZDonIicsaWxsZWdhbDoiXFxuIixjb250YWluczpbX119LEU9e2JlZ2luOi9cYihhfGFufHRoZXxhcmV8SSdtfGlzbid0fGRvbid0fGRvZXNuJ3R8d29uJ3R8YnV0fGp1c3R8c2hvdWxkfHByZXR0eXxzaW1wbHl8ZW5vdWdofGdvbm5hfGdvaW5nfHd0Znxzb3xzdWNofHdpbGx8eW91fHlvdXJ8dGhleXxsaWtlfG1vcmUpXGIvfSxTPWZ1bmN0aW9uKGUsdCxuPXt9KXtjb25zdCByPXMoe2NsYXNzTmFtZToiY29tbWVudCIsYmVnaW46ZSxlbmQ6dCxjb250YWluczpbXX0sbik7cmV0dXJuIHIuY29udGFpbnMucHVzaChFKSxyLmNvbnRhaW5zLnB1c2goe2NsYXNzTmFtZToiZG9jdGFnIixiZWdpbjoiKD86VE9ET3xGSVhNRXxOT1RFfEJVR3xPUFRJTUlaRXxIQUNLfFhYWCk6IixyZWxldmFuY2U6MH0pLHJ9LEM9UygiLy8iLCIkIiksQT1TKCIvXFwqIiwiXFwqLyIpLE89UygiIyIsIiQiKSxrPXtjbGFzc05hbWU6Im51bWJlciIsYmVnaW46ZyxyZWxldmFuY2U6MH0saj17Y2xhc3NOYW1lOiJudW1iZXIiLGJlZ2luOnkscmVsZXZhbmNlOjB9LFQ9e2NsYXNzTmFtZToibnVtYmVyIixiZWdpbjpiLHJlbGV2YW5jZTowfSxJPXtjbGFzc05hbWU6Im51bWJlciIsYmVnaW46ZysiKCV8ZW18ZXh8Y2h8cmVtfHZ3fHZofHZtaW58dm1heHxjbXxtbXxpbnxwdHxwY3xweHxkZWd8Z3JhZHxyYWR8dHVybnxzfG1zfEh6fGtIenxkcGl8ZHBjbXxkcHB4KT8iLHJlbGV2YW5jZTowfSxQPXtiZWdpbjovKD89XC9bXi9cbl0qXC8pLyxjb250YWluczpbe2NsYXNzTmFtZToicmVnZXhwIixiZWdpbjovXC8vLGVuZDovXC9bZ2ltdXldKi8saWxsZWdhbDovXG4vLGNvbnRhaW5zOltfLHtiZWdpbjovXFsvLGVuZDovXF0vLHJlbGV2YW5jZTowLGNvbnRhaW5zOltfXX1dfV19LE49e2NsYXNzTmFtZToidGl0bGUiLGJlZ2luOm0scmVsZXZhbmNlOjB9LE09e2NsYXNzTmFtZToidGl0bGUiLGJlZ2luOnYscmVsZXZhbmNlOjB9LFI9e2JlZ2luOiJcXC5cXHMqW2EtekEtWl9dXFx3KiIscmVsZXZhbmNlOjB9O3ZhciBEPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLElERU5UX1JFOm0sVU5ERVJTQ09SRV9JREVOVF9SRTp2LE5VTUJFUl9SRTpnLENfTlVNQkVSX1JFOnksQklOQVJZX05VTUJFUl9SRTpiLFJFX1NUQVJURVJTX1JFOiIhfCE9fCE9PXwlfCU9fCZ8JiZ8Jj18XFwqfFxcKj18XFwrfFxcKz18LHwtfC09fC89fC98Onw7fDw8fDw8PXw8PXw8fD09PXw9PXw9fD4+Pj18Pj49fD49fD4+Pnw+Pnw+fFxcP3xcXFt8XFx7fFxcKHxcXF58XFxePXxcXHx8XFx8PXxcXHxcXHx8fiIsU0hFQkFORzooZT17fSk9Pntjb25zdCB0PS9eIyFbIF0qXC8vO3JldHVybiBlLmJpbmFyeSYmKGUuYmVnaW49ZnVuY3Rpb24oLi4uZSl7cmV0dXJuIGUubWFwKChlPT5kKGUpKSkuam9pbigiIil9KHQsLy4qXGIvLGUuYmluYXJ5LC9cYi4qLykpLHMoe2NsYXNzTmFtZToibWV0YSIsYmVnaW46dCxlbmQ6LyQvLHJlbGV2YW5jZTowLCJvbjpiZWdpbiI6KGUsdCk9PnswIT09ZS5pbmRleCYmdC5pZ25vcmVNYXRjaCgpfX0sZSl9LEJBQ0tTTEFTSF9FU0NBUEU6XyxBUE9TX1NUUklOR19NT0RFOncsUVVPVEVfU1RSSU5HX01PREU6eCxQSFJBU0FMX1dPUkRTX01PREU6RSxDT01NRU5UOlMsQ19MSU5FX0NPTU1FTlRfTU9ERTpDLENfQkxPQ0tfQ09NTUVOVF9NT0RFOkEsSEFTSF9DT01NRU5UX01PREU6TyxOVU1CRVJfTU9ERTprLENfTlVNQkVSX01PREU6aixCSU5BUllfTlVNQkVSX01PREU6VCxDU1NfTlVNQkVSX01PREU6SSxSRUdFWFBfTU9ERTpQLFRJVExFX01PREU6TixVTkRFUlNDT1JFX1RJVExFX01PREU6TSxNRVRIT0RfR1VBUkQ6UixFTkRfU0FNRV9BU19CRUdJTjpmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmFzc2lnbihlLHsib246YmVnaW4iOihlLHQpPT57dC5kYXRhLl9iZWdpbk1hdGNoPWVbMV19LCJvbjplbmQiOihlLHQpPT57dC5kYXRhLl9iZWdpbk1hdGNoIT09ZVsxXSYmdC5pZ25vcmVNYXRjaCgpfX0pfX0pO2NvbnN0IEw9WyJvZiIsImFuZCIsImZvciIsImluIiwibm90Iiwib3IiLCJpZiIsInRoZW4iLCJwYXJlbnQiLCJsaXN0IiwidmFsdWUiXTtmdW5jdGlvbiBCKGUpe2Z1bmN0aW9uIHQodCxuKXtyZXR1cm4gbmV3IFJlZ0V4cChkKHQpLCJtIisoZS5jYXNlX2luc2Vuc2l0aXZlPyJpIjoiIikrKG4/ImciOiIiKSl9Y2xhc3Mgbntjb25zdHJ1Y3Rvcigpe3RoaXMubWF0Y2hJbmRleGVzPXt9LHRoaXMucmVnZXhlcz1bXSx0aGlzLm1hdGNoQXQ9MSx0aGlzLnBvc2l0aW9uPTB9YWRkUnVsZShlLHQpe3QucG9zaXRpb249dGhpcy5wb3NpdGlvbisrLHRoaXMubWF0Y2hJbmRleGVzW3RoaXMubWF0Y2hBdF09dCx0aGlzLnJlZ2V4ZXMucHVzaChbdCxlXSksdGhpcy5tYXRjaEF0Kz1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFJlZ0V4cChlLnRvU3RyaW5nKCkrInwiKS5leGVjKCIiKS5sZW5ndGgtMX0oZSkrMX1jb21waWxlKCl7MD09PXRoaXMucmVnZXhlcy5sZW5ndGgmJih0aGlzLmV4ZWM9KCk9Pm51bGwpO2NvbnN0IGU9dGhpcy5yZWdleGVzLm1hcCgoZT0+ZVsxXSkpO3RoaXMubWF0Y2hlclJlPXQoZnVuY3Rpb24oZSx0PSJ8Iil7Y29uc3Qgbj0vXFsoPzpbXlxcXF1dfFxcLikqXF18XChcPz98XFwoWzEtOV1bMC05XSopfFxcLi87bGV0IHI9MCxvPSIiO2ZvcihsZXQgYT0wO2E8ZS5sZW5ndGg7YSsrKXtyKz0xO2NvbnN0IGk9cjtsZXQgcz1kKGVbYV0pO2ZvcihhPjAmJihvKz10KSxvKz0iKCI7cy5sZW5ndGg+MDspe2NvbnN0IGU9bi5leGVjKHMpO2lmKG51bGw9PWUpe28rPXM7YnJlYWt9bys9cy5zdWJzdHJpbmcoMCxlLmluZGV4KSxzPXMuc3Vic3RyaW5nKGUuaW5kZXgrZVswXS5sZW5ndGgpLCJcXCI9PT1lWzBdWzBdJiZlWzFdP28rPSJcXCIrU3RyaW5nKE51bWJlcihlWzFdKStpKToobys9ZVswXSwiKCI9PT1lWzBdJiZyKyspfW8rPSIpIn1yZXR1cm4gb30oZSksITApLHRoaXMubGFzdEluZGV4PTB9ZXhlYyhlKXt0aGlzLm1hdGNoZXJSZS5sYXN0SW5kZXg9dGhpcy5sYXN0SW5kZXg7Y29uc3QgdD10aGlzLm1hdGNoZXJSZS5leGVjKGUpO2lmKCF0KXJldHVybiBudWxsO2NvbnN0IG49dC5maW5kSW5kZXgoKChlLHQpPT50PjAmJnZvaWQgMCE9PWUpKSxyPXRoaXMubWF0Y2hJbmRleGVzW25dO3JldHVybiB0LnNwbGljZSgwLG4pLE9iamVjdC5hc3NpZ24odCxyKX19Y2xhc3Mgcntjb25zdHJ1Y3Rvcigpe3RoaXMucnVsZXM9W10sdGhpcy5tdWx0aVJlZ2V4ZXM9W10sdGhpcy5jb3VudD0wLHRoaXMubGFzdEluZGV4PTAsdGhpcy5yZWdleEluZGV4PTB9Z2V0TWF0Y2hlcihlKXtpZih0aGlzLm11bHRpUmVnZXhlc1tlXSlyZXR1cm4gdGhpcy5tdWx0aVJlZ2V4ZXNbZV07Y29uc3QgdD1uZXcgbjtyZXR1cm4gdGhpcy5ydWxlcy5zbGljZShlKS5mb3JFYWNoKCgoW2Usbl0pPT50LmFkZFJ1bGUoZSxuKSkpLHQuY29tcGlsZSgpLHRoaXMubXVsdGlSZWdleGVzW2VdPXQsdH1yZXN1bWluZ1NjYW5BdFNhbWVQb3NpdGlvbigpe3JldHVybiAwIT09dGhpcy5yZWdleEluZGV4fWNvbnNpZGVyQWxsKCl7dGhpcy5yZWdleEluZGV4PTB9YWRkUnVsZShlLHQpe3RoaXMucnVsZXMucHVzaChbZSx0XSksImJlZ2luIj09PXQudHlwZSYmdGhpcy5jb3VudCsrfWV4ZWMoZSl7Y29uc3QgdD10aGlzLmdldE1hdGNoZXIodGhpcy5yZWdleEluZGV4KTt0Lmxhc3RJbmRleD10aGlzLmxhc3RJbmRleDtsZXQgbj10LmV4ZWMoZSk7aWYodGhpcy5yZXN1bWluZ1NjYW5BdFNhbWVQb3NpdGlvbigpKWlmKG4mJm4uaW5kZXg9PT10aGlzLmxhc3RJbmRleCk7ZWxzZXtjb25zdCB0PXRoaXMuZ2V0TWF0Y2hlcigwKTt0Lmxhc3RJbmRleD10aGlzLmxhc3RJbmRleCsxLG49dC5leGVjKGUpfXJldHVybiBuJiYodGhpcy5yZWdleEluZGV4Kz1uLnBvc2l0aW9uKzEsdGhpcy5yZWdleEluZGV4PT09dGhpcy5jb3VudCYmdGhpcy5jb25zaWRlckFsbCgpKSxufX1mdW5jdGlvbiBvKGUsdCl7Ii4iPT09ZS5pbnB1dFtlLmluZGV4LTFdJiZ0Lmlnbm9yZU1hdGNoKCl9aWYoZS5jb250YWlucyYmZS5jb250YWlucy5pbmNsdWRlcygic2VsZiIpKXRocm93IG5ldyBFcnJvcigiRVJSOiBjb250YWlucyBgc2VsZmAgaXMgbm90IHN1cHBvcnRlZCBhdCB0aGUgdG9wLWxldmVsIG9mIGEgbGFuZ3VhZ2UuICBTZWUgZG9jdW1lbnRhdGlvbi4iKTtyZXR1cm4gZS5jbGFzc05hbWVBbGlhc2VzPXMoZS5jbGFzc05hbWVBbGlhc2VzfHx7fSksZnVuY3Rpb24gbihhLGkpe2NvbnN0IHU9YTtpZihhLmNvbXBpbGVkKXJldHVybiB1O2EuY29tcGlsZWQ9ITAsYS5fX2JlZm9yZUJlZ2luPW51bGwsYS5rZXl3b3Jkcz1hLmtleXdvcmRzfHxhLmJlZ2luS2V5d29yZHM7bGV0IGM9bnVsbDtpZigib2JqZWN0Ij09dHlwZW9mIGEua2V5d29yZHMmJihjPWEua2V5d29yZHMuJHBhdHRlcm4sZGVsZXRlIGEua2V5d29yZHMuJHBhdHRlcm4pLGEua2V5d29yZHMmJihhLmtleXdvcmRzPWZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj17fTsic3RyaW5nIj09dHlwZW9mIGU/cigia2V5d29yZCIsZSk6T2JqZWN0LmtleXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7cih0LGVbdF0pfSkpO3JldHVybiBuO2Z1bmN0aW9uIHIoZSxyKXt0JiYocj1yLnRvTG93ZXJDYXNlKCkpLHIuc3BsaXQoIiAiKS5mb3JFYWNoKChmdW5jdGlvbih0KXtjb25zdCByPXQuc3BsaXQoInwiKTtuW3JbMF1dPVtlLFUoclswXSxyWzFdKV19KSl9fShhLmtleXdvcmRzLGUuY2FzZV9pbnNlbnNpdGl2ZSkpLGEubGV4ZW1lcyYmYyl0aHJvdyBuZXcgRXJyb3IoIkVSUjogUHJlZmVyIGBrZXl3b3Jkcy4kcGF0dGVybmAgdG8gYG1vZGUubGV4ZW1lc2AsIEJPVEggYXJlIG5vdCBhbGxvd2VkLiAoc2VlIG1vZGUgcmVmZXJlbmNlKSAiKTtyZXR1cm4gdS5rZXl3b3JkUGF0dGVyblJlPXQoYS5sZXhlbWVzfHxjfHwvXHcrLywhMCksaSYmKGEuYmVnaW5LZXl3b3JkcyYmKGEuYmVnaW49IlxcYigiK2EuYmVnaW5LZXl3b3Jkcy5zcGxpdCgiICIpLmpvaW4oInwiKSsiKSg/IVxcLikoPz1cXGJ8XFxzKSIsYS5fX2JlZm9yZUJlZ2luPW8pLGEuYmVnaW58fChhLmJlZ2luPS9cQnxcYi8pLHUuYmVnaW5SZT10KGEuYmVnaW4pLGEuZW5kU2FtZUFzQmVnaW4mJihhLmVuZD1hLmJlZ2luKSxhLmVuZHx8YS5lbmRzV2l0aFBhcmVudHx8KGEuZW5kPS9cQnxcYi8pLGEuZW5kJiYodS5lbmRSZT10KGEuZW5kKSksdS50ZXJtaW5hdG9yX2VuZD1kKGEuZW5kKXx8IiIsYS5lbmRzV2l0aFBhcmVudCYmaS50ZXJtaW5hdG9yX2VuZCYmKHUudGVybWluYXRvcl9lbmQrPShhLmVuZD8ifCI6IiIpK2kudGVybWluYXRvcl9lbmQpKSxhLmlsbGVnYWwmJih1LmlsbGVnYWxSZT10KGEuaWxsZWdhbCkpLHZvaWQgMD09PWEucmVsZXZhbmNlJiYoYS5yZWxldmFuY2U9MSksYS5jb250YWluc3x8KGEuY29udGFpbnM9W10pLGEuY29udGFpbnM9W10uY29uY2F0KC4uLmEuY29udGFpbnMubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oZSl7ZS52YXJpYW50cyYmIWUuY2FjaGVkX3ZhcmlhbnRzJiYoZS5jYWNoZWRfdmFyaWFudHM9ZS52YXJpYW50cy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBzKGUse3ZhcmlhbnRzOm51bGx9LHQpfSkpKTtpZihlLmNhY2hlZF92YXJpYW50cylyZXR1cm4gZS5jYWNoZWRfdmFyaWFudHM7aWYoRihlKSlyZXR1cm4gcyhlLHtzdGFydHM6ZS5zdGFydHM/cyhlLnN0YXJ0cyk6bnVsbH0pO2lmKE9iamVjdC5pc0Zyb3plbihlKSlyZXR1cm4gcyhlKTtyZXR1cm4gZX0oInNlbGYiPT09ZT9hOmUpfSkpKSxhLmNvbnRhaW5zLmZvckVhY2goKGZ1bmN0aW9uKGUpe24oZSx1KX0pKSxhLnN0YXJ0cyYmbihhLnN0YXJ0cyxpKSx1Lm1hdGNoZXI9ZnVuY3Rpb24oZSl7Y29uc3QgdD1uZXcgcjtyZXR1cm4gZS5jb250YWlucy5mb3JFYWNoKChlPT50LmFkZFJ1bGUoZS5iZWdpbix7cnVsZTplLHR5cGU6ImJlZ2luIn0pKSksZS50ZXJtaW5hdG9yX2VuZCYmdC5hZGRSdWxlKGUudGVybWluYXRvcl9lbmQse3R5cGU6ImVuZCJ9KSxlLmlsbGVnYWwmJnQuYWRkUnVsZShlLmlsbGVnYWwse3R5cGU6ImlsbGVnYWwifSksdH0odSksdX0oZSl9ZnVuY3Rpb24gRihlKXtyZXR1cm4hIWUmJihlLmVuZHNXaXRoUGFyZW50fHxGKGUuc3RhcnRzKSl9ZnVuY3Rpb24gVShlLHQpe3JldHVybiB0P051bWJlcih0KTpmdW5jdGlvbihlKXtyZXR1cm4gTC5pbmNsdWRlcyhlLnRvTG93ZXJDYXNlKCkpfShlKT8wOjF9ZnVuY3Rpb24gcShlKXtjb25zdCB0PXtwcm9wczpbImxhbmd1YWdlIiwiY29kZSIsImF1dG9kZXRlY3QiXSxkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue2RldGVjdGVkTGFuZ3VhZ2U6IiIsdW5rbm93bkxhbmd1YWdlOiExfX0sY29tcHV0ZWQ6e2NsYXNzTmFtZSgpe3JldHVybiB0aGlzLnVua25vd25MYW5ndWFnZT8iIjoiaGxqcyAiK3RoaXMuZGV0ZWN0ZWRMYW5ndWFnZX0saGlnaGxpZ2h0ZWQoKXtpZighdGhpcy5hdXRvRGV0ZWN0JiYhZS5nZXRMYW5ndWFnZSh0aGlzLmxhbmd1YWdlKSlyZXR1cm4gY29uc29sZS53YXJuKGBUaGUgbGFuZ3VhZ2UgIiR7dGhpcy5sYW5ndWFnZX0iIHlvdSBzcGVjaWZpZWQgY291bGQgbm90IGJlIGZvdW5kLmApLHRoaXMudW5rbm93bkxhbmd1YWdlPSEwLGkodGhpcy5jb2RlKTtsZXQgdDtyZXR1cm4gdGhpcy5hdXRvRGV0ZWN0Pyh0PWUuaGlnaGxpZ2h0QXV0byh0aGlzLmNvZGUpLHRoaXMuZGV0ZWN0ZWRMYW5ndWFnZT10Lmxhbmd1YWdlKToodD1lLmhpZ2hsaWdodCh0aGlzLmxhbmd1YWdlLHRoaXMuY29kZSx0aGlzLmlnbm9yZUlsbGVnYWxzKSx0aGlzLmRldGVjdGVkTGFuZ3VhZ2U9dGhpcy5sYW5ndWFnZSksdC52YWx1ZX0sYXV0b0RldGVjdCgpe3JldHVybiF0aGlzLmxhbmd1YWdlfHwoZT10aGlzLmF1dG9kZXRlY3QsQm9vbGVhbihlfHwiIj09PWUpKTt2YXIgZX0saWdub3JlSWxsZWdhbHM6KCk9PiEwfSxyZW5kZXIoZSl7cmV0dXJuIGUoInByZSIse30sW2UoImNvZGUiLHtjbGFzczp0aGlzLmNsYXNzTmFtZSxkb21Qcm9wczp7aW5uZXJIVE1MOnRoaXMuaGlnaGxpZ2h0ZWR9fSldKX19O3JldHVybntDb21wb25lbnQ6dCxWdWVQbHVnaW46e2luc3RhbGwoZSl7ZS5jb21wb25lbnQoImhpZ2hsaWdodGpzIix0KX19fX1jb25zdCB6PWksVj1zLHtub2RlU3RyZWFtOlcsbWVyZ2VTdHJlYW1zOkh9PWMsJD1TeW1ib2woIm5vbWF0Y2giKTt2YXIgSj1mdW5jdGlvbihlKXtjb25zdCB0PVtdLG49T2JqZWN0LmNyZWF0ZShudWxsKSxvPU9iamVjdC5jcmVhdGUobnVsbCksaT1bXTtsZXQgcz0hMDtjb25zdCB1PS8oXig8W14+XSs+fFx0fCkrfFxuKS9nbSxjPSJDb3VsZCBub3QgZmluZCB0aGUgbGFuZ3VhZ2UgJ3t9JywgZGlkIHlvdSBmb3JnZXQgdG8gbG9hZC9pbmNsdWRlIGEgbGFuZ3VhZ2UgbW9kdWxlPyIsbD17ZGlzYWJsZUF1dG9kZXRlY3Q6ITAsbmFtZToiUGxhaW4gdGV4dCIsY29udGFpbnM6W119O2xldCBwPXtub0hpZ2hsaWdodFJlOi9eKG5vLT9oaWdobGlnaHQpJC9pLGxhbmd1YWdlRGV0ZWN0UmU6L1xibGFuZyg/OnVhZ2UpPy0oW1x3LV0rKVxiL2ksY2xhc3NQcmVmaXg6ImhsanMtIix0YWJSZXBsYWNlOm51bGwsdXNlQlI6ITEsbGFuZ3VhZ2VzOm51bGwsX19lbWl0dGVyOmh9O2Z1bmN0aW9uIGYoZSl7cmV0dXJuIHAubm9IaWdobGlnaHRSZS50ZXN0KGUpfWZ1bmN0aW9uIGQoZSx0LG4scil7Y29uc3Qgbz17Y29kZTp0LGxhbmd1YWdlOmV9O0UoImJlZm9yZTpoaWdobGlnaHQiLG8pO2NvbnN0IGE9by5yZXN1bHQ/by5yZXN1bHQ6bShvLmxhbmd1YWdlLG8uY29kZSxuLHIpO3JldHVybiBhLmNvZGU9by5jb2RlLEUoImFmdGVyOmhpZ2hsaWdodCIsYSksYX1mdW5jdGlvbiBtKGUsdCxyLG8pe2NvbnN0IGk9dDtmdW5jdGlvbiB1KGUsdCl7Y29uc3Qgbj14LmNhc2VfaW5zZW5zaXRpdmU/dFswXS50b0xvd2VyQ2FzZSgpOnRbMF07cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLmtleXdvcmRzLG4pJiZlLmtleXdvcmRzW25dfWZ1bmN0aW9uIGwoKXtudWxsIT1DLnN1Ykxhbmd1YWdlP2Z1bmN0aW9uKCl7aWYoIiI9PT1rKXJldHVybjtsZXQgZT1udWxsO2lmKCJzdHJpbmciPT10eXBlb2YgQy5zdWJMYW5ndWFnZSl7aWYoIW5bQy5zdWJMYW5ndWFnZV0pcmV0dXJuIHZvaWQgTy5hZGRUZXh0KGspO2U9bShDLnN1Ykxhbmd1YWdlLGssITAsQVtDLnN1Ykxhbmd1YWdlXSksQVtDLnN1Ykxhbmd1YWdlXT1lLnRvcH1lbHNlIGU9dihrLEMuc3ViTGFuZ3VhZ2UubGVuZ3RoP0Muc3ViTGFuZ3VhZ2U6bnVsbCk7Qy5yZWxldmFuY2U+MCYmKGorPWUucmVsZXZhbmNlKSxPLmFkZFN1Ymxhbmd1YWdlKGUuZW1pdHRlcixlLmxhbmd1YWdlKX0oKTpmdW5jdGlvbigpe2lmKCFDLmtleXdvcmRzKXJldHVybiB2b2lkIE8uYWRkVGV4dChrKTtsZXQgZT0wO0Mua2V5d29yZFBhdHRlcm5SZS5sYXN0SW5kZXg9MDtsZXQgdD1DLmtleXdvcmRQYXR0ZXJuUmUuZXhlYyhrKSxuPSIiO2Zvcig7dDspe24rPWsuc3Vic3RyaW5nKGUsdC5pbmRleCk7Y29uc3Qgcj11KEMsdCk7aWYocil7Y29uc3RbZSxvXT1yO08uYWRkVGV4dChuKSxuPSIiLGorPW87Y29uc3QgYT14LmNsYXNzTmFtZUFsaWFzZXNbZV18fGU7Ty5hZGRLZXl3b3JkKHRbMF0sYSl9ZWxzZSBuKz10WzBdO2U9Qy5rZXl3b3JkUGF0dGVyblJlLmxhc3RJbmRleCx0PUMua2V5d29yZFBhdHRlcm5SZS5leGVjKGspfW4rPWsuc3Vic3RyKGUpLE8uYWRkVGV4dChuKX0oKSxrPSIifWZ1bmN0aW9uIGYoZSl7cmV0dXJuIGUuY2xhc3NOYW1lJiZPLm9wZW5Ob2RlKHguY2xhc3NOYW1lQWxpYXNlc1tlLmNsYXNzTmFtZV18fGUuY2xhc3NOYW1lKSxDPU9iamVjdC5jcmVhdGUoZSx7cGFyZW50Ont2YWx1ZTpDfX0pLEN9ZnVuY3Rpb24gaChlLHQsbil7bGV0IHI9ZnVuY3Rpb24oZSx0KXtjb25zdCBuPWUmJmUuZXhlYyh0KTtyZXR1cm4gbiYmMD09PW4uaW5kZXh9KGUuZW5kUmUsbik7aWYocil7aWYoZVsib246ZW5kIl0pe2NvbnN0IG49bmV3IGEoZSk7ZVsib246ZW5kIl0odCxuKSxuLmlnbm9yZSYmKHI9ITEpfWlmKHIpe2Zvcig7ZS5lbmRzUGFyZW50JiZlLnBhcmVudDspZT1lLnBhcmVudDtyZXR1cm4gZX19aWYoZS5lbmRzV2l0aFBhcmVudClyZXR1cm4gaChlLnBhcmVudCx0LG4pfWZ1bmN0aW9uIGQoZSl7cmV0dXJuIDA9PT1DLm1hdGNoZXIucmVnZXhJbmRleD8oays9ZVswXSwxKTooUD0hMCwwKX1mdW5jdGlvbiBnKGUpe2NvbnN0IHQ9ZVswXSxuPWUucnVsZSxyPW5ldyBhKG4pLG89W24uX19iZWZvcmVCZWdpbixuWyJvbjpiZWdpbiJdXTtmb3IoY29uc3QgbiBvZiBvKWlmKG4mJihuKGUsciksci5pZ25vcmUpKXJldHVybiBkKHQpO3JldHVybiBuJiZuLmVuZFNhbWVBc0JlZ2luJiYobi5lbmRSZT1uZXcgUmVnRXhwKHQucmVwbGFjZSgvWy0vXFxeJCorPy4oKXxbXF17fV0vZywiXFwkJiIpLCJtIikpLG4uc2tpcD9rKz10OihuLmV4Y2x1ZGVCZWdpbiYmKGsrPXQpLGwoKSxuLnJldHVybkJlZ2lufHxuLmV4Y2x1ZGVCZWdpbnx8KGs9dCkpLGYobiksbi5yZXR1cm5CZWdpbj8wOnQubGVuZ3RofWZ1bmN0aW9uIHkoZSl7Y29uc3QgdD1lWzBdLG49aS5zdWJzdHIoZS5pbmRleCkscj1oKEMsZSxuKTtpZighcilyZXR1cm4gJDtjb25zdCBvPUM7by5za2lwP2srPXQ6KG8ucmV0dXJuRW5kfHxvLmV4Y2x1ZGVFbmR8fChrKz10KSxsKCksby5leGNsdWRlRW5kJiYoaz10KSk7ZG97Qy5jbGFzc05hbWUmJk8uY2xvc2VOb2RlKCksQy5za2lwfHxDLnN1Ykxhbmd1YWdlfHwoais9Qy5yZWxldmFuY2UpLEM9Qy5wYXJlbnR9d2hpbGUoQyE9PXIucGFyZW50KTtyZXR1cm4gci5zdGFydHMmJihyLmVuZFNhbWVBc0JlZ2luJiYoci5zdGFydHMuZW5kUmU9ci5lbmRSZSksZihyLnN0YXJ0cykpLG8ucmV0dXJuRW5kPzA6dC5sZW5ndGh9bGV0IGI9e307ZnVuY3Rpb24gdyh0LG4pe2NvbnN0IG89biYmblswXTtpZihrKz10LG51bGw9PW8pcmV0dXJuIGwoKSwwO2lmKCJiZWdpbiI9PT1iLnR5cGUmJiJlbmQiPT09bi50eXBlJiZiLmluZGV4PT09bi5pbmRleCYmIiI9PT1vKXtpZihrKz1pLnNsaWNlKG4uaW5kZXgsbi5pbmRleCsxKSwhcyl7Y29uc3QgdD1uZXcgRXJyb3IoIjAgd2lkdGggbWF0Y2ggcmVnZXgiKTt0aHJvdyB0Lmxhbmd1YWdlTmFtZT1lLHQuYmFkUnVsZT1iLnJ1bGUsdH1yZXR1cm4gMX1pZihiPW4sImJlZ2luIj09PW4udHlwZSlyZXR1cm4gZyhuKTtpZigiaWxsZWdhbCI9PT1uLnR5cGUmJiFyKXtjb25zdCBlPW5ldyBFcnJvcignSWxsZWdhbCBsZXhlbWUgIicrbysnIiBmb3IgbW9kZSAiJysoQy5jbGFzc05hbWV8fCI8dW5uYW1lZD4iKSsnIicpO3Rocm93IGUubW9kZT1DLGV9aWYoImVuZCI9PT1uLnR5cGUpe2NvbnN0IGU9eShuKTtpZihlIT09JClyZXR1cm4gZX1pZigiaWxsZWdhbCI9PT1uLnR5cGUmJiIiPT09bylyZXR1cm4gMTtpZihJPjFlNSYmST4zKm4uaW5kZXgpe3Rocm93IG5ldyBFcnJvcigicG90ZW50aWFsIGluZmluaXRlIGxvb3AsIHdheSBtb3JlIGl0ZXJhdGlvbnMgdGhhbiBtYXRjaGVzIil9cmV0dXJuIGsrPW8sby5sZW5ndGh9Y29uc3QgeD1fKGUpO2lmKCF4KXRocm93IGNvbnNvbGUuZXJyb3IoYy5yZXBsYWNlKCJ7fSIsZSkpLG5ldyBFcnJvcignVW5rbm93biBsYW5ndWFnZTogIicrZSsnIicpO2NvbnN0IEU9Qih4KTtsZXQgUz0iIixDPW98fEU7Y29uc3QgQT17fSxPPW5ldyBwLl9fZW1pdHRlcihwKTshZnVuY3Rpb24oKXtjb25zdCBlPVtdO2ZvcihsZXQgdD1DO3QhPT14O3Q9dC5wYXJlbnQpdC5jbGFzc05hbWUmJmUudW5zaGlmdCh0LmNsYXNzTmFtZSk7ZS5mb3JFYWNoKChlPT5PLm9wZW5Ob2RlKGUpKSl9KCk7bGV0IGs9IiIsaj0wLFQ9MCxJPTAsUD0hMTt0cnl7Zm9yKEMubWF0Y2hlci5jb25zaWRlckFsbCgpOzspe0krKyxQP1A9ITE6Qy5tYXRjaGVyLmNvbnNpZGVyQWxsKCksQy5tYXRjaGVyLmxhc3RJbmRleD1UO2NvbnN0IGU9Qy5tYXRjaGVyLmV4ZWMoaSk7aWYoIWUpYnJlYWs7Y29uc3QgdD13KGkuc3Vic3RyaW5nKFQsZS5pbmRleCksZSk7VD1lLmluZGV4K3R9cmV0dXJuIHcoaS5zdWJzdHIoVCkpLE8uY2xvc2VBbGxOb2RlcygpLE8uZmluYWxpemUoKSxTPU8udG9IVE1MKCkse3JlbGV2YW5jZTpqLHZhbHVlOlMsbGFuZ3VhZ2U6ZSxpbGxlZ2FsOiExLGVtaXR0ZXI6Tyx0b3A6Q319Y2F0Y2godCl7aWYodC5tZXNzYWdlJiZ0Lm1lc3NhZ2UuaW5jbHVkZXMoIklsbGVnYWwiKSlyZXR1cm57aWxsZWdhbDohMCxpbGxlZ2FsQnk6e21zZzp0Lm1lc3NhZ2UsY29udGV4dDppLnNsaWNlKFQtMTAwLFQrMTAwKSxtb2RlOnQubW9kZX0sc29mYXI6UyxyZWxldmFuY2U6MCx2YWx1ZTp6KGkpLGVtaXR0ZXI6T307aWYocylyZXR1cm57aWxsZWdhbDohMSxyZWxldmFuY2U6MCx2YWx1ZTp6KGkpLGVtaXR0ZXI6TyxsYW5ndWFnZTplLHRvcDpDLGVycm9yUmFpc2VkOnR9O3Rocm93IHR9fWZ1bmN0aW9uIHYoZSx0KXt0PXR8fHAubGFuZ3VhZ2VzfHxPYmplY3Qua2V5cyhuKTtjb25zdCByPWZ1bmN0aW9uKGUpe2NvbnN0IHQ9e3JlbGV2YW5jZTowLGVtaXR0ZXI6bmV3IHAuX19lbWl0dGVyKHApLHZhbHVlOnooZSksaWxsZWdhbDohMSx0b3A6bH07cmV0dXJuIHQuZW1pdHRlci5hZGRUZXh0KGUpLHR9KGUpLG89dC5maWx0ZXIoXykuZmlsdGVyKHgpLm1hcCgodD0+bSh0LGUsITEpKSk7by51bnNoaWZ0KHIpO2NvbnN0IGE9by5zb3J0KCgoZSx0KT0+e2lmKGUucmVsZXZhbmNlIT09dC5yZWxldmFuY2UpcmV0dXJuIHQucmVsZXZhbmNlLWUucmVsZXZhbmNlO2lmKGUubGFuZ3VhZ2UmJnQubGFuZ3VhZ2Upe2lmKF8oZS5sYW5ndWFnZSkuc3VwZXJzZXRPZj09PXQubGFuZ3VhZ2UpcmV0dXJuIDE7aWYoXyh0Lmxhbmd1YWdlKS5zdXBlcnNldE9mPT09ZS5sYW5ndWFnZSlyZXR1cm4tMX1yZXR1cm4gMH0pKSxbaSxzXT1hLHU9aTtyZXR1cm4gdS5zZWNvbmRfYmVzdD1zLHV9ZnVuY3Rpb24gZyhlKXtyZXR1cm4gcC50YWJSZXBsYWNlfHxwLnVzZUJSP2UucmVwbGFjZSh1LChlPT4iXG4iPT09ZT9wLnVzZUJSPyI8YnI+IjplOnAudGFiUmVwbGFjZT9lLnJlcGxhY2UoL1x0L2cscC50YWJSZXBsYWNlKTplKSk6ZX1mdW5jdGlvbiB5KGUpe2xldCB0PW51bGw7Y29uc3Qgbj1mdW5jdGlvbihlKXtsZXQgdD1lLmNsYXNzTmFtZSsiICI7dCs9ZS5wYXJlbnROb2RlP2UucGFyZW50Tm9kZS5jbGFzc05hbWU6IiI7Y29uc3Qgbj1wLmxhbmd1YWdlRGV0ZWN0UmUuZXhlYyh0KTtpZihuKXtjb25zdCB0PV8oblsxXSk7cmV0dXJuIHR8fChjb25zb2xlLndhcm4oYy5yZXBsYWNlKCJ7fSIsblsxXSkpLGNvbnNvbGUud2FybigiRmFsbGluZyBiYWNrIHRvIG5vLWhpZ2hsaWdodCBtb2RlIGZvciB0aGlzIGJsb2NrLiIsZSkpLHQ/blsxXToibm8taGlnaGxpZ2h0In1yZXR1cm4gdC5zcGxpdCgvXHMrLykuZmluZCgoZT0+ZihlKXx8XyhlKSkpfShlKTtpZihmKG4pKXJldHVybjtFKCJiZWZvcmU6aGlnaGxpZ2h0QmxvY2siLHtibG9jazplLGxhbmd1YWdlOm59KSxwLnVzZUJSPyh0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHQuaW5uZXJIVE1MPWUuaW5uZXJIVE1MLnJlcGxhY2UoL1xuL2csIiIpLnJlcGxhY2UoLzxiclsgL10qPi9nLCJcbiIpKTp0PWU7Y29uc3Qgcj10LnRleHRDb250ZW50LGE9bj9kKG4sciwhMCk6dihyKSxpPVcodCk7aWYoaS5sZW5ndGgpe2NvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5pbm5lckhUTUw9YS52YWx1ZSxhLnZhbHVlPUgoaSxXKGUpLHIpfWEudmFsdWU9ZyhhLnZhbHVlKSxFKCJhZnRlcjpoaWdobGlnaHRCbG9jayIse2Jsb2NrOmUscmVzdWx0OmF9KSxlLmlubmVySFRNTD1hLnZhbHVlLGUuY2xhc3NOYW1lPWZ1bmN0aW9uKGUsdCxuKXtjb25zdCByPXQ/b1t0XTpuLGE9W2UudHJpbSgpXTtyZXR1cm4gZS5tYXRjaCgvXGJobGpzXGIvKXx8YS5wdXNoKCJobGpzIiksZS5pbmNsdWRlcyhyKXx8YS5wdXNoKHIpLGEuam9pbigiICIpLnRyaW0oKX0oZS5jbGFzc05hbWUsbixhLmxhbmd1YWdlKSxlLnJlc3VsdD17bGFuZ3VhZ2U6YS5sYW5ndWFnZSxyZTphLnJlbGV2YW5jZSxyZWxhdmFuY2U6YS5yZWxldmFuY2V9LGEuc2Vjb25kX2Jlc3QmJihlLnNlY29uZF9iZXN0PXtsYW5ndWFnZTphLnNlY29uZF9iZXN0Lmxhbmd1YWdlLHJlOmEuc2Vjb25kX2Jlc3QucmVsZXZhbmNlLHJlbGF2YW5jZTphLnNlY29uZF9iZXN0LnJlbGV2YW5jZX0pfWNvbnN0IGI9KCk9PntpZihiLmNhbGxlZClyZXR1cm47Yi5jYWxsZWQ9ITA7Y29uc3QgZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJwcmUgY29kZSIpO3QuZm9yRWFjaC5jYWxsKGUseSl9O2Z1bmN0aW9uIF8oZSl7cmV0dXJuIGU9KGV8fCIiKS50b0xvd2VyQ2FzZSgpLG5bZV18fG5bb1tlXV19ZnVuY3Rpb24gdyhlLHtsYW5ndWFnZU5hbWU6dH0peyJzdHJpbmciPT10eXBlb2YgZSYmKGU9W2VdKSxlLmZvckVhY2goKGU9PntvW2VdPXR9KSl9ZnVuY3Rpb24geChlKXtjb25zdCB0PV8oZSk7cmV0dXJuIHQmJiF0LmRpc2FibGVBdXRvZGV0ZWN0fWZ1bmN0aW9uIEUoZSx0KXtjb25zdCBuPWU7aS5mb3JFYWNoKChmdW5jdGlvbihlKXtlW25dJiZlW25dKHQpfSkpfU9iamVjdC5hc3NpZ24oZSx7aGlnaGxpZ2h0OmQsaGlnaGxpZ2h0QXV0bzp2LGZpeE1hcmt1cDpmdW5jdGlvbihlKXtyZXR1cm4gY29uc29sZS53YXJuKCJmaXhNYXJrdXAgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGVudGlyZWx5IGluIHYxMS4wIiksY29uc29sZS53YXJuKCJQbGVhc2Ugc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9oaWdobGlnaHRqcy9oaWdobGlnaHQuanMvaXNzdWVzLzI1MzQiKSxnKGUpfSxoaWdobGlnaHRCbG9jazp5LGNvbmZpZ3VyZTpmdW5jdGlvbihlKXtlLnVzZUJSJiYoY29uc29sZS53YXJuKCIndXNlQlInIG9wdGlvbiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgZW50aXJlbHkgaW4gdjExLjAiKSxjb25zb2xlLndhcm4oIlBsZWFzZSBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2hpZ2hsaWdodGpzL2hpZ2hsaWdodC5qcy9pc3N1ZXMvMjU1OSIpKSxwPVYocCxlKX0saW5pdEhpZ2hsaWdodGluZzpiLGluaXRIaWdobGlnaHRpbmdPbkxvYWQ6ZnVuY3Rpb24oKXt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsYiwhMSl9LHJlZ2lzdGVyTGFuZ3VhZ2U6ZnVuY3Rpb24odCxyKXtsZXQgbz1udWxsO3RyeXtvPXIoZSl9Y2F0Y2goZSl7aWYoY29uc29sZS5lcnJvcigiTGFuZ3VhZ2UgZGVmaW5pdGlvbiBmb3IgJ3t9JyBjb3VsZCBub3QgYmUgcmVnaXN0ZXJlZC4iLnJlcGxhY2UoInt9Iix0KSksIXMpdGhyb3cgZTtjb25zb2xlLmVycm9yKGUpLG89bH1vLm5hbWV8fChvLm5hbWU9dCksblt0XT1vLG8ucmF3RGVmaW5pdGlvbj1yLmJpbmQobnVsbCxlKSxvLmFsaWFzZXMmJncoby5hbGlhc2VzLHtsYW5ndWFnZU5hbWU6dH0pfSxsaXN0TGFuZ3VhZ2VzOmZ1bmN0aW9uKCl7cmV0dXJuIE9iamVjdC5rZXlzKG4pfSxnZXRMYW5ndWFnZTpfLHJlZ2lzdGVyQWxpYXNlczp3LHJlcXVpcmVMYW5ndWFnZTpmdW5jdGlvbihlKXtjb25zb2xlLndhcm4oInJlcXVpcmVMYW5ndWFnZSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgZW50aXJlbHkgaW4gdGhlIGZ1dHVyZS4iKSxjb25zb2xlLndhcm4oIlBsZWFzZSBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2hpZ2hsaWdodGpzL2hpZ2hsaWdodC5qcy9wdWxsLzI4NDQiKTtjb25zdCB0PV8oZSk7aWYodClyZXR1cm4gdDt0aHJvdyBuZXcgRXJyb3IoIlRoZSAne30nIGxhbmd1YWdlIGlzIHJlcXVpcmVkLCBidXQgbm90IGxvYWRlZC4iLnJlcGxhY2UoInt9IixlKSl9LGF1dG9EZXRlY3Rpb246eCxpbmhlcml0OlYsYWRkUGx1Z2luOmZ1bmN0aW9uKGUpe2kucHVzaChlKX0sdnVlUGx1Z2luOnEoZSkuVnVlUGx1Z2lufSksZS5kZWJ1Z01vZGU9ZnVuY3Rpb24oKXtzPSExfSxlLnNhZmVNb2RlPWZ1bmN0aW9uKCl7cz0hMH0sZS52ZXJzaW9uU3RyaW5nPSIxMC40LjEiO2Zvcihjb25zdCBlIGluIEQpIm9iamVjdCI9PXR5cGVvZiBEW2VdJiZyKERbZV0pO3JldHVybiBPYmplY3QuYXNzaWduKGUsRCksZX0oe30pO2UuZXhwb3J0cz1KfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTA0MSksbz1hKEVycm9yKTtmdW5jdGlvbiBhKGUpe3JldHVybiB0LmRpc3BsYXlOYW1lPWUuZGlzcGxheU5hbWV8fGUubmFtZSx0O2Z1bmN0aW9uIHQodCl7cmV0dXJuIHQmJih0PXIuYXBwbHkobnVsbCxhcmd1bWVudHMpKSxuZXcgZSh0KX19ZS5leHBvcnRzPW8sby5ldmFsPWEoRXZhbEVycm9yKSxvLnJhbmdlPWEoUmFuZ2VFcnJvciksby5yZWZlcmVuY2U9YShSZWZlcmVuY2VFcnJvciksby5zeW50YXg9YShTeW50YXhFcnJvciksby50eXBlPWEoVHlwZUVycm9yKSxvLnVyaT1hKFVSSUVycm9yKSxvLmNyZWF0ZT1hfSxmdW5jdGlvbihlLHQsbil7IWZ1bmN0aW9uKCl7dmFyIHQ7ZnVuY3Rpb24gbihlKXtmb3IodmFyIHQsbixyLG8sYT0xLGk9W10uc2xpY2UuY2FsbChhcmd1bWVudHMpLHM9MCx1PWUubGVuZ3RoLGM9IiIsbD0hMSxwPSExLGY9ZnVuY3Rpb24oKXtyZXR1cm4gaVthKytdfSxoPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPSIiOy9cZC8udGVzdChlW3NdKTspbis9ZVtzKytdLHQ9ZVtzXTtyZXR1cm4gbi5sZW5ndGg+MD9wYXJzZUludChuKTpudWxsfTtzPHU7KytzKWlmKHQ9ZVtzXSxsKXN3aXRjaChsPSExLCIuIj09dD8ocD0hMSx0PWVbKytzXSk6IjAiPT10JiYiLiI9PWVbcysxXT8ocD0hMCx0PWVbcys9Ml0pOnA9ITAsbz1oKCksdCl7Y2FzZSJiIjpjKz1wYXJzZUludChmKCksMTApLnRvU3RyaW5nKDIpO2JyZWFrO2Nhc2UiYyI6Yys9InN0cmluZyI9PXR5cGVvZihuPWYoKSl8fG4gaW5zdGFuY2VvZiBTdHJpbmc/bjpTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KG4sMTApKTticmVhaztjYXNlImQiOmMrPXBhcnNlSW50KGYoKSwxMCk7YnJlYWs7Y2FzZSJmIjpyPVN0cmluZyhwYXJzZUZsb2F0KGYoKSkudG9GaXhlZChvfHw2KSksYys9cD9yOnIucmVwbGFjZSgvXjAvLCIiKTticmVhaztjYXNlImoiOmMrPUpTT04uc3RyaW5naWZ5KGYoKSk7YnJlYWs7Y2FzZSJvIjpjKz0iMCIrcGFyc2VJbnQoZigpLDEwKS50b1N0cmluZyg4KTticmVhaztjYXNlInMiOmMrPWYoKTticmVhaztjYXNlIngiOmMrPSIweCIrcGFyc2VJbnQoZigpLDEwKS50b1N0cmluZygxNik7YnJlYWs7Y2FzZSJYIjpjKz0iMHgiK3BhcnNlSW50KGYoKSwxMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7YnJlYWs7ZGVmYXVsdDpjKz10fWVsc2UiJSI9PT10P2w9ITA6Yys9dDtyZXR1cm4gY30odD1lLmV4cG9ydHM9bikuZm9ybWF0PW4sdC52c3ByaW50Zj1mdW5jdGlvbihlLHQpe3JldHVybiBuLmFwcGx5KG51bGwsW2VdLmNvbmNhdCh0KSl9LCJ1bmRlZmluZWQiIT10eXBlb2YgY29uc29sZSYmImZ1bmN0aW9uIj09dHlwZW9mIGNvbnNvbGUubG9nJiYodC5wcmludGY9ZnVuY3Rpb24oKXtjb25zb2xlLmxvZyhuLmFwcGx5KG51bGwsYXJndW1lbnRzKSl9KX0oKX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZihudWxsPT1lKXJldHVybnt9O3ZhciBuLHIsbz17fSxhPU9iamVjdC5rZXlzKGUpO2ZvcihyPTA7cjxhLmxlbmd0aDtyKyspbj1hW3JdLHQuaW5kZXhPZihuKT49MHx8KG9bbl09ZVtuXSk7cmV0dXJuIG99fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big0OTIpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiByKGUpfX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSkpcmV0dXJuIEFycmF5LmZyb20oZSl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big0OTIpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2lmKGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gcihlLHQpO3ZhciBuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LC0xKTtyZXR1cm4iT2JqZWN0Ij09PW4mJmUuY29uc3RydWN0b3ImJihuPWUuY29uc3RydWN0b3IubmFtZSksIk1hcCI9PT1ufHwiU2V0Ij09PW4/QXJyYXkuZnJvbShlKToiQXJndW1lbnRzIj09PW58fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pP3IoZSx0KTp2b2lkIDB9fX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKX19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdCBpbiBlP09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTplW3RdPW4sZX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDM5Myk7ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDEwNTApO2UuZXhwb3J0cz1yfSxmdW5jdGlvbihlLHQsbil7bigxMDUxKTt2YXIgcj1uKDMzKTtlLmV4cG9ydHM9ci5PYmplY3QuZW50cmllc30sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMjIpLG89big0NTcpLmVudHJpZXM7cih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITB9LHtlbnRyaWVzOmZ1bmN0aW9uKGUpe3JldHVybiBvKGUpfX0pfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTA1Myksbz1uKDQ5NCksYT1uKDI4MiksaT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHM9e2JyYWNrZXRzOmZ1bmN0aW9uKGUpe3JldHVybiBlKyJbXSJ9LGNvbW1hOiJjb21tYSIsaW5kaWNlczpmdW5jdGlvbihlLHQpe3JldHVybiBlKyJbIit0KyJdIn0scmVwZWF0OmZ1bmN0aW9uKGUpe3JldHVybiBlfX0sdT1BcnJheS5pc0FycmF5LGM9QXJyYXkucHJvdG90eXBlLnB1c2gsbD1mdW5jdGlvbihlLHQpe2MuYXBwbHkoZSx1KHQpP3Q6W3RdKX0scD1EYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZyxmPWEuZGVmYXVsdCxoPXthZGRRdWVyeVByZWZpeDohMSxhbGxvd0RvdHM6ITEsY2hhcnNldDoidXRmLTgiLGNoYXJzZXRTZW50aW5lbDohMSxkZWxpbWl0ZXI6IiYiLGVuY29kZTohMCxlbmNvZGVyOm8uZW5jb2RlLGVuY29kZVZhbHVlc09ubHk6ITEsZm9ybWF0OmYsZm9ybWF0dGVyOmEuZm9ybWF0dGVyc1tmXSxpbmRpY2VzOiExLHNlcmlhbGl6ZURhdGU6ZnVuY3Rpb24oZSl7cmV0dXJuIHAuY2FsbChlKX0sc2tpcE51bGxzOiExLHN0cmljdE51bGxIYW5kbGluZzohMX0sZD1mdW5jdGlvbiBlKHQsbixhLGkscyxjLHAsZixkLG0sdixnLHksYixfKXt2YXIgdyx4PXQ7aWYoXy5oYXModCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkN5Y2xpYyBvYmplY3QgdmFsdWUiKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgcD94PXAobix4KTp4IGluc3RhbmNlb2YgRGF0ZT94PW0oeCk6ImNvbW1hIj09PWEmJnUoeCkmJih4PW8ubWF5YmVNYXAoeCwoZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBEYXRlP20oZSk6ZX0pKSksbnVsbD09PXgpe2lmKGkpcmV0dXJuIGMmJiF5P2MobixoLmVuY29kZXIsYiwia2V5Iix2KTpuO3g9IiJ9aWYoInN0cmluZyI9PXR5cGVvZih3PXgpfHwibnVtYmVyIj09dHlwZW9mIHd8fCJib29sZWFuIj09dHlwZW9mIHd8fCJzeW1ib2wiPT10eXBlb2Ygd3x8ImJpZ2ludCI9PXR5cGVvZiB3fHxvLmlzQnVmZmVyKHgpKXJldHVybiBjP1tnKHk/bjpjKG4saC5lbmNvZGVyLGIsImtleSIsdikpKyI9IitnKGMoeCxoLmVuY29kZXIsYiwidmFsdWUiLHYpKV06W2cobikrIj0iK2coU3RyaW5nKHgpKV07dmFyIEUsUz1bXTtpZih2b2lkIDA9PT14KXJldHVybiBTO2lmKCJjb21tYSI9PT1hJiZ1KHgpKUU9W3t2YWx1ZTp4Lmxlbmd0aD4wP3guam9pbigiLCIpfHxudWxsOnZvaWQgMH1dO2Vsc2UgaWYodShwKSlFPXA7ZWxzZXt2YXIgQz1PYmplY3Qua2V5cyh4KTtFPWY/Qy5zb3J0KGYpOkN9Zm9yKHZhciBBPTA7QTxFLmxlbmd0aDsrK0Epe3ZhciBPPUVbQV0saz0ib2JqZWN0Ij09dHlwZW9mIE8mJnZvaWQgMCE9PU8udmFsdWU/Ty52YWx1ZTp4W09dO2lmKCFzfHxudWxsIT09ayl7dmFyIGo9dSh4KT8iZnVuY3Rpb24iPT10eXBlb2YgYT9hKG4sTyk6bjpuKyhkPyIuIitPOiJbIitPKyJdIik7Xy5zZXQodCwhMCk7dmFyIFQ9cigpO2woUyxlKGssaixhLGkscyxjLHAsZixkLG0sdixnLHksYixUKSl9fXJldHVybiBTfTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgbixvPWUsYz1mdW5jdGlvbihlKXtpZighZSlyZXR1cm4gaDtpZihudWxsIT09ZS5lbmNvZGVyJiZ2b2lkIDAhPT1lLmVuY29kZXImJiJmdW5jdGlvbiIhPXR5cGVvZiBlLmVuY29kZXIpdGhyb3cgbmV3IFR5cGVFcnJvcigiRW5jb2RlciBoYXMgdG8gYmUgYSBmdW5jdGlvbi4iKTt2YXIgdD1lLmNoYXJzZXR8fGguY2hhcnNldDtpZih2b2lkIDAhPT1lLmNoYXJzZXQmJiJ1dGYtOCIhPT1lLmNoYXJzZXQmJiJpc28tODg1OS0xIiE9PWUuY2hhcnNldCl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgY2hhcnNldCBvcHRpb24gbXVzdCBiZSBlaXRoZXIgdXRmLTgsIGlzby04ODU5LTEsIG9yIHVuZGVmaW5lZCIpO3ZhciBuPWEuZGVmYXVsdDtpZih2b2lkIDAhPT1lLmZvcm1hdCl7aWYoIWkuY2FsbChhLmZvcm1hdHRlcnMsZS5mb3JtYXQpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZm9ybWF0IG9wdGlvbiBwcm92aWRlZC4iKTtuPWUuZm9ybWF0fXZhciByPWEuZm9ybWF0dGVyc1tuXSxvPWguZmlsdGVyO3JldHVybigiZnVuY3Rpb24iPT10eXBlb2YgZS5maWx0ZXJ8fHUoZS5maWx0ZXIpKSYmKG89ZS5maWx0ZXIpLHthZGRRdWVyeVByZWZpeDoiYm9vbGVhbiI9PXR5cGVvZiBlLmFkZFF1ZXJ5UHJlZml4P2UuYWRkUXVlcnlQcmVmaXg6aC5hZGRRdWVyeVByZWZpeCxhbGxvd0RvdHM6dm9pZCAwPT09ZS5hbGxvd0RvdHM/aC5hbGxvd0RvdHM6ISFlLmFsbG93RG90cyxjaGFyc2V0OnQsY2hhcnNldFNlbnRpbmVsOiJib29sZWFuIj09dHlwZW9mIGUuY2hhcnNldFNlbnRpbmVsP2UuY2hhcnNldFNlbnRpbmVsOmguY2hhcnNldFNlbnRpbmVsLGRlbGltaXRlcjp2b2lkIDA9PT1lLmRlbGltaXRlcj9oLmRlbGltaXRlcjplLmRlbGltaXRlcixlbmNvZGU6ImJvb2xlYW4iPT10eXBlb2YgZS5lbmNvZGU/ZS5lbmNvZGU6aC5lbmNvZGUsZW5jb2RlcjoiZnVuY3Rpb24iPT10eXBlb2YgZS5lbmNvZGVyP2UuZW5jb2RlcjpoLmVuY29kZXIsZW5jb2RlVmFsdWVzT25seToiYm9vbGVhbiI9PXR5cGVvZiBlLmVuY29kZVZhbHVlc09ubHk/ZS5lbmNvZGVWYWx1ZXNPbmx5OmguZW5jb2RlVmFsdWVzT25seSxmaWx0ZXI6byxmb3JtYXQ6bixmb3JtYXR0ZXI6cixzZXJpYWxpemVEYXRlOiJmdW5jdGlvbiI9PXR5cGVvZiBlLnNlcmlhbGl6ZURhdGU/ZS5zZXJpYWxpemVEYXRlOmguc2VyaWFsaXplRGF0ZSxza2lwTnVsbHM6ImJvb2xlYW4iPT10eXBlb2YgZS5za2lwTnVsbHM/ZS5za2lwTnVsbHM6aC5za2lwTnVsbHMsc29ydDoiZnVuY3Rpb24iPT10eXBlb2YgZS5zb3J0P2Uuc29ydDpudWxsLHN0cmljdE51bGxIYW5kbGluZzoiYm9vbGVhbiI9PXR5cGVvZiBlLnN0cmljdE51bGxIYW5kbGluZz9lLnN0cmljdE51bGxIYW5kbGluZzpoLnN0cmljdE51bGxIYW5kbGluZ319KHQpOyJmdW5jdGlvbiI9PXR5cGVvZiBjLmZpbHRlcj9vPSgwLGMuZmlsdGVyKSgiIixvKTp1KGMuZmlsdGVyKSYmKG49Yy5maWx0ZXIpO3ZhciBwLGY9W107aWYoIm9iamVjdCIhPXR5cGVvZiBvfHxudWxsPT09bylyZXR1cm4iIjtwPXQmJnQuYXJyYXlGb3JtYXQgaW4gcz90LmFycmF5Rm9ybWF0OnQmJiJpbmRpY2VzImluIHQ/dC5pbmRpY2VzPyJpbmRpY2VzIjoicmVwZWF0IjoiaW5kaWNlcyI7dmFyIG09c1twXTtufHwobj1PYmplY3Qua2V5cyhvKSksYy5zb3J0JiZuLnNvcnQoYy5zb3J0KTtmb3IodmFyIHY9cigpLGc9MDtnPG4ubGVuZ3RoOysrZyl7dmFyIHk9bltnXTtjLnNraXBOdWxscyYmbnVsbD09PW9beV18fGwoZixkKG9beV0seSxtLGMuc3RyaWN0TnVsbEhhbmRsaW5nLGMuc2tpcE51bGxzLGMuZW5jb2RlP2MuZW5jb2RlcjpudWxsLGMuZmlsdGVyLGMuc29ydCxjLmFsbG93RG90cyxjLnNlcmlhbGl6ZURhdGUsYy5mb3JtYXQsYy5mb3JtYXR0ZXIsYy5lbmNvZGVWYWx1ZXNPbmx5LGMuY2hhcnNldCx2KSl9dmFyIGI9Zi5qb2luKGMuZGVsaW1pdGVyKSxfPSEwPT09Yy5hZGRRdWVyeVByZWZpeD8iPyI6IiI7cmV0dXJuIGMuY2hhcnNldFNlbnRpbmVsJiYoImlzby04ODU5LTEiPT09Yy5jaGFyc2V0P18rPSJ1dGY4PSUyNiUyMzEwMDAzJTNCJiI6Xys9InV0Zjg9JUUyJTlDJTkzJiIpLGIubGVuZ3RoPjA/XytiOiIifX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDI4MCksbz1uKDEwNTgpLGE9bigxMDYwKSxpPXIoIiVUeXBlRXJyb3IlIikscz1yKCIlV2Vha01hcCUiLCEwKSx1PXIoIiVNYXAlIiwhMCksYz1vKCJXZWFrTWFwLnByb3RvdHlwZS5nZXQiLCEwKSxsPW8oIldlYWtNYXAucHJvdG90eXBlLnNldCIsITApLHA9bygiV2Vha01hcC5wcm90b3R5cGUuaGFzIiwhMCksZj1vKCJNYXAucHJvdG90eXBlLmdldCIsITApLGg9bygiTWFwLnByb3RvdHlwZS5zZXQiLCEwKSxkPW8oIk1hcC5wcm90b3R5cGUuaGFzIiwhMCksbT1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbixyPWU7bnVsbCE9PShuPXIubmV4dCk7cj1uKWlmKG4ua2V5PT09dClyZXR1cm4gci5uZXh0PW4ubmV4dCxuLm5leHQ9ZS5uZXh0LGUubmV4dD1uLG59O2UuZXhwb3J0cz1mdW5jdGlvbigpe3ZhciBlLHQsbixyPXthc3NlcnQ6ZnVuY3Rpb24oZSl7aWYoIXIuaGFzKGUpKXRocm93IG5ldyBpKCJTaWRlIGNoYW5uZWwgZG9lcyBub3QgY29udGFpbiAiK2EoZSkpfSxnZXQ6ZnVuY3Rpb24ocil7aWYocyYmciYmKCJvYmplY3QiPT10eXBlb2Ygcnx8ImZ1bmN0aW9uIj09dHlwZW9mIHIpKXtpZihlKXJldHVybiBjKGUscil9ZWxzZSBpZih1KXtpZih0KXJldHVybiBmKHQscil9ZWxzZSBpZihuKXJldHVybiBmdW5jdGlvbihlLHQpe3ZhciBuPW0oZSx0KTtyZXR1cm4gbiYmbi52YWx1ZX0obixyKX0saGFzOmZ1bmN0aW9uKHIpe2lmKHMmJnImJigib2JqZWN0Ij09dHlwZW9mIHJ8fCJmdW5jdGlvbiI9PXR5cGVvZiByKSl7aWYoZSlyZXR1cm4gcChlLHIpfWVsc2UgaWYodSl7aWYodClyZXR1cm4gZCh0LHIpfWVsc2UgaWYobilyZXR1cm4gZnVuY3Rpb24oZSx0KXtyZXR1cm4hIW0oZSx0KX0obixyKTtyZXR1cm4hMX0sc2V0OmZ1bmN0aW9uKHIsbyl7cyYmciYmKCJvYmplY3QiPT10eXBlb2Ygcnx8ImZ1bmN0aW9uIj09dHlwZW9mIHIpPyhlfHwoZT1uZXcgcyksbChlLHIsbykpOnU/KHR8fCh0PW5ldyB1KSxoKHQscixvKSk6KG58fChuPXtrZXk6e30sbmV4dDpudWxsfSksZnVuY3Rpb24oZSx0LG4pe3ZhciByPW0oZSx0KTtyP3IudmFsdWU9bjplLm5leHQ9e2tleTp0LG5leHQ6ZS5uZXh0LHZhbHVlOm59fShuLHIsbykpfX07cmV0dXJuIHJ9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPSJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wsbz1uKDEwNTUpO2UuZXhwb3J0cz1mdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiByJiYoImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmKCJzeW1ib2wiPT10eXBlb2YgcigiZm9vIikmJigic3ltYm9sIj09dHlwZW9mIFN5bWJvbCgiYmFyIikmJm8oKSkpKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPWZ1bmN0aW9uKCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIFN5bWJvbHx8ImZ1bmN0aW9uIiE9dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpcmV0dXJuITE7aWYoInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3IpcmV0dXJuITA7dmFyIGU9e30sdD1TeW1ib2woInRlc3QiKSxuPU9iamVjdCh0KTtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuITE7aWYoIltvYmplY3QgU3ltYm9sXSIhPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpcmV0dXJuITE7aWYoIltvYmplY3QgU3ltYm9sXSIhPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobikpcmV0dXJuITE7Zm9yKHQgaW4gZVt0XT00MixlKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3Qua2V5cyYmMCE9PU9iamVjdC5rZXlzKGUpLmxlbmd0aClyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMmJjAhPT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKS5sZW5ndGgpcmV0dXJuITE7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtpZigxIT09ci5sZW5ndGh8fHJbMF0hPT10KXJldHVybiExO2lmKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSx0KSlyZXR1cm4hMTtpZigiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcil7dmFyIG89T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpO2lmKDQyIT09by52YWx1ZXx8ITAhPT1vLmVudW1lcmFibGUpcmV0dXJuITF9cmV0dXJuITB9fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPSJGdW5jdGlvbi5wcm90b3R5cGUuYmluZCBjYWxsZWQgb24gaW5jb21wYXRpYmxlICIsbz1BcnJheS5wcm90b3R5cGUuc2xpY2UsYT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLGk9IltvYmplY3QgRnVuY3Rpb25dIjtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpZigiZnVuY3Rpb24iIT10eXBlb2YgdHx8YS5jYWxsKHQpIT09aSl0aHJvdyBuZXcgVHlwZUVycm9yKHIrdCk7Zm9yKHZhciBuLHM9by5jYWxsKGFyZ3VtZW50cywxKSx1PWZ1bmN0aW9uKCl7aWYodGhpcyBpbnN0YW5jZW9mIG4pe3ZhciByPXQuYXBwbHkodGhpcyxzLmNvbmNhdChvLmNhbGwoYXJndW1lbnRzKSkpO3JldHVybiBPYmplY3Qocik9PT1yP3I6dGhpc31yZXR1cm4gdC5hcHBseShlLHMuY29uY2F0KG8uY2FsbChhcmd1bWVudHMpKSl9LGM9TWF0aC5tYXgoMCx0Lmxlbmd0aC1zLmxlbmd0aCksbD1bXSxwPTA7cDxjO3ArKylsLnB1c2goIiQiK3ApO2lmKG49RnVuY3Rpb24oImJpbmRlciIsInJldHVybiBmdW5jdGlvbiAoIitsLmpvaW4oIiwiKSsiKXsgcmV0dXJuIGJpbmRlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk7IH0iKSh1KSx0LnByb3RvdHlwZSl7dmFyIGY9ZnVuY3Rpb24oKXt9O2YucHJvdG90eXBlPXQucHJvdG90eXBlLG4ucHJvdG90eXBlPW5ldyBmLGYucHJvdG90eXBlPW51bGx9cmV0dXJuIG59fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMjgxKTtlLmV4cG9ydHM9ci5jYWxsKEZ1bmN0aW9uLmNhbGwsT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyODApLG89bigxMDU5KSxhPW8ocigiU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mIikpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3ZhciBuPXIoZSwhIXQpO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuJiZhKGUsIi5wcm90b3R5cGUuIik+LTE/byhuKTpufX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDI4MSksbz1uKDI4MCksYT1vKCIlRnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5JSIpLGk9bygiJUZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsJSIpLHM9bygiJVJlZmxlY3QuYXBwbHklIiwhMCl8fHIuY2FsbChpLGEpLHU9bygiJU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IlIiwhMCksYz1vKCIlT2JqZWN0LmRlZmluZVByb3BlcnR5JSIsITApLGw9bygiJU1hdGgubWF4JSIpO2lmKGMpdHJ5e2Moe30sImEiLHt2YWx1ZToxfSl9Y2F0Y2goZSl7Yz1udWxsfWUuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1zKHIsaSxhcmd1bWVudHMpO2lmKHUmJmMpe3ZhciBuPXUodCwibGVuZ3RoIik7bi5jb25maWd1cmFibGUmJmModCwibGVuZ3RoIix7dmFsdWU6MStsKDAsZS5sZW5ndGgtKGFyZ3VtZW50cy5sZW5ndGgtMSkpfSl9cmV0dXJuIHR9O3ZhciBwPWZ1bmN0aW9uKCl7cmV0dXJuIHMocixhLGFyZ3VtZW50cyl9O2M/YyhlLmV4cG9ydHMsImFwcGx5Iix7dmFsdWU6cH0pOmUuZXhwb3J0cy5hcHBseT1wfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9ImZ1bmN0aW9uIj09dHlwZW9mIE1hcCYmTWFwLnByb3RvdHlwZSxvPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3ImJnI/T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihNYXAucHJvdG90eXBlLCJzaXplIik6bnVsbCxhPXImJm8mJiJmdW5jdGlvbiI9PXR5cGVvZiBvLmdldD9vLmdldDpudWxsLGk9ciYmTWFwLnByb3RvdHlwZS5mb3JFYWNoLHM9ImZ1bmN0aW9uIj09dHlwZW9mIFNldCYmU2V0LnByb3RvdHlwZSx1PU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3ImJnM/T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihTZXQucHJvdG90eXBlLCJzaXplIik6bnVsbCxjPXMmJnUmJiJmdW5jdGlvbiI9PXR5cGVvZiB1LmdldD91LmdldDpudWxsLGw9cyYmU2V0LnByb3RvdHlwZS5mb3JFYWNoLHA9ImZ1bmN0aW9uIj09dHlwZW9mIFdlYWtNYXAmJldlYWtNYXAucHJvdG90eXBlP1dlYWtNYXAucHJvdG90eXBlLmhhczpudWxsLGY9ImZ1bmN0aW9uIj09dHlwZW9mIFdlYWtTZXQmJldlYWtTZXQucHJvdG90eXBlP1dlYWtTZXQucHJvdG90eXBlLmhhczpudWxsLGg9ImZ1bmN0aW9uIj09dHlwZW9mIFdlYWtSZWYmJldlYWtSZWYucHJvdG90eXBlP1dlYWtSZWYucHJvdG90eXBlLmRlcmVmOm51bGwsZD1Cb29sZWFuLnByb3RvdHlwZS52YWx1ZU9mLG09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyx2PUZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyxnPVN0cmluZy5wcm90b3R5cGUubWF0Y2gseT0iZnVuY3Rpb24iPT10eXBlb2YgQmlnSW50P0JpZ0ludC5wcm90b3R5cGUudmFsdWVPZjpudWxsLGI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxfPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP1N5bWJvbC5wcm90b3R5cGUudG9TdHJpbmc6bnVsbCx3PSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJvYmplY3QiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yLHg9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxFPSgiZnVuY3Rpb24iPT10eXBlb2YgUmVmbGVjdD9SZWZsZWN0LmdldFByb3RvdHlwZU9mOk9iamVjdC5nZXRQcm90b3R5cGVPZil8fChbXS5fX3Byb3RvX189PT1BcnJheS5wcm90b3R5cGU/ZnVuY3Rpb24oZSl7cmV0dXJuIGUuX19wcm90b19ffTpudWxsKSxTPW4oMTA2MSkuY3VzdG9tLEM9UyYmVChTKT9TOm51bGwsQT0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ2b2lkIDAhPT1TeW1ib2wudG9TdHJpbmdUYWc/U3ltYm9sLnRvU3RyaW5nVGFnOm51bGw7ZnVuY3Rpb24gTyhlLHQsbil7dmFyIHI9ImRvdWJsZSI9PT0obi5xdW90ZVN0eWxlfHx0KT8nIic6IiciO3JldHVybiByK2Urcn1mdW5jdGlvbiBrKGUpe3JldHVybiBTdHJpbmcoZSkucmVwbGFjZSgvIi9nLCImcXVvdDsiKX1mdW5jdGlvbiBqKGUpe3JldHVybiEoIltvYmplY3QgQXJyYXldIiE9PU4oZSl8fEEmJiJvYmplY3QiPT10eXBlb2YgZSYmQSBpbiBlKX1mdW5jdGlvbiBUKGUpe2lmKHcpcmV0dXJuIGUmJiJvYmplY3QiPT10eXBlb2YgZSYmZSBpbnN0YW5jZW9mIFN5bWJvbDtpZigic3ltYm9sIj09dHlwZW9mIGUpcmV0dXJuITA7aWYoIWV8fCJvYmplY3QiIT10eXBlb2YgZXx8IV8pcmV0dXJuITE7dHJ5e3JldHVybiBfLmNhbGwoZSksITB9Y2F0Y2goZSl7fXJldHVybiExfWUuZXhwb3J0cz1mdW5jdGlvbiBlKHQsbixyLG8pe3ZhciBzPW58fHt9O2lmKFAocywicXVvdGVTdHlsZSIpJiYic2luZ2xlIiE9PXMucXVvdGVTdHlsZSYmImRvdWJsZSIhPT1zLnF1b3RlU3R5bGUpdGhyb3cgbmV3IFR5cGVFcnJvcignb3B0aW9uICJxdW90ZVN0eWxlIiBtdXN0IGJlICJzaW5nbGUiIG9yICJkb3VibGUiJyk7aWYoUChzLCJtYXhTdHJpbmdMZW5ndGgiKSYmKCJudW1iZXIiPT10eXBlb2Ygcy5tYXhTdHJpbmdMZW5ndGg/cy5tYXhTdHJpbmdMZW5ndGg8MCYmcy5tYXhTdHJpbmdMZW5ndGghPT0xLzA6bnVsbCE9PXMubWF4U3RyaW5nTGVuZ3RoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb24gIm1heFN0cmluZ0xlbmd0aCIsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgSW5maW5pdHksIG9yIGBudWxsYCcpO3ZhciB1PSFQKHMsImN1c3RvbUluc3BlY3QiKXx8cy5jdXN0b21JbnNwZWN0O2lmKCJib29sZWFuIiE9dHlwZW9mIHUmJiJzeW1ib2wiIT09dSl0aHJvdyBuZXcgVHlwZUVycm9yKCJvcHRpb24gXCJjdXN0b21JbnNwZWN0XCIsIGlmIHByb3ZpZGVkLCBtdXN0IGJlIGB0cnVlYCwgYGZhbHNlYCwgb3IgYCdzeW1ib2wnYCIpO2lmKFAocywiaW5kZW50IikmJm51bGwhPT1zLmluZGVudCYmIlx0IiE9PXMuaW5kZW50JiYhKHBhcnNlSW50KHMuaW5kZW50LDEwKT09PXMuaW5kZW50JiZzLmluZGVudD4wKSl0aHJvdyBuZXcgVHlwZUVycm9yKCdvcHRpb25zICJpbmRlbnQiIG11c3QgYmUgIlxcdCIsIGFuIGludGVnZXIgPiAwLCBvciBgbnVsbGAnKTtpZih2b2lkIDA9PT10KXJldHVybiJ1bmRlZmluZWQiO2lmKG51bGw9PT10KXJldHVybiJudWxsIjtpZigiYm9vbGVhbiI9PXR5cGVvZiB0KXJldHVybiB0PyJ0cnVlIjoiZmFsc2UiO2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gUih0LHMpO2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gMD09PXQ/MS8wL3Q+MD8iMCI6Ii0wIjpTdHJpbmcodCk7aWYoImJpZ2ludCI9PXR5cGVvZiB0KXJldHVybiBTdHJpbmcodCkrIm4iO3ZhciBtPXZvaWQgMD09PXMuZGVwdGg/NTpzLmRlcHRoO2lmKHZvaWQgMD09PXImJihyPTApLHI+PW0mJm0+MCYmIm9iamVjdCI9PXR5cGVvZiB0KXJldHVybiBqKHQpPyJbQXJyYXldIjoiW09iamVjdF0iO3ZhciBiPWZ1bmN0aW9uKGUsdCl7dmFyIG47aWYoIlx0Ij09PWUuaW5kZW50KW49Ilx0IjtlbHNle2lmKCEoIm51bWJlciI9PXR5cGVvZiBlLmluZGVudCYmZS5pbmRlbnQ+MCkpcmV0dXJuIG51bGw7bj1BcnJheShlLmluZGVudCsxKS5qb2luKCIgIil9cmV0dXJue2Jhc2U6bixwcmV2OkFycmF5KHQrMSkuam9pbihuKX19KHMscik7aWYodm9pZCAwPT09bylvPVtdO2Vsc2UgaWYoTShvLHQpPj0wKXJldHVybiJbQ2lyY3VsYXJdIjtmdW5jdGlvbiB4KHQsbixhKXtpZihuJiYobz1vLnNsaWNlKCkpLnB1c2gobiksYSl7dmFyIGk9e2RlcHRoOnMuZGVwdGh9O3JldHVybiBQKHMsInF1b3RlU3R5bGUiKSYmKGkucXVvdGVTdHlsZT1zLnF1b3RlU3R5bGUpLGUodCxpLHIrMSxvKX1yZXR1cm4gZSh0LHMscisxLG8pfWlmKCJmdW5jdGlvbiI9PXR5cGVvZiB0KXt2YXIgUz1mdW5jdGlvbihlKXtpZihlLm5hbWUpcmV0dXJuIGUubmFtZTt2YXIgdD1nLmNhbGwodi5jYWxsKGUpLC9eZnVuY3Rpb25ccyooW1x3JF0rKS8pO2lmKHQpcmV0dXJuIHRbMV07cmV0dXJuIG51bGx9KHQpLEk9cSh0LHgpO3JldHVybiJbRnVuY3Rpb24iKyhTPyI6ICIrUzoiIChhbm9ueW1vdXMpIikrIl0iKyhJLmxlbmd0aD4wPyIgeyAiK0kuam9pbigiLCAiKSsiIH0iOiIiKX1pZihUKHQpKXt2YXIgRD13P1N0cmluZyh0KS5yZXBsYWNlKC9eKFN5bWJvbFwoLipcKSlfW14pXSokLywiJDEiKTpfLmNhbGwodCk7cmV0dXJuIm9iamVjdCIhPXR5cGVvZiB0fHx3P0Q6TChEKX1pZihmdW5jdGlvbihlKXtpZighZXx8Im9iamVjdCIhPXR5cGVvZiBlKXJldHVybiExO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgSFRNTEVsZW1lbnQmJmUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudClyZXR1cm4hMDtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUubm9kZU5hbWUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldEF0dHJpYnV0ZX0odCkpe2Zvcih2YXIgej0iPCIrU3RyaW5nKHQubm9kZU5hbWUpLnRvTG93ZXJDYXNlKCksVj10LmF0dHJpYnV0ZXN8fFtdLFc9MDtXPFYubGVuZ3RoO1crKyl6Kz0iICIrVltXXS5uYW1lKyI9IitPKGsoVltXXS52YWx1ZSksImRvdWJsZSIscyk7cmV0dXJuIHorPSI+Iix0LmNoaWxkTm9kZXMmJnQuY2hpbGROb2Rlcy5sZW5ndGgmJih6Kz0iLi4uIikseis9IjwvIitTdHJpbmcodC5ub2RlTmFtZSkudG9Mb3dlckNhc2UoKSsiPiJ9aWYoaih0KSl7aWYoMD09PXQubGVuZ3RoKXJldHVybiJbXSI7dmFyIEg9cSh0LHgpO3JldHVybiBiJiYhZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspaWYoTShlW3RdLCJcbiIpPj0wKXJldHVybiExO3JldHVybiEwfShIKT8iWyIrVShILGIpKyJdIjoiWyAiK0guam9pbigiLCAiKSsiIF0ifWlmKGZ1bmN0aW9uKGUpe3JldHVybiEoIltvYmplY3QgRXJyb3JdIiE9PU4oZSl8fEEmJiJvYmplY3QiPT10eXBlb2YgZSYmQSBpbiBlKX0odCkpe3ZhciAkPXEodCx4KTtyZXR1cm4gMD09PSQubGVuZ3RoPyJbIitTdHJpbmcodCkrIl0iOiJ7IFsiK1N0cmluZyh0KSsiXSAiKyQuam9pbigiLCAiKSsiIH0ifWlmKCJvYmplY3QiPT10eXBlb2YgdCYmdSl7aWYoQyYmImZ1bmN0aW9uIj09dHlwZW9mIHRbQ10pcmV0dXJuIHRbQ10oKTtpZigic3ltYm9sIiE9PXUmJiJmdW5jdGlvbiI9PXR5cGVvZiB0Lmluc3BlY3QpcmV0dXJuIHQuaW5zcGVjdCgpfWlmKGZ1bmN0aW9uKGUpe2lmKCFhfHwhZXx8Im9iamVjdCIhPXR5cGVvZiBlKXJldHVybiExO3RyeXthLmNhbGwoZSk7dHJ5e2MuY2FsbChlKX1jYXRjaChlKXtyZXR1cm4hMH1yZXR1cm4gZSBpbnN0YW5jZW9mIE1hcH1jYXRjaChlKXt9cmV0dXJuITF9KHQpKXt2YXIgSj1bXTtyZXR1cm4gaS5jYWxsKHQsKGZ1bmN0aW9uKGUsbil7Si5wdXNoKHgobix0LCEwKSsiID0+ICIreChlLHQpKX0pKSxGKCJNYXAiLGEuY2FsbCh0KSxKLGIpfWlmKGZ1bmN0aW9uKGUpe2lmKCFjfHwhZXx8Im9iamVjdCIhPXR5cGVvZiBlKXJldHVybiExO3RyeXtjLmNhbGwoZSk7dHJ5e2EuY2FsbChlKX1jYXRjaChlKXtyZXR1cm4hMH1yZXR1cm4gZSBpbnN0YW5jZW9mIFNldH1jYXRjaChlKXt9cmV0dXJuITF9KHQpKXt2YXIgSz1bXTtyZXR1cm4gbC5jYWxsKHQsKGZ1bmN0aW9uKGUpe0sucHVzaCh4KGUsdCkpfSkpLEYoIlNldCIsYy5jYWxsKHQpLEssYil9aWYoZnVuY3Rpb24oZSl7aWYoIXB8fCFlfHwib2JqZWN0IiE9dHlwZW9mIGUpcmV0dXJuITE7dHJ5e3AuY2FsbChlLHApO3RyeXtmLmNhbGwoZSxmKX1jYXRjaChlKXtyZXR1cm4hMH1yZXR1cm4gZSBpbnN0YW5jZW9mIFdlYWtNYXB9Y2F0Y2goZSl7fXJldHVybiExfSh0KSlyZXR1cm4gQigiV2Vha01hcCIpO2lmKGZ1bmN0aW9uKGUpe2lmKCFmfHwhZXx8Im9iamVjdCIhPXR5cGVvZiBlKXJldHVybiExO3RyeXtmLmNhbGwoZSxmKTt0cnl7cC5jYWxsKGUscCl9Y2F0Y2goZSl7cmV0dXJuITB9cmV0dXJuIGUgaW5zdGFuY2VvZiBXZWFrU2V0fWNhdGNoKGUpe31yZXR1cm4hMX0odCkpcmV0dXJuIEIoIldlYWtTZXQiKTtpZihmdW5jdGlvbihlKXtpZighaHx8IWV8fCJvYmplY3QiIT10eXBlb2YgZSlyZXR1cm4hMTt0cnl7cmV0dXJuIGguY2FsbChlKSwhMH1jYXRjaChlKXt9cmV0dXJuITF9KHQpKXJldHVybiBCKCJXZWFrUmVmIik7aWYoZnVuY3Rpb24oZSl7cmV0dXJuISgiW29iamVjdCBOdW1iZXJdIiE9PU4oZSl8fEEmJiJvYmplY3QiPT10eXBlb2YgZSYmQSBpbiBlKX0odCkpcmV0dXJuIEwoeChOdW1iZXIodCkpKTtpZihmdW5jdGlvbihlKXtpZighZXx8Im9iamVjdCIhPXR5cGVvZiBlfHwheSlyZXR1cm4hMTt0cnl7cmV0dXJuIHkuY2FsbChlKSwhMH1jYXRjaChlKXt9cmV0dXJuITF9KHQpKXJldHVybiBMKHgoeS5jYWxsKHQpKSk7aWYoZnVuY3Rpb24oZSl7cmV0dXJuISgiW29iamVjdCBCb29sZWFuXSIhPT1OKGUpfHxBJiYib2JqZWN0Ij09dHlwZW9mIGUmJkEgaW4gZSl9KHQpKXJldHVybiBMKGQuY2FsbCh0KSk7aWYoZnVuY3Rpb24oZSl7cmV0dXJuISgiW29iamVjdCBTdHJpbmddIiE9PU4oZSl8fEEmJiJvYmplY3QiPT10eXBlb2YgZSYmQSBpbiBlKX0odCkpcmV0dXJuIEwoeChTdHJpbmcodCkpKTtpZighZnVuY3Rpb24oZSl7cmV0dXJuISgiW29iamVjdCBEYXRlXSIhPT1OKGUpfHxBJiYib2JqZWN0Ij09dHlwZW9mIGUmJkEgaW4gZSl9KHQpJiYhZnVuY3Rpb24oZSl7cmV0dXJuISgiW29iamVjdCBSZWdFeHBdIiE9PU4oZSl8fEEmJiJvYmplY3QiPT10eXBlb2YgZSYmQSBpbiBlKX0odCkpe3ZhciBZPXEodCx4KSxHPUU/RSh0KT09PU9iamVjdC5wcm90b3R5cGU6dCBpbnN0YW5jZW9mIE9iamVjdHx8dC5jb25zdHJ1Y3Rvcj09PU9iamVjdCxaPXQgaW5zdGFuY2VvZiBPYmplY3Q/IiI6Im51bGwgcHJvdG90eXBlIixYPSFHJiZBJiZPYmplY3QodCk9PT10JiZBIGluIHQ/Tih0KS5zbGljZSg4LC0xKTpaPyJPYmplY3QiOiIiLFE9KEd8fCJmdW5jdGlvbiIhPXR5cGVvZiB0LmNvbnN0cnVjdG9yPyIiOnQuY29uc3RydWN0b3IubmFtZT90LmNvbnN0cnVjdG9yLm5hbWUrIiAiOiIiKSsoWHx8Wj8iWyIrW10uY29uY2F0KFh8fFtdLFp8fFtdKS5qb2luKCI6ICIpKyJdICI6IiIpO3JldHVybiAwPT09WS5sZW5ndGg/USsie30iOmI/USsieyIrVShZLGIpKyJ9IjpRKyJ7ICIrWS5qb2luKCIsICIpKyIgfSJ9cmV0dXJuIFN0cmluZyh0KX07dmFyIEk9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eXx8ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW4gdGhpc307ZnVuY3Rpb24gUChlLHQpe3JldHVybiBJLmNhbGwoZSx0KX1mdW5jdGlvbiBOKGUpe3JldHVybiBtLmNhbGwoZSl9ZnVuY3Rpb24gTShlLHQpe2lmKGUuaW5kZXhPZilyZXR1cm4gZS5pbmRleE9mKHQpO2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKylpZihlW25dPT09dClyZXR1cm4gbjtyZXR1cm4tMX1mdW5jdGlvbiBSKGUsdCl7aWYoZS5sZW5ndGg+dC5tYXhTdHJpbmdMZW5ndGgpe3ZhciBuPWUubGVuZ3RoLXQubWF4U3RyaW5nTGVuZ3RoLHI9Ii4uLiAiK24rIiBtb3JlIGNoYXJhY3RlciIrKG4+MT8icyI6IiIpO3JldHVybiBSKGUuc2xpY2UoMCx0Lm1heFN0cmluZ0xlbmd0aCksdCkrcn1yZXR1cm4gTyhlLnJlcGxhY2UoLyhbJ1xcXSkvZywiXFwkMSIpLnJlcGxhY2UoL1tceDAwLVx4MWZdL2csRCksInNpbmdsZSIsdCl9ZnVuY3Rpb24gRChlKXt2YXIgdD1lLmNoYXJDb2RlQXQoMCksbj17ODoiYiIsOToidCIsMTA6Im4iLDEyOiJmIiwxMzoiciJ9W3RdO3JldHVybiBuPyJcXCIrbjoiXFx4IisodDwxNj8iMCI6IiIpK3QudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9ZnVuY3Rpb24gTChlKXtyZXR1cm4iT2JqZWN0KCIrZSsiKSJ9ZnVuY3Rpb24gQihlKXtyZXR1cm4gZSsiIHsgPyB9In1mdW5jdGlvbiBGKGUsdCxuLHIpe3JldHVybiBlKyIgKCIrdCsiKSB7Iisocj9VKG4scik6bi5qb2luKCIsICIpKSsifSJ9ZnVuY3Rpb24gVShlLHQpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4iIjt2YXIgbj0iXG4iK3QucHJldit0LmJhc2U7cmV0dXJuIG4rZS5qb2luKCIsIituKSsiXG4iK3QucHJldn1mdW5jdGlvbiBxKGUsdCl7dmFyIG49aihlKSxyPVtdO2lmKG4pe3IubGVuZ3RoPWUubGVuZ3RoO2Zvcih2YXIgbz0wO288ZS5sZW5ndGg7bysrKXJbb109UChlLG8pP3QoZVtvXSxlKToiIn12YXIgYSxpPSJmdW5jdGlvbiI9PXR5cGVvZiBiP2IoZSk6W107aWYodyl7YT17fTtmb3IodmFyIHM9MDtzPGkubGVuZ3RoO3MrKylhWyIkIitpW3NdXT1pW3NdfWZvcih2YXIgdSBpbiBlKVAoZSx1KSYmKG4mJlN0cmluZyhOdW1iZXIodSkpPT09dSYmdTxlLmxlbmd0aHx8dyYmYVsiJCIrdV1pbnN0YW5jZW9mIFN5bWJvbHx8KC9bXlx3JF0vLnRlc3QodSk/ci5wdXNoKHQodSxlKSsiOiAiK3QoZVt1XSxlKSk6ci5wdXNoKHUrIjogIit0KGVbdV0sZSkpKSk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGIpZm9yKHZhciBjPTA7YzxpLmxlbmd0aDtjKyspeC5jYWxsKGUsaVtjXSkmJnIucHVzaCgiWyIrdChpW2NdKSsiXTogIit0KGVbaVtjXV0sZSkpO3JldHVybiByfX0sZnVuY3Rpb24oZSx0KXt9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9big0OTQpLG89T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxhPUFycmF5LmlzQXJyYXksaT17YWxsb3dEb3RzOiExLGFsbG93UHJvdG90eXBlczohMSxhbGxvd1NwYXJzZTohMSxhcnJheUxpbWl0OjIwLGNoYXJzZXQ6InV0Zi04IixjaGFyc2V0U2VudGluZWw6ITEsY29tbWE6ITEsZGVjb2RlcjpyLmRlY29kZSxkZWxpbWl0ZXI6IiYiLGRlcHRoOjUsaWdub3JlUXVlcnlQcmVmaXg6ITEsaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzOiExLHBhcmFtZXRlckxpbWl0OjFlMyxwYXJzZUFycmF5czohMCxwbGFpbk9iamVjdHM6ITEsc3RyaWN0TnVsbEhhbmRsaW5nOiExfSxzPWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoLyYjKFxkKyk7L2csKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQodCwxMCkpfSkpfSx1PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJiJzdHJpbmciPT10eXBlb2YgZSYmdC5jb21tYSYmZS5pbmRleE9mKCIsIik+LTE/ZS5zcGxpdCgiLCIpOmV9LGM9ZnVuY3Rpb24oZSx0LG4scil7aWYoZSl7dmFyIGE9bi5hbGxvd0RvdHM/ZS5yZXBsYWNlKC9cLihbXi5bXSspL2csIlskMV0iKTplLGk9LyhcW1teW1xdXSpdKS9nLHM9bi5kZXB0aD4wJiYvKFxbW15bXF1dKl0pLy5leGVjKGEpLGM9cz9hLnNsaWNlKDAscy5pbmRleCk6YSxsPVtdO2lmKGMpe2lmKCFuLnBsYWluT2JqZWN0cyYmby5jYWxsKE9iamVjdC5wcm90b3R5cGUsYykmJiFuLmFsbG93UHJvdG90eXBlcylyZXR1cm47bC5wdXNoKGMpfWZvcih2YXIgcD0wO24uZGVwdGg+MCYmbnVsbCE9PShzPWkuZXhlYyhhKSkmJnA8bi5kZXB0aDspe2lmKHArPTEsIW4ucGxhaW5PYmplY3RzJiZvLmNhbGwoT2JqZWN0LnByb3RvdHlwZSxzWzFdLnNsaWNlKDEsLTEpKSYmIW4uYWxsb3dQcm90b3R5cGVzKXJldHVybjtsLnB1c2goc1sxXSl9cmV0dXJuIHMmJmwucHVzaCgiWyIrYS5zbGljZShzLmluZGV4KSsiXSIpLGZ1bmN0aW9uKGUsdCxuLHIpe2Zvcih2YXIgbz1yP3Q6dSh0LG4pLGE9ZS5sZW5ndGgtMTthPj0wOy0tYSl7dmFyIGkscz1lW2FdO2lmKCJbXSI9PT1zJiZuLnBhcnNlQXJyYXlzKWk9W10uY29uY2F0KG8pO2Vsc2V7aT1uLnBsYWluT2JqZWN0cz9PYmplY3QuY3JlYXRlKG51bGwpOnt9O3ZhciBjPSJbIj09PXMuY2hhckF0KDApJiYiXSI9PT1zLmNoYXJBdChzLmxlbmd0aC0xKT9zLnNsaWNlKDEsLTEpOnMsbD1wYXJzZUludChjLDEwKTtuLnBhcnNlQXJyYXlzfHwiIiE9PWM/IWlzTmFOKGwpJiZzIT09YyYmU3RyaW5nKGwpPT09YyYmbD49MCYmbi5wYXJzZUFycmF5cyYmbDw9bi5hcnJheUxpbWl0PyhpPVtdKVtsXT1vOmlbY109bzppPXswOm99fW89aX1yZXR1cm4gb30obCx0LG4scil9fTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj1mdW5jdGlvbihlKXtpZighZSlyZXR1cm4gaTtpZihudWxsIT09ZS5kZWNvZGVyJiZ2b2lkIDAhPT1lLmRlY29kZXImJiJmdW5jdGlvbiIhPXR5cGVvZiBlLmRlY29kZXIpdGhyb3cgbmV3IFR5cGVFcnJvcigiRGVjb2RlciBoYXMgdG8gYmUgYSBmdW5jdGlvbi4iKTtpZih2b2lkIDAhPT1lLmNoYXJzZXQmJiJ1dGYtOCIhPT1lLmNoYXJzZXQmJiJpc28tODg1OS0xIiE9PWUuY2hhcnNldCl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGUgY2hhcnNldCBvcHRpb24gbXVzdCBiZSBlaXRoZXIgdXRmLTgsIGlzby04ODU5LTEsIG9yIHVuZGVmaW5lZCIpO3ZhciB0PXZvaWQgMD09PWUuY2hhcnNldD9pLmNoYXJzZXQ6ZS5jaGFyc2V0O3JldHVybnthbGxvd0RvdHM6dm9pZCAwPT09ZS5hbGxvd0RvdHM/aS5hbGxvd0RvdHM6ISFlLmFsbG93RG90cyxhbGxvd1Byb3RvdHlwZXM6ImJvb2xlYW4iPT10eXBlb2YgZS5hbGxvd1Byb3RvdHlwZXM/ZS5hbGxvd1Byb3RvdHlwZXM6aS5hbGxvd1Byb3RvdHlwZXMsYWxsb3dTcGFyc2U6ImJvb2xlYW4iPT10eXBlb2YgZS5hbGxvd1NwYXJzZT9lLmFsbG93U3BhcnNlOmkuYWxsb3dTcGFyc2UsYXJyYXlMaW1pdDoibnVtYmVyIj09dHlwZW9mIGUuYXJyYXlMaW1pdD9lLmFycmF5TGltaXQ6aS5hcnJheUxpbWl0LGNoYXJzZXQ6dCxjaGFyc2V0U2VudGluZWw6ImJvb2xlYW4iPT10eXBlb2YgZS5jaGFyc2V0U2VudGluZWw/ZS5jaGFyc2V0U2VudGluZWw6aS5jaGFyc2V0U2VudGluZWwsY29tbWE6ImJvb2xlYW4iPT10eXBlb2YgZS5jb21tYT9lLmNvbW1hOmkuY29tbWEsZGVjb2RlcjoiZnVuY3Rpb24iPT10eXBlb2YgZS5kZWNvZGVyP2UuZGVjb2RlcjppLmRlY29kZXIsZGVsaW1pdGVyOiJzdHJpbmciPT10eXBlb2YgZS5kZWxpbWl0ZXJ8fHIuaXNSZWdFeHAoZS5kZWxpbWl0ZXIpP2UuZGVsaW1pdGVyOmkuZGVsaW1pdGVyLGRlcHRoOiJudW1iZXIiPT10eXBlb2YgZS5kZXB0aHx8ITE9PT1lLmRlcHRoPytlLmRlcHRoOmkuZGVwdGgsaWdub3JlUXVlcnlQcmVmaXg6ITA9PT1lLmlnbm9yZVF1ZXJ5UHJlZml4LGludGVycHJldE51bWVyaWNFbnRpdGllczoiYm9vbGVhbiI9PXR5cGVvZiBlLmludGVycHJldE51bWVyaWNFbnRpdGllcz9lLmludGVycHJldE51bWVyaWNFbnRpdGllczppLmludGVycHJldE51bWVyaWNFbnRpdGllcyxwYXJhbWV0ZXJMaW1pdDoibnVtYmVyIj09dHlwZW9mIGUucGFyYW1ldGVyTGltaXQ/ZS5wYXJhbWV0ZXJMaW1pdDppLnBhcmFtZXRlckxpbWl0LHBhcnNlQXJyYXlzOiExIT09ZS5wYXJzZUFycmF5cyxwbGFpbk9iamVjdHM6ImJvb2xlYW4iPT10eXBlb2YgZS5wbGFpbk9iamVjdHM/ZS5wbGFpbk9iamVjdHM6aS5wbGFpbk9iamVjdHMsc3RyaWN0TnVsbEhhbmRsaW5nOiJib29sZWFuIj09dHlwZW9mIGUuc3RyaWN0TnVsbEhhbmRsaW5nP2Uuc3RyaWN0TnVsbEhhbmRsaW5nOmkuc3RyaWN0TnVsbEhhbmRsaW5nfX0odCk7aWYoIiI9PT1lfHxudWxsPT1lKXJldHVybiBuLnBsYWluT2JqZWN0cz9PYmplY3QuY3JlYXRlKG51bGwpOnt9O2Zvcih2YXIgbD0ic3RyaW5nIj09dHlwZW9mIGU/ZnVuY3Rpb24oZSx0KXt2YXIgbixjPXt9LGw9dC5pZ25vcmVRdWVyeVByZWZpeD9lLnJlcGxhY2UoL15cPy8sIiIpOmUscD10LnBhcmFtZXRlckxpbWl0PT09MS8wP3ZvaWQgMDp0LnBhcmFtZXRlckxpbWl0LGY9bC5zcGxpdCh0LmRlbGltaXRlcixwKSxoPS0xLGQ9dC5jaGFyc2V0O2lmKHQuY2hhcnNldFNlbnRpbmVsKWZvcihuPTA7bjxmLmxlbmd0aDsrK24pMD09PWZbbl0uaW5kZXhPZigidXRmOD0iKSYmKCJ1dGY4PSVFMiU5QyU5MyI9PT1mW25dP2Q9InV0Zi04IjoidXRmOD0lMjYlMjMxMDAwMyUzQiI9PT1mW25dJiYoZD0iaXNvLTg4NTktMSIpLGg9bixuPWYubGVuZ3RoKTtmb3Iobj0wO248Zi5sZW5ndGg7KytuKWlmKG4hPT1oKXt2YXIgbSx2LGc9ZltuXSx5PWcuaW5kZXhPZigiXT0iKSxiPS0xPT09eT9nLmluZGV4T2YoIj0iKTp5KzE7LTE9PT1iPyhtPXQuZGVjb2RlcihnLGkuZGVjb2RlcixkLCJrZXkiKSx2PXQuc3RyaWN0TnVsbEhhbmRsaW5nP251bGw6IiIpOihtPXQuZGVjb2RlcihnLnNsaWNlKDAsYiksaS5kZWNvZGVyLGQsImtleSIpLHY9ci5tYXliZU1hcCh1KGcuc2xpY2UoYisxKSx0KSwoZnVuY3Rpb24oZSl7cmV0dXJuIHQuZGVjb2RlcihlLGkuZGVjb2RlcixkLCJ2YWx1ZSIpfSkpKSx2JiZ0LmludGVycHJldE51bWVyaWNFbnRpdGllcyYmImlzby04ODU5LTEiPT09ZCYmKHY9cyh2KSksZy5pbmRleE9mKCJbXT0iKT4tMSYmKHY9YSh2KT9bdl06diksby5jYWxsKGMsbSk/Y1ttXT1yLmNvbWJpbmUoY1ttXSx2KTpjW21dPXZ9cmV0dXJuIGN9KGUsbik6ZSxwPW4ucGxhaW5PYmplY3RzP09iamVjdC5jcmVhdGUobnVsbCk6e30sZj1PYmplY3Qua2V5cyhsKSxoPTA7aDxmLmxlbmd0aDsrK2gpe3ZhciBkPWZbaF0sbT1jKGQsbFtkXSxuLCJzdHJpbmciPT10eXBlb2YgZSk7cD1yLm1lcmdlKHAsbSxuKX1yZXR1cm4hMD09PW4uYWxsb3dTcGFyc2U/cDpyLmNvbXBhY3QocCl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMDY0KTtlLmV4cG9ydHM9cn0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTA2NSksbz1BcnJheS5wcm90b3R5cGU7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PWUuc3BsaWNlO3JldHVybiBlPT09b3x8ZSBpbnN0YW5jZW9mIEFycmF5JiZ0PT09by5zcGxpY2U/cjp0fX0sZnVuY3Rpb24oZSx0LG4pe24oMTA2Nik7dmFyIHI9big0Mik7ZS5leHBvcnRzPXIoIkFycmF5Iikuc3BsaWNlfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMjIpLG89bigyMzApLGE9bigxMjgpLGk9big2OSkscz1uKDYyKSx1PW4oMjI0KSxjPW4oMTU0KSxsPW4oMTU1KSgic3BsaWNlIikscD1NYXRoLm1heCxmPU1hdGgubWluLGg9OTAwNzE5OTI1NDc0MDk5MSxkPSJNYXhpbXVtIGFsbG93ZWQgbGVuZ3RoIGV4Y2VlZGVkIjtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6IWx9LHtzcGxpY2U6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLGwsbSx2LGcseT1zKHRoaXMpLGI9aSh5Lmxlbmd0aCksXz1vKGUsYiksdz1hcmd1bWVudHMubGVuZ3RoO2lmKDA9PT13P249cj0wOjE9PT13PyhuPTAscj1iLV8pOihuPXctMixyPWYocChhKHQpLDApLGItXykpLGIrbi1yPmgpdGhyb3cgVHlwZUVycm9yKGQpO2ZvcihsPXUoeSxyKSxtPTA7bTxyO20rKykodj1fK20paW4geSYmYyhsLG0seVt2XSk7aWYobC5sZW5ndGg9cixuPHIpe2ZvcihtPV87bTxiLXI7bSsrKWc9bStuLCh2PW0rcilpbiB5P3lbZ109eVt2XTpkZWxldGUgeVtnXTtmb3IobT1iO20+Yi1yK247bS0tKWRlbGV0ZSB5W20tMV19ZWxzZSBpZihuPnIpZm9yKG09Yi1yO20+XzttLS0pZz1tK24tMSwodj1tK3ItMSlpbiB5P3lbZ109eVt2XTpkZWxldGUgeVtnXTtmb3IobT0wO208bjttKyspeVttK19dPWFyZ3VtZW50c1ttKzJdO3JldHVybiB5Lmxlbmd0aD1iLXIrbixsfX0pfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMDY4KTtlLmV4cG9ydHM9cn0sZnVuY3Rpb24oZSx0LG4pe24oMTgyKSxuKDEwNjkpLG4oODYpO3ZhciByPW4oMzMpO2UuZXhwb3J0cz1yLldlYWtNYXB9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHIsbz1uKDQwKSxhPW4oMTY0KSxpPW4oMjA4KSxzPW4oNDk1KSx1PW4oMTA3MSksYz1uKDQ3KSxsPW4oNzcpLmVuZm9yY2UscD1uKDM2NiksZj0hby5BY3RpdmVYT2JqZWN0JiYiQWN0aXZlWE9iamVjdCJpbiBvLGg9T2JqZWN0LmlzRXh0ZW5zaWJsZSxkPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlKHRoaXMsYXJndW1lbnRzLmxlbmd0aD9hcmd1bWVudHNbMF06dm9pZCAwKX19LG09ZS5leHBvcnRzPXMoIldlYWtNYXAiLGQsdSk7aWYocCYmZil7cj11LmdldENvbnN0cnVjdG9yKGQsIldlYWtNYXAiLCEwKSxpLlJFUVVJUkVEPSEwO3ZhciB2PW0ucHJvdG90eXBlLGc9di5kZWxldGUseT12LmhhcyxiPXYuZ2V0LF89di5zZXQ7YSh2LHtkZWxldGU6ZnVuY3Rpb24oZSl7aWYoYyhlKSYmIWgoZSkpe3ZhciB0PWwodGhpcyk7cmV0dXJuIHQuZnJvemVufHwodC5mcm96ZW49bmV3IHIpLGcuY2FsbCh0aGlzLGUpfHx0LmZyb3plbi5kZWxldGUoZSl9cmV0dXJuIGcuY2FsbCh0aGlzLGUpfSxoYXM6ZnVuY3Rpb24oZSl7aWYoYyhlKSYmIWgoZSkpe3ZhciB0PWwodGhpcyk7cmV0dXJuIHQuZnJvemVufHwodC5mcm96ZW49bmV3IHIpLHkuY2FsbCh0aGlzLGUpfHx0LmZyb3plbi5oYXMoZSl9cmV0dXJuIHkuY2FsbCh0aGlzLGUpfSxnZXQ6ZnVuY3Rpb24oZSl7aWYoYyhlKSYmIWgoZSkpe3ZhciB0PWwodGhpcyk7cmV0dXJuIHQuZnJvemVufHwodC5mcm96ZW49bmV3IHIpLHkuY2FsbCh0aGlzLGUpP2IuY2FsbCh0aGlzLGUpOnQuZnJvemVuLmdldChlKX1yZXR1cm4gYi5jYWxsKHRoaXMsZSl9LHNldDpmdW5jdGlvbihlLHQpe2lmKGMoZSkmJiFoKGUpKXt2YXIgbj1sKHRoaXMpO24uZnJvemVufHwobi5mcm96ZW49bmV3IHIpLHkuY2FsbCh0aGlzLGUpP18uY2FsbCh0aGlzLGUsdCk6bi5mcm96ZW4uc2V0KGUsdCl9ZWxzZSBfLmNhbGwodGhpcyxlLHQpO3JldHVybiB0aGlzfX0pfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMzcpO2UuZXhwb3J0cz0hcigoZnVuY3Rpb24oKXtyZXR1cm4gT2JqZWN0LmlzRXh0ZW5zaWJsZShPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKX0pKX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE2NCksbz1uKDIwOCkuZ2V0V2Vha0RhdGEsYT1uKDUyKSxpPW4oNDcpLHM9bigxNDEpLHU9bigxMjEpLGM9big4NSksbD1uKDU1KSxwPW4oNzcpLGY9cC5zZXQsaD1wLmdldHRlckZvcixkPWMuZmluZCxtPWMuZmluZEluZGV4LHY9MCxnPWZ1bmN0aW9uKGUpe3JldHVybiBlLmZyb3plbnx8KGUuZnJvemVuPW5ldyB5KX0seT1mdW5jdGlvbigpe3RoaXMuZW50cmllcz1bXX0sYj1mdW5jdGlvbihlLHQpe3JldHVybiBkKGUuZW50cmllcywoZnVuY3Rpb24oZSl7cmV0dXJuIGVbMF09PT10fSkpfTt5LnByb3RvdHlwZT17Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWIodGhpcyxlKTtpZih0KXJldHVybiB0WzFdfSxoYXM6ZnVuY3Rpb24oZSl7cmV0dXJuISFiKHRoaXMsZSl9LHNldDpmdW5jdGlvbihlLHQpe3ZhciBuPWIodGhpcyxlKTtuP25bMV09dDp0aGlzLmVudHJpZXMucHVzaChbZSx0XSl9LGRlbGV0ZTpmdW5jdGlvbihlKXt2YXIgdD1tKHRoaXMuZW50cmllcywoZnVuY3Rpb24odCl7cmV0dXJuIHRbMF09PT1lfSkpO3JldHVybn50JiZ0aGlzLmVudHJpZXMuc3BsaWNlKHQsMSksISF+dH19LGUuZXhwb3J0cz17Z2V0Q29uc3RydWN0b3I6ZnVuY3Rpb24oZSx0LG4sYyl7dmFyIHA9ZSgoZnVuY3Rpb24oZSxyKXtzKGUscCx0KSxmKGUse3R5cGU6dCxpZDp2KyssZnJvemVuOnZvaWQgMH0pLG51bGwhPXImJnUocixlW2NdLHt0aGF0OmUsQVNfRU5UUklFUzpufSl9KSksZD1oKHQpLG09ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWQoZSksaT1vKGEodCksITApO3JldHVybiEwPT09aT9nKHIpLnNldCh0LG4pOmlbci5pZF09bixlfTtyZXR1cm4gcihwLnByb3RvdHlwZSx7ZGVsZXRlOmZ1bmN0aW9uKGUpe3ZhciB0PWQodGhpcyk7aWYoIWkoZSkpcmV0dXJuITE7dmFyIG49byhlKTtyZXR1cm4hMD09PW4/Zyh0KS5kZWxldGUoZSk6biYmbChuLHQuaWQpJiZkZWxldGUgblt0LmlkXX0saGFzOmZ1bmN0aW9uKGUpe3ZhciB0PWQodGhpcyk7aWYoIWkoZSkpcmV0dXJuITE7dmFyIG49byhlKTtyZXR1cm4hMD09PW4/Zyh0KS5oYXMoZSk6biYmbChuLHQuaWQpfX0pLHIocC5wcm90b3R5cGUsbj97Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWQodGhpcyk7aWYoaShlKSl7dmFyIG49byhlKTtyZXR1cm4hMD09PW4/Zyh0KS5nZXQoZSk6bj9uW3QuaWRdOnZvaWQgMH19LHNldDpmdW5jdGlvbihlLHQpe3JldHVybiBtKHRoaXMsZSx0KX19OnthZGQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG0odGhpcyxlLCEwKX19KSxwfX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDEwNzMpO2UuZXhwb3J0cz1yfSxmdW5jdGlvbihlLHQsbil7bigyODMpO3ZhciByPW4oMzMpO2UuZXhwb3J0cz1yLlVSTFNlYXJjaFBhcmFtc30sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNTIpLG89bigxNjApO2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1vKGUpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IFR5cGVFcnJvcihTdHJpbmcoZSkrIiBpcyBub3QgaXRlcmFibGUiKTtyZXR1cm4gcih0LmNhbGwoZSkpfX0sZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbihlLHIpe3ZhciBvOyFmdW5jdGlvbihhKXt0JiZ0Lm5vZGVUeXBlLGUmJmUubm9kZVR5cGU7dmFyIGk9Im9iamVjdCI9PXR5cGVvZiByJiZyO2kuZ2xvYmFsIT09aSYmaS53aW5kb3chPT1pJiZpLnNlbGY7dmFyIHMsdT0yMTQ3NDgzNjQ3LGM9MzYsbD0vXnhuLS0vLHA9L1teXHgyMC1ceDdFXS8sZj0vW1x4MkVcdTMwMDJcdUZGMEVcdUZGNjFdL2csaD17b3ZlcmZsb3c6Ik92ZXJmbG93OiBpbnB1dCBuZWVkcyB3aWRlciBpbnRlZ2VycyB0byBwcm9jZXNzIiwibm90LWJhc2ljIjoiSWxsZWdhbCBpbnB1dCA+PSAweDgwIChub3QgYSBiYXNpYyBjb2RlIHBvaW50KSIsImludmFsaWQtaW5wdXQiOiJJbnZhbGlkIGlucHV0In0sZD1NYXRoLmZsb29yLG09U3RyaW5nLmZyb21DaGFyQ29kZTtmdW5jdGlvbiB2KGUpe3Rocm93IFJhbmdlRXJyb3IoaFtlXSl9ZnVuY3Rpb24gZyhlLHQpe2Zvcih2YXIgbj1lLmxlbmd0aCxyPVtdO24tLTspcltuXT10KGVbbl0pO3JldHVybiByfWZ1bmN0aW9uIHkoZSx0KXt2YXIgbj1lLnNwbGl0KCJAIikscj0iIjtyZXR1cm4gbi5sZW5ndGg+MSYmKHI9blswXSsiQCIsZT1uWzFdKSxyK2coKGU9ZS5yZXBsYWNlKGYsIi4iKSkuc3BsaXQoIi4iKSx0KS5qb2luKCIuIil9ZnVuY3Rpb24gYihlKXtmb3IodmFyIHQsbixyPVtdLG89MCxhPWUubGVuZ3RoO288YTspKHQ9ZS5jaGFyQ29kZUF0KG8rKykpPj01NTI5NiYmdDw9NTYzMTkmJm88YT81NjMyMD09KDY0NTEyJihuPWUuY2hhckNvZGVBdChvKyspKSk/ci5wdXNoKCgoMTAyMyZ0KTw8MTApKygxMDIzJm4pKzY1NTM2KTooci5wdXNoKHQpLG8tLSk6ci5wdXNoKHQpO3JldHVybiByfWZ1bmN0aW9uIF8oZSl7cmV0dXJuIGcoZSwoZnVuY3Rpb24oZSl7dmFyIHQ9IiI7cmV0dXJuIGU+NjU1MzUmJih0Kz1tKChlLT02NTUzNik+Pj4xMCYxMDIzfDU1Mjk2KSxlPTU2MzIwfDEwMjMmZSksdCs9bShlKX0pKS5qb2luKCIiKX1mdW5jdGlvbiB3KGUsdCl7cmV0dXJuIGUrMjIrNzUqKGU8MjYpLSgoMCE9dCk8PDUpfWZ1bmN0aW9uIHgoZSx0LG4pe3ZhciByPTA7Zm9yKGU9bj9kKGUvNzAwKTplPj4xLGUrPWQoZS90KTtlPjQ1NTtyKz1jKWU9ZChlLzM1KTtyZXR1cm4gZChyKzM2KmUvKGUrMzgpKX1mdW5jdGlvbiBFKGUpe3ZhciB0LG4scixvLGEsaSxzLGwscCxmLGgsbT1bXSxnPWUubGVuZ3RoLHk9MCxiPTEyOCx3PTcyO2Zvcigobj1lLmxhc3RJbmRleE9mKCItIikpPDAmJihuPTApLHI9MDtyPG47KytyKWUuY2hhckNvZGVBdChyKT49MTI4JiZ2KCJub3QtYmFzaWMiKSxtLnB1c2goZS5jaGFyQ29kZUF0KHIpKTtmb3Iobz1uPjA/bisxOjA7bzxnOyl7Zm9yKGE9eSxpPTEscz1jO28+PWcmJnYoImludmFsaWQtaW5wdXQiKSwoKGw9KGg9ZS5jaGFyQ29kZUF0KG8rKykpLTQ4PDEwP2gtMjI6aC02NTwyNj9oLTY1OmgtOTc8MjY/aC05NzpjKT49Y3x8bD5kKCh1LXkpL2kpKSYmdigib3ZlcmZsb3ciKSx5Kz1sKmksIShsPChwPXM8PXc/MTpzPj13KzI2PzI2OnMtdykpO3MrPWMpaT5kKHUvKGY9Yy1wKSkmJnYoIm92ZXJmbG93IiksaSo9Zjt3PXgoeS1hLHQ9bS5sZW5ndGgrMSwwPT1hKSxkKHkvdCk+dS1iJiZ2KCJvdmVyZmxvdyIpLGIrPWQoeS90KSx5JT10LG0uc3BsaWNlKHkrKywwLGIpfXJldHVybiBfKG0pfWZ1bmN0aW9uIFMoZSl7dmFyIHQsbixyLG8sYSxpLHMsbCxwLGYsaCxnLHksXyxFLFM9W107Zm9yKGc9KGU9YihlKSkubGVuZ3RoLHQ9MTI4LG49MCxhPTcyLGk9MDtpPGc7KytpKShoPWVbaV0pPDEyOCYmUy5wdXNoKG0oaCkpO2ZvcihyPW89Uy5sZW5ndGgsbyYmUy5wdXNoKCItIik7cjxnOyl7Zm9yKHM9dSxpPTA7aTxnOysraSkoaD1lW2ldKT49dCYmaDxzJiYocz1oKTtmb3Iocy10PmQoKHUtbikvKHk9cisxKSkmJnYoIm92ZXJmbG93Iiksbis9KHMtdCkqeSx0PXMsaT0wO2k8ZzsrK2kpaWYoKGg9ZVtpXSk8dCYmKytuPnUmJnYoIm92ZXJmbG93IiksaD09dCl7Zm9yKGw9bixwPWM7IShsPChmPXA8PWE/MTpwPj1hKzI2PzI2OnAtYSkpO3ArPWMpRT1sLWYsXz1jLWYsUy5wdXNoKG0odyhmK0UlXywwKSkpLGw9ZChFL18pO1MucHVzaChtKHcobCwwKSkpLGE9eChuLHkscj09byksbj0wLCsrcn0rK24sKyt0fXJldHVybiBTLmpvaW4oIiIpfXM9e3ZlcnNpb246IjEuMy4yIix1Y3MyOntkZWNvZGU6YixlbmNvZGU6X30sZGVjb2RlOkUsZW5jb2RlOlMsdG9BU0NJSTpmdW5jdGlvbihlKXtyZXR1cm4geShlLChmdW5jdGlvbihlKXtyZXR1cm4gcC50ZXN0KGUpPyJ4bi0tIitTKGUpOmV9KSl9LHRvVW5pY29kZTpmdW5jdGlvbihlKXtyZXR1cm4geShlLChmdW5jdGlvbihlKXtyZXR1cm4gbC50ZXN0KGUpP0UoZS5zbGljZSg0KS50b0xvd2VyQ2FzZSgpKTplfSkpfX0sdm9pZCAwPT09KG89ZnVuY3Rpb24oKXtyZXR1cm4gc30uY2FsbCh0LG4sdCxlKSl8fChlLmV4cG9ydHM9byl9KCl9KS5jYWxsKHRoaXMsbigxOTYpKGUpLG4oNTEpKX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9e2lzU3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZX0saXNPYmplY3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlJiZudWxsIT09ZX0saXNOdWxsOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT09ZX0saXNOdWxsT3JVbmRlZmluZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWV9fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt0LmRlY29kZT10LnBhcnNlPW4oMTA3OCksdC5lbmNvZGU9dC5zdHJpbmdpZnk9bigxMDc5KX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfWUuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixhKXt0PXR8fCImIixuPW58fCI9Ijt2YXIgaT17fTtpZigic3RyaW5nIiE9dHlwZW9mIGV8fDA9PT1lLmxlbmd0aClyZXR1cm4gaTt2YXIgcz0vXCsvZztlPWUuc3BsaXQodCk7dmFyIHU9MWUzO2EmJiJudW1iZXIiPT10eXBlb2YgYS5tYXhLZXlzJiYodT1hLm1heEtleXMpO3ZhciBjPWUubGVuZ3RoO3U+MCYmYz51JiYoYz11KTtmb3IodmFyIGw9MDtsPGM7KytsKXt2YXIgcCxmLGgsZCxtPWVbbF0ucmVwbGFjZShzLCIlMjAiKSx2PW0uaW5kZXhPZihuKTt2Pj0wPyhwPW0uc3Vic3RyKDAsdiksZj1tLnN1YnN0cih2KzEpKToocD1tLGY9IiIpLGg9ZGVjb2RlVVJJQ29tcG9uZW50KHApLGQ9ZGVjb2RlVVJJQ29tcG9uZW50KGYpLHIoaSxoKT9vKGlbaF0pP2lbaF0ucHVzaChkKTppW2hdPVtpW2hdLGRdOmlbaF09ZH1yZXR1cm4gaX07dmFyIG89QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZnVuY3Rpb24oZSl7c3dpdGNoKHR5cGVvZiBlKXtjYXNlInN0cmluZyI6cmV0dXJuIGU7Y2FzZSJib29sZWFuIjpyZXR1cm4gZT8idHJ1ZSI6ImZhbHNlIjtjYXNlIm51bWJlciI6cmV0dXJuIGlzRmluaXRlKGUpP2U6IiI7ZGVmYXVsdDpyZXR1cm4iIn19O2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixzKXtyZXR1cm4gdD10fHwiJiIsbj1ufHwiPSIsbnVsbD09PWUmJihlPXZvaWQgMCksIm9iamVjdCI9PXR5cGVvZiBlP2EoaShlKSwoZnVuY3Rpb24oaSl7dmFyIHM9ZW5jb2RlVVJJQ29tcG9uZW50KHIoaSkpK247cmV0dXJuIG8oZVtpXSk/YShlW2ldLChmdW5jdGlvbihlKXtyZXR1cm4gcytlbmNvZGVVUklDb21wb25lbnQocihlKSl9KSkuam9pbih0KTpzK2VuY29kZVVSSUNvbXBvbmVudChyKGVbaV0pKX0pKS5qb2luKHQpOnM/ZW5jb2RlVVJJQ29tcG9uZW50KHIocykpK24rZW5jb2RlVVJJQ29tcG9uZW50KHIoZSkpOiIifTt2YXIgbz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfTtmdW5jdGlvbiBhKGUsdCl7aWYoZS5tYXApcmV0dXJuIGUubWFwKHQpO2Zvcih2YXIgbj1bXSxyPTA7cjxlLmxlbmd0aDtyKyspbi5wdXNoKHQoZVtyXSxyKSk7cmV0dXJuIG59dmFyIGk9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKGUpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG4pJiZ0LnB1c2gobik7cmV0dXJuIHR9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMDgxKTtlLmV4cG9ydHM9cn0sZnVuY3Rpb24oZSx0LG4pe24oMTA4MiksbigxMDg0KSxuKDI4Myk7dmFyIHI9bigzMyk7ZS5leHBvcnRzPXIuVVJMfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24oMTMwKTt2YXIgcixvPW4oMjIpLGE9big0OCksaT1uKDQ5Nikscz1uKDQwKSx1PW4oMjI4KSxjPW4oMTEyKSxsPW4oMTQxKSxwPW4oNTUpLGY9bigzNzkpLGg9bigzOTQpLGQ9bigzNjkpLmNvZGVBdCxtPW4oMTA4Myksdj1uKDk3KSxnPW4oMjgzKSx5PW4oNzcpLGI9cy5VUkwsXz1nLlVSTFNlYXJjaFBhcmFtcyx3PWcuZ2V0U3RhdGUseD15LnNldCxFPXkuZ2V0dGVyRm9yKCJVUkwiKSxTPU1hdGguZmxvb3IsQz1NYXRoLnBvdyxBPSJJbnZhbGlkIHNjaGVtZSIsTz0iSW52YWxpZCBob3N0IixrPSJJbnZhbGlkIHBvcnQiLGo9L1tBLVphLXpdLyxUPS9bXGQrLS5BLVphLXpdLyxJPS9cZC8sUD0vXjB4L2ksTj0vXlswLTddKyQvLE09L15cZCskLyxSPS9eW1xkQS1GYS1mXSskLyxEPS9bXDBcdFxuXHIgIyUvOjw+P0BbXFxcXV58XS8sTD0vW1wwXHRcblxyICMvOjw+P0BbXFxcXV58XS8sQj0vXltcdTAwMDAtXHUwMDFGIF0rfFtcdTAwMDAtXHUwMDFGIF0rJC9nLEY9L1tcdFxuXHJdL2csVT1mdW5jdGlvbihlLHQpe3ZhciBuLHIsbztpZigiWyI9PXQuY2hhckF0KDApKXtpZigiXSIhPXQuY2hhckF0KHQubGVuZ3RoLTEpKXJldHVybiBPO2lmKCEobj16KHQuc2xpY2UoMSwtMSkpKSlyZXR1cm4gTztlLmhvc3Q9bn1lbHNlIGlmKEcoZSkpe2lmKHQ9bSh0KSxELnRlc3QodCkpcmV0dXJuIE87aWYobnVsbD09PShuPXEodCkpKXJldHVybiBPO2UuaG9zdD1ufWVsc2V7aWYoTC50ZXN0KHQpKXJldHVybiBPO2ZvcihuPSIiLHI9aCh0KSxvPTA7bzxyLmxlbmd0aDtvKyspbis9SyhyW29dLFcpO2UuaG9zdD1ufX0scT1mdW5jdGlvbihlKXt2YXIgdCxuLHIsbyxhLGkscyx1PWUuc3BsaXQoIi4iKTtpZih1Lmxlbmd0aCYmIiI9PXVbdS5sZW5ndGgtMV0mJnUucG9wKCksKHQ9dS5sZW5ndGgpPjQpcmV0dXJuIGU7Zm9yKG49W10scj0wO3I8dDtyKyspe2lmKCIiPT0obz11W3JdKSlyZXR1cm4gZTtpZihhPTEwLG8ubGVuZ3RoPjEmJiIwIj09by5jaGFyQXQoMCkmJihhPVAudGVzdChvKT8xNjo4LG89by5zbGljZSg4PT1hPzE6MikpLCIiPT09bylpPTA7ZWxzZXtpZighKDEwPT1hP006OD09YT9OOlIpLnRlc3QobykpcmV0dXJuIGU7aT1wYXJzZUludChvLGEpfW4ucHVzaChpKX1mb3Iocj0wO3I8dDtyKyspaWYoaT1uW3JdLHI9PXQtMSl7aWYoaT49QygyNTYsNS10KSlyZXR1cm4gbnVsbH1lbHNlIGlmKGk+MjU1KXJldHVybiBudWxsO2ZvcihzPW4ucG9wKCkscj0wO3I8bi5sZW5ndGg7cisrKXMrPW5bcl0qQygyNTYsMy1yKTtyZXR1cm4gc30sej1mdW5jdGlvbihlKXt2YXIgdCxuLHIsbyxhLGkscyx1PVswLDAsMCwwLDAsMCwwLDBdLGM9MCxsPW51bGwscD0wLGY9ZnVuY3Rpb24oKXtyZXR1cm4gZS5jaGFyQXQocCl9O2lmKCI6Ij09ZigpKXtpZigiOiIhPWUuY2hhckF0KDEpKXJldHVybjtwKz0yLGw9KytjfWZvcig7ZigpOyl7aWYoOD09YylyZXR1cm47aWYoIjoiIT1mKCkpe2Zvcih0PW49MDtuPDQmJlIudGVzdChmKCkpOyl0PTE2KnQrcGFyc2VJbnQoZigpLDE2KSxwKyssbisrO2lmKCIuIj09ZigpKXtpZigwPT1uKXJldHVybjtpZihwLT1uLGM+NilyZXR1cm47Zm9yKHI9MDtmKCk7KXtpZihvPW51bGwscj4wKXtpZighKCIuIj09ZigpJiZyPDQpKXJldHVybjtwKyt9aWYoIUkudGVzdChmKCkpKXJldHVybjtmb3IoO0kudGVzdChmKCkpOyl7aWYoYT1wYXJzZUludChmKCksMTApLG51bGw9PT1vKW89YTtlbHNle2lmKDA9PW8pcmV0dXJuO289MTAqbythfWlmKG8+MjU1KXJldHVybjtwKyt9dVtjXT0yNTYqdVtjXStvLDIhPSsrciYmNCE9cnx8YysrfWlmKDQhPXIpcmV0dXJuO2JyZWFrfWlmKCI6Ij09ZigpKXtpZihwKyssIWYoKSlyZXR1cm59ZWxzZSBpZihmKCkpcmV0dXJuO3VbYysrXT10fWVsc2V7aWYobnVsbCE9PWwpcmV0dXJuO3ArKyxsPSsrY319aWYobnVsbCE9PWwpZm9yKGk9Yy1sLGM9NzswIT1jJiZpPjA7KXM9dVtjXSx1W2MtLV09dVtsK2ktMV0sdVtsKy0taV09cztlbHNlIGlmKDghPWMpcmV0dXJuO3JldHVybiB1fSxWPWZ1bmN0aW9uKGUpe3ZhciB0LG4scixvO2lmKCJudW1iZXIiPT10eXBlb2YgZSl7Zm9yKHQ9W10sbj0wO248NDtuKyspdC51bnNoaWZ0KGUlMjU2KSxlPVMoZS8yNTYpO3JldHVybiB0LmpvaW4oIi4iKX1pZigib2JqZWN0Ij09dHlwZW9mIGUpe2Zvcih0PSIiLHI9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PW51bGwsbj0xLHI9bnVsbCxvPTAsYT0wO2E8ODthKyspMCE9PWVbYV0/KG8+biYmKHQ9cixuPW8pLHI9bnVsbCxvPTApOihudWxsPT09ciYmKHI9YSksKytvKTtyZXR1cm4gbz5uJiYodD1yLG49byksdH0oZSksbj0wO248ODtuKyspbyYmMD09PWVbbl18fChvJiYobz0hMSkscj09PW4/KHQrPW4/IjoiOiI6OiIsbz0hMCk6KHQrPWVbbl0udG9TdHJpbmcoMTYpLG48NyYmKHQrPSI6IikpKTtyZXR1cm4iWyIrdCsiXSJ9cmV0dXJuIGV9LFc9e30sSD1mKHt9LFcseyIgIjoxLCciJzoxLCI8IjoxLCI+IjoxLCJgIjoxfSksJD1mKHt9LEgseyIjIjoxLCI/IjoxLCJ7IjoxLCJ9IjoxfSksSj1mKHt9LCQseyIvIjoxLCI6IjoxLCI7IjoxLCI9IjoxLCJAIjoxLCJbIjoxLCJcXCI6MSwiXSI6MSwiXiI6MSwifCI6MX0pLEs9ZnVuY3Rpb24oZSx0KXt2YXIgbj1kKGUsMCk7cmV0dXJuIG4+MzImJm48MTI3JiYhcCh0LGUpP2U6ZW5jb2RlVVJJQ29tcG9uZW50KGUpfSxZPXtmdHA6MjEsZmlsZTpudWxsLGh0dHA6ODAsaHR0cHM6NDQzLHdzOjgwLHdzczo0NDN9LEc9ZnVuY3Rpb24oZSl7cmV0dXJuIHAoWSxlLnNjaGVtZSl9LFo9ZnVuY3Rpb24oZSl7cmV0dXJuIiIhPWUudXNlcm5hbWV8fCIiIT1lLnBhc3N3b3JkfSxYPWZ1bmN0aW9uKGUpe3JldHVybiFlLmhvc3R8fGUuY2Fubm90QmVBQmFzZVVSTHx8ImZpbGUiPT1lLnNjaGVtZX0sUT1mdW5jdGlvbihlLHQpe3ZhciBuO3JldHVybiAyPT1lLmxlbmd0aCYmai50ZXN0KGUuY2hhckF0KDApKSYmKCI6Ij09KG49ZS5jaGFyQXQoMSkpfHwhdCYmInwiPT1uKX0sZWU9ZnVuY3Rpb24oZSl7dmFyIHQ7cmV0dXJuIGUubGVuZ3RoPjEmJlEoZS5zbGljZSgwLDIpKSYmKDI9PWUubGVuZ3RofHwiLyI9PT0odD1lLmNoYXJBdCgyKSl8fCJcXCI9PT10fHwiPyI9PT10fHwiIyI9PT10KX0sdGU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXRoLG49dC5sZW5ndGg7IW58fCJmaWxlIj09ZS5zY2hlbWUmJjE9PW4mJlEodFswXSwhMCl8fHQucG9wKCl9LG5lPWZ1bmN0aW9uKGUpe3JldHVybiIuIj09PWV8fCIlMmUiPT09ZS50b0xvd2VyQ2FzZSgpfSxyZT17fSxvZT17fSxhZT17fSxpZT17fSxzZT17fSx1ZT17fSxjZT17fSxsZT17fSxwZT17fSxmZT17fSxoZT17fSxkZT17fSxtZT17fSx2ZT17fSxnZT17fSx5ZT17fSxiZT17fSxfZT17fSx3ZT17fSx4ZT17fSxFZT17fSxTZT1mdW5jdGlvbihlLHQsbixvKXt2YXIgYSxpLHMsdSxjLGw9bnx8cmUsZj0wLGQ9IiIsbT0hMSx2PSExLGc9ITE7Zm9yKG58fChlLnNjaGVtZT0iIixlLnVzZXJuYW1lPSIiLGUucGFzc3dvcmQ9IiIsZS5ob3N0PW51bGwsZS5wb3J0PW51bGwsZS5wYXRoPVtdLGUucXVlcnk9bnVsbCxlLmZyYWdtZW50PW51bGwsZS5jYW5ub3RCZUFCYXNlVVJMPSExLHQ9dC5yZXBsYWNlKEIsIiIpKSx0PXQucmVwbGFjZShGLCIiKSxhPWgodCk7Zjw9YS5sZW5ndGg7KXtzd2l0Y2goaT1hW2ZdLGwpe2Nhc2UgcmU6aWYoIWl8fCFqLnRlc3QoaSkpe2lmKG4pcmV0dXJuIEE7bD1hZTtjb250aW51ZX1kKz1pLnRvTG93ZXJDYXNlKCksbD1vZTticmVhaztjYXNlIG9lOmlmKGkmJihULnRlc3QoaSl8fCIrIj09aXx8Ii0iPT1pfHwiLiI9PWkpKWQrPWkudG9Mb3dlckNhc2UoKTtlbHNle2lmKCI6IiE9aSl7aWYobilyZXR1cm4gQTtkPSIiLGw9YWUsZj0wO2NvbnRpbnVlfWlmKG4mJihHKGUpIT1wKFksZCl8fCJmaWxlIj09ZCYmKFooZSl8fG51bGwhPT1lLnBvcnQpfHwiZmlsZSI9PWUuc2NoZW1lJiYhZS5ob3N0KSlyZXR1cm47aWYoZS5zY2hlbWU9ZCxuKXJldHVybiB2b2lkKEcoZSkmJllbZS5zY2hlbWVdPT1lLnBvcnQmJihlLnBvcnQ9bnVsbCkpO2Q9IiIsImZpbGUiPT1lLnNjaGVtZT9sPXZlOkcoZSkmJm8mJm8uc2NoZW1lPT1lLnNjaGVtZT9sPWllOkcoZSk/bD1sZToiLyI9PWFbZisxXT8obD1zZSxmKyspOihlLmNhbm5vdEJlQUJhc2VVUkw9ITAsZS5wYXRoLnB1c2goIiIpLGw9d2UpfWJyZWFrO2Nhc2UgYWU6aWYoIW98fG8uY2Fubm90QmVBQmFzZVVSTCYmIiMiIT1pKXJldHVybiBBO2lmKG8uY2Fubm90QmVBQmFzZVVSTCYmIiMiPT1pKXtlLnNjaGVtZT1vLnNjaGVtZSxlLnBhdGg9by5wYXRoLnNsaWNlKCksZS5xdWVyeT1vLnF1ZXJ5LGUuZnJhZ21lbnQ9IiIsZS5jYW5ub3RCZUFCYXNlVVJMPSEwLGw9RWU7YnJlYWt9bD0iZmlsZSI9PW8uc2NoZW1lP3ZlOnVlO2NvbnRpbnVlO2Nhc2UgaWU6aWYoIi8iIT1pfHwiLyIhPWFbZisxXSl7bD11ZTtjb250aW51ZX1sPXBlLGYrKzticmVhaztjYXNlIHNlOmlmKCIvIj09aSl7bD1mZTticmVha31sPV9lO2NvbnRpbnVlO2Nhc2UgdWU6aWYoZS5zY2hlbWU9by5zY2hlbWUsaT09cillLnVzZXJuYW1lPW8udXNlcm5hbWUsZS5wYXNzd29yZD1vLnBhc3N3b3JkLGUuaG9zdD1vLmhvc3QsZS5wb3J0PW8ucG9ydCxlLnBhdGg9by5wYXRoLnNsaWNlKCksZS5xdWVyeT1vLnF1ZXJ5O2Vsc2UgaWYoIi8iPT1pfHwiXFwiPT1pJiZHKGUpKWw9Y2U7ZWxzZSBpZigiPyI9PWkpZS51c2VybmFtZT1vLnVzZXJuYW1lLGUucGFzc3dvcmQ9by5wYXNzd29yZCxlLmhvc3Q9by5ob3N0LGUucG9ydD1vLnBvcnQsZS5wYXRoPW8ucGF0aC5zbGljZSgpLGUucXVlcnk9IiIsbD14ZTtlbHNle2lmKCIjIiE9aSl7ZS51c2VybmFtZT1vLnVzZXJuYW1lLGUucGFzc3dvcmQ9by5wYXNzd29yZCxlLmhvc3Q9by5ob3N0LGUucG9ydD1vLnBvcnQsZS5wYXRoPW8ucGF0aC5zbGljZSgpLGUucGF0aC5wb3AoKSxsPV9lO2NvbnRpbnVlfWUudXNlcm5hbWU9by51c2VybmFtZSxlLnBhc3N3b3JkPW8ucGFzc3dvcmQsZS5ob3N0PW8uaG9zdCxlLnBvcnQ9by5wb3J0LGUucGF0aD1vLnBhdGguc2xpY2UoKSxlLnF1ZXJ5PW8ucXVlcnksZS5mcmFnbWVudD0iIixsPUVlfWJyZWFrO2Nhc2UgY2U6aWYoIUcoZSl8fCIvIiE9aSYmIlxcIiE9aSl7aWYoIi8iIT1pKXtlLnVzZXJuYW1lPW8udXNlcm5hbWUsZS5wYXNzd29yZD1vLnBhc3N3b3JkLGUuaG9zdD1vLmhvc3QsZS5wb3J0PW8ucG9ydCxsPV9lO2NvbnRpbnVlfWw9ZmV9ZWxzZSBsPXBlO2JyZWFrO2Nhc2UgbGU6aWYobD1wZSwiLyIhPWl8fCIvIiE9ZC5jaGFyQXQoZisxKSljb250aW51ZTtmKys7YnJlYWs7Y2FzZSBwZTppZigiLyIhPWkmJiJcXCIhPWkpe2w9ZmU7Y29udGludWV9YnJlYWs7Y2FzZSBmZTppZigiQCI9PWkpe20mJihkPSIlNDAiK2QpLG09ITAscz1oKGQpO2Zvcih2YXIgeT0wO3k8cy5sZW5ndGg7eSsrKXt2YXIgYj1zW3ldO2lmKCI6IiE9Ynx8Zyl7dmFyIF89SyhiLEopO2c/ZS5wYXNzd29yZCs9XzplLnVzZXJuYW1lKz1ffWVsc2UgZz0hMH1kPSIifWVsc2UgaWYoaT09cnx8Ii8iPT1pfHwiPyI9PWl8fCIjIj09aXx8IlxcIj09aSYmRyhlKSl7aWYobSYmIiI9PWQpcmV0dXJuIkludmFsaWQgYXV0aG9yaXR5IjtmLT1oKGQpLmxlbmd0aCsxLGQ9IiIsbD1oZX1lbHNlIGQrPWk7YnJlYWs7Y2FzZSBoZTpjYXNlIGRlOmlmKG4mJiJmaWxlIj09ZS5zY2hlbWUpe2w9eWU7Y29udGludWV9aWYoIjoiIT1pfHx2KXtpZihpPT1yfHwiLyI9PWl8fCI/Ij09aXx8IiMiPT1pfHwiXFwiPT1pJiZHKGUpKXtpZihHKGUpJiYiIj09ZClyZXR1cm4gTztpZihuJiYiIj09ZCYmKFooZSl8fG51bGwhPT1lLnBvcnQpKXJldHVybjtpZih1PVUoZSxkKSlyZXR1cm4gdTtpZihkPSIiLGw9YmUsbilyZXR1cm47Y29udGludWV9IlsiPT1pP3Y9ITA6Il0iPT1pJiYodj0hMSksZCs9aX1lbHNle2lmKCIiPT1kKXJldHVybiBPO2lmKHU9VShlLGQpKXJldHVybiB1O2lmKGQ9IiIsbD1tZSxuPT1kZSlyZXR1cm59YnJlYWs7Y2FzZSBtZTppZighSS50ZXN0KGkpKXtpZihpPT1yfHwiLyI9PWl8fCI/Ij09aXx8IiMiPT1pfHwiXFwiPT1pJiZHKGUpfHxuKXtpZigiIiE9ZCl7dmFyIHc9cGFyc2VJbnQoZCwxMCk7aWYodz42NTUzNSlyZXR1cm4gaztlLnBvcnQ9RyhlKSYmdz09PVlbZS5zY2hlbWVdP251bGw6dyxkPSIifWlmKG4pcmV0dXJuO2w9YmU7Y29udGludWV9cmV0dXJuIGt9ZCs9aTticmVhaztjYXNlIHZlOmlmKGUuc2NoZW1lPSJmaWxlIiwiLyI9PWl8fCJcXCI9PWkpbD1nZTtlbHNle2lmKCFvfHwiZmlsZSIhPW8uc2NoZW1lKXtsPV9lO2NvbnRpbnVlfWlmKGk9PXIpZS5ob3N0PW8uaG9zdCxlLnBhdGg9by5wYXRoLnNsaWNlKCksZS5xdWVyeT1vLnF1ZXJ5O2Vsc2UgaWYoIj8iPT1pKWUuaG9zdD1vLmhvc3QsZS5wYXRoPW8ucGF0aC5zbGljZSgpLGUucXVlcnk9IiIsbD14ZTtlbHNle2lmKCIjIiE9aSl7ZWUoYS5zbGljZShmKS5qb2luKCIiKSl8fChlLmhvc3Q9by5ob3N0LGUucGF0aD1vLnBhdGguc2xpY2UoKSx0ZShlKSksbD1fZTtjb250aW51ZX1lLmhvc3Q9by5ob3N0LGUucGF0aD1vLnBhdGguc2xpY2UoKSxlLnF1ZXJ5PW8ucXVlcnksZS5mcmFnbWVudD0iIixsPUVlfX1icmVhaztjYXNlIGdlOmlmKCIvIj09aXx8IlxcIj09aSl7bD15ZTticmVha31vJiYiZmlsZSI9PW8uc2NoZW1lJiYhZWUoYS5zbGljZShmKS5qb2luKCIiKSkmJihRKG8ucGF0aFswXSwhMCk/ZS5wYXRoLnB1c2goby5wYXRoWzBdKTplLmhvc3Q9by5ob3N0KSxsPV9lO2NvbnRpbnVlO2Nhc2UgeWU6aWYoaT09cnx8Ii8iPT1pfHwiXFwiPT1pfHwiPyI9PWl8fCIjIj09aSl7aWYoIW4mJlEoZCkpbD1fZTtlbHNlIGlmKCIiPT1kKXtpZihlLmhvc3Q9IiIsbilyZXR1cm47bD1iZX1lbHNle2lmKHU9VShlLGQpKXJldHVybiB1O2lmKCJsb2NhbGhvc3QiPT1lLmhvc3QmJihlLmhvc3Q9IiIpLG4pcmV0dXJuO2Q9IiIsbD1iZX1jb250aW51ZX1kKz1pO2JyZWFrO2Nhc2UgYmU6aWYoRyhlKSl7aWYobD1fZSwiLyIhPWkmJiJcXCIhPWkpY29udGludWV9ZWxzZSBpZihufHwiPyIhPWkpaWYobnx8IiMiIT1pKXtpZihpIT1yJiYobD1fZSwiLyIhPWkpKWNvbnRpbnVlfWVsc2UgZS5mcmFnbWVudD0iIixsPUVlO2Vsc2UgZS5xdWVyeT0iIixsPXhlO2JyZWFrO2Nhc2UgX2U6aWYoaT09cnx8Ii8iPT1pfHwiXFwiPT1pJiZHKGUpfHwhbiYmKCI/Ij09aXx8IiMiPT1pKSl7aWYoIi4uIj09PShjPShjPWQpLnRvTG93ZXJDYXNlKCkpfHwiJTJlLiI9PT1jfHwiLiUyZSI9PT1jfHwiJTJlJTJlIj09PWM/KHRlKGUpLCIvIj09aXx8IlxcIj09aSYmRyhlKXx8ZS5wYXRoLnB1c2goIiIpKTpuZShkKT8iLyI9PWl8fCJcXCI9PWkmJkcoZSl8fGUucGF0aC5wdXNoKCIiKTooImZpbGUiPT1lLnNjaGVtZSYmIWUucGF0aC5sZW5ndGgmJlEoZCkmJihlLmhvc3QmJihlLmhvc3Q9IiIpLGQ9ZC5jaGFyQXQoMCkrIjoiKSxlLnBhdGgucHVzaChkKSksZD0iIiwiZmlsZSI9PWUuc2NoZW1lJiYoaT09cnx8Ij8iPT1pfHwiIyI9PWkpKWZvcig7ZS5wYXRoLmxlbmd0aD4xJiYiIj09PWUucGF0aFswXTspZS5wYXRoLnNoaWZ0KCk7Ij8iPT1pPyhlLnF1ZXJ5PSIiLGw9eGUpOiIjIj09aSYmKGUuZnJhZ21lbnQ9IiIsbD1FZSl9ZWxzZSBkKz1LKGksJCk7YnJlYWs7Y2FzZSB3ZToiPyI9PWk/KGUucXVlcnk9IiIsbD14ZSk6IiMiPT1pPyhlLmZyYWdtZW50PSIiLGw9RWUpOmkhPXImJihlLnBhdGhbMF0rPUsoaSxXKSk7YnJlYWs7Y2FzZSB4ZTpufHwiIyIhPWk/aSE9ciYmKCInIj09aSYmRyhlKT9lLnF1ZXJ5Kz0iJTI3IjplLnF1ZXJ5Kz0iIyI9PWk/IiUyMyI6SyhpLFcpKTooZS5mcmFnbWVudD0iIixsPUVlKTticmVhaztjYXNlIEVlOmkhPXImJihlLmZyYWdtZW50Kz1LKGksSCkpfWYrK319LENlPWZ1bmN0aW9uKGUpe3ZhciB0LG4scj1sKHRoaXMsQ2UsIlVSTCIpLG89YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsaT1TdHJpbmcoZSkscz14KHIse3R5cGU6IlVSTCJ9KTtpZih2b2lkIDAhPT1vKWlmKG8gaW5zdGFuY2VvZiBDZSl0PUUobyk7ZWxzZSBpZihuPVNlKHQ9e30sU3RyaW5nKG8pKSl0aHJvdyBUeXBlRXJyb3Iobik7aWYobj1TZShzLGksbnVsbCx0KSl0aHJvdyBUeXBlRXJyb3Iobik7dmFyIHU9cy5zZWFyY2hQYXJhbXM9bmV3IF8sYz13KHUpO2MudXBkYXRlU2VhcmNoUGFyYW1zKHMucXVlcnkpLGMudXBkYXRlVVJMPWZ1bmN0aW9uKCl7cy5xdWVyeT1TdHJpbmcodSl8fG51bGx9LGF8fChyLmhyZWY9T2UuY2FsbChyKSxyLm9yaWdpbj1rZS5jYWxsKHIpLHIucHJvdG9jb2w9amUuY2FsbChyKSxyLnVzZXJuYW1lPVRlLmNhbGwociksci5wYXNzd29yZD1JZS5jYWxsKHIpLHIuaG9zdD1QZS5jYWxsKHIpLHIuaG9zdG5hbWU9TmUuY2FsbChyKSxyLnBvcnQ9TWUuY2FsbChyKSxyLnBhdGhuYW1lPVJlLmNhbGwociksci5zZWFyY2g9RGUuY2FsbChyKSxyLnNlYXJjaFBhcmFtcz1MZS5jYWxsKHIpLHIuaGFzaD1CZS5jYWxsKHIpKX0sQWU9Q2UucHJvdG90eXBlLE9lPWZ1bmN0aW9uKCl7dmFyIGU9RSh0aGlzKSx0PWUuc2NoZW1lLG49ZS51c2VybmFtZSxyPWUucGFzc3dvcmQsbz1lLmhvc3QsYT1lLnBvcnQsaT1lLnBhdGgscz1lLnF1ZXJ5LHU9ZS5mcmFnbWVudCxjPXQrIjoiO3JldHVybiBudWxsIT09bz8oYys9Ii8vIixaKGUpJiYoYys9bisocj8iOiIrcjoiIikrIkAiKSxjKz1WKG8pLG51bGwhPT1hJiYoYys9IjoiK2EpKToiZmlsZSI9PXQmJihjKz0iLy8iKSxjKz1lLmNhbm5vdEJlQUJhc2VVUkw/aVswXTppLmxlbmd0aD8iLyIraS5qb2luKCIvIik6IiIsbnVsbCE9PXMmJihjKz0iPyIrcyksbnVsbCE9PXUmJihjKz0iIyIrdSksY30sa2U9ZnVuY3Rpb24oKXt2YXIgZT1FKHRoaXMpLHQ9ZS5zY2hlbWUsbj1lLnBvcnQ7aWYoImJsb2IiPT10KXRyeXtyZXR1cm4gbmV3IENlKHQucGF0aFswXSkub3JpZ2lufWNhdGNoKGUpe3JldHVybiJudWxsIn1yZXR1cm4iZmlsZSIhPXQmJkcoZSk/dCsiOi8vIitWKGUuaG9zdCkrKG51bGwhPT1uPyI6IituOiIiKToibnVsbCJ9LGplPWZ1bmN0aW9uKCl7cmV0dXJuIEUodGhpcykuc2NoZW1lKyI6In0sVGU9ZnVuY3Rpb24oKXtyZXR1cm4gRSh0aGlzKS51c2VybmFtZX0sSWU9ZnVuY3Rpb24oKXtyZXR1cm4gRSh0aGlzKS5wYXNzd29yZH0sUGU9ZnVuY3Rpb24oKXt2YXIgZT1FKHRoaXMpLHQ9ZS5ob3N0LG49ZS5wb3J0O3JldHVybiBudWxsPT09dD8iIjpudWxsPT09bj9WKHQpOlYodCkrIjoiK259LE5lPWZ1bmN0aW9uKCl7dmFyIGU9RSh0aGlzKS5ob3N0O3JldHVybiBudWxsPT09ZT8iIjpWKGUpfSxNZT1mdW5jdGlvbigpe3ZhciBlPUUodGhpcykucG9ydDtyZXR1cm4gbnVsbD09PWU/IiI6U3RyaW5nKGUpfSxSZT1mdW5jdGlvbigpe3ZhciBlPUUodGhpcyksdD1lLnBhdGg7cmV0dXJuIGUuY2Fubm90QmVBQmFzZVVSTD90WzBdOnQubGVuZ3RoPyIvIit0LmpvaW4oIi8iKToiIn0sRGU9ZnVuY3Rpb24oKXt2YXIgZT1FKHRoaXMpLnF1ZXJ5O3JldHVybiBlPyI/IitlOiIifSxMZT1mdW5jdGlvbigpe3JldHVybiBFKHRoaXMpLnNlYXJjaFBhcmFtc30sQmU9ZnVuY3Rpb24oKXt2YXIgZT1FKHRoaXMpLmZyYWdtZW50O3JldHVybiBlPyIjIitlOiIifSxGZT1mdW5jdGlvbihlLHQpe3JldHVybntnZXQ6ZSxzZXQ6dCxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH19O2lmKGEmJnUoQWUse2hyZWY6RmUoT2UsKGZ1bmN0aW9uKGUpe3ZhciB0PUUodGhpcyksbj1TdHJpbmcoZSkscj1TZSh0LG4pO2lmKHIpdGhyb3cgVHlwZUVycm9yKHIpO3codC5zZWFyY2hQYXJhbXMpLnVwZGF0ZVNlYXJjaFBhcmFtcyh0LnF1ZXJ5KX0pKSxvcmlnaW46RmUoa2UpLHByb3RvY29sOkZlKGplLChmdW5jdGlvbihlKXt2YXIgdD1FKHRoaXMpO1NlKHQsU3RyaW5nKGUpKyI6IixyZSl9KSksdXNlcm5hbWU6RmUoVGUsKGZ1bmN0aW9uKGUpe3ZhciB0PUUodGhpcyksbj1oKFN0cmluZyhlKSk7aWYoIVgodCkpe3QudXNlcm5hbWU9IiI7Zm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKyspdC51c2VybmFtZSs9SyhuW3JdLEopfX0pKSxwYXNzd29yZDpGZShJZSwoZnVuY3Rpb24oZSl7dmFyIHQ9RSh0aGlzKSxuPWgoU3RyaW5nKGUpKTtpZighWCh0KSl7dC5wYXNzd29yZD0iIjtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl0LnBhc3N3b3JkKz1LKG5bcl0sSil9fSkpLGhvc3Q6RmUoUGUsKGZ1bmN0aW9uKGUpe3ZhciB0PUUodGhpcyk7dC5jYW5ub3RCZUFCYXNlVVJMfHxTZSh0LFN0cmluZyhlKSxoZSl9KSksaG9zdG5hbWU6RmUoTmUsKGZ1bmN0aW9uKGUpe3ZhciB0PUUodGhpcyk7dC5jYW5ub3RCZUFCYXNlVVJMfHxTZSh0LFN0cmluZyhlKSxkZSl9KSkscG9ydDpGZShNZSwoZnVuY3Rpb24oZSl7dmFyIHQ9RSh0aGlzKTtYKHQpfHwoIiI9PShlPVN0cmluZyhlKSk/dC5wb3J0PW51bGw6U2UodCxlLG1lKSl9KSkscGF0aG5hbWU6RmUoUmUsKGZ1bmN0aW9uKGUpe3ZhciB0PUUodGhpcyk7dC5jYW5ub3RCZUFCYXNlVVJMfHwodC5wYXRoPVtdLFNlKHQsZSsiIixiZSkpfSkpLHNlYXJjaDpGZShEZSwoZnVuY3Rpb24oZSl7dmFyIHQ9RSh0aGlzKTsiIj09KGU9U3RyaW5nKGUpKT90LnF1ZXJ5PW51bGw6KCI/Ij09ZS5jaGFyQXQoMCkmJihlPWUuc2xpY2UoMSkpLHQucXVlcnk9IiIsU2UodCxlLHhlKSksdyh0LnNlYXJjaFBhcmFtcykudXBkYXRlU2VhcmNoUGFyYW1zKHQucXVlcnkpfSkpLHNlYXJjaFBhcmFtczpGZShMZSksaGFzaDpGZShCZSwoZnVuY3Rpb24oZSl7dmFyIHQ9RSh0aGlzKTsiIiE9KGU9U3RyaW5nKGUpKT8oIiMiPT1lLmNoYXJBdCgwKSYmKGU9ZS5zbGljZSgxKSksdC5mcmFnbWVudD0iIixTZSh0LGUsRWUpKTp0LmZyYWdtZW50PW51bGx9KSl9KSxjKEFlLCJ0b0pTT04iLChmdW5jdGlvbigpe3JldHVybiBPZS5jYWxsKHRoaXMpfSkse2VudW1lcmFibGU6ITB9KSxjKEFlLCJ0b1N0cmluZyIsKGZ1bmN0aW9uKCl7cmV0dXJuIE9lLmNhbGwodGhpcyl9KSx7ZW51bWVyYWJsZTohMH0pLGIpe3ZhciBVZT1iLmNyZWF0ZU9iamVjdFVSTCxxZT1iLnJldm9rZU9iamVjdFVSTDtVZSYmYyhDZSwiY3JlYXRlT2JqZWN0VVJMIiwoZnVuY3Rpb24oZSl7cmV0dXJuIFVlLmFwcGx5KGIsYXJndW1lbnRzKX0pKSxxZSYmYyhDZSwicmV2b2tlT2JqZWN0VVJMIiwoZnVuY3Rpb24oZSl7cmV0dXJuIHFlLmFwcGx5KGIsYXJndW1lbnRzKX0pKX12KENlLCJVUkwiKSxvKHtnbG9iYWw6ITAsZm9yY2VkOiFpLHNoYW06IWF9LHtVUkw6Q2V9KX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj0yMTQ3NDgzNjQ3LG89L1teXDAtXHUwMDdFXS8sYT0vWy5cdTMwMDJcdUZGMEVcdUZGNjFdL2csaT0iT3ZlcmZsb3c6IGlucHV0IG5lZWRzIHdpZGVyIGludGVnZXJzIHRvIHByb2Nlc3MiLHM9TWF0aC5mbG9vcix1PVN0cmluZy5mcm9tQ2hhckNvZGUsYz1mdW5jdGlvbihlKXtyZXR1cm4gZSsyMis3NSooZTwyNil9LGw9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPTA7Zm9yKGU9bj9zKGUvNzAwKTplPj4xLGUrPXMoZS90KTtlPjQ1NTtyKz0zNillPXMoZS8zNSk7cmV0dXJuIHMociszNiplLyhlKzM4KSl9LHA9ZnVuY3Rpb24oZSl7dmFyIHQsbixvPVtdLGE9KGU9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MCxyPWUubGVuZ3RoO248cjspe3ZhciBvPWUuY2hhckNvZGVBdChuKyspO2lmKG8+PTU1Mjk2JiZvPD01NjMxOSYmbjxyKXt2YXIgYT1lLmNoYXJDb2RlQXQobisrKTs1NjMyMD09KDY0NTEyJmEpP3QucHVzaCgoKDEwMjMmbyk8PDEwKSsoMTAyMyZhKSs2NTUzNik6KHQucHVzaChvKSxuLS0pfWVsc2UgdC5wdXNoKG8pfXJldHVybiB0fShlKSkubGVuZ3RoLHA9MTI4LGY9MCxoPTcyO2Zvcih0PTA7dDxlLmxlbmd0aDt0KyspKG49ZVt0XSk8MTI4JiZvLnB1c2godShuKSk7dmFyIGQ9by5sZW5ndGgsbT1kO2ZvcihkJiZvLnB1c2goIi0iKTttPGE7KXt2YXIgdj1yO2Zvcih0PTA7dDxlLmxlbmd0aDt0KyspKG49ZVt0XSk+PXAmJm48diYmKHY9bik7dmFyIGc9bSsxO2lmKHYtcD5zKChyLWYpL2cpKXRocm93IFJhbmdlRXJyb3IoaSk7Zm9yKGYrPSh2LXApKmcscD12LHQ9MDt0PGUubGVuZ3RoO3QrKyl7aWYoKG49ZVt0XSk8cCYmKytmPnIpdGhyb3cgUmFuZ2VFcnJvcihpKTtpZihuPT1wKXtmb3IodmFyIHk9ZixiPTM2OztiKz0zNil7dmFyIF89Yjw9aD8xOmI+PWgrMjY/MjY6Yi1oO2lmKHk8XylicmVhazt2YXIgdz15LV8seD0zNi1fO28ucHVzaCh1KGMoXyt3JXgpKSkseT1zKHcveCl9by5wdXNoKHUoYyh5KSkpLGg9bChmLGcsbT09ZCksZj0wLCsrbX19KytmLCsrcH1yZXR1cm4gby5qb2luKCIiKX07ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0LG4scj1bXSxpPWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKGEsIi4iKS5zcGxpdCgiLiIpO2Zvcih0PTA7dDxpLmxlbmd0aDt0Kyspbj1pW3RdLHIucHVzaChvLnRlc3Qobik/InhuLS0iK3Aobik6bik7cmV0dXJuIHIuam9pbigiLiIpfX0sZnVuY3Rpb24oZSx0KXt9LGZ1bmN0aW9uKGUsdCxuKXtuKDEwODYpO3ZhciByPW4oMzMpO2UuZXhwb3J0cz1yLnNldFRpbWVvdXR9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDIyKSxvPW4oNDApLGE9bigxMTApLGk9W10uc2xpY2Uscz1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCxuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjIsbz1yP2kuY2FsbChhcmd1bWVudHMsMik6dm9pZCAwO3JldHVybiBlKHI/ZnVuY3Rpb24oKXsoImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpGdW5jdGlvbih0KSkuYXBwbHkodGhpcyxvKX06dCxuKX19O3Ioe2dsb2JhbDohMCxiaW5kOiEwLGZvcmNlZDovTVNJRSAuXC4vLnRlc3QoYSl9LHtzZXRUaW1lb3V0OnMoby5zZXRUaW1lb3V0KSxzZXRJbnRlcnZhbDpzKG8uc2V0SW50ZXJ2YWwpfSl9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDEwODgpO2UuZXhwb3J0cz1yfSxmdW5jdGlvbihlLHQsbil7bigxMDg5KSxuKDE4MiksbigxMzApLG4oODYpO3ZhciByPW4oMzMpO2UuZXhwb3J0cz1yLk1hcH0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDQ5NSksbz1uKDEwOTApO2UuZXhwb3J0cz1yKCJNYXAiLChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZSh0aGlzLGFyZ3VtZW50cy5sZW5ndGg/YXJndW1lbnRzWzBdOnZvaWQgMCl9fSksbyl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9big2OCkuZixvPW4oMTExKSxhPW4oMTY0KSxpPW4oMTA5KSxzPW4oMTQxKSx1PW4oMTIxKSxjPW4oMjM2KSxsPW4oNDUwKSxwPW4oNDgpLGY9bigyMDgpLmZhc3RLZXksaD1uKDc3KSxkPWguc2V0LG09aC5nZXR0ZXJGb3I7ZS5leHBvcnRzPXtnZXRDb25zdHJ1Y3RvcjpmdW5jdGlvbihlLHQsbixjKXt2YXIgbD1lKChmdW5jdGlvbihlLHIpe3MoZSxsLHQpLGQoZSx7dHlwZTp0LGluZGV4Om8obnVsbCksZmlyc3Q6dm9pZCAwLGxhc3Q6dm9pZCAwLHNpemU6MH0pLHB8fChlLnNpemU9MCksbnVsbCE9ciYmdShyLGVbY10se3RoYXQ6ZSxBU19FTlRSSUVTOm59KX0pKSxoPW0odCksdj1mdW5jdGlvbihlLHQsbil7dmFyIHIsbyxhPWgoZSksaT1nKGUsdCk7cmV0dXJuIGk/aS52YWx1ZT1uOihhLmxhc3Q9aT17aW5kZXg6bz1mKHQsITApLGtleTp0LHZhbHVlOm4scHJldmlvdXM6cj1hLmxhc3QsbmV4dDp2b2lkIDAscmVtb3ZlZDohMX0sYS5maXJzdHx8KGEuZmlyc3Q9aSksciYmKHIubmV4dD1pKSxwP2Euc2l6ZSsrOmUuc2l6ZSsrLCJGIiE9PW8mJihhLmluZGV4W29dPWkpKSxlfSxnPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj1oKGUpLG89Zih0KTtpZigiRiIhPT1vKXJldHVybiByLmluZGV4W29dO2ZvcihuPXIuZmlyc3Q7bjtuPW4ubmV4dClpZihuLmtleT09dClyZXR1cm4gbn07cmV0dXJuIGEobC5wcm90b3R5cGUse2NsZWFyOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPWgodGhpcyksdD1lLmluZGV4LG49ZS5maXJzdDtuOyluLnJlbW92ZWQ9ITAsbi5wcmV2aW91cyYmKG4ucHJldmlvdXM9bi5wcmV2aW91cy5uZXh0PXZvaWQgMCksZGVsZXRlIHRbbi5pbmRleF0sbj1uLm5leHQ7ZS5maXJzdD1lLmxhc3Q9dm9pZCAwLHA/ZS5zaXplPTA6dGhpcy5zaXplPTB9LGRlbGV0ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49aCh0KSxyPWcodCxlKTtpZihyKXt2YXIgbz1yLm5leHQsYT1yLnByZXZpb3VzO2RlbGV0ZSBuLmluZGV4W3IuaW5kZXhdLHIucmVtb3ZlZD0hMCxhJiYoYS5uZXh0PW8pLG8mJihvLnByZXZpb3VzPWEpLG4uZmlyc3Q9PXImJihuLmZpcnN0PW8pLG4ubGFzdD09ciYmKG4ubGFzdD1hKSxwP24uc2l6ZS0tOnQuc2l6ZS0tfXJldHVybiEhcn0sZm9yRWFjaDpmdW5jdGlvbihlKXtmb3IodmFyIHQsbj1oKHRoaXMpLHI9aShlLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwLDMpO3Q9dD90Lm5leHQ6bi5maXJzdDspZm9yKHIodC52YWx1ZSx0LmtleSx0aGlzKTt0JiZ0LnJlbW92ZWQ7KXQ9dC5wcmV2aW91c30saGFzOmZ1bmN0aW9uKGUpe3JldHVybiEhZyh0aGlzLGUpfX0pLGEobC5wcm90b3R5cGUsbj97Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWcodGhpcyxlKTtyZXR1cm4gdCYmdC52YWx1ZX0sc2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHYodGhpcywwPT09ZT8wOmUsdCl9fTp7YWRkOmZ1bmN0aW9uKGUpe3JldHVybiB2KHRoaXMsZT0wPT09ZT8wOmUsZSl9fSkscCYmcihsLnByb3RvdHlwZSwic2l6ZSIse2dldDpmdW5jdGlvbigpe3JldHVybiBoKHRoaXMpLnNpemV9fSksbH0sc2V0U3Ryb25nOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10KyIgSXRlcmF0b3IiLG89bSh0KSxhPW0ocik7YyhlLHQsKGZ1bmN0aW9uKGUsdCl7ZCh0aGlzLHt0eXBlOnIsdGFyZ2V0OmUsc3RhdGU6byhlKSxraW5kOnQsbGFzdDp2b2lkIDB9KX0pLChmdW5jdGlvbigpe2Zvcih2YXIgZT1hKHRoaXMpLHQ9ZS5raW5kLG49ZS5sYXN0O24mJm4ucmVtb3ZlZDspbj1uLnByZXZpb3VzO3JldHVybiBlLnRhcmdldCYmKGUubGFzdD1uPW4/bi5uZXh0OmUuc3RhdGUuZmlyc3QpPyJrZXlzIj09dD97dmFsdWU6bi5rZXksZG9uZTohMX06InZhbHVlcyI9PXQ/e3ZhbHVlOm4udmFsdWUsZG9uZTohMX06e3ZhbHVlOltuLmtleSxuLnZhbHVlXSxkb25lOiExfTooZS50YXJnZXQ9dm9pZCAwLHt2YWx1ZTp2b2lkIDAsZG9uZTohMH0pfSksbj8iZW50cmllcyI6InZhbHVlcyIsIW4sITApLGwodCl9fX0sZnVuY3Rpb24oZSx0LG4pe24oODYpO3ZhciByPW4oMTA5Miksbz1uKDk4KSxhPUFycmF5LnByb3RvdHlwZSxpPXtET01Ub2tlbkxpc3Q6ITAsTm9kZUxpc3Q6ITB9O2UuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgdD1lLmtleXM7cmV0dXJuIGU9PT1hfHxlIGluc3RhbmNlb2YgQXJyYXkmJnQ9PT1hLmtleXN8fGkuaGFzT3duUHJvcGVydHkobyhlKSk/cjp0fX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTA5Myk7ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXtuKDE1OCk7dmFyIHI9big0Mik7ZS5leHBvcnRzPXIoIkFycmF5Iikua2V5c30sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5nZXQ/dC5nZXQuY2FsbChlKTp0LnZhbHVlfSxlLmV4cG9ydHMuZGVmYXVsdD1lLmV4cG9ydHMsZS5leHBvcnRzLl9fZXNNb2R1bGU9ITB9LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuKXtpZih0LnNldCl0LnNldC5jYWxsKGUsbik7ZWxzZXtpZighdC53cml0YWJsZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJhdHRlbXB0ZWQgdG8gc2V0IHJlYWQgb25seSBwcml2YXRlIGZpZWxkIik7dC52YWx1ZT1ufX0sZS5leHBvcnRzLmRlZmF1bHQ9ZS5leHBvcnRzLGUuZXhwb3J0cy5fX2VzTW9kdWxlPSEwfSxmdW5jdGlvbihlLHQsbil7big4Nik7dmFyIHI9bigxMDk3KSxvPW4oOTgpLGE9QXJyYXkucHJvdG90eXBlLGk9e0RPTVRva2VuTGlzdDohMCxOb2RlTGlzdDohMH07ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PWUudmFsdWVzO3JldHVybiBlPT09YXx8ZSBpbnN0YW5jZW9mIEFycmF5JiZ0PT09YS52YWx1ZXN8fGkuaGFzT3duUHJvcGVydHkobyhlKSk/cjp0fX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTA5OCk7ZS5leHBvcnRzPXJ9LGZ1bmN0aW9uKGUsdCxuKXtuKDE1OCk7dmFyIHI9big0Mik7ZS5leHBvcnRzPXIoIkFycmF5IikudmFsdWVzfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMTAwKTtlLmV4cG9ydHM9cn0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTEwMSksbz1BcnJheS5wcm90b3R5cGU7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3ZhciB0PWUubGFzdEluZGV4T2Y7cmV0dXJuIGU9PT1vfHxlIGluc3RhbmNlb2YgQXJyYXkmJnQ9PT1vLmxhc3RJbmRleE9mP3I6dH19LGZ1bmN0aW9uKGUsdCxuKXtuKDExMDIpO3ZhciByPW4oNDIpO2UuZXhwb3J0cz1yKCJBcnJheSIpLmxhc3RJbmRleE9mfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigyMiksbz1uKDExMDMpO3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDpvIT09W10ubGFzdEluZGV4T2Z9LHtsYXN0SW5kZXhPZjpvfSl9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9big2Niksbz1uKDEyOCksYT1uKDY5KSxpPW4oMTEzKSxzPU1hdGgubWluLHU9W10ubGFzdEluZGV4T2YsYz0hIXUmJjEvWzFdLmxhc3RJbmRleE9mKDEsLTApPDAsbD1pKCJsYXN0SW5kZXhPZiIpLHA9Y3x8IWw7ZS5leHBvcnRzPXA/ZnVuY3Rpb24oZSl7aWYoYylyZXR1cm4gdS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fDA7dmFyIHQ9cih0aGlzKSxuPWEodC5sZW5ndGgpLGk9bi0xO2Zvcihhcmd1bWVudHMubGVuZ3RoPjEmJihpPXMoaSxvKGFyZ3VtZW50c1sxXSkpKSxpPDAmJihpPW4raSk7aT49MDtpLS0paWYoaSBpbiB0JiZ0W2ldPT09ZSlyZXR1cm4gaXx8MDtyZXR1cm4tMX06dX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcixvPSIiO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe2lmKCJzdHJpbmciIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJleHBlY3RlZCBhIHN0cmluZyIpO2lmKDE9PT10KXJldHVybiBlO2lmKDI9PT10KXJldHVybiBlK2U7dmFyIG49ZS5sZW5ndGgqdDtpZihyIT09ZXx8dm9pZCAwPT09cilyPWUsbz0iIjtlbHNlIGlmKG8ubGVuZ3RoPj1uKXJldHVybiBvLnN1YnN0cigwLG4pO2Zvcig7bj5vLmxlbmd0aCYmdD4xOykxJnQmJihvKz1lKSx0Pj49MSxlKz1lO3JldHVybiBvPShvKz1lKS5zdWJzdHIoMCxuKX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuRGVib3VuY2VJbnB1dD12b2lkIDA7dmFyIHI9YShuKDApKSxvPWEobigxMTA2KSk7ZnVuY3Rpb24gYShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6e2RlZmF1bHQ6ZX19ZnVuY3Rpb24gaShlKXtyZXR1cm4oaT0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGV9OmZ1bmN0aW9uKGUpe3JldHVybiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZlLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZlIT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgZX0pKGUpfWZ1bmN0aW9uIHMoZSx0KXtpZihudWxsPT1lKXJldHVybnt9O3ZhciBuLHIsbz1mdW5jdGlvbihlLHQpe2lmKG51bGw9PWUpcmV0dXJue307dmFyIG4scixvPXt9LGE9T2JqZWN0LmtleXMoZSk7Zm9yKHI9MDtyPGEubGVuZ3RoO3IrKyluPWFbcl0sdC5pbmRleE9mKG4pPj0wfHwob1tuXT1lW25dKTtyZXR1cm4gb30oZSx0KTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgYT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO2ZvcihyPTA7cjxhLmxlbmd0aDtyKyspbj1hW3JdLHQuaW5kZXhPZihuKT49MHx8T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUsbikmJihvW25dPWVbbl0pfXJldHVybiBvfWZ1bmN0aW9uIHUoZSx0KXt2YXIgbj1PYmplY3Qua2V5cyhlKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO3QmJihyPXIuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpLmVudW1lcmFibGV9KSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIGMoZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW3RdP2FyZ3VtZW50c1t0XTp7fTt0JTI/dShPYmplY3QobiksITApLmZvckVhY2goKGZ1bmN0aW9uKHQpe3YoZSx0LG5bdF0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobikpOnUoT2JqZWN0KG4pKS5mb3JFYWNoKChmdW5jdGlvbih0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix0KSl9KSl9cmV0dXJuIGV9ZnVuY3Rpb24gbChlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsci5rZXkscil9fWZ1bmN0aW9uIHAoZSx0KXtyZXR1cm4ocD1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuX19wcm90b19fPXQsZX0pKGUsdCl9ZnVuY3Rpb24gZihlKXt2YXIgdD1mdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0KXJldHVybiExO2lmKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChSZWZsZWN0LmNvbnN0cnVjdChEYXRlLFtdLChmdW5jdGlvbigpe30pKSksITB9Y2F0Y2goZSl7cmV0dXJuITF9fSgpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLHI9bShlKTtpZih0KXt2YXIgbz1tKHRoaXMpLmNvbnN0cnVjdG9yO249UmVmbGVjdC5jb25zdHJ1Y3Qocixhcmd1bWVudHMsbyl9ZWxzZSBuPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBoKHRoaXMsbil9fWZ1bmN0aW9uIGgoZSx0KXtyZXR1cm4hdHx8Im9iamVjdCIhPT1pKHQpJiYiZnVuY3Rpb24iIT10eXBlb2YgdD9kKGUpOnR9ZnVuY3Rpb24gZChlKXtpZih2b2lkIDA9PT1lKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkIik7cmV0dXJuIGV9ZnVuY3Rpb24gbShlKXtyZXR1cm4obT1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LmdldFByb3RvdHlwZU9mOmZ1bmN0aW9uKGUpe3JldHVybiBlLl9fcHJvdG9fX3x8T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpfSkoZSl9ZnVuY3Rpb24gdihlLHQsbil7cmV0dXJuIHQgaW4gZT9PYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6ZVt0XT1uLGV9dmFyIGc9ZnVuY3Rpb24oZSl7IWZ1bmN0aW9uKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIlN1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uIik7ZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0JiZ0LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOmUsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLHQmJnAoZSx0KX0odSxlKTt2YXIgdCxuLGEsaT1mKHUpO2Z1bmN0aW9uIHUoZSl7dmFyIHQ7IWZ1bmN0aW9uKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsdSksdihkKHQ9aS5jYWxsKHRoaXMsZSkpLCJvbkNoYW5nZSIsKGZ1bmN0aW9uKGUpe2UucGVyc2lzdCgpO3ZhciBuPXQuc3RhdGUudmFsdWUscj10LnByb3BzLm1pbkxlbmd0aDt0LnNldFN0YXRlKHt2YWx1ZTplLnRhcmdldC52YWx1ZX0sKGZ1bmN0aW9uKCl7dmFyIG89dC5zdGF0ZS52YWx1ZTtvLmxlbmd0aD49cj90Lm5vdGlmeShlKTpuLmxlbmd0aD5vLmxlbmd0aCYmdC5ub3RpZnkoYyhjKHt9LGUpLHt9LHt0YXJnZXQ6YyhjKHt9LGUudGFyZ2V0KSx7fSx7dmFsdWU6IiJ9KX0pKX0pKX0pKSx2KGQodCksIm9uS2V5RG93biIsKGZ1bmN0aW9uKGUpeyJFbnRlciI9PT1lLmtleSYmdC5mb3JjZU5vdGlmeShlKTt2YXIgbj10LnByb3BzLm9uS2V5RG93bjtuJiYoZS5wZXJzaXN0KCksbihlKSl9KSksdihkKHQpLCJvbkJsdXIiLChmdW5jdGlvbihlKXt0LmZvcmNlTm90aWZ5KGUpO3ZhciBuPXQucHJvcHMub25CbHVyO24mJihlLnBlcnNpc3QoKSxuKGUpKX0pKSx2KGQodCksImNyZWF0ZU5vdGlmaWVyIiwoZnVuY3Rpb24oZSl7aWYoZTwwKXQubm90aWZ5PWZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9O2Vsc2UgaWYoMD09PWUpdC5ub3RpZnk9dC5kb05vdGlmeTtlbHNle3ZhciBuPSgwLG8uZGVmYXVsdCkoKGZ1bmN0aW9uKGUpe3QuaXNEZWJvdW5jaW5nPSExLHQuZG9Ob3RpZnkoZSl9KSxlKTt0Lm5vdGlmeT1mdW5jdGlvbihlKXt0LmlzRGVib3VuY2luZz0hMCxuKGUpfSx0LmZsdXNoPWZ1bmN0aW9uKCl7cmV0dXJuIG4uZmx1c2goKX0sdC5jYW5jZWw9ZnVuY3Rpb24oKXt0LmlzRGVib3VuY2luZz0hMSxuLmNhbmNlbCgpfX19KSksdihkKHQpLCJkb05vdGlmeSIsKGZ1bmN0aW9uKCl7dmFyIGU9dC5wcm9wcy5vbkNoYW5nZTtlLmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpfSkpLHYoZCh0KSwiZm9yY2VOb3RpZnkiLChmdW5jdGlvbihlKXt2YXIgbj10LnByb3BzLmRlYm91bmNlVGltZW91dDtpZih0LmlzRGVib3VuY2luZ3x8IShuPjApKXt0LmNhbmNlbCYmdC5jYW5jZWwoKTt2YXIgcj10LnN0YXRlLnZhbHVlLG89dC5wcm9wcy5taW5MZW5ndGg7ci5sZW5ndGg+PW8/dC5kb05vdGlmeShlKTp0LmRvTm90aWZ5KGMoYyh7fSxlKSx7fSx7dGFyZ2V0OmMoYyh7fSxlLnRhcmdldCkse30se3ZhbHVlOnJ9KX0pKX19KSksdC5pc0RlYm91bmNpbmc9ITEsdC5zdGF0ZT17dmFsdWU6dm9pZCAwPT09ZS52YWx1ZXx8bnVsbD09PWUudmFsdWU/IiI6ZS52YWx1ZX07dmFyIG49dC5wcm9wcy5kZWJvdW5jZVRpbWVvdXQ7cmV0dXJuIHQuY3JlYXRlTm90aWZpZXIobiksdH1yZXR1cm4gdD11LChuPVt7a2V5OiJjb21wb25lbnREaWRVcGRhdGUiLHZhbHVlOmZ1bmN0aW9uKGUpe2lmKCF0aGlzLmlzRGVib3VuY2luZyl7dmFyIHQ9dGhpcy5wcm9wcyxuPXQudmFsdWUscj10LmRlYm91bmNlVGltZW91dCxvPWUuZGVib3VuY2VUaW1lb3V0LGE9ZS52YWx1ZSxpPXRoaXMuc3RhdGUudmFsdWU7dm9pZCAwIT09biYmYSE9PW4mJmkhPT1uJiZ0aGlzLnNldFN0YXRlKHt2YWx1ZTpufSksciE9PW8mJnRoaXMuY3JlYXRlTm90aWZpZXIocil9fX0se2tleToiY29tcG9uZW50V2lsbFVubW91bnQiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5mbHVzaCYmdGhpcy5mbHVzaCgpfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlLHQsbj10aGlzLnByb3BzLG89bi5lbGVtZW50LGE9KG4ub25DaGFuZ2Usbi52YWx1ZSxuLm1pbkxlbmd0aCxuLmRlYm91bmNlVGltZW91dCxuLmZvcmNlTm90aWZ5QnlFbnRlciksaT1uLmZvcmNlTm90aWZ5T25CbHVyLHU9bi5vbktleURvd24sbD1uLm9uQmx1cixwPW4uaW5wdXRSZWYsZj1zKG4sWyJlbGVtZW50Iiwib25DaGFuZ2UiLCJ2YWx1ZSIsIm1pbkxlbmd0aCIsImRlYm91bmNlVGltZW91dCIsImZvcmNlTm90aWZ5QnlFbnRlciIsImZvcmNlTm90aWZ5T25CbHVyIiwib25LZXlEb3duIiwib25CbHVyIiwiaW5wdXRSZWYiXSksaD10aGlzLnN0YXRlLnZhbHVlO2U9YT97b25LZXlEb3duOnRoaXMub25LZXlEb3dufTp1P3tvbktleURvd246dX06e30sdD1pP3tvbkJsdXI6dGhpcy5vbkJsdXJ9Omw/e29uQmx1cjpsfTp7fTt2YXIgZD1wP3tyZWY6cH06e307cmV0dXJuIHIuZGVmYXVsdC5jcmVhdGVFbGVtZW50KG8sYyhjKGMoYyh7fSxmKSx7fSx7b25DaGFuZ2U6dGhpcy5vbkNoYW5nZSx2YWx1ZTpofSxlKSx0KSxkKSl9fV0pJiZsKHQucHJvdG90eXBlLG4pLGEmJmwodCxhKSx1fShyLmRlZmF1bHQuUHVyZUNvbXBvbmVudCk7dC5EZWJvdW5jZUlucHV0PWcsdihnLCJkZWZhdWx0UHJvcHMiLHtlbGVtZW50OiJpbnB1dCIsdHlwZToidGV4dCIsb25LZXlEb3duOnZvaWQgMCxvbkJsdXI6dm9pZCAwLHZhbHVlOnZvaWQgMCxtaW5MZW5ndGg6MCxkZWJvdW5jZVRpbWVvdXQ6MTAwLGZvcmNlTm90aWZ5QnlFbnRlcjohMCxmb3JjZU5vdGlmeU9uQmx1cjohMCxpbnB1dFJlZjp2b2lkIDB9KX0sZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbih0KXt2YXIgbj0vXlxzK3xccyskL2cscj0vXlstK10weFswLTlhLWZdKyQvaSxvPS9eMGJbMDFdKyQvaSxhPS9eMG9bMC03XSskL2ksaT1wYXJzZUludCxzPSJvYmplY3QiPT10eXBlb2YgdCYmdCYmdC5PYmplY3Q9PT1PYmplY3QmJnQsdT0ib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLGM9c3x8dXx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSxsPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcscD1NYXRoLm1heCxmPU1hdGgubWluLGg9ZnVuY3Rpb24oKXtyZXR1cm4gYy5EYXRlLm5vdygpfTtmdW5jdGlvbiBkKGUpe3ZhciB0PXR5cGVvZiBlO3JldHVybiEhZSYmKCJvYmplY3QiPT10fHwiZnVuY3Rpb24iPT10KX1mdW5jdGlvbiBtKGUpe2lmKCJudW1iZXIiPT10eXBlb2YgZSlyZXR1cm4gZTtpZihmdW5jdGlvbihlKXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIGV8fGZ1bmN0aW9uKGUpe3JldHVybiEhZSYmIm9iamVjdCI9PXR5cGVvZiBlfShlKSYmIltvYmplY3QgU3ltYm9sXSI9PWwuY2FsbChlKX0oZSkpcmV0dXJuIE5hTjtpZihkKGUpKXt2YXIgdD0iZnVuY3Rpb24iPT10eXBlb2YgZS52YWx1ZU9mP2UudmFsdWVPZigpOmU7ZT1kKHQpP3QrIiI6dH1pZigic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIDA9PT1lP2U6K2U7ZT1lLnJlcGxhY2UobiwiIik7dmFyIHM9by50ZXN0KGUpO3JldHVybiBzfHxhLnRlc3QoZSk/aShlLnNsaWNlKDIpLHM/Mjo4KTpyLnRlc3QoZSk/TmFOOitlfWUuZXhwb3J0cz1mdW5jdGlvbihlLHQsbil7dmFyIHIsbyxhLGkscyx1LGM9MCxsPSExLHY9ITEsZz0hMDtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJFeHBlY3RlZCBhIGZ1bmN0aW9uIik7ZnVuY3Rpb24geSh0KXt2YXIgbj1yLGE9bztyZXR1cm4gcj1vPXZvaWQgMCxjPXQsaT1lLmFwcGx5KGEsbil9ZnVuY3Rpb24gYihlKXtyZXR1cm4gYz1lLHM9c2V0VGltZW91dCh3LHQpLGw/eShlKTppfWZ1bmN0aW9uIF8oZSl7dmFyIG49ZS11O3JldHVybiB2b2lkIDA9PT11fHxuPj10fHxuPDB8fHYmJmUtYz49YX1mdW5jdGlvbiB3KCl7dmFyIGU9aCgpO2lmKF8oZSkpcmV0dXJuIHgoZSk7cz1zZXRUaW1lb3V0KHcsZnVuY3Rpb24oZSl7dmFyIG49dC0oZS11KTtyZXR1cm4gdj9mKG4sYS0oZS1jKSk6bn0oZSkpfWZ1bmN0aW9uIHgoZSl7cmV0dXJuIHM9dm9pZCAwLGcmJnI/eShlKToocj1vPXZvaWQgMCxpKX1mdW5jdGlvbiBFKCl7dmFyIGU9aCgpLG49XyhlKTtpZihyPWFyZ3VtZW50cyxvPXRoaXMsdT1lLG4pe2lmKHZvaWQgMD09PXMpcmV0dXJuIGIodSk7aWYodilyZXR1cm4gcz1zZXRUaW1lb3V0KHcsdCkseSh1KX1yZXR1cm4gdm9pZCAwPT09cyYmKHM9c2V0VGltZW91dCh3LHQpKSxpfXJldHVybiB0PW0odCl8fDAsZChuKSYmKGw9ISFuLmxlYWRpbmcsYT0odj0ibWF4V2FpdCJpbiBuKT9wKG0obi5tYXhXYWl0KXx8MCx0KTphLGc9InRyYWlsaW5nImluIG4/ISFuLnRyYWlsaW5nOmcpLEUuY2FuY2VsPWZ1bmN0aW9uKCl7dm9pZCAwIT09cyYmY2xlYXJUaW1lb3V0KHMpLGM9MCxyPXU9bz1zPXZvaWQgMH0sRS5mbHVzaD1mdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT1zP2k6eChoKCkpfSxFfX0pLmNhbGwodGhpcyxuKDUxKSl9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj17Ii4vYWxsLmpzIjozNDIsIi4vYXV0aC9hY3Rpb25zLmpzIjo4MywiLi9hdXRoL2luZGV4LmpzIjozMDUsIi4vYXV0aC9yZWR1Y2Vycy5qcyI6MzA2LCIuL2F1dGgvc2VsZWN0b3JzLmpzIjozMDcsIi4vYXV0aC9zcGVjLXdyYXAtYWN0aW9ucy5qcyI6MzA4LCIuL2NvbmZpZ3MvYWN0aW9ucy5qcyI6MTQ5LCIuL2NvbmZpZ3MvaGVscGVycy5qcyI6MTczLCIuL2NvbmZpZ3MvaW5kZXguanMiOjM0NCwiLi9jb25maWdzL3JlZHVjZXJzLmpzIjozMTMsIi4vY29uZmlncy9zZWxlY3RvcnMuanMiOjMxMiwiLi9jb25maWdzL3NwZWMtYWN0aW9ucy5qcyI6MzExLCIuL2RlZXAtbGlua2luZy9oZWxwZXJzLmpzIjoxNzYsIi4vZGVlcC1saW5raW5nL2luZGV4LmpzIjozMTQsIi4vZGVlcC1saW5raW5nL2xheW91dC5qcyI6MzE1LCIuL2RlZXAtbGlua2luZy9vcGVyYXRpb24tdGFnLXdyYXBwZXIuanN4IjozMTcsIi4vZGVlcC1saW5raW5nL29wZXJhdGlvbi13cmFwcGVyLmpzeCI6MzE2LCIuL2Rvd25sb2FkLXVybC5qcyI6MzEwLCIuL2Vyci9hY3Rpb25zLmpzIjo2MSwiLi9lcnIvZXJyb3ItdHJhbnNmb3JtZXJzL2hvb2suanMiOjEyNiwiLi9lcnIvZXJyb3ItdHJhbnNmb3JtZXJzL3RyYW5zZm9ybWVycy9ub3Qtb2YtdHlwZS5qcyI6Mjg4LCIuL2Vyci9lcnJvci10cmFuc2Zvcm1lcnMvdHJhbnNmb3JtZXJzL3BhcmFtZXRlci1vbmVvZi5qcyI6Mjg5LCIuL2Vyci9pbmRleC5qcyI6Mjg2LCIuL2Vyci9yZWR1Y2Vycy5qcyI6Mjg3LCIuL2Vyci9zZWxlY3RvcnMuanMiOjI5MCwiLi9maWx0ZXIvaW5kZXguanMiOjMxOCwiLi9maWx0ZXIvb3BzRmlsdGVyLmpzIjozMTksIi4vbGF5b3V0L2FjdGlvbnMuanMiOjEwNSwiLi9sYXlvdXQvaW5kZXguanMiOjI5MSwiLi9sYXlvdXQvcmVkdWNlcnMuanMiOjI5MiwiLi9sYXlvdXQvc2VsZWN0b3JzLmpzIjoyOTMsIi4vbGF5b3V0L3NwZWMtZXh0ZW5zaW9ucy93cmFwLXNlbGVjdG9yLmpzIjoyOTQsIi4vbG9ncy9pbmRleC5qcyI6MzAzLCIuL29hczMvYWN0aW9ucy5qcyI6NTQsIi4vb2FzMy9hdXRoLWV4dGVuc2lvbnMvd3JhcC1zZWxlY3RvcnMuanMiOjMyMywiLi9vYXMzL2NvbXBvbmVudHMvY2FsbGJhY2tzLmpzeCI6MzI2LCIuL29hczMvY29tcG9uZW50cy9odHRwLWF1dGguanN4IjozMzEsIi4vb2FzMy9jb21wb25lbnRzL2luZGV4LmpzIjozMjUsIi4vb2FzMy9jb21wb25lbnRzL29wZXJhdGlvbi1saW5rLmpzeCI6MzI3LCIuL29hczMvY29tcG9uZW50cy9vcGVyYXRpb24tc2VydmVycy5qc3giOjMzMiwiLi9vYXMzL2NvbXBvbmVudHMvcmVxdWVzdC1ib2R5LWVkaXRvci5qc3giOjMzMCwiLi9vYXMzL2NvbXBvbmVudHMvcmVxdWVzdC1ib2R5LmpzeCI6MTc0LCIuL29hczMvY29tcG9uZW50cy9zZXJ2ZXJzLWNvbnRhaW5lci5qc3giOjMyOSwiLi9vYXMzL2NvbXBvbmVudHMvc2VydmVycy5qc3giOjMyOCwiLi9vYXMzL2hlbHBlcnMuanN4IjozNSwiLi9vYXMzL2luZGV4LmpzIjozMjEsIi4vb2FzMy9yZWR1Y2Vycy5qcyI6MzQxLCIuL29hczMvc2VsZWN0b3JzLmpzIjozNDAsIi4vb2FzMy9zcGVjLWV4dGVuc2lvbnMvc2VsZWN0b3JzLmpzIjozMjQsIi4vb2FzMy9zcGVjLWV4dGVuc2lvbnMvd3JhcC1zZWxlY3RvcnMuanMiOjMyMiwiLi9vYXMzL3dyYXAtY29tcG9uZW50cy9hdXRoLWl0ZW0uanN4IjozMzUsIi4vb2FzMy93cmFwLWNvbXBvbmVudHMvaW5kZXguanMiOjMzMywiLi9vYXMzL3dyYXAtY29tcG9uZW50cy9qc29uLXNjaGVtYS1zdHJpbmcuanN4IjozMzksIi4vb2FzMy93cmFwLWNvbXBvbmVudHMvbWFya2Rvd24uanN4IjozMzQsIi4vb2FzMy93cmFwLWNvbXBvbmVudHMvbW9kZWwuanN4IjozMzgsIi4vb2FzMy93cmFwLWNvbXBvbmVudHMvb25saW5lLXZhbGlkYXRvci1iYWRnZS5qcyI6MzM3LCIuL29hczMvd3JhcC1jb21wb25lbnRzL3ZlcnNpb24tc3RhbXAuanN4IjozMzYsIi4vb24tY29tcGxldGUvaW5kZXguanMiOjMyMCwiLi9yZXF1ZXN0LXNuaXBwZXRzL2ZuLmpzIjoxNzIsIi4vcmVxdWVzdC1zbmlwcGV0cy9pbmRleC5qcyI6MzAwLCIuL3JlcXVlc3Qtc25pcHBldHMvcmVxdWVzdC1zbmlwcGV0cy5qc3giOjMwMiwiLi9yZXF1ZXN0LXNuaXBwZXRzL3NlbGVjdG9ycy5qcyI6MzAxLCIuL3NhbXBsZXMvZm4uanMiOjE0NywiLi9zYW1wbGVzL2luZGV4LmpzIjoyOTksIi4vc3BlYy9hY3Rpb25zLmpzIjo0NiwiLi9zcGVjL2luZGV4LmpzIjoyOTUsIi4vc3BlYy9yZWR1Y2Vycy5qcyI6Mjk2LCIuL3NwZWMvc2VsZWN0b3JzLmpzIjo5MSwiLi9zcGVjL3dyYXAtYWN0aW9ucy5qcyI6Mjk3LCIuL3N3YWdnZXItanMvY29uZmlncy13cmFwLWFjdGlvbnMuanMiOjMwNCwiLi9zd2FnZ2VyLWpzL2luZGV4LmpzIjozNDMsIi4vdXRpbC9pbmRleC5qcyI6MzA5LCIuL3ZpZXcvaW5kZXguanMiOjI5OCwiLi92aWV3L3Jvb3QtaW5qZWN0cy5qc3giOjE3NX07ZnVuY3Rpb24gbyhlKXt2YXIgdD1hKGUpO3JldHVybiBuKHQpfWZ1bmN0aW9uIGEoZSl7aWYoIW4ubyhyLGUpKXt2YXIgdD1uZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitlKyInIik7dGhyb3cgdC5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIix0fXJldHVybiByW2VdfW8ua2V5cz1mdW5jdGlvbigpe3JldHVybiBPYmplY3Qua2V5cyhyKX0sby5yZXNvbHZlPWEsZS5leHBvcnRzPW8sby5pZD0xMTA3fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24ucih0KTt2YXIgcj17fTtuLnIociksbi5kKHIsIkNvbnRhaW5lciIsKGZ1bmN0aW9uKCl7cmV0dXJuIFRufSkpLG4uZChyLCJDb2wiLChmdW5jdGlvbigpe3JldHVybiBQbn0pKSxuLmQociwiUm93IiwoZnVuY3Rpb24oKXtyZXR1cm4gTm59KSksbi5kKHIsIkJ1dHRvbiIsKGZ1bmN0aW9uKCl7cmV0dXJuIE1ufSkpLG4uZChyLCJUZXh0QXJlYSIsKGZ1bmN0aW9uKCl7cmV0dXJuIFJufSkpLG4uZChyLCJJbnB1dCIsKGZ1bmN0aW9uKCl7cmV0dXJuIERufSkpLG4uZChyLCJTZWxlY3QiLChmdW5jdGlvbigpe3JldHVybiBMbn0pKSxuLmQociwiTGluayIsKGZ1bmN0aW9uKCl7cmV0dXJuIEJufSkpLG4uZChyLCJDb2xsYXBzZSIsKGZ1bmN0aW9uKCl7cmV0dXJuIFVufSkpO3ZhciBvPXt9O24ucihvKSxuLmQobywiSnNvblNjaGVtYUZvcm0iLChmdW5jdGlvbigpe3JldHVybiBUcn0pKSxuLmQobywiSnNvblNjaGVtYV9zdHJpbmciLChmdW5jdGlvbigpe3JldHVybiBJcn0pKSxuLmQobywiSnNvblNjaGVtYV9hcnJheSIsKGZ1bmN0aW9uKCl7cmV0dXJuIFByfSkpLG4uZChvLCJKc29uU2NoZW1hQXJyYXlJdGVtVGV4dCIsKGZ1bmN0aW9uKCl7cmV0dXJuIE5yfSkpLG4uZChvLCJKc29uU2NoZW1hQXJyYXlJdGVtRmlsZSIsKGZ1bmN0aW9uKCl7cmV0dXJuIE1yfSkpLG4uZChvLCJKc29uU2NoZW1hX2Jvb2xlYW4iLChmdW5jdGlvbigpe3JldHVybiBScn0pKSxuLmQobywiSnNvblNjaGVtYV9vYmplY3QiLChmdW5jdGlvbigpe3JldHVybiBMcn0pKTt2YXIgYT1uKDE4KSxpPW4ubihhKSxzPW4oMiksdT1uLm4ocyksYz1uKDEyKSxsPW4ubihjKSxwPW4oMTUpLGY9bi5uKHApLGg9bigzMiksZD1uLm4oaCksbT1uKDgwKSx2PW4ubihtKSxnPW4oMykseT1uLm4oZyksYj1uKDYpLF89bi5uKGIpLHc9big3KSx4PW4ubih3KSxFPW4oMzYpLFM9bi5uKEUpLEM9bigyMCksQT1uLm4oQyksTz1uKDE5KSxrPW4ubihPKSxqPW4oMjMpLFQ9bi5uKGopLEk9bigyOSksUD1uLm4oSSksTj1uKDQpLE09bi5uKE4pLFI9bigwKSxEPW4ubihSKSxMPW4oMTUxKSxCPW4oMSksRj1uLm4oQiksVT1uKDUwMSkscT1uKDE0Niksej1uKDUwMiksVj1uLm4oeiksVz1uKDYxKSxIPW4oMjYpLCQ9big1KSxKPWZ1bmN0aW9uKGUpe3JldHVybiBlfTt2YXIgSz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt2YXIgdCxuPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTtfKCkodGhpcyxlKSx2KCkodGhpcyx7c3RhdGU6e30scGx1Z2luczpbXSxwbHVnaW5zT3B0aW9uczp7fSxzeXN0ZW06e2NvbmZpZ3M6e30sZm46e30sY29tcG9uZW50czp7fSxyb290SW5qZWN0czp7fSxzdGF0ZVBsdWdpbnM6e319LGJvdW5kU3lzdGVtOnt9LHRvb2xib3g6e319LG4pLHRoaXMuZ2V0U3lzdGVtPVMoKSh0PXRoaXMuX2dldFN5c3RlbSkuY2FsbCh0LHRoaXMpLHRoaXMuc3RvcmU9UShKLE9iamVjdChCLmZyb21KUykodGhpcy5zdGF0ZSksdGhpcy5nZXRTeXN0ZW0pLHRoaXMuYnVpbGRTeXN0ZW0oITEpLHRoaXMucmVnaXN0ZXIodGhpcy5wbHVnaW5zKX1yZXR1cm4geCgpKGUsW3trZXk6ImdldFN0b3JlIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0b3JlfX0se2tleToicmVnaXN0ZXIiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PSEoYXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0pfHxhcmd1bWVudHNbMV0sbj1ZKGUsdGhpcy5nZXRTeXN0ZW0oKSx0aGlzLnBsdWdpbnNPcHRpb25zKTtaKHRoaXMuc3lzdGVtLG4pLHQmJnRoaXMuYnVpbGRTeXN0ZW0oKTt2YXIgcj1HLmNhbGwodGhpcy5zeXN0ZW0sZSx0aGlzLmdldFN5c3RlbSgpKTtyJiZ0aGlzLmJ1aWxkU3lzdGVtKCl9fSx7a2V5OiJidWlsZFN5c3RlbSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT0hKGFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdKXx8YXJndW1lbnRzWzBdLHQ9dGhpcy5nZXRTdG9yZSgpLmRpc3BhdGNoLG49dGhpcy5nZXRTdG9yZSgpLmdldFN0YXRlO3RoaXMuYm91bmRTeXN0ZW09QSgpKHt9LHRoaXMuZ2V0Um9vdEluamVjdHMoKSx0aGlzLmdldFdyYXBwZWRBbmRCb3VuZEFjdGlvbnModCksdGhpcy5nZXRXcmFwcGVkQW5kQm91bmRTZWxlY3RvcnMobix0aGlzLmdldFN5c3RlbSksdGhpcy5nZXRTdGF0ZVRodW5rcyhuKSx0aGlzLmdldEZuKCksdGhpcy5nZXRDb25maWdzKCkpLGUmJnRoaXMucmVidWlsZFJlZHVjZXIoKX19LHtrZXk6Il9nZXRTeXN0ZW0iLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYm91bmRTeXN0ZW19fSx7a2V5OiJnZXRSb290SW5qZWN0cyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZSx0LG47cmV0dXJuIEEoKSh7Z2V0U3lzdGVtOnRoaXMuZ2V0U3lzdGVtLGdldFN0b3JlOlMoKShlPXRoaXMuZ2V0U3RvcmUpLmNhbGwoZSx0aGlzKSxnZXRDb21wb25lbnRzOlMoKSh0PXRoaXMuZ2V0Q29tcG9uZW50cykuY2FsbCh0LHRoaXMpLGdldFN0YXRlOnRoaXMuZ2V0U3RvcmUoKS5nZXRTdGF0ZSxnZXRDb25maWdzOlMoKShuPXRoaXMuX2dldENvbmZpZ3MpLmNhbGwobix0aGlzKSxJbTpGLmEsUmVhY3Q6RC5hfSx0aGlzLnN5c3RlbS5yb290SW5qZWN0c3x8e30pfX0se2tleToiX2dldENvbmZpZ3MiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3lzdGVtLmNvbmZpZ3N9fSx7a2V5OiJnZXRDb25maWdzIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybntjb25maWdzOnRoaXMuc3lzdGVtLmNvbmZpZ3N9fX0se2tleToic2V0Q29uZmlncyIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy5zeXN0ZW0uY29uZmlncz1lfX0se2tleToicmVidWlsZFJlZHVjZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGUsdCxuLHI7dGhpcy5zdG9yZS5yZXBsYWNlUmVkdWNlcigocj10aGlzLnN5c3RlbS5zdGF0ZVBsdWdpbnMsZT1PYmplY3QoJC54KShyLChmdW5jdGlvbihlKXtyZXR1cm4gZS5yZWR1Y2Vyc30pKSxuPVAoKSh0PWYoKShlKSkuY2FsbCh0LChmdW5jdGlvbih0LG4pe3JldHVybiB0W25dPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTpuZXcgQi5NYXAsbj1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDtpZighZSlyZXR1cm4gdDt2YXIgcj1lW24udHlwZV07aWYocil7dmFyIG89WChyKSh0LG4pO3JldHVybiBudWxsPT09bz90Om99cmV0dXJuIHR9fShlW25dKSx0fSkse30pLGYoKShuKS5sZW5ndGg/T2JqZWN0KFUuY29tYmluZVJlZHVjZXJzKShuKTpKKSl9fSx7a2V5OiJnZXRUeXBlIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1lWzBdLnRvVXBwZXJDYXNlKCkraygpKGUpLmNhbGwoZSwxKTtyZXR1cm4gT2JqZWN0KCQueSkodGhpcy5zeXN0ZW0uc3RhdGVQbHVnaW5zLChmdW5jdGlvbihuLHIpe3ZhciBvPW5bZV07aWYobylyZXR1cm4geSgpKHt9LHIrdCxvKX0pKX19LHtrZXk6ImdldFNlbGVjdG9ycyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRUeXBlKCJzZWxlY3RvcnMiKX19LHtrZXk6ImdldEFjdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRUeXBlKCJhY3Rpb25zIik7cmV0dXJuIE9iamVjdCgkLngpKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QoJC55KShlLChmdW5jdGlvbihlLHQpe2lmKE9iamVjdCgkLnIpKGUpKXJldHVybiB5KCkoe30sdCxlKX0pKX0pKX19LHtrZXk6ImdldFdyYXBwZWRBbmRCb3VuZEFjdGlvbnMiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj10aGlzLmdldEJvdW5kQWN0aW9ucyhlKTtyZXR1cm4gT2JqZWN0KCQueCkobiwoZnVuY3Rpb24oZSxuKXt2YXIgcj10LnN5c3RlbS5zdGF0ZVBsdWdpbnNbaygpKG4pLmNhbGwobiwwLC03KV0ud3JhcEFjdGlvbnM7cmV0dXJuIHI/T2JqZWN0KCQueCkoZSwoZnVuY3Rpb24oZSxuKXt2YXIgbz1yW25dO3JldHVybiBvPyhUKCkobyl8fChvPVtvXSksUCgpKG8pLmNhbGwobywoZnVuY3Rpb24oZSxuKXt2YXIgcj1mdW5jdGlvbigpe3JldHVybiBuKGUsdC5nZXRTeXN0ZW0oKSkuYXBwbHkodm9pZCAwLGFyZ3VtZW50cyl9O2lmKCFPYmplY3QoJC5yKShyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJ3cmFwQWN0aW9ucyBuZWVkcyB0byByZXR1cm4gYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBuZXcgZnVuY3Rpb24gKGllIHRoZSB3cmFwcGVkIGFjdGlvbikiKTtyZXR1cm4gWChyKX0pLGV8fEZ1bmN0aW9uLnByb3RvdHlwZSkpOmV9KSk6ZX0pKX19LHtrZXk6ImdldFdyYXBwZWRBbmRCb3VuZFNlbGVjdG9ycyIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLHI9dGhpcy5nZXRCb3VuZFNlbGVjdG9ycyhlLHQpO3JldHVybiBPYmplY3QoJC54KShyLChmdW5jdGlvbih0LHIpe3ZhciBvPVtrKCkocikuY2FsbChyLDAsLTkpXSxhPW4uc3lzdGVtLnN0YXRlUGx1Z2luc1tvXS53cmFwU2VsZWN0b3JzO3JldHVybiBhP09iamVjdCgkLngpKHQsKGZ1bmN0aW9uKHQscil7dmFyIGk9YVtyXTtyZXR1cm4gaT8oVCgpKGkpfHwoaT1baV0pLFAoKShpKS5jYWxsKGksKGZ1bmN0aW9uKHQscil7dmFyIGE9ZnVuY3Rpb24oKXtmb3IodmFyIGEsaT1hcmd1bWVudHMubGVuZ3RoLHM9bmV3IEFycmF5KGkpLGM9MDtjPGk7YysrKXNbY109YXJndW1lbnRzW2NdO3JldHVybiByKHQsbi5nZXRTeXN0ZW0oKSkuYXBwbHkodm9pZCAwLHUoKShhPVtlKCkuZ2V0SW4obyldKS5jYWxsKGEscykpfTtpZighT2JqZWN0KCQucikoYSkpdGhyb3cgbmV3IFR5cGVFcnJvcigid3JhcFNlbGVjdG9yIG5lZWRzIHRvIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIG5ldyBmdW5jdGlvbiAoaWUgdGhlIHdyYXBwZWQgYWN0aW9uKSIpO3JldHVybiBhfSksdHx8RnVuY3Rpb24ucHJvdG90eXBlKSk6dH0pKTp0fSkpfX0se2tleToiZ2V0U3RhdGVzIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gUCgpKHQ9ZigpKHRoaXMuc3lzdGVtLnN0YXRlUGx1Z2lucykpLmNhbGwodCwoZnVuY3Rpb24odCxuKXtyZXR1cm4gdFtuXT1lLmdldChuKSx0fSkse30pfX0se2tleToiZ2V0U3RhdGVUaHVua3MiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiBQKCkodD1mKCkodGhpcy5zeXN0ZW0uc3RhdGVQbHVnaW5zKSkuY2FsbCh0LChmdW5jdGlvbih0LG4pe3JldHVybiB0W25dPWZ1bmN0aW9uKCl7cmV0dXJuIGUoKS5nZXQobil9LHR9KSx7fSl9fSx7a2V5OiJnZXRGbiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57Zm46dGhpcy5zeXN0ZW0uZm59fX0se2tleToiZ2V0Q29tcG9uZW50cyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXRoaXMuc3lzdGVtLmNvbXBvbmVudHNbZV07cmV0dXJuIFQoKShuKT9QKCkobikuY2FsbChuLChmdW5jdGlvbihlLG4pe3JldHVybiBuKGUsdC5nZXRTeXN0ZW0oKSl9KSk6dm9pZCAwIT09ZT90aGlzLnN5c3RlbS5jb21wb25lbnRzW2VdOnRoaXMuc3lzdGVtLmNvbXBvbmVudHN9fSx7a2V5OiJnZXRCb3VuZFNlbGVjdG9ycyIsdmFsdWU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gT2JqZWN0KCQueCkodGhpcy5nZXRTZWxlY3RvcnMoKSwoZnVuY3Rpb24obixyKXt2YXIgbz1baygpKHIpLmNhbGwociwwLC05KV0sYT1mdW5jdGlvbigpe3JldHVybiBlKCkuZ2V0SW4obyl9O3JldHVybiBPYmplY3QoJC54KShuLChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIG4scj1hcmd1bWVudHMubGVuZ3RoLG89bmV3IEFycmF5KHIpLGk9MDtpPHI7aSsrKW9baV09YXJndW1lbnRzW2ldO3ZhciBzPVgoZSkuYXBwbHkobnVsbCx1KCkobj1bYSgpXSkuY2FsbChuLG8pKTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgcyYmKHM9WChzKSh0KCkpKSxzfX0pKX0pKX19LHtrZXk6ImdldEJvdW5kQWN0aW9ucyIsdmFsdWU6ZnVuY3Rpb24oZSl7ZT1lfHx0aGlzLmdldFN0b3JlKCkuZGlzcGF0Y2g7dmFyIHQ9dGhpcy5nZXRBY3Rpb25zKCksbj1mdW5jdGlvbiBlKHQpe3JldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0P09iamVjdCgkLngpKHQsKGZ1bmN0aW9uKHQpe3JldHVybiBlKHQpfSkpOmZ1bmN0aW9uKCl7dmFyIGU9bnVsbDt0cnl7ZT10LmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpfWNhdGNoKHQpe2U9e3R5cGU6Vy5ORVdfVEhST1dOX0VSUixlcnJvcjohMCxwYXlsb2FkOk9iamVjdChxLnNlcmlhbGl6ZUVycm9yKSh0KX19ZmluYWxseXtyZXR1cm4gZX19fTtyZXR1cm4gT2JqZWN0KCQueCkodCwoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdChMLmJpbmRBY3Rpb25DcmVhdG9ycykobih0KSxlKX0pKX19LHtrZXk6ImdldE1hcFN0YXRlVG9Qcm9wcyIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBBKCkoe30sZS5nZXRTeXN0ZW0oKSl9fX0se2tleToiZ2V0TWFwRGlzcGF0Y2hUb1Byb3BzIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdigpKHt9LHQuZ2V0V3JhcHBlZEFuZEJvdW5kQWN0aW9ucyhuKSx0LmdldEZuKCksZSl9fX1dKSxlfSgpO2Z1bmN0aW9uIFkoZSx0LG4pe2lmKE9iamVjdCgkLnQpKGUpJiYhT2JqZWN0KCQucCkoZSkpcmV0dXJuIFYoKSh7fSxlKTtpZihPYmplY3QoJC5zKShlKSlyZXR1cm4gWShlKHQpLHQsbik7aWYoT2JqZWN0KCQucCkoZSkpe3ZhciByLG89ImNoYWluIj09PW4ucGx1Z2luTG9hZFR5cGU/dC5nZXRDb21wb25lbnRzKCk6e307cmV0dXJuIFAoKShyPU0oKShlKS5jYWxsKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBZKGUsdCxuKX0pKSkuY2FsbChyLFosbyl9cmV0dXJue319ZnVuY3Rpb24gRyhlLHQpe3ZhciBuPXRoaXMscj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e30sbz1yLmhhc0xvYWRlZCxhPW87cmV0dXJuIE9iamVjdCgkLnQpKGUpJiYhT2JqZWN0KCQucCkoZSkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmFmdGVyTG9hZCYmKGE9ITAsWChlLmFmdGVyTG9hZCkuY2FsbCh0aGlzLHQpKSxPYmplY3QoJC5zKShlKT9HLmNhbGwodGhpcyxlKHQpLHQse2hhc0xvYWRlZDphfSk6T2JqZWN0KCQucCkoZSk/TSgpKGUpLmNhbGwoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIEcuY2FsbChuLGUsdCx7aGFzTG9hZGVkOmF9KX0pKTphfWZ1bmN0aW9uIFooKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30sdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIU9iamVjdCgkLnQpKGUpKXJldHVybnt9O2lmKCFPYmplY3QoJC50KSh0KSlyZXR1cm4gZTt0LndyYXBDb21wb25lbnRzJiYoT2JqZWN0KCQueCkodC53cmFwQ29tcG9uZW50cywoZnVuY3Rpb24obixyKXt2YXIgbz1lLmNvbXBvbmVudHMmJmUuY29tcG9uZW50c1tyXTtvJiZUKCkobyk/KGUuY29tcG9uZW50c1tyXT11KCkobykuY2FsbChvLFtuXSksZGVsZXRlIHQud3JhcENvbXBvbmVudHNbcl0pOm8mJihlLmNvbXBvbmVudHNbcl09W28sbl0sZGVsZXRlIHQud3JhcENvbXBvbmVudHNbcl0pfSkpLGYoKSh0LndyYXBDb21wb25lbnRzKS5sZW5ndGh8fGRlbGV0ZSB0LndyYXBDb21wb25lbnRzKTt2YXIgbj1lLnN0YXRlUGx1Z2lucztpZihPYmplY3QoJC50KShuKSlmb3IodmFyIHIgaW4gbil7dmFyIG89bltyXTtpZihPYmplY3QoJC50KShvKSl7dmFyIGE9by53cmFwQWN0aW9ucyxpPW8ud3JhcFNlbGVjdG9ycztpZihPYmplY3QoJC50KShhKSlmb3IodmFyIHMgaW4gYSl7dmFyIGMsbD1hW3NdO2lmKFQoKShsKXx8KGw9W2xdLGFbc109bCksdCYmdC5zdGF0ZVBsdWdpbnMmJnQuc3RhdGVQbHVnaW5zW3JdJiZ0LnN0YXRlUGx1Z2luc1tyXS53cmFwQWN0aW9ucyYmdC5zdGF0ZVBsdWdpbnNbcl0ud3JhcEFjdGlvbnNbc10pdC5zdGF0ZVBsdWdpbnNbcl0ud3JhcEFjdGlvbnNbc109dSgpKGM9YVtzXSkuY2FsbChjLHQuc3RhdGVQbHVnaW5zW3JdLndyYXBBY3Rpb25zW3NdKX1pZihPYmplY3QoJC50KShpKSlmb3IodmFyIHAgaW4gaSl7dmFyIGgsZD1pW3BdO2lmKFQoKShkKXx8KGQ9W2RdLGlbcF09ZCksdCYmdC5zdGF0ZVBsdWdpbnMmJnQuc3RhdGVQbHVnaW5zW3JdJiZ0LnN0YXRlUGx1Z2luc1tyXS53cmFwU2VsZWN0b3JzJiZ0LnN0YXRlUGx1Z2luc1tyXS53cmFwU2VsZWN0b3JzW3BdKXQuc3RhdGVQbHVnaW5zW3JdLndyYXBTZWxlY3RvcnNbcF09dSgpKGg9aVtwXSkuY2FsbChoLHQuc3RhdGVQbHVnaW5zW3JdLndyYXBTZWxlY3RvcnNbcF0pfX19cmV0dXJuIHYoKShlLHQpfWZ1bmN0aW9uIFgoZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9LG49dC5sb2dFcnJvcnMscj12b2lkIDA9PT1ufHxuO3JldHVybiJmdW5jdGlvbiIhPXR5cGVvZiBlP2U6ZnVuY3Rpb24oKXt0cnl7Zm9yKHZhciB0LG49YXJndW1lbnRzLmxlbmd0aCxvPW5ldyBBcnJheShuKSxhPTA7YTxuO2ErKylvW2FdPWFyZ3VtZW50c1thXTtyZXR1cm4gZS5jYWxsLmFwcGx5KGUsdSgpKHQ9W3RoaXNdKS5jYWxsKHQsbykpfWNhdGNoKGUpe3JldHVybiByJiZjb25zb2xlLmVycm9yKGUpLG51bGx9fX1mdW5jdGlvbiBRKGUsdCxuKXtyZXR1cm4gZnVuY3Rpb24oZSx0LG4pe3ZhciByPVtPYmplY3QoJC5KKShuKV0sbz1ILmEuX19SRURVWF9ERVZUT09MU19FWFRFTlNJT05fQ09NUE9TRV9ffHxMLmNvbXBvc2U7cmV0dXJuIE9iamVjdChMLmNyZWF0ZVN0b3JlKShlLHQsbyhMLmFwcGx5TWlkZGxld2FyZS5hcHBseSh2b2lkIDAscikpKX0oZSx0LG4pfXZhciBlZT1uKDI4NiksdGU9bigyOTEpLG5lPW4oMjk1KSxyZT1uKDI5OCksb2U9bigyOTkpLGFlPW4oMzAwKSxpZT1uKDMwMyksc2U9bigzNDMpLHVlPW4oMzA1KSxjZT1uKDMwOSksbGU9bigzMTApLHBlPW4oMzQ0KSxmZT1uKDMxNCksaGU9bigzMTgpLGRlPW4oMzIwKSxtZT1uKDEwKSx2ZT1uLm4obWUpLGdlPW4oOCkseWU9bi5uKGdlKSxiZT1uKDkpLF9lPW4ubihiZSksd2U9bigxNykseGU9bi5uKHdlKSxFZT0obigxMSksbigyNyksbig2MCkpLFNlPWZ1bmN0aW9uKGUpe3llKCkobixlKTt2YXIgdD1fZSgpKG4pO2Z1bmN0aW9uIG4oZSxyKXt2YXIgbztfKCkodGhpcyxuKSxvPXQuY2FsbCh0aGlzLGUscikseSgpKHZlKCkobyksInRvZ2dsZVNob3duIiwoZnVuY3Rpb24oKXt2YXIgZT1vLnByb3BzLHQ9ZS5sYXlvdXRBY3Rpb25zLG49ZS50YWcscj1lLm9wZXJhdGlvbklkLGE9ZS5pc1Nob3duLGk9by5nZXRSZXNvbHZlZFN1YnRyZWUoKTthfHx2b2lkIDAhPT1pfHxvLnJlcXVlc3RSZXNvbHZlZFN1YnRyZWUoKSx0LnNob3coWyJvcGVyYXRpb25zIixuLHJdLCFhKX0pKSx5KCkodmUoKShvKSwib25DYW5jZWxDbGljayIsKGZ1bmN0aW9uKCl7by5zZXRTdGF0ZSh7dHJ5SXRPdXRFbmFibGVkOiFvLnN0YXRlLnRyeUl0T3V0RW5hYmxlZH0pfSkpLHkoKSh2ZSgpKG8pLCJvblRyeW91dENsaWNrIiwoZnVuY3Rpb24oKXtvLnNldFN0YXRlKHt0cnlJdE91dEVuYWJsZWQ6IW8uc3RhdGUudHJ5SXRPdXRFbmFibGVkfSl9KSkseSgpKHZlKCkobyksIm9uRXhlY3V0ZSIsKGZ1bmN0aW9uKCl7by5zZXRTdGF0ZSh7ZXhlY3V0ZUluUHJvZ3Jlc3M6ITB9KX0pKSx5KCkodmUoKShvKSwiZ2V0UmVzb2x2ZWRTdWJ0cmVlIiwoZnVuY3Rpb24oKXt2YXIgZT1vLnByb3BzLHQ9ZS5zcGVjU2VsZWN0b3JzLG49ZS5wYXRoLHI9ZS5tZXRob2QsYT1lLnNwZWNQYXRoO3JldHVybiBhP3Quc3BlY1Jlc29sdmVkU3VidHJlZShhLnRvSlMoKSk6dC5zcGVjUmVzb2x2ZWRTdWJ0cmVlKFsicGF0aHMiLG4scl0pfSkpLHkoKSh2ZSgpKG8pLCJyZXF1ZXN0UmVzb2x2ZWRTdWJ0cmVlIiwoZnVuY3Rpb24oKXt2YXIgZT1vLnByb3BzLHQ9ZS5zcGVjQWN0aW9ucyxuPWUucGF0aCxyPWUubWV0aG9kLGE9ZS5zcGVjUGF0aDtyZXR1cm4gYT90LnJlcXVlc3RSZXNvbHZlZFN1YnRyZWUoYS50b0pTKCkpOnQucmVxdWVzdFJlc29sdmVkU3VidHJlZShbInBhdGhzIixuLHJdKX0pKTt2YXIgYT1lLmdldENvbmZpZ3MoKS50cnlJdE91dEVuYWJsZWQ7cmV0dXJuIG8uc3RhdGU9e3RyeUl0T3V0RW5hYmxlZDohMD09PWF8fCJ0cnVlIj09PWEsZXhlY3V0ZUluUHJvZ3Jlc3M6ITF9LG99cmV0dXJuIHgoKShuLFt7a2V5OiJtYXBTdGF0ZVRvUHJvcHMiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj10Lm9wLG89dC5sYXlvdXRTZWxlY3RvcnMsYT0oMCx0LmdldENvbmZpZ3MpKCksaT1hLmRvY0V4cGFuc2lvbixzPWEuZGVlcExpbmtpbmcsYz1hLmRpc3BsYXlPcGVyYXRpb25JZCxsPWEuZGlzcGxheVJlcXVlc3REdXJhdGlvbixwPWEuc3VwcG9ydGVkU3VibWl0TWV0aG9kcyxmPW8uc2hvd1N1bW1hcnkoKSxoPXIuZ2V0SW4oWyJvcGVyYXRpb24iLCJfX29yaWdpbmFsT3BlcmF0aW9uSWQiXSl8fHIuZ2V0SW4oWyJvcGVyYXRpb24iLCJvcGVyYXRpb25JZCJdKXx8T2JqZWN0KEVlLmUpKHIuZ2V0KCJvcGVyYXRpb24iKSx0LnBhdGgsdC5tZXRob2QpfHxyLmdldCgiaWQiKSxkPVsib3BlcmF0aW9ucyIsdC50YWcsaF0sbT1zJiYiZmFsc2UiIT09cyx2PXhlKCkocCkuY2FsbChwLHQubWV0aG9kKT49MCYmKHZvaWQgMD09PXQuYWxsb3dUcnlJdE91dD90LnNwZWNTZWxlY3RvcnMuYWxsb3dUcnlJdE91dEZvcih0LnBhdGgsdC5tZXRob2QpOnQuYWxsb3dUcnlJdE91dCksZz1yLmdldEluKFsib3BlcmF0aW9uIiwic2VjdXJpdHkiXSl8fHQuc3BlY1NlbGVjdG9ycy5zZWN1cml0eSgpO3JldHVybntvcGVyYXRpb25JZDpoLGlzRGVlcExpbmtpbmdFbmFibGVkOm0sc2hvd1N1bW1hcnk6ZixkaXNwbGF5T3BlcmF0aW9uSWQ6YyxkaXNwbGF5UmVxdWVzdER1cmF0aW9uOmwsYWxsb3dUcnlJdE91dDp2LHNlY3VyaXR5OmcsaXNBdXRob3JpemVkOnQuYXV0aFNlbGVjdG9ycy5pc0F1dGhvcml6ZWQoZyksaXNTaG93bjpvLmlzU2hvd24oZCwiZnVsbCI9PT1pKSxqdW1wVG9LZXk6dSgpKG49InBhdGhzLiIuY29uY2F0KHQucGF0aCwiLiIpKS5jYWxsKG4sdC5tZXRob2QpLHJlc3BvbnNlOnQuc3BlY1NlbGVjdG9ycy5yZXNwb25zZUZvcih0LnBhdGgsdC5tZXRob2QpLHJlcXVlc3Q6dC5zcGVjU2VsZWN0b3JzLnJlcXVlc3RGb3IodC5wYXRoLHQubWV0aG9kKX19fSx7a2V5OiJjb21wb25lbnREaWRNb3VudCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLmlzU2hvd24sdD10aGlzLmdldFJlc29sdmVkU3VidHJlZSgpO2UmJnZvaWQgMD09PXQmJnRoaXMucmVxdWVzdFJlc29sdmVkU3VidHJlZSgpfX0se2tleToiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXNwb25zZSxuPWUuaXNTaG93bixyPXRoaXMuZ2V0UmVzb2x2ZWRTdWJ0cmVlKCk7dCE9PXRoaXMucHJvcHMucmVzcG9uc2UmJnRoaXMuc2V0U3RhdGUoe2V4ZWN1dGVJblByb2dyZXNzOiExfSksbiYmdm9pZCAwPT09ciYmdGhpcy5yZXF1ZXN0UmVzb2x2ZWRTdWJ0cmVlKCl9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcyx0PWUub3Asbj1lLnRhZyxyPWUucGF0aCxvPWUubWV0aG9kLGE9ZS5zZWN1cml0eSxpPWUuaXNBdXRob3JpemVkLHM9ZS5vcGVyYXRpb25JZCx1PWUuc2hvd1N1bW1hcnksYz1lLmlzU2hvd24sbD1lLmp1bXBUb0tleSxwPWUuYWxsb3dUcnlJdE91dCxmPWUucmVzcG9uc2UsaD1lLnJlcXVlc3QsZD1lLmRpc3BsYXlPcGVyYXRpb25JZCxtPWUuZGlzcGxheVJlcXVlc3REdXJhdGlvbix2PWUuaXNEZWVwTGlua2luZ0VuYWJsZWQsZz1lLnNwZWNQYXRoLHk9ZS5zcGVjU2VsZWN0b3JzLGI9ZS5zcGVjQWN0aW9ucyxfPWUuZ2V0Q29tcG9uZW50LHc9ZS5nZXRDb25maWdzLHg9ZS5sYXlvdXRTZWxlY3RvcnMsRT1lLmxheW91dEFjdGlvbnMsUz1lLmF1dGhBY3Rpb25zLEM9ZS5hdXRoU2VsZWN0b3JzLEE9ZS5vYXMzQWN0aW9ucyxPPWUub2FzM1NlbGVjdG9ycyxrPWUuZm4saj1fKCJvcGVyYXRpb24iKSxUPXRoaXMuZ2V0UmVzb2x2ZWRTdWJ0cmVlKCl8fE9iamVjdChCLk1hcCkoKSxJPU9iamVjdChCLmZyb21KUykoe29wOlQsdGFnOm4scGF0aDpyLHN1bW1hcnk6dC5nZXRJbihbIm9wZXJhdGlvbiIsInN1bW1hcnkiXSl8fCIiLGRlcHJlY2F0ZWQ6VC5nZXQoImRlcHJlY2F0ZWQiKXx8dC5nZXRJbihbIm9wZXJhdGlvbiIsImRlcHJlY2F0ZWQiXSl8fCExLG1ldGhvZDpvLHNlY3VyaXR5OmEsaXNBdXRob3JpemVkOmksb3BlcmF0aW9uSWQ6cyxvcmlnaW5hbE9wZXJhdGlvbklkOlQuZ2V0SW4oWyJvcGVyYXRpb24iLCJfX29yaWdpbmFsT3BlcmF0aW9uSWQiXSksc2hvd1N1bW1hcnk6dSxpc1Nob3duOmMsanVtcFRvS2V5OmwsYWxsb3dUcnlJdE91dDpwLHJlcXVlc3Q6aCxkaXNwbGF5T3BlcmF0aW9uSWQ6ZCxkaXNwbGF5UmVxdWVzdER1cmF0aW9uOm0saXNEZWVwTGlua2luZ0VuYWJsZWQ6dixleGVjdXRlSW5Qcm9ncmVzczp0aGlzLnN0YXRlLmV4ZWN1dGVJblByb2dyZXNzLHRyeUl0T3V0RW5hYmxlZDp0aGlzLnN0YXRlLnRyeUl0T3V0RW5hYmxlZH0pO3JldHVybiBELmEuY3JlYXRlRWxlbWVudChqLHtvcGVyYXRpb246SSxyZXNwb25zZTpmLHJlcXVlc3Q6aCxpc1Nob3duOmMsdG9nZ2xlU2hvd246dGhpcy50b2dnbGVTaG93bixvblRyeW91dENsaWNrOnRoaXMub25UcnlvdXRDbGljayxvbkNhbmNlbENsaWNrOnRoaXMub25DYW5jZWxDbGljayxvbkV4ZWN1dGU6dGhpcy5vbkV4ZWN1dGUsc3BlY1BhdGg6ZyxzcGVjQWN0aW9uczpiLHNwZWNTZWxlY3RvcnM6eSxvYXMzQWN0aW9uczpBLG9hczNTZWxlY3RvcnM6TyxsYXlvdXRBY3Rpb25zOkUsbGF5b3V0U2VsZWN0b3JzOngsYXV0aEFjdGlvbnM6UyxhdXRoU2VsZWN0b3JzOkMsZ2V0Q29tcG9uZW50Ol8sZ2V0Q29uZmlnczp3LGZuOmt9KX19XSksbn0oUi5QdXJlQ29tcG9uZW50KTt5KCkoU2UsImRlZmF1bHRQcm9wcyIse3Nob3dTdW1tYXJ5OiEwLHJlc3BvbnNlOm51bGwsYWxsb3dUcnlJdE91dDohMCxkaXNwbGF5T3BlcmF0aW9uSWQ6ITEsZGlzcGxheVJlcXVlc3REdXJhdGlvbjohMX0pO3ZhciBDZT1mdW5jdGlvbihlKXt5ZSgpKG4sZSk7dmFyIHQ9X2UoKShuKTtmdW5jdGlvbiBuKCl7cmV0dXJuIF8oKSh0aGlzLG4pLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiB4KCkobixbe2tleToiZ2V0TGF5b3V0Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsdD1lLmdldENvbXBvbmVudCxuPWUubGF5b3V0U2VsZWN0b3JzLmN1cnJlbnQoKSxyPXQobiwhMCk7cmV0dXJuIHJ8fGZ1bmN0aW9uKCl7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJoMSIsbnVsbCwnIE5vIGxheW91dCBkZWZpbmVkIGZvciAiJyxuLCciICcpfX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldExheW91dCgpO3JldHVybiBELmEuY3JlYXRlRWxlbWVudChlLG51bGwpfX1dKSxufShELmEuQ29tcG9uZW50KTtDZS5kZWZhdWx0UHJvcHM9e307dmFyIEFlPWZ1bmN0aW9uKGUpe3llKCkobixlKTt2YXIgdD1fZSgpKG4pO2Z1bmN0aW9uIG4oKXt2YXIgZSxyO18oKSh0aGlzLG4pO2Zvcih2YXIgbz1hcmd1bWVudHMubGVuZ3RoLGE9bmV3IEFycmF5KG8pLGk9MDtpPG87aSsrKWFbaV09YXJndW1lbnRzW2ldO3JldHVybiByPXQuY2FsbC5hcHBseSh0LHUoKShlPVt0aGlzXSkuY2FsbChlLGEpKSx5KCkodmUoKShyKSwiY2xvc2UiLChmdW5jdGlvbigpe3IucHJvcHMuYXV0aEFjdGlvbnMuc2hvd0RlZmluaXRpb25zKCExKX0pKSxyfXJldHVybiB4KCkobixbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlLHQ9dGhpcy5wcm9wcyxuPXQuYXV0aFNlbGVjdG9ycyxyPXQuYXV0aEFjdGlvbnMsbz10LmdldENvbXBvbmVudCxhPXQuZXJyU2VsZWN0b3JzLGk9dC5zcGVjU2VsZWN0b3JzLHM9dC5mbi5BU1QsdT12b2lkIDA9PT1zP3t9OnMsYz1uLnNob3duRGVmaW5pdGlvbnMoKSxsPW8oImF1dGhzIik7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImRpYWxvZy11eCJ9LEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImJhY2tkcm9wLXV4In0pLEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Im1vZGFsLXV4In0sRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToibW9kYWwtZGlhbG9nLXV4In0sRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToibW9kYWwtdXgtaW5uZXIifSxELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJtb2RhbC11eC1oZWFkZXIifSxELmEuY3JlYXRlRWxlbWVudCgiaDMiLG51bGwsIkF2YWlsYWJsZSBhdXRob3JpemF0aW9ucyIpLEQuYS5jcmVhdGVFbGVtZW50KCJidXR0b24iLHt0eXBlOiJidXR0b24iLGNsYXNzTmFtZToiY2xvc2UtbW9kYWwiLG9uQ2xpY2s6dGhpcy5jbG9zZX0sRC5hLmNyZWF0ZUVsZW1lbnQoInN2ZyIse3dpZHRoOiIyMCIsaGVpZ2h0OiIyMCJ9LEQuYS5jcmVhdGVFbGVtZW50KCJ1c2UiLHtocmVmOiIjY2xvc2UiLHhsaW5rSHJlZjoiI2Nsb3NlIn0pKSkpLEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Im1vZGFsLXV4LWNvbnRlbnQifSxNKCkoZT1jLnZhbHVlU2VxKCkpLmNhbGwoZSwoZnVuY3Rpb24oZSx0KXtyZXR1cm4gRC5hLmNyZWF0ZUVsZW1lbnQobCx7a2V5OnQsQVNUOnUsZGVmaW5pdGlvbnM6ZSxnZXRDb21wb25lbnQ6byxlcnJTZWxlY3RvcnM6YSxhdXRoU2VsZWN0b3JzOm4sYXV0aEFjdGlvbnM6cixzcGVjU2VsZWN0b3JzOml9KX0pKSkpKSkpfX1dKSxufShELmEuQ29tcG9uZW50KSxPZT1mdW5jdGlvbihlKXt5ZSgpKG4sZSk7dmFyIHQ9X2UoKShuKTtmdW5jdGlvbiBuKCl7cmV0dXJuIF8oKSh0aGlzLG4pLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiB4KCkobixbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsdD1lLmlzQXV0aG9yaXplZCxuPWUuc2hvd1BvcHVwLHI9ZS5vbkNsaWNrLG89KDAsZS5nZXRDb21wb25lbnQpKCJhdXRob3JpemF0aW9uUG9wdXAiLCEwKTtyZXR1cm4gRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiYXV0aC13cmFwcGVyIn0sRC5hLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIse2NsYXNzTmFtZTp0PyJidG4gYXV0aG9yaXplIGxvY2tlZCI6ImJ0biBhdXRob3JpemUgdW5sb2NrZWQiLG9uQ2xpY2s6cn0sRC5hLmNyZWF0ZUVsZW1lbnQoInNwYW4iLG51bGwsIkF1dGhvcml6ZSIpLEQuYS5jcmVhdGVFbGVtZW50KCJzdmciLHt3aWR0aDoiMjAiLGhlaWdodDoiMjAifSxELmEuY3JlYXRlRWxlbWVudCgidXNlIix7aHJlZjp0PyIjbG9ja2VkIjoiI3VubG9ja2VkIix4bGlua0hyZWY6dD8iI2xvY2tlZCI6IiN1bmxvY2tlZCJ9KSkpLG4mJkQuYS5jcmVhdGVFbGVtZW50KG8sbnVsbCkpfX1dKSxufShELmEuQ29tcG9uZW50KSxrZT1mdW5jdGlvbihlKXt5ZSgpKG4sZSk7dmFyIHQ9X2UoKShuKTtmdW5jdGlvbiBuKCl7cmV0dXJuIF8oKSh0aGlzLG4pLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiB4KCkobixbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsdD1lLmF1dGhBY3Rpb25zLG49ZS5hdXRoU2VsZWN0b3JzLHI9ZS5zcGVjU2VsZWN0b3JzLG89ZS5nZXRDb21wb25lbnQsYT1yLnNlY3VyaXR5RGVmaW5pdGlvbnMoKSxpPW4uZGVmaW5pdGlvbnNUb0F1dGhvcml6ZSgpLHM9bygiYXV0aG9yaXplQnRuIik7cmV0dXJuIGE/RC5hLmNyZWF0ZUVsZW1lbnQocyx7b25DbGljazpmdW5jdGlvbigpe3JldHVybiB0LnNob3dEZWZpbml0aW9ucyhpKX0saXNBdXRob3JpemVkOiEhbi5hdXRob3JpemVkKCkuc2l6ZSxzaG93UG9wdXA6ISFuLnNob3duRGVmaW5pdGlvbnMoKSxnZXRDb21wb25lbnQ6b30pOm51bGx9fV0pLG59KEQuYS5Db21wb25lbnQpLGplPWZ1bmN0aW9uKGUpe3llKCkobixlKTt2YXIgdD1fZSgpKG4pO2Z1bmN0aW9uIG4oKXt2YXIgZSxyO18oKSh0aGlzLG4pO2Zvcih2YXIgbz1hcmd1bWVudHMubGVuZ3RoLGE9bmV3IEFycmF5KG8pLGk9MDtpPG87aSsrKWFbaV09YXJndW1lbnRzW2ldO3JldHVybiByPXQuY2FsbC5hcHBseSh0LHUoKShlPVt0aGlzXSkuY2FsbChlLGEpKSx5KCkodmUoKShyKSwib25DbGljayIsKGZ1bmN0aW9uKGUpe2Uuc3RvcFByb3BhZ2F0aW9uKCk7dmFyIHQ9ci5wcm9wcy5vbkNsaWNrO3QmJnQoKX0pKSxyfXJldHVybiB4KCkobixbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMuaXNBdXRob3JpemVkO3JldHVybiBELmEuY3JlYXRlRWxlbWVudCgiYnV0dG9uIix7Y2xhc3NOYW1lOmU/ImF1dGhvcml6YXRpb25fX2J0biBsb2NrZWQiOiJhdXRob3JpemF0aW9uX19idG4gdW5sb2NrZWQiLCJhcmlhLWxhYmVsIjplPyJhdXRob3JpemF0aW9uIGJ1dHRvbiBsb2NrZWQiOiJhdXRob3JpemF0aW9uIGJ1dHRvbiB1bmxvY2tlZCIsb25DbGljazp0aGlzLm9uQ2xpY2t9LEQuYS5jcmVhdGVFbGVtZW50KCJzdmciLHt3aWR0aDoiMjAiLGhlaWdodDoiMjAifSxELmEuY3JlYXRlRWxlbWVudCgidXNlIix7aHJlZjplPyIjbG9ja2VkIjoiI3VubG9ja2VkIix4bGlua0hyZWY6ZT8iI2xvY2tlZCI6IiN1bmxvY2tlZCJ9KSkpfX1dKSxufShELmEuQ29tcG9uZW50KSxUZT1mdW5jdGlvbihlKXt5ZSgpKG4sZSk7dmFyIHQ9X2UoKShuKTtmdW5jdGlvbiBuKGUscil7dmFyIG87cmV0dXJuIF8oKSh0aGlzLG4pLG89dC5jYWxsKHRoaXMsZSxyKSx5KCkodmUoKShvKSwib25BdXRoQ2hhbmdlIiwoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5uYW1lO28uc2V0U3RhdGUoeSgpKHt9LHQsZSkpfSkpLHkoKSh2ZSgpKG8pLCJzdWJtaXRBdXRoIiwoZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdCgpLG8ucHJvcHMuYXV0aEFjdGlvbnMuYXV0aG9yaXplV2l0aFBlcnNpc3RPcHRpb24oby5zdGF0ZSl9KSkseSgpKHZlKCkobyksImxvZ291dENsaWNrIiwoZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdCgpO3ZhciB0PW8ucHJvcHMsbj10LmF1dGhBY3Rpb25zLHI9dC5kZWZpbml0aW9ucyxhPU0oKShyKS5jYWxsKHIsKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR9KSkudG9BcnJheSgpO28uc2V0U3RhdGUoUCgpKGEpLmNhbGwoYSwoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZVt0XT0iIixlfSkse30pKSxuLmxvZ291dFdpdGhQZXJzaXN0T3B0aW9uKGEpfSkpLHkoKSh2ZSgpKG8pLCJjbG9zZSIsKGZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKSxvLnByb3BzLmF1dGhBY3Rpb25zLnNob3dEZWZpbml0aW9ucyghMSl9KSksby5zdGF0ZT17fSxvfXJldHVybiB4KCkobixbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlLHQ9dGhpcyxuPXRoaXMucHJvcHMscj1uLmRlZmluaXRpb25zLG89bi5nZXRDb21wb25lbnQsYT1uLmF1dGhTZWxlY3RvcnMsaT1uLmVyclNlbGVjdG9ycyxzPW8oIkF1dGhJdGVtIiksdT1vKCJvYXV0aDIiLCEwKSxjPW8oIkJ1dHRvbiIpLHA9YS5hdXRob3JpemVkKCksZj1sKCkocikuY2FsbChyLChmdW5jdGlvbihlLHQpe3JldHVybiEhcC5nZXQodCl9KSksaD1sKCkocikuY2FsbChyLChmdW5jdGlvbihlKXtyZXR1cm4ib2F1dGgyIiE9PWUuZ2V0KCJ0eXBlIil9KSksZD1sKCkocikuY2FsbChyLChmdW5jdGlvbihlKXtyZXR1cm4ib2F1dGgyIj09PWUuZ2V0KCJ0eXBlIil9KSk7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImF1dGgtY29udGFpbmVyIn0sISFoLnNpemUmJkQuYS5jcmVhdGVFbGVtZW50KCJmb3JtIix7b25TdWJtaXQ6dGhpcy5zdWJtaXRBdXRofSxNKCkoaCkuY2FsbChoLChmdW5jdGlvbihlLG4pe3JldHVybiBELmEuY3JlYXRlRWxlbWVudChzLHtrZXk6bixzY2hlbWE6ZSxuYW1lOm4sZ2V0Q29tcG9uZW50Om8sb25BdXRoQ2hhbmdlOnQub25BdXRoQ2hhbmdlLGF1dGhvcml6ZWQ6cCxlcnJTZWxlY3RvcnM6aX0pfSkpLnRvQXJyYXkoKSxELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJhdXRoLWJ0bi13cmFwcGVyIn0saC5zaXplPT09Zi5zaXplP0QuYS5jcmVhdGVFbGVtZW50KGMse2NsYXNzTmFtZToiYnRuIG1vZGFsLWJ0biBhdXRoIixvbkNsaWNrOnRoaXMubG9nb3V0Q2xpY2t9LCJMb2dvdXQiKTpELmEuY3JlYXRlRWxlbWVudChjLHt0eXBlOiJzdWJtaXQiLGNsYXNzTmFtZToiYnRuIG1vZGFsLWJ0biBhdXRoIGF1dGhvcml6ZSJ9LCJBdXRob3JpemUiKSxELmEuY3JlYXRlRWxlbWVudChjLHtjbGFzc05hbWU6ImJ0biBtb2RhbC1idG4gYXV0aCBidG4tZG9uZSIsb25DbGljazp0aGlzLmNsb3NlfSwiQ2xvc2UiKSkpLGQmJmQuc2l6ZT9ELmEuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InNjb3BlLWRlZiJ9LEQuYS5jcmVhdGVFbGVtZW50KCJwIixudWxsLCJTY29wZXMgYXJlIHVzZWQgdG8gZ3JhbnQgYW4gYXBwbGljYXRpb24gZGlmZmVyZW50IGxldmVscyBvZiBhY2Nlc3MgdG8gZGF0YSBvbiBiZWhhbGYgb2YgdGhlIGVuZCB1c2VyLiBFYWNoIEFQSSBtYXkgZGVjbGFyZSBvbmUgb3IgbW9yZSBzY29wZXMuIiksRC5hLmNyZWF0ZUVsZW1lbnQoInAiLG51bGwsIkFQSSByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHNjb3Blcy4gU2VsZWN0IHdoaWNoIG9uZXMgeW91IHdhbnQgdG8gZ3JhbnQgdG8gU3dhZ2dlciBVSS4iKSksTSgpKGU9bCgpKHIpLmNhbGwociwoZnVuY3Rpb24oZSl7cmV0dXJuIm9hdXRoMiI9PT1lLmdldCgidHlwZSIpfSkpKS5jYWxsKGUsKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtrZXk6dH0sRC5hLmNyZWF0ZUVsZW1lbnQodSx7YXV0aG9yaXplZDpwLHNjaGVtYTplLG5hbWU6dH0pKX0pKS50b0FycmF5KCkpOm51bGwpfX1dKSxufShELmEuQ29tcG9uZW50KSxJZT1mdW5jdGlvbihlKXt5ZSgpKG4sZSk7dmFyIHQ9X2UoKShuKTtmdW5jdGlvbiBuKCl7cmV0dXJuIF8oKSh0aGlzLG4pLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiB4KCkobixbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlLHQ9dGhpcy5wcm9wcyxuPXQuc2NoZW1hLHI9dC5uYW1lLG89dC5nZXRDb21wb25lbnQsYT10Lm9uQXV0aENoYW5nZSxpPXQuYXV0aG9yaXplZCxzPXQuZXJyU2VsZWN0b3JzLHU9bygiYXBpS2V5QXV0aCIpLGM9bygiYmFzaWNBdXRoIiksbD1uLmdldCgidHlwZSIpO3N3aXRjaChsKXtjYXNlImFwaUtleSI6ZT1ELmEuY3JlYXRlRWxlbWVudCh1LHtrZXk6cixzY2hlbWE6bixuYW1lOnIsZXJyU2VsZWN0b3JzOnMsYXV0aG9yaXplZDppLGdldENvbXBvbmVudDpvLG9uQ2hhbmdlOmF9KTticmVhaztjYXNlImJhc2ljIjplPUQuYS5jcmVhdGVFbGVtZW50KGMse2tleTpyLHNjaGVtYTpuLG5hbWU6cixlcnJTZWxlY3RvcnM6cyxhdXRob3JpemVkOmksZ2V0Q29tcG9uZW50Om8sb25DaGFuZ2U6YX0pO2JyZWFrO2RlZmF1bHQ6ZT1ELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7a2V5OnJ9LCJVbmtub3duIHNlY3VyaXR5IGRlZmluaXRpb24gdHlwZSAiLGwpfXJldHVybiBELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7a2V5OiIiLmNvbmNhdChyLCItanVtcCIpfSxlKX19XSksbn0oRC5hLkNvbXBvbmVudCksUGU9ZnVuY3Rpb24oZSl7eWUoKShuLGUpO3ZhciB0PV9lKCkobik7ZnVuY3Rpb24gbigpe3JldHVybiBfKCkodGhpcyxuKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4geCgpKG4sW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLmVycm9yLHQ9ZS5nZXQoImxldmVsIiksbj1lLmdldCgibWVzc2FnZSIpLHI9ZS5nZXQoInNvdXJjZSIpO3JldHVybiBELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJlcnJvcnMifSxELmEuY3JlYXRlRWxlbWVudCgiYiIsbnVsbCxyLCIgIix0KSxELmEuY3JlYXRlRWxlbWVudCgic3BhbiIsbnVsbCxuKSl9fV0pLG59KEQuYS5Db21wb25lbnQpLE5lPWZ1bmN0aW9uKGUpe3llKCkobixlKTt2YXIgdD1fZSgpKG4pO2Z1bmN0aW9uIG4oZSxyKXt2YXIgbztfKCkodGhpcyxuKSxvPXQuY2FsbCh0aGlzLGUscikseSgpKHZlKCkobyksIm9uQ2hhbmdlIiwoZnVuY3Rpb24oZSl7dmFyIHQ9by5wcm9wcy5vbkNoYW5nZSxuPWUudGFyZ2V0LnZhbHVlLHI9QSgpKHt9LG8uc3RhdGUse3ZhbHVlOm59KTtvLnNldFN0YXRlKHIpLHQocil9KSk7dmFyIGE9by5wcm9wcyxpPWEubmFtZSxzPWEuc2NoZW1hLHU9by5nZXRWYWx1ZSgpO3JldHVybiBvLnN0YXRlPXtuYW1lOmksc2NoZW1hOnMsdmFsdWU6dX0sb31yZXR1cm4geCgpKG4sW3trZXk6ImdldFZhbHVlIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsdD1lLm5hbWUsbj1lLmF1dGhvcml6ZWQ7cmV0dXJuIG4mJm4uZ2V0SW4oW3QsInZhbHVlIl0pfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlLHQsbj10aGlzLnByb3BzLHI9bi5zY2hlbWEsbz1uLmdldENvbXBvbmVudCxhPW4uZXJyU2VsZWN0b3JzLGk9bi5uYW1lLHM9bygiSW5wdXQiKSx1PW8oIlJvdyIpLGM9bygiQ29sIikscD1vKCJhdXRoRXJyb3IiKSxmPW8oIk1hcmtkb3duIiwhMCksaD1vKCJKdW1wVG9QYXRoIiwhMCksZD10aGlzLmdldFZhbHVlKCksbT1sKCkoZT1hLmFsbEVycm9ycygpKS5jYWxsKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldCgiYXV0aElkIik9PT1pfSkpO3JldHVybiBELmEuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLEQuYS5jcmVhdGVFbGVtZW50KCJoNCIsbnVsbCxELmEuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCxpfHxyLmdldCgibmFtZSIpKSwiwqAoYXBpS2V5KSIsRC5hLmNyZWF0ZUVsZW1lbnQoaCx7cGF0aDpbInNlY3VyaXR5RGVmaW5pdGlvbnMiLGldfSkpLGQmJkQuYS5jcmVhdGVFbGVtZW50KCJoNiIsbnVsbCwiQXV0aG9yaXplZCIpLEQuYS5jcmVhdGVFbGVtZW50KHUsbnVsbCxELmEuY3JlYXRlRWxlbWVudChmLHtzb3VyY2U6ci5nZXQoImRlc2NyaXB0aW9uIil9KSksRC5hLmNyZWF0ZUVsZW1lbnQodSxudWxsLEQuYS5jcmVhdGVFbGVtZW50KCJwIixudWxsLCJOYW1lOiAiLEQuYS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLHIuZ2V0KCJuYW1lIikpKSksRC5hLmNyZWF0ZUVsZW1lbnQodSxudWxsLEQuYS5jcmVhdGVFbGVtZW50KCJwIixudWxsLCJJbjogIixELmEuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCxyLmdldCgiaW4iKSkpKSxELmEuY3JlYXRlRWxlbWVudCh1LG51bGwsRC5hLmNyZWF0ZUVsZW1lbnQoImxhYmVsIixudWxsLCJWYWx1ZToiKSxkP0QuYS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLCIgKioqKioqICIpOkQuYS5jcmVhdGVFbGVtZW50KGMsbnVsbCxELmEuY3JlYXRlRWxlbWVudChzLHt0eXBlOiJ0ZXh0IixvbkNoYW5nZTp0aGlzLm9uQ2hhbmdlLGF1dG9Gb2N1czohMH0pKSksTSgpKHQ9bS52YWx1ZVNlcSgpKS5jYWxsKHQsKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KHAse2Vycm9yOmUsa2V5OnR9KX0pKSl9fV0pLG59KEQuYS5Db21wb25lbnQpLE1lPWZ1bmN0aW9uKGUpe3llKCkobixlKTt2YXIgdD1fZSgpKG4pO2Z1bmN0aW9uIG4oZSxyKXt2YXIgbztfKCkodGhpcyxuKSxvPXQuY2FsbCh0aGlzLGUscikseSgpKHZlKCkobyksIm9uQ2hhbmdlIiwoZnVuY3Rpb24oZSl7dmFyIHQ9by5wcm9wcy5vbkNoYW5nZSxuPWUudGFyZ2V0LHI9bi52YWx1ZSxhPW4ubmFtZSxpPW8uc3RhdGUudmFsdWU7aVthXT1yLG8uc2V0U3RhdGUoe3ZhbHVlOml9KSx0KG8uc3RhdGUpfSkpO3ZhciBhPW8ucHJvcHMsaT1hLnNjaGVtYSxzPWEubmFtZSx1PW8uZ2V0VmFsdWUoKS51c2VybmFtZTtyZXR1cm4gby5zdGF0ZT17bmFtZTpzLHNjaGVtYTppLHZhbHVlOnU/e3VzZXJuYW1lOnV9Ont9fSxvfXJldHVybiB4KCkobixbe2tleToiZ2V0VmFsdWUiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcyx0PWUuYXV0aG9yaXplZCxuPWUubmFtZTtyZXR1cm4gdCYmdC5nZXRJbihbbiwidmFsdWUiXSl8fHt9fX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlLHQsbj10aGlzLnByb3BzLHI9bi5zY2hlbWEsbz1uLmdldENvbXBvbmVudCxhPW4ubmFtZSxpPW4uZXJyU2VsZWN0b3JzLHM9bygiSW5wdXQiKSx1PW8oIlJvdyIpLGM9bygiQ29sIikscD1vKCJhdXRoRXJyb3IiKSxmPW8oIkp1bXBUb1BhdGgiLCEwKSxoPW8oIk1hcmtkb3duIiwhMCksZD10aGlzLmdldFZhbHVlKCkudXNlcm5hbWUsbT1sKCkoZT1pLmFsbEVycm9ycygpKS5jYWxsKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldCgiYXV0aElkIik9PT1hfSkpO3JldHVybiBELmEuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLEQuYS5jcmVhdGVFbGVtZW50KCJoNCIsbnVsbCwiQmFzaWMgYXV0aG9yaXphdGlvbiIsRC5hLmNyZWF0ZUVsZW1lbnQoZix7cGF0aDpbInNlY3VyaXR5RGVmaW5pdGlvbnMiLGFdfSkpLGQmJkQuYS5jcmVhdGVFbGVtZW50KCJoNiIsbnVsbCwiQXV0aG9yaXplZCIpLEQuYS5jcmVhdGVFbGVtZW50KHUsbnVsbCxELmEuY3JlYXRlRWxlbWVudChoLHtzb3VyY2U6ci5nZXQoImRlc2NyaXB0aW9uIil9KSksRC5hLmNyZWF0ZUVsZW1lbnQodSxudWxsLEQuYS5jcmVhdGVFbGVtZW50KCJsYWJlbCIsbnVsbCwiVXNlcm5hbWU6IiksZD9ELmEuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCwiICIsZCwiICIpOkQuYS5jcmVhdGVFbGVtZW50KGMsbnVsbCxELmEuY3JlYXRlRWxlbWVudChzLHt0eXBlOiJ0ZXh0IixyZXF1aXJlZDoicmVxdWlyZWQiLG5hbWU6InVzZXJuYW1lIixvbkNoYW5nZTp0aGlzLm9uQ2hhbmdlLGF1dG9Gb2N1czohMH0pKSksRC5hLmNyZWF0ZUVsZW1lbnQodSxudWxsLEQuYS5jcmVhdGVFbGVtZW50KCJsYWJlbCIsbnVsbCwiUGFzc3dvcmQ6IiksZD9ELmEuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCwiICoqKioqKiAiKTpELmEuY3JlYXRlRWxlbWVudChjLG51bGwsRC5hLmNyZWF0ZUVsZW1lbnQocyx7YXV0b0NvbXBsZXRlOiJuZXctcGFzc3dvcmQiLG5hbWU6InBhc3N3b3JkIix0eXBlOiJwYXNzd29yZCIsb25DaGFuZ2U6dGhpcy5vbkNoYW5nZX0pKSksTSgpKHQ9bS52YWx1ZVNlcSgpKS5jYWxsKHQsKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KHAse2Vycm9yOmUsa2V5OnR9KX0pKSl9fV0pLG59KEQuYS5Db21wb25lbnQpO2Z1bmN0aW9uIFJlKGUpe3ZhciB0PWUuZXhhbXBsZSxuPWUuc2hvd1ZhbHVlLHI9ZS5nZXRDb21wb25lbnQsbz1lLmdldENvbmZpZ3MsYT1yKCJNYXJrZG93biIsITApLGk9cigiaGlnaGxpZ2h0Q29kZSIpO3JldHVybiB0P0QuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImV4YW1wbGUifSx0LmdldCgiZGVzY3JpcHRpb24iKT9ELmEuY3JlYXRlRWxlbWVudCgic2VjdGlvbiIse2NsYXNzTmFtZToiZXhhbXBsZV9fc2VjdGlvbiJ9LEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImV4YW1wbGVfX3NlY3Rpb24taGVhZGVyIn0sIkV4YW1wbGUgRGVzY3JpcHRpb24iKSxELmEuY3JlYXRlRWxlbWVudCgicCIsbnVsbCxELmEuY3JlYXRlRWxlbWVudChhLHtzb3VyY2U6dC5nZXQoImRlc2NyaXB0aW9uIil9KSkpOm51bGwsbiYmdC5oYXMoInZhbHVlIik/RC5hLmNyZWF0ZUVsZW1lbnQoInNlY3Rpb24iLHtjbGFzc05hbWU6ImV4YW1wbGVfX3NlY3Rpb24ifSxELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJleGFtcGxlX19zZWN0aW9uLWhlYWRlciJ9LCJFeGFtcGxlIFZhbHVlIiksRC5hLmNyZWF0ZUVsZW1lbnQoaSx7Z2V0Q29uZmlnczpvLHZhbHVlOk9iamVjdCgkLkkpKHQuZ2V0KCJ2YWx1ZSIpKX0pKTpudWxsKTpudWxsfXZhciBEZT1uKDUyOSksTGU9bi5uKERlKSxCZT1mdW5jdGlvbihlKXt5ZSgpKG4sZSk7dmFyIHQ9X2UoKShuKTtmdW5jdGlvbiBuKCl7dmFyIGUscjtfKCkodGhpcyxuKTtmb3IodmFyIG89YXJndW1lbnRzLmxlbmd0aCxhPW5ldyBBcnJheShvKSxpPTA7aTxvO2krKylhW2ldPWFyZ3VtZW50c1tpXTtyZXR1cm4gcj10LmNhbGwuYXBwbHkodCx1KCkoZT1bdGhpc10pLmNhbGwoZSxhKSkseSgpKHZlKCkociksIl9vblNlbGVjdCIsKGZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fSxuPXQuaXNTeW50aGV0aWNDaGFuZ2Usbz12b2lkIDAhPT1uJiZuOyJmdW5jdGlvbiI9PXR5cGVvZiByLnByb3BzLm9uU2VsZWN0JiZyLnByb3BzLm9uU2VsZWN0KGUse2lzU3ludGhldGljQ2hhbmdlOm99KX0pKSx5KCkodmUoKShyKSwiX29uRG9tU2VsZWN0IiwoZnVuY3Rpb24oZSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHIucHJvcHMub25TZWxlY3Qpe3ZhciB0PWUudGFyZ2V0LnNlbGVjdGVkT3B0aW9uc1swXS5nZXRBdHRyaWJ1dGUoInZhbHVlIik7ci5fb25TZWxlY3QodCx7aXNTeW50aGV0aWNDaGFuZ2U6ITF9KX19KSkseSgpKHZlKCkociksImdldEN1cnJlbnRFeGFtcGxlIiwoZnVuY3Rpb24oKXt2YXIgZT1yLnByb3BzLHQ9ZS5leGFtcGxlcyxuPWUuY3VycmVudEV4YW1wbGVLZXksbz10LmdldChuKSxhPXQua2V5U2VxKCkuZmlyc3QoKSxpPXQuZ2V0KGEpO3JldHVybiBvfHxpfHxMZSgpKHt9KX0pKSxyfXJldHVybiB4KCkobixbe2tleToiY29tcG9uZW50RGlkTW91bnQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcyx0PWUub25TZWxlY3Qsbj1lLmV4YW1wbGVzO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0KXt2YXIgcj1uLmZpcnN0KCksbz1uLmtleU9mKHIpO3RoaXMuX29uU2VsZWN0KG8se2lzU3ludGhldGljQ2hhbmdlOiEwfSl9fX0se2tleToiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jdXJyZW50RXhhbXBsZUtleSxuPWUuZXhhbXBsZXM7aWYobiE9PXRoaXMucHJvcHMuZXhhbXBsZXMmJiFuLmhhcyh0KSl7dmFyIHI9bi5maXJzdCgpLG89bi5rZXlPZihyKTt0aGlzLl9vblNlbGVjdChvLHtpc1N5bnRoZXRpY0NoYW5nZTohMH0pfX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLHQ9ZS5leGFtcGxlcyxuPWUuY3VycmVudEV4YW1wbGVLZXkscj1lLmlzVmFsdWVNb2RpZmllZCxvPWUuaXNNb2RpZmllZFZhbHVlQXZhaWxhYmxlLGE9ZS5zaG93TGFiZWxzO3JldHVybiBELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJleGFtcGxlcy1zZWxlY3QifSxhP0QuYS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJleGFtcGxlcy1zZWxlY3RfX3NlY3Rpb24tbGFiZWwifSwiRXhhbXBsZXM6ICIpOm51bGwsRC5hLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIse2NsYXNzTmFtZToiZXhhbXBsZXMtc2VsZWN0LWVsZW1lbnQiLG9uQ2hhbmdlOnRoaXMuX29uRG9tU2VsZWN0LHZhbHVlOm8mJnI/Il9fTU9ESUZJRURfX1ZBTFVFX18iOm58fCIifSxvP0QuYS5jcmVhdGVFbGVtZW50KCJvcHRpb24iLHt2YWx1ZToiX19NT0RJRklFRF9fVkFMVUVfXyJ9LCJbTW9kaWZpZWQgdmFsdWVdIik6bnVsbCxNKCkodCkuY2FsbCh0LChmdW5jdGlvbihlLHQpe3JldHVybiBELmEuY3JlYXRlRWxlbWVudCgib3B0aW9uIix7a2V5OnQsdmFsdWU6dH0sZS5nZXQoInN1bW1hcnkiKXx8dCl9KSkudmFsdWVTZXEoKSkpfX1dKSxufShELmEuUHVyZUNvbXBvbmVudCk7eSgpKEJlLCJkZWZhdWx0UHJvcHMiLHtleGFtcGxlczpGLmEuTWFwKHt9KSxvblNlbGVjdDpmdW5jdGlvbigpe2Zvcih2YXIgZSx0LG49YXJndW1lbnRzLmxlbmd0aCxyPW5ldyBBcnJheShuKSxvPTA7bzxuO28rKylyW29dPWFyZ3VtZW50c1tvXTtyZXR1cm4oZT1jb25zb2xlKS5sb2cuYXBwbHkoZSx1KCkodD1bIkRFQlVHOiBFeGFtcGxlc1NlbGVjdCB3YXMgbm90IGdpdmVuIGFuIG9uU2VsZWN0IGNhbGxiYWNrIl0pLmNhbGwodCxyKSl9LGN1cnJlbnRFeGFtcGxlS2V5Om51bGwsc2hvd0xhYmVsczohMH0pO3ZhciBGZT1mdW5jdGlvbihlKXtyZXR1cm4gQi5MaXN0LmlzTGlzdChlKT9lOk9iamVjdCgkLkkpKGUpfSxVZT1mdW5jdGlvbihlKXt5ZSgpKG4sZSk7dmFyIHQ9X2UoKShuKTtmdW5jdGlvbiBuKGUpe3ZhciByO18oKSh0aGlzLG4pLHI9dC5jYWxsKHRoaXMsZSkseSgpKHZlKCkociksIl9nZXRTdGF0ZUZvckN1cnJlbnROYW1lc3BhY2UiLChmdW5jdGlvbigpe3ZhciBlPXIucHJvcHMuY3VycmVudE5hbWVzcGFjZTtyZXR1cm4oci5zdGF0ZVtlXXx8T2JqZWN0KEIuTWFwKSgpKS50b09iamVjdCgpfSkpLHkoKSh2ZSgpKHIpLCJfc2V0U3RhdGVGb3JDdXJyZW50TmFtZXNwYWNlIiwoZnVuY3Rpb24oZSl7dmFyIHQ9ci5wcm9wcy5jdXJyZW50TmFtZXNwYWNlO3JldHVybiByLl9zZXRTdGF0ZUZvck5hbWVzcGFjZSh0LGUpfSkpLHkoKSh2ZSgpKHIpLCJfc2V0U3RhdGVGb3JOYW1lc3BhY2UiLChmdW5jdGlvbihlLHQpe3ZhciBuPShyLnN0YXRlW2VdfHxPYmplY3QoQi5NYXApKCkpLm1lcmdlRGVlcCh0KTtyZXR1cm4gci5zZXRTdGF0ZSh5KCkoe30sZSxuKSl9KSkseSgpKHZlKCkociksIl9pc0N1cnJlbnRVc2VySW5wdXRTYW1lQXNFeGFtcGxlVmFsdWUiLChmdW5jdGlvbigpe3ZhciBlPXIucHJvcHMuY3VycmVudFVzZXJJbnB1dFZhbHVlO3JldHVybiByLl9nZXRDdXJyZW50RXhhbXBsZVZhbHVlKCk9PT1lfSkpLHkoKSh2ZSgpKHIpLCJfZ2V0VmFsdWVGb3JFeGFtcGxlIiwoZnVuY3Rpb24oZSx0KXt2YXIgbj0odHx8ci5wcm9wcykuZXhhbXBsZXM7cmV0dXJuIEZlKChufHxPYmplY3QoQi5NYXApKHt9KSkuZ2V0SW4oW2UsInZhbHVlIl0pKX0pKSx5KCkodmUoKShyKSwiX2dldEN1cnJlbnRFeGFtcGxlVmFsdWUiLChmdW5jdGlvbihlKXt2YXIgdD0oZXx8ci5wcm9wcykuY3VycmVudEtleTtyZXR1cm4gci5fZ2V0VmFsdWVGb3JFeGFtcGxlKHQsZXx8ci5wcm9wcyl9KSkseSgpKHZlKCkociksIl9vbkV4YW1wbGVzU2VsZWN0IiwoZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9LG49dC5pc1N5bnRoZXRpY0NoYW5nZSxvPXIucHJvcHMsYT1vLm9uU2VsZWN0LGk9by51cGRhdGVWYWx1ZSxzPW8uY3VycmVudFVzZXJJbnB1dFZhbHVlLGM9by51c2VySGFzRWRpdGVkQm9keSxsPXIuX2dldFN0YXRlRm9yQ3VycmVudE5hbWVzcGFjZSgpLHA9bC5sYXN0VXNlckVkaXRlZFZhbHVlLGY9ci5fZ2V0VmFsdWVGb3JFeGFtcGxlKGUpO2lmKCJfX01PRElGSUVEX19WQUxVRV9fIj09PWUpcmV0dXJuIGkoRmUocCkpLHIuX3NldFN0YXRlRm9yQ3VycmVudE5hbWVzcGFjZSh7aXNNb2RpZmllZFZhbHVlU2VsZWN0ZWQ6ITB9KTtpZigiZnVuY3Rpb24iPT10eXBlb2YgYSl7Zm9yKHZhciBoLGQ9YXJndW1lbnRzLmxlbmd0aCxtPW5ldyBBcnJheShkPjI/ZC0yOjApLHY9Mjt2PGQ7disrKW1bdi0yXT1hcmd1bWVudHNbdl07YS5hcHBseSh2b2lkIDAsdSgpKGg9W2Use2lzU3ludGhldGljQ2hhbmdlOm59XSkuY2FsbChoLG0pKX1yLl9zZXRTdGF0ZUZvckN1cnJlbnROYW1lc3BhY2Uoe2xhc3REb3duc3RyZWFtVmFsdWU6Zixpc01vZGlmaWVkVmFsdWVTZWxlY3RlZDpuJiZjfHwhIXMmJnMhPT1mfSksbnx8ImZ1bmN0aW9uIj09dHlwZW9mIGkmJmkoRmUoZikpfSkpO3ZhciBvPXIuX2dldEN1cnJlbnRFeGFtcGxlVmFsdWUoKTtyZXR1cm4gci5zdGF0ZT15KCkoe30sZS5jdXJyZW50TmFtZXNwYWNlLE9iamVjdChCLk1hcCkoe2xhc3RVc2VyRWRpdGVkVmFsdWU6ci5wcm9wcy5jdXJyZW50VXNlcklucHV0VmFsdWUsbGFzdERvd25zdHJlYW1WYWx1ZTpvLGlzTW9kaWZpZWRWYWx1ZVNlbGVjdGVkOnIucHJvcHMudXNlckhhc0VkaXRlZEJvZHl8fHIucHJvcHMuY3VycmVudFVzZXJJbnB1dFZhbHVlIT09b30pKSxyfXJldHVybiB4KCkobixbe2tleToiY29tcG9uZW50V2lsbFVubW91bnQiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5wcm9wcy5zZXRSZXRhaW5SZXF1ZXN0Qm9keVZhbHVlRmxhZyghMSl9fSx7a2V5OiJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1lLmN1cnJlbnRVc2VySW5wdXRWYWx1ZSxuPWUuZXhhbXBsZXMscj1lLm9uU2VsZWN0LG89ZS51c2VySGFzRWRpdGVkQm9keSxhPXRoaXMuX2dldFN0YXRlRm9yQ3VycmVudE5hbWVzcGFjZSgpLGk9YS5sYXN0VXNlckVkaXRlZFZhbHVlLHM9YS5sYXN0RG93bnN0cmVhbVZhbHVlLHU9dGhpcy5fZ2V0VmFsdWVGb3JFeGFtcGxlKGUuY3VycmVudEtleSxlKSxjPWwoKShuKS5jYWxsKG4sKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldCgidmFsdWUiKT09PXR8fE9iamVjdCgkLkkpKGUuZ2V0KCJ2YWx1ZSIpKT09PXR9KSk7Yy5zaXplP3IoYy5oYXMoZS5jdXJyZW50S2V5KT9lLmN1cnJlbnRLZXk6Yy5rZXlTZXEoKS5maXJzdCgpLHtpc1N5bnRoZXRpY0NoYW5nZTohMH0pOnQhPT10aGlzLnByb3BzLmN1cnJlbnRVc2VySW5wdXRWYWx1ZSYmdCE9PWkmJnQhPT1zJiYodGhpcy5wcm9wcy5zZXRSZXRhaW5SZXF1ZXN0Qm9keVZhbHVlRmxhZyghMCksdGhpcy5fc2V0U3RhdGVGb3JOYW1lc3BhY2UoZS5jdXJyZW50TmFtZXNwYWNlLHtsYXN0VXNlckVkaXRlZFZhbHVlOmUuY3VycmVudFVzZXJJbnB1dFZhbHVlLGlzTW9kaWZpZWRWYWx1ZVNlbGVjdGVkOm98fHQhPT11fSkpfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsdD1lLmN1cnJlbnRVc2VySW5wdXRWYWx1ZSxuPWUuZXhhbXBsZXMscj1lLmN1cnJlbnRLZXksbz1lLmdldENvbXBvbmVudCxhPWUudXNlckhhc0VkaXRlZEJvZHksaT10aGlzLl9nZXRTdGF0ZUZvckN1cnJlbnROYW1lc3BhY2UoKSxzPWkubGFzdERvd25zdHJlYW1WYWx1ZSx1PWkubGFzdFVzZXJFZGl0ZWRWYWx1ZSxjPWkuaXNNb2RpZmllZFZhbHVlU2VsZWN0ZWQsbD1vKCJFeGFtcGxlc1NlbGVjdCIpO3JldHVybiBELmEuY3JlYXRlRWxlbWVudChsLHtleGFtcGxlczpuLGN1cnJlbnRFeGFtcGxlS2V5OnIsb25TZWxlY3Q6dGhpcy5fb25FeGFtcGxlc1NlbGVjdCxpc01vZGlmaWVkVmFsdWVBdmFpbGFibGU6ISF1JiZ1IT09cyxpc1ZhbHVlTW9kaWZpZWQ6dm9pZCAwIT09dCYmYyYmdCE9PXRoaXMuX2dldEN1cnJlbnRFeGFtcGxlVmFsdWUoKXx8YX0pfX1dKSxufShELmEuUHVyZUNvbXBvbmVudCk7eSgpKFVlLCJkZWZhdWx0UHJvcHMiLHt1c2VySGFzRWRpdGVkQm9keTohMSxleGFtcGxlczpPYmplY3QoQi5NYXApKHt9KSxjdXJyZW50TmFtZXNwYWNlOiJfX0RFRkFVTFRfX05BTUVTUEFDRV9fIixzZXRSZXRhaW5SZXF1ZXN0Qm9keVZhbHVlRmxhZzpmdW5jdGlvbigpe30sb25TZWxlY3Q6ZnVuY3Rpb24oKXtmb3IodmFyIGUsdCxuPWFyZ3VtZW50cy5sZW5ndGgscj1uZXcgQXJyYXkobiksbz0wO288bjtvKyspcltvXT1hcmd1bWVudHNbb107cmV0dXJuKGU9Y29uc29sZSkubG9nLmFwcGx5KGUsdSgpKHQ9WyJFeGFtcGxlc1NlbGVjdFZhbHVlUmV0YWluZXI6IG5vIGBvblNlbGVjdGAgZnVuY3Rpb24gd2FzIHByb3ZpZGVkIl0pLmNhbGwodCxyKSl9LHVwZGF0ZVZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQsbj1hcmd1bWVudHMubGVuZ3RoLHI9bmV3IEFycmF5KG4pLG89MDtvPG47bysrKXJbb109YXJndW1lbnRzW29dO3JldHVybihlPWNvbnNvbGUpLmxvZy5hcHBseShlLHUoKSh0PVsiRXhhbXBsZXNTZWxlY3RWYWx1ZVJldGFpbmVyOiBubyBgdXBkYXRlVmFsdWVgIGZ1bmN0aW9uIHdhcyBwcm92aWRlZCJdKS5jYWxsKHQscikpfX0pO3ZhciBxZT1uKDEwMiksemU9bi5uKHFlKSxWZT1uKDEyNCksV2U9bi5uKFZlKSxIZT1uKDMxKSwkZT1uLm4oSGUpLEplPW4oOTIpLEtlPW4ubihKZSk7dmFyIFllPWZ1bmN0aW9uKGUpe3llKCkobixlKTt2YXIgdD1fZSgpKG4pO2Z1bmN0aW9uIG4oZSxyKXt2YXIgbztfKCkodGhpcyxuKSxvPXQuY2FsbCh0aGlzLGUscikseSgpKHZlKCkobyksImNsb3NlIiwoZnVuY3Rpb24oZSl7ZS5wcmV2ZW50RGVmYXVsdCgpLG8ucHJvcHMuYXV0aEFjdGlvbnMuc2hvd0RlZmluaXRpb25zKCExKX0pKSx5KCkodmUoKShvKSwiYXV0aG9yaXplIiwoZnVuY3Rpb24oKXt2YXIgZT1vLnByb3BzLHQ9ZS5hdXRoQWN0aW9ucyxuPWUuZXJyQWN0aW9ucyxyPWUuZ2V0Q29uZmlncyxhPWUuYXV0aFNlbGVjdG9ycyxpPWUub2FzM1NlbGVjdG9ycyxzPXIoKSx1PWEuZ2V0Q29uZmlncygpO24uY2xlYXIoe2F1dGhJZDpuYW1lLHR5cGU6ImF1dGgiLHNvdXJjZToiYXV0aCJ9KSxmdW5jdGlvbihlKXt2YXIgdD1lLmF1dGgsbj1lLmF1dGhBY3Rpb25zLHI9ZS5lcnJBY3Rpb25zLG89ZS5jb25maWdzLGE9ZS5hdXRoQ29uZmlncyxpPXZvaWQgMD09PWE/e306YSxzPWUuY3VycmVudFNlcnZlcix1PXQuc2NoZW1hLGM9dC5zY29wZXMsbD10Lm5hbWUscD10LmNsaWVudElkLGY9dS5nZXQoImZsb3ciKSxoPVtdO3N3aXRjaChmKXtjYXNlInBhc3N3b3JkIjpyZXR1cm4gdm9pZCBuLmF1dGhvcml6ZVBhc3N3b3JkKHQpO2Nhc2UiYXBwbGljYXRpb24iOnJldHVybiB2b2lkIG4uYXV0aG9yaXplQXBwbGljYXRpb24odCk7Y2FzZSJhY2Nlc3NDb2RlIjpoLnB1c2goInJlc3BvbnNlX3R5cGU9Y29kZSIpO2JyZWFrO2Nhc2UiaW1wbGljaXQiOmgucHVzaCgicmVzcG9uc2VfdHlwZT10b2tlbiIpO2JyZWFrO2Nhc2UiY2xpZW50Q3JlZGVudGlhbHMiOmNhc2UiY2xpZW50X2NyZWRlbnRpYWxzIjpyZXR1cm4gdm9pZCBuLmF1dGhvcml6ZUFwcGxpY2F0aW9uKHQpO2Nhc2UiYXV0aG9yaXphdGlvbkNvZGUiOmNhc2UiYXV0aG9yaXphdGlvbl9jb2RlIjpoLnB1c2goInJlc3BvbnNlX3R5cGU9Y29kZSIpfSJzdHJpbmciPT10eXBlb2YgcCYmaC5wdXNoKCJjbGllbnRfaWQ9IitlbmNvZGVVUklDb21wb25lbnQocCkpO3ZhciBkPW8ub2F1dGgyUmVkaXJlY3RVcmw7aWYodm9pZCAwIT09ZCl7aC5wdXNoKCJyZWRpcmVjdF91cmk9IitlbmNvZGVVUklDb21wb25lbnQoZCkpO3ZhciBtPVtdO2lmKFQoKShjKT9tPWM6Ri5hLkxpc3QuaXNMaXN0KGMpJiYobT1jLnRvQXJyYXkoKSksbS5sZW5ndGg+MCl7dmFyIHY9aS5zY29wZVNlcGFyYXRvcnx8IiAiO2gucHVzaCgic2NvcGU9IitlbmNvZGVVUklDb21wb25lbnQobS5qb2luKHYpKSl9dmFyIGc9T2JqZWN0KCQuYSkobmV3IERhdGUpO2lmKGgucHVzaCgic3RhdGU9IitlbmNvZGVVUklDb21wb25lbnQoZykpLHZvaWQgMCE9PWkucmVhbG0mJmgucHVzaCgicmVhbG09IitlbmNvZGVVUklDb21wb25lbnQoaS5yZWFsbSkpLCgiYXV0aG9yaXphdGlvbkNvZGUiPT09Znx8ImF1dGhvcml6YXRpb25fY29kZSI9PT1mfHwiYWNjZXNzQ29kZSI9PT1mKSYmaS51c2VQa2NlV2l0aEF1dGhvcml6YXRpb25Db2RlR3JhbnQpe3ZhciB5PU9iamVjdCgkLmopKCksYj1PYmplY3QoJC5jKSh5KTtoLnB1c2goImNvZGVfY2hhbGxlbmdlPSIrYiksaC5wdXNoKCJjb2RlX2NoYWxsZW5nZV9tZXRob2Q9UzI1NiIpLHQuY29kZVZlcmlmaWVyPXl9dmFyIF89aS5hZGRpdGlvbmFsUXVlcnlTdHJpbmdQYXJhbXM7Zm9yKHZhciB3IGluIF8pe3ZhciB4O3ZvaWQgMCE9PV9bd10mJmgucHVzaChNKCkoeD1bdyxfW3ddXSkuY2FsbCh4LGVuY29kZVVSSUNvbXBvbmVudCkuam9pbigiPSIpKX12YXIgRSxTPXUuZ2V0KCJhdXRob3JpemF0aW9uVXJsIiksQz1bcz9LZSgpKE9iamVjdCgkLkYpKFMpLHMsITApLnRvU3RyaW5nKCk6T2JqZWN0KCQuRikoUyksaC5qb2luKCImIildLmpvaW4oLTE9PT14ZSgpKFMpLmNhbGwoUywiPyIpPyI/IjoiJiIpO0U9ImltcGxpY2l0Ij09PWY/bi5wcmVBdXRob3JpemVJbXBsaWNpdDppLnVzZUJhc2ljQXV0aGVudGljYXRpb25XaXRoQWNjZXNzQ29kZUdyYW50P24uYXV0aG9yaXplQWNjZXNzQ29kZVdpdGhCYXNpY0F1dGhlbnRpY2F0aW9uOm4uYXV0aG9yaXplQWNjZXNzQ29kZVdpdGhGb3JtUGFyYW1zLEguYS5zd2FnZ2VyVUlSZWRpcmVjdE9hdXRoMj17YXV0aDp0LHN0YXRlOmcscmVkaXJlY3RVcmw6ZCxjYWxsYmFjazpFLGVyckNiOnIubmV3QXV0aEVycn0sSC5hLm9wZW4oQyl9ZWxzZSByLm5ld0F1dGhFcnIoe2F1dGhJZDpsLHNvdXJjZToidmFsaWRhdGlvbiIsbGV2ZWw6ImVycm9yIixtZXNzYWdlOiJvYXV0aDJSZWRpcmVjdFVybCBjb25maWd1cmF0aW9uIGlzIG5vdCBwYXNzZWQuIE9hdXRoMiBhdXRob3JpemF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQuIn0pfSh7YXV0aDpvLnN0YXRlLGN1cnJlbnRTZXJ2ZXI6aS5zZXJ2ZXJFZmZlY3RpdmVWYWx1ZShpLnNlbGVjdGVkU2VydmVyKCkpLGF1dGhBY3Rpb25zOnQsZXJyQWN0aW9uczpuLGNvbmZpZ3M6cyxhdXRoQ29uZmlnczp1fSl9KSkseSgpKHZlKCkobyksIm9uU2NvcGVDaGFuZ2UiLChmdW5jdGlvbihlKXt2YXIgdCxuLHI9ZS50YXJnZXQsYT1yLmNoZWNrZWQsaT1yLmRhdGFzZXQudmFsdWU7aWYoYSYmLTE9PT14ZSgpKHQ9by5zdGF0ZS5zY29wZXMpLmNhbGwodCxpKSl7dmFyIHMsYz11KCkocz1vLnN0YXRlLnNjb3BlcykuY2FsbChzLFtpXSk7by5zZXRTdGF0ZSh7c2NvcGVzOmN9KX1lbHNlIGlmKCFhJiZ4ZSgpKG49by5zdGF0ZS5zY29wZXMpLmNhbGwobixpKT4tMSl7dmFyIHA7by5zZXRTdGF0ZSh7c2NvcGVzOmwoKShwPW8uc3RhdGUuc2NvcGVzKS5jYWxsKHAsKGZ1bmN0aW9uKGUpe3JldHVybiBlIT09aX0pKX0pfX0pKSx5KCkodmUoKShvKSwib25JbnB1dENoYW5nZSIsKGZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0LG49dC5kYXRhc2V0Lm5hbWUscj10LnZhbHVlLGE9eSgpKHt9LG4scik7by5zZXRTdGF0ZShhKX0pKSx5KCkodmUoKShvKSwic2VsZWN0U2NvcGVzIiwoZnVuY3Rpb24oZSl7dmFyIHQ7ZS50YXJnZXQuZGF0YXNldC5hbGw/by5zZXRTdGF0ZSh7c2NvcGVzOnplKCkoV2UoKSh0PW8ucHJvcHMuc2NoZW1hLmdldCgiYWxsb3dlZFNjb3BlcyIpfHxvLnByb3BzLnNjaGVtYS5nZXQoInNjb3BlcyIpKS5jYWxsKHQpKX0pOm8uc2V0U3RhdGUoe3Njb3BlczpbXX0pfSkpLHkoKSh2ZSgpKG8pLCJsb2dvdXQiLChmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCk7dmFyIHQ9by5wcm9wcyxuPXQuYXV0aEFjdGlvbnMscj10LmVyckFjdGlvbnMsYT10Lm5hbWU7ci5jbGVhcih7YXV0aElkOmEsdHlwZToiYXV0aCIsc291cmNlOiJhdXRoIn0pLG4ubG9nb3V0V2l0aFBlcnNpc3RPcHRpb24oW2FdKX0pKTt2YXIgYT1vLnByb3BzLGk9YS5uYW1lLHM9YS5zY2hlbWEsYz1hLmF1dGhvcml6ZWQscD1hLmF1dGhTZWxlY3RvcnMsZj1jJiZjLmdldChpKSxoPXAuZ2V0Q29uZmlncygpfHx7fSxkPWYmJmYuZ2V0KCJ1c2VybmFtZSIpfHwiIixtPWYmJmYuZ2V0KCJjbGllbnRJZCIpfHxoLmNsaWVudElkfHwiIix2PWYmJmYuZ2V0KCJjbGllbnRTZWNyZXQiKXx8aC5jbGllbnRTZWNyZXR8fCIiLGc9ZiYmZi5nZXQoInBhc3N3b3JkVHlwZSIpfHwiYmFzaWMiLGI9ZiYmZi5nZXQoInNjb3BlcyIpfHxoLnNjb3Blc3x8W107cmV0dXJuInN0cmluZyI9PXR5cGVvZiBiJiYoYj1iLnNwbGl0KGguc2NvcGVTZXBhcmF0b3J8fCIgIikpLG8uc3RhdGU9e2FwcE5hbWU6aC5hcHBOYW1lLG5hbWU6aSxzY2hlbWE6cyxzY29wZXM6YixjbGllbnRJZDptLGNsaWVudFNlY3JldDp2LHVzZXJuYW1lOmQscGFzc3dvcmQ6IiIscGFzc3dvcmRUeXBlOmd9LG99cmV0dXJuIHgoKShuLFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGUsdCxuPXRoaXMscj10aGlzLnByb3BzLG89ci5zY2hlbWEsYT1yLmdldENvbXBvbmVudCxpPXIuYXV0aFNlbGVjdG9ycyxzPXIuZXJyU2VsZWN0b3JzLGM9ci5uYW1lLHA9ci5zcGVjU2VsZWN0b3JzLGY9YSgiSW5wdXQiKSxoPWEoIlJvdyIpLGQ9YSgiQ29sIiksbT1hKCJCdXR0b24iKSx2PWEoImF1dGhFcnJvciIpLGc9YSgiSnVtcFRvUGF0aCIsITApLHk9YSgiTWFya2Rvd24iLCEwKSxiPWEoIkluaXRpYWxpemVkSW5wdXQiKSxfPXAuaXNPQVMzLHc9XygpP28uZ2V0KCJvcGVuSWRDb25uZWN0VXJsIik6bnVsbCx4PSJpbXBsaWNpdCIsRT0icGFzc3dvcmQiLFM9XygpP3c/ImF1dGhvcml6YXRpb25fY29kZSI6ImF1dGhvcml6YXRpb25Db2RlIjoiYWNjZXNzQ29kZSIsQz1fKCk/dz8iY2xpZW50X2NyZWRlbnRpYWxzIjoiY2xpZW50Q3JlZGVudGlhbHMiOiJhcHBsaWNhdGlvbiIsQT1vLmdldCgiZmxvdyIpLE89by5nZXQoImFsbG93ZWRTY29wZXMiKXx8by5nZXQoInNjb3BlcyIpLGs9ISFpLmF1dGhvcml6ZWQoKS5nZXQoYyksaj1sKCkoZT1zLmFsbEVycm9ycygpKS5jYWxsKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldCgiYXV0aElkIik9PT1jfSkpLFQ9IWwoKShqKS5jYWxsKGosKGZ1bmN0aW9uKGUpe3JldHVybiJ2YWxpZGF0aW9uIj09PWUuZ2V0KCJzb3VyY2UiKX0pKS5zaXplLEk9by5nZXQoImRlc2NyaXB0aW9uIik7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsRC5hLmNyZWF0ZUVsZW1lbnQoImg0IixudWxsLGMsIiAoT0F1dGgyLCAiLG8uZ2V0KCJmbG93IiksIikgIixELmEuY3JlYXRlRWxlbWVudChnLHtwYXRoOlsic2VjdXJpdHlEZWZpbml0aW9ucyIsY119KSksdGhpcy5zdGF0ZS5hcHBOYW1lP0QuYS5jcmVhdGVFbGVtZW50KCJoNSIsbnVsbCwiQXBwbGljYXRpb246ICIsdGhpcy5zdGF0ZS5hcHBOYW1lLCIgIik6bnVsbCxJJiZELmEuY3JlYXRlRWxlbWVudCh5LHtzb3VyY2U6by5nZXQoImRlc2NyaXB0aW9uIil9KSxrJiZELmEuY3JlYXRlRWxlbWVudCgiaDYiLG51bGwsIkF1dGhvcml6ZWQiKSx3JiZELmEuY3JlYXRlRWxlbWVudCgicCIsbnVsbCwiT3BlbklEIENvbm5lY3QgVVJMOiAiLEQuYS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLHcpKSwoQT09PXh8fEE9PT1TKSYmRC5hLmNyZWF0ZUVsZW1lbnQoInAiLG51bGwsIkF1dGhvcml6YXRpb24gVVJMOiAiLEQuYS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLG8uZ2V0KCJhdXRob3JpemF0aW9uVXJsIikpKSwoQT09PUV8fEE9PT1TfHxBPT09QykmJkQuYS5jcmVhdGVFbGVtZW50KCJwIixudWxsLCJUb2tlbiBVUkw6IixELmEuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCwiICIsby5nZXQoInRva2VuVXJsIikpKSxELmEuY3JlYXRlRWxlbWVudCgicCIse2NsYXNzTmFtZToiZmxvdyJ9LCJGbG93OiAiLEQuYS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLG8uZ2V0KCJmbG93IikpKSxBIT09RT9udWxsOkQuYS5jcmVhdGVFbGVtZW50KGgsbnVsbCxELmEuY3JlYXRlRWxlbWVudChoLG51bGwsRC5hLmNyZWF0ZUVsZW1lbnQoImxhYmVsIix7aHRtbEZvcjoib2F1dGhfdXNlcm5hbWUifSwidXNlcm5hbWU6Iiksaz9ELmEuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCwiICIsdGhpcy5zdGF0ZS51c2VybmFtZSwiICIpOkQuYS5jcmVhdGVFbGVtZW50KGQse3RhYmxldDoxMCxkZXNrdG9wOjEwfSxELmEuY3JlYXRlRWxlbWVudCgiaW5wdXQiLHtpZDoib2F1dGhfdXNlcm5hbWUiLHR5cGU6InRleHQiLCJkYXRhLW5hbWUiOiJ1c2VybmFtZSIsb25DaGFuZ2U6dGhpcy5vbklucHV0Q2hhbmdlLGF1dG9Gb2N1czohMH0pKSksRC5hLmNyZWF0ZUVsZW1lbnQoaCxudWxsLEQuYS5jcmVhdGVFbGVtZW50KCJsYWJlbCIse2h0bWxGb3I6Im9hdXRoX3Bhc3N3b3JkIn0sInBhc3N3b3JkOiIpLGs/RC5hLmNyZWF0ZUVsZW1lbnQoImNvZGUiLG51bGwsIiAqKioqKiogIik6RC5hLmNyZWF0ZUVsZW1lbnQoZCx7dGFibGV0OjEwLGRlc2t0b3A6MTB9LEQuYS5jcmVhdGVFbGVtZW50KCJpbnB1dCIse2lkOiJvYXV0aF9wYXNzd29yZCIsdHlwZToicGFzc3dvcmQiLCJkYXRhLW5hbWUiOiJwYXNzd29yZCIsb25DaGFuZ2U6dGhpcy5vbklucHV0Q2hhbmdlfSkpKSxELmEuY3JlYXRlRWxlbWVudChoLG51bGwsRC5hLmNyZWF0ZUVsZW1lbnQoImxhYmVsIix7aHRtbEZvcjoicGFzc3dvcmRfdHlwZSJ9LCJDbGllbnQgY3JlZGVudGlhbHMgbG9jYXRpb246Iiksaz9ELmEuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCwiICIsdGhpcy5zdGF0ZS5wYXNzd29yZFR5cGUsIiAiKTpELmEuY3JlYXRlRWxlbWVudChkLHt0YWJsZXQ6MTAsZGVza3RvcDoxMH0sRC5hLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIse2lkOiJwYXNzd29yZF90eXBlIiwiZGF0YS1uYW1lIjoicGFzc3dvcmRUeXBlIixvbkNoYW5nZTp0aGlzLm9uSW5wdXRDaGFuZ2V9LEQuYS5jcmVhdGVFbGVtZW50KCJvcHRpb24iLHt2YWx1ZToiYmFzaWMifSwiQXV0aG9yaXphdGlvbiBoZWFkZXIiKSxELmEuY3JlYXRlRWxlbWVudCgib3B0aW9uIix7dmFsdWU6InJlcXVlc3QtYm9keSJ9LCJSZXF1ZXN0IGJvZHkiKSkpKSksKEE9PT1DfHxBPT09eHx8QT09PVN8fEE9PT1FKSYmKCFrfHxrJiZ0aGlzLnN0YXRlLmNsaWVudElkKSYmRC5hLmNyZWF0ZUVsZW1lbnQoaCxudWxsLEQuYS5jcmVhdGVFbGVtZW50KCJsYWJlbCIse2h0bWxGb3I6ImNsaWVudF9pZCJ9LCJjbGllbnRfaWQ6Iiksaz9ELmEuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCwiICoqKioqKiAiKTpELmEuY3JlYXRlRWxlbWVudChkLHt0YWJsZXQ6MTAsZGVza3RvcDoxMH0sRC5hLmNyZWF0ZUVsZW1lbnQoYix7aWQ6ImNsaWVudF9pZCIsdHlwZToidGV4dCIscmVxdWlyZWQ6QT09PUUsaW5pdGlhbFZhbHVlOnRoaXMuc3RhdGUuY2xpZW50SWQsImRhdGEtbmFtZSI6ImNsaWVudElkIixvbkNoYW5nZTp0aGlzLm9uSW5wdXRDaGFuZ2V9KSkpLChBPT09Q3x8QT09PVN8fEE9PT1FKSYmRC5hLmNyZWF0ZUVsZW1lbnQoaCxudWxsLEQuYS5jcmVhdGVFbGVtZW50KCJsYWJlbCIse2h0bWxGb3I6ImNsaWVudF9zZWNyZXQifSwiY2xpZW50X3NlY3JldDoiKSxrP0QuYS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLCIgKioqKioqICIpOkQuYS5jcmVhdGVFbGVtZW50KGQse3RhYmxldDoxMCxkZXNrdG9wOjEwfSxELmEuY3JlYXRlRWxlbWVudChiLHtpZDoiY2xpZW50X3NlY3JldCIsaW5pdGlhbFZhbHVlOnRoaXMuc3RhdGUuY2xpZW50U2VjcmV0LHR5cGU6InBhc3N3b3JkIiwiZGF0YS1uYW1lIjoiY2xpZW50U2VjcmV0IixvbkNoYW5nZTp0aGlzLm9uSW5wdXRDaGFuZ2V9KSkpLCFrJiZPJiZPLnNpemU/RC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToic2NvcGVzIn0sRC5hLmNyZWF0ZUVsZW1lbnQoImgyIixudWxsLCJTY29wZXM6IixELmEuY3JlYXRlRWxlbWVudCgiYSIse29uQ2xpY2s6dGhpcy5zZWxlY3RTY29wZXMsImRhdGEtYWxsIjohMH0sInNlbGVjdCBhbGwiKSxELmEuY3JlYXRlRWxlbWVudCgiYSIse29uQ2xpY2s6dGhpcy5zZWxlY3RTY29wZXN9LCJzZWxlY3Qgbm9uZSIpKSxNKCkoTykuY2FsbChPLChmdW5jdGlvbihlLHQpe3ZhciByLG8sYSxpLHM7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KGgse2tleTp0fSxELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJjaGVja2JveCJ9LEQuYS5jcmVhdGVFbGVtZW50KGYseyJkYXRhLXZhbHVlIjp0LGlkOnUoKShyPXUoKShvPSIiLmNvbmNhdCh0LCItIikpLmNhbGwobyxBLCItY2hlY2tib3gtIikpLmNhbGwocixuLnN0YXRlLm5hbWUpLGRpc2FibGVkOmssY2hlY2tlZDokZSgpKGE9bi5zdGF0ZS5zY29wZXMpLmNhbGwoYSx0KSx0eXBlOiJjaGVja2JveCIsb25DaGFuZ2U6bi5vblNjb3BlQ2hhbmdlfSksRC5hLmNyZWF0ZUVsZW1lbnQoImxhYmVsIix7aHRtbEZvcjp1KCkoaT11KCkocz0iIi5jb25jYXQodCwiLSIpKS5jYWxsKHMsQSwiLWNoZWNrYm94LSIpKS5jYWxsKGksbi5zdGF0ZS5uYW1lKX0sRC5hLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Iml0ZW0ifSksRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToidGV4dCJ9LEQuYS5jcmVhdGVFbGVtZW50KCJwIix7Y2xhc3NOYW1lOiJuYW1lIn0sdCksRC5hLmNyZWF0ZUVsZW1lbnQoInAiLHtjbGFzc05hbWU6ImRlc2NyaXB0aW9uIn0sZSkpKSkpfSkpLnRvQXJyYXkoKSk6bnVsbCxNKCkodD1qLnZhbHVlU2VxKCkpLmNhbGwodCwoZnVuY3Rpb24oZSx0KXtyZXR1cm4gRC5hLmNyZWF0ZUVsZW1lbnQodix7ZXJyb3I6ZSxrZXk6dH0pfSkpLEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImF1dGgtYnRuLXdyYXBwZXIifSxUJiYoaz9ELmEuY3JlYXRlRWxlbWVudChtLHtjbGFzc05hbWU6ImJ0biBtb2RhbC1idG4gYXV0aCBhdXRob3JpemUiLG9uQ2xpY2s6dGhpcy5sb2dvdXR9LCJMb2dvdXQiKTpELmEuY3JlYXRlRWxlbWVudChtLHtjbGFzc05hbWU6ImJ0biBtb2RhbC1idG4gYXV0aCBhdXRob3JpemUiLG9uQ2xpY2s6dGhpcy5hdXRob3JpemV9LCJBdXRob3JpemUiKSksRC5hLmNyZWF0ZUVsZW1lbnQobSx7Y2xhc3NOYW1lOiJidG4gbW9kYWwtYnRuIGF1dGggYnRuLWRvbmUiLG9uQ2xpY2s6dGhpcy5jbG9zZX0sIkNsb3NlIikpKX19XSksbn0oRC5hLkNvbXBvbmVudCksR2U9ZnVuY3Rpb24oZSl7eWUoKShuLGUpO3ZhciB0PV9lKCkobik7ZnVuY3Rpb24gbigpe3ZhciBlLHI7XygpKHRoaXMsbik7Zm9yKHZhciBvPWFyZ3VtZW50cy5sZW5ndGgsYT1uZXcgQXJyYXkobyksaT0wO2k8bztpKyspYVtpXT1hcmd1bWVudHNbaV07cmV0dXJuIHI9dC5jYWxsLmFwcGx5KHQsdSgpKGU9W3RoaXNdKS5jYWxsKGUsYSkpLHkoKSh2ZSgpKHIpLCJvbkNsaWNrIiwoZnVuY3Rpb24oKXt2YXIgZT1yLnByb3BzLHQ9ZS5zcGVjQWN0aW9ucyxuPWUucGF0aCxvPWUubWV0aG9kO3QuY2xlYXJSZXNwb25zZShuLG8pLHQuY2xlYXJSZXF1ZXN0KG4sbyl9KSkscn1yZXR1cm4geCgpKG4sW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gRC5hLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIse2NsYXNzTmFtZToiYnRuIGJ0bi1jbGVhciBvcGJsb2NrLWNvbnRyb2xfX2J0biIsb25DbGljazp0aGlzLm9uQ2xpY2t9LCJDbGVhciIpfX1dKSxufShSLkNvbXBvbmVudCksWmU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5oZWFkZXJzO3JldHVybiBELmEuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLEQuYS5jcmVhdGVFbGVtZW50KCJoNSIsbnVsbCwiUmVzcG9uc2UgaGVhZGVycyIpLEQuYS5jcmVhdGVFbGVtZW50KCJwcmUiLHtjbGFzc05hbWU6Im1pY3JvbGlnaHQifSx0KSl9LFhlPWZ1bmN0aW9uKGUpe3ZhciB0PWUuZHVyYXRpb247cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsRC5hLmNyZWF0ZUVsZW1lbnQoImg1IixudWxsLCJSZXF1ZXN0IGR1cmF0aW9uIiksRC5hLmNyZWF0ZUVsZW1lbnQoInByZSIse2NsYXNzTmFtZToibWljcm9saWdodCJ9LHQsIiBtcyIpKX0sUWU9ZnVuY3Rpb24oZSl7eWUoKShuLGUpO3ZhciB0PV9lKCkobik7ZnVuY3Rpb24gbigpe3JldHVybiBfKCkodGhpcyxuKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4geCgpKG4sW3trZXk6InNob3VsZENvbXBvbmVudFVwZGF0ZSIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHJvcHMucmVzcG9uc2UhPT1lLnJlc3BvbnNlfHx0aGlzLnByb3BzLnBhdGghPT1lLnBhdGh8fHRoaXMucHJvcHMubWV0aG9kIT09ZS5tZXRob2R8fHRoaXMucHJvcHMuZGlzcGxheVJlcXVlc3REdXJhdGlvbiE9PWUuZGlzcGxheVJlcXVlc3REdXJhdGlvbn19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXMucHJvcHMsbj10LnJlc3BvbnNlLHI9dC5nZXRDb21wb25lbnQsbz10LmdldENvbmZpZ3MsYT10LmRpc3BsYXlSZXF1ZXN0RHVyYXRpb24saT10LnNwZWNTZWxlY3RvcnMscz10LnBhdGgsYz10Lm1ldGhvZCxsPW8oKSxwPWwuc2hvd011dGF0ZWRSZXF1ZXN0LGg9bC5yZXF1ZXN0U25pcHBldHNFbmFibGVkLGQ9cD9pLm11dGF0ZWRSZXF1ZXN0Rm9yKHMsYyk6aS5yZXF1ZXN0Rm9yKHMsYyksbT1uLmdldCgic3RhdHVzIiksdj1kLmdldCgidXJsIiksZz1uLmdldCgiaGVhZGVycyIpLnRvSlMoKSx5PW4uZ2V0KCJub3REb2N1bWVudGVkIiksYj1uLmdldCgiZXJyb3IiKSxfPW4uZ2V0KCJ0ZXh0Iiksdz1uLmdldCgiZHVyYXRpb24iKSx4PWYoKShnKSxFPWdbImNvbnRlbnQtdHlwZSJdfHxnWyJDb250ZW50LVR5cGUiXSxTPXIoInJlc3BvbnNlQm9keSIpLEM9TSgpKHgpLmNhbGwoeCwoZnVuY3Rpb24oZSl7dmFyIHQ9VCgpKGdbZV0pP2dbZV0uam9pbigpOmdbZV07cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJoZWFkZXJsaW5lIixrZXk6ZX0sIiAiLGUsIjogIix0LCIgIil9KSksQT0wIT09Qy5sZW5ndGgsTz1yKCJNYXJrZG93biIsITApLGs9cigiUmVxdWVzdFNuaXBwZXRzIiwhMCksaj1yKCJjdXJsIik7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsZCYmKCEwPT09aHx8InRydWUiPT09aD9ELmEuY3JlYXRlRWxlbWVudChrLHtyZXF1ZXN0OmR9KTpELmEuY3JlYXRlRWxlbWVudChqLHtyZXF1ZXN0OmQsZ2V0Q29uZmlnczpvfSkpLHYmJkQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsRC5hLmNyZWF0ZUVsZW1lbnQoImg0IixudWxsLCJSZXF1ZXN0IFVSTCIpLEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InJlcXVlc3QtdXJsIn0sRC5hLmNyZWF0ZUVsZW1lbnQoInByZSIse2NsYXNzTmFtZToibWljcm9saWdodCJ9LHYpKSksRC5hLmNyZWF0ZUVsZW1lbnQoImg0IixudWxsLCJTZXJ2ZXIgcmVzcG9uc2UiKSxELmEuY3JlYXRlRWxlbWVudCgidGFibGUiLHtjbGFzc05hbWU6InJlc3BvbnNlcy10YWJsZSBsaXZlLXJlc3BvbnNlcy10YWJsZSJ9LEQuYS5jcmVhdGVFbGVtZW50KCJ0aGVhZCIsbnVsbCxELmEuY3JlYXRlRWxlbWVudCgidHIiLHtjbGFzc05hbWU6InJlc3BvbnNlcy1oZWFkZXIifSxELmEuY3JlYXRlRWxlbWVudCgidGQiLHtjbGFzc05hbWU6ImNvbF9oZWFkZXIgcmVzcG9uc2UtY29sX3N0YXR1cyJ9LCJDb2RlIiksRC5hLmNyZWF0ZUVsZW1lbnQoInRkIix7Y2xhc3NOYW1lOiJjb2xfaGVhZGVyIHJlc3BvbnNlLWNvbF9kZXNjcmlwdGlvbiJ9LCJEZXRhaWxzIikpKSxELmEuY3JlYXRlRWxlbWVudCgidGJvZHkiLG51bGwsRC5hLmNyZWF0ZUVsZW1lbnQoInRyIix7Y2xhc3NOYW1lOiJyZXNwb25zZSJ9LEQuYS5jcmVhdGVFbGVtZW50KCJ0ZCIse2NsYXNzTmFtZToicmVzcG9uc2UtY29sX3N0YXR1cyJ9LG0seT9ELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJyZXNwb25zZS11bmRvY3VtZW50ZWQifSxELmEuY3JlYXRlRWxlbWVudCgiaSIsbnVsbCwiIFVuZG9jdW1lbnRlZCAiKSk6bnVsbCksRC5hLmNyZWF0ZUVsZW1lbnQoInRkIix7Y2xhc3NOYW1lOiJyZXNwb25zZS1jb2xfZGVzY3JpcHRpb24ifSxiP0QuYS5jcmVhdGVFbGVtZW50KE8se3NvdXJjZTp1KCkoZT0iIi5jb25jYXQoIiIhPT1uLmdldCgibmFtZSIpPyIiLmNvbmNhdChuLmdldCgibmFtZSIpLCI6ICIpOiIiKSkuY2FsbChlLG4uZ2V0KCJtZXNzYWdlIikpfSk6bnVsbCxfP0QuYS5jcmVhdGVFbGVtZW50KFMse2NvbnRlbnQ6Xyxjb250ZW50VHlwZTpFLHVybDp2LGhlYWRlcnM6ZyxnZXRDb25maWdzOm8sZ2V0Q29tcG9uZW50OnJ9KTpudWxsLEE/RC5hLmNyZWF0ZUVsZW1lbnQoWmUse2hlYWRlcnM6Q30pOm51bGwsYSYmdz9ELmEuY3JlYXRlRWxlbWVudChYZSx7ZHVyYXRpb246d30pOm51bGwpKSkpKX19XSksbn0oRC5hLkNvbXBvbmVudCksZXQ9bigyMTcpLHR0PVsiZ2V0IiwicHV0IiwicG9zdCIsImRlbGV0ZSIsIm9wdGlvbnMiLCJoZWFkIiwicGF0Y2giXSxudD11KCkodHQpLmNhbGwodHQsWyJ0cmFjZSJdKSxydD1mdW5jdGlvbihlKXt5ZSgpKG4sZSk7dmFyIHQ9X2UoKShuKTtmdW5jdGlvbiBuKCl7dmFyIGUscjtfKCkodGhpcyxuKTtmb3IodmFyIG89YXJndW1lbnRzLmxlbmd0aCxhPW5ldyBBcnJheShvKSxpPTA7aTxvO2krKylhW2ldPWFyZ3VtZW50c1tpXTtyZXR1cm4gcj10LmNhbGwuYXBwbHkodCx1KCkoZT1bdGhpc10pLmNhbGwoZSxhKSkseSgpKHZlKCkociksInJlbmRlck9wZXJhdGlvblRhZyIsKGZ1bmN0aW9uKGUsdCl7dmFyIG49ci5wcm9wcyxvPW4uc3BlY1NlbGVjdG9ycyxhPW4uZ2V0Q29tcG9uZW50LGk9bi5vYXMzU2VsZWN0b3JzLHM9bi5sYXlvdXRTZWxlY3RvcnMsYz1uLmxheW91dEFjdGlvbnMsbD1uLmdldENvbmZpZ3MscD1hKCJPcGVyYXRpb25Db250YWluZXIiLCEwKSxmPWEoIk9wZXJhdGlvblRhZyIpLGg9ZS5nZXQoIm9wZXJhdGlvbnMiKTtyZXR1cm4gRC5hLmNyZWF0ZUVsZW1lbnQoZix7a2V5OiJvcGVyYXRpb24tIit0LHRhZ09iajplLHRhZzp0LG9hczNTZWxlY3RvcnM6aSxsYXlvdXRTZWxlY3RvcnM6cyxsYXlvdXRBY3Rpb25zOmMsZ2V0Q29uZmlnczpsLGdldENvbXBvbmVudDphLHNwZWNVcmw6by51cmwoKX0sRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToib3BlcmF0aW9uLXRhZy1jb250ZW50In0sTSgpKGgpLmNhbGwoaCwoZnVuY3Rpb24oZSl7dmFyIG4scj1lLmdldCgicGF0aCIpLGE9ZS5nZXQoIm1ldGhvZCIpLGk9Ri5hLkxpc3QoWyJwYXRocyIscixhXSkscz1vLmlzT0FTMygpP250OnR0O3JldHVybi0xPT09eGUoKShzKS5jYWxsKHMsYSk/bnVsbDpELmEuY3JlYXRlRWxlbWVudChwLHtrZXk6dSgpKG49IiIuY29uY2F0KHIsIi0iKSkuY2FsbChuLGEpLHNwZWNQYXRoOmksb3A6ZSxwYXRoOnIsbWV0aG9kOmEsdGFnOnR9KX0pKS50b0FycmF5KCkpKX0pKSxyfXJldHVybiB4KCkobixbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMuc3BlY1NlbGVjdG9ycy50YWdnZWRPcGVyYXRpb25zKCk7cmV0dXJuIDA9PT1lLnNpemU/RC5hLmNyZWF0ZUVsZW1lbnQoImgzIixudWxsLCIgTm8gb3BlcmF0aW9ucyBkZWZpbmVkIGluIHNwZWMhIik6RC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxNKCkoZSkuY2FsbChlLHRoaXMucmVuZGVyT3BlcmF0aW9uVGFnKS50b0FycmF5KCksZS5zaXplPDE/RC5hLmNyZWF0ZUVsZW1lbnQoImgzIixudWxsLCIgTm8gb3BlcmF0aW9ucyBkZWZpbmVkIGluIHNwZWMhICIpOm51bGwpfX1dKSxufShELmEuQ29tcG9uZW50KSxvdD1uKDkzKSxhdD1uLm4ob3QpO2Z1bmN0aW9uIGl0KGUpe3JldHVybiBlLm1hdGNoKC9eKD86W2Etel0rOik/XC9cLy9pKX1mdW5jdGlvbiBzdChlLHQpe3JldHVybiBlP2l0KGUpPyhuPWUpLm1hdGNoKC9eXC9cLy9pKT91KCkocj0iIi5jb25jYXQod2luZG93LmxvY2F0aW9uLnByb3RvY29sKSkuY2FsbChyLG4pOm46bmV3IGF0LmEoZSx0KS5ocmVmOnQ7dmFyIG4scn1mdW5jdGlvbiB1dChlLHQpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp7fSxyPW4uc2VsZWN0ZWRTZXJ2ZXIsbz12b2lkIDA9PT1yPyIiOnI7aWYoZSl7aWYoaXQoZSkpcmV0dXJuIGU7dmFyIGE9c3Qobyx0KTtyZXR1cm4gaXQoYSk/bmV3IGF0LmEoZSxhKS5ocmVmOm5ldyBhdC5hKGUsd2luZG93LmxvY2F0aW9uLmhyZWYpLmhyZWZ9fXZhciBjdD1mdW5jdGlvbihlKXt5ZSgpKG4sZSk7dmFyIHQ9X2UoKShuKTtmdW5jdGlvbiBuKCl7cmV0dXJuIF8oKSh0aGlzLG4pLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiB4KCkobixbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlLHQ9dGhpcy5wcm9wcyxuPXQudGFnT2JqLHI9dC50YWcsbz10LmNoaWxkcmVuLGE9dC5vYXMzU2VsZWN0b3JzLGk9dC5sYXlvdXRTZWxlY3RvcnMscz10LmxheW91dEFjdGlvbnMsdT10LmdldENvbmZpZ3MsYz10LmdldENvbXBvbmVudCxsPXQuc3BlY1VybCxwPXUoKSxmPXAuZG9jRXhwYW5zaW9uLGg9cC5kZWVwTGlua2luZyxkPWgmJiJmYWxzZSIhPT1oLG09YygiQ29sbGFwc2UiKSx2PWMoIk1hcmtkb3duIiwhMCksZz1jKCJEZWVwTGluayIpLHk9YygiTGluayIpLGI9bi5nZXRJbihbInRhZ0RldGFpbHMiLCJkZXNjcmlwdGlvbiJdLG51bGwpLF89bi5nZXRJbihbInRhZ0RldGFpbHMiLCJleHRlcm5hbERvY3MiLCJkZXNjcmlwdGlvbiJdKSx3PW4uZ2V0SW4oWyJ0YWdEZXRhaWxzIiwiZXh0ZXJuYWxEb2NzIiwidXJsIl0pO2U9T2JqZWN0KCQucykoYSkmJk9iamVjdCgkLnMpKGEuc2VsZWN0ZWRTZXJ2ZXIpP3V0KHcsbCx7c2VsZWN0ZWRTZXJ2ZXI6YS5zZWxlY3RlZFNlcnZlcigpfSk6dzt2YXIgeD1bIm9wZXJhdGlvbnMtdGFnIixyXSxFPWkuaXNTaG93bih4LCJmdWxsIj09PWZ8fCJsaXN0Ij09PWYpO3JldHVybiBELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOkU/Im9wYmxvY2stdGFnLXNlY3Rpb24gaXMtb3BlbiI6Im9wYmxvY2stdGFnLXNlY3Rpb24ifSxELmEuY3JlYXRlRWxlbWVudCgiaDMiLHtvbkNsaWNrOmZ1bmN0aW9uKCl7cmV0dXJuIHMuc2hvdyh4LCFFKX0sY2xhc3NOYW1lOmI/Im9wYmxvY2stdGFnIjoib3BibG9jay10YWcgbm8tZGVzYyIsaWQ6TSgpKHgpLmNhbGwoeCwoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdCgkLmcpKGUpfSkpLmpvaW4oIi0iKSwiZGF0YS10YWciOnIsImRhdGEtaXMtb3BlbiI6RX0sRC5hLmNyZWF0ZUVsZW1lbnQoZyx7ZW5hYmxlZDpkLGlzU2hvd246RSxwYXRoOk9iamVjdCgkLmQpKHIpLHRleHQ6cn0pLGI/RC5hLmNyZWF0ZUVsZW1lbnQoInNtYWxsIixudWxsLEQuYS5jcmVhdGVFbGVtZW50KHYse3NvdXJjZTpifSkpOkQuYS5jcmVhdGVFbGVtZW50KCJzbWFsbCIsbnVsbCksRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxfP0QuYS5jcmVhdGVFbGVtZW50KCJzbWFsbCIsbnVsbCxfLGU/IjogIjpudWxsLGU/RC5hLmNyZWF0ZUVsZW1lbnQoeSx7aHJlZjpPYmplY3QoJC5GKShlKSxvbkNsaWNrOmZ1bmN0aW9uKGUpe3JldHVybiBlLnN0b3BQcm9wYWdhdGlvbigpfSx0YXJnZXQ6Il9ibGFuayJ9LGUpOm51bGwpOm51bGwpLEQuYS5jcmVhdGVFbGVtZW50KCJidXR0b24iLHsiYXJpYS1leHBhbmRlZCI6RSxjbGFzc05hbWU6ImV4cGFuZC1vcGVyYXRpb24iLHRpdGxlOkU/IkNvbGxhcHNlIG9wZXJhdGlvbiI6IkV4cGFuZCBvcGVyYXRpb24iLG9uQ2xpY2s6ZnVuY3Rpb24oKXtyZXR1cm4gcy5zaG93KHgsIUUpfX0sRC5hLmNyZWF0ZUVsZW1lbnQoInN2ZyIse2NsYXNzTmFtZToiYXJyb3ciLHdpZHRoOiIyMCIsaGVpZ2h0OiIyMCIsImFyaWEtaGlkZGVuIjoidHJ1ZSIsZm9jdXNhYmxlOiJmYWxzZSJ9LEQuYS5jcmVhdGVFbGVtZW50KCJ1c2UiLHtocmVmOkU/IiNsYXJnZS1hcnJvdy11cCI6IiNsYXJnZS1hcnJvdy1kb3duIix4bGlua0hyZWY6RT8iI2xhcmdlLWFycm93LXVwIjoiI2xhcmdlLWFycm93LWRvd24ifSkpKSksRC5hLmNyZWF0ZUVsZW1lbnQobSx7aXNPcGVuZWQ6RX0sbykpfX1dKSxufShELmEuQ29tcG9uZW50KTt5KCkoY3QsImRlZmF1bHRQcm9wcyIse3RhZ09iajpGLmEuZnJvbUpTKHt9KSx0YWc6IiJ9KTt2YXIgbHQ9ZnVuY3Rpb24oZSl7eWUoKShyLGUpO3ZhciB0PV9lKCkocik7ZnVuY3Rpb24gcigpe3JldHVybiBfKCkodGhpcyxyKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4geCgpKHIsW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLHQ9ZS5zcGVjUGF0aCxyPWUucmVzcG9uc2Usbz1lLnJlcXVlc3QsYT1lLnRvZ2dsZVNob3duLGk9ZS5vblRyeW91dENsaWNrLHM9ZS5vbkNhbmNlbENsaWNrLHU9ZS5vbkV4ZWN1dGUsYz1lLmZuLGw9ZS5nZXRDb21wb25lbnQscD1lLmdldENvbmZpZ3MsZj1lLnNwZWNBY3Rpb25zLGg9ZS5zcGVjU2VsZWN0b3JzLGQ9ZS5hdXRoQWN0aW9ucyxtPWUuYXV0aFNlbGVjdG9ycyx2PWUub2FzM0FjdGlvbnMsZz1lLm9hczNTZWxlY3RvcnMseT10aGlzLnByb3BzLm9wZXJhdGlvbixiPXkudG9KUygpLF89Yi5kZXByZWNhdGVkLHc9Yi5pc1Nob3duLHg9Yi5wYXRoLEU9Yi5tZXRob2QsUz1iLm9wLEM9Yi50YWcsQT1iLm9wZXJhdGlvbklkLE89Yi5hbGxvd1RyeUl0T3V0LGs9Yi5kaXNwbGF5UmVxdWVzdER1cmF0aW9uLGo9Yi50cnlJdE91dEVuYWJsZWQsVD1iLmV4ZWN1dGVJblByb2dyZXNzLEk9Uy5kZXNjcmlwdGlvbixQPVMuZXh0ZXJuYWxEb2NzLE49Uy5zY2hlbWVzLE09UD91dChQLnVybCxoLnVybCgpLHtzZWxlY3RlZFNlcnZlcjpnLnNlbGVjdGVkU2VydmVyKCl9KToiIixSPXkuZ2V0SW4oWyJvcCJdKSxMPVIuZ2V0KCJyZXNwb25zZXMiKSxCPU9iamVjdCgkLm4pKFIsWyJwYXJhbWV0ZXJzIl0pLEY9aC5vcGVyYXRpb25TY2hlbWUoeCxFKSxVPVsib3BlcmF0aW9ucyIsQyxBXSxxPU9iamVjdCgkLm0pKFIpLHo9bCgicmVzcG9uc2VzIiksVj1sKCJwYXJhbWV0ZXJzIiksVz1sKCJleGVjdXRlIiksSD1sKCJjbGVhciIpLEo9bCgiQ29sbGFwc2UiKSxLPWwoIk1hcmtkb3duIiwhMCksWT1sKCJzY2hlbWVzIiksRz1sKCJPcGVyYXRpb25TZXJ2ZXJzIiksWj1sKCJPcGVyYXRpb25FeHQiKSxYPWwoIk9wZXJhdGlvblN1bW1hcnkiKSxRPWwoIkxpbmsiKSxlZT1wKCkuc2hvd0V4dGVuc2lvbnM7aWYoTCYmciYmci5zaXplPjApe3ZhciB0ZT0hTC5nZXQoU3RyaW5nKHIuZ2V0KCJzdGF0dXMiKSkpJiYhTC5nZXQoImRlZmF1bHQiKTtyPXIuc2V0KCJub3REb2N1bWVudGVkIix0ZSl9dmFyIG5lPVt4LEVdO3JldHVybiBELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOl8/Im9wYmxvY2sgb3BibG9jay1kZXByZWNhdGVkIjp3PyJvcGJsb2NrIG9wYmxvY2stIi5jb25jYXQoRSwiIGlzLW9wZW4iKToib3BibG9jayBvcGJsb2NrLSIuY29uY2F0KEUpLGlkOk9iamVjdCgkLmcpKFUuam9pbigiLSIpKX0sRC5hLmNyZWF0ZUVsZW1lbnQoWCx7b3BlcmF0aW9uUHJvcHM6eSxpc1Nob3duOncsdG9nZ2xlU2hvd246YSxnZXRDb21wb25lbnQ6bCxhdXRoQWN0aW9uczpkLGF1dGhTZWxlY3RvcnM6bSxzcGVjUGF0aDp0fSksRC5hLmNyZWF0ZUVsZW1lbnQoSix7aXNPcGVuZWQ6d30sRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToib3BibG9jay1ib2R5In0sUiYmUi5zaXplfHxudWxsPT09Uj9udWxsOkQuYS5jcmVhdGVFbGVtZW50KCJpbWciLHtoZWlnaHQ6IjMycHgiLHdpZHRoOiIzMnB4IixzcmM6big0OTcpLGNsYXNzTmFtZToib3BibG9jay1sb2FkaW5nLWFuaW1hdGlvbiJ9KSxfJiZELmEuY3JlYXRlRWxlbWVudCgiaDQiLHtjbGFzc05hbWU6Im9wYmxvY2stdGl0bGVfbm9ybWFsIn0sIiBXYXJuaW5nOiBEZXByZWNhdGVkIiksSSYmRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToib3BibG9jay1kZXNjcmlwdGlvbi13cmFwcGVyIn0sRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToib3BibG9jay1kZXNjcmlwdGlvbiJ9LEQuYS5jcmVhdGVFbGVtZW50KEsse3NvdXJjZTpJfSkpKSxNP0QuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Im9wYmxvY2stZXh0ZXJuYWwtZG9jcy13cmFwcGVyIn0sRC5hLmNyZWF0ZUVsZW1lbnQoImg0Iix7Y2xhc3NOYW1lOiJvcGJsb2NrLXRpdGxlX25vcm1hbCJ9LCJGaW5kIG1vcmUgZGV0YWlscyIpLEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Im9wYmxvY2stZXh0ZXJuYWwtZG9jcyJ9LEQuYS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJvcGJsb2NrLWV4dGVybmFsLWRvY3NfX2Rlc2NyaXB0aW9uIn0sRC5hLmNyZWF0ZUVsZW1lbnQoSyx7c291cmNlOlAuZGVzY3JpcHRpb259KSksRC5hLmNyZWF0ZUVsZW1lbnQoUSx7dGFyZ2V0OiJfYmxhbmsiLGNsYXNzTmFtZToib3BibG9jay1leHRlcm5hbC1kb2NzX19saW5rIixocmVmOk9iamVjdCgkLkYpKE0pfSxNKSkpOm51bGwsUiYmUi5zaXplP0QuYS5jcmVhdGVFbGVtZW50KFYse3BhcmFtZXRlcnM6QixzcGVjUGF0aDp0LnB1c2goInBhcmFtZXRlcnMiKSxvcGVyYXRpb246UixvbkNoYW5nZUtleTpuZSxvblRyeW91dENsaWNrOmksb25DYW5jZWxDbGljazpzLHRyeUl0T3V0RW5hYmxlZDpqLGFsbG93VHJ5SXRPdXQ6TyxmbjpjLGdldENvbXBvbmVudDpsLHNwZWNBY3Rpb25zOmYsc3BlY1NlbGVjdG9yczpoLHBhdGhNZXRob2Q6W3gsRV0sZ2V0Q29uZmlnczpwLG9hczNBY3Rpb25zOnYsb2FzM1NlbGVjdG9yczpnfSk6bnVsbCxqP0QuYS5jcmVhdGVFbGVtZW50KEcse2dldENvbXBvbmVudDpsLHBhdGg6eCxtZXRob2Q6RSxvcGVyYXRpb25TZXJ2ZXJzOlIuZ2V0KCJzZXJ2ZXJzIikscGF0aFNlcnZlcnM6aC5wYXRocygpLmdldEluKFt4LCJzZXJ2ZXJzIl0pLGdldFNlbGVjdGVkU2VydmVyOmcuc2VsZWN0ZWRTZXJ2ZXIsc2V0U2VsZWN0ZWRTZXJ2ZXI6di5zZXRTZWxlY3RlZFNlcnZlcixzZXRTZXJ2ZXJWYXJpYWJsZVZhbHVlOnYuc2V0U2VydmVyVmFyaWFibGVWYWx1ZSxnZXRTZXJ2ZXJWYXJpYWJsZTpnLnNlcnZlclZhcmlhYmxlVmFsdWUsZ2V0RWZmZWN0aXZlU2VydmVyVmFsdWU6Zy5zZXJ2ZXJFZmZlY3RpdmVWYWx1ZX0pOm51bGwsaiYmTyYmTiYmTi5zaXplP0QuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Im9wYmxvY2stc2NoZW1lcyJ9LEQuYS5jcmVhdGVFbGVtZW50KFkse3NjaGVtZXM6TixwYXRoOngsbWV0aG9kOkUsc3BlY0FjdGlvbnM6ZixjdXJyZW50U2NoZW1lOkZ9KSk6bnVsbCxELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOmomJnImJk8/ImJ0bi1ncm91cCI6ImV4ZWN1dGUtd3JhcHBlciJ9LGomJk8/RC5hLmNyZWF0ZUVsZW1lbnQoVyx7b3BlcmF0aW9uOlIsc3BlY0FjdGlvbnM6ZixzcGVjU2VsZWN0b3JzOmgsb2FzM1NlbGVjdG9yczpnLG9hczNBY3Rpb25zOnYscGF0aDp4LG1ldGhvZDpFLG9uRXhlY3V0ZTp1LGRpc2FibGVkOlR9KTpudWxsLGomJnImJk8/RC5hLmNyZWF0ZUVsZW1lbnQoSCx7c3BlY0FjdGlvbnM6ZixwYXRoOngsbWV0aG9kOkV9KTpudWxsKSxUP0QuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImxvYWRpbmctY29udGFpbmVyIn0sRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToibG9hZGluZyJ9KSk6bnVsbCxMP0QuYS5jcmVhdGVFbGVtZW50KHose3Jlc3BvbnNlczpMLHJlcXVlc3Q6byx0cnlJdE91dFJlc3BvbnNlOnIsZ2V0Q29tcG9uZW50OmwsZ2V0Q29uZmlnczpwLHNwZWNTZWxlY3RvcnM6aCxvYXMzQWN0aW9uczp2LG9hczNTZWxlY3RvcnM6ZyxzcGVjQWN0aW9uczpmLHByb2R1Y2VzOmgucHJvZHVjZXNPcHRpb25zRm9yKFt4LEVdKSxwcm9kdWNlc1ZhbHVlOmguY3VycmVudFByb2R1Y2VzRm9yKFt4LEVdKSxzcGVjUGF0aDp0LnB1c2goInJlc3BvbnNlcyIpLHBhdGg6eCxtZXRob2Q6RSxkaXNwbGF5UmVxdWVzdER1cmF0aW9uOmssZm46Y30pOm51bGwsZWUmJnEuc2l6ZT9ELmEuY3JlYXRlRWxlbWVudChaLHtleHRlbnNpb25zOnEsZ2V0Q29tcG9uZW50Omx9KTpudWxsKSkpfX1dKSxyfShSLlB1cmVDb21wb25lbnQpO3koKShsdCwiZGVmYXVsdFByb3BzIix7b3BlcmF0aW9uOm51bGwscmVzcG9uc2U6bnVsbCxyZXF1ZXN0Om51bGwsc3BlY1BhdGg6T2JqZWN0KEIuTGlzdCkoKSxzdW1tYXJ5OiIifSk7dmFyIHB0PW4oMTAwKSxmdD1uLm4ocHQpLGh0PWZ1bmN0aW9uKGUpe3llKCkobixlKTt2YXIgdD1fZSgpKG4pO2Z1bmN0aW9uIG4oKXtyZXR1cm4gXygpKHRoaXMsbiksdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIHgoKShuLFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzLnByb3BzLG49dC5pc1Nob3duLHI9dC50b2dnbGVTaG93bixvPXQuZ2V0Q29tcG9uZW50LGE9dC5hdXRoQWN0aW9ucyxpPXQuYXV0aFNlbGVjdG9ycyxzPXQub3BlcmF0aW9uUHJvcHMsYz10LnNwZWNQYXRoLGw9cy50b0pTKCkscD1sLnN1bW1hcnksZj1sLmlzQXV0aG9yaXplZCxoPWwubWV0aG9kLGQ9bC5vcCxtPWwuc2hvd1N1bW1hcnksdj1sLnBhdGgsZz1sLm9wZXJhdGlvbklkLHk9bC5vcmlnaW5hbE9wZXJhdGlvbklkLGI9bC5kaXNwbGF5T3BlcmF0aW9uSWQsXz1kLnN1bW1hcnksdz1zLmdldCgic2VjdXJpdHkiKSx4PW8oImF1dGhvcml6ZU9wZXJhdGlvbkJ0biIpLEU9bygiT3BlcmF0aW9uU3VtbWFyeU1ldGhvZCIpLFM9bygiT3BlcmF0aW9uU3VtbWFyeVBhdGgiKSxDPW8oIkp1bXBUb1BhdGgiLCEwKSxBPXcmJiEhdy5jb3VudCgpLE89QSYmMT09PXcuc2l6ZSYmdy5maXJzdCgpLmlzRW1wdHkoKSxrPSFBfHxPO3JldHVybiBELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJvcGJsb2NrLXN1bW1hcnkgb3BibG9jay1zdW1tYXJ5LSIuY29uY2F0KGgpfSxELmEuY3JlYXRlRWxlbWVudCgiYnV0dG9uIix7ImFyaWEtbGFiZWwiOnUoKShlPSIiLmNvbmNhdChoLCIgIikpLmNhbGwoZSx2LnJlcGxhY2UoL1wvL2csIuKAiy8iKSksImFyaWEtZXhwYW5kZWQiOm4sY2xhc3NOYW1lOiJvcGJsb2NrLXN1bW1hcnktY29udHJvbCIsb25DbGljazpyfSxELmEuY3JlYXRlRWxlbWVudChFLHttZXRob2Q6aH0pLEQuYS5jcmVhdGVFbGVtZW50KFMse2dldENvbXBvbmVudDpvLG9wZXJhdGlvblByb3BzOnMsc3BlY1BhdGg6Y30pLG0/RC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToib3BibG9jay1zdW1tYXJ5LWRlc2NyaXB0aW9uIn0sZnQoKShffHxwKSk6bnVsbCxiJiYoeXx8Zyk/RC5hLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Im9wYmxvY2stc3VtbWFyeS1vcGVyYXRpb24taWQifSx5fHxnKTpudWxsLEQuYS5jcmVhdGVFbGVtZW50KCJzdmciLHtjbGFzc05hbWU6ImFycm93Iix3aWR0aDoiMjAiLGhlaWdodDoiMjAiLCJhcmlhLWhpZGRlbiI6InRydWUiLGZvY3VzYWJsZToiZmFsc2UifSxELmEuY3JlYXRlRWxlbWVudCgidXNlIix7aHJlZjpuPyIjbGFyZ2UtYXJyb3ctdXAiOiIjbGFyZ2UtYXJyb3ctZG93biIseGxpbmtIcmVmOm4/IiNsYXJnZS1hcnJvdy11cCI6IiNsYXJnZS1hcnJvdy1kb3duIn0pKSksaz9udWxsOkQuYS5jcmVhdGVFbGVtZW50KHgse2lzQXV0aG9yaXplZDpmLG9uQ2xpY2s6ZnVuY3Rpb24oKXt2YXIgZT1pLmRlZmluaXRpb25zRm9yUmVxdWlyZW1lbnRzKHcpO2Euc2hvd0RlZmluaXRpb25zKGUpfX0pLEQuYS5jcmVhdGVFbGVtZW50KEMse3BhdGg6Y30pKX19XSksbn0oUi5QdXJlQ29tcG9uZW50KTt5KCkoaHQsImRlZmF1bHRQcm9wcyIse29wZXJhdGlvblByb3BzOm51bGwsc3BlY1BhdGg6T2JqZWN0KEIuTGlzdCkoKSxzdW1tYXJ5OiIifSk7dmFyIGR0PWZ1bmN0aW9uKGUpe3llKCkobixlKTt2YXIgdD1fZSgpKG4pO2Z1bmN0aW9uIG4oKXtyZXR1cm4gXygpKHRoaXMsbiksdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIHgoKShuLFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcy5tZXRob2Q7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJvcGJsb2NrLXN1bW1hcnktbWV0aG9kIn0sZS50b1VwcGVyQ2FzZSgpKX19XSksbn0oUi5QdXJlQ29tcG9uZW50KTt5KCkoZHQsImRlZmF1bHRQcm9wcyIse29wZXJhdGlvblByb3BzOm51bGx9KTt2YXIgbXQ9bigyMTMpLHZ0PW4ubihtdCksZ3Q9ZnVuY3Rpb24oZSl7eWUoKShuLGUpO3ZhciB0PV9lKCkobik7ZnVuY3Rpb24gbigpe3JldHVybiBfKCkodGhpcyxuKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4geCgpKG4sW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD10aGlzLnByb3BzLG49dC5nZXRDb21wb25lbnQscj10Lm9wZXJhdGlvblByb3BzLnRvSlMoKSxvPXIuZGVwcmVjYXRlZCxhPXIuaXNTaG93bixpPXIucGF0aCxzPXIudGFnLGM9ci5vcGVyYXRpb25JZCxsPXIuaXNEZWVwTGlua2luZ0VuYWJsZWQscD1pLnNwbGl0KC8oPz1cLykvZyksZj0xO2Y8cC5sZW5ndGg7Zis9Mil2dCgpKHApLmNhbGwocCxmLDAsRC5hLmNyZWF0ZUVsZW1lbnQoIndiciIse2tleTpmfSkpO3ZhciBoPW4oIkRlZXBMaW5rIik7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOm8/Im9wYmxvY2stc3VtbWFyeS1wYXRoX19kZXByZWNhdGVkIjoib3BibG9jay1zdW1tYXJ5LXBhdGgiLCJkYXRhLXBhdGgiOml9LEQuYS5jcmVhdGVFbGVtZW50KGgse2VuYWJsZWQ6bCxpc1Nob3duOmEscGF0aDpPYmplY3QoJC5kKSh1KCkoZT0iIi5jb25jYXQocywiLyIpKS5jYWxsKGUsYykpLHRleHQ6cH0pKX19XSksbn0oUi5QdXJlQ29tcG9uZW50KSx5dD1uKDEzKSxidD1uLm4oeXQpLF90PWZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5leHRlbnNpb25zLHI9KDAsZS5nZXRDb21wb25lbnQpKCJPcGVyYXRpb25FeHRSb3ciKTtyZXR1cm4gRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToib3BibG9jay1zZWN0aW9uIn0sRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToib3BibG9jay1zZWN0aW9uLWhlYWRlciJ9LEQuYS5jcmVhdGVFbGVtZW50KCJoNCIsbnVsbCwiRXh0ZW5zaW9ucyIpKSxELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJ0YWJsZS1jb250YWluZXIifSxELmEuY3JlYXRlRWxlbWVudCgidGFibGUiLG51bGwsRC5hLmNyZWF0ZUVsZW1lbnQoInRoZWFkIixudWxsLEQuYS5jcmVhdGVFbGVtZW50KCJ0ciIsbnVsbCxELmEuY3JlYXRlRWxlbWVudCgidGQiLHtjbGFzc05hbWU6ImNvbF9oZWFkZXIifSwiRmllbGQiKSxELmEuY3JlYXRlRWxlbWVudCgidGQiLHtjbGFzc05hbWU6ImNvbF9oZWFkZXIifSwiVmFsdWUiKSkpLEQuYS5jcmVhdGVFbGVtZW50KCJ0Ym9keSIsbnVsbCxNKCkodD1uLmVudHJ5U2VxKCkpLmNhbGwodCwoZnVuY3Rpb24oZSl7dmFyIHQsbj1idCgpKGUsMiksbz1uWzBdLGE9blsxXTtyZXR1cm4gRC5hLmNyZWF0ZUVsZW1lbnQocix7a2V5OnUoKSh0PSIiLmNvbmNhdChvLCItIikpLmNhbGwodCxhKSx4S2V5Om8seFZhbDphfSl9KSkpKSkpfSx3dD1mdW5jdGlvbihlKXt2YXIgdD1lLnhLZXksbj1lLnhWYWwscj1uP24udG9KUz9uLnRvSlMoKTpuOm51bGw7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJ0ciIsbnVsbCxELmEuY3JlYXRlRWxlbWVudCgidGQiLG51bGwsdCksRC5hLmNyZWF0ZUVsZW1lbnQoInRkIixudWxsLGQoKShyKSkpfSx4dD1uKDM1NCksRXQ9bi5uKHh0KSxTdD1uKDM1NSksQ3Q9bi5uKFN0KSxBdD1uKDIxKSxPdD1uLm4oQXQpLGt0PW4oMjE0KSxqdD1uLm4oa3QpLFR0PW4oOTQpLEl0PW4oNDMpLFB0PW4ubihJdCksTnQ9big1MzApLE10PW4ubihOdCksUnQ9bigxNDgpLER0PW5ldyBqdC5hLEx0PWZ1bmN0aW9uKGUpe3llKCkobixlKTt2YXIgdD1fZSgpKG4pO2Z1bmN0aW9uIG4oKXt2YXIgZSxyO18oKSh0aGlzLG4pO2Zvcih2YXIgbz1hcmd1bWVudHMubGVuZ3RoLGE9bmV3IEFycmF5KG8pLGk9MDtpPG87aSsrKWFbaV09YXJndW1lbnRzW2ldO3JldHVybiByPXQuY2FsbC5hcHBseSh0LHUoKShlPVt0aGlzXSkuY2FsbChlLGEpKSxEdC5zZXQodmUoKShyKSx7d3JpdGFibGU6ITAsdmFsdWU6dm9pZCAwfSkseSgpKHZlKCkociksImRvd25sb2FkVGV4dCIsKGZ1bmN0aW9uKCl7TXQoKShyLnByb3BzLnZhbHVlLHIucHJvcHMuZmlsZU5hbWV8fCJyZXNwb25zZS50eHQiKX0pKSx5KCkodmUoKShyKSwiaGFuZGxlUm9vdFJlZiIsKGZ1bmN0aW9uKGUpe3ZhciB0O251bGw9PT1lP0N0KCkodmUoKShyKSxEdCxlKTpDdCgpKHZlKCkociksRHQsbCgpKHQ9emUoKShlLmNoaWxkTm9kZXMpKS5jYWxsKHQsKGZ1bmN0aW9uKGUpe3JldHVybiEhZS5ub2RlVHlwZSYmZS5jbGFzc0xpc3QuY29udGFpbnMoIm1pY3JvbGlnaHQiKX0pKSl9KSkseSgpKHZlKCkociksInByZXZlbnRZU2Nyb2xsaW5nQmV5b25kRWxlbWVudCIsKGZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0LG49ZS5kZWx0YVkscj10LnNjcm9sbEhlaWdodCxvPXQub2Zmc2V0SGVpZ2h0LGE9dC5zY3JvbGxUb3A7cj5vJiYoMD09PWEmJm48MHx8bythPj1yJiZuPjApJiZlLnByZXZlbnREZWZhdWx0KCl9KSkscn1yZXR1cm4geCgpKG4sW3trZXk6ImNvbXBvbmVudERpZE1vdW50Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlLHQ9dGhpcztudWxsPT09KGU9RXQoKSh0aGlzLER0KSl8fHZvaWQgMD09PWV8fE90KCkoZSkuY2FsbChlLChmdW5jdGlvbihlKXtyZXR1cm4gZS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXdoZWVsIix0LnByZXZlbnRZU2Nyb2xsaW5nQmV5b25kRWxlbWVudCx7cGFzc2l2ZTohMX0pfSkpfX0se2tleToiY29tcG9uZW50V2lsbFVubW91bnQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzO251bGw9PT0oZT1FdCgpKHRoaXMsRHQpKXx8dm9pZCAwPT09ZXx8T3QoKShlKS5jYWxsKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNld2hlZWwiLHQucHJldmVudFlTY3JvbGxpbmdCZXlvbmRFbGVtZW50KX0pKX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLHQ9ZS52YWx1ZSxuPWUuY2xhc3NOYW1lLHI9ZS5kb3dubG9hZGFibGUsbz1lLmdldENvbmZpZ3MsYT1lLmNhbkNvcHksaT1lLmxhbmd1YWdlLHM9bz9vKCk6e3N5bnRheEhpZ2hsaWdodDp7YWN0aXZhdGVkOiEwLHRoZW1lOiJhZ2F0ZSJ9fTtuPW58fCIiO3ZhciB1PVB0KCkocywic3ludGF4SGlnaGxpZ2h0LmFjdGl2YXRlZCIpP0QuYS5jcmVhdGVFbGVtZW50KFR0LmEse2xhbmd1YWdlOmksY2xhc3NOYW1lOm4rIiBtaWNyb2xpZ2h0IixzdHlsZTpPYmplY3QoVHQuYikoUHQoKShzLCJzeW50YXhIaWdobGlnaHQudGhlbWUiKSl9LHQpOkQuYS5jcmVhdGVFbGVtZW50KCJwcmUiLHtjbGFzc05hbWU6bisiIG1pY3JvbGlnaHQifSx0KTtyZXR1cm4gRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiaGlnaGxpZ2h0LWNvZGUiLHJlZjp0aGlzLmhhbmRsZVJvb3RSZWZ9LHI/RC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiZG93bmxvYWQtY29udGVudHMiLG9uQ2xpY2s6dGhpcy5kb3dubG9hZFRleHR9LCJEb3dubG9hZCIpOm51bGwsYT9ELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJjb3B5LXRvLWNsaXBib2FyZCJ9LEQuYS5jcmVhdGVFbGVtZW50KFJ0LkNvcHlUb0NsaXBib2FyZCx7dGV4dDp0fSxELmEuY3JlYXRlRWxlbWVudCgiYnV0dG9uIixudWxsKSkpOm51bGwsdSl9fV0pLG59KFIuQ29tcG9uZW50KTt2YXIgQnQ9ZnVuY3Rpb24oZSl7eWUoKShuLGUpO3ZhciB0PV9lKCkobik7ZnVuY3Rpb24gbigpe3ZhciBlLHI7XygpKHRoaXMsbik7Zm9yKHZhciBvPWFyZ3VtZW50cy5sZW5ndGgsYT1uZXcgQXJyYXkobyksaT0wO2k8bztpKyspYVtpXT1hcmd1bWVudHNbaV07cmV0dXJuIHI9dC5jYWxsLmFwcGx5KHQsdSgpKGU9W3RoaXNdKS5jYWxsKGUsYSkpLHkoKSh2ZSgpKHIpLCJvbkNoYW5nZVByb2R1Y2VzV3JhcHBlciIsKGZ1bmN0aW9uKGUpe3JldHVybiByLnByb3BzLnNwZWNBY3Rpb25zLmNoYW5nZVByb2R1Y2VzVmFsdWUoW3IucHJvcHMucGF0aCxyLnByb3BzLm1ldGhvZF0sZSl9KSkseSgpKHZlKCkociksIm9uUmVzcG9uc2VDb250ZW50VHlwZUNoYW5nZSIsKGZ1bmN0aW9uKGUpe3ZhciB0PWUuY29udHJvbHNBY2NlcHRIZWFkZXIsbj1lLnZhbHVlLG89ci5wcm9wcyxhPW8ub2FzM0FjdGlvbnMsaT1vLnBhdGgscz1vLm1ldGhvZDt0JiZhLnNldFJlc3BvbnNlQ29udGVudFR5cGUoe3ZhbHVlOm4scGF0aDppLG1ldGhvZDpzfSl9KSkscn1yZXR1cm4geCgpKG4sW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZSx0LHI9dGhpcyxvPXRoaXMucHJvcHMsYT1vLnJlc3BvbnNlcyxpPW8udHJ5SXRPdXRSZXNwb25zZSxzPW8uZ2V0Q29tcG9uZW50LGM9by5nZXRDb25maWdzLGw9by5zcGVjU2VsZWN0b3JzLHA9by5mbixmPW8ucHJvZHVjZXNWYWx1ZSxoPW8uZGlzcGxheVJlcXVlc3REdXJhdGlvbixkPW8uc3BlY1BhdGgsbT1vLnBhdGgsdj1vLm1ldGhvZCxnPW8ub2FzM1NlbGVjdG9ycyx5PW8ub2FzM0FjdGlvbnMsYj1PYmplY3QoJC5mKShhKSxfPXMoImNvbnRlbnRUeXBlIiksdz1zKCJsaXZlUmVzcG9uc2UiKSx4PXMoInJlc3BvbnNlIiksRT10aGlzLnByb3BzLnByb2R1Y2VzJiZ0aGlzLnByb3BzLnByb2R1Y2VzLnNpemU/dGhpcy5wcm9wcy5wcm9kdWNlczpuLmRlZmF1bHRQcm9wcy5wcm9kdWNlcyxTPWwuaXNPQVMzKCk/T2JqZWN0KCQuaykoYSk6bnVsbCxDPWZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXToiXyI7cmV0dXJuIGUucmVwbGFjZSgvW15cdy1dL2csdCl9KHUoKShlPSIiLmNvbmNhdCh2KSkuY2FsbChlLG0sIl9yZXNwb25zZXMiKSksQT0iIi5jb25jYXQoQywiX3NlbGVjdCIpO3JldHVybiBELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJyZXNwb25zZXMtd3JhcHBlciJ9LEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Im9wYmxvY2stc2VjdGlvbi1oZWFkZXIifSxELmEuY3JlYXRlRWxlbWVudCgiaDQiLG51bGwsIlJlc3BvbnNlcyIpLGwuaXNPQVMzKCk/bnVsbDpELmEuY3JlYXRlRWxlbWVudCgibGFiZWwiLHtodG1sRm9yOkF9LEQuYS5jcmVhdGVFbGVtZW50KCJzcGFuIixudWxsLCJSZXNwb25zZSBjb250ZW50IHR5cGUiKSxELmEuY3JlYXRlRWxlbWVudChfLHt2YWx1ZTpmLGFyaWFDb250cm9sczpDLGFyaWFMYWJlbDoiUmVzcG9uc2UgY29udGVudCB0eXBlIixjbGFzc05hbWU6ImV4ZWN1dGUtY29udGVudC10eXBlIixjb250ZW50VHlwZXM6RSxjb250cm9sSWQ6QSxvbkNoYW5nZTp0aGlzLm9uQ2hhbmdlUHJvZHVjZXNXcmFwcGVyfSkpKSxELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJyZXNwb25zZXMtaW5uZXIifSxpP0QuYS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsRC5hLmNyZWF0ZUVsZW1lbnQodyx7cmVzcG9uc2U6aSxnZXRDb21wb25lbnQ6cyxnZXRDb25maWdzOmMsc3BlY1NlbGVjdG9yczpsLHBhdGg6dGhpcy5wcm9wcy5wYXRoLG1ldGhvZDp0aGlzLnByb3BzLm1ldGhvZCxkaXNwbGF5UmVxdWVzdER1cmF0aW9uOmh9KSxELmEuY3JlYXRlRWxlbWVudCgiaDQiLG51bGwsIlJlc3BvbnNlcyIpKTpudWxsLEQuYS5jcmVhdGVFbGVtZW50KCJ0YWJsZSIseyJhcmlhLWxpdmUiOiJwb2xpdGUiLGNsYXNzTmFtZToicmVzcG9uc2VzLXRhYmxlIixpZDpDLHJvbGU6InJlZ2lvbiJ9LEQuYS5jcmVhdGVFbGVtZW50KCJ0aGVhZCIsbnVsbCxELmEuY3JlYXRlRWxlbWVudCgidHIiLHtjbGFzc05hbWU6InJlc3BvbnNlcy1oZWFkZXIifSxELmEuY3JlYXRlRWxlbWVudCgidGQiLHtjbGFzc05hbWU6ImNvbF9oZWFkZXIgcmVzcG9uc2UtY29sX3N0YXR1cyJ9LCJDb2RlIiksRC5hLmNyZWF0ZUVsZW1lbnQoInRkIix7Y2xhc3NOYW1lOiJjb2xfaGVhZGVyIHJlc3BvbnNlLWNvbF9kZXNjcmlwdGlvbiJ9LCJEZXNjcmlwdGlvbiIpLGwuaXNPQVMzKCk/RC5hLmNyZWF0ZUVsZW1lbnQoInRkIix7Y2xhc3NOYW1lOiJjb2wgY29sX2hlYWRlciByZXNwb25zZS1jb2xfbGlua3MifSwiTGlua3MiKTpudWxsKSksRC5hLmNyZWF0ZUVsZW1lbnQoInRib2R5IixudWxsLE0oKSh0PWEuZW50cnlTZXEoKSkuY2FsbCh0LChmdW5jdGlvbihlKXt2YXIgdD1idCgpKGUsMiksbj10WzBdLG89dFsxXSxhPWkmJmkuZ2V0KCJzdGF0dXMiKT09bj8icmVzcG9uc2VfY3VycmVudCI6IiI7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KHgse2tleTpuLHBhdGg6bSxtZXRob2Q6dixzcGVjUGF0aDpkLnB1c2gobiksaXNEZWZhdWx0OmI9PT1uLGZuOnAsY2xhc3NOYW1lOmEsY29kZTpuLHJlc3BvbnNlOm8sc3BlY1NlbGVjdG9yczpsLGNvbnRyb2xzQWNjZXB0SGVhZGVyOm89PT1TLG9uQ29udGVudFR5cGVDaGFuZ2U6ci5vblJlc3BvbnNlQ29udGVudFR5cGVDaGFuZ2UsY29udGVudFR5cGU6ZixnZXRDb25maWdzOmMsYWN0aXZlRXhhbXBsZXNLZXk6Zy5hY3RpdmVFeGFtcGxlc01lbWJlcihtLHYsInJlc3BvbnNlcyIsbiksb2FzM0FjdGlvbnM6eSxnZXRDb21wb25lbnQ6c30pfSkpLnRvQXJyYXkoKSkpKSl9fV0pLG59KEQuYS5Db21wb25lbnQpO3koKShCdCwiZGVmYXVsdFByb3BzIix7dHJ5SXRPdXRSZXNwb25zZTpudWxsLHByb2R1Y2VzOk9iamVjdChCLmZyb21KUykoWyJhcHBsaWNhdGlvbi9qc29uIl0pLGRpc3BsYXlSZXF1ZXN0RHVyYXRpb246ITF9KTt2YXIgRnQ9bigyNCksVXQ9bi5uKEZ0KSxxdD1uKDUzMSksenQ9bi5uKHF0KSxWdD1uKDUwKSxXdD1uLm4oVnQpLEh0PW4oMTAzKSwkdD1mdW5jdGlvbihlKXt5ZSgpKG4sZSk7dmFyIHQ9X2UoKShuKTtmdW5jdGlvbiBuKGUscil7dmFyIG87cmV0dXJuIF8oKSh0aGlzLG4pLG89dC5jYWxsKHRoaXMsZSxyKSx5KCkodmUoKShvKSwiX29uQ29udGVudFR5cGVDaGFuZ2UiLChmdW5jdGlvbihlKXt2YXIgdD1vLnByb3BzLG49dC5vbkNvbnRlbnRUeXBlQ2hhbmdlLHI9dC5jb250cm9sc0FjY2VwdEhlYWRlcjtvLnNldFN0YXRlKHtyZXNwb25zZUNvbnRlbnRUeXBlOmV9KSxuKHt2YWx1ZTplLGNvbnRyb2xzQWNjZXB0SGVhZGVyOnJ9KX0pKSx5KCkodmUoKShvKSwiZ2V0VGFyZ2V0RXhhbXBsZXNLZXkiLChmdW5jdGlvbigpe3ZhciBlPW8ucHJvcHMsdD1lLnJlc3BvbnNlLG49ZS5jb250ZW50VHlwZSxyPWUuYWN0aXZlRXhhbXBsZXNLZXksYT1vLnN0YXRlLnJlc3BvbnNlQ29udGVudFR5cGV8fG4saT10LmdldEluKFsiY29udGVudCIsYV0sT2JqZWN0KEIuTWFwKSh7fSkpLmdldCgiZXhhbXBsZXMiLG51bGwpLmtleVNlcSgpLmZpcnN0KCk7cmV0dXJuIHJ8fGl9KSksby5zdGF0ZT17cmVzcG9uc2VDb250ZW50VHlwZToiIn0sb31yZXR1cm4geCgpKG4sW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZSx0LG4scixvLGE9dGhpcy5wcm9wcyxpPWEucGF0aCxzPWEubWV0aG9kLGM9YS5jb2RlLGw9YS5yZXNwb25zZSxwPWEuY2xhc3NOYW1lLGY9YS5zcGVjUGF0aCxoPWEuZm4sZD1hLmdldENvbXBvbmVudCxtPWEuZ2V0Q29uZmlncyx2PWEuc3BlY1NlbGVjdG9ycyxnPWEuY29udGVudFR5cGUseT1hLmNvbnRyb2xzQWNjZXB0SGVhZGVyLGI9YS5vYXMzQWN0aW9ucyxfPWguaW5mZXJTY2hlbWEsdz12LmlzT0FTMygpLHg9bSgpLnNob3dFeHRlbnNpb25zLEU9eD9PYmplY3QoJC5tKShsKTpudWxsLFM9bC5nZXQoImhlYWRlcnMiKSxDPWwuZ2V0KCJsaW5rcyIpLEE9ZCgiUmVzcG9uc2VFeHRlbnNpb24iKSxPPWQoImhlYWRlcnMiKSxrPWQoImhpZ2hsaWdodENvZGUiKSxqPWQoIm1vZGVsRXhhbXBsZSIpLFQ9ZCgiTWFya2Rvd24iLCEwKSxJPWQoIm9wZXJhdGlvbkxpbmsiKSxQPWQoImNvbnRlbnRUeXBlIiksTj1kKCJFeGFtcGxlc1NlbGVjdCIpLFI9ZCgiRXhhbXBsZSIpLEw9dGhpcy5zdGF0ZS5yZXNwb25zZUNvbnRlbnRUeXBlfHxnLEY9bC5nZXRJbihbImNvbnRlbnQiLExdLE9iamVjdChCLk1hcCkoe30pKSxVPUYuZ2V0KCJleGFtcGxlcyIsbnVsbCk7aWYodyl7dmFyIHE9Ri5nZXQoInNjaGVtYSIpO249cT9fKHEudG9KUygpKTpudWxsLHI9cT9PYmplY3QoQi5MaXN0KShbImNvbnRlbnQiLHRoaXMuc3RhdGUucmVzcG9uc2VDb250ZW50VHlwZSwic2NoZW1hIl0pOmZ9ZWxzZSBuPWwuZ2V0KCJzY2hlbWEiKSxyPWwuaGFzKCJzY2hlbWEiKT9mLnB1c2goInNjaGVtYSIpOmY7dmFyIHosVj0hMSxXPXtpbmNsdWRlUmVhZE9ubHk6ITB9O2lmKHcpe3ZhciBIO2lmKHo9bnVsbD09PShIPUYuZ2V0KCJzY2hlbWEiKSl8fHZvaWQgMD09PUg/dm9pZCAwOkgudG9KUygpLFUpe3ZhciBKPXRoaXMuZ2V0VGFyZ2V0RXhhbXBsZXNLZXkoKSxLPWZ1bmN0aW9uKGUpe3JldHVybiBlLmdldCgidmFsdWUiKX07dm9pZCAwPT09KG89SyhVLmdldChKLE9iamVjdChCLk1hcCkoe30pKSkpJiYobz1LKHp0KCkoVSkuY2FsbChVKS5uZXh0KCkudmFsdWUpKSxWPSEwfWVsc2Ugdm9pZCAwIT09Ri5nZXQoImV4YW1wbGUiKSYmKG89Ri5nZXQoImV4YW1wbGUiKSxWPSEwKX1lbHNle3o9bixXPVV0KCkoVXQoKSh7fSxXKSx7fSx7aW5jbHVkZVdyaXRlT25seTohMH0pO3ZhciBZPWwuZ2V0SW4oWyJleGFtcGxlcyIsTF0pO1kmJihvPVksVj0hMCl9dmFyIEc9ZnVuY3Rpb24oZSx0LG4pe2lmKG51bGwhPWUpe3ZhciByPW51bGw7cmV0dXJuIE9iamVjdChIdC5hKShlKSYmKHI9Impzb24iKSxELmEuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLEQuYS5jcmVhdGVFbGVtZW50KHQse2NsYXNzTmFtZToiZXhhbXBsZSIsZ2V0Q29uZmlnczpuLGxhbmd1YWdlOnIsdmFsdWU6T2JqZWN0KCQuSSkoZSl9KSl9cmV0dXJuIG51bGx9KE9iamVjdCgkLm8pKHosTCxXLFY/bzp2b2lkIDApLGssbSk7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJ0ciIse2NsYXNzTmFtZToicmVzcG9uc2UgIisocHx8IiIpLCJkYXRhLWNvZGUiOmN9LEQuYS5jcmVhdGVFbGVtZW50KCJ0ZCIse2NsYXNzTmFtZToicmVzcG9uc2UtY29sX3N0YXR1cyJ9LGMpLEQuYS5jcmVhdGVFbGVtZW50KCJ0ZCIse2NsYXNzTmFtZToicmVzcG9uc2UtY29sX2Rlc2NyaXB0aW9uIn0sRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToicmVzcG9uc2UtY29sX2Rlc2NyaXB0aW9uX19pbm5lciJ9LEQuYS5jcmVhdGVFbGVtZW50KFQse3NvdXJjZTpsLmdldCgiZGVzY3JpcHRpb24iKX0pKSx4JiZFLnNpemU/TSgpKGU9RS5lbnRyeVNlcSgpKS5jYWxsKGUsKGZ1bmN0aW9uKGUpe3ZhciB0LG49YnQoKShlLDIpLHI9blswXSxvPW5bMV07cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KEEse2tleTp1KCkodD0iIi5jb25jYXQociwiLSIpKS5jYWxsKHQsbykseEtleTpyLHhWYWw6b30pfSkpOm51bGwsdyYmbC5nZXQoImNvbnRlbnQiKT9ELmEuY3JlYXRlRWxlbWVudCgic2VjdGlvbiIse2NsYXNzTmFtZToicmVzcG9uc2UtY29udHJvbHMifSxELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOld0KCkoInJlc3BvbnNlLWNvbnRyb2wtbWVkaWEtdHlwZSIseyJyZXNwb25zZS1jb250cm9sLW1lZGlhLXR5cGUtLWFjY2VwdC1jb250cm9sbGVyIjp5fSl9LEQuYS5jcmVhdGVFbGVtZW50KCJzbWFsbCIse2NsYXNzTmFtZToicmVzcG9uc2UtY29udHJvbC1tZWRpYS10eXBlX190aXRsZSJ9LCJNZWRpYSB0eXBlIiksRC5hLmNyZWF0ZUVsZW1lbnQoUCx7dmFsdWU6dGhpcy5zdGF0ZS5yZXNwb25zZUNvbnRlbnRUeXBlLGNvbnRlbnRUeXBlczpsLmdldCgiY29udGVudCIpP2wuZ2V0KCJjb250ZW50Iikua2V5U2VxKCk6T2JqZWN0KEIuU2VxKSgpLG9uQ2hhbmdlOnRoaXMuX29uQ29udGVudFR5cGVDaGFuZ2UsYXJpYUxhYmVsOiJNZWRpYSBUeXBlIn0pLHk/RC5hLmNyZWF0ZUVsZW1lbnQoInNtYWxsIix7Y2xhc3NOYW1lOiJyZXNwb25zZS1jb250cm9sLW1lZGlhLXR5cGVfX2FjY2VwdC1tZXNzYWdlIn0sIkNvbnRyb2xzICIsRC5hLmNyZWF0ZUVsZW1lbnQoImNvZGUiLG51bGwsIkFjY2VwdCIpLCIgaGVhZGVyLiIpOm51bGwpLFU/RC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToicmVzcG9uc2UtY29udHJvbC1leGFtcGxlcyJ9LEQuYS5jcmVhdGVFbGVtZW50KCJzbWFsbCIse2NsYXNzTmFtZToicmVzcG9uc2UtY29udHJvbC1leGFtcGxlc19fdGl0bGUifSwiRXhhbXBsZXMiKSxELmEuY3JlYXRlRWxlbWVudChOLHtleGFtcGxlczpVLGN1cnJlbnRFeGFtcGxlS2V5OnRoaXMuZ2V0VGFyZ2V0RXhhbXBsZXNLZXkoKSxvblNlbGVjdDpmdW5jdGlvbihlKXtyZXR1cm4gYi5zZXRBY3RpdmVFeGFtcGxlc01lbWJlcih7bmFtZTplLHBhdGhNZXRob2Q6W2ksc10sY29udGV4dFR5cGU6InJlc3BvbnNlcyIsY29udGV4dE5hbWU6Y30pfSxzaG93TGFiZWxzOiExfSkpOm51bGwpOm51bGwsR3x8bj9ELmEuY3JlYXRlRWxlbWVudChqLHtzcGVjUGF0aDpyLGdldENvbXBvbmVudDpkLGdldENvbmZpZ3M6bSxzcGVjU2VsZWN0b3JzOnYsc2NoZW1hOk9iamVjdCgkLmkpKG4pLGV4YW1wbGU6RyxpbmNsdWRlUmVhZE9ubHk6ITB9KTpudWxsLHcmJlU/RC5hLmNyZWF0ZUVsZW1lbnQoUix7ZXhhbXBsZTpVLmdldCh0aGlzLmdldFRhcmdldEV4YW1wbGVzS2V5KCksT2JqZWN0KEIuTWFwKSh7fSkpLGdldENvbXBvbmVudDpkLGdldENvbmZpZ3M6bSxvbWl0VmFsdWU6ITB9KTpudWxsLFM/RC5hLmNyZWF0ZUVsZW1lbnQoTyx7aGVhZGVyczpTLGdldENvbXBvbmVudDpkfSk6bnVsbCksdz9ELmEuY3JlYXRlRWxlbWVudCgidGQiLHtjbGFzc05hbWU6InJlc3BvbnNlLWNvbF9saW5rcyJ9LEM/TSgpKHQ9Qy50b1NlcSgpLmVudHJ5U2VxKCkpLmNhbGwodCwoZnVuY3Rpb24oZSl7dmFyIHQ9YnQoKShlLDIpLG49dFswXSxyPXRbMV07cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KEkse2tleTpuLG5hbWU6bixsaW5rOnIsZ2V0Q29tcG9uZW50OmR9KX0pKTpELmEuY3JlYXRlRWxlbWVudCgiaSIsbnVsbCwiTm8gbGlua3MiKSk6bnVsbCl9fV0pLG59KEQuYS5Db21wb25lbnQpO3koKSgkdCwiZGVmYXVsdFByb3BzIix7cmVzcG9uc2U6T2JqZWN0KEIuZnJvbUpTKSh7fSksb25Db250ZW50VHlwZUNoYW5nZTpmdW5jdGlvbigpe319KTt2YXIgSnQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS54S2V5LG49ZS54VmFsO3JldHVybiBELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJyZXNwb25zZV9fZXh0ZW5zaW9uIn0sdCwiOiAiLFN0cmluZyhuKSl9LEt0PW4oNTMyKSxZdD1uLm4oS3QpLEd0PW4oNTMzKSxadD1uLm4oR3QpLFh0PW4oMzU2KSxRdD1uLm4oWHQpLGVuPWZ1bmN0aW9uKGUpe3llKCkobixlKTt2YXIgdD1fZSgpKG4pO2Z1bmN0aW9uIG4oKXt2YXIgZSxyO18oKSh0aGlzLG4pO2Zvcih2YXIgbz1hcmd1bWVudHMubGVuZ3RoLGE9bmV3IEFycmF5KG8pLGk9MDtpPG87aSsrKWFbaV09YXJndW1lbnRzW2ldO3JldHVybiByPXQuY2FsbC5hcHBseSh0LHUoKShlPVt0aGlzXSkuY2FsbChlLGEpKSx5KCkodmUoKShyKSwic3RhdGUiLHtwYXJzZWRDb250ZW50Om51bGx9KSx5KCkodmUoKShyKSwidXBkYXRlUGFyc2VkQ29udGVudCIsKGZ1bmN0aW9uKGUpe3ZhciB0PXIucHJvcHMuY29udGVudDtpZihlIT09dClpZih0JiZ0IGluc3RhbmNlb2YgQmxvYil7dmFyIG49bmV3IEZpbGVSZWFkZXI7bi5vbmxvYWQ9ZnVuY3Rpb24oKXtyLnNldFN0YXRlKHtwYXJzZWRDb250ZW50Om4ucmVzdWx0fSl9LG4ucmVhZEFzVGV4dCh0KX1lbHNlIHIuc2V0U3RhdGUoe3BhcnNlZENvbnRlbnQ6dC50b1N0cmluZygpfSl9KSkscn1yZXR1cm4geCgpKG4sW3trZXk6ImNvbXBvbmVudERpZE1vdW50Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMudXBkYXRlUGFyc2VkQ29udGVudChudWxsKX19LHtrZXk6ImNvbXBvbmVudERpZFVwZGF0ZSIsdmFsdWU6ZnVuY3Rpb24oZSl7dGhpcy51cGRhdGVQYXJzZWRDb250ZW50KGUuY29udGVudCl9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGUsdCxuPXRoaXMucHJvcHMscj1uLmNvbnRlbnQsbz1uLmNvbnRlbnRUeXBlLGE9bi51cmwsaT1uLmhlYWRlcnMscz12b2lkIDA9PT1pP3t9OmksdT1uLmdldENvbmZpZ3MsYz1uLmdldENvbXBvbmVudCxsPXRoaXMuc3RhdGUucGFyc2VkQ29udGVudCxwPWMoImhpZ2hsaWdodENvZGUiKSxmPSJyZXNwb25zZV8iKyhuZXcgRGF0ZSkuZ2V0VGltZSgpO2lmKGE9YXx8IiIsL15hcHBsaWNhdGlvblwvb2N0ZXQtc3RyZWFtL2kudGVzdChvKXx8c1siQ29udGVudC1EaXNwb3NpdGlvbiJdJiYvYXR0YWNobWVudC9pLnRlc3Qoc1siQ29udGVudC1EaXNwb3NpdGlvbiJdKXx8c1siY29udGVudC1kaXNwb3NpdGlvbiJdJiYvYXR0YWNobWVudC9pLnRlc3Qoc1siY29udGVudC1kaXNwb3NpdGlvbiJdKXx8c1siQ29udGVudC1EZXNjcmlwdGlvbiJdJiYvRmlsZSBUcmFuc2Zlci9pLnRlc3Qoc1siQ29udGVudC1EZXNjcmlwdGlvbiJdKXx8c1siY29udGVudC1kZXNjcmlwdGlvbiJdJiYvRmlsZSBUcmFuc2Zlci9pLnRlc3Qoc1siY29udGVudC1kZXNjcmlwdGlvbiJdKSlpZigiQmxvYiJpbiB3aW5kb3cpe3ZhciBoPW98fCJ0ZXh0L2h0bWwiLG09ciBpbnN0YW5jZW9mIEJsb2I/cjpuZXcgQmxvYihbcl0se3R5cGU6aH0pLHY9YXQuYS5jcmVhdGVPYmplY3RVUkwobSksZz1baCxhLnN1YnN0cihZdCgpKGEpLmNhbGwoYSwiLyIpKzEpLHZdLmpvaW4oIjoiKSx5PXNbImNvbnRlbnQtZGlzcG9zaXRpb24iXXx8c1siQ29udGVudC1EaXNwb3NpdGlvbiJdO2lmKHZvaWQgMCE9PXkpe3ZhciBiPU9iamVjdCgkLmgpKHkpO251bGwhPT1iJiYoZz1iKX10PUguYS5uYXZpZ2F0b3ImJkguYS5uYXZpZ2F0b3IubXNTYXZlT3JPcGVuQmxvYj9ELmEuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLEQuYS5jcmVhdGVFbGVtZW50KCJhIix7aHJlZjp2LG9uQ2xpY2s6ZnVuY3Rpb24oKXtyZXR1cm4gSC5hLm5hdmlnYXRvci5tc1NhdmVPck9wZW5CbG9iKG0sZyl9fSwiRG93bmxvYWQgZmlsZSIpKTpELmEuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLEQuYS5jcmVhdGVFbGVtZW50KCJhIix7aHJlZjp2LGRvd25sb2FkOmd9LCJEb3dubG9hZCBmaWxlIikpfWVsc2UgdD1ELmEuY3JlYXRlRWxlbWVudCgicHJlIix7Y2xhc3NOYW1lOiJtaWNyb2xpZ2h0In0sIkRvd25sb2FkIGhlYWRlcnMgZGV0ZWN0ZWQgYnV0IHlvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IGRvd25sb2FkaW5nIGJpbmFyeSB2aWEgWEhSIChCbG9iKS4iKTtlbHNlIGlmKC9qc29uL2kudGVzdChvKSl7dmFyIF89bnVsbDtPYmplY3QoSHQuYSkocikmJihfPSJqc29uIik7dHJ5e2U9ZCgpKEpTT04ucGFyc2UociksbnVsbCwiICAiKX1jYXRjaCh0KXtlPSJjYW4ndCBwYXJzZSBKU09OLiAgUmF3IHJlc3VsdDpcblxuIityfXQ9RC5hLmNyZWF0ZUVsZW1lbnQocCx7bGFuZ3VhZ2U6Xyxkb3dubG9hZGFibGU6ITAsZmlsZU5hbWU6IiIuY29uY2F0KGYsIi5qc29uIiksdmFsdWU6ZSxnZXRDb25maWdzOnUsY2FuQ29weTohMH0pfWVsc2UveG1sL2kudGVzdChvKT8oZT1adCgpKHIse3RleHROb2Rlc09uU2FtZUxpbmU6ITAsaW5kZW50b3I6IiAgIn0pLHQ9RC5hLmNyZWF0ZUVsZW1lbnQocCx7ZG93bmxvYWRhYmxlOiEwLGZpbGVOYW1lOiIiLmNvbmNhdChmLCIueG1sIiksdmFsdWU6ZSxnZXRDb25maWdzOnUsY2FuQ29weTohMH0pKTp0PSJ0ZXh0L2h0bWwiPT09UXQoKShvKXx8L3RleHRcL3BsYWluLy50ZXN0KG8pP0QuYS5jcmVhdGVFbGVtZW50KHAse2Rvd25sb2FkYWJsZTohMCxmaWxlTmFtZToiIi5jb25jYXQoZiwiLmh0bWwiKSx2YWx1ZTpyLGdldENvbmZpZ3M6dSxjYW5Db3B5OiEwfSk6InRleHQvY3N2Ij09PVF0KCkobyl8fC90ZXh0XC9jc3YvLnRlc3Qobyk/RC5hLmNyZWF0ZUVsZW1lbnQocCx7ZG93bmxvYWRhYmxlOiEwLGZpbGVOYW1lOiIiLmNvbmNhdChmLCIuY3N2IiksdmFsdWU6cixnZXRDb25maWdzOnUsY2FuQ29weTohMH0pOi9eaW1hZ2VcLy9pLnRlc3Qobyk/JGUoKShvKS5jYWxsKG8sInN2ZyIpP0QuYS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsIiAiLHIsIiAiKTpELmEuY3JlYXRlRWxlbWVudCgiaW1nIix7c3JjOmF0LmEuY3JlYXRlT2JqZWN0VVJMKHIpfSk6L15hdWRpb1wvL2kudGVzdChvKT9ELmEuY3JlYXRlRWxlbWVudCgicHJlIix7Y2xhc3NOYW1lOiJtaWNyb2xpZ2h0In0sRC5hLmNyZWF0ZUVsZW1lbnQoImF1ZGlvIix7Y29udHJvbHM6ITB9LEQuYS5jcmVhdGVFbGVtZW50KCJzb3VyY2UiLHtzcmM6YSx0eXBlOm99KSkpOiJzdHJpbmciPT10eXBlb2Ygcj9ELmEuY3JlYXRlRWxlbWVudChwLHtkb3dubG9hZGFibGU6ITAsZmlsZU5hbWU6IiIuY29uY2F0KGYsIi50eHQiKSx2YWx1ZTpyLGdldENvbmZpZ3M6dSxjYW5Db3B5OiEwfSk6ci5zaXplPjA/bD9ELmEuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLEQuYS5jcmVhdGVFbGVtZW50KCJwIix7Y2xhc3NOYW1lOiJpIn0sIlVucmVjb2duaXplZCByZXNwb25zZSB0eXBlOyBkaXNwbGF5aW5nIGNvbnRlbnQgYXMgdGV4dC4iKSxELmEuY3JlYXRlRWxlbWVudChwLHtkb3dubG9hZGFibGU6ITAsZmlsZU5hbWU6IiIuY29uY2F0KGYsIi50eHQiKSx2YWx1ZTpsLGdldENvbmZpZ3M6dSxjYW5Db3B5OiEwfSkpOkQuYS5jcmVhdGVFbGVtZW50KCJwIix7Y2xhc3NOYW1lOiJpIn0sIlVucmVjb2duaXplZCByZXNwb25zZSB0eXBlOyB1bmFibGUgdG8gZGlzcGxheS4iKTpudWxsO3JldHVybiB0P0QuYS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsRC5hLmNyZWF0ZUVsZW1lbnQoImg1IixudWxsLCJSZXNwb25zZSBib2R5IiksdCk6bnVsbH19XSksbn0oRC5hLlB1cmVDb21wb25lbnQpLHRuPW4oMTQpLG5uPW4ubih0bikscm49bigyMTEpLG9uPW4ubihybiksYW49ZnVuY3Rpb24oZSl7eWUoKShuLGUpO3ZhciB0PV9lKCkobik7ZnVuY3Rpb24gbihlKXt2YXIgcjtyZXR1cm4gXygpKHRoaXMsbikscj10LmNhbGwodGhpcyxlKSx5KCkodmUoKShyKSwib25DaGFuZ2UiLChmdW5jdGlvbihlLHQsbil7dmFyIG89ci5wcm9wczsoMCxvLnNwZWNBY3Rpb25zLmNoYW5nZVBhcmFtQnlJZGVudGl0eSkoby5vbkNoYW5nZUtleSxlLHQsbil9KSkseSgpKHZlKCkociksIm9uQ2hhbmdlQ29uc3VtZXNXcmFwcGVyIiwoZnVuY3Rpb24oZSl7dmFyIHQ9ci5wcm9wczsoMCx0LnNwZWNBY3Rpb25zLmNoYW5nZUNvbnN1bWVzVmFsdWUpKHQub25DaGFuZ2VLZXksZSl9KSkseSgpKHZlKCkociksInRvZ2dsZVRhYiIsKGZ1bmN0aW9uKGUpe3JldHVybiJwYXJhbWV0ZXJzIj09PWU/ci5zZXRTdGF0ZSh7cGFyYW1ldGVyc1Zpc2libGU6ITAsY2FsbGJhY2tWaXNpYmxlOiExfSk6ImNhbGxiYWNrcyI9PT1lP3Iuc2V0U3RhdGUoe2NhbGxiYWNrVmlzaWJsZTohMCxwYXJhbWV0ZXJzVmlzaWJsZTohMX0pOnZvaWQgMH0pKSx5KCkodmUoKShyKSwib25DaGFuZ2VNZWRpYVR5cGUiLChmdW5jdGlvbihlKXt2YXIgdD1lLnZhbHVlLG49ZS5wYXRoTWV0aG9kLG89ci5wcm9wcyxhPW8uc3BlY0FjdGlvbnMsaT1vLm9hczNTZWxlY3RvcnMscz1vLm9hczNBY3Rpb25zLHU9aS5oYXNVc2VyRWRpdGVkQm9keS5hcHBseShpLG5uKCkobikpLGM9aS5zaG91bGRSZXRhaW5SZXF1ZXN0Qm9keVZhbHVlLmFwcGx5KGksbm4oKShuKSk7cy5zZXRSZXF1ZXN0Q29udGVudFR5cGUoe3ZhbHVlOnQscGF0aE1ldGhvZDpufSkscy5pbml0UmVxdWVzdEJvZHlWYWxpZGF0ZUVycm9yKHtwYXRoTWV0aG9kOm59KSx1fHwoY3x8cy5zZXRSZXF1ZXN0Qm9keVZhbHVlKHt2YWx1ZTp2b2lkIDAscGF0aE1ldGhvZDpufSksYS5jbGVhclJlc3BvbnNlLmFwcGx5KGEsbm4oKShuKSksYS5jbGVhclJlcXVlc3QuYXBwbHkoYSxubigpKG4pKSxhLmNsZWFyVmFsaWRhdGVQYXJhbXMobikpfSkpLHIuc3RhdGU9e2NhbGxiYWNrVmlzaWJsZTohMSxwYXJhbWV0ZXJzVmlzaWJsZTohMH0scn1yZXR1cm4geCgpKG4sW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZSx0LG49dGhpcyxyPXRoaXMucHJvcHMsbz1yLm9uVHJ5b3V0Q2xpY2ssYT1yLnBhcmFtZXRlcnMsaT1yLmFsbG93VHJ5SXRPdXQscz1yLnRyeUl0T3V0RW5hYmxlZCxjPXIuc3BlY1BhdGgsbD1yLmZuLHA9ci5nZXRDb21wb25lbnQsZj1yLmdldENvbmZpZ3MsaD1yLnNwZWNTZWxlY3RvcnMsZD1yLnNwZWNBY3Rpb25zLG09ci5wYXRoTWV0aG9kLHY9ci5vYXMzQWN0aW9ucyxnPXIub2FzM1NlbGVjdG9ycyx5PXIub3BlcmF0aW9uLGI9cCgicGFyYW1ldGVyUm93IiksXz1wKCJUcnlJdE91dEJ1dHRvbiIpLHc9cCgiY29udGVudFR5cGUiKSx4PXAoIkNhbGxiYWNrcyIsITApLEU9cCgiUmVxdWVzdEJvZHkiLCEwKSxTPXMmJmksQz1oLmlzT0FTMygpLEE9eS5nZXQoInJlcXVlc3RCb2R5IiksTz1QKCkoZT1vbigpKFAoKShhKS5jYWxsKGEsKGZ1bmN0aW9uKGUsdCl7dmFyIG4scj10LmdldCgiaW4iKTtyZXR1cm4gbnVsbCE9PShuPWVbcl0pJiZ2b2lkIDAhPT1ufHwoZVtyXT1bXSksZVtyXS5wdXNoKHQpLGV9KSx7fSkpKS5jYWxsKGUsKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHUoKShlKS5jYWxsKGUsdCl9KSxbXSk7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Im9wYmxvY2stc2VjdGlvbiJ9LEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Im9wYmxvY2stc2VjdGlvbi1oZWFkZXIifSxDP0QuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InRhYi1oZWFkZXIifSxELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7b25DbGljazpmdW5jdGlvbigpe3JldHVybiBuLnRvZ2dsZVRhYigicGFyYW1ldGVycyIpfSxjbGFzc05hbWU6InRhYi1pdGVtICIuY29uY2F0KHRoaXMuc3RhdGUucGFyYW1ldGVyc1Zpc2libGUmJiJhY3RpdmUiKX0sRC5hLmNyZWF0ZUVsZW1lbnQoImg0Iix7Y2xhc3NOYW1lOiJvcGJsb2NrLXRpdGxlIn0sRC5hLmNyZWF0ZUVsZW1lbnQoInNwYW4iLG51bGwsIlBhcmFtZXRlcnMiKSkpLHkuZ2V0KCJjYWxsYmFja3MiKT9ELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7b25DbGljazpmdW5jdGlvbigpe3JldHVybiBuLnRvZ2dsZVRhYigiY2FsbGJhY2tzIil9LGNsYXNzTmFtZToidGFiLWl0ZW0gIi5jb25jYXQodGhpcy5zdGF0ZS5jYWxsYmFja1Zpc2libGUmJiJhY3RpdmUiKX0sRC5hLmNyZWF0ZUVsZW1lbnQoImg0Iix7Y2xhc3NOYW1lOiJvcGJsb2NrLXRpdGxlIn0sRC5hLmNyZWF0ZUVsZW1lbnQoInNwYW4iLG51bGwsIkNhbGxiYWNrcyIpKSk6bnVsbCk6RC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToidGFiLWhlYWRlciJ9LEQuYS5jcmVhdGVFbGVtZW50KCJoNCIse2NsYXNzTmFtZToib3BibG9jay10aXRsZSJ9LCJQYXJhbWV0ZXJzIikpLGk/RC5hLmNyZWF0ZUVsZW1lbnQoXyx7aXNPQVMzOmguaXNPQVMzKCksaGFzVXNlckVkaXRlZEJvZHk6Zy5oYXNVc2VyRWRpdGVkQm9keS5hcHBseShnLG5uKCkobSkpLGVuYWJsZWQ6cyxvbkNhbmNlbENsaWNrOnRoaXMucHJvcHMub25DYW5jZWxDbGljayxvblRyeW91dENsaWNrOm8sb25SZXNldENsaWNrOmZ1bmN0aW9uKCl7cmV0dXJuIHYuc2V0UmVxdWVzdEJvZHlWYWx1ZSh7dmFsdWU6dm9pZCAwLHBhdGhNZXRob2Q6bX0pfX0pOm51bGwpLHRoaXMuc3RhdGUucGFyYW1ldGVyc1Zpc2libGU/RC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToicGFyYW1ldGVycy1jb250YWluZXIifSxPLmxlbmd0aD9ELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJ0YWJsZS1jb250YWluZXIifSxELmEuY3JlYXRlRWxlbWVudCgidGFibGUiLHtjbGFzc05hbWU6InBhcmFtZXRlcnMifSxELmEuY3JlYXRlRWxlbWVudCgidGhlYWQiLG51bGwsRC5hLmNyZWF0ZUVsZW1lbnQoInRyIixudWxsLEQuYS5jcmVhdGVFbGVtZW50KCJ0aCIse2NsYXNzTmFtZToiY29sX2hlYWRlciBwYXJhbWV0ZXJzLWNvbF9uYW1lIn0sIk5hbWUiKSxELmEuY3JlYXRlRWxlbWVudCgidGgiLHtjbGFzc05hbWU6ImNvbF9oZWFkZXIgcGFyYW1ldGVycy1jb2xfZGVzY3JpcHRpb24ifSwiRGVzY3JpcHRpb24iKSkpLEQuYS5jcmVhdGVFbGVtZW50KCJ0Ym9keSIsbnVsbCxNKCkoTykuY2FsbChPLChmdW5jdGlvbihlLHQpe3ZhciByO3JldHVybiBELmEuY3JlYXRlRWxlbWVudChiLHtmbjpsLHNwZWNQYXRoOmMucHVzaCh0LnRvU3RyaW5nKCkpLGdldENvbXBvbmVudDpwLGdldENvbmZpZ3M6ZixyYXdQYXJhbTplLHBhcmFtOmgucGFyYW1ldGVyV2l0aE1ldGFCeUlkZW50aXR5KG0sZSksa2V5OnUoKShyPSIiLmNvbmNhdChlLmdldCgiaW4iKSwiLiIpKS5jYWxsKHIsZS5nZXQoIm5hbWUiKSksb25DaGFuZ2U6bi5vbkNoYW5nZSxvbkNoYW5nZUNvbnN1bWVzOm4ub25DaGFuZ2VDb25zdW1lc1dyYXBwZXIsc3BlY1NlbGVjdG9yczpoLHNwZWNBY3Rpb25zOmQsb2FzM0FjdGlvbnM6dixvYXMzU2VsZWN0b3JzOmcscGF0aE1ldGhvZDptLGlzRXhlY3V0ZTpTfSl9KSkpKSk6RC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToib3BibG9jay1kZXNjcmlwdGlvbi13cmFwcGVyIn0sRC5hLmNyZWF0ZUVsZW1lbnQoInAiLG51bGwsIk5vIHBhcmFtZXRlcnMiKSkpOm51bGwsdGhpcy5zdGF0ZS5jYWxsYmFja1Zpc2libGU/RC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiY2FsbGJhY2tzLWNvbnRhaW5lciBvcGJsb2NrLWRlc2NyaXB0aW9uLXdyYXBwZXIifSxELmEuY3JlYXRlRWxlbWVudCh4LHtjYWxsYmFja3M6T2JqZWN0KEIuTWFwKSh5LmdldCgiY2FsbGJhY2tzIikpLHNwZWNQYXRoOmsoKShjKS5jYWxsKGMsMCwtMSkucHVzaCgiY2FsbGJhY2tzIil9KSk6bnVsbCxDJiZBJiZ0aGlzLnN0YXRlLnBhcmFtZXRlcnNWaXNpYmxlJiZELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJvcGJsb2NrLXNlY3Rpb24gb3BibG9jay1zZWN0aW9uLXJlcXVlc3QtYm9keSJ9LEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Im9wYmxvY2stc2VjdGlvbi1oZWFkZXIifSxELmEuY3JlYXRlRWxlbWVudCgiaDQiLHtjbGFzc05hbWU6Im9wYmxvY2stdGl0bGUgcGFyYW1ldGVyX19uYW1lICIuY29uY2F0KEEuZ2V0KCJyZXF1aXJlZCIpJiYicmVxdWlyZWQiKX0sIlJlcXVlc3QgYm9keSIpLEQuYS5jcmVhdGVFbGVtZW50KCJsYWJlbCIsbnVsbCxELmEuY3JlYXRlRWxlbWVudCh3LHt2YWx1ZTpnLnJlcXVlc3RDb250ZW50VHlwZS5hcHBseShnLG5uKCkobSkpLGNvbnRlbnRUeXBlczpBLmdldCgiY29udGVudCIsT2JqZWN0KEIuTGlzdCkoKSkua2V5U2VxKCksb25DaGFuZ2U6ZnVuY3Rpb24oZSl7bi5vbkNoYW5nZU1lZGlhVHlwZSh7dmFsdWU6ZSxwYXRoTWV0aG9kOm19KX0sY2xhc3NOYW1lOiJib2R5LXBhcmFtLWNvbnRlbnQtdHlwZSIsYXJpYUxhYmVsOiJSZXF1ZXN0IGNvbnRlbnQgdHlwZSJ9KSkpLEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Im9wYmxvY2stZGVzY3JpcHRpb24td3JhcHBlciJ9LEQuYS5jcmVhdGVFbGVtZW50KEUse3NldFJldGFpblJlcXVlc3RCb2R5VmFsdWVGbGFnOmZ1bmN0aW9uKGUpe3JldHVybiB2LnNldFJldGFpblJlcXVlc3RCb2R5VmFsdWVGbGFnKHt2YWx1ZTplLHBhdGhNZXRob2Q6bX0pfSx1c2VySGFzRWRpdGVkQm9keTpnLmhhc1VzZXJFZGl0ZWRCb2R5LmFwcGx5KGcsbm4oKShtKSksc3BlY1BhdGg6aygpKGMpLmNhbGwoYywwLC0xKS5wdXNoKCJyZXF1ZXN0Qm9keSIpLHJlcXVlc3RCb2R5OkEscmVxdWVzdEJvZHlWYWx1ZTpnLnJlcXVlc3RCb2R5VmFsdWUuYXBwbHkoZyxubigpKG0pKSxyZXF1ZXN0Qm9keUluY2x1c2lvblNldHRpbmc6Zy5yZXF1ZXN0Qm9keUluY2x1c2lvblNldHRpbmcuYXBwbHkoZyxubigpKG0pKSxyZXF1ZXN0Qm9keUVycm9yczpnLnJlcXVlc3RCb2R5RXJyb3JzLmFwcGx5KGcsbm4oKShtKSksaXNFeGVjdXRlOlMsZ2V0Q29uZmlnczpmLGFjdGl2ZUV4YW1wbGVzS2V5OmcuYWN0aXZlRXhhbXBsZXNNZW1iZXIuYXBwbHkoZyx1KCkodD1ubigpKG0pKS5jYWxsKHQsWyJyZXF1ZXN0Qm9keSIsInJlcXVlc3RCb2R5Il0pKSx1cGRhdGVBY3RpdmVFeGFtcGxlc0tleTpmdW5jdGlvbihlKXtuLnByb3BzLm9hczNBY3Rpb25zLnNldEFjdGl2ZUV4YW1wbGVzTWVtYmVyKHtuYW1lOmUscGF0aE1ldGhvZDpuLnByb3BzLnBhdGhNZXRob2QsY29udGV4dFR5cGU6InJlcXVlc3RCb2R5Iixjb250ZXh0TmFtZToicmVxdWVzdEJvZHkifSl9LG9uQ2hhbmdlOmZ1bmN0aW9uKGUsdCl7aWYodCl7dmFyIG49Zy5yZXF1ZXN0Qm9keVZhbHVlLmFwcGx5KGcsbm4oKShtKSkscj1CLk1hcC5pc01hcChuKT9uOk9iamVjdChCLk1hcCkoKTtyZXR1cm4gdi5zZXRSZXF1ZXN0Qm9keVZhbHVlKHtwYXRoTWV0aG9kOm0sdmFsdWU6ci5zZXRJbih0LGUpfSl9di5zZXRSZXF1ZXN0Qm9keVZhbHVlKHt2YWx1ZTplLHBhdGhNZXRob2Q6bX0pfSxvbkNoYW5nZUluY2x1ZGVFbXB0eTpmdW5jdGlvbihlLHQpe3Yuc2V0UmVxdWVzdEJvZHlJbmNsdXNpb24oe3BhdGhNZXRob2Q6bSx2YWx1ZTp0LG5hbWU6ZX0pfSxjb250ZW50VHlwZTpnLnJlcXVlc3RDb250ZW50VHlwZS5hcHBseShnLG5uKCkobSkpfSkpKSl9fV0pLG59KFIuQ29tcG9uZW50KTt5KCkoYW4sImRlZmF1bHRQcm9wcyIse29uVHJ5b3V0Q2xpY2s6RnVuY3Rpb24ucHJvdG90eXBlLG9uQ2FuY2VsQ2xpY2s6RnVuY3Rpb24ucHJvdG90eXBlLHRyeUl0T3V0RW5hYmxlZDohMSxhbGxvd1RyeUl0T3V0OiEwLG9uQ2hhbmdlS2V5OltdLHNwZWNQYXRoOltdfSk7dmFyIHNuPWZ1bmN0aW9uKGUpe3ZhciB0PWUueEtleSxuPWUueFZhbDtyZXR1cm4gRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToicGFyYW1ldGVyX19leHRlbnNpb24ifSx0LCI6ICIsU3RyaW5nKG4pKX0sdW49e29uQ2hhbmdlOmZ1bmN0aW9uKCl7fSxpc0luY2x1ZGVkT3B0aW9uczp7fX0sY249ZnVuY3Rpb24oZSl7eWUoKShuLGUpO3ZhciB0PV9lKCkobik7ZnVuY3Rpb24gbigpe3ZhciBlLHI7XygpKHRoaXMsbik7Zm9yKHZhciBvPWFyZ3VtZW50cy5sZW5ndGgsYT1uZXcgQXJyYXkobyksaT0wO2k8bztpKyspYVtpXT1hcmd1bWVudHNbaV07cmV0dXJuIHI9dC5jYWxsLmFwcGx5KHQsdSgpKGU9W3RoaXNdKS5jYWxsKGUsYSkpLHkoKSh2ZSgpKHIpLCJvbkNoZWNrYm94Q2hhbmdlIiwoZnVuY3Rpb24oZSl7KDAsci5wcm9wcy5vbkNoYW5nZSkoZS50YXJnZXQuY2hlY2tlZCl9KSkscn1yZXR1cm4geCgpKG4sW3trZXk6ImNvbXBvbmVudERpZE1vdW50Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsdD1lLmlzSW5jbHVkZWRPcHRpb25zLG49ZS5vbkNoYW5nZSxyPXQuc2hvdWxkRGlzcGF0Y2hJbml0LG89dC5kZWZhdWx0VmFsdWU7ciYmbihvKX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLHQ9ZS5pc0luY2x1ZGVkLG49ZS5pc0Rpc2FibGVkO3JldHVybiBELmEuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLEQuYS5jcmVhdGVFbGVtZW50KCJsYWJlbCIse2NsYXNzTmFtZTpXdCgpKCJwYXJhbWV0ZXJfX2VtcHR5X3ZhbHVlX3RvZ2dsZSIse2Rpc2FibGVkOm59KX0sRC5hLmNyZWF0ZUVsZW1lbnQoImlucHV0Iix7dHlwZToiY2hlY2tib3giLGRpc2FibGVkOm4sY2hlY2tlZDohbiYmdCxvbkNoYW5nZTp0aGlzLm9uQ2hlY2tib3hDaGFuZ2V9KSwiU2VuZCBlbXB0eSB2YWx1ZSIpKX19XSksbn0oUi5Db21wb25lbnQpO3koKShjbiwiZGVmYXVsdFByb3BzIix1bik7dmFyIGxuPW4oMTUwKSxwbj1mdW5jdGlvbihlKXt5ZSgpKG4sZSk7dmFyIHQ9X2UoKShuKTtmdW5jdGlvbiBuKGUscil7dmFyIG87cmV0dXJuIF8oKSh0aGlzLG4pLG89dC5jYWxsKHRoaXMsZSxyKSx5KCkodmUoKShvKSwib25DaGFuZ2VXcmFwcGVyIiwoZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXSxuPW8ucHJvcHMscj1uLm9uQ2hhbmdlLGE9bi5yYXdQYXJhbTtyZXR1cm4gcihhLCIiPT09ZXx8ZSYmMD09PWUuc2l6ZT9udWxsOmUsdCl9KSkseSgpKHZlKCkobyksIl9vbkV4YW1wbGVTZWxlY3QiLChmdW5jdGlvbihlKXtvLnByb3BzLm9hczNBY3Rpb25zLnNldEFjdGl2ZUV4YW1wbGVzTWVtYmVyKHtuYW1lOmUscGF0aE1ldGhvZDpvLnByb3BzLnBhdGhNZXRob2QsY29udGV4dFR5cGU6InBhcmFtZXRlcnMiLGNvbnRleHROYW1lOm8uZ2V0UGFyYW1LZXkoKX0pfSkpLHkoKSh2ZSgpKG8pLCJvbkNoYW5nZUluY2x1ZGVFbXB0eSIsKGZ1bmN0aW9uKGUpe3ZhciB0PW8ucHJvcHMsbj10LnNwZWNBY3Rpb25zLHI9dC5wYXJhbSxhPXQucGF0aE1ldGhvZCxpPXIuZ2V0KCJuYW1lIikscz1yLmdldCgiaW4iKTtyZXR1cm4gbi51cGRhdGVFbXB0eVBhcmFtSW5jbHVzaW9uKGEsaSxzLGUpfSkpLHkoKSh2ZSgpKG8pLCJzZXREZWZhdWx0VmFsdWUiLChmdW5jdGlvbigpe3ZhciBlPW8ucHJvcHMsdD1lLnNwZWNTZWxlY3RvcnMsbj1lLnBhdGhNZXRob2Qscj1lLnJhd1BhcmFtLGE9ZS5vYXMzU2VsZWN0b3JzLGk9dC5wYXJhbWV0ZXJXaXRoTWV0YUJ5SWRlbnRpdHkobixyKXx8T2JqZWN0KEIuTWFwKSgpLHM9T2JqZWN0KGxuLmEpKGkse2lzT0FTMzp0LmlzT0FTMygpfSkuc2NoZW1hLGM9aS5nZXQoImNvbnRlbnQiLE9iamVjdChCLk1hcCkoKSkua2V5U2VxKCkuZmlyc3QoKSxsPXM/T2JqZWN0KCQubykocy50b0pTKCksYyx7aW5jbHVkZVdyaXRlT25seTohMH0pOm51bGw7aWYoaSYmdm9pZCAwPT09aS5nZXQoInZhbHVlIikmJiJib2R5IiE9PWkuZ2V0KCJpbiIpKXt2YXIgcDtpZih0LmlzU3dhZ2dlcjIoKSlwPXZvaWQgMCE9PWkuZ2V0KCJ4LWV4YW1wbGUiKT9pLmdldCgieC1leGFtcGxlIik6dm9pZCAwIT09aS5nZXRJbihbInNjaGVtYSIsImV4YW1wbGUiXSk/aS5nZXRJbihbInNjaGVtYSIsImV4YW1wbGUiXSk6cyYmcy5nZXRJbihbImRlZmF1bHQiXSk7ZWxzZSBpZih0LmlzT0FTMygpKXt2YXIgZixoPWEuYWN0aXZlRXhhbXBsZXNNZW1iZXIuYXBwbHkoYSx1KCkoZj1ubigpKG4pKS5jYWxsKGYsWyJwYXJhbWV0ZXJzIixvLmdldFBhcmFtS2V5KCldKSk7cD12b2lkIDAhPT1pLmdldEluKFsiZXhhbXBsZXMiLGgsInZhbHVlIl0pP2kuZ2V0SW4oWyJleGFtcGxlcyIsaCwidmFsdWUiXSk6dm9pZCAwIT09aS5nZXRJbihbImNvbnRlbnQiLGMsImV4YW1wbGUiXSk/aS5nZXRJbihbImNvbnRlbnQiLGMsImV4YW1wbGUiXSk6dm9pZCAwIT09aS5nZXQoImV4YW1wbGUiKT9pLmdldCgiZXhhbXBsZSIpOnZvaWQgMCE9PShzJiZzLmdldCgiZXhhbXBsZSIpKT9zJiZzLmdldCgiZXhhbXBsZSIpOnZvaWQgMCE9PShzJiZzLmdldCgiZGVmYXVsdCIpKT9zJiZzLmdldCgiZGVmYXVsdCIpOmkuZ2V0KCJkZWZhdWx0Iil9dm9pZCAwPT09cHx8Qi5MaXN0LmlzTGlzdChwKXx8KHA9T2JqZWN0KCQuSSkocCkpLHZvaWQgMCE9PXA/by5vbkNoYW5nZVdyYXBwZXIocCk6cyYmIm9iamVjdCI9PT1zLmdldCgidHlwZSIpJiZsJiYhaS5nZXQoImV4YW1wbGVzIikmJm8ub25DaGFuZ2VXcmFwcGVyKEIuTGlzdC5pc0xpc3QobCk/bDpPYmplY3QoJC5JKShsKSl9fSkpLG8uc2V0RGVmYXVsdFZhbHVlKCksb31yZXR1cm4geCgpKG4sW3trZXk6ImNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5zcGVjU2VsZWN0b3JzLHI9ZS5wYXRoTWV0aG9kLG89ZS5yYXdQYXJhbSxhPW4uaXNPQVMzKCksaT1uLnBhcmFtZXRlcldpdGhNZXRhQnlJZGVudGl0eShyLG8pfHxuZXcgQi5NYXA7aWYoaT1pLmlzRW1wdHkoKT9vOmksYSl7dmFyIHM9T2JqZWN0KGxuLmEpKGkse2lzT0FTMzphfSkuc2NoZW1hO3Q9cz9zLmdldCgiZW51bSIpOnZvaWQgMH1lbHNlIHQ9aT9pLmdldCgiZW51bSIpOnZvaWQgMDt2YXIgdSxjPWk/aS5nZXQoInZhbHVlIik6dm9pZCAwO3ZvaWQgMCE9PWM/dT1jOm8uZ2V0KCJyZXF1aXJlZCIpJiZ0JiZ0LnNpemUmJih1PXQuZmlyc3QoKSksdm9pZCAwIT09dSYmdSE9PWMmJnRoaXMub25DaGFuZ2VXcmFwcGVyKE9iamVjdCgkLncpKHUpKSx0aGlzLnNldERlZmF1bHRWYWx1ZSgpfX0se2tleToiZ2V0UGFyYW1LZXkiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzLnByb3BzLnBhcmFtO3JldHVybiB0P3UoKShlPSIiLmNvbmNhdCh0LmdldCgibmFtZSIpLCItIikpLmNhbGwoZSx0LmdldCgiaW4iKSk6bnVsbH19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZSx0LG4scixvPXRoaXMucHJvcHMsYT1vLnBhcmFtLGk9by5yYXdQYXJhbSxzPW8uZ2V0Q29tcG9uZW50LGM9by5nZXRDb25maWdzLGw9by5pc0V4ZWN1dGUscD1vLmZuLGY9by5vbkNoYW5nZUNvbnN1bWVzLGg9by5zcGVjU2VsZWN0b3JzLGQ9by5wYXRoTWV0aG9kLG09by5zcGVjUGF0aCx2PW8ub2FzM1NlbGVjdG9ycyxnPWguaXNPQVMzKCkseT1jKCksYj15LnNob3dFeHRlbnNpb25zLF89eS5zaG93Q29tbW9uRXh0ZW5zaW9ucztpZihhfHwoYT1pKSwhaSlyZXR1cm4gbnVsbDt2YXIgdyx4LEUsUyxDPXMoIkpzb25TY2hlbWFGb3JtIiksQT1zKCJQYXJhbUJvZHkiKSxPPWEuZ2V0KCJpbiIpLGs9ImJvZHkiIT09Tz9udWxsOkQuYS5jcmVhdGVFbGVtZW50KEEse2dldENvbXBvbmVudDpzLGdldENvbmZpZ3M6YyxmbjpwLHBhcmFtOmEsY29uc3VtZXM6aC5jb25zdW1lc09wdGlvbnNGb3IoZCksY29uc3VtZXNWYWx1ZTpoLmNvbnRlbnRUeXBlVmFsdWVzKGQpLmdldCgicmVxdWVzdENvbnRlbnRUeXBlIiksb25DaGFuZ2U6dGhpcy5vbkNoYW5nZVdyYXBwZXIsb25DaGFuZ2VDb25zdW1lczpmLGlzRXhlY3V0ZTpsLHNwZWNTZWxlY3RvcnM6aCxwYXRoTWV0aG9kOmR9KSxqPXMoIm1vZGVsRXhhbXBsZSIpLFQ9cygiTWFya2Rvd24iLCEwKSxJPXMoIlBhcmFtZXRlckV4dCIpLFA9cygiUGFyYW1ldGVySW5jbHVkZUVtcHR5IiksTj1zKCJFeGFtcGxlc1NlbGVjdFZhbHVlUmV0YWluZXIiKSxSPXMoIkV4YW1wbGUiKSxMPU9iamVjdChsbi5hKShhLHtpc09BUzM6Z30pLnNjaGVtYSxGPWgucGFyYW1ldGVyV2l0aE1ldGFCeUlkZW50aXR5KGQsaSl8fE9iamVjdChCLk1hcCkoKSxVPUw/TC5nZXQoImZvcm1hdCIpOm51bGwscT1MP0wuZ2V0KCJ0eXBlIik6bnVsbCx6PUw/TC5nZXRJbihbIml0ZW1zIiwidHlwZSJdKTpudWxsLFY9ImZvcm1EYXRhIj09PU8sVz0iRm9ybURhdGEiaW4gSC5hLEo9YS5nZXQoInJlcXVpcmVkIiksSz1GP0YuZ2V0KCJ2YWx1ZSIpOiIiLFk9Xz9PYmplY3QoJC5sKShMKTpudWxsLEc9Yj9PYmplY3QoJC5tKShhKTpudWxsLFo9ITE7cmV0dXJuIHZvaWQgMCE9PWEmJkwmJih3PUwuZ2V0KCJpdGVtcyIpKSx2b2lkIDAhPT13Pyh4PXcuZ2V0KCJlbnVtIiksRT13LmdldCgiZGVmYXVsdCIpKTpMJiYoeD1MLmdldCgiZW51bSIpKSx4JiZ4LnNpemUmJnguc2l6ZT4wJiYoWj0hMCksdm9pZCAwIT09YSYmKEwmJihFPUwuZ2V0KCJkZWZhdWx0IikpLHZvaWQgMD09PUUmJihFPWEuZ2V0KCJkZWZhdWx0IikpLHZvaWQgMD09PShTPWEuZ2V0KCJleGFtcGxlIikpJiYoUz1hLmdldCgieC1leGFtcGxlIikpKSxELmEuY3JlYXRlRWxlbWVudCgidHIiLHsiZGF0YS1wYXJhbS1uYW1lIjphLmdldCgibmFtZSIpLCJkYXRhLXBhcmFtLWluIjphLmdldCgiaW4iKX0sRC5hLmNyZWF0ZUVsZW1lbnQoInRkIix7Y2xhc3NOYW1lOiJwYXJhbWV0ZXJzLWNvbF9uYW1lIn0sRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZTpKPyJwYXJhbWV0ZXJfX25hbWUgcmVxdWlyZWQiOiJwYXJhbWV0ZXJfX25hbWUifSxhLmdldCgibmFtZSIpLEo/RC5hLmNyZWF0ZUVsZW1lbnQoInNwYW4iLG51bGwsIsKgKiIpOm51bGwpLEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InBhcmFtZXRlcl9fdHlwZSJ9LHEseiYmIlsiLmNvbmNhdCh6LCJdIiksVSYmRC5hLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InByb3AtZm9ybWF0In0sIigkIixVLCIpIikpLEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InBhcmFtZXRlcl9fZGVwcmVjYXRlZCJ9LGcmJmEuZ2V0KCJkZXByZWNhdGVkIik/ImRlcHJlY2F0ZWQiOm51bGwpLEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InBhcmFtZXRlcl9faW4ifSwiKCIsYS5nZXQoImluIiksIikiKSxfJiZZLnNpemU/TSgpKGU9WS5lbnRyeVNlcSgpKS5jYWxsKGUsKGZ1bmN0aW9uKGUpe3ZhciB0LG49YnQoKShlLDIpLHI9blswXSxvPW5bMV07cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KEkse2tleTp1KCkodD0iIi5jb25jYXQociwiLSIpKS5jYWxsKHQsbykseEtleTpyLHhWYWw6b30pfSkpOm51bGwsYiYmRy5zaXplP00oKSh0PUcuZW50cnlTZXEoKSkuY2FsbCh0LChmdW5jdGlvbihlKXt2YXIgdCxuPWJ0KCkoZSwyKSxyPW5bMF0sbz1uWzFdO3JldHVybiBELmEuY3JlYXRlRWxlbWVudChJLHtrZXk6dSgpKHQ9IiIuY29uY2F0KHIsIi0iKSkuY2FsbCh0LG8pLHhLZXk6cix4VmFsOm99KX0pKTpudWxsKSxELmEuY3JlYXRlRWxlbWVudCgidGQiLHtjbGFzc05hbWU6InBhcmFtZXRlcnMtY29sX2Rlc2NyaXB0aW9uIn0sYS5nZXQoImRlc2NyaXB0aW9uIik/RC5hLmNyZWF0ZUVsZW1lbnQoVCx7c291cmNlOmEuZ2V0KCJkZXNjcmlwdGlvbiIpfSk6bnVsbCwhayYmbHx8IVo/bnVsbDpELmEuY3JlYXRlRWxlbWVudChULHtjbGFzc05hbWU6InBhcmFtZXRlcl9fZW51bSIsc291cmNlOiI8aT5BdmFpbGFibGUgdmFsdWVzPC9pPiA6ICIrTSgpKHgpLmNhbGwoeCwoZnVuY3Rpb24oZSl7cmV0dXJuIGV9KSkudG9BcnJheSgpLmpvaW4oIiwgIil9KSwhayYmbHx8dm9pZCAwPT09RT9udWxsOkQuYS5jcmVhdGVFbGVtZW50KFQse2NsYXNzTmFtZToicGFyYW1ldGVyX19kZWZhdWx0Iixzb3VyY2U6IjxpPkRlZmF1bHQgdmFsdWU8L2k+IDogIitFfSksIWsmJmx8fHZvaWQgMD09PVM/bnVsbDpELmEuY3JlYXRlRWxlbWVudChULHtzb3VyY2U6IjxpPkV4YW1wbGU8L2k+IDogIitTfSksViYmIVcmJkQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsIkVycm9yOiB5b3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBGb3JtRGF0YSIpLGcmJmEuZ2V0KCJleGFtcGxlcyIpP0QuYS5jcmVhdGVFbGVtZW50KCJzZWN0aW9uIix7Y2xhc3NOYW1lOiJwYXJhbWV0ZXItY29udHJvbHMifSxELmEuY3JlYXRlRWxlbWVudChOLHtleGFtcGxlczphLmdldCgiZXhhbXBsZXMiKSxvblNlbGVjdDp0aGlzLl9vbkV4YW1wbGVTZWxlY3QsdXBkYXRlVmFsdWU6dGhpcy5vbkNoYW5nZVdyYXBwZXIsZ2V0Q29tcG9uZW50OnMsZGVmYXVsdFRvRmlyc3RFeGFtcGxlOiEwLGN1cnJlbnRLZXk6di5hY3RpdmVFeGFtcGxlc01lbWJlci5hcHBseSh2LHUoKShuPW5uKCkoZCkpLmNhbGwobixbInBhcmFtZXRlcnMiLHRoaXMuZ2V0UGFyYW1LZXkoKV0pKSxjdXJyZW50VXNlcklucHV0VmFsdWU6S30pKTpudWxsLGs/bnVsbDpELmEuY3JlYXRlRWxlbWVudChDLHtmbjpwLGdldENvbXBvbmVudDpzLHZhbHVlOksscmVxdWlyZWQ6SixkaXNhYmxlZDohbCxkZXNjcmlwdGlvbjphLmdldCgibmFtZSIpLG9uQ2hhbmdlOnRoaXMub25DaGFuZ2VXcmFwcGVyLGVycm9yczpGLmdldCgiZXJyb3JzIiksc2NoZW1hOkx9KSxrJiZMP0QuYS5jcmVhdGVFbGVtZW50KGose2dldENvbXBvbmVudDpzLHNwZWNQYXRoOm0ucHVzaCgic2NoZW1hIiksZ2V0Q29uZmlnczpjLGlzRXhlY3V0ZTpsLHNwZWNTZWxlY3RvcnM6aCxzY2hlbWE6TCxleGFtcGxlOmssaW5jbHVkZVdyaXRlT25seTohMH0pOm51bGwsIWsmJmwmJmEuZ2V0KCJhbGxvd0VtcHR5VmFsdWUiKT9ELmEuY3JlYXRlRWxlbWVudChQLHtvbkNoYW5nZTp0aGlzLm9uQ2hhbmdlSW5jbHVkZUVtcHR5LGlzSW5jbHVkZWQ6aC5wYXJhbWV0ZXJJbmNsdXNpb25TZXR0aW5nRm9yKGQsYS5nZXQoIm5hbWUiKSxhLmdldCgiaW4iKSksaXNEaXNhYmxlZDohT2JqZWN0KCQucSkoSyl9KTpudWxsLGcmJmEuZ2V0KCJleGFtcGxlcyIpP0QuYS5jcmVhdGVFbGVtZW50KFIse2V4YW1wbGU6YS5nZXRJbihbImV4YW1wbGVzIix2LmFjdGl2ZUV4YW1wbGVzTWVtYmVyLmFwcGx5KHYsdSgpKHI9bm4oKShkKSkuY2FsbChyLFsicGFyYW1ldGVycyIsdGhpcy5nZXRQYXJhbUtleSgpXSkpXSksZ2V0Q29tcG9uZW50OnMsZ2V0Q29uZmlnczpjfSk6bnVsbCkpfX1dKSxufShSLkNvbXBvbmVudCksZm49bigyMTYpLGhuPW4ubihmbiksZG49ZnVuY3Rpb24oZSl7eWUoKShuLGUpO3ZhciB0PV9lKCkobik7ZnVuY3Rpb24gbigpe3ZhciBlLHI7XygpKHRoaXMsbik7Zm9yKHZhciBvPWFyZ3VtZW50cy5sZW5ndGgsYT1uZXcgQXJyYXkobyksaT0wO2k8bztpKyspYVtpXT1hcmd1bWVudHNbaV07cmV0dXJuIHI9dC5jYWxsLmFwcGx5KHQsdSgpKGU9W3RoaXNdKS5jYWxsKGUsYSkpLHkoKSh2ZSgpKHIpLCJoYW5kbGVWYWxpZGF0ZVBhcmFtZXRlcnMiLChmdW5jdGlvbigpe3ZhciBlPXIucHJvcHMsdD1lLnNwZWNTZWxlY3RvcnMsbj1lLnNwZWNBY3Rpb25zLG89ZS5wYXRoLGE9ZS5tZXRob2Q7cmV0dXJuIG4udmFsaWRhdGVQYXJhbXMoW28sYV0pLHQudmFsaWRhdGVCZWZvcmVFeGVjdXRlKFtvLGFdKX0pKSx5KCkodmUoKShyKSwiaGFuZGxlVmFsaWRhdGVSZXF1ZXN0Qm9keSIsKGZ1bmN0aW9uKCl7dmFyIGU9ci5wcm9wcyx0PWUucGF0aCxuPWUubWV0aG9kLG89ZS5zcGVjU2VsZWN0b3JzLGE9ZS5vYXMzU2VsZWN0b3JzLGk9ZS5vYXMzQWN0aW9ucyxzPXttaXNzaW5nQm9keVZhbHVlOiExLG1pc3NpbmdSZXF1aXJlZEtleXM6W119O2kuY2xlYXJSZXF1ZXN0Qm9keVZhbGlkYXRlRXJyb3Ioe3BhdGg6dCxtZXRob2Q6bn0pO3ZhciB1PW8uZ2V0T0FTM1JlcXVpcmVkUmVxdWVzdEJvZHlDb250ZW50VHlwZShbdCxuXSksYz1hLnJlcXVlc3RCb2R5VmFsdWUodCxuKSxsPWEudmFsaWRhdGVCZWZvcmVFeGVjdXRlKFt0LG5dKSxwPWEucmVxdWVzdENvbnRlbnRUeXBlKHQsbik7aWYoIWwpcmV0dXJuIHMubWlzc2luZ0JvZHlWYWx1ZT0hMCxpLnNldFJlcXVlc3RCb2R5VmFsaWRhdGVFcnJvcih7cGF0aDp0LG1ldGhvZDpuLHZhbGlkYXRpb25FcnJvcnM6c30pLCExO2lmKCF1KXJldHVybiEwO3ZhciBmPWEudmFsaWRhdGVTaGFsbG93UmVxdWlyZWQoe29hczNSZXF1aXJlZFJlcXVlc3RCb2R5Q29udGVudFR5cGU6dSxvYXMzUmVxdWVzdENvbnRlbnRUeXBlOnAsb2FzM1JlcXVlc3RCb2R5VmFsdWU6Y30pO3JldHVybiFmfHxmLmxlbmd0aDwxfHwoT3QoKShmKS5jYWxsKGYsKGZ1bmN0aW9uKGUpe3MubWlzc2luZ1JlcXVpcmVkS2V5cy5wdXNoKGUpfSkpLGkuc2V0UmVxdWVzdEJvZHlWYWxpZGF0ZUVycm9yKHtwYXRoOnQsbWV0aG9kOm4sdmFsaWRhdGlvbkVycm9yczpzfSksITEpfSkpLHkoKSh2ZSgpKHIpLCJoYW5kbGVWYWxpZGF0aW9uUmVzdWx0UGFzcyIsKGZ1bmN0aW9uKCl7dmFyIGU9ci5wcm9wcyx0PWUuc3BlY0FjdGlvbnMsbj1lLm9wZXJhdGlvbixvPWUucGF0aCxhPWUubWV0aG9kO3IucHJvcHMub25FeGVjdXRlJiZyLnByb3BzLm9uRXhlY3V0ZSgpLHQuZXhlY3V0ZSh7b3BlcmF0aW9uOm4scGF0aDpvLG1ldGhvZDphfSl9KSkseSgpKHZlKCkociksImhhbmRsZVZhbGlkYXRpb25SZXN1bHRGYWlsIiwoZnVuY3Rpb24oKXt2YXIgZT1yLnByb3BzLHQ9ZS5zcGVjQWN0aW9ucyxuPWUucGF0aCxvPWUubWV0aG9kO3QuY2xlYXJWYWxpZGF0ZVBhcmFtcyhbbixvXSksaG4oKSgoZnVuY3Rpb24oKXt0LnZhbGlkYXRlUGFyYW1zKFtuLG9dKX0pLDQwKX0pKSx5KCkodmUoKShyKSwiaGFuZGxlVmFsaWRhdGlvblJlc3VsdCIsKGZ1bmN0aW9uKGUpe2U/ci5oYW5kbGVWYWxpZGF0aW9uUmVzdWx0UGFzcygpOnIuaGFuZGxlVmFsaWRhdGlvblJlc3VsdEZhaWwoKX0pKSx5KCkodmUoKShyKSwib25DbGljayIsKGZ1bmN0aW9uKCl7dmFyIGU9ci5oYW5kbGVWYWxpZGF0ZVBhcmFtZXRlcnMoKSx0PXIuaGFuZGxlVmFsaWRhdGVSZXF1ZXN0Qm9keSgpLG49ZSYmdDtyLmhhbmRsZVZhbGlkYXRpb25SZXN1bHQobil9KSkseSgpKHZlKCkociksIm9uQ2hhbmdlUHJvZHVjZXNXcmFwcGVyIiwoZnVuY3Rpb24oZSl7cmV0dXJuIHIucHJvcHMuc3BlY0FjdGlvbnMuY2hhbmdlUHJvZHVjZXNWYWx1ZShbci5wcm9wcy5wYXRoLHIucHJvcHMubWV0aG9kXSxlKX0pKSxyfXJldHVybiB4KCkobixbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMuZGlzYWJsZWQ7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJidXR0b24iLHtjbGFzc05hbWU6ImJ0biBleGVjdXRlIG9wYmxvY2stY29udHJvbF9fYnRuIixvbkNsaWNrOnRoaXMub25DbGljayxkaXNhYmxlZDplfSwiRXhlY3V0ZSIpfX1dKSxufShSLkNvbXBvbmVudCksbW49ZnVuY3Rpb24oZSl7eWUoKShuLGUpO3ZhciB0PV9lKCkobik7ZnVuY3Rpb24gbigpe3JldHVybiBfKCkodGhpcyxuKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4geCgpKG4sW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXMucHJvcHMsbj10LmhlYWRlcnMscj10LmdldENvbXBvbmVudCxvPXIoIlByb3BlcnR5IiksYT1yKCJNYXJrZG93biIsITApO3JldHVybiBuJiZuLnNpemU/RC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiaGVhZGVycy13cmFwcGVyIn0sRC5hLmNyZWF0ZUVsZW1lbnQoImg0Iix7Y2xhc3NOYW1lOiJoZWFkZXJzX190aXRsZSJ9LCJIZWFkZXJzOiIpLEQuYS5jcmVhdGVFbGVtZW50KCJ0YWJsZSIse2NsYXNzTmFtZToiaGVhZGVycyJ9LEQuYS5jcmVhdGVFbGVtZW50KCJ0aGVhZCIsbnVsbCxELmEuY3JlYXRlRWxlbWVudCgidHIiLHtjbGFzc05hbWU6ImhlYWRlci1yb3cifSxELmEuY3JlYXRlRWxlbWVudCgidGgiLHtjbGFzc05hbWU6ImhlYWRlci1jb2wifSwiTmFtZSIpLEQuYS5jcmVhdGVFbGVtZW50KCJ0aCIse2NsYXNzTmFtZToiaGVhZGVyLWNvbCJ9LCJEZXNjcmlwdGlvbiIpLEQuYS5jcmVhdGVFbGVtZW50KCJ0aCIse2NsYXNzTmFtZToiaGVhZGVyLWNvbCJ9LCJUeXBlIikpKSxELmEuY3JlYXRlRWxlbWVudCgidGJvZHkiLG51bGwsTSgpKGU9bi5lbnRyeVNlcSgpKS5jYWxsKGUsKGZ1bmN0aW9uKGUpe3ZhciB0PWJ0KCkoZSwyKSxuPXRbMF0scj10WzFdO2lmKCFGLmEuTWFwLmlzTWFwKHIpKXJldHVybiBudWxsO3ZhciBpPXIuZ2V0KCJkZXNjcmlwdGlvbiIpLHM9ci5nZXRJbihbInNjaGVtYSJdKT9yLmdldEluKFsic2NoZW1hIiwidHlwZSJdKTpyLmdldEluKFsidHlwZSJdKSx1PXIuZ2V0SW4oWyJzY2hlbWEiLCJleGFtcGxlIl0pO3JldHVybiBELmEuY3JlYXRlRWxlbWVudCgidHIiLHtrZXk6bn0sRC5hLmNyZWF0ZUVsZW1lbnQoInRkIix7Y2xhc3NOYW1lOiJoZWFkZXItY29sIn0sbiksRC5hLmNyZWF0ZUVsZW1lbnQoInRkIix7Y2xhc3NOYW1lOiJoZWFkZXItY29sIn0saT9ELmEuY3JlYXRlRWxlbWVudChhLHtzb3VyY2U6aX0pOm51bGwpLEQuYS5jcmVhdGVFbGVtZW50KCJ0ZCIse2NsYXNzTmFtZToiaGVhZGVyLWNvbCJ9LHMsIiAiLHU/RC5hLmNyZWF0ZUVsZW1lbnQobyx7cHJvcEtleToiRXhhbXBsZSIscHJvcFZhbDp1LHByb3BDbGFzczoiaGVhZGVyLWV4YW1wbGUifSk6bnVsbCkpfSkpLnRvQXJyYXkoKSkpKTpudWxsfX1dKSxufShELmEuQ29tcG9uZW50KSx2bj1mdW5jdGlvbihlKXt5ZSgpKG4sZSk7dmFyIHQ9X2UoKShuKTtmdW5jdGlvbiBuKCl7cmV0dXJuIF8oKSh0aGlzLG4pLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiB4KCkobixbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsdD1lLmVkaXRvckFjdGlvbnMsbj1lLmVyclNlbGVjdG9ycyxyPWUubGF5b3V0U2VsZWN0b3JzLG89ZS5sYXlvdXRBY3Rpb25zLGE9KDAsZS5nZXRDb21wb25lbnQpKCJDb2xsYXBzZSIpO2lmKHQmJnQuanVtcFRvTGluZSl2YXIgaT10Lmp1bXBUb0xpbmU7dmFyIHM9bi5hbGxFcnJvcnMoKSx1PWwoKShzKS5jYWxsKHMsKGZ1bmN0aW9uKGUpe3JldHVybiJ0aHJvd24iPT09ZS5nZXQoInR5cGUiKXx8ImVycm9yIj09PWUuZ2V0KCJsZXZlbCIpfSkpO2lmKCF1fHx1LmNvdW50KCk8MSlyZXR1cm4gbnVsbDt2YXIgYz1yLmlzU2hvd24oWyJlcnJvclBhbmUiXSwhMCkscD11LnNvcnRCeSgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0KCJsaW5lIil9KSk7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJwcmUiLHtjbGFzc05hbWU6ImVycm9ycy13cmFwcGVyIn0sRC5hLmNyZWF0ZUVsZW1lbnQoImhncm91cCIse2NsYXNzTmFtZToiZXJyb3IifSxELmEuY3JlYXRlRWxlbWVudCgiaDQiLHtjbGFzc05hbWU6ImVycm9yc19fdGl0bGUifSwiRXJyb3JzIiksRC5hLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIse2NsYXNzTmFtZToiYnRuIGVycm9yc19fY2xlYXItYnRuIixvbkNsaWNrOmZ1bmN0aW9uKCl7cmV0dXJuIG8uc2hvdyhbImVycm9yUGFuZSJdLCFjKX19LGM/IkhpZGUiOiJTaG93IikpLEQuYS5jcmVhdGVFbGVtZW50KGEse2lzT3BlbmVkOmMsYW5pbWF0ZWQ6ITB9LEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImVycm9ycyJ9LE0oKShwKS5jYWxsKHAsKGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5nZXQoInR5cGUiKTtyZXR1cm4idGhyb3duIj09PW58fCJhdXRoIj09PW4/RC5hLmNyZWF0ZUVsZW1lbnQoZ24se2tleTp0LGVycm9yOmUuZ2V0KCJlcnJvciIpfHxlLGp1bXBUb0xpbmU6aX0pOiJzcGVjIj09PW4/RC5hLmNyZWF0ZUVsZW1lbnQoeW4se2tleTp0LGVycm9yOmUsanVtcFRvTGluZTppfSk6dm9pZCAwfSkpKSkpfX1dKSxufShELmEuQ29tcG9uZW50KSxnbj1mdW5jdGlvbihlKXt2YXIgdD1lLmVycm9yLG49ZS5qdW1wVG9MaW5lO2lmKCF0KXJldHVybiBudWxsO3ZhciByPXQuZ2V0KCJsaW5lIik7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImVycm9yLXdyYXBwZXIifSx0P0QuYS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsRC5hLmNyZWF0ZUVsZW1lbnQoImg0IixudWxsLHQuZ2V0KCJzb3VyY2UiKSYmdC5nZXQoImxldmVsIik/Ym4odC5nZXQoInNvdXJjZSIpKSsiICIrdC5nZXQoImxldmVsIik6IiIsdC5nZXQoInBhdGgiKT9ELmEuY3JlYXRlRWxlbWVudCgic21hbGwiLG51bGwsIiBhdCAiLHQuZ2V0KCJwYXRoIikpOm51bGwpLEQuYS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJtZXNzYWdlIHRocm93biJ9LHQuZ2V0KCJtZXNzYWdlIikpLEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImVycm9yLWxpbmUifSxyJiZuP0QuYS5jcmVhdGVFbGVtZW50KCJhIix7b25DbGljazpTKCkobikuY2FsbChuLG51bGwscil9LCJKdW1wIHRvIGxpbmUgIixyKTpudWxsKSk6bnVsbCl9LHluPWZ1bmN0aW9uKGUpe3ZhciB0PWUuZXJyb3Isbj1lLmp1bXBUb0xpbmUscj1udWxsO3JldHVybiB0LmdldCgicGF0aCIpP3I9Qi5MaXN0LmlzTGlzdCh0LmdldCgicGF0aCIpKT9ELmEuY3JlYXRlRWxlbWVudCgic21hbGwiLG51bGwsImF0ICIsdC5nZXQoInBhdGgiKS5qb2luKCIuIikpOkQuYS5jcmVhdGVFbGVtZW50KCJzbWFsbCIsbnVsbCwiYXQgIix0LmdldCgicGF0aCIpKTp0LmdldCgibGluZSIpJiYhbiYmKHI9RC5hLmNyZWF0ZUVsZW1lbnQoInNtYWxsIixudWxsLCJvbiBsaW5lICIsdC5nZXQoImxpbmUiKSkpLEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImVycm9yLXdyYXBwZXIifSx0P0QuYS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsRC5hLmNyZWF0ZUVsZW1lbnQoImg0IixudWxsLGJuKHQuZ2V0KCJzb3VyY2UiKSkrIiAiK3QuZ2V0KCJsZXZlbCIpLCLCoCIsciksRC5hLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Im1lc3NhZ2UifSx0LmdldCgibWVzc2FnZSIpKSxELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJlcnJvci1saW5lIn0sbj9ELmEuY3JlYXRlRWxlbWVudCgiYSIse29uQ2xpY2s6UygpKG4pLmNhbGwobixudWxsLHQuZ2V0KCJsaW5lIikpfSwiSnVtcCB0byBsaW5lICIsdC5nZXQoImxpbmUiKSk6bnVsbCkpOm51bGwpfTtmdW5jdGlvbiBibihlKXt2YXIgdDtyZXR1cm4gTSgpKHQ9KGV8fCIiKS5zcGxpdCgiICIpKS5jYWxsKHQsKGZ1bmN0aW9uKGUpe3JldHVybiBlWzBdLnRvVXBwZXJDYXNlKCkraygpKGUpLmNhbGwoZSwxKX0pKS5qb2luKCIgIil9Z24uZGVmYXVsdFByb3BzPXtqdW1wVG9MaW5lOm51bGx9O3ZhciBfbj1mdW5jdGlvbihlKXt5ZSgpKG4sZSk7dmFyIHQ9X2UoKShuKTtmdW5jdGlvbiBuKCl7dmFyIGUscjtfKCkodGhpcyxuKTtmb3IodmFyIG89YXJndW1lbnRzLmxlbmd0aCxhPW5ldyBBcnJheShvKSxpPTA7aTxvO2krKylhW2ldPWFyZ3VtZW50c1tpXTtyZXR1cm4gcj10LmNhbGwuYXBwbHkodCx1KCkoZT1bdGhpc10pLmNhbGwoZSxhKSkseSgpKHZlKCkociksIm9uQ2hhbmdlV3JhcHBlciIsKGZ1bmN0aW9uKGUpe3JldHVybiByLnByb3BzLm9uQ2hhbmdlKGUudGFyZ2V0LnZhbHVlKX0pKSxyfXJldHVybiB4KCkobixbe2tleToiY29tcG9uZW50RGlkTW91bnQiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5wcm9wcy5jb250ZW50VHlwZXMmJnRoaXMucHJvcHMub25DaGFuZ2UodGhpcy5wcm9wcy5jb250ZW50VHlwZXMuZmlyc3QoKSl9fSx7a2V5OiJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdDtlLmNvbnRlbnRUeXBlcyYmZS5jb250ZW50VHlwZXMuc2l6ZSYmKCRlKCkodD1lLmNvbnRlbnRUeXBlcykuY2FsbCh0LGUudmFsdWUpfHxlLm9uQ2hhbmdlKGUuY29udGVudFR5cGVzLmZpcnN0KCkpKX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLHQ9ZS5hcmlhQ29udHJvbHMsbj1lLmFyaWFMYWJlbCxyPWUuY2xhc3NOYW1lLG89ZS5jb250ZW50VHlwZXMsYT1lLmNvbnRyb2xJZCxpPWUudmFsdWU7cmV0dXJuIG8mJm8uc2l6ZT9ELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJjb250ZW50LXR5cGUtd3JhcHBlciAiKyhyfHwiIil9LEQuYS5jcmVhdGVFbGVtZW50KCJzZWxlY3QiLHsiYXJpYS1jb250cm9scyI6dCwiYXJpYS1sYWJlbCI6bixjbGFzc05hbWU6ImNvbnRlbnQtdHlwZSIsaWQ6YSxvbkNoYW5nZTp0aGlzLm9uQ2hhbmdlV3JhcHBlcix2YWx1ZTppfHwiIn0sTSgpKG8pLmNhbGwobywoZnVuY3Rpb24oZSl7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJvcHRpb24iLHtrZXk6ZSx2YWx1ZTplfSxlKX0pKS50b0FycmF5KCkpKTpudWxsfX1dKSxufShELmEuQ29tcG9uZW50KTt5KCkoX24sImRlZmF1bHRQcm9wcyIse29uQ2hhbmdlOmZ1bmN0aW9uKCl7fSx2YWx1ZTpudWxsLGNvbnRlbnRUeXBlczpPYmplY3QoQi5mcm9tSlMpKFsiYXBwbGljYXRpb24vanNvbiJdKX0pO3ZhciB3bj1uKDI4KSx4bj1uLm4od24pLEVuPW4oNTMpLFNuPW4ubihFbiksQ249bigxMDEpLEFuPW4ubihDbiksT249WyJmdWxsc2NyZWVuIiwiZnVsbCJdLGtuPVsiaGlkZSIsImtlZXBDb250ZW50cyIsIm1vYmlsZSIsInRhYmxldCIsImRlc2t0b3AiLCJsYXJnZSJdO2Z1bmN0aW9uIGpuKCl7Zm9yKHZhciBlLHQ9YXJndW1lbnRzLmxlbmd0aCxuPW5ldyBBcnJheSh0KSxyPTA7cjx0O3IrKyluW3JdPWFyZ3VtZW50c1tyXTtyZXR1cm4gQW4oKShlPWwoKShuKS5jYWxsKG4sKGZ1bmN0aW9uKGUpe3JldHVybiEhZX0pKS5qb2luKCIgIikpLmNhbGwoZSl9dmFyIFRuPWZ1bmN0aW9uKGUpe3llKCkobixlKTt2YXIgdD1fZSgpKG4pO2Z1bmN0aW9uIG4oKXtyZXR1cm4gXygpKHRoaXMsbiksdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIHgoKShuLFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcyx0PWUuZnVsbHNjcmVlbixuPWUuZnVsbCxyPVNuKCkoZSxPbik7aWYodClyZXR1cm4gRC5hLmNyZWF0ZUVsZW1lbnQoInNlY3Rpb24iLHIpO3ZhciBvPSJzd2FnZ2VyLWNvbnRhaW5lciIrKG4/Ii1mdWxsIjoiIik7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJzZWN0aW9uIix4bigpKHt9LHIse2NsYXNzTmFtZTpqbihyLmNsYXNzTmFtZSxvKX0pKX19XSksbn0oRC5hLkNvbXBvbmVudCksSW49e21vYmlsZToiIix0YWJsZXQ6Ii10YWJsZXQiLGRlc2t0b3A6Ii1kZXNrdG9wIixsYXJnZToiLWhkIn0sUG49ZnVuY3Rpb24oZSl7eWUoKShuLGUpO3ZhciB0PV9lKCkobik7ZnVuY3Rpb24gbigpe3JldHVybiBfKCkodGhpcyxuKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4geCgpKG4sW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXMucHJvcHMsbj10LmhpZGUscj10LmtlZXBDb250ZW50cyxvPSh0Lm1vYmlsZSx0LnRhYmxldCx0LmRlc2t0b3AsdC5sYXJnZSxTbigpKHQsa24pKTtpZihuJiYhcilyZXR1cm4gRC5hLmNyZWF0ZUVsZW1lbnQoInNwYW4iLG51bGwpO3ZhciBhPVtdO2Zvcih2YXIgaSBpbiBJbilpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoSW4saSkpe3ZhciBzPUluW2ldO2lmKGkgaW4gdGhpcy5wcm9wcyl7dmFyIGM9dGhpcy5wcm9wc1tpXTtpZihjPDEpe2EucHVzaCgibm9uZSIrcyk7Y29udGludWV9YS5wdXNoKCJibG9jayIrcyksYS5wdXNoKCJjb2wtIitjK3MpfX1uJiZhLnB1c2goImhpZGRlbiIpO3ZhciBsPWpuLmFwcGx5KHZvaWQgMCx1KCkoZT1bby5jbGFzc05hbWVdKS5jYWxsKGUsYSkpO3JldHVybiBELmEuY3JlYXRlRWxlbWVudCgic2VjdGlvbiIseG4oKSh7fSxvLHtjbGFzc05hbWU6bH0pKX19XSksbn0oRC5hLkNvbXBvbmVudCksTm49ZnVuY3Rpb24oZSl7eWUoKShuLGUpO3ZhciB0PV9lKCkobik7ZnVuY3Rpb24gbigpe3JldHVybiBfKCkodGhpcyxuKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4geCgpKG4sW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIseG4oKSh7fSx0aGlzLnByb3BzLHtjbGFzc05hbWU6am4odGhpcy5wcm9wcy5jbGFzc05hbWUsIndyYXBwZXIiKX0pKX19XSksbn0oRC5hLkNvbXBvbmVudCksTW49ZnVuY3Rpb24oZSl7eWUoKShuLGUpO3ZhciB0PV9lKCkobik7ZnVuY3Rpb24gbigpe3JldHVybiBfKCkodGhpcyxuKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4geCgpKG4sW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gRC5hLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIseG4oKSh7fSx0aGlzLnByb3BzLHtjbGFzc05hbWU6am4odGhpcy5wcm9wcy5jbGFzc05hbWUsImJ1dHRvbiIpfSkpfX1dKSxufShELmEuQ29tcG9uZW50KTt5KCkoTW4sImRlZmF1bHRQcm9wcyIse2NsYXNzTmFtZToiIn0pO3ZhciBSbj1mdW5jdGlvbihlKXtyZXR1cm4gRC5hLmNyZWF0ZUVsZW1lbnQoInRleHRhcmVhIixlKX0sRG49ZnVuY3Rpb24oZSl7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJpbnB1dCIsZSl9LExuPWZ1bmN0aW9uKGUpe3llKCkobixlKTt2YXIgdD1fZSgpKG4pO2Z1bmN0aW9uIG4oZSxyKXt2YXIgbyxhO3JldHVybiBfKCkodGhpcyxuKSxvPXQuY2FsbCh0aGlzLGUscikseSgpKHZlKCkobyksIm9uQ2hhbmdlIiwoZnVuY3Rpb24oZSl7dmFyIHQsbixyPW8ucHJvcHMsYT1yLm9uQ2hhbmdlLGk9ci5tdWx0aXBsZSxzPWsoKShbXSkuY2FsbChlLnRhcmdldC5vcHRpb25zKTtpP3Q9TSgpKG49bCgpKHMpLmNhbGwocywoZnVuY3Rpb24oZSl7cmV0dXJuIGUuc2VsZWN0ZWR9KSkpLmNhbGwobiwoZnVuY3Rpb24oZSl7cmV0dXJuIGUudmFsdWV9KSk6dD1lLnRhcmdldC52YWx1ZTtvLnNldFN0YXRlKHt2YWx1ZTp0fSksYSYmYSh0KX0pKSxhPWUudmFsdWU/ZS52YWx1ZTplLm11bHRpcGxlP1siIl06IiIsby5zdGF0ZT17dmFsdWU6YX0sb31yZXR1cm4geCgpKG4sW3trZXk6ImNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMiLHZhbHVlOmZ1bmN0aW9uKGUpe2UudmFsdWUhPT10aGlzLnByb3BzLnZhbHVlJiZ0aGlzLnNldFN0YXRlKHt2YWx1ZTplLnZhbHVlfSl9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGUsdCxuPXRoaXMucHJvcHMscj1uLmFsbG93ZWRWYWx1ZXMsbz1uLm11bHRpcGxlLGE9bi5hbGxvd0VtcHR5VmFsdWUsaT1uLmRpc2FibGVkLHM9KG51bGw9PT0oZT10aGlzLnN0YXRlLnZhbHVlKXx8dm9pZCAwPT09ZXx8bnVsbD09PSh0PWUudG9KUyl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuY2FsbChlKSl8fHRoaXMuc3RhdGUudmFsdWU7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJzZWxlY3QiLHtjbGFzc05hbWU6dGhpcy5wcm9wcy5jbGFzc05hbWUsbXVsdGlwbGU6byx2YWx1ZTpzLG9uQ2hhbmdlOnRoaXMub25DaGFuZ2UsZGlzYWJsZWQ6aX0sYT9ELmEuY3JlYXRlRWxlbWVudCgib3B0aW9uIix7dmFsdWU6IiJ9LCItLSIpOm51bGwsTSgpKHIpLmNhbGwociwoZnVuY3Rpb24oZSx0KXtyZXR1cm4gRC5hLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIse2tleTp0LHZhbHVlOlN0cmluZyhlKX0sU3RyaW5nKGUpKX0pKSl9fV0pLG59KEQuYS5Db21wb25lbnQpO3koKShMbiwiZGVmYXVsdFByb3BzIix7bXVsdGlwbGU6ITEsYWxsb3dFbXB0eVZhbHVlOiEwfSk7dmFyIEJuPWZ1bmN0aW9uKGUpe3llKCkobixlKTt2YXIgdD1fZSgpKG4pO2Z1bmN0aW9uIG4oKXtyZXR1cm4gXygpKHRoaXMsbiksdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIHgoKShuLFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJhIix4bigpKHt9LHRoaXMucHJvcHMse3JlbDoibm9vcGVuZXIgbm9yZWZlcnJlciIsY2xhc3NOYW1lOmpuKHRoaXMucHJvcHMuY2xhc3NOYW1lLCJsaW5rIil9KSl9fV0pLG59KEQuYS5Db21wb25lbnQpLEZuPWZ1bmN0aW9uKGUpe3ZhciB0PWUuY2hpbGRyZW47cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Im5vLW1hcmdpbiJ9LCIgIix0LCIgIil9LFVuPWZ1bmN0aW9uKGUpe3llKCkobixlKTt2YXIgdD1fZSgpKG4pO2Z1bmN0aW9uIG4oKXtyZXR1cm4gXygpKHRoaXMsbiksdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIHgoKShuLFt7a2V5OiJyZW5kZXJOb3RBbmltYXRlZCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcm9wcy5pc09wZW5lZD9ELmEuY3JlYXRlRWxlbWVudChGbixudWxsLHRoaXMucHJvcHMuY2hpbGRyZW4pOkQuYS5jcmVhdGVFbGVtZW50KCJub3NjcmlwdCIsbnVsbCl9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcyx0PWUuYW5pbWF0ZWQsbj1lLmlzT3BlbmVkLHI9ZS5jaGlsZHJlbjtyZXR1cm4gdD8ocj1uP3I6bnVsbCxELmEuY3JlYXRlRWxlbWVudChGbixudWxsLHIpKTp0aGlzLnJlbmRlck5vdEFuaW1hdGVkKCl9fV0pLG59KEQuYS5Db21wb25lbnQpO3koKShVbiwiZGVmYXVsdFByb3BzIix7aXNPcGVuZWQ6ITEsYW5pbWF0ZWQ6ITF9KTt2YXIgcW49ZnVuY3Rpb24oZSl7eWUoKShuLGUpO3ZhciB0PV9lKCkobik7ZnVuY3Rpb24gbigpe3ZhciBlLHIsbztfKCkodGhpcyxuKTtmb3IodmFyIGE9YXJndW1lbnRzLmxlbmd0aCxpPW5ldyBBcnJheShhKSxzPTA7czxhO3MrKylpW3NdPWFyZ3VtZW50c1tzXTtyZXR1cm4obz10LmNhbGwuYXBwbHkodCx1KCkoZT1bdGhpc10pLmNhbGwoZSxpKSkpLnNldFRhZ1Nob3duPVMoKShyPW8uX3NldFRhZ1Nob3duKS5jYWxsKHIsdmUoKShvKSksb31yZXR1cm4geCgpKG4sW3trZXk6Il9zZXRUYWdTaG93biIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt0aGlzLnByb3BzLmxheW91dEFjdGlvbnMuc2hvdyhlLHQpfX0se2tleToic2hvd09wIix2YWx1ZTpmdW5jdGlvbihlLHQpe3RoaXMucHJvcHMubGF5b3V0QWN0aW9ucy5zaG93KGUsdCl9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcyx0PWUuc3BlY1NlbGVjdG9ycyxuPWUubGF5b3V0U2VsZWN0b3JzLHI9ZS5sYXlvdXRBY3Rpb25zLG89ZS5nZXRDb21wb25lbnQsYT10LnRhZ2dlZE9wZXJhdGlvbnMoKSxpPW8oIkNvbGxhcHNlIik7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsRC5hLmNyZWF0ZUVsZW1lbnQoImg0Iix7Y2xhc3NOYW1lOiJvdmVydmlldy10aXRsZSJ9LCJPdmVydmlldyIpLE0oKShhKS5jYWxsKGEsKGZ1bmN0aW9uKGUsdCl7dmFyIG89ZS5nZXQoIm9wZXJhdGlvbnMiKSxhPVsib3ZlcnZpZXctdGFncyIsdF0scz1uLmlzU2hvd24oYSwhMCk7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtrZXk6Im92ZXJ2aWV3LSIrdH0sRC5hLmNyZWF0ZUVsZW1lbnQoImg0Iix7b25DbGljazpmdW5jdGlvbigpe3JldHVybiByLnNob3coYSwhcyl9LGNsYXNzTmFtZToibGluayBvdmVydmlldy10YWcifSwiICIscz8iLSI6IisiLHQpLEQuYS5jcmVhdGVFbGVtZW50KGkse2lzT3BlbmVkOnMsYW5pbWF0ZWQ6ITB9LE0oKShvKS5jYWxsKG8sKGZ1bmN0aW9uKGUpe3ZhciB0PWUudG9PYmplY3QoKSxvPXQucGF0aCxhPXQubWV0aG9kLGk9dC5pZCxzPSJvcGVyYXRpb25zIix1PWksYz1uLmlzU2hvd24oW3MsdV0pO3JldHVybiBELmEuY3JlYXRlRWxlbWVudCh6bix7a2V5OmkscGF0aDpvLG1ldGhvZDphLGlkOm8rIi0iK2Esc2hvd246YyxzaG93T3BJZDp1LHNob3dPcElkUHJlZml4OnMsaHJlZjoiI29wZXJhdGlvbi0iLmNvbmNhdCh1KSxvbkNsaWNrOnIuc2hvd30pfSkpLnRvQXJyYXkoKSkpfSkpLnRvQXJyYXkoKSxhLnNpemU8MSYmRC5hLmNyZWF0ZUVsZW1lbnQoImgzIixudWxsLCIgTm8gb3BlcmF0aW9ucyBkZWZpbmVkIGluIHNwZWMhICIpKX19XSksbn0oRC5hLkNvbXBvbmVudCksem49ZnVuY3Rpb24oZSl7eWUoKShuLGUpO3ZhciB0PV9lKCkobik7ZnVuY3Rpb24gbihlKXt2YXIgcixvO3JldHVybiBfKCkodGhpcyxuKSwobz10LmNhbGwodGhpcyxlKSkub25DbGljaz1TKCkocj1vLl9vbkNsaWNrKS5jYWxsKHIsdmUoKShvKSksb31yZXR1cm4geCgpKG4sW3trZXk6Il9vbkNsaWNrIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsdD1lLnNob3dPcElkLG49ZS5zaG93T3BJZFByZWZpeDsoMCxlLm9uQ2xpY2spKFtuLHRdLCFlLnNob3duKX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLHQ9ZS5pZCxuPWUubWV0aG9kLHI9ZS5zaG93bixvPWUuaHJlZjtyZXR1cm4gRC5hLmNyZWF0ZUVsZW1lbnQoQm4se2hyZWY6byxvbkNsaWNrOnRoaXMub25DbGljayxjbGFzc05hbWU6ImJsb2NrIG9wYmxvY2stbGluayAiLmNvbmNhdChyPyJzaG93biI6IiIpfSxELmEuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLEQuYS5jcmVhdGVFbGVtZW50KCJzbWFsbCIse2NsYXNzTmFtZToiYm9sZC1sYWJlbC0iLmNvbmNhdChuKX0sbi50b1VwcGVyQ2FzZSgpKSxELmEuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToiYm9sZC1sYWJlbCJ9LHQpKSl9fV0pLG59KEQuYS5Db21wb25lbnQpLFZuPVsidmFsdWUiLCJkZWZhdWx0VmFsdWUiLCJpbml0aWFsVmFsdWUiXSxXbj1mdW5jdGlvbihlKXt5ZSgpKG4sZSk7dmFyIHQ9X2UoKShuKTtmdW5jdGlvbiBuKCl7cmV0dXJuIF8oKSh0aGlzLG4pLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiB4KCkobixbe2tleToiY29tcG9uZW50RGlkTW91bnQiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5wcm9wcy5pbml0aWFsVmFsdWUmJih0aGlzLmlucHV0UmVmLnZhbHVlPXRoaXMucHJvcHMuaW5pdGlhbFZhbHVlKX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5wcm9wcyxuPSh0LnZhbHVlLHQuZGVmYXVsdFZhbHVlLHQuaW5pdGlhbFZhbHVlLFNuKCkodCxWbikpO3JldHVybiBELmEuY3JlYXRlRWxlbWVudCgiaW5wdXQiLHhuKCkoe30sbix7cmVmOmZ1bmN0aW9uKHQpe3JldHVybiBlLmlucHV0UmVmPXR9fSkpfX1dKSxufShELmEuQ29tcG9uZW50KSxIbj1mdW5jdGlvbihlKXt5ZSgpKG4sZSk7dmFyIHQ9X2UoKShuKTtmdW5jdGlvbiBuKCl7cmV0dXJuIF8oKSh0aGlzLG4pLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiB4KCkobixbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsdD1lLmhvc3Qsbj1lLmJhc2VQYXRoO3JldHVybiBELmEuY3JlYXRlRWxlbWVudCgicHJlIix7Y2xhc3NOYW1lOiJiYXNlLXVybCJ9LCJbIEJhc2UgVVJMOiAiLHQsbiwiIF0iKX19XSksbn0oRC5hLkNvbXBvbmVudCksJG49ZnVuY3Rpb24oZSl7eWUoKShuLGUpO3ZhciB0PV9lKCkobik7ZnVuY3Rpb24gbigpe3JldHVybiBfKCkodGhpcyxuKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4geCgpKG4sW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLHQ9ZS5kYXRhLG49ZS5nZXRDb21wb25lbnQscj1lLnNlbGVjdGVkU2VydmVyLG89ZS51cmwsYT10LmdldCgibmFtZSIpfHwidGhlIGRldmVsb3BlciIsaT11dCh0LmdldCgidXJsIiksbyx7c2VsZWN0ZWRTZXJ2ZXI6cn0pLHM9dC5nZXQoImVtYWlsIiksdT1uKCJMaW5rIik7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImluZm9fX2NvbnRhY3QifSxpJiZELmEuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLEQuYS5jcmVhdGVFbGVtZW50KHUse2hyZWY6T2JqZWN0KCQuRikoaSksdGFyZ2V0OiJfYmxhbmsifSxhLCIgLSBXZWJzaXRlIikpLHMmJkQuYS5jcmVhdGVFbGVtZW50KHUse2hyZWY6T2JqZWN0KCQuRikoIm1haWx0bzoiLmNvbmNhdChzKSl9LGk/IlNlbmQgZW1haWwgdG8gIi5jb25jYXQoYSk6IkNvbnRhY3QgIi5jb25jYXQoYSkpKX19XSksbn0oRC5hLkNvbXBvbmVudCksSm49ZnVuY3Rpb24oZSl7eWUoKShuLGUpO3ZhciB0PV9lKCkobik7ZnVuY3Rpb24gbigpe3JldHVybiBfKCkodGhpcyxuKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4geCgpKG4sW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLHQ9ZS5saWNlbnNlLG49ZS5nZXRDb21wb25lbnQscj1lLnNlbGVjdGVkU2VydmVyLG89ZS51cmwsYT1uKCJMaW5rIiksaT10LmdldCgibmFtZSIpfHwiTGljZW5zZSIscz11dCh0LmdldCgidXJsIiksbyx7c2VsZWN0ZWRTZXJ2ZXI6cn0pO3JldHVybiBELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJpbmZvX19saWNlbnNlIn0scz9ELmEuY3JlYXRlRWxlbWVudChhLHt0YXJnZXQ6Il9ibGFuayIsaHJlZjpPYmplY3QoJC5GKShzKX0saSk6RC5hLmNyZWF0ZUVsZW1lbnQoInNwYW4iLG51bGwsaSkpfX1dKSxufShELmEuQ29tcG9uZW50KSxLbj1mdW5jdGlvbihlKXt5ZSgpKG4sZSk7dmFyIHQ9X2UoKShuKTtmdW5jdGlvbiBuKCl7cmV0dXJuIF8oKSh0aGlzLG4pLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiB4KCkobixbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsdD1lLnVybCxuPSgwLGUuZ2V0Q29tcG9uZW50KSgiTGluayIpO3JldHVybiBELmEuY3JlYXRlRWxlbWVudChuLHt0YXJnZXQ6Il9ibGFuayIsaHJlZjpPYmplY3QoJC5GKSh0KX0sRC5hLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InVybCJ9LCIgIix0KSl9fV0pLG59KEQuYS5QdXJlQ29tcG9uZW50KSxZbj1mdW5jdGlvbihlKXt5ZSgpKG4sZSk7dmFyIHQ9X2UoKShuKTtmdW5jdGlvbiBuKCl7cmV0dXJuIF8oKSh0aGlzLG4pLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiB4KCkobixbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsdD1lLmluZm8sbj1lLnVybCxyPWUuaG9zdCxvPWUuYmFzZVBhdGgsYT1lLmdldENvbXBvbmVudCxpPWUuZXh0ZXJuYWxEb2NzLHM9ZS5zZWxlY3RlZFNlcnZlcix1PWUudXJsLGM9dC5nZXQoInZlcnNpb24iKSxsPXQuZ2V0KCJkZXNjcmlwdGlvbiIpLHA9dC5nZXQoInRpdGxlIiksZj11dCh0LmdldCgidGVybXNPZlNlcnZpY2UiKSx1LHtzZWxlY3RlZFNlcnZlcjpzfSksaD10LmdldCgiY29udGFjdCIpLGQ9dC5nZXQoImxpY2Vuc2UiKSxtPXV0KGkmJmkuZ2V0KCJ1cmwiKSx1LHtzZWxlY3RlZFNlcnZlcjpzfSksdj1pJiZpLmdldCgiZGVzY3JpcHRpb24iKSxnPWEoIk1hcmtkb3duIiwhMCkseT1hKCJMaW5rIiksYj1hKCJWZXJzaW9uU3RhbXAiKSxfPWEoIkluZm9VcmwiKSx3PWEoIkluZm9CYXNlUGF0aCIpO3JldHVybiBELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJpbmZvIn0sRC5hLmNyZWF0ZUVsZW1lbnQoImhncm91cCIse2NsYXNzTmFtZToibWFpbiJ9LEQuYS5jcmVhdGVFbGVtZW50KCJoMiIse2NsYXNzTmFtZToidGl0bGUifSxwLGMmJkQuYS5jcmVhdGVFbGVtZW50KGIse3ZlcnNpb246Y30pKSxyfHxvP0QuYS5jcmVhdGVFbGVtZW50KHcse2hvc3Q6cixiYXNlUGF0aDpvfSk6bnVsbCxuJiZELmEuY3JlYXRlRWxlbWVudChfLHtnZXRDb21wb25lbnQ6YSx1cmw6bn0pKSxELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJkZXNjcmlwdGlvbiJ9LEQuYS5jcmVhdGVFbGVtZW50KGcse3NvdXJjZTpsfSkpLGYmJkQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImluZm9fX3RvcyJ9LEQuYS5jcmVhdGVFbGVtZW50KHkse3RhcmdldDoiX2JsYW5rIixocmVmOk9iamVjdCgkLkYpKGYpfSwiVGVybXMgb2Ygc2VydmljZSIpKSxoJiZoLnNpemU/RC5hLmNyZWF0ZUVsZW1lbnQoJG4se2dldENvbXBvbmVudDphLGRhdGE6aCxzZWxlY3RlZFNlcnZlcjpzLHVybDpufSk6bnVsbCxkJiZkLnNpemU/RC5hLmNyZWF0ZUVsZW1lbnQoSm4se2dldENvbXBvbmVudDphLGxpY2Vuc2U6ZCxzZWxlY3RlZFNlcnZlcjpzLHVybDpufSk6bnVsbCxtP0QuYS5jcmVhdGVFbGVtZW50KHkse2NsYXNzTmFtZToiaW5mb19fZXh0ZG9jcyIsdGFyZ2V0OiJfYmxhbmsiLGhyZWY6T2JqZWN0KCQuRikobSl9LHZ8fG0pOm51bGwpfX1dKSxufShELmEuQ29tcG9uZW50KSxHbj1mdW5jdGlvbihlKXt5ZSgpKG4sZSk7dmFyIHQ9X2UoKShuKTtmdW5jdGlvbiBuKCl7cmV0dXJuIF8oKSh0aGlzLG4pLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiB4KCkobixbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsdD1lLnNwZWNTZWxlY3RvcnMsbj1lLmdldENvbXBvbmVudCxyPWUub2FzM1NlbGVjdG9ycyxvPXQuaW5mbygpLGE9dC51cmwoKSxpPXQuYmFzZVBhdGgoKSxzPXQuaG9zdCgpLHU9dC5leHRlcm5hbERvY3MoKSxjPXIuc2VsZWN0ZWRTZXJ2ZXIoKSxsPW4oImluZm8iKTtyZXR1cm4gRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxvJiZvLmNvdW50KCk/RC5hLmNyZWF0ZUVsZW1lbnQobCx7aW5mbzpvLHVybDphLGhvc3Q6cyxiYXNlUGF0aDppLGV4dGVybmFsRG9jczp1LGdldENvbXBvbmVudDpuLHNlbGVjdGVkU2VydmVyOmN9KTpudWxsKX19XSksbn0oRC5hLkNvbXBvbmVudCksWm49ZnVuY3Rpb24oZSl7eWUoKShuLGUpO3ZhciB0PV9lKCkobik7ZnVuY3Rpb24gbigpe3JldHVybiBfKCkodGhpcyxuKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4geCgpKG4sW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH19XSksbn0oRC5hLkNvbXBvbmVudCksWG49ZnVuY3Rpb24oZSl7eWUoKShuLGUpO3ZhciB0PV9lKCkobik7ZnVuY3Rpb24gbigpe3JldHVybiBfKCkodGhpcyxuKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4geCgpKG4sW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiZm9vdGVyIn0pfX1dKSxufShELmEuQ29tcG9uZW50KSxRbj1mdW5jdGlvbihlKXt5ZSgpKG4sZSk7dmFyIHQ9X2UoKShuKTtmdW5jdGlvbiBuKCl7dmFyIGUscjtfKCkodGhpcyxuKTtmb3IodmFyIG89YXJndW1lbnRzLmxlbmd0aCxhPW5ldyBBcnJheShvKSxpPTA7aTxvO2krKylhW2ldPWFyZ3VtZW50c1tpXTtyZXR1cm4gcj10LmNhbGwuYXBwbHkodCx1KCkoZT1bdGhpc10pLmNhbGwoZSxhKSkseSgpKHZlKCkociksIm9uRmlsdGVyQ2hhbmdlIiwoZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YXJnZXQudmFsdWU7ci5wcm9wcy5sYXlvdXRBY3Rpb25zLnVwZGF0ZUZpbHRlcih0KX0pKSxyfXJldHVybiB4KCkobixbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsdD1lLnNwZWNTZWxlY3RvcnMsbj1lLmxheW91dFNlbGVjdG9ycyxyPSgwLGUuZ2V0Q29tcG9uZW50KSgiQ29sIiksbz0ibG9hZGluZyI9PT10LmxvYWRpbmdTdGF0dXMoKSxhPSJmYWlsZWQiPT09dC5sb2FkaW5nU3RhdHVzKCksaT1uLmN1cnJlbnRGaWx0ZXIoKSxzPVsib3BlcmF0aW9uLWZpbHRlci1pbnB1dCJdO3JldHVybiBhJiZzLnB1c2goImZhaWxlZCIpLG8mJnMucHVzaCgibG9hZGluZyIpLEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsbnVsbD09PWl8fCExPT09aXx8ImZhbHNlIj09PWk/bnVsbDpELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJmaWx0ZXItY29udGFpbmVyIn0sRC5hLmNyZWF0ZUVsZW1lbnQocix7Y2xhc3NOYW1lOiJmaWx0ZXIgd3JhcHBlciIsbW9iaWxlOjEyfSxELmEuY3JlYXRlRWxlbWVudCgiaW5wdXQiLHtjbGFzc05hbWU6cy5qb2luKCIgIikscGxhY2Vob2xkZXI6IkZpbHRlciBieSB0YWciLHR5cGU6InRleHQiLG9uQ2hhbmdlOnRoaXMub25GaWx0ZXJDaGFuZ2UsdmFsdWU6ITA9PT1pfHwidHJ1ZSI9PT1pPyIiOmksZGlzYWJsZWQ6b30pKSkpfX1dKSxufShELmEuQ29tcG9uZW50KSxlcj1GdW5jdGlvbi5wcm90b3R5cGUsdHI9ZnVuY3Rpb24oZSl7eWUoKShuLGUpO3ZhciB0PV9lKCkobik7ZnVuY3Rpb24gbihlLHIpe3ZhciBvO3JldHVybiBfKCkodGhpcyxuKSxvPXQuY2FsbCh0aGlzLGUscikseSgpKHZlKCkobyksInVwZGF0ZVZhbHVlcyIsKGZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyYW0sbj1lLmlzRXhlY3V0ZSxyPWUuY29uc3VtZXNWYWx1ZSxhPXZvaWQgMD09PXI/IiI6cixpPS94bWwvaS50ZXN0KGEpLHM9L2pzb24vaS50ZXN0KGEpLHU9aT90LmdldCgidmFsdWVfeG1sIik6dC5nZXQoInZhbHVlIik7aWYodm9pZCAwIT09dSl7dmFyIGM9IXUmJnM/Int9Ijp1O28uc2V0U3RhdGUoe3ZhbHVlOmN9KSxvLm9uQ2hhbmdlKGMse2lzWG1sOmksaXNFZGl0Qm94Om59KX1lbHNlIGk/by5vbkNoYW5nZShvLnNhbXBsZSgieG1sIikse2lzWG1sOmksaXNFZGl0Qm94Om59KTpvLm9uQ2hhbmdlKG8uc2FtcGxlKCkse2lzRWRpdEJveDpufSl9KSkseSgpKHZlKCkobyksInNhbXBsZSIsKGZ1bmN0aW9uKGUpe3ZhciB0PW8ucHJvcHMsbj10LnBhcmFtLHI9KDAsdC5mbi5pbmZlclNjaGVtYSkobi50b0pTKCkpO3JldHVybiBPYmplY3QoJC5vKShyLGUse2luY2x1ZGVXcml0ZU9ubHk6ITB9KX0pKSx5KCkodmUoKShvKSwib25DaGFuZ2UiLChmdW5jdGlvbihlLHQpe3ZhciBuPXQuaXNFZGl0Qm94LHI9dC5pc1htbDtvLnNldFN0YXRlKHt2YWx1ZTplLGlzRWRpdEJveDpufSksby5fb25DaGFuZ2UoZSxyKX0pKSx5KCkodmUoKShvKSwiX29uQ2hhbmdlIiwoZnVuY3Rpb24oZSx0KXsoby5wcm9wcy5vbkNoYW5nZXx8ZXIpKGUsdCl9KSkseSgpKHZlKCkobyksImhhbmRsZU9uQ2hhbmdlIiwoZnVuY3Rpb24oZSl7dmFyIHQ9by5wcm9wcy5jb25zdW1lc1ZhbHVlLG49L3htbC9pLnRlc3QodCkscj1lLnRhcmdldC52YWx1ZTtvLm9uQ2hhbmdlKHIse2lzWG1sOm59KX0pKSx5KCkodmUoKShvKSwidG9nZ2xlSXNFZGl0Qm94IiwoZnVuY3Rpb24oKXtyZXR1cm4gby5zZXRTdGF0ZSgoZnVuY3Rpb24oZSl7cmV0dXJue2lzRWRpdEJveDohZS5pc0VkaXRCb3h9fSkpfSkpLG8uc3RhdGU9e2lzRWRpdEJveDohMSx2YWx1ZToiIn0sb31yZXR1cm4geCgpKG4sW3trZXk6ImNvbXBvbmVudERpZE1vdW50Iix2YWx1ZTpmdW5jdGlvbigpe3RoaXMudXBkYXRlVmFsdWVzLmNhbGwodGhpcyx0aGlzLnByb3BzKX19LHtrZXk6ImNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMiLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMudXBkYXRlVmFsdWVzLmNhbGwodGhpcyxlKX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLHQ9ZS5vbkNoYW5nZUNvbnN1bWVzLHI9ZS5wYXJhbSxvPWUuaXNFeGVjdXRlLGE9ZS5zcGVjU2VsZWN0b3JzLGk9ZS5wYXRoTWV0aG9kLHM9ZS5nZXRDb25maWdzLHU9ZS5nZXRDb21wb25lbnQsYz11KCJCdXR0b24iKSxsPXUoIlRleHRBcmVhIikscD11KCJoaWdobGlnaHRDb2RlIiksZj11KCJjb250ZW50VHlwZSIpLGg9KGE/YS5wYXJhbWV0ZXJXaXRoTWV0YUJ5SWRlbnRpdHkoaSxyKTpyKS5nZXQoImVycm9ycyIsT2JqZWN0KEIuTGlzdCkoKSksZD1hLmNvbnRlbnRUeXBlVmFsdWVzKGkpLmdldCgicmVxdWVzdENvbnRlbnRUeXBlIiksbT10aGlzLnByb3BzLmNvbnN1bWVzJiZ0aGlzLnByb3BzLmNvbnN1bWVzLnNpemU/dGhpcy5wcm9wcy5jb25zdW1lczpuLmRlZmF1bHRQcm9wLmNvbnN1bWVzLHY9dGhpcy5zdGF0ZSxnPXYudmFsdWUseT12LmlzRWRpdEJveCxiPW51bGw7cmV0dXJuIE9iamVjdChIdC5hKShnKSYmKGI9Impzb24iKSxELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJib2R5LXBhcmFtIiwiZGF0YS1wYXJhbS1uYW1lIjpyLmdldCgibmFtZSIpLCJkYXRhLXBhcmFtLWluIjpyLmdldCgiaW4iKX0seSYmbz9ELmEuY3JlYXRlRWxlbWVudChsLHtjbGFzc05hbWU6ImJvZHktcGFyYW1fX3RleHQiKyhoLmNvdW50KCk/IiBpbnZhbGlkIjoiIiksdmFsdWU6ZyxvbkNoYW5nZTp0aGlzLmhhbmRsZU9uQ2hhbmdlfSk6ZyYmRC5hLmNyZWF0ZUVsZW1lbnQocCx7Y2xhc3NOYW1lOiJib2R5LXBhcmFtX19leGFtcGxlIixsYW5ndWFnZTpiLGdldENvbmZpZ3M6cyx2YWx1ZTpnfSksRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiYm9keS1wYXJhbS1vcHRpb25zIn0sbz9ELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJib2R5LXBhcmFtLWVkaXQifSxELmEuY3JlYXRlRWxlbWVudChjLHtjbGFzc05hbWU6eT8iYnRuIGNhbmNlbCBib2R5LXBhcmFtX19leGFtcGxlLWVkaXQiOiJidG4gZWRpdCBib2R5LXBhcmFtX19leGFtcGxlLWVkaXQiLG9uQ2xpY2s6dGhpcy50b2dnbGVJc0VkaXRCb3h9LHk/IkNhbmNlbCI6IkVkaXQiKSk6bnVsbCxELmEuY3JlYXRlRWxlbWVudCgibGFiZWwiLHtodG1sRm9yOiIifSxELmEuY3JlYXRlRWxlbWVudCgic3BhbiIsbnVsbCwiUGFyYW1ldGVyIGNvbnRlbnQgdHlwZSIpLEQuYS5jcmVhdGVFbGVtZW50KGYse3ZhbHVlOmQsY29udGVudFR5cGVzOm0sb25DaGFuZ2U6dCxjbGFzc05hbWU6ImJvZHktcGFyYW0tY29udGVudC10eXBlIixhcmlhTGFiZWw6IlBhcmFtZXRlciBjb250ZW50IHR5cGUifSkpKSl9fV0pLG59KFIuUHVyZUNvbXBvbmVudCk7eSgpKHRyLCJkZWZhdWx0UHJvcCIse2NvbnN1bWVzOk9iamVjdChCLmZyb21KUykoWyJhcHBsaWNhdGlvbi9qc29uIl0pLHBhcmFtOk9iamVjdChCLmZyb21KUykoe30pLG9uQ2hhbmdlOmVyLG9uQ2hhbmdlQ29uc3VtZXM6ZXJ9KTt2YXIgbnI9bigxNzIpLHJyPWZ1bmN0aW9uKGUpe3llKCkobixlKTt2YXIgdD1fZSgpKG4pO2Z1bmN0aW9uIG4oKXtyZXR1cm4gXygpKHRoaXMsbiksdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIHgoKShuLFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcyx0PWUucmVxdWVzdCxuPWUuZ2V0Q29uZmlncyxyPU9iamVjdChuci5yZXF1ZXN0U25pcHBldEdlbmVyYXRvcl9jdXJsX2Jhc2gpKHQpLG89bigpLGE9UHQoKShvLCJzeW50YXhIaWdobGlnaHQuYWN0aXZhdGVkIik/RC5hLmNyZWF0ZUVsZW1lbnQoVHQuYSx7bGFuZ3VhZ2U6ImJhc2giLGNsYXNzTmFtZToiY3VybCBtaWNyb2xpZ2h0IixvbldoZWVsOnRoaXMucHJldmVudFlTY3JvbGxpbmdCZXlvbmRFbGVtZW50LHN0eWxlOk9iamVjdChUdC5iKShQdCgpKG8sInN5bnRheEhpZ2hsaWdodC50aGVtZSIpKX0scik6RC5hLmNyZWF0ZUVsZW1lbnQoInRleHRhcmVhIix7cmVhZE9ubHk6ITAsY2xhc3NOYW1lOiJjdXJsIix2YWx1ZTpyfSk7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImN1cmwtY29tbWFuZCJ9LEQuYS5jcmVhdGVFbGVtZW50KCJoNCIsbnVsbCwiQ3VybCIpLEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImNvcHktdG8tY2xpcGJvYXJkIn0sRC5hLmNyZWF0ZUVsZW1lbnQoUnQuQ29weVRvQ2xpcGJvYXJkLHt0ZXh0OnJ9LEQuYS5jcmVhdGVFbGVtZW50KCJidXR0b24iLG51bGwpKSksRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxhKSl9fV0pLG59KEQuYS5Db21wb25lbnQpLG9yPWZ1bmN0aW9uKGUpe3llKCkobixlKTt2YXIgdD1fZSgpKG4pO2Z1bmN0aW9uIG4oKXt2YXIgZSxyO18oKSh0aGlzLG4pO2Zvcih2YXIgbz1hcmd1bWVudHMubGVuZ3RoLGE9bmV3IEFycmF5KG8pLGk9MDtpPG87aSsrKWFbaV09YXJndW1lbnRzW2ldO3JldHVybiByPXQuY2FsbC5hcHBseSh0LHUoKShlPVt0aGlzXSkuY2FsbChlLGEpKSx5KCkodmUoKShyKSwib25DaGFuZ2UiLChmdW5jdGlvbihlKXtyLnNldFNjaGVtZShlLnRhcmdldC52YWx1ZSl9KSkseSgpKHZlKCkociksInNldFNjaGVtZSIsKGZ1bmN0aW9uKGUpe3ZhciB0PXIucHJvcHMsbj10LnBhdGgsbz10Lm1ldGhvZDt0LnNwZWNBY3Rpb25zLnNldFNjaGVtZShlLG4sbyl9KSkscn1yZXR1cm4geCgpKG4sW3trZXk6ImNvbXBvbmVudFdpbGxNb3VudCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLnNjaGVtZXM7dGhpcy5zZXRTY2hlbWUoZS5maXJzdCgpKX19LHtrZXk6ImNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0O3RoaXMucHJvcHMuY3VycmVudFNjaGVtZSYmJGUoKSh0PWUuc2NoZW1lcykuY2FsbCh0LHRoaXMucHJvcHMuY3VycmVudFNjaGVtZSl8fHRoaXMuc2V0U2NoZW1lKGUuc2NoZW1lcy5maXJzdCgpKX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXMucHJvcHMsbj10LnNjaGVtZXMscj10LmN1cnJlbnRTY2hlbWU7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJsYWJlbCIse2h0bWxGb3I6InNjaGVtZXMifSxELmEuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToic2NoZW1lcy10aXRsZSJ9LCJTY2hlbWVzIiksRC5hLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIse29uQ2hhbmdlOnRoaXMub25DaGFuZ2UsdmFsdWU6cn0sTSgpKGU9bi52YWx1ZVNlcSgpKS5jYWxsKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBELmEuY3JlYXRlRWxlbWVudCgib3B0aW9uIix7dmFsdWU6ZSxrZXk6ZX0sZSl9KSkudG9BcnJheSgpKSl9fV0pLG59KEQuYS5Db21wb25lbnQpLGFyPWZ1bmN0aW9uKGUpe3llKCkobixlKTt2YXIgdD1fZSgpKG4pO2Z1bmN0aW9uIG4oKXtyZXR1cm4gXygpKHRoaXMsbiksdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIHgoKShuLFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcyx0PWUuc3BlY0FjdGlvbnMsbj1lLnNwZWNTZWxlY3RvcnMscj1lLmdldENvbXBvbmVudCxvPW4ub3BlcmF0aW9uU2NoZW1lKCksYT1uLnNjaGVtZXMoKSxpPXIoInNjaGVtZXMiKTtyZXR1cm4gYSYmYS5zaXplP0QuYS5jcmVhdGVFbGVtZW50KGkse2N1cnJlbnRTY2hlbWU6byxzY2hlbWVzOmEsc3BlY0FjdGlvbnM6dH0pOm51bGx9fV0pLG59KEQuYS5Db21wb25lbnQpLGlyPWZ1bmN0aW9uKGUpe3llKCkobixlKTt2YXIgdD1fZSgpKG4pO2Z1bmN0aW9uIG4oZSxyKXt2YXIgbztfKCkodGhpcyxuKSxvPXQuY2FsbCh0aGlzLGUscikseSgpKHZlKCkobyksInRvZ2dsZUNvbGxhcHNlZCIsKGZ1bmN0aW9uKCl7by5wcm9wcy5vblRvZ2dsZSYmby5wcm9wcy5vblRvZ2dsZShvLnByb3BzLm1vZGVsTmFtZSwhby5zdGF0ZS5leHBhbmRlZCksby5zZXRTdGF0ZSh7ZXhwYW5kZWQ6IW8uc3RhdGUuZXhwYW5kZWR9KX0pKSx5KCkodmUoKShvKSwib25Mb2FkIiwoZnVuY3Rpb24oZSl7aWYoZSYmby5wcm9wcy5sYXlvdXRTZWxlY3RvcnMpe3ZhciB0PW8ucHJvcHMubGF5b3V0U2VsZWN0b3JzLmdldFNjcm9sbFRvS2V5KCk7Ri5hLmlzKHQsby5wcm9wcy5zcGVjUGF0aCkmJm8udG9nZ2xlQ29sbGFwc2VkKCksby5wcm9wcy5sYXlvdXRBY3Rpb25zLnJlYWR5VG9TY3JvbGwoby5wcm9wcy5zcGVjUGF0aCxlLnBhcmVudEVsZW1lbnQpfX0pKTt2YXIgYT1vLnByb3BzLGk9YS5leHBhbmRlZCxzPWEuY29sbGFwc2VkQ29udGVudDtyZXR1cm4gby5zdGF0ZT17ZXhwYW5kZWQ6aSxjb2xsYXBzZWRDb250ZW50OnN8fG4uZGVmYXVsdFByb3BzLmNvbGxhcHNlZENvbnRlbnR9LG99cmV0dXJuIHgoKShuLFt7a2V5OiJjb21wb25lbnREaWRNb3VudCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLHQ9ZS5oaWRlU2VsZk9uRXhwYW5kLG49ZS5leHBhbmRlZCxyPWUubW9kZWxOYW1lO3QmJm4mJnRoaXMucHJvcHMub25Ub2dnbGUocixuKX19LHtrZXk6ImNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMiLHZhbHVlOmZ1bmN0aW9uKGUpe3RoaXMucHJvcHMuZXhwYW5kZWQhPT1lLmV4cGFuZGVkJiZ0aGlzLnNldFN0YXRlKHtleHBhbmRlZDplLmV4cGFuZGVkfSl9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcyx0PWUudGl0bGUsbj1lLmNsYXNzZXM7cmV0dXJuIHRoaXMuc3RhdGUuZXhwYW5kZWQmJnRoaXMucHJvcHMuaGlkZVNlbGZPbkV4cGFuZD9ELmEuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZTpufHwiIn0sdGhpcy5wcm9wcy5jaGlsZHJlbik6RC5hLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6bnx8IiIscmVmOnRoaXMub25Mb2FkfSxELmEuY3JlYXRlRWxlbWVudCgiYnV0dG9uIix7ImFyaWEtZXhwYW5kZWQiOnRoaXMuc3RhdGUuZXhwYW5kZWQsY2xhc3NOYW1lOiJtb2RlbC1ib3gtY29udHJvbCIsb25DbGljazp0aGlzLnRvZ2dsZUNvbGxhcHNlZH0sdCYmRC5hLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6InBvaW50ZXIifSx0KSxELmEuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToibW9kZWwtdG9nZ2xlIisodGhpcy5zdGF0ZS5leHBhbmRlZD8iIjoiIGNvbGxhcHNlZCIpfSksIXRoaXMuc3RhdGUuZXhwYW5kZWQmJkQuYS5jcmVhdGVFbGVtZW50KCJzcGFuIixudWxsLHRoaXMuc3RhdGUuY29sbGFwc2VkQ29udGVudCkpLHRoaXMuc3RhdGUuZXhwYW5kZWQmJnRoaXMucHJvcHMuY2hpbGRyZW4pfX1dKSxufShSLkNvbXBvbmVudCk7eSgpKGlyLCJkZWZhdWx0UHJvcHMiLHtjb2xsYXBzZWRDb250ZW50OiJ7Li4ufSIsZXhwYW5kZWQ6ITEsdGl0bGU6bnVsbCxvblRvZ2dsZTpmdW5jdGlvbigpe30saGlkZVNlbGZPbkV4cGFuZDohMSxzcGVjUGF0aDpGLmEuTGlzdChbXSl9KTt2YXIgc3I9bigxMjUpLHVyPW4ubihzciksY3I9ZnVuY3Rpb24oZSl7eWUoKShuLGUpO3ZhciB0PV9lKCkobik7ZnVuY3Rpb24gbihlLHIpe3ZhciBvO18oKSh0aGlzLG4pLG89dC5jYWxsKHRoaXMsZSxyKSx5KCkodmUoKShvKSwiYWN0aXZlVGFiIiwoZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YXJnZXQuZGF0YXNldC5uYW1lO28uc2V0U3RhdGUoe2FjdGl2ZVRhYjp0fSl9KSk7dmFyIGE9by5wcm9wcyxpPWEuZ2V0Q29uZmlncyxzPWEuaXNFeGVjdXRlLHU9aSgpLmRlZmF1bHRNb2RlbFJlbmRlcmluZyxjPXU7cmV0dXJuImV4YW1wbGUiIT09dSYmIm1vZGVsIiE9PXUmJihjPSJleGFtcGxlIikscyYmKGM9ImV4YW1wbGUiKSxvLnN0YXRlPXthY3RpdmVUYWI6Y30sb31yZXR1cm4geCgpKG4sW3trZXk6ImNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMiLHZhbHVlOmZ1bmN0aW9uKGUpe2UuaXNFeGVjdXRlJiYhdGhpcy5wcm9wcy5pc0V4ZWN1dGUmJnRoaXMucHJvcHMuZXhhbXBsZSYmdGhpcy5zZXRTdGF0ZSh7YWN0aXZlVGFiOiJleGFtcGxlIn0pfX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsdD1lLmdldENvbXBvbmVudCxuPWUuc3BlY1NlbGVjdG9ycyxyPWUuc2NoZW1hLG89ZS5leGFtcGxlLGE9ZS5pc0V4ZWN1dGUsaT1lLmdldENvbmZpZ3Mscz1lLnNwZWNQYXRoLHU9ZS5pbmNsdWRlUmVhZE9ubHksYz1lLmluY2x1ZGVXcml0ZU9ubHksbD1pKCkuZGVmYXVsdE1vZGVsRXhwYW5kRGVwdGgscD10KCJNb2RlbFdyYXBwZXIiKSxmPXQoImhpZ2hsaWdodENvZGUiKSxoPXVyKCkoNSkudG9TdHJpbmcoImJhc2U2NCIpLGQ9dXIoKSg1KS50b1N0cmluZygiYmFzZTY0IiksbT11cigpKDUpLnRvU3RyaW5nKCJiYXNlNjQiKSx2PXVyKCkoNSkudG9TdHJpbmcoImJhc2U2NCIpLGc9bi5pc09BUzMoKTtyZXR1cm4gRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToibW9kZWwtZXhhbXBsZSJ9LEQuYS5jcmVhdGVFbGVtZW50KCJ1bCIse2NsYXNzTmFtZToidGFiIixyb2xlOiJ0YWJsaXN0In0sRC5hLmNyZWF0ZUVsZW1lbnQoImxpIix7Y2xhc3NOYW1lOld0KCkoInRhYml0ZW0iLHthY3RpdmU6ImV4YW1wbGUiPT09dGhpcy5zdGF0ZS5hY3RpdmVUYWJ9KSxyb2xlOiJwcmVzZW50YXRpb24ifSxELmEuY3JlYXRlRWxlbWVudCgiYnV0dG9uIix7ImFyaWEtY29udHJvbHMiOmQsImFyaWEtc2VsZWN0ZWQiOiJleGFtcGxlIj09PXRoaXMuc3RhdGUuYWN0aXZlVGFiLGNsYXNzTmFtZToidGFibGlua3MiLCJkYXRhLW5hbWUiOiJleGFtcGxlIixpZDpoLG9uQ2xpY2s6dGhpcy5hY3RpdmVUYWIscm9sZToidGFiIn0sYT8iRWRpdCBWYWx1ZSI6IkV4YW1wbGUgVmFsdWUiKSksciYmRC5hLmNyZWF0ZUVsZW1lbnQoImxpIix7Y2xhc3NOYW1lOld0KCkoInRhYml0ZW0iLHthY3RpdmU6Im1vZGVsIj09PXRoaXMuc3RhdGUuYWN0aXZlVGFifSkscm9sZToicHJlc2VudGF0aW9uIn0sRC5hLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIseyJhcmlhLWNvbnRyb2xzIjp2LCJhcmlhLXNlbGVjdGVkIjoibW9kZWwiPT09dGhpcy5zdGF0ZS5hY3RpdmVUYWIsY2xhc3NOYW1lOld0KCkoInRhYmxpbmtzIix7aW5hY3RpdmU6YX0pLCJkYXRhLW5hbWUiOiJtb2RlbCIsaWQ6bSxvbkNsaWNrOnRoaXMuYWN0aXZlVGFiLHJvbGU6InRhYiJ9LGc/IlNjaGVtYSI6Ik1vZGVsIikpKSwiZXhhbXBsZSI9PT10aGlzLnN0YXRlLmFjdGl2ZVRhYiYmRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIseyJhcmlhLWhpZGRlbiI6ImV4YW1wbGUiIT09dGhpcy5zdGF0ZS5hY3RpdmVUYWIsImFyaWEtbGFiZWxsZWRieSI6aCwiZGF0YS1uYW1lIjoiZXhhbXBsZVBhbmVsIixpZDpkLHJvbGU6InRhYnBhbmVsIix0YWJJbmRleDoiMCJ9LG98fEQuYS5jcmVhdGVFbGVtZW50KGYse3ZhbHVlOiIobm8gZXhhbXBsZSBhdmFpbGFibGUpIixnZXRDb25maWdzOml9KSksIm1vZGVsIj09PXRoaXMuc3RhdGUuYWN0aXZlVGFiJiZELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7ImFyaWEtaGlkZGVuIjoiZXhhbXBsZSI9PT10aGlzLnN0YXRlLmFjdGl2ZVRhYiwiYXJpYS1sYWJlbGxlZGJ5IjptLCJkYXRhLW5hbWUiOiJtb2RlbFBhbmVsIixpZDp2LHJvbGU6InRhYnBhbmVsIix0YWJJbmRleDoiMCJ9LEQuYS5jcmVhdGVFbGVtZW50KHAse3NjaGVtYTpyLGdldENvbXBvbmVudDp0LGdldENvbmZpZ3M6aSxzcGVjU2VsZWN0b3JzOm4sZXhwYW5kRGVwdGg6bCxzcGVjUGF0aDpzLGluY2x1ZGVSZWFkT25seTp1LGluY2x1ZGVXcml0ZU9ubHk6Y30pKSl9fV0pLG59KEQuYS5Db21wb25lbnQpLGxyPWZ1bmN0aW9uKGUpe3llKCkobixlKTt2YXIgdD1fZSgpKG4pO2Z1bmN0aW9uIG4oKXt2YXIgZSxyO18oKSh0aGlzLG4pO2Zvcih2YXIgbz1hcmd1bWVudHMubGVuZ3RoLGE9bmV3IEFycmF5KG8pLGk9MDtpPG87aSsrKWFbaV09YXJndW1lbnRzW2ldO3JldHVybiByPXQuY2FsbC5hcHBseSh0LHUoKShlPVt0aGlzXSkuY2FsbChlLGEpKSx5KCkodmUoKShyKSwib25Ub2dnbGUiLChmdW5jdGlvbihlLHQpe3IucHJvcHMubGF5b3V0QWN0aW9ucyYmci5wcm9wcy5sYXlvdXRBY3Rpb25zLnNob3coci5wcm9wcy5mdWxsUGF0aCx0KX0pKSxyfXJldHVybiB4KCkobixbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlLHQ9dGhpcy5wcm9wcyxuPXQuZ2V0Q29tcG9uZW50LHI9dC5nZXRDb25maWdzLG89bigiTW9kZWwiKTtyZXR1cm4gdGhpcy5wcm9wcy5sYXlvdXRTZWxlY3RvcnMmJihlPXRoaXMucHJvcHMubGF5b3V0U2VsZWN0b3JzLmlzU2hvd24odGhpcy5wcm9wcy5mdWxsUGF0aCkpLEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6Im1vZGVsLWJveCJ9LEQuYS5jcmVhdGVFbGVtZW50KG8seG4oKSh7fSx0aGlzLnByb3BzLHtnZXRDb25maWdzOnIsZXhwYW5kZWQ6ZSxkZXB0aDoxLG9uVG9nZ2xlOnRoaXMub25Ub2dnbGUsZXhwYW5kRGVwdGg6dGhpcy5wcm9wcy5leHBhbmREZXB0aHx8MH0pKSl9fV0pLG59KFIuQ29tcG9uZW50KSxwcj1uKDIyMCksZnI9ZnVuY3Rpb24oZSl7eWUoKShuLGUpO3ZhciB0PV9lKCkobik7ZnVuY3Rpb24gbigpe3ZhciBlLHI7XygpKHRoaXMsbik7Zm9yKHZhciBvPWFyZ3VtZW50cy5sZW5ndGgsYT1uZXcgQXJyYXkobyksaT0wO2k8bztpKyspYVtpXT1hcmd1bWVudHNbaV07cmV0dXJuIHI9dC5jYWxsLmFwcGx5KHQsdSgpKGU9W3RoaXNdKS5jYWxsKGUsYSkpLHkoKSh2ZSgpKHIpLCJnZXRTY2hlbWFCYXNlUGF0aCIsKGZ1bmN0aW9uKCl7cmV0dXJuIHIucHJvcHMuc3BlY1NlbGVjdG9ycy5pc09BUzMoKT9bImNvbXBvbmVudHMiLCJzY2hlbWFzIl06WyJkZWZpbml0aW9ucyJdfSkpLHkoKSh2ZSgpKHIpLCJnZXRDb2xsYXBzZWRDb250ZW50IiwoZnVuY3Rpb24oKXtyZXR1cm4iICJ9KSkseSgpKHZlKCkociksImhhbmRsZVRvZ2dsZSIsKGZ1bmN0aW9uKGUsdCl7dmFyIG4sbzsoci5wcm9wcy5sYXlvdXRBY3Rpb25zLnNob3codSgpKG49W10pLmNhbGwobixubigpKHIuZ2V0U2NoZW1hQmFzZVBhdGgoKSksW2VdKSx0KSx0KSYmci5wcm9wcy5zcGVjQWN0aW9ucy5yZXF1ZXN0UmVzb2x2ZWRTdWJ0cmVlKHUoKShvPVtdKS5jYWxsKG8sbm4oKShyLmdldFNjaGVtYUJhc2VQYXRoKCkpLFtlXSkpfSkpLHkoKSh2ZSgpKHIpLCJvbkxvYWRNb2RlbHMiLChmdW5jdGlvbihlKXtlJiZyLnByb3BzLmxheW91dEFjdGlvbnMucmVhZHlUb1Njcm9sbChyLmdldFNjaGVtYUJhc2VQYXRoKCksZSl9KSkseSgpKHZlKCkociksIm9uTG9hZE1vZGVsIiwoZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQsbj1lLmdldEF0dHJpYnV0ZSgiZGF0YS1uYW1lIik7ci5wcm9wcy5sYXlvdXRBY3Rpb25zLnJlYWR5VG9TY3JvbGwodSgpKHQ9W10pLmNhbGwodCxubigpKHIuZ2V0U2NoZW1hQmFzZVBhdGgoKSksW25dKSxlKX19KSkscn1yZXR1cm4geCgpKG4sW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXMsbj10aGlzLnByb3BzLHI9bi5zcGVjU2VsZWN0b3JzLG89bi5nZXRDb21wb25lbnQsYT1uLmxheW91dFNlbGVjdG9ycyxpPW4ubGF5b3V0QWN0aW9ucyxzPW4uZ2V0Q29uZmlncyxjPXIuZGVmaW5pdGlvbnMoKSxsPXMoKSxwPWwuZG9jRXhwYW5zaW9uLGY9bC5kZWZhdWx0TW9kZWxzRXhwYW5kRGVwdGg7aWYoIWMuc2l6ZXx8ZjwwKXJldHVybiBudWxsO3ZhciBoPXRoaXMuZ2V0U2NoZW1hQmFzZVBhdGgoKSxkPWEuaXNTaG93bihoLGY+MCYmIm5vbmUiIT09cCksbT1yLmlzT0FTMygpLHY9bygiTW9kZWxXcmFwcGVyIiksZz1vKCJDb2xsYXBzZSIpLHk9bygiTW9kZWxDb2xsYXBzZSIpLGI9bygiSnVtcFRvUGF0aCIpO3JldHVybiBELmEuY3JlYXRlRWxlbWVudCgic2VjdGlvbiIse2NsYXNzTmFtZTpkPyJtb2RlbHMgaXMtb3BlbiI6Im1vZGVscyIscmVmOnRoaXMub25Mb2FkTW9kZWxzfSxELmEuY3JlYXRlRWxlbWVudCgiaDQiLG51bGwsRC5hLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIseyJhcmlhLWV4cGFuZGVkIjpkLGNsYXNzTmFtZToibW9kZWxzLWNvbnRyb2wiLG9uQ2xpY2s6ZnVuY3Rpb24oKXtyZXR1cm4gaS5zaG93KGgsIWQpfX0sRC5hLmNyZWF0ZUVsZW1lbnQoInNwYW4iLG51bGwsbT8iU2NoZW1hcyI6Ik1vZGVscyIpLEQuYS5jcmVhdGVFbGVtZW50KCJzdmciLHt3aWR0aDoiMjAiLGhlaWdodDoiMjAiLCJhcmlhLWhpZGRlbiI6InRydWUiLGZvY3VzYWJsZToiZmFsc2UifSxELmEuY3JlYXRlRWxlbWVudCgidXNlIix7eGxpbmtIcmVmOmQ/IiNsYXJnZS1hcnJvdy11cCI6IiNsYXJnZS1hcnJvdy1kb3duIn0pKSkpLEQuYS5jcmVhdGVFbGVtZW50KGcse2lzT3BlbmVkOmR9LE0oKShlPWMuZW50cnlTZXEoKSkuY2FsbChlLChmdW5jdGlvbihlKXt2YXIgbixjPWJ0KCkoZSwxKVswXSxsPXUoKShuPVtdKS5jYWxsKG4sbm4oKShoKSxbY10pLHA9Ri5hLkxpc3QobCksZD1yLnNwZWNSZXNvbHZlZFN1YnRyZWUobCksbT1yLnNwZWNKc29uKCkuZ2V0SW4obCksZz1CLk1hcC5pc01hcChkKT9kOkYuYS5NYXAoKSxfPUIuTWFwLmlzTWFwKG0pP206Ri5hLk1hcCgpLHc9Zy5nZXQoInRpdGxlIil8fF8uZ2V0KCJ0aXRsZSIpfHxjLHg9YS5pc1Nob3duKGwsITEpO3gmJjA9PT1nLnNpemUmJl8uc2l6ZT4wJiZ0LnByb3BzLnNwZWNBY3Rpb25zLnJlcXVlc3RSZXNvbHZlZFN1YnRyZWUobCk7dmFyIEU9RC5hLmNyZWF0ZUVsZW1lbnQodix7bmFtZTpjLGV4cGFuZERlcHRoOmYsc2NoZW1hOmd8fEYuYS5NYXAoKSxkaXNwbGF5TmFtZTp3LGZ1bGxQYXRoOmwsc3BlY1BhdGg6cCxnZXRDb21wb25lbnQ6byxzcGVjU2VsZWN0b3JzOnIsZ2V0Q29uZmlnczpzLGxheW91dFNlbGVjdG9yczphLGxheW91dEFjdGlvbnM6aSxpbmNsdWRlUmVhZE9ubHk6ITAsaW5jbHVkZVdyaXRlT25seTohMH0pLFM9RC5hLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Im1vZGVsLWJveCJ9LEQuYS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJtb2RlbCBtb2RlbC10aXRsZSJ9LHcpKTtyZXR1cm4gRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2lkOiJtb2RlbC0iLmNvbmNhdChjKSxjbGFzc05hbWU6Im1vZGVsLWNvbnRhaW5lciIsa2V5OiJtb2RlbHMtc2VjdGlvbi0iLmNvbmNhdChjKSwiZGF0YS1uYW1lIjpjLHJlZjp0Lm9uTG9hZE1vZGVsfSxELmEuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToibW9kZWxzLWp1bXAtdG8tcGF0aCJ9LEQuYS5jcmVhdGVFbGVtZW50KGIse3NwZWNQYXRoOnB9KSksRC5hLmNyZWF0ZUVsZW1lbnQoeSx7Y2xhc3NlczoibW9kZWwtYm94Iixjb2xsYXBzZWRDb250ZW50OnQuZ2V0Q29sbGFwc2VkQ29udGVudChjKSxvblRvZ2dsZTp0LmhhbmRsZVRvZ2dsZSx0aXRsZTpTLGRpc3BsYXlOYW1lOncsbW9kZWxOYW1lOmMsc3BlY1BhdGg6cCxsYXlvdXRTZWxlY3RvcnM6YSxsYXlvdXRBY3Rpb25zOmksaGlkZVNlbGZPbkV4cGFuZDohMCxleHBhbmRlZDpmPjAmJnh9LEUpKX0pKS50b0FycmF5KCkpKX19XSksbn0oUi5Db21wb25lbnQpLGhyPWZ1bmN0aW9uKGUpe3ZhciB0PWUudmFsdWUsbj0oMCxlLmdldENvbXBvbmVudCkoIk1vZGVsQ29sbGFwc2UiKSxyPUQuYS5jcmVhdGVFbGVtZW50KCJzcGFuIixudWxsLCJBcnJheSBbICIsdC5jb3VudCgpLCIgXSIpO3JldHVybiBELmEuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToicHJvcC1lbnVtIn0sIkVudW06IixELmEuY3JlYXRlRWxlbWVudCgiYnIiLG51bGwpLEQuYS5jcmVhdGVFbGVtZW50KG4se2NvbGxhcHNlZENvbnRlbnQ6cn0sIlsgIix0LmpvaW4oIiwgIiksIiBdIikpfSxkcj1bInNjaGVtYSIsIm5hbWUiLCJkaXNwbGF5TmFtZSIsImlzUmVmIiwiZ2V0Q29tcG9uZW50IiwiZ2V0Q29uZmlncyIsImRlcHRoIiwib25Ub2dnbGUiLCJleHBhbmRlZCIsInNwZWNQYXRoIl0sbXI9ZnVuY3Rpb24oZSl7eWUoKShuLGUpO3ZhciB0PV9lKCkobik7ZnVuY3Rpb24gbigpe3JldHVybiBfKCkodGhpcyxuKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4geCgpKG4sW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZSx0LG4scixvPXRoaXMucHJvcHMsYT1vLnNjaGVtYSxpPW8ubmFtZSxzPW8uZGlzcGxheU5hbWUsYz1vLmlzUmVmLHA9by5nZXRDb21wb25lbnQsZj1vLmdldENvbmZpZ3MsaD1vLmRlcHRoLG09by5vblRvZ2dsZSx2PW8uZXhwYW5kZWQsZz1vLnNwZWNQYXRoLHk9U24oKShvLGRyKSxiPXkuc3BlY1NlbGVjdG9ycyxfPXkuZXhwYW5kRGVwdGgsdz15LmluY2x1ZGVSZWFkT25seSx4PXkuaW5jbHVkZVdyaXRlT25seSxFPWIuaXNPQVMzO2lmKCFhKXJldHVybiBudWxsO3ZhciBTPWYoKS5zaG93RXh0ZW5zaW9ucyxDPWEuZ2V0KCJkZXNjcmlwdGlvbiIpLEE9YS5nZXQoInByb3BlcnRpZXMiKSxPPWEuZ2V0KCJhZGRpdGlvbmFsUHJvcGVydGllcyIpLGo9YS5nZXQoInRpdGxlIil8fHN8fGksVD1hLmdldCgicmVxdWlyZWQiKSxJPWwoKShhKS5jYWxsKGEsKGZ1bmN0aW9uKGUsdCl7dmFyIG47cmV0dXJuLTEhPT14ZSgpKG49WyJtYXhQcm9wZXJ0aWVzIiwibWluUHJvcGVydGllcyIsIm51bGxhYmxlIiwiZXhhbXBsZSJdKS5jYWxsKG4sdCl9KSksUD1hLmdldCgiZGVwcmVjYXRlZCIpLE49cCgiSnVtcFRvUGF0aCIsITApLFI9cCgiTWFya2Rvd24iLCEwKSxMPXAoIk1vZGVsIiksRj1wKCJNb2RlbENvbGxhcHNlIiksVT1wKCJQcm9wZXJ0eSIpLHE9ZnVuY3Rpb24oKXtyZXR1cm4gRC5hLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Im1vZGVsLWp1bXAtdG8tcGF0aCJ9LEQuYS5jcmVhdGVFbGVtZW50KE4se3NwZWNQYXRoOmd9KSl9LHo9RC5hLmNyZWF0ZUVsZW1lbnQoInNwYW4iLG51bGwsRC5hLmNyZWF0ZUVsZW1lbnQoInNwYW4iLG51bGwsInsiKSwiLi4uIixELmEuY3JlYXRlRWxlbWVudCgic3BhbiIsbnVsbCwifSIpLGM/RC5hLmNyZWF0ZUVsZW1lbnQocSxudWxsKToiIiksVj1iLmlzT0FTMygpP2EuZ2V0KCJhbnlPZiIpOm51bGwsVz1iLmlzT0FTMygpP2EuZ2V0KCJvbmVPZiIpOm51bGwsSD1iLmlzT0FTMygpP2EuZ2V0KCJub3QiKTpudWxsLCQ9aiYmRC5hLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Im1vZGVsLXRpdGxlIn0sYyYmYS5nZXQoIiQkcmVmIikmJkQuYS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJtb2RlbC1oaW50In0sYS5nZXQoIiQkcmVmIikpLEQuYS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJtb2RlbC10aXRsZV9fdGV4dCJ9LGopKTtyZXR1cm4gRC5hLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Im1vZGVsIn0sRC5hLmNyZWF0ZUVsZW1lbnQoRix7bW9kZWxOYW1lOmksdGl0bGU6JCxvblRvZ2dsZTptLGV4cGFuZGVkOiEhdnx8aDw9Xyxjb2xsYXBzZWRDb250ZW50Onp9LEQuYS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJicmFjZS1vcGVuIG9iamVjdCJ9LCJ7IiksYz9ELmEuY3JlYXRlRWxlbWVudChxLG51bGwpOm51bGwsRC5hLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6ImlubmVyLW9iamVjdCJ9LEQuYS5jcmVhdGVFbGVtZW50KCJ0YWJsZSIse2NsYXNzTmFtZToibW9kZWwifSxELmEuY3JlYXRlRWxlbWVudCgidGJvZHkiLG51bGwsQz9ELmEuY3JlYXRlRWxlbWVudCgidHIiLHtjbGFzc05hbWU6ImRlc2NyaXB0aW9uIn0sRC5hLmNyZWF0ZUVsZW1lbnQoInRkIixudWxsLCJkZXNjcmlwdGlvbjoiKSxELmEuY3JlYXRlRWxlbWVudCgidGQiLG51bGwsRC5hLmNyZWF0ZUVsZW1lbnQoUix7c291cmNlOkN9KSkpOm51bGwsUD9ELmEuY3JlYXRlRWxlbWVudCgidHIiLHtjbGFzc05hbWU6InByb3BlcnR5In0sRC5hLmNyZWF0ZUVsZW1lbnQoInRkIixudWxsLCJkZXByZWNhdGVkOiIpLEQuYS5jcmVhdGVFbGVtZW50KCJ0ZCIsbnVsbCwidHJ1ZSIpKTpudWxsLEEmJkEuc2l6ZT9NKCkoZT1sKCkodD1BLmVudHJ5U2VxKCkpLmNhbGwodCwoZnVuY3Rpb24oZSl7dmFyIHQ9YnQoKShlLDIpWzFdO3JldHVybighdC5nZXQoInJlYWRPbmx5Iil8fHcpJiYoIXQuZ2V0KCJ3cml0ZU9ubHkiKXx8eCl9KSkpLmNhbGwoZSwoZnVuY3Rpb24oZSl7dmFyIHQsbixyPWJ0KCkoZSwyKSxvPXJbMF0sYT1yWzFdLHM9RSgpJiZhLmdldCgiZGVwcmVjYXRlZCIpLGM9Qi5MaXN0LmlzTGlzdChUKSYmVC5jb250YWlucyhvKSxsPVsicHJvcGVydHktcm93Il07cmV0dXJuIHMmJmwucHVzaCgiZGVwcmVjYXRlZCIpLGMmJmwucHVzaCgicmVxdWlyZWQiKSxELmEuY3JlYXRlRWxlbWVudCgidHIiLHtrZXk6byxjbGFzc05hbWU6bC5qb2luKCIgIil9LEQuYS5jcmVhdGVFbGVtZW50KCJ0ZCIsbnVsbCxvLGMmJkQuYS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJzdGFyIn0sIioiKSksRC5hLmNyZWF0ZUVsZW1lbnQoInRkIixudWxsLEQuYS5jcmVhdGVFbGVtZW50KEwseG4oKSh7a2V5OnUoKSh0PXUoKShuPSJvYmplY3QtIi5jb25jYXQoaSwiLSIpKS5jYWxsKG4sbywiXyIpKS5jYWxsKHQsYSl9LHkse3JlcXVpcmVkOmMsZ2V0Q29tcG9uZW50OnAsc3BlY1BhdGg6Zy5wdXNoKCJwcm9wZXJ0aWVzIixvKSxnZXRDb25maWdzOmYsc2NoZW1hOmEsZGVwdGg6aCsxfSkpKSl9KSkudG9BcnJheSgpOm51bGwsUz9ELmEuY3JlYXRlRWxlbWVudCgidHIiLG51bGwsRC5hLmNyZWF0ZUVsZW1lbnQoInRkIixudWxsLCLCoCIpKTpudWxsLFM/TSgpKG49YS5lbnRyeVNlcSgpKS5jYWxsKG4sKGZ1bmN0aW9uKGUpe3ZhciB0PWJ0KCkoZSwyKSxuPXRbMF0scj10WzFdO2lmKCJ4LSI9PT1rKCkobikuY2FsbChuLDAsMikpe3ZhciBvPXI/ci50b0pTP3IudG9KUygpOnI6bnVsbDtyZXR1cm4gRC5hLmNyZWF0ZUVsZW1lbnQoInRyIix7a2V5Om4sY2xhc3NOYW1lOiJleHRlbnNpb24ifSxELmEuY3JlYXRlRWxlbWVudCgidGQiLG51bGwsbiksRC5hLmNyZWF0ZUVsZW1lbnQoInRkIixudWxsLGQoKShvKSkpfX0pKS50b0FycmF5KCk6bnVsbCxPJiZPLnNpemU/RC5hLmNyZWF0ZUVsZW1lbnQoInRyIixudWxsLEQuYS5jcmVhdGVFbGVtZW50KCJ0ZCIsbnVsbCwiPCAqID46IiksRC5hLmNyZWF0ZUVsZW1lbnQoInRkIixudWxsLEQuYS5jcmVhdGVFbGVtZW50KEwseG4oKSh7fSx5LHtyZXF1aXJlZDohMSxnZXRDb21wb25lbnQ6cCxzcGVjUGF0aDpnLnB1c2goImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiksZ2V0Q29uZmlnczpmLHNjaGVtYTpPLGRlcHRoOmgrMX0pKSkpOm51bGwsVj9ELmEuY3JlYXRlRWxlbWVudCgidHIiLG51bGwsRC5hLmNyZWF0ZUVsZW1lbnQoInRkIixudWxsLCJhbnlPZiAtPiIpLEQuYS5jcmVhdGVFbGVtZW50KCJ0ZCIsbnVsbCxNKCkoVikuY2FsbChWLChmdW5jdGlvbihlLHQpe3JldHVybiBELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7a2V5OnR9LEQuYS5jcmVhdGVFbGVtZW50KEwseG4oKSh7fSx5LHtyZXF1aXJlZDohMSxnZXRDb21wb25lbnQ6cCxzcGVjUGF0aDpnLnB1c2goImFueU9mIix0KSxnZXRDb25maWdzOmYsc2NoZW1hOmUsZGVwdGg6aCsxfSkpKX0pKSkpOm51bGwsVz9ELmEuY3JlYXRlRWxlbWVudCgidHIiLG51bGwsRC5hLmNyZWF0ZUVsZW1lbnQoInRkIixudWxsLCJvbmVPZiAtPiIpLEQuYS5jcmVhdGVFbGVtZW50KCJ0ZCIsbnVsbCxNKCkoVykuY2FsbChXLChmdW5jdGlvbihlLHQpe3JldHVybiBELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7a2V5OnR9LEQuYS5jcmVhdGVFbGVtZW50KEwseG4oKSh7fSx5LHtyZXF1aXJlZDohMSxnZXRDb21wb25lbnQ6cCxzcGVjUGF0aDpnLnB1c2goIm9uZU9mIix0KSxnZXRDb25maWdzOmYsc2NoZW1hOmUsZGVwdGg6aCsxfSkpKX0pKSkpOm51bGwsSD9ELmEuY3JlYXRlRWxlbWVudCgidHIiLG51bGwsRC5hLmNyZWF0ZUVsZW1lbnQoInRkIixudWxsLCJub3QgLT4iKSxELmEuY3JlYXRlRWxlbWVudCgidGQiLG51bGwsRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxELmEuY3JlYXRlRWxlbWVudChMLHhuKCkoe30seSx7cmVxdWlyZWQ6ITEsZ2V0Q29tcG9uZW50OnAsc3BlY1BhdGg6Zy5wdXNoKCJub3QiKSxnZXRDb25maWdzOmYsc2NoZW1hOkgsZGVwdGg6aCsxfSkpKSkpOm51bGwpKSksRC5hLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6ImJyYWNlLWNsb3NlIn0sIn0iKSksSS5zaXplP00oKShyPUkuZW50cnlTZXEoKSkuY2FsbChyLChmdW5jdGlvbihlKXt2YXIgdCxuPWJ0KCkoZSwyKSxyPW5bMF0sbz1uWzFdO3JldHVybiBELmEuY3JlYXRlRWxlbWVudChVLHtrZXk6dSgpKHQ9IiIuY29uY2F0KHIsIi0iKSkuY2FsbCh0LG8pLHByb3BLZXk6cixwcm9wVmFsOm8scHJvcENsYXNzOiJwcm9wZXJ0eSJ9KX0pKTpudWxsKX19XSksbn0oUi5Db21wb25lbnQpLHZyPWZ1bmN0aW9uKGUpe3llKCkobixlKTt2YXIgdD1fZSgpKG4pO2Z1bmN0aW9uIG4oKXtyZXR1cm4gXygpKHRoaXMsbiksdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIHgoKShuLFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzLnByb3BzLG49dC5nZXRDb21wb25lbnQscj10LmdldENvbmZpZ3Msbz10LnNjaGVtYSxhPXQuZGVwdGgsaT10LmV4cGFuZERlcHRoLHM9dC5uYW1lLGM9dC5kaXNwbGF5TmFtZSxwPXQuc3BlY1BhdGgsZj1vLmdldCgiZGVzY3JpcHRpb24iKSxoPW8uZ2V0KCJpdGVtcyIpLGQ9by5nZXQoInRpdGxlIil8fGN8fHMsbT1sKCkobykuY2FsbChvLChmdW5jdGlvbihlLHQpe3ZhciBuO3JldHVybi0xPT09eGUoKShuPVsidHlwZSIsIml0ZW1zIiwiZGVzY3JpcHRpb24iLCIkJHJlZiJdKS5jYWxsKG4sdCl9KSksdj1uKCJNYXJrZG93biIsITApLGc9bigiTW9kZWxDb2xsYXBzZSIpLHk9bigiTW9kZWwiKSxiPW4oIlByb3BlcnR5IiksXz1kJiZELmEuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToibW9kZWwtdGl0bGUifSxELmEuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToibW9kZWwtdGl0bGVfX3RleHQifSxkKSk7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJtb2RlbCJ9LEQuYS5jcmVhdGVFbGVtZW50KGcse3RpdGxlOl8sZXhwYW5kZWQ6YTw9aSxjb2xsYXBzZWRDb250ZW50OiJbLi4uXSJ9LCJbIixtLnNpemU/TSgpKGU9bS5lbnRyeVNlcSgpKS5jYWxsKGUsKGZ1bmN0aW9uKGUpe3ZhciB0LG49YnQoKShlLDIpLHI9blswXSxvPW5bMV07cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KGIse2tleTp1KCkodD0iIi5jb25jYXQociwiLSIpKS5jYWxsKHQsbykscHJvcEtleTpyLHByb3BWYWw6byxwcm9wQ2xhc3M6InByb3BlcnR5In0pfSkpOm51bGwsZj9ELmEuY3JlYXRlRWxlbWVudCh2LHtzb3VyY2U6Zn0pOm0uc2l6ZT9ELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJtYXJrZG93biJ9KTpudWxsLEQuYS5jcmVhdGVFbGVtZW50KCJzcGFuIixudWxsLEQuYS5jcmVhdGVFbGVtZW50KHkseG4oKSh7fSx0aGlzLnByb3BzLHtnZXRDb25maWdzOnIsc3BlY1BhdGg6cC5wdXNoKCJpdGVtcyIpLG5hbWU6bnVsbCxzY2hlbWE6aCxyZXF1aXJlZDohMSxkZXB0aDphKzF9KSkpLCJdIikpfX1dKSxufShSLkNvbXBvbmVudCksZ3I9InByb3BlcnR5IHByaW1pdGl2ZSIseXI9ZnVuY3Rpb24oZSl7eWUoKShuLGUpO3ZhciB0PV9lKCkobik7ZnVuY3Rpb24gbigpe3JldHVybiBfKCkodGhpcyxuKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4geCgpKG4sW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZSx0LG4scj10aGlzLnByb3BzLG89ci5zY2hlbWEsYT1yLmdldENvbXBvbmVudCxpPXIuZ2V0Q29uZmlncyxzPXIubmFtZSxjPXIuZGlzcGxheU5hbWUscD1yLmRlcHRoLGY9aSgpLnNob3dFeHRlbnNpb25zO2lmKCFvfHwhby5nZXQpcmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwpO3ZhciBoPW8uZ2V0KCJ0eXBlIiksZD1vLmdldCgiZm9ybWF0IiksbT1vLmdldCgieG1sIiksdj1vLmdldCgiZW51bSIpLGc9by5nZXQoInRpdGxlIil8fGN8fHMseT1vLmdldCgiZGVzY3JpcHRpb24iKSxiPU9iamVjdCgkLm0pKG8pLF89bCgpKG8pLmNhbGwobywoZnVuY3Rpb24oZSx0KXt2YXIgbjtyZXR1cm4tMT09PXhlKCkobj1bImVudW0iLCJ0eXBlIiwiZm9ybWF0IiwiZGVzY3JpcHRpb24iLCIkJHJlZiJdKS5jYWxsKG4sdCl9KSkuZmlsdGVyTm90KChmdW5jdGlvbihlLHQpe3JldHVybiBiLmhhcyh0KX0pKSx3PWEoIk1hcmtkb3duIiwhMCkseD1hKCJFbnVtTW9kZWwiKSxFPWEoIlByb3BlcnR5Iik7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJtb2RlbCJ9LEQuYS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJwcm9wIn0scyYmRC5hLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6IiIuY29uY2F0KDE9PT1wJiYibW9kZWwtdGl0bGUiLCIgcHJvcC1uYW1lIil9LGcpLEQuYS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOiJwcm9wLXR5cGUifSxoKSxkJiZELmEuY3JlYXRlRWxlbWVudCgic3BhbiIse2NsYXNzTmFtZToicHJvcC1mb3JtYXQifSwiKCQiLGQsIikiKSxfLnNpemU/TSgpKGU9Xy5lbnRyeVNlcSgpKS5jYWxsKGUsKGZ1bmN0aW9uKGUpe3ZhciB0LG49YnQoKShlLDIpLHI9blswXSxvPW5bMV07cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KEUse2tleTp1KCkodD0iIi5jb25jYXQociwiLSIpKS5jYWxsKHQsbykscHJvcEtleTpyLHByb3BWYWw6byxwcm9wQ2xhc3M6Z3J9KX0pKTpudWxsLGYmJmIuc2l6ZT9NKCkodD1iLmVudHJ5U2VxKCkpLmNhbGwodCwoZnVuY3Rpb24oZSl7dmFyIHQsbj1idCgpKGUsMikscj1uWzBdLG89blsxXTtyZXR1cm4gRC5hLmNyZWF0ZUVsZW1lbnQoRSx7a2V5OnUoKSh0PSIiLmNvbmNhdChyLCItIikpLmNhbGwodCxvKSxwcm9wS2V5OnIscHJvcFZhbDpvLHByb3BDbGFzczpncn0pfSkpOm51bGwseT9ELmEuY3JlYXRlRWxlbWVudCh3LHtzb3VyY2U6eX0pOm51bGwsbSYmbS5zaXplP0QuYS5jcmVhdGVFbGVtZW50KCJzcGFuIixudWxsLEQuYS5jcmVhdGVFbGVtZW50KCJiciIsbnVsbCksRC5hLmNyZWF0ZUVsZW1lbnQoInNwYW4iLHtjbGFzc05hbWU6Z3J9LCJ4bWw6IiksTSgpKG49bS5lbnRyeVNlcSgpKS5jYWxsKG4sKGZ1bmN0aW9uKGUpe3ZhciB0LG49YnQoKShlLDIpLHI9blswXSxvPW5bMV07cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJzcGFuIix7a2V5OnUoKSh0PSIiLmNvbmNhdChyLCItIikpLmNhbGwodCxvKSxjbGFzc05hbWU6Z3J9LEQuYS5jcmVhdGVFbGVtZW50KCJiciIsbnVsbCksIsKgwqDCoCIsciwiOiAiLFN0cmluZyhvKSl9KSkudG9BcnJheSgpKTpudWxsLHYmJkQuYS5jcmVhdGVFbGVtZW50KHgse3ZhbHVlOnYsZ2V0Q29tcG9uZW50OmF9KSkpfX1dKSxufShSLkNvbXBvbmVudCksYnI9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wcm9wS2V5LG49ZS5wcm9wVmFsLHI9ZS5wcm9wQ2xhc3M7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJzcGFuIix7Y2xhc3NOYW1lOnJ9LEQuYS5jcmVhdGVFbGVtZW50KCJiciIsbnVsbCksdCwiOiAiLFN0cmluZyhuKSl9LF9yPWZ1bmN0aW9uKGUpe3llKCkobixlKTt2YXIgdD1fZSgpKG4pO2Z1bmN0aW9uIG4oKXtyZXR1cm4gXygpKHRoaXMsbiksdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIHgoKShuLFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcyx0PWUub25UcnlvdXRDbGljayxuPWUub25DYW5jZWxDbGljayxyPWUub25SZXNldENsaWNrLG89ZS5lbmFibGVkLGE9ZS5oYXNVc2VyRWRpdGVkQm9keSxpPWUuaXNPQVMzJiZhO3JldHVybiBELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOmk/InRyeS1vdXQgYnRuLWdyb3VwIjoidHJ5LW91dCJ9LG8/RC5hLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIse2NsYXNzTmFtZToiYnRuIHRyeS1vdXRfX2J0biBjYW5jZWwiLG9uQ2xpY2s6bn0sIkNhbmNlbCIpOkQuYS5jcmVhdGVFbGVtZW50KCJidXR0b24iLHtjbGFzc05hbWU6ImJ0biB0cnktb3V0X19idG4iLG9uQ2xpY2s6dH0sIlRyeSBpdCBvdXQgIiksaSYmRC5hLmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIse2NsYXNzTmFtZToiYnRuIHRyeS1vdXRfX2J0biByZXNldCIsb25DbGljazpyfSwiUmVzZXQiKSl9fV0pLG59KEQuYS5Db21wb25lbnQpO3koKShfciwiZGVmYXVsdFByb3BzIix7b25UcnlvdXRDbGljazpGdW5jdGlvbi5wcm90b3R5cGUsb25DYW5jZWxDbGljazpGdW5jdGlvbi5wcm90b3R5cGUsb25SZXNldENsaWNrOkZ1bmN0aW9uLnByb3RvdHlwZSxlbmFibGVkOiExLGhhc1VzZXJFZGl0ZWRCb2R5OiExLGlzT0FTMzohMX0pO3ZhciB3cj1mdW5jdGlvbihlKXt5ZSgpKG4sZSk7dmFyIHQ9X2UoKShuKTtmdW5jdGlvbiBuKCl7cmV0dXJuIF8oKSh0aGlzLG4pLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfXJldHVybiB4KCkobixbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsdD1lLmJ5cGFzcyxuPWUuaXNTd2FnZ2VyMixyPWUuaXNPQVMzLG89ZS5hbHNvU2hvdztyZXR1cm4gdD9ELmEuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLHRoaXMucHJvcHMuY2hpbGRyZW4pOm4mJnI/RC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToidmVyc2lvbi1wcmFnbWEifSxvLEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InZlcnNpb24tcHJhZ21hX19tZXNzYWdlIHZlcnNpb24tcHJhZ21hX19tZXNzYWdlLS1hbWJpZ3VvdXMifSxELmEuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLEQuYS5jcmVhdGVFbGVtZW50KCJoMyIsbnVsbCwiVW5hYmxlIHRvIHJlbmRlciB0aGlzIGRlZmluaXRpb24iKSxELmEuY3JlYXRlRWxlbWVudCgicCIsbnVsbCxELmEuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCwic3dhZ2dlciIpLCIgYW5kICIsRC5hLmNyZWF0ZUVsZW1lbnQoImNvZGUiLG51bGwsIm9wZW5hcGkiKSwiIGZpZWxkcyBjYW5ub3QgYmUgcHJlc2VudCBpbiB0aGUgc2FtZSBTd2FnZ2VyIG9yIE9wZW5BUEkgZGVmaW5pdGlvbi4gUGxlYXNlIHJlbW92ZSBvbmUgb2YgdGhlIGZpZWxkcy4iKSxELmEuY3JlYXRlRWxlbWVudCgicCIsbnVsbCwiU3VwcG9ydGVkIHZlcnNpb24gZmllbGRzIGFyZSAiLEQuYS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLCJzd2FnZ2VyOiAiLCciMi4wIicpLCIgYW5kIHRob3NlIHRoYXQgbWF0Y2ggIixELmEuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCwib3BlbmFwaTogMy4wLm4iKSwiIChmb3IgZXhhbXBsZSwgIixELmEuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCwib3BlbmFwaTogMy4wLjAiKSwiKS4iKSkpKTpufHxyP0QuYS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsdGhpcy5wcm9wcy5jaGlsZHJlbik6RC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToidmVyc2lvbi1wcmFnbWEifSxvLEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InZlcnNpb24tcHJhZ21hX19tZXNzYWdlIHZlcnNpb24tcHJhZ21hX19tZXNzYWdlLS1taXNzaW5nIn0sRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxELmEuY3JlYXRlRWxlbWVudCgiaDMiLG51bGwsIlVuYWJsZSB0byByZW5kZXIgdGhpcyBkZWZpbml0aW9uIiksRC5hLmNyZWF0ZUVsZW1lbnQoInAiLG51bGwsIlRoZSBwcm92aWRlZCBkZWZpbml0aW9uIGRvZXMgbm90IHNwZWNpZnkgYSB2YWxpZCB2ZXJzaW9uIGZpZWxkLiIpLEQuYS5jcmVhdGVFbGVtZW50KCJwIixudWxsLCJQbGVhc2UgaW5kaWNhdGUgYSB2YWxpZCBTd2FnZ2VyIG9yIE9wZW5BUEkgdmVyc2lvbiBmaWVsZC4gU3VwcG9ydGVkIHZlcnNpb24gZmllbGRzIGFyZSAiLEQuYS5jcmVhdGVFbGVtZW50KCJjb2RlIixudWxsLCJzd2FnZ2VyOiAiLCciMi4wIicpLCIgYW5kIHRob3NlIHRoYXQgbWF0Y2ggIixELmEuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCwib3BlbmFwaTogMy4wLm4iKSwiIChmb3IgZXhhbXBsZSwgIixELmEuY3JlYXRlRWxlbWVudCgiY29kZSIsbnVsbCwib3BlbmFwaTogMy4wLjAiKSwiKS4iKSkpKX19XSksbn0oRC5hLlB1cmVDb21wb25lbnQpO3koKSh3ciwiZGVmYXVsdFByb3BzIix7YWxzb1Nob3c6bnVsbCxjaGlsZHJlbjpudWxsLGJ5cGFzczohMX0pO3ZhciB4cj1mdW5jdGlvbihlKXt2YXIgdD1lLnZlcnNpb247cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJzbWFsbCIsbnVsbCxELmEuY3JlYXRlRWxlbWVudCgicHJlIix7Y2xhc3NOYW1lOiJ2ZXJzaW9uIn0sIiAiLHQsIiAiKSl9LEVyPWZ1bmN0aW9uKGUpe3ZhciB0PWUuZW5hYmxlZCxuPWUucGF0aCxyPWUudGV4dDtyZXR1cm4gRC5hLmNyZWF0ZUVsZW1lbnQoImEiLHtjbGFzc05hbWU6Im5vc3R5bGUiLG9uQ2xpY2s6dD9mdW5jdGlvbihlKXtyZXR1cm4gZS5wcmV2ZW50RGVmYXVsdCgpfTpudWxsLGhyZWY6dD8iIy8iLmNvbmNhdChuKTpudWxsfSxELmEuY3JlYXRlRWxlbWVudCgic3BhbiIsbnVsbCxyKSl9LFNyPWZ1bmN0aW9uKCl7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLG51bGwsRC5hLmNyZWF0ZUVsZW1lbnQoInN2ZyIse3htbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIseG1sbnNYbGluazoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsY2xhc3NOYW1lOiJzdmctYXNzZXRzIn0sRC5hLmNyZWF0ZUVsZW1lbnQoImRlZnMiLG51bGwsRC5hLmNyZWF0ZUVsZW1lbnQoInN5bWJvbCIse3ZpZXdCb3g6IjAgMCAyMCAyMCIsaWQ6InVubG9ja2VkIn0sRC5hLmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtkOiJNMTUuOCA4SDE0VjUuNkMxNCAyLjcwMyAxMi42NjUgMSAxMCAxIDcuMzM0IDEgNiAyLjcwMyA2IDUuNlY2aDJ2LS44MDFDOCAzLjc1NCA4Ljc5NyAzIDEwIDNjMS4yMDMgMCAyIC43NTQgMiAyLjE5OVY4SDRjLS41NTMgMC0xIC42NDYtMSAxLjE5OVYxN2MwIC41NDkuNDI4IDEuMTM5Ljk1MSAxLjMwN2wxLjE5Ny4zODdDNS42NzIgMTguODYxIDYuNTUgMTkgNy4xIDE5aDUuOGMuNTQ5IDAgMS40MjgtLjEzOSAxLjk1MS0uMzA3bDEuMTk2LS4zODdjLjUyNC0uMTY3Ljk1My0uNzU3Ljk1My0xLjMwNlY5LjE5OUMxNyA4LjY0NiAxNi4zNTIgOCAxNS44IDh6In0pKSxELmEuY3JlYXRlRWxlbWVudCgic3ltYm9sIix7dmlld0JveDoiMCAwIDIwIDIwIixpZDoibG9ja2VkIn0sRC5hLmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtkOiJNMTUuOCA4SDE0VjUuNkMxNCAyLjcwMyAxMi42NjUgMSAxMCAxIDcuMzM0IDEgNiAyLjcwMyA2IDUuNlY4SDRjLS41NTMgMC0xIC42NDYtMSAxLjE5OVYxN2MwIC41NDkuNDI4IDEuMTM5Ljk1MSAxLjMwN2wxLjE5Ny4zODdDNS42NzIgMTguODYxIDYuNTUgMTkgNy4xIDE5aDUuOGMuNTQ5IDAgMS40MjgtLjEzOSAxLjk1MS0uMzA3bDEuMTk2LS4zODdjLjUyNC0uMTY3Ljk1My0uNzU3Ljk1My0xLjMwNlY5LjE5OUMxNyA4LjY0NiAxNi4zNTIgOCAxNS44IDh6TTEyIDhIOFY1LjE5OUM4IDMuNzU0IDguNzk3IDMgMTAgM2MxLjIwMyAwIDIgLjc1NCAyIDIuMTk5Vjh6In0pKSxELmEuY3JlYXRlRWxlbWVudCgic3ltYm9sIix7dmlld0JveDoiMCAwIDIwIDIwIixpZDoiY2xvc2UifSxELmEuY3JlYXRlRWxlbWVudCgicGF0aCIse2Q6Ik0xNC4zNDggMTQuODQ5Yy0uNDY5LjQ2OS0xLjIyOS40NjktMS42OTcgMEwxMCAxMS44MTlsLTIuNjUxIDMuMDI5Yy0uNDY5LjQ2OS0xLjIyOS40NjktMS42OTcgMC0uNDY5LS40NjktLjQ2OS0xLjIyOSAwLTEuNjk3bDIuNzU4LTMuMTUtMi43NTktMy4xNTJjLS40NjktLjQ2OS0uNDY5LTEuMjI4IDAtMS42OTcuNDY5LS40NjkgMS4yMjgtLjQ2OSAxLjY5NyAwTDEwIDguMTgzbDIuNjUxLTMuMDMxYy40NjktLjQ2OSAxLjIyOC0uNDY5IDEuNjk3IDAgLjQ2OS40NjkuNDY5IDEuMjI5IDAgMS42OTdsLTIuNzU4IDMuMTUyIDIuNzU4IDMuMTVjLjQ2OS40NjkuNDY5IDEuMjI5IDAgMS42OTh6In0pKSxELmEuY3JlYXRlRWxlbWVudCgic3ltYm9sIix7dmlld0JveDoiMCAwIDIwIDIwIixpZDoibGFyZ2UtYXJyb3cifSxELmEuY3JlYXRlRWxlbWVudCgicGF0aCIse2Q6Ik0xMy4yNSAxMEw2LjEwOSAyLjU4Yy0uMjY4LS4yNy0uMjY4LS43MDcgMC0uOTc5LjI2OC0uMjcuNzAxLS4yNy45NjkgMGw3LjgzIDcuOTA4Yy4yNjguMjcxLjI2OC43MDkgMCAuOTc5bC03LjgzIDcuOTA4Yy0uMjY4LjI3MS0uNzAxLjI3LS45NjkgMC0uMjY4LS4yNjktLjI2OC0uNzA3IDAtLjk3OUwxMy4yNSAxMHoifSkpLEQuYS5jcmVhdGVFbGVtZW50KCJzeW1ib2wiLHt2aWV3Qm94OiIwIDAgMjAgMjAiLGlkOiJsYXJnZS1hcnJvdy1kb3duIn0sRC5hLmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtkOiJNMTcuNDE4IDYuMTA5Yy4yNzItLjI2OC43MDktLjI2OC45NzkgMHMuMjcxLjcwMSAwIC45NjlsLTcuOTA4IDcuODNjLS4yNy4yNjgtLjcwNy4yNjgtLjk3OSAwbC03LjkwOC03LjgzYy0uMjctLjI2OC0uMjctLjcwMSAwLS45NjkuMjcxLS4yNjguNzA5LS4yNjguOTc5IDBMMTAgMTMuMjVsNy40MTgtNy4xNDF6In0pKSxELmEuY3JlYXRlRWxlbWVudCgic3ltYm9sIix7dmlld0JveDoiMCAwIDIwIDIwIixpZDoibGFyZ2UtYXJyb3ctdXAifSxELmEuY3JlYXRlRWxlbWVudCgicGF0aCIse2Q6Ik0gMTcuNDE4IDE0LjkwOCBDIDE3LjY5IDE1LjE3NiAxOC4xMjcgMTUuMTc2IDE4LjM5NyAxNC45MDggQyAxOC42NjcgMTQuNjQgMTguNjY4IDE0LjIwNyAxOC4zOTcgMTMuOTM5IEwgMTAuNDg5IDYuMTA5IEMgMTAuMjE5IDUuODQxIDkuNzgyIDUuODQxIDkuNTEgNi4xMDkgTCAxLjYwMiAxMy45MzkgQyAxLjMzMiAxNC4yMDcgMS4zMzIgMTQuNjQgMS42MDIgMTQuOTA4IEMgMS44NzMgMTUuMTc2IDIuMzExIDE1LjE3NiAyLjU4MSAxNC45MDggTCAxMCA3Ljc2NyBMIDE3LjQxOCAxNC45MDggWiJ9KSksRC5hLmNyZWF0ZUVsZW1lbnQoInN5bWJvbCIse3ZpZXdCb3g6IjAgMCAyNCAyNCIsaWQ6Imp1bXAtdG8ifSxELmEuY3JlYXRlRWxlbWVudCgicGF0aCIse2Q6Ik0xOSA3djRINS44M2wzLjU4LTMuNTlMOCA2bC02IDYgNiA2IDEuNDEtMS40MUw1LjgzIDEzSDIxVjd6In0pKSxELmEuY3JlYXRlRWxlbWVudCgic3ltYm9sIix7dmlld0JveDoiMCAwIDI0IDI0IixpZDoiZXhwYW5kIn0sRC5hLmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtkOiJNMTAgMThoNHYtMmgtNHYyek0zIDZ2MmgxOFY2SDN6bTMgN2gxMnYtMkg2djJ6In0pKSkpKX0sQ3I9bigyMTkpLEFyPWZ1bmN0aW9uKGUpe3llKCkobixlKTt2YXIgdD1fZSgpKG4pO2Z1bmN0aW9uIG4oKXtyZXR1cm4gXygpKHRoaXMsbiksdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIHgoKShuLFt7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcm9wcyx0PWUuZXJyU2VsZWN0b3JzLG49ZS5zcGVjU2VsZWN0b3JzLHI9ZS5nZXRDb21wb25lbnQsbz1yKCJTdmdBc3NldHMiKSxhPXIoIkluZm9Db250YWluZXIiLCEwKSxpPXIoIlZlcnNpb25QcmFnbWFGaWx0ZXIiKSxzPXIoIm9wZXJhdGlvbnMiLCEwKSx1PXIoIk1vZGVscyIsITApLGM9cigiUm93IiksbD1yKCJDb2wiKSxwPXIoImVycm9ycyIsITApLGY9cigiU2VydmVyc0NvbnRhaW5lciIsITApLGg9cigiU2NoZW1lc0NvbnRhaW5lciIsITApLGQ9cigiQXV0aG9yaXplQnRuQ29udGFpbmVyIiwhMCksbT1yKCJGaWx0ZXJDb250YWluZXIiLCEwKSx2PW4uaXNTd2FnZ2VyMigpLGc9bi5pc09BUzMoKSx5PSFuLnNwZWNTdHIoKSxiPW4ubG9hZGluZ1N0YXR1cygpLF89bnVsbDtpZigibG9hZGluZyI9PT1iJiYoXz1ELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJpbmZvIn0sRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToibG9hZGluZy1jb250YWluZXIifSxELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJsb2FkaW5nIn0pKSkpLCJmYWlsZWQiPT09YiYmKF89RC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToiaW5mbyJ9LEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImxvYWRpbmctY29udGFpbmVyIn0sRC5hLmNyZWF0ZUVsZW1lbnQoImg0Iix7Y2xhc3NOYW1lOiJ0aXRsZSJ9LCJGYWlsZWQgdG8gbG9hZCBBUEkgZGVmaW5pdGlvbi4iKSxELmEuY3JlYXRlRWxlbWVudChwLG51bGwpKSkpLCJmYWlsZWRDb25maWciPT09Yil7dmFyIHc9dC5sYXN0RXJyb3IoKSx4PXc/dy5nZXQoIm1lc3NhZ2UiKToiIjtfPUQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImluZm8gZmFpbGVkLWNvbmZpZyJ9LEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6ImxvYWRpbmctY29udGFpbmVyIn0sRC5hLmNyZWF0ZUVsZW1lbnQoImg0Iix7Y2xhc3NOYW1lOiJ0aXRsZSJ9LCJGYWlsZWQgdG8gbG9hZCByZW1vdGUgY29uZmlndXJhdGlvbi4iKSxELmEuY3JlYXRlRWxlbWVudCgicCIsbnVsbCx4KSkpfWlmKCFfJiZ5JiYoXz1ELmEuY3JlYXRlRWxlbWVudCgiaDQiLG51bGwsIk5vIEFQSSBkZWZpbml0aW9uIHByb3ZpZGVkLiIpKSxfKXJldHVybiBELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJzd2FnZ2VyLXVpIn0sRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToibG9hZGluZy1jb250YWluZXIifSxfKSk7dmFyIEU9bi5zZXJ2ZXJzKCksUz1uLnNjaGVtZXMoKSxDPUUmJkUuc2l6ZSxBPVMmJlMuc2l6ZSxPPSEhbi5zZWN1cml0eURlZmluaXRpb25zKCk7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InN3YWdnZXItdWkifSxELmEuY3JlYXRlRWxlbWVudChvLG51bGwpLEQuYS5jcmVhdGVFbGVtZW50KGkse2lzU3dhZ2dlcjI6dixpc09BUzM6ZyxhbHNvU2hvdzpELmEuY3JlYXRlRWxlbWVudChwLG51bGwpfSxELmEuY3JlYXRlRWxlbWVudChwLG51bGwpLEQuYS5jcmVhdGVFbGVtZW50KGMse2NsYXNzTmFtZToiaW5mb3JtYXRpb24tY29udGFpbmVyIn0sRC5hLmNyZWF0ZUVsZW1lbnQobCx7bW9iaWxlOjEyfSxELmEuY3JlYXRlRWxlbWVudChhLG51bGwpKSksQ3x8QXx8Tz9ELmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJzY2hlbWUtY29udGFpbmVyIn0sRC5hLmNyZWF0ZUVsZW1lbnQobCx7Y2xhc3NOYW1lOiJzY2hlbWVzIHdyYXBwZXIiLG1vYmlsZToxMn0sQz9ELmEuY3JlYXRlRWxlbWVudChmLG51bGwpOm51bGwsQT9ELmEuY3JlYXRlRWxlbWVudChoLG51bGwpOm51bGwsTz9ELmEuY3JlYXRlRWxlbWVudChkLG51bGwpOm51bGwpKTpudWxsLEQuYS5jcmVhdGVFbGVtZW50KG0sbnVsbCksRC5hLmNyZWF0ZUVsZW1lbnQoYyxudWxsLEQuYS5jcmVhdGVFbGVtZW50KGwse21vYmlsZToxMixkZXNrdG9wOjEyfSxELmEuY3JlYXRlRWxlbWVudChzLG51bGwpKSksRC5hLmNyZWF0ZUVsZW1lbnQoYyxudWxsLEQuYS5jcmVhdGVFbGVtZW50KGwse21vYmlsZToxMixkZXNrdG9wOjEyfSxELmEuY3JlYXRlRWxlbWVudCh1LG51bGwpKSkpKX19XSksbn0oRC5hLkNvbXBvbmVudCksT3I9bigzNTcpLGtyPW4ubihPciksanI9e3ZhbHVlOiIiLG9uQ2hhbmdlOmZ1bmN0aW9uKCl7fSxzY2hlbWE6e30sa2V5TmFtZToiIixyZXF1aXJlZDohMSxlcnJvcnM6T2JqZWN0KEIuTGlzdCkoKX0sVHI9ZnVuY3Rpb24oZSl7eWUoKShuLGUpO3ZhciB0PV9lKCkobik7ZnVuY3Rpb24gbigpe3JldHVybiBfKCkodGhpcyxuKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4geCgpKG4sW3trZXk6ImNvbXBvbmVudERpZE1vdW50Iix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsdD1lLmRpc3BhdGNoSW5pdGlhbFZhbHVlLG49ZS52YWx1ZSxyPWUub25DaGFuZ2U7dD9yKG4pOiExPT09dCYmcigiIil9fSx7a2V5OiJyZW5kZXIiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzLnByb3BzLG49dC5zY2hlbWEscj10LmVycm9ycyxvPXQudmFsdWUsYT10Lm9uQ2hhbmdlLGk9dC5nZXRDb21wb25lbnQscz10LmZuLGM9dC5kaXNhYmxlZCxsPW4mJm4uZ2V0P24uZ2V0KCJmb3JtYXQiKTpudWxsLHA9biYmbi5nZXQ/bi5nZXQoInR5cGUiKTpudWxsLGY9ZnVuY3Rpb24oZSl7cmV0dXJuIGkoZSwhMSx7ZmFpbFNpbGVudGx5OiEwfSl9LGg9cD9mKGw/dSgpKGU9Ikpzb25TY2hlbWFfIi5jb25jYXQocCwiXyIpKS5jYWxsKGUsbCk6Ikpzb25TY2hlbWFfIi5jb25jYXQocCkpOmkoIkpzb25TY2hlbWFfc3RyaW5nIik7cmV0dXJuIGh8fChoPWkoIkpzb25TY2hlbWFfc3RyaW5nIikpLEQuYS5jcmVhdGVFbGVtZW50KGgseG4oKSh7fSx0aGlzLnByb3BzLHtlcnJvcnM6cixmbjpzLGdldENvbXBvbmVudDppLHZhbHVlOm8sb25DaGFuZ2U6YSxzY2hlbWE6bixkaXNhYmxlZDpjfSkpfX1dKSxufShSLkNvbXBvbmVudCk7eSgpKFRyLCJkZWZhdWx0UHJvcHMiLGpyKTt2YXIgSXI9ZnVuY3Rpb24oZSl7eWUoKShuLGUpO3ZhciB0PV9lKCkobik7ZnVuY3Rpb24gbigpe3ZhciBlLHI7XygpKHRoaXMsbik7Zm9yKHZhciBvPWFyZ3VtZW50cy5sZW5ndGgsYT1uZXcgQXJyYXkobyksaT0wO2k8bztpKyspYVtpXT1hcmd1bWVudHNbaV07cmV0dXJuIHI9dC5jYWxsLmFwcGx5KHQsdSgpKGU9W3RoaXNdKS5jYWxsKGUsYSkpLHkoKSh2ZSgpKHIpLCJvbkNoYW5nZSIsKGZ1bmN0aW9uKGUpe3ZhciB0PXIucHJvcHMuc2NoZW1hJiYiZmlsZSI9PT1yLnByb3BzLnNjaGVtYS5nZXQoInR5cGUiKT9lLnRhcmdldC5maWxlc1swXTplLnRhcmdldC52YWx1ZTtyLnByb3BzLm9uQ2hhbmdlKHQsci5wcm9wcy5rZXlOYW1lKX0pKSx5KCkodmUoKShyKSwib25FbnVtQ2hhbmdlIiwoZnVuY3Rpb24oZSl7cmV0dXJuIHIucHJvcHMub25DaGFuZ2UoZSl9KSkscn1yZXR1cm4geCgpKG4sW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLHQ9ZS5nZXRDb21wb25lbnQsbj1lLnZhbHVlLHI9ZS5zY2hlbWEsbz1lLmVycm9ycyxhPWUucmVxdWlyZWQsaT1lLmRlc2NyaXB0aW9uLHM9ZS5kaXNhYmxlZCx1PXImJnIuZ2V0P3IuZ2V0KCJlbnVtIik6bnVsbCxjPXImJnIuZ2V0P3IuZ2V0KCJmb3JtYXQiKTpudWxsLGw9ciYmci5nZXQ/ci5nZXQoInR5cGUiKTpudWxsLHA9ciYmci5nZXQ/ci5nZXQoImluIik6bnVsbDtpZihufHwobj0iIiksbz1vLnRvSlM/by50b0pTKCk6W10sdSl7dmFyIGY9dCgiU2VsZWN0Iik7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KGYse2NsYXNzTmFtZTpvLmxlbmd0aD8iaW52YWxpZCI6IiIsdGl0bGU6by5sZW5ndGg/bzoiIixhbGxvd2VkVmFsdWVzOnUsdmFsdWU6bixhbGxvd0VtcHR5VmFsdWU6IWEsZGlzYWJsZWQ6cyxvbkNoYW5nZTp0aGlzLm9uRW51bUNoYW5nZX0pfXZhciBoPXN8fHAmJiJmb3JtRGF0YSI9PT1wJiYhKCJGb3JtRGF0YSJpbiB3aW5kb3cpLGQ9dCgiSW5wdXQiKTtyZXR1cm4gbCYmImZpbGUiPT09bD9ELmEuY3JlYXRlRWxlbWVudChkLHt0eXBlOiJmaWxlIixjbGFzc05hbWU6by5sZW5ndGg/ImludmFsaWQiOiIiLHRpdGxlOm8ubGVuZ3RoP286IiIsb25DaGFuZ2U6dGhpcy5vbkNoYW5nZSxkaXNhYmxlZDpofSk6RC5hLmNyZWF0ZUVsZW1lbnQoa3IuYSx7dHlwZTpjJiYicGFzc3dvcmQiPT09Yz8icGFzc3dvcmQiOiJ0ZXh0IixjbGFzc05hbWU6by5sZW5ndGg/ImludmFsaWQiOiIiLHRpdGxlOm8ubGVuZ3RoP286IiIsdmFsdWU6bixtaW5MZW5ndGg6MCxkZWJvdW5jZVRpbWVvdXQ6MzUwLHBsYWNlaG9sZGVyOmksb25DaGFuZ2U6dGhpcy5vbkNoYW5nZSxkaXNhYmxlZDpofSl9fV0pLG59KFIuQ29tcG9uZW50KTt5KCkoSXIsImRlZmF1bHRQcm9wcyIsanIpO3ZhciBQcj1mdW5jdGlvbihlKXt5ZSgpKG4sZSk7dmFyIHQ9X2UoKShuKTtmdW5jdGlvbiBuKGUscil7dmFyIG87cmV0dXJuIF8oKSh0aGlzLG4pLG89dC5jYWxsKHRoaXMsZSxyKSx5KCkodmUoKShvKSwib25DaGFuZ2UiLChmdW5jdGlvbigpe28ucHJvcHMub25DaGFuZ2Uoby5zdGF0ZS52YWx1ZSl9KSkseSgpKHZlKCkobyksIm9uSXRlbUNoYW5nZSIsKGZ1bmN0aW9uKGUsdCl7by5zZXRTdGF0ZSgoZnVuY3Rpb24obil7cmV0dXJue3ZhbHVlOm4udmFsdWUuc2V0KHQsZSl9fSksby5vbkNoYW5nZSl9KSkseSgpKHZlKCkobyksInJlbW92ZUl0ZW0iLChmdW5jdGlvbihlKXtvLnNldFN0YXRlKChmdW5jdGlvbih0KXtyZXR1cm57dmFsdWU6dC52YWx1ZS5kZWxldGUoZSl9fSksby5vbkNoYW5nZSl9KSkseSgpKHZlKCkobyksImFkZEl0ZW0iLChmdW5jdGlvbigpe3ZhciBlPUJyKG8uc3RhdGUudmFsdWUpO28uc2V0U3RhdGUoKGZ1bmN0aW9uKCl7cmV0dXJue3ZhbHVlOmUucHVzaChPYmplY3QoJC5vKShvLnN0YXRlLnNjaGVtYS5nZXQoIml0ZW1zIiksITEse2luY2x1ZGVXcml0ZU9ubHk6ITB9KSl9fSksby5vbkNoYW5nZSl9KSkseSgpKHZlKCkobyksIm9uRW51bUNoYW5nZSIsKGZ1bmN0aW9uKGUpe28uc2V0U3RhdGUoKGZ1bmN0aW9uKCl7cmV0dXJue3ZhbHVlOmV9fSksby5vbkNoYW5nZSl9KSksby5zdGF0ZT17dmFsdWU6QnIoZS52YWx1ZSksc2NoZW1hOmUuc2NoZW1hfSxvfXJldHVybiB4KCkobixbe2tleToiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9QnIoZS52YWx1ZSk7dCE9PXRoaXMuc3RhdGUudmFsdWUmJnRoaXMuc2V0U3RhdGUoe3ZhbHVlOnR9KSxlLnNjaGVtYSE9PXRoaXMuc3RhdGUuc2NoZW1hJiZ0aGlzLnNldFN0YXRlKHtzY2hlbWE6ZS5zY2hlbWF9KX19LHtrZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXMsbj10aGlzLnByb3BzLHI9bi5nZXRDb21wb25lbnQsbz1uLnJlcXVpcmVkLGE9bi5zY2hlbWEsaT1uLmVycm9ycyxzPW4uZm4sYz1uLmRpc2FibGVkO2k9aS50b0pTP2kudG9KUygpOlQoKShpKT9pOltdO3ZhciBwLGYsaD1sKCkoaSkuY2FsbChpLChmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV9KSksZD1NKCkoZT1sKCkoaSkuY2FsbChpLChmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwIT09ZS5uZWVkUmVtb3ZlfSkpKS5jYWxsKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmVycm9yfSkpLG09dGhpcy5zdGF0ZS52YWx1ZSx2PSEhKG0mJm0uY291bnQmJm0uY291bnQoKT4wKSxnPWEuZ2V0SW4oWyJpdGVtcyIsImVudW0iXSkseT1hLmdldEluKFsiaXRlbXMiLCJ0eXBlIl0pLGI9YS5nZXRJbihbIml0ZW1zIiwiZm9ybWF0Il0pLF89YS5nZXQoIml0ZW1zIiksdz0hMSx4PSJmaWxlIj09PXl8fCJzdHJpbmciPT09eSYmImJpbmFyeSI9PT1iO3kmJmI/cD1yKHUoKShmPSJKc29uU2NoZW1hXyIuY29uY2F0KHksIl8iKSkuY2FsbChmLGIpKToiYm9vbGVhbiIhPT15JiYiYXJyYXkiIT09eSYmIm9iamVjdCIhPT15fHwocD1yKCJKc29uU2NoZW1hXyIuY29uY2F0KHkpKSk7aWYocHx8eHx8KHc9ITApLGcpe3ZhciBFPXIoIlNlbGVjdCIpO3JldHVybiBELmEuY3JlYXRlRWxlbWVudChFLHtjbGFzc05hbWU6aS5sZW5ndGg/ImludmFsaWQiOiIiLHRpdGxlOmkubGVuZ3RoP2k6IiIsbXVsdGlwbGU6ITAsdmFsdWU6bSxkaXNhYmxlZDpjLGFsbG93ZWRWYWx1ZXM6ZyxhbGxvd0VtcHR5VmFsdWU6IW8sb25DaGFuZ2U6dGhpcy5vbkVudW1DaGFuZ2V9KX12YXIgUz1yKCJCdXR0b24iKTtyZXR1cm4gRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIse2NsYXNzTmFtZToianNvbi1zY2hlbWEtYXJyYXkifSx2P00oKShtKS5jYWxsKG0sKGZ1bmN0aW9uKGUsbil7dmFyIG8sYT1PYmplY3QoQi5mcm9tSlMpKG5uKCkoTSgpKG89bCgpKGkpLmNhbGwoaSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5kZXg9PT1ufSkpKS5jYWxsKG8sKGZ1bmN0aW9uKGUpe3JldHVybiBlLmVycm9yfSkpKSk7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtrZXk6bixjbGFzc05hbWU6Impzb24tc2NoZW1hLWZvcm0taXRlbSJ9LHg/RC5hLmNyZWF0ZUVsZW1lbnQoTXIse3ZhbHVlOmUsb25DaGFuZ2U6ZnVuY3Rpb24oZSl7cmV0dXJuIHQub25JdGVtQ2hhbmdlKGUsbil9LGRpc2FibGVkOmMsZXJyb3JzOmEsZ2V0Q29tcG9uZW50OnJ9KTp3P0QuYS5jcmVhdGVFbGVtZW50KE5yLHt2YWx1ZTplLG9uQ2hhbmdlOmZ1bmN0aW9uKGUpe3JldHVybiB0Lm9uSXRlbUNoYW5nZShlLG4pfSxkaXNhYmxlZDpjLGVycm9yczphfSk6RC5hLmNyZWF0ZUVsZW1lbnQocCx4bigpKHt9LHQucHJvcHMse3ZhbHVlOmUsb25DaGFuZ2U6ZnVuY3Rpb24oZSl7cmV0dXJuIHQub25JdGVtQ2hhbmdlKGUsbil9LGRpc2FibGVkOmMsZXJyb3JzOmEsc2NoZW1hOl8sZ2V0Q29tcG9uZW50OnIsZm46c30pKSxjP251bGw6RC5hLmNyZWF0ZUVsZW1lbnQoUyx7Y2xhc3NOYW1lOiJidG4gYnRuLXNtIGpzb24tc2NoZW1hLWZvcm0taXRlbS1yZW1vdmUgIi5jb25jYXQoZC5sZW5ndGg/ImludmFsaWQiOm51bGwpLHRpdGxlOmQubGVuZ3RoP2Q6IiIsb25DbGljazpmdW5jdGlvbigpe3JldHVybiB0LnJlbW92ZUl0ZW0obil9fSwiIC0gIikpfSkpOm51bGwsYz9udWxsOkQuYS5jcmVhdGVFbGVtZW50KFMse2NsYXNzTmFtZToiYnRuIGJ0bi1zbSBqc29uLXNjaGVtYS1mb3JtLWl0ZW0tYWRkICIuY29uY2F0KGgubGVuZ3RoPyJpbnZhbGlkIjpudWxsKSx0aXRsZTpoLmxlbmd0aD9oOiIiLG9uQ2xpY2s6dGhpcy5hZGRJdGVtfSwiQWRkICIseT8iIi5jb25jYXQoeSwiICIpOiIiLCJpdGVtIikpfX1dKSxufShSLlB1cmVDb21wb25lbnQpO3koKShQciwiZGVmYXVsdFByb3BzIixqcik7dmFyIE5yPWZ1bmN0aW9uKGUpe3llKCkobixlKTt2YXIgdD1fZSgpKG4pO2Z1bmN0aW9uIG4oKXt2YXIgZSxyO18oKSh0aGlzLG4pO2Zvcih2YXIgbz1hcmd1bWVudHMubGVuZ3RoLGE9bmV3IEFycmF5KG8pLGk9MDtpPG87aSsrKWFbaV09YXJndW1lbnRzW2ldO3JldHVybiByPXQuY2FsbC5hcHBseSh0LHUoKShlPVt0aGlzXSkuY2FsbChlLGEpKSx5KCkodmUoKShyKSwib25DaGFuZ2UiLChmdW5jdGlvbihlKXt2YXIgdD1lLnRhcmdldC52YWx1ZTtyLnByb3BzLm9uQ2hhbmdlKHQsci5wcm9wcy5rZXlOYW1lKX0pKSxyfXJldHVybiB4KCkobixbe2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJvcHMsdD1lLnZhbHVlLG49ZS5lcnJvcnMscj1lLmRlc2NyaXB0aW9uLG89ZS5kaXNhYmxlZDtyZXR1cm4gdHx8KHQ9IiIpLG49bi50b0pTP24udG9KUygpOltdLEQuYS5jcmVhdGVFbGVtZW50KGtyLmEse3R5cGU6InRleHQiLGNsYXNzTmFtZTpuLmxlbmd0aD8iaW52YWxpZCI6IiIsdGl0bGU6bi5sZW5ndGg/bjoiIix2YWx1ZTp0LG1pbkxlbmd0aDowLGRlYm91bmNlVGltZW91dDozNTAscGxhY2Vob2xkZXI6cixvbkNoYW5nZTp0aGlzLm9uQ2hhbmdlLGRpc2FibGVkOm99KX19XSksbn0oUi5Db21wb25lbnQpO3koKShOciwiZGVmYXVsdFByb3BzIixqcik7dmFyIE1yPWZ1bmN0aW9uKGUpe3llKCkobixlKTt2YXIgdD1fZSgpKG4pO2Z1bmN0aW9uIG4oKXt2YXIgZSxyO18oKSh0aGlzLG4pO2Zvcih2YXIgbz1hcmd1bWVudHMubGVuZ3RoLGE9bmV3IEFycmF5KG8pLGk9MDtpPG87aSsrKWFbaV09YXJndW1lbnRzW2ldO3JldHVybiByPXQuY2FsbC5hcHBseSh0LHUoKShlPVt0aGlzXSkuY2FsbChlLGEpKSx5KCkodmUoKShyKSwib25GaWxlQ2hhbmdlIiwoZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YXJnZXQuZmlsZXNbMF07ci5wcm9wcy5vbkNoYW5nZSh0LHIucHJvcHMua2V5TmFtZSl9KSkscn1yZXR1cm4geCgpKG4sW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLHQ9ZS5nZXRDb21wb25lbnQsbj1lLmVycm9ycyxyPWUuZGlzYWJsZWQsbz10KCJJbnB1dCIpLGE9cnx8ISgiRm9ybURhdGEiaW4gd2luZG93KTtyZXR1cm4gRC5hLmNyZWF0ZUVsZW1lbnQobyx7dHlwZToiZmlsZSIsY2xhc3NOYW1lOm4ubGVuZ3RoPyJpbnZhbGlkIjoiIix0aXRsZTpuLmxlbmd0aD9uOiIiLG9uQ2hhbmdlOnRoaXMub25GaWxlQ2hhbmdlLGRpc2FibGVkOmF9KX19XSksbn0oUi5Db21wb25lbnQpO3koKShNciwiZGVmYXVsdFByb3BzIixqcik7dmFyIFJyPWZ1bmN0aW9uKGUpe3llKCkobixlKTt2YXIgdD1fZSgpKG4pO2Z1bmN0aW9uIG4oKXt2YXIgZSxyO18oKSh0aGlzLG4pO2Zvcih2YXIgbz1hcmd1bWVudHMubGVuZ3RoLGE9bmV3IEFycmF5KG8pLGk9MDtpPG87aSsrKWFbaV09YXJndW1lbnRzW2ldO3JldHVybiByPXQuY2FsbC5hcHBseSh0LHUoKShlPVt0aGlzXSkuY2FsbChlLGEpKSx5KCkodmUoKShyKSwib25FbnVtQ2hhbmdlIiwoZnVuY3Rpb24oZSl7cmV0dXJuIHIucHJvcHMub25DaGFuZ2UoZSl9KSkscn1yZXR1cm4geCgpKG4sW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLHQ9ZS5nZXRDb21wb25lbnQsbj1lLnZhbHVlLHI9ZS5lcnJvcnMsbz1lLnNjaGVtYSxhPWUucmVxdWlyZWQsaT1lLmRpc2FibGVkO3I9ci50b0pTP3IudG9KUygpOltdO3ZhciBzPW8mJm8uZ2V0P28uZ2V0KCJlbnVtIik6bnVsbCx1PSFzfHwhYSxjPSFzJiZPYmplY3QoQi5mcm9tSlMpKFsidHJ1ZSIsImZhbHNlIl0pLGw9dCgiU2VsZWN0Iik7cmV0dXJuIEQuYS5jcmVhdGVFbGVtZW50KGwse2NsYXNzTmFtZTpyLmxlbmd0aD8iaW52YWxpZCI6IiIsdGl0bGU6ci5sZW5ndGg/cjoiIix2YWx1ZTpTdHJpbmcobiksZGlzYWJsZWQ6aSxhbGxvd2VkVmFsdWVzOnN8fGMsYWxsb3dFbXB0eVZhbHVlOnUsb25DaGFuZ2U6dGhpcy5vbkVudW1DaGFuZ2V9KX19XSksbn0oUi5Db21wb25lbnQpO3koKShSciwiZGVmYXVsdFByb3BzIixqcik7dmFyIERyPWZ1bmN0aW9uKGUpe3JldHVybiBNKCkoZSkuY2FsbChlLChmdW5jdGlvbihlKXt2YXIgdCxuPXZvaWQgMCE9PWUucHJvcEtleT9lLnByb3BLZXk6ZS5pbmRleCxyPSJzdHJpbmciPT10eXBlb2YgZT9lOiJzdHJpbmciPT10eXBlb2YgZS5lcnJvcj9lLmVycm9yOm51bGw7aWYoIW4mJnIpcmV0dXJuIHI7Zm9yKHZhciBvPWUuZXJyb3IsYT0iLyIuY29uY2F0KGUucHJvcEtleSk7Im9iamVjdCI9PT1pKCkobyk7KXt2YXIgcz12b2lkIDAhPT1vLnByb3BLZXk/by5wcm9wS2V5Om8uaW5kZXg7aWYodm9pZCAwPT09cylicmVhaztpZihhKz0iLyIuY29uY2F0KHMpLCFvLmVycm9yKWJyZWFrO289by5lcnJvcn1yZXR1cm4gdSgpKHQ9IiIuY29uY2F0KGEsIjogIikpLmNhbGwodCxvKX0pKX0sTHI9ZnVuY3Rpb24oZSl7eWUoKShuLGUpO3ZhciB0PV9lKCkobik7ZnVuY3Rpb24gbigpe3ZhciBlO3JldHVybiBfKCkodGhpcyxuKSxlPXQuY2FsbCh0aGlzKSx5KCkodmUoKShlKSwib25DaGFuZ2UiLChmdW5jdGlvbih0KXtlLnByb3BzLm9uQ2hhbmdlKHQpfSkpLHkoKSh2ZSgpKGUpLCJoYW5kbGVPbkNoYW5nZSIsKGZ1bmN0aW9uKHQpe3ZhciBuPXQudGFyZ2V0LnZhbHVlO2Uub25DaGFuZ2Uobil9KSksZX1yZXR1cm4geCgpKG4sW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnByb3BzLHQ9ZS5nZXRDb21wb25lbnQsbj1lLnZhbHVlLHI9ZS5lcnJvcnMsbz1lLmRpc2FibGVkLGE9dCgiVGV4dEFyZWEiKTtyZXR1cm4gcj1yLnRvSlM/ci50b0pTKCk6VCgpKHIpP3I6W10sRC5hLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxELmEuY3JlYXRlRWxlbWVudChhLHtjbGFzc05hbWU6V3QoKSh7aW52YWxpZDpyLmxlbmd0aH0pLHRpdGxlOnIubGVuZ3RoP0RyKHIpLmpvaW4oIiwgIik6IiIsdmFsdWU6T2JqZWN0KCQuSSkobiksZGlzYWJsZWQ6byxvbkNoYW5nZTp0aGlzLmhhbmRsZU9uQ2hhbmdlfSkpfX1dKSxufShSLlB1cmVDb21wb25lbnQpO2Z1bmN0aW9uIEJyKGUpe3JldHVybiBCLkxpc3QuaXNMaXN0KGUpP2U6VCgpKGUpP09iamVjdChCLmZyb21KUykoZSk6T2JqZWN0KEIuTGlzdCkoKX15KCkoTHIsImRlZmF1bHRQcm9wcyIsanIpO3ZhciBGcj1mdW5jdGlvbigpe3ZhciBlPXtjb21wb25lbnRzOntBcHA6Q2UsYXV0aG9yaXphdGlvblBvcHVwOkFlLGF1dGhvcml6ZUJ0bjpPZSxBdXRob3JpemVCdG5Db250YWluZXI6a2UsYXV0aG9yaXplT3BlcmF0aW9uQnRuOmplLGF1dGhzOlRlLEF1dGhJdGVtOkllLGF1dGhFcnJvcjpQZSxvYXV0aDI6WWUsYXBpS2V5QXV0aDpOZSxiYXNpY0F1dGg6TWUsY2xlYXI6R2UsbGl2ZVJlc3BvbnNlOlFlLEluaXRpYWxpemVkSW5wdXQ6V24saW5mbzpZbixJbmZvQ29udGFpbmVyOkduLEp1bXBUb1BhdGg6Wm4sb25saW5lVmFsaWRhdG9yQmFkZ2U6ZXQuYSxvcGVyYXRpb25zOnJ0LG9wZXJhdGlvbjpsdCxPcGVyYXRpb25TdW1tYXJ5Omh0LE9wZXJhdGlvblN1bW1hcnlNZXRob2Q6ZHQsT3BlcmF0aW9uU3VtbWFyeVBhdGg6Z3QsaGlnaGxpZ2h0Q29kZTpMdCxyZXNwb25zZXM6QnQscmVzcG9uc2U6JHQsUmVzcG9uc2VFeHRlbnNpb246SnQscmVzcG9uc2VCb2R5OmVuLHBhcmFtZXRlcnM6YW4scGFyYW1ldGVyUm93OnBuLGV4ZWN1dGU6ZG4saGVhZGVyczptbixlcnJvcnM6dm4sY29udGVudFR5cGU6X24sb3ZlcnZpZXc6cW4sZm9vdGVyOlhuLEZpbHRlckNvbnRhaW5lcjpRbixQYXJhbUJvZHk6dHIsY3VybDpycixzY2hlbWVzOm9yLFNjaGVtZXNDb250YWluZXI6YXIsbW9kZWxFeGFtcGxlOmNyLE1vZGVsV3JhcHBlcjpscixNb2RlbENvbGxhcHNlOmlyLE1vZGVsOnByLmEsTW9kZWxzOmZyLEVudW1Nb2RlbDpocixPYmplY3RNb2RlbDptcixBcnJheU1vZGVsOnZyLFByaW1pdGl2ZU1vZGVsOnlyLFByb3BlcnR5OmJyLFRyeUl0T3V0QnV0dG9uOl9yLE1hcmtkb3duOkNyLmEsQmFzZUxheW91dDpBcixWZXJzaW9uUHJhZ21hRmlsdGVyOndyLFZlcnNpb25TdGFtcDp4cixPcGVyYXRpb25FeHQ6X3QsT3BlcmF0aW9uRXh0Um93Ond0LFBhcmFtZXRlckV4dDpzbixQYXJhbWV0ZXJJbmNsdWRlRW1wdHk6Y24sT3BlcmF0aW9uVGFnOmN0LE9wZXJhdGlvbkNvbnRhaW5lcjpTZSxEZWVwTGluazpFcixJbmZvVXJsOktuLEluZm9CYXNlUGF0aDpIbixTdmdBc3NldHM6U3IsRXhhbXBsZTpSZSxFeGFtcGxlc1NlbGVjdDpCZSxFeGFtcGxlc1NlbGVjdFZhbHVlUmV0YWluZXI6VWV9fSx0PXtjb21wb25lbnRzOnJ9LG49e2NvbXBvbmVudHM6b307cmV0dXJuW3BlLmRlZmF1bHQsY2UuZGVmYXVsdCxpZS5kZWZhdWx0LHJlLmRlZmF1bHQsbmUuZGVmYXVsdCxlZS5kZWZhdWx0LHRlLmRlZmF1bHQsb2UuZGVmYXVsdCxlLHQsc2UuZGVmYXVsdCxuLHVlLmRlZmF1bHQsbGUuZGVmYXVsdCxmZS5kZWZhdWx0LGhlLmRlZmF1bHQsZGUuZGVmYXVsdCxhZS5kZWZhdWx0XX0sVXI9bigzMjEpO2Z1bmN0aW9uIHFyKCl7cmV0dXJuW0ZyLFVyLmRlZmF1bHRdfXZhciB6cj1uKDM0Mik7dmFyIFZyPSEwLFdyPSJnMGZjNDI5ZiIsSHI9IjMuNTIuNSIsJHI9IlRodSwgMTQgT2N0IDIwMjEgMTQ6MjQ6MjEgR01UIjtmdW5jdGlvbiBKcihlKXt2YXIgdDtILmEudmVyc2lvbnM9SC5hLnZlcnNpb25zfHx7fSxILmEudmVyc2lvbnMuc3dhZ2dlclVpPXt2ZXJzaW9uOkhyLGdpdFJldmlzaW9uOldyLGdpdERpcnR5OlZyLGJ1aWxkVGltZXN0YW1wOiRyfTt2YXIgbj17ZG9tX2lkOm51bGwsZG9tTm9kZTpudWxsLHNwZWM6e30sdXJsOiIiLHVybHM6bnVsbCxsYXlvdXQ6IkJhc2VMYXlvdXQiLGRvY0V4cGFuc2lvbjoibGlzdCIsbWF4RGlzcGxheWVkVGFnczpudWxsLGZpbHRlcjpudWxsLHZhbGlkYXRvclVybDoiaHR0cHM6Ly92YWxpZGF0b3Iuc3dhZ2dlci5pby92YWxpZGF0b3IiLG9hdXRoMlJlZGlyZWN0VXJsOnUoKSh0PSIiLmNvbmNhdCh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wsIi8vIikpLmNhbGwodCx3aW5kb3cubG9jYXRpb24uaG9zdCwiL29hdXRoMi1yZWRpcmVjdC5odG1sIikscGVyc2lzdEF1dGhvcml6YXRpb246ITEsY29uZmlnczp7fSxjdXN0b206e30sZGlzcGxheU9wZXJhdGlvbklkOiExLGRpc3BsYXlSZXF1ZXN0RHVyYXRpb246ITEsZGVlcExpbmtpbmc6ITEsdHJ5SXRPdXRFbmFibGVkOiExLHJlcXVlc3RJbnRlcmNlcHRvcjpmdW5jdGlvbihlKXtyZXR1cm4gZX0scmVzcG9uc2VJbnRlcmNlcHRvcjpmdW5jdGlvbihlKXtyZXR1cm4gZX0sc2hvd011dGF0ZWRSZXF1ZXN0OiEwLGRlZmF1bHRNb2RlbFJlbmRlcmluZzoiZXhhbXBsZSIsZGVmYXVsdE1vZGVsRXhwYW5kRGVwdGg6MSxkZWZhdWx0TW9kZWxzRXhwYW5kRGVwdGg6MSxzaG93RXh0ZW5zaW9uczohMSxzaG93Q29tbW9uRXh0ZW5zaW9uczohMSx3aXRoQ3JlZGVudGlhbHM6dm9pZCAwLHJlcXVlc3RTbmlwcGV0c0VuYWJsZWQ6ITEscmVxdWVzdFNuaXBwZXRzOntnZW5lcmF0b3JzOntjdXJsX2Jhc2g6e3RpdGxlOiJjVVJMIChiYXNoKSIsc3ludGF4OiJiYXNoIn0sY3VybF9wb3dlcnNoZWxsOnt0aXRsZToiY1VSTCAoUG93ZXJTaGVsbCkiLHN5bnRheDoicG93ZXJzaGVsbCJ9LGN1cmxfY21kOnt0aXRsZToiY1VSTCAoQ01EKSIsc3ludGF4OiJiYXNoIn19LGRlZmF1bHRFeHBhbmRlZDohMCxsYW5ndWFnZXM6bnVsbH0sc3VwcG9ydGVkU3VibWl0TWV0aG9kczpbImdldCIsInB1dCIsInBvc3QiLCJkZWxldGUiLCJvcHRpb25zIiwiaGVhZCIsInBhdGNoIiwidHJhY2UiXSxwcmVzZXRzOltxcl0scGx1Z2luczpbXSxwbHVnaW5zT3B0aW9uczp7cGx1Z2luTG9hZFR5cGU6ImxlZ2FjeSJ9LGluaXRpYWxTdGF0ZTp7fSxmbjp7fSxjb21wb25lbnRzOnt9LHN5bnRheEhpZ2hsaWdodDp7YWN0aXZhdGVkOiEwLHRoZW1lOiJhZ2F0ZSJ9fSxyPU9iamVjdCgkLkMpKCksbz1lLmRvbU5vZGU7ZGVsZXRlIGUuZG9tTm9kZTt2YXIgYT12KCkoe30sbixlLHIpLHM9e3N5c3RlbTp7Y29uZmlnczphLmNvbmZpZ3N9LHBsdWdpbnM6YS5wcmVzZXRzLHBsdWdpbnNPcHRpb25zOmEucGx1Z2luc09wdGlvbnMsc3RhdGU6digpKHtsYXlvdXQ6e2xheW91dDphLmxheW91dCxmaWx0ZXI6bCgpKGEpfSxzcGVjOntzcGVjOiIiLHVybDphLnVybH0scmVxdWVzdFNuaXBwZXRzOmEucmVxdWVzdFNuaXBwZXRzfSxhLmluaXRpYWxTdGF0ZSl9O2lmKGEuaW5pdGlhbFN0YXRlKWZvcih2YXIgYyBpbiBhLmluaXRpYWxTdGF0ZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYS5pbml0aWFsU3RhdGUsYykmJnZvaWQgMD09PWEuaW5pdGlhbFN0YXRlW2NdJiZkZWxldGUgcy5zdGF0ZVtjXTt2YXIgcD1uZXcgSyhzKTtwLnJlZ2lzdGVyKFthLnBsdWdpbnMsZnVuY3Rpb24oKXtyZXR1cm57Zm46YS5mbixjb21wb25lbnRzOmEuY29tcG9uZW50cyxzdGF0ZTphLnN0YXRlfX1dKTt2YXIgaD1wLmdldFN5c3RlbSgpLG09ZnVuY3Rpb24oZSl7dmFyIHQ9aC5zcGVjU2VsZWN0b3JzLmdldExvY2FsQ29uZmlnP2guc3BlY1NlbGVjdG9ycy5nZXRMb2NhbENvbmZpZygpOnt9LG49digpKHt9LHQsYSxlfHx7fSxyKTtpZihvJiYobi5kb21Ob2RlPW8pLHAuc2V0Q29uZmlncyhuKSxoLmNvbmZpZ3NBY3Rpb25zLmxvYWRlZCgpLG51bGwhPT1lJiYoIXIudXJsJiYib2JqZWN0Ij09PWkoKShuLnNwZWMpJiZmKCkobi5zcGVjKS5sZW5ndGg/KGguc3BlY0FjdGlvbnMudXBkYXRlVXJsKCIiKSxoLnNwZWNBY3Rpb25zLnVwZGF0ZUxvYWRpbmdTdGF0dXMoInN1Y2Nlc3MiKSxoLnNwZWNBY3Rpb25zLnVwZGF0ZVNwZWMoZCgpKG4uc3BlYykpKTpoLnNwZWNBY3Rpb25zLmRvd25sb2FkJiZuLnVybCYmIW4udXJscyYmKGguc3BlY0FjdGlvbnMudXBkYXRlVXJsKG4udXJsKSxoLnNwZWNBY3Rpb25zLmRvd25sb2FkKG4udXJsKSkpLG4uZG9tTm9kZSloLnJlbmRlcihuLmRvbU5vZGUsIkFwcCIpO2Vsc2UgaWYobi5kb21faWQpe3ZhciBzPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iobi5kb21faWQpO2gucmVuZGVyKHMsIkFwcCIpfWVsc2UgbnVsbD09PW4uZG9tX2lkfHxudWxsPT09bi5kb21Ob2RlfHxjb25zb2xlLmVycm9yKCJTa2lwcGVkIHJlbmRlcmluZzogbm8gYGRvbV9pZGAgb3IgYGRvbU5vZGVgIHdhcyBzcGVjaWZpZWQiKTtyZXR1cm4gaH0sZz1yLmNvbmZpZ3x8YS5jb25maWdVcmw7cmV0dXJuIGcmJmguc3BlY0FjdGlvbnMmJmguc3BlY0FjdGlvbnMuZ2V0Q29uZmlnQnlVcmw/KGguc3BlY0FjdGlvbnMuZ2V0Q29uZmlnQnlVcmwoe3VybDpnLGxvYWRSZW1vdGVDb25maWc6ITAscmVxdWVzdEludGVyY2VwdG9yOmEucmVxdWVzdEludGVyY2VwdG9yLHJlc3BvbnNlSW50ZXJjZXB0b3I6YS5yZXNwb25zZUludGVyY2VwdG9yfSxtKSxoKTptKCl9SnIucHJlc2V0cz17YXBpczpxcn0sSnIucGx1Z2lucz16ci5kZWZhdWx0O3QuZGVmYXVsdD1Kcn1dKS5kZWZhdWx0fSkpOwoKIWZ1bmN0aW9uKHQsZSl7Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYib2JqZWN0Ij09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW10sZSk6Im9iamVjdCI9PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMuU3dhZ2dlclVJU3RhbmRhbG9uZVByZXNldD1lKCk6dC5Td2FnZ2VyVUlTdGFuZGFsb25lUHJlc2V0PWUoKX0odGhpcywoZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9e307ZnVuY3Rpb24gbihyKXtpZihlW3JdKXJldHVybiBlW3JdLmV4cG9ydHM7dmFyIGk9ZVtyXT17aTpyLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIHRbcl0uY2FsbChpLmV4cG9ydHMsaSxpLmV4cG9ydHMsbiksaS5sPSEwLGkuZXhwb3J0c31yZXR1cm4gbi5tPXQsbi5jPWUsbi5kPWZ1bmN0aW9uKHQsZSxyKXtuLm8odCxlKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7ZW51bWVyYWJsZTohMCxnZXQ6cn0pfSxuLnI9ZnVuY3Rpb24odCl7InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0sbi50PWZ1bmN0aW9uKHQsZSl7aWYoMSZlJiYodD1uKHQpKSw4JmUpcmV0dXJuIHQ7aWYoNCZlJiYib2JqZWN0Ij09dHlwZW9mIHQmJnQmJnQuX19lc01vZHVsZSlyZXR1cm4gdDt2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpO2lmKG4ucihyKSxPYmplY3QuZGVmaW5lUHJvcGVydHkociwiZGVmYXVsdCIse2VudW1lcmFibGU6ITAsdmFsdWU6dH0pLDImZSYmInN0cmluZyIhPXR5cGVvZiB0KWZvcih2YXIgaSBpbiB0KW4uZChyLGksZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19LmJpbmQobnVsbCxpKSk7cmV0dXJuIHJ9LG4ubj1mdW5jdGlvbih0KXt2YXIgZT10JiZ0Ll9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gdC5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiB0fTtyZXR1cm4gbi5kKGUsImEiLGUpLGV9LG4ubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sbi5wPSIvZGlzdCIsbihuLnM9MjMzKX0oW2Z1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlO2Z1bmN0aW9uIGUodCxlKXtlJiYodC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSkpLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXR9ZnVuY3Rpb24gbih0KXtyZXR1cm4gdSh0KT90OkoodCl9ZnVuY3Rpb24gcih0KXtyZXR1cm4gcyh0KT90OloodCl9ZnVuY3Rpb24gaSh0KXtyZXR1cm4gYSh0KT90OlYodCl9ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdSh0KSYmIWModCk/dDpYKHQpfWZ1bmN0aW9uIHUodCl7cmV0dXJuISghdHx8IXRbbF0pfWZ1bmN0aW9uIHModCl7cmV0dXJuISghdHx8IXRbcF0pfWZ1bmN0aW9uIGEodCl7cmV0dXJuISghdHx8IXRbaF0pfWZ1bmN0aW9uIGModCl7cmV0dXJuIHModCl8fGEodCl9ZnVuY3Rpb24gZih0KXtyZXR1cm4hKCF0fHwhdFtkXSl9ZShyLG4pLGUoaSxuKSxlKG8sbiksbi5pc0l0ZXJhYmxlPXUsbi5pc0tleWVkPXMsbi5pc0luZGV4ZWQ9YSxuLmlzQXNzb2NpYXRpdmU9YyxuLmlzT3JkZXJlZD1mLG4uS2V5ZWQ9cixuLkluZGV4ZWQ9aSxuLlNldD1vO3ZhciBsPSJAQF9fSU1NVVRBQkxFX0lURVJBQkxFX19AQCIscD0iQEBfX0lNTVVUQUJMRV9LRVlFRF9fQEAiLGg9IkBAX19JTU1VVEFCTEVfSU5ERVhFRF9fQEAiLGQ9IkBAX19JTU1VVEFCTEVfT1JERVJFRF9fQEAiLHk9ImRlbGV0ZSIsdj01LGc9MTw8dix3PWctMSxNPXt9LG09e3ZhbHVlOiExfSxfPXt2YWx1ZTohMX07ZnVuY3Rpb24gTCh0KXtyZXR1cm4gdC52YWx1ZT0hMSx0fWZ1bmN0aW9uIGIodCl7dCYmKHQudmFsdWU9ITApfWZ1bmN0aW9uIHgoKXt9ZnVuY3Rpb24gaih0LGUpe2U9ZXx8MDtmb3IodmFyIG49TWF0aC5tYXgoMCx0Lmxlbmd0aC1lKSxyPW5ldyBBcnJheShuKSxpPTA7aTxuO2krKylyW2ldPXRbaStlXTtyZXR1cm4gcn1mdW5jdGlvbiBOKHQpe3JldHVybiB2b2lkIDA9PT10LnNpemUmJih0LnNpemU9dC5fX2l0ZXJhdGUoRCkpLHQuc2l6ZX1mdW5jdGlvbiBTKHQsZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlKXt2YXIgbj1lPj4+MDtpZigiIituIT09ZXx8NDI5NDk2NzI5NT09PW4pcmV0dXJuIE5hTjtlPW59cmV0dXJuIGU8MD9OKHQpK2U6ZX1mdW5jdGlvbiBEKCl7cmV0dXJuITB9ZnVuY3Rpb24gSSh0LGUsbil7cmV0dXJuKDA9PT10fHx2b2lkIDAhPT1uJiZ0PD0tbikmJih2b2lkIDA9PT1lfHx2b2lkIDAhPT1uJiZlPj1uKX1mdW5jdGlvbiBBKHQsZSl7cmV0dXJuIFQodCxlLDApfWZ1bmN0aW9uIE8odCxlKXtyZXR1cm4gVCh0LGUsZSl9ZnVuY3Rpb24gVCh0LGUsbil7cmV0dXJuIHZvaWQgMD09PXQ/bjp0PDA/TWF0aC5tYXgoMCxlK3QpOnZvaWQgMD09PWU/dDpNYXRoLm1pbihlLHQpfXZhciBDPTAsRT0xLHo9MixrPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvcixZPSJAQGl0ZXJhdG9yIixVPWt8fFk7ZnVuY3Rpb24gUCh0KXt0aGlzLm5leHQ9dH1mdW5jdGlvbiBSKHQsZSxuLHIpe3ZhciBpPTA9PT10P2U6MT09PXQ/bjpbZSxuXTtyZXR1cm4gcj9yLnZhbHVlPWk6cj17dmFsdWU6aSxkb25lOiExfSxyfWZ1bmN0aW9uIFEoKXtyZXR1cm57dmFsdWU6dm9pZCAwLGRvbmU6ITB9fWZ1bmN0aW9uIEYodCl7cmV0dXJuISFXKHQpfWZ1bmN0aW9uIEIodCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiB0Lm5leHR9ZnVuY3Rpb24gRyh0KXt2YXIgZT1XKHQpO3JldHVybiBlJiZlLmNhbGwodCl9ZnVuY3Rpb24gVyh0KXt2YXIgZT10JiYoayYmdFtrXXx8dFtZXSk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUpcmV0dXJuIGV9ZnVuY3Rpb24gcSh0KXtyZXR1cm4gdCYmIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aH1mdW5jdGlvbiBKKHQpe3JldHVybiBudWxsPT10P3V0KCk6dSh0KT90LnRvU2VxKCk6Y3QodCl9ZnVuY3Rpb24gWih0KXtyZXR1cm4gbnVsbD09dD91dCgpLnRvS2V5ZWRTZXEoKTp1KHQpP3ModCk/dC50b1NlcSgpOnQuZnJvbUVudHJ5U2VxKCk6c3QodCl9ZnVuY3Rpb24gVih0KXtyZXR1cm4gbnVsbD09dD91dCgpOnUodCk/cyh0KT90LmVudHJ5U2VxKCk6dC50b0luZGV4ZWRTZXEoKTphdCh0KX1mdW5jdGlvbiBYKHQpe3JldHVybihudWxsPT10P3V0KCk6dSh0KT9zKHQpP3QuZW50cnlTZXEoKTp0OmF0KHQpKS50b1NldFNlcSgpfVAucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIltJdGVyYXRvcl0ifSxQLktFWVM9QyxQLlZBTFVFUz1FLFAuRU5UUklFUz16LFAucHJvdG90eXBlLmluc3BlY3Q9UC5wcm90b3R5cGUudG9Tb3VyY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b1N0cmluZygpfSxQLnByb3RvdHlwZVtVXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxlKEosbiksSi5vZj1mdW5jdGlvbigpe3JldHVybiBKKGFyZ3VtZW50cyl9LEoucHJvdG90eXBlLnRvU2VxPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LEoucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX190b1N0cmluZygiU2VxIHsiLCJ9Iil9LEoucHJvdG90eXBlLmNhY2hlUmVzdWx0PWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuX2NhY2hlJiZ0aGlzLl9faXRlcmF0ZVVuY2FjaGVkJiYodGhpcy5fY2FjaGU9dGhpcy5lbnRyeVNlcSgpLnRvQXJyYXkoKSx0aGlzLnNpemU9dGhpcy5fY2FjaGUubGVuZ3RoKSx0aGlzfSxKLnByb3RvdHlwZS5fX2l0ZXJhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbHQodGhpcyx0LGUsITApfSxKLnByb3RvdHlwZS5fX2l0ZXJhdG9yPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHB0KHRoaXMsdCxlLCEwKX0sZShaLEopLFoucHJvdG90eXBlLnRvS2V5ZWRTZXE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZShWLEopLFYub2Y9ZnVuY3Rpb24oKXtyZXR1cm4gVihhcmd1bWVudHMpfSxWLnByb3RvdHlwZS50b0luZGV4ZWRTZXE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sVi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX3RvU3RyaW5nKCJTZXEgWyIsIl0iKX0sVi5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGx0KHRoaXMsdCxlLCExKX0sVi5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbih0LGUpe3JldHVybiBwdCh0aGlzLHQsZSwhMSl9LGUoWCxKKSxYLm9mPWZ1bmN0aW9uKCl7cmV0dXJuIFgoYXJndW1lbnRzKX0sWC5wcm90b3R5cGUudG9TZXRTZXE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sSi5pc1NlcT1vdCxKLktleWVkPVosSi5TZXQ9WCxKLkluZGV4ZWQ9Vjt2YXIgSCxLLCQsdHQ9IkBAX19JTU1VVEFCTEVfU0VRX19AQCI7ZnVuY3Rpb24gZXQodCl7dGhpcy5fYXJyYXk9dCx0aGlzLnNpemU9dC5sZW5ndGh9ZnVuY3Rpb24gbnQodCl7dmFyIGU9T2JqZWN0LmtleXModCk7dGhpcy5fb2JqZWN0PXQsdGhpcy5fa2V5cz1lLHRoaXMuc2l6ZT1lLmxlbmd0aH1mdW5jdGlvbiBydCh0KXt0aGlzLl9pdGVyYWJsZT10LHRoaXMuc2l6ZT10Lmxlbmd0aHx8dC5zaXplfWZ1bmN0aW9uIGl0KHQpe3RoaXMuX2l0ZXJhdG9yPXQsdGhpcy5faXRlcmF0b3JDYWNoZT1bXX1mdW5jdGlvbiBvdCh0KXtyZXR1cm4hKCF0fHwhdFt0dF0pfWZ1bmN0aW9uIHV0KCl7cmV0dXJuIEh8fChIPW5ldyBldChbXSkpfWZ1bmN0aW9uIHN0KHQpe3ZhciBlPUFycmF5LmlzQXJyYXkodCk/bmV3IGV0KHQpLmZyb21FbnRyeVNlcSgpOkIodCk/bmV3IGl0KHQpLmZyb21FbnRyeVNlcSgpOkYodCk/bmV3IHJ0KHQpLmZyb21FbnRyeVNlcSgpOiJvYmplY3QiPT10eXBlb2YgdD9uZXcgbnQodCk6dm9pZCAwO2lmKCFlKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIEFycmF5IG9yIGl0ZXJhYmxlIG9iamVjdCBvZiBbaywgdl0gZW50cmllcywgb3Iga2V5ZWQgb2JqZWN0OiAiK3QpO3JldHVybiBlfWZ1bmN0aW9uIGF0KHQpe3ZhciBlPWZ0KHQpO2lmKCFlKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIEFycmF5IG9yIGl0ZXJhYmxlIG9iamVjdCBvZiB2YWx1ZXM6ICIrdCk7cmV0dXJuIGV9ZnVuY3Rpb24gY3QodCl7dmFyIGU9ZnQodCl8fCJvYmplY3QiPT10eXBlb2YgdCYmbmV3IG50KHQpO2lmKCFlKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIEFycmF5IG9yIGl0ZXJhYmxlIG9iamVjdCBvZiB2YWx1ZXMsIG9yIGtleWVkIG9iamVjdDogIit0KTtyZXR1cm4gZX1mdW5jdGlvbiBmdCh0KXtyZXR1cm4gcSh0KT9uZXcgZXQodCk6Qih0KT9uZXcgaXQodCk6Rih0KT9uZXcgcnQodCk6dm9pZCAwfWZ1bmN0aW9uIGx0KHQsZSxuLHIpe3ZhciBpPXQuX2NhY2hlO2lmKGkpe2Zvcih2YXIgbz1pLmxlbmd0aC0xLHU9MDt1PD1vO3UrKyl7dmFyIHM9aVtuP28tdTp1XTtpZighMT09PWUoc1sxXSxyP3NbMF06dSx0KSlyZXR1cm4gdSsxfXJldHVybiB1fXJldHVybiB0Ll9faXRlcmF0ZVVuY2FjaGVkKGUsbil9ZnVuY3Rpb24gcHQodCxlLG4scil7dmFyIGk9dC5fY2FjaGU7aWYoaSl7dmFyIG89aS5sZW5ndGgtMSx1PTA7cmV0dXJuIG5ldyBQKChmdW5jdGlvbigpe3ZhciB0PWlbbj9vLXU6dV07cmV0dXJuIHUrKz5vP1EoKTpSKGUscj90WzBdOnUtMSx0WzFdKX0pKX1yZXR1cm4gdC5fX2l0ZXJhdG9yVW5jYWNoZWQoZSxuKX1mdW5jdGlvbiBodCh0LGUpe3JldHVybiBlP2R0KGUsdCwiIix7IiI6dH0pOnl0KHQpfWZ1bmN0aW9uIGR0KHQsZSxuLHIpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP3QuY2FsbChyLG4sVihlKS5tYXAoKGZ1bmN0aW9uKG4scil7cmV0dXJuIGR0KHQsbixyLGUpfSkpKTp2dChlKT90LmNhbGwocixuLFooZSkubWFwKChmdW5jdGlvbihuLHIpe3JldHVybiBkdCh0LG4scixlKX0pKSk6ZX1mdW5jdGlvbiB5dCh0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT9WKHQpLm1hcCh5dCkudG9MaXN0KCk6dnQodCk/Wih0KS5tYXAoeXQpLnRvTWFwKCk6dH1mdW5jdGlvbiB2dCh0KXtyZXR1cm4gdCYmKHQuY29uc3RydWN0b3I9PT1PYmplY3R8fHZvaWQgMD09PXQuY29uc3RydWN0b3IpfWZ1bmN0aW9uIGd0KHQsZSl7aWYodD09PWV8fHQhPXQmJmUhPWUpcmV0dXJuITA7aWYoIXR8fCFlKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LnZhbHVlT2YmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnZhbHVlT2Ype2lmKCh0PXQudmFsdWVPZigpKT09PShlPWUudmFsdWVPZigpKXx8dCE9dCYmZSE9ZSlyZXR1cm4hMDtpZighdHx8IWUpcmV0dXJuITF9cmV0dXJuISgiZnVuY3Rpb24iIT10eXBlb2YgdC5lcXVhbHN8fCJmdW5jdGlvbiIhPXR5cGVvZiBlLmVxdWFsc3x8IXQuZXF1YWxzKGUpKX1mdW5jdGlvbiB3dCh0LGUpe2lmKHQ9PT1lKXJldHVybiEwO2lmKCF1KGUpfHx2b2lkIDAhPT10LnNpemUmJnZvaWQgMCE9PWUuc2l6ZSYmdC5zaXplIT09ZS5zaXplfHx2b2lkIDAhPT10Ll9faGFzaCYmdm9pZCAwIT09ZS5fX2hhc2gmJnQuX19oYXNoIT09ZS5fX2hhc2h8fHModCkhPT1zKGUpfHxhKHQpIT09YShlKXx8Zih0KSE9PWYoZSkpcmV0dXJuITE7aWYoMD09PXQuc2l6ZSYmMD09PWUuc2l6ZSlyZXR1cm4hMDt2YXIgbj0hYyh0KTtpZihmKHQpKXt2YXIgcj10LmVudHJpZXMoKTtyZXR1cm4gZS5ldmVyeSgoZnVuY3Rpb24odCxlKXt2YXIgaT1yLm5leHQoKS52YWx1ZTtyZXR1cm4gaSYmZ3QoaVsxXSx0KSYmKG58fGd0KGlbMF0sZSkpfSkpJiZyLm5leHQoKS5kb25lfXZhciBpPSExO2lmKHZvaWQgMD09PXQuc2l6ZSlpZih2b2lkIDA9PT1lLnNpemUpImZ1bmN0aW9uIj09dHlwZW9mIHQuY2FjaGVSZXN1bHQmJnQuY2FjaGVSZXN1bHQoKTtlbHNle2k9ITA7dmFyIG89dDt0PWUsZT1vfXZhciBsPSEwLHA9ZS5fX2l0ZXJhdGUoKGZ1bmN0aW9uKGUscil7aWYobj8hdC5oYXMoZSk6aT8hZ3QoZSx0LmdldChyLE0pKTohZ3QodC5nZXQocixNKSxlKSlyZXR1cm4gbD0hMSwhMX0pKTtyZXR1cm4gbCYmdC5zaXplPT09cH1mdW5jdGlvbiBNdCh0LGUpe2lmKCEodGhpcyBpbnN0YW5jZW9mIE10KSlyZXR1cm4gbmV3IE10KHQsZSk7aWYodGhpcy5fdmFsdWU9dCx0aGlzLnNpemU9dm9pZCAwPT09ZT8xLzA6TWF0aC5tYXgoMCxlKSwwPT09dGhpcy5zaXplKXtpZihLKXJldHVybiBLO0s9dGhpc319ZnVuY3Rpb24gbXQodCxlKXtpZighdCl0aHJvdyBuZXcgRXJyb3IoZSl9ZnVuY3Rpb24gX3QodCxlLG4pe2lmKCEodGhpcyBpbnN0YW5jZW9mIF90KSlyZXR1cm4gbmV3IF90KHQsZSxuKTtpZihtdCgwIT09biwiQ2Fubm90IHN0ZXAgYSBSYW5nZSBieSAwIiksdD10fHwwLHZvaWQgMD09PWUmJihlPTEvMCksbj12b2lkIDA9PT1uPzE6TWF0aC5hYnMobiksZTx0JiYobj0tbiksdGhpcy5fc3RhcnQ9dCx0aGlzLl9lbmQ9ZSx0aGlzLl9zdGVwPW4sdGhpcy5zaXplPU1hdGgubWF4KDAsTWF0aC5jZWlsKChlLXQpL24tMSkrMSksMD09PXRoaXMuc2l6ZSl7aWYoJClyZXR1cm4gJDskPXRoaXN9fWZ1bmN0aW9uIEx0KCl7dGhyb3cgVHlwZUVycm9yKCJBYnN0cmFjdCIpfWZ1bmN0aW9uIGJ0KCl7fWZ1bmN0aW9uIHh0KCl7fWZ1bmN0aW9uIGp0KCl7fUoucHJvdG90eXBlW3R0XT0hMCxlKGV0LFYpLGV0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5oYXModCk/dGhpcy5fYXJyYXlbUyh0aGlzLHQpXTplfSxldC5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXRoaXMuX2FycmF5LHI9bi5sZW5ndGgtMSxpPTA7aTw9cjtpKyspaWYoITE9PT10KG5bZT9yLWk6aV0saSx0aGlzKSlyZXR1cm4gaSsxO3JldHVybiBpfSxldC5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2FycmF5LHI9bi5sZW5ndGgtMSxpPTA7cmV0dXJuIG5ldyBQKChmdW5jdGlvbigpe3JldHVybiBpPnI/USgpOlIodCxpLG5bZT9yLWkrKzppKytdKX0pKX0sZShudCxaKSxudC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMD09PWV8fHRoaXMuaGFzKHQpP3RoaXMuX29iamVjdFt0XTplfSxudC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9vYmplY3QuaGFzT3duUHJvcGVydHkodCl9LG50LnByb3RvdHlwZS5fX2l0ZXJhdGU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dGhpcy5fb2JqZWN0LHI9dGhpcy5fa2V5cyxpPXIubGVuZ3RoLTEsbz0wO288PWk7bysrKXt2YXIgdT1yW2U/aS1vOm9dO2lmKCExPT09dChuW3VdLHUsdGhpcykpcmV0dXJuIG8rMX1yZXR1cm4gb30sbnQucHJvdG90eXBlLl9faXRlcmF0b3I9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9vYmplY3Qscj10aGlzLl9rZXlzLGk9ci5sZW5ndGgtMSxvPTA7cmV0dXJuIG5ldyBQKChmdW5jdGlvbigpe3ZhciB1PXJbZT9pLW86b107cmV0dXJuIG8rKz5pP1EoKTpSKHQsdSxuW3VdKX0pKX0sbnQucHJvdG90eXBlW2RdPSEwLGUocnQsVikscnQucHJvdG90eXBlLl9faXRlcmF0ZVVuY2FjaGVkPWZ1bmN0aW9uKHQsZSl7aWYoZSlyZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0ZSh0LGUpO3ZhciBuPUcodGhpcy5faXRlcmFibGUpLHI9MDtpZihCKG4pKWZvcih2YXIgaTshKGk9bi5uZXh0KCkpLmRvbmUmJiExIT09dChpLnZhbHVlLHIrKyx0aGlzKTspO3JldHVybiByfSxydC5wcm90b3R5cGUuX19pdGVyYXRvclVuY2FjaGVkPWZ1bmN0aW9uKHQsZSl7aWYoZSlyZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0b3IodCxlKTt2YXIgbj1HKHRoaXMuX2l0ZXJhYmxlKTtpZighQihuKSlyZXR1cm4gbmV3IFAoUSk7dmFyIHI9MDtyZXR1cm4gbmV3IFAoKGZ1bmN0aW9uKCl7dmFyIGU9bi5uZXh0KCk7cmV0dXJuIGUuZG9uZT9lOlIodCxyKyssZS52YWx1ZSl9KSl9LGUoaXQsViksaXQucHJvdG90eXBlLl9faXRlcmF0ZVVuY2FjaGVkPWZ1bmN0aW9uKHQsZSl7aWYoZSlyZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0ZSh0LGUpO2Zvcih2YXIgbixyPXRoaXMuX2l0ZXJhdG9yLGk9dGhpcy5faXRlcmF0b3JDYWNoZSxvPTA7bzxpLmxlbmd0aDspaWYoITE9PT10KGlbb10sbysrLHRoaXMpKXJldHVybiBvO2Zvcig7IShuPXIubmV4dCgpKS5kb25lOyl7dmFyIHU9bi52YWx1ZTtpZihpW29dPXUsITE9PT10KHUsbysrLHRoaXMpKWJyZWFrfXJldHVybiBvfSxpdC5wcm90b3R5cGUuX19pdGVyYXRvclVuY2FjaGVkPWZ1bmN0aW9uKHQsZSl7aWYoZSlyZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0b3IodCxlKTt2YXIgbj10aGlzLl9pdGVyYXRvcixyPXRoaXMuX2l0ZXJhdG9yQ2FjaGUsaT0wO3JldHVybiBuZXcgUCgoZnVuY3Rpb24oKXtpZihpPj1yLmxlbmd0aCl7dmFyIGU9bi5uZXh0KCk7aWYoZS5kb25lKXJldHVybiBlO3JbaV09ZS52YWx1ZX1yZXR1cm4gUih0LGkscltpKytdKX0pKX0sZShNdCxWKSxNdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMuc2l6ZT8iUmVwZWF0IFtdIjoiUmVwZWF0IFsgIit0aGlzLl92YWx1ZSsiICIrdGhpcy5zaXplKyIgdGltZXMgXSJ9LE10LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5oYXModCk/dGhpcy5fdmFsdWU6ZX0sTXQucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uKHQpe3JldHVybiBndCh0aGlzLl92YWx1ZSx0KX0sTXQucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5zaXplO3JldHVybiBJKHQsZSxuKT90aGlzOm5ldyBNdCh0aGlzLl92YWx1ZSxPKGUsbiktQSh0LG4pKX0sTXQucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sTXQucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24odCl7cmV0dXJuIGd0KHRoaXMuX3ZhbHVlLHQpPzA6LTF9LE10LnByb3RvdHlwZS5sYXN0SW5kZXhPZj1mdW5jdGlvbih0KXtyZXR1cm4gZ3QodGhpcy5fdmFsdWUsdCk/dGhpcy5zaXplOi0xfSxNdC5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjx0aGlzLnNpemU7bisrKWlmKCExPT09dCh0aGlzLl92YWx1ZSxuLHRoaXMpKXJldHVybiBuKzE7cmV0dXJuIG59LE10LnByb3RvdHlwZS5fX2l0ZXJhdG9yPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPTA7cmV0dXJuIG5ldyBQKChmdW5jdGlvbigpe3JldHVybiByPG4uc2l6ZT9SKHQscisrLG4uX3ZhbHVlKTpRKCl9KSl9LE10LnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBNdD9ndCh0aGlzLl92YWx1ZSx0Ll92YWx1ZSk6d3QodCl9LGUoX3QsViksX3QucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLnNpemU/IlJhbmdlIFtdIjoiUmFuZ2UgWyAiK3RoaXMuX3N0YXJ0KyIuLi4iK3RoaXMuX2VuZCsoMSE9PXRoaXMuX3N0ZXA/IiBieSAiK3RoaXMuX3N0ZXA6IiIpKyIgXSJ9LF90LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5oYXModCk/dGhpcy5fc3RhcnQrUyh0aGlzLHQpKnRoaXMuX3N0ZXA6ZX0sX3QucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uKHQpe3ZhciBlPSh0LXRoaXMuX3N0YXJ0KS90aGlzLl9zdGVwO3JldHVybiBlPj0wJiZlPHRoaXMuc2l6ZSYmZT09PU1hdGguZmxvb3IoZSl9LF90LnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbih0LGUpe3JldHVybiBJKHQsZSx0aGlzLnNpemUpP3RoaXM6KHQ9QSh0LHRoaXMuc2l6ZSksKGU9TyhlLHRoaXMuc2l6ZSkpPD10P25ldyBfdCgwLDApOm5ldyBfdCh0aGlzLmdldCh0LHRoaXMuX2VuZCksdGhpcy5nZXQoZSx0aGlzLl9lbmQpLHRoaXMuX3N0ZXApKX0sX3QucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24odCl7dmFyIGU9dC10aGlzLl9zdGFydDtpZihlJXRoaXMuX3N0ZXA9PTApe3ZhciBuPWUvdGhpcy5fc3RlcDtpZihuPj0wJiZuPHRoaXMuc2l6ZSlyZXR1cm4gbn1yZXR1cm4tMX0sX3QucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmluZGV4T2YodCl9LF90LnByb3RvdHlwZS5fX2l0ZXJhdGU9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dGhpcy5zaXplLTEscj10aGlzLl9zdGVwLGk9ZT90aGlzLl9zdGFydCtuKnI6dGhpcy5fc3RhcnQsbz0wO288PW47bysrKXtpZighMT09PXQoaSxvLHRoaXMpKXJldHVybiBvKzE7aSs9ZT8tcjpyfXJldHVybiBvfSxfdC5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuc2l6ZS0xLHI9dGhpcy5fc3RlcCxpPWU/dGhpcy5fc3RhcnQrbipyOnRoaXMuX3N0YXJ0LG89MDtyZXR1cm4gbmV3IFAoKGZ1bmN0aW9uKCl7dmFyIHU9aTtyZXR1cm4gaSs9ZT8tcjpyLG8+bj9RKCk6Uih0LG8rKyx1KX0pKX0sX3QucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIF90P3RoaXMuX3N0YXJ0PT09dC5fc3RhcnQmJnRoaXMuX2VuZD09PXQuX2VuZCYmdGhpcy5fc3RlcD09PXQuX3N0ZXA6d3QodGhpcyx0KX0sZShMdCxuKSxlKGJ0LEx0KSxlKHh0LEx0KSxlKGp0LEx0KSxMdC5LZXllZD1idCxMdC5JbmRleGVkPXh0LEx0LlNldD1qdDt2YXIgTnQ9ImZ1bmN0aW9uIj09dHlwZW9mIE1hdGguaW11bCYmLTI9PT1NYXRoLmltdWwoNDI5NDk2NzI5NSwyKT9NYXRoLmltdWw6ZnVuY3Rpb24odCxlKXt2YXIgbj02NTUzNSYodHw9MCkscj02NTUzNSYoZXw9MCk7cmV0dXJuIG4qcisoKHQ+Pj4xNikqcituKihlPj4+MTYpPDwxNj4+PjApfDB9O2Z1bmN0aW9uIFN0KHQpe3JldHVybiB0Pj4+MSYxMDczNzQxODI0fDMyMjEyMjU0NzEmdH1mdW5jdGlvbiBEdCh0KXtpZighMT09PXR8fG51bGw9PXQpcmV0dXJuIDA7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQudmFsdWVPZiYmKCExPT09KHQ9dC52YWx1ZU9mKCkpfHxudWxsPT10KSlyZXR1cm4gMDtpZighMD09PXQpcmV0dXJuIDE7dmFyIGU9dHlwZW9mIHQ7aWYoIm51bWJlciI9PT1lKXtpZih0IT10fHx0PT09MS8wKXJldHVybiAwO3ZhciBuPTB8dDtmb3IobiE9PXQmJihuXj00Mjk0OTY3Mjk1KnQpO3Q+NDI5NDk2NzI5NTspbl49dC89NDI5NDk2NzI5NTtyZXR1cm4gU3Qobil9aWYoInN0cmluZyI9PT1lKXJldHVybiB0Lmxlbmd0aD5QdD9JdCh0KTpBdCh0KTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdC5oYXNoQ29kZSlyZXR1cm4gdC5oYXNoQ29kZSgpO2lmKCJvYmplY3QiPT09ZSlyZXR1cm4gT3QodCk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQudG9TdHJpbmcpcmV0dXJuIEF0KHQudG9TdHJpbmcoKSk7dGhyb3cgbmV3IEVycm9yKCJWYWx1ZSB0eXBlICIrZSsiIGNhbm5vdCBiZSBoYXNoZWQuIil9ZnVuY3Rpb24gSXQodCl7dmFyIGU9RnRbdF07cmV0dXJuIHZvaWQgMD09PWUmJihlPUF0KHQpLFF0PT09UnQmJihRdD0wLEZ0PXt9KSxRdCsrLEZ0W3RdPWUpLGV9ZnVuY3Rpb24gQXQodCl7Zm9yKHZhciBlPTAsbj0wO248dC5sZW5ndGg7bisrKWU9MzEqZSt0LmNoYXJDb2RlQXQobil8MDtyZXR1cm4gU3QoZSl9ZnVuY3Rpb24gT3QodCl7dmFyIGU7aWYoa3QmJnZvaWQgMCE9PShlPXp0LmdldCh0KSkpcmV0dXJuIGU7aWYodm9pZCAwIT09KGU9dFtVdF0pKXJldHVybiBlO2lmKCFDdCl7aWYodm9pZCAwIT09KGU9dC5wcm9wZXJ0eUlzRW51bWVyYWJsZSYmdC5wcm9wZXJ0eUlzRW51bWVyYWJsZVtVdF0pKXJldHVybiBlO2lmKHZvaWQgMCE9PShlPUV0KHQpKSlyZXR1cm4gZX1pZihlPSsrWXQsMTA3Mzc0MTgyNCZZdCYmKFl0PTApLGt0KXp0LnNldCh0LGUpO2Vsc2V7aWYodm9pZCAwIT09VHQmJiExPT09VHQodCkpdGhyb3cgbmV3IEVycm9yKCJOb24tZXh0ZW5zaWJsZSBvYmplY3RzIGFyZSBub3QgYWxsb3dlZCBhcyBrZXlzLiIpO2lmKEN0KU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFV0LHtlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMSx3cml0YWJsZTohMSx2YWx1ZTplfSk7ZWxzZSBpZih2b2lkIDAhPT10LnByb3BlcnR5SXNFbnVtZXJhYmxlJiZ0LnByb3BlcnR5SXNFbnVtZXJhYmxlPT09dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUpdC5wcm9wZXJ0eUlzRW51bWVyYWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHQucHJvcGVydHlJc0VudW1lcmFibGVbVXRdPWU7ZWxzZXtpZih2b2lkIDA9PT10Lm5vZGVUeXBlKXRocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIHNldCBhIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5IG9uIG9iamVjdC4iKTt0W1V0XT1lfX1yZXR1cm4gZX12YXIgVHQ9T2JqZWN0LmlzRXh0ZW5zaWJsZSxDdD1mdW5jdGlvbigpe3RyeXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJAIix7fSksITB9Y2F0Y2godCl7cmV0dXJuITF9fSgpO2Z1bmN0aW9uIEV0KHQpe2lmKHQmJnQubm9kZVR5cGU+MClzd2l0Y2godC5ub2RlVHlwZSl7Y2FzZSAxOnJldHVybiB0LnVuaXF1ZUlEO2Nhc2UgOTpyZXR1cm4gdC5kb2N1bWVudEVsZW1lbnQmJnQuZG9jdW1lbnRFbGVtZW50LnVuaXF1ZUlEfX12YXIgenQsa3Q9ImZ1bmN0aW9uIj09dHlwZW9mIFdlYWtNYXA7a3QmJih6dD1uZXcgV2Vha01hcCk7dmFyIFl0PTAsVXQ9Il9faW1tdXRhYmxlaGFzaF9fIjsiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYoVXQ9U3ltYm9sKFV0KSk7dmFyIFB0PTE2LFJ0PTI1NSxRdD0wLEZ0PXt9O2Z1bmN0aW9uIEJ0KHQpe210KHQhPT0xLzAsIkNhbm5vdCBwZXJmb3JtIHRoaXMgYWN0aW9uIHdpdGggYW4gaW5maW5pdGUgc2l6ZS4iKX1mdW5jdGlvbiBHdCh0KXtyZXR1cm4gbnVsbD09dD9pZSgpOld0KHQpJiYhZih0KT90OmllKCkud2l0aE11dGF0aW9ucygoZnVuY3Rpb24oZSl7dmFyIG49cih0KTtCdChuLnNpemUpLG4uZm9yRWFjaCgoZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5zZXQobix0KX0pKX0pKX1mdW5jdGlvbiBXdCh0KXtyZXR1cm4hKCF0fHwhdFtKdF0pfWUoR3QsYnQpLEd0Lm9mPWZ1bmN0aW9uKCl7dmFyIGU9dC5jYWxsKGFyZ3VtZW50cywwKTtyZXR1cm4gaWUoKS53aXRoTXV0YXRpb25zKChmdW5jdGlvbih0KXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rPTIpe2lmKG4rMT49ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHZhbHVlIGZvciBrZXk6ICIrZVtuXSk7dC5zZXQoZVtuXSxlW24rMV0pfX0pKX0sR3QucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX190b1N0cmluZygiTWFwIHsiLCJ9Iil9LEd0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fcm9vdD90aGlzLl9yb290LmdldCgwLHZvaWQgMCx0LGUpOmV9LEd0LnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gb2UodGhpcyx0LGUpfSxHdC5wcm90b3R5cGUuc2V0SW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy51cGRhdGVJbih0LE0sKGZ1bmN0aW9uKCl7cmV0dXJuIGV9KSl9LEd0LnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCl7cmV0dXJuIG9lKHRoaXMsdCxNKX0sR3QucHJvdG90eXBlLmRlbGV0ZUluPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnVwZGF0ZUluKHQsKGZ1bmN0aW9uKCl7cmV0dXJuIE19KSl9LEd0LnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90KHRoaXMpOnRoaXMudXBkYXRlSW4oW3RdLGUsbil9LEd0LnByb3RvdHlwZS51cGRhdGVJbj1mdW5jdGlvbih0LGUsbil7bnx8KG49ZSxlPXZvaWQgMCk7dmFyIHI9dmUodGhpcyxMbih0KSxlLG4pO3JldHVybiByPT09TT92b2lkIDA6cn0sR3QucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLnNpemU/dGhpczp0aGlzLl9fb3duZXJJRD8odGhpcy5zaXplPTAsdGhpcy5fcm9vdD1udWxsLHRoaXMuX19oYXNoPXZvaWQgMCx0aGlzLl9fYWx0ZXJlZD0hMCx0aGlzKTppZSgpfSxHdC5wcm90b3R5cGUubWVyZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gcGUodGhpcyx2b2lkIDAsYXJndW1lbnRzKX0sR3QucHJvdG90eXBlLm1lcmdlV2l0aD1mdW5jdGlvbihlKXtyZXR1cm4gcGUodGhpcyxlLHQuY2FsbChhcmd1bWVudHMsMSkpfSxHdC5wcm90b3R5cGUubWVyZ2VJbj1mdW5jdGlvbihlKXt2YXIgbj10LmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiB0aGlzLnVwZGF0ZUluKGUsaWUoKSwoZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQubWVyZ2U/dC5tZXJnZS5hcHBseSh0LG4pOm5bbi5sZW5ndGgtMV19KSl9LEd0LnByb3RvdHlwZS5tZXJnZURlZXA9ZnVuY3Rpb24oKXtyZXR1cm4gcGUodGhpcyxoZSxhcmd1bWVudHMpfSxHdC5wcm90b3R5cGUubWVyZ2VEZWVwV2l0aD1mdW5jdGlvbihlKXt2YXIgbj10LmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBwZSh0aGlzLGRlKGUpLG4pfSxHdC5wcm90b3R5cGUubWVyZ2VEZWVwSW49ZnVuY3Rpb24oZSl7dmFyIG49dC5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gdGhpcy51cGRhdGVJbihlLGllKCksKGZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0Lm1lcmdlRGVlcD90Lm1lcmdlRGVlcC5hcHBseSh0LG4pOm5bbi5sZW5ndGgtMV19KSl9LEd0LnByb3RvdHlwZS5zb3J0PWZ1bmN0aW9uKHQpe3JldHVybiBGZShsbih0aGlzLHQpKX0sR3QucHJvdG90eXBlLnNvcnRCeT1mdW5jdGlvbih0LGUpe3JldHVybiBGZShsbih0aGlzLGUsdCkpfSxHdC5wcm90b3R5cGUud2l0aE11dGF0aW9ucz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmFzTXV0YWJsZSgpO3JldHVybiB0KGUpLGUud2FzQWx0ZXJlZCgpP2UuX19lbnN1cmVPd25lcih0aGlzLl9fb3duZXJJRCk6dGhpc30sR3QucHJvdG90eXBlLmFzTXV0YWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fb3duZXJJRD90aGlzOnRoaXMuX19lbnN1cmVPd25lcihuZXcgeCl9LEd0LnByb3RvdHlwZS5hc0ltbXV0YWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fZW5zdXJlT3duZXIoKX0sR3QucHJvdG90eXBlLndhc0FsdGVyZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2FsdGVyZWR9LEd0LnByb3RvdHlwZS5fX2l0ZXJhdG9yPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyB0ZSh0aGlzLHQsZSl9LEd0LnByb3RvdHlwZS5fX2l0ZXJhdGU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9MDtyZXR1cm4gdGhpcy5fcm9vdCYmdGhpcy5fcm9vdC5pdGVyYXRlKChmdW5jdGlvbihlKXtyZXR1cm4gcisrLHQoZVsxXSxlWzBdLG4pfSksZSkscn0sR3QucHJvdG90eXBlLl9fZW5zdXJlT3duZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT10aGlzLl9fb3duZXJJRD90aGlzOnQ/cmUodGhpcy5zaXplLHRoaXMuX3Jvb3QsdCx0aGlzLl9faGFzaCk6KHRoaXMuX19vd25lcklEPXQsdGhpcy5fX2FsdGVyZWQ9ITEsdGhpcyl9LEd0LmlzTWFwPVd0O3ZhciBxdCxKdD0iQEBfX0lNTVVUQUJMRV9NQVBfX0BAIixadD1HdC5wcm90b3R5cGU7ZnVuY3Rpb24gVnQodCxlKXt0aGlzLm93bmVySUQ9dCx0aGlzLmVudHJpZXM9ZX1mdW5jdGlvbiBYdCh0LGUsbil7dGhpcy5vd25lcklEPXQsdGhpcy5iaXRtYXA9ZSx0aGlzLm5vZGVzPW59ZnVuY3Rpb24gSHQodCxlLG4pe3RoaXMub3duZXJJRD10LHRoaXMuY291bnQ9ZSx0aGlzLm5vZGVzPW59ZnVuY3Rpb24gS3QodCxlLG4pe3RoaXMub3duZXJJRD10LHRoaXMua2V5SGFzaD1lLHRoaXMuZW50cmllcz1ufWZ1bmN0aW9uICR0KHQsZSxuKXt0aGlzLm93bmVySUQ9dCx0aGlzLmtleUhhc2g9ZSx0aGlzLmVudHJ5PW59ZnVuY3Rpb24gdGUodCxlLG4pe3RoaXMuX3R5cGU9ZSx0aGlzLl9yZXZlcnNlPW4sdGhpcy5fc3RhY2s9dC5fcm9vdCYmbmUodC5fcm9vdCl9ZnVuY3Rpb24gZWUodCxlKXtyZXR1cm4gUih0LGVbMF0sZVsxXSl9ZnVuY3Rpb24gbmUodCxlKXtyZXR1cm57bm9kZTp0LGluZGV4OjAsX19wcmV2OmV9fWZ1bmN0aW9uIHJlKHQsZSxuLHIpe3ZhciBpPU9iamVjdC5jcmVhdGUoWnQpO3JldHVybiBpLnNpemU9dCxpLl9yb290PWUsaS5fX293bmVySUQ9bixpLl9faGFzaD1yLGkuX19hbHRlcmVkPSExLGl9ZnVuY3Rpb24gaWUoKXtyZXR1cm4gcXR8fChxdD1yZSgwKSl9ZnVuY3Rpb24gb2UodCxlLG4pe3ZhciByLGk7aWYodC5fcm9vdCl7dmFyIG89TChtKSx1PUwoXyk7aWYocj11ZSh0Ll9yb290LHQuX19vd25lcklELDAsdm9pZCAwLGUsbixvLHUpLCF1LnZhbHVlKXJldHVybiB0O2k9dC5zaXplKyhvLnZhbHVlP249PT1NPy0xOjE6MCl9ZWxzZXtpZihuPT09TSlyZXR1cm4gdDtpPTEscj1uZXcgVnQodC5fX293bmVySUQsW1tlLG5dXSl9cmV0dXJuIHQuX19vd25lcklEPyh0LnNpemU9aSx0Ll9yb290PXIsdC5fX2hhc2g9dm9pZCAwLHQuX19hbHRlcmVkPSEwLHQpOnI/cmUoaSxyKTppZSgpfWZ1bmN0aW9uIHVlKHQsZSxuLHIsaSxvLHUscyl7cmV0dXJuIHQ/dC51cGRhdGUoZSxuLHIsaSxvLHUscyk6bz09PU0/dDooYihzKSxiKHUpLG5ldyAkdChlLHIsW2ksb10pKX1mdW5jdGlvbiBzZSh0KXtyZXR1cm4gdC5jb25zdHJ1Y3Rvcj09PSR0fHx0LmNvbnN0cnVjdG9yPT09S3R9ZnVuY3Rpb24gYWUodCxlLG4scixpKXtpZih0LmtleUhhc2g9PT1yKXJldHVybiBuZXcgS3QoZSxyLFt0LmVudHJ5LGldKTt2YXIgbyx1PSgwPT09bj90LmtleUhhc2g6dC5rZXlIYXNoPj4+bikmdyxzPSgwPT09bj9yOnI+Pj5uKSZ3O3JldHVybiBuZXcgWHQoZSwxPDx1fDE8PHMsdT09PXM/W2FlKHQsZSxuK3YscixpKV06KG89bmV3ICR0KGUscixpKSx1PHM/W3Qsb106W28sdF0pKX1mdW5jdGlvbiBjZSh0LGUsbixyKXt0fHwodD1uZXcgeCk7Zm9yKHZhciBpPW5ldyAkdCh0LER0KG4pLFtuLHJdKSxvPTA7bzxlLmxlbmd0aDtvKyspe3ZhciB1PWVbb107aT1pLnVwZGF0ZSh0LDAsdm9pZCAwLHVbMF0sdVsxXSl9cmV0dXJuIGl9ZnVuY3Rpb24gZmUodCxlLG4scil7Zm9yKHZhciBpPTAsbz0wLHU9bmV3IEFycmF5KG4pLHM9MCxhPTEsYz1lLmxlbmd0aDtzPGM7cysrLGE8PD0xKXt2YXIgZj1lW3NdO3ZvaWQgMCE9PWYmJnMhPT1yJiYoaXw9YSx1W28rK109Zil9cmV0dXJuIG5ldyBYdCh0LGksdSl9ZnVuY3Rpb24gbGUodCxlLG4scixpKXtmb3IodmFyIG89MCx1PW5ldyBBcnJheShnKSxzPTA7MCE9PW47cysrLG4+Pj49MSl1W3NdPTEmbj9lW28rK106dm9pZCAwO3JldHVybiB1W3JdPWksbmV3IEh0KHQsbysxLHUpfWZ1bmN0aW9uIHBlKHQsZSxuKXtmb3IodmFyIGk9W10sbz0wO288bi5sZW5ndGg7bysrKXt2YXIgcz1uW29dLGE9cihzKTt1KHMpfHwoYT1hLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGh0KHQpfSkpKSxpLnB1c2goYSl9cmV0dXJuIHllKHQsZSxpKX1mdW5jdGlvbiBoZSh0LGUsbil7cmV0dXJuIHQmJnQubWVyZ2VEZWVwJiZ1KGUpP3QubWVyZ2VEZWVwKGUpOmd0KHQsZSk/dDplfWZ1bmN0aW9uIGRlKHQpe3JldHVybiBmdW5jdGlvbihlLG4scil7aWYoZSYmZS5tZXJnZURlZXBXaXRoJiZ1KG4pKXJldHVybiBlLm1lcmdlRGVlcFdpdGgodCxuKTt2YXIgaT10KGUsbixyKTtyZXR1cm4gZ3QoZSxpKT9lOml9fWZ1bmN0aW9uIHllKHQsZSxuKXtyZXR1cm4gMD09PShuPW4uZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gMCE9PXQuc2l6ZX0pKSkubGVuZ3RoP3Q6MCE9PXQuc2l6ZXx8dC5fX293bmVySUR8fDEhPT1uLmxlbmd0aD90LndpdGhNdXRhdGlvbnMoKGZ1bmN0aW9uKHQpe2Zvcih2YXIgcj1lP2Z1bmN0aW9uKG4scil7dC51cGRhdGUocixNLChmdW5jdGlvbih0KXtyZXR1cm4gdD09PU0/bjplKHQsbixyKX0pKX06ZnVuY3Rpb24oZSxuKXt0LnNldChuLGUpfSxpPTA7aTxuLmxlbmd0aDtpKyspbltpXS5mb3JFYWNoKHIpfSkpOnQuY29uc3RydWN0b3IoblswXSl9ZnVuY3Rpb24gdmUodCxlLG4scil7dmFyIGk9dD09PU0sbz1lLm5leHQoKTtpZihvLmRvbmUpe3ZhciB1PWk/bjp0LHM9cih1KTtyZXR1cm4gcz09PXU/dDpzfW10KGl8fHQmJnQuc2V0LCJpbnZhbGlkIGtleVBhdGgiKTt2YXIgYT1vLnZhbHVlLGM9aT9NOnQuZ2V0KGEsTSksZj12ZShjLGUsbixyKTtyZXR1cm4gZj09PWM/dDpmPT09TT90LnJlbW92ZShhKTooaT9pZSgpOnQpLnNldChhLGYpfWZ1bmN0aW9uIGdlKHQpe3JldHVybiB0PSh0PSg4NTg5OTM0NTkmKHQtPXQ+PjEmMTQzMTY1NTc2NSkpKyh0Pj4yJjg1ODk5MzQ1OSkpKyh0Pj40KSYyNTI2NDUxMzUsdCs9dD4+OCwxMjcmKHQrPXQ+PjE2KX1mdW5jdGlvbiB3ZSh0LGUsbixyKXt2YXIgaT1yP3Q6aih0KTtyZXR1cm4gaVtlXT1uLGl9ZnVuY3Rpb24gTWUodCxlLG4scil7dmFyIGk9dC5sZW5ndGgrMTtpZihyJiZlKzE9PT1pKXJldHVybiB0W2VdPW4sdDtmb3IodmFyIG89bmV3IEFycmF5KGkpLHU9MCxzPTA7czxpO3MrKylzPT09ZT8ob1tzXT1uLHU9LTEpOm9bc109dFtzK3VdO3JldHVybiBvfWZ1bmN0aW9uIG1lKHQsZSxuKXt2YXIgcj10Lmxlbmd0aC0xO2lmKG4mJmU9PT1yKXJldHVybiB0LnBvcCgpLHQ7Zm9yKHZhciBpPW5ldyBBcnJheShyKSxvPTAsdT0wO3U8cjt1KyspdT09PWUmJihvPTEpLGlbdV09dFt1K29dO3JldHVybiBpfVp0W0p0XT0hMCxadFt5XT1adC5yZW1vdmUsWnQucmVtb3ZlSW49WnQuZGVsZXRlSW4sVnQucHJvdG90eXBlLmdldD1mdW5jdGlvbih0LGUsbixyKXtmb3IodmFyIGk9dGhpcy5lbnRyaWVzLG89MCx1PWkubGVuZ3RoO288dTtvKyspaWYoZ3QobixpW29dWzBdKSlyZXR1cm4gaVtvXVsxXTtyZXR1cm4gcn0sVnQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0LGUsbixyLGksbyx1KXtmb3IodmFyIHM9aT09PU0sYT10aGlzLmVudHJpZXMsYz0wLGY9YS5sZW5ndGg7YzxmJiYhZ3QocixhW2NdWzBdKTtjKyspO3ZhciBsPWM8ZjtpZihsP2FbY11bMV09PT1pOnMpcmV0dXJuIHRoaXM7aWYoYih1KSwoc3x8IWwpJiZiKG8pLCFzfHwxIT09YS5sZW5ndGgpe2lmKCFsJiYhcyYmYS5sZW5ndGg+PV9lKXJldHVybiBjZSh0LGEscixpKTt2YXIgcD10JiZ0PT09dGhpcy5vd25lcklELGg9cD9hOmooYSk7cmV0dXJuIGw/cz9jPT09Zi0xP2gucG9wKCk6aFtjXT1oLnBvcCgpOmhbY109W3IsaV06aC5wdXNoKFtyLGldKSxwPyh0aGlzLmVudHJpZXM9aCx0aGlzKTpuZXcgVnQodCxoKX19LFh0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCxlLG4scil7dm9pZCAwPT09ZSYmKGU9RHQobikpO3ZhciBpPTE8PCgoMD09PXQ/ZTplPj4+dCkmdyksbz10aGlzLmJpdG1hcDtyZXR1cm4gMD09KG8maSk/cjp0aGlzLm5vZGVzW2dlKG8maS0xKV0uZ2V0KHQrdixlLG4scil9LFh0LnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCxlLG4scixpLG8sdSl7dm9pZCAwPT09biYmKG49RHQocikpO3ZhciBzPSgwPT09ZT9uOm4+Pj5lKSZ3LGE9MTw8cyxjPXRoaXMuYml0bWFwLGY9MCE9KGMmYSk7aWYoIWYmJmk9PT1NKXJldHVybiB0aGlzO3ZhciBsPWdlKGMmYS0xKSxwPXRoaXMubm9kZXMsaD1mP3BbbF06dm9pZCAwLGQ9dWUoaCx0LGUrdixuLHIsaSxvLHUpO2lmKGQ9PT1oKXJldHVybiB0aGlzO2lmKCFmJiZkJiZwLmxlbmd0aD49TGUpcmV0dXJuIGxlKHQscCxjLHMsZCk7aWYoZiYmIWQmJjI9PT1wLmxlbmd0aCYmc2UocFsxXmxdKSlyZXR1cm4gcFsxXmxdO2lmKGYmJmQmJjE9PT1wLmxlbmd0aCYmc2UoZCkpcmV0dXJuIGQ7dmFyIHk9dCYmdD09PXRoaXMub3duZXJJRCxnPWY/ZD9jOmNeYTpjfGEsbT1mP2Q/d2UocCxsLGQseSk6bWUocCxsLHkpOk1lKHAsbCxkLHkpO3JldHVybiB5Pyh0aGlzLmJpdG1hcD1nLHRoaXMubm9kZXM9bSx0aGlzKTpuZXcgWHQodCxnLG0pfSxIdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQsZSxuLHIpe3ZvaWQgMD09PWUmJihlPUR0KG4pKTt2YXIgaT0oMD09PXQ/ZTplPj4+dCkmdyxvPXRoaXMubm9kZXNbaV07cmV0dXJuIG8/by5nZXQodCt2LGUsbixyKTpyfSxIdC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQsZSxuLHIsaSxvLHUpe3ZvaWQgMD09PW4mJihuPUR0KHIpKTt2YXIgcz0oMD09PWU/bjpuPj4+ZSkmdyxhPWk9PT1NLGM9dGhpcy5ub2RlcyxmPWNbc107aWYoYSYmIWYpcmV0dXJuIHRoaXM7dmFyIGw9dWUoZix0LGUrdixuLHIsaSxvLHUpO2lmKGw9PT1mKXJldHVybiB0aGlzO3ZhciBwPXRoaXMuY291bnQ7aWYoZil7aWYoIWwmJi0tcDxiZSlyZXR1cm4gZmUodCxjLHAscyl9ZWxzZSBwKys7dmFyIGg9dCYmdD09PXRoaXMub3duZXJJRCxkPXdlKGMscyxsLGgpO3JldHVybiBoPyh0aGlzLmNvdW50PXAsdGhpcy5ub2Rlcz1kLHRoaXMpOm5ldyBIdCh0LHAsZCl9LEt0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCxlLG4scil7Zm9yKHZhciBpPXRoaXMuZW50cmllcyxvPTAsdT1pLmxlbmd0aDtvPHU7bysrKWlmKGd0KG4saVtvXVswXSkpcmV0dXJuIGlbb11bMV07cmV0dXJuIHJ9LEt0LnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24odCxlLG4scixpLG8sdSl7dm9pZCAwPT09biYmKG49RHQocikpO3ZhciBzPWk9PT1NO2lmKG4hPT10aGlzLmtleUhhc2gpcmV0dXJuIHM/dGhpczooYih1KSxiKG8pLGFlKHRoaXMsdCxlLG4sW3IsaV0pKTtmb3IodmFyIGE9dGhpcy5lbnRyaWVzLGM9MCxmPWEubGVuZ3RoO2M8ZiYmIWd0KHIsYVtjXVswXSk7YysrKTt2YXIgbD1jPGY7aWYobD9hW2NdWzFdPT09aTpzKXJldHVybiB0aGlzO2lmKGIodSksKHN8fCFsKSYmYihvKSxzJiYyPT09ZilyZXR1cm4gbmV3ICR0KHQsdGhpcy5rZXlIYXNoLGFbMV5jXSk7dmFyIHA9dCYmdD09PXRoaXMub3duZXJJRCxoPXA/YTpqKGEpO3JldHVybiBsP3M/Yz09PWYtMT9oLnBvcCgpOmhbY109aC5wb3AoKTpoW2NdPVtyLGldOmgucHVzaChbcixpXSkscD8odGhpcy5lbnRyaWVzPWgsdGhpcyk6bmV3IEt0KHQsdGhpcy5rZXlIYXNoLGgpfSwkdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQsZSxuLHIpe3JldHVybiBndChuLHRoaXMuZW50cnlbMF0pP3RoaXMuZW50cnlbMV06cn0sJHQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0LGUsbixyLGksbyx1KXt2YXIgcz1pPT09TSxhPWd0KHIsdGhpcy5lbnRyeVswXSk7cmV0dXJuKGE/aT09PXRoaXMuZW50cnlbMV06cyk/dGhpczooYih1KSxzP3ZvaWQgYihvKTphP3QmJnQ9PT10aGlzLm93bmVySUQ/KHRoaXMuZW50cnlbMV09aSx0aGlzKTpuZXcgJHQodCx0aGlzLmtleUhhc2gsW3IsaV0pOihiKG8pLGFlKHRoaXMsdCxlLER0KHIpLFtyLGldKSkpfSxWdC5wcm90b3R5cGUuaXRlcmF0ZT1LdC5wcm90b3R5cGUuaXRlcmF0ZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLmVudHJpZXMscj0wLGk9bi5sZW5ndGgtMTtyPD1pO3IrKylpZighMT09PXQobltlP2ktcjpyXSkpcmV0dXJuITF9LFh0LnByb3RvdHlwZS5pdGVyYXRlPUh0LnByb3RvdHlwZS5pdGVyYXRlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXRoaXMubm9kZXMscj0wLGk9bi5sZW5ndGgtMTtyPD1pO3IrKyl7dmFyIG89bltlP2ktcjpyXTtpZihvJiYhMT09PW8uaXRlcmF0ZSh0LGUpKXJldHVybiExfX0sJHQucHJvdG90eXBlLml0ZXJhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCh0aGlzLmVudHJ5KX0sZSh0ZSxQKSx0ZS5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl90eXBlLGU9dGhpcy5fc3RhY2s7ZTspe3ZhciBuLHI9ZS5ub2RlLGk9ZS5pbmRleCsrO2lmKHIuZW50cnkpe2lmKDA9PT1pKXJldHVybiBlZSh0LHIuZW50cnkpfWVsc2UgaWYoci5lbnRyaWVzKXtpZihpPD0obj1yLmVudHJpZXMubGVuZ3RoLTEpKXJldHVybiBlZSh0LHIuZW50cmllc1t0aGlzLl9yZXZlcnNlP24taTppXSl9ZWxzZSBpZihpPD0obj1yLm5vZGVzLmxlbmd0aC0xKSl7dmFyIG89ci5ub2Rlc1t0aGlzLl9yZXZlcnNlP24taTppXTtpZihvKXtpZihvLmVudHJ5KXJldHVybiBlZSh0LG8uZW50cnkpO2U9dGhpcy5fc3RhY2s9bmUobyxlKX1jb250aW51ZX1lPXRoaXMuX3N0YWNrPXRoaXMuX3N0YWNrLl9fcHJldn1yZXR1cm4gUSgpfTt2YXIgX2U9Zy80LExlPWcvMixiZT1nLzQ7ZnVuY3Rpb24geGUodCl7dmFyIGU9RWUoKTtpZihudWxsPT10KXJldHVybiBlO2lmKGplKHQpKXJldHVybiB0O3ZhciBuPWkodCkscj1uLnNpemU7cmV0dXJuIDA9PT1yP2U6KEJ0KHIpLHI+MCYmcjxnP0NlKDAscix2LG51bGwsbmV3IERlKG4udG9BcnJheSgpKSk6ZS53aXRoTXV0YXRpb25zKChmdW5jdGlvbih0KXt0LnNldFNpemUociksbi5mb3JFYWNoKChmdW5jdGlvbihlLG4pe3JldHVybiB0LnNldChuLGUpfSkpfSkpKX1mdW5jdGlvbiBqZSh0KXtyZXR1cm4hKCF0fHwhdFtOZV0pfWUoeGUseHQpLHhlLm9mPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMoYXJndW1lbnRzKX0seGUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX190b1N0cmluZygiTGlzdCBbIiwiXSIpfSx4ZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQsZSl7aWYoKHQ9Uyh0aGlzLHQpKT49MCYmdDx0aGlzLnNpemUpe3ZhciBuPVVlKHRoaXMsdCs9dGhpcy5fb3JpZ2luKTtyZXR1cm4gbiYmbi5hcnJheVt0JnddfXJldHVybiBlfSx4ZS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHplKHRoaXMsdCxlKX0seGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5oYXModCk/MD09PXQ/dGhpcy5zaGlmdCgpOnQ9PT10aGlzLnNpemUtMT90aGlzLnBvcCgpOnRoaXMuc3BsaWNlKHQsMSk6dGhpc30seGUucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnNwbGljZSh0LDAsZSl9LHhlLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5zaXplP3RoaXM6dGhpcy5fX293bmVySUQ/KHRoaXMuc2l6ZT10aGlzLl9vcmlnaW49dGhpcy5fY2FwYWNpdHk9MCx0aGlzLl9sZXZlbD12LHRoaXMuX3Jvb3Q9dGhpcy5fdGFpbD1udWxsLHRoaXMuX19oYXNoPXZvaWQgMCx0aGlzLl9fYWx0ZXJlZD0hMCx0aGlzKTpFZSgpfSx4ZS5wcm90b3R5cGUucHVzaD1mdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cyxlPXRoaXMuc2l6ZTtyZXR1cm4gdGhpcy53aXRoTXV0YXRpb25zKChmdW5jdGlvbihuKXtQZShuLDAsZSt0Lmxlbmd0aCk7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspbi5zZXQoZStyLHRbcl0pfSkpfSx4ZS5wcm90b3R5cGUucG9wPWZ1bmN0aW9uKCl7cmV0dXJuIFBlKHRoaXMsMCwtMSl9LHhlLnByb3RvdHlwZS51bnNoaWZ0PWZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzO3JldHVybiB0aGlzLndpdGhNdXRhdGlvbnMoKGZ1bmN0aW9uKGUpe1BlKGUsLXQubGVuZ3RoKTtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyllLnNldChuLHRbbl0pfSkpfSx4ZS5wcm90b3R5cGUuc2hpZnQ9ZnVuY3Rpb24oKXtyZXR1cm4gUGUodGhpcywxKX0seGUucHJvdG90eXBlLm1lcmdlPWZ1bmN0aW9uKCl7cmV0dXJuIFJlKHRoaXMsdm9pZCAwLGFyZ3VtZW50cyl9LHhlLnByb3RvdHlwZS5tZXJnZVdpdGg9ZnVuY3Rpb24oZSl7cmV0dXJuIFJlKHRoaXMsZSx0LmNhbGwoYXJndW1lbnRzLDEpKX0seGUucHJvdG90eXBlLm1lcmdlRGVlcD1mdW5jdGlvbigpe3JldHVybiBSZSh0aGlzLGhlLGFyZ3VtZW50cyl9LHhlLnByb3RvdHlwZS5tZXJnZURlZXBXaXRoPWZ1bmN0aW9uKGUpe3ZhciBuPXQuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIFJlKHRoaXMsZGUoZSksbil9LHhlLnByb3RvdHlwZS5zZXRTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBQZSh0aGlzLDAsdCl9LHhlLnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuc2l6ZTtyZXR1cm4gSSh0LGUsbik/dGhpczpQZSh0aGlzLEEodCxuKSxPKGUsbikpfSx4ZS5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbih0LGUpe3ZhciBuPTAscj1UZSh0aGlzLGUpO3JldHVybiBuZXcgUCgoZnVuY3Rpb24oKXt2YXIgZT1yKCk7cmV0dXJuIGU9PT1PZT9RKCk6Uih0LG4rKyxlKX0pKX0seGUucHJvdG90eXBlLl9faXRlcmF0ZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbixyPTAsaT1UZSh0aGlzLGUpOyhuPWkoKSkhPT1PZSYmITEhPT10KG4scisrLHRoaXMpOyk7cmV0dXJuIHJ9LHhlLnByb3RvdHlwZS5fX2Vuc3VyZU93bmVyPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09dGhpcy5fX293bmVySUQ/dGhpczp0P0NlKHRoaXMuX29yaWdpbix0aGlzLl9jYXBhY2l0eSx0aGlzLl9sZXZlbCx0aGlzLl9yb290LHRoaXMuX3RhaWwsdCx0aGlzLl9faGFzaCk6KHRoaXMuX19vd25lcklEPXQsdGhpcyl9LHhlLmlzTGlzdD1qZTt2YXIgTmU9IkBAX19JTU1VVEFCTEVfTElTVF9fQEAiLFNlPXhlLnByb3RvdHlwZTtmdW5jdGlvbiBEZSh0LGUpe3RoaXMuYXJyYXk9dCx0aGlzLm93bmVySUQ9ZX1TZVtOZV09ITAsU2VbeV09U2UucmVtb3ZlLFNlLnNldEluPVp0LnNldEluLFNlLmRlbGV0ZUluPVNlLnJlbW92ZUluPVp0LnJlbW92ZUluLFNlLnVwZGF0ZT1adC51cGRhdGUsU2UudXBkYXRlSW49WnQudXBkYXRlSW4sU2UubWVyZ2VJbj1adC5tZXJnZUluLFNlLm1lcmdlRGVlcEluPVp0Lm1lcmdlRGVlcEluLFNlLndpdGhNdXRhdGlvbnM9WnQud2l0aE11dGF0aW9ucyxTZS5hc011dGFibGU9WnQuYXNNdXRhYmxlLFNlLmFzSW1tdXRhYmxlPVp0LmFzSW1tdXRhYmxlLFNlLndhc0FsdGVyZWQ9WnQud2FzQWx0ZXJlZCxEZS5wcm90b3R5cGUucmVtb3ZlQmVmb3JlPWZ1bmN0aW9uKHQsZSxuKXtpZihuPT09ZT8xPDxlOjA9PT10aGlzLmFycmF5Lmxlbmd0aClyZXR1cm4gdGhpczt2YXIgcj1uPj4+ZSZ3O2lmKHI+PXRoaXMuYXJyYXkubGVuZ3RoKXJldHVybiBuZXcgRGUoW10sdCk7dmFyIGksbz0wPT09cjtpZihlPjApe3ZhciB1PXRoaXMuYXJyYXlbcl07aWYoKGk9dSYmdS5yZW1vdmVCZWZvcmUodCxlLXYsbikpPT09dSYmbylyZXR1cm4gdGhpc31pZihvJiYhaSlyZXR1cm4gdGhpczt2YXIgcz1ZZSh0aGlzLHQpO2lmKCFvKWZvcih2YXIgYT0wO2E8cjthKyspcy5hcnJheVthXT12b2lkIDA7cmV0dXJuIGkmJihzLmFycmF5W3JdPWkpLHN9LERlLnByb3RvdHlwZS5yZW1vdmVBZnRlcj1mdW5jdGlvbih0LGUsbil7aWYobj09PShlPzE8PGU6MCl8fDA9PT10aGlzLmFycmF5Lmxlbmd0aClyZXR1cm4gdGhpczt2YXIgcixpPW4tMT4+PmUmdztpZihpPj10aGlzLmFycmF5Lmxlbmd0aClyZXR1cm4gdGhpcztpZihlPjApe3ZhciBvPXRoaXMuYXJyYXlbaV07aWYoKHI9byYmby5yZW1vdmVBZnRlcih0LGUtdixuKSk9PT1vJiZpPT09dGhpcy5hcnJheS5sZW5ndGgtMSlyZXR1cm4gdGhpc312YXIgdT1ZZSh0aGlzLHQpO3JldHVybiB1LmFycmF5LnNwbGljZShpKzEpLHImJih1LmFycmF5W2ldPXIpLHV9O3ZhciBJZSxBZSxPZT17fTtmdW5jdGlvbiBUZSh0LGUpe3ZhciBuPXQuX29yaWdpbixyPXQuX2NhcGFjaXR5LGk9UWUociksbz10Ll90YWlsO3JldHVybiB1KHQuX3Jvb3QsdC5fbGV2ZWwsMCk7ZnVuY3Rpb24gdSh0LGUsbil7cmV0dXJuIDA9PT1lP3ModCxuKTphKHQsZSxuKX1mdW5jdGlvbiBzKHQsdSl7dmFyIHM9dT09PWk/byYmby5hcnJheTp0JiZ0LmFycmF5LGE9dT5uPzA6bi11LGM9ci11O3JldHVybiBjPmcmJihjPWcpLGZ1bmN0aW9uKCl7aWYoYT09PWMpcmV0dXJuIE9lO3ZhciB0PWU/LS1jOmErKztyZXR1cm4gcyYmc1t0XX19ZnVuY3Rpb24gYSh0LGksbyl7dmFyIHMsYT10JiZ0LmFycmF5LGM9bz5uPzA6bi1vPj5pLGY9MSsoci1vPj5pKTtyZXR1cm4gZj5nJiYoZj1nKSxmdW5jdGlvbigpe2Zvcig7Oyl7aWYocyl7dmFyIHQ9cygpO2lmKHQhPT1PZSlyZXR1cm4gdDtzPW51bGx9aWYoYz09PWYpcmV0dXJuIE9lO3ZhciBuPWU/LS1mOmMrKztzPXUoYSYmYVtuXSxpLXYsbysobjw8aSkpfX19fWZ1bmN0aW9uIENlKHQsZSxuLHIsaSxvLHUpe3ZhciBzPU9iamVjdC5jcmVhdGUoU2UpO3JldHVybiBzLnNpemU9ZS10LHMuX29yaWdpbj10LHMuX2NhcGFjaXR5PWUscy5fbGV2ZWw9bixzLl9yb290PXIscy5fdGFpbD1pLHMuX19vd25lcklEPW8scy5fX2hhc2g9dSxzLl9fYWx0ZXJlZD0hMSxzfWZ1bmN0aW9uIEVlKCl7cmV0dXJuIEllfHwoSWU9Q2UoMCwwLHYpKX1mdW5jdGlvbiB6ZSh0LGUsbil7aWYoKGU9Uyh0LGUpKSE9ZSlyZXR1cm4gdDtpZihlPj10LnNpemV8fGU8MClyZXR1cm4gdC53aXRoTXV0YXRpb25zKChmdW5jdGlvbih0KXtlPDA/UGUodCxlKS5zZXQoMCxuKTpQZSh0LDAsZSsxKS5zZXQoZSxuKX0pKTtlKz10Ll9vcmlnaW47dmFyIHI9dC5fdGFpbCxpPXQuX3Jvb3Qsbz1MKF8pO3JldHVybiBlPj1RZSh0Ll9jYXBhY2l0eSk/cj1rZShyLHQuX19vd25lcklELDAsZSxuLG8pOmk9a2UoaSx0Ll9fb3duZXJJRCx0Ll9sZXZlbCxlLG4sbyksby52YWx1ZT90Ll9fb3duZXJJRD8odC5fcm9vdD1pLHQuX3RhaWw9cix0Ll9faGFzaD12b2lkIDAsdC5fX2FsdGVyZWQ9ITAsdCk6Q2UodC5fb3JpZ2luLHQuX2NhcGFjaXR5LHQuX2xldmVsLGkscik6dH1mdW5jdGlvbiBrZSh0LGUsbixyLGksbyl7dmFyIHUscz1yPj4+biZ3LGE9dCYmczx0LmFycmF5Lmxlbmd0aDtpZighYSYmdm9pZCAwPT09aSlyZXR1cm4gdDtpZihuPjApe3ZhciBjPXQmJnQuYXJyYXlbc10sZj1rZShjLGUsbi12LHIsaSxvKTtyZXR1cm4gZj09PWM/dDooKHU9WWUodCxlKSkuYXJyYXlbc109Zix1KX1yZXR1cm4gYSYmdC5hcnJheVtzXT09PWk/dDooYihvKSx1PVllKHQsZSksdm9pZCAwPT09aSYmcz09PXUuYXJyYXkubGVuZ3RoLTE/dS5hcnJheS5wb3AoKTp1LmFycmF5W3NdPWksdSl9ZnVuY3Rpb24gWWUodCxlKXtyZXR1cm4gZSYmdCYmZT09PXQub3duZXJJRD90Om5ldyBEZSh0P3QuYXJyYXkuc2xpY2UoKTpbXSxlKX1mdW5jdGlvbiBVZSh0LGUpe2lmKGU+PVFlKHQuX2NhcGFjaXR5KSlyZXR1cm4gdC5fdGFpbDtpZihlPDE8PHQuX2xldmVsK3Ype2Zvcih2YXIgbj10Ll9yb290LHI9dC5fbGV2ZWw7biYmcj4wOyluPW4uYXJyYXlbZT4+PnImd10sci09djtyZXR1cm4gbn19ZnVuY3Rpb24gUGUodCxlLG4pe3ZvaWQgMCE9PWUmJihlfD0wKSx2b2lkIDAhPT1uJiYobnw9MCk7dmFyIHI9dC5fX293bmVySUR8fG5ldyB4LGk9dC5fb3JpZ2luLG89dC5fY2FwYWNpdHksdT1pK2Uscz12b2lkIDA9PT1uP286bjwwP28rbjppK247aWYodT09PWkmJnM9PT1vKXJldHVybiB0O2lmKHU+PXMpcmV0dXJuIHQuY2xlYXIoKTtmb3IodmFyIGE9dC5fbGV2ZWwsYz10Ll9yb290LGY9MDt1K2Y8MDspYz1uZXcgRGUoYyYmYy5hcnJheS5sZW5ndGg/W3ZvaWQgMCxjXTpbXSxyKSxmKz0xPDwoYSs9dik7ZiYmKHUrPWYsaSs9ZixzKz1mLG8rPWYpO2Zvcih2YXIgbD1RZShvKSxwPVFlKHMpO3A+PTE8PGErdjspYz1uZXcgRGUoYyYmYy5hcnJheS5sZW5ndGg/W2NdOltdLHIpLGErPXY7dmFyIGg9dC5fdGFpbCxkPXA8bD9VZSh0LHMtMSk6cD5sP25ldyBEZShbXSxyKTpoO2lmKGgmJnA+bCYmdTxvJiZoLmFycmF5Lmxlbmd0aCl7Zm9yKHZhciB5PWM9WWUoYyxyKSxnPWE7Zz52O2ctPXYpe3ZhciBNPWw+Pj5nJnc7eT15LmFycmF5W01dPVllKHkuYXJyYXlbTV0scil9eS5hcnJheVtsPj4+diZ3XT1ofWlmKHM8byYmKGQ9ZCYmZC5yZW1vdmVBZnRlcihyLDAscykpLHU+PXApdS09cCxzLT1wLGE9dixjPW51bGwsZD1kJiZkLnJlbW92ZUJlZm9yZShyLDAsdSk7ZWxzZSBpZih1Pml8fHA8bCl7Zm9yKGY9MDtjOyl7dmFyIG09dT4+PmEmdztpZihtIT09cD4+PmEmdylicmVhazttJiYoZis9KDE8PGEpKm0pLGEtPXYsYz1jLmFycmF5W21dfWMmJnU+aSYmKGM9Yy5yZW1vdmVCZWZvcmUocixhLHUtZikpLGMmJnA8bCYmKGM9Yy5yZW1vdmVBZnRlcihyLGEscC1mKSksZiYmKHUtPWYscy09Zil9cmV0dXJuIHQuX19vd25lcklEPyh0LnNpemU9cy11LHQuX29yaWdpbj11LHQuX2NhcGFjaXR5PXMsdC5fbGV2ZWw9YSx0Ll9yb290PWMsdC5fdGFpbD1kLHQuX19oYXNoPXZvaWQgMCx0Ll9fYWx0ZXJlZD0hMCx0KTpDZSh1LHMsYSxjLGQpfWZ1bmN0aW9uIFJlKHQsZSxuKXtmb3IodmFyIHI9W10sbz0wLHM9MDtzPG4ubGVuZ3RoO3MrKyl7dmFyIGE9bltzXSxjPWkoYSk7Yy5zaXplPm8mJihvPWMuc2l6ZSksdShhKXx8KGM9Yy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBodCh0KX0pKSksci5wdXNoKGMpfXJldHVybiBvPnQuc2l6ZSYmKHQ9dC5zZXRTaXplKG8pKSx5ZSh0LGUscil9ZnVuY3Rpb24gUWUodCl7cmV0dXJuIHQ8Zz8wOnQtMT4+PnY8PHZ9ZnVuY3Rpb24gRmUodCl7cmV0dXJuIG51bGw9PXQ/V2UoKTpCZSh0KT90OldlKCkud2l0aE11dGF0aW9ucygoZnVuY3Rpb24oZSl7dmFyIG49cih0KTtCdChuLnNpemUpLG4uZm9yRWFjaCgoZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5zZXQobix0KX0pKX0pKX1mdW5jdGlvbiBCZSh0KXtyZXR1cm4gV3QodCkmJmYodCl9ZnVuY3Rpb24gR2UodCxlLG4scil7dmFyIGk9T2JqZWN0LmNyZWF0ZShGZS5wcm90b3R5cGUpO3JldHVybiBpLnNpemU9dD90LnNpemU6MCxpLl9tYXA9dCxpLl9saXN0PWUsaS5fX293bmVySUQ9bixpLl9faGFzaD1yLGl9ZnVuY3Rpb24gV2UoKXtyZXR1cm4gQWV8fChBZT1HZShpZSgpLEVlKCkpKX1mdW5jdGlvbiBxZSh0LGUsbil7dmFyIHIsaSxvPXQuX21hcCx1PXQuX2xpc3Qscz1vLmdldChlKSxhPXZvaWQgMCE9PXM7aWYobj09PU0pe2lmKCFhKXJldHVybiB0O3Uuc2l6ZT49ZyYmdS5zaXplPj0yKm8uc2l6ZT8ocj0oaT11LmZpbHRlcigoZnVuY3Rpb24odCxlKXtyZXR1cm4gdm9pZCAwIT09dCYmcyE9PWV9KSkpLnRvS2V5ZWRTZXEoKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0WzBdfSkpLmZsaXAoKS50b01hcCgpLHQuX19vd25lcklEJiYoci5fX293bmVySUQ9aS5fX293bmVySUQ9dC5fX293bmVySUQpKToocj1vLnJlbW92ZShlKSxpPXM9PT11LnNpemUtMT91LnBvcCgpOnUuc2V0KHMsdm9pZCAwKSl9ZWxzZSBpZihhKXtpZihuPT09dS5nZXQocylbMV0pcmV0dXJuIHQ7cj1vLGk9dS5zZXQocyxbZSxuXSl9ZWxzZSByPW8uc2V0KGUsdS5zaXplKSxpPXUuc2V0KHUuc2l6ZSxbZSxuXSk7cmV0dXJuIHQuX19vd25lcklEPyh0LnNpemU9ci5zaXplLHQuX21hcD1yLHQuX2xpc3Q9aSx0Ll9faGFzaD12b2lkIDAsdCk6R2UocixpKX1mdW5jdGlvbiBKZSh0LGUpe3RoaXMuX2l0ZXI9dCx0aGlzLl91c2VLZXlzPWUsdGhpcy5zaXplPXQuc2l6ZX1mdW5jdGlvbiBaZSh0KXt0aGlzLl9pdGVyPXQsdGhpcy5zaXplPXQuc2l6ZX1mdW5jdGlvbiBWZSh0KXt0aGlzLl9pdGVyPXQsdGhpcy5zaXplPXQuc2l6ZX1mdW5jdGlvbiBYZSh0KXt0aGlzLl9pdGVyPXQsdGhpcy5zaXplPXQuc2l6ZX1mdW5jdGlvbiBIZSh0KXt2YXIgZT1Nbih0KTtyZXR1cm4gZS5faXRlcj10LGUuc2l6ZT10LnNpemUsZS5mbGlwPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGUucmV2ZXJzZT1mdW5jdGlvbigpe3ZhciBlPXQucmV2ZXJzZS5hcHBseSh0aGlzKTtyZXR1cm4gZS5mbGlwPWZ1bmN0aW9uKCl7cmV0dXJuIHQucmV2ZXJzZSgpfSxlfSxlLmhhcz1mdW5jdGlvbihlKXtyZXR1cm4gdC5pbmNsdWRlcyhlKX0sZS5pbmNsdWRlcz1mdW5jdGlvbihlKXtyZXR1cm4gdC5oYXMoZSl9LGUuY2FjaGVSZXN1bHQ9bW4sZS5fX2l0ZXJhdGVVbmNhY2hlZD1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXM7cmV0dXJuIHQuX19pdGVyYXRlKChmdW5jdGlvbih0LG4pe3JldHVybiExIT09ZShuLHQscil9KSxuKX0sZS5fX2l0ZXJhdG9yVW5jYWNoZWQ9ZnVuY3Rpb24oZSxuKXtpZihlPT09eil7dmFyIHI9dC5fX2l0ZXJhdG9yKGUsbik7cmV0dXJuIG5ldyBQKChmdW5jdGlvbigpe3ZhciB0PXIubmV4dCgpO2lmKCF0LmRvbmUpe3ZhciBlPXQudmFsdWVbMF07dC52YWx1ZVswXT10LnZhbHVlWzFdLHQudmFsdWVbMV09ZX1yZXR1cm4gdH0pKX1yZXR1cm4gdC5fX2l0ZXJhdG9yKGU9PT1FP0M6RSxuKX0sZX1mdW5jdGlvbiBLZSh0LGUsbil7dmFyIHI9TW4odCk7cmV0dXJuIHIuc2l6ZT10LnNpemUsci5oYXM9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuaGFzKGUpfSxyLmdldD1mdW5jdGlvbihyLGkpe3ZhciBvPXQuZ2V0KHIsTSk7cmV0dXJuIG89PT1NP2k6ZS5jYWxsKG4sbyxyLHQpfSxyLl9faXRlcmF0ZVVuY2FjaGVkPWZ1bmN0aW9uKHIsaSl7dmFyIG89dGhpcztyZXR1cm4gdC5fX2l0ZXJhdGUoKGZ1bmN0aW9uKHQsaSx1KXtyZXR1cm4hMSE9PXIoZS5jYWxsKG4sdCxpLHUpLGksbyl9KSxpKX0sci5fX2l0ZXJhdG9yVW5jYWNoZWQ9ZnVuY3Rpb24ocixpKXt2YXIgbz10Ll9faXRlcmF0b3IoeixpKTtyZXR1cm4gbmV3IFAoKGZ1bmN0aW9uKCl7dmFyIGk9by5uZXh0KCk7aWYoaS5kb25lKXJldHVybiBpO3ZhciB1PWkudmFsdWUscz11WzBdO3JldHVybiBSKHIscyxlLmNhbGwobix1WzFdLHMsdCksaSl9KSl9LHJ9ZnVuY3Rpb24gJGUodCxlKXt2YXIgbj1Nbih0KTtyZXR1cm4gbi5faXRlcj10LG4uc2l6ZT10LnNpemUsbi5yZXZlcnNlPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LHQuZmxpcCYmKG4uZmxpcD1mdW5jdGlvbigpe3ZhciBlPUhlKHQpO3JldHVybiBlLnJldmVyc2U9ZnVuY3Rpb24oKXtyZXR1cm4gdC5mbGlwKCl9LGV9KSxuLmdldD1mdW5jdGlvbihuLHIpe3JldHVybiB0LmdldChlP246LTEtbixyKX0sbi5oYXM9ZnVuY3Rpb24obil7cmV0dXJuIHQuaGFzKGU/bjotMS1uKX0sbi5pbmNsdWRlcz1mdW5jdGlvbihlKXtyZXR1cm4gdC5pbmNsdWRlcyhlKX0sbi5jYWNoZVJlc3VsdD1tbixuLl9faXRlcmF0ZT1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXM7cmV0dXJuIHQuX19pdGVyYXRlKChmdW5jdGlvbih0LG4pe3JldHVybiBlKHQsbixyKX0pLCFuKX0sbi5fX2l0ZXJhdG9yPWZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuX19pdGVyYXRvcihlLCFuKX0sbn1mdW5jdGlvbiB0bih0LGUsbixyKXt2YXIgaT1Nbih0KTtyZXR1cm4gciYmKGkuaGFzPWZ1bmN0aW9uKHIpe3ZhciBpPXQuZ2V0KHIsTSk7cmV0dXJuIGkhPT1NJiYhIWUuY2FsbChuLGkscix0KX0saS5nZXQ9ZnVuY3Rpb24ocixpKXt2YXIgbz10LmdldChyLE0pO3JldHVybiBvIT09TSYmZS5jYWxsKG4sbyxyLHQpP286aX0pLGkuX19pdGVyYXRlVW5jYWNoZWQ9ZnVuY3Rpb24oaSxvKXt2YXIgdT10aGlzLHM9MDtyZXR1cm4gdC5fX2l0ZXJhdGUoKGZ1bmN0aW9uKHQsbyxhKXtpZihlLmNhbGwobix0LG8sYSkpcmV0dXJuIHMrKyxpKHQscj9vOnMtMSx1KX0pLG8pLHN9LGkuX19pdGVyYXRvclVuY2FjaGVkPWZ1bmN0aW9uKGksbyl7dmFyIHU9dC5fX2l0ZXJhdG9yKHosbykscz0wO3JldHVybiBuZXcgUCgoZnVuY3Rpb24oKXtmb3IoOzspe3ZhciBvPXUubmV4dCgpO2lmKG8uZG9uZSlyZXR1cm4gbzt2YXIgYT1vLnZhbHVlLGM9YVswXSxmPWFbMV07aWYoZS5jYWxsKG4sZixjLHQpKXJldHVybiBSKGkscj9jOnMrKyxmLG8pfX0pKX0saX1mdW5jdGlvbiBlbih0LGUsbil7dmFyIHI9R3QoKS5hc011dGFibGUoKTtyZXR1cm4gdC5fX2l0ZXJhdGUoKGZ1bmN0aW9uKGksbyl7ci51cGRhdGUoZS5jYWxsKG4saSxvLHQpLDAsKGZ1bmN0aW9uKHQpe3JldHVybiB0KzF9KSl9KSksci5hc0ltbXV0YWJsZSgpfWZ1bmN0aW9uIG5uKHQsZSxuKXt2YXIgcj1zKHQpLGk9KGYodCk/RmUoKTpHdCgpKS5hc011dGFibGUoKTt0Ll9faXRlcmF0ZSgoZnVuY3Rpb24obyx1KXtpLnVwZGF0ZShlLmNhbGwobixvLHUsdCksKGZ1bmN0aW9uKHQpe3JldHVybih0PXR8fFtdKS5wdXNoKHI/W3Usb106byksdH0pKX0pKTt2YXIgbz13bih0KTtyZXR1cm4gaS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiB5bih0LG8oZSkpfSkpfWZ1bmN0aW9uIHJuKHQsZSxuLHIpe3ZhciBpPXQuc2l6ZTtpZih2b2lkIDAhPT1lJiYoZXw9MCksdm9pZCAwIT09biYmKG49PT0xLzA/bj1pOm58PTApLEkoZSxuLGkpKXJldHVybiB0O3ZhciBvPUEoZSxpKSx1PU8obixpKTtpZihvIT1vfHx1IT11KXJldHVybiBybih0LnRvU2VxKCkuY2FjaGVSZXN1bHQoKSxlLG4scik7dmFyIHMsYT11LW87YT09YSYmKHM9YTwwPzA6YSk7dmFyIGM9TW4odCk7cmV0dXJuIGMuc2l6ZT0wPT09cz9zOnQuc2l6ZSYmc3x8dm9pZCAwLCFyJiZvdCh0KSYmcz49MCYmKGMuZ2V0PWZ1bmN0aW9uKGUsbil7cmV0dXJuKGU9Uyh0aGlzLGUpKT49MCYmZTxzP3QuZ2V0KGUrbyxuKTpufSksYy5fX2l0ZXJhdGVVbmNhY2hlZD1mdW5jdGlvbihlLG4pe3ZhciBpPXRoaXM7aWYoMD09PXMpcmV0dXJuIDA7aWYobilyZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0ZShlLG4pO3ZhciB1PTAsYT0hMCxjPTA7cmV0dXJuIHQuX19pdGVyYXRlKChmdW5jdGlvbih0LG4pe2lmKCFhfHwhKGE9dSsrPG8pKXJldHVybiBjKyssITEhPT1lKHQscj9uOmMtMSxpKSYmYyE9PXN9KSksY30sYy5fX2l0ZXJhdG9yVW5jYWNoZWQ9ZnVuY3Rpb24oZSxuKXtpZigwIT09cyYmbilyZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0b3IoZSxuKTt2YXIgaT0wIT09cyYmdC5fX2l0ZXJhdG9yKGUsbiksdT0wLGE9MDtyZXR1cm4gbmV3IFAoKGZ1bmN0aW9uKCl7Zm9yKDt1Kys8bzspaS5uZXh0KCk7aWYoKythPnMpcmV0dXJuIFEoKTt2YXIgdD1pLm5leHQoKTtyZXR1cm4gcnx8ZT09PUU/dDpSKGUsYS0xLGU9PT1DP3ZvaWQgMDp0LnZhbHVlWzFdLHQpfSkpfSxjfWZ1bmN0aW9uIG9uKHQsZSxuKXt2YXIgcj1Nbih0KTtyZXR1cm4gci5fX2l0ZXJhdGVVbmNhY2hlZD1mdW5jdGlvbihyLGkpe3ZhciBvPXRoaXM7aWYoaSlyZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0ZShyLGkpO3ZhciB1PTA7cmV0dXJuIHQuX19pdGVyYXRlKChmdW5jdGlvbih0LGkscyl7cmV0dXJuIGUuY2FsbChuLHQsaSxzKSYmKyt1JiZyKHQsaSxvKX0pKSx1fSxyLl9faXRlcmF0b3JVbmNhY2hlZD1mdW5jdGlvbihyLGkpe3ZhciBvPXRoaXM7aWYoaSlyZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0b3IocixpKTt2YXIgdT10Ll9faXRlcmF0b3IoeixpKSxzPSEwO3JldHVybiBuZXcgUCgoZnVuY3Rpb24oKXtpZighcylyZXR1cm4gUSgpO3ZhciB0PXUubmV4dCgpO2lmKHQuZG9uZSlyZXR1cm4gdDt2YXIgaT10LnZhbHVlLGE9aVswXSxjPWlbMV07cmV0dXJuIGUuY2FsbChuLGMsYSxvKT9yPT09ej90OlIocixhLGMsdCk6KHM9ITEsUSgpKX0pKX0scn1mdW5jdGlvbiB1bih0LGUsbixyKXt2YXIgaT1Nbih0KTtyZXR1cm4gaS5fX2l0ZXJhdGVVbmNhY2hlZD1mdW5jdGlvbihpLG8pe3ZhciB1PXRoaXM7aWYobylyZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0ZShpLG8pO3ZhciBzPSEwLGE9MDtyZXR1cm4gdC5fX2l0ZXJhdGUoKGZ1bmN0aW9uKHQsbyxjKXtpZighc3x8IShzPWUuY2FsbChuLHQsbyxjKSkpcmV0dXJuIGErKyxpKHQscj9vOmEtMSx1KX0pKSxhfSxpLl9faXRlcmF0b3JVbmNhY2hlZD1mdW5jdGlvbihpLG8pe3ZhciB1PXRoaXM7aWYobylyZXR1cm4gdGhpcy5jYWNoZVJlc3VsdCgpLl9faXRlcmF0b3IoaSxvKTt2YXIgcz10Ll9faXRlcmF0b3IoeixvKSxhPSEwLGM9MDtyZXR1cm4gbmV3IFAoKGZ1bmN0aW9uKCl7dmFyIHQsbyxmO2Rve2lmKCh0PXMubmV4dCgpKS5kb25lKXJldHVybiByfHxpPT09RT90OlIoaSxjKyssaT09PUM/dm9pZCAwOnQudmFsdWVbMV0sdCk7dmFyIGw9dC52YWx1ZTtvPWxbMF0sZj1sWzFdLGEmJihhPWUuY2FsbChuLGYsbyx1KSl9d2hpbGUoYSk7cmV0dXJuIGk9PT16P3Q6UihpLG8sZix0KX0pKX0saX1mdW5jdGlvbiBzbih0LGUpe3ZhciBuPXModCksaT1bdF0uY29uY2F0KGUpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHUodCk/biYmKHQ9cih0KSk6dD1uP3N0KHQpOmF0KEFycmF5LmlzQXJyYXkodCk/dDpbdF0pLHR9KSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gMCE9PXQuc2l6ZX0pKTtpZigwPT09aS5sZW5ndGgpcmV0dXJuIHQ7aWYoMT09PWkubGVuZ3RoKXt2YXIgbz1pWzBdO2lmKG89PT10fHxuJiZzKG8pfHxhKHQpJiZhKG8pKXJldHVybiBvfXZhciBjPW5ldyBldChpKTtyZXR1cm4gbj9jPWMudG9LZXllZFNlcSgpOmEodCl8fChjPWMudG9TZXRTZXEoKSksKGM9Yy5mbGF0dGVuKCEwKSkuc2l6ZT1pLnJlZHVjZSgoZnVuY3Rpb24odCxlKXtpZih2b2lkIDAhPT10KXt2YXIgbj1lLnNpemU7aWYodm9pZCAwIT09bilyZXR1cm4gdCtufX0pLDApLGN9ZnVuY3Rpb24gYW4odCxlLG4pe3ZhciByPU1uKHQpO3JldHVybiByLl9faXRlcmF0ZVVuY2FjaGVkPWZ1bmN0aW9uKHIsaSl7dmFyIG89MCxzPSExO2Z1bmN0aW9uIGEodCxjKXt2YXIgZj10aGlzO3QuX19pdGVyYXRlKChmdW5jdGlvbih0LGkpe3JldHVybighZXx8YzxlKSYmdSh0KT9hKHQsYysxKTohMT09PXIodCxuP2k6bysrLGYpJiYocz0hMCksIXN9KSxpKX1yZXR1cm4gYSh0LDApLG99LHIuX19pdGVyYXRvclVuY2FjaGVkPWZ1bmN0aW9uKHIsaSl7dmFyIG89dC5fX2l0ZXJhdG9yKHIsaSkscz1bXSxhPTA7cmV0dXJuIG5ldyBQKChmdW5jdGlvbigpe2Zvcig7bzspe3ZhciB0PW8ubmV4dCgpO2lmKCExPT09dC5kb25lKXt2YXIgYz10LnZhbHVlO2lmKHI9PT16JiYoYz1jWzFdKSxlJiYhKHMubGVuZ3RoPGUpfHwhdShjKSlyZXR1cm4gbj90OlIocixhKyssYyx0KTtzLnB1c2gobyksbz1jLl9faXRlcmF0b3IocixpKX1lbHNlIG89cy5wb3AoKX1yZXR1cm4gUSgpfSkpfSxyfWZ1bmN0aW9uIGNuKHQsZSxuKXt2YXIgcj13bih0KTtyZXR1cm4gdC50b1NlcSgpLm1hcCgoZnVuY3Rpb24oaSxvKXtyZXR1cm4gcihlLmNhbGwobixpLG8sdCkpfSkpLmZsYXR0ZW4oITApfWZ1bmN0aW9uIGZuKHQsZSl7dmFyIG49TW4odCk7cmV0dXJuIG4uc2l6ZT10LnNpemUmJjIqdC5zaXplLTEsbi5fX2l0ZXJhdGVVbmNhY2hlZD1mdW5jdGlvbihuLHIpe3ZhciBpPXRoaXMsbz0wO3JldHVybiB0Ll9faXRlcmF0ZSgoZnVuY3Rpb24odCxyKXtyZXR1cm4oIW98fCExIT09bihlLG8rKyxpKSkmJiExIT09bih0LG8rKyxpKX0pLHIpLG99LG4uX19pdGVyYXRvclVuY2FjaGVkPWZ1bmN0aW9uKG4scil7dmFyIGksbz10Ll9faXRlcmF0b3IoRSxyKSx1PTA7cmV0dXJuIG5ldyBQKChmdW5jdGlvbigpe3JldHVybighaXx8dSUyKSYmKGk9by5uZXh0KCkpLmRvbmU/aTp1JTI/UihuLHUrKyxlKTpSKG4sdSsrLGkudmFsdWUsaSl9KSl9LG59ZnVuY3Rpb24gbG4odCxlLG4pe2V8fChlPV9uKTt2YXIgcj1zKHQpLGk9MCxvPXQudG9TZXEoKS5tYXAoKGZ1bmN0aW9uKGUscil7cmV0dXJuW3IsZSxpKyssbj9uKGUscix0KTplXX0pKS50b0FycmF5KCk7cmV0dXJuIG8uc29ydCgoZnVuY3Rpb24odCxuKXtyZXR1cm4gZSh0WzNdLG5bM10pfHx0WzJdLW5bMl19KSkuZm9yRWFjaChyP2Z1bmN0aW9uKHQsZSl7b1tlXS5sZW5ndGg9Mn06ZnVuY3Rpb24odCxlKXtvW2VdPXRbMV19KSxyP1oobyk6YSh0KT9WKG8pOlgobyl9ZnVuY3Rpb24gcG4odCxlLG4pe2lmKGV8fChlPV9uKSxuKXt2YXIgcj10LnRvU2VxKCkubWFwKChmdW5jdGlvbihlLHIpe3JldHVybltlLG4oZSxyLHQpXX0pKS5yZWR1Y2UoKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGhuKGUsdFsxXSxuWzFdKT9uOnR9KSk7cmV0dXJuIHImJnJbMF19cmV0dXJuIHQucmVkdWNlKChmdW5jdGlvbih0LG4pe3JldHVybiBobihlLHQsbik/bjp0fSkpfWZ1bmN0aW9uIGhuKHQsZSxuKXt2YXIgcj10KG4sZSk7cmV0dXJuIDA9PT1yJiZuIT09ZSYmKG51bGw9PW58fG4hPW4pfHxyPjB9ZnVuY3Rpb24gZG4odCxlLHIpe3ZhciBpPU1uKHQpO3JldHVybiBpLnNpemU9bmV3IGV0KHIpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuc2l6ZX0pKS5taW4oKSxpLl9faXRlcmF0ZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbixyPXRoaXMuX19pdGVyYXRvcihFLGUpLGk9MDshKG49ci5uZXh0KCkpLmRvbmUmJiExIT09dChuLnZhbHVlLGkrKyx0aGlzKTspO3JldHVybiBpfSxpLl9faXRlcmF0b3JVbmNhY2hlZD1mdW5jdGlvbih0LGkpe3ZhciBvPXIubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdD1uKHQpLEcoaT90LnJldmVyc2UoKTp0KX0pKSx1PTAscz0hMTtyZXR1cm4gbmV3IFAoKGZ1bmN0aW9uKCl7dmFyIG47cmV0dXJuIHN8fChuPW8ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5uZXh0KCl9KSkscz1uLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmRvbmV9KSkpLHM/USgpOlIodCx1KyssZS5hcHBseShudWxsLG4ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC52YWx1ZX0pKSkpfSkpfSxpfWZ1bmN0aW9uIHluKHQsZSl7cmV0dXJuIG90KHQpP2U6dC5jb25zdHJ1Y3RvcihlKX1mdW5jdGlvbiB2bih0KXtpZih0IT09T2JqZWN0KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIFtLLCBWXSB0dXBsZTogIit0KX1mdW5jdGlvbiBnbih0KXtyZXR1cm4gQnQodC5zaXplKSxOKHQpfWZ1bmN0aW9uIHduKHQpe3JldHVybiBzKHQpP3I6YSh0KT9pOm99ZnVuY3Rpb24gTW4odCl7cmV0dXJuIE9iamVjdC5jcmVhdGUoKHModCk/WjphKHQpP1Y6WCkucHJvdG90eXBlKX1mdW5jdGlvbiBtbigpe3JldHVybiB0aGlzLl9pdGVyLmNhY2hlUmVzdWx0Pyh0aGlzLl9pdGVyLmNhY2hlUmVzdWx0KCksdGhpcy5zaXplPXRoaXMuX2l0ZXIuc2l6ZSx0aGlzKTpKLnByb3RvdHlwZS5jYWNoZVJlc3VsdC5jYWxsKHRoaXMpfWZ1bmN0aW9uIF9uKHQsZSl7cmV0dXJuIHQ+ZT8xOnQ8ZT8tMTowfWZ1bmN0aW9uIExuKHQpe3ZhciBlPUcodCk7aWYoIWUpe2lmKCFxKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGl0ZXJhYmxlIG9yIGFycmF5LWxpa2U6ICIrdCk7ZT1HKG4odCkpfXJldHVybiBlfWZ1bmN0aW9uIGJuKHQsZSl7dmFyIG4scj1mdW5jdGlvbihvKXtpZihvIGluc3RhbmNlb2YgcilyZXR1cm4gbztpZighKHRoaXMgaW5zdGFuY2VvZiByKSlyZXR1cm4gbmV3IHIobyk7aWYoIW4pe249ITA7dmFyIHU9T2JqZWN0LmtleXModCk7U24oaSx1KSxpLnNpemU9dS5sZW5ndGgsaS5fbmFtZT1lLGkuX2tleXM9dSxpLl9kZWZhdWx0VmFsdWVzPXR9dGhpcy5fbWFwPUd0KG8pfSxpPXIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeG4pO3JldHVybiBpLmNvbnN0cnVjdG9yPXIscn1lKEZlLEd0KSxGZS5vZj1mdW5jdGlvbigpe3JldHVybiB0aGlzKGFyZ3VtZW50cyl9LEZlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fdG9TdHJpbmcoIk9yZGVyZWRNYXAgeyIsIn0iKX0sRmUucHJvdG90eXBlLmdldD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX21hcC5nZXQodCk7cmV0dXJuIHZvaWQgMCE9PW4/dGhpcy5fbGlzdC5nZXQobilbMV06ZX0sRmUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLnNpemU/dGhpczp0aGlzLl9fb3duZXJJRD8odGhpcy5zaXplPTAsdGhpcy5fbWFwLmNsZWFyKCksdGhpcy5fbGlzdC5jbGVhcigpLHRoaXMpOldlKCl9LEZlLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcWUodGhpcyx0LGUpfSxGZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3JldHVybiBxZSh0aGlzLHQsTSl9LEZlLnByb3RvdHlwZS53YXNBbHRlcmVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcC53YXNBbHRlcmVkKCl8fHRoaXMuX2xpc3Qud2FzQWx0ZXJlZCgpfSxGZS5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztyZXR1cm4gdGhpcy5fbGlzdC5fX2l0ZXJhdGUoKGZ1bmN0aW9uKGUpe3JldHVybiBlJiZ0KGVbMV0sZVswXSxuKX0pLGUpfSxGZS5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9saXN0LmZyb21FbnRyeVNlcSgpLl9faXRlcmF0b3IodCxlKX0sRmUucHJvdG90eXBlLl9fZW5zdXJlT3duZXI9ZnVuY3Rpb24odCl7aWYodD09PXRoaXMuX19vd25lcklEKXJldHVybiB0aGlzO3ZhciBlPXRoaXMuX21hcC5fX2Vuc3VyZU93bmVyKHQpLG49dGhpcy5fbGlzdC5fX2Vuc3VyZU93bmVyKHQpO3JldHVybiB0P0dlKGUsbix0LHRoaXMuX19oYXNoKToodGhpcy5fX293bmVySUQ9dCx0aGlzLl9tYXA9ZSx0aGlzLl9saXN0PW4sdGhpcyl9LEZlLmlzT3JkZXJlZE1hcD1CZSxGZS5wcm90b3R5cGVbZF09ITAsRmUucHJvdG90eXBlW3ldPUZlLnByb3RvdHlwZS5yZW1vdmUsZShKZSxaKSxKZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2l0ZXIuZ2V0KHQsZSl9LEplLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2l0ZXIuaGFzKHQpfSxKZS5wcm90b3R5cGUudmFsdWVTZXE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXRlci52YWx1ZVNlcSgpfSxKZS5wcm90b3R5cGUucmV2ZXJzZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT0kZSh0aGlzLCEwKTtyZXR1cm4gdGhpcy5fdXNlS2V5c3x8KGUudmFsdWVTZXE9ZnVuY3Rpb24oKXtyZXR1cm4gdC5faXRlci50b1NlcSgpLnJldmVyc2UoKX0pLGV9LEplLnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9S2UodGhpcyx0LGUpO3JldHVybiB0aGlzLl91c2VLZXlzfHwoci52YWx1ZVNlcT1mdW5jdGlvbigpe3JldHVybiBuLl9pdGVyLnRvU2VxKCkubWFwKHQsZSl9KSxyfSxKZS5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKHQsZSl7dmFyIG4scj10aGlzO3JldHVybiB0aGlzLl9pdGVyLl9faXRlcmF0ZSh0aGlzLl91c2VLZXlzP2Z1bmN0aW9uKGUsbil7cmV0dXJuIHQoZSxuLHIpfToobj1lP2duKHRoaXMpOjAsZnVuY3Rpb24oaSl7cmV0dXJuIHQoaSxlPy0tbjpuKysscil9KSxlKX0sSmUucHJvdG90eXBlLl9faXRlcmF0b3I9ZnVuY3Rpb24odCxlKXtpZih0aGlzLl91c2VLZXlzKXJldHVybiB0aGlzLl9pdGVyLl9faXRlcmF0b3IodCxlKTt2YXIgbj10aGlzLl9pdGVyLl9faXRlcmF0b3IoRSxlKSxyPWU/Z24odGhpcyk6MDtyZXR1cm4gbmV3IFAoKGZ1bmN0aW9uKCl7dmFyIGk9bi5uZXh0KCk7cmV0dXJuIGkuZG9uZT9pOlIodCxlPy0tcjpyKyssaS52YWx1ZSxpKX0pKX0sSmUucHJvdG90eXBlW2RdPSEwLGUoWmUsViksWmUucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9pdGVyLmluY2x1ZGVzKHQpfSxaZS5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxyPTA7cmV0dXJuIHRoaXMuX2l0ZXIuX19pdGVyYXRlKChmdW5jdGlvbihlKXtyZXR1cm4gdChlLHIrKyxuKX0pLGUpfSxaZS5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2l0ZXIuX19pdGVyYXRvcihFLGUpLHI9MDtyZXR1cm4gbmV3IFAoKGZ1bmN0aW9uKCl7dmFyIGU9bi5uZXh0KCk7cmV0dXJuIGUuZG9uZT9lOlIodCxyKyssZS52YWx1ZSxlKX0pKX0sZShWZSxYKSxWZS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9pdGVyLmluY2x1ZGVzKHQpfSxWZS5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztyZXR1cm4gdGhpcy5faXRlci5fX2l0ZXJhdGUoKGZ1bmN0aW9uKGUpe3JldHVybiB0KGUsZSxuKX0pLGUpfSxWZS5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2l0ZXIuX19pdGVyYXRvcihFLGUpO3JldHVybiBuZXcgUCgoZnVuY3Rpb24oKXt2YXIgZT1uLm5leHQoKTtyZXR1cm4gZS5kb25lP2U6Uih0LGUudmFsdWUsZS52YWx1ZSxlKX0pKX0sZShYZSxaKSxYZS5wcm90b3R5cGUuZW50cnlTZXE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXRlci50b1NlcSgpfSxYZS5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztyZXR1cm4gdGhpcy5faXRlci5fX2l0ZXJhdGUoKGZ1bmN0aW9uKGUpe2lmKGUpe3ZuKGUpO3ZhciByPXUoZSk7cmV0dXJuIHQocj9lLmdldCgxKTplWzFdLHI/ZS5nZXQoMCk6ZVswXSxuKX19KSxlKX0sWGUucHJvdG90eXBlLl9faXRlcmF0b3I9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9pdGVyLl9faXRlcmF0b3IoRSxlKTtyZXR1cm4gbmV3IFAoKGZ1bmN0aW9uKCl7Zm9yKDs7KXt2YXIgZT1uLm5leHQoKTtpZihlLmRvbmUpcmV0dXJuIGU7dmFyIHI9ZS52YWx1ZTtpZihyKXt2bihyKTt2YXIgaT11KHIpO3JldHVybiBSKHQsaT9yLmdldCgwKTpyWzBdLGk/ci5nZXQoMSk6clsxXSxlKX19fSkpfSxaZS5wcm90b3R5cGUuY2FjaGVSZXN1bHQ9SmUucHJvdG90eXBlLmNhY2hlUmVzdWx0PVZlLnByb3RvdHlwZS5jYWNoZVJlc3VsdD1YZS5wcm90b3R5cGUuY2FjaGVSZXN1bHQ9bW4sZShibixidCksYm4ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX190b1N0cmluZyhObih0aGlzKSsiIHsiLCJ9Iil9LGJuLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RlZmF1bHRWYWx1ZXMuaGFzT3duUHJvcGVydHkodCl9LGJuLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCxlKXtpZighdGhpcy5oYXModCkpcmV0dXJuIGU7dmFyIG49dGhpcy5fZGVmYXVsdFZhbHVlc1t0XTtyZXR1cm4gdGhpcy5fbWFwP3RoaXMuX21hcC5nZXQodCxuKTpufSxibi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXtpZih0aGlzLl9fb3duZXJJRClyZXR1cm4gdGhpcy5fbWFwJiZ0aGlzLl9tYXAuY2xlYXIoKSx0aGlzO3ZhciB0PXRoaXMuY29uc3RydWN0b3I7cmV0dXJuIHQuX2VtcHR5fHwodC5fZW1wdHk9am4odGhpcyxpZSgpKSl9LGJuLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXtpZighdGhpcy5oYXModCkpdGhyb3cgbmV3IEVycm9yKCdDYW5ub3Qgc2V0IHVua25vd24ga2V5ICInK3QrJyIgb24gJytObih0aGlzKSk7aWYodGhpcy5fbWFwJiYhdGhpcy5fbWFwLmhhcyh0KSYmZT09PXRoaXMuX2RlZmF1bHRWYWx1ZXNbdF0pcmV0dXJuIHRoaXM7dmFyIG49dGhpcy5fbWFwJiZ0aGlzLl9tYXAuc2V0KHQsZSk7cmV0dXJuIHRoaXMuX19vd25lcklEfHxuPT09dGhpcy5fbWFwP3RoaXM6am4odGhpcyxuKX0sYm4ucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXtpZighdGhpcy5oYXModCkpcmV0dXJuIHRoaXM7dmFyIGU9dGhpcy5fbWFwJiZ0aGlzLl9tYXAucmVtb3ZlKHQpO3JldHVybiB0aGlzLl9fb3duZXJJRHx8ZT09PXRoaXMuX21hcD90aGlzOmpuKHRoaXMsZSl9LGJuLnByb3RvdHlwZS53YXNBbHRlcmVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21hcC53YXNBbHRlcmVkKCl9LGJuLnByb3RvdHlwZS5fX2l0ZXJhdG9yPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztyZXR1cm4gcih0aGlzLl9kZWZhdWx0VmFsdWVzKS5tYXAoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4uZ2V0KGUpfSkpLl9faXRlcmF0b3IodCxlKX0sYm4ucHJvdG90eXBlLl9faXRlcmF0ZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7cmV0dXJuIHIodGhpcy5fZGVmYXVsdFZhbHVlcykubWFwKChmdW5jdGlvbih0LGUpe3JldHVybiBuLmdldChlKX0pKS5fX2l0ZXJhdGUodCxlKX0sYm4ucHJvdG90eXBlLl9fZW5zdXJlT3duZXI9ZnVuY3Rpb24odCl7aWYodD09PXRoaXMuX19vd25lcklEKXJldHVybiB0aGlzO3ZhciBlPXRoaXMuX21hcCYmdGhpcy5fbWFwLl9fZW5zdXJlT3duZXIodCk7cmV0dXJuIHQ/am4odGhpcyxlLHQpOih0aGlzLl9fb3duZXJJRD10LHRoaXMuX21hcD1lLHRoaXMpfTt2YXIgeG49Ym4ucHJvdG90eXBlO2Z1bmN0aW9uIGpuKHQsZSxuKXt2YXIgcj1PYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih0KSk7cmV0dXJuIHIuX21hcD1lLHIuX19vd25lcklEPW4scn1mdW5jdGlvbiBObih0KXtyZXR1cm4gdC5fbmFtZXx8dC5jb25zdHJ1Y3Rvci5uYW1lfHwiUmVjb3JkIn1mdW5jdGlvbiBTbih0LGUpe3RyeXtlLmZvckVhY2goRG4uYmluZCh2b2lkIDAsdCkpfWNhdGNoKHQpe319ZnVuY3Rpb24gRG4odCxlKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXQoZSl9LHNldDpmdW5jdGlvbih0KXttdCh0aGlzLl9fb3duZXJJRCwiQ2Fubm90IHNldCBvbiBhbiBpbW11dGFibGUgcmVjb3JkLiIpLHRoaXMuc2V0KGUsdCl9fSl9ZnVuY3Rpb24gSW4odCl7cmV0dXJuIG51bGw9PXQ/a24oKTpBbih0KSYmIWYodCk/dDprbigpLndpdGhNdXRhdGlvbnMoKGZ1bmN0aW9uKGUpe3ZhciBuPW8odCk7QnQobi5zaXplKSxuLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBlLmFkZCh0KX0pKX0pKX1mdW5jdGlvbiBBbih0KXtyZXR1cm4hKCF0fHwhdFtUbl0pfXhuW3ldPXhuLnJlbW92ZSx4bi5kZWxldGVJbj14bi5yZW1vdmVJbj1adC5yZW1vdmVJbix4bi5tZXJnZT1adC5tZXJnZSx4bi5tZXJnZVdpdGg9WnQubWVyZ2VXaXRoLHhuLm1lcmdlSW49WnQubWVyZ2VJbix4bi5tZXJnZURlZXA9WnQubWVyZ2VEZWVwLHhuLm1lcmdlRGVlcFdpdGg9WnQubWVyZ2VEZWVwV2l0aCx4bi5tZXJnZURlZXBJbj1adC5tZXJnZURlZXBJbix4bi5zZXRJbj1adC5zZXRJbix4bi51cGRhdGU9WnQudXBkYXRlLHhuLnVwZGF0ZUluPVp0LnVwZGF0ZUluLHhuLndpdGhNdXRhdGlvbnM9WnQud2l0aE11dGF0aW9ucyx4bi5hc011dGFibGU9WnQuYXNNdXRhYmxlLHhuLmFzSW1tdXRhYmxlPVp0LmFzSW1tdXRhYmxlLGUoSW4sanQpLEluLm9mPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMoYXJndW1lbnRzKX0sSW4uZnJvbUtleXM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMocih0KS5rZXlTZXEoKSl9LEluLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fdG9TdHJpbmcoIlNldCB7IiwifSIpfSxJbi5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9tYXAuaGFzKHQpfSxJbi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQpe3JldHVybiBFbih0aGlzLHRoaXMuX21hcC5zZXQodCwhMCkpfSxJbi5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQpe3JldHVybiBFbih0aGlzLHRoaXMuX21hcC5yZW1vdmUodCkpfSxJbi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXtyZXR1cm4gRW4odGhpcyx0aGlzLl9tYXAuY2xlYXIoKSl9LEluLnByb3RvdHlwZS51bmlvbj1mdW5jdGlvbigpe3ZhciBlPXQuY2FsbChhcmd1bWVudHMsMCk7cmV0dXJuIDA9PT0oZT1lLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIDAhPT10LnNpemV9KSkpLmxlbmd0aD90aGlzOjAhPT10aGlzLnNpemV8fHRoaXMuX19vd25lcklEfHwxIT09ZS5sZW5ndGg/dGhpcy53aXRoTXV0YXRpb25zKChmdW5jdGlvbih0KXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylvKGVbbl0pLmZvckVhY2goKGZ1bmN0aW9uKGUpe3JldHVybiB0LmFkZChlKX0pKX0pKTp0aGlzLmNvbnN0cnVjdG9yKGVbMF0pfSxJbi5wcm90b3R5cGUuaW50ZXJzZWN0PWZ1bmN0aW9uKCl7dmFyIGU9dC5jYWxsKGFyZ3VtZW50cywwKTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIHRoaXM7ZT1lLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIG8odCl9KSk7dmFyIG49dGhpcztyZXR1cm4gdGhpcy53aXRoTXV0YXRpb25zKChmdW5jdGlvbih0KXtuLmZvckVhY2goKGZ1bmN0aW9uKG4pe2UuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmluY2x1ZGVzKG4pfSkpfHx0LnJlbW92ZShuKX0pKX0pKX0sSW4ucHJvdG90eXBlLnN1YnRyYWN0PWZ1bmN0aW9uKCl7dmFyIGU9dC5jYWxsKGFyZ3VtZW50cywwKTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIHRoaXM7ZT1lLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIG8odCl9KSk7dmFyIG49dGhpcztyZXR1cm4gdGhpcy53aXRoTXV0YXRpb25zKChmdW5jdGlvbih0KXtuLmZvckVhY2goKGZ1bmN0aW9uKG4pe2Uuc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIHQuaW5jbHVkZXMobil9KSkmJnQucmVtb3ZlKG4pfSkpfSkpfSxJbi5wcm90b3R5cGUubWVyZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bmlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LEluLnByb3RvdHlwZS5tZXJnZVdpdGg9ZnVuY3Rpb24oZSl7dmFyIG49dC5jYWxsKGFyZ3VtZW50cywxKTtyZXR1cm4gdGhpcy51bmlvbi5hcHBseSh0aGlzLG4pfSxJbi5wcm90b3R5cGUuc29ydD1mdW5jdGlvbih0KXtyZXR1cm4gWW4obG4odGhpcyx0KSl9LEluLnByb3RvdHlwZS5zb3J0Qnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gWW4obG4odGhpcyxlLHQpKX0sSW4ucHJvdG90eXBlLndhc0FsdGVyZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWFwLndhc0FsdGVyZWQoKX0sSW4ucHJvdG90eXBlLl9faXRlcmF0ZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7cmV0dXJuIHRoaXMuX21hcC5fX2l0ZXJhdGUoKGZ1bmN0aW9uKGUscil7cmV0dXJuIHQocixyLG4pfSksZSl9LEluLnByb3RvdHlwZS5fX2l0ZXJhdG9yPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX21hcC5tYXAoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV9KSkuX19pdGVyYXRvcih0LGUpfSxJbi5wcm90b3R5cGUuX19lbnN1cmVPd25lcj1mdW5jdGlvbih0KXtpZih0PT09dGhpcy5fX293bmVySUQpcmV0dXJuIHRoaXM7dmFyIGU9dGhpcy5fbWFwLl9fZW5zdXJlT3duZXIodCk7cmV0dXJuIHQ/dGhpcy5fX21ha2UoZSx0KToodGhpcy5fX293bmVySUQ9dCx0aGlzLl9tYXA9ZSx0aGlzKX0sSW4uaXNTZXQ9QW47dmFyIE9uLFRuPSJAQF9fSU1NVVRBQkxFX1NFVF9fQEAiLENuPUluLnByb3RvdHlwZTtmdW5jdGlvbiBFbih0LGUpe3JldHVybiB0Ll9fb3duZXJJRD8odC5zaXplPWUuc2l6ZSx0Ll9tYXA9ZSx0KTplPT09dC5fbWFwP3Q6MD09PWUuc2l6ZT90Ll9fZW1wdHkoKTp0Ll9fbWFrZShlKX1mdW5jdGlvbiB6bih0LGUpe3ZhciBuPU9iamVjdC5jcmVhdGUoQ24pO3JldHVybiBuLnNpemU9dD90LnNpemU6MCxuLl9tYXA9dCxuLl9fb3duZXJJRD1lLG59ZnVuY3Rpb24ga24oKXtyZXR1cm4gT258fChPbj16bihpZSgpKSl9ZnVuY3Rpb24gWW4odCl7cmV0dXJuIG51bGw9PXQ/Rm4oKTpVbih0KT90OkZuKCkud2l0aE11dGF0aW9ucygoZnVuY3Rpb24oZSl7dmFyIG49byh0KTtCdChuLnNpemUpLG4uZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIGUuYWRkKHQpfSkpfSkpfWZ1bmN0aW9uIFVuKHQpe3JldHVybiBBbih0KSYmZih0KX1DbltUbl09ITAsQ25beV09Q24ucmVtb3ZlLENuLm1lcmdlRGVlcD1Dbi5tZXJnZSxDbi5tZXJnZURlZXBXaXRoPUNuLm1lcmdlV2l0aCxDbi53aXRoTXV0YXRpb25zPVp0LndpdGhNdXRhdGlvbnMsQ24uYXNNdXRhYmxlPVp0LmFzTXV0YWJsZSxDbi5hc0ltbXV0YWJsZT1adC5hc0ltbXV0YWJsZSxDbi5fX2VtcHR5PWtuLENuLl9fbWFrZT16bixlKFluLEluKSxZbi5vZj1mdW5jdGlvbigpe3JldHVybiB0aGlzKGFyZ3VtZW50cyl9LFluLmZyb21LZXlzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzKHIodCkua2V5U2VxKCkpfSxZbi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX3RvU3RyaW5nKCJPcmRlcmVkU2V0IHsiLCJ9Iil9LFluLmlzT3JkZXJlZFNldD1Vbjt2YXIgUG4sUm49WW4ucHJvdG90eXBlO2Z1bmN0aW9uIFFuKHQsZSl7dmFyIG49T2JqZWN0LmNyZWF0ZShSbik7cmV0dXJuIG4uc2l6ZT10P3Quc2l6ZTowLG4uX21hcD10LG4uX19vd25lcklEPWUsbn1mdW5jdGlvbiBGbigpe3JldHVybiBQbnx8KFBuPVFuKFdlKCkpKX1mdW5jdGlvbiBCbih0KXtyZXR1cm4gbnVsbD09dD9WbigpOkduKHQpP3Q6Vm4oKS51bnNoaWZ0QWxsKHQpfWZ1bmN0aW9uIEduKHQpe3JldHVybiEoIXR8fCF0W3FuXSl9Um5bZF09ITAsUm4uX19lbXB0eT1GbixSbi5fX21ha2U9UW4sZShCbix4dCksQm4ub2Y9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcyhhcmd1bWVudHMpfSxCbi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX3RvU3RyaW5nKCJTdGFjayBbIiwiXSIpfSxCbi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5faGVhZDtmb3IodD1TKHRoaXMsdCk7biYmdC0tOyluPW4ubmV4dDtyZXR1cm4gbj9uLnZhbHVlOmV9LEJuLnByb3RvdHlwZS5wZWVrPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2hlYWQmJnRoaXMuX2hlYWQudmFsdWV9LEJuLnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXM7Zm9yKHZhciB0PXRoaXMuc2l6ZSthcmd1bWVudHMubGVuZ3RoLGU9dGhpcy5faGVhZCxuPWFyZ3VtZW50cy5sZW5ndGgtMTtuPj0wO24tLSllPXt2YWx1ZTphcmd1bWVudHNbbl0sbmV4dDplfTtyZXR1cm4gdGhpcy5fX293bmVySUQ/KHRoaXMuc2l6ZT10LHRoaXMuX2hlYWQ9ZSx0aGlzLl9faGFzaD12b2lkIDAsdGhpcy5fX2FsdGVyZWQ9ITAsdGhpcyk6Wm4odCxlKX0sQm4ucHJvdG90eXBlLnB1c2hBbGw9ZnVuY3Rpb24odCl7aWYoMD09PSh0PWkodCkpLnNpemUpcmV0dXJuIHRoaXM7QnQodC5zaXplKTt2YXIgZT10aGlzLnNpemUsbj10aGlzLl9oZWFkO3JldHVybiB0LnJldmVyc2UoKS5mb3JFYWNoKChmdW5jdGlvbih0KXtlKyssbj17dmFsdWU6dCxuZXh0Om59fSkpLHRoaXMuX19vd25lcklEPyh0aGlzLnNpemU9ZSx0aGlzLl9oZWFkPW4sdGhpcy5fX2hhc2g9dm9pZCAwLHRoaXMuX19hbHRlcmVkPSEwLHRoaXMpOlpuKGUsbil9LEJuLnByb3RvdHlwZS5wb3A9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zbGljZSgxKX0sQm4ucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sQm4ucHJvdG90eXBlLnVuc2hpZnRBbGw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucHVzaEFsbCh0KX0sQm4ucHJvdG90eXBlLnNoaWZ0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucG9wLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sQm4ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLnNpemU/dGhpczp0aGlzLl9fb3duZXJJRD8odGhpcy5zaXplPTAsdGhpcy5faGVhZD12b2lkIDAsdGhpcy5fX2hhc2g9dm9pZCAwLHRoaXMuX19hbHRlcmVkPSEwLHRoaXMpOlZuKCl9LEJuLnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbih0LGUpe2lmKEkodCxlLHRoaXMuc2l6ZSkpcmV0dXJuIHRoaXM7dmFyIG49QSh0LHRoaXMuc2l6ZSk7aWYoTyhlLHRoaXMuc2l6ZSkhPT10aGlzLnNpemUpcmV0dXJuIHh0LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMsdCxlKTtmb3IodmFyIHI9dGhpcy5zaXplLW4saT10aGlzLl9oZWFkO24tLTspaT1pLm5leHQ7cmV0dXJuIHRoaXMuX19vd25lcklEPyh0aGlzLnNpemU9cix0aGlzLl9oZWFkPWksdGhpcy5fX2hhc2g9dm9pZCAwLHRoaXMuX19hbHRlcmVkPSEwLHRoaXMpOlpuKHIsaSl9LEJuLnByb3RvdHlwZS5fX2Vuc3VyZU93bmVyPWZ1bmN0aW9uKHQpe3JldHVybiB0PT09dGhpcy5fX293bmVySUQ/dGhpczp0P1puKHRoaXMuc2l6ZSx0aGlzLl9oZWFkLHQsdGhpcy5fX2hhc2gpOih0aGlzLl9fb3duZXJJRD10LHRoaXMuX19hbHRlcmVkPSExLHRoaXMpfSxCbi5wcm90b3R5cGUuX19pdGVyYXRlPWZ1bmN0aW9uKHQsZSl7aWYoZSlyZXR1cm4gdGhpcy5yZXZlcnNlKCkuX19pdGVyYXRlKHQpO2Zvcih2YXIgbj0wLHI9dGhpcy5faGVhZDtyJiYhMSE9PXQoci52YWx1ZSxuKyssdGhpcyk7KXI9ci5uZXh0O3JldHVybiBufSxCbi5wcm90b3R5cGUuX19pdGVyYXRvcj1mdW5jdGlvbih0LGUpe2lmKGUpcmV0dXJuIHRoaXMucmV2ZXJzZSgpLl9faXRlcmF0b3IodCk7dmFyIG49MCxyPXRoaXMuX2hlYWQ7cmV0dXJuIG5ldyBQKChmdW5jdGlvbigpe2lmKHIpe3ZhciBlPXIudmFsdWU7cmV0dXJuIHI9ci5uZXh0LFIodCxuKyssZSl9cmV0dXJuIFEoKX0pKX0sQm4uaXNTdGFjaz1Hbjt2YXIgV24scW49IkBAX19JTU1VVEFCTEVfU1RBQ0tfX0BAIixKbj1Cbi5wcm90b3R5cGU7ZnVuY3Rpb24gWm4odCxlLG4scil7dmFyIGk9T2JqZWN0LmNyZWF0ZShKbik7cmV0dXJuIGkuc2l6ZT10LGkuX2hlYWQ9ZSxpLl9fb3duZXJJRD1uLGkuX19oYXNoPXIsaS5fX2FsdGVyZWQ9ITEsaX1mdW5jdGlvbiBWbigpe3JldHVybiBXbnx8KFduPVpuKDApKX1mdW5jdGlvbiBYbih0LGUpe3ZhciBuPWZ1bmN0aW9uKG4pe3QucHJvdG90eXBlW25dPWVbbl19O3JldHVybiBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKG4pLE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMmJk9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSkuZm9yRWFjaChuKSx0fUpuW3FuXT0hMCxKbi53aXRoTXV0YXRpb25zPVp0LndpdGhNdXRhdGlvbnMsSm4uYXNNdXRhYmxlPVp0LmFzTXV0YWJsZSxKbi5hc0ltbXV0YWJsZT1adC5hc0ltbXV0YWJsZSxKbi53YXNBbHRlcmVkPVp0Lndhc0FsdGVyZWQsbi5JdGVyYXRvcj1QLFhuKG4se3RvQXJyYXk6ZnVuY3Rpb24oKXtCdCh0aGlzLnNpemUpO3ZhciB0PW5ldyBBcnJheSh0aGlzLnNpemV8fDApO3JldHVybiB0aGlzLnZhbHVlU2VxKCkuX19pdGVyYXRlKChmdW5jdGlvbihlLG4pe3Rbbl09ZX0pKSx0fSx0b0luZGV4ZWRTZXE6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFplKHRoaXMpfSx0b0pTOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG9TZXEoKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC50b0pTP3QudG9KUygpOnR9KSkuX190b0pTKCl9LHRvSlNPTjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRvU2VxKCkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIHQudG9KU09OP3QudG9KU09OKCk6dH0pKS5fX3RvSlMoKX0sdG9LZXllZFNlcTpmdW5jdGlvbigpe3JldHVybiBuZXcgSmUodGhpcywhMCl9LHRvTWFwOmZ1bmN0aW9uKCl7cmV0dXJuIEd0KHRoaXMudG9LZXllZFNlcSgpKX0sdG9PYmplY3Q6ZnVuY3Rpb24oKXtCdCh0aGlzLnNpemUpO3ZhciB0PXt9O3JldHVybiB0aGlzLl9faXRlcmF0ZSgoZnVuY3Rpb24oZSxuKXt0W25dPWV9KSksdH0sdG9PcmRlcmVkTWFwOmZ1bmN0aW9uKCl7cmV0dXJuIEZlKHRoaXMudG9LZXllZFNlcSgpKX0sdG9PcmRlcmVkU2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFluKHModGhpcyk/dGhpcy52YWx1ZVNlcSgpOnRoaXMpfSx0b1NldDpmdW5jdGlvbigpe3JldHVybiBJbihzKHRoaXMpP3RoaXMudmFsdWVTZXEoKTp0aGlzKX0sdG9TZXRTZXE6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFZlKHRoaXMpfSx0b1NlcTpmdW5jdGlvbigpe3JldHVybiBhKHRoaXMpP3RoaXMudG9JbmRleGVkU2VxKCk6cyh0aGlzKT90aGlzLnRvS2V5ZWRTZXEoKTp0aGlzLnRvU2V0U2VxKCl9LHRvU3RhY2s6ZnVuY3Rpb24oKXtyZXR1cm4gQm4ocyh0aGlzKT90aGlzLnZhbHVlU2VxKCk6dGhpcyl9LHRvTGlzdDpmdW5jdGlvbigpe3JldHVybiB4ZShzKHRoaXMpP3RoaXMudmFsdWVTZXEoKTp0aGlzKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4iW0l0ZXJhYmxlXSJ9LF9fdG9TdHJpbmc6ZnVuY3Rpb24odCxlKXtyZXR1cm4gMD09PXRoaXMuc2l6ZT90K2U6dCsiICIrdGhpcy50b1NlcSgpLm1hcCh0aGlzLl9fdG9TdHJpbmdNYXBwZXIpLmpvaW4oIiwgIikrIiAiK2V9LGNvbmNhdDpmdW5jdGlvbigpe3JldHVybiB5bih0aGlzLHNuKHRoaXMsdC5jYWxsKGFyZ3VtZW50cywwKSkpfSxpbmNsdWRlczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zb21lKChmdW5jdGlvbihlKXtyZXR1cm4gZ3QoZSx0KX0pKX0sZW50cmllczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9faXRlcmF0b3Ioeil9LGV2ZXJ5OmZ1bmN0aW9uKHQsZSl7QnQodGhpcy5zaXplKTt2YXIgbj0hMDtyZXR1cm4gdGhpcy5fX2l0ZXJhdGUoKGZ1bmN0aW9uKHIsaSxvKXtpZighdC5jYWxsKGUscixpLG8pKXJldHVybiBuPSExLCExfSkpLG59LGZpbHRlcjpmdW5jdGlvbih0LGUpe3JldHVybiB5bih0aGlzLHRuKHRoaXMsdCxlLCEwKSl9LGZpbmQ6ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMuZmluZEVudHJ5KHQsZSk7cmV0dXJuIHI/clsxXTpufSxmb3JFYWNoOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIEJ0KHRoaXMuc2l6ZSksdGhpcy5fX2l0ZXJhdGUoZT90LmJpbmQoZSk6dCl9LGpvaW46ZnVuY3Rpb24odCl7QnQodGhpcy5zaXplKSx0PXZvaWQgMCE9PXQ/IiIrdDoiLCI7dmFyIGU9IiIsbj0hMDtyZXR1cm4gdGhpcy5fX2l0ZXJhdGUoKGZ1bmN0aW9uKHIpe24/bj0hMTplKz10LGUrPW51bGwhPXI/ci50b1N0cmluZygpOiIifSkpLGV9LGtleXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2l0ZXJhdG9yKEMpfSxtYXA6ZnVuY3Rpb24odCxlKXtyZXR1cm4geW4odGhpcyxLZSh0aGlzLHQsZSkpfSxyZWR1Y2U6ZnVuY3Rpb24odCxlLG4pe3ZhciByLGk7cmV0dXJuIEJ0KHRoaXMuc2l6ZSksYXJndW1lbnRzLmxlbmd0aDwyP2k9ITA6cj1lLHRoaXMuX19pdGVyYXRlKChmdW5jdGlvbihlLG8sdSl7aT8oaT0hMSxyPWUpOnI9dC5jYWxsKG4scixlLG8sdSl9KSkscn0scmVkdWNlUmlnaHQ6ZnVuY3Rpb24odCxlLG4pe3ZhciByPXRoaXMudG9LZXllZFNlcSgpLnJldmVyc2UoKTtyZXR1cm4gci5yZWR1Y2UuYXBwbHkocixhcmd1bWVudHMpfSxyZXZlcnNlOmZ1bmN0aW9uKCl7cmV0dXJuIHluKHRoaXMsJGUodGhpcywhMCkpfSxzbGljZTpmdW5jdGlvbih0LGUpe3JldHVybiB5bih0aGlzLHJuKHRoaXMsdCxlLCEwKSl9LHNvbWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4hdGhpcy5ldmVyeShlcih0KSxlKX0sc29ydDpmdW5jdGlvbih0KXtyZXR1cm4geW4odGhpcyxsbih0aGlzLHQpKX0sdmFsdWVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19pdGVyYXRvcihFKX0sYnV0TGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNsaWNlKDAsLTEpfSxpc0VtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuc2l6ZT8wPT09dGhpcy5zaXplOiF0aGlzLnNvbWUoKGZ1bmN0aW9uKCl7cmV0dXJuITB9KSl9LGNvdW50OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIE4odD90aGlzLnRvU2VxKCkuZmlsdGVyKHQsZSk6dGhpcyl9LGNvdW50Qnk6ZnVuY3Rpb24odCxlKXtyZXR1cm4gZW4odGhpcyx0LGUpfSxlcXVhbHM6ZnVuY3Rpb24odCl7cmV0dXJuIHd0KHRoaXMsdCl9LGVudHJ5U2VxOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZih0Ll9jYWNoZSlyZXR1cm4gbmV3IGV0KHQuX2NhY2hlKTt2YXIgZT10LnRvU2VxKCkubWFwKHRyKS50b0luZGV4ZWRTZXEoKTtyZXR1cm4gZS5mcm9tRW50cnlTZXE9ZnVuY3Rpb24oKXtyZXR1cm4gdC50b1NlcSgpfSxlfSxmaWx0ZXJOb3Q6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5maWx0ZXIoZXIodCksZSl9LGZpbmRFbnRyeTpmdW5jdGlvbih0LGUsbil7dmFyIHI9bjtyZXR1cm4gdGhpcy5fX2l0ZXJhdGUoKGZ1bmN0aW9uKG4saSxvKXtpZih0LmNhbGwoZSxuLGksbykpcmV0dXJuIHI9W2ksbl0sITF9KSkscn0sZmluZEtleTpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZmluZEVudHJ5KHQsZSk7cmV0dXJuIG4mJm5bMF19LGZpbmRMYXN0OmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdGhpcy50b0tleWVkU2VxKCkucmV2ZXJzZSgpLmZpbmQodCxlLG4pfSxmaW5kTGFzdEVudHJ5OmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdGhpcy50b0tleWVkU2VxKCkucmV2ZXJzZSgpLmZpbmRFbnRyeSh0LGUsbil9LGZpbmRMYXN0S2V5OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMudG9LZXllZFNlcSgpLnJldmVyc2UoKS5maW5kS2V5KHQsZSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmluZChEKX0sZmxhdE1hcDpmdW5jdGlvbih0LGUpe3JldHVybiB5bih0aGlzLGNuKHRoaXMsdCxlKSl9LGZsYXR0ZW46ZnVuY3Rpb24odCl7cmV0dXJuIHluKHRoaXMsYW4odGhpcyx0LCEwKSl9LGZyb21FbnRyeVNlcTpmdW5jdGlvbigpe3JldHVybiBuZXcgWGUodGhpcyl9LGdldDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmZpbmQoKGZ1bmN0aW9uKGUsbil7cmV0dXJuIGd0KG4sdCl9KSx2b2lkIDAsZSl9LGdldEluOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuLHI9dGhpcyxpPUxuKHQpOyEobj1pLm5leHQoKSkuZG9uZTspe3ZhciBvPW4udmFsdWU7aWYoKHI9ciYmci5nZXQ/ci5nZXQobyxNKTpNKT09PU0pcmV0dXJuIGV9cmV0dXJuIHJ9LGdyb3VwQnk6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbm4odGhpcyx0LGUpfSxoYXM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZ2V0KHQsTSkhPT1NfSxoYXNJbjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5nZXRJbih0LE0pIT09TX0saXNTdWJzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9ImZ1bmN0aW9uIj09dHlwZW9mIHQuaW5jbHVkZXM/dDpuKHQpLHRoaXMuZXZlcnkoKGZ1bmN0aW9uKGUpe3JldHVybiB0LmluY2x1ZGVzKGUpfSkpfSxpc1N1cGVyc2V0OmZ1bmN0aW9uKHQpe3JldHVybih0PSJmdW5jdGlvbiI9PXR5cGVvZiB0LmlzU3Vic2V0P3Q6bih0KSkuaXNTdWJzZXQodGhpcyl9LGtleU9mOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmZpbmRLZXkoKGZ1bmN0aW9uKGUpe3JldHVybiBndChlLHQpfSkpfSxrZXlTZXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b1NlcSgpLm1hcCgkbikudG9JbmRleGVkU2VxKCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b1NlcSgpLnJldmVyc2UoKS5maXJzdCgpfSxsYXN0S2V5T2Y6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudG9LZXllZFNlcSgpLnJldmVyc2UoKS5rZXlPZih0KX0sbWF4OmZ1bmN0aW9uKHQpe3JldHVybiBwbih0aGlzLHQpfSxtYXhCeTpmdW5jdGlvbih0LGUpe3JldHVybiBwbih0aGlzLGUsdCl9LG1pbjpmdW5jdGlvbih0KXtyZXR1cm4gcG4odGhpcyx0P25yKHQpOm9yKX0sbWluQnk6ZnVuY3Rpb24odCxlKXtyZXR1cm4gcG4odGhpcyxlP25yKGUpOm9yLHQpfSxyZXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2xpY2UoMSl9LHNraXA6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc2xpY2UoTWF0aC5tYXgoMCx0KSl9LHNraXBMYXN0OmZ1bmN0aW9uKHQpe3JldHVybiB5bih0aGlzLHRoaXMudG9TZXEoKS5yZXZlcnNlKCkuc2tpcCh0KS5yZXZlcnNlKCkpfSxza2lwV2hpbGU6ZnVuY3Rpb24odCxlKXtyZXR1cm4geW4odGhpcyx1bih0aGlzLHQsZSwhMCkpfSxza2lwVW50aWw6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5za2lwV2hpbGUoZXIodCksZSl9LHNvcnRCeTpmdW5jdGlvbih0LGUpe3JldHVybiB5bih0aGlzLGxuKHRoaXMsZSx0KSl9LHRha2U6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuc2xpY2UoMCxNYXRoLm1heCgwLHQpKX0sdGFrZUxhc3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHluKHRoaXMsdGhpcy50b1NlcSgpLnJldmVyc2UoKS50YWtlKHQpLnJldmVyc2UoKSl9LHRha2VXaGlsZTpmdW5jdGlvbih0LGUpe3JldHVybiB5bih0aGlzLG9uKHRoaXMsdCxlKSl9LHRha2VVbnRpbDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnRha2VXaGlsZShlcih0KSxlKX0sdmFsdWVTZXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b0luZGV4ZWRTZXEoKX0saGFzaENvZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2hhc2h8fCh0aGlzLl9faGFzaD11cih0aGlzKSl9fSk7dmFyIEhuPW4ucHJvdG90eXBlO0huW2xdPSEwLEhuW1VdPUhuLnZhbHVlcyxIbi5fX3RvSlM9SG4udG9BcnJheSxIbi5fX3RvU3RyaW5nTWFwcGVyPXJyLEhuLmluc3BlY3Q9SG4udG9Tb3VyY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50b1N0cmluZygpfSxIbi5jaGFpbj1Ibi5mbGF0TWFwLEhuLmNvbnRhaW5zPUhuLmluY2x1ZGVzLFhuKHIse2ZsaXA6ZnVuY3Rpb24oKXtyZXR1cm4geW4odGhpcyxIZSh0aGlzKSl9LG1hcEVudHJpZXM6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLHI9MDtyZXR1cm4geW4odGhpcyx0aGlzLnRvU2VxKCkubWFwKChmdW5jdGlvbihpLG8pe3JldHVybiB0LmNhbGwoZSxbbyxpXSxyKyssbil9KSkuZnJvbUVudHJ5U2VxKCkpfSxtYXBLZXlzOmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztyZXR1cm4geW4odGhpcyx0aGlzLnRvU2VxKCkuZmxpcCgpLm1hcCgoZnVuY3Rpb24ocixpKXtyZXR1cm4gdC5jYWxsKGUscixpLG4pfSkpLmZsaXAoKSl9fSk7dmFyIEtuPXIucHJvdG90eXBlO2Z1bmN0aW9uICRuKHQsZSl7cmV0dXJuIGV9ZnVuY3Rpb24gdHIodCxlKXtyZXR1cm5bZSx0XX1mdW5jdGlvbiBlcih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4hdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIG5yKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybi10LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gcnIodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P0pTT04uc3RyaW5naWZ5KHQpOlN0cmluZyh0KX1mdW5jdGlvbiBpcigpe3JldHVybiBqKGFyZ3VtZW50cyl9ZnVuY3Rpb24gb3IodCxlKXtyZXR1cm4gdDxlPzE6dD5lPy0xOjB9ZnVuY3Rpb24gdXIodCl7aWYodC5zaXplPT09MS8wKXJldHVybiAwO3ZhciBlPWYodCksbj1zKHQpLHI9ZT8xOjA7cmV0dXJuIHNyKHQuX19pdGVyYXRlKG4/ZT9mdW5jdGlvbih0LGUpe3I9MzEqcithcihEdCh0KSxEdChlKSl8MH06ZnVuY3Rpb24odCxlKXtyPXIrYXIoRHQodCksRHQoZSkpfDB9OmU/ZnVuY3Rpb24odCl7cj0zMSpyK0R0KHQpfDB9OmZ1bmN0aW9uKHQpe3I9citEdCh0KXwwfSkscil9ZnVuY3Rpb24gc3IodCxlKXtyZXR1cm4gZT1OdChlLDM0MzI5MTgzNTMpLGU9TnQoZTw8MTV8ZT4+Pi0xNSw0NjE4NDU5MDcpLGU9TnQoZTw8MTN8ZT4+Pi0xMyw1KSxlPU50KChlPShlKzM4NjQyOTIxOTZ8MCledCleZT4+PjE2LDIyNDY4MjI1MDcpLGU9U3QoKGU9TnQoZV5lPj4+MTMsMzI2NjQ4OTkwOSkpXmU+Pj4xNil9ZnVuY3Rpb24gYXIodCxlKXtyZXR1cm4gdF5lKzI2NTQ0MzU3NjkrKHQ8PDYpKyh0Pj4yKXwwfXJldHVybiBLbltwXT0hMCxLbltVXT1Ibi5lbnRyaWVzLEtuLl9fdG9KUz1Ibi50b09iamVjdCxLbi5fX3RvU3RyaW5nTWFwcGVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGUpKyI6ICIrcnIodCl9LFhuKGkse3RvS2V5ZWRTZXE6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEplKHRoaXMsITEpfSxmaWx0ZXI6ZnVuY3Rpb24odCxlKXtyZXR1cm4geW4odGhpcyx0bih0aGlzLHQsZSwhMSkpfSxmaW5kSW5kZXg6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmZpbmRFbnRyeSh0LGUpO3JldHVybiBuP25bMF06LTF9LGluZGV4T2Y6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5rZXlPZih0KTtyZXR1cm4gdm9pZCAwPT09ZT8tMTplfSxsYXN0SW5kZXhPZjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmxhc3RLZXlPZih0KTtyZXR1cm4gdm9pZCAwPT09ZT8tMTplfSxyZXZlcnNlOmZ1bmN0aW9uKCl7cmV0dXJuIHluKHRoaXMsJGUodGhpcywhMSkpfSxzbGljZTpmdW5jdGlvbih0LGUpe3JldHVybiB5bih0aGlzLHJuKHRoaXMsdCxlLCExKSl9LHNwbGljZTpmdW5jdGlvbih0LGUpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg7aWYoZT1NYXRoLm1heCgwfGUsMCksMD09PW58fDI9PT1uJiYhZSlyZXR1cm4gdGhpczt0PUEodCx0PDA/dGhpcy5jb3VudCgpOnRoaXMuc2l6ZSk7dmFyIHI9dGhpcy5zbGljZSgwLHQpO3JldHVybiB5bih0aGlzLDE9PT1uP3I6ci5jb25jYXQoaihhcmd1bWVudHMsMiksdGhpcy5zbGljZSh0K2UpKSl9LGZpbmRMYXN0SW5kZXg6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmZpbmRMYXN0RW50cnkodCxlKTtyZXR1cm4gbj9uWzBdOi0xfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldCgwKX0sZmxhdHRlbjpmdW5jdGlvbih0KXtyZXR1cm4geW4odGhpcyxhbih0aGlzLHQsITEpKX0sZ2V0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuKHQ9Uyh0aGlzLHQpKTwwfHx0aGlzLnNpemU9PT0xLzB8fHZvaWQgMCE9PXRoaXMuc2l6ZSYmdD50aGlzLnNpemU/ZTp0aGlzLmZpbmQoKGZ1bmN0aW9uKGUsbil7cmV0dXJuIG49PT10fSksdm9pZCAwLGUpfSxoYXM6ZnVuY3Rpb24odCl7cmV0dXJuKHQ9Uyh0aGlzLHQpKT49MCYmKHZvaWQgMCE9PXRoaXMuc2l6ZT90aGlzLnNpemU9PT0xLzB8fHQ8dGhpcy5zaXplOi0xIT09dGhpcy5pbmRleE9mKHQpKX0saW50ZXJwb3NlOmZ1bmN0aW9uKHQpe3JldHVybiB5bih0aGlzLGZuKHRoaXMsdCkpfSxpbnRlcmxlYXZlOmZ1bmN0aW9uKCl7dmFyIHQ9W3RoaXNdLmNvbmNhdChqKGFyZ3VtZW50cykpLGU9ZG4odGhpcy50b1NlcSgpLFYub2YsdCksbj1lLmZsYXR0ZW4oITApO3JldHVybiBlLnNpemUmJihuLnNpemU9ZS5zaXplKnQubGVuZ3RoKSx5bih0aGlzLG4pfSxrZXlTZXE6ZnVuY3Rpb24oKXtyZXR1cm4gX3QoMCx0aGlzLnNpemUpfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0KC0xKX0sc2tpcFdoaWxlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHluKHRoaXMsdW4odGhpcyx0LGUsITEpKX0semlwOmZ1bmN0aW9uKCl7cmV0dXJuIHluKHRoaXMsZG4odGhpcyxpcixbdGhpc10uY29uY2F0KGooYXJndW1lbnRzKSkpKX0semlwV2l0aDpmdW5jdGlvbih0KXt2YXIgZT1qKGFyZ3VtZW50cyk7cmV0dXJuIGVbMF09dGhpcyx5bih0aGlzLGRuKHRoaXMsdCxlKSl9fSksaS5wcm90b3R5cGVbaF09ITAsaS5wcm90b3R5cGVbZF09ITAsWG4obyx7Z2V0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuaGFzKHQpP3Q6ZX0saW5jbHVkZXM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaGFzKHQpfSxrZXlTZXE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZVNlcSgpfX0pLG8ucHJvdG90eXBlLmhhcz1Ibi5pbmNsdWRlcyxvLnByb3RvdHlwZS5jb250YWlucz1vLnByb3RvdHlwZS5pbmNsdWRlcyxYbihaLHIucHJvdG90eXBlKSxYbihWLGkucHJvdG90eXBlKSxYbihYLG8ucHJvdG90eXBlKSxYbihidCxyLnByb3RvdHlwZSksWG4oeHQsaS5wcm90b3R5cGUpLFhuKGp0LG8ucHJvdG90eXBlKSx7SXRlcmFibGU6bixTZXE6SixDb2xsZWN0aW9uOkx0LE1hcDpHdCxPcmRlcmVkTWFwOkZlLExpc3Q6eGUsU3RhY2s6Qm4sU2V0OkluLE9yZGVyZWRTZXQ6WW4sUmVjb3JkOmJuLFJhbmdlOl90LFJlcGVhdDpNdCxpczpndCxmcm9tSlM6aHR9fSgpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTMpLGk9bigxMDQpLmYsbz1uKDIzNyksdT1uKDEwKSxzPW4oMTA2KSxhPW4oMjQpLGM9bigyMSksZj1mdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbihlLG4scil7aWYodGhpcyBpbnN0YW5jZW9mIHQpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIG5ldyB0O2Nhc2UgMTpyZXR1cm4gbmV3IHQoZSk7Y2FzZSAyOnJldHVybiBuZXcgdChlLG4pfXJldHVybiBuZXcgdChlLG4scil9cmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtyZXR1cm4gZS5wcm90b3R5cGU9dC5wcm90b3R5cGUsZX07dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG4sbCxwLGgsZCx5LHYsZyx3PXQudGFyZ2V0LE09dC5nbG9iYWwsbT10LnN0YXQsXz10LnByb3RvLEw9TT9yOm0/clt3XTooclt3XXx8e30pLnByb3RvdHlwZSxiPU0/dTp1W3ddfHwodVt3XT17fSkseD1iLnByb3RvdHlwZTtmb3IocCBpbiBlKW49IW8oTT9wOncrKG0/Ii4iOiIjIikrcCx0LmZvcmNlZCkmJkwmJmMoTCxwKSxkPWJbcF0sbiYmKHk9dC5ub1RhcmdldEdldD8oZz1pKEwscCkpJiZnLnZhbHVlOkxbcF0pLGg9biYmeT95OmVbcF0sbiYmdHlwZW9mIGQ9PXR5cGVvZiBofHwodj10LmJpbmQmJm4/cyhoLHIpOnQud3JhcCYmbj9mKGgpOl8mJiJmdW5jdGlvbiI9PXR5cGVvZiBoP3MoRnVuY3Rpb24uY2FsbCxoKTpoLCh0LnNoYW18fGgmJmguc2hhbXx8ZCYmZC5zaGFtKSYmYSh2LCJzaGFtIiwhMCksYltwXT12LF8mJihjKHUsbD13KyJQcm90b3R5cGUiKXx8YSh1LGwse30pLHVbbF1bcF09aCx0LnJlYWwmJngmJiF4W3BdJiZhKHgscCxoKSkpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9bigyOTcpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMzE3KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTApLGk9bigyMSksbz1uKDExNiksdT1uKDMzKS5mO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT1yLlN5bWJvbHx8KHIuU3ltYm9sPXt9KTtpKGUsdCl8fHUoZSx0LHt2YWx1ZTpvLmYodCl9KX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigzNTIpfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXt0cnl7cmV0dXJuISF0KCl9Y2F0Y2godCl7cmV0dXJuITB9fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTMpLGk9bigxMTApLG89bigyMSksdT1uKDExMikscz1uKDExNSksYT1uKDE2MSksYz1pKCJ3a3MiKSxmPXIuU3ltYm9sLGw9YT9mOmYmJmYud2l0aG91dFNldHRlcnx8dTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG8oYyx0KSYmKHN8fCJzdHJpbmciPT10eXBlb2YgY1t0XSl8fChzJiZvKGYsdCk/Y1t0XT1mW3RdOmNbdF09bCgiU3ltYm9sLiIrdCkpLGNbdF19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiByW3QrIlByb3RvdHlwZSJdfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDMyMCl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPXt9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMzI1KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjsoZnVuY3Rpb24odCl7bi5kKGUsImQiLChmdW5jdGlvbigpe3JldHVybiBffSkpLG4uZChlLCJjIiwoZnVuY3Rpb24oKXtyZXR1cm4gTH0pKSxuLmQoZSwiYiIsKGZ1bmN0aW9uKCl7cmV0dXJuIHh9KSksbi5kKGUsImUiLChmdW5jdGlvbigpe3JldHVybiBqfSkpLG4uZChlLCJmIiwoZnVuY3Rpb24oKXtyZXR1cm4gTn0pKSxuLmQoZSwiYSIsKGZ1bmN0aW9uKCl7cmV0dXJuIFN9KSk7big1MiksbigyMjApO3ZhciByPW4oMTgpLGk9bi5uKHIpLG89KG4oMTQzKSxuKDUpKSx1PW4ubihvKSxzPW4oMTEpLGE9bi5uKHMpLGM9KG4oNzIpLG4oMyksbig5KSksZj1uLm4oYyksbD0obigyNyksbigyOCkpLHA9bi5uKGwpLGg9KG4oMjIxKSxuKDEwMyksbigxNDQpKSxkPW4ubihoKSx5PShuKDIyMiksbig1MCksbig1MSksbig0MCksbigxNDUpLG4oNDEpLG4oMTAyKSxuKDIyMyksbigyMjQpLG4oMCkpLHY9bi5uKHkpLGc9KG4oMjI1KSxuKDIyNiksbigxNDEpLG4oMTQyKSksdz1uLm4oZyksTT0obigyMjcpLG4oMTQ2KSxuKDQ5KSxuKDcwKSxuKDE0Nyksbig3MykpLG09KG4oMjI5KSxuKDIzMCksbigyMzEpLG4oMjMyKSxuKDcxKSxmdW5jdGlvbih0KXtyZXR1cm4gdi5hLkl0ZXJhYmxlLmlzSXRlcmFibGUodCl9KTtmdW5jdGlvbiBfKHQpe3JldHVybiBiKHQpP20odCk/dC50b0pTKCk6dDp7fX1mdW5jdGlvbiBMKHQpe3JldHVybiB1KCkodCk/dDpbdF19ZnVuY3Rpb24gYih0KXtyZXR1cm4hIXQmJiJvYmplY3QiPT09aSgpKHQpfWZ1bmN0aW9uIHgodCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHR9dy5hO3ZhciBqPWZ1bmN0aW9uKCl7dmFyIHQ9e30sZT1NLmEubG9jYXRpb24uc2VhcmNoO2lmKCFlKXJldHVybnt9O2lmKCIiIT1lKXt2YXIgbj1lLnN1YnN0cigxKS5zcGxpdCgiJiIpO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYocj1uW3JdLnNwbGl0KCI9IiksdFtkZWNvZGVVUklDb21wb25lbnQoclswXSldPXJbMV0mJmRlY29kZVVSSUNvbXBvbmVudChyWzFdKXx8IiIpfXJldHVybiB0fSxOPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiBhKCkoZT1wKCkodCkpLmNhbGwoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KHRbZV0pfSkpLmpvaW4oIiYiKX07ZnVuY3Rpb24gUyh0LGUpe3ZhciBuLHI9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOmZ1bmN0aW9uKCl7cmV0dXJuITB9O2lmKCJvYmplY3QiIT09aSgpKHQpfHx1KCkodCl8fG51bGw9PT10fHwhZSlyZXR1cm4gdDt2YXIgbz1kKCkoe30sdCk7cmV0dXJuIGYoKShuPXAoKShvKSkuY2FsbChuLChmdW5jdGlvbih0KXt0PT09ZSYmcihvW3RdLHQpP2RlbGV0ZSBvW3RdOm9bdF09UyhvW3RdLGUscil9KSksb319KS5jYWxsKHRoaXMsbigxMjIpLkJ1ZmZlcil9LGZ1bmN0aW9uKHQsZSxuKXsoZnVuY3Rpb24oZSl7dmFyIG49ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuTWF0aD09TWF0aCYmdH07dC5leHBvcnRzPW4oIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzJiZnbG9iYWxUaGlzKXx8bigib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93KXx8bigib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYpfHxuKCJvYmplY3QiPT10eXBlb2YgZSYmZSl8fGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCl8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9KS5jYWxsKHRoaXMsbigyMCkpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDkpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGUgaW4gdD9yKHQsZSx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnRbZV09bix0fSx0LmV4cG9ydHMuZGVmYXVsdD10LmV4cG9ydHMsdC5leHBvcnRzLl9fZXNNb2R1bGU9ITB9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdD9udWxsIT09dDoiZnVuY3Rpb24iPT10eXBlb2YgdH19LGZ1bmN0aW9uKHQsZSl7ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5jcmVhdGU/dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dC5zdXBlcl89ZSx0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6dCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KX06dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dC5zdXBlcl89ZTt2YXIgbj1mdW5jdGlvbigpe307bi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsdC5wcm90b3R5cGU9bmV3IG4sdC5wcm90b3R5cGUuY29uc3RydWN0b3I9dH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEyMiksaT1yLkJ1ZmZlcjtmdW5jdGlvbiBvKHQsZSl7Zm9yKHZhciBuIGluIHQpZVtuXT10W25dfWZ1bmN0aW9uIHUodCxlLG4pe3JldHVybiBpKHQsZSxuKX1pLmZyb20mJmkuYWxsb2MmJmkuYWxsb2NVbnNhZmUmJmkuYWxsb2NVbnNhZmVTbG93P3QuZXhwb3J0cz1yOihvKHIsZSksZS5CdWZmZXI9dSksbyhpLHUpLHUuZnJvbT1mdW5jdGlvbih0LGUsbil7aWYoIm51bWJlciI9PXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyIik7cmV0dXJuIGkodCxlLG4pfSx1LmFsbG9jPWZ1bmN0aW9uKHQsZSxuKXtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3ZhciByPWkodCk7cmV0dXJuIHZvaWQgMCE9PWU/InN0cmluZyI9PXR5cGVvZiBuP3IuZmlsbChlLG4pOnIuZmlsbChlKTpyLmZpbGwoMCkscn0sdS5hbGxvY1Vuc2FmZT1mdW5jdGlvbih0KXtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiBpKHQpfSx1LmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbih0KXtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlciIpO3JldHVybiByLlNsb3dCdWZmZXIodCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big4MCksaT1uKDI5MSk7ZnVuY3Rpb24gbyhlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgciYmInN5bWJvbCI9PXR5cGVvZiBpPyh0LmV4cG9ydHM9bz1mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9LHQuZXhwb3J0cy5kZWZhdWx0PXQuZXhwb3J0cyx0LmV4cG9ydHMuX19lc01vZHVsZT0hMCk6KHQuZXhwb3J0cz1vPWZ1bmN0aW9uKHQpe3JldHVybiB0JiYiZnVuY3Rpb24iPT10eXBlb2YgciYmdC5jb25zdHJ1Y3Rvcj09PXImJnQhPT1yLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgdH0sdC5leHBvcnRzLmRlZmF1bHQ9dC5leHBvcnRzLHQuZXhwb3J0cy5fX2VzTW9kdWxlPSEwKSxvKGUpfXQuZXhwb3J0cz1vLHQuZXhwb3J0cy5kZWZhdWx0PXQuZXhwb3J0cyx0LmV4cG9ydHMuX19lc01vZHVsZT0hMH0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0KHIodCkpfX0sZnVuY3Rpb24odCxlKXt2YXIgbjtuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCk7dHJ5e249bnx8bmV3IEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9Y2F0Y2godCl7Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJihuPXdpbmRvdyl9dC5leHBvcnRzPW59LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE5KSxpPXt9Lmhhc093blByb3BlcnR5O3QuZXhwb3J0cz1PYmplY3QuaGFzT3dufHxmdW5jdGlvbih0LGUpe3JldHVybiBpLmNhbGwocih0KSxlKX19LGZ1bmN0aW9uKHQsZSl7dmFyIG49QXJyYXkuaXNBcnJheTt0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNik7dC5leHBvcnRzPSFyKChmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sMSx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSlbMV19KSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIzKSxpPW4oMzMpLG89big1NCk7dC5leHBvcnRzPXI/ZnVuY3Rpb24odCxlLG4pe3JldHVybiBpLmYodCxlLG8oMSxuKSl9OmZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdFtlXT1uLHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxODYpLGk9Im9iamVjdCI9PXR5cGVvZiBzZWxmJiZzZWxmJiZzZWxmLk9iamVjdD09PU9iamVjdCYmc2VsZixvPXJ8fGl8fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCk7dC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gdH0sdC5leHBvcnRzLmRlZmF1bHQ9dC5leHBvcnRzLHQuZXhwb3J0cy5fX2VzTW9kdWxlPSEwfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMzU2KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDM2MCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoIXIodCkpdGhyb3cgVHlwZUVycm9yKFN0cmluZyh0KSsiIGlzIG5vdCBhbiBvYmplY3QiKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEwOCksaT1NYXRoLm1pbjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ+MD9pKHIodCksOTAwNzE5OTI1NDc0MDk5MSk6MH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IodCsiIGlzIG5vdCBhIGZ1bmN0aW9uIik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big3NCksaT1uKDQyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHIoaSh0KSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMyksaT1uKDE1MCksbz1uKDI5KSx1PW4oNzUpLHM9T2JqZWN0LmRlZmluZVByb3BlcnR5O2UuZj1yP3M6ZnVuY3Rpb24odCxlLG4pe2lmKG8odCksZT11KGUsITApLG8obiksaSl0cnl7cmV0dXJuIHModCxlLG4pfWNhdGNoKHQpe31pZigiZ2V0ImluIG58fCJzZXQiaW4gbil0aHJvdyBUeXBlRXJyb3IoIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIik7cmV0dXJuInZhbHVlImluIG4mJih0W2VdPW4udmFsdWUpLHR9fSxmdW5jdGlvbih0LGUpe3ZhciBuLHIsaT10LmV4cG9ydHM9e307ZnVuY3Rpb24gbygpe3Rocm93IG5ldyBFcnJvcigic2V0VGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIHUoKXt0aHJvdyBuZXcgRXJyb3IoImNsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCIpfWZ1bmN0aW9uIHModCl7aWYobj09PXNldFRpbWVvdXQpcmV0dXJuIHNldFRpbWVvdXQodCwwKTtpZigobj09PW98fCFuKSYmc2V0VGltZW91dClyZXR1cm4gbj1zZXRUaW1lb3V0LHNldFRpbWVvdXQodCwwKTt0cnl7cmV0dXJuIG4odCwwKX1jYXRjaChlKXt0cnl7cmV0dXJuIG4uY2FsbChudWxsLHQsMCl9Y2F0Y2goZSl7cmV0dXJuIG4uY2FsbCh0aGlzLHQsMCl9fX0hZnVuY3Rpb24oKXt0cnl7bj0iZnVuY3Rpb24iPT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0Om99Y2F0Y2godCl7bj1vfXRyeXtyPSJmdW5jdGlvbiI9PXR5cGVvZiBjbGVhclRpbWVvdXQ/Y2xlYXJUaW1lb3V0OnV9Y2F0Y2godCl7cj11fX0oKTt2YXIgYSxjPVtdLGY9ITEsbD0tMTtmdW5jdGlvbiBwKCl7ZiYmYSYmKGY9ITEsYS5sZW5ndGg/Yz1hLmNvbmNhdChjKTpsPS0xLGMubGVuZ3RoJiZoKCkpfWZ1bmN0aW9uIGgoKXtpZighZil7dmFyIHQ9cyhwKTtmPSEwO2Zvcih2YXIgZT1jLmxlbmd0aDtlOyl7Zm9yKGE9YyxjPVtdOysrbDxlOylhJiZhW2xdLnJ1bigpO2w9LTEsZT1jLmxlbmd0aH1hPW51bGwsZj0hMSxmdW5jdGlvbih0KXtpZihyPT09Y2xlYXJUaW1lb3V0KXJldHVybiBjbGVhclRpbWVvdXQodCk7aWYoKHI9PT11fHwhcikmJmNsZWFyVGltZW91dClyZXR1cm4gcj1jbGVhclRpbWVvdXQsY2xlYXJUaW1lb3V0KHQpO3RyeXtyKHQpfWNhdGNoKGUpe3RyeXtyZXR1cm4gci5jYWxsKG51bGwsdCl9Y2F0Y2goZSl7cmV0dXJuIHIuY2FsbCh0aGlzLHQpfX19KHQpfX1mdW5jdGlvbiBkKHQsZSl7dGhpcy5mdW49dCx0aGlzLmFycmF5PWV9ZnVuY3Rpb24geSgpe31pLm5leHRUaWNrPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSlmb3IodmFyIG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKWVbbi0xXT1hcmd1bWVudHNbbl07Yy5wdXNoKG5ldyBkKHQsZSkpLDEhPT1jLmxlbmd0aHx8Znx8cyhoKX0sZC5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7dGhpcy5mdW4uYXBwbHkobnVsbCx0aGlzLmFycmF5KX0saS50aXRsZT0iYnJvd3NlciIsaS5icm93c2VyPSEwLGkuZW52PXt9LGkuYXJndj1bXSxpLnZlcnNpb249IiIsaS52ZXJzaW9ucz17fSxpLm9uPXksaS5hZGRMaXN0ZW5lcj15LGkub25jZT15LGkub2ZmPXksaS5yZW1vdmVMaXN0ZW5lcj15LGkucmVtb3ZlQWxsTGlzdGVuZXJzPXksaS5lbWl0PXksaS5wcmVwZW5kTGlzdGVuZXI9eSxpLnByZXBlbmRPbmNlTGlzdGVuZXI9eSxpLmxpc3RlbmVycz1mdW5jdGlvbih0KXtyZXR1cm5bXX0saS5iaW5kaW5nPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigicHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQiKX0saS5jd2Q9ZnVuY3Rpb24oKXtyZXR1cm4iLyJ9LGkuY2hkaXI9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQiKX0saS51bWFzaz1mdW5jdGlvbigpe3JldHVybiAwfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDk1KSxpPU9iamVjdC5rZXlzfHxmdW5jdGlvbih0KXt2YXIgZT1bXTtmb3IodmFyIG4gaW4gdCllLnB1c2gobik7cmV0dXJuIGV9O3QuZXhwb3J0cz1sO3ZhciBvPW4oNjkpO28uaW5oZXJpdHM9bigxNik7dmFyIHU9bigyMDEpLHM9bigxMzcpO28uaW5oZXJpdHMobCx1KTtmb3IodmFyIGE9aShzLnByb3RvdHlwZSksYz0wO2M8YS5sZW5ndGg7YysrKXt2YXIgZj1hW2NdO2wucHJvdG90eXBlW2ZdfHwobC5wcm90b3R5cGVbZl09cy5wcm90b3R5cGVbZl0pfWZ1bmN0aW9uIGwodCl7aWYoISh0aGlzIGluc3RhbmNlb2YgbCkpcmV0dXJuIG5ldyBsKHQpO3UuY2FsbCh0aGlzLHQpLHMuY2FsbCh0aGlzLHQpLHQmJiExPT09dC5yZWFkYWJsZSYmKHRoaXMucmVhZGFibGU9ITEpLHQmJiExPT09dC53cml0YWJsZSYmKHRoaXMud3JpdGFibGU9ITEpLHRoaXMuYWxsb3dIYWxmT3Blbj0hMCx0JiYhMT09PXQuYWxsb3dIYWxmT3BlbiYmKHRoaXMuYWxsb3dIYWxmT3Blbj0hMSksdGhpcy5vbmNlKCJlbmQiLHApfWZ1bmN0aW9uIHAoKXt0aGlzLmFsbG93SGFsZk9wZW58fHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWR8fHIubmV4dFRpY2soaCx0aGlzKX1mdW5jdGlvbiBoKHQpe3QuZW5kKCl9T2JqZWN0LmRlZmluZVByb3BlcnR5KGwucHJvdG90eXBlLCJ3cml0YWJsZUhpZ2hXYXRlck1hcmsiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcmt9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGwucHJvdG90eXBlLCJkZXN0cm95ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fcmVhZGFibGVTdGF0ZSYmdm9pZCAwIT09dGhpcy5fd3JpdGFibGVTdGF0ZSYmKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkJiZ0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZCl9LHNldDpmdW5jdGlvbih0KXt2b2lkIDAhPT10aGlzLl9yZWFkYWJsZVN0YXRlJiZ2b2lkIDAhPT10aGlzLl93cml0YWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ9dCx0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD10KX19KSxsLnByb3RvdHlwZS5fZGVzdHJveT1mdW5jdGlvbih0LGUpe3RoaXMucHVzaChudWxsKSx0aGlzLmVuZCgpLHIubmV4dFRpY2soZSx0KX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big1MzQpKCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0IT09ciYmbnVsbCE9PXR9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNTM1KSxpPU1hdGgubWF4O3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gaSgwLHIodCkpfX0sZnVuY3Rpb24odCxlLG4pe30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDIxMiksaT1uKDU0OSksbz1uKDIwOSksdT1uKDIwNykscz1uKDU1Myk7KHQuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuLGksYSxjLGY7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mnx8InN0cmluZyIhPXR5cGVvZiB0PyhjPWUsZT10LHQ9bnVsbCk6Yz1hcmd1bWVudHNbMl0scih0KT8obj1zLmNhbGwodCwiYyIpLGk9cy5jYWxsKHQsImUiKSxhPXMuY2FsbCh0LCJ3IikpOihuPWE9ITAsaT0hMSksZj17dmFsdWU6ZSxjb25maWd1cmFibGU6bixlbnVtZXJhYmxlOmksd3JpdGFibGU6YX0sYz9vKHUoYyksZik6Zn0pLmdzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgYSxjLGYsbDtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIHQ/KGY9bixuPWUsZT10LHQ9bnVsbCk6Zj1hcmd1bWVudHNbM10scihlKT9pKGUpP3Iobik/aShuKXx8KGY9bixuPXZvaWQgMCk6bj12b2lkIDA6KGY9ZSxlPW49dm9pZCAwKTplPXZvaWQgMCxyKHQpPyhhPXMuY2FsbCh0LCJjIiksYz1zLmNhbGwodCwiZSIpKTooYT0hMCxjPSExKSxsPXtnZXQ6ZSxzZXQ6bixjb25maWd1cmFibGU6YSxlbnVtZXJhYmxlOmN9LGY/byh1KGYpLGwpOmx9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMzkwKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDQwMCl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAiK3QpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTA2KSxpPW4oNzQpLG89bigxOSksdT1uKDMwKSxzPW4oMTYwKSxhPVtdLnB1c2gsYz1mdW5jdGlvbih0KXt2YXIgZT0xPT10LG49Mj09dCxjPTM9PXQsZj00PT10LGw9Nj09dCxwPTc9PXQsaD01PT10fHxsO3JldHVybiBmdW5jdGlvbihkLHksdixnKXtmb3IodmFyIHcsTSxtPW8oZCksXz1pKG0pLEw9cih5LHYsMyksYj11KF8ubGVuZ3RoKSx4PTAsaj1nfHxzLE49ZT9qKGQsYik6bnx8cD9qKGQsMCk6dm9pZCAwO2I+eDt4KyspaWYoKGh8fHggaW4gXykmJihNPUwodz1fW3hdLHgsbSksdCkpaWYoZSlOW3hdPU07ZWxzZSBpZihNKXN3aXRjaCh0KXtjYXNlIDM6cmV0dXJuITA7Y2FzZSA1OnJldHVybiB3O2Nhc2UgNjpyZXR1cm4geDtjYXNlIDI6YS5jYWxsKE4sdyl9ZWxzZSBzd2l0Y2godCl7Y2FzZSA0OnJldHVybiExO2Nhc2UgNzphLmNhbGwoTix3KX1yZXR1cm4gbD8tMTpjfHxmP2Y6Tn19O3QuZXhwb3J0cz17Zm9yRWFjaDpjKDApLG1hcDpjKDEpLGZpbHRlcjpjKDIpLHNvbWU6YygzKSxldmVyeTpjKDQpLGZpbmQ6Yyg1KSxmaW5kSW5kZXg6Yyg2KSxmaWx0ZXJPdXQ6Yyg3KX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPXt9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNjIpLGk9bigxNzMpLG89KG4oMTIxKSxuKDE3MiksT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSksdT1uKDE3NCkscz17a2V5OiEwLHJlZjohMCxfX3NlbGY6ITAsX19zb3VyY2U6ITB9O2Z1bmN0aW9uIGEodCl7cmV0dXJuIHZvaWQgMCE9PXQucmVmfWZ1bmN0aW9uIGModCl7cmV0dXJuIHZvaWQgMCE9PXQua2V5fXZhciBmPWZ1bmN0aW9uKHQsZSxuLHIsaSxvLHMpe3JldHVybnskJHR5cGVvZjp1LHR5cGU6dCxrZXk6ZSxyZWY6bixwcm9wczpzLF9vd25lcjpvfX07Zi5jcmVhdGVFbGVtZW50PWZ1bmN0aW9uKHQsZSxuKXt2YXIgcix1PXt9LGw9bnVsbCxwPW51bGw7aWYobnVsbCE9ZSlmb3IociBpbiBhKGUpJiYocD1lLnJlZiksYyhlKSYmKGw9IiIrZS5rZXkpLHZvaWQgMD09PWUuX19zZWxmP251bGw6ZS5fX3NlbGYsdm9pZCAwPT09ZS5fX3NvdXJjZT9udWxsOmUuX19zb3VyY2UsZSlvLmNhbGwoZSxyKSYmIXMuaGFzT3duUHJvcGVydHkocikmJih1W3JdPWVbcl0pO3ZhciBoPWFyZ3VtZW50cy5sZW5ndGgtMjtpZigxPT09aCl1LmNoaWxkcmVuPW47ZWxzZSBpZihoPjEpe2Zvcih2YXIgZD1BcnJheShoKSx5PTA7eTxoO3krKylkW3ldPWFyZ3VtZW50c1t5KzJdOzAsdS5jaGlsZHJlbj1kfWlmKHQmJnQuZGVmYXVsdFByb3BzKXt2YXIgdj10LmRlZmF1bHRQcm9wcztmb3IociBpbiB2KXZvaWQgMD09PXVbcl0mJih1W3JdPXZbcl0pfXJldHVybiBmKHQsbCxwLDAsMCxpLmN1cnJlbnQsdSl9LGYuY3JlYXRlRmFjdG9yeT1mdW5jdGlvbih0KXt2YXIgZT1mLmNyZWF0ZUVsZW1lbnQuYmluZChudWxsLHQpO3JldHVybiBlLnR5cGU9dCxlfSxmLmNsb25lQW5kUmVwbGFjZUtleT1mdW5jdGlvbih0LGUpe3JldHVybiBmKHQudHlwZSxlLHQucmVmLHQuX3NlbGYsdC5fc291cmNlLHQuX293bmVyLHQucHJvcHMpfSxmLmNsb25lRWxlbWVudD1mdW5jdGlvbih0LGUsbil7dmFyIHUsbCxwPXIoe30sdC5wcm9wcyksaD10LmtleSxkPXQucmVmLHk9KHQuX3NlbGYsdC5fc291cmNlLHQuX293bmVyKTtpZihudWxsIT1lKWZvcih1IGluIGEoZSkmJihkPWUucmVmLHk9aS5jdXJyZW50KSxjKGUpJiYoaD0iIitlLmtleSksdC50eXBlJiZ0LnR5cGUuZGVmYXVsdFByb3BzJiYobD10LnR5cGUuZGVmYXVsdFByb3BzKSxlKW8uY2FsbChlLHUpJiYhcy5oYXNPd25Qcm9wZXJ0eSh1KSYmKHZvaWQgMD09PWVbdV0mJnZvaWQgMCE9PWw/cFt1XT1sW3VdOnBbdV09ZVt1XSk7dmFyIHY9YXJndW1lbnRzLmxlbmd0aC0yO2lmKDE9PT12KXAuY2hpbGRyZW49bjtlbHNlIGlmKHY+MSl7Zm9yKHZhciBnPUFycmF5KHYpLHc9MDt3PHY7dysrKWdbd109YXJndW1lbnRzW3crMl07cC5jaGlsZHJlbj1nfXJldHVybiBmKHQudHlwZSxoLGQsMCwwLHkscCl9LGYuaXNWYWxpZEVsZW1lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT09dCYmdC4kJHR5cGVvZj09PXV9LHQuZXhwb3J0cz1mfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0NDEpLGk9big0NDQpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPWkodCxlKTtyZXR1cm4gcihuKT9uOnZvaWQgMH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigzNik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCFyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCB1c2UgbnVsbCBvciB1bmRlZmluZWQiKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE3KS5CdWZmZXI7ZnVuY3Rpb24gaSh0LGUpe3RoaXMuX2Jsb2NrPXIuYWxsb2ModCksdGhpcy5fZmluYWxTaXplPWUsdGhpcy5fYmxvY2tTaXplPXQsdGhpcy5fbGVuPTB9aS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQsZSl7InN0cmluZyI9PXR5cGVvZiB0JiYoZT1lfHwidXRmOCIsdD1yLmZyb20odCxlKSk7Zm9yKHZhciBuPXRoaXMuX2Jsb2NrLGk9dGhpcy5fYmxvY2tTaXplLG89dC5sZW5ndGgsdT10aGlzLl9sZW4scz0wO3M8bzspe2Zvcih2YXIgYT11JWksYz1NYXRoLm1pbihvLXMsaS1hKSxmPTA7ZjxjO2YrKyluW2ErZl09dFtzK2ZdO3MrPWMsKHUrPWMpJWk9PTAmJnRoaXMuX3VwZGF0ZShuKX1yZXR1cm4gdGhpcy5fbGVuKz1vLHRoaXN9LGkucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9sZW4ldGhpcy5fYmxvY2tTaXplO3RoaXMuX2Jsb2NrW2VdPTEyOCx0aGlzLl9ibG9jay5maWxsKDAsZSsxKSxlPj10aGlzLl9maW5hbFNpemUmJih0aGlzLl91cGRhdGUodGhpcy5fYmxvY2spLHRoaXMuX2Jsb2NrLmZpbGwoMCkpO3ZhciBuPTgqdGhpcy5fbGVuO2lmKG48PTQyOTQ5NjcyOTUpdGhpcy5fYmxvY2sud3JpdGVVSW50MzJCRShuLHRoaXMuX2Jsb2NrU2l6ZS00KTtlbHNle3ZhciByPSg0Mjk0OTY3Mjk1Jm4pPj4+MCxpPShuLXIpLzQyOTQ5NjcyOTY7dGhpcy5fYmxvY2sud3JpdGVVSW50MzJCRShpLHRoaXMuX2Jsb2NrU2l6ZS04KSx0aGlzLl9ibG9jay53cml0ZVVJbnQzMkJFKHIsdGhpcy5fYmxvY2tTaXplLTQpfXRoaXMuX3VwZGF0ZSh0aGlzLl9ibG9jayk7dmFyIG89dGhpcy5faGFzaCgpO3JldHVybiB0P28udG9TdHJpbmcodCk6b30saS5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiX3VwZGF0ZSBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzIil9LHQuZXhwb3J0cz1pfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiB0PT09ZXx8dCE9dCYmZSE9ZX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigzODUpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMzg2KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzMxKSxpPW4oMzM0KSxvPW4oMTI1KSx1PW4oMzQ4KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHIodCl8fGkodCl8fG8odCl8fHUoKX0sdC5leHBvcnRzLmRlZmF1bHQ9dC5leHBvcnRzLHQuZXhwb3J0cy5fX2VzTW9kdWxlPSEwfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxOTQpLGk9bigxOTYpLG89bigxMjkpLHU9bigyMikscz1uKDY4KSxhPW4oMTMwKSxjPW4oMTk1KSxmPW4oMTMyKSxsPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuITA7aWYocyh0KSYmKHUodCl8fCJzdHJpbmciPT10eXBlb2YgdHx8ImZ1bmN0aW9uIj09dHlwZW9mIHQuc3BsaWNlfHxhKHQpfHxmKHQpfHxvKHQpKSlyZXR1cm4hdC5sZW5ndGg7dmFyIGU9aSh0KTtpZigiW29iamVjdCBNYXBdIj09ZXx8IltvYmplY3QgU2V0XSI9PWUpcmV0dXJuIXQuc2l6ZTtpZihjKHQpKXJldHVybiFyKHQpLmxlbmd0aDtmb3IodmFyIG4gaW4gdClpZihsLmNhbGwodCxuKSlyZXR1cm4hMTtyZXR1cm4hMH19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJue2VudW1lcmFibGU6ISgxJnQpLGNvbmZpZ3VyYWJsZTohKDImdCksd3JpdGFibGU6ISg0JnQpLHZhbHVlOmV9fX0sZnVuY3Rpb24odCxlKXt2YXIgbj17fS50b1N0cmluZzt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG4uY2FsbCh0KS5zbGljZSg4LC0xKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IFR5cGVFcnJvcihTdHJpbmcodCkrIiBpcyBub3QgYSBmdW5jdGlvbiIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTApLGk9bigxMyksbz1mdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90OnZvaWQgMH07dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj9vKHJbdF0pfHxvKGlbdF0pOnJbdF0mJnJbdF1bZV18fGlbdF0mJmlbdF1bZV19fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz0hMH0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNTUpO3QuZXhwb3J0cz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbih0KXtyZXR1cm4iQXJyYXkiPT1yKHQpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByLGksbz1uKDEzKSx1PW4oODEpLHM9by5wcm9jZXNzLGE9cyYmcy52ZXJzaW9ucyxjPWEmJmEudjg7Yz9pPShyPWMuc3BsaXQoIi4iKSlbMF08ND8xOnJbMF0rclsxXTp1JiYoIShyPXUubWF0Y2goL0VkZ2VcLyhcZCspLykpfHxyWzFdPj03NCkmJihyPXUubWF0Y2goL0Nocm9tZVwvKFxkKykvKSkmJihpPXJbMV0pLHQuZXhwb3J0cz1pJiYraX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTE3KSxpPW4oNTUpLG89big3KSgidG9TdHJpbmdUYWciKSx1PSJBcmd1bWVudHMiPT1pKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSk7dC5leHBvcnRzPXI/aTpmdW5jdGlvbih0KXt2YXIgZSxuLHI7cmV0dXJuIHZvaWQgMD09PXQ/IlVuZGVmaW5lZCI6bnVsbD09PXQ/Ik51bGwiOiJzdHJpbmciPT10eXBlb2Yobj1mdW5jdGlvbih0LGUpe3RyeXtyZXR1cm4gdFtlXX1jYXRjaCh0KXt9fShlPU9iamVjdCh0KSxvKSk/bjp1P2koZSk6Ik9iamVjdCI9PShyPWkoZSkpJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5jYWxsZWU/IkFyZ3VtZW50cyI6cn19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxpPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksbz1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO2Z1bmN0aW9uIHUodCl7aWYobnVsbD09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QuYXNzaWduIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBudWxsIG9yIHVuZGVmaW5lZCIpO3JldHVybiBPYmplY3QodCl9dC5leHBvcnRzPWZ1bmN0aW9uKCl7dHJ5e2lmKCFPYmplY3QuYXNzaWduKXJldHVybiExO3ZhciB0PW5ldyBTdHJpbmcoImFiYyIpO2lmKHRbNV09ImRlIiwiNSI9PT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0KVswXSlyZXR1cm4hMTtmb3IodmFyIGU9e30sbj0wO248MTA7bisrKWVbIl8iK1N0cmluZy5mcm9tQ2hhckNvZGUobildPW47aWYoIjAxMjM0NTY3ODkiIT09T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gZVt0XX0pKS5qb2luKCIiKSlyZXR1cm4hMTt2YXIgcj17fTtyZXR1cm4iYWJjZGVmZ2hpamtsbW5vcHFyc3QiLnNwbGl0KCIiKS5mb3JFYWNoKChmdW5jdGlvbih0KXtyW3RdPXR9KSksImFiY2RlZmdoaWprbG1ub3BxcnN0Ij09PU9iamVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30scikpLmpvaW4oIiIpfWNhdGNoKHQpe3JldHVybiExfX0oKT9PYmplY3QuYXNzaWduOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuLHMsYT11KHQpLGM9MTtjPGFyZ3VtZW50cy5sZW5ndGg7YysrKXtmb3IodmFyIGYgaW4gbj1PYmplY3QoYXJndW1lbnRzW2NdKSlpLmNhbGwobixmKSYmKGFbZl09bltmXSk7aWYocil7cz1yKG4pO2Zvcih2YXIgbD0wO2w8cy5sZW5ndGg7bCsrKW8uY2FsbChuLHNbbF0pJiYoYVtzW2xdXT1uW3NbbF1dKX19cmV0dXJuIGF9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49W11bdF07cmV0dXJuISFuJiZyKChmdW5jdGlvbigpe24uY2FsbChudWxsLGV8fGZ1bmN0aW9uKCl7dGhyb3cgMX0sMSl9KSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0MTkpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD8iIjpyKHQpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oODcpLGk9big0MjEpLG89big0MjIpLHU9cj9yLnRvU3RyaW5nVGFnOnZvaWQgMDt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dm9pZCAwPT09dD8iW29iamVjdCBVbmRlZmluZWRdIjoiW29iamVjdCBOdWxsXSI6dSYmdSBpbiBPYmplY3QodCk/aSh0KTpvKHQpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJiJvYmplY3QiPT10eXBlb2YgdH19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiBudWxsIT10JiYoIm9iamVjdCI9PWV8fCJmdW5jdGlvbiI9PWUpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNzApLGk9bigxMzMpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmaSh0Lmxlbmd0aCkmJiFyKHQpfX0sZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbih0KXtmdW5jdGlvbiBuKHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZS5pc0FycmF5PWZ1bmN0aW9uKHQpe3JldHVybiBBcnJheS5pc0FycmF5P0FycmF5LmlzQXJyYXkodCk6IltvYmplY3QgQXJyYXldIj09PW4odCl9LGUuaXNCb29sZWFuPWZ1bmN0aW9uKHQpe3JldHVybiJib29sZWFuIj09dHlwZW9mIHR9LGUuaXNOdWxsPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dH0sZS5pc051bGxPclVuZGVmaW5lZD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dH0sZS5pc051bWJlcj1mdW5jdGlvbih0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHR9LGUuaXNTdHJpbmc9ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fSxlLmlzU3ltYm9sPWZ1bmN0aW9uKHQpe3JldHVybiJzeW1ib2wiPT10eXBlb2YgdH0sZS5pc1VuZGVmaW5lZD1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dH0sZS5pc1JlZ0V4cD1mdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBSZWdFeHBdIj09PW4odCl9LGUuaXNPYmplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT09dH0sZS5pc0RhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgRGF0ZV0iPT09bih0KX0sZS5pc0Vycm9yPWZ1bmN0aW9uKHQpe3JldHVybiJbb2JqZWN0IEVycm9yXSI9PT1uKHQpfHx0IGluc3RhbmNlb2YgRXJyb3J9LGUuaXNGdW5jdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdH0sZS5pc1ByaW1pdGl2ZT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09PXR8fCJib29sZWFuIj09dHlwZW9mIHR8fCJudW1iZXIiPT10eXBlb2YgdHx8InN0cmluZyI9PXR5cGVvZiB0fHwic3ltYm9sIj09dHlwZW9mIHR8fHZvaWQgMD09PXR9LGUuaXNCdWZmZXI9dC5pc0J1ZmZlcn0pLmNhbGwodGhpcyxuKDEyMikuQnVmZmVyKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNjUpLGk9big2Nyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCFpKHQpKXJldHVybiExO3ZhciBlPXIodCk7cmV0dXJuIltvYmplY3QgRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIj09ZXx8IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBQcm94eV0iPT1lfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKHQpe3JldHVybiBudWxsPT10fXZhciBpPXtpc05vdGhpbmc6cixpc09iamVjdDpmdW5jdGlvbih0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10fSx0b0FycmF5OmZ1bmN0aW9uKHQpe3JldHVybiBBcnJheS5pc0FycmF5KHQpP3Q6cih0KT9bXTpbdF19LHJlcGVhdDpmdW5jdGlvbih0LGUpe3ZhciBuLHI9IiI7Zm9yKG49MDtuPGU7bis9MSlyKz10O3JldHVybiByfSxpc05lZ2F0aXZlWmVybzpmdW5jdGlvbih0KXtyZXR1cm4gMD09PXQmJk51bWJlci5ORUdBVElWRV9JTkZJTklUWT09PTEvdH0sZXh0ZW5kOmZ1bmN0aW9uKHQsZSl7dmFyIG4scixpLG87aWYoZSlmb3Iobj0wLHI9KG89T2JqZWN0LmtleXMoZSkpLmxlbmd0aDtuPHI7bis9MSl0W2k9b1tuXV09ZVtpXTtyZXR1cm4gdH19O2Z1bmN0aW9uIG8odCxlKXt2YXIgbj0iIixyPXQucmVhc29ufHwiKHVua25vd24gcmVhc29uKSI7cmV0dXJuIHQubWFyaz8odC5tYXJrLm5hbWUmJihuKz0naW4gIicrdC5tYXJrLm5hbWUrJyIgJyksbis9IigiKyh0Lm1hcmsubGluZSsxKSsiOiIrKHQubWFyay5jb2x1bW4rMSkrIikiLCFlJiZ0Lm1hcmsuc25pcHBldCYmKG4rPSJcblxuIit0Lm1hcmsuc25pcHBldCkscisiICIrbik6cn1mdW5jdGlvbiB1KHQsZSl7RXJyb3IuY2FsbCh0aGlzKSx0aGlzLm5hbWU9IllBTUxFeGNlcHRpb24iLHRoaXMucmVhc29uPXQsdGhpcy5tYXJrPWUsdGhpcy5tZXNzYWdlPW8odGhpcywhMSksRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2U/RXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcyx0aGlzLmNvbnN0cnVjdG9yKTp0aGlzLnN0YWNrPShuZXcgRXJyb3IpLnN0YWNrfHwiIn11LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSksdS5wcm90b3R5cGUuY29uc3RydWN0b3I9dSx1LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5uYW1lKyI6ICIrbyh0aGlzLHQpfTt2YXIgcz11O2Z1bmN0aW9uIGEodCxlLG4scixpKXt2YXIgbz0iIix1PSIiLHM9TWF0aC5mbG9vcihpLzIpLTE7cmV0dXJuIHItZT5zJiYoZT1yLXMrKG89IiAuLi4gIikubGVuZ3RoKSxuLXI+cyYmKG49citzLSh1PSIgLi4uIikubGVuZ3RoKSx7c3RyOm8rdC5zbGljZShlLG4pLnJlcGxhY2UoL1x0L2csIuKGkiIpK3UscG9zOnItZStvLmxlbmd0aH19ZnVuY3Rpb24gYyh0LGUpe3JldHVybiBpLnJlcGVhdCgiICIsZS10Lmxlbmd0aCkrdH12YXIgZj1mdW5jdGlvbih0LGUpe2lmKGU9T2JqZWN0LmNyZWF0ZShlfHxudWxsKSwhdC5idWZmZXIpcmV0dXJuIG51bGw7ZS5tYXhMZW5ndGh8fChlLm1heExlbmd0aD03OSksIm51bWJlciIhPXR5cGVvZiBlLmluZGVudCYmKGUuaW5kZW50PTEpLCJudW1iZXIiIT10eXBlb2YgZS5saW5lc0JlZm9yZSYmKGUubGluZXNCZWZvcmU9MyksIm51bWJlciIhPXR5cGVvZiBlLmxpbmVzQWZ0ZXImJihlLmxpbmVzQWZ0ZXI9Mik7Zm9yKHZhciBuLHI9L1xyP1xufFxyfFwwL2csbz1bMF0sdT1bXSxzPS0xO249ci5leGVjKHQuYnVmZmVyKTspdS5wdXNoKG4uaW5kZXgpLG8ucHVzaChuLmluZGV4K25bMF0ubGVuZ3RoKSx0LnBvc2l0aW9uPD1uLmluZGV4JiZzPDAmJihzPW8ubGVuZ3RoLTIpO3M8MCYmKHM9by5sZW5ndGgtMSk7dmFyIGYsbCxwPSIiLGg9TWF0aC5taW4odC5saW5lK2UubGluZXNBZnRlcix1Lmxlbmd0aCkudG9TdHJpbmcoKS5sZW5ndGgsZD1lLm1heExlbmd0aC0oZS5pbmRlbnQraCszKTtmb3IoZj0xO2Y8PWUubGluZXNCZWZvcmUmJiEocy1mPDApO2YrKylsPWEodC5idWZmZXIsb1tzLWZdLHVbcy1mXSx0LnBvc2l0aW9uLShvW3NdLW9bcy1mXSksZCkscD1pLnJlcGVhdCgiICIsZS5pbmRlbnQpK2MoKHQubGluZS1mKzEpLnRvU3RyaW5nKCksaCkrIiB8ICIrbC5zdHIrIlxuIitwO2ZvcihsPWEodC5idWZmZXIsb1tzXSx1W3NdLHQucG9zaXRpb24sZCkscCs9aS5yZXBlYXQoIiAiLGUuaW5kZW50KStjKCh0LmxpbmUrMSkudG9TdHJpbmcoKSxoKSsiIHwgIitsLnN0cisiXG4iLHArPWkucmVwZWF0KCItIixlLmluZGVudCtoKzMrbC5wb3MpKyJeXG4iLGY9MTtmPD1lLmxpbmVzQWZ0ZXImJiEocytmPj11Lmxlbmd0aCk7ZisrKWw9YSh0LmJ1ZmZlcixvW3MrZl0sdVtzK2ZdLHQucG9zaXRpb24tKG9bc10tb1tzK2ZdKSxkKSxwKz1pLnJlcGVhdCgiICIsZS5pbmRlbnQpK2MoKHQubGluZStmKzEpLnRvU3RyaW5nKCksaCkrIiB8ICIrbC5zdHIrIlxuIjtyZXR1cm4gcC5yZXBsYWNlKC9cbiQvLCIiKX0sbD1bImtpbmQiLCJtdWx0aSIsInJlc29sdmUiLCJjb25zdHJ1Y3QiLCJpbnN0YW5jZU9mIiwicHJlZGljYXRlIiwicmVwcmVzZW50IiwicmVwcmVzZW50TmFtZSIsImRlZmF1bHRTdHlsZSIsInN0eWxlQWxpYXNlcyJdLHA9WyJzY2FsYXIiLCJzZXF1ZW5jZSIsIm1hcHBpbmciXTt2YXIgaD1mdW5jdGlvbih0LGUpe2lmKGU9ZXx8e30sT2JqZWN0LmtleXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aWYoLTE9PT1sLmluZGV4T2YoZSkpdGhyb3cgbmV3IHMoJ1Vua25vd24gb3B0aW9uICInK2UrJyIgaXMgbWV0IGluIGRlZmluaXRpb24gb2YgIicrdCsnIiBZQU1MIHR5cGUuJyl9KSksdGhpcy5vcHRpb25zPWUsdGhpcy50YWc9dCx0aGlzLmtpbmQ9ZS5raW5kfHxudWxsLHRoaXMucmVzb2x2ZT1lLnJlc29sdmV8fGZ1bmN0aW9uKCl7cmV0dXJuITB9LHRoaXMuY29uc3RydWN0PWUuY29uc3RydWN0fHxmdW5jdGlvbih0KXtyZXR1cm4gdH0sdGhpcy5pbnN0YW5jZU9mPWUuaW5zdGFuY2VPZnx8bnVsbCx0aGlzLnByZWRpY2F0ZT1lLnByZWRpY2F0ZXx8bnVsbCx0aGlzLnJlcHJlc2VudD1lLnJlcHJlc2VudHx8bnVsbCx0aGlzLnJlcHJlc2VudE5hbWU9ZS5yZXByZXNlbnROYW1lfHxudWxsLHRoaXMuZGVmYXVsdFN0eWxlPWUuZGVmYXVsdFN0eWxlfHxudWxsLHRoaXMubXVsdGk9ZS5tdWx0aXx8ITEsdGhpcy5zdHlsZUFsaWFzZXM9ZnVuY3Rpb24odCl7dmFyIGU9e307cmV0dXJuIG51bGwhPT10JiZPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChmdW5jdGlvbihuKXt0W25dLmZvckVhY2goKGZ1bmN0aW9uKHQpe2VbU3RyaW5nKHQpXT1ufSkpfSkpLGV9KGUuc3R5bGVBbGlhc2VzfHxudWxsKSwtMT09PXAuaW5kZXhPZih0aGlzLmtpbmQpKXRocm93IG5ldyBzKCdVbmtub3duIGtpbmQgIicrdGhpcy5raW5kKyciIGlzIHNwZWNpZmllZCBmb3IgIicrdCsnIiBZQU1MIHR5cGUuJyl9O2Z1bmN0aW9uIGQodCxlKXt2YXIgbj1bXTtyZXR1cm4gdFtlXS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT1uLmxlbmd0aDtuLmZvckVhY2goKGZ1bmN0aW9uKG4scil7bi50YWc9PT10LnRhZyYmbi5raW5kPT09dC5raW5kJiZuLm11bHRpPT09dC5tdWx0aSYmKGU9cil9KSksbltlXT10fSkpLG59ZnVuY3Rpb24geSh0KXtyZXR1cm4gdGhpcy5leHRlbmQodCl9eS5wcm90b3R5cGUuZXh0ZW5kPWZ1bmN0aW9uKHQpe3ZhciBlPVtdLG49W107aWYodCBpbnN0YW5jZW9mIGgpbi5wdXNoKHQpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheSh0KSluPW4uY29uY2F0KHQpO2Vsc2V7aWYoIXR8fCFBcnJheS5pc0FycmF5KHQuaW1wbGljaXQpJiYhQXJyYXkuaXNBcnJheSh0LmV4cGxpY2l0KSl0aHJvdyBuZXcgcygiU2NoZW1hLmV4dGVuZCBhcmd1bWVudCBzaG91bGQgYmUgYSBUeXBlLCBbIFR5cGUgXSwgb3IgYSBzY2hlbWEgZGVmaW5pdGlvbiAoeyBpbXBsaWNpdDogWy4uLl0sIGV4cGxpY2l0OiBbLi4uXSB9KSIpO3QuaW1wbGljaXQmJihlPWUuY29uY2F0KHQuaW1wbGljaXQpKSx0LmV4cGxpY2l0JiYobj1uLmNvbmNhdCh0LmV4cGxpY2l0KSl9ZS5mb3JFYWNoKChmdW5jdGlvbih0KXtpZighKHQgaW5zdGFuY2VvZiBoKSl0aHJvdyBuZXcgcygiU3BlY2lmaWVkIGxpc3Qgb2YgWUFNTCB0eXBlcyAob3IgYSBzaW5nbGUgVHlwZSBvYmplY3QpIGNvbnRhaW5zIGEgbm9uLVR5cGUgb2JqZWN0LiIpO2lmKHQubG9hZEtpbmQmJiJzY2FsYXIiIT09dC5sb2FkS2luZCl0aHJvdyBuZXcgcygiVGhlcmUgaXMgYSBub24tc2NhbGFyIHR5cGUgaW4gdGhlIGltcGxpY2l0IGxpc3Qgb2YgYSBzY2hlbWEuIEltcGxpY2l0IHJlc29sdmluZyBvZiBzdWNoIHR5cGVzIGlzIG5vdCBzdXBwb3J0ZWQuIik7aWYodC5tdWx0aSl0aHJvdyBuZXcgcygiVGhlcmUgaXMgYSBtdWx0aSB0eXBlIGluIHRoZSBpbXBsaWNpdCBsaXN0IG9mIGEgc2NoZW1hLiBNdWx0aSB0YWdzIGNhbiBvbmx5IGJlIGxpc3RlZCBhcyBleHBsaWNpdC4iKX0pKSxuLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKCEodCBpbnN0YW5jZW9mIGgpKXRocm93IG5ldyBzKCJTcGVjaWZpZWQgbGlzdCBvZiBZQU1MIHR5cGVzIChvciBhIHNpbmdsZSBUeXBlIG9iamVjdCkgY29udGFpbnMgYSBub24tVHlwZSBvYmplY3QuIil9KSk7dmFyIHI9T2JqZWN0LmNyZWF0ZSh5LnByb3RvdHlwZSk7cmV0dXJuIHIuaW1wbGljaXQ9KHRoaXMuaW1wbGljaXR8fFtdKS5jb25jYXQoZSksci5leHBsaWNpdD0odGhpcy5leHBsaWNpdHx8W10pLmNvbmNhdChuKSxyLmNvbXBpbGVkSW1wbGljaXQ9ZChyLCJpbXBsaWNpdCIpLHIuY29tcGlsZWRFeHBsaWNpdD1kKHIsImV4cGxpY2l0Iiksci5jb21waWxlZFR5cGVNYXA9ZnVuY3Rpb24oKXt2YXIgdCxlLG49e3NjYWxhcjp7fSxzZXF1ZW5jZTp7fSxtYXBwaW5nOnt9LGZhbGxiYWNrOnt9LG11bHRpOntzY2FsYXI6W10sc2VxdWVuY2U6W10sbWFwcGluZzpbXSxmYWxsYmFjazpbXX19O2Z1bmN0aW9uIHIodCl7dC5tdWx0aT8obi5tdWx0aVt0LmtpbmRdLnB1c2godCksbi5tdWx0aS5mYWxsYmFjay5wdXNoKHQpKTpuW3Qua2luZF1bdC50YWddPW4uZmFsbGJhY2tbdC50YWddPXR9Zm9yKHQ9MCxlPWFyZ3VtZW50cy5sZW5ndGg7dDxlO3QrPTEpYXJndW1lbnRzW3RdLmZvckVhY2gocik7cmV0dXJuIG59KHIuY29tcGlsZWRJbXBsaWNpdCxyLmNvbXBpbGVkRXhwbGljaXQpLHJ9O3ZhciB2PXksZz1uZXcgaCgidGFnOnlhbWwub3JnLDIwMDI6c3RyIix7a2luZDoic2NhbGFyIixjb25zdHJ1Y3Q6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPT10P3Q6IiJ9fSksdz1uZXcgaCgidGFnOnlhbWwub3JnLDIwMDI6c2VxIix7a2luZDoic2VxdWVuY2UiLGNvbnN0cnVjdDpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9PXQ/dDpbXX19KSxNPW5ldyBoKCJ0YWc6eWFtbC5vcmcsMjAwMjptYXAiLHtraW5kOiJtYXBwaW5nIixjb25zdHJ1Y3Q6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPT10P3Q6e319fSksbT1uZXcgdih7ZXhwbGljaXQ6W2csdyxNXX0pO3ZhciBfPW5ldyBoKCJ0YWc6eWFtbC5vcmcsMjAwMjpudWxsIix7a2luZDoic2NhbGFyIixyZXNvbHZlOmZ1bmN0aW9uKHQpe2lmKG51bGw9PT10KXJldHVybiEwO3ZhciBlPXQubGVuZ3RoO3JldHVybiAxPT09ZSYmIn4iPT09dHx8ND09PWUmJigibnVsbCI9PT10fHwiTnVsbCI9PT10fHwiTlVMTCI9PT10KX0sY29uc3RydWN0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LHByZWRpY2F0ZTpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09PXR9LHJlcHJlc2VudDp7Y2Fub25pY2FsOmZ1bmN0aW9uKCl7cmV0dXJuIn4ifSxsb3dlcmNhc2U6ZnVuY3Rpb24oKXtyZXR1cm4ibnVsbCJ9LHVwcGVyY2FzZTpmdW5jdGlvbigpe3JldHVybiJOVUxMIn0sY2FtZWxjYXNlOmZ1bmN0aW9uKCl7cmV0dXJuIk51bGwifSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiIifX0sZGVmYXVsdFN0eWxlOiJsb3dlcmNhc2UifSk7dmFyIEw9bmV3IGgoInRhZzp5YW1sLm9yZywyMDAyOmJvb2wiLHtraW5kOiJzY2FsYXIiLHJlc29sdmU6ZnVuY3Rpb24odCl7aWYobnVsbD09PXQpcmV0dXJuITE7dmFyIGU9dC5sZW5ndGg7cmV0dXJuIDQ9PT1lJiYoInRydWUiPT09dHx8IlRydWUiPT09dHx8IlRSVUUiPT09dCl8fDU9PT1lJiYoImZhbHNlIj09PXR8fCJGYWxzZSI9PT10fHwiRkFMU0UiPT09dCl9LGNvbnN0cnVjdDpmdW5jdGlvbih0KXtyZXR1cm4idHJ1ZSI9PT10fHwiVHJ1ZSI9PT10fHwiVFJVRSI9PT10fSxwcmVkaWNhdGU6ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgQm9vbGVhbl0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfSxyZXByZXNlbnQ6e2xvd2VyY2FzZTpmdW5jdGlvbih0KXtyZXR1cm4gdD8idHJ1ZSI6ImZhbHNlIn0sdXBwZXJjYXNlOmZ1bmN0aW9uKHQpe3JldHVybiB0PyJUUlVFIjoiRkFMU0UifSxjYW1lbGNhc2U6ZnVuY3Rpb24odCl7cmV0dXJuIHQ/IlRydWUiOiJGYWxzZSJ9fSxkZWZhdWx0U3R5bGU6Imxvd2VyY2FzZSJ9KTtmdW5jdGlvbiBiKHQpe3JldHVybiA0ODw9dCYmdDw9NTV9ZnVuY3Rpb24geCh0KXtyZXR1cm4gNDg8PXQmJnQ8PTU3fXZhciBqPW5ldyBoKCJ0YWc6eWFtbC5vcmcsMjAwMjppbnQiLHtraW5kOiJzY2FsYXIiLHJlc29sdmU6ZnVuY3Rpb24odCl7aWYobnVsbD09PXQpcmV0dXJuITE7dmFyIGUsbixyPXQubGVuZ3RoLGk9MCxvPSExO2lmKCFyKXJldHVybiExO2lmKCItIiE9PShlPXRbaV0pJiYiKyIhPT1lfHwoZT10WysraV0pLCIwIj09PWUpe2lmKGkrMT09PXIpcmV0dXJuITA7aWYoImIiPT09KGU9dFsrK2ldKSl7Zm9yKGkrKztpPHI7aSsrKWlmKCJfIiE9PShlPXRbaV0pKXtpZigiMCIhPT1lJiYiMSIhPT1lKXJldHVybiExO289ITB9cmV0dXJuIG8mJiJfIiE9PWV9aWYoIngiPT09ZSl7Zm9yKGkrKztpPHI7aSsrKWlmKCJfIiE9PShlPXRbaV0pKXtpZighKDQ4PD0obj10LmNoYXJDb2RlQXQoaSkpJiZuPD01N3x8NjU8PW4mJm48PTcwfHw5Nzw9biYmbjw9MTAyKSlyZXR1cm4hMTtvPSEwfXJldHVybiBvJiYiXyIhPT1lfWlmKCJvIj09PWUpe2ZvcihpKys7aTxyO2krKylpZigiXyIhPT0oZT10W2ldKSl7aWYoIWIodC5jaGFyQ29kZUF0KGkpKSlyZXR1cm4hMTtvPSEwfXJldHVybiBvJiYiXyIhPT1lfX1pZigiXyI9PT1lKXJldHVybiExO2Zvcig7aTxyO2krKylpZigiXyIhPT0oZT10W2ldKSl7aWYoIXgodC5jaGFyQ29kZUF0KGkpKSlyZXR1cm4hMTtvPSEwfXJldHVybiEoIW98fCJfIj09PWUpfSxjb25zdHJ1Y3Q6ZnVuY3Rpb24odCl7dmFyIGUsbj10LHI9MTtpZigtMSE9PW4uaW5kZXhPZigiXyIpJiYobj1uLnJlcGxhY2UoL18vZywiIikpLCItIiE9PShlPW5bMF0pJiYiKyIhPT1lfHwoIi0iPT09ZSYmKHI9LTEpLGU9KG49bi5zbGljZSgxKSlbMF0pLCIwIj09PW4pcmV0dXJuIDA7aWYoIjAiPT09ZSl7aWYoImIiPT09blsxXSlyZXR1cm4gcipwYXJzZUludChuLnNsaWNlKDIpLDIpO2lmKCJ4Ij09PW5bMV0pcmV0dXJuIHIqcGFyc2VJbnQobi5zbGljZSgyKSwxNik7aWYoIm8iPT09blsxXSlyZXR1cm4gcipwYXJzZUludChuLnNsaWNlKDIpLDgpfXJldHVybiByKnBhcnNlSW50KG4sMTApfSxwcmVkaWNhdGU6ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgTnVtYmVyXSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkmJnQlMT09MCYmIWkuaXNOZWdhdGl2ZVplcm8odCl9LHJlcHJlc2VudDp7YmluYXJ5OmZ1bmN0aW9uKHQpe3JldHVybiB0Pj0wPyIwYiIrdC50b1N0cmluZygyKToiLTBiIit0LnRvU3RyaW5nKDIpLnNsaWNlKDEpfSxvY3RhbDpmdW5jdGlvbih0KXtyZXR1cm4gdD49MD8iMG8iK3QudG9TdHJpbmcoOCk6Ii0wbyIrdC50b1N0cmluZyg4KS5zbGljZSgxKX0sZGVjaW1hbDpmdW5jdGlvbih0KXtyZXR1cm4gdC50b1N0cmluZygxMCl9LGhleGFkZWNpbWFsOmZ1bmN0aW9uKHQpe3JldHVybiB0Pj0wPyIweCIrdC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKToiLTB4Iit0LnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpLnNsaWNlKDEpfX0sZGVmYXVsdFN0eWxlOiJkZWNpbWFsIixzdHlsZUFsaWFzZXM6e2JpbmFyeTpbMiwiYmluIl0sb2N0YWw6WzgsIm9jdCJdLGRlY2ltYWw6WzEwLCJkZWMiXSxoZXhhZGVjaW1hbDpbMTYsImhleCJdfX0pLE49bmV3IFJlZ0V4cCgiXig/OlstK10/KD86WzAtOV1bMC05X10qKSg/OlxcLlswLTlfXSopPyg/OltlRV1bLStdP1swLTldKyk/fFxcLlswLTlfXSsoPzpbZUVdWy0rXT9bMC05XSspP3xbLStdP1xcLig/OmluZnxJbmZ8SU5GKXxcXC4oPzpuYW58TmFOfE5BTikpJCIpO3ZhciBTPS9eWy0rXT9bMC05XStlLzt2YXIgRD1uZXcgaCgidGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQiLHtraW5kOiJzY2FsYXIiLHJlc29sdmU6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPT10JiYhKCFOLnRlc3QodCl8fCJfIj09PXRbdC5sZW5ndGgtMV0pfSxjb25zdHJ1Y3Q6ZnVuY3Rpb24odCl7dmFyIGUsbjtyZXR1cm4gbj0iLSI9PT0oZT10LnJlcGxhY2UoL18vZywiIikudG9Mb3dlckNhc2UoKSlbMF0/LTE6MSwiKy0iLmluZGV4T2YoZVswXSk+PTAmJihlPWUuc2xpY2UoMSkpLCIuaW5mIj09PWU/MT09PW4/TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOk51bWJlci5ORUdBVElWRV9JTkZJTklUWToiLm5hbiI9PT1lP05hTjpuKnBhcnNlRmxvYXQoZSwxMCl9LHByZWRpY2F0ZTpmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBOdW1iZXJdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSYmKHQlMSE9MHx8aS5pc05lZ2F0aXZlWmVybyh0KSl9LHJlcHJlc2VudDpmdW5jdGlvbih0LGUpe3ZhciBuO2lmKGlzTmFOKHQpKXN3aXRjaChlKXtjYXNlImxvd2VyY2FzZSI6cmV0dXJuIi5uYW4iO2Nhc2UidXBwZXJjYXNlIjpyZXR1cm4iLk5BTiI7Y2FzZSJjYW1lbGNhc2UiOnJldHVybiIuTmFOIn1lbHNlIGlmKE51bWJlci5QT1NJVElWRV9JTkZJTklUWT09PXQpc3dpdGNoKGUpe2Nhc2UibG93ZXJjYXNlIjpyZXR1cm4iLmluZiI7Y2FzZSJ1cHBlcmNhc2UiOnJldHVybiIuSU5GIjtjYXNlImNhbWVsY2FzZSI6cmV0dXJuIi5JbmYifWVsc2UgaWYoTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZPT09dClzd2l0Y2goZSl7Y2FzZSJsb3dlcmNhc2UiOnJldHVybiItLmluZiI7Y2FzZSJ1cHBlcmNhc2UiOnJldHVybiItLklORiI7Y2FzZSJjYW1lbGNhc2UiOnJldHVybiItLkluZiJ9ZWxzZSBpZihpLmlzTmVnYXRpdmVaZXJvKHQpKXJldHVybiItMC4wIjtyZXR1cm4gbj10LnRvU3RyaW5nKDEwKSxTLnRlc3Qobik/bi5yZXBsYWNlKCJlIiwiLmUiKTpufSxkZWZhdWx0U3R5bGU6Imxvd2VyY2FzZSJ9KSxJPW0uZXh0ZW5kKHtpbXBsaWNpdDpbXyxMLGosRF19KSxBPUksTz1uZXcgUmVnRXhwKCJeKFswLTldWzAtOV1bMC05XVswLTldKS0oWzAtOV1bMC05XSktKFswLTldWzAtOV0pJCIpLFQ9bmV3IFJlZ0V4cCgiXihbMC05XVswLTldWzAtOV1bMC05XSktKFswLTldWzAtOV0/KS0oWzAtOV1bMC05XT8pKD86W1R0XXxbIFxcdF0rKShbMC05XVswLTldPyk6KFswLTldWzAtOV0pOihbMC05XVswLTldKSg/OlxcLihbMC05XSopKT8oPzpbIFxcdF0qKFp8KFstK10pKFswLTldWzAtOV0/KSg/OjooWzAtOV1bMC05XSkpPykpPyQiKTt2YXIgQz1uZXcgaCgidGFnOnlhbWwub3JnLDIwMDI6dGltZXN0YW1wIix7a2luZDoic2NhbGFyIixyZXNvbHZlOmZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT09dCYmKG51bGwhPT1PLmV4ZWModCl8fG51bGwhPT1ULmV4ZWModCkpfSxjb25zdHJ1Y3Q6ZnVuY3Rpb24odCl7dmFyIGUsbixyLGksbyx1LHMsYSxjPTAsZj1udWxsO2lmKG51bGw9PT0oZT1PLmV4ZWModCkpJiYoZT1ULmV4ZWModCkpLG51bGw9PT1lKXRocm93IG5ldyBFcnJvcigiRGF0ZSByZXNvbHZlIGVycm9yIik7aWYobj0rZVsxXSxyPStlWzJdLTEsaT0rZVszXSwhZVs0XSlyZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMobixyLGkpKTtpZihvPStlWzRdLHU9K2VbNV0scz0rZVs2XSxlWzddKXtmb3IoYz1lWzddLnNsaWNlKDAsMyk7Yy5sZW5ndGg8MzspYys9IjAiO2M9K2N9cmV0dXJuIGVbOV0mJihmPTZlNCooNjAqK2VbMTBdKyArKGVbMTFdfHwwKSksIi0iPT09ZVs5XSYmKGY9LWYpKSxhPW5ldyBEYXRlKERhdGUuVVRDKG4scixpLG8sdSxzLGMpKSxmJiZhLnNldFRpbWUoYS5nZXRUaW1lKCktZiksYX0saW5zdGFuY2VPZjpEYXRlLHJlcHJlc2VudDpmdW5jdGlvbih0KXtyZXR1cm4gdC50b0lTT1N0cmluZygpfX0pO3ZhciBFPW5ldyBoKCJ0YWc6eWFtbC5vcmcsMjAwMjptZXJnZSIse2tpbmQ6InNjYWxhciIscmVzb2x2ZTpmdW5jdGlvbih0KXtyZXR1cm4iPDwiPT09dHx8bnVsbD09PXR9fSksej0iQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz1cblxyIjt2YXIgaz1uZXcgaCgidGFnOnlhbWwub3JnLDIwMDI6YmluYXJ5Iix7a2luZDoic2NhbGFyIixyZXNvbHZlOmZ1bmN0aW9uKHQpe2lmKG51bGw9PT10KXJldHVybiExO3ZhciBlLG4scj0wLGk9dC5sZW5ndGgsbz16O2ZvcihuPTA7bjxpO24rKylpZighKChlPW8uaW5kZXhPZih0LmNoYXJBdChuKSkpPjY0KSl7aWYoZTwwKXJldHVybiExO3IrPTZ9cmV0dXJuIHIlOD09MH0sY29uc3RydWN0OmZ1bmN0aW9uKHQpe3ZhciBlLG4scj10LnJlcGxhY2UoL1tcclxuPV0vZywiIiksaT1yLmxlbmd0aCxvPXosdT0wLHM9W107Zm9yKGU9MDtlPGk7ZSsrKWUlND09MCYmZSYmKHMucHVzaCh1Pj4xNiYyNTUpLHMucHVzaCh1Pj44JjI1NSkscy5wdXNoKDI1NSZ1KSksdT11PDw2fG8uaW5kZXhPZihyLmNoYXJBdChlKSk7cmV0dXJuIDA9PT0obj1pJTQqNik/KHMucHVzaCh1Pj4xNiYyNTUpLHMucHVzaCh1Pj44JjI1NSkscy5wdXNoKDI1NSZ1KSk6MTg9PT1uPyhzLnB1c2godT4+MTAmMjU1KSxzLnB1c2godT4+MiYyNTUpKToxMj09PW4mJnMucHVzaCh1Pj40JjI1NSksbmV3IFVpbnQ4QXJyYXkocyl9LHByZWRpY2F0ZTpmdW5jdGlvbih0KXtyZXR1cm4iW29iamVjdCBVaW50OEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9LHJlcHJlc2VudDpmdW5jdGlvbih0KXt2YXIgZSxuLHI9IiIsaT0wLG89dC5sZW5ndGgsdT16O2ZvcihlPTA7ZTxvO2UrKyllJTM9PTAmJmUmJihyKz11W2k+PjE4JjYzXSxyKz11W2k+PjEyJjYzXSxyKz11W2k+PjYmNjNdLHIrPXVbNjMmaV0pLGk9KGk8PDgpK3RbZV07cmV0dXJuIDA9PT0obj1vJTMpPyhyKz11W2k+PjE4JjYzXSxyKz11W2k+PjEyJjYzXSxyKz11W2k+PjYmNjNdLHIrPXVbNjMmaV0pOjI9PT1uPyhyKz11W2k+PjEwJjYzXSxyKz11W2k+PjQmNjNdLHIrPXVbaTw8MiY2M10scis9dVs2NF0pOjE9PT1uJiYocis9dVtpPj4yJjYzXSxyKz11W2k8PDQmNjNdLHIrPXVbNjRdLHIrPXVbNjRdKSxyfX0pLFk9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxVPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7dmFyIFA9bmV3IGgoInRhZzp5YW1sLm9yZywyMDAyOm9tYXAiLHtraW5kOiJzZXF1ZW5jZSIscmVzb2x2ZTpmdW5jdGlvbih0KXtpZihudWxsPT09dClyZXR1cm4hMDt2YXIgZSxuLHIsaSxvLHU9W10scz10O2ZvcihlPTAsbj1zLmxlbmd0aDtlPG47ZSs9MSl7aWYocj1zW2VdLG89ITEsIltvYmplY3QgT2JqZWN0XSIhPT1VLmNhbGwocikpcmV0dXJuITE7Zm9yKGkgaW4gcilpZihZLmNhbGwocixpKSl7aWYobylyZXR1cm4hMTtvPSEwfWlmKCFvKXJldHVybiExO2lmKC0xIT09dS5pbmRleE9mKGkpKXJldHVybiExO3UucHVzaChpKX1yZXR1cm4hMH0sY29uc3RydWN0OmZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT09dD90OltdfX0pLFI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzt2YXIgUT1uZXcgaCgidGFnOnlhbWwub3JnLDIwMDI6cGFpcnMiLHtraW5kOiJzZXF1ZW5jZSIscmVzb2x2ZTpmdW5jdGlvbih0KXtpZihudWxsPT09dClyZXR1cm4hMDt2YXIgZSxuLHIsaSxvLHU9dDtmb3Iobz1uZXcgQXJyYXkodS5sZW5ndGgpLGU9MCxuPXUubGVuZ3RoO2U8bjtlKz0xKXtpZihyPXVbZV0sIltvYmplY3QgT2JqZWN0XSIhPT1SLmNhbGwocikpcmV0dXJuITE7aWYoMSE9PShpPU9iamVjdC5rZXlzKHIpKS5sZW5ndGgpcmV0dXJuITE7b1tlXT1baVswXSxyW2lbMF1dXX1yZXR1cm4hMH0sY29uc3RydWN0OmZ1bmN0aW9uKHQpe2lmKG51bGw9PT10KXJldHVybltdO3ZhciBlLG4scixpLG8sdT10O2ZvcihvPW5ldyBBcnJheSh1Lmxlbmd0aCksZT0wLG49dS5sZW5ndGg7ZTxuO2UrPTEpcj11W2VdLGk9T2JqZWN0LmtleXMociksb1tlXT1baVswXSxyW2lbMF1dXTtyZXR1cm4gb319KSxGPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIEI9bmV3IGgoInRhZzp5YW1sLm9yZywyMDAyOnNldCIse2tpbmQ6Im1hcHBpbmciLHJlc29sdmU6ZnVuY3Rpb24odCl7aWYobnVsbD09PXQpcmV0dXJuITA7dmFyIGUsbj10O2ZvcihlIGluIG4paWYoRi5jYWxsKG4sZSkmJm51bGwhPT1uW2VdKXJldHVybiExO3JldHVybiEwfSxjb25zdHJ1Y3Q6ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPT10P3Q6e319fSksRz1BLmV4dGVuZCh7aW1wbGljaXQ6W0MsRV0sZXhwbGljaXQ6W2ssUCxRLEJdfSksVz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LHE9L1tceDAwLVx4MDhceDBCXHgwQ1x4MEUtXHgxRlx4N0YtXHg4NFx4ODYtXHg5Rlx1RkZGRVx1RkZGRl18W1x1RDgwMC1cdURCRkZdKD8hW1x1REMwMC1cdURGRkZdKXwoPzpbXlx1RDgwMC1cdURCRkZdfF4pW1x1REMwMC1cdURGRkZdLyxKPS9bXHg4NVx1MjAyOFx1MjAyOV0vLFo9L1ssXFtcXVx7XH1dLyxWPS9eKD86IXwhIXwhW2EtelwtXSshKSQvaSxYPS9eKD86IXxbXixcW1xdXHtcfV0pKD86JVswLTlhLWZdezJ9fFswLTlhLXpcLSM7XC9cPzpAJj1cK1wkLF9cLiF+XConXChcKVxbXF1dKSokL2k7ZnVuY3Rpb24gSCh0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIEsodCl7cmV0dXJuIDEwPT09dHx8MTM9PT10fWZ1bmN0aW9uICQodCl7cmV0dXJuIDk9PT10fHwzMj09PXR9ZnVuY3Rpb24gdHQodCl7cmV0dXJuIDk9PT10fHwzMj09PXR8fDEwPT09dHx8MTM9PT10fWZ1bmN0aW9uIGV0KHQpe3JldHVybiA0ND09PXR8fDkxPT09dHx8OTM9PT10fHwxMjM9PT10fHwxMjU9PT10fWZ1bmN0aW9uIG50KHQpe3ZhciBlO3JldHVybiA0ODw9dCYmdDw9NTc/dC00ODo5Nzw9KGU9MzJ8dCkmJmU8PTEwMj9lLTk3KzEwOi0xfWZ1bmN0aW9uIHJ0KHQpe3JldHVybiA0OD09PXQ/IlwwIjo5Nz09PXQ/IgciOjk4PT09dD8iXGIiOjExNj09PXR8fDk9PT10PyJcdCI6MTEwPT09dD8iXG4iOjExOD09PXQ/Ilx2IjoxMDI9PT10PyJcZiI6MTE0PT09dD8iXHIiOjEwMT09PXQ/IhsiOjMyPT09dD8iICI6MzQ9PT10PyciJzo0Nz09PXQ/Ii8iOjkyPT09dD8iXFwiOjc4PT09dD8iwoUiOjk1PT09dD8iwqAiOjc2PT09dD8iXHUyMDI4Ijo4MD09PXQ/Ilx1MjAyOSI6IiJ9ZnVuY3Rpb24gaXQodCl7cmV0dXJuIHQ8PTY1NTM1P1N0cmluZy5mcm9tQ2hhckNvZGUodCk6U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NisodC02NTUzNj4+MTApLDU2MzIwKyh0LTY1NTM2JjEwMjMpKX1mb3IodmFyIG90PW5ldyBBcnJheSgyNTYpLHV0PW5ldyBBcnJheSgyNTYpLHN0PTA7c3Q8MjU2O3N0Kyspb3Rbc3RdPXJ0KHN0KT8xOjAsdXRbc3RdPXJ0KHN0KTtmdW5jdGlvbiBhdCh0LGUpe3RoaXMuaW5wdXQ9dCx0aGlzLmZpbGVuYW1lPWUuZmlsZW5hbWV8fG51bGwsdGhpcy5zY2hlbWE9ZS5zY2hlbWF8fEcsdGhpcy5vbldhcm5pbmc9ZS5vbldhcm5pbmd8fG51bGwsdGhpcy5sZWdhY3k9ZS5sZWdhY3l8fCExLHRoaXMuanNvbj1lLmpzb258fCExLHRoaXMubGlzdGVuZXI9ZS5saXN0ZW5lcnx8bnVsbCx0aGlzLmltcGxpY2l0VHlwZXM9dGhpcy5zY2hlbWEuY29tcGlsZWRJbXBsaWNpdCx0aGlzLnR5cGVNYXA9dGhpcy5zY2hlbWEuY29tcGlsZWRUeXBlTWFwLHRoaXMubGVuZ3RoPXQubGVuZ3RoLHRoaXMucG9zaXRpb249MCx0aGlzLmxpbmU9MCx0aGlzLmxpbmVTdGFydD0wLHRoaXMubGluZUluZGVudD0wLHRoaXMuZmlyc3RUYWJJbkxpbmU9LTEsdGhpcy5kb2N1bWVudHM9W119ZnVuY3Rpb24gY3QodCxlKXt2YXIgbj17bmFtZTp0LmZpbGVuYW1lLGJ1ZmZlcjp0LmlucHV0LnNsaWNlKDAsLTEpLHBvc2l0aW9uOnQucG9zaXRpb24sbGluZTp0LmxpbmUsY29sdW1uOnQucG9zaXRpb24tdC5saW5lU3RhcnR9O3JldHVybiBuLnNuaXBwZXQ9ZihuKSxuZXcgcyhlLG4pfWZ1bmN0aW9uIGZ0KHQsZSl7dGhyb3cgY3QodCxlKX1mdW5jdGlvbiBsdCh0LGUpe3Qub25XYXJuaW5nJiZ0Lm9uV2FybmluZy5jYWxsKG51bGwsY3QodCxlKSl9dmFyIHB0PXtZQU1MOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixpLG87bnVsbCE9PXQudmVyc2lvbiYmZnQodCwiZHVwbGljYXRpb24gb2YgJVlBTUwgZGlyZWN0aXZlIiksMSE9PW4ubGVuZ3RoJiZmdCh0LCJZQU1MIGRpcmVjdGl2ZSBhY2NlcHRzIGV4YWN0bHkgb25lIGFyZ3VtZW50IiksbnVsbD09PShyPS9eKFswLTldKylcLihbMC05XSspJC8uZXhlYyhuWzBdKSkmJmZ0KHQsImlsbC1mb3JtZWQgYXJndW1lbnQgb2YgdGhlIFlBTUwgZGlyZWN0aXZlIiksaT1wYXJzZUludChyWzFdLDEwKSxvPXBhcnNlSW50KHJbMl0sMTApLDEhPT1pJiZmdCh0LCJ1bmFjY2VwdGFibGUgWUFNTCB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudCIpLHQudmVyc2lvbj1uWzBdLHQuY2hlY2tMaW5lQnJlYWtzPW88MiwxIT09byYmMiE9PW8mJmx0KHQsInVuc3VwcG9ydGVkIFlBTUwgdmVyc2lvbiBvZiB0aGUgZG9jdW1lbnQiKX0sVEFHOmZ1bmN0aW9uKHQsZSxuKXt2YXIgcixpOzIhPT1uLmxlbmd0aCYmZnQodCwiVEFHIGRpcmVjdGl2ZSBhY2NlcHRzIGV4YWN0bHkgdHdvIGFyZ3VtZW50cyIpLHI9blswXSxpPW5bMV0sVi50ZXN0KHIpfHxmdCh0LCJpbGwtZm9ybWVkIHRhZyBoYW5kbGUgKGZpcnN0IGFyZ3VtZW50KSBvZiB0aGUgVEFHIGRpcmVjdGl2ZSIpLFcuY2FsbCh0LnRhZ01hcCxyKSYmZnQodCwndGhlcmUgaXMgYSBwcmV2aW91c2x5IGRlY2xhcmVkIHN1ZmZpeCBmb3IgIicrcisnIiB0YWcgaGFuZGxlJyksWC50ZXN0KGkpfHxmdCh0LCJpbGwtZm9ybWVkIHRhZyBwcmVmaXggKHNlY29uZCBhcmd1bWVudCkgb2YgdGhlIFRBRyBkaXJlY3RpdmUiKTt0cnl7aT1kZWNvZGVVUklDb21wb25lbnQoaSl9Y2F0Y2goZSl7ZnQodCwidGFnIHByZWZpeCBpcyBtYWxmb3JtZWQ6ICIraSl9dC50YWdNYXBbcl09aX19O2Z1bmN0aW9uIGh0KHQsZSxuLHIpe3ZhciBpLG8sdSxzO2lmKGU8bil7aWYocz10LmlucHV0LnNsaWNlKGUsbikscilmb3IoaT0wLG89cy5sZW5ndGg7aTxvO2krPTEpOT09PSh1PXMuY2hhckNvZGVBdChpKSl8fDMyPD11JiZ1PD0xMTE0MTExfHxmdCh0LCJleHBlY3RlZCB2YWxpZCBKU09OIGNoYXJhY3RlciIpO2Vsc2UgcS50ZXN0KHMpJiZmdCh0LCJ0aGUgc3RyZWFtIGNvbnRhaW5zIG5vbi1wcmludGFibGUgY2hhcmFjdGVycyIpO3QucmVzdWx0Kz1zfX1mdW5jdGlvbiBkdCh0LGUsbixyKXt2YXIgbyx1LHMsYTtmb3IoaS5pc09iamVjdChuKXx8ZnQodCwiY2Fubm90IG1lcmdlIG1hcHBpbmdzOyB0aGUgcHJvdmlkZWQgc291cmNlIG9iamVjdCBpcyB1bmFjY2VwdGFibGUiKSxzPTAsYT0obz1PYmplY3Qua2V5cyhuKSkubGVuZ3RoO3M8YTtzKz0xKXU9b1tzXSxXLmNhbGwoZSx1KXx8KGVbdV09blt1XSxyW3VdPSEwKX1mdW5jdGlvbiB5dCh0LGUsbixyLGksbyx1LHMsYSl7dmFyIGMsZjtpZihBcnJheS5pc0FycmF5KGkpKWZvcihjPTAsZj0oaT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChpKSkubGVuZ3RoO2M8ZjtjKz0xKUFycmF5LmlzQXJyYXkoaVtjXSkmJmZ0KHQsIm5lc3RlZCBhcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW5zaWRlIGtleXMiKSwib2JqZWN0Ij09dHlwZW9mIGkmJiJbb2JqZWN0IE9iamVjdF0iPT09SChpW2NdKSYmKGlbY109IltvYmplY3QgT2JqZWN0XSIpO2lmKCJvYmplY3QiPT10eXBlb2YgaSYmIltvYmplY3QgT2JqZWN0XSI9PT1IKGkpJiYoaT0iW29iamVjdCBPYmplY3RdIiksaT1TdHJpbmcoaSksbnVsbD09PWUmJihlPXt9KSwidGFnOnlhbWwub3JnLDIwMDI6bWVyZ2UiPT09cilpZihBcnJheS5pc0FycmF5KG8pKWZvcihjPTAsZj1vLmxlbmd0aDtjPGY7Yys9MSlkdCh0LGUsb1tjXSxuKTtlbHNlIGR0KHQsZSxvLG4pO2Vsc2UgdC5qc29ufHxXLmNhbGwobixpKXx8IVcuY2FsbChlLGkpfHwodC5saW5lPXV8fHQubGluZSx0LmxpbmVTdGFydD1zfHx0LmxpbmVTdGFydCx0LnBvc2l0aW9uPWF8fHQucG9zaXRpb24sZnQodCwiZHVwbGljYXRlZCBtYXBwaW5nIGtleSIpKSwiX19wcm90b19fIj09PWk/T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsaSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6b30pOmVbaV09byxkZWxldGUgbltpXTtyZXR1cm4gZX1mdW5jdGlvbiB2dCh0KXt2YXIgZTsxMD09PShlPXQuaW5wdXQuY2hhckNvZGVBdCh0LnBvc2l0aW9uKSk/dC5wb3NpdGlvbisrOjEzPT09ZT8odC5wb3NpdGlvbisrLDEwPT09dC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24pJiZ0LnBvc2l0aW9uKyspOmZ0KHQsImEgbGluZSBicmVhayBpcyBleHBlY3RlZCIpLHQubGluZSs9MSx0LmxpbmVTdGFydD10LnBvc2l0aW9uLHQuZmlyc3RUYWJJbkxpbmU9LTF9ZnVuY3Rpb24gZ3QodCxlLG4pe2Zvcih2YXIgcj0wLGk9dC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24pOzAhPT1pOyl7Zm9yKDskKGkpOyk5PT09aSYmLTE9PT10LmZpcnN0VGFiSW5MaW5lJiYodC5maXJzdFRhYkluTGluZT10LnBvc2l0aW9uKSxpPXQuaW5wdXQuY2hhckNvZGVBdCgrK3QucG9zaXRpb24pO2lmKGUmJjM1PT09aSlkb3tpPXQuaW5wdXQuY2hhckNvZGVBdCgrK3QucG9zaXRpb24pfXdoaWxlKDEwIT09aSYmMTMhPT1pJiYwIT09aSk7aWYoIUsoaSkpYnJlYWs7Zm9yKHZ0KHQpLGk9dC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24pLHIrKyx0LmxpbmVJbmRlbnQ9MDszMj09PWk7KXQubGluZUluZGVudCsrLGk9dC5pbnB1dC5jaGFyQ29kZUF0KCsrdC5wb3NpdGlvbil9cmV0dXJuLTEhPT1uJiYwIT09ciYmdC5saW5lSW5kZW50PG4mJmx0KHQsImRlZmljaWVudCBpbmRlbnRhdGlvbiIpLHJ9ZnVuY3Rpb24gd3QodCl7dmFyIGUsbj10LnBvc2l0aW9uO3JldHVybiEoNDUhPT0oZT10LmlucHV0LmNoYXJDb2RlQXQobikpJiY0NiE9PWV8fGUhPT10LmlucHV0LmNoYXJDb2RlQXQobisxKXx8ZSE9PXQuaW5wdXQuY2hhckNvZGVBdChuKzIpfHwobis9MywwIT09KGU9dC5pbnB1dC5jaGFyQ29kZUF0KG4pKSYmIXR0KGUpKSl9ZnVuY3Rpb24gTXQodCxlKXsxPT09ZT90LnJlc3VsdCs9IiAiOmU+MSYmKHQucmVzdWx0Kz1pLnJlcGVhdCgiXG4iLGUtMSkpfWZ1bmN0aW9uIG10KHQsZSl7dmFyIG4scixpPXQudGFnLG89dC5hbmNob3IsdT1bXSxzPSExO2lmKC0xIT09dC5maXJzdFRhYkluTGluZSlyZXR1cm4hMTtmb3IobnVsbCE9PXQuYW5jaG9yJiYodC5hbmNob3JNYXBbdC5hbmNob3JdPXUpLHI9dC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24pOzAhPT1yJiYoLTEhPT10LmZpcnN0VGFiSW5MaW5lJiYodC5wb3NpdGlvbj10LmZpcnN0VGFiSW5MaW5lLGZ0KHQsInRhYiBjaGFyYWN0ZXJzIG11c3Qgbm90IGJlIHVzZWQgaW4gaW5kZW50YXRpb24iKSksNDU9PT1yKSYmdHQodC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24rMSkpOylpZihzPSEwLHQucG9zaXRpb24rKyxndCh0LCEwLC0xKSYmdC5saW5lSW5kZW50PD1lKXUucHVzaChudWxsKSxyPXQuaW5wdXQuY2hhckNvZGVBdCh0LnBvc2l0aW9uKTtlbHNlIGlmKG49dC5saW5lLGJ0KHQsZSwzLCExLCEwKSx1LnB1c2godC5yZXN1bHQpLGd0KHQsITAsLTEpLHI9dC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24pLCh0LmxpbmU9PT1ufHx0LmxpbmVJbmRlbnQ+ZSkmJjAhPT1yKWZ0KHQsImJhZCBpbmRlbnRhdGlvbiBvZiBhIHNlcXVlbmNlIGVudHJ5Iik7ZWxzZSBpZih0LmxpbmVJbmRlbnQ8ZSlicmVhaztyZXR1cm4hIXMmJih0LnRhZz1pLHQuYW5jaG9yPW8sdC5raW5kPSJzZXF1ZW5jZSIsdC5yZXN1bHQ9dSwhMCl9ZnVuY3Rpb24gX3QodCl7dmFyIGUsbixyLGksbz0hMSx1PSExO2lmKDMzIT09KGk9dC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24pKSlyZXR1cm4hMTtpZihudWxsIT09dC50YWcmJmZ0KHQsImR1cGxpY2F0aW9uIG9mIGEgdGFnIHByb3BlcnR5IiksNjA9PT0oaT10LmlucHV0LmNoYXJDb2RlQXQoKyt0LnBvc2l0aW9uKSk/KG89ITAsaT10LmlucHV0LmNoYXJDb2RlQXQoKyt0LnBvc2l0aW9uKSk6MzM9PT1pPyh1PSEwLG49IiEhIixpPXQuaW5wdXQuY2hhckNvZGVBdCgrK3QucG9zaXRpb24pKTpuPSIhIixlPXQucG9zaXRpb24sbyl7ZG97aT10LmlucHV0LmNoYXJDb2RlQXQoKyt0LnBvc2l0aW9uKX13aGlsZSgwIT09aSYmNjIhPT1pKTt0LnBvc2l0aW9uPHQubGVuZ3RoPyhyPXQuaW5wdXQuc2xpY2UoZSx0LnBvc2l0aW9uKSxpPXQuaW5wdXQuY2hhckNvZGVBdCgrK3QucG9zaXRpb24pKTpmdCh0LCJ1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIHZlcmJhdGltIHRhZyIpfWVsc2V7Zm9yKDswIT09aSYmIXR0KGkpOykzMz09PWkmJih1P2Z0KHQsInRhZyBzdWZmaXggY2Fubm90IGNvbnRhaW4gZXhjbGFtYXRpb24gbWFya3MiKToobj10LmlucHV0LnNsaWNlKGUtMSx0LnBvc2l0aW9uKzEpLFYudGVzdChuKXx8ZnQodCwibmFtZWQgdGFnIGhhbmRsZSBjYW5ub3QgY29udGFpbiBzdWNoIGNoYXJhY3RlcnMiKSx1PSEwLGU9dC5wb3NpdGlvbisxKSksaT10LmlucHV0LmNoYXJDb2RlQXQoKyt0LnBvc2l0aW9uKTtyPXQuaW5wdXQuc2xpY2UoZSx0LnBvc2l0aW9uKSxaLnRlc3QocikmJmZ0KHQsInRhZyBzdWZmaXggY2Fubm90IGNvbnRhaW4gZmxvdyBpbmRpY2F0b3IgY2hhcmFjdGVycyIpfXImJiFYLnRlc3QocikmJmZ0KHQsInRhZyBuYW1lIGNhbm5vdCBjb250YWluIHN1Y2ggY2hhcmFjdGVyczogIityKTt0cnl7cj1kZWNvZGVVUklDb21wb25lbnQocil9Y2F0Y2goZSl7ZnQodCwidGFnIG5hbWUgaXMgbWFsZm9ybWVkOiAiK3IpfXJldHVybiBvP3QudGFnPXI6Vy5jYWxsKHQudGFnTWFwLG4pP3QudGFnPXQudGFnTWFwW25dK3I6IiEiPT09bj90LnRhZz0iISIrcjoiISEiPT09bj90LnRhZz0idGFnOnlhbWwub3JnLDIwMDI6IityOmZ0KHQsJ3VuZGVjbGFyZWQgdGFnIGhhbmRsZSAiJytuKyciJyksITB9ZnVuY3Rpb24gTHQodCl7dmFyIGUsbjtpZigzOCE9PShuPXQuaW5wdXQuY2hhckNvZGVBdCh0LnBvc2l0aW9uKSkpcmV0dXJuITE7Zm9yKG51bGwhPT10LmFuY2hvciYmZnQodCwiZHVwbGljYXRpb24gb2YgYW4gYW5jaG9yIHByb3BlcnR5Iiksbj10LmlucHV0LmNoYXJDb2RlQXQoKyt0LnBvc2l0aW9uKSxlPXQucG9zaXRpb247MCE9PW4mJiF0dChuKSYmIWV0KG4pOyluPXQuaW5wdXQuY2hhckNvZGVBdCgrK3QucG9zaXRpb24pO3JldHVybiB0LnBvc2l0aW9uPT09ZSYmZnQodCwibmFtZSBvZiBhbiBhbmNob3Igbm9kZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGNoYXJhY3RlciIpLHQuYW5jaG9yPXQuaW5wdXQuc2xpY2UoZSx0LnBvc2l0aW9uKSwhMH1mdW5jdGlvbiBidCh0LGUsbixyLG8pe3ZhciB1LHMsYSxjLGYsbCxwLGgsZCx5PTEsdj0hMSxnPSExO2lmKG51bGwhPT10Lmxpc3RlbmVyJiZ0Lmxpc3RlbmVyKCJvcGVuIix0KSx0LnRhZz1udWxsLHQuYW5jaG9yPW51bGwsdC5raW5kPW51bGwsdC5yZXN1bHQ9bnVsbCx1PXM9YT00PT09bnx8Mz09PW4sciYmZ3QodCwhMCwtMSkmJih2PSEwLHQubGluZUluZGVudD5lP3k9MTp0LmxpbmVJbmRlbnQ9PT1lP3k9MDp0LmxpbmVJbmRlbnQ8ZSYmKHk9LTEpKSwxPT09eSlmb3IoO190KHQpfHxMdCh0KTspZ3QodCwhMCwtMSk/KHY9ITAsYT11LHQubGluZUluZGVudD5lP3k9MTp0LmxpbmVJbmRlbnQ9PT1lP3k9MDp0LmxpbmVJbmRlbnQ8ZSYmKHk9LTEpKTphPSExO2lmKGEmJihhPXZ8fG8pLDEhPT15JiY0IT09bnx8KGg9MT09PW58fDI9PT1uP2U6ZSsxLGQ9dC5wb3NpdGlvbi10LmxpbmVTdGFydCwxPT09eT9hJiYobXQodCxkKXx8ZnVuY3Rpb24odCxlLG4pe3ZhciByLGksbyx1LHMsYSxjLGY9dC50YWcsbD10LmFuY2hvcixwPXt9LGg9T2JqZWN0LmNyZWF0ZShudWxsKSxkPW51bGwseT1udWxsLHY9bnVsbCxnPSExLHc9ITE7aWYoLTEhPT10LmZpcnN0VGFiSW5MaW5lKXJldHVybiExO2ZvcihudWxsIT09dC5hbmNob3ImJih0LmFuY2hvck1hcFt0LmFuY2hvcl09cCksYz10LmlucHV0LmNoYXJDb2RlQXQodC5wb3NpdGlvbik7MCE9PWM7KXtpZihnfHwtMT09PXQuZmlyc3RUYWJJbkxpbmV8fCh0LnBvc2l0aW9uPXQuZmlyc3RUYWJJbkxpbmUsZnQodCwidGFiIGNoYXJhY3RlcnMgbXVzdCBub3QgYmUgdXNlZCBpbiBpbmRlbnRhdGlvbiIpKSxyPXQuaW5wdXQuY2hhckNvZGVBdCh0LnBvc2l0aW9uKzEpLG89dC5saW5lLDYzIT09YyYmNTghPT1jfHwhdHQocikpe2lmKHU9dC5saW5lLHM9dC5saW5lU3RhcnQsYT10LnBvc2l0aW9uLCFidCh0LG4sMiwhMSwhMCkpYnJlYWs7aWYodC5saW5lPT09byl7Zm9yKGM9dC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24pOyQoYyk7KWM9dC5pbnB1dC5jaGFyQ29kZUF0KCsrdC5wb3NpdGlvbik7aWYoNTg9PT1jKXR0KGM9dC5pbnB1dC5jaGFyQ29kZUF0KCsrdC5wb3NpdGlvbikpfHxmdCh0LCJhIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIGV4cGVjdGVkIGFmdGVyIHRoZSBrZXktdmFsdWUgc2VwYXJhdG9yIHdpdGhpbiBhIGJsb2NrIG1hcHBpbmciKSxnJiYoeXQodCxwLGgsZCx5LG51bGwsdSxzLGEpLGQ9eT12PW51bGwpLHc9ITAsZz0hMSxpPSExLGQ9dC50YWcseT10LnJlc3VsdDtlbHNle2lmKCF3KXJldHVybiB0LnRhZz1mLHQuYW5jaG9yPWwsITA7ZnQodCwiY2FuIG5vdCByZWFkIGFuIGltcGxpY2l0IG1hcHBpbmcgcGFpcjsgYSBjb2xvbiBpcyBtaXNzZWQiKX19ZWxzZXtpZighdylyZXR1cm4gdC50YWc9Zix0LmFuY2hvcj1sLCEwO2Z0KHQsImNhbiBub3QgcmVhZCBhIGJsb2NrIG1hcHBpbmcgZW50cnk7IGEgbXVsdGlsaW5lIGtleSBtYXkgbm90IGJlIGFuIGltcGxpY2l0IGtleSIpfX1lbHNlIDYzPT09Yz8oZyYmKHl0KHQscCxoLGQseSxudWxsLHUscyxhKSxkPXk9dj1udWxsKSx3PSEwLGc9ITAsaT0hMCk6Zz8oZz0hMSxpPSEwKTpmdCh0LCJpbmNvbXBsZXRlIGV4cGxpY2l0IG1hcHBpbmcgcGFpcjsgYSBrZXkgbm9kZSBpcyBtaXNzZWQ7IG9yIGZvbGxvd2VkIGJ5IGEgbm9uLXRhYnVsYXRlZCBlbXB0eSBsaW5lIiksdC5wb3NpdGlvbis9MSxjPXI7aWYoKHQubGluZT09PW98fHQubGluZUluZGVudD5lKSYmKGcmJih1PXQubGluZSxzPXQubGluZVN0YXJ0LGE9dC5wb3NpdGlvbiksYnQodCxlLDQsITAsaSkmJihnP3k9dC5yZXN1bHQ6dj10LnJlc3VsdCksZ3x8KHl0KHQscCxoLGQseSx2LHUscyxhKSxkPXk9dj1udWxsKSxndCh0LCEwLC0xKSxjPXQuaW5wdXQuY2hhckNvZGVBdCh0LnBvc2l0aW9uKSksKHQubGluZT09PW98fHQubGluZUluZGVudD5lKSYmMCE9PWMpZnQodCwiYmFkIGluZGVudGF0aW9uIG9mIGEgbWFwcGluZyBlbnRyeSIpO2Vsc2UgaWYodC5saW5lSW5kZW50PGUpYnJlYWt9cmV0dXJuIGcmJnl0KHQscCxoLGQseSxudWxsLHUscyxhKSx3JiYodC50YWc9Zix0LmFuY2hvcj1sLHQua2luZD0ibWFwcGluZyIsdC5yZXN1bHQ9cCksd30odCxkLGgpKXx8ZnVuY3Rpb24odCxlKXt2YXIgbixyLGksbyx1LHMsYSxjLGYsbCxwLGgsZD0hMCx5PXQudGFnLHY9dC5hbmNob3IsZz1PYmplY3QuY3JlYXRlKG51bGwpO2lmKDkxPT09KGg9dC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24pKSl1PTkzLGM9ITEsbz1bXTtlbHNle2lmKDEyMyE9PWgpcmV0dXJuITE7dT0xMjUsYz0hMCxvPXt9fWZvcihudWxsIT09dC5hbmNob3ImJih0LmFuY2hvck1hcFt0LmFuY2hvcl09byksaD10LmlucHV0LmNoYXJDb2RlQXQoKyt0LnBvc2l0aW9uKTswIT09aDspe2lmKGd0KHQsITAsZSksKGg9dC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24pKT09PXUpcmV0dXJuIHQucG9zaXRpb24rKyx0LnRhZz15LHQuYW5jaG9yPXYsdC5raW5kPWM/Im1hcHBpbmciOiJzZXF1ZW5jZSIsdC5yZXN1bHQ9bywhMDtkPzQ0PT09aCYmZnQodCwiZXhwZWN0ZWQgdGhlIG5vZGUgY29udGVudCwgYnV0IGZvdW5kICcsJyIpOmZ0KHQsIm1pc3NlZCBjb21tYSBiZXR3ZWVuIGZsb3cgY29sbGVjdGlvbiBlbnRyaWVzIikscD1udWxsLHM9YT0hMSw2Mz09PWgmJnR0KHQuaW5wdXQuY2hhckNvZGVBdCh0LnBvc2l0aW9uKzEpKSYmKHM9YT0hMCx0LnBvc2l0aW9uKyssZ3QodCwhMCxlKSksbj10LmxpbmUscj10LmxpbmVTdGFydCxpPXQucG9zaXRpb24sYnQodCxlLDEsITEsITApLGw9dC50YWcsZj10LnJlc3VsdCxndCh0LCEwLGUpLGg9dC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24pLCFhJiZ0LmxpbmUhPT1ufHw1OCE9PWh8fChzPSEwLGg9dC5pbnB1dC5jaGFyQ29kZUF0KCsrdC5wb3NpdGlvbiksZ3QodCwhMCxlKSxidCh0LGUsMSwhMSwhMCkscD10LnJlc3VsdCksYz95dCh0LG8sZyxsLGYscCxuLHIsaSk6cz9vLnB1c2goeXQodCxudWxsLGcsbCxmLHAsbixyLGkpKTpvLnB1c2goZiksZ3QodCwhMCxlKSw0ND09PShoPXQuaW5wdXQuY2hhckNvZGVBdCh0LnBvc2l0aW9uKSk/KGQ9ITAsaD10LmlucHV0LmNoYXJDb2RlQXQoKyt0LnBvc2l0aW9uKSk6ZD0hMX1mdCh0LCJ1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIGZsb3cgY29sbGVjdGlvbiIpfSh0LGgpP2c9ITA6KHMmJmZ1bmN0aW9uKHQsZSl7dmFyIG4scixvLHUscyxhPTEsYz0hMSxmPSExLGw9ZSxwPTAsaD0hMTtpZigxMjQ9PT0odT10LmlucHV0LmNoYXJDb2RlQXQodC5wb3NpdGlvbikpKXI9ITE7ZWxzZXtpZig2MiE9PXUpcmV0dXJuITE7cj0hMH1mb3IodC5raW5kPSJzY2FsYXIiLHQucmVzdWx0PSIiOzAhPT11OylpZig0Mz09PSh1PXQuaW5wdXQuY2hhckNvZGVBdCgrK3QucG9zaXRpb24pKXx8NDU9PT11KTE9PT1hP2E9NDM9PT11PzM6MjpmdCh0LCJyZXBlYXQgb2YgYSBjaG9tcGluZyBtb2RlIGlkZW50aWZpZXIiKTtlbHNle2lmKCEoKG89NDg8PShzPXUpJiZzPD01Nz9zLTQ4Oi0xKT49MCkpYnJlYWs7MD09PW8/ZnQodCwiYmFkIGV4cGxpY2l0IGluZGVudGF0aW9uIHdpZHRoIG9mIGEgYmxvY2sgc2NhbGFyOyBpdCBjYW5ub3QgYmUgbGVzcyB0aGFuIG9uZSIpOmY/ZnQodCwicmVwZWF0IG9mIGFuIGluZGVudGF0aW9uIHdpZHRoIGlkZW50aWZpZXIiKToobD1lK28tMSxmPSEwKX1pZigkKHUpKXtkb3t1PXQuaW5wdXQuY2hhckNvZGVBdCgrK3QucG9zaXRpb24pfXdoaWxlKCQodSkpO2lmKDM1PT09dSlkb3t1PXQuaW5wdXQuY2hhckNvZGVBdCgrK3QucG9zaXRpb24pfXdoaWxlKCFLKHUpJiYwIT09dSl9Zm9yKDswIT09dTspe2Zvcih2dCh0KSx0LmxpbmVJbmRlbnQ9MCx1PXQuaW5wdXQuY2hhckNvZGVBdCh0LnBvc2l0aW9uKTsoIWZ8fHQubGluZUluZGVudDxsKSYmMzI9PT11Oyl0LmxpbmVJbmRlbnQrKyx1PXQuaW5wdXQuY2hhckNvZGVBdCgrK3QucG9zaXRpb24pO2lmKCFmJiZ0LmxpbmVJbmRlbnQ+bCYmKGw9dC5saW5lSW5kZW50KSxLKHUpKXArKztlbHNle2lmKHQubGluZUluZGVudDxsKXszPT09YT90LnJlc3VsdCs9aS5yZXBlYXQoIlxuIixjPzErcDpwKToxPT09YSYmYyYmKHQucmVzdWx0Kz0iXG4iKTticmVha31mb3Iocj8kKHUpPyhoPSEwLHQucmVzdWx0Kz1pLnJlcGVhdCgiXG4iLGM/MStwOnApKTpoPyhoPSExLHQucmVzdWx0Kz1pLnJlcGVhdCgiXG4iLHArMSkpOjA9PT1wP2MmJih0LnJlc3VsdCs9IiAiKTp0LnJlc3VsdCs9aS5yZXBlYXQoIlxuIixwKTp0LnJlc3VsdCs9aS5yZXBlYXQoIlxuIixjPzErcDpwKSxjPSEwLGY9ITAscD0wLG49dC5wb3NpdGlvbjshSyh1KSYmMCE9PXU7KXU9dC5pbnB1dC5jaGFyQ29kZUF0KCsrdC5wb3NpdGlvbik7aHQodCxuLHQucG9zaXRpb24sITEpfX1yZXR1cm4hMH0odCxoKXx8ZnVuY3Rpb24odCxlKXt2YXIgbixyLGk7aWYoMzkhPT0obj10LmlucHV0LmNoYXJDb2RlQXQodC5wb3NpdGlvbikpKXJldHVybiExO2Zvcih0LmtpbmQ9InNjYWxhciIsdC5yZXN1bHQ9IiIsdC5wb3NpdGlvbisrLHI9aT10LnBvc2l0aW9uOzAhPT0obj10LmlucHV0LmNoYXJDb2RlQXQodC5wb3NpdGlvbikpOylpZigzOT09PW4pe2lmKGh0KHQscix0LnBvc2l0aW9uLCEwKSwzOSE9PShuPXQuaW5wdXQuY2hhckNvZGVBdCgrK3QucG9zaXRpb24pKSlyZXR1cm4hMDtyPXQucG9zaXRpb24sdC5wb3NpdGlvbisrLGk9dC5wb3NpdGlvbn1lbHNlIEsobik/KGh0KHQscixpLCEwKSxNdCh0LGd0KHQsITEsZSkpLHI9aT10LnBvc2l0aW9uKTp0LnBvc2l0aW9uPT09dC5saW5lU3RhcnQmJnd0KHQpP2Z0KHQsInVuZXhwZWN0ZWQgZW5kIG9mIHRoZSBkb2N1bWVudCB3aXRoaW4gYSBzaW5nbGUgcXVvdGVkIHNjYWxhciIpOih0LnBvc2l0aW9uKyssaT10LnBvc2l0aW9uKTtmdCh0LCJ1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIHNpbmdsZSBxdW90ZWQgc2NhbGFyIil9KHQsaCl8fGZ1bmN0aW9uKHQsZSl7dmFyIG4scixpLG8sdSxzLGE7aWYoMzQhPT0ocz10LmlucHV0LmNoYXJDb2RlQXQodC5wb3NpdGlvbikpKXJldHVybiExO2Zvcih0LmtpbmQ9InNjYWxhciIsdC5yZXN1bHQ9IiIsdC5wb3NpdGlvbisrLG49cj10LnBvc2l0aW9uOzAhPT0ocz10LmlucHV0LmNoYXJDb2RlQXQodC5wb3NpdGlvbikpOyl7aWYoMzQ9PT1zKXJldHVybiBodCh0LG4sdC5wb3NpdGlvbiwhMCksdC5wb3NpdGlvbisrLCEwO2lmKDkyPT09cyl7aWYoaHQodCxuLHQucG9zaXRpb24sITApLEsocz10LmlucHV0LmNoYXJDb2RlQXQoKyt0LnBvc2l0aW9uKSkpZ3QodCwhMSxlKTtlbHNlIGlmKHM8MjU2JiZvdFtzXSl0LnJlc3VsdCs9dXRbc10sdC5wb3NpdGlvbisrO2Vsc2UgaWYoKHU9MTIwPT09KGE9cyk/MjoxMTc9PT1hPzQ6ODU9PT1hPzg6MCk+MCl7Zm9yKGk9dSxvPTA7aT4wO2ktLSkodT1udChzPXQuaW5wdXQuY2hhckNvZGVBdCgrK3QucG9zaXRpb24pKSk+PTA/bz0obzw8NCkrdTpmdCh0LCJleHBlY3RlZCBoZXhhZGVjaW1hbCBjaGFyYWN0ZXIiKTt0LnJlc3VsdCs9aXQobyksdC5wb3NpdGlvbisrfWVsc2UgZnQodCwidW5rbm93biBlc2NhcGUgc2VxdWVuY2UiKTtuPXI9dC5wb3NpdGlvbn1lbHNlIEsocyk/KGh0KHQsbixyLCEwKSxNdCh0LGd0KHQsITEsZSkpLG49cj10LnBvc2l0aW9uKTp0LnBvc2l0aW9uPT09dC5saW5lU3RhcnQmJnd0KHQpP2Z0KHQsInVuZXhwZWN0ZWQgZW5kIG9mIHRoZSBkb2N1bWVudCB3aXRoaW4gYSBkb3VibGUgcXVvdGVkIHNjYWxhciIpOih0LnBvc2l0aW9uKysscj10LnBvc2l0aW9uKX1mdCh0LCJ1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIGRvdWJsZSBxdW90ZWQgc2NhbGFyIil9KHQsaCk/Zz0hMDohZnVuY3Rpb24odCl7dmFyIGUsbixyO2lmKDQyIT09KHI9dC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24pKSlyZXR1cm4hMTtmb3Iocj10LmlucHV0LmNoYXJDb2RlQXQoKyt0LnBvc2l0aW9uKSxlPXQucG9zaXRpb247MCE9PXImJiF0dChyKSYmIWV0KHIpOylyPXQuaW5wdXQuY2hhckNvZGVBdCgrK3QucG9zaXRpb24pO3JldHVybiB0LnBvc2l0aW9uPT09ZSYmZnQodCwibmFtZSBvZiBhbiBhbGlhcyBub2RlIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIiksbj10LmlucHV0LnNsaWNlKGUsdC5wb3NpdGlvbiksVy5jYWxsKHQuYW5jaG9yTWFwLG4pfHxmdCh0LCd1bmlkZW50aWZpZWQgYWxpYXMgIicrbisnIicpLHQucmVzdWx0PXQuYW5jaG9yTWFwW25dLGd0KHQsITAsLTEpLCEwfSh0KT9mdW5jdGlvbih0LGUsbil7dmFyIHIsaSxvLHUscyxhLGMsZixsPXQua2luZCxwPXQucmVzdWx0O2lmKHR0KGY9dC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24pKXx8ZXQoZil8fDM1PT09Znx8Mzg9PT1mfHw0Mj09PWZ8fDMzPT09Znx8MTI0PT09Znx8NjI9PT1mfHwzOT09PWZ8fDM0PT09Znx8Mzc9PT1mfHw2ND09PWZ8fDk2PT09ZilyZXR1cm4hMTtpZigoNjM9PT1mfHw0NT09PWYpJiYodHQocj10LmlucHV0LmNoYXJDb2RlQXQodC5wb3NpdGlvbisxKSl8fG4mJmV0KHIpKSlyZXR1cm4hMTtmb3IodC5raW5kPSJzY2FsYXIiLHQucmVzdWx0PSIiLGk9bz10LnBvc2l0aW9uLHU9ITE7MCE9PWY7KXtpZig1OD09PWYpe2lmKHR0KHI9dC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24rMSkpfHxuJiZldChyKSlicmVha31lbHNlIGlmKDM1PT09Zil7aWYodHQodC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24tMSkpKWJyZWFrfWVsc2V7aWYodC5wb3NpdGlvbj09PXQubGluZVN0YXJ0JiZ3dCh0KXx8biYmZXQoZikpYnJlYWs7aWYoSyhmKSl7aWYocz10LmxpbmUsYT10LmxpbmVTdGFydCxjPXQubGluZUluZGVudCxndCh0LCExLC0xKSx0LmxpbmVJbmRlbnQ+PWUpe3U9ITAsZj10LmlucHV0LmNoYXJDb2RlQXQodC5wb3NpdGlvbik7Y29udGludWV9dC5wb3NpdGlvbj1vLHQubGluZT1zLHQubGluZVN0YXJ0PWEsdC5saW5lSW5kZW50PWM7YnJlYWt9fXUmJihodCh0LGksbywhMSksTXQodCx0LmxpbmUtcyksaT1vPXQucG9zaXRpb24sdT0hMSksJChmKXx8KG89dC5wb3NpdGlvbisxKSxmPXQuaW5wdXQuY2hhckNvZGVBdCgrK3QucG9zaXRpb24pfXJldHVybiBodCh0LGksbywhMSksISF0LnJlc3VsdHx8KHQua2luZD1sLHQucmVzdWx0PXAsITEpfSh0LGgsMT09PW4pJiYoZz0hMCxudWxsPT09dC50YWcmJih0LnRhZz0iPyIpKTooZz0hMCxudWxsPT09dC50YWcmJm51bGw9PT10LmFuY2hvcnx8ZnQodCwiYWxpYXMgbm9kZSBzaG91bGQgbm90IGhhdmUgYW55IHByb3BlcnRpZXMiKSksbnVsbCE9PXQuYW5jaG9yJiYodC5hbmNob3JNYXBbdC5hbmNob3JdPXQucmVzdWx0KSk6MD09PXkmJihnPWEmJm10KHQsZCkpKSxudWxsPT09dC50YWcpbnVsbCE9PXQuYW5jaG9yJiYodC5hbmNob3JNYXBbdC5hbmNob3JdPXQucmVzdWx0KTtlbHNlIGlmKCI/Ij09PXQudGFnKXtmb3IobnVsbCE9PXQucmVzdWx0JiYic2NhbGFyIiE9PXQua2luZCYmZnQodCwndW5hY2NlcHRhYmxlIG5vZGUga2luZCBmb3IgITw/PiB0YWc7IGl0IHNob3VsZCBiZSAic2NhbGFyIiwgbm90ICInK3Qua2luZCsnIicpLGM9MCxmPXQuaW1wbGljaXRUeXBlcy5sZW5ndGg7YzxmO2MrPTEpaWYoKHA9dC5pbXBsaWNpdFR5cGVzW2NdKS5yZXNvbHZlKHQucmVzdWx0KSl7dC5yZXN1bHQ9cC5jb25zdHJ1Y3QodC5yZXN1bHQpLHQudGFnPXAudGFnLG51bGwhPT10LmFuY2hvciYmKHQuYW5jaG9yTWFwW3QuYW5jaG9yXT10LnJlc3VsdCk7YnJlYWt9fWVsc2UgaWYoIiEiIT09dC50YWcpe2lmKFcuY2FsbCh0LnR5cGVNYXBbdC5raW5kfHwiZmFsbGJhY2siXSx0LnRhZykpcD10LnR5cGVNYXBbdC5raW5kfHwiZmFsbGJhY2siXVt0LnRhZ107ZWxzZSBmb3IocD1udWxsLGM9MCxmPShsPXQudHlwZU1hcC5tdWx0aVt0LmtpbmR8fCJmYWxsYmFjayJdKS5sZW5ndGg7YzxmO2MrPTEpaWYodC50YWcuc2xpY2UoMCxsW2NdLnRhZy5sZW5ndGgpPT09bFtjXS50YWcpe3A9bFtjXTticmVha31wfHxmdCh0LCJ1bmtub3duIHRhZyAhPCIrdC50YWcrIj4iKSxudWxsIT09dC5yZXN1bHQmJnAua2luZCE9PXQua2luZCYmZnQodCwidW5hY2NlcHRhYmxlIG5vZGUga2luZCBmb3IgITwiK3QudGFnKyc+IHRhZzsgaXQgc2hvdWxkIGJlICInK3Aua2luZCsnIiwgbm90ICInK3Qua2luZCsnIicpLHAucmVzb2x2ZSh0LnJlc3VsdCx0LnRhZyk/KHQucmVzdWx0PXAuY29uc3RydWN0KHQucmVzdWx0LHQudGFnKSxudWxsIT09dC5hbmNob3ImJih0LmFuY2hvck1hcFt0LmFuY2hvcl09dC5yZXN1bHQpKTpmdCh0LCJjYW5ub3QgcmVzb2x2ZSBhIG5vZGUgd2l0aCAhPCIrdC50YWcrIj4gZXhwbGljaXQgdGFnIil9cmV0dXJuIG51bGwhPT10Lmxpc3RlbmVyJiZ0Lmxpc3RlbmVyKCJjbG9zZSIsdCksbnVsbCE9PXQudGFnfHxudWxsIT09dC5hbmNob3J8fGd9ZnVuY3Rpb24geHQodCl7dmFyIGUsbixyLGksbz10LnBvc2l0aW9uLHU9ITE7Zm9yKHQudmVyc2lvbj1udWxsLHQuY2hlY2tMaW5lQnJlYWtzPXQubGVnYWN5LHQudGFnTWFwPU9iamVjdC5jcmVhdGUobnVsbCksdC5hbmNob3JNYXA9T2JqZWN0LmNyZWF0ZShudWxsKTswIT09KGk9dC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24pKSYmKGd0KHQsITAsLTEpLGk9dC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24pLCEodC5saW5lSW5kZW50PjB8fDM3IT09aSkpOyl7Zm9yKHU9ITAsaT10LmlucHV0LmNoYXJDb2RlQXQoKyt0LnBvc2l0aW9uKSxlPXQucG9zaXRpb247MCE9PWkmJiF0dChpKTspaT10LmlucHV0LmNoYXJDb2RlQXQoKyt0LnBvc2l0aW9uKTtmb3Iocj1bXSwobj10LmlucHV0LnNsaWNlKGUsdC5wb3NpdGlvbikpLmxlbmd0aDwxJiZmdCh0LCJkaXJlY3RpdmUgbmFtZSBtdXN0IG5vdCBiZSBsZXNzIHRoYW4gb25lIGNoYXJhY3RlciBpbiBsZW5ndGgiKTswIT09aTspe2Zvcig7JChpKTspaT10LmlucHV0LmNoYXJDb2RlQXQoKyt0LnBvc2l0aW9uKTtpZigzNT09PWkpe2Rve2k9dC5pbnB1dC5jaGFyQ29kZUF0KCsrdC5wb3NpdGlvbil9d2hpbGUoMCE9PWkmJiFLKGkpKTticmVha31pZihLKGkpKWJyZWFrO2ZvcihlPXQucG9zaXRpb247MCE9PWkmJiF0dChpKTspaT10LmlucHV0LmNoYXJDb2RlQXQoKyt0LnBvc2l0aW9uKTtyLnB1c2godC5pbnB1dC5zbGljZShlLHQucG9zaXRpb24pKX0wIT09aSYmdnQodCksVy5jYWxsKHB0LG4pP3B0W25dKHQsbixyKTpsdCh0LCd1bmtub3duIGRvY3VtZW50IGRpcmVjdGl2ZSAiJytuKyciJyl9Z3QodCwhMCwtMSksMD09PXQubGluZUluZGVudCYmNDU9PT10LmlucHV0LmNoYXJDb2RlQXQodC5wb3NpdGlvbikmJjQ1PT09dC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24rMSkmJjQ1PT09dC5pbnB1dC5jaGFyQ29kZUF0KHQucG9zaXRpb24rMik/KHQucG9zaXRpb24rPTMsZ3QodCwhMCwtMSkpOnUmJmZ0KHQsImRpcmVjdGl2ZXMgZW5kIG1hcmsgaXMgZXhwZWN0ZWQiKSxidCh0LHQubGluZUluZGVudC0xLDQsITEsITApLGd0KHQsITAsLTEpLHQuY2hlY2tMaW5lQnJlYWtzJiZKLnRlc3QodC5pbnB1dC5zbGljZShvLHQucG9zaXRpb24pKSYmbHQodCwibm9uLUFTQ0lJIGxpbmUgYnJlYWtzIGFyZSBpbnRlcnByZXRlZCBhcyBjb250ZW50IiksdC5kb2N1bWVudHMucHVzaCh0LnJlc3VsdCksdC5wb3NpdGlvbj09PXQubGluZVN0YXJ0JiZ3dCh0KT80Nj09PXQuaW5wdXQuY2hhckNvZGVBdCh0LnBvc2l0aW9uKSYmKHQucG9zaXRpb24rPTMsZ3QodCwhMCwtMSkpOnQucG9zaXRpb248dC5sZW5ndGgtMSYmZnQodCwiZW5kIG9mIHRoZSBzdHJlYW0gb3IgYSBkb2N1bWVudCBzZXBhcmF0b3IgaXMgZXhwZWN0ZWQiKX1mdW5jdGlvbiBqdCh0LGUpe2U9ZXx8e30sMCE9PSh0PVN0cmluZyh0KSkubGVuZ3RoJiYoMTAhPT10LmNoYXJDb2RlQXQodC5sZW5ndGgtMSkmJjEzIT09dC5jaGFyQ29kZUF0KHQubGVuZ3RoLTEpJiYodCs9IlxuIiksNjUyNzk9PT10LmNoYXJDb2RlQXQoMCkmJih0PXQuc2xpY2UoMSkpKTt2YXIgbj1uZXcgYXQodCxlKSxyPXQuaW5kZXhPZigiXDAiKTtmb3IoLTEhPT1yJiYobi5wb3NpdGlvbj1yLGZ0KG4sIm51bGwgYnl0ZSBpcyBub3QgYWxsb3dlZCBpbiBpbnB1dCIpKSxuLmlucHV0Kz0iXDAiOzMyPT09bi5pbnB1dC5jaGFyQ29kZUF0KG4ucG9zaXRpb24pOyluLmxpbmVJbmRlbnQrPTEsbi5wb3NpdGlvbis9MTtmb3IoO24ucG9zaXRpb248bi5sZW5ndGgtMTspeHQobik7cmV0dXJuIG4uZG9jdW1lbnRzfXZhciBOdD17bG9hZEFsbDpmdW5jdGlvbih0LGUsbil7bnVsbCE9PWUmJiJvYmplY3QiPT10eXBlb2YgZSYmdm9pZCAwPT09biYmKG49ZSxlPW51bGwpO3ZhciByPWp0KHQsbik7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpcmV0dXJuIHI7Zm9yKHZhciBpPTAsbz1yLmxlbmd0aDtpPG87aSs9MSllKHJbaV0pfSxsb2FkOmZ1bmN0aW9uKHQsZSl7dmFyIG49anQodCxlKTtpZigwIT09bi5sZW5ndGgpe2lmKDE9PT1uLmxlbmd0aClyZXR1cm4gblswXTt0aHJvdyBuZXcgcygiZXhwZWN0ZWQgYSBzaW5nbGUgZG9jdW1lbnQgaW4gdGhlIHN0cmVhbSwgYnV0IGZvdW5kIG1vcmUiKX19fSxTdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLER0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksSXQ9NjUyNzksQXQ9ezA6IlxcMCIsNzoiXFxhIiw4OiJcXGIiLDk6IlxcdCIsMTA6IlxcbiIsMTE6IlxcdiIsMTI6IlxcZiIsMTM6IlxcciIsMjc6IlxcZSIsMzQ6J1xcIicsOTI6IlxcXFwiLDEzMzoiXFxOIiwxNjA6IlxcXyIsODIzMjoiXFxMIiw4MjMzOiJcXFAifSxPdD1bInkiLCJZIiwieWVzIiwiWWVzIiwiWUVTIiwib24iLCJPbiIsIk9OIiwibiIsIk4iLCJubyIsIk5vIiwiTk8iLCJvZmYiLCJPZmYiLCJPRkYiXSxUdD0vXlstK10/WzAtOV9dKyg/OjpbMC05X10rKSsoPzpcLlswLTlfXSopPyQvO2Z1bmN0aW9uIEN0KHQpe3ZhciBlLG4scjtpZihlPXQudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCksdDw9MjU1KW49IngiLHI9MjtlbHNlIGlmKHQ8PTY1NTM1KW49InUiLHI9NDtlbHNle2lmKCEodDw9NDI5NDk2NzI5NSkpdGhyb3cgbmV3IHMoImNvZGUgcG9pbnQgd2l0aGluIGEgc3RyaW5nIG1heSBub3QgYmUgZ3JlYXRlciB0aGFuIDB4RkZGRkZGRkYiKTtuPSJVIixyPTh9cmV0dXJuIlxcIituK2kucmVwZWF0KCIwIixyLWUubGVuZ3RoKStlfWZ1bmN0aW9uIEV0KHQpe3RoaXMuc2NoZW1hPXQuc2NoZW1hfHxHLHRoaXMuaW5kZW50PU1hdGgubWF4KDEsdC5pbmRlbnR8fDIpLHRoaXMubm9BcnJheUluZGVudD10Lm5vQXJyYXlJbmRlbnR8fCExLHRoaXMuc2tpcEludmFsaWQ9dC5za2lwSW52YWxpZHx8ITEsdGhpcy5mbG93TGV2ZWw9aS5pc05vdGhpbmcodC5mbG93TGV2ZWwpPy0xOnQuZmxvd0xldmVsLHRoaXMuc3R5bGVNYXA9ZnVuY3Rpb24odCxlKXt2YXIgbixyLGksbyx1LHMsYTtpZihudWxsPT09ZSlyZXR1cm57fTtmb3Iobj17fSxpPTAsbz0ocj1PYmplY3Qua2V5cyhlKSkubGVuZ3RoO2k8bztpKz0xKXU9cltpXSxzPVN0cmluZyhlW3VdKSwiISEiPT09dS5zbGljZSgwLDIpJiYodT0idGFnOnlhbWwub3JnLDIwMDI6Iit1LnNsaWNlKDIpKSwoYT10LmNvbXBpbGVkVHlwZU1hcC5mYWxsYmFja1t1XSkmJkR0LmNhbGwoYS5zdHlsZUFsaWFzZXMscykmJihzPWEuc3R5bGVBbGlhc2VzW3NdKSxuW3VdPXM7cmV0dXJuIG59KHRoaXMuc2NoZW1hLHQuc3R5bGVzfHxudWxsKSx0aGlzLnNvcnRLZXlzPXQuc29ydEtleXN8fCExLHRoaXMubGluZVdpZHRoPXQubGluZVdpZHRofHw4MCx0aGlzLm5vUmVmcz10Lm5vUmVmc3x8ITEsdGhpcy5ub0NvbXBhdE1vZGU9dC5ub0NvbXBhdE1vZGV8fCExLHRoaXMuY29uZGVuc2VGbG93PXQuY29uZGVuc2VGbG93fHwhMSx0aGlzLnF1b3RpbmdUeXBlPSciJz09PXQucXVvdGluZ1R5cGU/MjoxLHRoaXMuZm9yY2VRdW90ZXM9dC5mb3JjZVF1b3Rlc3x8ITEsdGhpcy5yZXBsYWNlcj0iZnVuY3Rpb24iPT10eXBlb2YgdC5yZXBsYWNlcj90LnJlcGxhY2VyOm51bGwsdGhpcy5pbXBsaWNpdFR5cGVzPXRoaXMuc2NoZW1hLmNvbXBpbGVkSW1wbGljaXQsdGhpcy5leHBsaWNpdFR5cGVzPXRoaXMuc2NoZW1hLmNvbXBpbGVkRXhwbGljaXQsdGhpcy50YWc9bnVsbCx0aGlzLnJlc3VsdD0iIix0aGlzLmR1cGxpY2F0ZXM9W10sdGhpcy51c2VkRHVwbGljYXRlcz1udWxsfWZ1bmN0aW9uIHp0KHQsZSl7Zm9yKHZhciBuLHI9aS5yZXBlYXQoIiAiLGUpLG89MCx1PS0xLHM9IiIsYT10Lmxlbmd0aDtvPGE7KS0xPT09KHU9dC5pbmRleE9mKCJcbiIsbykpPyhuPXQuc2xpY2Uobyksbz1hKToobj10LnNsaWNlKG8sdSsxKSxvPXUrMSksbi5sZW5ndGgmJiJcbiIhPT1uJiYocys9cikscys9bjtyZXR1cm4gc31mdW5jdGlvbiBrdCh0LGUpe3JldHVybiJcbiIraS5yZXBlYXQoIiAiLHQuaW5kZW50KmUpfWZ1bmN0aW9uIFl0KHQpe3JldHVybiAzMj09PXR8fDk9PT10fWZ1bmN0aW9uIFV0KHQpe3JldHVybiAzMjw9dCYmdDw9MTI2fHwxNjE8PXQmJnQ8PTU1Mjk1JiY4MjMyIT09dCYmODIzMyE9PXR8fDU3MzQ0PD10JiZ0PD02NTUzMyYmdCE9PUl0fHw2NTUzNjw9dCYmdDw9MTExNDExMX1mdW5jdGlvbiBQdCh0KXtyZXR1cm4gVXQodCkmJnQhPT1JdCYmMTMhPT10JiYxMCE9PXR9ZnVuY3Rpb24gUnQodCxlLG4pe3ZhciByPVB0KHQpLGk9ciYmIVl0KHQpO3JldHVybihuP3I6ciYmNDQhPT10JiY5MSE9PXQmJjkzIT09dCYmMTIzIT09dCYmMTI1IT09dCkmJjM1IT09dCYmISg1OD09PWUmJiFpKXx8UHQoZSkmJiFZdChlKSYmMzU9PT10fHw1OD09PWUmJml9ZnVuY3Rpb24gUXQodCxlKXt2YXIgbixyPXQuY2hhckNvZGVBdChlKTtyZXR1cm4gcj49NTUyOTYmJnI8PTU2MzE5JiZlKzE8dC5sZW5ndGgmJihuPXQuY2hhckNvZGVBdChlKzEpKT49NTYzMjAmJm48PTU3MzQzPzEwMjQqKHItNTUyOTYpK24tNTYzMjArNjU1MzY6cn1mdW5jdGlvbiBGdCh0KXtyZXR1cm4vXlxuKiAvLnRlc3QodCl9ZnVuY3Rpb24gQnQodCxlLG4scixpLG8sdSxzKXt2YXIgYSxjLGY9MCxsPW51bGwscD0hMSxoPSExLGQ9LTEhPT1yLHk9LTEsdj1VdChjPVF0KHQsMCkpJiZjIT09SXQmJiFZdChjKSYmNDUhPT1jJiY2MyE9PWMmJjU4IT09YyYmNDQhPT1jJiY5MSE9PWMmJjkzIT09YyYmMTIzIT09YyYmMTI1IT09YyYmMzUhPT1jJiYzOCE9PWMmJjQyIT09YyYmMzMhPT1jJiYxMjQhPT1jJiY2MSE9PWMmJjYyIT09YyYmMzkhPT1jJiYzNCE9PWMmJjM3IT09YyYmNjQhPT1jJiY5NiE9PWMmJmZ1bmN0aW9uKHQpe3JldHVybiFZdCh0KSYmNTghPT10fShRdCh0LHQubGVuZ3RoLTEpKTtpZihlfHx1KWZvcihhPTA7YTx0Lmxlbmd0aDtmPj02NTUzNj9hKz0yOmErKyl7aWYoIVV0KGY9UXQodCxhKSkpcmV0dXJuIDU7dj12JiZSdChmLGwscyksbD1mfWVsc2V7Zm9yKGE9MDthPHQubGVuZ3RoO2Y+PTY1NTM2P2ErPTI6YSsrKXtpZigxMD09PShmPVF0KHQsYSkpKXA9ITAsZCYmKGg9aHx8YS15LTE+ciYmIiAiIT09dFt5KzFdLHk9YSk7ZWxzZSBpZighVXQoZikpcmV0dXJuIDU7dj12JiZSdChmLGwscyksbD1mfWg9aHx8ZCYmYS15LTE+ciYmIiAiIT09dFt5KzFdfXJldHVybiBwfHxoP24+OSYmRnQodCk/NTp1PzI9PT1vPzU6MjpoPzQ6Mzohdnx8dXx8aSh0KT8yPT09bz81OjI6MX1mdW5jdGlvbiBHdCh0LGUsbixyLGkpe3QuZHVtcD1mdW5jdGlvbigpe2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gMj09PXQucXVvdGluZ1R5cGU/JyIiJzoiJyciO2lmKCF0Lm5vQ29tcGF0TW9kZSYmKC0xIT09T3QuaW5kZXhPZihlKXx8VHQudGVzdChlKSkpcmV0dXJuIDI9PT10LnF1b3RpbmdUeXBlPyciJytlKyciJzoiJyIrZSsiJyI7dmFyIG89dC5pbmRlbnQqTWF0aC5tYXgoMSxuKSx1PS0xPT09dC5saW5lV2lkdGg/LTE6TWF0aC5tYXgoTWF0aC5taW4odC5saW5lV2lkdGgsNDApLHQubGluZVdpZHRoLW8pLGE9cnx8dC5mbG93TGV2ZWw+LTEmJm4+PXQuZmxvd0xldmVsO3N3aXRjaChCdChlLGEsdC5pbmRlbnQsdSwoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dmFyIG4scjtmb3Iobj0wLHI9dC5pbXBsaWNpdFR5cGVzLmxlbmd0aDtuPHI7bis9MSlpZih0LmltcGxpY2l0VHlwZXNbbl0ucmVzb2x2ZShlKSlyZXR1cm4hMDtyZXR1cm4hMX0odCxlKX0pLHQucXVvdGluZ1R5cGUsdC5mb3JjZVF1b3RlcyYmIXIsaSkpe2Nhc2UgMTpyZXR1cm4gZTtjYXNlIDI6cmV0dXJuIiciK2UucmVwbGFjZSgvJy9nLCInJyIpKyInIjtjYXNlIDM6cmV0dXJuInwiK1d0KGUsdC5pbmRlbnQpK3F0KHp0KGUsbykpO2Nhc2UgNDpyZXR1cm4iPiIrV3QoZSx0LmluZGVudCkrcXQoenQoZnVuY3Rpb24odCxlKXt2YXIgbixyLGk9LyhcbispKFteXG5dKikvZyxvPShzPXQuaW5kZXhPZigiXG4iKSxzPS0xIT09cz9zOnQubGVuZ3RoLGkubGFzdEluZGV4PXMsSnQodC5zbGljZSgwLHMpLGUpKSx1PSJcbiI9PT10WzBdfHwiICI9PT10WzBdO3ZhciBzO2Zvcig7cj1pLmV4ZWModCk7KXt2YXIgYT1yWzFdLGM9clsyXTtuPSIgIj09PWNbMF0sbys9YSsodXx8bnx8IiI9PT1jPyIiOiJcbiIpK0p0KGMsZSksdT1ufXJldHVybiBvfShlLHUpLG8pKTtjYXNlIDU6cmV0dXJuJyInK2Z1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPSIiLHI9MCxpPTA7aTx0Lmxlbmd0aDtyPj02NTUzNj9pKz0yOmkrKylyPVF0KHQsaSksIShlPUF0W3JdKSYmVXQocik/KG4rPXRbaV0scj49NjU1MzYmJihuKz10W2krMV0pKTpuKz1lfHxDdChyKTtyZXR1cm4gbn0oZSkrJyInO2RlZmF1bHQ6dGhyb3cgbmV3IHMoImltcG9zc2libGUgZXJyb3I6IGludmFsaWQgc2NhbGFyIHN0eWxlIil9fSgpfWZ1bmN0aW9uIFd0KHQsZSl7dmFyIG49RnQodCk/U3RyaW5nKGUpOiIiLHI9IlxuIj09PXRbdC5sZW5ndGgtMV07cmV0dXJuIG4rKHImJigiXG4iPT09dFt0Lmxlbmd0aC0yXXx8IlxuIj09PXQpPyIrIjpyPyIiOiItIikrIlxuIn1mdW5jdGlvbiBxdCh0KXtyZXR1cm4iXG4iPT09dFt0Lmxlbmd0aC0xXT90LnNsaWNlKDAsLTEpOnR9ZnVuY3Rpb24gSnQodCxlKXtpZigiIj09PXR8fCIgIj09PXRbMF0pcmV0dXJuIHQ7Zm9yKHZhciBuLHIsaT0vIFteIF0vZyxvPTAsdT0wLHM9MCxhPSIiO249aS5leGVjKHQpOykocz1uLmluZGV4KS1vPmUmJihyPXU+bz91OnMsYSs9IlxuIit0LnNsaWNlKG8sciksbz1yKzEpLHU9cztyZXR1cm4gYSs9IlxuIix0Lmxlbmd0aC1vPmUmJnU+bz9hKz10LnNsaWNlKG8sdSkrIlxuIit0LnNsaWNlKHUrMSk6YSs9dC5zbGljZShvKSxhLnNsaWNlKDEpfWZ1bmN0aW9uIFp0KHQsZSxuLHIpe3ZhciBpLG8sdSxzPSIiLGE9dC50YWc7Zm9yKGk9MCxvPW4ubGVuZ3RoO2k8bztpKz0xKXU9bltpXSx0LnJlcGxhY2VyJiYodT10LnJlcGxhY2VyLmNhbGwobixTdHJpbmcoaSksdSkpLChYdCh0LGUrMSx1LCEwLCEwLCExLCEwKXx8dm9pZCAwPT09dSYmWHQodCxlKzEsbnVsbCwhMCwhMCwhMSwhMCkpJiYociYmIiI9PT1zfHwocys9a3QodCxlKSksdC5kdW1wJiYxMD09PXQuZHVtcC5jaGFyQ29kZUF0KDApP3MrPSItIjpzKz0iLSAiLHMrPXQuZHVtcCk7dC50YWc9YSx0LmR1bXA9c3x8IltdIn1mdW5jdGlvbiBWdCh0LGUsbil7dmFyIHIsaSxvLHUsYSxjO2ZvcihvPTAsdT0oaT1uP3QuZXhwbGljaXRUeXBlczp0LmltcGxpY2l0VHlwZXMpLmxlbmd0aDtvPHU7bys9MSlpZigoKGE9aVtvXSkuaW5zdGFuY2VPZnx8YS5wcmVkaWNhdGUpJiYoIWEuaW5zdGFuY2VPZnx8Im9iamVjdCI9PXR5cGVvZiBlJiZlIGluc3RhbmNlb2YgYS5pbnN0YW5jZU9mKSYmKCFhLnByZWRpY2F0ZXx8YS5wcmVkaWNhdGUoZSkpKXtpZihuP2EubXVsdGkmJmEucmVwcmVzZW50TmFtZT90LnRhZz1hLnJlcHJlc2VudE5hbWUoZSk6dC50YWc9YS50YWc6dC50YWc9Ij8iLGEucmVwcmVzZW50KXtpZihjPXQuc3R5bGVNYXBbYS50YWddfHxhLmRlZmF1bHRTdHlsZSwiW29iamVjdCBGdW5jdGlvbl0iPT09U3QuY2FsbChhLnJlcHJlc2VudCkpcj1hLnJlcHJlc2VudChlLGMpO2Vsc2V7aWYoIUR0LmNhbGwoYS5yZXByZXNlbnQsYykpdGhyb3cgbmV3IHMoIiE8IithLnRhZysnPiB0YWcgcmVzb2x2ZXIgYWNjZXB0cyBub3QgIicrYysnIiBzdHlsZScpO3I9YS5yZXByZXNlbnRbY10oZSxjKX10LmR1bXA9cn1yZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBYdCh0LGUsbixyLGksbyx1KXt0LnRhZz1udWxsLHQuZHVtcD1uLFZ0KHQsbiwhMSl8fFZ0KHQsbiwhMCk7dmFyIGEsYz1TdC5jYWxsKHQuZHVtcCksZj1yO3ImJihyPXQuZmxvd0xldmVsPDB8fHQuZmxvd0xldmVsPmUpO3ZhciBsLHAsaD0iW29iamVjdCBPYmplY3RdIj09PWN8fCJbb2JqZWN0IEFycmF5XSI9PT1jO2lmKGgmJihwPS0xIT09KGw9dC5kdXBsaWNhdGVzLmluZGV4T2YobikpKSwobnVsbCE9PXQudGFnJiYiPyIhPT10LnRhZ3x8cHx8MiE9PXQuaW5kZW50JiZlPjApJiYoaT0hMSkscCYmdC51c2VkRHVwbGljYXRlc1tsXSl0LmR1bXA9IipyZWZfIitsO2Vsc2V7aWYoaCYmcCYmIXQudXNlZER1cGxpY2F0ZXNbbF0mJih0LnVzZWREdXBsaWNhdGVzW2xdPSEwKSwiW29iamVjdCBPYmplY3RdIj09PWMpciYmMCE9PU9iamVjdC5rZXlzKHQuZHVtcCkubGVuZ3RoPyghZnVuY3Rpb24odCxlLG4scil7dmFyIGksbyx1LGEsYyxmLGw9IiIscD10LnRhZyxoPU9iamVjdC5rZXlzKG4pO2lmKCEwPT09dC5zb3J0S2V5cyloLnNvcnQoKTtlbHNlIGlmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LnNvcnRLZXlzKWguc29ydCh0LnNvcnRLZXlzKTtlbHNlIGlmKHQuc29ydEtleXMpdGhyb3cgbmV3IHMoInNvcnRLZXlzIG11c3QgYmUgYSBib29sZWFuIG9yIGEgZnVuY3Rpb24iKTtmb3IoaT0wLG89aC5sZW5ndGg7aTxvO2krPTEpZj0iIixyJiYiIj09PWx8fChmKz1rdCh0LGUpKSxhPW5bdT1oW2ldXSx0LnJlcGxhY2VyJiYoYT10LnJlcGxhY2VyLmNhbGwobix1LGEpKSxYdCh0LGUrMSx1LCEwLCEwLCEwKSYmKChjPW51bGwhPT10LnRhZyYmIj8iIT09dC50YWd8fHQuZHVtcCYmdC5kdW1wLmxlbmd0aD4xMDI0KSYmKHQuZHVtcCYmMTA9PT10LmR1bXAuY2hhckNvZGVBdCgwKT9mKz0iPyI6Zis9Ij8gIiksZis9dC5kdW1wLGMmJihmKz1rdCh0LGUpKSxYdCh0LGUrMSxhLCEwLGMpJiYodC5kdW1wJiYxMD09PXQuZHVtcC5jaGFyQ29kZUF0KDApP2YrPSI6IjpmKz0iOiAiLGwrPWYrPXQuZHVtcCkpO3QudGFnPXAsdC5kdW1wPWx8fCJ7fSJ9KHQsZSx0LmR1bXAsaSkscCYmKHQuZHVtcD0iJnJlZl8iK2wrdC5kdW1wKSk6KCFmdW5jdGlvbih0LGUsbil7dmFyIHIsaSxvLHUscyxhPSIiLGM9dC50YWcsZj1PYmplY3Qua2V5cyhuKTtmb3Iocj0wLGk9Zi5sZW5ndGg7cjxpO3IrPTEpcz0iIiwiIiE9PWEmJihzKz0iLCAiKSx0LmNvbmRlbnNlRmxvdyYmKHMrPSciJyksdT1uW289ZltyXV0sdC5yZXBsYWNlciYmKHU9dC5yZXBsYWNlci5jYWxsKG4sbyx1KSksWHQodCxlLG8sITEsITEpJiYodC5kdW1wLmxlbmd0aD4xMDI0JiYocys9Ij8gIikscys9dC5kdW1wKyh0LmNvbmRlbnNlRmxvdz8nIic6IiIpKyI6IisodC5jb25kZW5zZUZsb3c/IiI6IiAiKSxYdCh0LGUsdSwhMSwhMSkmJihhKz1zKz10LmR1bXApKTt0LnRhZz1jLHQuZHVtcD0ieyIrYSsifSJ9KHQsZSx0LmR1bXApLHAmJih0LmR1bXA9IiZyZWZfIitsKyIgIit0LmR1bXApKTtlbHNlIGlmKCJbb2JqZWN0IEFycmF5XSI9PT1jKXImJjAhPT10LmR1bXAubGVuZ3RoPyh0Lm5vQXJyYXlJbmRlbnQmJiF1JiZlPjA/WnQodCxlLTEsdC5kdW1wLGkpOlp0KHQsZSx0LmR1bXAsaSkscCYmKHQuZHVtcD0iJnJlZl8iK2wrdC5kdW1wKSk6KCFmdW5jdGlvbih0LGUsbil7dmFyIHIsaSxvLHU9IiIscz10LnRhZztmb3Iocj0wLGk9bi5sZW5ndGg7cjxpO3IrPTEpbz1uW3JdLHQucmVwbGFjZXImJihvPXQucmVwbGFjZXIuY2FsbChuLFN0cmluZyhyKSxvKSksKFh0KHQsZSxvLCExLCExKXx8dm9pZCAwPT09byYmWHQodCxlLG51bGwsITEsITEpKSYmKCIiIT09dSYmKHUrPSIsIisodC5jb25kZW5zZUZsb3c/IiI6IiAiKSksdSs9dC5kdW1wKTt0LnRhZz1zLHQuZHVtcD0iWyIrdSsiXSJ9KHQsZSx0LmR1bXApLHAmJih0LmR1bXA9IiZyZWZfIitsKyIgIit0LmR1bXApKTtlbHNle2lmKCJbb2JqZWN0IFN0cmluZ10iIT09Yyl7aWYoIltvYmplY3QgVW5kZWZpbmVkXSI9PT1jKXJldHVybiExO2lmKHQuc2tpcEludmFsaWQpcmV0dXJuITE7dGhyb3cgbmV3IHMoInVuYWNjZXB0YWJsZSBraW5kIG9mIGFuIG9iamVjdCB0byBkdW1wICIrYyl9Ij8iIT09dC50YWcmJkd0KHQsdC5kdW1wLGUsbyxmKX1udWxsIT09dC50YWcmJiI/IiE9PXQudGFnJiYoYT1lbmNvZGVVUkkoIiEiPT09dC50YWdbMF0/dC50YWcuc2xpY2UoMSk6dC50YWcpLnJlcGxhY2UoLyEvZywiJTIxIiksYT0iISI9PT10LnRhZ1swXT8iISIrYToidGFnOnlhbWwub3JnLDIwMDI6Ij09PWEuc2xpY2UoMCwxOCk/IiEhIithLnNsaWNlKDE4KToiITwiK2ErIj4iLHQuZHVtcD1hKyIgIit0LmR1bXApfXJldHVybiEwfWZ1bmN0aW9uIEh0KHQsZSl7dmFyIG4scixpPVtdLG89W107Zm9yKEt0KHQsaSxvKSxuPTAscj1vLmxlbmd0aDtuPHI7bis9MSllLmR1cGxpY2F0ZXMucHVzaChpW29bbl1dKTtlLnVzZWREdXBsaWNhdGVzPW5ldyBBcnJheShyKX1mdW5jdGlvbiBLdCh0LGUsbil7dmFyIHIsaSxvO2lmKG51bGwhPT10JiYib2JqZWN0Ij09dHlwZW9mIHQpaWYoLTEhPT0oaT1lLmluZGV4T2YodCkpKS0xPT09bi5pbmRleE9mKGkpJiZuLnB1c2goaSk7ZWxzZSBpZihlLnB1c2godCksQXJyYXkuaXNBcnJheSh0KSlmb3IoaT0wLG89dC5sZW5ndGg7aTxvO2krPTEpS3QodFtpXSxlLG4pO2Vsc2UgZm9yKGk9MCxvPShyPU9iamVjdC5rZXlzKHQpKS5sZW5ndGg7aTxvO2krPTEpS3QodFtyW2ldXSxlLG4pfWZ1bmN0aW9uICR0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJGdW5jdGlvbiB5YW1sLiIrdCsiIGlzIHJlbW92ZWQgaW4ganMteWFtbCA0LiBVc2UgeWFtbC4iK2UrIiBpbnN0ZWFkLCB3aGljaCBpcyBub3cgc2FmZSBieSBkZWZhdWx0LiIpfX12YXIgdGU9e1R5cGU6aCxTY2hlbWE6dixGQUlMU0FGRV9TQ0hFTUE6bSxKU09OX1NDSEVNQTpJLENPUkVfU0NIRU1BOkEsREVGQVVMVF9TQ0hFTUE6Ryxsb2FkOk50LmxvYWQsbG9hZEFsbDpOdC5sb2FkQWxsLGR1bXA6e2R1bXA6ZnVuY3Rpb24odCxlKXt2YXIgbj1uZXcgRXQoZT1lfHx7fSk7bi5ub1JlZnN8fEh0KHQsbik7dmFyIHI9dDtyZXR1cm4gbi5yZXBsYWNlciYmKHI9bi5yZXBsYWNlci5jYWxsKHsiIjpyfSwiIixyKSksWHQobiwwLHIsITAsITApP24uZHVtcCsiXG4iOiIifX0uZHVtcCxZQU1MRXhjZXB0aW9uOnMsdHlwZXM6e2JpbmFyeTprLGZsb2F0OkQsbWFwOk0sbnVsbDpfLHBhaXJzOlEsc2V0OkIsdGltZXN0YW1wOkMsYm9vbDpMLGludDpqLG1lcmdlOkUsb21hcDpQLHNlcTp3LHN0cjpnfSxzYWZlTG9hZDokdCgic2FmZUxvYWQiLCJsb2FkIiksc2FmZUxvYWRBbGw6JHQoInNhZmVMb2FkQWxsIiwibG9hZEFsbCIpLHNhZmVEdW1wOiR0KCJzYWZlRHVtcCIsImR1bXAiKX07ZS5hPXRlfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMzUzKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtlLmE9ZnVuY3Rpb24oKXt2YXIgdD17bG9jYXRpb246e30saGlzdG9yeTp7fSxvcGVuOmZ1bmN0aW9uKCl7fSxjbG9zZTpmdW5jdGlvbigpe30sRmlsZTpmdW5jdGlvbigpe319O2lmKCJ1bmRlZmluZWQiPT10eXBlb2Ygd2luZG93KXJldHVybiB0O3RyeXt0PXdpbmRvdztmb3IodmFyIGU9MCxuPVsiRmlsZSIsIkJsb2IiLCJGb3JtRGF0YSJdO2U8bi5sZW5ndGg7ZSsrKXt2YXIgcj1uW2VdO3IgaW4gd2luZG93JiYodFtyXT13aW5kb3dbcl0pfX1jYXRjaCh0KXtjb25zb2xlLmVycm9yKHQpfXJldHVybiB0fSgpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2KSxpPW4oNTUpLG89IiIuc3BsaXQ7dC5leHBvcnRzPXIoKGZ1bmN0aW9uKCl7cmV0dXJuIU9iamVjdCgieiIpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApfSkpP2Z1bmN0aW9uKHQpe3JldHVybiJTdHJpbmciPT1pKHQpP28uY2FsbCh0LCIiKTpPYmplY3QodCl9Ok9iamVjdH0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTUpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKCFyKHQpKXJldHVybiB0O3ZhciBuLGk7aWYoZSYmImZ1bmN0aW9uIj09dHlwZW9mKG49dC50b1N0cmluZykmJiFyKGk9bi5jYWxsKHQpKSlyZXR1cm4gaTtpZigiZnVuY3Rpb24iPT10eXBlb2Yobj10LnZhbHVlT2YpJiYhcihpPW4uY2FsbCh0KSkpcmV0dXJuIGk7aWYoIWUmJiJmdW5jdGlvbiI9PXR5cGVvZihuPXQudG9TdHJpbmcpJiYhcihpPW4uY2FsbCh0KSkpcmV0dXJuIGk7dGhyb3cgVHlwZUVycm9yKCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWUiKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcixpPW4oMjkpLG89bigyNDIpLHU9bigxMDkpLHM9big3OCksYT1uKDI0MyksYz1uKDE1MSksZj1uKDc5KSxsPWYoIklFX1BST1RPIikscD1mdW5jdGlvbigpe30saD1mdW5jdGlvbih0KXtyZXR1cm4iPHNjcmlwdD4iK3QrIjwvIisic2NyaXB0PiJ9LGQ9ZnVuY3Rpb24oKXt0cnl7cj1kb2N1bWVudC5kb21haW4mJm5ldyBBY3RpdmVYT2JqZWN0KCJodG1sZmlsZSIpfWNhdGNoKHQpe312YXIgdCxlO2Q9cj9mdW5jdGlvbih0KXt0LndyaXRlKGgoIiIpKSx0LmNsb3NlKCk7dmFyIGU9dC5wYXJlbnRXaW5kb3cuT2JqZWN0O3JldHVybiB0PW51bGwsZX0ocik6KChlPWMoImlmcmFtZSIpKS5zdHlsZS5kaXNwbGF5PSJub25lIixhLmFwcGVuZENoaWxkKGUpLGUuc3JjPVN0cmluZygiamF2YXNjcmlwdDoiKSwodD1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQpLm9wZW4oKSx0LndyaXRlKGgoImRvY3VtZW50LkY9T2JqZWN0IikpLHQuY2xvc2UoKSx0LkYpO2Zvcih2YXIgbj11Lmxlbmd0aDtuLS07KWRlbGV0ZSBkLnByb3RvdHlwZVt1W25dXTtyZXR1cm4gZCgpfTtzW2xdPSEwLHQuZXhwb3J0cz1PYmplY3QuY3JlYXRlfHxmdW5jdGlvbih0LGUpe3ZhciBuO3JldHVybiBudWxsIT09dD8ocC5wcm90b3R5cGU9aSh0KSxuPW5ldyBwLHAucHJvdG90eXBlPW51bGwsbltsXT10KTpuPWQoKSx2b2lkIDA9PT1lP246byhuLGUpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTUyKSxpPW4oMTA5KTt0LmV4cG9ydHM9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKHQpe3JldHVybiByKHQsaSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTEwKSxpPW4oMTEyKSxvPXIoImtleXMiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG9bdF18fChvW3RdPWkodCkpfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI2MCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDU3KTt0LmV4cG9ydHM9cigibmF2aWdhdG9yIiwidXNlckFnZW50Iil8fCIifSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2KSxpPW4oNyksbz1uKDYwKSx1PWkoInNwZWNpZXMiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG8+PTUxfHwhcigoZnVuY3Rpb24oKXt2YXIgZT1bXTtyZXR1cm4oZS5jb25zdHJ1Y3Rvcj17fSlbdV09ZnVuY3Rpb24oKXtyZXR1cm57Zm9vOjF9fSwxIT09ZVt0XShCb29sZWFuKS5mb299KSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMTcpLGk9bigzMykuZixvPW4oMjQpLHU9bigyMSkscz1uKDI2NSksYT1uKDcpKCJ0b1N0cmluZ1RhZyIpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixjKXtpZih0KXt2YXIgZj1uP3Q6dC5wcm90b3R5cGU7dShmLGEpfHxpKGYsYSx7Y29uZmlndXJhYmxlOiEwLHZhbHVlOmV9KSxjJiYhciYmbyhmLCJ0b1N0cmluZyIscyl9fX0sZnVuY3Rpb24odCxlLG4pe24oMTY4KTt2YXIgcj1uKDI5NiksaT1uKDEzKSxvPW4oNjEpLHU9bigyNCkscz1uKDQ0KSxhPW4oNykoInRvU3RyaW5nVGFnIik7Zm9yKHZhciBjIGluIHIpe3ZhciBmPWlbY10sbD1mJiZmLnByb3RvdHlwZTtsJiZvKGwpIT09YSYmdShsLGEsYyksc1tjXT1zLkFycmF5fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgtMSxuPSJNaW5pZmllZCBSZWFjdCBlcnJvciAjIit0KyI7IHZpc2l0IGh0dHA6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QvZG9jcy9lcnJvci1kZWNvZGVyLmh0bWw/aW52YXJpYW50PSIrdCxyPTA7cjxlO3IrKyluKz0iJmFyZ3NbXT0iK2VuY29kZVVSSUNvbXBvbmVudChhcmd1bWVudHNbcisxXSk7bis9IiBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuIjt2YXIgaT1uZXcgRXJyb3Iobik7dGhyb3cgaS5uYW1lPSJJbnZhcmlhbnQgVmlvbGF0aW9uIixpLmZyYW1lc1RvUG9wPTEsaX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLHIsaSxvLHUscyl7aWYoIXQpe3ZhciBhO2lmKHZvaWQgMD09PWUpYT1uZXcgRXJyb3IoIk1pbmlmaWVkIGV4Y2VwdGlvbiBvY2N1cnJlZDsgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciB0aGUgZnVsbCBlcnJvciBtZXNzYWdlIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuIik7ZWxzZXt2YXIgYz1bbixyLGksbyx1LHNdLGY9MDsoYT1uZXcgRXJyb3IoZS5yZXBsYWNlKC8lcy9nLChmdW5jdGlvbigpe3JldHVybiBjW2YrK119KSkpKS5uYW1lPSJJbnZhcmlhbnQgVmlvbGF0aW9uIn10aHJvdyBhLmZyYW1lc1RvUG9wPTEsYX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNSkuU3ltYm9sO3QuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2NSksaT1uKDY2KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0fHxpKHQpJiYiW29iamVjdCBTeW1ib2xdIj09cih0KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQ2KShPYmplY3QsImNyZWF0ZSIpO3QuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0NDkpLGk9big0NTApLG89big0NTEpLHU9big0NTIpLHM9big0NTMpO2Z1bmN0aW9uIGEodCl7dmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciByPXRbZV07dGhpcy5zZXQoclswXSxyWzFdKX19YS5wcm90b3R5cGUuY2xlYXI9cixhLnByb3RvdHlwZS5kZWxldGU9aSxhLnByb3RvdHlwZS5nZXQ9byxhLnByb3RvdHlwZS5oYXM9dSxhLnByb3RvdHlwZS5zZXQ9cyx0LmV4cG9ydHM9YX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDkpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aDtuLS07KWlmKHIodFtuXVswXSxlKSlyZXR1cm4gbjtyZXR1cm4tMX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQ1NSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dC5fX2RhdGFfXztyZXR1cm4gcihlKT9uWyJzdHJpbmciPT10eXBlb2YgZT8ic3RyaW5nIjoiaGFzaCJdOm4ubWFwfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDgzKSxpPW4oMTk0KSxvPW4oNjgpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbyh0KT9yKHQpOmkodCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big4OCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdHx8cih0KSlyZXR1cm4gdDt2YXIgZT10KyIiO3JldHVybiIwIj09ZSYmMS90PT0tSW5maW5pdHk/Ii0wIjplfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjsoZnVuY3Rpb24oZSl7IWUudmVyc2lvbnx8MD09PWUudmVyc2lvbi5pbmRleE9mKCJ2MC4iKXx8MD09PWUudmVyc2lvbi5pbmRleE9mKCJ2MS4iKSYmMCE9PWUudmVyc2lvbi5pbmRleE9mKCJ2MS44LiIpP3QuZXhwb3J0cz17bmV4dFRpY2s6ZnVuY3Rpb24odCxuLHIsaSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignImNhbGxiYWNrIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTt2YXIgbyx1LHM9YXJndW1lbnRzLmxlbmd0aDtzd2l0Y2gocyl7Y2FzZSAwOmNhc2UgMTpyZXR1cm4gZS5uZXh0VGljayh0KTtjYXNlIDI6cmV0dXJuIGUubmV4dFRpY2soKGZ1bmN0aW9uKCl7dC5jYWxsKG51bGwsbil9KSk7Y2FzZSAzOnJldHVybiBlLm5leHRUaWNrKChmdW5jdGlvbigpe3QuY2FsbChudWxsLG4scil9KSk7Y2FzZSA0OnJldHVybiBlLm5leHRUaWNrKChmdW5jdGlvbigpe3QuY2FsbChudWxsLG4scixpKX0pKTtkZWZhdWx0OmZvcihvPW5ldyBBcnJheShzLTEpLHU9MDt1PG8ubGVuZ3RoOylvW3UrK109YXJndW1lbnRzW3VdO3JldHVybiBlLm5leHRUaWNrKChmdW5jdGlvbigpe3QuYXBwbHkobnVsbCxvKX0pKX19fTp0LmV4cG9ydHM9ZX0pLmNhbGwodGhpcyxuKDM0KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dC5leHBvcnRzPW4oNTQwKSgiZm9yRWFjaCIpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3QuZXhwb3J0cz1uKDU2MykoKT9nbG9iYWxUaGlzOm4oNTY0KX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0sdC5leHBvcnRzLmRlZmF1bHQ9dC5leHBvcnRzLHQuZXhwb3J0cy5fX2VzTW9kdWxlPSEwfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNDkpO2Z1bmN0aW9uIGkodCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIGk9ZVtuXTtpLmVudW1lcmFibGU9aS5lbnVtZXJhYmxlfHwhMSxpLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gaSYmKGkud3JpdGFibGU9ITApLHIodCxpLmtleSxpKX19dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZSYmaSh0LnByb3RvdHlwZSxlKSxuJiZpKHQsbiksdH0sdC5leHBvcnRzLmRlZmF1bHQ9dC5leHBvcnRzLHQuZXhwb3J0cy5fX2VzTW9kdWxlPSEwfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMzgpLGk9bigyNDUpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlJiZudWxsIT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO3QucHJvdG90eXBlPXIoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxlJiZpKHQsZSl9LHQuZXhwb3J0cy5kZWZhdWx0PXQuZXhwb3J0cyx0LmV4cG9ydHMuX19lc01vZHVsZT0hMH0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTU2KSxpPW4oMjUzKSxvPW4oMjU4KSx1PW4oMjU5KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9bygpO3JldHVybiBmdW5jdGlvbigpe3ZhciBuLG89aSh0KTtpZihlKXt2YXIgcz1pKHRoaXMpLmNvbnN0cnVjdG9yO249cihvLGFyZ3VtZW50cyxzKX1lbHNlIG49by5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHUodGhpcyxuKX19LHQuZXhwb3J0cy5kZWZhdWx0PXQuZXhwb3J0cyx0LmV4cG9ydHMuX19lc01vZHVsZT0hMH0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDQwNCl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigzNjcpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMyksaT1uKDEwNSksbz1uKDU0KSx1PW4oMzIpLHM9big3NSksYT1uKDIxKSxjPW4oMTUwKSxmPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7ZS5mPXI/ZjpmdW5jdGlvbih0LGUpe2lmKHQ9dSh0KSxlPXMoZSwhMCksYyl0cnl7cmV0dXJuIGYodCxlKX1jYXRjaCh0KXt9aWYoYSh0LGUpKXJldHVybiBvKCFpLmYuY2FsbCh0LGUpLHRbZV0pfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj17fS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Isbz1pJiYhci5jYWxsKHsxOjJ9LDEpO2UuZj1vP2Z1bmN0aW9uKHQpe3ZhciBlPWkodGhpcyx0KTtyZXR1cm4hIWUmJmUuZW51bWVyYWJsZX06cn0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNTYpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7aWYocih0KSx2b2lkIDA9PT1lKXJldHVybiB0O3N3aXRjaChuKXtjYXNlIDA6cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQuY2FsbChlKX07Y2FzZSAxOnJldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdC5jYWxsKGUsbil9O2Nhc2UgMjpyZXR1cm4gZnVuY3Rpb24obixyKXtyZXR1cm4gdC5jYWxsKGUsbixyKX07Y2FzZSAzOnJldHVybiBmdW5jdGlvbihuLHIsaSl7cmV0dXJuIHQuY2FsbChlLG4scixpKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkoZSxhcmd1bWVudHMpfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDMyKSxpPW4oMzApLG89bigxNTMpLHU9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbix1KXt2YXIgcyxhPXIoZSksYz1pKGEubGVuZ3RoKSxmPW8odSxjKTtpZih0JiZuIT1uKXtmb3IoO2M+ZjspaWYoKHM9YVtmKytdKSE9cylyZXR1cm4hMH1lbHNlIGZvcig7Yz5mO2YrKylpZigodHx8ZiBpbiBhKSYmYVtmXT09PW4pcmV0dXJuIHR8fGZ8fDA7cmV0dXJuIXQmJi0xfX07dC5leHBvcnRzPXtpbmNsdWRlczp1KCEwKSxpbmRleE9mOnUoITEpfX0sZnVuY3Rpb24odCxlKXt2YXIgbj1NYXRoLmNlaWwscj1NYXRoLmZsb29yO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gaXNOYU4odD0rdCk/MDoodD4wP3I6bikodCl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1bImNvbnN0cnVjdG9yIiwiaGFzT3duUHJvcGVydHkiLCJpc1Byb3RvdHlwZU9mIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJ0b0xvY2FsZVN0cmluZyIsInRvU3RyaW5nIiwidmFsdWVPZiJdfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1OCksaT1uKDExMSk7KHQuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBpW3RdfHwoaVt0XT12b2lkIDAhPT1lP2U6e30pfSkoInZlcnNpb25zIixbXSkucHVzaCh7dmVyc2lvbjoiMy4xNS4xIixtb2RlOnI/InB1cmUiOiJnbG9iYWwiLGNvcHlyaWdodDoiwqkgMjAyMSBEZW5pcyBQdXNoa2FyZXYgKHpsb2lyb2NrLnJ1KSJ9KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTMpLGk9bigyNDQpLG89Il9fY29yZS1qc19zaGFyZWRfXyIsdT1yW29dfHxpKG8se30pO3QuZXhwb3J0cz11fSxmdW5jdGlvbih0LGUpe3ZhciBuPTAscj1NYXRoLnJhbmRvbSgpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4iU3ltYm9sKCIrU3RyaW5nKHZvaWQgMD09PXQ/IiI6dCkrIilfIisoKytuK3IpLnRvU3RyaW5nKDM2KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIxKSxpPW4oMTkpLG89big3OSksdT1uKDE1OCkscz1vKCJJRV9QUk9UTyIpLGE9T2JqZWN0LnByb3RvdHlwZTt0LmV4cG9ydHM9dT9PYmplY3QuZ2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9aSh0KSxyKHQscyk/dFtzXToiZnVuY3Rpb24iPT10eXBlb2YgdC5jb25zdHJ1Y3RvciYmdCBpbnN0YW5jZW9mIHQuY29uc3RydWN0b3I/dC5jb25zdHJ1Y3Rvci5wcm90b3R5cGU6dCBpbnN0YW5jZW9mIE9iamVjdD9hOm51bGx9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNzUpLGk9bigzMyksbz1uKDU0KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3ZhciB1PXIoZSk7dSBpbiB0P2kuZih0LHUsbygwLG4pKTp0W3VdPW59fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2MCksaT1uKDYpO3QuZXhwb3J0cz0hIU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMmJiFpKChmdW5jdGlvbigpe3ZhciB0PVN5bWJvbCgpO3JldHVybiFTdHJpbmcodCl8fCEoT2JqZWN0KHQpaW5zdGFuY2VvZiBTeW1ib2wpfHwhU3ltYm9sLnNoYW0mJnImJnI8NDF9KSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDcpO2UuZj1yfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9e307cltuKDcpKCJ0b1N0cmluZ1RhZyIpXT0ieiIsdC5leHBvcnRzPSJbb2JqZWN0IHpdIj09PVN0cmluZyhyKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByLGksbyx1PW4oMjY2KSxzPW4oMTMpLGE9bigxNSksYz1uKDI0KSxmPW4oMjEpLGw9bigxMTEpLHA9big3OSksaD1uKDc4KSxkPSJPYmplY3QgYWxyZWFkeSBpbml0aWFsaXplZCIseT1zLldlYWtNYXA7aWYodXx8bC5zdGF0ZSl7dmFyIHY9bC5zdGF0ZXx8KGwuc3RhdGU9bmV3IHkpLGc9di5nZXQsdz12LmhhcyxNPXYuc2V0O3I9ZnVuY3Rpb24odCxlKXtpZih3LmNhbGwodix0KSl0aHJvdyBuZXcgVHlwZUVycm9yKGQpO3JldHVybiBlLmZhY2FkZT10LE0uY2FsbCh2LHQsZSksZX0saT1mdW5jdGlvbih0KXtyZXR1cm4gZy5jYWxsKHYsdCl8fHt9fSxvPWZ1bmN0aW9uKHQpe3JldHVybiB3LmNhbGwodix0KX19ZWxzZXt2YXIgbT1wKCJzdGF0ZSIpO2hbbV09ITAscj1mdW5jdGlvbih0LGUpe2lmKGYodCxtKSl0aHJvdyBuZXcgVHlwZUVycm9yKGQpO3JldHVybiBlLmZhY2FkZT10LGModCxtLGUpLGV9LGk9ZnVuY3Rpb24odCl7cmV0dXJuIGYodCxtKT90W21dOnt9fSxvPWZ1bmN0aW9uKHQpe3JldHVybiBmKHQsbSl9fXQuZXhwb3J0cz17c2V0OnIsZ2V0OmksaGFzOm8sZW5mb3JjZTpmdW5jdGlvbih0KXtyZXR1cm4gbyh0KT9pKHQpOnIodCx7fSl9LGdldHRlckZvcjpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG47aWYoIWEoZSl8fChuPWkoZSkpLnR5cGUhPT10KXRocm93IFR5cGVFcnJvcigiSW5jb21wYXRpYmxlIHJlY2VpdmVyLCAiK3QrIiByZXF1aXJlZCIpO3JldHVybiBufX19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMjk0KS5jaGFyQXQsaT1uKDExOCksbz1uKDE2NiksdT0iU3RyaW5nIEl0ZXJhdG9yIixzPWkuc2V0LGE9aS5nZXR0ZXJGb3IodSk7byhTdHJpbmcsIlN0cmluZyIsKGZ1bmN0aW9uKHQpe3ModGhpcyx7dHlwZTp1LHN0cmluZzpTdHJpbmcodCksaW5kZXg6MH0pfSksKGZ1bmN0aW9uKCl7dmFyIHQsZT1hKHRoaXMpLG49ZS5zdHJpbmcsaT1lLmluZGV4O3JldHVybiBpPj1uLmxlbmd0aD97dmFsdWU6dm9pZCAwLGRvbmU6ITB9Oih0PXIobixpKSxlLmluZGV4Kz10Lmxlbmd0aCx7dmFsdWU6dCxkb25lOiExfSl9KSl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKCl7fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE3MSk7dC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7KGZ1bmN0aW9uKHQpe3ZhciByPW4oMzI5KSxpPW4oMzMwKSxvPW4oMTc3KTtmdW5jdGlvbiB1KCl7cmV0dXJuIGEuVFlQRURfQVJSQVlfU1VQUE9SVD8yMTQ3NDgzNjQ3OjEwNzM3NDE4MjN9ZnVuY3Rpb24gcyh0LGUpe2lmKHUoKTxlKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbnZhbGlkIHR5cGVkIGFycmF5IGxlbmd0aCIpO3JldHVybiBhLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHQ9bmV3IFVpbnQ4QXJyYXkoZSkpLl9fcHJvdG9fXz1hLnByb3RvdHlwZToobnVsbD09PXQmJih0PW5ldyBhKGUpKSx0Lmxlbmd0aD1lKSx0fWZ1bmN0aW9uIGEodCxlLG4pe2lmKCEoYS5UWVBFRF9BUlJBWV9TVVBQT1JUfHx0aGlzIGluc3RhbmNlb2YgYSkpcmV0dXJuIG5ldyBhKHQsZSxuKTtpZigibnVtYmVyIj09dHlwZW9mIHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoIklmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIik7cmV0dXJuIGwodGhpcyx0KX1yZXR1cm4gYyh0aGlzLHQsZSxuKX1mdW5jdGlvbiBjKHQsZSxuLHIpe2lmKCJudW1iZXIiPT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyP2Z1bmN0aW9uKHQsZSxuLHIpe2lmKGUuYnl0ZUxlbmd0aCxuPDB8fGUuYnl0ZUxlbmd0aDxuKXRocm93IG5ldyBSYW5nZUVycm9yKCInb2Zmc2V0JyBpcyBvdXQgb2YgYm91bmRzIik7aWYoZS5ieXRlTGVuZ3RoPG4rKHJ8fDApKXRocm93IG5ldyBSYW5nZUVycm9yKCInbGVuZ3RoJyBpcyBvdXQgb2YgYm91bmRzIik7ZT12b2lkIDA9PT1uJiZ2b2lkIDA9PT1yP25ldyBVaW50OEFycmF5KGUpOnZvaWQgMD09PXI/bmV3IFVpbnQ4QXJyYXkoZSxuKTpuZXcgVWludDhBcnJheShlLG4scik7YS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0PWUpLl9fcHJvdG9fXz1hLnByb3RvdHlwZTp0PXAodCxlKTtyZXR1cm4gdH0odCxlLG4scik6InN0cmluZyI9PXR5cGVvZiBlP2Z1bmN0aW9uKHQsZSxuKXsic3RyaW5nIj09dHlwZW9mIG4mJiIiIT09bnx8KG49InV0ZjgiKTtpZighYS5pc0VuY29kaW5nKG4pKXRocm93IG5ldyBUeXBlRXJyb3IoJyJlbmNvZGluZyIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpO3ZhciByPTB8ZChlLG4pLGk9KHQ9cyh0LHIpKS53cml0ZShlLG4pO2khPT1yJiYodD10LnNsaWNlKDAsaSkpO3JldHVybiB0fSh0LGUsbik6ZnVuY3Rpb24odCxlKXtpZihhLmlzQnVmZmVyKGUpKXt2YXIgbj0wfGgoZS5sZW5ndGgpO3JldHVybiAwPT09KHQ9cyh0LG4pKS5sZW5ndGh8fGUuY29weSh0LDAsMCxuKSx0fWlmKGUpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJmUuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fCJsZW5ndGgiaW4gZSlyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIGUubGVuZ3RofHwocj1lLmxlbmd0aCkhPXI/cyh0LDApOnAodCxlKTtpZigiQnVmZmVyIj09PWUudHlwZSYmbyhlLmRhdGEpKXJldHVybiBwKHQsZS5kYXRhKX12YXIgcjt0aHJvdyBuZXcgVHlwZUVycm9yKCJGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuIil9KHQsZSl9ZnVuY3Rpb24gZih0KXtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKTtpZih0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpfWZ1bmN0aW9uIGwodCxlKXtpZihmKGUpLHQ9cyh0LGU8MD8wOjB8aChlKSksIWEuVFlQRURfQVJSQVlfU1VQUE9SVClmb3IodmFyIG49MDtuPGU7KytuKXRbbl09MDtyZXR1cm4gdH1mdW5jdGlvbiBwKHQsZSl7dmFyIG49ZS5sZW5ndGg8MD8wOjB8aChlLmxlbmd0aCk7dD1zKHQsbik7Zm9yKHZhciByPTA7cjxuO3IrPTEpdFtyXT0yNTUmZVtyXTtyZXR1cm4gdH1mdW5jdGlvbiBoKHQpe2lmKHQ+PXUoKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSBzaXplOiAweCIrdSgpLnRvU3RyaW5nKDE2KSsiIGJ5dGVzIik7cmV0dXJuIDB8dH1mdW5jdGlvbiBkKHQsZSl7aWYoYS5pc0J1ZmZlcih0KSlyZXR1cm4gdC5sZW5ndGg7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBBcnJheUJ1ZmZlciYmImZ1bmN0aW9uIj09dHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyYmKEFycmF5QnVmZmVyLmlzVmlldyh0KXx8dCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSlyZXR1cm4gdC5ieXRlTGVuZ3RoOyJzdHJpbmciIT10eXBlb2YgdCYmKHQ9IiIrdCk7dmFyIG49dC5sZW5ndGg7aWYoMD09PW4pcmV0dXJuIDA7Zm9yKHZhciByPSExOzspc3dpdGNoKGUpe2Nhc2UiYXNjaWkiOmNhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIG47Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlIHZvaWQgMDpyZXR1cm4gUSh0KS5sZW5ndGg7Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiAyKm47Y2FzZSJoZXgiOnJldHVybiBuPj4+MTtjYXNlImJhc2U2NCI6cmV0dXJuIEYodCkubGVuZ3RoO2RlZmF1bHQ6aWYocilyZXR1cm4gUSh0KS5sZW5ndGg7ZT0oIiIrZSkudG9Mb3dlckNhc2UoKSxyPSEwfX1mdW5jdGlvbiB5KHQsZSxuKXt2YXIgcj0hMTtpZigodm9pZCAwPT09ZXx8ZTwwKSYmKGU9MCksZT50aGlzLmxlbmd0aClyZXR1cm4iIjtpZigodm9pZCAwPT09bnx8bj50aGlzLmxlbmd0aCkmJihuPXRoaXMubGVuZ3RoKSxuPD0wKXJldHVybiIiO2lmKChuPj4+PTApPD0oZT4+Pj0wKSlyZXR1cm4iIjtmb3IodHx8KHQ9InV0ZjgiKTs7KXN3aXRjaCh0KXtjYXNlImhleCI6cmV0dXJuIEEodGhpcyxlLG4pO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6cmV0dXJuIE4odGhpcyxlLG4pO2Nhc2UiYXNjaWkiOnJldHVybiBEKHRoaXMsZSxuKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBJKHRoaXMsZSxuKTtjYXNlImJhc2U2NCI6cmV0dXJuIGoodGhpcyxlLG4pO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gTyh0aGlzLGUsbik7ZGVmYXVsdDppZihyKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrdCk7dD0odCsiIikudG9Mb3dlckNhc2UoKSxyPSEwfX1mdW5jdGlvbiB2KHQsZSxuKXt2YXIgcj10W2VdO3RbZV09dFtuXSx0W25dPXJ9ZnVuY3Rpb24gZyh0LGUsbixyLGkpe2lmKDA9PT10Lmxlbmd0aClyZXR1cm4tMTtpZigic3RyaW5nIj09dHlwZW9mIG4/KHI9bixuPTApOm4+MjE0NzQ4MzY0Nz9uPTIxNDc0ODM2NDc6bjwtMjE0NzQ4MzY0OCYmKG49LTIxNDc0ODM2NDgpLG49K24saXNOYU4obikmJihuPWk/MDp0Lmxlbmd0aC0xKSxuPDAmJihuPXQubGVuZ3RoK24pLG4+PXQubGVuZ3RoKXtpZihpKXJldHVybi0xO249dC5sZW5ndGgtMX1lbHNlIGlmKG48MCl7aWYoIWkpcmV0dXJuLTE7bj0wfWlmKCJzdHJpbmciPT10eXBlb2YgZSYmKGU9YS5mcm9tKGUscikpLGEuaXNCdWZmZXIoZSkpcmV0dXJuIDA9PT1lLmxlbmd0aD8tMTp3KHQsZSxuLHIsaSk7aWYoIm51bWJlciI9PXR5cGVvZiBlKXJldHVybiBlJj0yNTUsYS5UWVBFRF9BUlJBWV9TVVBQT1JUJiYiZnVuY3Rpb24iPT10eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZj9pP1VpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbCh0LGUsbik6VWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbCh0LGUsbik6dyh0LFtlXSxuLHIsaSk7dGhyb3cgbmV3IFR5cGVFcnJvcigidmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyIil9ZnVuY3Rpb24gdyh0LGUsbixyLGkpe3ZhciBvLHU9MSxzPXQubGVuZ3RoLGE9ZS5sZW5ndGg7aWYodm9pZCAwIT09ciYmKCJ1Y3MyIj09PShyPVN0cmluZyhyKS50b0xvd2VyQ2FzZSgpKXx8InVjcy0yIj09PXJ8fCJ1dGYxNmxlIj09PXJ8fCJ1dGYtMTZsZSI9PT1yKSl7aWYodC5sZW5ndGg8Mnx8ZS5sZW5ndGg8MilyZXR1cm4tMTt1PTIscy89MixhLz0yLG4vPTJ9ZnVuY3Rpb24gYyh0LGUpe3JldHVybiAxPT09dT90W2VdOnQucmVhZFVJbnQxNkJFKGUqdSl9aWYoaSl7dmFyIGY9LTE7Zm9yKG89bjtvPHM7bysrKWlmKGModCxvKT09PWMoZSwtMT09PWY/MDpvLWYpKXtpZigtMT09PWYmJihmPW8pLG8tZisxPT09YSlyZXR1cm4gZip1fWVsc2UtMSE9PWYmJihvLT1vLWYpLGY9LTF9ZWxzZSBmb3IobithPnMmJihuPXMtYSksbz1uO28+PTA7by0tKXtmb3IodmFyIGw9ITAscD0wO3A8YTtwKyspaWYoYyh0LG8rcCkhPT1jKGUscCkpe2w9ITE7YnJlYWt9aWYobClyZXR1cm4gb31yZXR1cm4tMX1mdW5jdGlvbiBNKHQsZSxuLHIpe249TnVtYmVyKG4pfHwwO3ZhciBpPXQubGVuZ3RoLW47cj8ocj1OdW1iZXIocikpPmkmJihyPWkpOnI9aTt2YXIgbz1lLmxlbmd0aDtpZihvJTIhPTApdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBoZXggc3RyaW5nIik7cj5vLzImJihyPW8vMik7Zm9yKHZhciB1PTA7dTxyOysrdSl7dmFyIHM9cGFyc2VJbnQoZS5zdWJzdHIoMip1LDIpLDE2KTtpZihpc05hTihzKSlyZXR1cm4gdTt0W24rdV09c31yZXR1cm4gdX1mdW5jdGlvbiBtKHQsZSxuLHIpe3JldHVybiBCKFEoZSx0Lmxlbmd0aC1uKSx0LG4scil9ZnVuY3Rpb24gXyh0LGUsbixyKXtyZXR1cm4gQihmdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0wO248dC5sZW5ndGg7KytuKWUucHVzaCgyNTUmdC5jaGFyQ29kZUF0KG4pKTtyZXR1cm4gZX0oZSksdCxuLHIpfWZ1bmN0aW9uIEwodCxlLG4scil7cmV0dXJuIF8odCxlLG4scil9ZnVuY3Rpb24gYih0LGUsbixyKXtyZXR1cm4gQihGKGUpLHQsbixyKX1mdW5jdGlvbiB4KHQsZSxuLHIpe3JldHVybiBCKGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuLHIsaSxvPVtdLHU9MDt1PHQubGVuZ3RoJiYhKChlLT0yKTwwKTsrK3Upcj0obj10LmNoYXJDb2RlQXQodSkpPj44LGk9biUyNTYsby5wdXNoKGkpLG8ucHVzaChyKTtyZXR1cm4gb30oZSx0Lmxlbmd0aC1uKSx0LG4scil9ZnVuY3Rpb24gaih0LGUsbil7cmV0dXJuIDA9PT1lJiZuPT09dC5sZW5ndGg/ci5mcm9tQnl0ZUFycmF5KHQpOnIuZnJvbUJ5dGVBcnJheSh0LnNsaWNlKGUsbikpfWZ1bmN0aW9uIE4odCxlLG4pe249TWF0aC5taW4odC5sZW5ndGgsbik7Zm9yKHZhciByPVtdLGk9ZTtpPG47KXt2YXIgbyx1LHMsYSxjPXRbaV0sZj1udWxsLGw9Yz4yMzk/NDpjPjIyMz8zOmM+MTkxPzI6MTtpZihpK2w8PW4pc3dpdGNoKGwpe2Nhc2UgMTpjPDEyOCYmKGY9Yyk7YnJlYWs7Y2FzZSAyOjEyOD09KDE5MiYobz10W2krMV0pKSYmKGE9KDMxJmMpPDw2fDYzJm8pPjEyNyYmKGY9YSk7YnJlYWs7Y2FzZSAzOm89dFtpKzFdLHU9dFtpKzJdLDEyOD09KDE5MiZvKSYmMTI4PT0oMTkyJnUpJiYoYT0oMTUmYyk8PDEyfCg2MyZvKTw8Nnw2MyZ1KT4yMDQ3JiYoYTw1NTI5Nnx8YT41NzM0MykmJihmPWEpO2JyZWFrO2Nhc2UgNDpvPXRbaSsxXSx1PXRbaSsyXSxzPXRbaSszXSwxMjg9PSgxOTImbykmJjEyOD09KDE5MiZ1KSYmMTI4PT0oMTkyJnMpJiYoYT0oMTUmYyk8PDE4fCg2MyZvKTw8MTJ8KDYzJnUpPDw2fDYzJnMpPjY1NTM1JiZhPDExMTQxMTImJihmPWEpfW51bGw9PT1mPyhmPTY1NTMzLGw9MSk6Zj42NTUzNSYmKGYtPTY1NTM2LHIucHVzaChmPj4+MTAmMTAyM3w1NTI5NiksZj01NjMyMHwxMDIzJmYpLHIucHVzaChmKSxpKz1sfXJldHVybiBmdW5jdGlvbih0KXt2YXIgZT10Lmxlbmd0aDtpZihlPD1TKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyx0KTt2YXIgbj0iIixyPTA7Zm9yKDtyPGU7KW4rPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLHQuc2xpY2UocixyKz1TKSk7cmV0dXJuIG59KHIpfWUuQnVmZmVyPWEsZS5TbG93QnVmZmVyPWZ1bmN0aW9uKHQpeyt0IT10JiYodD0wKTtyZXR1cm4gYS5hbGxvYygrdCl9LGUuSU5TUEVDVF9NQVhfQllURVM9NTAsYS5UWVBFRF9BUlJBWV9TVVBQT1JUPXZvaWQgMCE9PXQuVFlQRURfQVJSQVlfU1VQUE9SVD90LlRZUEVEX0FSUkFZX1NVUFBPUlQ6ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9bmV3IFVpbnQ4QXJyYXkoMSk7cmV0dXJuIHQuX19wcm90b19fPXtfX3Byb3RvX186VWludDhBcnJheS5wcm90b3R5cGUsZm9vOmZ1bmN0aW9uKCl7cmV0dXJuIDQyfX0sNDI9PT10LmZvbygpJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5zdWJhcnJheSYmMD09PXQuc3ViYXJyYXkoMSwxKS5ieXRlTGVuZ3RofWNhdGNoKHQpe3JldHVybiExfX0oKSxlLmtNYXhMZW5ndGg9dSgpLGEucG9vbFNpemU9ODE5MixhLl9hdWdtZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0Ll9fcHJvdG9fXz1hLnByb3RvdHlwZSx0fSxhLmZyb209ZnVuY3Rpb24odCxlLG4pe3JldHVybiBjKG51bGwsdCxlLG4pfSxhLlRZUEVEX0FSUkFZX1NVUFBPUlQmJihhLnByb3RvdHlwZS5fX3Byb3RvX189VWludDhBcnJheS5wcm90b3R5cGUsYS5fX3Byb3RvX189VWludDhBcnJheSwidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnNwZWNpZXMmJmFbU3ltYm9sLnNwZWNpZXNdPT09YSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsU3ltYm9sLnNwZWNpZXMse3ZhbHVlOm51bGwsY29uZmlndXJhYmxlOiEwfSkpLGEuYWxsb2M9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBmdW5jdGlvbih0LGUsbixyKXtyZXR1cm4gZihlKSxlPD0wP3ModCxlKTp2b2lkIDAhPT1uPyJzdHJpbmciPT10eXBlb2Ygcj9zKHQsZSkuZmlsbChuLHIpOnModCxlKS5maWxsKG4pOnModCxlKX0obnVsbCx0LGUsbil9LGEuYWxsb2NVbnNhZmU9ZnVuY3Rpb24odCl7cmV0dXJuIGwobnVsbCx0KX0sYS5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24odCl7cmV0dXJuIGwobnVsbCx0KX0sYS5pc0J1ZmZlcj1mdW5jdGlvbih0KXtyZXR1cm4hKG51bGw9PXR8fCF0Ll9pc0J1ZmZlcil9LGEuY29tcGFyZT1mdW5jdGlvbih0LGUpe2lmKCFhLmlzQnVmZmVyKHQpfHwhYS5pc0J1ZmZlcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzIik7aWYodD09PWUpcmV0dXJuIDA7Zm9yKHZhciBuPXQubGVuZ3RoLHI9ZS5sZW5ndGgsaT0wLG89TWF0aC5taW4obixyKTtpPG87KytpKWlmKHRbaV0hPT1lW2ldKXtuPXRbaV0scj1lW2ldO2JyZWFrfXJldHVybiBuPHI/LTE6cjxuPzE6MH0sYS5pc0VuY29kaW5nPWZ1bmN0aW9uKHQpe3N3aXRjaChTdHJpbmcodCkudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fSxhLmNvbmNhdD1mdW5jdGlvbih0LGUpe2lmKCFvKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuIGEuYWxsb2MoMCk7dmFyIG47aWYodm9pZCAwPT09ZSlmb3IoZT0wLG49MDtuPHQubGVuZ3RoOysrbillKz10W25dLmxlbmd0aDt2YXIgcj1hLmFsbG9jVW5zYWZlKGUpLGk9MDtmb3Iobj0wO248dC5sZW5ndGg7KytuKXt2YXIgdT10W25dO2lmKCFhLmlzQnVmZmVyKHUpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTt1LmNvcHkocixpKSxpKz11Lmxlbmd0aH1yZXR1cm4gcn0sYS5ieXRlTGVuZ3RoPWQsYS5wcm90b3R5cGUuX2lzQnVmZmVyPSEwLGEucHJvdG90eXBlLnN3YXAxNj1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlMiE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9Mil2KHRoaXMsZSxlKzEpO3JldHVybiB0aGlzfSxhLnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTQpdih0aGlzLGUsZSszKSx2KHRoaXMsZSsxLGUrMik7cmV0dXJuIHRoaXN9LGEucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlOCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9OCl2KHRoaXMsZSxlKzcpLHYodGhpcyxlKzEsZSs2KSx2KHRoaXMsZSsyLGUrNSksdih0aGlzLGUrMyxlKzQpO3JldHVybiB0aGlzfSxhLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciB0PTB8dGhpcy5sZW5ndGg7cmV0dXJuIDA9PT10PyIiOjA9PT1hcmd1bWVudHMubGVuZ3RoP04odGhpcywwLHQpOnkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxhLnByb3RvdHlwZS5lcXVhbHM9ZnVuY3Rpb24odCl7aWYoIWEuaXNCdWZmZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO3JldHVybiB0aGlzPT09dHx8MD09PWEuY29tcGFyZSh0aGlzLHQpfSxhLnByb3RvdHlwZS5pbnNwZWN0PWZ1bmN0aW9uKCl7dmFyIHQ9IiIsbj1lLklOU1BFQ1RfTUFYX0JZVEVTO3JldHVybiB0aGlzLmxlbmd0aD4wJiYodD10aGlzLnRvU3RyaW5nKCJoZXgiLDAsbikubWF0Y2goLy57Mn0vZykuam9pbigiICIpLHRoaXMubGVuZ3RoPm4mJih0Kz0iIC4uLiAiKSksIjxCdWZmZXIgIit0KyI+In0sYS5wcm90b3R5cGUuY29tcGFyZT1mdW5jdGlvbih0LGUsbixyLGkpe2lmKCFhLmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtpZih2b2lkIDA9PT1lJiYoZT0wKSx2b2lkIDA9PT1uJiYobj10P3QubGVuZ3RoOjApLHZvaWQgMD09PXImJihyPTApLHZvaWQgMD09PWkmJihpPXRoaXMubGVuZ3RoKSxlPDB8fG4+dC5sZW5ndGh8fHI8MHx8aT50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigib3V0IG9mIHJhbmdlIGluZGV4Iik7aWYocj49aSYmZT49bilyZXR1cm4gMDtpZihyPj1pKXJldHVybi0xO2lmKGU+PW4pcmV0dXJuIDE7aWYodGhpcz09PXQpcmV0dXJuIDA7Zm9yKHZhciBvPShpPj4+PTApLShyPj4+PTApLHU9KG4+Pj49MCktKGU+Pj49MCkscz1NYXRoLm1pbihvLHUpLGM9dGhpcy5zbGljZShyLGkpLGY9dC5zbGljZShlLG4pLGw9MDtsPHM7KytsKWlmKGNbbF0hPT1mW2xdKXtvPWNbbF0sdT1mW2xdO2JyZWFrfXJldHVybiBvPHU/LTE6dTxvPzE6MH0sYS5wcm90b3R5cGUuaW5jbHVkZXM9ZnVuY3Rpb24odCxlLG4pe3JldHVybi0xIT09dGhpcy5pbmRleE9mKHQsZSxuKX0sYS5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGcodGhpcyx0LGUsbiwhMCl9LGEucHJvdG90eXBlLmxhc3RJbmRleE9mPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZyh0aGlzLHQsZSxuLCExKX0sYS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24odCxlLG4scil7aWYodm9pZCAwPT09ZSlyPSJ1dGY4IixuPXRoaXMubGVuZ3RoLGU9MDtlbHNlIGlmKHZvaWQgMD09PW4mJiJzdHJpbmciPT10eXBlb2YgZSlyPWUsbj10aGlzLmxlbmd0aCxlPTA7ZWxzZXtpZighaXNGaW5pdGUoZSkpdGhyb3cgbmV3IEVycm9yKCJCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCIpO2V8PTAsaXNGaW5pdGUobik/KG58PTAsdm9pZCAwPT09ciYmKHI9InV0ZjgiKSk6KHI9bixuPXZvaWQgMCl9dmFyIGk9dGhpcy5sZW5ndGgtZTtpZigodm9pZCAwPT09bnx8bj5pKSYmKG49aSksdC5sZW5ndGg+MCYmKG48MHx8ZTwwKXx8ZT50aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMiKTtyfHwocj0idXRmOCIpO2Zvcih2YXIgbz0hMTs7KXN3aXRjaChyKXtjYXNlImhleCI6cmV0dXJuIE0odGhpcyx0LGUsbik7Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpyZXR1cm4gbSh0aGlzLHQsZSxuKTtjYXNlImFzY2lpIjpyZXR1cm4gXyh0aGlzLHQsZSxuKTtjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBMKHRoaXMsdCxlLG4pO2Nhc2UiYmFzZTY0IjpyZXR1cm4gYih0aGlzLHQsZSxuKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIHgodGhpcyx0LGUsbik7ZGVmYXVsdDppZihvKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrcik7cj0oIiIrcikudG9Mb3dlckNhc2UoKSxvPSEwfX0sYS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IkJ1ZmZlciIsZGF0YTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnJ8fHRoaXMsMCl9fTt2YXIgUz00MDk2O2Z1bmN0aW9uIEQodCxlLG4pe3ZhciByPSIiO249TWF0aC5taW4odC5sZW5ndGgsbik7Zm9yKHZhciBpPWU7aTxuOysraSlyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKDEyNyZ0W2ldKTtyZXR1cm4gcn1mdW5jdGlvbiBJKHQsZSxuKXt2YXIgcj0iIjtuPU1hdGgubWluKHQubGVuZ3RoLG4pO2Zvcih2YXIgaT1lO2k8bjsrK2kpcis9U3RyaW5nLmZyb21DaGFyQ29kZSh0W2ldKTtyZXR1cm4gcn1mdW5jdGlvbiBBKHQsZSxuKXt2YXIgcj10Lmxlbmd0aDsoIWV8fGU8MCkmJihlPTApLCghbnx8bjwwfHxuPnIpJiYobj1yKTtmb3IodmFyIGk9IiIsbz1lO288bjsrK28paSs9Uih0W29dKTtyZXR1cm4gaX1mdW5jdGlvbiBPKHQsZSxuKXtmb3IodmFyIHI9dC5zbGljZShlLG4pLGk9IiIsbz0wO288ci5sZW5ndGg7bys9MilpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHJbb10rMjU2KnJbbysxXSk7cmV0dXJuIGl9ZnVuY3Rpb24gVCh0LGUsbil7aWYodCUxIT0wfHx0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm9mZnNldCBpcyBub3QgdWludCIpO2lmKHQrZT5uKXRocm93IG5ldyBSYW5nZUVycm9yKCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoIil9ZnVuY3Rpb24gQyh0LGUsbixyLGksbyl7aWYoIWEuaXNCdWZmZXIodCkpdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKGU+aXx8ZTxvKXRocm93IG5ldyBSYW5nZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtpZihuK3I+dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIEUodCxlLG4scil7ZTwwJiYoZT02NTUzNStlKzEpO2Zvcih2YXIgaT0wLG89TWF0aC5taW4odC5sZW5ndGgtbiwyKTtpPG87KytpKXRbbitpXT0oZSYyNTU8PDgqKHI/aToxLWkpKT4+PjgqKHI/aToxLWkpfWZ1bmN0aW9uIHoodCxlLG4scil7ZTwwJiYoZT00Mjk0OTY3Mjk1K2UrMSk7Zm9yKHZhciBpPTAsbz1NYXRoLm1pbih0Lmxlbmd0aC1uLDQpO2k8bzsrK2kpdFtuK2ldPWU+Pj44KihyP2k6My1pKSYyNTV9ZnVuY3Rpb24gayh0LGUsbixyLGksbyl7aWYobityPnQubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIFkodCxlLG4scixvKXtyZXR1cm4gb3x8ayh0LDAsbiw0KSxpLndyaXRlKHQsZSxuLHIsMjMsNCksbis0fWZ1bmN0aW9uIFUodCxlLG4scixvKXtyZXR1cm4gb3x8ayh0LDAsbiw4KSxpLndyaXRlKHQsZSxuLHIsNTIsOCksbis4fWEucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHQsZSl7dmFyIG4scj10aGlzLmxlbmd0aDtpZigodD1+fnQpPDA/KHQrPXIpPDAmJih0PTApOnQ+ciYmKHQ9ciksKGU9dm9pZCAwPT09ZT9yOn5+ZSk8MD8oZSs9cik8MCYmKGU9MCk6ZT5yJiYoZT1yKSxlPHQmJihlPXQpLGEuVFlQRURfQVJSQVlfU1VQUE9SVCkobj10aGlzLnN1YmFycmF5KHQsZSkpLl9fcHJvdG9fXz1hLnByb3RvdHlwZTtlbHNle3ZhciBpPWUtdDtuPW5ldyBhKGksdm9pZCAwKTtmb3IodmFyIG89MDtvPGk7KytvKW5bb109dGhpc1tvK3RdfXJldHVybiBufSxhLnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uKHQsZSxuKXt0fD0wLGV8PTAsbnx8VCh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW3RdLGk9MSxvPTA7KytvPGUmJihpKj0yNTYpOylyKz10aGlzW3Qrb10qaTtyZXR1cm4gcn0sYS5wcm90b3R5cGUucmVhZFVJbnRCRT1mdW5jdGlvbih0LGUsbil7dHw9MCxlfD0wLG58fFQodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dGhpc1t0Ky0tZV0saT0xO2U+MCYmKGkqPTI1Nik7KXIrPXRoaXNbdCstLWVdKmk7cmV0dXJuIHJ9LGEucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxUKHQsMSx0aGlzLmxlbmd0aCksdGhpc1t0XX0sYS5wcm90b3R5cGUucmVhZFVJbnQxNkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFQodCwyLHRoaXMubGVuZ3RoKSx0aGlzW3RdfHRoaXNbdCsxXTw8OH0sYS5wcm90b3R5cGUucmVhZFVJbnQxNkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFQodCwyLHRoaXMubGVuZ3RoKSx0aGlzW3RdPDw4fHRoaXNbdCsxXX0sYS5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFQodCw0LHRoaXMubGVuZ3RoKSwodGhpc1t0XXx0aGlzW3QrMV08PDh8dGhpc1t0KzJdPDwxNikrMTY3NzcyMTYqdGhpc1t0KzNdfSxhLnByb3RvdHlwZS5yZWFkVUludDMyQkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8VCh0LDQsdGhpcy5sZW5ndGgpLDE2Nzc3MjE2KnRoaXNbdF0rKHRoaXNbdCsxXTw8MTZ8dGhpc1t0KzJdPDw4fHRoaXNbdCszXSl9LGEucHJvdG90eXBlLnJlYWRJbnRMRT1mdW5jdGlvbih0LGUsbil7dHw9MCxlfD0wLG58fFQodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dGhpc1t0XSxpPTEsbz0wOysrbzxlJiYoaSo9MjU2KTspcis9dGhpc1t0K29dKmk7cmV0dXJuIHI+PShpKj0xMjgpJiYoci09TWF0aC5wb3coMiw4KmUpKSxyfSxhLnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24odCxlLG4pe3R8PTAsZXw9MCxufHxUKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPWUsaT0xLG89dGhpc1t0Ky0tcl07cj4wJiYoaSo9MjU2KTspbys9dGhpc1t0Ky0tcl0qaTtyZXR1cm4gbz49KGkqPTEyOCkmJihvLT1NYXRoLnBvdygyLDgqZSkpLG99LGEucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFQodCwxLHRoaXMubGVuZ3RoKSwxMjgmdGhpc1t0XT8tMSooMjU1LXRoaXNbdF0rMSk6dGhpc1t0XX0sYS5wcm90b3R5cGUucmVhZEludDE2TEU9ZnVuY3Rpb24odCxlKXtlfHxUKHQsMix0aGlzLmxlbmd0aCk7dmFyIG49dGhpc1t0XXx0aGlzW3QrMV08PDg7cmV0dXJuIDMyNzY4Jm4/NDI5NDkwMTc2MHxuOm59LGEucHJvdG90eXBlLnJlYWRJbnQxNkJFPWZ1bmN0aW9uKHQsZSl7ZXx8VCh0LDIsdGhpcy5sZW5ndGgpO3ZhciBuPXRoaXNbdCsxXXx0aGlzW3RdPDw4O3JldHVybiAzMjc2OCZuPzQyOTQ5MDE3NjB8bjpufSxhLnByb3RvdHlwZS5yZWFkSW50MzJMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxUKHQsNCx0aGlzLmxlbmd0aCksdGhpc1t0XXx0aGlzW3QrMV08PDh8dGhpc1t0KzJdPDwxNnx0aGlzW3QrM108PDI0fSxhLnByb3RvdHlwZS5yZWFkSW50MzJCRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxUKHQsNCx0aGlzLmxlbmd0aCksdGhpc1t0XTw8MjR8dGhpc1t0KzFdPDwxNnx0aGlzW3QrMl08PDh8dGhpc1t0KzNdfSxhLnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxUKHQsNCx0aGlzLmxlbmd0aCksaS5yZWFkKHRoaXMsdCwhMCwyMyw0KX0sYS5wcm90b3R5cGUucmVhZEZsb2F0QkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZXx8VCh0LDQsdGhpcy5sZW5ndGgpLGkucmVhZCh0aGlzLHQsITEsMjMsNCl9LGEucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbih0LGUpe3JldHVybiBlfHxUKHQsOCx0aGlzLmxlbmd0aCksaS5yZWFkKHRoaXMsdCwhMCw1Miw4KX0sYS5wcm90b3R5cGUucmVhZERvdWJsZUJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fFQodCw4LHRoaXMubGVuZ3RoKSxpLnJlYWQodGhpcyx0LCExLDUyLDgpfSxhLnByb3RvdHlwZS53cml0ZVVJbnRMRT1mdW5jdGlvbih0LGUsbixyKXsodD0rdCxlfD0wLG58PTAscil8fEModGhpcyx0LGUsbixNYXRoLnBvdygyLDgqbiktMSwwKTt2YXIgaT0xLG89MDtmb3IodGhpc1tlXT0yNTUmdDsrK288biYmKGkqPTI1Nik7KXRoaXNbZStvXT10L2kmMjU1O3JldHVybiBlK259LGEucHJvdG90eXBlLndyaXRlVUludEJFPWZ1bmN0aW9uKHQsZSxuLHIpeyh0PSt0LGV8PTAsbnw9MCxyKXx8Qyh0aGlzLHQsZSxuLE1hdGgucG93KDIsOCpuKS0xLDApO3ZhciBpPW4tMSxvPTE7Zm9yKHRoaXNbZStpXT0yNTUmdDstLWk+PTAmJihvKj0yNTYpOyl0aGlzW2UraV09dC9vJjI1NTtyZXR1cm4gZStufSxhLnByb3RvdHlwZS53cml0ZVVJbnQ4PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fEModGhpcyx0LGUsMSwyNTUsMCksYS5UWVBFRF9BUlJBWV9TVVBQT1JUfHwodD1NYXRoLmZsb29yKHQpKSx0aGlzW2VdPTI1NSZ0LGUrMX0sYS5wcm90b3R5cGUud3JpdGVVSW50MTZMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxDKHRoaXMsdCxlLDIsNjU1MzUsMCksYS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCk6RSh0aGlzLHQsZSwhMCksZSsyfSxhLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fEModGhpcyx0LGUsMiw2NTUzNSwwKSxhLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjgsdGhpc1tlKzFdPTI1NSZ0KTpFKHRoaXMsdCxlLCExKSxlKzJ9LGEucHJvdG90eXBlLndyaXRlVUludDMyTEU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Qyh0aGlzLHQsZSw0LDQyOTQ5NjcyOTUsMCksYS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2UrM109dD4+PjI0LHRoaXNbZSsyXT10Pj4+MTYsdGhpc1tlKzFdPXQ+Pj44LHRoaXNbZV09MjU1JnQpOnoodGhpcyx0LGUsITApLGUrNH0sYS5wcm90b3R5cGUud3JpdGVVSW50MzJCRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxDKHRoaXMsdCxlLDQsNDI5NDk2NzI5NSwwKSxhLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbZV09dD4+PjI0LHRoaXNbZSsxXT10Pj4+MTYsdGhpc1tlKzJdPXQ+Pj44LHRoaXNbZSszXT0yNTUmdCk6eih0aGlzLHQsZSwhMSksZSs0fSxhLnByb3RvdHlwZS53cml0ZUludExFPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKHQ9K3QsZXw9MCwhcil7dmFyIGk9TWF0aC5wb3coMiw4Km4tMSk7Qyh0aGlzLHQsZSxuLGktMSwtaSl9dmFyIG89MCx1PTEscz0wO2Zvcih0aGlzW2VdPTI1NSZ0OysrbzxuJiYodSo9MjU2KTspdDwwJiYwPT09cyYmMCE9PXRoaXNbZStvLTFdJiYocz0xKSx0aGlzW2Urb109KHQvdT4+MCktcyYyNTU7cmV0dXJuIGUrbn0sYS5wcm90b3R5cGUud3JpdGVJbnRCRT1mdW5jdGlvbih0LGUsbixyKXtpZih0PSt0LGV8PTAsIXIpe3ZhciBpPU1hdGgucG93KDIsOCpuLTEpO0ModGhpcyx0LGUsbixpLTEsLWkpfXZhciBvPW4tMSx1PTEscz0wO2Zvcih0aGlzW2Urb109MjU1JnQ7LS1vPj0wJiYodSo9MjU2KTspdDwwJiYwPT09cyYmMCE9PXRoaXNbZStvKzFdJiYocz0xKSx0aGlzW2Urb109KHQvdT4+MCktcyYyNTU7cmV0dXJuIGUrbn0sYS5wcm90b3R5cGUud3JpdGVJbnQ4PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD0rdCxlfD0wLG58fEModGhpcyx0LGUsMSwxMjcsLTEyOCksYS5UWVBFRF9BUlJBWV9TVVBQT1JUfHwodD1NYXRoLmZsb29yKHQpKSx0PDAmJih0PTI1NSt0KzEpLHRoaXNbZV09MjU1JnQsZSsxfSxhLnByb3RvdHlwZS53cml0ZUludDE2TEU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Qyh0aGlzLHQsZSwyLDMyNzY3LC0zMjc2OCksYS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCk6RSh0aGlzLHQsZSwhMCksZSsyfSxhLnByb3RvdHlwZS53cml0ZUludDE2QkU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Qyh0aGlzLHQsZSwyLDMyNzY3LC0zMjc2OCksYS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj44LHRoaXNbZSsxXT0yNTUmdCk6RSh0aGlzLHQsZSwhMSksZSsyfSxhLnByb3RvdHlwZS53cml0ZUludDMyTEU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0PSt0LGV8PTAsbnx8Qyh0aGlzLHQsZSw0LDIxNDc0ODM2NDcsLTIxNDc0ODM2NDgpLGEuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgsdGhpc1tlKzJdPXQ+Pj4xNix0aGlzW2UrM109dD4+PjI0KTp6KHRoaXMsdCxlLCEwKSxlKzR9LGEucHJvdG90eXBlLndyaXRlSW50MzJCRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHQ9K3QsZXw9MCxufHxDKHRoaXMsdCxlLDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksdDwwJiYodD00Mjk0OTY3Mjk1K3QrMSksYS5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW2VdPXQ+Pj4yNCx0aGlzW2UrMV09dD4+PjE2LHRoaXNbZSsyXT10Pj4+OCx0aGlzW2UrM109MjU1JnQpOnoodGhpcyx0LGUsITEpLGUrNH0sYS5wcm90b3R5cGUud3JpdGVGbG9hdExFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gWSh0aGlzLHQsZSwhMCxuKX0sYS5wcm90b3R5cGUud3JpdGVGbG9hdEJFPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gWSh0aGlzLHQsZSwhMSxuKX0sYS5wcm90b3R5cGUud3JpdGVEb3VibGVMRT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIFUodGhpcyx0LGUsITAsbil9LGEucHJvdG90eXBlLndyaXRlRG91YmxlQkU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBVKHRoaXMsdCxlLCExLG4pfSxhLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKHQsZSxuLHIpe2lmKG58fChuPTApLHJ8fDA9PT1yfHwocj10aGlzLmxlbmd0aCksZT49dC5sZW5ndGgmJihlPXQubGVuZ3RoKSxlfHwoZT0wKSxyPjAmJnI8biYmKHI9bikscj09PW4pcmV0dXJuIDA7aWYoMD09PXQubGVuZ3RofHwwPT09dGhpcy5sZW5ndGgpcmV0dXJuIDA7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJ0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzIik7aWYobjwwfHxuPj10aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKHI8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlRW5kIG91dCBvZiBib3VuZHMiKTtyPnRoaXMubGVuZ3RoJiYocj10aGlzLmxlbmd0aCksdC5sZW5ndGgtZTxyLW4mJihyPXQubGVuZ3RoLWUrbik7dmFyIGksbz1yLW47aWYodGhpcz09PXQmJm48ZSYmZTxyKWZvcihpPW8tMTtpPj0wOy0taSl0W2krZV09dGhpc1tpK25dO2Vsc2UgaWYobzwxZTN8fCFhLlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKGk9MDtpPG87KytpKXRbaStlXT10aGlzW2krbl07ZWxzZSBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbCh0LHRoaXMuc3ViYXJyYXkobixuK28pLGUpO3JldHVybiBvfSxhLnByb3RvdHlwZS5maWxsPWZ1bmN0aW9uKHQsZSxuLHIpe2lmKCJzdHJpbmciPT10eXBlb2YgdCl7aWYoInN0cmluZyI9PXR5cGVvZiBlPyhyPWUsZT0wLG49dGhpcy5sZW5ndGgpOiJzdHJpbmciPT10eXBlb2YgbiYmKHI9bixuPXRoaXMubGVuZ3RoKSwxPT09dC5sZW5ndGgpe3ZhciBpPXQuY2hhckNvZGVBdCgwKTtpPDI1NiYmKHQ9aSl9aWYodm9pZCAwIT09ciYmInN0cmluZyIhPXR5cGVvZiByKXRocm93IG5ldyBUeXBlRXJyb3IoImVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmciKTtpZigic3RyaW5nIj09dHlwZW9mIHImJiFhLmlzRW5jb2RpbmcocikpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIityKX1lbHNlIm51bWJlciI9PXR5cGVvZiB0JiYodCY9MjU1KTtpZihlPDB8fHRoaXMubGVuZ3RoPGV8fHRoaXMubGVuZ3RoPG4pdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk91dCBvZiByYW5nZSBpbmRleCIpO2lmKG48PWUpcmV0dXJuIHRoaXM7dmFyIG87aWYoZT4+Pj0wLG49dm9pZCAwPT09bj90aGlzLmxlbmd0aDpuPj4+MCx0fHwodD0wKSwibnVtYmVyIj09dHlwZW9mIHQpZm9yKG89ZTtvPG47KytvKXRoaXNbb109dDtlbHNle3ZhciB1PWEuaXNCdWZmZXIodCk/dDpRKG5ldyBhKHQscikudG9TdHJpbmcoKSkscz11Lmxlbmd0aDtmb3Iobz0wO288bi1lOysrbyl0aGlzW28rZV09dVtvJXNdfXJldHVybiB0aGlzfTt2YXIgUD0vW14rXC8wLTlBLVphLXotX10vZztmdW5jdGlvbiBSKHQpe3JldHVybiB0PDE2PyIwIit0LnRvU3RyaW5nKDE2KTp0LnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBRKHQsZSl7dmFyIG47ZT1lfHwxLzA7Zm9yKHZhciByPXQubGVuZ3RoLGk9bnVsbCxvPVtdLHU9MDt1PHI7Kyt1KXtpZigobj10LmNoYXJDb2RlQXQodSkpPjU1Mjk1JiZuPDU3MzQ0KXtpZighaSl7aWYobj41NjMxOSl7KGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfWlmKHUrMT09PXIpeyhlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pPW47Y29udGludWV9aWYobjw1NjMyMCl7KGUtPTMpPi0xJiZvLnB1c2goMjM5LDE5MSwxODkpLGk9bjtjb250aW51ZX1uPTY1NTM2KyhpLTU1Mjk2PDwxMHxuLTU2MzIwKX1lbHNlIGkmJihlLT0zKT4tMSYmby5wdXNoKDIzOSwxOTEsMTg5KTtpZihpPW51bGwsbjwxMjgpe2lmKChlLT0xKTwwKWJyZWFrO28ucHVzaChuKX1lbHNlIGlmKG48MjA0OCl7aWYoKGUtPTIpPDApYnJlYWs7by5wdXNoKG4+PjZ8MTkyLDYzJm58MTI4KX1lbHNlIGlmKG48NjU1MzYpe2lmKChlLT0zKTwwKWJyZWFrO28ucHVzaChuPj4xMnwyMjQsbj4+NiY2M3wxMjgsNjMmbnwxMjgpfWVsc2V7aWYoIShuPDExMTQxMTIpKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb2RlIHBvaW50Iik7aWYoKGUtPTQpPDApYnJlYWs7by5wdXNoKG4+PjE4fDI0MCxuPj4xMiY2M3wxMjgsbj4+NiY2M3wxMjgsNjMmbnwxMjgpfX1yZXR1cm4gb31mdW5jdGlvbiBGKHQpe3JldHVybiByLnRvQnl0ZUFycmF5KGZ1bmN0aW9uKHQpe2lmKCh0PWZ1bmN0aW9uKHQpe3JldHVybiB0LnRyaW0/dC50cmltKCk6dC5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIil9KHQpLnJlcGxhY2UoUCwiIikpLmxlbmd0aDwyKXJldHVybiIiO2Zvcig7dC5sZW5ndGglNCE9MDspdCs9Ij0iO3JldHVybiB0fSh0KSl9ZnVuY3Rpb24gQih0LGUsbixyKXtmb3IodmFyIGk9MDtpPHImJiEoaStuPj1lLmxlbmd0aHx8aT49dC5sZW5ndGgpOysraSllW2krbl09dFtpXTtyZXR1cm4gaX19KS5jYWxsKHRoaXMsbigyMCkpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMzMyKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDMzNSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDM0NCksaT1uKDE4MSksbz1uKDE3OSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG47aWYodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiBvKHQsZSk7dmFyIHU9cihuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSkuY2FsbChuLDgsLTEpO3JldHVybiJPYmplY3QiPT09dSYmdC5jb25zdHJ1Y3RvciYmKHU9dC5jb25zdHJ1Y3Rvci5uYW1lKSwiTWFwIj09PXV8fCJTZXQiPT09dT9pKHQpOiJBcmd1bWVudHMiPT09dXx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QodSk/byh0LGUpOnZvaWQgMH19LHQuZXhwb3J0cy5kZWZhdWx0PXQuZXhwb3J0cyx0LmV4cG9ydHMuX19lc01vZHVsZT0hMH0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDM4KSxpPW4oNDU0KSxvPW4oNDU2KSx1PW4oNDU3KSxzPW4oNDU4KTtmdW5jdGlvbiBhKHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fWEucHJvdG90eXBlLmNsZWFyPXIsYS5wcm90b3R5cGUuZGVsZXRlPWksYS5wcm90b3R5cGUuZ2V0PW8sYS5wcm90b3R5cGUuaGFzPXUsYS5wcm90b3R5cGUuc2V0PXMsdC5leHBvcnRzPWF9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQ2KShuKDI1KSwiTWFwIik7dC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQ2MCksaT1uKDQ5Nyksbz1uKDUwNCksdT1uKDIyKSxzPW4oNTA1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpudWxsPT10P286Im9iamVjdCI9PXR5cGVvZiB0P3UodCk/aSh0WzBdLHRbMV0pOnIodCk6cyh0KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQ4NSksaT1uKDY2KSxvPU9iamVjdC5wcm90b3R5cGUsdT1vLmhhc093blByb3BlcnR5LHM9by5wcm9wZXJ0eUlzRW51bWVyYWJsZSxhPXIoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9yOmZ1bmN0aW9uKHQpe3JldHVybiBpKHQpJiZ1LmNhbGwodCwiY2FsbGVlIikmJiFzLmNhbGwodCwiY2FsbGVlIil9O3QuZXhwb3J0cz1hfSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKHQpe3ZhciByPW4oMjUpLGk9big0ODYpLG89ZSYmIWUubm9kZVR5cGUmJmUsdT1vJiYib2JqZWN0Ij09dHlwZW9mIHQmJnQmJiF0Lm5vZGVUeXBlJiZ0LHM9dSYmdS5leHBvcnRzPT09bz9yLkJ1ZmZlcjp2b2lkIDAsYT0ocz9zLmlzQnVmZmVyOnZvaWQgMCl8fGk7dC5leHBvcnRzPWF9KS5jYWxsKHRoaXMsbigxOTMpKHQpKX0sZnVuY3Rpb24odCxlKXt2YXIgbj0vXig/OjB8WzEtOV1cZCopJC87dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dHlwZW9mIHQ7cmV0dXJuISEoZT1udWxsPT1lPzkwMDcxOTkyNTQ3NDA5OTE6ZSkmJigibnVtYmVyIj09cnx8InN5bWJvbCIhPXImJm4udGVzdCh0KSkmJnQ+LTEmJnQlMT09MCYmdDxlfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDg3KSxpPW4oNDg4KSxvPW4oNDg5KSx1PW8mJm8uaXNUeXBlZEFycmF5LHM9dT9pKHUpOnI7dC5leHBvcnRzPXN9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmdD4tMSYmdCUxPT0wJiZ0PD05MDA3MTk5MjU0NzQwOTkxfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjIpLGk9big4OCksbz0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyx1PS9eXHcqJC87dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7aWYocih0KSlyZXR1cm4hMTt2YXIgbj10eXBlb2YgdDtyZXR1cm4hKCJudW1iZXIiIT1uJiYic3ltYm9sIiE9biYmImJvb2xlYW4iIT1uJiZudWxsIT10JiYhaSh0KSl8fCh1LnRlc3QodCl8fCFvLnRlc3QodCl8fG51bGwhPWUmJnQgaW4gT2JqZWN0KGUpKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHIsaT0ib2JqZWN0Ij09dHlwZW9mIFJlZmxlY3Q/UmVmbGVjdDpudWxsLG89aSYmImZ1bmN0aW9uIj09dHlwZW9mIGkuYXBwbHk/aS5hcHBseTpmdW5jdGlvbih0LGUsbil7cmV0dXJuIEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseS5jYWxsKHQsZSxuKX07cj1pJiYiZnVuY3Rpb24iPT10eXBlb2YgaS5vd25LZXlzP2kub3duS2V5czpPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzP2Z1bmN0aW9uKHQpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0KS5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KSl9OmZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0KX07dmFyIHU9TnVtYmVyLmlzTmFOfHxmdW5jdGlvbih0KXtyZXR1cm4gdCE9dH07ZnVuY3Rpb24gcygpe3MuaW5pdC5jYWxsKHRoaXMpfXQuZXhwb3J0cz1zLHQuZXhwb3J0cy5vbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihuLHIpe2Z1bmN0aW9uIGkoKXt2b2lkIDAhPT1vJiZ0LnJlbW92ZUxpc3RlbmVyKCJlcnJvciIsbyksbihbXS5zbGljZS5jYWxsKGFyZ3VtZW50cykpfXZhciBvOyJlcnJvciIhPT1lJiYobz1mdW5jdGlvbihuKXt0LnJlbW92ZUxpc3RlbmVyKGUsaSkscihuKX0sdC5vbmNlKCJlcnJvciIsbykpLHQub25jZShlLGkpfSkpfSxzLkV2ZW50RW1pdHRlcj1zLHMucHJvdG90eXBlLl9ldmVudHM9dm9pZCAwLHMucHJvdG90eXBlLl9ldmVudHNDb3VudD0wLHMucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dm9pZCAwO3ZhciBhPTEwO2Z1bmN0aW9uIGModCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlICJsaXN0ZW5lciIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIEZ1bmN0aW9uLiBSZWNlaXZlZCB0eXBlICcrdHlwZW9mIHQpfWZ1bmN0aW9uIGYodCl7cmV0dXJuIHZvaWQgMD09PXQuX21heExpc3RlbmVycz9zLmRlZmF1bHRNYXhMaXN0ZW5lcnM6dC5fbWF4TGlzdGVuZXJzfWZ1bmN0aW9uIGwodCxlLG4scil7dmFyIGksbyx1LHM7aWYoYyhuKSx2b2lkIDA9PT0obz10Ll9ldmVudHMpPyhvPXQuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHQuX2V2ZW50c0NvdW50PTApOih2b2lkIDAhPT1vLm5ld0xpc3RlbmVyJiYodC5lbWl0KCJuZXdMaXN0ZW5lciIsZSxuLmxpc3RlbmVyP24ubGlzdGVuZXI6biksbz10Ll9ldmVudHMpLHU9b1tlXSksdm9pZCAwPT09dSl1PW9bZV09biwrK3QuX2V2ZW50c0NvdW50O2Vsc2UgaWYoImZ1bmN0aW9uIj09dHlwZW9mIHU/dT1vW2VdPXI/W24sdV06W3Usbl06cj91LnVuc2hpZnQobik6dS5wdXNoKG4pLChpPWYodCkpPjAmJnUubGVuZ3RoPmkmJiF1Lndhcm5lZCl7dS53YXJuZWQ9ITA7dmFyIGE9bmV3IEVycm9yKCJQb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICIrdS5sZW5ndGgrIiAiK1N0cmluZyhlKSsiIGxpc3RlbmVycyBhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQiKTthLm5hbWU9Ik1heExpc3RlbmVyc0V4Y2VlZGVkV2FybmluZyIsYS5lbWl0dGVyPXQsYS50eXBlPWUsYS5jb3VudD11Lmxlbmd0aCxzPWEsY29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4ocyl9cmV0dXJuIHR9ZnVuY3Rpb24gcCgpe2lmKCF0aGlzLmZpcmVkKXJldHVybiB0aGlzLnRhcmdldC5yZW1vdmVMaXN0ZW5lcih0aGlzLnR5cGUsdGhpcy53cmFwRm4pLHRoaXMuZmlyZWQ9ITAsMD09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5saXN0ZW5lci5jYWxsKHRoaXMudGFyZ2V0KTp0aGlzLmxpc3RlbmVyLmFwcGx5KHRoaXMudGFyZ2V0LGFyZ3VtZW50cyl9ZnVuY3Rpb24gaCh0LGUsbil7dmFyIHI9e2ZpcmVkOiExLHdyYXBGbjp2b2lkIDAsdGFyZ2V0OnQsdHlwZTplLGxpc3RlbmVyOm59LGk9cC5iaW5kKHIpO3JldHVybiBpLmxpc3RlbmVyPW4sci53cmFwRm49aSxpfWZ1bmN0aW9uIGQodCxlLG4pe3ZhciByPXQuX2V2ZW50cztpZih2b2lkIDA9PT1yKXJldHVybltdO3ZhciBpPXJbZV07cmV0dXJuIHZvaWQgMD09PWk/W106ImZ1bmN0aW9uIj09dHlwZW9mIGk/bj9baS5saXN0ZW5lcnx8aV06W2ldOm4/ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0Lmxlbmd0aCksbj0wO248ZS5sZW5ndGg7KytuKWVbbl09dFtuXS5saXN0ZW5lcnx8dFtuXTtyZXR1cm4gZX0oaSk6dihpLGkubGVuZ3RoKX1mdW5jdGlvbiB5KHQpe3ZhciBlPXRoaXMuX2V2ZW50cztpZih2b2lkIDAhPT1lKXt2YXIgbj1lW3RdO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuKXJldHVybiAxO2lmKHZvaWQgMCE9PW4pcmV0dXJuIG4ubGVuZ3RofXJldHVybiAwfWZ1bmN0aW9uIHYodCxlKXtmb3IodmFyIG49bmV3IEFycmF5KGUpLHI9MDtyPGU7KytyKW5bcl09dFtyXTtyZXR1cm4gbn1PYmplY3QuZGVmaW5lUHJvcGVydHkocywiZGVmYXVsdE1heExpc3RlbmVycyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGF9LHNldDpmdW5jdGlvbih0KXtpZigibnVtYmVyIiE9dHlwZW9mIHR8fHQ8MHx8dSh0KSl0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIG9mICJkZWZhdWx0TWF4TGlzdGVuZXJzIiBpcyBvdXQgb2YgcmFuZ2UuIEl0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLiBSZWNlaXZlZCAnK3QrIi4iKTthPXR9fSkscy5pbml0PWZ1bmN0aW9uKCl7dm9pZCAwIT09dGhpcy5fZXZlbnRzJiZ0aGlzLl9ldmVudHMhPT1PYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2V2ZW50c3x8KHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTApLHRoaXMuX21heExpc3RlbmVycz10aGlzLl9tYXhMaXN0ZW5lcnN8fHZvaWQgMH0scy5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzPWZ1bmN0aW9uKHQpe2lmKCJudW1iZXIiIT10eXBlb2YgdHx8dDwwfHx1KHQpKXRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgb2YgIm4iIGlzIG91dCBvZiByYW5nZS4gSXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIuIFJlY2VpdmVkICcrdCsiLiIpO3JldHVybiB0aGlzLl9tYXhMaXN0ZW5lcnM9dCx0aGlzfSxzLnByb3RvdHlwZS5nZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24oKXtyZXR1cm4gZih0aGlzKX0scy5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspZS5wdXNoKGFyZ3VtZW50c1tuXSk7dmFyIHI9ImVycm9yIj09PXQsaT10aGlzLl9ldmVudHM7aWYodm9pZCAwIT09aSlyPXImJnZvaWQgMD09PWkuZXJyb3I7ZWxzZSBpZighcilyZXR1cm4hMTtpZihyKXt2YXIgdTtpZihlLmxlbmd0aD4wJiYodT1lWzBdKSx1IGluc3RhbmNlb2YgRXJyb3IpdGhyb3cgdTt2YXIgcz1uZXcgRXJyb3IoIlVuaGFuZGxlZCBlcnJvci4iKyh1PyIgKCIrdS5tZXNzYWdlKyIpIjoiIikpO3Rocm93IHMuY29udGV4dD11LHN9dmFyIGE9aVt0XTtpZih2b2lkIDA9PT1hKXJldHVybiExO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKW8oYSx0aGlzLGUpO2Vsc2V7dmFyIGM9YS5sZW5ndGgsZj12KGEsYyk7Zm9yKG49MDtuPGM7KytuKW8oZltuXSx0aGlzLGUpfXJldHVybiEwfSxzLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3JldHVybiBsKHRoaXMsdCxlLCExKX0scy5wcm90b3R5cGUub249cy5wcm90b3R5cGUuYWRkTGlzdGVuZXIscy5wcm90b3R5cGUucHJlcGVuZExpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGwodGhpcyx0LGUsITApfSxzLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGMoZSksdGhpcy5vbih0LGgodGhpcyx0LGUpKSx0aGlzfSxzLnByb3RvdHlwZS5wcmVwZW5kT25jZUxpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGMoZSksdGhpcy5wcmVwZW5kTGlzdGVuZXIodCxoKHRoaXMsdCxlKSksdGhpc30scy5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24odCxlKXt2YXIgbixyLGksbyx1O2lmKGMoZSksdm9pZCAwPT09KHI9dGhpcy5fZXZlbnRzKSlyZXR1cm4gdGhpcztpZih2b2lkIDA9PT0obj1yW3RdKSlyZXR1cm4gdGhpcztpZihuPT09ZXx8bi5saXN0ZW5lcj09PWUpMD09LS10aGlzLl9ldmVudHNDb3VudD90aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTooZGVsZXRlIHJbdF0sci5yZW1vdmVMaXN0ZW5lciYmdGhpcy5lbWl0KCJyZW1vdmVMaXN0ZW5lciIsdCxuLmxpc3RlbmVyfHxlKSk7ZWxzZSBpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil7Zm9yKGk9LTEsbz1uLmxlbmd0aC0xO28+PTA7by0tKWlmKG5bb109PT1lfHxuW29dLmxpc3RlbmVyPT09ZSl7dT1uW29dLmxpc3RlbmVyLGk9bzticmVha31pZihpPDApcmV0dXJuIHRoaXM7MD09PWk/bi5zaGlmdCgpOmZ1bmN0aW9uKHQsZSl7Zm9yKDtlKzE8dC5sZW5ndGg7ZSsrKXRbZV09dFtlKzFdO3QucG9wKCl9KG4saSksMT09PW4ubGVuZ3RoJiYoclt0XT1uWzBdKSx2b2lkIDAhPT1yLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIix0LHV8fGUpfXJldHVybiB0aGlzfSxzLnByb3RvdHlwZS5vZmY9cy5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIscy5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3ZhciBlLG4scjtpZih2b2lkIDA9PT0obj10aGlzLl9ldmVudHMpKXJldHVybiB0aGlzO2lmKHZvaWQgMD09PW4ucmVtb3ZlTGlzdGVuZXIpcmV0dXJuIDA9PT1hcmd1bWVudHMubGVuZ3RoPyh0aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9ldmVudHNDb3VudD0wKTp2b2lkIDAhPT1uW3RdJiYoMD09LS10aGlzLl9ldmVudHNDb3VudD90aGlzLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTpkZWxldGUgblt0XSksdGhpcztpZigwPT09YXJndW1lbnRzLmxlbmd0aCl7dmFyIGksbz1PYmplY3Qua2V5cyhuKTtmb3Iocj0wO3I8by5sZW5ndGg7KytyKSJyZW1vdmVMaXN0ZW5lciIhPT0oaT1vW3JdKSYmdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoaSk7cmV0dXJuIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCJyZW1vdmVMaXN0ZW5lciIpLHRoaXMuX2V2ZW50cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2V2ZW50c0NvdW50PTAsdGhpc31pZigiZnVuY3Rpb24iPT10eXBlb2YoZT1uW3RdKSl0aGlzLnJlbW92ZUxpc3RlbmVyKHQsZSk7ZWxzZSBpZih2b2lkIDAhPT1lKWZvcihyPWUubGVuZ3RoLTE7cj49MDtyLS0pdGhpcy5yZW1vdmVMaXN0ZW5lcih0LGVbcl0pO3JldHVybiB0aGlzfSxzLnByb3RvdHlwZS5saXN0ZW5lcnM9ZnVuY3Rpb24odCl7cmV0dXJuIGQodGhpcyx0LCEwKX0scy5wcm90b3R5cGUucmF3TGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3JldHVybiBkKHRoaXMsdCwhMSl9LHMubGlzdGVuZXJDb3VudD1mdW5jdGlvbih0LGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0Lmxpc3RlbmVyQ291bnQ/dC5saXN0ZW5lckNvdW50KGUpOnkuY2FsbCh0LGUpfSxzLnByb3RvdHlwZS5saXN0ZW5lckNvdW50PXkscy5wcm90b3R5cGUuZXZlbnROYW1lcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9ldmVudHNDb3VudD4wP3IodGhpcy5fZXZlbnRzKTpbXX19LGZ1bmN0aW9uKHQsZSxuKXsoZT10LmV4cG9ydHM9bigyMDEpKS5TdHJlYW09ZSxlLlJlYWRhYmxlPWUsZS5Xcml0YWJsZT1uKDEzNyksZS5EdXBsZXg9bigzNSksZS5UcmFuc2Zvcm09bigyMDYpLGUuUGFzc1Rocm91Z2g9big1MjkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiOyhmdW5jdGlvbihlLHIsaSl7dmFyIG89big5NSk7ZnVuY3Rpb24gdSh0KXt2YXIgZT10aGlzO3RoaXMubmV4dD1udWxsLHRoaXMuZW50cnk9bnVsbCx0aGlzLmZpbmlzaD1mdW5jdGlvbigpeyFmdW5jdGlvbih0LGUsbil7dmFyIHI9dC5lbnRyeTt0LmVudHJ5PW51bGw7Zm9yKDtyOyl7dmFyIGk9ci5jYWxsYmFjaztlLnBlbmRpbmdjYi0tLGkobikscj1yLm5leHR9ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU/ZS5jb3JrZWRSZXF1ZXN0c0ZyZWUubmV4dD10OmUuY29ya2VkUmVxdWVzdHNGcmVlPXR9KGUsdCl9fXQuZXhwb3J0cz13O3ZhciBzLGE9IWUuYnJvd3NlciYmWyJ2MC4xMCIsInYwLjkuIl0uaW5kZXhPZihlLnZlcnNpb24uc2xpY2UoMCw1KSk+LTE/cjpvLm5leHRUaWNrO3cuV3JpdGFibGVTdGF0ZT1nO3ZhciBjPW4oNjkpO2MuaW5oZXJpdHM9bigxNik7dmFyIGY9e2RlcHJlY2F0ZTpuKDUyOCl9LGw9bigyMDIpLHA9bigxNykuQnVmZmVyLGg9aS5VaW50OEFycmF5fHxmdW5jdGlvbigpe307dmFyIGQseT1uKDIwMyk7ZnVuY3Rpb24gdigpe31mdW5jdGlvbiBnKHQsZSl7cz1zfHxuKDM1KSx0PXR8fHt9O3ZhciByPWUgaW5zdGFuY2VvZiBzO3RoaXMub2JqZWN0TW9kZT0hIXQub2JqZWN0TW9kZSxyJiYodGhpcy5vYmplY3RNb2RlPXRoaXMub2JqZWN0TW9kZXx8ISF0LndyaXRhYmxlT2JqZWN0TW9kZSk7dmFyIGk9dC5oaWdoV2F0ZXJNYXJrLGM9dC53cml0YWJsZUhpZ2hXYXRlck1hcmssZj10aGlzLm9iamVjdE1vZGU/MTY6MTYzODQ7dGhpcy5oaWdoV2F0ZXJNYXJrPWl8fDA9PT1pP2k6ciYmKGN8fDA9PT1jKT9jOmYsdGhpcy5oaWdoV2F0ZXJNYXJrPU1hdGguZmxvb3IodGhpcy5oaWdoV2F0ZXJNYXJrKSx0aGlzLmZpbmFsQ2FsbGVkPSExLHRoaXMubmVlZERyYWluPSExLHRoaXMuZW5kaW5nPSExLHRoaXMuZW5kZWQ9ITEsdGhpcy5maW5pc2hlZD0hMSx0aGlzLmRlc3Ryb3llZD0hMTt2YXIgbD0hMT09PXQuZGVjb2RlU3RyaW5nczt0aGlzLmRlY29kZVN0cmluZ3M9IWwsdGhpcy5kZWZhdWx0RW5jb2Rpbmc9dC5kZWZhdWx0RW5jb2Rpbmd8fCJ1dGY4Iix0aGlzLmxlbmd0aD0wLHRoaXMud3JpdGluZz0hMSx0aGlzLmNvcmtlZD0wLHRoaXMuc3luYz0hMCx0aGlzLmJ1ZmZlclByb2Nlc3Npbmc9ITEsdGhpcy5vbndyaXRlPWZ1bmN0aW9uKHQpeyFmdW5jdGlvbih0LGUpe3ZhciBuPXQuX3dyaXRhYmxlU3RhdGUscj1uLnN5bmMsaT1uLndyaXRlY2I7aWYoZnVuY3Rpb24odCl7dC53cml0aW5nPSExLHQud3JpdGVjYj1udWxsLHQubGVuZ3RoLT10LndyaXRlbGVuLHQud3JpdGVsZW49MH0obiksZSkhZnVuY3Rpb24odCxlLG4scixpKXstLWUucGVuZGluZ2NiLG4/KG8ubmV4dFRpY2soaSxyKSxvLm5leHRUaWNrKHgsdCxlKSx0Ll93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMCx0LmVtaXQoImVycm9yIixyKSk6KGkociksdC5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWQ9ITAsdC5lbWl0KCJlcnJvciIscikseCh0LGUpKX0odCxuLHIsZSxpKTtlbHNle3ZhciB1PUwobik7dXx8bi5jb3JrZWR8fG4uYnVmZmVyUHJvY2Vzc2luZ3x8IW4uYnVmZmVyZWRSZXF1ZXN0fHxfKHQsbikscj9hKG0sdCxuLHUsaSk6bSh0LG4sdSxpKX19KGUsdCl9LHRoaXMud3JpdGVjYj1udWxsLHRoaXMud3JpdGVsZW49MCx0aGlzLmJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsLHRoaXMucGVuZGluZ2NiPTAsdGhpcy5wcmVmaW5pc2hlZD0hMSx0aGlzLmVycm9yRW1pdHRlZD0hMSx0aGlzLmJ1ZmZlcmVkUmVxdWVzdENvdW50PTAsdGhpcy5jb3JrZWRSZXF1ZXN0c0ZyZWU9bmV3IHUodGhpcyl9ZnVuY3Rpb24gdyh0KXtpZihzPXN8fG4oMzUpLCEoZC5jYWxsKHcsdGhpcyl8fHRoaXMgaW5zdGFuY2VvZiBzKSlyZXR1cm4gbmV3IHcodCk7dGhpcy5fd3JpdGFibGVTdGF0ZT1uZXcgZyh0LHRoaXMpLHRoaXMud3JpdGFibGU9ITAsdCYmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LndyaXRlJiYodGhpcy5fd3JpdGU9dC53cml0ZSksImZ1bmN0aW9uIj09dHlwZW9mIHQud3JpdGV2JiYodGhpcy5fd3JpdGV2PXQud3JpdGV2KSwiZnVuY3Rpb24iPT10eXBlb2YgdC5kZXN0cm95JiYodGhpcy5fZGVzdHJveT10LmRlc3Ryb3kpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmZpbmFsJiYodGhpcy5fZmluYWw9dC5maW5hbCkpLGwuY2FsbCh0aGlzKX1mdW5jdGlvbiBNKHQsZSxuLHIsaSxvLHUpe2Uud3JpdGVsZW49cixlLndyaXRlY2I9dSxlLndyaXRpbmc9ITAsZS5zeW5jPSEwLG4/dC5fd3JpdGV2KGksZS5vbndyaXRlKTp0Ll93cml0ZShpLG8sZS5vbndyaXRlKSxlLnN5bmM9ITF9ZnVuY3Rpb24gbSh0LGUsbixyKXtufHxmdW5jdGlvbih0LGUpezA9PT1lLmxlbmd0aCYmZS5uZWVkRHJhaW4mJihlLm5lZWREcmFpbj0hMSx0LmVtaXQoImRyYWluIikpfSh0LGUpLGUucGVuZGluZ2NiLS0scigpLHgodCxlKX1mdW5jdGlvbiBfKHQsZSl7ZS5idWZmZXJQcm9jZXNzaW5nPSEwO3ZhciBuPWUuYnVmZmVyZWRSZXF1ZXN0O2lmKHQuX3dyaXRldiYmbiYmbi5uZXh0KXt2YXIgcj1lLmJ1ZmZlcmVkUmVxdWVzdENvdW50LGk9bmV3IEFycmF5KHIpLG89ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU7by5lbnRyeT1uO2Zvcih2YXIgcz0wLGE9ITA7bjspaVtzXT1uLG4uaXNCdWZ8fChhPSExKSxuPW4ubmV4dCxzKz0xO2kuYWxsQnVmZmVycz1hLE0odCxlLCEwLGUubGVuZ3RoLGksIiIsby5maW5pc2gpLGUucGVuZGluZ2NiKyssZS5sYXN0QnVmZmVyZWRSZXF1ZXN0PW51bGwsby5uZXh0PyhlLmNvcmtlZFJlcXVlc3RzRnJlZT1vLm5leHQsby5uZXh0PW51bGwpOmUuY29ya2VkUmVxdWVzdHNGcmVlPW5ldyB1KGUpLGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQ9MH1lbHNle2Zvcig7bjspe3ZhciBjPW4uY2h1bmssZj1uLmVuY29kaW5nLGw9bi5jYWxsYmFjaztpZihNKHQsZSwhMSxlLm9iamVjdE1vZGU/MTpjLmxlbmd0aCxjLGYsbCksbj1uLm5leHQsZS5idWZmZXJlZFJlcXVlc3RDb3VudC0tLGUud3JpdGluZylicmVha31udWxsPT09biYmKGUubGFzdEJ1ZmZlcmVkUmVxdWVzdD1udWxsKX1lLmJ1ZmZlcmVkUmVxdWVzdD1uLGUuYnVmZmVyUHJvY2Vzc2luZz0hMX1mdW5jdGlvbiBMKHQpe3JldHVybiB0LmVuZGluZyYmMD09PXQubGVuZ3RoJiZudWxsPT09dC5idWZmZXJlZFJlcXVlc3QmJiF0LmZpbmlzaGVkJiYhdC53cml0aW5nfWZ1bmN0aW9uIGIodCxlKXt0Ll9maW5hbCgoZnVuY3Rpb24obil7ZS5wZW5kaW5nY2ItLSxuJiZ0LmVtaXQoImVycm9yIixuKSxlLnByZWZpbmlzaGVkPSEwLHQuZW1pdCgicHJlZmluaXNoIikseCh0LGUpfSkpfWZ1bmN0aW9uIHgodCxlKXt2YXIgbj1MKGUpO3JldHVybiBuJiYoIWZ1bmN0aW9uKHQsZSl7ZS5wcmVmaW5pc2hlZHx8ZS5maW5hbENhbGxlZHx8KCJmdW5jdGlvbiI9PXR5cGVvZiB0Ll9maW5hbD8oZS5wZW5kaW5nY2IrKyxlLmZpbmFsQ2FsbGVkPSEwLG8ubmV4dFRpY2soYix0LGUpKTooZS5wcmVmaW5pc2hlZD0hMCx0LmVtaXQoInByZWZpbmlzaCIpKSl9KHQsZSksMD09PWUucGVuZGluZ2NiJiYoZS5maW5pc2hlZD0hMCx0LmVtaXQoImZpbmlzaCIpKSksbn1jLmluaGVyaXRzKHcsbCksZy5wcm90b3R5cGUuZ2V0QnVmZmVyPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuYnVmZmVyZWRSZXF1ZXN0LGU9W107dDspZS5wdXNoKHQpLHQ9dC5uZXh0O3JldHVybiBlfSxmdW5jdGlvbigpe3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZy5wcm90b3R5cGUsImJ1ZmZlciIse2dldDpmLmRlcHJlY2F0ZSgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRCdWZmZXIoKX0pLCJfd3JpdGFibGVTdGF0ZS5idWZmZXIgaXMgZGVwcmVjYXRlZC4gVXNlIF93cml0YWJsZVN0YXRlLmdldEJ1ZmZlciBpbnN0ZWFkLiIsIkRFUDAwMDMiKX0pfWNhdGNoKHQpe319KCksImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLmhhc0luc3RhbmNlJiYiZnVuY3Rpb24iPT10eXBlb2YgRnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV0/KGQ9RnVuY3Rpb24ucHJvdG90eXBlW1N5bWJvbC5oYXNJbnN0YW5jZV0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHcsU3ltYm9sLmhhc0luc3RhbmNlLHt2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4hIWQuY2FsbCh0aGlzLHQpfHx0aGlzPT09dyYmKHQmJnQuX3dyaXRhYmxlU3RhdGUgaW5zdGFuY2VvZiBnKX19KSk6ZD1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIHRoaXN9LHcucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24oKXt0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIkNhbm5vdCBwaXBlLCBub3QgcmVhZGFibGUiKSl9LHcucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcixpPXRoaXMuX3dyaXRhYmxlU3RhdGUsdT0hMSxzPSFpLm9iamVjdE1vZGUmJihyPXQscC5pc0J1ZmZlcihyKXx8ciBpbnN0YW5jZW9mIGgpO3JldHVybiBzJiYhcC5pc0J1ZmZlcih0KSYmKHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHAuZnJvbSh0KX0odCkpLCJmdW5jdGlvbiI9PXR5cGVvZiBlJiYobj1lLGU9bnVsbCkscz9lPSJidWZmZXIiOmV8fChlPWkuZGVmYXVsdEVuY29kaW5nKSwiZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49diksaS5lbmRlZD9mdW5jdGlvbih0LGUpe3ZhciBuPW5ldyBFcnJvcigid3JpdGUgYWZ0ZXIgZW5kIik7dC5lbWl0KCJlcnJvciIsbiksby5uZXh0VGljayhlLG4pfSh0aGlzLG4pOihzfHxmdW5jdGlvbih0LGUsbixyKXt2YXIgaT0hMCx1PSExO3JldHVybiBudWxsPT09bj91PW5ldyBUeXBlRXJyb3IoIk1heSBub3Qgd3JpdGUgbnVsbCB2YWx1ZXMgdG8gc3RyZWFtIik6InN0cmluZyI9PXR5cGVvZiBufHx2b2lkIDA9PT1ufHxlLm9iamVjdE1vZGV8fCh1PW5ldyBUeXBlRXJyb3IoIkludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsiKSksdSYmKHQuZW1pdCgiZXJyb3IiLHUpLG8ubmV4dFRpY2socix1KSxpPSExKSxpfSh0aGlzLGksdCxuKSkmJihpLnBlbmRpbmdjYisrLHU9ZnVuY3Rpb24odCxlLG4scixpLG8pe2lmKCFuKXt2YXIgdT1mdW5jdGlvbih0LGUsbil7dC5vYmplY3RNb2RlfHwhMT09PXQuZGVjb2RlU3RyaW5nc3x8InN0cmluZyIhPXR5cGVvZiBlfHwoZT1wLmZyb20oZSxuKSk7cmV0dXJuIGV9KGUscixpKTtyIT09dSYmKG49ITAsaT0iYnVmZmVyIixyPXUpfXZhciBzPWUub2JqZWN0TW9kZT8xOnIubGVuZ3RoO2UubGVuZ3RoKz1zO3ZhciBhPWUubGVuZ3RoPGUuaGlnaFdhdGVyTWFyazthfHwoZS5uZWVkRHJhaW49ITApO2lmKGUud3JpdGluZ3x8ZS5jb3JrZWQpe3ZhciBjPWUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtlLmxhc3RCdWZmZXJlZFJlcXVlc3Q9e2NodW5rOnIsZW5jb2Rpbmc6aSxpc0J1ZjpuLGNhbGxiYWNrOm8sbmV4dDpudWxsfSxjP2MubmV4dD1lLmxhc3RCdWZmZXJlZFJlcXVlc3Q6ZS5idWZmZXJlZFJlcXVlc3Q9ZS5sYXN0QnVmZmVyZWRSZXF1ZXN0LGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQrPTF9ZWxzZSBNKHQsZSwhMSxzLHIsaSxvKTtyZXR1cm4gYX0odGhpcyxpLHMsdCxlLG4pKSx1fSx3LnByb3RvdHlwZS5jb3JrPWZ1bmN0aW9uKCl7dGhpcy5fd3JpdGFibGVTdGF0ZS5jb3JrZWQrK30sdy5wcm90b3R5cGUudW5jb3JrPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fd3JpdGFibGVTdGF0ZTt0LmNvcmtlZCYmKHQuY29ya2VkLS0sdC53cml0aW5nfHx0LmNvcmtlZHx8dC5maW5pc2hlZHx8dC5idWZmZXJQcm9jZXNzaW5nfHwhdC5idWZmZXJlZFJlcXVlc3R8fF8odGhpcyx0KSl9LHcucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZz1mdW5jdGlvbih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQmJih0PXQudG9Mb3dlckNhc2UoKSksIShbImhleCIsInV0ZjgiLCJ1dGYtOCIsImFzY2lpIiwiYmluYXJ5IiwiYmFzZTY0IiwidWNzMiIsInVjcy0yIiwidXRmMTZsZSIsInV0Zi0xNmxlIiwicmF3Il0uaW5kZXhPZigodCsiIikudG9Mb3dlckNhc2UoKSk+LTEpKXRocm93IG5ldyBUeXBlRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrdCk7cmV0dXJuIHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVmYXVsdEVuY29kaW5nPXQsdGhpc30sT2JqZWN0LmRlZmluZVByb3BlcnR5KHcucHJvdG90eXBlLCJ3cml0YWJsZUhpZ2hXYXRlck1hcmsiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl93cml0YWJsZVN0YXRlLmhpZ2hXYXRlck1hcmt9fSksdy5wcm90b3R5cGUuX3dyaXRlPWZ1bmN0aW9uKHQsZSxuKXtuKG5ldyBFcnJvcigiX3dyaXRlKCkgaXMgbm90IGltcGxlbWVudGVkIikpfSx3LnByb3RvdHlwZS5fd3JpdGV2PW51bGwsdy5wcm90b3R5cGUuZW5kPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj10aGlzLl93cml0YWJsZVN0YXRlOyJmdW5jdGlvbiI9PXR5cGVvZiB0PyhuPXQsdD1udWxsLGU9bnVsbCk6ImZ1bmN0aW9uIj09dHlwZW9mIGUmJihuPWUsZT1udWxsKSxudWxsIT10JiZ0aGlzLndyaXRlKHQsZSksci5jb3JrZWQmJihyLmNvcmtlZD0xLHRoaXMudW5jb3JrKCkpLHIuZW5kaW5nfHxyLmZpbmlzaGVkfHxmdW5jdGlvbih0LGUsbil7ZS5lbmRpbmc9ITAseCh0LGUpLG4mJihlLmZpbmlzaGVkP28ubmV4dFRpY2sobik6dC5vbmNlKCJmaW5pc2giLG4pKTtlLmVuZGVkPSEwLHQud3JpdGFibGU9ITF9KHRoaXMscixuKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHcucHJvdG90eXBlLCJkZXN0cm95ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwIT09dGhpcy5fd3JpdGFibGVTdGF0ZSYmdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWR9LHNldDpmdW5jdGlvbih0KXt0aGlzLl93cml0YWJsZVN0YXRlJiYodGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ9dCl9fSksdy5wcm90b3R5cGUuZGVzdHJveT15LmRlc3Ryb3ksdy5wcm90b3R5cGUuX3VuZGVzdHJveT15LnVuZGVzdHJveSx3LnByb3RvdHlwZS5fZGVzdHJveT1mdW5jdGlvbih0LGUpe3RoaXMuZW5kKCksZSh0KX19KS5jYWxsKHRoaXMsbigzNCksbigyMDQpLnNldEltbWVkaWF0ZSxuKDIwKSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dC5leHBvcnRzPW4oNTU5KSgpP0FycmF5LmZyb206big1NjApfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNTc3KSxpPW4oMzcpLG89big0NyksdT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZixzPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksYT1NYXRoLmFicyxjPU1hdGguZmxvb3I7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlLG4sZixsO2lmKCFyKHQpKXJldHVybiB1LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtmb3Iobj1pKG8odGhpcykubGVuZ3RoKSxmPWFyZ3VtZW50c1sxXSxlPWY9aXNOYU4oZik/MDpmPj0wP2MoZik6aSh0aGlzLmxlbmd0aCktYyhhKGYpKTtlPG47KytlKWlmKHMuY2FsbCh0aGlzLGUpJiYobD10aGlzW2VdLHIobCkpKXJldHVybiBlO3JldHVybi0xfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjsoZnVuY3Rpb24oZSxuKXt2YXIgcj1mdW5jdGlvbih0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKHQrIiBpcyBub3QgYSBmdW5jdGlvbiIpO3JldHVybiB0fSxpPWZ1bmN0aW9uKHQpe3ZhciBlLG4saT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIiksbz0wO3JldHVybiBuZXcgdCgoZnVuY3Rpb24oKXt2YXIgdDtpZihlKW4mJihlPW4uY29uY2F0KGUpKTtlbHNle2lmKCFuKXJldHVybjtlPW59aWYobj1lLGU9bnVsbCwiZnVuY3Rpb24iPT10eXBlb2YgbilyZXR1cm4gdD1uLG49bnVsbCx2b2lkIHQoKTtmb3IoaS5kYXRhPW89KytvJTI7bjspdD1uLnNoaWZ0KCksbi5sZW5ndGh8fChuPW51bGwpLHQoKX0pKS5vYnNlcnZlKGkse2NoYXJhY3RlckRhdGE6ITB9KSxmdW5jdGlvbih0KXtyKHQpLGU/ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZT1bZSx0XTplLnB1c2godCk6KGU9dCxpLmRhdGE9bz0rK28lMil9fTt0LmV4cG9ydHM9ZnVuY3Rpb24oKXtpZigib2JqZWN0Ij09dHlwZW9mIGUmJmUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLm5leHRUaWNrKXJldHVybiBlLm5leHRUaWNrO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBxdWV1ZU1pY3JvdGFzaylyZXR1cm4gZnVuY3Rpb24odCl7cXVldWVNaWNyb3Rhc2socih0KSl9O2lmKCJvYmplY3QiPT10eXBlb2YgZG9jdW1lbnQmJmRvY3VtZW50KXtpZigiZnVuY3Rpb24iPT10eXBlb2YgTXV0YXRpb25PYnNlcnZlcilyZXR1cm4gaShNdXRhdGlvbk9ic2VydmVyKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgV2ViS2l0TXV0YXRpb25PYnNlcnZlcilyZXR1cm4gaShXZWJLaXRNdXRhdGlvbk9ic2VydmVyKX1yZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbih0KXtuKHIodCkpfToiZnVuY3Rpb24iPT10eXBlb2Ygc2V0VGltZW91dHx8Im9iamVjdCI9PXR5cGVvZiBzZXRUaW1lb3V0P2Z1bmN0aW9uKHQpe3NldFRpbWVvdXQocih0KSwwKX06bnVsbH0oKX0pLmNhbGwodGhpcyxuKDM0KSxuKDIwNCkuc2V0SW1tZWRpYXRlKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDIzKSgidG9VcHBlckNhc2UiKTt0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTI2KTtmdW5jdGlvbiBpKHQsZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHR8fG51bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgZnVuY3Rpb24iKTt2YXIgbj1mdW5jdGlvbigpe3ZhciByPWFyZ3VtZW50cyxpPWU/ZS5hcHBseSh0aGlzLHIpOnJbMF0sbz1uLmNhY2hlO2lmKG8uaGFzKGkpKXJldHVybiBvLmdldChpKTt2YXIgdT10LmFwcGx5KHRoaXMscik7cmV0dXJuIG4uY2FjaGU9by5zZXQoaSx1KXx8byx1fTtyZXR1cm4gbi5jYWNoZT1uZXcoaS5DYWNoZXx8ciksbn1pLkNhY2hlPXIsdC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDgwKSxpPW4oMTI0KSxvPW4oMTIzKSx1PW4oMTI1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbj12b2lkIDAhPT1yJiZpKHQpfHx0WyJAQGl0ZXJhdG9yIl07aWYoIW4pe2lmKG8odCl8fChuPXUodCkpfHxlJiZ0JiYibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RoKXtuJiYodD1uKTt2YXIgcz0wLGE9ZnVuY3Rpb24oKXt9O3JldHVybntzOmEsbjpmdW5jdGlvbigpe3JldHVybiBzPj10Lmxlbmd0aD97ZG9uZTohMH06e2RvbmU6ITEsdmFsdWU6dFtzKytdfX0sZTpmdW5jdGlvbih0KXt0aHJvdyB0fSxmOmF9fXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBpdGVyYXRlIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cbkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC4iKX12YXIgYyxmPSEwLGw9ITE7cmV0dXJue3M6ZnVuY3Rpb24oKXtuPW4uY2FsbCh0KX0sbjpmdW5jdGlvbigpe3ZhciB0PW4ubmV4dCgpO3JldHVybiBmPXQuZG9uZSx0fSxlOmZ1bmN0aW9uKHQpe2w9ITAsYz10fSxmOmZ1bmN0aW9uKCl7dHJ5e2Z8fG51bGw9PW4ucmV0dXJufHxuLnJldHVybigpfWZpbmFsbHl7aWYobCl0aHJvdyBjfX19fSx0LmV4cG9ydHMuZGVmYXVsdD10LmV4cG9ydHMsdC5leHBvcnRzLl9fZXNNb2R1bGU9ITB9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigzNzMpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMzk3KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTkyKSxpPW4oMTI4KSxvPW4oNTE1KSx1PW4oMjIpLHM9big1MjEpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7dmFyIGE9dSh0KT9yOm87cmV0dXJuIG4mJnModCxlLG4pJiYoZT12b2lkIDApLGEodCxpKGUsMykpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtuLmQoZSwiYSIsKGZ1bmN0aW9uKCl7cmV0dXJuIFB9KSksbi5kKGUsImIiLChmdW5jdGlvbigpe3JldHVybiBSfSkpO3ZhciByPW4oMTgpLGk9bi5uKHIpLG89bigzKSx1PW4ubihvKSxzPW4oNDEpLGE9bi5uKHMpLGM9big5KSxmPW4ubihjKSxsPW4oNSkscD1uLm4obCksaD1uKDQwKSxkPW4ubihoKSx5PW4oNTEpLHY9bi5uKHkpLGc9big1MCksdz1uLm4oZyksTT1uKDEwMiksbT1uLm4oTSksXz1uKDExKSxMPW4ubihfKSxiPW4oMTIpLHg9bigyMjgpLGo9bi5uKHgpLE49bigxNDgpLFM9bi5uKE4pLEQ9big1MyksST1uLm4oRCksQT17c3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuInN0cmluZyJ9LHN0cmluZ19lbWFpbDpmdW5jdGlvbigpe3JldHVybiJ1c2VyQGV4YW1wbGUuY29tIn0sInN0cmluZ19kYXRlLXRpbWUiOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBEYXRlKS50b0lTT1N0cmluZygpfSxzdHJpbmdfZGF0ZTpmdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkudG9JU09TdHJpbmcoKS5zdWJzdHJpbmcoMCwxMCl9LHN0cmluZ191dWlkOmZ1bmN0aW9uKCl7cmV0dXJuIjNmYTg1ZjY0LTU3MTctNDU2Mi1iM2ZjLTJjOTYzZjY2YWZhNiJ9LHN0cmluZ19ob3N0bmFtZTpmdW5jdGlvbigpe3JldHVybiJleGFtcGxlLmNvbSJ9LHN0cmluZ19pcHY0OmZ1bmN0aW9uKCl7cmV0dXJuIjE5OC41MS4xMDAuNDIifSxzdHJpbmdfaXB2NjpmdW5jdGlvbigpe3JldHVybiIyMDAxOjBkYjg6NWI5NjowMDAwOjAwMDA6NDI2Zjo4ZTE3OjY0MmEifSxudW1iZXI6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sbnVtYmVyX2Zsb2F0OmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGludGVnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sYm9vbGVhbjpmdW5jdGlvbih0KXtyZXR1cm4iYm9vbGVhbiIhPXR5cGVvZiB0LmRlZmF1bHR8fHQuZGVmYXVsdH19LE89ZnVuY3Rpb24odCl7dmFyIGUsbj10PU9iamVjdChiLmQpKHQpLHI9bi50eXBlLGk9bi5mb3JtYXQsbz1BW3UoKShlPSIiLmNvbmNhdChyLCJfIikpLmNhbGwoZSxpKV18fEFbcl07cmV0dXJuIE9iamVjdChiLmIpKG8pP28odCk6IlVua25vd24gVHlwZTogIit0LnR5cGV9LFQ9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdChiLmEpKHQsIiQkcmVmIiwoZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0JiZhKCkodCkuY2FsbCh0LCIjIik+LTF9KSl9LEM9WyJtYXhQcm9wZXJ0aWVzIiwibWluUHJvcGVydGllcyJdLEU9WyJtaW5JdGVtcyIsIm1heEl0ZW1zIl0sej1bIm1pbmltdW0iLCJtYXhpbXVtIiwiZXhjbHVzaXZlTWluaW11bSIsImV4Y2x1c2l2ZU1heGltdW0iXSxrPVsibWluTGVuZ3RoIiwibWF4TGVuZ3RoIl0sWT1mdW5jdGlvbiB0KGUsbil7dmFyIHIsaSxvLHM9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LGM9ZnVuY3Rpb24odCl7dm9pZCAwPT09blt0XSYmdm9pZCAwIT09ZVt0XSYmKG5bdF09ZVt0XSl9OyhmKCkocj11KCkoaT1bImV4YW1wbGUiLCJkZWZhdWx0IiwiZW51bSIsInhtbCIsInR5cGUiXSkuY2FsbChpLEMsRSx6LGspKS5jYWxsKHIsKGZ1bmN0aW9uKHQpe3JldHVybiBjKHQpfSkpLHZvaWQgMCE9PWUucmVxdWlyZWQmJnAoKShlLnJlcXVpcmVkKSkmJih2b2lkIDAhPT1uLnJlcXVpcmVkJiZuLnJlcXVpcmVkLmxlbmd0aHx8KG4ucmVxdWlyZWQ9W10pLGYoKShvPWUucmVxdWlyZWQpLmNhbGwobywoZnVuY3Rpb24odCl7dmFyIGU7ZCgpKGU9bi5yZXF1aXJlZCkuY2FsbChlLHQpfHxuLnJlcXVpcmVkLnB1c2godCl9KSkpO2lmKGUucHJvcGVydGllcyl7bi5wcm9wZXJ0aWVzfHwobi5wcm9wZXJ0aWVzPXt9KTt2YXIgbD1PYmplY3QoYi5kKShlLnByb3BlcnRpZXMpO2Zvcih2YXIgaCBpbiBsKXt2YXIgeTtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobCxoKSlpZighbFtoXXx8IWxbaF0uZGVwcmVjYXRlZClpZighbFtoXXx8IWxbaF0ucmVhZE9ubHl8fHMuaW5jbHVkZVJlYWRPbmx5KWlmKCFsW2hdfHwhbFtoXS53cml0ZU9ubHl8fHMuaW5jbHVkZVdyaXRlT25seSlpZighbi5wcm9wZXJ0aWVzW2hdKW4ucHJvcGVydGllc1toXT1sW2hdLCFlLnJlcXVpcmVkJiZwKCkoZS5yZXF1aXJlZCkmJi0xIT09YSgpKHk9ZS5yZXF1aXJlZCkuY2FsbCh5LGgpJiYobi5yZXF1aXJlZD9uLnJlcXVpcmVkLnB1c2goaCk6bi5yZXF1aXJlZD1baF0pfX1yZXR1cm4gZS5pdGVtcyYmKG4uaXRlbXN8fChuLml0ZW1zPXt9KSxuLml0ZW1zPXQoZS5pdGVtcyxuLml0ZW1zLHMpKSxufSxVPWZ1bmN0aW9uIHQoZSl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9LHI9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnZvaWQgMCxvPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdJiZhcmd1bWVudHNbM107ZSYmT2JqZWN0KGIuYikoZS50b0pTKSYmKGU9ZS50b0pTKCkpO3ZhciBzPXZvaWQgMCE9PXJ8fGUmJnZvaWQgMCE9PWUuZXhhbXBsZXx8ZSYmdm9pZCAwIT09ZS5kZWZhdWx0LGM9IXMmJmUmJmUub25lT2YmJmUub25lT2YubGVuZ3RoPjAsbD0hcyYmZSYmZS5hbnlPZiYmZS5hbnlPZi5sZW5ndGg+MDtpZighcyYmKGN8fGwpKXt2YXIgaD1PYmplY3QoYi5kKShjP2Uub25lT2ZbMF06ZS5hbnlPZlswXSk7aWYoWShoLGUsbiksIWUueG1sJiZoLnhtbCYmKGUueG1sPWgueG1sKSx2b2lkIDAhPT1lLmV4YW1wbGUmJnZvaWQgMCE9PWguZXhhbXBsZSlzPSEwO2Vsc2UgaWYoaC5wcm9wZXJ0aWVzKXtlLnByb3BlcnRpZXN8fChlLnByb3BlcnRpZXM9e30pO3ZhciB5PU9iamVjdChiLmQpKGgucHJvcGVydGllcyk7Zm9yKHZhciBnIGluIHkpe3ZhciBNO2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh5LGcpKWlmKCF5W2ddfHwheVtnXS5kZXByZWNhdGVkKWlmKCF5W2ddfHwheVtnXS5yZWFkT25seXx8bi5pbmNsdWRlUmVhZE9ubHkpaWYoIXlbZ118fCF5W2ddLndyaXRlT25seXx8bi5pbmNsdWRlV3JpdGVPbmx5KWlmKCFlLnByb3BlcnRpZXNbZ10pZS5wcm9wZXJ0aWVzW2ddPXlbZ10sIWgucmVxdWlyZWQmJnAoKShoLnJlcXVpcmVkKSYmLTEhPT1hKCkoTT1oLnJlcXVpcmVkKS5jYWxsKE0sZykmJihlLnJlcXVpcmVkP2UucmVxdWlyZWQucHVzaChnKTplLnJlcXVpcmVkPVtnXSl9fX12YXIgXyx4PXt9LGo9ZXx8e30sTj1qLnhtbCxTPWoudHlwZSxEPWouZXhhbXBsZSxBPWoucHJvcGVydGllcyxrPWouYWRkaXRpb25hbFByb3BlcnRpZXMsVT1qLml0ZW1zLFA9bi5pbmNsdWRlUmVhZE9ubHksUj1uLmluY2x1ZGVXcml0ZU9ubHksUT1OPU58fHt9LEY9US5uYW1lLEI9US5wcmVmaXgsRz1RLm5hbWVzcGFjZSxXPXt9O2lmKG8mJihfPShCP0IrIjoiOiIiKSsoRj1GfHwibm90YWduYW1lIiksRykpe3ZhciBxPUI/InhtbG5zOiIrQjoieG1sbnMiO3hbcV09R31vJiYoV1tfXT1bXSk7dmFyIEo9ZnVuY3Rpb24odCl7cmV0dXJuIHYoKSh0KS5jYWxsKHQsKGZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX0pKX07ZSYmIVMmJihBfHxrfHxKKEMpP1M9Im9iamVjdCI6VXx8SihFKT9TPSJhcnJheSI6Sih6KT8oUz0ibnVtYmVyIixlLnR5cGU9Im51bWJlciIpOnN8fGUuZW51bXx8KFM9InN0cmluZyIsZS50eXBlPSJzdHJpbmciKSk7dmFyIFosVixYPWZ1bmN0aW9uKHQpe3ZhciBuLHIsaSxvLHU7bnVsbCE9PShudWxsPT09KG49ZSl8fHZvaWQgMD09PW4/dm9pZCAwOm4ubWF4SXRlbXMpJiZ2b2lkIDAhPT0obnVsbD09PShyPWUpfHx2b2lkIDA9PT1yP3ZvaWQgMDpyLm1heEl0ZW1zKSYmKHQ9dygpKHQpLmNhbGwodCwwLG51bGw9PT0odT1lKXx8dm9pZCAwPT09dT92b2lkIDA6dS5tYXhJdGVtcykpO2lmKG51bGwhPT0obnVsbD09PShpPWUpfHx2b2lkIDA9PT1pP3ZvaWQgMDppLm1pbkl0ZW1zKSYmdm9pZCAwIT09KG51bGw9PT0obz1lKXx8dm9pZCAwPT09bz92b2lkIDA6by5taW5JdGVtcykpZm9yKHZhciBzPTA7dC5sZW5ndGg8KG51bGw9PT0oYT1lKXx8dm9pZCAwPT09YT92b2lkIDA6YS5taW5JdGVtcyk7KXt2YXIgYTt0LnB1c2godFtzKysldC5sZW5ndGhdKX1yZXR1cm4gdH0sSD1PYmplY3QoYi5kKShBKSxLPTAsJD1mdW5jdGlvbigpe3JldHVybiBlJiZudWxsIT09ZS5tYXhQcm9wZXJ0aWVzJiZ2b2lkIDAhPT1lLm1heFByb3BlcnRpZXMmJks+PWUubWF4UHJvcGVydGllc30sdHQ9ZnVuY3Rpb24oKXtpZighZXx8IWUucmVxdWlyZWQpcmV0dXJuIDA7dmFyIHQsbixyPTA7bz9mKCkodD1lLnJlcXVpcmVkKS5jYWxsKHQsKGZ1bmN0aW9uKHQpe3JldHVybiByKz12b2lkIDA9PT1XW3RdPzA6MX0pKTpmKCkobj1lLnJlcXVpcmVkKS5jYWxsKG4sKGZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiByKz12b2lkIDA9PT0obnVsbD09PShlPVdbX10pfHx2b2lkIDA9PT1lP3ZvaWQgMDptKCkoZSkuY2FsbChlLChmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwIT09ZVt0XX0pKSk/MDoxfSkpO3JldHVybiBlLnJlcXVpcmVkLmxlbmd0aC1yfSxldD1mdW5jdGlvbih0KXt2YXIgbjtyZXR1cm4hKGUmJmUucmVxdWlyZWQmJmUucmVxdWlyZWQubGVuZ3RoKXx8IWQoKShuPWUucmVxdWlyZWQpLmNhbGwobix0KX0sbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIWV8fG51bGw9PT1lLm1heFByb3BlcnRpZXN8fHZvaWQgMD09PWUubWF4UHJvcGVydGllc3x8ISQoKSYmKCFldCh0KXx8ZS5tYXhQcm9wZXJ0aWVzLUstdHQoKT4wKX07aWYoWj1vP2Z1bmN0aW9uKHIpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp2b2lkIDA7aWYoZSYmSFtyXSl7aWYoSFtyXS54bWw9SFtyXS54bWx8fHt9LEhbcl0ueG1sLmF0dHJpYnV0ZSl7dmFyIHM9cCgpKEhbcl0uZW51bSk/SFtyXS5lbnVtWzBdOnZvaWQgMCxhPUhbcl0uZXhhbXBsZSxjPUhbcl0uZGVmYXVsdDtyZXR1cm4gdm9pZCh4W0hbcl0ueG1sLm5hbWV8fHJdPXZvaWQgMCE9PWE/YTp2b2lkIDAhPT1jP2M6dm9pZCAwIT09cz9zOk8oSFtyXSkpfUhbcl0ueG1sLm5hbWU9SFtyXS54bWwubmFtZXx8cn1lbHNlIEhbcl18fCExPT09a3x8KEhbcl09e3htbDp7bmFtZTpyfX0pO3ZhciBmLGw9dChlJiZIW3JdfHx2b2lkIDAsbixpLG8pO250KHIpJiYoSysrLHAoKShsKT9XW19dPXUoKShmPVdbX10pLmNhbGwoZixsKTpXW19dLnB1c2gobCkpfTpmdW5jdGlvbihlLHIpe250KGUpJiYoV1tlXT10KEhbZV0sbixyLG8pLEsrKyl9LHMpe3ZhciBydDtpZihydD1UKHZvaWQgMCE9PXI/cjp2b2lkIDAhPT1EP0Q6ZS5kZWZhdWx0KSwhbyl7aWYoIm51bWJlciI9PXR5cGVvZiBydCYmInN0cmluZyI9PT1TKXJldHVybiIiLmNvbmNhdChydCk7aWYoInN0cmluZyIhPXR5cGVvZiBydHx8InN0cmluZyI9PT1TKXJldHVybiBydDt0cnl7cmV0dXJuIEpTT04ucGFyc2UocnQpfWNhdGNoKHQpe3JldHVybiBydH19aWYoZXx8KFM9cCgpKHJ0KT8iYXJyYXkiOmkoKShydCkpLCJhcnJheSI9PT1TKXtpZighcCgpKHJ0KSl7aWYoInN0cmluZyI9PXR5cGVvZiBydClyZXR1cm4gcnQ7cnQ9W3J0XX12YXIgaXQ9ZT9lLml0ZW1zOnZvaWQgMDtpdCYmKGl0LnhtbD1pdC54bWx8fE58fHt9LGl0LnhtbC5uYW1lPWl0LnhtbC5uYW1lfHxOLm5hbWUpO3ZhciBvdD1MKCkocnQpLmNhbGwocnQsKGZ1bmN0aW9uKGUpe3JldHVybiB0KGl0LG4sZSxvKX0pKTtyZXR1cm4gb3Q9WChvdCksTi53cmFwcGVkPyhXW19dPW90LEkoKSh4KXx8V1tfXS5wdXNoKHtfYXR0cjp4fSkpOlc9b3QsV31pZigib2JqZWN0Ij09PVMpe2lmKCJzdHJpbmciPT10eXBlb2YgcnQpcmV0dXJuIHJ0O2Zvcih2YXIgdXQgaW4gcnQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJ0LHV0KSYmKGUmJkhbdXRdJiZIW3V0XS5yZWFkT25seSYmIVB8fGUmJkhbdXRdJiZIW3V0XS53cml0ZU9ubHkmJiFSfHwoZSYmSFt1dF0mJkhbdXRdLnhtbCYmSFt1dF0ueG1sLmF0dHJpYnV0ZT94W0hbdXRdLnhtbC5uYW1lfHx1dF09cnRbdXRdOloodXQscnRbdXRdKSkpO3JldHVybiBJKCkoeCl8fFdbX10ucHVzaCh7X2F0dHI6eH0pLFd9cmV0dXJuIFdbX109SSgpKHgpP3J0Olt7X2F0dHI6eH0scnRdLFd9aWYoIm9iamVjdCI9PT1TKXtmb3IodmFyIHN0IGluIEgpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKEgsc3QpJiYoSFtzdF0mJkhbc3RdLmRlcHJlY2F0ZWR8fEhbc3RdJiZIW3N0XS5yZWFkT25seSYmIVB8fEhbc3RdJiZIW3N0XS53cml0ZU9ubHkmJiFSfHxaKHN0KSk7aWYobyYmeCYmV1tfXS5wdXNoKHtfYXR0cjp4fSksJCgpKXJldHVybiBXO2lmKCEwPT09aylvP1dbX10ucHVzaCh7YWRkaXRpb25hbFByb3A6IkFueXRoaW5nIGNhbiBiZSBoZXJlIn0pOlcuYWRkaXRpb25hbFByb3AxPXt9LEsrKztlbHNlIGlmKGspe3ZhciBhdD1PYmplY3QoYi5kKShrKSxjdD10KGF0LG4sdm9pZCAwLG8pO2lmKG8mJmF0LnhtbCYmYXQueG1sLm5hbWUmJiJub3RhZ25hbWUiIT09YXQueG1sLm5hbWUpV1tfXS5wdXNoKGN0KTtlbHNlIGZvcih2YXIgZnQ9bnVsbCE9PWUubWluUHJvcGVydGllcyYmdm9pZCAwIT09ZS5taW5Qcm9wZXJ0aWVzJiZLPGUubWluUHJvcGVydGllcz9lLm1pblByb3BlcnRpZXMtSzozLGx0PTE7bHQ8PWZ0O2x0Kyspe2lmKCQoKSlyZXR1cm4gVztpZihvKXt2YXIgcHQ9e307cHRbImFkZGl0aW9uYWxQcm9wIitsdF09Y3Qubm90YWduYW1lLFdbX10ucHVzaChwdCl9ZWxzZSBXWyJhZGRpdGlvbmFsUHJvcCIrbHRdPWN0O0srK319cmV0dXJuIFd9aWYoImFycmF5Ij09PVMpe2lmKCFVKXJldHVybjt2YXIgaHQsZHQseXQ7aWYobylVLnhtbD1VLnhtbHx8KG51bGw9PT0oZHQ9ZSl8fHZvaWQgMD09PWR0P3ZvaWQgMDpkdC54bWwpfHx7fSxVLnhtbC5uYW1lPVUueG1sLm5hbWV8fE4ubmFtZTtpZihwKCkoVS5hbnlPZikpaHQ9TCgpKHl0PVUuYW55T2YpLmNhbGwoeXQsKGZ1bmN0aW9uKGUpe3JldHVybiB0KFkoVSxlLG4pLG4sdm9pZCAwLG8pfSkpO2Vsc2UgaWYocCgpKFUub25lT2YpKXt2YXIgdnQ7aHQ9TCgpKHZ0PVUub25lT2YpLmNhbGwodnQsKGZ1bmN0aW9uKGUpe3JldHVybiB0KFkoVSxlLG4pLG4sdm9pZCAwLG8pfSkpfWVsc2V7aWYoISghb3x8byYmTi53cmFwcGVkKSlyZXR1cm4gdChVLG4sdm9pZCAwLG8pO2h0PVt0KFUsbix2b2lkIDAsbyldfXJldHVybiBodD1YKGh0KSxvJiZOLndyYXBwZWQ/KFdbX109aHQsSSgpKHgpfHxXW19dLnB1c2goe19hdHRyOnh9KSxXKTpodH1pZihlJiZwKCkoZS5lbnVtKSlWPU9iamVjdChiLmMpKGUuZW51bSlbMF07ZWxzZXtpZighZSlyZXR1cm47aWYoIm51bWJlciI9PXR5cGVvZihWPU8oZSkpKXt2YXIgZ3Q9ZS5taW5pbXVtO251bGwhPWd0JiYoZS5leGNsdXNpdmVNaW5pbXVtJiZndCsrLFY9Z3QpO3ZhciB3dD1lLm1heGltdW07bnVsbCE9d3QmJihlLmV4Y2x1c2l2ZU1heGltdW0mJnd0LS0sVj13dCl9aWYoInN0cmluZyI9PXR5cGVvZiBWJiYobnVsbCE9PWUubWF4TGVuZ3RoJiZ2b2lkIDAhPT1lLm1heExlbmd0aCYmKFY9dygpKFYpLmNhbGwoViwwLGUubWF4TGVuZ3RoKSksbnVsbCE9PWUubWluTGVuZ3RoJiZ2b2lkIDAhPT1lLm1pbkxlbmd0aCkpZm9yKHZhciBNdD0wO1YubGVuZ3RoPGUubWluTGVuZ3RoOylWKz1WW010KyslVi5sZW5ndGhdfWlmKCJmaWxlIiE9PVMpcmV0dXJuIG8/KFdbX109SSgpKHgpP1Y6W3tfYXR0cjp4fSxWXSxXKTpWfSxQPVMoKSgoZnVuY3Rpb24odCxlLG4pe3ZhciByPVUodCxlLG4sITApO2lmKHIpcmV0dXJuInN0cmluZyI9PXR5cGVvZiByP3I6aigpKHIse2RlY2xhcmF0aW9uOiEwLGluZGVudDoiXHQifSl9KSksUj1TKCkoKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gVSh0LGUsbiwhMSl9KSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigyMDcpLGk9bigyMDgpLG89big1MzkpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZSx1PXIoYXJndW1lbnRzWzFdKTtyZXR1cm4gdS5ub3JtYWxpemVyfHwwIT09KGU9dS5sZW5ndGg9aSh1Lmxlbmd0aCx0Lmxlbmd0aCx1LmFzeW5jKSkmJih1LnByaW1pdGl2ZT8hMT09PWU/dS5ub3JtYWxpemVyPW4oNTc0KTplPjEmJih1Lm5vcm1hbGl6ZXI9big1NzUpKGUpKTp1Lm5vcm1hbGl6ZXI9ITE9PT1lP24oNTc2KSgpOjE9PT1lP24oNTgwKSgpOm4oNTgxKShlKSksdS5hc3luYyYmbig1ODIpLHUucHJvbWlzZSYmbig1ODMpLHUuZGlzcG9zZSYmbig1ODkpLHUubWF4QWdlJiZuKDU5MCksdS5tYXgmJm4oNTkzKSx1LnJlZkNvdW50ZXImJm4oNTk1KSxvKHQsdSl9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjM0KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjMpLGk9big2KSxvPW4oMTUxKTt0LmV4cG9ydHM9IXImJiFpKChmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkobygiZGl2IiksImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSkpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMyksaT1uKDE1KSxvPXIuZG9jdW1lbnQsdT1pKG8pJiZpKG8uY3JlYXRlRWxlbWVudCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB1P28uY3JlYXRlRWxlbWVudCh0KTp7fX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIxKSxpPW4oMzIpLG89bigxMDcpLmluZGV4T2YsdT1uKDc4KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbixzPWkodCksYT0wLGM9W107Zm9yKG4gaW4gcykhcih1LG4pJiZyKHMsbikmJmMucHVzaChuKTtmb3IoO2UubGVuZ3RoPmE7KXIocyxuPWVbYSsrXSkmJih+byhjLG4pfHxjLnB1c2gobikpO3JldHVybiBjfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTA4KSxpPU1hdGgubWF4LG89TWF0aC5taW47dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49cih0KTtyZXR1cm4gbjwwP2kobitlLDApOm8obixlKX19LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNDYpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyOSksaT1uKDI0OSk7dC5leHBvcnRzPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8KCJfX3Byb3RvX18iaW57fT9mdW5jdGlvbigpe3ZhciB0LGU9ITEsbj17fTt0cnl7KHQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QucHJvdG90eXBlLCJfX3Byb3RvX18iKS5zZXQpLmNhbGwobixbXSksZT1uIGluc3RhbmNlb2YgQXJyYXl9Y2F0Y2godCl7fXJldHVybiBmdW5jdGlvbihuLG8pe3JldHVybiByKG4pLGkobyksZT90LmNhbGwobixvKTpuLl9fcHJvdG9fXz1vLG59fSgpOnZvaWQgMCl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNTApfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNTYpLGk9bigxNSksbz1bXS5zbGljZSx1PXt9LHM9ZnVuY3Rpb24odCxlLG4pe2lmKCEoZSBpbiB1KSl7Zm9yKHZhciByPVtdLGk9MDtpPGU7aSsrKXJbaV09ImFbIitpKyJdIjt1W2VdPUZ1bmN0aW9uKCJDLGEiLCJyZXR1cm4gbmV3IEMoIityLmpvaW4oIiwiKSsiKSIpfXJldHVybiB1W2VdKHQsbil9O3QuZXhwb3J0cz1GdW5jdGlvbi5iaW5kfHxmdW5jdGlvbih0KXt2YXIgZT1yKHRoaXMpLG49by5jYWxsKGFyZ3VtZW50cywxKSx1PWZ1bmN0aW9uKCl7dmFyIHI9bi5jb25jYXQoby5jYWxsKGFyZ3VtZW50cykpO3JldHVybiB0aGlzIGluc3RhbmNlb2YgdT9zKGUsci5sZW5ndGgscik6ZS5hcHBseSh0LHIpfTtyZXR1cm4gaShlLnByb3RvdHlwZSkmJih1LnByb3RvdHlwZT1lLnByb3RvdHlwZSksdX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpO3QuZXhwb3J0cz0hcigoZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1udWxsLE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXcgdCkhPT10LnByb3RvdHlwZX0pKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDEpLGk9big2KSxvPW4oNTkpLHU9bigxNSkscz1uKDE5KSxhPW4oMzApLGM9bigxMTQpLGY9bigxNjApLGw9big4MikscD1uKDcpLGg9big2MCksZD1wKCJpc0NvbmNhdFNwcmVhZGFibGUiKSx5PTkwMDcxOTkyNTQ3NDA5OTEsdj0iTWF4aW11bSBhbGxvd2VkIGluZGV4IGV4Y2VlZGVkIixnPWg+PTUxfHwhaSgoZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdFtkXT0hMSx0LmNvbmNhdCgpWzBdIT09dH0pKSx3PWwoImNvbmNhdCIpLE09ZnVuY3Rpb24odCl7aWYoIXUodCkpcmV0dXJuITE7dmFyIGU9dFtkXTtyZXR1cm4gdm9pZCAwIT09ZT8hIWU6byh0KX07cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOiFnfHwhd30se2NvbmNhdDpmdW5jdGlvbih0KXt2YXIgZSxuLHIsaSxvLHU9cyh0aGlzKSxsPWYodSwwKSxwPTA7Zm9yKGU9LTEscj1hcmd1bWVudHMubGVuZ3RoO2U8cjtlKyspaWYoTShvPS0xPT09ZT91OmFyZ3VtZW50c1tlXSkpe2lmKHArKGk9YShvLmxlbmd0aCkpPnkpdGhyb3cgVHlwZUVycm9yKHYpO2ZvcihuPTA7bjxpO24rKyxwKyspbiBpbiBvJiZjKGwscCxvW25dKX1lbHNle2lmKHA+PXkpdGhyb3cgVHlwZUVycm9yKHYpO2MobCxwKyssbyl9cmV0dXJuIGwubGVuZ3RoPXAsbH19KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTUpLGk9big1OSksbz1uKDcpKCJzcGVjaWVzIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG47cmV0dXJuIGkodCkmJigiZnVuY3Rpb24iIT10eXBlb2Yobj10LmNvbnN0cnVjdG9yKXx8biE9PUFycmF5JiYhaShuLnByb3RvdHlwZSk/cihuKSYmbnVsbD09PShuPW5bb10pJiYobj12b2lkIDApOm49dm9pZCAwKSxuZXcodm9pZCAwPT09bj9BcnJheTpuKSgwPT09ZT8wOmUpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTE1KTt0LmV4cG9ydHM9ciYmIVN5bWJvbC5zaGFtJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcn0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTUyKSxpPW4oMTA5KS5jb25jYXQoImxlbmd0aCIsInByb3RvdHlwZSIpO2UuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lc3x8ZnVuY3Rpb24odCl7cmV0dXJuIHIodCxpKX19LGZ1bmN0aW9uKHQsZSl7ZS5mPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHN9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI0KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4saSl7aSYmaS5lbnVtZXJhYmxlP3RbZV09bjpyKHQsZSxuKX19LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJpdGVyYXRvciIpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMSksaT1uKDI5NSksbz1uKDExMyksdT1uKDE1NSkscz1uKDgzKSxhPW4oMjQpLGM9bigxNjQpLGY9big3KSxsPW4oNTgpLHA9big0NCksaD1uKDE2NyksZD1oLkl0ZXJhdG9yUHJvdG90eXBlLHk9aC5CVUdHWV9TQUZBUklfSVRFUkFUT1JTLHY9ZigiaXRlcmF0b3IiKSxnPSJrZXlzIix3PSJ2YWx1ZXMiLE09ImVudHJpZXMiLG09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLGYsaCxfLEwpe2kobixlLGYpO3ZhciBiLHgsaixOPWZ1bmN0aW9uKHQpe2lmKHQ9PT1oJiZPKXJldHVybiBPO2lmKCF5JiZ0IGluIEkpcmV0dXJuIElbdF07c3dpdGNoKHQpe2Nhc2UgZzpjYXNlIHc6Y2FzZSBNOnJldHVybiBmdW5jdGlvbigpe3JldHVybiBuZXcgbih0aGlzLHQpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcyl9fSxTPWUrIiBJdGVyYXRvciIsRD0hMSxJPXQucHJvdG90eXBlLEE9SVt2XXx8SVsiQEBpdGVyYXRvciJdfHxoJiZJW2hdLE89IXkmJkF8fE4oaCksVD0iQXJyYXkiPT1lJiZJLmVudHJpZXN8fEE7aWYoVCYmKGI9byhULmNhbGwobmV3IHQpKSxkIT09T2JqZWN0LnByb3RvdHlwZSYmYi5uZXh0JiYobHx8byhiKT09PWR8fCh1P3UoYixkKToiZnVuY3Rpb24iIT10eXBlb2YgYlt2XSYmYShiLHYsbSkpLHMoYixTLCEwLCEwKSxsJiYocFtTXT1tKSkpLGg9PXcmJkEmJkEubmFtZSE9PXcmJihEPSEwLE89ZnVuY3Rpb24oKXtyZXR1cm4gQS5jYWxsKHRoaXMpfSksbCYmIUx8fElbdl09PT1PfHxhKEksdixPKSxwW2VdPU8saClpZih4PXt2YWx1ZXM6Tih3KSxrZXlzOl8/TzpOKGcpLGVudHJpZXM6TihNKX0sTClmb3IoaiBpbiB4KSh5fHxEfHwhKGogaW4gSSkpJiZjKEksaix4W2pdKTtlbHNlIHIoe3RhcmdldDplLHByb3RvOiEwLGZvcmNlZDp5fHxEfSx4KTtyZXR1cm4geH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHIsaSxvLHU9big2KSxzPW4oMTEzKSxhPW4oMjQpLGM9bigyMSksZj1uKDcpLGw9big1OCkscD1mKCJpdGVyYXRvciIpLGg9ITE7W10ua2V5cyYmKCJuZXh0ImluKG89W10ua2V5cygpKT8oaT1zKHMobykpKSE9PU9iamVjdC5wcm90b3R5cGUmJihyPWkpOmg9ITApO3ZhciBkPW51bGw9PXJ8fHUoKGZ1bmN0aW9uKCl7dmFyIHQ9e307cmV0dXJuIHJbcF0uY2FsbCh0KSE9PXR9KSk7ZCYmKHI9e30pLGwmJiFkfHxjKHIscCl8fGEocixwLChmdW5jdGlvbigpe3JldHVybiB0aGlzfSkpLHQuZXhwb3J0cz17SXRlcmF0b3JQcm90b3R5cGU6cixCVUdHWV9TQUZBUklfSVRFUkFUT1JTOmh9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzIpLGk9bigxMjApLG89big0NCksdT1uKDExOCkscz1uKDE2NiksYT0iQXJyYXkgSXRlcmF0b3IiLGM9dS5zZXQsZj11LmdldHRlckZvcihhKTt0LmV4cG9ydHM9cyhBcnJheSwiQXJyYXkiLChmdW5jdGlvbih0LGUpe2ModGhpcyx7dHlwZTphLHRhcmdldDpyKHQpLGluZGV4OjAsa2luZDplfSl9KSwoZnVuY3Rpb24oKXt2YXIgdD1mKHRoaXMpLGU9dC50YXJnZXQsbj10LmtpbmQscj10LmluZGV4Kys7cmV0dXJuIWV8fHI+PWUubGVuZ3RoPyh0LnRhcmdldD12b2lkIDAse3ZhbHVlOnZvaWQgMCxkb25lOiEwfSk6ImtleXMiPT1uP3t2YWx1ZTpyLGRvbmU6ITF9OiJ2YWx1ZXMiPT1uP3t2YWx1ZTplW3JdLGRvbmU6ITF9Ont2YWx1ZTpbcixlW3JdXSxkb25lOiExfX0pLCJ2YWx1ZXMiKSxvLkFyZ3VtZW50cz1vLkFycmF5LGkoImtleXMiKSxpKCJ2YWx1ZXMiKSxpKCJlbnRyaWVzIil9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big4NSksaT1uKDYyKSxvPW4oMTcwKSx1PShuKDE3MiksbigyOTgpKTtuKDg2KSxuKDI5OSk7ZnVuY3Rpb24gcyh0LGUsbil7dGhpcy5wcm9wcz10LHRoaXMuY29udGV4dD1lLHRoaXMucmVmcz11LHRoaXMudXBkYXRlcj1ufHxvfWZ1bmN0aW9uIGEodCxlLG4pe3RoaXMucHJvcHM9dCx0aGlzLmNvbnRleHQ9ZSx0aGlzLnJlZnM9dSx0aGlzLnVwZGF0ZXI9bnx8b31mdW5jdGlvbiBjKCl7fXMucHJvdG90eXBlLmlzUmVhY3RDb21wb25lbnQ9e30scy5wcm90b3R5cGUuc2V0U3RhdGU9ZnVuY3Rpb24odCxlKXsib2JqZWN0IiE9dHlwZW9mIHQmJiJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT10JiZyKCI4NSIpLHRoaXMudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUodGhpcyx0KSxlJiZ0aGlzLnVwZGF0ZXIuZW5xdWV1ZUNhbGxiYWNrKHRoaXMsZSwic2V0U3RhdGUiKX0scy5wcm90b3R5cGUuZm9yY2VVcGRhdGU9ZnVuY3Rpb24odCl7dGhpcy51cGRhdGVyLmVucXVldWVGb3JjZVVwZGF0ZSh0aGlzKSx0JiZ0aGlzLnVwZGF0ZXIuZW5xdWV1ZUNhbGxiYWNrKHRoaXMsdCwiZm9yY2VVcGRhdGUiKX0sYy5wcm90b3R5cGU9cy5wcm90b3R5cGUsYS5wcm90b3R5cGU9bmV3IGMsYS5wcm90b3R5cGUuY29uc3RydWN0b3I9YSxpKGEucHJvdG90eXBlLHMucHJvdG90eXBlKSxhLnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudD0hMCx0LmV4cG9ydHM9e0NvbXBvbmVudDpzLFB1cmVDb21wb25lbnQ6YX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bigxMjEpO3ZhciByPXtpc01vdW50ZWQ6ZnVuY3Rpb24odCl7cmV0dXJuITF9LGVucXVldWVDYWxsYmFjazpmdW5jdGlvbih0LGUpe30sZW5xdWV1ZUZvcmNlVXBkYXRlOmZ1bmN0aW9uKHQpe30sZW5xdWV1ZVJlcGxhY2VTdGF0ZTpmdW5jdGlvbih0LGUpe30sZW5xdWV1ZVNldFN0YXRlOmZ1bmN0aW9uKHQsZSl7fX07dC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19dmFyIGk9ZnVuY3Rpb24oKXt9O2kudGhhdFJldHVybnM9cixpLnRoYXRSZXR1cm5zRmFsc2U9cighMSksaS50aGF0UmV0dXJuc1RydWU9cighMCksaS50aGF0UmV0dXJuc051bGw9cihudWxsKSxpLnRoYXRSZXR1cm5zVGhpcz1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxpLnRoYXRSZXR1cm5zQXJndW1lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHQuZXhwb3J0cz1pfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3QuZXhwb3J0cz0hMX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9e2N1cnJlbnQ6bnVsbH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLmZvciYmU3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpfHw2MDEwMzt0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9IlNFQ1JFVF9ET19OT1RfUEFTU19USElTX09SX1lPVV9XSUxMX0JFX0ZJUkVEIn0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDMxNikoKX0sZnVuY3Rpb24odCxlKXt2YXIgbj17fS50b1N0cmluZzt0LmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09bi5jYWxsKHQpfX0sZnVuY3Rpb24odCxlLG4pe24oMzMzKTt2YXIgcj1uKDEwKTt0LmV4cG9ydHM9ci5BcnJheS5pc0FycmF5fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpeyhudWxsPT1lfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgbj0wLHI9bmV3IEFycmF5KGUpO248ZTtuKyspcltuXT10W25dO3JldHVybiByfSx0LmV4cG9ydHMuZGVmYXVsdD10LmV4cG9ydHMsdC5leHBvcnRzLl9fZXNNb2R1bGU9ITB9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYxKSxpPW4oNDQpLG89big3KSgiaXRlcmF0b3IiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYobnVsbCE9dClyZXR1cm4gdFtvXXx8dFsiQEBpdGVyYXRvciJdfHxpW3IodCldfX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDMzNil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDM0NiksaT1BcnJheS5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuc2xpY2U7cmV0dXJuIHQ9PT1pfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1pLnNsaWNlP3I6ZX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDM5Nik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHIodCkpdGhyb3cgVHlwZUVycm9yKCJUaGUgbWV0aG9kIGRvZXNuJ3QgYWNjZXB0IHJlZ3VsYXIgZXhwcmVzc2lvbnMiKTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDcpKCJtYXRjaCIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT0vLi87dHJ5eyIvLi8iW3RdKGUpfWNhdGNoKG4pe3RyeXtyZXR1cm4gZVtyXT0hMSwiLy4vIlt0XShlKX1jYXRjaCh0KXt9fXJldHVybiExfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9Ilx0XG5cdlxmXHIgwqDhmoDigIDigIHigILigIPigITigIXigIbigIfigIjigInigIrigK/igZ/jgIBcdTIwMjhcdTIwMjlcdWZlZmYifSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKGUpe3ZhciBuPSJvYmplY3QiPT10eXBlb2YgZSYmZSYmZS5PYmplY3Q9PT1PYmplY3QmJmU7dC5leHBvcnRzPW59KS5jYWxsKHRoaXMsbigyMCkpfSxmdW5jdGlvbih0LGUpe3ZhciBuPVJlZ0V4cCgiW1xcdTIwMGRcXHVkODAwLVxcdWRmZmZcXHUwMzAwLVxcdTAzNmZcXHVmZTIwLVxcdWZlMmZcXHUyMGQwLVxcdTIwZmZcXHVmZTBlXFx1ZmUwZl0iKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG4udGVzdCh0KX19LGZ1bmN0aW9uKHQsZSl7dmFyIG49RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZihudWxsIT10KXt0cnl7cmV0dXJuIG4uY2FsbCh0KX1jYXRjaCh0KXt9dHJ5e3JldHVybiB0KyIifWNhdGNoKHQpe319cmV0dXJuIiJ9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big5MCksaT1uKDQ2Miksbz1uKDQ2MyksdT1uKDQ2NCkscz1uKDQ2NSksYT1uKDQ2Nik7ZnVuY3Rpb24gYyh0KXt2YXIgZT10aGlzLl9fZGF0YV9fPW5ldyByKHQpO3RoaXMuc2l6ZT1lLnNpemV9Yy5wcm90b3R5cGUuY2xlYXI9aSxjLnByb3RvdHlwZS5kZWxldGU9byxjLnByb3RvdHlwZS5nZXQ9dSxjLnByb3RvdHlwZS5oYXM9cyxjLnByb3RvdHlwZS5zZXQ9YSx0LmV4cG9ydHM9Y30sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDY3KSxpPW4oNjYpO3QuZXhwb3J0cz1mdW5jdGlvbiB0KGUsbixvLHUscyl7cmV0dXJuIGU9PT1ufHwobnVsbD09ZXx8bnVsbD09bnx8IWkoZSkmJiFpKG4pP2UhPWUmJm4hPW46cihlLG4sbyx1LHQscykpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDY4KSxpPW4oMTkyKSxvPW4oNDcxKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4sdSxzLGEpe3ZhciBjPTEmbixmPXQubGVuZ3RoLGw9ZS5sZW5ndGg7aWYoZiE9bCYmIShjJiZsPmYpKXJldHVybiExO3ZhciBwPWEuZ2V0KHQpLGg9YS5nZXQoZSk7aWYocCYmaClyZXR1cm4gcD09ZSYmaD09dDt2YXIgZD0tMSx5PSEwLHY9MiZuP25ldyByOnZvaWQgMDtmb3IoYS5zZXQodCxlKSxhLnNldChlLHQpOysrZDxmOyl7dmFyIGc9dFtkXSx3PWVbZF07aWYodSl2YXIgTT1jP3UodyxnLGQsZSx0LGEpOnUoZyx3LGQsdCxlLGEpO2lmKHZvaWQgMCE9PU0pe2lmKE0pY29udGludWU7eT0hMTticmVha31pZih2KXtpZighaShlLChmdW5jdGlvbih0LGUpe2lmKCFvKHYsZSkmJihnPT09dHx8cyhnLHQsbix1LGEpKSlyZXR1cm4gdi5wdXNoKGUpfSkpKXt5PSExO2JyZWFrfX1lbHNlIGlmKGchPT13JiYhcyhnLHcsbix1LGEpKXt5PSExO2JyZWFrfX1yZXR1cm4gYS5kZWxldGUodCksYS5kZWxldGUoZSkseX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPS0xLHI9bnVsbD09dD8wOnQubGVuZ3RoOysrbjxyOylpZihlKHRbbl0sbix0KSlyZXR1cm4hMDtyZXR1cm4hMX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0LndlYnBhY2tQb2x5ZmlsbHx8KHQuZGVwcmVjYXRlPWZ1bmN0aW9uKCl7fSx0LnBhdGhzPVtdLHQuY2hpbGRyZW58fCh0LmNoaWxkcmVuPVtdKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwibG9hZGVkIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdC5sfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJpZCIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHQuaX19KSx0LndlYnBhY2tQb2x5ZmlsbD0xKSx0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTk1KSxpPW4oNDkwKSxvPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCFyKHQpKXJldHVybiBpKHQpO3ZhciBlPVtdO2Zvcih2YXIgbiBpbiBPYmplY3QodCkpby5jYWxsKHQsbikmJiJjb25zdHJ1Y3RvciIhPW4mJmUucHVzaChuKTtyZXR1cm4gZX19LGZ1bmN0aW9uKHQsZSl7dmFyIG49T2JqZWN0LnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dCYmdC5jb25zdHJ1Y3RvcjtyZXR1cm4gdD09PSgiZnVuY3Rpb24iPT10eXBlb2YgZSYmZS5wcm90b3R5cGV8fG4pfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDkyKSxpPW4oMTI3KSxvPW4oNDkzKSx1PW4oNDk0KSxzPW4oNDk1KSxhPW4oNjUpLGM9bigxODgpLGY9IltvYmplY3QgTWFwXSIsbD0iW29iamVjdCBQcm9taXNlXSIscD0iW29iamVjdCBTZXRdIixoPSJbb2JqZWN0IFdlYWtNYXBdIixkPSJbb2JqZWN0IERhdGFWaWV3XSIseT1jKHIpLHY9YyhpKSxnPWMobyksdz1jKHUpLE09YyhzKSxtPWE7KHImJm0obmV3IHIobmV3IEFycmF5QnVmZmVyKDEpKSkhPWR8fGkmJm0obmV3IGkpIT1mfHxvJiZtKG8ucmVzb2x2ZSgpKSE9bHx8dSYmbShuZXcgdSkhPXB8fHMmJm0obmV3IHMpIT1oKSYmKG09ZnVuY3Rpb24odCl7dmFyIGU9YSh0KSxuPSJbb2JqZWN0IE9iamVjdF0iPT1lP3QuY29uc3RydWN0b3I6dm9pZCAwLHI9bj9jKG4pOiIiO2lmKHIpc3dpdGNoKHIpe2Nhc2UgeTpyZXR1cm4gZDtjYXNlIHY6cmV0dXJuIGY7Y2FzZSBnOnJldHVybiBsO2Nhc2UgdzpyZXR1cm4gcDtjYXNlIE06cmV0dXJuIGh9cmV0dXJuIGV9KSx0LmV4cG9ydHM9bX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNjcpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdD09dCYmIXIodCl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gbnVsbCE9biYmKG5bdF09PT1lJiYodm9pZCAwIT09ZXx8dCBpbiBPYmplY3QobikpKX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyMDApLGk9big5NCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTAsbz0oZT1yKGUsdCkpLmxlbmd0aDtudWxsIT10JiZuPG87KXQ9dFtpKGVbbisrXSldO3JldHVybiBuJiZuPT1vP3Q6dm9pZCAwfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjIpLGk9bigxMzQpLG89big0OTkpLHU9big2NCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIodCk/dDppKHQsZSk/W3RdOm8odSh0KSl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiOyhmdW5jdGlvbihlLHIpe3ZhciBpPW4oOTUpO3QuZXhwb3J0cz1NO3ZhciBvLHU9bigxNzcpO00uUmVhZGFibGVTdGF0ZT13O24oMTM1KS5FdmVudEVtaXR0ZXI7dmFyIHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5saXN0ZW5lcnMoZSkubGVuZ3RofSxhPW4oMjAyKSxjPW4oMTcpLkJ1ZmZlcixmPWUuVWludDhBcnJheXx8ZnVuY3Rpb24oKXt9O3ZhciBsPW4oNjkpO2wuaW5oZXJpdHM9bigxNik7dmFyIHA9big1MjQpLGg9dm9pZCAwO2g9cCYmcC5kZWJ1Z2xvZz9wLmRlYnVnbG9nKCJzdHJlYW0iKTpmdW5jdGlvbigpe307dmFyIGQseT1uKDUyNSksdj1uKDIwMyk7bC5pbmhlcml0cyhNLGEpO3ZhciBnPVsiZXJyb3IiLCJjbG9zZSIsImRlc3Ryb3kiLCJwYXVzZSIsInJlc3VtZSJdO2Z1bmN0aW9uIHcodCxlKXt0PXR8fHt9O3ZhciByPWUgaW5zdGFuY2VvZihvPW98fG4oMzUpKTt0aGlzLm9iamVjdE1vZGU9ISF0Lm9iamVjdE1vZGUsciYmKHRoaXMub2JqZWN0TW9kZT10aGlzLm9iamVjdE1vZGV8fCEhdC5yZWFkYWJsZU9iamVjdE1vZGUpO3ZhciBpPXQuaGlnaFdhdGVyTWFyayx1PXQucmVhZGFibGVIaWdoV2F0ZXJNYXJrLHM9dGhpcy5vYmplY3RNb2RlPzE2OjE2Mzg0O3RoaXMuaGlnaFdhdGVyTWFyaz1pfHwwPT09aT9pOnImJih1fHwwPT09dSk/dTpzLHRoaXMuaGlnaFdhdGVyTWFyaz1NYXRoLmZsb29yKHRoaXMuaGlnaFdhdGVyTWFyayksdGhpcy5idWZmZXI9bmV3IHksdGhpcy5sZW5ndGg9MCx0aGlzLnBpcGVzPW51bGwsdGhpcy5waXBlc0NvdW50PTAsdGhpcy5mbG93aW5nPW51bGwsdGhpcy5lbmRlZD0hMSx0aGlzLmVuZEVtaXR0ZWQ9ITEsdGhpcy5yZWFkaW5nPSExLHRoaXMuc3luYz0hMCx0aGlzLm5lZWRSZWFkYWJsZT0hMSx0aGlzLmVtaXR0ZWRSZWFkYWJsZT0hMSx0aGlzLnJlYWRhYmxlTGlzdGVuaW5nPSExLHRoaXMucmVzdW1lU2NoZWR1bGVkPSExLHRoaXMuZGVzdHJveWVkPSExLHRoaXMuZGVmYXVsdEVuY29kaW5nPXQuZGVmYXVsdEVuY29kaW5nfHwidXRmOCIsdGhpcy5hd2FpdERyYWluPTAsdGhpcy5yZWFkaW5nTW9yZT0hMSx0aGlzLmRlY29kZXI9bnVsbCx0aGlzLmVuY29kaW5nPW51bGwsdC5lbmNvZGluZyYmKGR8fChkPW4oMjA1KS5TdHJpbmdEZWNvZGVyKSx0aGlzLmRlY29kZXI9bmV3IGQodC5lbmNvZGluZyksdGhpcy5lbmNvZGluZz10LmVuY29kaW5nKX1mdW5jdGlvbiBNKHQpe2lmKG89b3x8bigzNSksISh0aGlzIGluc3RhbmNlb2YgTSkpcmV0dXJuIG5ldyBNKHQpO3RoaXMuX3JlYWRhYmxlU3RhdGU9bmV3IHcodCx0aGlzKSx0aGlzLnJlYWRhYmxlPSEwLHQmJigiZnVuY3Rpb24iPT10eXBlb2YgdC5yZWFkJiYodGhpcy5fcmVhZD10LnJlYWQpLCJmdW5jdGlvbiI9PXR5cGVvZiB0LmRlc3Ryb3kmJih0aGlzLl9kZXN0cm95PXQuZGVzdHJveSkpLGEuY2FsbCh0aGlzKX1mdW5jdGlvbiBtKHQsZSxuLHIsaSl7dmFyIG8sdT10Ll9yZWFkYWJsZVN0YXRlO251bGw9PT1lPyh1LnJlYWRpbmc9ITEsZnVuY3Rpb24odCxlKXtpZihlLmVuZGVkKXJldHVybjtpZihlLmRlY29kZXIpe3ZhciBuPWUuZGVjb2Rlci5lbmQoKTtuJiZuLmxlbmd0aCYmKGUuYnVmZmVyLnB1c2gobiksZS5sZW5ndGgrPWUub2JqZWN0TW9kZT8xOm4ubGVuZ3RoKX1lLmVuZGVkPSEwLHgodCl9KHQsdSkpOihpfHwobz1mdW5jdGlvbih0LGUpe3ZhciBuO3I9ZSxjLmlzQnVmZmVyKHIpfHxyIGluc3RhbmNlb2YgZnx8InN0cmluZyI9PXR5cGVvZiBlfHx2b2lkIDA9PT1lfHx0Lm9iamVjdE1vZGV8fChuPW5ldyBUeXBlRXJyb3IoIkludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsiKSk7dmFyIHI7cmV0dXJuIG59KHUsZSkpLG8/dC5lbWl0KCJlcnJvciIsbyk6dS5vYmplY3RNb2RlfHxlJiZlLmxlbmd0aD4wPygic3RyaW5nIj09dHlwZW9mIGV8fHUub2JqZWN0TW9kZXx8T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpPT09Yy5wcm90b3R5cGV8fChlPWZ1bmN0aW9uKHQpe3JldHVybiBjLmZyb20odCl9KGUpKSxyP3UuZW5kRW1pdHRlZD90LmVtaXQoImVycm9yIixuZXcgRXJyb3IoInN0cmVhbS51bnNoaWZ0KCkgYWZ0ZXIgZW5kIGV2ZW50IikpOl8odCx1LGUsITApOnUuZW5kZWQ/dC5lbWl0KCJlcnJvciIsbmV3IEVycm9yKCJzdHJlYW0ucHVzaCgpIGFmdGVyIEVPRiIpKToodS5yZWFkaW5nPSExLHUuZGVjb2RlciYmIW4/KGU9dS5kZWNvZGVyLndyaXRlKGUpLHUub2JqZWN0TW9kZXx8MCE9PWUubGVuZ3RoP18odCx1LGUsITEpOk4odCx1KSk6Xyh0LHUsZSwhMSkpKTpyfHwodS5yZWFkaW5nPSExKSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiF0LmVuZGVkJiYodC5uZWVkUmVhZGFibGV8fHQubGVuZ3RoPHQuaGlnaFdhdGVyTWFya3x8MD09PXQubGVuZ3RoKX0odSl9ZnVuY3Rpb24gXyh0LGUsbixyKXtlLmZsb3dpbmcmJjA9PT1lLmxlbmd0aCYmIWUuc3luYz8odC5lbWl0KCJkYXRhIixuKSx0LnJlYWQoMCkpOihlLmxlbmd0aCs9ZS5vYmplY3RNb2RlPzE6bi5sZW5ndGgscj9lLmJ1ZmZlci51bnNoaWZ0KG4pOmUuYnVmZmVyLnB1c2gobiksZS5uZWVkUmVhZGFibGUmJngodCkpLE4odCxlKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoTS5wcm90b3R5cGUsImRlc3Ryb3llZCIse2dldDpmdW5jdGlvbigpe3JldHVybiB2b2lkIDAhPT10aGlzLl9yZWFkYWJsZVN0YXRlJiZ0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZH0sc2V0OmZ1bmN0aW9uKHQpe3RoaXMuX3JlYWRhYmxlU3RhdGUmJih0aGlzLl9yZWFkYWJsZVN0YXRlLmRlc3Ryb3llZD10KX19KSxNLnByb3RvdHlwZS5kZXN0cm95PXYuZGVzdHJveSxNLnByb3RvdHlwZS5fdW5kZXN0cm95PXYudW5kZXN0cm95LE0ucHJvdG90eXBlLl9kZXN0cm95PWZ1bmN0aW9uKHQsZSl7dGhpcy5wdXNoKG51bGwpLGUodCl9LE0ucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24odCxlKXt2YXIgbixyPXRoaXMuX3JlYWRhYmxlU3RhdGU7cmV0dXJuIHIub2JqZWN0TW9kZT9uPSEwOiJzdHJpbmciPT10eXBlb2YgdCYmKChlPWV8fHIuZGVmYXVsdEVuY29kaW5nKSE9PXIuZW5jb2RpbmcmJih0PWMuZnJvbSh0LGUpLGU9IiIpLG49ITApLG0odGhpcyx0LGUsITEsbil9LE0ucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIG0odGhpcyx0LG51bGwsITAsITEpfSxNLnByb3RvdHlwZS5pc1BhdXNlZD1mdW5jdGlvbigpe3JldHVybiExPT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nfSxNLnByb3RvdHlwZS5zZXRFbmNvZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gZHx8KGQ9bigyMDUpLlN0cmluZ0RlY29kZXIpLHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVjb2Rlcj1uZXcgZCh0KSx0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nPXQsdGhpc307dmFyIEw9ODM4ODYwODtmdW5jdGlvbiBiKHQsZSl7cmV0dXJuIHQ8PTB8fDA9PT1lLmxlbmd0aCYmZS5lbmRlZD8wOmUub2JqZWN0TW9kZT8xOnQhPXQ/ZS5mbG93aW5nJiZlLmxlbmd0aD9lLmJ1ZmZlci5oZWFkLmRhdGEubGVuZ3RoOmUubGVuZ3RoOih0PmUuaGlnaFdhdGVyTWFyayYmKGUuaGlnaFdhdGVyTWFyaz1mdW5jdGlvbih0KXtyZXR1cm4gdD49TD90PUw6KHQtLSx0fD10Pj4+MSx0fD10Pj4+Mix0fD10Pj4+NCx0fD10Pj4+OCx0fD10Pj4+MTYsdCsrKSx0fSh0KSksdDw9ZS5sZW5ndGg/dDplLmVuZGVkP2UubGVuZ3RoOihlLm5lZWRSZWFkYWJsZT0hMCwwKSl9ZnVuY3Rpb24geCh0KXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO2UubmVlZFJlYWRhYmxlPSExLGUuZW1pdHRlZFJlYWRhYmxlfHwoaCgiZW1pdFJlYWRhYmxlIixlLmZsb3dpbmcpLGUuZW1pdHRlZFJlYWRhYmxlPSEwLGUuc3luYz9pLm5leHRUaWNrKGosdCk6aih0KSl9ZnVuY3Rpb24gaih0KXtoKCJlbWl0IHJlYWRhYmxlIiksdC5lbWl0KCJyZWFkYWJsZSIpLEEodCl9ZnVuY3Rpb24gTih0LGUpe2UucmVhZGluZ01vcmV8fChlLnJlYWRpbmdNb3JlPSEwLGkubmV4dFRpY2soUyx0LGUpKX1mdW5jdGlvbiBTKHQsZSl7Zm9yKHZhciBuPWUubGVuZ3RoOyFlLnJlYWRpbmcmJiFlLmZsb3dpbmcmJiFlLmVuZGVkJiZlLmxlbmd0aDxlLmhpZ2hXYXRlck1hcmsmJihoKCJtYXliZVJlYWRNb3JlIHJlYWQgMCIpLHQucmVhZCgwKSxuIT09ZS5sZW5ndGgpOyluPWUubGVuZ3RoO2UucmVhZGluZ01vcmU9ITF9ZnVuY3Rpb24gRCh0KXtoKCJyZWFkYWJsZSBuZXh0dGljayByZWFkIDAiKSx0LnJlYWQoMCl9ZnVuY3Rpb24gSSh0LGUpe2UucmVhZGluZ3x8KGgoInJlc3VtZSByZWFkIDAiKSx0LnJlYWQoMCkpLGUucmVzdW1lU2NoZWR1bGVkPSExLGUuYXdhaXREcmFpbj0wLHQuZW1pdCgicmVzdW1lIiksQSh0KSxlLmZsb3dpbmcmJiFlLnJlYWRpbmcmJnQucmVhZCgwKX1mdW5jdGlvbiBBKHQpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7Zm9yKGgoImZsb3ciLGUuZmxvd2luZyk7ZS5mbG93aW5nJiZudWxsIT09dC5yZWFkKCk7KTt9ZnVuY3Rpb24gTyh0LGUpe3JldHVybiAwPT09ZS5sZW5ndGg/bnVsbDooZS5vYmplY3RNb2RlP249ZS5idWZmZXIuc2hpZnQoKTohdHx8dD49ZS5sZW5ndGg/KG49ZS5kZWNvZGVyP2UuYnVmZmVyLmpvaW4oIiIpOjE9PT1lLmJ1ZmZlci5sZW5ndGg/ZS5idWZmZXIuaGVhZC5kYXRhOmUuYnVmZmVyLmNvbmNhdChlLmxlbmd0aCksZS5idWZmZXIuY2xlYXIoKSk6bj1mdW5jdGlvbih0LGUsbil7dmFyIHI7dDxlLmhlYWQuZGF0YS5sZW5ndGg/KHI9ZS5oZWFkLmRhdGEuc2xpY2UoMCx0KSxlLmhlYWQuZGF0YT1lLmhlYWQuZGF0YS5zbGljZSh0KSk6cj10PT09ZS5oZWFkLmRhdGEubGVuZ3RoP2Uuc2hpZnQoKTpuP2Z1bmN0aW9uKHQsZSl7dmFyIG49ZS5oZWFkLHI9MSxpPW4uZGF0YTt0LT1pLmxlbmd0aDtmb3IoO249bi5uZXh0Oyl7dmFyIG89bi5kYXRhLHU9dD5vLmxlbmd0aD9vLmxlbmd0aDp0O2lmKHU9PT1vLmxlbmd0aD9pKz1vOmkrPW8uc2xpY2UoMCx0KSwwPT09KHQtPXUpKXt1PT09by5sZW5ndGg/KCsrcixuLm5leHQ/ZS5oZWFkPW4ubmV4dDplLmhlYWQ9ZS50YWlsPW51bGwpOihlLmhlYWQ9bixuLmRhdGE9by5zbGljZSh1KSk7YnJlYWt9KytyfXJldHVybiBlLmxlbmd0aC09cixpfSh0LGUpOmZ1bmN0aW9uKHQsZSl7dmFyIG49Yy5hbGxvY1Vuc2FmZSh0KSxyPWUuaGVhZCxpPTE7ci5kYXRhLmNvcHkobiksdC09ci5kYXRhLmxlbmd0aDtmb3IoO3I9ci5uZXh0Oyl7dmFyIG89ci5kYXRhLHU9dD5vLmxlbmd0aD9vLmxlbmd0aDp0O2lmKG8uY29weShuLG4ubGVuZ3RoLXQsMCx1KSwwPT09KHQtPXUpKXt1PT09by5sZW5ndGg/KCsraSxyLm5leHQ/ZS5oZWFkPXIubmV4dDplLmhlYWQ9ZS50YWlsPW51bGwpOihlLmhlYWQ9cixyLmRhdGE9by5zbGljZSh1KSk7YnJlYWt9KytpfXJldHVybiBlLmxlbmd0aC09aSxufSh0LGUpO3JldHVybiByfSh0LGUuYnVmZmVyLGUuZGVjb2Rlciksbik7dmFyIG59ZnVuY3Rpb24gVCh0KXt2YXIgZT10Ll9yZWFkYWJsZVN0YXRlO2lmKGUubGVuZ3RoPjApdGhyb3cgbmV3IEVycm9yKCciZW5kUmVhZGFibGUoKSIgY2FsbGVkIG9uIG5vbi1lbXB0eSBzdHJlYW0nKTtlLmVuZEVtaXR0ZWR8fChlLmVuZGVkPSEwLGkubmV4dFRpY2soQyxlLHQpKX1mdW5jdGlvbiBDKHQsZSl7dC5lbmRFbWl0dGVkfHwwIT09dC5sZW5ndGh8fCh0LmVuZEVtaXR0ZWQ9ITAsZS5yZWFkYWJsZT0hMSxlLmVtaXQoImVuZCIpKX1mdW5jdGlvbiBFKHQsZSl7Zm9yKHZhciBuPTAscj10Lmxlbmd0aDtuPHI7bisrKWlmKHRbbl09PT1lKXJldHVybiBuO3JldHVybi0xfU0ucHJvdG90eXBlLnJlYWQ9ZnVuY3Rpb24odCl7aCgicmVhZCIsdCksdD1wYXJzZUludCh0LDEwKTt2YXIgZT10aGlzLl9yZWFkYWJsZVN0YXRlLG49dDtpZigwIT09dCYmKGUuZW1pdHRlZFJlYWRhYmxlPSExKSwwPT09dCYmZS5uZWVkUmVhZGFibGUmJihlLmxlbmd0aD49ZS5oaWdoV2F0ZXJNYXJrfHxlLmVuZGVkKSlyZXR1cm4gaCgicmVhZDogZW1pdFJlYWRhYmxlIixlLmxlbmd0aCxlLmVuZGVkKSwwPT09ZS5sZW5ndGgmJmUuZW5kZWQ/VCh0aGlzKTp4KHRoaXMpLG51bGw7aWYoMD09PSh0PWIodCxlKSkmJmUuZW5kZWQpcmV0dXJuIDA9PT1lLmxlbmd0aCYmVCh0aGlzKSxudWxsO3ZhciByLGk9ZS5uZWVkUmVhZGFibGU7cmV0dXJuIGgoIm5lZWQgcmVhZGFibGUiLGkpLCgwPT09ZS5sZW5ndGh8fGUubGVuZ3RoLXQ8ZS5oaWdoV2F0ZXJNYXJrKSYmaCgibGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsiLGk9ITApLGUuZW5kZWR8fGUucmVhZGluZz9oKCJyZWFkaW5nIG9yIGVuZGVkIixpPSExKTppJiYoaCgiZG8gcmVhZCIpLGUucmVhZGluZz0hMCxlLnN5bmM9ITAsMD09PWUubGVuZ3RoJiYoZS5uZWVkUmVhZGFibGU9ITApLHRoaXMuX3JlYWQoZS5oaWdoV2F0ZXJNYXJrKSxlLnN5bmM9ITEsZS5yZWFkaW5nfHwodD1iKG4sZSkpKSxudWxsPT09KHI9dD4wP08odCxlKTpudWxsKT8oZS5uZWVkUmVhZGFibGU9ITAsdD0wKTplLmxlbmd0aC09dCwwPT09ZS5sZW5ndGgmJihlLmVuZGVkfHwoZS5uZWVkUmVhZGFibGU9ITApLG4hPT10JiZlLmVuZGVkJiZUKHRoaXMpKSxudWxsIT09ciYmdGhpcy5lbWl0KCJkYXRhIixyKSxyfSxNLnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt0aGlzLmVtaXQoImVycm9yIixuZXcgRXJyb3IoIl9yZWFkKCkgaXMgbm90IGltcGxlbWVudGVkIikpfSxNLnByb3RvdHlwZS5waXBlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxvPXRoaXMuX3JlYWRhYmxlU3RhdGU7c3dpdGNoKG8ucGlwZXNDb3VudCl7Y2FzZSAwOm8ucGlwZXM9dDticmVhaztjYXNlIDE6by5waXBlcz1bby5waXBlcyx0XTticmVhaztkZWZhdWx0Om8ucGlwZXMucHVzaCh0KX1vLnBpcGVzQ291bnQrPTEsaCgicGlwZSBjb3VudD0lZCBvcHRzPSVqIixvLnBpcGVzQ291bnQsZSk7dmFyIGE9KCFlfHwhMSE9PWUuZW5kKSYmdCE9PXIuc3Rkb3V0JiZ0IT09ci5zdGRlcnI/ZjpNO2Z1bmN0aW9uIGMoZSxyKXtoKCJvbnVucGlwZSIpLGU9PT1uJiZyJiYhMT09PXIuaGFzVW5waXBlZCYmKHIuaGFzVW5waXBlZD0hMCxoKCJjbGVhbnVwIiksdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLGcpLHQucmVtb3ZlTGlzdGVuZXIoImZpbmlzaCIsdyksdC5yZW1vdmVMaXN0ZW5lcigiZHJhaW4iLGwpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIix2KSx0LnJlbW92ZUxpc3RlbmVyKCJ1bnBpcGUiLGMpLG4ucmVtb3ZlTGlzdGVuZXIoImVuZCIsZiksbi5yZW1vdmVMaXN0ZW5lcigiZW5kIixNKSxuLnJlbW92ZUxpc3RlbmVyKCJkYXRhIix5KSxwPSEwLCFvLmF3YWl0RHJhaW58fHQuX3dyaXRhYmxlU3RhdGUmJiF0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbnx8bCgpKX1mdW5jdGlvbiBmKCl7aCgib25lbmQiKSx0LmVuZCgpfW8uZW5kRW1pdHRlZD9pLm5leHRUaWNrKGEpOm4ub25jZSgiZW5kIixhKSx0Lm9uKCJ1bnBpcGUiLGMpO3ZhciBsPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQuX3JlYWRhYmxlU3RhdGU7aCgicGlwZU9uRHJhaW4iLGUuYXdhaXREcmFpbiksZS5hd2FpdERyYWluJiZlLmF3YWl0RHJhaW4tLSwwPT09ZS5hd2FpdERyYWluJiZzKHQsImRhdGEiKSYmKGUuZmxvd2luZz0hMCxBKHQpKX19KG4pO3Qub24oImRyYWluIixsKTt2YXIgcD0hMTt2YXIgZD0hMTtmdW5jdGlvbiB5KGUpe2goIm9uZGF0YSIpLGQ9ITEsITEhPT10LndyaXRlKGUpfHxkfHwoKDE9PT1vLnBpcGVzQ291bnQmJm8ucGlwZXM9PT10fHxvLnBpcGVzQ291bnQ+MSYmLTEhPT1FKG8ucGlwZXMsdCkpJiYhcCYmKGgoImZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZSIsbi5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKSxuLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4rKyxkPSEwKSxuLnBhdXNlKCkpfWZ1bmN0aW9uIHYoZSl7aCgib25lcnJvciIsZSksTSgpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIix2KSwwPT09cyh0LCJlcnJvciIpJiZ0LmVtaXQoImVycm9yIixlKX1mdW5jdGlvbiBnKCl7dC5yZW1vdmVMaXN0ZW5lcigiZmluaXNoIix3KSxNKCl9ZnVuY3Rpb24gdygpe2goIm9uZmluaXNoIiksdC5yZW1vdmVMaXN0ZW5lcigiY2xvc2UiLGcpLE0oKX1mdW5jdGlvbiBNKCl7aCgidW5waXBlIiksbi51bnBpcGUodCl9cmV0dXJuIG4ub24oImRhdGEiLHkpLGZ1bmN0aW9uKHQsZSxuKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdC5wcmVwZW5kTGlzdGVuZXIpcmV0dXJuIHQucHJlcGVuZExpc3RlbmVyKGUsbik7dC5fZXZlbnRzJiZ0Ll9ldmVudHNbZV0/dSh0Ll9ldmVudHNbZV0pP3QuX2V2ZW50c1tlXS51bnNoaWZ0KG4pOnQuX2V2ZW50c1tlXT1bbix0Ll9ldmVudHNbZV1dOnQub24oZSxuKX0odCwiZXJyb3IiLHYpLHQub25jZSgiY2xvc2UiLGcpLHQub25jZSgiZmluaXNoIix3KSx0LmVtaXQoInBpcGUiLG4pLG8uZmxvd2luZ3x8KGgoInBpcGUgcmVzdW1lIiksbi5yZXN1bWUoKSksdH0sTS5wcm90b3R5cGUudW5waXBlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3JlYWRhYmxlU3RhdGUsbj17aGFzVW5waXBlZDohMX07aWYoMD09PWUucGlwZXNDb3VudClyZXR1cm4gdGhpcztpZigxPT09ZS5waXBlc0NvdW50KXJldHVybiB0JiZ0IT09ZS5waXBlc3x8KHR8fCh0PWUucGlwZXMpLGUucGlwZXM9bnVsbCxlLnBpcGVzQ291bnQ9MCxlLmZsb3dpbmc9ITEsdCYmdC5lbWl0KCJ1bnBpcGUiLHRoaXMsbikpLHRoaXM7aWYoIXQpe3ZhciByPWUucGlwZXMsaT1lLnBpcGVzQ291bnQ7ZS5waXBlcz1udWxsLGUucGlwZXNDb3VudD0wLGUuZmxvd2luZz0hMTtmb3IodmFyIG89MDtvPGk7bysrKXJbb10uZW1pdCgidW5waXBlIix0aGlzLG4pO3JldHVybiB0aGlzfXZhciB1PUUoZS5waXBlcyx0KTtyZXR1cm4tMT09PXV8fChlLnBpcGVzLnNwbGljZSh1LDEpLGUucGlwZXNDb3VudC09MSwxPT09ZS5waXBlc0NvdW50JiYoZS5waXBlcz1lLnBpcGVzWzBdKSx0LmVtaXQoInVucGlwZSIsdGhpcyxuKSksdGhpc30sTS5wcm90b3R5cGUub249ZnVuY3Rpb24odCxlKXt2YXIgbj1hLnByb3RvdHlwZS5vbi5jYWxsKHRoaXMsdCxlKTtpZigiZGF0YSI9PT10KSExIT09dGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nJiZ0aGlzLnJlc3VtZSgpO2Vsc2UgaWYoInJlYWRhYmxlIj09PXQpe3ZhciByPXRoaXMuX3JlYWRhYmxlU3RhdGU7ci5lbmRFbWl0dGVkfHxyLnJlYWRhYmxlTGlzdGVuaW5nfHwoci5yZWFkYWJsZUxpc3RlbmluZz1yLm5lZWRSZWFkYWJsZT0hMCxyLmVtaXR0ZWRSZWFkYWJsZT0hMSxyLnJlYWRpbmc/ci5sZW5ndGgmJngodGhpcyk6aS5uZXh0VGljayhELHRoaXMpKX1yZXR1cm4gbn0sTS5wcm90b3R5cGUuYWRkTGlzdGVuZXI9TS5wcm90b3R5cGUub24sTS5wcm90b3R5cGUucmVzdW1lPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcmVhZGFibGVTdGF0ZTtyZXR1cm4gdC5mbG93aW5nfHwoaCgicmVzdW1lIiksdC5mbG93aW5nPSEwLGZ1bmN0aW9uKHQsZSl7ZS5yZXN1bWVTY2hlZHVsZWR8fChlLnJlc3VtZVNjaGVkdWxlZD0hMCxpLm5leHRUaWNrKEksdCxlKSl9KHRoaXMsdCkpLHRoaXN9LE0ucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKCl7cmV0dXJuIGgoImNhbGwgcGF1c2UgZmxvd2luZz0laiIsdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nKSwhMSE9PXRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyYmKGgoInBhdXNlIiksdGhpcy5fcmVhZGFibGVTdGF0ZS5mbG93aW5nPSExLHRoaXMuZW1pdCgicGF1c2UiKSksdGhpc30sTS5wcm90b3R5cGUud3JhcD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49dGhpcy5fcmVhZGFibGVTdGF0ZSxyPSExO2Zvcih2YXIgaSBpbiB0Lm9uKCJlbmQiLChmdW5jdGlvbigpe2lmKGgoIndyYXBwZWQgZW5kIiksbi5kZWNvZGVyJiYhbi5lbmRlZCl7dmFyIHQ9bi5kZWNvZGVyLmVuZCgpO3QmJnQubGVuZ3RoJiZlLnB1c2godCl9ZS5wdXNoKG51bGwpfSkpLHQub24oImRhdGEiLChmdW5jdGlvbihpKXsoaCgid3JhcHBlZCBkYXRhIiksbi5kZWNvZGVyJiYoaT1uLmRlY29kZXIud3JpdGUoaSkpLG4ub2JqZWN0TW9kZSYmbnVsbD09aSl8fChuLm9iamVjdE1vZGV8fGkmJmkubGVuZ3RoKSYmKGUucHVzaChpKXx8KHI9ITAsdC5wYXVzZSgpKSl9KSksdCl2b2lkIDA9PT10aGlzW2ldJiYiZnVuY3Rpb24iPT10eXBlb2YgdFtpXSYmKHRoaXNbaV09ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRbZV0uYXBwbHkodCxhcmd1bWVudHMpfX0oaSkpO2Zvcih2YXIgbz0wO288Zy5sZW5ndGg7bysrKXQub24oZ1tvXSx0aGlzLmVtaXQuYmluZCh0aGlzLGdbb10pKTtyZXR1cm4gdGhpcy5fcmVhZD1mdW5jdGlvbihlKXtoKCJ3cmFwcGVkIF9yZWFkIixlKSxyJiYocj0hMSx0LnJlc3VtZSgpKX0sdGhpc30sT2JqZWN0LmRlZmluZVByb3BlcnR5KE0ucHJvdG90eXBlLCJyZWFkYWJsZUhpZ2hXYXRlck1hcmsiLHtlbnVtZXJhYmxlOiExLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yZWFkYWJsZVN0YXRlLmhpZ2hXYXRlck1hcmt9fSksTS5fZnJvbUxpc3Q9T30pLmNhbGwodGhpcyxuKDIwKSxuKDM0KSl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigxMzUpLkV2ZW50RW1pdHRlcn0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDk1KTtmdW5jdGlvbiBpKHQsZSl7dC5lbWl0KCJlcnJvciIsZSl9dC5leHBvcnRzPXtkZXN0cm95OmZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxvPXRoaXMuX3JlYWRhYmxlU3RhdGUmJnRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkLHU9dGhpcy5fd3JpdGFibGVTdGF0ZSYmdGhpcy5fd3JpdGFibGVTdGF0ZS5kZXN0cm95ZWQ7cmV0dXJuIG98fHU/KGU/ZSh0KTohdHx8dGhpcy5fd3JpdGFibGVTdGF0ZSYmdGhpcy5fd3JpdGFibGVTdGF0ZS5lcnJvckVtaXR0ZWR8fHIubmV4dFRpY2soaSx0aGlzLHQpLHRoaXMpOih0aGlzLl9yZWFkYWJsZVN0YXRlJiYodGhpcy5fcmVhZGFibGVTdGF0ZS5kZXN0cm95ZWQ9ITApLHRoaXMuX3dyaXRhYmxlU3RhdGUmJih0aGlzLl93cml0YWJsZVN0YXRlLmRlc3Ryb3llZD0hMCksdGhpcy5fZGVzdHJveSh0fHxudWxsLChmdW5jdGlvbih0KXshZSYmdD8oci5uZXh0VGljayhpLG4sdCksbi5fd3JpdGFibGVTdGF0ZSYmKG4uX3dyaXRhYmxlU3RhdGUuZXJyb3JFbWl0dGVkPSEwKSk6ZSYmZSh0KX0pKSx0aGlzKX0sdW5kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5fcmVhZGFibGVTdGF0ZSYmKHRoaXMuX3JlYWRhYmxlU3RhdGUuZGVzdHJveWVkPSExLHRoaXMuX3JlYWRhYmxlU3RhdGUucmVhZGluZz0hMSx0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZGVkPSExLHRoaXMuX3JlYWRhYmxlU3RhdGUuZW5kRW1pdHRlZD0hMSksdGhpcy5fd3JpdGFibGVTdGF0ZSYmKHRoaXMuX3dyaXRhYmxlU3RhdGUuZGVzdHJveWVkPSExLHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQ9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5lbmRpbmc9ITEsdGhpcy5fd3JpdGFibGVTdGF0ZS5maW5pc2hlZD0hMSx0aGlzLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZD0hMSl9fX0sZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbih0KXt2YXIgcj12b2lkIDAhPT10JiZ0fHwidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGYmJnNlbGZ8fHdpbmRvdyxpPUZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtmdW5jdGlvbiBvKHQsZSl7dGhpcy5faWQ9dCx0aGlzLl9jbGVhckZuPWV9ZS5zZXRUaW1lb3V0PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBvKGkuY2FsbChzZXRUaW1lb3V0LHIsYXJndW1lbnRzKSxjbGVhclRpbWVvdXQpfSxlLnNldEludGVydmFsPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBvKGkuY2FsbChzZXRJbnRlcnZhbCxyLGFyZ3VtZW50cyksY2xlYXJJbnRlcnZhbCl9LGUuY2xlYXJUaW1lb3V0PWUuY2xlYXJJbnRlcnZhbD1mdW5jdGlvbih0KXt0JiZ0LmNsb3NlKCl9LG8ucHJvdG90eXBlLnVucmVmPW8ucHJvdG90eXBlLnJlZj1mdW5jdGlvbigpe30sby5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXt0aGlzLl9jbGVhckZuLmNhbGwocix0aGlzLl9pZCl9LGUuZW5yb2xsPWZ1bmN0aW9uKHQsZSl7Y2xlYXJUaW1lb3V0KHQuX2lkbGVUaW1lb3V0SWQpLHQuX2lkbGVUaW1lb3V0PWV9LGUudW5lbnJvbGw9ZnVuY3Rpb24odCl7Y2xlYXJUaW1lb3V0KHQuX2lkbGVUaW1lb3V0SWQpLHQuX2lkbGVUaW1lb3V0PS0xfSxlLl91bnJlZkFjdGl2ZT1lLmFjdGl2ZT1mdW5jdGlvbih0KXtjbGVhclRpbWVvdXQodC5faWRsZVRpbWVvdXRJZCk7dmFyIGU9dC5faWRsZVRpbWVvdXQ7ZT49MCYmKHQuX2lkbGVUaW1lb3V0SWQ9c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0Ll9vblRpbWVvdXQmJnQuX29uVGltZW91dCgpfSksZSkpfSxuKDUyNyksZS5zZXRJbW1lZGlhdGU9InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmJiZzZWxmLnNldEltbWVkaWF0ZXx8dm9pZCAwIT09dCYmdC5zZXRJbW1lZGlhdGV8fHRoaXMmJnRoaXMuc2V0SW1tZWRpYXRlLGUuY2xlYXJJbW1lZGlhdGU9InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmJiZzZWxmLmNsZWFySW1tZWRpYXRlfHx2b2lkIDAhPT10JiZ0LmNsZWFySW1tZWRpYXRlfHx0aGlzJiZ0aGlzLmNsZWFySW1tZWRpYXRlfSkuY2FsbCh0aGlzLG4oMjApKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDE3KS5CdWZmZXIsaT1yLmlzRW5jb2Rpbmd8fGZ1bmN0aW9uKHQpe3N3aXRjaCgodD0iIit0KSYmdC50b0xvd2VyQ2FzZSgpKXtjYXNlImhleCI6Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlImFzY2lpIjpjYXNlImJpbmFyeSI6Y2FzZSJiYXNlNjQiOmNhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpjYXNlInJhdyI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19O2Z1bmN0aW9uIG8odCl7dmFyIGU7c3dpdGNoKHRoaXMuZW5jb2Rpbmc9ZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuInV0ZjgiO2Zvcih2YXIgZTs7KXN3aXRjaCh0KXtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiJ1dGY4IjtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuInV0ZjE2bGUiO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuImxhdGluMSI7Y2FzZSJiYXNlNjQiOmNhc2UiYXNjaWkiOmNhc2UiaGV4IjpyZXR1cm4gdDtkZWZhdWx0OmlmKGUpcmV0dXJuO3Q9KCIiK3QpLnRvTG93ZXJDYXNlKCksZT0hMH19KHQpO2lmKCJzdHJpbmciIT10eXBlb2YgZSYmKHIuaXNFbmNvZGluZz09PWl8fCFpKHQpKSl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gZW5jb2Rpbmc6ICIrdCk7cmV0dXJuIGV8fHR9KHQpLHRoaXMuZW5jb2Rpbmcpe2Nhc2UidXRmMTZsZSI6dGhpcy50ZXh0PWEsdGhpcy5lbmQ9YyxlPTQ7YnJlYWs7Y2FzZSJ1dGY4Ijp0aGlzLmZpbGxMYXN0PXMsZT00O2JyZWFrO2Nhc2UiYmFzZTY0Ijp0aGlzLnRleHQ9Zix0aGlzLmVuZD1sLGU9MzticmVhaztkZWZhdWx0OnJldHVybiB0aGlzLndyaXRlPXAsdm9pZCh0aGlzLmVuZD1oKX10aGlzLmxhc3ROZWVkPTAsdGhpcy5sYXN0VG90YWw9MCx0aGlzLmxhc3RDaGFyPXIuYWxsb2NVbnNhZmUoZSl9ZnVuY3Rpb24gdSh0KXtyZXR1cm4gdDw9MTI3PzA6dD4+NT09Nj8yOnQ+PjQ9PTE0PzM6dD4+Mz09MzA/NDp0Pj42PT0yPy0xOi0yfWZ1bmN0aW9uIHModCl7dmFyIGU9dGhpcy5sYXN0VG90YWwtdGhpcy5sYXN0TmVlZCxuPWZ1bmN0aW9uKHQsZSxuKXtpZigxMjghPSgxOTImZVswXSkpcmV0dXJuIHQubGFzdE5lZWQ9MCwi77+9IjtpZih0Lmxhc3ROZWVkPjEmJmUubGVuZ3RoPjEpe2lmKDEyOCE9KDE5MiZlWzFdKSlyZXR1cm4gdC5sYXN0TmVlZD0xLCLvv70iO2lmKHQubGFzdE5lZWQ+MiYmZS5sZW5ndGg+MiYmMTI4IT0oMTkyJmVbMl0pKXJldHVybiB0Lmxhc3ROZWVkPTIsIu+/vSJ9fSh0aGlzLHQpO3JldHVybiB2b2lkIDAhPT1uP246dGhpcy5sYXN0TmVlZDw9dC5sZW5ndGg/KHQuY29weSh0aGlzLmxhc3RDaGFyLGUsMCx0aGlzLmxhc3ROZWVkKSx0aGlzLmxhc3RDaGFyLnRvU3RyaW5nKHRoaXMuZW5jb2RpbmcsMCx0aGlzLmxhc3RUb3RhbCkpOih0LmNvcHkodGhpcy5sYXN0Q2hhcixlLDAsdC5sZW5ndGgpLHZvaWQodGhpcy5sYXN0TmVlZC09dC5sZW5ndGgpKX1mdW5jdGlvbiBhKHQsZSl7aWYoKHQubGVuZ3RoLWUpJTI9PTApe3ZhciBuPXQudG9TdHJpbmcoInV0ZjE2bGUiLGUpO2lmKG4pe3ZhciByPW4uY2hhckNvZGVBdChuLmxlbmd0aC0xKTtpZihyPj01NTI5NiYmcjw9NTYzMTkpcmV0dXJuIHRoaXMubGFzdE5lZWQ9Mix0aGlzLmxhc3RUb3RhbD00LHRoaXMubGFzdENoYXJbMF09dFt0Lmxlbmd0aC0yXSx0aGlzLmxhc3RDaGFyWzFdPXRbdC5sZW5ndGgtMV0sbi5zbGljZSgwLC0xKX1yZXR1cm4gbn1yZXR1cm4gdGhpcy5sYXN0TmVlZD0xLHRoaXMubGFzdFRvdGFsPTIsdGhpcy5sYXN0Q2hhclswXT10W3QubGVuZ3RoLTFdLHQudG9TdHJpbmcoInV0ZjE2bGUiLGUsdC5sZW5ndGgtMSl9ZnVuY3Rpb24gYyh0KXt2YXIgZT10JiZ0Lmxlbmd0aD90aGlzLndyaXRlKHQpOiIiO2lmKHRoaXMubGFzdE5lZWQpe3ZhciBuPXRoaXMubGFzdFRvdGFsLXRoaXMubGFzdE5lZWQ7cmV0dXJuIGUrdGhpcy5sYXN0Q2hhci50b1N0cmluZygidXRmMTZsZSIsMCxuKX1yZXR1cm4gZX1mdW5jdGlvbiBmKHQsZSl7dmFyIG49KHQubGVuZ3RoLWUpJTM7cmV0dXJuIDA9PT1uP3QudG9TdHJpbmcoImJhc2U2NCIsZSk6KHRoaXMubGFzdE5lZWQ9My1uLHRoaXMubGFzdFRvdGFsPTMsMT09PW4/dGhpcy5sYXN0Q2hhclswXT10W3QubGVuZ3RoLTFdOih0aGlzLmxhc3RDaGFyWzBdPXRbdC5sZW5ndGgtMl0sdGhpcy5sYXN0Q2hhclsxXT10W3QubGVuZ3RoLTFdKSx0LnRvU3RyaW5nKCJiYXNlNjQiLGUsdC5sZW5ndGgtbikpfWZ1bmN0aW9uIGwodCl7dmFyIGU9dCYmdC5sZW5ndGg/dGhpcy53cml0ZSh0KToiIjtyZXR1cm4gdGhpcy5sYXN0TmVlZD9lK3RoaXMubGFzdENoYXIudG9TdHJpbmcoImJhc2U2NCIsMCwzLXRoaXMubGFzdE5lZWQpOmV9ZnVuY3Rpb24gcCh0KXtyZXR1cm4gdC50b1N0cmluZyh0aGlzLmVuY29kaW5nKX1mdW5jdGlvbiBoKHQpe3JldHVybiB0JiZ0Lmxlbmd0aD90aGlzLndyaXRlKHQpOiIifWUuU3RyaW5nRGVjb2Rlcj1vLG8ucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQpe2lmKDA9PT10Lmxlbmd0aClyZXR1cm4iIjt2YXIgZSxuO2lmKHRoaXMubGFzdE5lZWQpe2lmKHZvaWQgMD09PShlPXRoaXMuZmlsbExhc3QodCkpKXJldHVybiIiO249dGhpcy5sYXN0TmVlZCx0aGlzLmxhc3ROZWVkPTB9ZWxzZSBuPTA7cmV0dXJuIG48dC5sZW5ndGg/ZT9lK3RoaXMudGV4dCh0LG4pOnRoaXMudGV4dCh0LG4pOmV8fCIifSxvLnByb3RvdHlwZS5lbmQ9ZnVuY3Rpb24odCl7dmFyIGU9dCYmdC5sZW5ndGg/dGhpcy53cml0ZSh0KToiIjtyZXR1cm4gdGhpcy5sYXN0TmVlZD9lKyLvv70iOmV9LG8ucHJvdG90eXBlLnRleHQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1mdW5jdGlvbih0LGUsbil7dmFyIHI9ZS5sZW5ndGgtMTtpZihyPG4pcmV0dXJuIDA7dmFyIGk9dShlW3JdKTtpZihpPj0wKXJldHVybiBpPjAmJih0Lmxhc3ROZWVkPWktMSksaTtpZigtLXI8bnx8LTI9PT1pKXJldHVybiAwO2lmKChpPXUoZVtyXSkpPj0wKXJldHVybiBpPjAmJih0Lmxhc3ROZWVkPWktMiksaTtpZigtLXI8bnx8LTI9PT1pKXJldHVybiAwO2lmKChpPXUoZVtyXSkpPj0wKXJldHVybiBpPjAmJigyPT09aT9pPTA6dC5sYXN0TmVlZD1pLTMpLGk7cmV0dXJuIDB9KHRoaXMsdCxlKTtpZighdGhpcy5sYXN0TmVlZClyZXR1cm4gdC50b1N0cmluZygidXRmOCIsZSk7dGhpcy5sYXN0VG90YWw9bjt2YXIgcj10Lmxlbmd0aC0obi10aGlzLmxhc3ROZWVkKTtyZXR1cm4gdC5jb3B5KHRoaXMubGFzdENoYXIsMCxyKSx0LnRvU3RyaW5nKCJ1dGY4IixlLHIpfSxvLnByb3RvdHlwZS5maWxsTGFzdD1mdW5jdGlvbih0KXtpZih0aGlzLmxhc3ROZWVkPD10Lmxlbmd0aClyZXR1cm4gdC5jb3B5KHRoaXMubGFzdENoYXIsdGhpcy5sYXN0VG90YWwtdGhpcy5sYXN0TmVlZCwwLHRoaXMubGFzdE5lZWQpLHRoaXMubGFzdENoYXIudG9TdHJpbmcodGhpcy5lbmNvZGluZywwLHRoaXMubGFzdFRvdGFsKTt0LmNvcHkodGhpcy5sYXN0Q2hhcix0aGlzLmxhc3RUb3RhbC10aGlzLmxhc3ROZWVkLDAsdC5sZW5ndGgpLHRoaXMubGFzdE5lZWQtPXQubGVuZ3RofX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9dTt2YXIgcj1uKDM1KSxpPW4oNjkpO2Z1bmN0aW9uIG8odCxlKXt2YXIgbj10aGlzLl90cmFuc2Zvcm1TdGF0ZTtuLnRyYW5zZm9ybWluZz0hMTt2YXIgcj1uLndyaXRlY2I7aWYoIXIpcmV0dXJuIHRoaXMuZW1pdCgiZXJyb3IiLG5ldyBFcnJvcigid3JpdGUgY2FsbGJhY2sgY2FsbGVkIG11bHRpcGxlIHRpbWVzIikpO24ud3JpdGVjaHVuaz1udWxsLG4ud3JpdGVjYj1udWxsLG51bGwhPWUmJnRoaXMucHVzaChlKSxyKHQpO3ZhciBpPXRoaXMuX3JlYWRhYmxlU3RhdGU7aS5yZWFkaW5nPSExLChpLm5lZWRSZWFkYWJsZXx8aS5sZW5ndGg8aS5oaWdoV2F0ZXJNYXJrKSYmdGhpcy5fcmVhZChpLmhpZ2hXYXRlck1hcmspfWZ1bmN0aW9uIHUodCl7aWYoISh0aGlzIGluc3RhbmNlb2YgdSkpcmV0dXJuIG5ldyB1KHQpO3IuY2FsbCh0aGlzLHQpLHRoaXMuX3RyYW5zZm9ybVN0YXRlPXthZnRlclRyYW5zZm9ybTpvLmJpbmQodGhpcyksbmVlZFRyYW5zZm9ybTohMSx0cmFuc2Zvcm1pbmc6ITEsd3JpdGVjYjpudWxsLHdyaXRlY2h1bms6bnVsbCx3cml0ZWVuY29kaW5nOm51bGx9LHRoaXMuX3JlYWRhYmxlU3RhdGUubmVlZFJlYWRhYmxlPSEwLHRoaXMuX3JlYWRhYmxlU3RhdGUuc3luYz0hMSx0JiYoImZ1bmN0aW9uIj09dHlwZW9mIHQudHJhbnNmb3JtJiYodGhpcy5fdHJhbnNmb3JtPXQudHJhbnNmb3JtKSwiZnVuY3Rpb24iPT10eXBlb2YgdC5mbHVzaCYmKHRoaXMuX2ZsdXNoPXQuZmx1c2gpKSx0aGlzLm9uKCJwcmVmaW5pc2giLHMpfWZ1bmN0aW9uIHMoKXt2YXIgdD10aGlzOyJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLl9mbHVzaD90aGlzLl9mbHVzaCgoZnVuY3Rpb24oZSxuKXthKHQsZSxuKX0pKTphKHRoaXMsbnVsbCxudWxsKX1mdW5jdGlvbiBhKHQsZSxuKXtpZihlKXJldHVybiB0LmVtaXQoImVycm9yIixlKTtpZihudWxsIT1uJiZ0LnB1c2gobiksdC5fd3JpdGFibGVTdGF0ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gd3MubGVuZ3RoICE9IDAiKTtpZih0Ll90cmFuc2Zvcm1TdGF0ZS50cmFuc2Zvcm1pbmcpdGhyb3cgbmV3IEVycm9yKCJDYWxsaW5nIHRyYW5zZm9ybSBkb25lIHdoZW4gc3RpbGwgdHJhbnNmb3JtaW5nIik7cmV0dXJuIHQucHVzaChudWxsKX1pLmluaGVyaXRzPW4oMTYpLGkuaW5oZXJpdHModSxyKSx1LnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX3RyYW5zZm9ybVN0YXRlLm5lZWRUcmFuc2Zvcm09ITEsci5wcm90b3R5cGUucHVzaC5jYWxsKHRoaXMsdCxlKX0sdS5wcm90b3R5cGUuX3RyYW5zZm9ybT1mdW5jdGlvbih0LGUsbil7dGhyb3cgbmV3IEVycm9yKCJfdHJhbnNmb3JtKCkgaXMgbm90IGltcGxlbWVudGVkIil9LHUucHJvdG90eXBlLl93cml0ZT1mdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcy5fdHJhbnNmb3JtU3RhdGU7aWYoci53cml0ZWNiPW4sci53cml0ZWNodW5rPXQsci53cml0ZWVuY29kaW5nPWUsIXIudHJhbnNmb3JtaW5nKXt2YXIgaT10aGlzLl9yZWFkYWJsZVN0YXRlOyhyLm5lZWRUcmFuc2Zvcm18fGkubmVlZFJlYWRhYmxlfHxpLmxlbmd0aDxpLmhpZ2hXYXRlck1hcmspJiZ0aGlzLl9yZWFkKGkuaGlnaFdhdGVyTWFyayl9fSx1LnByb3RvdHlwZS5fcmVhZD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl90cmFuc2Zvcm1TdGF0ZTtudWxsIT09ZS53cml0ZWNodW5rJiZlLndyaXRlY2ImJiFlLnRyYW5zZm9ybWluZz8oZS50cmFuc2Zvcm1pbmc9ITAsdGhpcy5fdHJhbnNmb3JtKGUud3JpdGVjaHVuayxlLndyaXRlZW5jb2RpbmcsZS5hZnRlclRyYW5zZm9ybSkpOmUubmVlZFRyYW5zZm9ybT0hMH0sdS5wcm90b3R5cGUuX2Rlc3Ryb3k9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO3IucHJvdG90eXBlLl9kZXN0cm95LmNhbGwodGhpcyx0LChmdW5jdGlvbih0KXtlKHQpLG4uZW1pdCgiY2xvc2UiKX0pKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigzNiksaT1BcnJheS5wcm90b3R5cGUuZm9yRWFjaCxvPU9iamVjdC5jcmVhdGUsdT1mdW5jdGlvbih0LGUpe3ZhciBuO2ZvcihuIGluIHQpZVtuXT10W25dfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9byhudWxsKTtyZXR1cm4gaS5jYWxsKGFyZ3VtZW50cywoZnVuY3Rpb24odCl7cih0KSYmdShPYmplY3QodCksZSl9KSksZX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigzNyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaTtyZXR1cm4gaXNOYU4odCk/KGk9ZSk+PTA/biYmaT9pLTE6aToxOiExIT09dCYmcih0KX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dC5leHBvcnRzPW4oNTQzKSgpP09iamVjdC5hc3NpZ246big1NDQpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByLGksbyx1LHMsYT1uKDM3KSxjPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV9O3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYywibGVuZ3RoIix7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiExLGVudW1lcmFibGU6ITEsdmFsdWU6MX0pfWNhdGNoKHQpe30xPT09Yy5sZW5ndGg/KHI9e2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMSxlbnVtZXJhYmxlOiExfSxpPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSx0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT1hKGUpLHQubGVuZ3RoPT09ZT90OihyLnZhbHVlPWUsaSh0LCJsZW5ndGgiLHIpKX0pOih1PW4oMjExKSxzPVtdLG89ZnVuY3Rpb24odCl7dmFyIGUsbj0wO2lmKHNbdF0pcmV0dXJuIHNbdF07Zm9yKGU9W107dC0tOyllLnB1c2goImEiKygrK24pLnRvU3RyaW5nKDM2KSk7cmV0dXJuIG5ldyBGdW5jdGlvbigiZm4iLCJyZXR1cm4gZnVuY3Rpb24gKCIrZS5qb2luKCIsICIpKyIpIHsgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07Iil9LHQuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuO2lmKGU9YShlKSx0Lmxlbmd0aD09PWUpcmV0dXJuIHQ7bj1vKGUpKHQpO3RyeXt1KG4sdCl9Y2F0Y2godCl7fXJldHVybiBufSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big0NyksaT1PYmplY3QuZGVmaW5lUHJvcGVydHksbz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLHU9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMscz1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuLGE9T2JqZWN0KHIoZSkpO2lmKHQ9T2JqZWN0KHIodCkpLHUoYSkuZm9yRWFjaCgoZnVuY3Rpb24ocil7dHJ5e2kodCxyLG8oZSxyKSl9Y2F0Y2godCl7bj10fX0pKSwiZnVuY3Rpb24iPT10eXBlb2YgcyYmcyhhKS5mb3JFYWNoKChmdW5jdGlvbihyKXt0cnl7aSh0LHIsbyhlLHIpKX1jYXRjaCh0KXtuPXR9fSkpLHZvaWQgMCE9PW4pdGhyb3cgbjtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDU2Nik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCFyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IodCsiIGlzIG5vdCBhIHN5bWJvbCIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMxKSxpPW4oOTYpLG89RnVuY3Rpb24ucHJvdG90eXBlLmNhbGw7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49e30sdT1hcmd1bWVudHNbMl07cmV0dXJuIHIoZSksaSh0LChmdW5jdGlvbih0LHIsaSxzKXtuW3JdPW8uY2FsbChlLHUsdCxyLGkscyl9KSksbn19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fX0sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBuKHQpe3JldHVybiEhdCYmKCJvYmplY3QiPT10eXBlb2YgdHx8ImZ1bmN0aW9uIj09dHlwZW9mIHQpJiYiZnVuY3Rpb24iPT10eXBlb2YgdC50aGVufXQuZXhwb3J0cz1uLHQuZXhwb3J0cy5kZWZhdWx0PW59LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE2KSxpPW4oNDgpLG89bigxNykuQnVmZmVyLHU9WzExMTYzNTI0MDgsMTg5OTQ0NzQ0MSwzMDQ5MzIzNDcxLDM5MjEwMDk1NzMsOTYxOTg3MTYzLDE1MDg5NzA5OTMsMjQ1MzYzNTc0OCwyODcwNzYzMjIxLDM2MjQzODEwODAsMzEwNTk4NDAxLDYwNzIyNTI3OCwxNDI2ODgxOTg3LDE5MjUwNzgzODgsMjE2MjA3ODIwNiwyNjE0ODg4MTAzLDMyNDgyMjI1ODAsMzgzNTM5MDQwMSw0MDIyMjI0Nzc0LDI2NDM0NzA3OCw2MDQ4MDc2MjgsNzcwMjU1OTgzLDEyNDkxNTAxMjIsMTU1NTA4MTY5MiwxOTk2MDY0OTg2LDI1NTQyMjA4ODIsMjgyMTgzNDM0OSwyOTUyOTk2ODA4LDMyMTAzMTM2NzEsMzMzNjU3MTg5MSwzNTg0NTI4NzExLDExMzkyNjk5MywzMzgyNDE4OTUsNjY2MzA3MjA1LDc3MzUyOTkxMiwxMjk0NzU3MzcyLDEzOTYxODIyOTEsMTY5NTE4MzcwMCwxOTg2NjYxMDUxLDIxNzcwMjYzNTAsMjQ1Njk1NjAzNywyNzMwNDg1OTIxLDI4MjAzMDI0MTEsMzI1OTczMDgwMCwzMzQ1NzY0NzcxLDM1MTYwNjU4MTcsMzYwMDM1MjgwNCw0MDk0NTcxOTA5LDI3NTQyMzM0NCw0MzAyMjc3MzQsNTA2OTQ4NjE2LDY1OTA2MDU1Niw4ODM5OTc4NzcsOTU4MTM5NTcxLDEzMjI4MjIyMTgsMTUzNzAwMjA2MywxNzQ3ODczNzc5LDE5NTU1NjIyMjIsMjAyNDEwNDgxNSwyMjI3NzMwNDUyLDIzNjE4NTI0MjQsMjQyODQzNjQ3NCwyNzU2NzM0MTg3LDMyMDQwMzE0NzksMzMyOTMyNTI5OF0scz1uZXcgQXJyYXkoNjQpO2Z1bmN0aW9uIGEoKXt0aGlzLmluaXQoKSx0aGlzLl93PXMsaS5jYWxsKHRoaXMsNjQsNTYpfWZ1bmN0aW9uIGModCxlLG4pe3JldHVybiBuXnQmKGVebil9ZnVuY3Rpb24gZih0LGUsbil7cmV0dXJuIHQmZXxuJih0fGUpfWZ1bmN0aW9uIGwodCl7cmV0dXJuKHQ+Pj4yfHQ8PDMwKV4odD4+PjEzfHQ8PDE5KV4odD4+PjIyfHQ8PDEwKX1mdW5jdGlvbiBwKHQpe3JldHVybih0Pj4+Nnx0PDwyNileKHQ+Pj4xMXx0PDwyMSleKHQ+Pj4yNXx0PDw3KX1mdW5jdGlvbiBoKHQpe3JldHVybih0Pj4+N3x0PDwyNSleKHQ+Pj4xOHx0PDwxNCledD4+PjN9cihhLGkpLGEucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYT0xNzc5MDMzNzAzLHRoaXMuX2I9MzE0NDEzNDI3Nyx0aGlzLl9jPTEwMTM5MDQyNDIsdGhpcy5fZD0yNzczNDgwNzYyLHRoaXMuX2U9MTM1OTg5MzExOSx0aGlzLl9mPTI2MDA4MjI5MjQsdGhpcy5fZz01Mjg3MzQ2MzUsdGhpcy5faD0xNTQxNDU5MjI1LHRoaXN9LGEucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49dGhpcy5fdyxyPTB8dGhpcy5fYSxpPTB8dGhpcy5fYixvPTB8dGhpcy5fYyxzPTB8dGhpcy5fZCxhPTB8dGhpcy5fZSxkPTB8dGhpcy5fZix5PTB8dGhpcy5fZyx2PTB8dGhpcy5faCxnPTA7ZzwxNjsrK2cpbltnXT10LnJlYWRJbnQzMkJFKDQqZyk7Zm9yKDtnPDY0OysrZyluW2ddPTB8KCgoZT1uW2ctMl0pPj4+MTd8ZTw8MTUpXihlPj4+MTl8ZTw8MTMpXmU+Pj4xMCkrbltnLTddK2gobltnLTE1XSkrbltnLTE2XTtmb3IodmFyIHc9MDt3PDY0Oysrdyl7dmFyIE09ditwKGEpK2MoYSxkLHkpK3Vbd10rblt3XXwwLG09bChyKStmKHIsaSxvKXwwO3Y9eSx5PWQsZD1hLGE9cytNfDAscz1vLG89aSxpPXIscj1NK218MH10aGlzLl9hPXIrdGhpcy5fYXwwLHRoaXMuX2I9aSt0aGlzLl9ifDAsdGhpcy5fYz1vK3RoaXMuX2N8MCx0aGlzLl9kPXMrdGhpcy5fZHwwLHRoaXMuX2U9YSt0aGlzLl9lfDAsdGhpcy5fZj1kK3RoaXMuX2Z8MCx0aGlzLl9nPXkrdGhpcy5fZ3wwLHRoaXMuX2g9dit0aGlzLl9ofDB9LGEucHJvdG90eXBlLl9oYXNoPWZ1bmN0aW9uKCl7dmFyIHQ9by5hbGxvY1Vuc2FmZSgzMik7cmV0dXJuIHQud3JpdGVJbnQzMkJFKHRoaXMuX2EsMCksdC53cml0ZUludDMyQkUodGhpcy5fYiw0KSx0LndyaXRlSW50MzJCRSh0aGlzLl9jLDgpLHQud3JpdGVJbnQzMkJFKHRoaXMuX2QsMTIpLHQud3JpdGVJbnQzMkJFKHRoaXMuX2UsMTYpLHQud3JpdGVJbnQzMkJFKHRoaXMuX2YsMjApLHQud3JpdGVJbnQzMkJFKHRoaXMuX2csMjQpLHQud3JpdGVJbnQzMkJFKHRoaXMuX2gsMjgpLHR9LHQuZXhwb3J0cz1hfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNiksaT1uKDQ4KSxvPW4oMTcpLkJ1ZmZlcix1PVsxMTE2MzUyNDA4LDM2MDk3Njc0NTgsMTg5OTQ0NzQ0MSw2MDI4OTE3MjUsMzA0OTMyMzQ3MSwzOTY0NDg0Mzk5LDM5MjEwMDk1NzMsMjE3MzI5NTU0OCw5NjE5ODcxNjMsNDA4MTYyODQ3MiwxNTA4OTcwOTkzLDMwNTM4MzQyNjUsMjQ1MzYzNTc0OCwyOTM3NjcxNTc5LDI4NzA3NjMyMjEsMzY2NDYwOTU2MCwzNjI0MzgxMDgwLDI3MzQ4ODMzOTQsMzEwNTk4NDAxLDExNjQ5OTY1NDIsNjA3MjI1Mjc4LDEzMjM2MTA3NjQsMTQyNjg4MTk4NywzNTkwMzA0OTk0LDE5MjUwNzgzODgsNDA2ODE4MjM4MywyMTYyMDc4MjA2LDk5MTMzNjExMywyNjE0ODg4MTAzLDYzMzgwMzMxNywzMjQ4MjIyNTgwLDM0Nzk3NzQ4NjgsMzgzNTM5MDQwMSwyNjY2NjEzNDU4LDQwMjIyMjQ3NzQsOTQ0NzExMTM5LDI2NDM0NzA3OCwyMzQxMjYyNzczLDYwNDgwNzYyOCwyMDA3ODAwOTMzLDc3MDI1NTk4MywxNDk1OTkwOTAxLDEyNDkxNTAxMjIsMTg1NjQzMTIzNSwxNTU1MDgxNjkyLDMxNzUyMTgxMzIsMTk5NjA2NDk4NiwyMTk4OTUwODM3LDI1NTQyMjA4ODIsMzk5OTcxOTMzOSwyODIxODM0MzQ5LDc2Njc4NDAxNiwyOTUyOTk2ODA4LDI1NjY1OTQ4NzksMzIxMDMxMzY3MSwzMjAzMzM3OTU2LDMzMzY1NzE4OTEsMTAzNDQ1NzAyNiwzNTg0NTI4NzExLDI0NjY5NDg5MDEsMTEzOTI2OTkzLDM3NTgzMjYzODMsMzM4MjQxODk1LDE2ODcxNzkzNiw2NjYzMDcyMDUsMTE4ODE3OTk2NCw3NzM1Mjk5MTIsMTU0NjA0NTczNCwxMjk0NzU3MzcyLDE1MjI4MDU0ODUsMTM5NjE4MjI5MSwyNjQzODMzODIzLDE2OTUxODM3MDAsMjM0MzUyNzM5MCwxOTg2NjYxMDUxLDEwMTQ0Nzc0ODAsMjE3NzAyNjM1MCwxMjA2NzU5MTQyLDI0NTY5NTYwMzcsMzQ0MDc3NjI3LDI3MzA0ODU5MjEsMTI5MDg2MzQ2MCwyODIwMzAyNDExLDMxNTg0NTQyNzMsMzI1OTczMDgwMCwzNTA1OTUyNjU3LDMzNDU3NjQ3NzEsMTA2MjE3MDA4LDM1MTYwNjU4MTcsMzYwNjAwODM0NCwzNjAwMzUyODA0LDE0MzI3MjU3NzYsNDA5NDU3MTkwOSwxNDY3MDMxNTk0LDI3NTQyMzM0NCw4NTExNjk3MjAsNDMwMjI3NzM0LDMxMDA4MjM3NTIsNTA2OTQ4NjE2LDEzNjMyNTgxOTUsNjU5MDYwNTU2LDM3NTA2ODU1OTMsODgzOTk3ODc3LDM3ODUwNTAyODAsOTU4MTM5NTcxLDMzMTgzMDc0MjcsMTMyMjgyMjIxOCwzODEyNzIzNDAzLDE1MzcwMDIwNjMsMjAwMzAzNDk5NSwxNzQ3ODczNzc5LDM2MDIwMzY4OTksMTk1NTU2MjIyMiwxNTc1OTkwMDEyLDIwMjQxMDQ4MTUsMTEyNTU5MjkyOCwyMjI3NzMwNDUyLDI3MTY5MDQzMDYsMjM2MTg1MjQyNCw0NDI3NzYwNDQsMjQyODQzNjQ3NCw1OTM2OTgzNDQsMjc1NjczNDE4NywzNzMzMTEwMjQ5LDMyMDQwMzE0NzksMjk5OTM1MTU3MywzMzI5MzI1Mjk4LDM4MTU5MjA0MjcsMzM5MTU2OTYxNCwzOTI4MzgzOTAwLDM1MTUyNjcyNzEsNTY2MjgwNzExLDM5NDAxODc2MDYsMzQ1NDA2OTUzNCw0MTE4NjMwMjcxLDQwMDAyMzk5OTIsMTE2NDE4NDc0LDE5MTQxMzg1NTQsMTc0MjkyNDIxLDI3MzEwNTUyNzAsMjg5MzgwMzU2LDMyMDM5OTMwMDYsNDYwMzkzMjY5LDMyMDYyMDMxNSw2ODU0NzE3MzMsNTg3NDk2ODM2LDg1MjE0Mjk3MSwxMDg2NzkyODUxLDEwMTcwMzYyOTgsMzY1NTQzMTAwLDExMjYwMDA1ODAsMjYxODI5NzY3NiwxMjg4MDMzNDcwLDM0MDk4NTUxNTgsMTUwMTUwNTk0OCw0MjM0NTA5ODY2LDE2MDcxNjc5MTUsOTg3MTY3NDY4LDE4MTY0MDIzMTYsMTI0NjE4OTU5MV0scz1uZXcgQXJyYXkoMTYwKTtmdW5jdGlvbiBhKCl7dGhpcy5pbml0KCksdGhpcy5fdz1zLGkuY2FsbCh0aGlzLDEyOCwxMTIpfWZ1bmN0aW9uIGModCxlLG4pe3JldHVybiBuXnQmKGVebil9ZnVuY3Rpb24gZih0LGUsbil7cmV0dXJuIHQmZXxuJih0fGUpfWZ1bmN0aW9uIGwodCxlKXtyZXR1cm4odD4+PjI4fGU8PDQpXihlPj4+Mnx0PDwzMCleKGU+Pj43fHQ8PDI1KX1mdW5jdGlvbiBwKHQsZSl7cmV0dXJuKHQ+Pj4xNHxlPDwxOCleKHQ+Pj4xOHxlPDwxNCleKGU+Pj45fHQ8PDIzKX1mdW5jdGlvbiBoKHQsZSl7cmV0dXJuKHQ+Pj4xfGU8PDMxKV4odD4+Pjh8ZTw8MjQpXnQ+Pj43fWZ1bmN0aW9uIGQodCxlKXtyZXR1cm4odD4+PjF8ZTw8MzEpXih0Pj4+OHxlPDwyNCleKHQ+Pj43fGU8PDI1KX1mdW5jdGlvbiB5KHQsZSl7cmV0dXJuKHQ+Pj4xOXxlPDwxMyleKGU+Pj4yOXx0PDwzKV50Pj4+Nn1mdW5jdGlvbiB2KHQsZSl7cmV0dXJuKHQ+Pj4xOXxlPDwxMyleKGU+Pj4yOXx0PDwzKV4odD4+PjZ8ZTw8MjYpfWZ1bmN0aW9uIGcodCxlKXtyZXR1cm4gdD4+PjA8ZT4+PjA/MTowfXIoYSxpKSxhLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FoPTE3NzkwMzM3MDMsdGhpcy5fYmg9MzE0NDEzNDI3Nyx0aGlzLl9jaD0xMDEzOTA0MjQyLHRoaXMuX2RoPTI3NzM0ODA3NjIsdGhpcy5fZWg9MTM1OTg5MzExOSx0aGlzLl9maD0yNjAwODIyOTI0LHRoaXMuX2doPTUyODczNDYzNSx0aGlzLl9oaD0xNTQxNDU5MjI1LHRoaXMuX2FsPTQwODkyMzU3MjAsdGhpcy5fYmw9MjIyNzg3MzU5NSx0aGlzLl9jbD00MjcxMTc1NzIzLHRoaXMuX2RsPTE1OTU3NTAxMjksdGhpcy5fZWw9MjkxNzU2NTEzNyx0aGlzLl9mbD03MjU1MTExOTksdGhpcy5fZ2w9NDIxNTM4OTU0Nyx0aGlzLl9obD0zMjcwMzMyMDksdGhpc30sYS5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fdyxuPTB8dGhpcy5fYWgscj0wfHRoaXMuX2JoLGk9MHx0aGlzLl9jaCxvPTB8dGhpcy5fZGgscz0wfHRoaXMuX2VoLGE9MHx0aGlzLl9maCx3PTB8dGhpcy5fZ2gsTT0wfHRoaXMuX2hoLG09MHx0aGlzLl9hbCxfPTB8dGhpcy5fYmwsTD0wfHRoaXMuX2NsLGI9MHx0aGlzLl9kbCx4PTB8dGhpcy5fZWwsaj0wfHRoaXMuX2ZsLE49MHx0aGlzLl9nbCxTPTB8dGhpcy5faGwsRD0wO0Q8MzI7RCs9MillW0RdPXQucmVhZEludDMyQkUoNCpEKSxlW0QrMV09dC5yZWFkSW50MzJCRSg0KkQrNCk7Zm9yKDtEPDE2MDtEKz0yKXt2YXIgST1lW0QtMzBdLEE9ZVtELTMwKzFdLE89aChJLEEpLFQ9ZChBLEkpLEM9eShJPWVbRC00XSxBPWVbRC00KzFdKSxFPXYoQSxJKSx6PWVbRC0xNF0saz1lW0QtMTQrMV0sWT1lW0QtMzJdLFU9ZVtELTMyKzFdLFA9VCtrfDAsUj1PK3orZyhQLFQpfDA7Uj0oUj1SK0MrZyhQPVArRXwwLEUpfDApK1krZyhQPVArVXwwLFUpfDAsZVtEXT1SLGVbRCsxXT1QfWZvcih2YXIgUT0wO1E8MTYwO1ErPTIpe1I9ZVtRXSxQPWVbUSsxXTt2YXIgRj1mKG4scixpKSxCPWYobSxfLEwpLEc9bChuLG0pLFc9bChtLG4pLHE9cChzLHgpLEo9cCh4LHMpLFo9dVtRXSxWPXVbUSsxXSxYPWMocyxhLHcpLEg9Yyh4LGosTiksSz1TK0p8MCwkPU0rcStnKEssUyl8MDskPSgkPSgkPSQrWCtnKEs9SytIfDAsSCl8MCkrWitnKEs9SytWfDAsVil8MCkrUitnKEs9SytQfDAsUCl8MDt2YXIgdHQ9VytCfDAsZXQ9RytGK2codHQsVyl8MDtNPXcsUz1OLHc9YSxOPWosYT1zLGo9eCxzPW8rJCtnKHg9YitLfDAsYil8MCxvPWksYj1MLGk9cixMPV8scj1uLF89bSxuPSQrZXQrZyhtPUsrdHR8MCxLKXwwfXRoaXMuX2FsPXRoaXMuX2FsK218MCx0aGlzLl9ibD10aGlzLl9ibCtffDAsdGhpcy5fY2w9dGhpcy5fY2wrTHwwLHRoaXMuX2RsPXRoaXMuX2RsK2J8MCx0aGlzLl9lbD10aGlzLl9lbCt4fDAsdGhpcy5fZmw9dGhpcy5fZmwranwwLHRoaXMuX2dsPXRoaXMuX2dsK058MCx0aGlzLl9obD10aGlzLl9obCtTfDAsdGhpcy5fYWg9dGhpcy5fYWgrbitnKHRoaXMuX2FsLG0pfDAsdGhpcy5fYmg9dGhpcy5fYmgrcitnKHRoaXMuX2JsLF8pfDAsdGhpcy5fY2g9dGhpcy5fY2graStnKHRoaXMuX2NsLEwpfDAsdGhpcy5fZGg9dGhpcy5fZGgrbytnKHRoaXMuX2RsLGIpfDAsdGhpcy5fZWg9dGhpcy5fZWgrcytnKHRoaXMuX2VsLHgpfDAsdGhpcy5fZmg9dGhpcy5fZmgrYStnKHRoaXMuX2ZsLGopfDAsdGhpcy5fZ2g9dGhpcy5fZ2grdytnKHRoaXMuX2dsLE4pfDAsdGhpcy5faGg9dGhpcy5faGgrTStnKHRoaXMuX2hsLFMpfDB9LGEucHJvdG90eXBlLl9oYXNoPWZ1bmN0aW9uKCl7dmFyIHQ9by5hbGxvY1Vuc2FmZSg2NCk7ZnVuY3Rpb24gZShlLG4scil7dC53cml0ZUludDMyQkUoZSxyKSx0LndyaXRlSW50MzJCRShuLHIrNCl9cmV0dXJuIGUodGhpcy5fYWgsdGhpcy5fYWwsMCksZSh0aGlzLl9iaCx0aGlzLl9ibCw4KSxlKHRoaXMuX2NoLHRoaXMuX2NsLDE2KSxlKHRoaXMuX2RoLHRoaXMuX2RsLDI0KSxlKHRoaXMuX2VoLHRoaXMuX2VsLDMyKSxlKHRoaXMuX2ZoLHRoaXMuX2ZsLDQwKSxlKHRoaXMuX2doLHRoaXMuX2dsLDQ4KSxlKHRoaXMuX2hoLHRoaXMuX2hsLDU2KSx0fSx0LmV4cG9ydHM9YX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ImRhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsUEhOMlp5QjRiV3h1Y3owaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdk1qQXdNQzl6ZG1jaUlIaHRiRzV6T25oc2FXNXJQU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTh4T1RrNUwzaHNhVzVySWlCMmFXVjNRbTk0UFNJd0lEQWdOREEzSURFeE5pSStEUW9nSUR4a1pXWnpQZzBLSUNBZ0lEeHpkSGxzWlQ0TkNpQWdJQ0FnSUM1amJITXRNU0I3RFFvZ0lDQWdJQ0FnSUdOc2FYQXRjR0YwYURvZ2RYSnNLQ05qYkdsd0xWTlhYMVJOTFd4dloyOHRiMjR0WkdGeWF5azdEUW9nSUNBZ0lDQjlEUW9OQ2lBZ0lDQWdJQzVqYkhNdE1pQjdEUW9nSUNBZ0lDQWdJR1pwYkd3NklDTm1abVk3RFFvZ0lDQWdJQ0I5RFFvTkNpQWdJQ0FnSUM1amJITXRNeUI3RFFvZ0lDQWdJQ0FnSUdacGJHdzZJQ000TldWaE1tUTdEUW9nSUNBZ0lDQjlEUW9OQ2lBZ0lDQWdJQzVqYkhNdE5DQjdEUW9nSUNBZ0lDQWdJR1pwYkd3NklDTXhOek0yTkRjN0RRb2dJQ0FnSUNCOURRb2dJQ0FnUEM5emRIbHNaVDROQ2lBZ0lDQThZMnhwY0ZCaGRHZ2dhV1E5SW1Oc2FYQXRVMWRmVkUwdGJHOW5ieTF2Ymkxa1lYSnJJajROQ2lBZ0lDQWdJRHh5WldOMElIZHBaSFJvUFNJME1EY2lJR2hsYVdkb2REMGlNVEUySWk4K0RRb2dJQ0FnUEM5amJHbHdVR0YwYUQ0TkNpQWdQQzlrWldaelBnMEtJQ0E4WnlCcFpEMGlVMWRmVkUwdGJHOW5ieTF2Ymkxa1lYSnJJaUJqYkdGemN6MGlZMnh6TFRFaVBnMEtJQ0FnSUR4bklHbGtQU0pUVjE5SmJpMVFjbTlrZFdOMElpQjBjbUZ1YzJadmNtMDlJblJ5WVc1emJHRjBaU2d0TUM0ek1ERXBJajROQ2lBZ0lDQWdJRHh3WVhSb0lHbGtQU0pRWVhSb1h6STVNellpSUdSaGRHRXRibUZ0WlQwaVVHRjBhQ0F5T1RNMklpQmpiR0Z6Y3owaVkyeHpMVElpSUdROUlrMHpOVGt1TVRVc056QXVOamMwYUMwdU4xWTJOaTQ1T1RKb0xURXVNaloyTFM0MmFETXVNakU1ZGk0MlNETTFPUzR4TlZvaUx6NE5DaUFnSUNBZ0lEeHdZWFJvSUdsa1BTSlFZWFJvWHpJNU16Y2lJR1JoZEdFdGJtRnRaVDBpVUdGMGFDQXlPVE0zSWlCamJHRnpjejBpWTJ4ekxUSWlJR1E5SWswek5qTXVNakUzTERjd0xqWTNOQ3d6TmpFdU9UYzFMRFkzTGpGb0xTNHdNak54TGpBMUxqZ3VNRFVzTVM0ME9UUjJNaTR3T0ROb0xTNDJNelpXTmpZdU16a3hhQzQ1T0Rkc01TNHhPU3d6TGpRd04yZ3VNREUzYkRFdU1qSTFMVE11TkRBM2FDNDVPWFkwTGpJNE0wZ3pOalV1TVZZMk9DNDFOVFpqTUMwdU1qRXpMakF3TmkwdU5Ea3VNREUyTFM0NE16SnpMakF5TFM0MU5Ea3VNREk0TFM0Mk1qRm9MUzR3TWpOc0xURXVNamcyTERNdU5UY3hXaUl2UGcwS0lDQWdJQ0FnUEhCaGRHZ2dhV1E5SWxCaGRHaGZNamt6T0NJZ1pHRjBZUzF1WVcxbFBTSlFZWFJvSURJNU16Z2lJR05zWVhOelBTSmpiSE10TXlJZ1pEMGlUVFV3TGpNeU9DdzVOeTQyTmpsQk5EY3VOalF5TERRM0xqWTBNaXd3TERFc01TdzVOeTQ1TnpFc05UQXVNREkzTERRM0xqWTBNaXcwTnk0Mk5ESXNNQ3d3TERFc05UQXVNekk0TERrM0xqWTJPVm9pTHo0TkNpQWdJQ0FnSUR4d1lYUm9JR2xrUFNKUVlYUm9Yekk1TXpraUlHUmhkR0V0Ym1GdFpUMGlVR0YwYUNBeU9UTTVJaUJqYkdGemN6MGlZMnh6TFRNaUlHUTlJazAxTUM0ek1qZ3NOQzQzTmpsQk5EVXVNalU0TERRMUxqSTFPQ3d3TERFc01TdzFMakEzTERVd0xqQXlOeXcwTlM0eU5UZ3NORFV1TWpVNExEQXNNQ3d4TERVd0xqTXlPQ3cwTGpjMk9XMHdMVFF1TnpZNVlUVXdMakF5Tnl3MU1DNHdNamNzTUN3eExEQXNOVEF1TURJM0xEVXdMakF5TjBFMU1DNHdNamNzTlRBdU1ESTNMREFzTUN3d0xEVXdMak15T0N3d1dpSXZQZzBLSUNBZ0lDQWdQSEJoZEdnZ2FXUTlJbEJoZEdoZk1qazBNQ0lnWkdGMFlTMXVZVzFsUFNKUVlYUm9JREk1TkRBaUlHTnNZWE56UFNKamJITXROQ0lnWkQwaVRUTXhMamdzTXpNdU9EVTBZeTB1TVRVMExERXVOekV5TGpBMU9Dd3pMalE0TWkwdU1EVTNMRFV1TWpFellUUXlMalkyTlN3ME1pNDJOalVzTUN3d0xERXRMalk1TXl3MUxqRTFOaXc1TGpVekxEa3VOVE1zTUN3d0xERXROQzR4TERVdU9ESTVZelF1TURjNUxESXVOalUwTERRdU5UUXNOaTQzTnpFc05DNDRNU3d4TUM0NU5EWXVNVE0xTERJdU1qVXVNRGMzTERRdU5USXVNekE0TERZdU56VXlMakUzTXl3eExqY3pNUzQ0TkRZc01pNHhOelFzTWk0Mk16WXNNaTR5TXpFdU56TXVNRElzTVM0ME9Dd3dMREl1TXpJM0xEQldOelV1TXpOakxUVXVNamt1T1MwNUxqWTFOeTB1TmkweE1DNDNNelF0TlM0d056bGhNekF1TnpZc016QXVOellzTUN3d0xERXRMalkxTkMwMVl5MHVNVEUzTFRFdU56ZzVMakEzTmkwekxqVTNPQzB1TURVNExUVXVNelkzTFM0ek9EWXROQzQ1TURZdE1TNHdNaTAyTGpVMkxUVXVOekV6TFRZdU56a3hkaTAyTGpGQk9TNHhPVEVzT1M0eE9URXNNQ3d3TERFc01qQXVPU3cwTmk0NE1tTXlMalUzTnkwdU1UTTFMRE11TmpjMExTNDVNalFzTkM0eU16RXRNeTQwTmpOaE1qa3VNeXd5T1M0ekxEQXNNQ3d3TEM0ME9ERXROQzR6TWprc09ESXVNU3c0TWk0eExEQXNNQ3d4TEM0MkxUZ3VOREEyWXk0Mk56TXRNeTQ1T0RJc015NHhNell0TlM0NU1EWXNOeTR5TXpRdE5pNHhNemNzTVM0eE5UUXRMakExTnl3eUxqTXlOeXd3TERNdU5qVTFMREIyTlM0ME5qUmpMUzQxTlRndU1ETTRMVEV1TURNNUxqRXhOUzB4TGpVek9TNHhNVFZETXpJdU1qSTJMREk1TGprME9Td3pNaTR3TlRJc016RXVNRGcwTERNeExqZ3NNek11T0RVMFdtMDJMalF3Tml3eE1pNDJOVGhvTFM0d056ZGhNeTQxTVRVc015NDFNVFVzTUN3eExEQXRMak0wTml3M0xqQXlNV2d1TWpNeFlUTXVORFl4TERNdU5EWXhMREFzTUN3d0xETXVOalUxTFRNdU1qVXhWalV3TGpBNVlUTXVOVEl6TERNdU5USXpMREFzTUN3d0xUTXVORFl4TFRNdU5UYzRXbTB4TWk0d05qSXNNR0V6TGpNM015d3pMak0zTXl3d0xEQXNNQzB6TGpRNE1pd3pMakkxTVN3eExqYzVMREV1Tnprc01Dd3dMREFzTGpBeUxqTXlOeXd6TGpNc015NHpMREFzTUN3d0xETXVOVGM0TERNdU5EUXpMRE11TWpZekxETXVNall6TERBc01Dd3dMRE11TkRRekxUTXVOVFU0TERNdU16QTRMRE11TXpBNExEQXNNQ3d3TFRNdU5UVTNMVE11TkRZeldtMHhNaTR6TlRFc01HRXpMalU1TWl3ekxqVTVNaXd3TERBc01DMHpMalkxTlN3ekxqUTRNa0V6TGpVeU9Td3pMalV5T1N3d0xEQXNNQ3cyTWk0MUxEVXpMalV6TTJndU1ETTVZekV1TnpZNUxqTXdPU3d6TGpVMU9TMHhMalFzTXk0Mk56UXRNeTQwTmpKaE15NDFOekVzTXk0MU56RXNNQ3d3TERBdE15NDJMVE11TlRVNVdtMHhOaTQ1TkRndU1qZzRZeTB5TGpJek1pMHVNUzB6TGpNME9DMHVPRFEyTFRNdU9TMHlMamsyTW1FeU1TNDBORGNzTWpFdU5EUTNMREFzTUN3eExTNDJNelV0TkM0eE16WmpMUzR4TlRRdE1pNDFOemd0TGpFek5TMDFMakUzTlMwdU16QTRMVGN1TnpVekxTNDBMVFl1TVRFM0xUUXVPREk0TFRndU1qVXlMVEV4TGpJMU5DMDNMakU1TlhZMUxqTXhZekV1TURFNUxEQXNNUzQ0TURnc01Dd3lMall1TURFNUxERXVNelkyTGpBeE9Td3lMalF1TlRNNUxESXVOVE01TERJdU1EVTVMakV6TlN3eExqTTROUzR4TXpVc01pNDNPRGt1TWpjc05DNHhPVE11TWpZNUxESXVOemt1TkRJeUxEVXVOakU0TGprc09DNHpOamxCT0M0M01UVXNPQzQzTVRVc01Dd3dMREFzTnpNdU55dzFNQzR3TlRKakxUTXVOQ3d5TGpJNE9TMDBMalF3Tml3MUxqVTFPUzAwTGpVM09DdzVMakl6TkMwdU1Td3lMalV5TFM0eE5UUXNOUzR3TlRrdExqSTRPU3czTGpZdExqRXhOU3d5TGpNd09DMHVPVEl6TERNdU1EVTRMVE11TWpVeExETXVNVEUyTFM0Mk5UUXVNREU1TFRFdU1qZzVMakEzTnkweUxqQXhPUzR4TVRWMk5TNDBORFZqTVM0ek5qVXNNQ3d5TGpZeE5pNHdOemNzTXk0NE5qWXNNQ3d6TGpnNE5pMHVNak14TERZdU1qTXpMVEl1TVRFM0xEY3ROUzQ0T0RkQk5Ea3VNRGM1TERRNUxqQTNPU3d3TERBc01DdzNOU3cyTXk0MFl5NHhNelV0TVM0NU1qTXVNVEUyTFRNdU9EWTJMak13T0MwMUxqYzNNUzR5T0RrdE1pNDVPRElzTVM0Mk5UVXROQzR5TVRNc05DNDJNell0TkM0MFlUUXVNRE0zTERRdU1ETTNMREFzTUN3d0xDNDRNamd0TGpFNU1uWXROaTR4WXkwdU5TMHVNRFU0TFM0NE5ETXRMakV4TlMweExqSXdPQzB1TVRNMVdpSXZQZzBLSUNBZ0lDQWdQSEJoZEdnZ2FXUTlJbEJoZEdoZk1qazBNU0lnWkdGMFlTMXVZVzFsUFNKUVlYUm9JREk1TkRFaUlHTnNZWE56UFNKamJITXRNaUlnWkQwaVRURTFNaTR5TnpNc05UZ3VNVEl5WVRFeExqSXlPQ3d4TVM0eU1qZ3NNQ3d3TERFdE5DNHpPRFFzT1M0ME1qUnhMVFF1TXpnekxETXVNemd5TFRFeExqa3NNeTR6T0RJdE9DNHhOQ3d3TFRFeUxqVXlOQzB5TGpGV05qTXVOMkV6TWk0NUxETXlMamtzTUN3d0xEQXNOaTR4TXpjc01TNDROemtzTXpJdU15d3pNaTR6TERBc01Dd3dMRFl1TlRjMUxqWTRPWEUxTGpNeU1pd3dMRGd1TURFMUxUSXVNREpoTmk0Mk1qWXNOaTQyTWpZc01Dd3dMREFzTWk0Mk9USXROUzQyTWl3M0xqSXlNaXczTGpJeU1pd3dMREFzTUMwdU9UVTBMVE11T1N3NExqZzROU3c0TGpnNE5Td3dMREFzTUMwekxqRTVOQzB5TGpnc05EUXVOak0wTERRMExqWXpOQ3d3TERBc01DMDJMamd4TFRJdU9URXhjUzAyTGpNNE55MHlMakk0TmkwNUxqRXlOaTAxTGpReE4yRXhNUzQ1TlRVc01URXVPVFUxTERBc01Dd3hMVEl1TnpRdE9DNHhOekpCTVRBdU1UWTBMREV3TGpFMk5Dd3dMREFzTVN3eE1qZ3VNRE01TERJM2NUTXVPVGMzTFRNdU1UTXhMREV3TGpVeUxUTXVNVE14WVRNeExETXhMREFzTUN3eExERXlMalUxTlN3eUxqVk1NVFE1TGpRMU5Td3pNV0V5T0M0ek9ESXNNamd1TXpneUxEQXNNQ3d3TFRFeExqQXlNUzB5TGpNNExERXdMalkyT0N3eE1DNDJOamdzTUN3d0xEQXROaTQyTURZc01TNDRNVFlzTlM0NU9EUXNOUzQ1T0RRc01Dd3dMREF0TWk0ek9DdzFMakEwTVN3M0xqY3lNaXczTGpjeU1pd3dMREFzTUN3dU9EYzNMRE11T1N3NExqSTBNaXc0TGpJME1pd3dMREFzTUN3eUxqazFPU3d5TGpjNE5pd3pOaTQzTERNMkxqY3NNQ3d3TERBc05pNHpOekVzTWk0NGNUY3VNaXd5TGpVMk5pdzVMamt4TERVdU5URkJNVEF1T0RRc01UQXVPRFFzTUN3d0xERXNNVFV5TGpJM015dzFPQzR4TWpKYUlpOCtEUW9nSUNBZ0lDQThjR0YwYUNCcFpEMGlVR0YwYUY4eU9UUXlJaUJrWVhSaExXNWhiV1U5SWxCaGRHZ2dNamswTWlJZ1kyeGhjM005SW1Oc2N5MHlJaUJrUFNKTk1UZzFMakk0T0N3M01DNHpMREUzT1N3MU1DNHhOM0V0TGpVNU5DMHhMamcwT0MweUxqSXlNaTA0TGpNNU1XZ3RMakkxTVhFdE1TNHlOVElzTlM0ME56a3RNaTR4T1RJc09DNDBOVE5NTVRZM0xqZzBPU3czTUM0emFDMDJMakF4TVd3dE9TNHpOakV0TXpRdU16RTFhRFV1TkRRM2NUTXVNekU0TERFeUxqa3pNU3cxTGpBMU55d3hPUzQyT1ROaE9EQXVNVEV5TERnd0xqRXhNaXd3TERBc01Td3hMams0T0N3NUxqRXhNV2d1TWpWeExqTTBOUzB4TGpjNE5Td3hMakV4TWkwMExqWXhPSFF4TGpNekxUUXVORGt6YkRZdU1qazBMVEU1TGpZNU0yZzFMall6Tld3MkxqRXpOeXd4T1M0Mk9UTmhOall1TXpZNUxEWTJMak0yT1N3d0xEQXNNU3d5TGpNM09TdzVMakEwT0dndU1qVXhZVE16TGpFMk15d3pNeTR4TmpNc01Dd3dMREVzTGpZM015MHpMalEzTlhFdU5UUTRMVEl1TXpRM0xEWXVOVEk0TFRJMUxqSTJObWcxTGpNNE5Vd3hPVEV1TkRVMkxEY3dMak5hSWk4K0RRb2dJQ0FnSUNBOGNHRjBhQ0JwWkQwaVVHRjBhRjh5T1RReklpQmtZWFJoTFc1aGJXVTlJbEJoZEdnZ01qazBNeUlnWTJ4aGMzTTlJbU5zY3kweUlpQmtQU0pOTWpJMUxqRXhOU3czTUM0emJDMHhMakF6TXkwMExqZzROV2d0TGpJMVlURTBMalEwTml3eE5DNDBORFlzTUN3d0xERXROUzR4TVRrc05DNHpOamdzTVRVdU5qQTRMREUxTGpZd09Dd3dMREFzTVMwMkxqTTNNaXd4TGpFME0zRXROUzR4TERBdE9DMHlMall6ZEMweUxqa3ROeTQwT0ROeE1DMHhNQzQwTERFMkxqWXlOaTB4TUM0NWJEVXVPREl6TFM0eE9EaFdORGN1Tm5Fd0xUUXVNRE00TFRFdU56TTRMVFV1T1RZMFZESXhOaTQyTERNNUxqY3hNMkV5TWk0Mk16TXNNakl1TmpNekxEQXNNQ3d3TFRrdU56QTJMREl1TmpOc0xURXVOaTB6TGprM04yRXlOQzQwTXpjc01qUXVORE0zTERBc01Dd3hMRFV1TlRVM0xUSXVNVFlzTWpRdU1EVTJMREkwTGpBMU5pd3dMREFzTVN3MkxqQTFPQzB1TnpnemNUWXVNVE0yTERBc09TNHhMREl1TnpJMGRESXVPVFU1TERndU56TTFWamN3TGpOYWJTMHhNUzQzTkRFdE15NDJOak5CTVRBdU5UUTVMREV3TGpVME9Td3dMREFzTUN3eU1qRXNOak11T1RjM1lUa3VPRFExTERrdU9EUTFMREFzTUN3d0xESXVOemN4TFRjdU5EVXhkaTB6TGpGc0xUVXVNaTR5TVRseExUWXVNaTR5TVRrdE9DNDVNemtzTVM0NU1qWmhOUzQ0TERVdU9Dd3dMREFzTUMweUxqYzBMRFV1TXpBMkxEVXVNelUwTERVdU16VTBMREFzTUN3d0xERXVOekEzTERRdU1qa3NOeTR3T0RFc055NHdPREVzTUN3d0xEQXNOQzQzTnpVc01TNDBOekphSWk4K0RRb2dJQ0FnSUNBOGNHRjBhQ0JwWkQwaVVHRjBhRjh5T1RRMElpQmtZWFJoTFc1aGJXVTlJbEJoZEdnZ01qazBOQ0lnWTJ4aGMzTTlJbU5zY3kweUlpQmtQU0pOTWpZMExqWXNNelV1T1RnM2RqTXVNamczYkMwMkxqTTFOaTQzTlRKaE1URXVNVFlzTVRFdU1UWXNNQ3d3TERFc01pNHlOVFVzTmk0NE5UWXNNVEF1TVRRNExERXdMakUwT0N3d0xEQXNNUzB6TGpRME5DdzRMakEwTjNFdE15NDBORFFzTXkwNUxqUTFOaXd6WVRFMUxqY3pOQ3d4TlM0M016UXNNQ3d3TERFdE1pNDRPQzB1TWpWUk1qUXhMalFzTlRrdU5ETTRMREkwTVM0MExEWXlMakZoTWk0eU5ESXNNaTR5TkRJc01Dd3dMREFzTVM0eE5Ua3NNaTR3T0RJc09DNDBOVFlzT0M0ME5UWXNNQ3d3TERBc015NDVOell1TmpjemFEWXVNRGMwY1RVdU5UY3pMREFzT0M0MU5qTXNNaTR6TkRoaE9DNHhOVGdzT0M0eE5UZ3NNQ3d3TERFc01pNDVPU3cyTGpneU5TdzVMamMwTXl3NUxqYzBNeXd3TERBc01TMDBMalUzTVN3NExqWTRPSEV0TkM0MU56SXNNaTQ1T0RrdE1UTXVNek00TERJdU9Ua3ROaTQzTXpJc01DMHhNQzR6TnprdE1pNDFZVGd1TURnM0xEZ3VNRGczTERBc01Dd3hMVE11TmpRM0xUY3VNRGMyTERjdU9UUTJMRGN1T1RRMkxEQXNNQ3d4TERJdE5TNDBNVGNzTVRBdU1qRXhMREV3TGpJeE1Td3dMREFzTVN3MUxqWXpOaTB6TGpFc05TNDBNamtzTlM0ME1qa3NNQ3d3TERFdE1pNHlNRGN0TVM0NE5EY3NOQzQ0T1N3MExqZzVMREFzTUN3eExTNDRPVE10TWk0NU1USXNOUzQxTXl3MUxqVXpMREFzTUN3eExERXRNeTR5T0Rnc01UQXVOVEk1TERFd0xqVXlPU3d3TERBc01Td3pMakUyTWkweUxqY3lNeXc1TGpJM05TdzVMakkzTlN3d0xEQXNNUzAwTGpNek5pMHpMamN5Tml3eE1DNDVORFVzTVRBdU9UUTFMREFzTUN3eExURXVOamMxTFRZdU1ERXljVEF0TlM0Mk16UXNNeTR6T0RJdE9DNDJPRGgwT1M0MU9DMHpMakExTW1FeE55NDBNemtzTVRjdU5ETTVMREFzTUN3eExEUXVPRFV6TGpZeU5scE5Nak0zTGpJek15dzNOaTR3TmpKaE5DNDJOaXcwTGpZMkxEQXNNQ3d3TERJdU16UTRMRFF1TWpJM0xERXlMamszTXl3eE1pNDVOek1zTUN3d0xEQXNOaTQzTXpJc01TNDBOSEUyTGpVME15d3dMRGt1TmprdE1TNDVOVFpoTlM0NU9USXNOUzQ1T1RJc01Dd3dMREFzTXk0eE5EY3ROUzR6TURkeE1DMHlMamM0TnkweExqY3lNeTB6TGpnMk4zUXROaTQwT0RFdE1TNHdPR2d0Tmk0eU0yRTRMakl3TlN3NExqSXdOU3d3TERBc01DMDFMalV4TERFdU5qa3NOaTR3TkRNc05pNHdORE1zTUN3d0xEQXRNUzQ1TnpNc05DNDROVE5hYlRJdU9ERTRMVEk1TGpBNE5tRTJMams0TkN3MkxqazROQ3d3TERBc01Dd3lMakF6TlN3MUxqUTBPQ3c0TGpFeU15dzRMakV5TXl3d0xEQXNNQ3cxTGpZMk55d3hMamcwTjNFM0xqWXdPQ3d3TERjdU5qQTRMVGN1TXpnNUxEQXROeTQzTXpNdE55NDNMVGN1TnpNellUY3VOakk0TERjdU5qSTRMREFzTUN3d0xUVXVOak0xTERFdU9UY3ljUzB4TGprM05pd3hMamszTXkweExqazNOU3cxTGpnMU5Wb2lMejROQ2lBZ0lDQWdJRHh3WVhSb0lHbGtQU0pRWVhSb1h6STVORFVpSUdSaGRHRXRibUZ0WlQwaVVHRjBhQ0F5T1RRMUlpQmpiR0Z6Y3owaVkyeHpMVElpSUdROUlrMHlPVGt1TVRNMkxETTFMams0TjNZekxqSTROMnd0Tmk0ek5UWXVOelV5WVRFeExqRTJPQ3d4TVM0eE5qZ3NNQ3d3TERFc01pNHlOVFFzTmk0NE5UWXNNVEF1TVRRMUxERXdMakUwTlN3d0xEQXNNUzB6TGpRME5DdzRMakEwTjNFdE15NDBORFFzTXkwNUxqUTFOU3d6WVRFMUxqY3pOQ3d4TlM0M016UXNNQ3d3TERFdE1pNDRPQzB1TWpWeExUTXVNeklzTVM0M05UUXRNeTR6TVRrc05DNDBNVFZoTWk0eU5ETXNNaTR5TkRNc01Dd3dMREFzTVM0eE5UZ3NNaTR3T0RJc09DNDBOVGtzT0M0ME5Ua3NNQ3d3TERBc015NDVOell1TmpjemFEWXVNRGMwY1RVdU5UYzBMREFzT0M0MU5qTXNNaTR6TkRoaE9DNHhOVGdzT0M0eE5UZ3NNQ3d3TERFc01pNDVPU3cyTGpneU5TdzVMamMwTXl3NUxqYzBNeXd3TERBc01TMDBMalUzTVN3NExqWTRPSEV0TkM0MU55d3lMams0T1MweE15NHpNemNzTWk0NU9TMDJMamN6TWl3d0xURXdMak0zT1MweUxqVmhPQzR3T0Rnc09DNHdPRGdzTUN3d0xERXRNeTQyTkRndE55NHdOellzTnk0NU5EY3NOeTQ1TkRjc01Dd3dMREVzTWkwMUxqUXhOeXd4TUM0eU1EY3NNVEF1TWpBM0xEQXNNQ3d4TERVdU5qTTJMVE11TVN3MUxqUXpNaXcxTGpRek1pd3dMREFzTVMweUxqSXdPQzB4TGpnME55dzBMamc0T1N3MExqZzRPU3d3TERBc01TMHVPRGt5TFRJdU9URXlMRFV1TlRNc05TNDFNeXd3TERBc01Td3hMVE11TWpnNExERXdMalV5T1N3eE1DNDFNamtzTUN3d0xERXNNeTR4TmpJdE1pNDNNak1zT1M0eU56RXNPUzR5TnpFc01Dd3dMREV0TkM0ek16WXRNeTQzTWpZc01UQXVPVFExTERFd0xqazBOU3d3TERBc01TMHhMalkzTlMwMkxqQXhNbkV3TFRVdU5qTTBMRE11TXpneExUZ3VOamc0ZERrdU5UZ3hMVE11TURVeVlURTNMalEwTkN3eE55NDBORFFzTUN3d0xERXNOQzQ0TlRNdU5qSTJXazB5TnpFdU56Y3lMRGMyTGpBMk1tRTBMalkxT0N3MExqWTFPQ3d3TERBc01Dd3lMak0wT0N3MExqSXlOeXd4TWk0NU5qa3NNVEl1T1RZNUxEQXNNQ3d3TERZdU56TXhMREV1TkRSeE5pNDFORFFzTUN3NUxqWTVNUzB4TGprMU5tRTFMams1TXl3MUxqazVNeXd3TERBc01Dd3pMakUwTmkwMUxqTXdOM0V3TFRJdU56ZzNMVEV1TnpJeUxUTXVPRFkzZEMwMkxqUTRNUzB4TGpBNGFDMDJMakl6WVRndU1qQTRMRGd1TWpBNExEQXNNQ3d3TFRVdU5URXhMREV1TmpsQk5pNHdORElzTmk0d05ESXNNQ3d3TERBc01qY3hMamMzTWl3M05pNHdOakphYlRJdU9ERTRMVEk1TGpBNE5tRTJMams0TkN3MkxqazROQ3d3TERBc01Dd3lMakF6TlN3MUxqUTBPQ3c0TGpFeU1TdzRMakV5TVN3d0xEQXNNQ3cxTGpZMk55d3hMamcwTjNFM0xqWXdOeXd3TERjdU5qQTRMVGN1TXpnNUxEQXROeTQzTXpNdE55NDNMVGN1TnpNellUY3VOakk1TERjdU5qSTVMREFzTUN3d0xUVXVOak0xTERFdU9UY3ljUzB4TGprM05Td3hMamszTXkweExqazNOU3cxTGpnMU5Wb2lMejROQ2lBZ0lDQWdJRHh3WVhSb0lHbGtQU0pRWVhSb1h6STVORFlpSUdSaGRHRXRibUZ0WlQwaVVHRjBhQ0F5T1RRMklpQmpiR0Z6Y3owaVkyeHpMVElpSUdROUlrMHpNVFl1TnpjNExEY3dMamt5T0hFdE55NDJNRGdzTUMweE1pNHdNRGN0TkM0Mk16UjBMVFF1TkMweE1pNDROamh4TUMwNExqTXNOQzR3T0RZdE1UTXVNVGd4WVRFekxqVTNNeXd4TXk0MU56TXNNQ3d3TERFc01UQXVPVGMwTFRRdU9EZzBRVEV5TGprek9Dd3hNaTQ1TXpnc01Dd3dMREVzTXpJMUxqWXpPQ3d6T1M0MmNUTXVOell5TERRdU1qUTNMRE11TnpZeUxERXhMakoyTXk0eU9EZElNekExTGpjMU4zRXVNVFUyTERZdU1EUTBMRE11TURVekxEa3VNVGMwZERndU1UVTJMRE11TVRNeFlUSTNMall6TXl3eU55NDJNek1zTUN3d0xEQXNNVEF1T1RVNExUSXVNekUzZGpRdU5qTTBZVEkzTGpVc01qY3VOU3d3TERBc01TMDFMakl4TXl3eExqY3dOaXd5T1M0eU5URXNNamt1TWpVeExEQXNNQ3d4TFRVdU9UTXpMalV4TTFwdExURXVOREE1TFRNeExqSXhOV0U0TGpRNE9TdzRMalE0T1N3d0xEQXNNQzAyTGpVNU1Td3lMalk1TWl3eE1pNDBNVFlzTVRJdU5ERTJMREFzTUN3d0xUSXVPU3czTGpRMU1tZ3hOeTQ1TkhFd0xUUXVPVEUyTFRJdU1Ua3hMVGN1TlROaE55NDNNVFFzTnk0M01UUXNNQ3d3TERBdE5pNHlOVGd0TWk0Mk1UUmFJaTgrRFFvZ0lDQWdJQ0E4Y0dGMGFDQnBaRDBpVUdGMGFGOHlPVFEzSWlCa1lYUmhMVzVoYldVOUlsQmhkR2dnTWprME55SWdZMnhoYzNNOUltTnNjeTB5SWlCa1BTSk5NelV3TGprc016VXVNell4WVRJd0xqTTRMREl3TGpNNExEQXNNQ3d4TERRdU1TNHpOelZzTFM0M01qRXNOQzQ0TWpKaE1UY3VOekV5TERFM0xqY3hNaXd3TERBc01DMHpMamMxTnkwdU5EZEJPUzR4TkRJc09TNHhORElzTUN3d0xEQXNNelF6TGpRc05ETXVORGRoTVRJdU16STNMREV5TGpNeU55d3dMREFzTUMweUxqazFPU3c0TGpReU1sWTNNQzR6YUMwMUxqSldNelV1T1RnM2FEUXVNamxzTGpZc05pNHpOVFpvTGpJMVlURTFMakEzTWl3eE5TNHdOeklzTUN3d0xERXNOQzQyTFRVdU1UWTJMREV3TGpNMU5pd3hNQzR6TlRZc01Dd3dMREVzTlM0NU1Ua3RNUzQ0TVRaYUlpOCtEUW9nSUNBZ0lDQThjR0YwYUNCcFpEMGlVR0YwYUY4eU9UUTRJaUJrWVhSaExXNWhiV1U5SWxCaGRHZ2dNamswT0NJZ1kyeGhjM005SW1Oc2N5MHlJaUJrUFNKTk1qVTFMamcxTnl3NU5pNDJNemh6TFRNdU5ETXRMak01TVMwMExqZzFMUzR6T1RGakxUSXVNRFU0TERBdE15NHhNVEV1TnpNMUxUTXVNVEV4TERJdU1UZ3NNQ3d4TGpVMk9DNDRPRElzTVM0NU16VXNNeTQzTkRnc01pNDNNVGtzTXk0MU1qY3VPVGdzTkM0NExERXVPVEV4TERRdU9DdzBMamMzTnl3d0xETXVOamMxTFRJdU15dzFMakkyTnkwMUxqWXhMRFV1TWpZM1lUTTFMalk0Tnl3ek5TNDJPRGNzTUN3d0xERXROUzQwT0RjdExqWTJNbXd1TWpjdE1pNHhPSE16TGpNd05pNDBOREVzTlM0d05EWXVORFF4WXpJdU1EZ3lMREFzTXk0d016Y3RMamt6TVN3ekxqQXpOeTB5TGpjc01DMHhMalF5TVMwdU56VTVMVEV1T1RFdE15NHpNekV0TWk0MU1qTXRNeTQyTWpZdExqa3pMVFV1TVRrekxUSXVNRE16TFRVdU1Ua3pMVFF1T1RRNExEQXRNeTR6T0RFc01pNHlNamt0TkM0M056WXNOUzQxT0RVdE5DNDNOelpoTXpjdU1pd3pOeTR5TERBc01Dd3hMRFV1TXpFMUxqVTROMW9pTHo0TkNpQWdJQ0FnSUR4d1lYUm9JR2xrUFNKUVlYUm9Yekk1TkRraUlHUmhkR0V0Ym1GdFpUMGlVR0YwYUNBeU9UUTVJaUJqYkdGemN6MGlZMnh6TFRJaUlHUTlJazB5TmpJdU9UWTNMRGswTGpFMFNESTJOeTQzYkRNdU56UTRMREV6TGpFd05rd3lOelV1TWl3NU5DNHhOR2cwTGpjMU1uWXhOaTQzT0VneU56Y3VNbFk1Tmk0ME1tZ3RMakUwTld3dE5DNHhPVEVzTVRNdU9ERTJhQzB5TGpnME1rd3lOalV1T0RNeExEazJMalF5YUMwdU1UUTFkakUwTGpWb0xUSXVOekU1V2lJdlBnMEtJQ0FnSUNBZ1BIQmhkR2dnYVdROUlsQmhkR2hmTWprMU1DSWdaR0YwWVMxdVlXMWxQU0pRWVhSb0lESTVOVEFpSUdOc1lYTnpQU0pqYkhNdE1pSWdaRDBpVFRNeU1pNHdOVGNzT1RRdU1UUklNek0wTGpOMk1pNDBNalZvTFRRdU56STRWakV4TUM0NU1tZ3RNaTQzTkROV09UWXVOVFkxYUMwMExqYzNOMW9pTHo0TkNpQWdJQ0FnSUR4d1lYUm9JR2xrUFNKUVlYUm9Yekk1TlRFaUlHUmhkR0V0Ym1GdFpUMGlVR0YwYUNBeU9UVXhJaUJqYkdGemN6MGlZMnh6TFRJaUlHUTlJazB6TkRZdU1UTTNMRGswTGpFMFl6TXVNek15TERBc05TNHhNaXd4TGpJME9TdzFMakV5TERRdU16WXhMREFzTWk0d016TXRMall6Tnl3ekxqQXpOeTB4TGprNE5Dd3pMamMzTWl3eExqUTBOUzQxTmpNc01pNDBMREV1TlRreUxESXVOQ3d6TGprc01Dd3pMalF6TFRJdU1EZ3hMRFF1TnpVeUxUVXVNek01TERRdU56VXlhQzAyTGpVMk5sWTVOQzR4TkZwdExUTXVOalVzTWk0ek5USjJOQzQ0YURNdU5tTXhMalkyTml3d0xESXVOQzB1T0RNeUxESXVOQzB5TGpRM05Dd3dMVEV1TmpFM0xTNDRNek10TWk0ek1qY3RNaTQxTFRJdU16STNXbTB3TERjdU1YWTBMamszTTJnekxqZGpNUzQyT0Rrc01Dd3lMalk1TkMwdU5UTTVMREl1TmprMExUSXVOVFE0TERBdE1TNDVNVEV0TVM0ME1qRXRNaTQwTWpVdE1pNDNORFF0TWk0ME1qVmFJaTgrRFFvZ0lDQWdJQ0E4Y0dGMGFDQnBaRDBpVUdGMGFGOHlPVFV5SWlCa1lYUmhMVzVoYldVOUlsQmhkR2dnTWprMU1pSWdZMnhoYzNNOUltTnNjeTB5SWlCa1BTSk5NelU0TGpReE5DdzVOQzR4TkVnek5qbDJNaTR6Tnpkb0xUY3VPRFkwZGpRdU56VXhhRFl1TXprMFZqRXdNeTQyYUMwMkxqTTVOSFkwTGpreU5FZ3pOamwyTWk0MFNETTFPQzQwTVRSYUlpOCtEUW9nSUNBZ0lDQThjR0YwYUNCcFpEMGlVR0YwYUY4eU9UVXpJaUJrWVhSaExXNWhiV1U5SWxCaGRHZ2dNamsxTXlJZ1kyeGhjM005SW1Oc2N5MHlJaUJrUFNKTk16YzRMamMwTnl3NU5DNHhOR2cxTGpReE5HdzBMakUyTkN3eE5pNDNPR2d0TWk0M05EUk1NemcwTGpNME1pd3hNRFpvTFRVdU56YzNiQzB4TGpJek9TdzBMamt5TTJndE1pNDNNVGxhYlM0ek5qRXNPUzQwTlRab05DNDNNRGhzTFRFdU56TTNMVGN1TVRjNGFDMHhMakl5TlZvaUx6NE5DaUFnSUNBZ0lEeHdZWFJvSUdsa1BTSlFZWFJvWHpJNU5UUWlJR1JoZEdFdGJtRnRaVDBpVUdGMGFDQXlPVFUwSWlCamJHRnpjejBpWTJ4ekxUSWlJR1E5SWswek9UY3VNU3d4TURVdU9UUTNkalF1T1RjemFDMHlMamN4T1ZZNU5DNHhOR2cyTGpNM1l6TXVOeXd3TERVdU5qZ3pMREl1TVRJc05TNDJPRE1zTlM0NE5ETXNNQ3d5TGpNM05pMHVPVFUyTERRdU5URTVMVEl1TnpRMExEVXVNelV5YkRJdU56WTVMRFV1TlRnMVNEUXdNeTQwTjJ3dE1pNDBNall0TkM0NU56TmFiVE11TmpVeExUa3VORFUxU0RNNU55NHhkamN1TVdnekxqZGpNaTR3TlRjc01Dd3lMamcwTVMweExqZzFMREl1T0RReExUTXVOVGc1TERBdE1TNDVMUzQ1TXpRdE15NDFNVEV0TWk0NE9UUXRNeTQxTVRGYUlpOCtEUW9nSUNBZ0lDQThjR0YwYUNCcFpEMGlVR0YwYUY4eU9UVTFJaUJrWVhSaExXNWhiV1U5SWxCaGRHZ2dNamsxTlNJZ1kyeGhjM005SW1Oc2N5MHlJaUJrUFNKTk1qa3dMakF4TXl3NU5DNHhOR2cxTGpReE0ydzBMakUyTkN3eE5pNDNPR2d0TWk0M05ETk1NamsxTGpZd09Dd3hNRFpvTFRVdU56YzNiQzB4TGpJek9TdzBMamt5TTJndE1pNDNNVGxhYlM0ek5qRXNPUzQwTlRab05DNDNNRGRzTFRFdU56TTNMVGN1TVRjNGFDMHhMakl5TlZvaUx6NE5DaUFnSUNBZ0lEeHdZWFJvSUdsa1BTSlFZWFJvWHpJNU5UWWlJR1JoZEdFdGJtRnRaVDBpVUdGMGFDQXlPVFUySWlCamJHRnpjejBpWTJ4ekxUSWlJR1E5SWswek1EZ3VNell5TERFd05TNDVORGQyTkM0NU56Tm9MVEl1TnpFNVZqazBMakUwYURZdU16WTVZek11Tnl3d0xEVXVOamd6TERJdU1USXNOUzQyT0RNc05TNDRORE1zTUN3eUxqTTNOaTB1T1RVMUxEUXVOVEU1TFRJdU56UXpMRFV1TXpVeWJESXVOelk0TERVdU5UZzFhQzB5TGprNE9Xd3RNaTQwTWpVdE5DNDVOek5hYlRNdU5qVXRPUzQwTlRWb0xUTXVOalYyTnk0eGFETXVOMk15TGpBMU9Dd3dMREl1T0RReExURXVPRFVzTWk0NE5ERXRNeTQxT0RsRE16RTBMamtzT1RndU1Td3pNVE11T1RjeUxEazJMalE1TWl3ek1USXVNREV5TERrMkxqUTVNbG9pTHo0TkNpQWdJQ0FnSUR4d1lYUm9JR2xrUFNKUVlYUm9Yekk1TlRjaUlHUmhkR0V0Ym1GdFpUMGlVR0YwYUNBeU9UVTNJaUJqYkdGemN6MGlZMnh6TFRJaUlHUTlJazB4TXpBdU5qQTJMREV3Tnk0Mk5ETmhNeTR3TWl3ekxqQXlMREFzTUN3eExURXVNVGdzTWk0MU16Y3NOUzR4TVRNc05TNHhNVE1zTUN3d0xERXRNeTR5TGpreExEZ3VNRE1zT0M0d015d3dMREFzTVMwekxqTTNNUzB1TlRZMGRpMHhMak00TTJFNExqYzVNeXc0TGpjNU15d3dMREFzTUN3eExqWTFNaTQxTURZc09DNDJOeklzT0M0Mk56SXNNQ3d3TERBc01TNDNOeTR4T0RZc015NDFOalVzTXk0MU5qVXNNQ3d3TERBc01pNHhOVGN0TGpVME5Dd3hMamM0TXl3eExqYzRNeXd3TERBc01Dd3VOekkxTFRFdU5URXlMREV1T1RRM0xERXVPVFEzTERBc01Dd3dMUzR5TlRjdE1TNHdOU3d5TGpNNU15d3lMak01TXl3d0xEQXNNQzB1T0RZdExqYzFOQ3d4TWk0eE56RXNNVEl1TVRjeExEQXNNQ3d3TFRFdU9ETXpMUzQzT0RRc05TNDRORElzTlM0NE5ESXNNQ3d3TERFdE1pNDBOVFl0TVM0ME5UZ3NNeTR5TVRNc015NHlNVE1zTUN3d0xERXRMamN6T0MweUxqSXNNaTQzTXpZc01pNDNNellzTUN3d0xERXNNUzR3TnpFdE1pNHlOamNzTkM0ME5EUXNOQzQwTkRRc01Dd3dMREVzTWk0NE16RXRMamcwTXl3NExqTTBNU3c0TGpNME1Td3dMREFzTVN3ekxqTTRMalkzTld3dExqUTBOeXd4TGpJME4yRTNMall6T1N3M0xqWXpPU3d3TERBc01DMHlMamsyTmkwdU5qUXhMREl1T0RjNExESXVPRGM0TERBc01Dd3dMVEV1TnpjNUxqUTRPU3d4TGpZeE1pd3hMall4TWl3d0xEQXNNQzB1TmpRc01TNHpOVGNzTWk0d09ERXNNaTR3T0RFc01Dd3dMREFzTGpJek5pd3hMakEwT1N3eUxqSXpNU3d5TGpJek1Td3dMREFzTUN3dU9DNDNOU3c1TGpnM09DdzVMamczT0N3d0xEQXNNQ3d4TGpjeE5TNDNOVFFzTmk0NExEWXVPQ3d3TERBc01Td3lMalkyTnl3eExqUTRNeXd5TGpreE9Td3lMamt4T1N3d0xEQXNNU3d1TnpJekxESXVNRFUzV2lJdlBnMEtJQ0FnSUNBZ1BIQmhkR2dnYVdROUlsQmhkR2hmTWprMU9DSWdaR0YwWVMxdVlXMWxQU0pRWVhSb0lESTVOVGdpSUdOc1lYTnpQU0pqYkhNdE1pSWdaRDBpVFRFek5DNDBORGNzTVRBeExqWTROblkxTGprNU1XRXlMalF4TVN3eUxqUXhNU3d3TERBc01Dd3VOVEUxTERFdU5qZzJMREl1TURrc01pNHdPU3d3TERBc01Dd3hMall3T1M0MU5UWXNNaTQyTWprc01pNDJNamtzTUN3d0xEQXNNaTR4TWkwdU56a3lMRFFzTkN3d0xEQXNNQ3d1TmpjdE1pNDFPRGQyTFRRdU9EVTBhREV1TkhZNUxqSXpOa2d4TXprdU5td3RMakl0TVM0eU16bG9MUzR3TnpWaE1pNDNPVE1zTWk0M09UTXNNQ3d3TERFdE1TNHhPVE1zTVM0d05EVXNOQ3cwTERBc01Dd3hMVEV1TnpRdU16WXlMRE11TlRJNUxETXVOVEk1TERBc01Dd3hMVEl1TlRJMExTNDRMRE11TkRBNUxETXVOREE1TERBc01Dd3hMUzQ0TXprdE1pNDFOakoyTFRZdU1EUXlXaUl2UGcwS0lDQWdJQ0FnUEhCaGRHZ2dhV1E5SWxCaGRHaGZNamsxT1NJZ1pHRjBZUzF1WVcxbFBTSlFZWFJvSURJNU5Ua2lJR05zWVhOelBTSmpiSE10TWlJZ1pEMGlUVEUwT0M0eU1EWXNNVEV4TGpBNVlUTXVPVGt6TERNdU9Ua3pMREFzTUN3eExURXVOalEzTFM0ek16TXNNeTR4TERNdU1Td3dMREFzTVMweExqSTFNaTB4TGpBeU0yZ3RMakZoTVRJdU1qWTFMREV5TGpJMk5Td3dMREFzTVN3dU1Td3hMalV6TTNZekxqaG9MVEV1TkZZeE1ERXVOamcyYURFdU1UTTNiQzR4T1RRc01TNHlOalJvTGpBMk4yRXpMakkxTnl3ekxqSTFOeXd3TERBc01Td3hMakkxTmkweExqRXNNeTQ0TXpFc015NDRNekVzTUN3d0xERXNNUzQyTkRNdExqTXpOeXd6TGpReE15d3pMalF4TXl3d0xEQXNNU3d5TGpnek5pd3hMakkxTml3MkxqWTRNeXcyTGpZNE15d3dMREFzTVMwdU1ERTNMRGN1TURVM0xETXVORElzTXk0ME1pd3dMREFzTVMweUxqZ3hOeXd4TGpJMk5GcHRMUzR5TFRndU16ZzFZVEl1TkRneUxESXVORGd5TERBc01Dd3dMVEl1TURRNExqYzROQ3cwTGpBME1TdzBMakEwTVN3d0xEQXNNQzB1TmpRNUxESXVORGswZGk0ek1USmhOQzQyTWpVc05DNDJNalVzTUN3d0xEQXNMalkwT1N3eUxqYzROU3d5TGpRMk55d3lMalEyTnl3d0xEQXNNQ3d5TGpBNE1pNDRNemtzTWk0eE5qUXNNaTR4TmpRc01Dd3dMREFzTVM0NE56VXRMamsyT1N3MExqWXNOQzQyTERBc01Dd3dMQzQyTnpndE1pNDJOekVzTkM0ME1qZ3NOQzQwTWpnc01Dd3dMREF0TGpZM09DMHlMalkxTVN3eUxqSXpNaXd5TGpJek1pd3dMREFzTUMweExqa3hOUzB1T1RJeldpSXZQZzBLSUNBZ0lDQWdQSEJoZEdnZ2FXUTlJbEJoZEdoZk1qazJNQ0lnWkdGMFlTMXVZVzFsUFNKUVlYUm9JREk1TmpBaUlHTnNZWE56UFNKamJITXRNaUlnWkQwaVRURTFPUzR3TXprc01URXhMakE1WVRNdU9Ua3pMRE11T1RrekxEQXNNQ3d4TFRFdU5qUTNMUzR6TXpNc015NHhMRE11TVN3d0xEQXNNUzB4TGpJMU1pMHhMakF5TTJndExqRmhNVEl1TWpZMUxERXlMakkyTlN3d0xEQXNNU3d1TVN3eExqVXpNM1l6TGpob0xURXVORll4TURFdU5qZzJhREV1TVRNM2JDNHhPVFFzTVM0eU5qUm9MakEyTjJFekxqSTFOeXd6TGpJMU55d3dMREFzTVN3eExqSTFOaTB4TGpFc015NDRNekVzTXk0NE16RXNNQ3d3TERFc01TNDJORE10TGpNek55d3pMalF4TXl3ekxqUXhNeXd3TERBc01Td3lMamd6Tml3eExqSTFOaXcyTGpZNE15dzJMalk0TXl3d0xEQXNNUzB1TURFM0xEY3VNRFUzTERNdU5ESXNNeTQwTWl3d0xEQXNNUzB5TGpneE55d3hMakkyTkZwdExTNHlMVGd1TXpnMVlUSXVORGd5TERJdU5EZ3lMREFzTUN3d0xUSXVNRFE0TGpjNE5DdzBMakEwTVN3MExqQTBNU3d3TERBc01DMHVOalE1TERJdU5EazBkaTR6TVRKaE5DNDJNalVzTkM0Mk1qVXNNQ3d3TERBc0xqWTBPU3d5TGpjNE5Td3lMalEyTnl3eUxqUTJOeXd3TERBc01Dd3lMakE0TWk0NE16a3NNaTR4TmpRc01pNHhOalFzTUN3d0xEQXNNUzQ0TnpVdExqazJPU3cwTGpZc05DNDJMREFzTUN3d0xDNDJOemd0TWk0Mk56RXNOQzQwTWpnc05DNDBNamdzTUN3d0xEQXRMalkzT0MweUxqWTFNU3d5TGpJek1pd3lMakl6TWl3d0xEQXNNQzB4TGpreE1TMHVPVEl6V2lJdlBnMEtJQ0FnSUNBZ1BIQmhkR2dnYVdROUlsQmhkR2hmTWprMk1TSWdaR0YwWVMxdVlXMWxQU0pRWVhSb0lESTVOakVpSUdOc1lYTnpQU0pqYkhNdE1pSWdaRDBpVFRFM015NDJNVElzTVRBMkxqTmhOUzR3T1RNc05TNHdPVE1zTUN3d0xERXRNUzR4TXpjc015NDFNamNzTkM0d01EVXNOQzR3TURVc01Dd3dMREV0TXk0eE5ETXNNUzR5Tmpnc05DNHhOeklzTkM0eE56SXNNQ3d3TERFdE1pNHlMUzQxT0RFc015NDROQ3d6TGpnMExEQXNNQ3d4TFRFdU5EZ3pMVEV1TmpZNUxEVXVPQ3cxTGpnc01Dd3dMREV0TGpVeU1pMHlMalUwTlN3MUxqQTROeXcxTGpBNE55d3dMREFzTVN3eExqRXlPUzB6TGpVeE9Dd3pMams1TVN3ekxqazVNU3d3TERBc01Td3pMakV6TlMweExqSTJMRE11T1RBM0xETXVPVEEzTERBc01Dd3hMRE11TURnc01TNHlPU3cxTGpBM01TdzFMakEzTVN3d0xEQXNNU3d4TGpFME1Td3pMalE0T0ZwdExUY3VNRE0yTERCaE5DNHpPRFFzTkM0ek9EUXNNQ3d3TERBc0xqY3dPQ3d5TGpjc01pNDRNRGtzTWk0NE1Ea3NNQ3d3TERBc05DNHhOamNzTUN3MExqTTJOU3cwTGpNMk5Td3dMREFzTUN3dU56RXlMVEl1Tnl3MExqSTVNeXcwTGpJNU15d3dMREFzTUMwdU56RXlMVEl1TmpjMUxESXVOU3d5TGpVc01Dd3dMREF0TWk0eExTNDVNVFVzTWk0ME5qRXNNaTQwTmpFc01Dd3dMREF0TWk0d056SXVPU3cwTGpNek5DdzBMak16TkN3d0xEQXNNQzB1Tnl3eUxqWTVXaUl2UGcwS0lDQWdJQ0FnUEhCaGRHZ2dhV1E5SWxCaGRHaGZNamsyTWlJZ1pHRjBZUzF1WVcxbFBTSlFZWFJvSURJNU5qSWlJR05zWVhOelBTSmpiSE10TWlJZ1pEMGlUVEU0TUM0MU1qVXNNVEF4TGpVeE4yRTFMalV3Tml3MUxqVXdOaXd3TERBc01Td3hMakV1TVd3dExqRTVOQ3d4TGpOaE5DNDNPRFlzTkM0M09EWXNNQ3d3TERBdE1TNHdNVEV0TGpFeU55d3lMalEyTERJdU5EWXNNQ3d3TERBdE1TNDVNVGN1T1RFeExETXVNekU0TERNdU16RTRMREFzTUN3d0xTNDRMREl1TWpZM2RqUXVPVFUxYUMweExqUjJMVGt1TWpNMmFERXVNVFUwYkM0eE5pd3hMamN4YUM0d05qaGhOQzR3TlRRc05DNHdOVFFzTUN3d0xERXNNUzR5TXpndE1TNHpPU3d5TGpjNE55d3lMamM0Tnl3d0xEQXNNU3d4TGpZdExqUTVXaUl2UGcwS0lDQWdJQ0FnUEhCaGRHZ2dhV1E5SWxCaGRHaGZNamsyTXlJZ1pHRjBZUzF1WVcxbFBTSlFZWFJvSURJNU5qTWlJR05zWVhOelBTSmpiSE10TWlJZ1pEMGlUVEU0Tnk0ek5qTXNNVEE1TGprek5tRTBMalV3Tml3MExqVXdOaXd3TERBc01Dd3VOekUyTFM0d05UVXNOQzR6T0Rjc05DNHpPRGNzTUN3d0xEQXNMalUwT0MwdU1URTBkakV1TURkaE1pNDFMREl1TlN3d0xEQXNNUzB1TmpjdU1UZ3hMRFVzTlN3d0xEQXNNUzB1T0M0d056SnhMVEl1Tmpnc01DMHlMalk0TFRJdU9ESXpkaTAxTGpRNU5HZ3RNUzR6TWpOV01UQXlMakZzTVM0ek1qTXRMalU0TWk0MU9TMHhMamszTW1ndU9EQTVkakl1TVRReGFESXVOamgyTVM0d09EZG9MVEl1TmpoMk5TNDBNelZoTVM0NE5qa3NNUzQ0Tmprc01Dd3dMREFzTGpRc01TNHlPREZCTVM0ek56Y3NNUzR6Tnpjc01Dd3dMREFzTVRnM0xqTTJNeXd4TURrdU9UTTJXaUl2UGcwS0lDQWdJQ0FnUEhCaGRHZ2dhV1E5SWxCaGRHaGZNamsyTkNJZ1pHRjBZUzF1WVcxbFBTSlFZWFJvSURJNU5qUWlJR05zWVhOelBTSmpiSE10TWlJZ1pEMGlUVEU1TkM0MU16Z3NNVEV4TGpBNVlUUXVNak01TERRdU1qTTVMREFzTUN3eExUTXVNak14TFRFdU1qUTNMRFF1T0RJMExEUXVPREkwTERBc01Dd3hMVEV1TVRnMExUTXVORFl6TERVdU16VTFMRFV1TXpVMUxEQXNNQ3d4TERFdU1TMHpMalUwT0N3ekxqWTFNaXd6TGpZMU1pd3dMREFzTVN3eUxqazFOQzB4TGpNeE5Td3pMalE0TkN3ekxqUTROQ3d3TERBc01Td3lMamMwTnl3eExqRTBNaXcwTGpNM09DdzBMak0zT0N3d0xEQXNNU3d4TGpBeE1Td3pMakF4TTNZdU9EZzFhQzAyTGpNMk1tRXpMalkyTERNdU5qWXNNQ3d3TERBc0xqZ3lNaXd5TGpRMk9Td3lMamcwTXl3eUxqZzBNeXd3TERBc01Dd3lMakl1T0RRekxEY3VORE14TERjdU5ETXhMREFzTUN3d0xESXVPVFE1TFM0Mk1qUjJNUzR5TkRkaE55NHpOemNzTnk0ek56Y3NNQ3d3TERFdE1TNDBMalExT1N3M0xqZzJNeXczTGpnMk15d3dMREFzTVMweExqWXVNVE01V20wdExqTTNPUzA0TGpSaE1pNHlPRFlzTWk0eU9EWXNNQ3d3TERBdE1TNDNOelF1TnpJMUxETXVNek0zTERNdU16TTNMREFzTUN3d0xTNDNOemtzTWk0d01EWm9OQzQ0TWpoaE15NHdOeklzTXk0d056SXNNQ3d3TERBdExqVTVMVEl1TURJM0xESXVNRGMyTERJdU1EYzJMREFzTUN3d0xURXVOamcxTFM0M01EWmFJaTgrRFFvZ0lDQWdJQ0E4Y0dGMGFDQnBaRDBpVUdGMGFGOHlPVFkxSWlCa1lYUmhMVzVoYldVOUlsQmhkR2dnTWprMk5TSWdZMnhoYzNNOUltTnNjeTB5SWlCa1BTSk5NakEyTGprMU1Td3hNRGt1TmpnemFDMHVNRGMyWVRNdU1qZzNMRE11TWpnM0xEQXNNQ3d4TFRJdU9Td3hMalF3Tnl3ekxqUXlOeXd6TGpReU55d3dMREFzTVMweUxqZ3hPUzB4TGpJek9TdzFMalExTWl3MUxqUTFNaXd3TERBc01TMHhMakF3TmkwekxqVXlNaXcxTGpVME1pdzFMalUwTWl3d0xEQXNNU3d4TGpBeE1TMHpMalUwT0N3ekxqUXNNeTQwTERBc01Dd3hMREl1T0RFMExURXVNalkwTERNdU16WXhMRE11TXpZeExEQXNNQ3d4TERJdU9EZ3pMREV1TXpZMWFDNHhNRGxzTFM0d05Ua3RMalkyTlMwdU1ETTBMUzQyTkRsV09UY3VPREE1YURFdU5IWXhNeTR4TVROb0xURXVNVE00V20wdE1pNDRMakl6Tm1FeUxqVTFNU3d5TGpVMU1Td3dMREFzTUN3eUxqQTNPQzB1TnpjNUxETXVPVFEzTERNdU9UUTNMREFzTUN3d0xDNDJORFF0TWk0MU1UWjJMUzR6WVRRdU5qTTRMRFF1TmpNNExEQXNNQ3d3TFM0Mk5UTXRNaTQ0TERJdU5EZ3hMREl1TkRneExEQXNNQ3d3TFRJdU1EZzJMUzQ0TXprc01pNHhOQ3d5TGpFMExEQXNNQ3d3TFRFdU9EZ3pMamsxTnl3MExqYzJMRFF1TnpZc01Dd3dMREF0TGpZMU15d3lMamNzTkM0MU5UUXNOQzQxTlRRc01Dd3dMREFzTGpZME9Td3lMalkzTVN3eUxqRTVOQ3d5TGpFNU5Dd3dMREFzTUN3eExqa3dOaTQ1TURaYUlpOCtEUW9nSUNBZ0lDQThjR0YwYUNCcFpEMGlVR0YwYUY4eU9UWTJJaUJrWVhSaExXNWhiV1U5SWxCaGRHZ2dNamsyTmlJZ1kyeGhjM005SW1Oc2N5MHlJaUJrUFNKTk1qSXdMamN4TWl3eE1ERXVOVE0wWVRNdU5ETTFMRE11TkRNMUxEQXNNQ3d4TERJdU9ESTNMREV1TWpRekxEWXVOalV6TERZdU5qVXpMREFzTUN3eExTNHdNRGtzTnk0d05UTXNNeTQwTVRjc015NDBNVGNzTUN3d0xERXRNaTQ0TVRnc01TNHlOaXcwTERRc01Dd3dMREV0TVM0Mk5EZ3RMak16TXl3ekxqQTVOQ3d6TGpBNU5Dd3dMREFzTVMweExqSTFNUzB4TGpBeU0yZ3RMakZzTFM0eU9UVXNNUzR4T0Rob0xURldPVGN1T0RBNWFERXVORll4TURGeE1Dd3hMakEyT1MwdU1EWTRMREV1T1RJeGFDNHdOamhoTXk0ek1qSXNNeTR6TWpJc01Dd3dMREVzTWk0NE9UUXRNUzR6T0RkYWJTMHVNaXd4TGpFM01XRXlMalEwTERJdU5EUXNNQ3d3TERBdE1pNHdOalF1T0RJeUxEWXVNek00TERZdU16TTRMREFzTUN3d0xDNHdNVGNzTlM0MU5UTXNNaTQwTmpRc01pNDBOalFzTUN3d0xEQXNNaTR3T0RFdU9ETTVMREl1TVRVNExESXVNVFU0TERBc01Dd3dMREV1T1RJeUxTNDVOQ3cwTGpneU9DdzBMamd5T0N3d0xEQXNNQ3d1TmpNeUxUSXVOeXcwTGpZME5TdzBMalkwTlN3d0xEQXNNQzB1TmpNeUxUSXVOamc1TERJdU1qUXlMREl1TWpReUxEQXNNQ3d3TFRFdU9UVTVMUzQ0T0RWYUlpOCtEUW9nSUNBZ0lDQThjR0YwYUNCcFpEMGlVR0YwYUY4eU9UWTNJaUJrWVhSaExXNWhiV1U5SWxCaGRHZ2dNamsyTnlJZ1kyeGhjM005SW1Oc2N5MHlJaUJrUFNKTk1qSTFMamMxT0N3eE1ERXVOamcyYURFdU5Xd3lMakF5TXl3MUxqSTJOMkV5TUM0eE9EZ3NNakF1TVRnNExEQXNNQ3d4TEM0NE1qWXNNaTQyYUM0d05qZHhMakV3T1MwdU5ETXhMalExT1MweExqUTNNWFF5TGpJNE9DMDJMalJvTVM0MVRESXpNQzQwTlRJc01URXlMakpoTlM0eU5UTXNOUzR5TlRNc01Dd3dMREV0TVM0ek56Z3NNaTR5TVRJc01pNDVNeklzTWk0NU16SXNNQ3d3TERFdE1TNDVNelF1TmpVekxEVXVOalU1TERVdU5qVTVMREFzTUN3eExURXVNalkwTFM0eE5ETldNVEV6TGpoaE5DNDVMRFF1T1N3d0xEQXNNQ3d4TGpBek55NHhMREl1TVRNMkxESXVNVE0yTERBc01Dd3dMREl1TURVMkxURXVOakU0YkM0MU1UUXRNUzR6TVRSYUlpOCtEUW9nSUNBZ1BDOW5QZzBLSUNBOEwyYytEUW84TDNOMlp6NE5DZz09In0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzQ5KSxpPW4oMzUwKSxvPW4oMTI1KSx1PW4oMzUxKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcih0KXx8aSh0LGUpfHxvKHQsZSl8fHUoKX0sdC5leHBvcnRzLmRlZmF1bHQ9dC5leHBvcnRzLHQuZXhwb3J0cy5fX2VzTW9kdWxlPSEwfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMzYzKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDM3Nyl9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9big0MDgpfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oNDEyKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZS5zYW5pdGl6ZVVybD12b2lkIDA7dmFyIHI9L14oW15cd10qKShqYXZhc2NyaXB0fGRhdGF8dmJzY3JpcHQpL2ltLGk9L1tcdTAwMDAtXHUwMDFGXHUwMDdGLVx1MDA5Rlx1MjAwMC1cdTIwMERcdUZFRkZdL2dpbSxvPS9eKFteOl0rKTovZ20sdT1bIi4iLCIvIl07ZS5zYW5pdGl6ZVVybD1mdW5jdGlvbih0KXtpZighdClyZXR1cm4iYWJvdXQ6YmxhbmsiO3ZhciBlPXQucmVwbGFjZShpLCIiKS50cmltKCk7aWYoZnVuY3Rpb24odCl7cmV0dXJuIHUuaW5kZXhPZih0WzBdKT4tMX0oZSkpcmV0dXJuIGU7dmFyIG49ZS5tYXRjaChvKTtpZighbilyZXR1cm4gZTt2YXIgcz1uWzBdO3JldHVybiByLnRlc3Qocyk/ImFib3V0OmJsYW5rIjplfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDE4KSxpPW4oNDI5KSgoZnVuY3Rpb24odCxlLG4pe3JldHVybiBlPWUudG9Mb3dlckNhc2UoKSx0KyhuP3IoZSk6ZSl9KSk7dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQ1OSkobig1MDgpKTt0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbihlKXt2YXIgcj1uKDUyMiksaT1uKDUyMykuU3RyZWFtO2Z1bmN0aW9uIG8odCxlLG4pe249bnx8MDt2YXIgaSx1LHM9KGk9ZSxuZXcgQXJyYXkobnx8MCkuam9pbihpfHwiIikpLGE9dDtpZigib2JqZWN0Ij09dHlwZW9mIHQmJigoYT10W3U9T2JqZWN0LmtleXModClbMF1dKSYmYS5fZWxlbSkpcmV0dXJuIGEuX2VsZW0ubmFtZT11LGEuX2VsZW0uaWNvdW50PW4sYS5fZWxlbS5pbmRlbnQ9ZSxhLl9lbGVtLmluZGVudHM9cyxhLl9lbGVtLmludGVycnVwdD1hLGEuX2VsZW07dmFyIGMsZj1bXSxsPVtdO2Z1bmN0aW9uIHAodCl7T2JqZWN0LmtleXModCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7Zi5wdXNoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrJz0iJytyKGUpKyciJ30oZSx0W2VdKSl9KSl9c3dpdGNoKHR5cGVvZiBhKXtjYXNlIm9iamVjdCI6aWYobnVsbD09PWEpYnJlYWs7YS5fYXR0ciYmcChhLl9hdHRyKSxhLl9jZGF0YSYmbC5wdXNoKCgiPCFbQ0RBVEFbIithLl9jZGF0YSkucmVwbGFjZSgvXF1cXT4vZywiXV1dXT48IVtDREFUQVs+IikrIl1dPiIpLGEuZm9yRWFjaCYmKGM9ITEsbC5wdXNoKCIiKSxhLmZvckVhY2goKGZ1bmN0aW9uKHQpeyJvYmplY3QiPT10eXBlb2YgdD8iX2F0dHIiPT1PYmplY3Qua2V5cyh0KVswXT9wKHQuX2F0dHIpOmwucHVzaChvKHQsZSxuKzEpKToobC5wb3AoKSxjPSEwLGwucHVzaChyKHQpKSl9KSksY3x8bC5wdXNoKCIiKSk7YnJlYWs7ZGVmYXVsdDpsLnB1c2gocihhKSl9cmV0dXJue25hbWU6dSxpbnRlcnJ1cHQ6ITEsYXR0cmlidXRlczpmLGNvbnRlbnQ6bCxpY291bnQ6bixpbmRlbnRzOnMsaW5kZW50OmV9fWZ1bmN0aW9uIHUodCxlLG4pe2lmKCJvYmplY3QiIT10eXBlb2YgZSlyZXR1cm4gdCghMSxlKTt2YXIgcj1lLmludGVycnVwdD8xOmUuY29udGVudC5sZW5ndGg7ZnVuY3Rpb24gaSgpe2Zvcig7ZS5jb250ZW50Lmxlbmd0aDspe3ZhciBpPWUuY29udGVudC5zaGlmdCgpO2lmKHZvaWQgMCE9PWkpe2lmKG8oaSkpcmV0dXJuO3UodCxpKX19dCghMSwocj4xP2UuaW5kZW50czoiIikrKGUubmFtZT8iPC8iK2UubmFtZSsiPiI6IiIpKyhlLmluZGVudCYmIW4/IlxuIjoiIikpLG4mJm4oKX1mdW5jdGlvbiBvKGUpe3JldHVybiEhZS5pbnRlcnJ1cHQmJihlLmludGVycnVwdC5hcHBlbmQ9dCxlLmludGVycnVwdC5lbmQ9aSxlLmludGVycnVwdD0hMSx0KCEwKSwhMCl9aWYodCghMSxlLmluZGVudHMrKGUubmFtZT8iPCIrZS5uYW1lOiIiKSsoZS5hdHRyaWJ1dGVzLmxlbmd0aD8iICIrZS5hdHRyaWJ1dGVzLmpvaW4oIiAiKToiIikrKHI/ZS5uYW1lPyI+IjoiIjplLm5hbWU/Ii8+IjoiIikrKGUuaW5kZW50JiZyPjE/IlxuIjoiIikpLCFyKXJldHVybiB0KCExLGUuaW5kZW50PyJcbiI6IiIpO28oZSl8fGkoKX10LmV4cG9ydHM9ZnVuY3Rpb24odCxuKXsib2JqZWN0IiE9dHlwZW9mIG4mJihuPXtpbmRlbnQ6bn0pO3ZhciByLHMsYT1uLnN0cmVhbT9uZXcgaTpudWxsLGM9IiIsZj0hMSxsPW4uaW5kZW50PyEwPT09bi5pbmRlbnQ/IiAgICAiOm4uaW5kZW50OiIiLHA9ITA7ZnVuY3Rpb24gaCh0KXtwP2UubmV4dFRpY2sodCk6dCgpfWZ1bmN0aW9uIGQodCxlKXtpZih2b2lkIDAhPT1lJiYoYys9ZSksdCYmIWYmJihhPWF8fG5ldyBpLGY9ITApLHQmJmYpe3ZhciBuPWM7aCgoZnVuY3Rpb24oKXthLmVtaXQoImRhdGEiLG4pfSkpLGM9IiJ9fWZ1bmN0aW9uIHkodCxlKXt1KGQsbyh0LGwsbD8xOjApLGUpfWZ1bmN0aW9uIHYoKXtpZihhKXt2YXIgdD1jO2goKGZ1bmN0aW9uKCl7YS5lbWl0KCJkYXRhIix0KSxhLmVtaXQoImVuZCIpLGEucmVhZGFibGU9ITEsYS5lbWl0KCJjbG9zZSIpfSkpfX1yZXR1cm4gaCgoZnVuY3Rpb24oKXtwPSExfSkpLG4uZGVjbGFyYXRpb24mJihyPW4uZGVjbGFyYXRpb24scz17dmVyc2lvbjoiMS4wIixlbmNvZGluZzpyLmVuY29kaW5nfHwiVVRGLTgifSxyLnN0YW5kYWxvbmUmJihzLnN0YW5kYWxvbmU9ci5zdGFuZGFsb25lKSx5KHsiP3htbCI6e19hdHRyOnN9fSksYz1jLnJlcGxhY2UoIi8+IiwiPz4iKSksdCYmdC5mb3JFYWNoP3QuZm9yRWFjaCgoZnVuY3Rpb24oZSxuKXt2YXIgcjtuKzE9PT10Lmxlbmd0aCYmKHI9dikseShlLHIpfSkpOnkodCx2KSxhPyhhLnJlYWRhYmxlPSEwLGEpOmN9LHQuZXhwb3J0cy5lbGVtZW50PXQuZXhwb3J0cy5FbGVtZW50PWZ1bmN0aW9uKCl7dmFyIHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSxlPXtfZWxlbTpvKHQpLHB1c2g6ZnVuY3Rpb24odCl7aWYoIXRoaXMuYXBwZW5kKXRocm93IG5ldyBFcnJvcigibm90IGFzc2lnbmVkIHRvIGEgcGFyZW50ISIpO3ZhciBlPXRoaXMsbj10aGlzLl9lbGVtLmluZGVudDt1KHRoaXMuYXBwZW5kLG8odCxuLHRoaXMuX2VsZW0uaWNvdW50KyhuPzE6MCkpLChmdW5jdGlvbigpe2UuYXBwZW5kKCEwKX0pKX0sY2xvc2U6ZnVuY3Rpb24odCl7dm9pZCAwIT09dCYmdGhpcy5wdXNoKHQpLHRoaXMuZW5kJiZ0aGlzLmVuZCgpfX07cmV0dXJuIGV9fSkuY2FsbCh0aGlzLG4oMzQpKX0sZnVuY3Rpb24odCxlLG4peyhmdW5jdGlvbihlKXt2YXIgbjtuPXZvaWQgMCE9PWU/ZTp0aGlzLHQuZXhwb3J0cz1mdW5jdGlvbih0KXtpZih0LkNTUyYmdC5DU1MuZXNjYXBlKXJldHVybiB0LkNTUy5lc2NhcGU7dmFyIGU9ZnVuY3Rpb24odCl7aWYoMD09YXJndW1lbnRzLmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJgQ1NTLmVzY2FwZWAgcmVxdWlyZXMgYW4gYXJndW1lbnQuIik7Zm9yKHZhciBlLG49U3RyaW5nKHQpLHI9bi5sZW5ndGgsaT0tMSxvPSIiLHU9bi5jaGFyQ29kZUF0KDApOysraTxyOykwIT0oZT1uLmNoYXJDb2RlQXQoaSkpP28rPWU+PTEmJmU8PTMxfHwxMjc9PWV8fDA9PWkmJmU+PTQ4JiZlPD01N3x8MT09aSYmZT49NDgmJmU8PTU3JiY0NT09dT8iXFwiK2UudG9TdHJpbmcoMTYpKyIgIjowPT1pJiYxPT1yJiY0NT09ZXx8IShlPj0xMjh8fDQ1PT1lfHw5NT09ZXx8ZT49NDgmJmU8PTU3fHxlPj02NSYmZTw9OTB8fGU+PTk3JiZlPD0xMjIpPyJcXCIrbi5jaGFyQXQoaSk6bi5jaGFyQXQoaSk6bys9Iu+/vSI7cmV0dXJuIG99O3JldHVybiB0LkNTU3x8KHQuQ1NTPXt9KSx0LkNTUy5lc2NhcGU9ZSxlfShuKX0pLmNhbGwodGhpcyxuKDIwKSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7bi5kKGUsImEiLChmdW5jdGlvbigpe3JldHVybiBmfSkpO3ZhciByPW4oMjcpLGk9bi5uKHIpLG89big0MCksdT1uLm4obykscz1uKDApLGE9bi5uKHMpLGM9YS5hLlNldC5vZigidHlwZSIsImZvcm1hdCIsIml0ZW1zIiwiZGVmYXVsdCIsIm1heGltdW0iLCJleGNsdXNpdmVNYXhpbXVtIiwibWluaW11bSIsImV4Y2x1c2l2ZU1pbmltdW0iLCJtYXhMZW5ndGgiLCJtaW5MZW5ndGgiLCJwYXR0ZXJuIiwibWF4SXRlbXMiLCJtaW5JdGVtcyIsInVuaXF1ZUl0ZW1zIiwiZW51bSIsIm11bHRpcGxlT2YiKTtmdW5jdGlvbiBmKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fSxuPWUuaXNPQVMzO2lmKCFhLmEuTWFwLmlzTWFwKHQpKXJldHVybntzY2hlbWE6YS5hLk1hcCgpLHBhcmFtZXRlckNvbnRlbnRNZWRpYVR5cGU6bnVsbH07aWYoIW4pcmV0dXJuImJvZHkiPT09dC5nZXQoImluIik/e3NjaGVtYTp0LmdldCgic2NoZW1hIixhLmEuTWFwKCkpLHBhcmFtZXRlckNvbnRlbnRNZWRpYVR5cGU6bnVsbH06e3NjaGVtYTppKCkodCkuY2FsbCh0LChmdW5jdGlvbih0LGUpe3JldHVybiB1KCkoYykuY2FsbChjLGUpfSkpLHBhcmFtZXRlckNvbnRlbnRNZWRpYVR5cGU6bnVsbH07aWYodC5nZXQoImNvbnRlbnQiKSl7dmFyIHI9dC5nZXQoImNvbnRlbnQiLGEuYS5NYXAoe30pKS5rZXlTZXEoKSxvPXIuZmlyc3QoKTtyZXR1cm57c2NoZW1hOnQuZ2V0SW4oWyJjb250ZW50IixvLCJzY2hlbWEiXSxhLmEuTWFwKCkpLHBhcmFtZXRlckNvbnRlbnRNZWRpYVR5cGU6b319cmV0dXJue3NjaGVtYTp0LmdldCgic2NoZW1hIixhLmEuTWFwKCkpLHBhcmFtZXRlckNvbnRlbnRNZWRpYVR5cGU6bnVsbH19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiOyhmdW5jdGlvbihlLHIpe3ZhciBpPTY1NTM2LG89NDI5NDk2NzI5NTt2YXIgdT1uKDE3KS5CdWZmZXIscz1lLmNyeXB0b3x8ZS5tc0NyeXB0bztzJiZzLmdldFJhbmRvbVZhbHVlcz90LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZih0Pm8pdGhyb3cgbmV3IFJhbmdlRXJyb3IoInJlcXVlc3RlZCB0b28gbWFueSByYW5kb20gYnl0ZXMiKTt2YXIgbj11LmFsbG9jVW5zYWZlKHQpO2lmKHQ+MClpZih0PmkpZm9yKHZhciBhPTA7YTx0O2ErPWkpcy5nZXRSYW5kb21WYWx1ZXMobi5zbGljZShhLGEraSkpO2Vsc2Ugcy5nZXRSYW5kb21WYWx1ZXMobik7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUpcmV0dXJuIHIubmV4dFRpY2soKGZ1bmN0aW9uKCl7ZShudWxsLG4pfSkpO3JldHVybiBufTp0LmV4cG9ydHM9ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoIlNlY3VyZSByYW5kb20gbnVtYmVyIGdlbmVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGJyb3dzZXIuXG5Vc2UgQ2hyb21lLCBGaXJlZm94IG9yIEludGVybmV0IEV4cGxvcmVyIDExIil9fSkuY2FsbCh0aGlzLG4oMjApLG4oMzQpKX0sZnVuY3Rpb24odCxlLG4peyhlPXQuZXhwb3J0cz1mdW5jdGlvbih0KXt0PXQudG9Mb3dlckNhc2UoKTt2YXIgbj1lW3RdO2lmKCFuKXRocm93IG5ldyBFcnJvcih0KyIgaXMgbm90IHN1cHBvcnRlZCAod2UgYWNjZXB0IHB1bGwgcmVxdWVzdHMpIik7cmV0dXJuIG5ldyBufSkuc2hhPW4oNTk2KSxlLnNoYTE9big1OTcpLGUuc2hhMjI0PW4oNTk4KSxlLnNoYTI1Nj1uKDIxNyksZS5zaGEzODQ9big1OTkpLGUuc2hhNTEyPW4oMjE4KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDYwMCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIzNSk7dC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxuKXtuKDIzNik7dmFyIHI9bigxMCkuT2JqZWN0LGk9dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gci5kZWZpbmVQcm9wZXJ0eSh0LGUsbil9O3IuZGVmaW5lUHJvcGVydHkuc2hhbSYmKGkuc2hhbT0hMCl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEpLGk9bigyMyk7cih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOiFpLHNoYW06IWl9LHtkZWZpbmVQcm9wZXJ0eTpuKDMzKS5mfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDYpLGk9LyN8XC5wcm90b3R5cGVcLi8sbz1mdW5jdGlvbih0LGUpe3ZhciBuPXNbdSh0KV07cmV0dXJuIG49PWN8fG4hPWEmJigiZnVuY3Rpb24iPT10eXBlb2YgZT9yKGUpOiEhZSl9LHU9by5ub3JtYWxpemU9ZnVuY3Rpb24odCl7cmV0dXJuIFN0cmluZyh0KS5yZXBsYWNlKGksIi4iKS50b0xvd2VyQ2FzZSgpfSxzPW8uZGF0YT17fSxhPW8uTkFUSVZFPSJOIixjPW8uUE9MWUZJTEw9IlAiO3QuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMjM5KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjQwKTt0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLG4pe24oMjQxKTt2YXIgcj1uKDEwKS5PYmplY3Q7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIuY3JlYXRlKHQsZSl9fSxmdW5jdGlvbih0LGUsbil7bigxKSh7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsc2hhbTohbigyMyl9LHtjcmVhdGU6big3Nil9KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjMpLGk9bigzMyksbz1uKDI5KSx1PW4oNzcpO3QuZXhwb3J0cz1yP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzOmZ1bmN0aW9uKHQsZSl7byh0KTtmb3IodmFyIG4scj11KGUpLHM9ci5sZW5ndGgsYT0wO3M+YTspaS5mKHQsbj1yW2ErK10sZVtuXSk7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1Nyk7dC5leHBvcnRzPXIoImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50Iil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEzKSxpPW4oMjQpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3RyeXtpKHIsdCxlKX1jYXRjaChuKXtyW3RdPWV9cmV0dXJuIGV9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNTQpO2Z1bmN0aW9uIGkoZSxuKXtyZXR1cm4gdC5leHBvcnRzPWk9cnx8ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5fX3Byb3RvX189ZSx0fSx0LmV4cG9ydHMuZGVmYXVsdD10LmV4cG9ydHMsdC5leHBvcnRzLl9fZXNNb2R1bGU9ITAsaShlLG4pfXQuZXhwb3J0cz1pLHQuZXhwb3J0cy5kZWZhdWx0PXQuZXhwb3J0cyx0LmV4cG9ydHMuX19lc01vZHVsZT0hMH0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjQ3KTt0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLG4pe24oMjQ4KTt2YXIgcj1uKDEwKTt0LmV4cG9ydHM9ci5PYmplY3Quc2V0UHJvdG90eXBlT2Z9LGZ1bmN0aW9uKHQsZSxuKXtuKDEpKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMH0se3NldFByb3RvdHlwZU9mOm4oMTU1KX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCFyKHQpJiZudWxsIT09dCl0aHJvdyBUeXBlRXJyb3IoIkNhbid0IHNldCAiK1N0cmluZyh0KSsiIGFzIGEgcHJvdG90eXBlIik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNTEpO3QuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsbil7bigyNTIpO3ZhciByPW4oMTApO3QuZXhwb3J0cz1yLlJlZmxlY3QuY29uc3RydWN0fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxKSxpPW4oNTcpLG89big1NiksdT1uKDI5KSxzPW4oMTUpLGE9big3NiksYz1uKDE1NyksZj1uKDYpLGw9aSgiUmVmbGVjdCIsImNvbnN0cnVjdCIpLHA9ZigoZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiEobCgoZnVuY3Rpb24oKXt9KSxbXSx0KWluc3RhbmNlb2YgdCl9KSksaD0hZigoZnVuY3Rpb24oKXtsKChmdW5jdGlvbigpe30pKX0pKSxkPXB8fGg7cih7dGFyZ2V0OiJSZWZsZWN0IixzdGF0OiEwLGZvcmNlZDpkLHNoYW06ZH0se2NvbnN0cnVjdDpmdW5jdGlvbih0LGUpe28odCksdShlKTt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPDM/dDpvKGFyZ3VtZW50c1syXSk7aWYoaCYmIXApcmV0dXJuIGwodCxlLG4pO2lmKHQ9PW4pe3N3aXRjaChlLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBuZXcgdDtjYXNlIDE6cmV0dXJuIG5ldyB0KGVbMF0pO2Nhc2UgMjpyZXR1cm4gbmV3IHQoZVswXSxlWzFdKTtjYXNlIDM6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSxlWzJdKTtjYXNlIDQ6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSxlWzJdLGVbM10pfXZhciByPVtudWxsXTtyZXR1cm4gci5wdXNoLmFwcGx5KHIsZSksbmV3KGMuYXBwbHkodCxyKSl9dmFyIGk9bi5wcm90b3R5cGUsZj1hKHMoaSk/aTpPYmplY3QucHJvdG90eXBlKSxkPUZ1bmN0aW9uLmFwcGx5LmNhbGwodCxmLGUpO3JldHVybiBzKGQpP2Q6Zn19KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTU0KSxpPW4oMjU0KTtmdW5jdGlvbiBvKGUpe3JldHVybiB0LmV4cG9ydHM9bz1yP2k6ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19wcm90b19ffHxpKHQpfSx0LmV4cG9ydHMuZGVmYXVsdD10LmV4cG9ydHMsdC5leHBvcnRzLl9fZXNNb2R1bGU9ITAsbyhlKX10LmV4cG9ydHM9byx0LmV4cG9ydHMuZGVmYXVsdD10LmV4cG9ydHMsdC5leHBvcnRzLl9fZXNNb2R1bGU9ITB9LGZ1bmN0aW9uKHQsZSxuKXt0LmV4cG9ydHM9bigyNTUpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNTYpO3QuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsbil7bigyNTcpO3ZhciByPW4oMTApO3QuZXhwb3J0cz1yLk9iamVjdC5nZXRQcm90b3R5cGVPZn0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMSksaT1uKDYpLG89bigxOSksdT1uKDExMykscz1uKDE1OCk7cih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOmkoKGZ1bmN0aW9uKCl7dSgxKX0pKSxzaGFtOiFzfSx7Z2V0UHJvdG90eXBlT2Y6ZnVuY3Rpb24odCl7cmV0dXJuIHUobyh0KSl9fSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE1Nik7dC5leHBvcnRzPWZ1bmN0aW9uKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBSZWZsZWN0fHwhcilyZXR1cm4hMTtpZihyLnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKHIoQm9vbGVhbixbXSwoZnVuY3Rpb24oKXt9KSkpLCEwfWNhdGNoKHQpe3JldHVybiExfX0sdC5leHBvcnRzLmRlZmF1bHQ9dC5leHBvcnRzLHQuZXhwb3J0cy5fX2VzTW9kdWxlPSEwfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxOCkuZGVmYXVsdCxpPW4oMjYpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiFlfHwib2JqZWN0IiE9PXIoZSkmJiJmdW5jdGlvbiIhPXR5cGVvZiBlP2kodCk6ZX0sdC5leHBvcnRzLmRlZmF1bHQ9dC5leHBvcnRzLHQuZXhwb3J0cy5fX2VzTW9kdWxlPSEwfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNjEpO24oMjg0KSxuKDI4NSksbigyODYpLG4oMjg3KSxuKDI4OCksbigyODkpLG4oMjkwKSx0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLG4pe24oMTU5KSxuKDI2MiksbigyNjMpLG4oMjY4KSxuKDI2OSksbigyNzApLG4oMjcxKSxuKDE2NSksbigyNzIpLG4oMjczKSxuKDI3NCksbigyNzUpLG4oMjc2KSxuKDI3NyksbigyNzgpLG4oMjc5KSxuKDI4MCksbigyODEpLG4oMjgyKSxuKDI4Myk7dmFyIHI9bigxMCk7dC5leHBvcnRzPXIuU3ltYm9sfSxmdW5jdGlvbih0LGUpe30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDEpLGk9bigxMyksbz1uKDU3KSx1PW4oNTgpLHM9bigyMyksYT1uKDExNSksYz1uKDE2MSksZj1uKDYpLGw9bigyMSkscD1uKDU5KSxoPW4oMTUpLGQ9bigyOSkseT1uKDE5KSx2PW4oMzIpLGc9big3NSksdz1uKDU0KSxNPW4oNzYpLG09big3NyksXz1uKDE2MiksTD1uKDI2NCksYj1uKDE2MykseD1uKDEwNCksaj1uKDMzKSxOPW4oMTA1KSxTPW4oMjQpLEQ9bigxNjQpLEk9bigxMTApLEE9big3OSksTz1uKDc4KSxUPW4oMTEyKSxDPW4oNyksRT1uKDExNiksej1uKDQpLGs9big4MyksWT1uKDExOCksVT1uKDQzKS5mb3JFYWNoLFA9QSgiaGlkZGVuIiksUj0iU3ltYm9sIixRPUMoInRvUHJpbWl0aXZlIiksRj1ZLnNldCxCPVkuZ2V0dGVyRm9yKFIpLEc9T2JqZWN0LnByb3RvdHlwZSxXPWkuU3ltYm9sLHE9bygiSlNPTiIsInN0cmluZ2lmeSIpLEo9eC5mLFo9ai5mLFY9TC5mLFg9Ti5mLEg9SSgic3ltYm9scyIpLEs9SSgib3Atc3ltYm9scyIpLCQ9SSgic3RyaW5nLXRvLXN5bWJvbC1yZWdpc3RyeSIpLHR0PUkoInN5bWJvbC10by1zdHJpbmctcmVnaXN0cnkiKSxldD1JKCJ3a3MiKSxudD1pLlFPYmplY3QscnQ9IW50fHwhbnQucHJvdG90eXBlfHwhbnQucHJvdG90eXBlLmZpbmRDaGlsZCxpdD1zJiZmKChmdW5jdGlvbigpe3JldHVybiA3IT1NKFooe30sImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gWih0aGlzLCJhIix7dmFsdWU6N30pLmF9fSkpLmF9KSk/ZnVuY3Rpb24odCxlLG4pe3ZhciByPUooRyxlKTtyJiZkZWxldGUgR1tlXSxaKHQsZSxuKSxyJiZ0IT09RyYmWihHLGUscil9Olosb3Q9ZnVuY3Rpb24odCxlKXt2YXIgbj1IW3RdPU0oVy5wcm90b3R5cGUpO3JldHVybiBGKG4se3R5cGU6Uix0YWc6dCxkZXNjcmlwdGlvbjplfSksc3x8KG4uZGVzY3JpcHRpb249ZSksbn0sdXQ9Yz9mdW5jdGlvbih0KXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QodClpbnN0YW5jZW9mIFd9LHN0PWZ1bmN0aW9uKHQsZSxuKXt0PT09RyYmc3QoSyxlLG4pLGQodCk7dmFyIHI9ZyhlLCEwKTtyZXR1cm4gZChuKSxsKEgscik/KG4uZW51bWVyYWJsZT8obCh0LFApJiZ0W1BdW3JdJiYodFtQXVtyXT0hMSksbj1NKG4se2VudW1lcmFibGU6dygwLCExKX0pKToobCh0LFApfHxaKHQsUCx3KDEse30pKSx0W1BdW3JdPSEwKSxpdCh0LHIsbikpOloodCxyLG4pfSxhdD1mdW5jdGlvbih0LGUpe2QodCk7dmFyIG49dihlKSxyPW0obikuY29uY2F0KHB0KG4pKTtyZXR1cm4gVShyLChmdW5jdGlvbihlKXtzJiYhY3QuY2FsbChuLGUpfHxzdCh0LGUsbltlXSl9KSksdH0sY3Q9ZnVuY3Rpb24odCl7dmFyIGU9Zyh0LCEwKSxuPVguY2FsbCh0aGlzLGUpO3JldHVybiEodGhpcz09PUcmJmwoSCxlKSYmIWwoSyxlKSkmJighKG58fCFsKHRoaXMsZSl8fCFsKEgsZSl8fGwodGhpcyxQKSYmdGhpc1tQXVtlXSl8fG4pfSxmdD1mdW5jdGlvbih0LGUpe3ZhciBuPXYodCkscj1nKGUsITApO2lmKG4hPT1HfHwhbChILHIpfHxsKEsscikpe3ZhciBpPUoobixyKTtyZXR1cm4haXx8IWwoSCxyKXx8bChuLFApJiZuW1BdW3JdfHwoaS5lbnVtZXJhYmxlPSEwKSxpfX0sbHQ9ZnVuY3Rpb24odCl7dmFyIGU9Vih2KHQpKSxuPVtdO3JldHVybiBVKGUsKGZ1bmN0aW9uKHQpe2woSCx0KXx8bChPLHQpfHxuLnB1c2godCl9KSksbn0scHQ9ZnVuY3Rpb24odCl7dmFyIGU9dD09PUcsbj1WKGU/Szp2KHQpKSxyPVtdO3JldHVybiBVKG4sKGZ1bmN0aW9uKHQpeyFsKEgsdCl8fGUmJiFsKEcsdCl8fHIucHVzaChIW3RdKX0pKSxyfTsoYXx8KEQoKFc9ZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2YgVyl0aHJvdyBUeXBlRXJyb3IoIlN5bWJvbCBpcyBub3QgYSBjb25zdHJ1Y3RvciIpO3ZhciB0PWFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9TdHJpbmcoYXJndW1lbnRzWzBdKTp2b2lkIDAsZT1UKHQpLG49ZnVuY3Rpb24odCl7dGhpcz09PUcmJm4uY2FsbChLLHQpLGwodGhpcyxQKSYmbCh0aGlzW1BdLGUpJiYodGhpc1tQXVtlXT0hMSksaXQodGhpcyxlLHcoMSx0KSl9O3JldHVybiBzJiZydCYmaXQoRyxlLHtjb25maWd1cmFibGU6ITAsc2V0Om59KSxvdChlLHQpfSkucHJvdG90eXBlLCJ0b1N0cmluZyIsKGZ1bmN0aW9uKCl7cmV0dXJuIEIodGhpcykudGFnfSkpLEQoVywid2l0aG91dFNldHRlciIsKGZ1bmN0aW9uKHQpe3JldHVybiBvdChUKHQpLHQpfSkpLE4uZj1jdCxqLmY9c3QseC5mPWZ0LF8uZj1MLmY9bHQsYi5mPXB0LEUuZj1mdW5jdGlvbih0KXtyZXR1cm4gb3QoQyh0KSx0KX0scyYmKFooVy5wcm90b3R5cGUsImRlc2NyaXB0aW9uIix7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBCKHRoaXMpLmRlc2NyaXB0aW9ufX0pLHV8fEQoRywicHJvcGVydHlJc0VudW1lcmFibGUiLGN0LHt1bnNhZmU6ITB9KSkpLHIoe2dsb2JhbDohMCx3cmFwOiEwLGZvcmNlZDohYSxzaGFtOiFhfSx7U3ltYm9sOld9KSxVKG0oZXQpLChmdW5jdGlvbih0KXt6KHQpfSkpLHIoe3RhcmdldDpSLHN0YXQ6ITAsZm9yY2VkOiFhfSx7Zm9yOmZ1bmN0aW9uKHQpe3ZhciBlPVN0cmluZyh0KTtpZihsKCQsZSkpcmV0dXJuICRbZV07dmFyIG49VyhlKTtyZXR1cm4gJFtlXT1uLHR0W25dPWUsbn0sa2V5Rm9yOmZ1bmN0aW9uKHQpe2lmKCF1dCh0KSl0aHJvdyBUeXBlRXJyb3IodCsiIGlzIG5vdCBhIHN5bWJvbCIpO2lmKGwodHQsdCkpcmV0dXJuIHR0W3RdfSx1c2VTZXR0ZXI6ZnVuY3Rpb24oKXtydD0hMH0sdXNlU2ltcGxlOmZ1bmN0aW9uKCl7cnQ9ITF9fSkscih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOiFhLHNoYW06IXN9LHtjcmVhdGU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdm9pZCAwPT09ZT9NKHQpOmF0KE0odCksZSl9LGRlZmluZVByb3BlcnR5OnN0LGRlZmluZVByb3BlcnRpZXM6YXQsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOmZ0fSkscih7dGFyZ2V0OiJPYmplY3QiLHN0YXQ6ITAsZm9yY2VkOiFhfSx7Z2V0T3duUHJvcGVydHlOYW1lczpsdCxnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6cHR9KSxyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6ZigoZnVuY3Rpb24oKXtiLmYoMSl9KSl9LHtnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ZnVuY3Rpb24odCl7cmV0dXJuIGIuZih5KHQpKX19KSxxKSYmcih7dGFyZ2V0OiJKU09OIixzdGF0OiEwLGZvcmNlZDohYXx8ZigoZnVuY3Rpb24oKXt2YXIgdD1XKCk7cmV0dXJuIltudWxsXSIhPXEoW3RdKXx8Int9IiE9cSh7YTp0fSl8fCJ7fSIhPXEoT2JqZWN0KHQpKX0pKX0se3N0cmluZ2lmeTpmdW5jdGlvbih0LGUsbil7Zm9yKHZhciByLGk9W3RdLG89MTthcmd1bWVudHMubGVuZ3RoPm87KWkucHVzaChhcmd1bWVudHNbbysrXSk7aWYocj1lLChoKGUpfHx2b2lkIDAhPT10KSYmIXV0KHQpKXJldHVybiBwKGUpfHwoZT1mdW5jdGlvbih0LGUpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiByJiYoZT1yLmNhbGwodGhpcyx0LGUpKSwhdXQoZSkpcmV0dXJuIGV9KSxpWzFdPWUscS5hcHBseShudWxsLGkpfX0pO1cucHJvdG90eXBlW1FdfHxTKFcucHJvdG90eXBlLFEsVy5wcm90b3R5cGUudmFsdWVPZiksayhXLFIpLE9bUF09ITB9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDMyKSxpPW4oMTYyKS5mLG89e30udG9TdHJpbmcsdT0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93JiZPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcz9PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpOltdO3QuZXhwb3J0cy5mPWZ1bmN0aW9uKHQpe3JldHVybiB1JiYiW29iamVjdCBXaW5kb3ddIj09by5jYWxsKHQpP2Z1bmN0aW9uKHQpe3RyeXtyZXR1cm4gaSh0KX1jYXRjaCh0KXtyZXR1cm4gdS5zbGljZSgpfX0odCk6aShyKHQpKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxMTcpLGk9big2MSk7dC5leHBvcnRzPXI/e30udG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4iW29iamVjdCAiK2kodGhpcykrIl0ifX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTMpLGk9bigyNjcpLG89ci5XZWFrTWFwO3QuZXhwb3J0cz0iZnVuY3Rpb24iPT10eXBlb2YgbyYmL25hdGl2ZSBjb2RlLy50ZXN0KGkobykpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMTEpLGk9RnVuY3Rpb24udG9TdHJpbmc7ImZ1bmN0aW9uIiE9dHlwZW9mIHIuaW5zcGVjdFNvdXJjZSYmKHIuaW5zcGVjdFNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gaS5jYWxsKHQpfSksdC5leHBvcnRzPXIuaW5zcGVjdFNvdXJjZX0sZnVuY3Rpb24odCxlLG4pe24oNCkoImFzeW5jSXRlcmF0b3IiKX0sZnVuY3Rpb24odCxlKXt9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJoYXNJbnN0YW5jZSIpfSxmdW5jdGlvbih0LGUsbil7big0KSgiaXNDb25jYXRTcHJlYWRhYmxlIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJtYXRjaCIpfSxmdW5jdGlvbih0LGUsbil7big0KSgibWF0Y2hBbGwiKX0sZnVuY3Rpb24odCxlLG4pe24oNCkoInJlcGxhY2UiKX0sZnVuY3Rpb24odCxlLG4pe24oNCkoInNlYXJjaCIpfSxmdW5jdGlvbih0LGUsbil7big0KSgic3BlY2llcyIpfSxmdW5jdGlvbih0LGUsbil7big0KSgic3BsaXQiKX0sZnVuY3Rpb24odCxlLG4pe24oNCkoInRvUHJpbWl0aXZlIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJ0b1N0cmluZ1RhZyIpfSxmdW5jdGlvbih0LGUsbil7big0KSgidW5zY29wYWJsZXMiKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTMpO24oODMpKHIuSlNPTiwiSlNPTiIsITApfSxmdW5jdGlvbih0LGUpe30sZnVuY3Rpb24odCxlKXt9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJhc3luY0Rpc3Bvc2UiKX0sZnVuY3Rpb24odCxlLG4pe24oNCkoImRpc3Bvc2UiKX0sZnVuY3Rpb24odCxlLG4pe24oNCkoIm1hdGNoZXIiKX0sZnVuY3Rpb24odCxlLG4pe24oNCkoIm1ldGFkYXRhIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJvYnNlcnZhYmxlIil9LGZ1bmN0aW9uKHQsZSxuKXtuKDQpKCJwYXR0ZXJuTWF0Y2giKX0sZnVuY3Rpb24odCxlLG4pe24oNCkoInJlcGxhY2VBbGwiKX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDI5Mil9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI5Myk7dC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxuKXtuKDE2NSksbigxMTkpLG4oODQpO3ZhciByPW4oMTE2KTt0LmV4cG9ydHM9ci5mKCJpdGVyYXRvciIpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxMDgpLGk9big0Miksbz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXt2YXIgbyx1LHM9U3RyaW5nKGkoZSkpLGE9cihuKSxjPXMubGVuZ3RoO3JldHVybiBhPDB8fGE+PWM/dD8iIjp2b2lkIDA6KG89cy5jaGFyQ29kZUF0KGEpKTw1NTI5Nnx8bz41NjMxOXx8YSsxPT09Y3x8KHU9cy5jaGFyQ29kZUF0KGErMSkpPDU2MzIwfHx1PjU3MzQzP3Q/cy5jaGFyQXQoYSk6bzp0P3Muc2xpY2UoYSxhKzIpOnUtNTYzMjArKG8tNTUyOTY8PDEwKSs2NTUzNn19O3QuZXhwb3J0cz17Y29kZUF0Om8oITEpLGNoYXJBdDpvKCEwKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxNjcpLkl0ZXJhdG9yUHJvdG90eXBlLGk9big3Niksbz1uKDU0KSx1PW4oODMpLHM9big0NCksYT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe3ZhciBjPWUrIiBJdGVyYXRvciI7cmV0dXJuIHQucHJvdG90eXBlPWkocix7bmV4dDpvKDEsbil9KSx1KHQsYywhMSwhMCksc1tjXT1hLHR9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17Q1NTUnVsZUxpc3Q6MCxDU1NTdHlsZURlY2xhcmF0aW9uOjAsQ1NTVmFsdWVMaXN0OjAsQ2xpZW50UmVjdExpc3Q6MCxET01SZWN0TGlzdDowLERPTVN0cmluZ0xpc3Q6MCxET01Ub2tlbkxpc3Q6MSxEYXRhVHJhbnNmZXJJdGVtTGlzdDowLEZpbGVMaXN0OjAsSFRNTEFsbENvbGxlY3Rpb246MCxIVE1MQ29sbGVjdGlvbjowLEhUTUxGb3JtRWxlbWVudDowLEhUTUxTZWxlY3RFbGVtZW50OjAsTWVkaWFMaXN0OjAsTWltZVR5cGVBcnJheTowLE5hbWVkTm9kZU1hcDowLE5vZGVMaXN0OjEsUGFpbnRSZXF1ZXN0TGlzdDowLFBsdWdpbjowLFBsdWdpbkFycmF5OjAsU1ZHTGVuZ3RoTGlzdDowLFNWR051bWJlckxpc3Q6MCxTVkdQYXRoU2VnTGlzdDowLFNWR1BvaW50TGlzdDowLFNWR1N0cmluZ0xpc3Q6MCxTVkdUcmFuc2Zvcm1MaXN0OjAsU291cmNlQnVmZmVyTGlzdDowLFN0eWxlU2hlZXRMaXN0OjAsVGV4dFRyYWNrQ3VlTGlzdDowLFRleHRUcmFja0xpc3Q6MCxUb3VjaExpc3Q6MH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big2MiksaT1uKDE2OSksbz1uKDMwMCksdT1uKDMwNSkscz1uKDQ1KSxhPW4oMzA2KSxjPW4oMzEyKSxmPW4oMzEzKSxsPW4oMzE1KSxwPXMuY3JlYXRlRWxlbWVudCxoPXMuY3JlYXRlRmFjdG9yeSxkPXMuY2xvbmVFbGVtZW50LHk9cix2PXtDaGlsZHJlbjp7bWFwOm8ubWFwLGZvckVhY2g6by5mb3JFYWNoLGNvdW50Om8uY291bnQsdG9BcnJheTpvLnRvQXJyYXksb25seTpsfSxDb21wb25lbnQ6aS5Db21wb25lbnQsUHVyZUNvbXBvbmVudDppLlB1cmVDb21wb25lbnQsY3JlYXRlRWxlbWVudDpwLGNsb25lRWxlbWVudDpkLGlzVmFsaWRFbGVtZW50OnMuaXNWYWxpZEVsZW1lbnQsUHJvcFR5cGVzOmEsY3JlYXRlQ2xhc3M6ZixjcmVhdGVGYWN0b3J5OmgsY3JlYXRlTWl4aW46ZnVuY3Rpb24odCl7cmV0dXJuIHR9LERPTTp1LHZlcnNpb246YyxfX3NwcmVhZDp5fTt0LmV4cG9ydHM9dn0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9e319LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dC5leHBvcnRzPWZ1bmN0aW9uKCl7fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMwMSksaT1uKDQ1KSxvPW4oMTcxKSx1PW4oMzAyKSxzPXIudHdvQXJndW1lbnRQb29sZXIsYT1yLmZvdXJBcmd1bWVudFBvb2xlcixjPS9cLysvZztmdW5jdGlvbiBmKHQpe3JldHVybigiIit0KS5yZXBsYWNlKGMsIiQmLyIpfWZ1bmN0aW9uIGwodCxlKXt0aGlzLmZ1bmM9dCx0aGlzLmNvbnRleHQ9ZSx0aGlzLmNvdW50PTB9ZnVuY3Rpb24gcCh0LGUsbil7dmFyIHI9dC5mdW5jLGk9dC5jb250ZXh0O3IuY2FsbChpLGUsdC5jb3VudCsrKX1mdW5jdGlvbiBoKHQsZSxuLHIpe3RoaXMucmVzdWx0PXQsdGhpcy5rZXlQcmVmaXg9ZSx0aGlzLmZ1bmM9bix0aGlzLmNvbnRleHQ9cix0aGlzLmNvdW50PTB9ZnVuY3Rpb24gZCh0LGUsbil7dmFyIHI9dC5yZXN1bHQsdT10LmtleVByZWZpeCxzPXQuZnVuYyxhPXQuY29udGV4dCxjPXMuY2FsbChhLGUsdC5jb3VudCsrKTtBcnJheS5pc0FycmF5KGMpP3koYyxyLG4sby50aGF0UmV0dXJuc0FyZ3VtZW50KTpudWxsIT1jJiYoaS5pc1ZhbGlkRWxlbWVudChjKSYmKGM9aS5jbG9uZUFuZFJlcGxhY2VLZXkoYyx1KyghYy5rZXl8fGUmJmUua2V5PT09Yy5rZXk/IiI6ZihjLmtleSkrIi8iKStuKSksci5wdXNoKGMpKX1mdW5jdGlvbiB5KHQsZSxuLHIsaSl7dmFyIG89IiI7bnVsbCE9biYmKG89ZihuKSsiLyIpO3ZhciBzPWguZ2V0UG9vbGVkKGUsbyxyLGkpO3UodCxkLHMpLGgucmVsZWFzZShzKX1mdW5jdGlvbiB2KHQsZSxuKXtyZXR1cm4gbnVsbH1sLnByb3RvdHlwZS5kZXN0cnVjdG9yPWZ1bmN0aW9uKCl7dGhpcy5mdW5jPW51bGwsdGhpcy5jb250ZXh0PW51bGwsdGhpcy5jb3VudD0wfSxyLmFkZFBvb2xpbmdUbyhsLHMpLGgucHJvdG90eXBlLmRlc3RydWN0b3I9ZnVuY3Rpb24oKXt0aGlzLnJlc3VsdD1udWxsLHRoaXMua2V5UHJlZml4PW51bGwsdGhpcy5mdW5jPW51bGwsdGhpcy5jb250ZXh0PW51bGwsdGhpcy5jb3VudD0wfSxyLmFkZFBvb2xpbmdUbyhoLGEpO3ZhciBnPXtmb3JFYWNoOmZ1bmN0aW9uKHQsZSxuKXtpZihudWxsPT10KXJldHVybiB0O3ZhciByPWwuZ2V0UG9vbGVkKGUsbik7dSh0LHAsciksbC5yZWxlYXNlKHIpfSxtYXA6ZnVuY3Rpb24odCxlLG4pe2lmKG51bGw9PXQpcmV0dXJuIHQ7dmFyIHI9W107cmV0dXJuIHkodCxyLG51bGwsZSxuKSxyfSxtYXBJbnRvV2l0aEtleVByZWZpeEludGVybmFsOnksY291bnQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdSh0LHYsbnVsbCl9LHRvQXJyYXk6ZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIHkodCxlLG51bGwsby50aGF0UmV0dXJuc0FyZ3VtZW50KSxlfX07dC5leHBvcnRzPWd9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big4NSksaT0obig4NiksZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZihlLmluc3RhbmNlUG9vbC5sZW5ndGgpe3ZhciBuPWUuaW5zdGFuY2VQb29sLnBvcCgpO3JldHVybiBlLmNhbGwobix0KSxufXJldHVybiBuZXcgZSh0KX0pLG89ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0IGluc3RhbmNlb2YgZXx8cigiMjUiKSx0LmRlc3RydWN0b3IoKSxlLmluc3RhbmNlUG9vbC5sZW5ndGg8ZS5wb29sU2l6ZSYmZS5pbnN0YW5jZVBvb2wucHVzaCh0KX0sdT1pLHM9e2FkZFBvb2xpbmdUbzpmdW5jdGlvbih0LGUpe3ZhciBuPXQ7cmV0dXJuIG4uaW5zdGFuY2VQb29sPVtdLG4uZ2V0UG9vbGVkPWV8fHUsbi5wb29sU2l6ZXx8KG4ucG9vbFNpemU9MTApLG4ucmVsZWFzZT1vLG59LG9uZUFyZ3VtZW50UG9vbGVyOmksdHdvQXJndW1lbnRQb29sZXI6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO2lmKG4uaW5zdGFuY2VQb29sLmxlbmd0aCl7dmFyIHI9bi5pbnN0YW5jZVBvb2wucG9wKCk7cmV0dXJuIG4uY2FsbChyLHQsZSkscn1yZXR1cm4gbmV3IG4odCxlKX0sdGhyZWVBcmd1bWVudFBvb2xlcjpmdW5jdGlvbih0LGUsbil7dmFyIHI9dGhpcztpZihyLmluc3RhbmNlUG9vbC5sZW5ndGgpe3ZhciBpPXIuaW5zdGFuY2VQb29sLnBvcCgpO3JldHVybiByLmNhbGwoaSx0LGUsbiksaX1yZXR1cm4gbmV3IHIodCxlLG4pfSxmb3VyQXJndW1lbnRQb29sZXI6ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9dGhpcztpZihpLmluc3RhbmNlUG9vbC5sZW5ndGgpe3ZhciBvPWkuaW5zdGFuY2VQb29sLnBvcCgpO3JldHVybiBpLmNhbGwobyx0LGUsbixyKSxvfXJldHVybiBuZXcgaSh0LGUsbixyKX19O3QuZXhwb3J0cz1zfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oODUpLGk9KG4oMTczKSxuKDE3NCkpLG89bigzMDMpLHU9KG4oODYpLG4oMzA0KSk7bigxMjEpO2Z1bmN0aW9uIHModCxlKXtyZXR1cm4gdCYmIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT10LmtleT91LmVzY2FwZSh0LmtleSk6ZS50b1N0cmluZygzNil9ZnVuY3Rpb24gYSh0LGUsbixjKXt2YXIgZixsPXR5cGVvZiB0O2lmKCJ1bmRlZmluZWQiIT09bCYmImJvb2xlYW4iIT09bHx8KHQ9bnVsbCksbnVsbD09PXR8fCJzdHJpbmciPT09bHx8Im51bWJlciI9PT1sfHwib2JqZWN0Ij09PWwmJnQuJCR0eXBlb2Y9PT1pKXJldHVybiBuKGMsdCwiIj09PWU/Ii4iK3ModCwwKTplKSwxO3ZhciBwPTAsaD0iIj09PWU/Ii4iOmUrIjoiO2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKHZhciBkPTA7ZDx0Lmxlbmd0aDtkKyspcCs9YShmPXRbZF0saCtzKGYsZCksbixjKTtlbHNle3ZhciB5PW8odCk7aWYoeSl7dmFyIHYsZz15LmNhbGwodCk7aWYoeSE9PXQuZW50cmllcylmb3IodmFyIHc9MDshKHY9Zy5uZXh0KCkpLmRvbmU7KXArPWEoZj12LnZhbHVlLGgrcyhmLHcrKyksbixjKTtlbHNlIGZvcig7ISh2PWcubmV4dCgpKS5kb25lOyl7dmFyIE09di52YWx1ZTtNJiYocCs9YShmPU1bMV0saCt1LmVzY2FwZShNWzBdKSsiOiIrcyhmLDApLG4sYykpfX1lbHNlIGlmKCJvYmplY3QiPT09bCl7dmFyIG09U3RyaW5nKHQpO3IoIjMxIiwiW29iamVjdCBPYmplY3RdIj09PW0/Im9iamVjdCB3aXRoIGtleXMgeyIrT2JqZWN0LmtleXModCkuam9pbigiLCAiKSsifSI6bSwiIil9fXJldHVybiBwfXQuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG51bGw9PXQ/MDphKHQsIiIsZSxuKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10JiYociYmdFtyXXx8dFsiQEBpdGVyYXRvciJdKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgZSlyZXR1cm4gZX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9e2VzY2FwZTpmdW5jdGlvbih0KXt2YXIgZT17Ij0iOiI9MCIsIjoiOiI9MiJ9O3JldHVybiIkIisoIiIrdCkucmVwbGFjZSgvWz06XS9nLChmdW5jdGlvbih0KXtyZXR1cm4gZVt0XX0pKX0sdW5lc2NhcGU6ZnVuY3Rpb24odCl7dmFyIGU9eyI9MCI6Ij0iLCI9MiI6IjoifTtyZXR1cm4oIiIrKCIuIj09PXRbMF0mJiIkIj09PXRbMV0/dC5zdWJzdHJpbmcoMik6dC5zdWJzdHJpbmcoMSkpKS5yZXBsYWNlKC8oPTB8PTIpL2csKGZ1bmN0aW9uKHQpe3JldHVybiBlW3RdfSkpfX07dC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big0NSkuY3JlYXRlRmFjdG9yeSxpPXthOnIoImEiKSxhYmJyOnIoImFiYnIiKSxhZGRyZXNzOnIoImFkZHJlc3MiKSxhcmVhOnIoImFyZWEiKSxhcnRpY2xlOnIoImFydGljbGUiKSxhc2lkZTpyKCJhc2lkZSIpLGF1ZGlvOnIoImF1ZGlvIiksYjpyKCJiIiksYmFzZTpyKCJiYXNlIiksYmRpOnIoImJkaSIpLGJkbzpyKCJiZG8iKSxiaWc6cigiYmlnIiksYmxvY2txdW90ZTpyKCJibG9ja3F1b3RlIiksYm9keTpyKCJib2R5IiksYnI6cigiYnIiKSxidXR0b246cigiYnV0dG9uIiksY2FudmFzOnIoImNhbnZhcyIpLGNhcHRpb246cigiY2FwdGlvbiIpLGNpdGU6cigiY2l0ZSIpLGNvZGU6cigiY29kZSIpLGNvbDpyKCJjb2wiKSxjb2xncm91cDpyKCJjb2xncm91cCIpLGRhdGE6cigiZGF0YSIpLGRhdGFsaXN0OnIoImRhdGFsaXN0IiksZGQ6cigiZGQiKSxkZWw6cigiZGVsIiksZGV0YWlsczpyKCJkZXRhaWxzIiksZGZuOnIoImRmbiIpLGRpYWxvZzpyKCJkaWFsb2ciKSxkaXY6cigiZGl2IiksZGw6cigiZGwiKSxkdDpyKCJkdCIpLGVtOnIoImVtIiksZW1iZWQ6cigiZW1iZWQiKSxmaWVsZHNldDpyKCJmaWVsZHNldCIpLGZpZ2NhcHRpb246cigiZmlnY2FwdGlvbiIpLGZpZ3VyZTpyKCJmaWd1cmUiKSxmb290ZXI6cigiZm9vdGVyIiksZm9ybTpyKCJmb3JtIiksaDE6cigiaDEiKSxoMjpyKCJoMiIpLGgzOnIoImgzIiksaDQ6cigiaDQiKSxoNTpyKCJoNSIpLGg2OnIoImg2IiksaGVhZDpyKCJoZWFkIiksaGVhZGVyOnIoImhlYWRlciIpLGhncm91cDpyKCJoZ3JvdXAiKSxocjpyKCJociIpLGh0bWw6cigiaHRtbCIpLGk6cigiaSIpLGlmcmFtZTpyKCJpZnJhbWUiKSxpbWc6cigiaW1nIiksaW5wdXQ6cigiaW5wdXQiKSxpbnM6cigiaW5zIiksa2JkOnIoImtiZCIpLGtleWdlbjpyKCJrZXlnZW4iKSxsYWJlbDpyKCJsYWJlbCIpLGxlZ2VuZDpyKCJsZWdlbmQiKSxsaTpyKCJsaSIpLGxpbms6cigibGluayIpLG1haW46cigibWFpbiIpLG1hcDpyKCJtYXAiKSxtYXJrOnIoIm1hcmsiKSxtZW51OnIoIm1lbnUiKSxtZW51aXRlbTpyKCJtZW51aXRlbSIpLG1ldGE6cigibWV0YSIpLG1ldGVyOnIoIm1ldGVyIiksbmF2OnIoIm5hdiIpLG5vc2NyaXB0OnIoIm5vc2NyaXB0Iiksb2JqZWN0OnIoIm9iamVjdCIpLG9sOnIoIm9sIiksb3B0Z3JvdXA6cigib3B0Z3JvdXAiKSxvcHRpb246cigib3B0aW9uIiksb3V0cHV0OnIoIm91dHB1dCIpLHA6cigicCIpLHBhcmFtOnIoInBhcmFtIikscGljdHVyZTpyKCJwaWN0dXJlIikscHJlOnIoInByZSIpLHByb2dyZXNzOnIoInByb2dyZXNzIikscTpyKCJxIikscnA6cigicnAiKSxydDpyKCJydCIpLHJ1Ynk6cigicnVieSIpLHM6cigicyIpLHNhbXA6cigic2FtcCIpLHNjcmlwdDpyKCJzY3JpcHQiKSxzZWN0aW9uOnIoInNlY3Rpb24iKSxzZWxlY3Q6cigic2VsZWN0Iiksc21hbGw6cigic21hbGwiKSxzb3VyY2U6cigic291cmNlIiksc3BhbjpyKCJzcGFuIiksc3Ryb25nOnIoInN0cm9uZyIpLHN0eWxlOnIoInN0eWxlIiksc3ViOnIoInN1YiIpLHN1bW1hcnk6cigic3VtbWFyeSIpLHN1cDpyKCJzdXAiKSx0YWJsZTpyKCJ0YWJsZSIpLHRib2R5OnIoInRib2R5IiksdGQ6cigidGQiKSx0ZXh0YXJlYTpyKCJ0ZXh0YXJlYSIpLHRmb290OnIoInRmb290IiksdGg6cigidGgiKSx0aGVhZDpyKCJ0aGVhZCIpLHRpbWU6cigidGltZSIpLHRpdGxlOnIoInRpdGxlIiksdHI6cigidHIiKSx0cmFjazpyKCJ0cmFjayIpLHU6cigidSIpLHVsOnIoInVsIiksdmFyOnIoInZhciIpLHZpZGVvOnIoInZpZGVvIiksd2JyOnIoIndiciIpLGNpcmNsZTpyKCJjaXJjbGUiKSxjbGlwUGF0aDpyKCJjbGlwUGF0aCIpLGRlZnM6cigiZGVmcyIpLGVsbGlwc2U6cigiZWxsaXBzZSIpLGc6cigiZyIpLGltYWdlOnIoImltYWdlIiksbGluZTpyKCJsaW5lIiksbGluZWFyR3JhZGllbnQ6cigibGluZWFyR3JhZGllbnQiKSxtYXNrOnIoIm1hc2siKSxwYXRoOnIoInBhdGgiKSxwYXR0ZXJuOnIoInBhdHRlcm4iKSxwb2x5Z29uOnIoInBvbHlnb24iKSxwb2x5bGluZTpyKCJwb2x5bGluZSIpLHJhZGlhbEdyYWRpZW50OnIoInJhZGlhbEdyYWRpZW50IikscmVjdDpyKCJyZWN0Iiksc3RvcDpyKCJzdG9wIiksc3ZnOnIoInN2ZyIpLHRleHQ6cigidGV4dCIpLHRzcGFuOnIoInRzcGFuIil9O3QuZXhwb3J0cz1pfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNDUpLmlzVmFsaWRFbGVtZW50LGk9bigzMDcpO3QuZXhwb3J0cz1pKHIpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzA4KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHIodCwhMSl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzA5KSxpPW4oNjIpLG89bigxNzUpLHU9bigzMTEpLHM9RnVuY3Rpb24uY2FsbC5iaW5kKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpO2Z1bmN0aW9uIGEoKXtyZXR1cm4gbnVsbH10LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3I7dmFyIGM9Ijw8YW5vbnltb3VzPj4iLGY9e2FycmF5OmQoImFycmF5IiksYm9vbDpkKCJib29sZWFuIiksZnVuYzpkKCJmdW5jdGlvbiIpLG51bWJlcjpkKCJudW1iZXIiKSxvYmplY3Q6ZCgib2JqZWN0Iiksc3RyaW5nOmQoInN0cmluZyIpLHN5bWJvbDpkKCJzeW1ib2wiKSxhbnk6aChhKSxhcnJheU9mOmZ1bmN0aW9uKHQpe3JldHVybiBoKChmdW5jdGlvbihlLG4scixpLHUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXJldHVybiBuZXcgcCgiUHJvcGVydHkgYCIrdSsiYCBvZiBjb21wb25lbnQgYCIrcisiYCBoYXMgaW52YWxpZCBQcm9wVHlwZSBub3RhdGlvbiBpbnNpZGUgYXJyYXlPZi4iKTt2YXIgcz1lW25dO2lmKCFBcnJheS5pc0FycmF5KHMpKXJldHVybiBuZXcgcCgiSW52YWxpZCAiK2krIiBgIit1KyJgIG9mIHR5cGUgYCIrdihzKSsiYCBzdXBwbGllZCB0byBgIityKyJgLCBleHBlY3RlZCBhbiBhcnJheS4iKTtmb3IodmFyIGE9MDthPHMubGVuZ3RoO2ErKyl7dmFyIGM9dChzLGEscixpLHUrIlsiK2ErIl0iLG8pO2lmKGMgaW5zdGFuY2VvZiBFcnJvcilyZXR1cm4gY31yZXR1cm4gbnVsbH0pKX0sZWxlbWVudDpoKChmdW5jdGlvbihlLG4scixpLG8pe3ZhciB1PWVbbl07cmV0dXJuIHQodSk/bnVsbDpuZXcgcCgiSW52YWxpZCAiK2krIiBgIitvKyJgIG9mIHR5cGUgYCIrdih1KSsiYCBzdXBwbGllZCB0byBgIityKyJgLCBleHBlY3RlZCBhIHNpbmdsZSBSZWFjdEVsZW1lbnQuIil9KSksZWxlbWVudFR5cGU6aCgoZnVuY3Rpb24odCxlLG4saSxvKXt2YXIgdT10W2VdO3JldHVybiByLmlzVmFsaWRFbGVtZW50VHlwZSh1KT9udWxsOm5ldyBwKCJJbnZhbGlkICIraSsiIGAiK28rImAgb2YgdHlwZSBgIit2KHUpKyJgIHN1cHBsaWVkIHRvIGAiK24rImAsIGV4cGVjdGVkIGEgc2luZ2xlIFJlYWN0RWxlbWVudCB0eXBlLiIpfSkpLGluc3RhbmNlT2Y6ZnVuY3Rpb24odCl7cmV0dXJuIGgoKGZ1bmN0aW9uKGUsbixyLGksbyl7aWYoIShlW25daW5zdGFuY2VvZiB0KSl7dmFyIHU9dC5uYW1lfHxjO3JldHVybiBuZXcgcCgiSW52YWxpZCAiK2krIiBgIitvKyJgIG9mIHR5cGUgYCIrKCgocz1lW25dKS5jb25zdHJ1Y3RvciYmcy5jb25zdHJ1Y3Rvci5uYW1lP3MuY29uc3RydWN0b3IubmFtZTpjKSsiYCBzdXBwbGllZCB0byBgIikrcisiYCwgZXhwZWN0ZWQgaW5zdGFuY2Ugb2YgYCIrdSsiYC4iKX12YXIgcztyZXR1cm4gbnVsbH0pKX0sbm9kZTpoKChmdW5jdGlvbih0LGUsbixyLGkpe3JldHVybiB5KHRbZV0pP251bGw6bmV3IHAoIkludmFsaWQgIityKyIgYCIraSsiYCBzdXBwbGllZCB0byBgIituKyJgLCBleHBlY3RlZCBhIFJlYWN0Tm9kZS4iKX0pKSxvYmplY3RPZjpmdW5jdGlvbih0KXtyZXR1cm4gaCgoZnVuY3Rpb24oZSxuLHIsaSx1KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdClyZXR1cm4gbmV3IHAoIlByb3BlcnR5IGAiK3UrImAgb2YgY29tcG9uZW50IGAiK3IrImAgaGFzIGludmFsaWQgUHJvcFR5cGUgbm90YXRpb24gaW5zaWRlIG9iamVjdE9mLiIpO3ZhciBhPWVbbl0sYz12KGEpO2lmKCJvYmplY3QiIT09YylyZXR1cm4gbmV3IHAoIkludmFsaWQgIitpKyIgYCIrdSsiYCBvZiB0eXBlIGAiK2MrImAgc3VwcGxpZWQgdG8gYCIrcisiYCwgZXhwZWN0ZWQgYW4gb2JqZWN0LiIpO2Zvcih2YXIgZiBpbiBhKWlmKHMoYSxmKSl7dmFyIGw9dChhLGYscixpLHUrIi4iK2Ysbyk7aWYobCBpbnN0YW5jZW9mIEVycm9yKXJldHVybiBsfXJldHVybiBudWxsfSkpfSxvbmVPZjpmdW5jdGlvbih0KXtpZighQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gYTtyZXR1cm4gaCgoZnVuY3Rpb24oZSxuLHIsaSxvKXtmb3IodmFyIHU9ZVtuXSxzPTA7czx0Lmxlbmd0aDtzKyspaWYobCh1LHRbc10pKXJldHVybiBudWxsO3ZhciBhPUpTT04uc3RyaW5naWZ5KHQsKGZ1bmN0aW9uKHQsZSl7cmV0dXJuInN5bWJvbCI9PT1nKGUpP1N0cmluZyhlKTplfSkpO3JldHVybiBuZXcgcCgiSW52YWxpZCAiK2krIiBgIitvKyJgIG9mIHZhbHVlIGAiK1N0cmluZyh1KSsiYCBzdXBwbGllZCB0byBgIityKyJgLCBleHBlY3RlZCBvbmUgb2YgIithKyIuIil9KSl9LG9uZU9mVHlwZTpmdW5jdGlvbih0KXtpZighQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gYTtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKyl7dmFyIG49dFtlXTtpZigiZnVuY3Rpb24iIT10eXBlb2YgbilyZXR1cm4gdyhuKSxhfXJldHVybiBoKChmdW5jdGlvbihlLG4scixpLHUpe2Zvcih2YXIgcz0wO3M8dC5sZW5ndGg7cysrKWlmKG51bGw9PSgwLHRbc10pKGUsbixyLGksdSxvKSlyZXR1cm4gbnVsbDtyZXR1cm4gbmV3IHAoIkludmFsaWQgIitpKyIgYCIrdSsiYCBzdXBwbGllZCB0byBgIityKyJgLiIpfSkpfSxzaGFwZTpmdW5jdGlvbih0KXtyZXR1cm4gaCgoZnVuY3Rpb24oZSxuLHIsaSx1KXt2YXIgcz1lW25dLGE9dihzKTtpZigib2JqZWN0IiE9PWEpcmV0dXJuIG5ldyBwKCJJbnZhbGlkICIraSsiIGAiK3UrImAgb2YgdHlwZSBgIithKyJgIHN1cHBsaWVkIHRvIGAiK3IrImAsIGV4cGVjdGVkIGBvYmplY3RgLiIpO2Zvcih2YXIgYyBpbiB0KXt2YXIgZj10W2NdO2lmKGYpe3ZhciBsPWYocyxjLHIsaSx1KyIuIitjLG8pO2lmKGwpcmV0dXJuIGx9fXJldHVybiBudWxsfSkpfSxleGFjdDpmdW5jdGlvbih0KXtyZXR1cm4gaCgoZnVuY3Rpb24oZSxuLHIsdSxzKXt2YXIgYT1lW25dLGM9dihhKTtpZigib2JqZWN0IiE9PWMpcmV0dXJuIG5ldyBwKCJJbnZhbGlkICIrdSsiIGAiK3MrImAgb2YgdHlwZSBgIitjKyJgIHN1cHBsaWVkIHRvIGAiK3IrImAsIGV4cGVjdGVkIGBvYmplY3RgLiIpO3ZhciBmPWkoe30sZVtuXSx0KTtmb3IodmFyIGwgaW4gZil7dmFyIGg9dFtsXTtpZighaClyZXR1cm4gbmV3IHAoIkludmFsaWQgIit1KyIgYCIrcysiYCBrZXkgYCIrbCsiYCBzdXBwbGllZCB0byBgIityKyJgLlxuQmFkIG9iamVjdDogIitKU09OLnN0cmluZ2lmeShlW25dLG51bGwsIiAgIikrIlxuVmFsaWQga2V5czogIitKU09OLnN0cmluZ2lmeShPYmplY3Qua2V5cyh0KSxudWxsLCIgICIpKTt2YXIgZD1oKGEsbCxyLHUscysiLiIrbCxvKTtpZihkKXJldHVybiBkfXJldHVybiBudWxsfSkpfX07ZnVuY3Rpb24gbCh0LGUpe3JldHVybiB0PT09ZT8wIT09dHx8MS90PT0xL2U6dCE9dCYmZSE9ZX1mdW5jdGlvbiBwKHQpe3RoaXMubWVzc2FnZT10LHRoaXMuc3RhY2s9IiJ9ZnVuY3Rpb24gaCh0KXtmdW5jdGlvbiBuKG4scixpLHUscyxhLGYpe2lmKCh1PXV8fGMsYT1hfHxpLGYhPT1vKSYmZSl7dmFyIGw9bmV3IEVycm9yKCJDYWxsaW5nIFByb3BUeXBlcyB2YWxpZGF0b3JzIGRpcmVjdGx5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiBVc2UgYFByb3BUeXBlcy5jaGVja1Byb3BUeXBlcygpYCB0byBjYWxsIHRoZW0uIFJlYWQgbW9yZSBhdCBodHRwOi8vZmIubWUvdXNlLWNoZWNrLXByb3AtdHlwZXMiKTt0aHJvdyBsLm5hbWU9IkludmFyaWFudCBWaW9sYXRpb24iLGx9cmV0dXJuIG51bGw9PXJbaV0/bj9udWxsPT09cltpXT9uZXcgcCgiVGhlICIrcysiIGAiK2ErImAgaXMgbWFya2VkIGFzIHJlcXVpcmVkIGluIGAiK3UrImAsIGJ1dCBpdHMgdmFsdWUgaXMgYG51bGxgLiIpOm5ldyBwKCJUaGUgIitzKyIgYCIrYSsiYCBpcyBtYXJrZWQgYXMgcmVxdWlyZWQgaW4gYCIrdSsiYCwgYnV0IGl0cyB2YWx1ZSBpcyBgdW5kZWZpbmVkYC4iKTpudWxsOnQocixpLHUscyxhKX12YXIgcj1uLmJpbmQobnVsbCwhMSk7cmV0dXJuIHIuaXNSZXF1aXJlZD1uLmJpbmQobnVsbCwhMCkscn1mdW5jdGlvbiBkKHQpe3JldHVybiBoKChmdW5jdGlvbihlLG4scixpLG8sdSl7dmFyIHM9ZVtuXTtyZXR1cm4gdihzKSE9PXQ/bmV3IHAoIkludmFsaWQgIitpKyIgYCIrbysiYCBvZiB0eXBlIGAiK2cocykrImAgc3VwcGxpZWQgdG8gYCIrcisiYCwgZXhwZWN0ZWQgYCIrdCsiYC4iKTpudWxsfSkpfWZ1bmN0aW9uIHkoZSl7c3dpdGNoKHR5cGVvZiBlKXtjYXNlIm51bWJlciI6Y2FzZSJzdHJpbmciOmNhc2UidW5kZWZpbmVkIjpyZXR1cm4hMDtjYXNlImJvb2xlYW4iOnJldHVybiFlO2Nhc2Uib2JqZWN0IjppZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlLmV2ZXJ5KHkpO2lmKG51bGw9PT1lfHx0KGUpKXJldHVybiEwO3ZhciByPWZ1bmN0aW9uKHQpe3ZhciBlPXQmJihuJiZ0W25dfHx0WyJAQGl0ZXJhdG9yIl0pO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBlKXJldHVybiBlfShlKTtpZighcilyZXR1cm4hMTt2YXIgaSxvPXIuY2FsbChlKTtpZihyIT09ZS5lbnRyaWVzKXtmb3IoOyEoaT1vLm5leHQoKSkuZG9uZTspaWYoIXkoaS52YWx1ZSkpcmV0dXJuITF9ZWxzZSBmb3IoOyEoaT1vLm5leHQoKSkuZG9uZTspe3ZhciB1PWkudmFsdWU7aWYodSYmIXkodVsxXSkpcmV0dXJuITF9cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gdih0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT8iYXJyYXkiOnQgaW5zdGFuY2VvZiBSZWdFeHA/Im9iamVjdCI6ZnVuY3Rpb24odCxlKXtyZXR1cm4ic3ltYm9sIj09PXR8fCEhZSYmKCJTeW1ib2wiPT09ZVsiQEB0b1N0cmluZ1RhZyJdfHwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZlIGluc3RhbmNlb2YgU3ltYm9sKX0oZSx0KT8ic3ltYm9sIjplfWZ1bmN0aW9uIGcodCl7aWYobnVsbD09dClyZXR1cm4iIit0O3ZhciBlPXYodCk7aWYoIm9iamVjdCI9PT1lKXtpZih0IGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4iZGF0ZSI7aWYodCBpbnN0YW5jZW9mIFJlZ0V4cClyZXR1cm4icmVnZXhwIn1yZXR1cm4gZX1mdW5jdGlvbiB3KHQpe3ZhciBlPWcodCk7c3dpdGNoKGUpe2Nhc2UiYXJyYXkiOmNhc2Uib2JqZWN0IjpyZXR1cm4iYW4gIitlO2Nhc2UiYm9vbGVhbiI6Y2FzZSJkYXRlIjpjYXNlInJlZ2V4cCI6cmV0dXJuImEgIitlO2RlZmF1bHQ6cmV0dXJuIGV9fXJldHVybiBwLnByb3RvdHlwZT1FcnJvci5wcm90b3R5cGUsZi5jaGVja1Byb3BUeXBlcz11LGYucmVzZXRXYXJuaW5nQ2FjaGU9dS5yZXNldFdhcm5pbmdDYWNoZSxmLlByb3BUeXBlcz1mLGZ9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3QuZXhwb3J0cz1uKDMxMCl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5mb3IsaT1yP1N5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKTo2MDEwMyxvPXI/U3ltYm9sLmZvcigicmVhY3QucG9ydGFsIik6NjAxMDYsdT1yP1N5bWJvbC5mb3IoInJlYWN0LmZyYWdtZW50Iik6NjAxMDcscz1yP1N5bWJvbC5mb3IoInJlYWN0LnN0cmljdF9tb2RlIik6NjAxMDgsYT1yP1N5bWJvbC5mb3IoInJlYWN0LnByb2ZpbGVyIik6NjAxMTQsYz1yP1N5bWJvbC5mb3IoInJlYWN0LnByb3ZpZGVyIik6NjAxMDksZj1yP1N5bWJvbC5mb3IoInJlYWN0LmNvbnRleHQiKTo2MDExMCxsPXI/U3ltYm9sLmZvcigicmVhY3QuYXN5bmNfbW9kZSIpOjYwMTExLHA9cj9TeW1ib2wuZm9yKCJyZWFjdC5jb25jdXJyZW50X21vZGUiKTo2MDExMSxoPXI/U3ltYm9sLmZvcigicmVhY3QuZm9yd2FyZF9yZWYiKTo2MDExMixkPXI/U3ltYm9sLmZvcigicmVhY3Quc3VzcGVuc2UiKTo2MDExMyx5PXI/U3ltYm9sLmZvcigicmVhY3QubWVtbyIpOjYwMTE1LHY9cj9TeW1ib2wuZm9yKCJyZWFjdC5sYXp5Iik6NjAxMTY7ZnVuY3Rpb24gZyh0KXtpZigib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10KXt2YXIgZT10LiQkdHlwZW9mO3N3aXRjaChlKXtjYXNlIGk6c3dpdGNoKHQ9dC50eXBlKXtjYXNlIGw6Y2FzZSBwOmNhc2UgdTpjYXNlIGE6Y2FzZSBzOmNhc2UgZDpyZXR1cm4gdDtkZWZhdWx0OnN3aXRjaCh0PXQmJnQuJCR0eXBlb2Ype2Nhc2UgZjpjYXNlIGg6Y2FzZSBjOnJldHVybiB0O2RlZmF1bHQ6cmV0dXJuIGV9fWNhc2UgdjpjYXNlIHk6Y2FzZSBvOnJldHVybiBlfX19ZnVuY3Rpb24gdyh0KXtyZXR1cm4gZyh0KT09PXB9ZS50eXBlT2Y9ZyxlLkFzeW5jTW9kZT1sLGUuQ29uY3VycmVudE1vZGU9cCxlLkNvbnRleHRDb25zdW1lcj1mLGUuQ29udGV4dFByb3ZpZGVyPWMsZS5FbGVtZW50PWksZS5Gb3J3YXJkUmVmPWgsZS5GcmFnbWVudD11LGUuTGF6eT12LGUuTWVtbz15LGUuUG9ydGFsPW8sZS5Qcm9maWxlcj1hLGUuU3RyaWN0TW9kZT1zLGUuU3VzcGVuc2U9ZCxlLmlzVmFsaWRFbGVtZW50VHlwZT1mdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHR8fCJmdW5jdGlvbiI9PXR5cGVvZiB0fHx0PT09dXx8dD09PXB8fHQ9PT1hfHx0PT09c3x8dD09PWR8fCJvYmplY3QiPT10eXBlb2YgdCYmbnVsbCE9PXQmJih0LiQkdHlwZW9mPT09dnx8dC4kJHR5cGVvZj09PXl8fHQuJCR0eXBlb2Y9PT1jfHx0LiQkdHlwZW9mPT09Znx8dC4kJHR5cGVvZj09PWgpfSxlLmlzQXN5bmNNb2RlPWZ1bmN0aW9uKHQpe3JldHVybiB3KHQpfHxnKHQpPT09bH0sZS5pc0NvbmN1cnJlbnRNb2RlPXcsZS5pc0NvbnRleHRDb25zdW1lcj1mdW5jdGlvbih0KXtyZXR1cm4gZyh0KT09PWZ9LGUuaXNDb250ZXh0UHJvdmlkZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGcodCk9PT1jfSxlLmlzRWxlbWVudD1mdW5jdGlvbih0KXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10JiZ0LiQkdHlwZW9mPT09aX0sZS5pc0ZvcndhcmRSZWY9ZnVuY3Rpb24odCl7cmV0dXJuIGcodCk9PT1ofSxlLmlzRnJhZ21lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGcodCk9PT11fSxlLmlzTGF6eT1mdW5jdGlvbih0KXtyZXR1cm4gZyh0KT09PXZ9LGUuaXNNZW1vPWZ1bmN0aW9uKHQpe3JldHVybiBnKHQpPT09eX0sZS5pc1BvcnRhbD1mdW5jdGlvbih0KXtyZXR1cm4gZyh0KT09PW99LGUuaXNQcm9maWxlcj1mdW5jdGlvbih0KXtyZXR1cm4gZyh0KT09PWF9LGUuaXNTdHJpY3RNb2RlPWZ1bmN0aW9uKHQpe3JldHVybiBnKHQpPT09c30sZS5pc1N1c3BlbnNlPWZ1bmN0aW9uKHQpe3JldHVybiBnKHQpPT09ZH19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcih0LGUsbixyLGkpe31yLnJlc2V0V2FybmluZ0NhY2hlPWZ1bmN0aW9uKCl7MH0sdC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dC5leHBvcnRzPSIxNS43LjAifSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTY5KS5Db21wb25lbnQsaT1uKDQ1KS5pc1ZhbGlkRWxlbWVudCxvPW4oMTcwKSx1PW4oMzE0KTt0LmV4cG9ydHM9dShyLGksbyl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big2MiksaT17fTtmdW5jdGlvbiBvKHQsZSxuLHIsaSxvLHUscyl7aWYoIXQpe3ZhciBhO2lmKHZvaWQgMD09PWUpYT1uZXcgRXJyb3IoIk1pbmlmaWVkIGV4Y2VwdGlvbiBvY2N1cnJlZDsgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciB0aGUgZnVsbCBlcnJvciBtZXNzYWdlIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuIik7ZWxzZXt2YXIgYz1bbixyLGksbyx1LHNdLGY9MDsoYT1uZXcgRXJyb3IoZS5yZXBsYWNlKC8lcy9nLChmdW5jdGlvbigpe3JldHVybiBjW2YrK119KSkpKS5uYW1lPSJJbnZhcmlhbnQgVmlvbGF0aW9uIn10aHJvdyBhLmZyYW1lc1RvUG9wPTEsYX19dmFyIHU9Im1peGlucyI7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcz1bXSxhPXttaXhpbnM6IkRFRklORV9NQU5ZIixzdGF0aWNzOiJERUZJTkVfTUFOWSIscHJvcFR5cGVzOiJERUZJTkVfTUFOWSIsY29udGV4dFR5cGVzOiJERUZJTkVfTUFOWSIsY2hpbGRDb250ZXh0VHlwZXM6IkRFRklORV9NQU5ZIixnZXREZWZhdWx0UHJvcHM6IkRFRklORV9NQU5ZX01FUkdFRCIsZ2V0SW5pdGlhbFN0YXRlOiJERUZJTkVfTUFOWV9NRVJHRUQiLGdldENoaWxkQ29udGV4dDoiREVGSU5FX01BTllfTUVSR0VEIixyZW5kZXI6IkRFRklORV9PTkNFIixjb21wb25lbnRXaWxsTW91bnQ6IkRFRklORV9NQU5ZIixjb21wb25lbnREaWRNb3VudDoiREVGSU5FX01BTlkiLGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM6IkRFRklORV9NQU5ZIixzaG91bGRDb21wb25lbnRVcGRhdGU6IkRFRklORV9PTkNFIixjb21wb25lbnRXaWxsVXBkYXRlOiJERUZJTkVfTUFOWSIsY29tcG9uZW50RGlkVXBkYXRlOiJERUZJTkVfTUFOWSIsY29tcG9uZW50V2lsbFVubW91bnQ6IkRFRklORV9NQU5ZIixVTlNBRkVfY29tcG9uZW50V2lsbE1vdW50OiJERUZJTkVfTUFOWSIsVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM6IkRFRklORV9NQU5ZIixVTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZToiREVGSU5FX01BTlkiLHVwZGF0ZUNvbXBvbmVudDoiT1ZFUlJJREVfQkFTRSJ9LGM9e2dldERlcml2ZWRTdGF0ZUZyb21Qcm9wczoiREVGSU5FX01BTllfTUVSR0VEIn0sZj17ZGlzcGxheU5hbWU6ZnVuY3Rpb24odCxlKXt0LmRpc3BsYXlOYW1lPWV9LG1peGluczpmdW5jdGlvbih0LGUpe2lmKGUpZm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspcCh0LGVbbl0pfSxjaGlsZENvbnRleHRUeXBlczpmdW5jdGlvbih0LGUpe3QuY2hpbGRDb250ZXh0VHlwZXM9cih7fSx0LmNoaWxkQ29udGV4dFR5cGVzLGUpfSxjb250ZXh0VHlwZXM6ZnVuY3Rpb24odCxlKXt0LmNvbnRleHRUeXBlcz1yKHt9LHQuY29udGV4dFR5cGVzLGUpfSxnZXREZWZhdWx0UHJvcHM6ZnVuY3Rpb24odCxlKXt0LmdldERlZmF1bHRQcm9wcz90LmdldERlZmF1bHRQcm9wcz1kKHQuZ2V0RGVmYXVsdFByb3BzLGUpOnQuZ2V0RGVmYXVsdFByb3BzPWV9LHByb3BUeXBlczpmdW5jdGlvbih0LGUpe3QucHJvcFR5cGVzPXIoe30sdC5wcm9wVHlwZXMsZSl9LHN0YXRpY3M6ZnVuY3Rpb24odCxlKXshZnVuY3Rpb24odCxlKXtpZighZSlyZXR1cm47Zm9yKHZhciBuIGluIGUpe3ZhciByPWVbbl07aWYoZS5oYXNPd25Qcm9wZXJ0eShuKSl7aWYobyghKG4gaW4gZiksJ1JlYWN0Q2xhc3M6IFlvdSBhcmUgYXR0ZW1wdGluZyB0byBkZWZpbmUgYSByZXNlcnZlZCBwcm9wZXJ0eSwgYCVzYCwgdGhhdCBzaG91bGRuXCd0IGJlIG9uIHRoZSAic3RhdGljcyIga2V5LiBEZWZpbmUgaXQgYXMgYW4gaW5zdGFuY2UgcHJvcGVydHkgaW5zdGVhZDsgaXQgd2lsbCBzdGlsbCBiZSBhY2Nlc3NpYmxlIG9uIHRoZSBjb25zdHJ1Y3Rvci4nLG4pLG4gaW4gdClyZXR1cm4gbygiREVGSU5FX01BTllfTUVSR0VEIj09PShjLmhhc093blByb3BlcnR5KG4pP2Nbbl06bnVsbCksIlJlYWN0Q2xhc3M6IFlvdSBhcmUgYXR0ZW1wdGluZyB0byBkZWZpbmUgYCVzYCBvbiB5b3VyIGNvbXBvbmVudCBtb3JlIHRoYW4gb25jZS4gVGhpcyBjb25mbGljdCBtYXkgYmUgZHVlIHRvIGEgbWl4aW4uIixuKSx2b2lkKHRbbl09ZCh0W25dLHIpKTt0W25dPXJ9fX0odCxlKX0sYXV0b2JpbmQ6ZnVuY3Rpb24oKXt9fTtmdW5jdGlvbiBsKHQsZSl7dmFyIG49YS5oYXNPd25Qcm9wZXJ0eShlKT9hW2VdOm51bGw7TS5oYXNPd25Qcm9wZXJ0eShlKSYmbygiT1ZFUlJJREVfQkFTRSI9PT1uLCJSZWFjdENsYXNzSW50ZXJmYWNlOiBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gb3ZlcnJpZGUgYCVzYCBmcm9tIHlvdXIgY2xhc3Mgc3BlY2lmaWNhdGlvbi4gRW5zdXJlIHRoYXQgeW91ciBtZXRob2QgbmFtZXMgZG8gbm90IG92ZXJsYXAgd2l0aCBSZWFjdCBtZXRob2RzLiIsZSksdCYmbygiREVGSU5FX01BTlkiPT09bnx8IkRFRklORV9NQU5ZX01FUkdFRCI9PT1uLCJSZWFjdENsYXNzSW50ZXJmYWNlOiBZb3UgYXJlIGF0dGVtcHRpbmcgdG8gZGVmaW5lIGAlc2Agb24geW91ciBjb21wb25lbnQgbW9yZSB0aGFuIG9uY2UuIFRoaXMgY29uZmxpY3QgbWF5IGJlIGR1ZSB0byBhIG1peGluLiIsZSl9ZnVuY3Rpb24gcCh0LG4pe2lmKG4pe28oImZ1bmN0aW9uIiE9dHlwZW9mIG4sIlJlYWN0Q2xhc3M6IFlvdSdyZSBhdHRlbXB0aW5nIHRvIHVzZSBhIGNvbXBvbmVudCBjbGFzcyBvciBmdW5jdGlvbiBhcyBhIG1peGluLiBJbnN0ZWFkLCBqdXN0IHVzZSBhIHJlZ3VsYXIgb2JqZWN0LiIpLG8oIWUobiksIlJlYWN0Q2xhc3M6IFlvdSdyZSBhdHRlbXB0aW5nIHRvIHVzZSBhIGNvbXBvbmVudCBhcyBhIG1peGluLiBJbnN0ZWFkLCBqdXN0IHVzZSBhIHJlZ3VsYXIgb2JqZWN0LiIpO3ZhciByPXQucHJvdG90eXBlLGk9ci5fX3JlYWN0QXV0b0JpbmRQYWlycztmb3IodmFyIHMgaW4gbi5oYXNPd25Qcm9wZXJ0eSh1KSYmZi5taXhpbnModCxuLm1peGlucyksbilpZihuLmhhc093blByb3BlcnR5KHMpJiZzIT09dSl7dmFyIGM9bltzXSxwPXIuaGFzT3duUHJvcGVydHkocyk7aWYobChwLHMpLGYuaGFzT3duUHJvcGVydHkocykpZltzXSh0LGMpO2Vsc2V7dmFyIGg9YS5oYXNPd25Qcm9wZXJ0eShzKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgYyYmIWgmJiFwJiYhMSE9PW4uYXV0b2JpbmQpaS5wdXNoKHMsYykscltzXT1jO2Vsc2UgaWYocCl7dmFyIHY9YVtzXTtvKGgmJigiREVGSU5FX01BTllfTUVSR0VEIj09PXZ8fCJERUZJTkVfTUFOWSI9PT12KSwiUmVhY3RDbGFzczogVW5leHBlY3RlZCBzcGVjIHBvbGljeSAlcyBmb3Iga2V5ICVzIHdoZW4gbWl4aW5nIGluIGNvbXBvbmVudCBzcGVjcy4iLHYscyksIkRFRklORV9NQU5ZX01FUkdFRCI9PT12P3Jbc109ZChyW3NdLGMpOiJERUZJTkVfTUFOWSI9PT12JiYocltzXT15KHJbc10sYykpfWVsc2UgcltzXT1jfX19ZWxzZTt9ZnVuY3Rpb24gaCh0LGUpe2Zvcih2YXIgbiBpbiBvKHQmJmUmJiJvYmplY3QiPT10eXBlb2YgdCYmIm9iamVjdCI9PXR5cGVvZiBlLCJtZXJnZUludG9XaXRoTm9EdXBsaWNhdGVLZXlzKCk6IENhbm5vdCBtZXJnZSBub24tb2JqZWN0cy4iKSxlKWUuaGFzT3duUHJvcGVydHkobikmJihvKHZvaWQgMD09PXRbbl0sIm1lcmdlSW50b1dpdGhOb0R1cGxpY2F0ZUtleXMoKTogVHJpZWQgdG8gbWVyZ2UgdHdvIG9iamVjdHMgd2l0aCB0aGUgc2FtZSBrZXk6IGAlc2AuIFRoaXMgY29uZmxpY3QgbWF5IGJlIGR1ZSB0byBhIG1peGluOyBpbiBwYXJ0aWN1bGFyLCB0aGlzIG1heSBiZSBjYXVzZWQgYnkgdHdvIGdldEluaXRpYWxTdGF0ZSgpIG9yIGdldERlZmF1bHRQcm9wcygpIG1ldGhvZHMgcmV0dXJuaW5nIG9iamVjdHMgd2l0aCBjbGFzaGluZyBrZXlzLiIsbiksdFtuXT1lW25dKTtyZXR1cm4gdH1mdW5jdGlvbiBkKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dC5hcHBseSh0aGlzLGFyZ3VtZW50cykscj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZihudWxsPT1uKXJldHVybiByO2lmKG51bGw9PXIpcmV0dXJuIG47dmFyIGk9e307cmV0dXJuIGgoaSxuKSxoKGksciksaX19ZnVuY3Rpb24geSh0LGUpe3JldHVybiBmdW5jdGlvbigpe3QuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiB2KHQsZSl7cmV0dXJuIGUuYmluZCh0KX12YXIgZz17Y29tcG9uZW50RGlkTW91bnQ6ZnVuY3Rpb24oKXt0aGlzLl9faXNNb3VudGVkPSEwfX0sdz17Y29tcG9uZW50V2lsbFVubW91bnQ6ZnVuY3Rpb24oKXt0aGlzLl9faXNNb3VudGVkPSExfX0sTT17cmVwbGFjZVN0YXRlOmZ1bmN0aW9uKHQsZSl7dGhpcy51cGRhdGVyLmVucXVldWVSZXBsYWNlU3RhdGUodGhpcyx0LGUpfSxpc01vdW50ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuX19pc01vdW50ZWR9fSxtPWZ1bmN0aW9uKCl7fTtyZXR1cm4gcihtLnByb3RvdHlwZSx0LnByb3RvdHlwZSxNKSxmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbih0LHIsdSl7dGhpcy5fX3JlYWN0QXV0b0JpbmRQYWlycy5sZW5ndGgmJmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10Ll9fcmVhY3RBdXRvQmluZFBhaXJzLG49MDtuPGUubGVuZ3RoO24rPTIpe3ZhciByPWVbbl0saT1lW24rMV07dFtyXT12KHQsaSl9fSh0aGlzKSx0aGlzLnByb3BzPXQsdGhpcy5jb250ZXh0PXIsdGhpcy5yZWZzPWksdGhpcy51cGRhdGVyPXV8fG4sdGhpcy5zdGF0ZT1udWxsO3ZhciBzPXRoaXMuZ2V0SW5pdGlhbFN0YXRlP3RoaXMuZ2V0SW5pdGlhbFN0YXRlKCk6bnVsbDtvKCJvYmplY3QiPT10eXBlb2YgcyYmIUFycmF5LmlzQXJyYXkocyksIiVzLmdldEluaXRpYWxTdGF0ZSgpOiBtdXN0IHJldHVybiBhbiBvYmplY3Qgb3IgbnVsbCIsZS5kaXNwbGF5TmFtZXx8IlJlYWN0Q29tcG9zaXRlQ29tcG9uZW50IiksdGhpcy5zdGF0ZT1zfTtmb3IodmFyIHIgaW4gZS5wcm90b3R5cGU9bmV3IG0sZS5wcm90b3R5cGUuY29uc3RydWN0b3I9ZSxlLnByb3RvdHlwZS5fX3JlYWN0QXV0b0JpbmRQYWlycz1bXSxzLmZvckVhY2gocC5iaW5kKG51bGwsZSkpLHAoZSxnKSxwKGUsdCkscChlLHcpLGUuZ2V0RGVmYXVsdFByb3BzJiYoZS5kZWZhdWx0UHJvcHM9ZS5nZXREZWZhdWx0UHJvcHMoKSksbyhlLnByb3RvdHlwZS5yZW5kZXIsImNyZWF0ZUNsYXNzKC4uLik6IENsYXNzIHNwZWNpZmljYXRpb24gbXVzdCBpbXBsZW1lbnQgYSBgcmVuZGVyYCBtZXRob2QuIiksYSllLnByb3RvdHlwZVtyXXx8KGUucHJvdG90eXBlW3JdPW51bGwpO3JldHVybiBlfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big4NSksaT1uKDQ1KTtuKDg2KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGkuaXNWYWxpZEVsZW1lbnQodCl8fHIoIjE0MyIpLHR9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTc1KTtmdW5jdGlvbiBpKCl7fWZ1bmN0aW9uIG8oKXt9by5yZXNldFdhcm5pbmdDYWNoZT1pLHQuZXhwb3J0cz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4saSxvLHUpe2lmKHUhPT1yKXt2YXIgcz1uZXcgRXJyb3IoIkNhbGxpbmcgUHJvcFR5cGVzIHZhbGlkYXRvcnMgZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UuIFVzZSBQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMoKSB0byBjYWxsIHRoZW0uIFJlYWQgbW9yZSBhdCBodHRwOi8vZmIubWUvdXNlLWNoZWNrLXByb3AtdHlwZXMiKTt0aHJvdyBzLm5hbWU9IkludmFyaWFudCBWaW9sYXRpb24iLHN9fWZ1bmN0aW9uIGUoKXtyZXR1cm4gdH10LmlzUmVxdWlyZWQ9dDt2YXIgbj17YXJyYXk6dCxib29sOnQsZnVuYzp0LG51bWJlcjp0LG9iamVjdDp0LHN0cmluZzp0LHN5bWJvbDp0LGFueTp0LGFycmF5T2Y6ZSxlbGVtZW50OnQsZWxlbWVudFR5cGU6dCxpbnN0YW5jZU9mOmUsbm9kZTp0LG9iamVjdE9mOmUsb25lT2Y6ZSxvbmVPZlR5cGU6ZSxzaGFwZTplLGV4YWN0OmUsY2hlY2tQcm9wVHlwZXM6byxyZXNldFdhcm5pbmdDYWNoZTppfTtyZXR1cm4gbi5Qcm9wVHlwZXM9bixufX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzE4KTt0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzE5KSxpPUFycmF5LnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5jb25jYXQ7cmV0dXJuIHQ9PT1pfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1pLmNvbmNhdD9yOmV9fSxmdW5jdGlvbih0LGUsbil7bigxNTkpO3ZhciByPW4oOCk7dC5leHBvcnRzPXIoIkFycmF5IikuY29uY2F0fSxmdW5jdGlvbih0LGUsbil7big4NCk7dmFyIHI9bigzMjEpLGk9big2MSksbz1BcnJheS5wcm90b3R5cGUsdT17RE9NVG9rZW5MaXN0OiEwLE5vZGVMaXN0OiEwfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5mb3JFYWNoO3JldHVybiB0PT09b3x8dCBpbnN0YW5jZW9mIEFycmF5JiZlPT09by5mb3JFYWNofHx1Lmhhc093blByb3BlcnR5KGkodCkpP3I6ZX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDMyMik7dC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxuKXtuKDMyMyk7dmFyIHI9big4KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5mb3JFYWNofSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMSksaT1uKDMyNCk7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOltdLmZvckVhY2ghPWl9LHtmb3JFYWNoOml9KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDQzKS5mb3JFYWNoLGk9big2MykoImZvckVhY2giKTt0LmV4cG9ydHM9aT9bXS5mb3JFYWNoOmZ1bmN0aW9uKHQpe3JldHVybiByKHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzMjYpO3QuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzMjcpLGk9QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10Lm1hcDtyZXR1cm4gdD09PWl8fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PWkubWFwP3I6ZX19LGZ1bmN0aW9uKHQsZSxuKXtuKDMyOCk7dmFyIHI9big4KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5tYXB9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxKSxpPW4oNDMpLm1hcDtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6IW4oODIpKCJtYXAiKX0se21hcDpmdW5jdGlvbih0KXtyZXR1cm4gaSh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO2UuYnl0ZUxlbmd0aD1mdW5jdGlvbih0KXt2YXIgZT1jKHQpLG49ZVswXSxyPWVbMV07cmV0dXJuIDMqKG4rcikvNC1yfSxlLnRvQnl0ZUFycmF5PWZ1bmN0aW9uKHQpe3ZhciBlLG4scj1jKHQpLHU9clswXSxzPXJbMV0sYT1uZXcgbyhmdW5jdGlvbih0LGUsbil7cmV0dXJuIDMqKGUrbikvNC1ufSgwLHUscykpLGY9MCxsPXM+MD91LTQ6dTtmb3Iobj0wO248bDtuKz00KWU9aVt0LmNoYXJDb2RlQXQobildPDwxOHxpW3QuY2hhckNvZGVBdChuKzEpXTw8MTJ8aVt0LmNoYXJDb2RlQXQobisyKV08PDZ8aVt0LmNoYXJDb2RlQXQobiszKV0sYVtmKytdPWU+PjE2JjI1NSxhW2YrK109ZT4+OCYyNTUsYVtmKytdPTI1NSZlOzI9PT1zJiYoZT1pW3QuY2hhckNvZGVBdChuKV08PDJ8aVt0LmNoYXJDb2RlQXQobisxKV0+PjQsYVtmKytdPTI1NSZlKTsxPT09cyYmKGU9aVt0LmNoYXJDb2RlQXQobildPDwxMHxpW3QuY2hhckNvZGVBdChuKzEpXTw8NHxpW3QuY2hhckNvZGVBdChuKzIpXT4+MixhW2YrK109ZT4+OCYyNTUsYVtmKytdPTI1NSZlKTtyZXR1cm4gYX0sZS5mcm9tQnl0ZUFycmF5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPXQubGVuZ3RoLGk9biUzLG89W10sdT0xNjM4MyxzPTAsYT1uLWk7czxhO3MrPXUpby5wdXNoKGYodCxzLHMrdT5hP2E6cyt1KSk7MT09PWk/KGU9dFtuLTFdLG8ucHVzaChyW2U+PjJdK3JbZTw8NCY2M10rIj09IikpOjI9PT1pJiYoZT0odFtuLTJdPDw4KSt0W24tMV0sby5wdXNoKHJbZT4+MTBdK3JbZT4+NCY2M10rcltlPDwyJjYzXSsiPSIpKTtyZXR1cm4gby5qb2luKCIiKX07Zm9yKHZhciByPVtdLGk9W10sbz0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXk/VWludDhBcnJheTpBcnJheSx1PSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIixzPTAsYT11Lmxlbmd0aDtzPGE7KytzKXJbc109dVtzXSxpW3UuY2hhckNvZGVBdChzKV09cztmdW5jdGlvbiBjKHQpe3ZhciBlPXQubGVuZ3RoO2lmKGUlND4wKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCIpO3ZhciBuPXQuaW5kZXhPZigiPSIpO3JldHVybi0xPT09biYmKG49ZSksW24sbj09PWU/MDo0LW4lNF19ZnVuY3Rpb24gZih0LGUsbil7Zm9yKHZhciBpLG8sdT1bXSxzPWU7czxuO3MrPTMpaT0odFtzXTw8MTYmMTY3MTE2ODApKyh0W3MrMV08PDgmNjUyODApKygyNTUmdFtzKzJdKSx1LnB1c2goclsobz1pKT4+MTgmNjNdK3Jbbz4+MTImNjNdK3Jbbz4+NiY2M10rcls2MyZvXSk7cmV0dXJuIHUuam9pbigiIil9aVsiLSIuY2hhckNvZGVBdCgwKV09NjIsaVsiXyIuY2hhckNvZGVBdCgwKV09NjN9LGZ1bmN0aW9uKHQsZSl7ZS5yZWFkPWZ1bmN0aW9uKHQsZSxuLHIsaSl7dmFyIG8sdSxzPTgqaS1yLTEsYT0oMTw8cyktMSxjPWE+PjEsZj0tNyxsPW4/aS0xOjAscD1uPy0xOjEsaD10W2UrbF07Zm9yKGwrPXAsbz1oJigxPDwtZiktMSxoPj49LWYsZis9cztmPjA7bz0yNTYqbyt0W2UrbF0sbCs9cCxmLT04KTtmb3IodT1vJigxPDwtZiktMSxvPj49LWYsZis9cjtmPjA7dT0yNTYqdSt0W2UrbF0sbCs9cCxmLT04KTtpZigwPT09bylvPTEtYztlbHNle2lmKG89PT1hKXJldHVybiB1P05hTjoxLzAqKGg/LTE6MSk7dSs9TWF0aC5wb3coMixyKSxvLT1jfXJldHVybihoPy0xOjEpKnUqTWF0aC5wb3coMixvLXIpfSxlLndyaXRlPWZ1bmN0aW9uKHQsZSxuLHIsaSxvKXt2YXIgdSxzLGEsYz04Km8taS0xLGY9KDE8PGMpLTEsbD1mPj4xLHA9MjM9PT1pP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxoPXI/MDpvLTEsZD1yPzE6LTEseT1lPDB8fDA9PT1lJiYxL2U8MD8xOjA7Zm9yKGU9TWF0aC5hYnMoZSksaXNOYU4oZSl8fGU9PT0xLzA/KHM9aXNOYU4oZSk/MTowLHU9Zik6KHU9TWF0aC5mbG9vcihNYXRoLmxvZyhlKS9NYXRoLkxOMiksZSooYT1NYXRoLnBvdygyLC11KSk8MSYmKHUtLSxhKj0yKSwoZSs9dStsPj0xP3AvYTpwKk1hdGgucG93KDIsMS1sKSkqYT49MiYmKHUrKyxhLz0yKSx1K2w+PWY/KHM9MCx1PWYpOnUrbD49MT8ocz0oZSphLTEpKk1hdGgucG93KDIsaSksdSs9bCk6KHM9ZSpNYXRoLnBvdygyLGwtMSkqTWF0aC5wb3coMixpKSx1PTApKTtpPj04O3RbbitoXT0yNTUmcyxoKz1kLHMvPTI1NixpLT04KTtmb3IodT11PDxpfHMsYys9aTtjPjA7dFtuK2hdPTI1NSZ1LGgrPWQsdS89MjU2LGMtPTgpO3RbbitoLWRdfD0xMjgqeX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEyMyksaT1uKDE3OSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKHIodCkpcmV0dXJuIGkodCl9LHQuZXhwb3J0cy5kZWZhdWx0PXQuZXhwb3J0cyx0LmV4cG9ydHMuX19lc01vZHVsZT0hMH0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTc4KTt0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLG4pe24oMSkoe3RhcmdldDoiQXJyYXkiLHN0YXQ6ITB9LHtpc0FycmF5Om4oNTkpfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDgwKSxpPW4oMTI0KSxvPW4oMTgxKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYodm9pZCAwIT09ciYmbnVsbCE9aSh0KXx8bnVsbCE9dFsiQEBpdGVyYXRvciJdKXJldHVybiBvKHQpfSx0LmV4cG9ydHMuZGVmYXVsdD10LmV4cG9ydHMsdC5leHBvcnRzLl9fZXNNb2R1bGU9ITB9LGZ1bmN0aW9uKHQsZSxuKXtuKDg0KSxuKDExOSk7dmFyIHI9bigxODApO3QuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzMzcpO3QuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsbil7bigxMTkpLG4oMzM4KTt2YXIgcj1uKDEwKTt0LmV4cG9ydHM9ci5BcnJheS5mcm9tfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxKSxpPW4oMzM5KTtyKHt0YXJnZXQ6IkFycmF5IixzdGF0OiEwLGZvcmNlZDohbigzNDMpKChmdW5jdGlvbih0KXtBcnJheS5mcm9tKHQpfSkpfSx7ZnJvbTppfSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxMDYpLGk9bigxOSksbz1uKDM0MCksdT1uKDM0Mikscz1uKDMwKSxhPW4oMTE0KSxjPW4oMTgwKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGUsbixmLGwscCxoLGQ9aSh0KSx5PSJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzP3RoaXM6QXJyYXksdj1hcmd1bWVudHMubGVuZ3RoLGc9dj4xP2FyZ3VtZW50c1sxXTp2b2lkIDAsdz12b2lkIDAhPT1nLE09YyhkKSxtPTA7aWYodyYmKGc9cihnLHY+Mj9hcmd1bWVudHNbMl06dm9pZCAwLDIpKSxudWxsPT1NfHx5PT1BcnJheSYmdShNKSlmb3Iobj1uZXcgeShlPXMoZC5sZW5ndGgpKTtlPm07bSsrKWg9dz9nKGRbbV0sbSk6ZFttXSxhKG4sbSxoKTtlbHNlIGZvcihwPShsPU0uY2FsbChkKSkubmV4dCxuPW5ldyB5OyEoZj1wLmNhbGwobCkpLmRvbmU7bSsrKWg9dz9vKGwsZyxbZi52YWx1ZSxtXSwhMCk6Zi52YWx1ZSxhKG4sbSxoKTtyZXR1cm4gbi5sZW5ndGg9bSxufX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMjkpLGk9bigzNDEpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixvKXt0cnl7cmV0dXJuIG8/ZShyKG4pWzBdLG5bMV0pOmUobil9Y2F0Y2goZSl7dGhyb3cgaSh0KSxlfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI5KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5yZXR1cm47aWYodm9pZCAwIT09ZSlyZXR1cm4gcihlLmNhbGwodCkpLnZhbHVlfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNyksaT1uKDQ0KSxvPXIoIml0ZXJhdG9yIiksdT1BcnJheS5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT10JiYoaS5BcnJheT09PXR8fHVbb109PT10KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDcpKCJpdGVyYXRvciIpLGk9ITE7dHJ5e3ZhciBvPTAsdT17bmV4dDpmdW5jdGlvbigpe3JldHVybntkb25lOiEhbysrfX0scmV0dXJuOmZ1bmN0aW9uKCl7aT0hMH19O3Vbcl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sQXJyYXkuZnJvbSh1LChmdW5jdGlvbigpe3Rocm93IDJ9KSl9Y2F0Y2godCl7fXQuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2lmKCFlJiYhaSlyZXR1cm4hMTt2YXIgbj0hMTt0cnl7dmFyIG89e307b1tyXT1mdW5jdGlvbigpe3JldHVybntuZXh0OmZ1bmN0aW9uKCl7cmV0dXJue2RvbmU6bj0hMH19fX0sdChvKX1jYXRjaCh0KXt9cmV0dXJuIG59fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMzQ1KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTgyKTt0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLG4pe24oMzQ3KTt2YXIgcj1uKDgpO3QuZXhwb3J0cz1yKCJBcnJheSIpLnNsaWNlfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMSksaT1uKDE1KSxvPW4oNTkpLHU9bigxNTMpLHM9bigzMCksYT1uKDMyKSxjPW4oMTE0KSxmPW4oNyksbD1uKDgyKSgic2xpY2UiKSxwPWYoInNwZWNpZXMiKSxoPVtdLnNsaWNlLGQ9TWF0aC5tYXg7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOiFsfSx7c2xpY2U6ZnVuY3Rpb24odCxlKXt2YXIgbixyLGYsbD1hKHRoaXMpLHk9cyhsLmxlbmd0aCksdj11KHQseSksZz11KHZvaWQgMD09PWU/eTplLHkpO2lmKG8obCkmJigiZnVuY3Rpb24iIT10eXBlb2Yobj1sLmNvbnN0cnVjdG9yKXx8biE9PUFycmF5JiYhbyhuLnByb3RvdHlwZSk/aShuKSYmbnVsbD09PShuPW5bcF0pJiYobj12b2lkIDApOm49dm9pZCAwLG49PT1BcnJheXx8dm9pZCAwPT09bikpcmV0dXJuIGguY2FsbChsLHYsZyk7Zm9yKHI9bmV3KHZvaWQgMD09PW4/QXJyYXk6bikoZChnLXYsMCkpLGY9MDt2PGc7disrLGYrKyl2IGluIGwmJmMocixmLGxbdl0pO3JldHVybiByLmxlbmd0aD1mLHJ9fSl9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9LHQuZXhwb3J0cy5kZWZhdWx0PXQuZXhwb3J0cyx0LmV4cG9ydHMuX19lc01vZHVsZT0hMH0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTIzKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYocih0KSlyZXR1cm4gdH0sdC5leHBvcnRzLmRlZmF1bHQ9dC5leHBvcnRzLHQuZXhwb3J0cy5fX2VzTW9kdWxlPSEwfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big4MCksaT1uKDEyNCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49bnVsbD09dD9udWxsOnZvaWQgMCE9PXImJmkodCl8fHRbIkBAaXRlcmF0b3IiXTtpZihudWxsIT1uKXt2YXIgbyx1LHM9W10sYT0hMCxjPSExO3RyeXtmb3Iobj1uLmNhbGwodCk7IShhPShvPW4ubmV4dCgpKS5kb25lKSYmKHMucHVzaChvLnZhbHVlKSwhZXx8cy5sZW5ndGghPT1lKTthPSEwKTt9Y2F0Y2godCl7Yz0hMCx1PXR9ZmluYWxseXt0cnl7YXx8bnVsbD09bi5yZXR1cm58fG4ucmV0dXJuKCl9ZmluYWxseXtpZihjKXRocm93IHV9fXJldHVybiBzfX0sdC5leHBvcnRzLmRlZmF1bHQ9dC5leHBvcnRzLHQuZXhwb3J0cy5fX2VzTW9kdWxlPSEwfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9LHQuZXhwb3J0cy5kZWZhdWx0PXQuZXhwb3J0cyx0LmV4cG9ydHMuX19lc01vZHVsZT0hMH0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTc4KTt0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLG4pe24oODQpO3ZhciByPW4oMzU0KSxpPW4oNjEpLG89QXJyYXkucHJvdG90eXBlLHU9e0RPTVRva2VuTGlzdDohMCxOb2RlTGlzdDohMH07dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuZW50cmllcztyZXR1cm4gdD09PW98fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PW8uZW50cmllc3x8dS5oYXNPd25Qcm9wZXJ0eShpKHQpKT9yOmV9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzNTUpO3QuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsbil7bigxNjgpO3ZhciByPW4oOCk7dC5leHBvcnRzPXIoIkFycmF5IikuZW50cmllc30sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzU3KTt0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzU4KSxpPUFycmF5LnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5maWx0ZXI7cmV0dXJuIHQ9PT1pfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1pLmZpbHRlcj9yOmV9fSxmdW5jdGlvbih0LGUsbil7bigzNTkpO3ZhciByPW4oOCk7dC5leHBvcnRzPXIoIkFycmF5IikuZmlsdGVyfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMSksaT1uKDQzKS5maWx0ZXI7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOiFuKDgyKSgiZmlsdGVyIil9LHtmaWx0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIGkodGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzYxKTt0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLG4pe24oMzYyKTt2YXIgcj1uKDEwKTt0LmV4cG9ydHM9ci5PYmplY3Qua2V5c30sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMSksaT1uKDE5KSxvPW4oNzcpO3Ioe3RhcmdldDoiT2JqZWN0IixzdGF0OiEwLGZvcmNlZDpuKDYpKChmdW5jdGlvbigpe28oMSl9KSl9LHtrZXlzOmZ1bmN0aW9uKHQpe3JldHVybiBvKGkodCkpfX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzNjQpO3QuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzNjUpLGk9RnVuY3Rpb24ucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmJpbmQ7cmV0dXJuIHQ9PT1pfHx0IGluc3RhbmNlb2YgRnVuY3Rpb24mJmU9PT1pLmJpbmQ/cjplfX0sZnVuY3Rpb24odCxlLG4pe24oMzY2KTt2YXIgcj1uKDgpO3QuZXhwb3J0cz1yKCJGdW5jdGlvbiIpLmJpbmR9LGZ1bmN0aW9uKHQsZSxuKXtuKDEpKHt0YXJnZXQ6IkZ1bmN0aW9uIixwcm90bzohMH0se2JpbmQ6bigxNTcpfSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDM2OCk7dC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDM2OSksaT1BcnJheS5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQucmVkdWNlO3JldHVybiB0PT09aXx8dCBpbnN0YW5jZW9mIEFycmF5JiZlPT09aS5yZWR1Y2U/cjplfX0sZnVuY3Rpb24odCxlLG4pe24oMzcwKTt2YXIgcj1uKDgpO3QuZXhwb3J0cz1yKCJBcnJheSIpLnJlZHVjZX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDEpLGk9bigzNzEpLmxlZnQsbz1uKDYzKSx1PW4oNjApLHM9bigzNzIpO3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDohbygicmVkdWNlIil8fCFzJiZ1Pjc5JiZ1PDgzfSx7cmVkdWNlOmZ1bmN0aW9uKHQpe3JldHVybiBpKHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoLGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNTYpLGk9bigxOSksbz1uKDc0KSx1PW4oMzApLHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbixzLGEpe3Iobik7dmFyIGM9aShlKSxmPW8oYyksbD11KGMubGVuZ3RoKSxwPXQ/bC0xOjAsaD10Py0xOjE7aWYoczwyKWZvcig7Oyl7aWYocCBpbiBmKXthPWZbcF0scCs9aDticmVha31pZihwKz1oLHQ/cDwwOmw8PXApdGhyb3cgVHlwZUVycm9yKCJSZWR1Y2Ugb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlIil9Zm9yKDt0P3A+PTA6bD5wO3ArPWgpcCBpbiBmJiYoYT1uKGEsZltwXSxwLGMpKTtyZXR1cm4gYX19O3QuZXhwb3J0cz17bGVmdDpzKCExKSxyaWdodDpzKCEwKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDU1KSxpPW4oMTMpO3QuZXhwb3J0cz0icHJvY2VzcyI9PXIoaS5wcm9jZXNzKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzc0KTt0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLG4pe24oMzc1KTt2YXIgcj1uKDEwKTt0LmV4cG9ydHM9ci5PYmplY3QuYXNzaWdufSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxKSxpPW4oMzc2KTtyKHt0YXJnZXQ6Ik9iamVjdCIsc3RhdDohMCxmb3JjZWQ6T2JqZWN0LmFzc2lnbiE9PWl9LHthc3NpZ246aX0pfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMjMpLGk9big2KSxvPW4oNzcpLHU9bigxNjMpLHM9bigxMDUpLGE9bigxOSksYz1uKDc0KSxmPU9iamVjdC5hc3NpZ24sbD1PYmplY3QuZGVmaW5lUHJvcGVydHk7dC5leHBvcnRzPSFmfHxpKChmdW5jdGlvbigpe2lmKHImJjEhPT1mKHtiOjF9LGYobCh7fSwiYSIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7bCh0aGlzLCJiIix7dmFsdWU6MyxlbnVtZXJhYmxlOiExfSl9fSkse2I6Mn0pKS5iKXJldHVybiEwO3ZhciB0PXt9LGU9e30sbj1TeW1ib2woKSxpPSJhYmNkZWZnaGlqa2xtbm9wcXJzdCI7cmV0dXJuIHRbbl09NyxpLnNwbGl0KCIiKS5mb3JFYWNoKChmdW5jdGlvbih0KXtlW3RdPXR9KSksNyE9Zih7fSx0KVtuXXx8byhmKHt9LGUpKS5qb2luKCIiKSE9aX0pKT9mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1hKHQpLGk9YXJndW1lbnRzLmxlbmd0aCxmPTEsbD11LmYscD1zLmY7aT5mOylmb3IodmFyIGgsZD1jKGFyZ3VtZW50c1tmKytdKSx5PWw/byhkKS5jb25jYXQobChkKSk6byhkKSx2PXkubGVuZ3RoLGc9MDt2Pmc7KWg9eVtnKytdLHImJiFwLmNhbGwoZCxoKXx8KG5baF09ZFtoXSk7cmV0dXJuIG59OmZ9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDM3OCk7dC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDM3OSksaT1BcnJheS5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQuc29ydDtyZXR1cm4gdD09PWl8fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PWkuc29ydD9yOmV9fSxmdW5jdGlvbih0LGUsbil7bigzODApO3ZhciByPW4oOCk7dC5leHBvcnRzPXIoIkFycmF5Iikuc29ydH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDEpLGk9big1Niksbz1uKDE5KSx1PW4oMzApLHM9big2KSxhPW4oMzgxKSxjPW4oNjMpLGY9bigzODIpLGw9bigzODMpLHA9big2MCksaD1uKDM4NCksZD1bXSx5PWQuc29ydCx2PXMoKGZ1bmN0aW9uKCl7ZC5zb3J0KHZvaWQgMCl9KSksZz1zKChmdW5jdGlvbigpe2Quc29ydChudWxsKX0pKSx3PWMoInNvcnQiKSxNPSFzKChmdW5jdGlvbigpe2lmKHApcmV0dXJuIHA8NzA7aWYoIShmJiZmPjMpKXtpZihsKXJldHVybiEwO2lmKGgpcmV0dXJuIGg8NjAzO3ZhciB0LGUsbixyLGk9IiI7Zm9yKHQ9NjU7dDw3Njt0Kyspe3N3aXRjaChlPVN0cmluZy5mcm9tQ2hhckNvZGUodCksdCl7Y2FzZSA2NjpjYXNlIDY5OmNhc2UgNzA6Y2FzZSA3MjpuPTM7YnJlYWs7Y2FzZSA2ODpjYXNlIDcxOm49NDticmVhaztkZWZhdWx0Om49Mn1mb3Iocj0wO3I8NDc7cisrKWQucHVzaCh7azplK3IsdjpufSl9Zm9yKGQuc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS52LXQudn0pKSxyPTA7cjxkLmxlbmd0aDtyKyspZT1kW3JdLmsuY2hhckF0KDApLGkuY2hhckF0KGkubGVuZ3RoLTEpIT09ZSYmKGkrPWUpO3JldHVybiJER0JFRkhBQ0lKSyIhPT1pfX0pKTtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6dnx8IWd8fCF3fHwhTX0se3NvcnQ6ZnVuY3Rpb24odCl7dm9pZCAwIT09dCYmaSh0KTt2YXIgZT1vKHRoaXMpO2lmKE0pcmV0dXJuIHZvaWQgMD09PXQ/eS5jYWxsKGUpOnkuY2FsbChlLHQpO3ZhciBuLHIscz1bXSxjPXUoZS5sZW5ndGgpO2ZvcihyPTA7cjxjO3IrKylyIGluIGUmJnMucHVzaChlW3JdKTtmb3Iobj0ocz1hKHMsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7cmV0dXJuIHZvaWQgMD09PW4/LTE6dm9pZCAwPT09ZT8xOnZvaWQgMCE9PXQ/K3QoZSxuKXx8MDpTdHJpbmcoZSk+U3RyaW5nKG4pPzE6LTF9fSh0KSkpLmxlbmd0aCxyPTA7cjxuOyllW3JdPXNbcisrXTtmb3IoO3I8YzspZGVsZXRlIGVbcisrXTtyZXR1cm4gZX19KX0sZnVuY3Rpb24odCxlKXt2YXIgbj1NYXRoLmZsb29yLHI9ZnVuY3Rpb24odCxlKXt2YXIgdT10Lmxlbmd0aCxzPW4odS8yKTtyZXR1cm4gdTw4P2kodCxlKTpvKHIodC5zbGljZSgwLHMpLGUpLHIodC5zbGljZShzKSxlKSxlKX0saT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbixyLGk9dC5sZW5ndGgsbz0xO288aTspe2ZvcihyPW8sbj10W29dO3ImJmUodFtyLTFdLG4pPjA7KXRbcl09dFstLXJdO3IhPT1vKysmJih0W3JdPW4pfXJldHVybiB0fSxvPWZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIHI9dC5sZW5ndGgsaT1lLmxlbmd0aCxvPTAsdT0wLHM9W107bzxyfHx1PGk7KW88ciYmdTxpP3MucHVzaChuKHRbb10sZVt1XSk8PTA/dFtvKytdOmVbdSsrXSk6cy5wdXNoKG88cj90W28rK106ZVt1KytdKTtyZXR1cm4gc307dC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDgxKS5tYXRjaCgvZmlyZWZveFwvKFxkKykvaSk7dC5leHBvcnRzPSEhciYmK3JbMV19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDgxKTt0LmV4cG9ydHM9L01TSUV8VHJpZGVudC8udGVzdChyKX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oODEpLm1hdGNoKC9BcHBsZVdlYktpdFwvKFxkKylcLi8pO3QuZXhwb3J0cz0hIXImJityWzFdfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxODIpO3QuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzODcpO3QuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzODgpLGk9QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LnNvbWU7cmV0dXJuIHQ9PT1pfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1pLnNvbWU/cjplfX0sZnVuY3Rpb24odCxlLG4pe24oMzg5KTt2YXIgcj1uKDgpO3QuZXhwb3J0cz1yKCJBcnJheSIpLnNvbWV9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxKSxpPW4oNDMpLnNvbWU7cih7dGFyZ2V0OiJBcnJheSIscHJvdG86ITAsZm9yY2VkOiFuKDYzKSgic29tZSIpfSx7c29tZTpmdW5jdGlvbih0KXtyZXR1cm4gaSh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzOTEpO3QuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigzOTIpLGk9bigzOTQpLG89QXJyYXkucHJvdG90eXBlLHU9U3RyaW5nLnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5pbmNsdWRlcztyZXR1cm4gdD09PW98fHQgaW5zdGFuY2VvZiBBcnJheSYmZT09PW8uaW5jbHVkZXM/cjoic3RyaW5nIj09dHlwZW9mIHR8fHQ9PT11fHx0IGluc3RhbmNlb2YgU3RyaW5nJiZlPT09dS5pbmNsdWRlcz9pOmV9fSxmdW5jdGlvbih0LGUsbil7bigzOTMpO3ZhciByPW4oOCk7dC5leHBvcnRzPXIoIkFycmF5IikuaW5jbHVkZXN9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxKSxpPW4oMTA3KS5pbmNsdWRlcyxvPW4oMTIwKTtyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMH0se2luY2x1ZGVzOmZ1bmN0aW9uKHQpe3JldHVybiBpKHRoaXMsdCxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSksbygiaW5jbHVkZXMiKX0sZnVuY3Rpb24odCxlLG4pe24oMzk1KTt2YXIgcj1uKDgpO3QuZXhwb3J0cz1yKCJTdHJpbmciKS5pbmNsdWRlc30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDEpLGk9bigxODMpLG89big0Mik7cih7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwLGZvcmNlZDohbigxODQpKCJpbmNsdWRlcyIpfSx7aW5jbHVkZXM6ZnVuY3Rpb24odCl7cmV0dXJuISF+U3RyaW5nKG8odGhpcykpLmluZGV4T2YoaSh0KSxhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCl9fSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE1KSxpPW4oNTUpLG89big3KSgibWF0Y2giKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU7cmV0dXJuIHIodCkmJih2b2lkIDAhPT0oZT10W29dKT8hIWU6IlJlZ0V4cCI9PWkodCkpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMzk4KTt0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLG4pe24oMzk5KTt2YXIgcj1uKDEwKTtyLkpTT058fChyLkpTT049e3N0cmluZ2lmeTpKU09OLnN0cmluZ2lmeX0pLHQuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHIuSlNPTi5zdHJpbmdpZnkuYXBwbHkobnVsbCxhcmd1bWVudHMpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMSksaT1uKDU3KSxvPW4oNiksdT1pKCJKU09OIiwic3RyaW5naWZ5Iikscz0vW1x1RDgwMC1cdURGRkZdL2csYT0vXltcdUQ4MDAtXHVEQkZGXSQvLGM9L15bXHVEQzAwLVx1REZGRl0kLyxmPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uLmNoYXJBdChlLTEpLGk9bi5jaGFyQXQoZSsxKTtyZXR1cm4gYS50ZXN0KHQpJiYhYy50ZXN0KGkpfHxjLnRlc3QodCkmJiFhLnRlc3Qocik/IlxcdSIrdC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KTp0fSxsPW8oKGZ1bmN0aW9uKCl7cmV0dXJuJyJcXHVkZjA2XFx1ZDgzNCInIT09dSgiXHVkZjA2XHVkODM0Iil8fCciXFx1ZGVhZCInIT09dSgiXHVkZWFkIil9KSk7dSYmcih7dGFyZ2V0OiJKU09OIixzdGF0OiEwLGZvcmNlZDpsfSx7c3RyaW5naWZ5OmZ1bmN0aW9uKHQsZSxuKXt2YXIgcj11LmFwcGx5KG51bGwsYXJndW1lbnRzKTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHI/ci5yZXBsYWNlKHMsZik6cn19KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDAxKTt0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDAyKSxpPUFycmF5LnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5pbmRleE9mO3JldHVybiB0PT09aXx8dCBpbnN0YW5jZW9mIEFycmF5JiZlPT09aS5pbmRleE9mP3I6ZX19LGZ1bmN0aW9uKHQsZSxuKXtuKDQwMyk7dmFyIHI9big4KTt0LmV4cG9ydHM9cigiQXJyYXkiKS5pbmRleE9mfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMSksaT1uKDEwNykuaW5kZXhPZixvPW4oNjMpLHU9W10uaW5kZXhPZixzPSEhdSYmMS9bMV0uaW5kZXhPZigxLC0wKTwwLGE9bygiaW5kZXhPZiIpO3Ioe3RhcmdldDoiQXJyYXkiLHByb3RvOiEwLGZvcmNlZDpzfHwhYX0se2luZGV4T2Y6ZnVuY3Rpb24odCl7cmV0dXJuIHM/dS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fDA6aSh0aGlzLHQsYXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDApfX0pfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0MDUpO3QuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0MDYpLGk9QXJyYXkucHJvdG90eXBlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10LmZpbmQ7cmV0dXJuIHQ9PT1pfHx0IGluc3RhbmNlb2YgQXJyYXkmJmU9PT1pLmZpbmQ/cjplfX0sZnVuY3Rpb24odCxlLG4pe24oNDA3KTt2YXIgcj1uKDgpO3QuZXhwb3J0cz1yKCJBcnJheSIpLmZpbmR9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxKSxpPW4oNDMpLmZpbmQsbz1uKDEyMCksdT0iZmluZCIscz0hMDt1IGluW10mJkFycmF5KDEpLmZpbmQoKGZ1bmN0aW9uKCl7cz0hMX0pKSxyKHt0YXJnZXQ6IkFycmF5Iixwcm90bzohMCxmb3JjZWQ6c30se2ZpbmQ6ZnVuY3Rpb24odCl7cmV0dXJuIGkodGhpcyx0LGFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dm9pZCAwKX19KSxvKHUpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0MDkpO3QuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0MTApLGk9U3RyaW5nLnByb3RvdHlwZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dC5zdGFydHNXaXRoO3JldHVybiJzdHJpbmciPT10eXBlb2YgdHx8dD09PWl8fHQgaW5zdGFuY2VvZiBTdHJpbmcmJmU9PT1pLnN0YXJ0c1dpdGg/cjplfX0sZnVuY3Rpb24odCxlLG4pe24oNDExKTt2YXIgcj1uKDgpO3QuZXhwb3J0cz1yKCJTdHJpbmciKS5zdGFydHNXaXRofSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByLGk9bigxKSxvPW4oMTA0KS5mLHU9bigzMCkscz1uKDE4MyksYT1uKDQyKSxjPW4oMTg0KSxmPW4oNTgpLGw9IiIuc3RhcnRzV2l0aCxwPU1hdGgubWluLGg9Yygic3RhcnRzV2l0aCIpO2koe3RhcmdldDoiU3RyaW5nIixwcm90bzohMCxmb3JjZWQ6ISEoZnx8aHx8KHI9byhTdHJpbmcucHJvdG90eXBlLCJzdGFydHNXaXRoIiksIXJ8fHIud3JpdGFibGUpKSYmIWh9LHtzdGFydHNXaXRoOmZ1bmN0aW9uKHQpe3ZhciBlPVN0cmluZyhhKHRoaXMpKTtzKHQpO3ZhciBuPXUocChhcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMCxlLmxlbmd0aCkpLHI9U3RyaW5nKHQpO3JldHVybiBsP2wuY2FsbChlLHIsbik6ZS5zbGljZShuLG4rci5sZW5ndGgpPT09cn19KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDEzKTt0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDE0KSxpPVN0cmluZy5wcm90b3R5cGU7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQudHJpbTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHR8fHQ9PT1pfHx0IGluc3RhbmNlb2YgU3RyaW5nJiZlPT09aS50cmltP3I6ZX19LGZ1bmN0aW9uKHQsZSxuKXtuKDQxNSk7dmFyIHI9big4KTt0LmV4cG9ydHM9cigiU3RyaW5nIikudHJpbX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDEpLGk9big0MTYpLnRyaW07cih7dGFyZ2V0OiJTdHJpbmciLHByb3RvOiEwLGZvcmNlZDpuKDQxNykoInRyaW0iKX0se3RyaW06ZnVuY3Rpb24oKXtyZXR1cm4gaSh0aGlzKX19KX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDIpLGk9IlsiK24oMTg1KSsiXSIsbz1SZWdFeHAoIl4iK2kraSsiKiIpLHU9UmVnRXhwKGkraSsiKiQiKSxzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj1TdHJpbmcocihlKSk7cmV0dXJuIDEmdCYmKG49bi5yZXBsYWNlKG8sIiIpKSwyJnQmJihuPW4ucmVwbGFjZSh1LCIiKSksbn19O3QuZXhwb3J0cz17c3RhcnQ6cygxKSxlbmQ6cygyKSx0cmltOnMoMyl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2KSxpPW4oMTg1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHIoKGZ1bmN0aW9uKCl7cmV0dXJuISFpW3RdKCl8fCLigIvCheGgjiIhPSLigIvCheGgjiJbdF0oKXx8aVt0XS5uYW1lIT09dH0pKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDY0KSxpPW4oMTQxKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGkocih0KS50b0xvd2VyQ2FzZSgpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDg3KSxpPW4oNDIwKSxvPW4oMjIpLHU9big4OCkscz1yP3IucHJvdG90eXBlOnZvaWQgMCxhPXM/cy50b1N0cmluZzp2b2lkIDA7dC5leHBvcnRzPWZ1bmN0aW9uIHQoZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXJldHVybiBlO2lmKG8oZSkpcmV0dXJuIGkoZSx0KSsiIjtpZih1KGUpKXJldHVybiBhP2EuY2FsbChlKToiIjt2YXIgbj1lKyIiO3JldHVybiIwIj09biYmMS9lPT0tSW5maW5pdHk/Ii0wIjpufX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49LTEscj1udWxsPT10PzA6dC5sZW5ndGgsaT1BcnJheShyKTsrK248cjspaVtuXT1lKHRbbl0sbix0KTtyZXR1cm4gaX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDg3KSxpPU9iamVjdC5wcm90b3R5cGUsbz1pLmhhc093blByb3BlcnR5LHU9aS50b1N0cmluZyxzPXI/ci50b1N0cmluZ1RhZzp2b2lkIDA7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPW8uY2FsbCh0LHMpLG49dFtzXTt0cnl7dFtzXT12b2lkIDA7dmFyIHI9ITB9Y2F0Y2godCl7fXZhciBpPXUuY2FsbCh0KTtyZXR1cm4gciYmKGU/dFtzXT1uOmRlbGV0ZSB0W3NdKSxpfX0sZnVuY3Rpb24odCxlKXt2YXIgbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbi5jYWxsKHQpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDI0KSxpPW4oMTg3KSxvPW4oNDI2KSx1PW4oNjQpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7ZT11KGUpO3ZhciBuPWkoZSk/byhlKTp2b2lkIDAscz1uP25bMF06ZS5jaGFyQXQoMCksYT1uP3IobiwxKS5qb2luKCIiKTplLnNsaWNlKDEpO3JldHVybiBzW3RdKCkrYX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0MjUpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7dmFyIGk9dC5sZW5ndGg7cmV0dXJuIG49dm9pZCAwPT09bj9pOm4sIWUmJm4+PWk/dDpyKHQsZSxuKX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcj0tMSxpPXQubGVuZ3RoO2U8MCYmKGU9LWU+aT8wOmkrZSksKG49bj5pP2k6bik8MCYmKG4rPWkpLGk9ZT5uPzA6bi1lPj4+MCxlPj4+PTA7Zm9yKHZhciBvPUFycmF5KGkpOysrcjxpOylvW3JdPXRbcitlXTtyZXR1cm4gb319LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQyNyksaT1uKDE4Nyksbz1uKDQyOCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpKHQpP28odCk6cih0KX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0LnNwbGl0KCIiKX19LGZ1bmN0aW9uKHQsZSl7dmFyIG49IltcXHVkODAwLVxcdWRmZmZdIixyPSJbXFx1MDMwMC1cXHUwMzZmXFx1ZmUyMC1cXHVmZTJmXFx1MjBkMC1cXHUyMGZmXSIsaT0iXFx1ZDgzY1tcXHVkZmZiLVxcdWRmZmZdIixvPSJbXlxcdWQ4MDAtXFx1ZGZmZl0iLHU9Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLHM9IltcXHVkODAwLVxcdWRiZmZdW1xcdWRjMDAtXFx1ZGZmZl0iLGE9Iig/OiIrcisifCIraSsiKSIrIj8iLGM9IltcXHVmZTBlXFx1ZmUwZl0/IixmPWMrYSsoIig/OlxcdTIwMGQoPzoiK1tvLHUsc10uam9pbigifCIpKyIpIitjK2ErIikqIiksbD0iKD86IitbbytyKyI/IixyLHUscyxuXS5qb2luKCJ8IikrIikiLHA9UmVnRXhwKGkrIig/PSIraSsiKXwiK2wrZiwiZyIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdC5tYXRjaChwKXx8W119fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0MzApLGk9big0MzEpLG89big0MzQpLHU9UmVnRXhwKCJbJ+KAmV0iLCJnIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gcihvKGkoZSkucmVwbGFjZSh1LCIiKSksdCwiIil9fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4scil7dmFyIGk9LTEsbz1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHImJm8mJihuPXRbKytpXSk7KytpPG87KW49ZShuLHRbaV0saSx0KTtyZXR1cm4gbn19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQzMiksaT1uKDY0KSxvPS9bXHhjMC1ceGQ2XHhkOC1ceGY2XHhmOC1ceGZmXHUwMTAwLVx1MDE3Zl0vZyx1PVJlZ0V4cCgiW1xcdTAzMDAtXFx1MDM2ZlxcdWZlMjAtXFx1ZmUyZlxcdTIwZDAtXFx1MjBmZl0iLCJnIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybih0PWkodCkpJiZ0LnJlcGxhY2UobyxyKS5yZXBsYWNlKHUsIiIpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDMzKSh7IsOAIjoiQSIsIsOBIjoiQSIsIsOCIjoiQSIsIsODIjoiQSIsIsOEIjoiQSIsIsOFIjoiQSIsIsOgIjoiYSIsIsOhIjoiYSIsIsOiIjoiYSIsIsOjIjoiYSIsIsOkIjoiYSIsIsOlIjoiYSIsIsOHIjoiQyIsIsOnIjoiYyIsIsOQIjoiRCIsIsOwIjoiZCIsIsOIIjoiRSIsIsOJIjoiRSIsIsOKIjoiRSIsIsOLIjoiRSIsIsOoIjoiZSIsIsOpIjoiZSIsIsOqIjoiZSIsIsOrIjoiZSIsIsOMIjoiSSIsIsONIjoiSSIsIsOOIjoiSSIsIsOPIjoiSSIsIsOsIjoiaSIsIsOtIjoiaSIsIsOuIjoiaSIsIsOvIjoiaSIsIsORIjoiTiIsIsOxIjoibiIsIsOSIjoiTyIsIsOTIjoiTyIsIsOUIjoiTyIsIsOVIjoiTyIsIsOWIjoiTyIsIsOYIjoiTyIsIsOyIjoibyIsIsOzIjoibyIsIsO0IjoibyIsIsO1IjoibyIsIsO2IjoibyIsIsO4IjoibyIsIsOZIjoiVSIsIsOaIjoiVSIsIsObIjoiVSIsIsOcIjoiVSIsIsO5IjoidSIsIsO6IjoidSIsIsO7IjoidSIsIsO8IjoidSIsIsOdIjoiWSIsIsO9IjoieSIsIsO/IjoieSIsIsOGIjoiQWUiLCLDpiI6ImFlIiwiw54iOiJUaCIsIsO+IjoidGgiLCLDnyI6InNzIiwixIAiOiJBIiwixIIiOiJBIiwixIQiOiJBIiwixIEiOiJhIiwixIMiOiJhIiwixIUiOiJhIiwixIYiOiJDIiwixIgiOiJDIiwixIoiOiJDIiwixIwiOiJDIiwixIciOiJjIiwixIkiOiJjIiwixIsiOiJjIiwixI0iOiJjIiwixI4iOiJEIiwixJAiOiJEIiwixI8iOiJkIiwixJEiOiJkIiwixJIiOiJFIiwixJQiOiJFIiwixJYiOiJFIiwixJgiOiJFIiwixJoiOiJFIiwixJMiOiJlIiwixJUiOiJlIiwixJciOiJlIiwixJkiOiJlIiwixJsiOiJlIiwixJwiOiJHIiwixJ4iOiJHIiwixKAiOiJHIiwixKIiOiJHIiwixJ0iOiJnIiwixJ8iOiJnIiwixKEiOiJnIiwixKMiOiJnIiwixKQiOiJIIiwixKYiOiJIIiwixKUiOiJoIiwixKciOiJoIiwixKgiOiJJIiwixKoiOiJJIiwixKwiOiJJIiwixK4iOiJJIiwixLAiOiJJIiwixKkiOiJpIiwixKsiOiJpIiwixK0iOiJpIiwixK8iOiJpIiwixLEiOiJpIiwixLQiOiJKIiwixLUiOiJqIiwixLYiOiJLIiwixLciOiJrIiwixLgiOiJrIiwixLkiOiJMIiwixLsiOiJMIiwixL0iOiJMIiwixL8iOiJMIiwixYEiOiJMIiwixLoiOiJsIiwixLwiOiJsIiwixL4iOiJsIiwixYAiOiJsIiwixYIiOiJsIiwixYMiOiJOIiwixYUiOiJOIiwixYciOiJOIiwixYoiOiJOIiwixYQiOiJuIiwixYYiOiJuIiwixYgiOiJuIiwixYsiOiJuIiwixYwiOiJPIiwixY4iOiJPIiwixZAiOiJPIiwixY0iOiJvIiwixY8iOiJvIiwixZEiOiJvIiwixZQiOiJSIiwixZYiOiJSIiwixZgiOiJSIiwixZUiOiJyIiwixZciOiJyIiwixZkiOiJyIiwixZoiOiJTIiwixZwiOiJTIiwixZ4iOiJTIiwixaAiOiJTIiwixZsiOiJzIiwixZ0iOiJzIiwixZ8iOiJzIiwixaEiOiJzIiwixaIiOiJUIiwixaQiOiJUIiwixaYiOiJUIiwixaMiOiJ0IiwixaUiOiJ0IiwixaciOiJ0IiwixagiOiJVIiwixaoiOiJVIiwixawiOiJVIiwixa4iOiJVIiwixbAiOiJVIiwixbIiOiJVIiwixakiOiJ1IiwixasiOiJ1Iiwixa0iOiJ1Iiwixa8iOiJ1IiwixbEiOiJ1IiwixbMiOiJ1IiwixbQiOiJXIiwixbUiOiJ3IiwixbYiOiJZIiwixbciOiJ5IiwixbgiOiJZIiwixbkiOiJaIiwixbsiOiJaIiwixb0iOiJaIiwixboiOiJ6IiwixbwiOiJ6Iiwixb4iOiJ6IiwixLIiOiJJSiIsIsSzIjoiaWoiLCLFkiI6Ik9lIiwixZMiOiJvZSIsIsWJIjoiJ24iLCLFvyI6InMifSk7dC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09dD92b2lkIDA6dFtlXX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0MzUpLGk9big0MzYpLG89big2NCksdT1uKDQzNyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdD1vKHQpLHZvaWQgMD09PShlPW4/dm9pZCAwOmUpP2kodCk/dSh0KTpyKHQpOnQubWF0Y2goZSl8fFtdfX0sZnVuY3Rpb24odCxlKXt2YXIgbj0vW15ceDAwLVx4MmZceDNhLVx4NDBceDViLVx4NjBceDdiLVx4N2ZdKy9nO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdC5tYXRjaChuKXx8W119fSxmdW5jdGlvbih0LGUpe3ZhciBuPS9bYS16XVtBLVpdfFtBLVpdezJ9W2Etel18WzAtOV1bYS16QS1aXXxbYS16QS1aXVswLTldfFteYS16QS1aMC05IF0vO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbi50ZXN0KHQpfX0sZnVuY3Rpb24odCxlKXt2YXIgbj0iXFx1MjcwMC1cXHUyN2JmIixyPSJhLXpcXHhkZi1cXHhmNlxceGY4LVxceGZmIixpPSJBLVpcXHhjMC1cXHhkNlxceGQ4LVxceGRlIixvPSJcXHhhY1xceGIxXFx4ZDdcXHhmN1xceDAwLVxceDJmXFx4M2EtXFx4NDBcXHg1Yi1cXHg2MFxceDdiLVxceGJmXFx1MjAwMC1cXHUyMDZmIFxcdFxceDBiXFxmXFx4YTBcXHVmZWZmXFxuXFxyXFx1MjAyOFxcdTIwMjlcXHUxNjgwXFx1MTgwZVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBhXFx1MjAyZlxcdTIwNWZcXHUzMDAwIix1PSJbIitvKyJdIixzPSJcXGQrIixhPSJbXFx1MjcwMC1cXHUyN2JmXSIsYz0iWyIrcisiXSIsZj0iW15cXHVkODAwLVxcdWRmZmYiK28rcytuK3IraSsiXSIsbD0iKD86XFx1ZDgzY1tcXHVkZGU2LVxcdWRkZmZdKXsyfSIscD0iW1xcdWQ4MDAtXFx1ZGJmZl1bXFx1ZGMwMC1cXHVkZmZmXSIsaD0iWyIraSsiXSIsZD0iKD86IitjKyJ8IitmKyIpIix5PSIoPzoiK2grInwiK2YrIikiLHY9Iig/Olsn4oCZXSg/OmR8bGx8bXxyZXxzfHR8dmUpKT8iLGc9Iig/Olsn4oCZXSg/OkR8TEx8TXxSRXxTfFR8VkUpKT8iLHc9Iig/OltcXHUwMzAwLVxcdTAzNmZcXHVmZTIwLVxcdWZlMmZcXHUyMGQwLVxcdTIwZmZdfFxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSk/IixNPSJbXFx1ZmUwZVxcdWZlMGZdPyIsbT1NK3crKCIoPzpcXHUyMDBkKD86IitbIlteXFx1ZDgwMC1cXHVkZmZmXSIsbCxwXS5qb2luKCJ8IikrIikiK00rdysiKSoiKSxfPSIoPzoiK1thLGwscF0uam9pbigifCIpKyIpIittLEw9UmVnRXhwKFtoKyI/IitjKyIrIit2KyIoPz0iK1t1LGgsIiQiXS5qb2luKCJ8IikrIikiLHkrIisiK2crIig/PSIrW3UsaCtkLCIkIl0uam9pbigifCIpKyIpIixoKyI/IitkKyIrIit2LGgrIisiK2csIlxcZCooPzoxU1R8Mk5EfDNSRHwoPyFbMTIzXSlcXGRUSCkoPz1cXGJ8W2Etel9dKSIsIlxcZCooPzoxc3R8Mm5kfDNyZHwoPyFbMTIzXSlcXGR0aCkoPz1cXGJ8W0EtWl9dKSIscyxfXS5qb2luKCJ8IiksImciKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQubWF0Y2goTCl8fFtdfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDM5KSxpPW4oOTApLG89bigxMjcpO3QuZXhwb3J0cz1mdW5jdGlvbigpe3RoaXMuc2l6ZT0wLHRoaXMuX19kYXRhX189e2hhc2g6bmV3IHIsbWFwOm5ldyhvfHxpKSxzdHJpbmc6bmV3IHJ9fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDQwKSxpPW4oNDQ1KSxvPW4oNDQ2KSx1PW4oNDQ3KSxzPW4oNDQ4KTtmdW5jdGlvbiBhKHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgcj10W2VdO3RoaXMuc2V0KHJbMF0sclsxXSl9fWEucHJvdG90eXBlLmNsZWFyPXIsYS5wcm90b3R5cGUuZGVsZXRlPWksYS5wcm90b3R5cGUuZ2V0PW8sYS5wcm90b3R5cGUuaGFzPXUsYS5wcm90b3R5cGUuc2V0PXMsdC5leHBvcnRzPWF9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDg5KTt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt0aGlzLl9fZGF0YV9fPXI/cihudWxsKTp7fSx0aGlzLnNpemU9MH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDcwKSxpPW4oNDQyKSxvPW4oNjcpLHU9bigxODgpLHM9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sYT1GdW5jdGlvbi5wcm90b3R5cGUsYz1PYmplY3QucHJvdG90eXBlLGY9YS50b1N0cmluZyxsPWMuaGFzT3duUHJvcGVydHkscD1SZWdFeHAoIl4iK2YuY2FsbChsKS5yZXBsYWNlKC9bXFxeJC4qKz8oKVtcXXt9fF0vZywiXFwkJiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuISghbyh0KXx8aSh0KSkmJihyKHQpP3A6cykudGVzdCh1KHQpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcixpPW4oNDQzKSxvPShyPS9bXi5dKyQvLmV4ZWMoaSYmaS5rZXlzJiZpLmtleXMuSUVfUFJPVE98fCIiKSk/IlN5bWJvbChzcmMpXzEuIityOiIiO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4hIW8mJm8gaW4gdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDI1KVsiX19jb3JlLWpzX3NoYXJlZF9fIl07dC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/dm9pZCAwOnRbZV19fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDg5KSxpPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX187aWYocil7dmFyIG49ZVt0XTtyZXR1cm4iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI9PT1uP3ZvaWQgMDpufXJldHVybiBpLmNhbGwoZSx0KT9lW3RdOnZvaWQgMH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDg5KSxpPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX187cmV0dXJuIHI/dm9pZCAwIT09ZVt0XTppLmNhbGwoZSx0KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDg5KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fO3JldHVybiB0aGlzLnNpemUrPXRoaXMuaGFzKHQpPzA6MSxuW3RdPXImJnZvaWQgMD09PWU/Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iOmUsdGhpc319LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDkxKSxpPUFycmF5LnByb3RvdHlwZS5zcGxpY2U7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX19kYXRhX18sbj1yKGUsdCk7cmV0dXJuIShuPDApJiYobj09ZS5sZW5ndGgtMT9lLnBvcCgpOmkuY2FsbChlLG4sMSksLS10aGlzLnNpemUsITApfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oOTEpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49cihlLHQpO3JldHVybiBuPDA/dm9pZCAwOmVbbl1bMV19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big5MSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiByKHRoaXMuX19kYXRhX18sdCk+LTF9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big5MSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fX2RhdGFfXyxpPXIobix0KTtyZXR1cm4gaTwwPygrK3RoaXMuc2l6ZSxuLnB1c2goW3QsZV0pKTpuW2ldWzFdPWUsdGhpc319LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDkyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9cih0aGlzLHQpLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuInN0cmluZyI9PWV8fCJudW1iZXIiPT1lfHwic3ltYm9sIj09ZXx8ImJvb2xlYW4iPT1lPyJfX3Byb3RvX18iIT09dDpudWxsPT09dH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDkyKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHIodGhpcyx0KS5nZXQodCl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big5Mik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiByKHRoaXMsdCkuaGFzKHQpfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oOTIpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuPXIodGhpcyx0KSxpPW4uc2l6ZTtyZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemUrPW4uc2l6ZT09aT8wOjEsdGhpc319LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEyOCksaT1uKDY4KSxvPW4oOTMpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLHUpe3ZhciBzPU9iamVjdChlKTtpZighaShlKSl7dmFyIGE9cihuLDMpO2U9byhlKSxuPWZ1bmN0aW9uKHQpe3JldHVybiBhKHNbdF0sdCxzKX19dmFyIGM9dChlLG4sdSk7cmV0dXJuIGM+LTE/c1thP2VbY106Y106dm9pZCAwfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQ2MSksaT1uKDQ5Niksbz1uKDE5OCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPWkodCk7cmV0dXJuIDE9PWUubGVuZ3RoJiZlWzBdWzJdP28oZVswXVswXSxlWzBdWzFdKTpmdW5jdGlvbihuKXtyZXR1cm4gbj09PXR8fHIobix0LGUpfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE4OSksaT1uKDE5MCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuLG8pe3ZhciB1PW4ubGVuZ3RoLHM9dSxhPSFvO2lmKG51bGw9PXQpcmV0dXJuIXM7Zm9yKHQ9T2JqZWN0KHQpO3UtLTspe3ZhciBjPW5bdV07aWYoYSYmY1syXT9jWzFdIT09dFtjWzBdXTohKGNbMF1pbiB0KSlyZXR1cm4hMX1mb3IoOysrdTxzOyl7dmFyIGY9KGM9blt1XSlbMF0sbD10W2ZdLHA9Y1sxXTtpZihhJiZjWzJdKXtpZih2b2lkIDA9PT1sJiYhKGYgaW4gdCkpcmV0dXJuITF9ZWxzZXt2YXIgaD1uZXcgcjtpZihvKXZhciBkPW8obCxwLGYsdCxlLGgpO2lmKCEodm9pZCAwPT09ZD9pKHAsbCwzLG8saCk6ZCkpcmV0dXJuITF9fXJldHVybiEwfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oOTApO3QuZXhwb3J0cz1mdW5jdGlvbigpe3RoaXMuX19kYXRhX189bmV3IHIsdGhpcy5zaXplPTB9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49ZS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZT1lLnNpemUsbn19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmdldCh0KX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDkwKSxpPW4oMTI3KSxvPW4oMTI2KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fO2lmKG4gaW5zdGFuY2VvZiByKXt2YXIgdT1uLl9fZGF0YV9fO2lmKCFpfHx1Lmxlbmd0aDwxOTkpcmV0dXJuIHUucHVzaChbdCxlXSksdGhpcy5zaXplPSsrbi5zaXplLHRoaXM7bj10aGlzLl9fZGF0YV9fPW5ldyBvKHUpfXJldHVybiBuLnNldCh0LGUpLHRoaXMuc2l6ZT1uLnNpemUsdGhpc319LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE4OSksaT1uKDE5MSksbz1uKDQ3MiksdT1uKDQ3Nikscz1uKDE5NiksYT1uKDIyKSxjPW4oMTMwKSxmPW4oMTMyKSxsPSJbb2JqZWN0IEFyZ3VtZW50c10iLHA9IltvYmplY3QgQXJyYXldIixoPSJbb2JqZWN0IE9iamVjdF0iLGQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4seSx2LGcpe3ZhciB3PWEodCksTT1hKGUpLG09dz9wOnModCksXz1NP3A6cyhlKSxMPShtPW09PWw/aDptKT09aCxiPShfPV89PWw/aDpfKT09aCx4PW09PV87aWYoeCYmYyh0KSl7aWYoIWMoZSkpcmV0dXJuITE7dz0hMCxMPSExfWlmKHgmJiFMKXJldHVybiBnfHwoZz1uZXcgciksd3x8Zih0KT9pKHQsZSxuLHksdixnKTpvKHQsZSxtLG4seSx2LGcpO2lmKCEoMSZuKSl7dmFyIGo9TCYmZC5jYWxsKHQsIl9fd3JhcHBlZF9fIiksTj1iJiZkLmNhbGwoZSwiX193cmFwcGVkX18iKTtpZihqfHxOKXt2YXIgUz1qP3QudmFsdWUoKTp0LEQ9Tj9lLnZhbHVlKCk6ZTtyZXR1cm4gZ3x8KGc9bmV3IHIpLHYoUyxELG4seSxnKX19cmV0dXJuISF4JiYoZ3x8KGc9bmV3IHIpLHUodCxlLG4seSx2LGcpKX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDEyNiksaT1uKDQ2OSksbz1uKDQ3MCk7ZnVuY3Rpb24gdSh0KXt2YXIgZT0tMSxuPW51bGw9PXQ/MDp0Lmxlbmd0aDtmb3IodGhpcy5fX2RhdGFfXz1uZXcgcjsrK2U8bjspdGhpcy5hZGQodFtlXSl9dS5wcm90b3R5cGUuYWRkPXUucHJvdG90eXBlLnB1c2g9aSx1LnByb3RvdHlwZS5oYXM9byx0LmV4cG9ydHM9dX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uc2V0KHQsIl9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iKSx0aGlzfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5oYXMoZSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big4NyksaT1uKDQ3Myksbz1uKDQ5KSx1PW4oMTkxKSxzPW4oNDc0KSxhPW4oNDc1KSxjPXI/ci5wcm90b3R5cGU6dm9pZCAwLGY9Yz9jLnZhbHVlT2Y6dm9pZCAwO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixyLGMsbCxwKXtzd2l0Y2gobil7Y2FzZSJbb2JqZWN0IERhdGFWaWV3XSI6aWYodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fHQuYnl0ZU9mZnNldCE9ZS5ieXRlT2Zmc2V0KXJldHVybiExO3Q9dC5idWZmZXIsZT1lLmJ1ZmZlcjtjYXNlIltvYmplY3QgQXJyYXlCdWZmZXJdIjpyZXR1cm4hKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHwhbChuZXcgaSh0KSxuZXcgaShlKSkpO2Nhc2UiW29iamVjdCBCb29sZWFuXSI6Y2FzZSJbb2JqZWN0IERhdGVdIjpjYXNlIltvYmplY3QgTnVtYmVyXSI6cmV0dXJuIG8oK3QsK2UpO2Nhc2UiW29iamVjdCBFcnJvcl0iOnJldHVybiB0Lm5hbWU9PWUubmFtZSYmdC5tZXNzYWdlPT1lLm1lc3NhZ2U7Y2FzZSJbb2JqZWN0IFJlZ0V4cF0iOmNhc2UiW29iamVjdCBTdHJpbmddIjpyZXR1cm4gdD09ZSsiIjtjYXNlIltvYmplY3QgTWFwXSI6dmFyIGg9cztjYXNlIltvYmplY3QgU2V0XSI6dmFyIGQ9MSZyO2lmKGh8fChoPWEpLHQuc2l6ZSE9ZS5zaXplJiYhZClyZXR1cm4hMTt2YXIgeT1wLmdldCh0KTtpZih5KXJldHVybiB5PT1lO3J8PTIscC5zZXQodCxlKTt2YXIgdj11KGgodCksaChlKSxyLGMsbCxwKTtyZXR1cm4gcC5kZWxldGUodCksdjtjYXNlIltvYmplY3QgU3ltYm9sXSI6aWYoZilyZXR1cm4gZi5jYWxsKHQpPT1mLmNhbGwoZSl9cmV0dXJuITF9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigyNSkuVWludDhBcnJheTt0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9LTEsbj1BcnJheSh0LnNpemUpO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQscil7blsrK2VdPVtyLHRdfSkpLG59fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT0tMSxuPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7blsrK2VdPXR9KSksbn19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQ3NyksaT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixvLHUscyl7dmFyIGE9MSZuLGM9cih0KSxmPWMubGVuZ3RoO2lmKGYhPXIoZSkubGVuZ3RoJiYhYSlyZXR1cm4hMTtmb3IodmFyIGw9ZjtsLS07KXt2YXIgcD1jW2xdO2lmKCEoYT9wIGluIGU6aS5jYWxsKGUscCkpKXJldHVybiExfXZhciBoPXMuZ2V0KHQpLGQ9cy5nZXQoZSk7aWYoaCYmZClyZXR1cm4gaD09ZSYmZD09dDt2YXIgeT0hMDtzLnNldCh0LGUpLHMuc2V0KGUsdCk7Zm9yKHZhciB2PWE7KytsPGY7KXt2YXIgZz10W3A9Y1tsXV0sdz1lW3BdO2lmKG8pdmFyIE09YT9vKHcsZyxwLGUsdCxzKTpvKGcsdyxwLHQsZSxzKTtpZighKHZvaWQgMD09PU0/Zz09PXd8fHUoZyx3LG4sbyxzKTpNKSl7eT0hMTticmVha312fHwodj0iY29uc3RydWN0b3IiPT1wKX1pZih5JiYhdil7dmFyIG09dC5jb25zdHJ1Y3RvcixfPWUuY29uc3RydWN0b3I7bT09X3x8ISgiY29uc3RydWN0b3IiaW4gdCl8fCEoImNvbnN0cnVjdG9yImluIGUpfHwiZnVuY3Rpb24iPT10eXBlb2YgbSYmbSBpbnN0YW5jZW9mIG0mJiJmdW5jdGlvbiI9PXR5cGVvZiBfJiZfIGluc3RhbmNlb2YgX3x8KHk9ITEpfXJldHVybiBzLmRlbGV0ZSh0KSxzLmRlbGV0ZShlKSx5fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDc4KSxpPW4oNDgwKSxvPW4oOTMpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gcih0LG8saSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0NzkpLGk9bigyMik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgbz1lKHQpO3JldHVybiBpKHQpP286cihvLG4odCkpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49LTEscj1lLmxlbmd0aCxpPXQubGVuZ3RoOysrbjxyOyl0W2krbl09ZVtuXTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQ4MSksaT1uKDQ4Miksbz1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLHU9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyxzPXU/ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106KHQ9T2JqZWN0KHQpLHIodSh0KSwoZnVuY3Rpb24oZSl7cmV0dXJuIG8uY2FsbCh0LGUpfSkpKX06aTt0LmV4cG9ydHM9c30sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49LTEscj1udWxsPT10PzA6dC5sZW5ndGgsaT0wLG89W107KytuPHI7KXt2YXIgdT10W25dO2UodSxuLHQpJiYob1tpKytdPXUpfXJldHVybiBvfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24oKXtyZXR1cm5bXX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQ4NCksaT1uKDEyOSksbz1uKDIyKSx1PW4oMTMwKSxzPW4oMTMxKSxhPW4oMTMyKSxjPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIG49byh0KSxmPSFuJiZpKHQpLGw9IW4mJiFmJiZ1KHQpLHA9IW4mJiFmJiYhbCYmYSh0KSxoPW58fGZ8fGx8fHAsZD1oP3IodC5sZW5ndGgsU3RyaW5nKTpbXSx5PWQubGVuZ3RoO2Zvcih2YXIgdiBpbiB0KSFlJiYhYy5jYWxsKHQsdil8fGgmJigibGVuZ3RoIj09dnx8bCYmKCJvZmZzZXQiPT12fHwicGFyZW50Ij09dil8fHAmJigiYnVmZmVyIj09dnx8ImJ5dGVMZW5ndGgiPT12fHwiYnl0ZU9mZnNldCI9PXYpfHxzKHYseSkpfHxkLnB1c2godik7cmV0dXJuIGR9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj0tMSxyPUFycmF5KHQpOysrbjx0OylyW25dPWUobik7cmV0dXJuIHJ9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2NSksaT1uKDY2KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGkodCkmJiJbb2JqZWN0IEFyZ3VtZW50c10iPT1yKHQpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24oKXtyZXR1cm4hMX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDY1KSxpPW4oMTMzKSxvPW4oNjYpLHU9e307dVsiW29iamVjdCBGbG9hdDMyQXJyYXldIl09dVsiW29iamVjdCBGbG9hdDY0QXJyYXldIl09dVsiW29iamVjdCBJbnQ4QXJyYXldIl09dVsiW29iamVjdCBJbnQxNkFycmF5XSJdPXVbIltvYmplY3QgSW50MzJBcnJheV0iXT11WyJbb2JqZWN0IFVpbnQ4QXJyYXldIl09dVsiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iXT11WyJbb2JqZWN0IFVpbnQxNkFycmF5XSJdPXVbIltvYmplY3QgVWludDMyQXJyYXldIl09ITAsdVsiW29iamVjdCBBcmd1bWVudHNdIl09dVsiW29iamVjdCBBcnJheV0iXT11WyJbb2JqZWN0IEFycmF5QnVmZmVyXSJdPXVbIltvYmplY3QgQm9vbGVhbl0iXT11WyJbb2JqZWN0IERhdGFWaWV3XSJdPXVbIltvYmplY3QgRGF0ZV0iXT11WyJbb2JqZWN0IEVycm9yXSJdPXVbIltvYmplY3QgRnVuY3Rpb25dIl09dVsiW29iamVjdCBNYXBdIl09dVsiW29iamVjdCBOdW1iZXJdIl09dVsiW29iamVjdCBPYmplY3RdIl09dVsiW29iamVjdCBSZWdFeHBdIl09dVsiW29iamVjdCBTZXRdIl09dVsiW29iamVjdCBTdHJpbmddIl09dVsiW29iamVjdCBXZWFrTWFwXSJdPSExLHQuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbyh0KSYmaSh0Lmxlbmd0aCkmJiEhdVtyKHQpXX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdChlKX19fSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKHQpe3ZhciByPW4oMTg2KSxpPWUmJiFlLm5vZGVUeXBlJiZlLG89aSYmIm9iamVjdCI9PXR5cGVvZiB0JiZ0JiYhdC5ub2RlVHlwZSYmdCx1PW8mJm8uZXhwb3J0cz09PWkmJnIucHJvY2VzcyxzPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PW8mJm8ucmVxdWlyZSYmby5yZXF1aXJlKCJ1dGlsIikudHlwZXM7cmV0dXJuIHR8fHUmJnUuYmluZGluZyYmdS5iaW5kaW5nKCJ1dGlsIil9Y2F0Y2godCl7fX0oKTt0LmV4cG9ydHM9c30pLmNhbGwodGhpcyxuKDE5MykodCkpfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big0OTEpKE9iamVjdC5rZXlzLE9iamVjdCk7dC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0KGUobikpfX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQ2KShuKDI1KSwiRGF0YVZpZXciKTt0LmV4cG9ydHM9cn0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDYpKG4oMjUpLCJQcm9taXNlIik7dC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQ2KShuKDI1KSwiU2V0Iik7dC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDQ2KShuKDI1KSwiV2Vha01hcCIpO3QuZXhwb3J0cz1yfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxOTcpLGk9big5Myk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1pKHQpLG49ZS5sZW5ndGg7bi0tOyl7dmFyIG89ZVtuXSx1PXRbb107ZVtuXT1bbyx1LHIodSldfXJldHVybiBlfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTkwKSxpPW4oNDk4KSxvPW4oNTAxKSx1PW4oMTM0KSxzPW4oMTk3KSxhPW4oMTk4KSxjPW4oOTQpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiB1KHQpJiZzKGUpP2EoYyh0KSxlKTpmdW5jdGlvbihuKXt2YXIgdT1pKG4sdCk7cmV0dXJuIHZvaWQgMD09PXUmJnU9PT1lP28obix0KTpyKGUsdSwzKX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxOTkpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7dmFyIGk9bnVsbD09dD92b2lkIDA6cih0LGUpO3JldHVybiB2b2lkIDA9PT1pP246aX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUwMCksaT0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyxvPS9cXChcXCk/L2csdT1yKChmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gNDY9PT10LmNoYXJDb2RlQXQoMCkmJmUucHVzaCgiIiksdC5yZXBsYWNlKGksKGZ1bmN0aW9uKHQsbixyLGkpe2UucHVzaChyP2kucmVwbGFjZShvLCIkMSIpOm58fHQpfSkpLGV9KSk7dC5leHBvcnRzPXV9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE0Mik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXIodCwoZnVuY3Rpb24odCl7cmV0dXJuIDUwMD09PW4uc2l6ZSYmbi5jbGVhcigpLHR9KSksbj1lLmNhY2hlO3JldHVybiBlfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNTAyKSxpPW4oNTAzKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbCE9dCYmaSh0LGUscil9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsIT10JiZlIGluIE9iamVjdCh0KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDIwMCksaT1uKDEyOSksbz1uKDIyKSx1PW4oMTMxKSxzPW4oMTMzKSxhPW4oOTQpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciBjPS0xLGY9KGU9cihlLHQpKS5sZW5ndGgsbD0hMTsrK2M8Zjspe3ZhciBwPWEoZVtjXSk7aWYoIShsPW51bGwhPXQmJm4odCxwKSkpYnJlYWs7dD10W3BdfXJldHVybiBsfHwrK2MhPWY/bDohIShmPW51bGw9PXQ/MDp0Lmxlbmd0aCkmJnMoZikmJnUocCxmKSYmKG8odCl8fGkodCkpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1MDYpLGk9big1MDcpLG89bigxMzQpLHU9big5NCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBvKHQpP3IodSh0KSk6aSh0KX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT92b2lkIDA6ZVt0XX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxOTkpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHIoZSx0KX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1MDkpLGk9bigxMjgpLG89big1MTApLHU9TWF0aC5tYXg7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgcz1udWxsPT10PzA6dC5sZW5ndGg7aWYoIXMpcmV0dXJuLTE7dmFyIGE9bnVsbD09bj8wOm8obik7cmV0dXJuIGE8MCYmKGE9dShzK2EsMCkpLHIodCxpKGUsMyksYSl9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsbixyKXtmb3IodmFyIGk9dC5sZW5ndGgsbz1uKyhyPzE6LTEpO3I/by0tOisrbzxpOylpZihlKHRbb10sbyx0KSlyZXR1cm4gbztyZXR1cm4tMX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUxMSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXIodCksbj1lJTE7cmV0dXJuIGU9PWU/bj9lLW46ZTowfX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNTEyKSxpPTEvMDt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ/KHQ9cih0KSk9PT1pfHx0PT09LTEvMD8xNzk3NjkzMTM0ODYyMzE1N2UyOTIqKHQ8MD8tMToxKTp0PT10P3Q6MDowPT09dD90OjB9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1MTMpLGk9big2Nyksbz1uKDg4KSx1PS9eWy0rXTB4WzAtOWEtZl0rJC9pLHM9L14wYlswMV0rJC9pLGE9L14wb1swLTddKyQvaSxjPXBhcnNlSW50O3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHQ7aWYobyh0KSlyZXR1cm4gTmFOO2lmKGkodCkpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0LnZhbHVlT2Y/dC52YWx1ZU9mKCk6dDt0PWkoZSk/ZSsiIjplfWlmKCJzdHJpbmciIT10eXBlb2YgdClyZXR1cm4gMD09PXQ/dDordDt0PXIodCk7dmFyIG49cy50ZXN0KHQpO3JldHVybiBufHxhLnRlc3QodCk/Yyh0LnNsaWNlKDIpLG4/Mjo4KTp1LnRlc3QodCk/TmFOOit0fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNTE0KSxpPS9eXHMrLzt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQ/dC5zbGljZSgwLHIodCkrMSkucmVwbGFjZShpLCIiKTp0fX0sZnVuY3Rpb24odCxlKXt2YXIgbj0vXHMvO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5sZW5ndGg7ZS0tJiZuLnRlc3QodC5jaGFyQXQoZSkpOyk7cmV0dXJuIGV9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1MTYpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3ZhciBuO3JldHVybiByKHQsKGZ1bmN0aW9uKHQscixpKXtyZXR1cm4hKG49ZSh0LHIsaSkpfSkpLCEhbn19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUxNyksaT1uKDUyMCkocik7dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDUxOCksaT1uKDkzKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmcih0LGUsaSl9fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big1MTkpKCk7dC5leHBvcnRzPXJ9LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihlLG4scil7Zm9yKHZhciBpPS0xLG89T2JqZWN0KGUpLHU9cihlKSxzPXUubGVuZ3RoO3MtLTspe3ZhciBhPXVbdD9zOisraV07aWYoITE9PT1uKG9bYV0sYSxvKSlicmVha31yZXR1cm4gZX19fSxmdW5jdGlvbih0LGUsbil7dmFyIHI9big2OCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4saSl7aWYobnVsbD09bilyZXR1cm4gbjtpZighcihuKSlyZXR1cm4gdChuLGkpO2Zvcih2YXIgbz1uLmxlbmd0aCx1PWU/bzotMSxzPU9iamVjdChuKTsoZT91LS06Kyt1PG8pJiYhMSE9PWkoc1t1XSx1LHMpOyk7cmV0dXJuIG59fX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oNDkpLGk9big2OCksbz1uKDEzMSksdT1uKDY3KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLG4pe2lmKCF1KG4pKXJldHVybiExO3ZhciBzPXR5cGVvZiBlO3JldHVybiEhKCJudW1iZXIiPT1zP2kobikmJm8oZSxuLmxlbmd0aCk6InN0cmluZyI9PXMmJmUgaW4gbikmJnIobltlXSx0KX19LGZ1bmN0aW9uKHQsZSl7dmFyIG49eyImIjoiJmFtcDsiLCciJzoiJnF1b3Q7IiwiJyI6IiZhcG9zOyIsIjwiOiImbHQ7IiwiPiI6IiZndDsifTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQucmVwbGFjZT90LnJlcGxhY2UoLyhbJiI8PiddKS9nLChmdW5jdGlvbih0LGUpe3JldHVybiBuW2VdfSkpOnR9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPWk7dmFyIHI9bigxMzUpLkV2ZW50RW1pdHRlcjtmdW5jdGlvbiBpKCl7ci5jYWxsKHRoaXMpfW4oMTYpKGksciksaS5SZWFkYWJsZT1uKDEzNiksaS5Xcml0YWJsZT1uKDUzMCksaS5EdXBsZXg9big1MzEpLGkuVHJhbnNmb3JtPW4oNTMyKSxpLlBhc3NUaHJvdWdoPW4oNTMzKSxpLlN0cmVhbT1pLGkucHJvdG90eXBlLnBpcGU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO2Z1bmN0aW9uIGkoZSl7dC53cml0YWJsZSYmITE9PT10LndyaXRlKGUpJiZuLnBhdXNlJiZuLnBhdXNlKCl9ZnVuY3Rpb24gbygpe24ucmVhZGFibGUmJm4ucmVzdW1lJiZuLnJlc3VtZSgpfW4ub24oImRhdGEiLGkpLHQub24oImRyYWluIixvKSx0Ll9pc1N0ZGlvfHxlJiYhMT09PWUuZW5kfHwobi5vbigiZW5kIixzKSxuLm9uKCJjbG9zZSIsYSkpO3ZhciB1PSExO2Z1bmN0aW9uIHMoKXt1fHwodT0hMCx0LmVuZCgpKX1mdW5jdGlvbiBhKCl7dXx8KHU9ITAsImZ1bmN0aW9uIj09dHlwZW9mIHQuZGVzdHJveSYmdC5kZXN0cm95KCkpfWZ1bmN0aW9uIGModCl7aWYoZigpLDA9PT1yLmxpc3RlbmVyQ291bnQodGhpcywiZXJyb3IiKSl0aHJvdyB0fWZ1bmN0aW9uIGYoKXtuLnJlbW92ZUxpc3RlbmVyKCJkYXRhIixpKSx0LnJlbW92ZUxpc3RlbmVyKCJkcmFpbiIsbyksbi5yZW1vdmVMaXN0ZW5lcigiZW5kIixzKSxuLnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsYSksbi5yZW1vdmVMaXN0ZW5lcigiZXJyb3IiLGMpLHQucmVtb3ZlTGlzdGVuZXIoImVycm9yIixjKSxuLnJlbW92ZUxpc3RlbmVyKCJlbmQiLGYpLG4ucmVtb3ZlTGlzdGVuZXIoImNsb3NlIixmKSx0LnJlbW92ZUxpc3RlbmVyKCJjbG9zZSIsZil9cmV0dXJuIG4ub24oImVycm9yIixjKSx0Lm9uKCJlcnJvciIsYyksbi5vbigiZW5kIixmKSxuLm9uKCJjbG9zZSIsZiksdC5vbigiY2xvc2UiLGYpLHQuZW1pdCgicGlwZSIsbiksdH19LGZ1bmN0aW9uKHQsZSl7fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTcpLkJ1ZmZlcixpPW4oNTI2KTt0LmV4cG9ydHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7IWZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsdCksdGhpcy5oZWFkPW51bGwsdGhpcy50YWlsPW51bGwsdGhpcy5sZW5ndGg9MH1yZXR1cm4gdC5wcm90b3R5cGUucHVzaD1mdW5jdGlvbih0KXt2YXIgZT17ZGF0YTp0LG5leHQ6bnVsbH07dGhpcy5sZW5ndGg+MD90aGlzLnRhaWwubmV4dD1lOnRoaXMuaGVhZD1lLHRoaXMudGFpbD1lLCsrdGhpcy5sZW5ndGh9LHQucHJvdG90eXBlLnVuc2hpZnQ9ZnVuY3Rpb24odCl7dmFyIGU9e2RhdGE6dCxuZXh0OnRoaXMuaGVhZH07MD09PXRoaXMubGVuZ3RoJiYodGhpcy50YWlsPWUpLHRoaXMuaGVhZD1lLCsrdGhpcy5sZW5ndGh9LHQucHJvdG90eXBlLnNoaWZ0PWZ1bmN0aW9uKCl7aWYoMCE9PXRoaXMubGVuZ3RoKXt2YXIgdD10aGlzLmhlYWQuZGF0YTtyZXR1cm4gMT09PXRoaXMubGVuZ3RoP3RoaXMuaGVhZD10aGlzLnRhaWw9bnVsbDp0aGlzLmhlYWQ9dGhpcy5oZWFkLm5leHQsLS10aGlzLmxlbmd0aCx0fX0sdC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmhlYWQ9dGhpcy50YWlsPW51bGwsdGhpcy5sZW5ndGg9MH0sdC5wcm90b3R5cGUuam9pbj1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIiI7Zm9yKHZhciBlPXRoaXMuaGVhZCxuPSIiK2UuZGF0YTtlPWUubmV4dDspbis9dCtlLmRhdGE7cmV0dXJuIG59LHQucHJvdG90eXBlLmNvbmNhdD1mdW5jdGlvbih0KXtpZigwPT09dGhpcy5sZW5ndGgpcmV0dXJuIHIuYWxsb2MoMCk7aWYoMT09PXRoaXMubGVuZ3RoKXJldHVybiB0aGlzLmhlYWQuZGF0YTtmb3IodmFyIGUsbixpLG89ci5hbGxvY1Vuc2FmZSh0Pj4+MCksdT10aGlzLmhlYWQscz0wO3U7KWU9dS5kYXRhLG49byxpPXMsZS5jb3B5KG4saSkscys9dS5kYXRhLmxlbmd0aCx1PXUubmV4dDtyZXR1cm4gb30sdH0oKSxpJiZpLmluc3BlY3QmJmkuaW5zcGVjdC5jdXN0b20mJih0LmV4cG9ydHMucHJvdG90eXBlW2kuaW5zcGVjdC5jdXN0b21dPWZ1bmN0aW9uKCl7dmFyIHQ9aS5pbnNwZWN0KHtsZW5ndGg6dGhpcy5sZW5ndGh9KTtyZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lKyIgIit0fSl9LGZ1bmN0aW9uKHQsZSl7fSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKHQsZSl7IWZ1bmN0aW9uKHQsbil7InVzZSBzdHJpY3QiO2lmKCF0LnNldEltbWVkaWF0ZSl7dmFyIHIsaSxvLHUscyxhPTEsYz17fSxmPSExLGw9dC5kb2N1bWVudCxwPU9iamVjdC5nZXRQcm90b3R5cGVPZiYmT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpO3A9cCYmcC5zZXRUaW1lb3V0P3A6dCwiW29iamVjdCBwcm9jZXNzXSI9PT17fS50b1N0cmluZy5jYWxsKHQucHJvY2Vzcyk/cj1mdW5jdGlvbih0KXtlLm5leHRUaWNrKChmdW5jdGlvbigpe2QodCl9KSl9OiFmdW5jdGlvbigpe2lmKHQucG9zdE1lc3NhZ2UmJiF0LmltcG9ydFNjcmlwdHMpe3ZhciBlPSEwLG49dC5vbm1lc3NhZ2U7cmV0dXJuIHQub25tZXNzYWdlPWZ1bmN0aW9uKCl7ZT0hMX0sdC5wb3N0TWVzc2FnZSgiIiwiKiIpLHQub25tZXNzYWdlPW4sZX19KCk/dC5NZXNzYWdlQ2hhbm5lbD8oKG89bmV3IE1lc3NhZ2VDaGFubmVsKS5wb3J0MS5vbm1lc3NhZ2U9ZnVuY3Rpb24odCl7ZCh0LmRhdGEpfSxyPWZ1bmN0aW9uKHQpe28ucG9ydDIucG9zdE1lc3NhZ2UodCl9KTpsJiYib25yZWFkeXN0YXRlY2hhbmdlImluIGwuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik/KGk9bC5kb2N1bWVudEVsZW1lbnQscj1mdW5jdGlvbih0KXt2YXIgZT1sLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2Uub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7ZCh0KSxlLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGkucmVtb3ZlQ2hpbGQoZSksZT1udWxsfSxpLmFwcGVuZENoaWxkKGUpfSk6cj1mdW5jdGlvbih0KXtzZXRUaW1lb3V0KGQsMCx0KX06KHU9InNldEltbWVkaWF0ZSQiK01hdGgucmFuZG9tKCkrIiQiLHM9ZnVuY3Rpb24oZSl7ZS5zb3VyY2U9PT10JiYic3RyaW5nIj09dHlwZW9mIGUuZGF0YSYmMD09PWUuZGF0YS5pbmRleE9mKHUpJiZkKCtlLmRhdGEuc2xpY2UodS5sZW5ndGgpKX0sdC5hZGRFdmVudExpc3RlbmVyP3QuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIscywhMSk6dC5hdHRhY2hFdmVudCgib25tZXNzYWdlIixzKSxyPWZ1bmN0aW9uKGUpe3QucG9zdE1lc3NhZ2UodStlLCIqIil9KSxwLnNldEltbWVkaWF0ZT1mdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9bmV3IEZ1bmN0aW9uKCIiK3QpKTtmb3IodmFyIGU9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSksbj0wO248ZS5sZW5ndGg7bisrKWVbbl09YXJndW1lbnRzW24rMV07dmFyIGk9e2NhbGxiYWNrOnQsYXJnczplfTtyZXR1cm4gY1thXT1pLHIoYSksYSsrfSxwLmNsZWFySW1tZWRpYXRlPWh9ZnVuY3Rpb24gaCh0KXtkZWxldGUgY1t0XX1mdW5jdGlvbiBkKHQpe2lmKGYpc2V0VGltZW91dChkLDAsdCk7ZWxzZXt2YXIgZT1jW3RdO2lmKGUpe2Y9ITA7dHJ5eyFmdW5jdGlvbih0KXt2YXIgZT10LmNhbGxiYWNrLG49dC5hcmdzO3N3aXRjaChuLmxlbmd0aCl7Y2FzZSAwOmUoKTticmVhaztjYXNlIDE6ZShuWzBdKTticmVhaztjYXNlIDI6ZShuWzBdLG5bMV0pO2JyZWFrO2Nhc2UgMzplKG5bMF0sblsxXSxuWzJdKTticmVhaztkZWZhdWx0OmUuYXBwbHkodm9pZCAwLG4pfX0oZSl9ZmluYWxseXtoKHQpLGY9ITF9fX19fSgidW5kZWZpbmVkIj09dHlwZW9mIHNlbGY/dm9pZCAwPT09dD90aGlzOnQ6c2VsZil9KS5jYWxsKHRoaXMsbigyMCksbigzNCkpfSxmdW5jdGlvbih0LGUsbil7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIG4odCl7dHJ5e2lmKCFlLmxvY2FsU3RvcmFnZSlyZXR1cm4hMX1jYXRjaCh0KXtyZXR1cm4hMX12YXIgbj1lLmxvY2FsU3RvcmFnZVt0XTtyZXR1cm4gbnVsbCE9biYmInRydWUiPT09U3RyaW5nKG4pLnRvTG93ZXJDYXNlKCl9dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7aWYobigibm9EZXByZWNhdGlvbiIpKXJldHVybiB0O3ZhciByPSExO3JldHVybiBmdW5jdGlvbigpe2lmKCFyKXtpZihuKCJ0aHJvd0RlcHJlY2F0aW9uIikpdGhyb3cgbmV3IEVycm9yKGUpO24oInRyYWNlRGVwcmVjYXRpb24iKT9jb25zb2xlLnRyYWNlKGUpOmNvbnNvbGUud2FybihlKSxyPSEwfXJldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19fSkuY2FsbCh0aGlzLG4oMjApKX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9bzt2YXIgcj1uKDIwNiksaT1uKDY5KTtmdW5jdGlvbiBvKHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIG8pKXJldHVybiBuZXcgbyh0KTtyLmNhbGwodGhpcyx0KX1pLmluaGVyaXRzPW4oMTYpLGkuaW5oZXJpdHMobyxyKSxvLnByb3RvdHlwZS5fdHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxuKXtuKG51bGwsdCl9fSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTM3KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDM1KX0sZnVuY3Rpb24odCxlLG4pe3QuZXhwb3J0cz1uKDEzNikuVHJhbnNmb3JtfSxmdW5jdGlvbih0LGUsbil7dC5leHBvcnRzPW4oMTM2KS5QYXNzVGhyb3VnaH0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNTM2KSxpPU1hdGguYWJzLG89TWF0aC5mbG9vcjt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGlzTmFOKHQpPzA6MCE9PSh0PU51bWJlcih0KSkmJmlzRmluaXRlKHQpP3IodCkqbyhpKHQpKTp0fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9big1MzcpKCk/TWF0aC5zaWduOm4oNTM4KX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt2YXIgdD1NYXRoLnNpZ247cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQmJigxPT09dCgxMCkmJi0xPT09dCgtMjApKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0PU51bWJlcih0KSxpc05hTih0KXx8MD09PXQ/dDp0PjA/MTotMX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigzMSksaT1uKDk2KSxvPW4oMzgpLHU9big1NDEpLHM9bigyMDgpO3QuZXhwb3J0cz1mdW5jdGlvbiB0KGUpe3ZhciBuLGEsYztpZihyKGUpLChuPU9iamVjdChhcmd1bWVudHNbMV0pKS5hc3luYyYmbi5wcm9taXNlKXRocm93IG5ldyBFcnJvcigiT3B0aW9ucyAnYXN5bmMnIGFuZCAncHJvbWlzZScgY2Fubm90IGJlIHVzZWQgdG9nZXRoZXIiKTtyZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChlLCJfX21lbW9pemVkX18iKSYmIW4uZm9yY2U/ZTooYT1zKG4ubGVuZ3RoLGUubGVuZ3RoLG4uYXN5bmMmJm8uYXN5bmMpLGM9dShlLGEsbiksaShvLChmdW5jdGlvbih0LGUpe25bZV0mJnQobltlXSxjLG4pfSkpLHQuX19wcm9maWxlcl9fJiZ0Ll9fcHJvZmlsZXJfXyhjKSxjLnVwZGF0ZUVudigpLGMubWVtb2l6ZWQpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDMxKSxpPW4oNDcpLG89RnVuY3Rpb24ucHJvdG90eXBlLmJpbmQsdT1GdW5jdGlvbi5wcm90b3R5cGUuY2FsbCxzPU9iamVjdC5rZXlzLGE9T2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZnVuY3Rpb24obixjKXt2YXIgZixsPWFyZ3VtZW50c1syXSxwPWFyZ3VtZW50c1szXTtyZXR1cm4gbj1PYmplY3QoaShuKSkscihjKSxmPXMobikscCYmZi5zb3J0KCJmdW5jdGlvbiI9PXR5cGVvZiBwP28uY2FsbChwLG4pOnZvaWQgMCksImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PWZbdF0pLHUuY2FsbCh0LGYsKGZ1bmN0aW9uKHQscil7cmV0dXJuIGEuY2FsbChuLHQpP3UuY2FsbChjLGwsblt0XSx0LG4scik6ZX0pKX19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNTQyKSxpPW4oMjEwKSxvPW4oMzkpLHU9big1NTYpLm1ldGhvZHMscz1uKDU1NyksYT1uKDU3MyksYz1GdW5jdGlvbi5wcm90b3R5cGUuYXBwbHksZj1GdW5jdGlvbi5wcm90b3R5cGUuY2FsbCxsPU9iamVjdC5jcmVhdGUscD1PYmplY3QuZGVmaW5lUHJvcGVydGllcyxoPXUub24sZD11LmVtaXQ7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxuKXt2YXIgdSx5LHYsZyx3LE0sbSxfLEwsYix4LGosTixTLEQsST1sKG51bGwpO3JldHVybiB5PSExIT09ZT9lOmlzTmFOKHQubGVuZ3RoKT8xOnQubGVuZ3RoLG4ubm9ybWFsaXplciYmKGI9YShuLm5vcm1hbGl6ZXIpLHY9Yi5nZXQsZz1iLnNldCx3PWIuZGVsZXRlLE09Yi5jbGVhciksbnVsbCE9bi5yZXNvbHZlcnMmJihEPXMobi5yZXNvbHZlcnMpKSxTPXY/aSgoZnVuY3Rpb24oZSl7dmFyIG4saSxvPWFyZ3VtZW50cztpZihEJiYobz1EKG8pKSxudWxsIT09KG49dihvKSkmJmhhc093blByb3BlcnR5LmNhbGwoSSxuKSlyZXR1cm4geCYmdS5lbWl0KCJnZXQiLG4sbyx0aGlzKSxJW25dO2lmKGk9MT09PW8ubGVuZ3RoP2YuY2FsbCh0LHRoaXMsb1swXSk6Yy5jYWxsKHQsdGhpcyxvKSxudWxsPT09bil7aWYobnVsbCE9PShuPXYobykpKXRocm93IHIoIkNpcmN1bGFyIGludm9jYXRpb24iLCJDSVJDVUxBUl9JTlZPQ0FUSU9OIik7bj1nKG8pfWVsc2UgaWYoaGFzT3duUHJvcGVydHkuY2FsbChJLG4pKXRocm93IHIoIkNpcmN1bGFyIGludm9jYXRpb24iLCJDSVJDVUxBUl9JTlZPQ0FUSU9OIik7cmV0dXJuIElbbl09aSxqJiZ1LmVtaXQoInNldCIsbixudWxsLGkpLGl9KSx5KTowPT09ZT9mdW5jdGlvbigpe3ZhciBlO2lmKGhhc093blByb3BlcnR5LmNhbGwoSSwiZGF0YSIpKXJldHVybiB4JiZ1LmVtaXQoImdldCIsImRhdGEiLGFyZ3VtZW50cyx0aGlzKSxJLmRhdGE7aWYoZT1hcmd1bWVudHMubGVuZ3RoP2MuY2FsbCh0LHRoaXMsYXJndW1lbnRzKTpmLmNhbGwodCx0aGlzKSxoYXNPd25Qcm9wZXJ0eS5jYWxsKEksImRhdGEiKSl0aHJvdyByKCJDaXJjdWxhciBpbnZvY2F0aW9uIiwiQ0lSQ1VMQVJfSU5WT0NBVElPTiIpO3JldHVybiBJLmRhdGE9ZSxqJiZ1LmVtaXQoInNldCIsImRhdGEiLG51bGwsZSksZX06ZnVuY3Rpb24oZSl7dmFyIG4saSxvPWFyZ3VtZW50cztpZihEJiYobz1EKGFyZ3VtZW50cykpLGk9U3RyaW5nKG9bMF0pLGhhc093blByb3BlcnR5LmNhbGwoSSxpKSlyZXR1cm4geCYmdS5lbWl0KCJnZXQiLGksbyx0aGlzKSxJW2ldO2lmKG49MT09PW8ubGVuZ3RoP2YuY2FsbCh0LHRoaXMsb1swXSk6Yy5jYWxsKHQsdGhpcyxvKSxoYXNPd25Qcm9wZXJ0eS5jYWxsKEksaSkpdGhyb3cgcigiQ2lyY3VsYXIgaW52b2NhdGlvbiIsIkNJUkNVTEFSX0lOVk9DQVRJT04iKTtyZXR1cm4gSVtpXT1uLGomJnUuZW1pdCgic2V0IixpLG51bGwsbiksbn0sdT17b3JpZ2luYWw6dCxtZW1vaXplZDpTLHByb2ZpbGVOYW1lOm4ucHJvZmlsZU5hbWUsZ2V0OmZ1bmN0aW9uKHQpe3JldHVybiBEJiYodD1EKHQpKSx2P3YodCk6U3RyaW5nKHRbMF0pfSxoYXM6ZnVuY3Rpb24odCl7cmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwoSSx0KX0sZGVsZXRlOmZ1bmN0aW9uKHQpe3ZhciBlO2hhc093blByb3BlcnR5LmNhbGwoSSx0KSYmKHcmJncodCksZT1JW3RdLGRlbGV0ZSBJW3RdLE4mJnUuZW1pdCgiZGVsZXRlIix0LGUpKX0sY2xlYXI6ZnVuY3Rpb24oKXt2YXIgdD1JO00mJk0oKSxJPWwobnVsbCksdS5lbWl0KCJjbGVhciIsdCl9LG9uOmZ1bmN0aW9uKHQsZSl7cmV0dXJuImdldCI9PT10P3g9ITA6InNldCI9PT10P2o9ITA6ImRlbGV0ZSI9PT10JiYoTj0hMCksaC5jYWxsKHRoaXMsdCxlKX0sZW1pdDpkLHVwZGF0ZUVudjpmdW5jdGlvbigpe3Q9dS5vcmlnaW5hbH19LG09dj9pKChmdW5jdGlvbih0KXt2YXIgZSxuPWFyZ3VtZW50cztEJiYobj1EKG4pKSxudWxsIT09KGU9dihuKSkmJnUuZGVsZXRlKGUpfSkseSk6MD09PWU/ZnVuY3Rpb24oKXtyZXR1cm4gdS5kZWxldGUoImRhdGEiKX06ZnVuY3Rpb24odCl7cmV0dXJuIEQmJih0PUQoYXJndW1lbnRzKVswXSksdS5kZWxldGUodCl9LF89aSgoZnVuY3Rpb24oKXt2YXIgdCxuPWFyZ3VtZW50cztyZXR1cm4gMD09PWU/SS5kYXRhOihEJiYobj1EKG4pKSx0PXY/dihuKTpTdHJpbmcoblswXSksSVt0XSl9KSksTD1pKChmdW5jdGlvbigpe3ZhciB0LG49YXJndW1lbnRzO3JldHVybiAwPT09ZT91LmhhcygiZGF0YSIpOihEJiYobj1EKG4pKSxudWxsIT09KHQ9dj92KG4pOlN0cmluZyhuWzBdKSkmJnUuaGFzKHQpKX0pKSxwKFMse19fbWVtb2l6ZWRfXzpvKCEwKSxkZWxldGU6byhtKSxjbGVhcjpvKHUuY2xlYXIpLF9nZXQ6byhfKSxfaGFzOm8oTCl9KSx1fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDIwOSksaT1uKDU0OCksbz1uKDM2KSx1PUVycm9yLmNhcHR1cmVTdGFja1RyYWNlO3QuZXhwb3J0cz1mdW5jdGlvbihlKXt2YXIgbj1uZXcgRXJyb3IoZSkscz1hcmd1bWVudHNbMV0sYT1hcmd1bWVudHNbMl07cmV0dXJuIG8oYSl8fGkocykmJihhPXMscz1udWxsKSxvKGEpJiZyKG4sYSksbyhzKSYmKG4uY29kZT1zKSx1JiZ1KG4sdC5leHBvcnRzKSxufX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt2YXIgdCxlPU9iamVjdC5hc3NpZ247cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUmJihlKHQ9e2ZvbzoicmF6In0se2JhcjoiZHdhIn0se3Ryenk6InRyenkifSksdC5mb28rdC5iYXIrdC50cnp5PT09InJhemR3YXRyenkiKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big1NDUpLGk9big0Nyksbz1NYXRoLm1heDt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgbix1LHMsYT1vKGFyZ3VtZW50cy5sZW5ndGgsMik7Zm9yKHQ9T2JqZWN0KGkodCkpLHM9ZnVuY3Rpb24ocil7dHJ5e3Rbcl09ZVtyXX1jYXRjaCh0KXtufHwobj10KX19LHU9MTt1PGE7Kyt1KXIoZT1hcmd1bWVudHNbdV0pLmZvckVhY2gocyk7aWYodm9pZCAwIT09bil0aHJvdyBuO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9big1NDYpKCk/T2JqZWN0LmtleXM6big1NDcpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3QuZXhwb3J0cz1mdW5jdGlvbigpe3RyeXtyZXR1cm4gT2JqZWN0LmtleXMoInByaW1pdGl2ZSIpLCEwfWNhdGNoKHQpe3JldHVybiExfX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigzNiksaT1PYmplY3Qua2V5czt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGkocih0KT9PYmplY3QodCk6dCl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzYpLGk9e2Z1bmN0aW9uOiEwLG9iamVjdDohMH07dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiByKHQpJiZpW3R5cGVvZiB0XXx8ITF9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNTUwKSxpPS9eXHMqY2xhc3NbXHN7L31dLyxvPUZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZzt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuISFyKHQpJiYhaS50ZXN0KG8uY2FsbCh0KSl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oNTUxKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpcmV0dXJuITE7aWYoIWhhc093blByb3BlcnR5LmNhbGwodCwibGVuZ3RoIikpcmV0dXJuITE7dHJ5e2lmKCJudW1iZXIiIT10eXBlb2YgdC5sZW5ndGgpcmV0dXJuITE7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQuY2FsbClyZXR1cm4hMTtpZigiZnVuY3Rpb24iIT10eXBlb2YgdC5hcHBseSlyZXR1cm4hMX1jYXRjaCh0KXtyZXR1cm4hMX1yZXR1cm4hcih0KX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big1NTIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZighcih0KSlyZXR1cm4hMTt0cnl7cmV0dXJuISF0LmNvbnN0cnVjdG9yJiZ0LmNvbnN0cnVjdG9yLnByb3RvdHlwZT09PXR9Y2F0Y2godCl7cmV0dXJuITF9fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDIxMiksaT17b2JqZWN0OiEwLGZ1bmN0aW9uOiEwLHVuZGVmaW5lZDohMH07dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiEhcih0KSYmaGFzT3duUHJvcGVydHkuY2FsbChpLHR5cGVvZiB0KX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dC5leHBvcnRzPW4oNTU0KSgpP1N0cmluZy5wcm90b3R5cGUuY29udGFpbnM6big1NTUpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPSJyYXpkd2F0cnp5Ijt0LmV4cG9ydHM9ZnVuY3Rpb24oKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygci5jb250YWlucyYmKCEwPT09ci5jb250YWlucygiZHdhIikmJiExPT09ci5jb250YWlucygiZm9vIikpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1TdHJpbmcucHJvdG90eXBlLmluZGV4T2Y7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiByLmNhbGwodGhpcyx0LGFyZ3VtZW50c1sxXSk+LTF9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByLGksbyx1LHMsYSxjLGY9bigzOSksbD1uKDMxKSxwPUZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseSxoPUZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsLGQ9T2JqZWN0LmNyZWF0ZSx5PU9iamVjdC5kZWZpbmVQcm9wZXJ0eSx2PU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzLGc9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSx3PXtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx3cml0YWJsZTohMH07aT1mdW5jdGlvbih0LGUpe3ZhciBuLGk7cmV0dXJuIGwoZSksaT10aGlzLHIuY2FsbCh0aGlzLHQsbj1mdW5jdGlvbigpe28uY2FsbChpLHQsbikscC5jYWxsKGUsdGhpcyxhcmd1bWVudHMpfSksbi5fX2VlT25jZUxpc3RlbmVyX189ZSx0aGlzfSxzPXtvbjpyPWZ1bmN0aW9uKHQsZSl7dmFyIG47cmV0dXJuIGwoZSksZy5jYWxsKHRoaXMsIl9fZWVfXyIpP249dGhpcy5fX2VlX186KG49dy52YWx1ZT1kKG51bGwpLHkodGhpcywiX19lZV9fIix3KSx3LnZhbHVlPW51bGwpLG5bdF0/Im9iamVjdCI9PXR5cGVvZiBuW3RdP25bdF0ucHVzaChlKTpuW3RdPVtuW3RdLGVdOm5bdF09ZSx0aGlzfSxvbmNlOmksb2ZmOm89ZnVuY3Rpb24odCxlKXt2YXIgbixyLGksbztpZihsKGUpLCFnLmNhbGwodGhpcywiX19lZV9fIikpcmV0dXJuIHRoaXM7aWYoIShuPXRoaXMuX19lZV9fKVt0XSlyZXR1cm4gdGhpcztpZigib2JqZWN0Ij09dHlwZW9mKHI9blt0XSkpZm9yKG89MDtpPXJbb107KytvKWkhPT1lJiZpLl9fZWVPbmNlTGlzdGVuZXJfXyE9PWV8fCgyPT09ci5sZW5ndGg/blt0XT1yW28/MDoxXTpyLnNwbGljZShvLDEpKTtlbHNlIHIhPT1lJiZyLl9fZWVPbmNlTGlzdGVuZXJfXyE9PWV8fGRlbGV0ZSBuW3RdO3JldHVybiB0aGlzfSxlbWl0OnU9ZnVuY3Rpb24odCl7dmFyIGUsbixyLGksbztpZihnLmNhbGwodGhpcywiX19lZV9fIikmJihpPXRoaXMuX19lZV9fW3RdKSlpZigib2JqZWN0Ij09dHlwZW9mIGkpe2ZvcihuPWFyZ3VtZW50cy5sZW5ndGgsbz1uZXcgQXJyYXkobi0xKSxlPTE7ZTxuOysrZSlvW2UtMV09YXJndW1lbnRzW2VdO2ZvcihpPWkuc2xpY2UoKSxlPTA7cj1pW2VdOysrZSlwLmNhbGwocix0aGlzLG8pfWVsc2Ugc3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMTpoLmNhbGwoaSx0aGlzKTticmVhaztjYXNlIDI6aC5jYWxsKGksdGhpcyxhcmd1bWVudHNbMV0pO2JyZWFrO2Nhc2UgMzpoLmNhbGwoaSx0aGlzLGFyZ3VtZW50c1sxXSxhcmd1bWVudHNbMl0pO2JyZWFrO2RlZmF1bHQ6Zm9yKG49YXJndW1lbnRzLmxlbmd0aCxvPW5ldyBBcnJheShuLTEpLGU9MTtlPG47KytlKW9bZS0xXT1hcmd1bWVudHNbZV07cC5jYWxsKGksdGhpcyxvKX19fSxhPXtvbjpmKHIpLG9uY2U6ZihpKSxvZmY6ZihvKSxlbWl0OmYodSl9LGM9dih7fSxhKSx0LmV4cG9ydHM9ZT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9kKGMpOnYoT2JqZWN0KHQpLGEpfSxlLm1ldGhvZHM9c30sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcixpPW4oNTU4KSxvPW4oMzYpLHU9bigzMSkscz1BcnJheS5wcm90b3R5cGUuc2xpY2U7cj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5tYXAoKGZ1bmN0aW9uKGUsbil7cmV0dXJuIGU/ZSh0W25dKTp0W25dfSkpLmNvbmNhdChzLmNhbGwodCx0aGlzLmxlbmd0aCkpfSx0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuKHQ9aSh0KSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7byh0KSYmdSh0KX0pKSxyLmJpbmQodCl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTM4KSxpPUFycmF5LmlzQXJyYXk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpKHQpP3Q6cih0KX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dC5leHBvcnRzPWZ1bmN0aW9uKCl7dmFyIHQsZSxuPUFycmF5LmZyb207cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG4mJihlPW4odD1bInJheiIsImR3YSJdKSxCb29sZWFuKGUmJmUhPT10JiYiZHdhIj09PWVbMV0pKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big1NjEpLml0ZXJhdG9yLGk9big1NzApLG89big1NzEpLHU9bigzNykscz1uKDMxKSxhPW4oNDcpLGM9bigzNiksZj1uKDU3MiksbD1BcnJheS5pc0FycmF5LHA9RnVuY3Rpb24ucHJvdG90eXBlLmNhbGwsaD17Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bnVsbH0sZD1PYmplY3QuZGVmaW5lUHJvcGVydHk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlLG4seSx2LGcsdyxNLG0sXyxMLGI9YXJndW1lbnRzWzFdLHg9YXJndW1lbnRzWzJdO2lmKHQ9T2JqZWN0KGEodCkpLGMoYikmJnMoYiksdGhpcyYmdGhpcyE9PUFycmF5JiZvKHRoaXMpKWU9dGhpcztlbHNle2lmKCFiKXtpZihpKHQpKXJldHVybiAxIT09KGc9dC5sZW5ndGgpP0FycmF5LmFwcGx5KG51bGwsdCk6KCh2PW5ldyBBcnJheSgxKSlbMF09dFswXSx2KTtpZihsKHQpKXtmb3Iodj1uZXcgQXJyYXkoZz10Lmxlbmd0aCksbj0wO248ZzsrK24pdltuXT10W25dO3JldHVybiB2fX12PVtdfWlmKCFsKHQpKWlmKHZvaWQgMCE9PShfPXRbcl0pKXtmb3IoTT1zKF8pLmNhbGwodCksZSYmKHY9bmV3IGUpLG09TS5uZXh0KCksbj0wOyFtLmRvbmU7KUw9Yj9wLmNhbGwoYix4LG0udmFsdWUsbik6bS52YWx1ZSxlPyhoLnZhbHVlPUwsZCh2LG4saCkpOnZbbl09TCxtPU0ubmV4dCgpLCsrbjtnPW59ZWxzZSBpZihmKHQpKXtmb3IoZz10Lmxlbmd0aCxlJiYodj1uZXcgZSksbj0wLHk9MDtuPGc7KytuKUw9dFtuXSxuKzE8ZyYmKHc9TC5jaGFyQ29kZUF0KDApKT49NTUyOTYmJnc8PTU2MzE5JiYoTCs9dFsrK25dKSxMPWI/cC5jYWxsKGIseCxMLHkpOkwsZT8oaC52YWx1ZT1MLGQodix5LGgpKTp2W3ldPUwsKyt5O2c9eX1pZih2b2lkIDA9PT1nKWZvcihnPXUodC5sZW5ndGgpLGUmJih2PW5ldyBlKGcpKSxuPTA7bjxnOysrbilMPWI/cC5jYWxsKGIseCx0W25dLG4pOnRbbl0sZT8oaC52YWx1ZT1MLGQodixuLGgpKTp2W25dPUw7cmV0dXJuIGUmJihoLnZhbHVlPW51bGwsdi5sZW5ndGg9Zyksdn19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dC5leHBvcnRzPW4oNTYyKSgpP24oOTcpLlN5bWJvbDpuKDU2NSl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9big5NyksaT17b2JqZWN0OiEwLHN5bWJvbDohMH07dC5leHBvcnRzPWZ1bmN0aW9uKCl7dmFyIHQsZT1yLlN5bWJvbDtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSlyZXR1cm4hMTt0PWUoInRlc3Qgc3ltYm9sIik7dHJ5e1N0cmluZyh0KX1jYXRjaCh0KXtyZXR1cm4hMX1yZXR1cm4hIWlbdHlwZW9mIGUuaXRlcmF0b3JdJiYoISFpW3R5cGVvZiBlLnRvUHJpbWl0aXZlXSYmISFpW3R5cGVvZiBlLnRvU3RyaW5nVGFnXSl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3QuZXhwb3J0cz1mdW5jdGlvbigpe3JldHVybiJvYmplY3QiPT10eXBlb2YgZ2xvYmFsVGhpcyYmKCEhZ2xvYmFsVGhpcyYmZ2xvYmFsVGhpcy5BcnJheT09PUFycmF5KX19LGZ1bmN0aW9uKHQsZSl7dmFyIG49ZnVuY3Rpb24oKXtpZigib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYpcmV0dXJuIHNlbGY7aWYoIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdylyZXR1cm4gd2luZG93O3Rocm93IG5ldyBFcnJvcigiVW5hYmxlIHRvIHJlc29sdmUgZ2xvYmFsIGB0aGlzYCIpfTt0LmV4cG9ydHM9ZnVuY3Rpb24oKXtpZih0aGlzKXJldHVybiB0aGlzO3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JqZWN0LnByb3RvdHlwZSwiX19nbG9iYWxfXyIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzfSxjb25maWd1cmFibGU6ITB9KX1jYXRjaCh0KXtyZXR1cm4gbigpfXRyeXtyZXR1cm4gX19nbG9iYWxfX3x8bigpfWZpbmFsbHl7ZGVsZXRlIE9iamVjdC5wcm90b3R5cGUuX19nbG9iYWxfX319KCl9LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHIsaSxvLHU9bigzOSkscz1uKDIxMyksYT1uKDk3KS5TeW1ib2wsYz1uKDU2NyksZj1uKDU2OCksbD1uKDU2OSkscD1PYmplY3QuY3JlYXRlLGg9T2JqZWN0LmRlZmluZVByb3BlcnRpZXMsZD1PYmplY3QuZGVmaW5lUHJvcGVydHk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGEpdHJ5e1N0cmluZyhhKCkpLG89ITB9Y2F0Y2godCl7fWVsc2UgYT1udWxsO2k9ZnVuY3Rpb24odCl7aWYodGhpcyBpbnN0YW5jZW9mIGkpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yIik7cmV0dXJuIHIodCl9LHQuZXhwb3J0cz1yPWZ1bmN0aW9uIHQoZSl7dmFyIG47aWYodGhpcyBpbnN0YW5jZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3ltYm9sIGlzIG5vdCBhIGNvbnN0cnVjdG9yIik7cmV0dXJuIG8/YShlKToobj1wKGkucHJvdG90eXBlKSxlPXZvaWQgMD09PWU/IiI6U3RyaW5nKGUpLGgobix7X19kZXNjcmlwdGlvbl9fOnUoIiIsZSksX19uYW1lX186dSgiIixjKGUpKX0pKX0sZihyKSxsKHIpLGgoaS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnUociksdG9TdHJpbmc6dSgiIiwoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX25hbWVfX30pKX0pLGgoci5wcm90b3R5cGUse3RvU3RyaW5nOnUoKGZ1bmN0aW9uKCl7cmV0dXJuIlN5bWJvbCAoIitzKHRoaXMpLl9fZGVzY3JpcHRpb25fXysiKSJ9KSksdmFsdWVPZjp1KChmdW5jdGlvbigpe3JldHVybiBzKHRoaXMpfSkpfSksZChyLnByb3RvdHlwZSxyLnRvUHJpbWl0aXZlLHUoIiIsKGZ1bmN0aW9uKCl7dmFyIHQ9cyh0aGlzKTtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHQ/dDp0LnRvU3RyaW5nKCl9KSkpLGQoci5wcm90b3R5cGUsci50b1N0cmluZ1RhZyx1KCJjIiwiU3ltYm9sIikpLGQoaS5wcm90b3R5cGUsci50b1N0cmluZ1RhZyx1KCJjIixyLnByb3RvdHlwZVtyLnRvU3RyaW5nVGFnXSkpLGQoaS5wcm90b3R5cGUsci50b1ByaW1pdGl2ZSx1KCJjIixyLnByb3RvdHlwZVtyLnRvUHJpbWl0aXZlXSkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4hIXQmJigic3ltYm9sIj09dHlwZW9mIHR8fCEhdC5jb25zdHJ1Y3RvciYmKCJTeW1ib2wiPT09dC5jb25zdHJ1Y3Rvci5uYW1lJiYiU3ltYm9sIj09PXRbdC5jb25zdHJ1Y3Rvci50b1N0cmluZ1RhZ10pKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigzOSksaT1PYmplY3QuY3JlYXRlLG89T2JqZWN0LmRlZmluZVByb3BlcnR5LHU9T2JqZWN0LnByb3RvdHlwZSxzPWkobnVsbCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuLGk9MDtzW3QrKGl8fCIiKV07KSsraTtyZXR1cm4gc1t0Kz1pfHwiIl09ITAsbyh1LGU9IkBAIit0LHIuZ3MobnVsbCwoZnVuY3Rpb24odCl7bnx8KG49ITAsbyh0aGlzLGUscih0KSksbj0hMSl9KSkpLGV9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzkpLGk9big5NykuU3ltYm9sO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModCx7aGFzSW5zdGFuY2U6cigiIixpJiZpLmhhc0luc3RhbmNlfHx0KCJoYXNJbnN0YW5jZSIpKSxpc0NvbmNhdFNwcmVhZGFibGU6cigiIixpJiZpLmlzQ29uY2F0U3ByZWFkYWJsZXx8dCgiaXNDb25jYXRTcHJlYWRhYmxlIikpLGl0ZXJhdG9yOnIoIiIsaSYmaS5pdGVyYXRvcnx8dCgiaXRlcmF0b3IiKSksbWF0Y2g6cigiIixpJiZpLm1hdGNofHx0KCJtYXRjaCIpKSxyZXBsYWNlOnIoIiIsaSYmaS5yZXBsYWNlfHx0KCJyZXBsYWNlIikpLHNlYXJjaDpyKCIiLGkmJmkuc2VhcmNofHx0KCJzZWFyY2giKSksc3BlY2llczpyKCIiLGkmJmkuc3BlY2llc3x8dCgic3BlY2llcyIpKSxzcGxpdDpyKCIiLGkmJmkuc3BsaXR8fHQoInNwbGl0IikpLHRvUHJpbWl0aXZlOnIoIiIsaSYmaS50b1ByaW1pdGl2ZXx8dCgidG9QcmltaXRpdmUiKSksdG9TdHJpbmdUYWc6cigiIixpJiZpLnRvU3RyaW5nVGFnfHx0KCJ0b1N0cmluZ1RhZyIpKSx1bnNjb3BhYmxlczpyKCIiLGkmJmkudW5zY29wYWJsZXN8fHQoInVuc2NvcGFibGVzIikpfSl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzkpLGk9bigyMTMpLG89T2JqZWN0LmNyZWF0ZShudWxsKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHQse2ZvcjpyKChmdW5jdGlvbihlKXtyZXR1cm4gb1tlXT9vW2VdOm9bZV09dChTdHJpbmcoZSkpfSkpLGtleUZvcjpyKChmdW5jdGlvbih0KXt2YXIgZTtmb3IoZSBpbiBpKHQpLG8paWYob1tlXT09PXQpcmV0dXJuIGV9KSl9KX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxpPXIuY2FsbChmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KCkpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gci5jYWxsKHQpPT09aX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxpPVJlZ0V4cC5wcm90b3R5cGUudGVzdC5iaW5kKC9eW29iamVjdCBbQS1aYS16MC05XSpGdW5jdGlvbl0kLyk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0JiZpKHIuY2FsbCh0KSl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsaT1yLmNhbGwoIiIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHR8fHQmJiJvYmplY3QiPT10eXBlb2YgdCYmKHQgaW5zdGFuY2VvZiBTdHJpbmd8fHIuY2FsbCh0KT09PWkpfHwhMX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigzMSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3tzZXQ6dCxnZXQ6dH06KGU9e2dldDpyKHQuZ2V0KX0sdm9pZCAwIT09dC5zZXQ/KGUuc2V0PXIodC5zZXQpLHQuZGVsZXRlJiYoZS5kZWxldGU9cih0LmRlbGV0ZSkpLHQuY2xlYXImJihlLmNsZWFyPXIodC5jbGVhcikpLGUpOihlLnNldD1lLmdldCxlKSl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZSxuLHI9dC5sZW5ndGg7aWYoIXIpcmV0dXJuIgIiO2ZvcihlPVN0cmluZyh0W249MF0pOy0tcjspZSs9IgEiK3RbKytuXTtyZXR1cm4gZX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0P2Z1bmN0aW9uKGUpe2Zvcih2YXIgbj1TdHJpbmcoZVswXSkscj0wLGk9dDstLWk7KW4rPSIBIitlWysrcl07cmV0dXJuIG59OmZ1bmN0aW9uKCl7cmV0dXJuIiJ9fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDEzOSksaT1PYmplY3QuY3JlYXRlO3QuZXhwb3J0cz1mdW5jdGlvbigpe3ZhciB0PTAsZT1bXSxuPWkobnVsbCk7cmV0dXJue2dldDpmdW5jdGlvbih0KXt2YXIgbixpPTAsbz1lLHU9dC5sZW5ndGg7aWYoMD09PXUpcmV0dXJuIG9bdV18fG51bGw7aWYobz1vW3VdKXtmb3IoO2k8dS0xOyl7aWYoLTE9PT0obj1yLmNhbGwob1swXSx0W2ldKSkpcmV0dXJuIG51bGw7bz1vWzFdW25dLCsraX1yZXR1cm4tMT09PShuPXIuY2FsbChvWzBdLHRbaV0pKT9udWxsOm9bMV1bbl18fG51bGx9cmV0dXJuIG51bGx9LHNldDpmdW5jdGlvbihpKXt2YXIgbyx1PTAscz1lLGE9aS5sZW5ndGg7aWYoMD09PWEpc1thXT0rK3Q7ZWxzZXtmb3Ioc1thXXx8KHNbYV09W1tdLFtdXSkscz1zW2FdO3U8YS0xOyktMT09PShvPXIuY2FsbChzWzBdLGlbdV0pKSYmKG89c1swXS5wdXNoKGlbdV0pLTEsc1sxXS5wdXNoKFtbXSxbXV0pKSxzPXNbMV1bb10sKyt1Oy0xPT09KG89ci5jYWxsKHNbMF0saVt1XSkpJiYobz1zWzBdLnB1c2goaVt1XSktMSksc1sxXVtvXT0rK3R9cmV0dXJuIG5bdF09aSx0fSxkZWxldGU6ZnVuY3Rpb24odCl7dmFyIGksbz0wLHU9ZSxzPW5bdF0sYT1zLmxlbmd0aCxjPVtdO2lmKDA9PT1hKWRlbGV0ZSB1W2FdO2Vsc2UgaWYodT11W2FdKXtmb3IoO288YS0xOyl7aWYoLTE9PT0oaT1yLmNhbGwodVswXSxzW29dKSkpcmV0dXJuO2MucHVzaCh1LGkpLHU9dVsxXVtpXSwrK299aWYoLTE9PT0oaT1yLmNhbGwodVswXSxzW29dKSkpcmV0dXJuO2Zvcih0PXVbMV1baV0sdVswXS5zcGxpY2UoaSwxKSx1WzFdLnNwbGljZShpLDEpOyF1WzBdLmxlbmd0aCYmYy5sZW5ndGg7KWk9Yy5wb3AoKSwodT1jLnBvcCgpKVswXS5zcGxpY2UoaSwxKSx1WzFdLnNwbGljZShpLDEpfWRlbGV0ZSBuW3RdfSxjbGVhcjpmdW5jdGlvbigpe2U9W10sbj1pKG51bGwpfX19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3QuZXhwb3J0cz1uKDU3OCkoKT9OdW1iZXIuaXNOYU46big1NzkpfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3QuZXhwb3J0cz1mdW5jdGlvbigpe3ZhciB0PU51bWJlci5pc05hTjtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdCYmKCF0KHt9KSYmdChOYU4pJiYhdCgzNCkpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQhPXR9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTM5KTt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt2YXIgdD0wLGU9W10sbj1bXTtyZXR1cm57Z2V0OmZ1bmN0aW9uKHQpe3ZhciBpPXIuY2FsbChlLHRbMF0pO3JldHVybi0xPT09aT9udWxsOm5baV19LHNldDpmdW5jdGlvbihyKXtyZXR1cm4gZS5wdXNoKHJbMF0pLG4ucHVzaCgrK3QpLHR9LGRlbGV0ZTpmdW5jdGlvbih0KXt2YXIgaT1yLmNhbGwobix0KTstMSE9PWkmJihlLnNwbGljZShpLDEpLG4uc3BsaWNlKGksMSkpfSxjbGVhcjpmdW5jdGlvbigpe2U9W10sbj1bXX19fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDEzOSksaT1PYmplY3QuY3JlYXRlO3QuZXhwb3J0cz1mdW5jdGlvbih0KXt2YXIgZT0wLG49W1tdLFtdXSxvPWkobnVsbCk7cmV0dXJue2dldDpmdW5jdGlvbihlKXtmb3IodmFyIGksbz0wLHU9bjtvPHQtMTspe2lmKC0xPT09KGk9ci5jYWxsKHVbMF0sZVtvXSkpKXJldHVybiBudWxsO3U9dVsxXVtpXSwrK299cmV0dXJuLTE9PT0oaT1yLmNhbGwodVswXSxlW29dKSk/bnVsbDp1WzFdW2ldfHxudWxsfSxzZXQ6ZnVuY3Rpb24oaSl7Zm9yKHZhciB1LHM9MCxhPW47czx0LTE7KS0xPT09KHU9ci5jYWxsKGFbMF0saVtzXSkpJiYodT1hWzBdLnB1c2goaVtzXSktMSxhWzFdLnB1c2goW1tdLFtdXSkpLGE9YVsxXVt1XSwrK3M7cmV0dXJuLTE9PT0odT1yLmNhbGwoYVswXSxpW3NdKSkmJih1PWFbMF0ucHVzaChpW3NdKS0xKSxhWzFdW3VdPSsrZSxvW2VdPWksZX0sZGVsZXRlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgaSx1PTAscz1uLGE9W10sYz1vW2VdO3U8dC0xOyl7aWYoLTE9PT0oaT1yLmNhbGwoc1swXSxjW3VdKSkpcmV0dXJuO2EucHVzaChzLGkpLHM9c1sxXVtpXSwrK3V9aWYoLTEhPT0oaT1yLmNhbGwoc1swXSxjW3VdKSkpe2ZvcihlPXNbMV1baV0sc1swXS5zcGxpY2UoaSwxKSxzWzFdLnNwbGljZShpLDEpOyFzWzBdLmxlbmd0aCYmYS5sZW5ndGg7KWk9YS5wb3AoKSwocz1hLnBvcCgpKVswXS5zcGxpY2UoaSwxKSxzWzFdLnNwbGljZShpLDEpO2RlbGV0ZSBvW2VdfX0sY2xlYXI6ZnVuY3Rpb24oKXtuPVtbXSxbXV0sbz1pKG51bGwpfX19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMTM4KSxpPW4oMjE0KSxvPW4oMjExKSx1PW4oMjEwKSxzPW4oMTQwKSxhPUFycmF5LnByb3RvdHlwZS5zbGljZSxjPUZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseSxmPU9iamVjdC5jcmVhdGU7bigzOCkuYXN5bmM9ZnVuY3Rpb24odCxlKXt2YXIgbixsLHAsaD1mKG51bGwpLGQ9ZihudWxsKSx5PWUubWVtb2l6ZWQsdj1lLm9yaWdpbmFsO2UubWVtb2l6ZWQ9dSgoZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLHI9ZVtlLmxlbmd0aC0xXTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgciYmKG49cixlPWEuY2FsbChlLDAsLTEpKSx5LmFwcGx5KGw9dGhpcyxwPWUpfSkseSk7dHJ5e28oZS5tZW1vaXplZCx5KX1jYXRjaCh0KXt9ZS5vbigiZ2V0IiwoZnVuY3Rpb24odCl7dmFyIHIsaSxvO2lmKG4pe2lmKGhbdF0pcmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGhbdF0/aFt0XT1baFt0XSxuXTpoW3RdLnB1c2gobiksdm9pZChuPW51bGwpO3I9bixpPWwsbz1wLG49bD1wPW51bGwscygoZnVuY3Rpb24oKXt2YXIgdTtoYXNPd25Qcm9wZXJ0eS5jYWxsKGQsdCk/KHU9ZFt0XSxlLmVtaXQoImdldGFzeW5jIix0LG8saSksYy5jYWxsKHIsdS5jb250ZXh0LHUuYXJncykpOihuPXIsbD1pLHA9byx5LmFwcGx5KGksbykpfSkpfX0pKSxlLm9yaWdpbmFsPWZ1bmN0aW9uKCl7dmFyIHQsaSxvLHU7cmV0dXJuIG4/KHQ9cihhcmd1bWVudHMpLGk9ZnVuY3Rpb24gdChuKXt2YXIgaSxvLGE9dC5pZDtpZihudWxsIT1hKXtpZihkZWxldGUgdC5pZCxpPWhbYV0sZGVsZXRlIGhbYV0saSlyZXR1cm4gbz1yKGFyZ3VtZW50cyksZS5oYXMoYSkmJihuP2UuZGVsZXRlKGEpOihkW2FdPXtjb250ZXh0OnRoaXMsYXJnczpvfSxlLmVtaXQoInNldGFzeW5jIixhLCJmdW5jdGlvbiI9PXR5cGVvZiBpPzE6aS5sZW5ndGgpKSksImZ1bmN0aW9uIj09dHlwZW9mIGk/dT1jLmNhbGwoaSx0aGlzLG8pOmkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dT1jLmNhbGwodCx0aGlzLG8pfSksdGhpcyksdX1lbHNlIHMoYy5iaW5kKHQsdGhpcyxhcmd1bWVudHMpKX0sbz1uLG49bD1wPW51bGwsdC5wdXNoKGkpLHU9Yy5jYWxsKHYsdGhpcyx0KSxpLmNiPW8sbj1pLHUpOmMuY2FsbCh2LHRoaXMsYXJndW1lbnRzKX0sZS5vbigic2V0IiwoZnVuY3Rpb24odCl7bj8oaFt0XT8iZnVuY3Rpb24iPT10eXBlb2YgaFt0XT9oW3RdPVtoW3RdLG4uY2JdOmhbdF0ucHVzaChuLmNiKTpoW3RdPW4uY2IsZGVsZXRlIG4uY2Isbi5pZD10LG49bnVsbCk6ZS5kZWxldGUodCl9KSksZS5vbigiZGVsZXRlIiwoZnVuY3Rpb24odCl7dmFyIG47aGFzT3duUHJvcGVydHkuY2FsbChoLHQpfHxkW3RdJiYobj1kW3RdLGRlbGV0ZSBkW3RdLGUuZW1pdCgiZGVsZXRlYXN5bmMiLHQsYS5jYWxsKG4uYXJncywxKSkpfSkpLGUub24oImNsZWFyIiwoZnVuY3Rpb24oKXt2YXIgdD1kO2Q9ZihudWxsKSxlLmVtaXQoImNsZWFyYXN5bmMiLGkodCwoZnVuY3Rpb24odCl7cmV0dXJuIGEuY2FsbCh0LmFyZ3MsMSl9KSkpfSkpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDIxNCksaT1uKDU4NCksbz1uKDU4NSksdT1uKDU4Nykscz1uKDIxNiksYT1uKDE0MCksYz1PYmplY3QuY3JlYXRlLGY9aSgidGhlbiIsInRoZW46ZmluYWxseSIsImRvbmUiLCJkb25lOmZpbmFsbHkiKTtuKDM4KS5wcm9taXNlPWZ1bmN0aW9uKHQsZSl7dmFyIG49YyhudWxsKSxpPWMobnVsbCksbD1jKG51bGwpO2lmKCEwPT09dCl0PW51bGw7ZWxzZSBpZih0PW8odCksIWZbdF0pdGhyb3cgbmV3IFR5cGVFcnJvcigiJyIrdSh0KSsiJyBpcyBub3QgdmFsaWQgcHJvbWlzZSBtb2RlIik7ZS5vbigic2V0IiwoZnVuY3Rpb24ocixvLHUpe3ZhciBjPSExO2lmKCFzKHUpKXJldHVybiBpW3JdPXUsdm9pZCBlLmVtaXQoInNldGFzeW5jIixyLDEpO25bcl09MSxsW3JdPXU7dmFyIGY9ZnVuY3Rpb24odCl7dmFyIG89bltyXTtpZihjKXRocm93IG5ldyBFcnJvcigiTWVtb2l6ZWUgZXJyb3I6IERldGVjdGVkIHVub3JkZXJlZCB0aGVufGRvbmUgJiBmaW5hbGx5IHJlc29sdXRpb24sIHdoaWNoIGluIHR1cm4gbWFrZXMgcHJvcGVyIGRldGVjdGlvbiBvZiBzdWNjZXNzL2ZhaWx1cmUgaW1wb3NzaWJsZSAod2hlbiBpbiAnZG9uZTpmaW5hbGx5JyBtb2RlKVxuQ29uc2lkZXIgdG8gcmVseSBvbiAndGhlbicgb3IgJ2RvbmUnIG1vZGUgaW5zdGVhZC4iKTtvJiYoZGVsZXRlIG5bcl0saVtyXT10LGUuZW1pdCgic2V0YXN5bmMiLHIsbykpfSxwPWZ1bmN0aW9uKCl7Yz0hMCxuW3JdJiYoZGVsZXRlIG5bcl0sZGVsZXRlIGxbcl0sZS5kZWxldGUocikpfSxoPXQ7aWYoaHx8KGg9InRoZW4iKSwidGhlbiI9PT1oKXt2YXIgZD1mdW5jdGlvbigpe2EocCl9OyJmdW5jdGlvbiI9PXR5cGVvZih1PXUudGhlbigoZnVuY3Rpb24odCl7YShmLmJpbmQodGhpcyx0KSl9KSxkKSkuZmluYWxseSYmdS5maW5hbGx5KGQpfWVsc2UgaWYoImRvbmUiPT09aCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHUuZG9uZSl0aHJvdyBuZXcgRXJyb3IoIk1lbW9pemVlIGVycm9yOiBSZXRyaWV2ZWQgcHJvbWlzZSBkb2VzIG5vdCBpbXBsZW1lbnQgJ2RvbmUnIGluICdkb25lJyBtb2RlIik7dS5kb25lKGYscCl9ZWxzZSBpZigiZG9uZTpmaW5hbGx5Ij09PWgpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB1LmRvbmUpdGhyb3cgbmV3IEVycm9yKCJNZW1vaXplZSBlcnJvcjogUmV0cmlldmVkIHByb21pc2UgZG9lcyBub3QgaW1wbGVtZW50ICdkb25lJyBpbiAnZG9uZTpmaW5hbGx5JyBtb2RlIik7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHUuZmluYWxseSl0aHJvdyBuZXcgRXJyb3IoIk1lbW9pemVlIGVycm9yOiBSZXRyaWV2ZWQgcHJvbWlzZSBkb2VzIG5vdCBpbXBsZW1lbnQgJ2ZpbmFsbHknIGluICdkb25lOmZpbmFsbHknIG1vZGUiKTt1LmRvbmUoZiksdS5maW5hbGx5KHApfX0pKSxlLm9uKCJnZXQiLChmdW5jdGlvbih0LHIsaSl7dmFyIG87aWYoblt0XSkrK25bdF07ZWxzZXtvPWxbdF07dmFyIHU9ZnVuY3Rpb24oKXtlLmVtaXQoImdldGFzeW5jIix0LHIsaSl9O3Mobyk/ImZ1bmN0aW9uIj09dHlwZW9mIG8uZG9uZT9vLmRvbmUodSk6by50aGVuKChmdW5jdGlvbigpe2EodSl9KSk6dSgpfX0pKSxlLm9uKCJkZWxldGUiLChmdW5jdGlvbih0KXtpZihkZWxldGUgbFt0XSxuW3RdKWRlbGV0ZSBuW3RdO2Vsc2UgaWYoaGFzT3duUHJvcGVydHkuY2FsbChpLHQpKXt2YXIgcj1pW3RdO2RlbGV0ZSBpW3RdLGUuZW1pdCgiZGVsZXRlYXN5bmMiLHQsW3JdKX19KSksZS5vbigiY2xlYXIiLChmdW5jdGlvbigpe3ZhciB0PWk7aT1jKG51bGwpLG49YyhudWxsKSxsPWMobnVsbCksZS5lbWl0KCJjbGVhcmFzeW5jIixyKHQsKGZ1bmN0aW9uKHQpe3JldHVyblt0XX0pKSl9KSl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPUFycmF5LnByb3RvdHlwZS5mb3JFYWNoLGk9T2JqZWN0LmNyZWF0ZTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGU9aShudWxsKTtyZXR1cm4gci5jYWxsKGFyZ3VtZW50cywoZnVuY3Rpb24odCl7ZVt0XT0hMH0pKSxlfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDQ3KSxpPW4oNTg2KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGkocih0KSl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMjE1KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiB0JiZyKHQudG9TdHJpbmcpP3QudG9TdHJpbmcoKTpTdHJpbmcodCl9Y2F0Y2godCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiUGFzc2VkIGFyZ3VtZW50IGNhbm5vdCBiZSBzdHJpbmdpZmVkIil9fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDU4OCksaT0vW1xuXHJcdTIwMjhcdTIwMjldL2c7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXIodCk7cmV0dXJuIGUubGVuZ3RoPjEwMCYmKGU9ZS5zbGljZSgwLDk5KSsi4oCmIiksZT1lLnJlcGxhY2UoaSwoZnVuY3Rpb24odCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHQpLnNsaWNlKDEsLTEpfSkpfX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDIxNSk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gdCYmcih0LnRvU3RyaW5nKT90LnRvU3RyaW5nKCk6U3RyaW5nKHQpfWNhdGNoKHQpe3JldHVybiI8Tm9uLWNvZXJjaWJsZSB0byBzdHJpbmcgdmFsdWU+In19fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzEpLGk9big5Niksbz1uKDM4KSx1PUZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtvLmRpc3Bvc2U9ZnVuY3Rpb24odCxlLG4pe3ZhciBzO2lmKHIodCksbi5hc3luYyYmby5hc3luY3x8bi5wcm9taXNlJiZvLnByb21pc2UpcmV0dXJuIGUub24oImRlbGV0ZWFzeW5jIixzPWZ1bmN0aW9uKGUsbil7dS5jYWxsKHQsbnVsbCxuKX0pLHZvaWQgZS5vbigiY2xlYXJhc3luYyIsKGZ1bmN0aW9uKHQpe2kodCwoZnVuY3Rpb24odCxlKXtzKGUsdCl9KSl9KSk7ZS5vbigiZGVsZXRlIixzPWZ1bmN0aW9uKGUsbil7dChuKX0pLGUub24oImNsZWFyIiwoZnVuY3Rpb24odCl7aSh0LChmdW5jdGlvbih0LGUpe3MoZSx0KX0pKX0pKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigxMzgpLGk9big5Niksbz1uKDE0MCksdT1uKDIxNikscz1uKDU5MSksYT1uKDM4KSxjPUZ1bmN0aW9uLnByb3RvdHlwZSxmPU1hdGgubWF4LGw9TWF0aC5taW4scD1PYmplY3QuY3JlYXRlO2EubWF4QWdlPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaCxkLHksdjsodD1zKHQpKSYmKGg9cChudWxsKSxkPW4uYXN5bmMmJmEuYXN5bmN8fG4ucHJvbWlzZSYmYS5wcm9taXNlPyJhc3luYyI6IiIsZS5vbigic2V0IitkLChmdW5jdGlvbihuKXtoW25dPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZS5kZWxldGUobil9KSx0KSwiZnVuY3Rpb24iPT10eXBlb2YgaFtuXS51bnJlZiYmaFtuXS51bnJlZigpLHYmJih2W25dJiYibmV4dFRpY2siIT09dltuXSYmY2xlYXJUaW1lb3V0KHZbbl0pLHZbbl09c2V0VGltZW91dCgoZnVuY3Rpb24oKXtkZWxldGUgdltuXX0pLHkpLCJmdW5jdGlvbiI9PXR5cGVvZiB2W25dLnVucmVmJiZ2W25dLnVucmVmKCkpfSkpLGUub24oImRlbGV0ZSIrZCwoZnVuY3Rpb24odCl7Y2xlYXJUaW1lb3V0KGhbdF0pLGRlbGV0ZSBoW3RdLHYmJigibmV4dFRpY2siIT09dlt0XSYmY2xlYXJUaW1lb3V0KHZbdF0pLGRlbGV0ZSB2W3RdKX0pKSxuLnByZUZldGNoJiYoeT0hMD09PW4ucHJlRmV0Y2h8fGlzTmFOKG4ucHJlRmV0Y2gpPy4zMzM6ZihsKE51bWJlcihuLnByZUZldGNoKSwxKSwwKSkmJih2PXt9LHk9KDEteSkqdCxlLm9uKCJnZXQiK2QsKGZ1bmN0aW9uKHQsaSxzKXt2W3RdfHwodlt0XT0ibmV4dFRpY2siLG8oKGZ1bmN0aW9uKCl7dmFyIG87Im5leHRUaWNrIj09PXZbdF0mJihkZWxldGUgdlt0XSxlLmRlbGV0ZSh0KSxuLmFzeW5jJiYoaT1yKGkpKS5wdXNoKGMpLG89ZS5tZW1vaXplZC5hcHBseShzLGkpLG4ucHJvbWlzZSYmdShvKSYmKCJmdW5jdGlvbiI9PXR5cGVvZiBvLmRvbmU/by5kb25lKGMsYyk6by50aGVuKGMsYykpKX0pKSl9KSkpLGUub24oImNsZWFyIitkLChmdW5jdGlvbigpe2koaCwoZnVuY3Rpb24odCl7Y2xlYXJUaW1lb3V0KHQpfSkpLGg9e30sdiYmKGkodiwoZnVuY3Rpb24odCl7Im5leHRUaWNrIiE9PXQmJmNsZWFyVGltZW91dCh0KX0pKSx2PXt9KX0pKSl9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzcpLGk9big1OTIpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtpZigodD1yKHQpKT5pKXRocm93IG5ldyBUeXBlRXJyb3IodCsiIGV4Y2VlZHMgbWF4aW11bSBwb3NzaWJsZSB0aW1lb3V0Iik7cmV0dXJuIHR9fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3QuZXhwb3J0cz0yMTQ3NDgzNjQ3fSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzcpLGk9big1OTQpLG89bigzOCk7by5tYXg9ZnVuY3Rpb24odCxlLG4pe3ZhciB1LHMsYTsodD1yKHQpKSYmKHM9aSh0KSx1PW4uYXN5bmMmJm8uYXN5bmN8fG4ucHJvbWlzZSYmby5wcm9taXNlPyJhc3luYyI6IiIsZS5vbigic2V0Iit1LGE9ZnVuY3Rpb24odCl7dm9pZCAwIT09KHQ9cy5oaXQodCkpJiZlLmRlbGV0ZSh0KX0pLGUub24oImdldCIrdSxhKSxlLm9uKCJkZWxldGUiK3Uscy5kZWxldGUpLGUub24oImNsZWFyIit1LHMuY2xlYXIpKX19LGZ1bmN0aW9uKHQsZSxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigzNyksaT1PYmplY3QuY3JlYXRlLG89T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGUsbj0wLHU9MSxzPWkobnVsbCksYT1pKG51bGwpLGM9MDtyZXR1cm4gdD1yKHQpLHtoaXQ6ZnVuY3Rpb24ocil7dmFyIGk9YVtyXSxmPSsrYztpZihzW2ZdPXIsYVtyXT1mLCFpKXtpZigrK248PXQpcmV0dXJuO3JldHVybiByPXNbdV0sZShyKSxyfWlmKGRlbGV0ZSBzW2ldLHU9PT1pKWZvcig7IW8uY2FsbChzLCsrdSk7KWNvbnRpbnVlfSxkZWxldGU6ZT1mdW5jdGlvbih0KXt2YXIgZT1hW3RdO2lmKGUmJihkZWxldGUgc1tlXSxkZWxldGUgYVt0XSwtLW4sdT09PWUpKXtpZighbilyZXR1cm4gYz0wLHZvaWQodT0xKTtmb3IoOyFvLmNhbGwocywrK3UpOyljb250aW51ZX19LGNsZWFyOmZ1bmN0aW9uKCl7bj0wLHU9MSxzPWkobnVsbCksYT1pKG51bGwpLGM9MH19fX0sZnVuY3Rpb24odCxlLG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDM5KSxpPW4oMzgpLG89T2JqZWN0LmNyZWF0ZSx1PU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzO2kucmVmQ291bnRlcj1mdW5jdGlvbih0LGUsbil7dmFyIHMsYTtzPW8obnVsbCksYT1uLmFzeW5jJiZpLmFzeW5jfHxuLnByb21pc2UmJmkucHJvbWlzZT8iYXN5bmMiOiIiLGUub24oInNldCIrYSwoZnVuY3Rpb24odCxlKXtzW3RdPWV8fDF9KSksZS5vbigiZ2V0IithLChmdW5jdGlvbih0KXsrK3NbdF19KSksZS5vbigiZGVsZXRlIithLChmdW5jdGlvbih0KXtkZWxldGUgc1t0XX0pKSxlLm9uKCJjbGVhciIrYSwoZnVuY3Rpb24oKXtzPXt9fSkpLHUoZS5tZW1vaXplZCx7ZGVsZXRlUmVmOnIoKGZ1bmN0aW9uKCl7dmFyIHQ9ZS5nZXQoYXJndW1lbnRzKTtyZXR1cm4gbnVsbD09PXQ/bnVsbDpzW3RdPyEtLXNbdF0mJihlLmRlbGV0ZSh0KSwhMCk6bnVsbH0pKSxnZXRSZWZDb3VudDpyKChmdW5jdGlvbigpe3ZhciB0PWUuZ2V0KGFyZ3VtZW50cyk7cmV0dXJuIG51bGw9PT10PzA6c1t0XT9zW3RdOjB9KSl9KX19LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE2KSxpPW4oNDgpLG89bigxNykuQnVmZmVyLHU9WzE1MTg1MDAyNDksMTg1OTc3NTM5MywtMTg5NDAwNzU4OCwtODk5NDk3NTE0XSxzPW5ldyBBcnJheSg4MCk7ZnVuY3Rpb24gYSgpe3RoaXMuaW5pdCgpLHRoaXMuX3c9cyxpLmNhbGwodGhpcyw2NCw1Nil9ZnVuY3Rpb24gYyh0KXtyZXR1cm4gdDw8MzB8dD4+PjJ9ZnVuY3Rpb24gZih0LGUsbixyKXtyZXR1cm4gMD09PXQ/ZSZufH5lJnI6Mj09PXQ/ZSZufGUmcnxuJnI6ZV5uXnJ9cihhLGkpLGEucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYT0xNzMyNTg0MTkzLHRoaXMuX2I9NDAyMzIzMzQxNyx0aGlzLl9jPTI1NjIzODMxMDIsdGhpcy5fZD0yNzE3MzM4NzgsdGhpcy5fZT0zMjg1Mzc3NTIwLHRoaXN9LGEucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49dGhpcy5fdyxyPTB8dGhpcy5fYSxpPTB8dGhpcy5fYixvPTB8dGhpcy5fYyxzPTB8dGhpcy5fZCxhPTB8dGhpcy5fZSxsPTA7bDwxNjsrK2wpbltsXT10LnJlYWRJbnQzMkJFKDQqbCk7Zm9yKDtsPDgwOysrbCluW2xdPW5bbC0zXV5uW2wtOF1ebltsLTE0XV5uW2wtMTZdO2Zvcih2YXIgcD0wO3A8ODA7KytwKXt2YXIgaD1+fihwLzIwKSxkPTB8KChlPXIpPDw1fGU+Pj4yNykrZihoLGksbyxzKSthK25bcF0rdVtoXTthPXMscz1vLG89YyhpKSxpPXIscj1kfXRoaXMuX2E9cit0aGlzLl9hfDAsdGhpcy5fYj1pK3RoaXMuX2J8MCx0aGlzLl9jPW8rdGhpcy5fY3wwLHRoaXMuX2Q9cyt0aGlzLl9kfDAsdGhpcy5fZT1hK3RoaXMuX2V8MH0sYS5wcm90b3R5cGUuX2hhc2g9ZnVuY3Rpb24oKXt2YXIgdD1vLmFsbG9jVW5zYWZlKDIwKTtyZXR1cm4gdC53cml0ZUludDMyQkUoMHx0aGlzLl9hLDApLHQud3JpdGVJbnQzMkJFKDB8dGhpcy5fYiw0KSx0LndyaXRlSW50MzJCRSgwfHRoaXMuX2MsOCksdC53cml0ZUludDMyQkUoMHx0aGlzLl9kLDEyKSx0LndyaXRlSW50MzJCRSgwfHRoaXMuX2UsMTYpLHR9LHQuZXhwb3J0cz1hfSxmdW5jdGlvbih0LGUsbil7dmFyIHI9bigxNiksaT1uKDQ4KSxvPW4oMTcpLkJ1ZmZlcix1PVsxNTE4NTAwMjQ5LDE4NTk3NzUzOTMsLTE4OTQwMDc1ODgsLTg5OTQ5NzUxNF0scz1uZXcgQXJyYXkoODApO2Z1bmN0aW9uIGEoKXt0aGlzLmluaXQoKSx0aGlzLl93PXMsaS5jYWxsKHRoaXMsNjQsNTYpfWZ1bmN0aW9uIGModCl7cmV0dXJuIHQ8PDV8dD4+PjI3fWZ1bmN0aW9uIGYodCl7cmV0dXJuIHQ8PDMwfHQ+Pj4yfWZ1bmN0aW9uIGwodCxlLG4scil7cmV0dXJuIDA9PT10P2Umbnx+ZSZyOjI9PT10P2UmbnxlJnJ8biZyOmVebl5yfXIoYSxpKSxhLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2E9MTczMjU4NDE5Myx0aGlzLl9iPTQwMjMyMzM0MTcsdGhpcy5fYz0yNTYyMzgzMTAyLHRoaXMuX2Q9MjcxNzMzODc4LHRoaXMuX2U9MzI4NTM3NzUyMCx0aGlzfSxhLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPXRoaXMuX3cscj0wfHRoaXMuX2EsaT0wfHRoaXMuX2Isbz0wfHRoaXMuX2Mscz0wfHRoaXMuX2QsYT0wfHRoaXMuX2UscD0wO3A8MTY7KytwKW5bcF09dC5yZWFkSW50MzJCRSg0KnApO2Zvcig7cDw4MDsrK3ApbltwXT0oZT1uW3AtM11ebltwLThdXm5bcC0xNF1ebltwLTE2XSk8PDF8ZT4+PjMxO2Zvcih2YXIgaD0wO2g8ODA7KytoKXt2YXIgZD1+fihoLzIwKSx5PWMocikrbChkLGksbyxzKSthK25baF0rdVtkXXwwO2E9cyxzPW8sbz1mKGkpLGk9cixyPXl9dGhpcy5fYT1yK3RoaXMuX2F8MCx0aGlzLl9iPWkrdGhpcy5fYnwwLHRoaXMuX2M9byt0aGlzLl9jfDAsdGhpcy5fZD1zK3RoaXMuX2R8MCx0aGlzLl9lPWErdGhpcy5fZXwwfSxhLnByb3RvdHlwZS5faGFzaD1mdW5jdGlvbigpe3ZhciB0PW8uYWxsb2NVbnNhZmUoMjApO3JldHVybiB0LndyaXRlSW50MzJCRSgwfHRoaXMuX2EsMCksdC53cml0ZUludDMyQkUoMHx0aGlzLl9iLDQpLHQud3JpdGVJbnQzMkJFKDB8dGhpcy5fYyw4KSx0LndyaXRlSW50MzJCRSgwfHRoaXMuX2QsMTIpLHQud3JpdGVJbnQzMkJFKDB8dGhpcy5fZSwxNiksdH0sdC5leHBvcnRzPWF9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgcj1uKDE2KSxpPW4oMjE3KSxvPW4oNDgpLHU9bigxNykuQnVmZmVyLHM9bmV3IEFycmF5KDY0KTtmdW5jdGlvbiBhKCl7dGhpcy5pbml0KCksdGhpcy5fdz1zLG8uY2FsbCh0aGlzLDY0LDU2KX1yKGEsaSksYS5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hPTMyMzgzNzEwMzIsdGhpcy5fYj05MTQxNTA2NjMsdGhpcy5fYz04MTI3MDI5OTksdGhpcy5fZD00MTQ0OTEyNjk3LHRoaXMuX2U9NDI5MDc3NTg1Nyx0aGlzLl9mPTE3NTA2MDMwMjUsdGhpcy5fZz0xNjk0MDc2ODM5LHRoaXMuX2g9MzIwNDA3NTQyOCx0aGlzfSxhLnByb3RvdHlwZS5faGFzaD1mdW5jdGlvbigpe3ZhciB0PXUuYWxsb2NVbnNhZmUoMjgpO3JldHVybiB0LndyaXRlSW50MzJCRSh0aGlzLl9hLDApLHQud3JpdGVJbnQzMkJFKHRoaXMuX2IsNCksdC53cml0ZUludDMyQkUodGhpcy5fYyw4KSx0LndyaXRlSW50MzJCRSh0aGlzLl9kLDEyKSx0LndyaXRlSW50MzJCRSh0aGlzLl9lLDE2KSx0LndyaXRlSW50MzJCRSh0aGlzLl9mLDIwKSx0LndyaXRlSW50MzJCRSh0aGlzLl9nLDI0KSx0fSx0LmV4cG9ydHM9YX0sZnVuY3Rpb24odCxlLG4pe3ZhciByPW4oMTYpLGk9bigyMTgpLG89big0OCksdT1uKDE3KS5CdWZmZXIscz1uZXcgQXJyYXkoMTYwKTtmdW5jdGlvbiBhKCl7dGhpcy5pbml0KCksdGhpcy5fdz1zLG8uY2FsbCh0aGlzLDEyOCwxMTIpfXIoYSxpKSxhLnByb3RvdHlwZS5pbml0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FoPTM0MTgwNzAzNjUsdGhpcy5fYmg9MTY1NDI3MDI1MCx0aGlzLl9jaD0yNDM4NTI5MzcwLHRoaXMuX2RoPTM1NTQ2MjM2MCx0aGlzLl9laD0xNzMxNDA1NDE1LHRoaXMuX2ZoPTIzOTQxODAyMzEsdGhpcy5fZ2g9MzY3NTAwODUyNSx0aGlzLl9oaD0xMjAzMDYyODEzLHRoaXMuX2FsPTMyMzgzNzEwMzIsdGhpcy5fYmw9OTE0MTUwNjYzLHRoaXMuX2NsPTgxMjcwMjk5OSx0aGlzLl9kbD00MTQ0OTEyNjk3LHRoaXMuX2VsPTQyOTA3NzU4NTcsdGhpcy5fZmw9MTc1MDYwMzAyNSx0aGlzLl9nbD0xNjk0MDc2ODM5LHRoaXMuX2hsPTMyMDQwNzU0MjgsdGhpc30sYS5wcm90b3R5cGUuX2hhc2g9ZnVuY3Rpb24oKXt2YXIgdD11LmFsbG9jVW5zYWZlKDQ4KTtmdW5jdGlvbiBlKGUsbixyKXt0LndyaXRlSW50MzJCRShlLHIpLHQud3JpdGVJbnQzMkJFKG4scis0KX1yZXR1cm4gZSh0aGlzLl9haCx0aGlzLl9hbCwwKSxlKHRoaXMuX2JoLHRoaXMuX2JsLDgpLGUodGhpcy5fY2gsdGhpcy5fY2wsMTYpLGUodGhpcy5fZGgsdGhpcy5fZGwsMjQpLGUodGhpcy5fZWgsdGhpcy5fZWwsMzIpLGUodGhpcy5fZmgsdGhpcy5fZmwsNDApLHR9LHQuZXhwb3J0cz1hfSxmdW5jdGlvbih0LGUsbil7InVzZSBzdHJpY3QiO24ucihlKTt2YXIgcj17fTtuLnIociksbi5kKHIsIlVQREFURV9DT05GSUdTIiwoZnVuY3Rpb24oKXtyZXR1cm4gQ30pKSxuLmQociwiVE9HR0xFX0NPTkZJR1MiLChmdW5jdGlvbigpe3JldHVybiBFfSkpLG4uZChyLCJ1cGRhdGUiLChmdW5jdGlvbigpe3JldHVybiB6fSkpLG4uZChyLCJ0b2dnbGUiLChmdW5jdGlvbigpe3JldHVybiBrfSkpLG4uZChyLCJsb2FkZWQiLChmdW5jdGlvbigpe3JldHVybiBVfSkpO3ZhciBpPXt9O24ucihpKSxuLmQoaSwiZG93bmxvYWRDb25maWciLChmdW5jdGlvbigpe3JldHVybiBQfSkpLG4uZChpLCJnZXRDb25maWdCeVVybCIsKGZ1bmN0aW9uKCl7cmV0dXJuIFJ9KSk7dmFyIG89e307bi5yKG8pLG4uZChvLCJnZXQiLChmdW5jdGlvbigpe3JldHVybiBCfSkpO3ZhciB1PW4oOTgpLHM9bi5uKHUpLGE9big5OSksYz1uLm4oYSksZj1uKDEwMCksbD1uLm4oZikscD1uKDEwMSksaD1uLm4ocCksZD1uKDIpLHk9bi5uKGQpLHY9KG4oMTc2KSxmdW5jdGlvbih0KXtsKCkobix0KTt2YXIgZT1oKCkobik7ZnVuY3Rpb24gbigpe3JldHVybiBzKCkodGhpcyxuKSxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gYygpKG4sW3trZXk6InJlbmRlciIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLmdldENvbXBvbmVudCxlPXQoIkNvbnRhaW5lciIpLG49dCgiUm93Iikscj10KCJDb2wiKSxpPXQoIlRvcGJhciIsITApLG89dCgiQmFzZUxheW91dCIsITApLHU9dCgib25saW5lVmFsaWRhdG9yQmFkZ2UiLCEwKTtyZXR1cm4geS5hLmNyZWF0ZUVsZW1lbnQoZSx7Y2xhc3NOYW1lOiJzd2FnZ2VyLXVpIn0saT95LmEuY3JlYXRlRWxlbWVudChpLG51bGwpOm51bGwseS5hLmNyZWF0ZUVsZW1lbnQobyxudWxsKSx5LmEuY3JlYXRlRWxlbWVudChuLG51bGwseS5hLmNyZWF0ZUVsZW1lbnQocixudWxsLHkuYS5jcmVhdGVFbGVtZW50KHUsbnVsbCkpKSl9fV0pLG59KHkuYS5Db21wb25lbnQpKSxnPW4oMjYpLHc9bi5uKGcpLE09bigxNCksbT1uLm4oTSksXz1uKDMpLEw9bi5uKF8pLGI9big5KSx4PW4ubihiKSxqPW4oMTEpLE49bi5uKGopLFM9bigyMTkpLEQ9bi5uKFMpLEk9bigxMiksQT1mdW5jdGlvbih0KXtsKCkobix0KTt2YXIgZT1oKCkobik7ZnVuY3Rpb24gbih0LHIpe3ZhciBpO3JldHVybiBzKCkodGhpcyxuKSxpPWUuY2FsbCh0aGlzLHQsciksbSgpKHcoKShpKSwib25VcmxDaGFuZ2UiLChmdW5jdGlvbih0KXt2YXIgZT10LnRhcmdldC52YWx1ZTtpLnNldFN0YXRlKHt1cmw6ZX0pfSkpLG0oKSh3KCkoaSksImxvYWRTcGVjIiwoZnVuY3Rpb24odCl7aS5mbHVzaEF1dGhEYXRhKCksaS5wcm9wcy5zcGVjQWN0aW9ucy51cGRhdGVVcmwodCksaS5wcm9wcy5zcGVjQWN0aW9ucy5kb3dubG9hZCh0KX0pKSxtKCkodygpKGkpLCJvblVybFNlbGVjdCIsKGZ1bmN0aW9uKHQpe3ZhciBlPXQudGFyZ2V0LnZhbHVlfHx0LnRhcmdldC5ocmVmO2kubG9hZFNwZWMoZSksaS5zZXRTZWxlY3RlZFVybChlKSx0LnByZXZlbnREZWZhdWx0KCl9KSksbSgpKHcoKShpKSwiZG93bmxvYWRVcmwiLChmdW5jdGlvbih0KXtpLmxvYWRTcGVjKGkuc3RhdGUudXJsKSx0LnByZXZlbnREZWZhdWx0KCl9KSksbSgpKHcoKShpKSwic2V0U2VhcmNoIiwoZnVuY3Rpb24odCl7dmFyIGUsbixyPU9iamVjdChJLmUpKCk7clsidXJscy5wcmltYXJ5TmFtZSJdPXQubmFtZTt2YXIgaSxvPUwoKShlPUwoKShuPSIiLmNvbmNhdCh3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wsIi8vIikpLmNhbGwobix3aW5kb3cubG9jYXRpb24uaG9zdCkpLmNhbGwoZSx3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpO3dpbmRvdyYmd2luZG93Lmhpc3RvcnkmJndpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSYmd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsIiIsTCgpKGk9IiIuY29uY2F0KG8sIj8iKSkuY2FsbChpLE9iamVjdChJLmYpKHIpKSl9KSksbSgpKHcoKShpKSwic2V0U2VsZWN0ZWRVcmwiLChmdW5jdGlvbih0KXt2YXIgZT1pLnByb3BzLmdldENvbmZpZ3MoKS51cmxzfHxbXTtlJiZlLmxlbmd0aCYmdCYmeCgpKGUpLmNhbGwoZSwoZnVuY3Rpb24oZSxuKXtlLnVybD09PXQmJihpLnNldFN0YXRlKHtzZWxlY3RlZEluZGV4Om59KSxpLnNldFNlYXJjaChlKSl9KSl9KSksbSgpKHcoKShpKSwib25GaWx0ZXJDaGFuZ2UiLChmdW5jdGlvbih0KXt2YXIgZT10LnRhcmdldC52YWx1ZTtpLnByb3BzLmxheW91dEFjdGlvbnMudXBkYXRlRmlsdGVyKGUpfSkpLGkuc3RhdGU9e3VybDp0LnNwZWNTZWxlY3RvcnMudXJsKCksc2VsZWN0ZWRJbmRleDowfSxpfXJldHVybiBjKCkobixbe2tleToiY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5zZXRTdGF0ZSh7dXJsOnQuc3BlY1NlbGVjdG9ycy51cmwoKX0pfX0se2tleToiZmx1c2hBdXRoRGF0YSIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnByb3BzLmdldENvbmZpZ3MoKS5wZXJzaXN0QXV0aG9yaXphdGlvbnx8dGhpcy5wcm9wcy5hdXRoQWN0aW9ucy5yZXN0b3JlQXV0aG9yaXphdGlvbih7YXV0aG9yaXplZDp7fX0pfX0se2tleToiY29tcG9uZW50RGlkTW91bnQiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMucHJvcHMuZ2V0Q29uZmlncygpLG49ZS51cmxzfHxbXTtpZihuJiZuLmxlbmd0aCl7dmFyIHI9dGhpcy5zdGF0ZS5zZWxlY3RlZEluZGV4LGk9ZVsidXJscy5wcmltYXJ5TmFtZSJdO2kmJngoKShuKS5jYWxsKG4sKGZ1bmN0aW9uKGUsbil7ZS5uYW1lPT09aSYmKHQuc2V0U3RhdGUoe3NlbGVjdGVkSW5kZXg6bn0pLHI9bil9KSksdGhpcy5sb2FkU3BlYyhuW3JdLnVybCl9fX0se2tleToicmVuZGVyIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMucHJvcHMsZT10LmdldENvbXBvbmVudCxuPXQuc3BlY1NlbGVjdG9ycyxyPXQuZ2V0Q29uZmlncyxpPWUoIkJ1dHRvbiIpLG89ZSgiTGluayIpLHU9ImxvYWRpbmciPT09bi5sb2FkaW5nU3RhdHVzKCkscz1bImRvd25sb2FkLXVybC1pbnB1dCJdOyJmYWlsZWQiPT09bi5sb2FkaW5nU3RhdHVzKCkmJnMucHVzaCgiZmFpbGVkIiksdSYmcy5wdXNoKCJsb2FkaW5nIik7dmFyIGE9cigpLnVybHMsYz1bXSxmPW51bGw7aWYoYSl7dmFyIGw9W107eCgpKGEpLmNhbGwoYSwoZnVuY3Rpb24odCxlKXtsLnB1c2goeS5hLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIse2tleTplLHZhbHVlOnQudXJsfSx0Lm5hbWUpKX0pKSxjLnB1c2goeS5hLmNyZWF0ZUVsZW1lbnQoImxhYmVsIix7Y2xhc3NOYW1lOiJzZWxlY3QtbGFiZWwiLGh0bWxGb3I6InNlbGVjdCJ9LHkuYS5jcmVhdGVFbGVtZW50KCJzcGFuIixudWxsLCJTZWxlY3QgYSBkZWZpbml0aW9uIikseS5hLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIse2lkOiJzZWxlY3QiLGRpc2FibGVkOnUsb25DaGFuZ2U6dGhpcy5vblVybFNlbGVjdCx2YWx1ZTphW3RoaXMuc3RhdGUuc2VsZWN0ZWRJbmRleF0udXJsfSxsKSkpfWVsc2UgZj10aGlzLmRvd25sb2FkVXJsLGMucHVzaCh5LmEuY3JlYXRlRWxlbWVudCgiaW5wdXQiLHtjbGFzc05hbWU6cy5qb2luKCIgIiksdHlwZToidGV4dCIsb25DaGFuZ2U6dGhpcy5vblVybENoYW5nZSx2YWx1ZTp0aGlzLnN0YXRlLnVybCxkaXNhYmxlZDp1fSkpLGMucHVzaCh5LmEuY3JlYXRlRWxlbWVudChpLHtjbGFzc05hbWU6ImRvd25sb2FkLXVybC1idXR0b24iLG9uQ2xpY2s6dGhpcy5kb3dubG9hZFVybH0sIkV4cGxvcmUiKSk7cmV0dXJuIHkuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6InRvcGJhciJ9LHkuYS5jcmVhdGVFbGVtZW50KCJkaXYiLHtjbGFzc05hbWU6IndyYXBwZXIifSx5LmEuY3JlYXRlRWxlbWVudCgiZGl2Iix7Y2xhc3NOYW1lOiJ0b3BiYXItd3JhcHBlciJ9LHkuYS5jcmVhdGVFbGVtZW50KG8sbnVsbCx5LmEuY3JlYXRlRWxlbWVudCgiaW1nIix7aGVpZ2h0OiI0MCIsc3JjOkQuYSxhbHQ6IlN3YWdnZXIgVUkifSkpLHkuYS5jcmVhdGVFbGVtZW50KCJmb3JtIix7Y2xhc3NOYW1lOiJkb3dubG9hZC11cmwtd3JhcHBlciIsb25TdWJtaXQ6Zn0sTigpKGMpLmNhbGwoYywoZnVuY3Rpb24odCxlKXtyZXR1cm4gT2JqZWN0KGQuY2xvbmVFbGVtZW50KSh0LHtrZXk6ZX0pfSkpKSkpKX19XSksbn0oeS5hLkNvbXBvbmVudCksTz1uKDcxKSxUPWZ1bmN0aW9uKHQsZSl7dHJ5e3JldHVybiBPLmEubG9hZCh0KX1jYXRjaCh0KXtyZXR1cm4gZSYmZS5lcnJBY3Rpb25zLm5ld1Rocm93bkVycihuZXcgRXJyb3IodCkpLHt9fX0sQz0iY29uZmlnc191cGRhdGUiLEU9ImNvbmZpZ3NfdG9nZ2xlIjtmdW5jdGlvbiB6KHQsZSl7cmV0dXJue3R5cGU6QyxwYXlsb2FkOm0oKSh7fSx0LGUpfX1mdW5jdGlvbiBrKHQpe3JldHVybnt0eXBlOkUscGF5bG9hZDp0fX12YXIgWSxVPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXQuZ2V0Q29uZmlncyxuPXQuYXV0aEFjdGlvbnM7aWYoZSgpLnBlcnNpc3RBdXRob3JpemF0aW9uKXt2YXIgcj1sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiYXV0aG9yaXplZCIpO3ImJm4ucmVzdG9yZUF1dGhvcml6YXRpb24oe2F1dGhvcml6ZWQ6SlNPTi5wYXJzZShyKX0pfX19LFA9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybigwLGUuZm4uZmV0Y2gpKHQpfX0sUj1mdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgcj1uLnNwZWNBY3Rpb25zO2lmKHQpcmV0dXJuIHIuZG93bmxvYWRDb25maWcodCkudGhlbihpLGkpO2Z1bmN0aW9uIGkobil7biBpbnN0YW5jZW9mIEVycm9yfHxuLnN0YXR1cz49NDAwPyhyLnVwZGF0ZUxvYWRpbmdTdGF0dXMoImZhaWxlZENvbmZpZyIpLHIudXBkYXRlTG9hZGluZ1N0YXR1cygiZmFpbGVkQ29uZmlnIiksci51cGRhdGVVcmwoIiIpLGNvbnNvbGUuZXJyb3Iobi5zdGF0dXNUZXh0KyIgIit0LnVybCksZShudWxsKSk6ZShUKG4udGV4dCkpfX19LFE9big1KSxGPW4ubihRKSxCPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZ2V0SW4oRigpKGUpP2U6W2VdKX0sRz1uKDApLFc9KFk9e30sbSgpKFksQywoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5tZXJnZShPYmplY3QoRy5mcm9tSlMpKGUucGF5bG9hZCkpfSkpLG0oKShZLEUsKGZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5wYXlsb2FkLHI9dC5nZXQobik7cmV0dXJuIHQuc2V0KG4sIXIpfSkpLFkpLHE9e2dldExvY2FsQ29uZmlnOmZ1bmN0aW9uKCl7cmV0dXJuIFQoJy0tLVxudXJsOiAiaHR0cHM6Ly9wZXRzdG9yZS5zd2FnZ2VyLmlvL3YyL3N3YWdnZXIuanNvbiJcbmRvbV9pZDogIiNzd2FnZ2VyLXVpIlxudmFsaWRhdG9yVXJsOiAiaHR0cHM6Ly92YWxpZGF0b3Iuc3dhZ2dlci5pby92YWxpZGF0b3IiXG4nKX19O2UuZGVmYXVsdD1bZnVuY3Rpb24oKXtyZXR1cm57Y29tcG9uZW50czp7VG9wYmFyOkF9fX0sZnVuY3Rpb24oKXtyZXR1cm57c3RhdGVQbHVnaW5zOntzcGVjOnthY3Rpb25zOmksc2VsZWN0b3JzOnF9LGNvbmZpZ3M6e3JlZHVjZXJzOlcsYWN0aW9uczpyLHNlbGVjdG9yczpvfX19fSxmdW5jdGlvbigpe3JldHVybntjb21wb25lbnRzOntTdGFuZGFsb25lTGF5b3V0OnZ9fX1dfV0pLmRlZmF1bHR9KSk7`)

Functions

func AddLogicChild

func AddLogicChild(logic *Logic, child []*Logic)

func AddLogicChildNext

func AddLogicChildNext(logic *Logic, deep int, next int, child []*Logic) error

func AppendLine

func AppendLine(filePath string, s string) (int, error)

func AppendString

func AppendString(filePath string, s string) (int, error)

func BaseWithoutExt

func BaseWithoutExt(fp string) string

func Close

func Close(fd *os.File) error

close fd

func ColorPrint

func ColorPrint(out string, color string)

func CompressSpace

func CompressSpace(str string) string

func ConfBool

func ConfBool(conf Config, key string) bool

获取配置中的bool

错误, 类型错误, 没有该值, 返回false

func ConfInt

func ConfInt(conf Config, key string) (int, error)

获取配置中的数值类型值

func ConfIntUnsafe

func ConfIntUnsafe(conf Config, key string) int

获取配置中的数值类型值

错误返回-1

func ConfIntUnsafeDefault

func ConfIntUnsafeDefault(conf Config, key string, defaultVal int) int

func ConfPrint

func ConfPrint(conf Config) string

获取配置文件内容并返回json

func ConfUnsafe

func ConfUnsafe(conf Config, key string) string

获取配置值, 不存在该值, 则返回 ""

func ConfUnsafeDefault

func ConfUnsafeDefault(conf Config, key string, defaultVal string) string

获取配置值, 不存在该值, 则返回 ""

func ConfValue

func ConfValue(conf Config, key string) (string, error)

获取配置中的value值

func Create

func Create(name string) (*os.File, error)

create one file

func DeepCopy

func DeepCopy(dst, src interface{}) error

深度拷贝, 序列化后反序列化

func Dir

func Dir(fp string) string

get filepath dir name

func DistFrontend2Code

func DistFrontend2Code(pkg string, distPath string, urlPrefix string) (string, error)

DistFrontend2Code 将前端编译代码即静态资源直接编译为go代码

pkg: 包名 package ${pkg}

distPath: 编译代码所在路径

urlPrefix: 前端请求路径前缀, 默认为 /

func DoRequest

func DoRequest(timeoutSecond int, method string, url string,
	headers map[string]string, contentType string,
	body []byte) (int, map[string][]string, []byte, error)

DoRequest : post data to url

return : statusCode, header, body, error

func DoRequestWithBaseAuth

func DoRequestWithBaseAuth(timeoutSecond int, method string, url string,
	headers map[string]string, body []byte, username string, password string) (int, map[string][]string, []byte, error)

DoRequestWithBaseAuth : post data to url

return : statusCode, header, body, error

func EnableSwagger

func EnableSwagger(data *SwaggerData)

func EnsureDir

func EnsureDir(fp string) error

mkdir dir if not exist

func EnsureDirRW

func EnsureDirRW(dataDir string) error

ensure the datadir and make sure it's rw-able

func ExecCmdWithTimeout

func ExecCmdWithTimeout(timeout int, cmd string, args ...string) (string, error)

ExecCmdWithTimeout 执行命令带超时时间

timeout: 超时时间(单位秒)

func Exists

func Exists(fp string) bool

Exist checks whether a file or directory exists. It returns false when the file or directory does not exist.

func Ext

func Ext(fp string) string

func FileProcessor

func FileProcessor(context Context)

func FormatMetricsData

func FormatMetricsData(data MetricsData) string

func GenerateSwagger

func GenerateSwagger(model *SwaggerData) string

func Get

func Get(url string) (int, map[string][]string, []byte, error)

Get : get请求 return : statusCode, header, body, error

func GetCpuCount

func GetCpuCount() int

func GetFull

func GetFull(timeoutSecond int, url string, headers map[string]string) (int, map[string][]string, []byte, error)

GetFull : get data from url

return : statusCode, header, body, error

func GetHostname

func GetHostname() string

func GetJsonParamStr

func GetJsonParamStr(key string, jsonObj map[string]interface{}) string

GetJsonParamStr 获取json对象中key对应的字符串

没有该key则返回""

func GetMetricsData

func GetMetricsData(data []MetricsData) string

func GetProcesses

func GetProcesses() ([]*process.Process, error)

func GetProperty

func GetProperty(bean interface{}, name string) (interface{}, error)

GetProperty 获取bean实例的属性值

bean 应为 struct

func GetToken

func GetToken(service string, appId string, appSecret string) (string, error)

获取权限云token, 可缓存

func GetWithTimeout

func GetWithTimeout(timeoutSecond int, url string) (int, map[string][]string, []byte, error)

GetWithTimeout get 带超时时间 return : statusCode, header, body, error

func Guid

func Guid() string

32字节uuid生成器 8字节ip地址 15数字时间戳 9随机数

func HasEmptyString

func HasEmptyString(strs ...string) bool

参数中是否含有空字符串

return: true 包含空字符串 false 不包含空字符串

func InCidr

func InCidr(ip string, cidr string) bool

InCidr 判断ip是否在cidr范围内

func InsureDir

func InsureDir(fp string) error

func IsActive

func IsActive(protocol string, ip string, port int, timeoutSecond int) bool

IsActive 测试网络连通 tcp, udp

func IsEmpty

func IsEmpty(param interface{}) bool

IsEmpty 判断数据是否为空

func IsFile

func IsFile(fp string) bool

IsFile checks whether the Path is a file, it returns false when it's a directory or does not exist.

func JsonPathLookup

func JsonPathLookup(obj interface{}, jpath string) (interface{}, error)

func JsonpathLookup

func JsonpathLookup(jsonPath string, jsonStr string) (interface{}, error)

func LoadXml

func LoadXml(filePath string) *etree.Document

func Mkdir

func Mkdir(path string)

func NextLogics

func NextLogics(pipeline string, trace string, span *int32, logics []*Logic, input interface{}, result *PipelineResult)

func Once

func Once(timeSeconds int, fun func())

Once 定时执行一次

func ParseToMap

func ParseToMap(param interface{}) (map[string]string, error)

func ParseToString

func ParseToString(param interface{}) (string, error)

func ParseValueToString

func ParseValueToString(value reflect.Value) string

func PipelineAddLogic

func PipelineAddLogic(p *PipeLine, logic []*Logic)

func Post

func Post(url string, contentType string, data []byte) (int, map[string][]string, []byte, error)

Post return : statusCode, header, body, error

func PostFull

func PostFull(timeoutSecond int, url string, headers map[string]string, contentType string, data []byte) (int, map[string][]string, []byte, error)

PostFull : post data to url

return : statusCode, header, body, error

func PostJson

func PostJson(url string, data interface{}) (int, map[string][]string, []byte, error)

PostJson : post json, data will parse to json string return : statusCode, header, body, error

func PostJsonFull

func PostJsonFull(timeoutSecond int, url string, headers map[string]string, data interface{}) (int, map[string][]string, []byte, error)

PostJsonFull : post json data to url, contentType设置为: application/json utf8

data : interface, 自动将其转成json格式

return : statusCode, header, body, error

func PostJsonWithTimeout

func PostJsonWithTimeout(timeoutSecond int, url string, data interface{}) (int, map[string][]string, []byte, error)

PostJsonWithTimeout post json 带超时时间 return : statusCode, header, body, error

func PostWithTimeout

func PostWithTimeout(timeoutSecond int, url string, contentType string, data []byte) (int, map[string][]string, []byte, error)

PostWithTimeout post 带超时时间 return : statusCode, header, body, error

func PrintMetricsData

func PrintMetricsData(data []MetricsData, context Context)

func Printf

func Printf(formatter string, items ...interface{})

func ProcessError

func ProcessError(err error) bool

错误处理

return true 错误发生

false 无错误

func ReadString

func ReadString(filePath string) string

func RealPath

func RealPath(fp string) (string, error)

传入相对路径, 获取绝对路径, 如传入绝对路径则直接返回

func RegisterDefaultIndex

func RegisterDefaultIndex(params DefaultIndexStruct)

func RegisterFilter

func RegisterFilter(path string, handle func(Context) bool)

注册过滤器

handle : return false 拦截请求

func RegisterFrontendDist

func RegisterFrontendDist(distPath string, prefix string)

注册前端编译后程序路径

func RegisterHandler

func RegisterHandler(path string, handler func(Context))

注册http请求处理器

@param path:路径, 可以用 {占位符} 进行路径参数设置

func RegisterIndex

func RegisterIndex(handler func(Context))

注册首页处理器

func RegisterLogRotate

func RegisterLogRotate(seconds int)

RegisterLogRotate 注册日志滚动服务

seconds: 设置日志滚动时间 单位: 秒

func RegisterStatic

func RegisterStatic(path string)

注册静态文件目录

func RegisterTemplate

func RegisterTemplate(filePath string)

注册模板服务

func Remove

func Remove(name string) error

remove one file

func Rename

func Rename(src string, target string) error

rename file name

func RenderTable

func RenderTable(data string, width int) []map[string]string

RenderTable 类似table类型字符串

转换为mysql table类型数据

func RenderTemplateKV

func RenderTemplateKV(tpl string, kvs ...interface{}) (string, error)

RenderTemplateKV 字符串模板渲染

func ReplaceStr

func ReplaceStr(ori string, old string, newFunc func() string) string

func RequestToken

func RequestToken(service string, appId string, appSecret string) (string, error)

获取权限云token, 直接发起请求

func RotateLog

func RotateLog()

RotateLog 日志滚动

func ScanRows

func ScanRows(rows *sql.Rows) ([]map[string]string, error)

ScanRows rows扫描

func Schedule

func Schedule(name string, timeSchedule int, fun func(), delaySeconds int)

Schedule 注册定时任务

name 任务名称

timeSchedule 时间单位 秒

fun 任务

func ScheduleContinue

func ScheduleContinue(name string)

func SchedulePause

func SchedulePause(name string)

func ScheduleStop

func ScheduleStop(name string)

ScheduleStop 停止定时任务, 等待

func SelfDir

func SelfDir() string

获取执行文件所在目录

func SelfPath

func SelfPath() string

获取执行文件所在绝对路径

func SendEndpoint

func SendEndpoint(server string, name string, status string, properties map[string]string, key string)

SendEndpoint 注册到注册中心

func SetI18n

func SetI18n(name string)

func SetProperty

func SetProperty(bean interface{}, name string, value interface{}) error

SetProperty 设置bean实例的属性值

bean 应为 指向 struct指针

func SqlParamCheck

func SqlParamCheck(p string) bool

func SqlParamIsTp

func SqlParamIsTp(p string) bool

func StackTrace

func StackTrace() string

func StartLogic

func StartLogic(pipeline string, trace string, span int32, logic *Logic, input interface{}) (LogicResult, interface{}, []*Logic)

func StartServer

func StartServer(host string, port int)

启动服务

func StaticProcessor

func StaticProcessor(ctx Context)

func StatusText

func StatusText(code int) string

StatusText returns a text for the HTTP status code. It returns the empty string if the code is unknown.

func StringFirstLower

func StringFirstLower(param string) string

StringFirstLower 第一个字母小写

func StringFirstNotEmpty

func StringFirstNotEmpty(params ...string) string

StringFirstNotEmpty 选择参数中首个非空字符串

func StringFormat

func StringFormat(formatter string, params map[string]interface{}) string

StringFormat 格式化字符串

${name}

func StringFormatConf

func StringFormatConf(formatter string, conf Config) string

StringFormatConf 格式化字符串

${name}

func StringFormatMap

func StringFormatMap(formatter string, params map[string]string) string

StringFormatMap 格式化字符串

${name}

func StringFormatStructs

func StringFormatStructs(formatter string, obj interface{}) string

func TemplateFunc

func TemplateFunc(name string, function interface{})

注册模板函数 warning: 请在设置模板目录前使用

func TimeEpoch

func TimeEpoch() int64

TimeEpoch 获取毫秒时间戳

func TimeParse

func TimeParse()

func WebsocketMain

func WebsocketMain()

func WriteBytes

func WriteBytes(filePath string, b []byte) (int, error)

func WriteString

func WriteString(filePath string, s string) (int, error)

Types

type Cache

type Cache struct {
	Expire time.Duration
	Data   map[string]CacheData
	Lock   sync.RWMutex
}

Cache 缓存对象

func NewCache

func NewCache(expire time.Duration) *Cache

NewCache 创建新缓存

func (*Cache) CacheClean

func (cache *Cache) CacheClean()

CacheClean 清除过期数据

func (*Cache) GetAllKeys

func (cache *Cache) GetAllKeys() []string

GetAllKeys 获取全部缓存数据

func (*Cache) GetData

func (cache *Cache) GetData(key string) interface{}

GetData 获取缓存数据

func (*Cache) InsertData

func (cache *Cache) InsertData(key string, data interface{})

InsertData 插入数据

type CacheData

type CacheData struct {
	Time time.Time
	Data interface{}
}

CacheData 缓存数据

type Checker

type Checker struct {
	Start int64
	Name  string
}

func GetChecker

func GetChecker(name string) Checker

func (Checker) End

func (thisSelf Checker) End()

type CheckerResult

type CheckerResult struct {
	Name        string
	Times       int
	TotalMillis int64
}

func CheckersInfo

func CheckersInfo() []CheckerResult

type ColumnSchema

type ColumnSchema struct {
	Name     string `json:"name"`
	DataType string `json:"dataType"`
	Comment  string `json:"comment"`
}

ColumnSchema 列结构

type Config

type Config map[string]string

func LoadConfig

func LoadConfig(confOrPath string) Config

LoadConfig 读取properties类型配置文件

func (Config) ArrayUnsafe

func (c Config) ArrayUnsafe(key string, spliter string) []string

func (Config) Bool

func (c Config) Bool(key string) bool

Bool 获取配置中的bool

错误, 类型错误, 没有该值, 返回false "1", "t", "true" 定义为true

func (Config) Int

func (c Config) Int(key string) (int, error)

Int 获取配置中的数值类型值

func (Config) IntUnsafe

func (c Config) IntUnsafe(key string) int

IntUnsafe 获取配置中的数值类型值

错误返回-1

func (Config) IntUnsafeDefault

func (c Config) IntUnsafeDefault(key string, defaultVal int) int

func (Config) Print

func (c Config) Print() string

Print 获取配置文件内容并返回json

func (Config) Unsafe

func (c Config) Unsafe(key string) string

Unsafe 获取配置值, 不存在该值, 则返回 ""

func (Config) UnsafeDefault

func (c Config) UnsafeDefault(key string, defaultVal string) string

UnsafeDefault 获取配置值, 不存在该值, 则返回 defaultVal

func (Config) Value

func (c Config) Value(key string) (string, error)

Value 获取配置中的value值

value 已做trim处理

type Context

type Context struct {
	Request  *http.Request
	Response http.ResponseWriter

	Message    I18n
	EnableI18n bool
	// contains filtered or unexported fields
}

Context 上下文数据结构

func (*Context) AddCacheHeader

func (c *Context) AddCacheHeader(cacheSeconds int)

func (*Context) ApiResponse

func (c *Context) ApiResponse(code int, message string, data interface{})

返回 json数据 { code 格式: 0, message : "", data : {}}

func (*Context) Code

func (c *Context) Code(static int)

返回对应http编码

func (*Context) DelHeader

func (c *Context) DelHeader(key string)

DelHeader 删除httpheader对应值

func (*Context) DownloadContent

func (c *Context) DownloadContent(fileName string, data []byte)

下载二进制文件

func (*Context) Error

func (c *Context) Error(static int, htmlStr string)

返回http错误响应

请自行设定 contentType

func (*Context) GetBody

func (c *Context) GetBody() []byte

GetBody 获取请求体

func (*Context) GetContentType

func (c *Context) GetContentType() string

获取content-type值

func (*Context) GetCookie

func (c *Context) GetCookie(key string) string

获取cookie值

func (*Context) GetHeader

func (c *Context) GetHeader(key string) string

获取header对应值

func (*Context) GetJSON

func (c *Context) GetJSON() (map[string]interface{}, error)

GetJSON 获取body中

json类型数据体

func (*Context) GetMethod

func (c *Context) GetMethod() string

GetMethod 获取http方法

func (*Context) GetPathParam

func (c *Context) GetPathParam(key string) string

func (*Context) GetQueryParam

func (c *Context) GetQueryParam(key string) string

GetQueryParam 获取query参数

func (*Context) GetUri

func (c *Context) GetUri() string

GetUri 获取去除querystring之后的请求路径

以 / 为开头

func (*Context) JSON

func (c *Context) JSON(jsonStr string)

JSON 返回json数据

func (*Context) Locale

func (c *Context) Locale() string

获取locale设置

func (*Context) OK

func (c *Context) OK(contentType string, content []byte)

返回http: 200

func (*Context) ProxyPass

func (c *Context) ProxyPass(path string, timeoutSeconds int)

func (*Context) Redirect

func (c *Context) Redirect(path string) error

302跳转

func (*Context) RemoteAddr

func (c *Context) RemoteAddr() string

RemoteAddr 获取http请求address

func (*Context) RenderTemplate

func (c *Context) RenderTemplate(name string, model interface{}) error

根据请求判断接口

func (*Context) RenderTemplateKV

func (c *Context) RenderTemplateKV(name string, kvs ...interface{}) error

直接转换成接口

func (*Context) ServeFile

func (c *Context) ServeFile(filePath string)

http文件服务

func (*Context) SessionGet

func (c *Context) SessionGet(key string) interface{}

func (*Context) SessionSet

func (c *Context) SessionSet(key string, value interface{})

func (*Context) SetCookie

func (c *Context) SetCookie(cookie *http.Cookie)

设置cookie值

func (*Context) SetHeader

func (c *Context) SetHeader(key string, value string)

设置httpheader值

func (*Context) SetLastModified

func (c *Context) SetLastModified(modtime time.Time)

设置最后修改时间

func (*Context) WriteJSON

func (c *Context) WriteJSON(data interface{})

WriteJSON 返回json类型数据

func (*Context) WriteNotModified

func (c *Context) WriteNotModified() error

写入未修改

type Database

type Database struct {
	// contains filtered or unexported fields
}

func DbPool

func DbPool(addr string, user string, password string, dbName string, maxConnections int, timeoutSecond int) (Database, error)

DbPool 创建数据库连接池

addr: 数据库链接地址, ip:port

func (Database) Close

func (d Database) Close()

func (Database) Exec

func (d Database) Exec(sql string, params ...interface{}) (int64, int64, error)

Exec 执行数据库写入更改删除

? 代表参数

func (Database) Ping

func (d Database) Ping() error

Ping 数据库链接

func (Database) Query

func (d Database) Query(sql string, params ...interface{}) ([]map[string]string, error)

Query 执行数据库查询

? 代表参数

func (Database) Schema

func (d Database) Schema() (DatabaseSchema, error)

Schema 获取数据库结构

func (Database) Status

func (d Database) Status() sql.DBStats

type DatabaseSchema

type DatabaseSchema struct {
	Name   string                 `json:"name"`
	Tables map[string]TableSchema `json:"tables"`
}

DatabaseSchema 库结构

type DefaultIndexLink struct {
	Text string
	Link string
}

type DefaultIndexStruct

type DefaultIndexStruct struct {
	Title              string
	BackgroundUrl      string
	HeaderLinks        []DefaultIndexLink
	CenterContentLines []string
	Buttons            []DefaultIndexLink
	PoweredBy          string
	FooterLinks        []DefaultIndexLink
	ExtendedStyle      string
	EnableSwagger      bool
}

type DiskInfo

type DiskInfo struct {
	Device      string  `json:"device"`
	Mountpoint  string  `json:"mountpoint"`
	Fstype      string  `json:"fstype"`
	Total       uint64  `json:"total"`
	Free        uint64  `json:"free"`
	Used        uint64  `json:"used"`
	UsedPercent float64 `json:"usedPercent"`
}

func GetDiskInfo

func GetDiskInfo(dir string) DiskInfo

func GetDiskInfos

func GetDiskInfos() []DiskInfo

type Error

type Error struct {
	Type ErrorType
	// contains filtered or unexported fields
}

Error allows easier introspection on the type of error returned. If you know you have a Error, you can compare the Type to one of the exported types from this package to see what kind of error it is, then further inspect the Error() method to see if it has more specific details for you, like in the case of a ErrElementNotFound type of error.

func (Error) Error

func (se Error) Error() string

type ErrorType

type ErrorType int

ErrorType defines types of errors that are possible from soup

const (
	// ErrUnableToParse will be returned when the HTML could not be parsed
	ErrUnableToParse ErrorType = iota
	// ErrElementNotFound will be returned when element was not found
	ErrElementNotFound
	// ErrNoNextSibling will be returned when no next sibling can be found
	ErrNoNextSibling
	// ErrNoPreviousSibling will be returned when no previous sibling can be found
	ErrNoPreviousSibling
	// ErrNoNextElementSibling will be returned when no next element sibling can be found
	ErrNoNextElementSibling
	// ErrNoPreviousElementSibling will be returned when no previous element sibling can be found
	ErrNoPreviousElementSibling
	// ErrCreatingGetRequest will be returned when the get request couldn't be created
	ErrCreatingGetRequest
	// ErrInGetRequest will be returned when there was an error during the get request
	ErrInGetRequest
	// ErrCreatingPostRequest will be returned when the post request couldn't be created
	ErrCreatingPostRequest
	// ErrMarshallingPostRequest will be returned when the body of a post request couldn't be serialized
	ErrMarshallingPostRequest
	// ErrReadingResponse will be returned if there was an error reading the response to our get request
	ErrReadingResponse
)

type FullRuntimeInfo

type FullRuntimeInfo struct {
	Memory      MemoryInfo   `json:"memory"`
	OsMemory    OsMemoryInfo `json:"osMemory"`
	CpuCount    int          `json:"cpuCount"`
	CurrentDisk DiskInfo     `json:"currentDisk"`
	DiskInfos   []DiskInfo   `json:"diskInfos"`
	Load        LoadInfo     `json:"load"`
	Net         NetInfo      `json:"net"`
}

func GetFullRuntimeInfo

func GetFullRuntimeInfo() FullRuntimeInfo

type I18n

type I18n struct {
	Cn map[string]string
	En map[string]string
}

type JsonpathCompiled

type JsonpathCompiled struct {
	// contains filtered or unexported fields
}

func JsonpathCompile

func JsonpathCompile(jpath string) (*JsonpathCompiled, error)

func MustCompile

func MustCompile(jpath string) *JsonpathCompiled

func (*JsonpathCompiled) Lookup

func (c *JsonpathCompiled) Lookup(obj interface{}) (interface{}, error)

func (*JsonpathCompiled) String

func (c *JsonpathCompiled) String() string

func (*JsonpathCompiled) StringLookup

func (c *JsonpathCompiled) StringLookup(jsonStr string) (interface{}, error)

type KafkaBroker

type KafkaBroker struct {
	Host string `json:"host"`
	Port int    `json:"port"`
	ID   int    `json:"id"`
	Rack string `json:"rack"`
}

type KafkaPartition

type KafkaPartition struct {
	// Name of the topic that the partition belongs to, and its index in the
	// topic.
	Topic string `json:"topic"`
	ID    int    `json:"id"`

	// Leader, replicas, and ISR for the partition.
	Leader   KafkaBroker   `json:"leader"`
	Replicas []KafkaBroker `json:"replicas"`
	Isr      []KafkaBroker `json:"isr"`
}

type LoadInfo

type LoadInfo struct {
	Load1  float64 `json:"load1"`
	Load5  float64 `json:"load5"`
	Load15 float64 `json:"load15"`
}

func GetLoadInfo

func GetLoadInfo() LoadInfo

type Logger

type Logger interface {
	// Log 打印字符串类型日志
	Log(msg string)

	// LogF 打印格式化内容日志
	LogF(formatter string, records ...interface{})

	ConsoleLogF(formatter string, records ...interface{})

	// LogTemplate 打印模板类型日志
	LogTemplate(template string, models ...interface{})

	// Info 打印字符串类型日志
	Info(msg string)

	// InfoLn 逐行打印info日志信息
	InfoLn(v ...interface{})

	// InfoF 打印格式化内容日志
	InfoF(formatter string, records ...interface{})

	// InfoTemplate 打印模板类型日志
	InfoTemplate(template string, models ...interface{})

	// Warn 打印字符串类型日志
	Warn(msg string)

	// WarnF 打印格式化内容日志
	WarnF(formatter string, records ...interface{})

	ConsoleWarnF(formatter string, records ...interface{})

	// WarnTemplate 打印模板类型日志
	WarnTemplate(template string, models ...interface{})

	// Error 打印字符串类型日志
	Error(msg string)

	// ErrorF 打印格式化内容日志
	ErrorF(formatter string, records ...interface{})

	ConsoleErrorF(formatter string, records ...interface{})

	// ErrorTemplate 打印模板类型日志
	ErrorTemplate(template string, models ...interface{})
}

Logger 日志对象

func GetCleanLogger

func GetCleanLogger(name string) Logger

GetCleanLogger 获取日志服务

func GetLogger

func GetLogger(name string) Logger

GetLogger 获取日志服务

type Logic

type Logic struct {

	// 名称
	Name string

	// 输入过滤器
	Before func(input interface{}) interface{}

	// 条件判断器
	Condition func(input interface{}) bool

	// 执行器
	Runner func(interface{}) interface{}

	// 输出过滤器, 返回结果类型
	After func(output interface{}) interface{}

	// 返回逻辑节点
	Selector func(logic *Logic, output interface{}) []*Logic

	// 子节点
	Children []*Logic
}

逻辑节点

func CreateLogic

func CreateLogic(name string, before func(input interface{}) interface{},
	condition func(input interface{}) bool, runner func(interface{}) interface{},
	after func(output interface{}) interface{}, selector func(logic *Logic, output interface{}) []*Logic) *Logic

type LogicResult

type LogicResult struct {

	// 流程名称
	Pipeline string `json:"pipeline"`

	// 逻辑节点名称
	Name string `json:"name"`

	// trace id
	Trace string `json:"trace"`

	// span id
	Span int `json:"span"`

	// 开始时间
	Start int64 `json:"start"`

	// 结束时间
	End int64 `json:"end"`

	// 执行结果
	Result string `json:"result"`
}

type MemoryInfo

type MemoryInfo struct {

	// 堆对象申请的总内存空间, 申请就会增长, 该值为累计值[bytes]
	TotalHeapAlloc uint64 `json:"totalHeapAlloc"`

	// 堆对象申请的总内存空间[bytes]
	HeapAlloc uint64 `json:"heapAlloc"`

	// 堆对象申请的总内存空间[bytes]
	Sys uint64 `json:"sys"`

	// 堆对象数量
	NumObjects uint64 `json:"numObjects"`

	// 释放的对对象数量
	NumFreeObjects uint64 `json:"numFreeObjects"`

	// cpu数量
	CpuCount int `json:"cpuCount"`

	// 当前 goroutine 数量
	NumGoroutines int `json:"numGoroutines"`

	// 当前进程cgo calls 数量
	NumCgoCalls int64 `json:"numCgoCalls"`

	NumGC uint32 `json:"numGc"`

	LastGC uint64 `json:"lastGc"`
}

func GetMemoryInfo

func GetMemoryInfo() MemoryInfo

type MessageHandler

type MessageHandler struct {
	// contains filtered or unexported fields
}

MessageHandler 消息发送通道

func CreateMessageHandler

func CreateMessageHandler(kafkaServers string, timeoutSeconds int) (MessageHandler, error)

CreateMessageHandler 创建消息发送通道

kafkaServers kafka broker 地址,使用,分隔集群

timeoutSeconds 超时时间, 单位秒

func (*MessageHandler) ClusterInfo

func (this *MessageHandler) ClusterInfo(brokerAddr string) ([]KafkaPartition, error)

ClusterInfo 获取kafka集群信息

func (*MessageHandler) RegisterConsumer

func (this *MessageHandler) RegisterConsumer(topic string, groupId string, cacheSeconds int, handler func([]kafka.Message))

RegisterConsumer 注册消息订阅

func (*MessageHandler) Send

func (this *MessageHandler) Send(messages ...kafka.Message) error

Send 发送多条消息

messages 多条消息

func (*MessageHandler) Stats

func (this *MessageHandler) Stats() MessageStats

Stats 获取消息统计信息

type MessageStats

type MessageStats struct {

	// KafkaServers 后端服务地址
	KafkaServers string

	// TimeoutSeconds 超时时间,单位 秒
	TimeoutSeconds int

	// writer统计信息
	kafka.WriterStats

	// 发送消息总量
	SendMessageCounter uint64

	// receiveMessageCounter 消息计数器
	ReceiveMessageCounter uint64

	// 启动时间
	StartTime time.Time
}

MessageStats 消息统计信息

转换为json需要进行二次封装

type MetricsData

type MetricsData struct {
	Key   string
	Value int64
	Tags  map[string]string
}

func GetRuntimeMetrics

func GetRuntimeMetrics(labels map[string]string) []MetricsData

type NetDevice

type NetDevice struct {
	Name string
	Ip   string
	Mac  string
}

func GetIpByInterface

func GetIpByInterface(interfaceNames ...string) (NetDevice, error)

GetIpByInterface 获取本机ip地址

type NetInfo

type NetInfo struct {
	Connections []string `json:"connections"` // 连入地址
	Interfaces  []string `json:"interfaces"`  // 网络地址列表
	Listens     []string `json:"listens"`     // 监听端口列表
	TimeWaits   []string `json:"time_waits"`  // time wait
	CloseWaits  []string `json:"close_waits"` // close wait
}

func GetNetInfo

func GetNetInfo() NetInfo

type OsMemoryInfo

type OsMemoryInfo struct {
	Total       uint64  `json:"total"`
	Available   uint64  `json:"available"`
	Used        uint64  `json:"used"`
	UsedPercent float64 `json:"usedPercent"`
}

func GetOsMemoryInfo

func GetOsMemoryInfo() OsMemoryInfo

type PipeLine

type PipeLine struct {

	// 名称
	Name string

	// 根逻辑节点
	Root *Logic

	// 总逻辑数(预估)
	Total int
}

流程

func CreatePipeline

func CreatePipeline(name string, root *Logic) *PipeLine

type PipelineManager

type PipelineManager struct {
	Results []*PipelineResult
	// contains filtered or unexported fields
}

func (*PipelineManager) Start

func (p *PipelineManager) Start(pipe PipeLine, input interface{})

type PipelineResult

type PipelineResult struct {

	// pipeline name
	Name string

	// start time
	Start int64

	// status
	Status string

	// 结束时间
	End int64

	// trace id
	Trace string

	// 当前span
	CurrentSpan int32

	// 当前逻辑
	CurrentLogic string
	// contains filtered or unexported fields
}

func (*PipelineResult) AddResult

func (p *PipelineResult) AddResult(l LogicResult)

func (*PipelineResult) Current

func (p *PipelineResult) Current(span int32, logic string)

func (*PipelineResult) Results

func (p *PipelineResult) Results() []LogicResult

type Root

type Root struct {
	Pointer   *html.Node
	NodeValue string
	Error     error
}

Root is a structure containing a pointer to an html node, the node value, and an error variable to return an error if one occurred

func HTMLParse

func HTMLParse(s string) Root

HTMLParse parses the HTML returning a start pointer to the DOM

func (Root) Attrs

func (r Root) Attrs() map[string]string

Attrs returns a map containing all attributes

func (Root) Children

func (r Root) Children() []Root

Children returns all direct children of this DOME element.

func (Root) Find

func (r Root) Find(args ...string) Root

Find finds the first occurrence of the given tag name, with or without attribute key and value specified, and returns a struct with a pointer to it

func (Root) FindAll

func (r Root) FindAll(args ...string) []Root

FindAll finds all occurrences of the given tag name, with or without key and value specified, and returns an array of structs, each having the respective pointers

func (Root) FindAllStrict

func (r Root) FindAllStrict(args ...string) []Root

FindAllStrict finds all occurrences of the given tag name only if all the values of the provided attribute are an exact match

func (Root) FindNextElementSibling

func (r Root) FindNextElementSibling() Root

FindNextElementSibling finds the next element sibling of the pointer in the DOM returning a struct with a pointer to it

func (Root) FindNextSibling

func (r Root) FindNextSibling() Root

FindNextSibling finds the next sibling of the pointer in the DOM returning a struct with a pointer to it

func (Root) FindPrevElementSibling

func (r Root) FindPrevElementSibling() Root

FindPrevElementSibling finds the previous element sibling of the pointer in the DOM returning a struct with a pointer to it

func (Root) FindPrevSibling

func (r Root) FindPrevSibling() Root

FindPrevSibling finds the previous sibling of the pointer in the DOM returning a struct with a pointer to it

func (Root) FindStrict

func (r Root) FindStrict(args ...string) Root

FindStrict finds the first occurrence of the given tag name only if all the values of the provided attribute are an exact match

func (Root) FullText

func (r Root) FullText() string

FullText returns the string inside even a nested element

func (Root) HTML

func (r Root) HTML() string

HTML returns the HTML code for the specific element

func (Root) Text

func (r Root) Text() string

Text returns the string inside a non-nested element

type ScheduleData

type ScheduleData struct {
	Name         string `json:"name"`
	TimeSchedule int    `json:"timeSchedule"`
	Status       string `json:"status"`

	Counter int64 `json:"counter"`
	// contains filtered or unexported fields
}

type Server

type Server struct {
	Host string
	Port int

	CrossDomain bool

	sync.RWMutex
	// contains filtered or unexported fields
}

Server对象

func GetGlobalServer

func GetGlobalServer() *Server

获取全局唯一Server

func NewServer

func NewServer(host string, port int) *Server

创建服务

func (*Server) EnableSwagger

func (t *Server) EnableSwagger(swaggerData *SwaggerData)

启动swagger服务

func (*Server) GetStatus

func (t *Server) GetStatus() int

func (*Server) RegisterDefaultIndex

func (t *Server) RegisterDefaultIndex(params DefaultIndexStruct)

RegisterDefaultIndex 注册默认的主页, link格式为: name,link DefaultIndex title, backgroundUrl headerLinks, centerContent, enterLink, poweredBy, footerLinks

func (*Server) RegisterFilter

func (t *Server) RegisterFilter(path string, handle func(Context) bool)

注册过滤器

handle : return false 拦截请求

func (*Server) RegisterFrontendDist

func (t *Server) RegisterFrontendDist(distPath string, prefix string)

结合 react 前端, 注册前端dist目录

func (*Server) RegisterHandler

func (t *Server) RegisterHandler(path string, handler func(Context))

注册服务

func (*Server) RegisterIndex

func (t *Server) RegisterIndex(handler func(Context))

注册首页

func (*Server) RegisterRestProcessor

func (t *Server) RegisterRestProcessor(processor func(model interface{}) interface{})

func (*Server) RegisterTemplate

func (t *Server) RegisterTemplate(filePath string)

注册模板服务

func (*Server) ServeHTTP

func (t *Server) ServeHTTP(w http.ResponseWriter, r *http.Request)

核心处理逻辑

func (*Server) SetI18n

func (t *Server) SetI18n(name string)

func (*Server) Start

func (t *Server) Start()

func (*Server) Static

func (t *Server) Static(path string)

设置静态文件目录

func (*Server) TemplateFunc

func (t *Server) TemplateFunc(name string, function interface{})

注册模板函数 warning: 请在设置模板目录前使用

type ServiceEndpoint

type ServiceEndpoint struct {

	// 运行时信息
	RuntimeInfo FullRuntimeInfo `json:"runtimeInfo"`

	// 服务名称
	Name string `json:"name"`

	// 服务状态
	Status string `json:"status"`

	// 服务属性
	Properties map[string]string `json:"properties"`

	// 注册时间
	RegisterTime time.Time
}

ServiceEndpoint 服务注册

type Session

type Session struct {
	sync.RWMutex
	// contains filtered or unexported fields
}

基于内存session

func (*Session) Get

func (t *Session) Get(key string) interface{}

func (*Session) Id

func (t *Session) Id() string

func (*Session) Set

func (t *Session) Set(key string, val interface{})

type SwaggerData

type SwaggerData struct {
	Title       string
	Version     string
	Description string
	Host        string
	BasePath    string
	Schemes     []string
	Apis        []*SwaggerPath
}

func SwaggerBuildModel

func SwaggerBuildModel(title string, desc string, version string) *SwaggerData

func (*SwaggerData) AddPath

func (thisSelf *SwaggerData) AddPath(path *SwaggerPath) *SwaggerData

func (*SwaggerData) AddPathList

func (thisSelf *SwaggerData) AddPathList(p []*SwaggerPath) *SwaggerData

type SwaggerParameter

type SwaggerParameter struct {
	Name        string
	Description string
	Example     interface{}
	Default     interface{}
	// formData, path, header, body, query
	In       string
	Required bool
}

type SwaggerPath

type SwaggerPath struct {
	Path                     string
	Group                    string
	Method                   string
	Description              string
	Parameters               []SwaggerParameter
	ResponseObjectProperties []SwaggerResponseProperty
}

func RegisterConfService

func RegisterConfService(conf Config, path string, hidden string) *SwaggerPath

func RegisterDbHandler

func RegisterDbHandler(d *Database, prefix string) []*SwaggerPath

RegisterDbHandler 注册数据库处理接口, 包含所有表的增删改查

返回Swagger对象

func RegisterEndpointService

func RegisterEndpointService(enableQuery bool, peers string, key string) ([]*SwaggerPath, map[string]ServiceEndpoint, *sync.RWMutex)

RegisterEndpointService 注册注册服务

enableQuery 是否启动注册中心查询服务

peers 伙伴, 使用, 分隔, 例如: http://192.168.0.11,https://10.21.0.1 key 是否有认证的key

func RegisterRuntimeInfoService

func RegisterRuntimeInfoService(path string, labels map[string]string,
	extendedMetrics func() []MetricsData, enableMetrics bool) []*SwaggerPath

func RegisterScheduleService

func RegisterScheduleService(path string) []*SwaggerPath

RegisterScheduleService 挂在schedule服务接口

path 以/开头的路径

return 返回 swagger 路径数组

func SwaggerBuildPath

func SwaggerBuildPath(path string, group string, method string, description string) *SwaggerPath

func (*SwaggerPath) AddParameter

func (thisSelf *SwaggerPath) AddParameter(param SwaggerParameter) *SwaggerPath

func (*SwaggerPath) AddResponseProperty

func (thisSelf *SwaggerPath) AddResponseProperty(param SwaggerResponseProperty) *SwaggerPath

type SwaggerResponseProperty

type SwaggerResponseProperty struct {
	Name string
	// string int ...
	Type        string
	Description string
}

type TableSchema

type TableSchema struct {
	Name    string                  `json:"name"`
	Columns map[string]ColumnSchema `json:"columns"`
}

TableSchema 表结构

type TaskInfo

type TaskInfo struct {
	Name    string `json:"name"`
	Timeout int    `json:"timeout"`
}

type TaskQueue

type TaskQueue struct {
	Name  string
	Queue []task

	Done               []string
	Errors             []string
	TaskQueueHistories map[int64][]TaskQueueHistory
	Times              int
	StartEpoch         int64
	EndEpoch           int64
	Todo               int
	Running            *task
	// contains filtered or unexported fields
}

func CreateTaskQueue

func CreateTaskQueue(name string) TaskQueue

CreateTaskQueue 创建任务队列框架(异步, 可监测, 完整运行记录)

func (*TaskQueue) AddTask

func (q *TaskQueue) AddTask(name string, timeoutSeconds int, runner func())

func (*TaskQueue) Continue

func (q *TaskQueue) Continue()

func (*TaskQueue) History

func (q *TaskQueue) History() map[int64][]TaskQueueHistory

func (*TaskQueue) Pause

func (q *TaskQueue) Pause()

func (*TaskQueue) Start

func (q *TaskQueue) Start() (error, chan string)

Start 执行一次任务队列, 异步

func (*TaskQueue) Status

func (q *TaskQueue) Status() TaskQueueInfo

func (*TaskQueue) Stop

func (q *TaskQueue) Stop()

type TaskQueueHistory

type TaskQueueHistory struct {
	SerialId   int    `json:"serialId"`
	Span       int    `json:"span"`
	Name       string `json:"name"`
	Result     string `json:"result"`
	StartEpoch int64  `json:"startEpoch"`
	EndEpoch   int64  `json:"endEpoch"`
}

type TaskQueueInfo

type TaskQueueInfo struct {
	Length     int        `json:"length"`
	Tasks      []TaskInfo `json:"tasks"`
	Done       []string   `json:"done"`
	Errors     []string   `json:"errors"`
	StartEpoch int64      `json:"startEpoch"`
	EndEpoch   int64      `json:"endEpoch"`
	Running    string     `json:"running"`
	Times      int        `json:"times"`
	Status     string     `json:"status"`
	Name       string     `json:"name"`
}

type TrieNode

type TrieNode struct {
	Path    string
	Handler func(Context) //root handler 为默认处理器
	Next    map[string]TrieNode
}

func NewTrieNode

func NewTrieNode(defaultHandler func(Context)) TrieNode

func (TrieNode) AddPath

func (this TrieNode) AddPath(path string, handler func(Context))

func (TrieNode) FindPath

func (this TrieNode) FindPath(path string) func(Context)

type VersionInfo

type VersionInfo struct {
	Dependencies   []map[string]string `json:"dependencies"`
	RuntimeVersion string              `json:"runtimeVersion"`
	Os             string              `json:"os"`
	OsArch         string              `json:"osArch"`
}

func GetVersionInfo

func GetVersionInfo() VersionInfo

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL