Content-Type: multipart/related; start=; boundary=----------2Q3EtUf5m7p0lpDki9qALT Content-Location: http://sandiego.craigslist.org/esd/msg/1215498564.html Subject: =?utf-8?Q?Expert=20Guitar=20Repair=20at=20the=20Taylor=20Factory?= MIME-Version: 1.0 ------------2Q3EtUf5m7p0lpDki9qALT Content-Disposition: inline; filename=1215498564.html Content-Type: text/html; charset=ISO-8859-1; name=1215498564.html Content-Id: Content-Location: http://sandiego.craigslist.org/esd/msg/1215498564.html Content-Transfer-Encoding: 8bit Expert Guitar Repair at the Taylor Factory
Avoid scams and fraud by dealing locally! Beware any deal involving Western Union, Moneygram, wire transfer, cashier check, money order, shipping, escrow, or any promise of transaction protection/certification/guarantee. More info

Expert Guitar Repair at the Taylor Factory (El Cajon)


Reply to: see below
Date: 2009-06-10, 4:25PM PDT


The Taylor Guitars Factory Service Center is opening its doors to all of San Diego. Located at Taylor’s El Cajon headquarters, the Taylor Factory Service Center is now accepting repairs for all Taylor models and all other brands of acoustic and electric guitars. Services include setups, fret work, structural repairs, and virtually any other type of repair. Most of the service packages offered for Taylors apply to other brands too. Click here to view service packages: http://media.taylorguitars.com/attachments/Service%20Packages3-08.pdf

Hours: Monday through Friday, 8:30 A.M. – 4 P.M. 1900 Gillespie Way, El Cajon, 92020. Call or stop by—no appointment necessary. 1-800-943-6782.



  • Location: El Cajon
  • it's NOT ok to contact this poster with services or other commercial interests
PostingID: 1215498564

No contact info? if the poster didn't include a phone number, email, or
other contact info, craigslist can notify them via email.


------------2Q3EtUf5m7p0lpDki9qALT Content-Disposition: inline; filename=craigslist.css Content-Type: text/css; name=craigslist.css Content-Location: http://www.craigslist.org/styles/craigslist.css Content-Transfer-Encoding: 8bit /* things we just want all the time */ body { background: white; } fieldset { background: #eee; } legend { font-weight: bold; font-family: sans-serif; font-size: small; } label { cursor: pointer; } form { margin: 0 } em { color: red; font-weight: bold; font-style: normal; } sup { font-size: x-small; } p { clear: both; } img { border: 0; } /* generic styles found sprinkled all over the place */ .sectionhead { background:#ddd; border:1px solid; padding:4px; font-weight: bold; font-family: serif; } .highlight { background: #ffc; font-family:sans-serif; padding: 6px; } .greytext { color: #777; font-size: x-small; font-weight: normal; font-family: serif; } .clfooter { text-align: center; font-size: small; list-style-type: none; } .clfooter li { display: inline; padding: 0 1em; } td.head { background: #eee; border: 1px solid #ccc; text-align: right; white-space: nowrap; } .bchead { background: #eee; padding: 3px; font-family: sans-serif; border-bottom: 2px #ccc solid; } /********** HELP PAGES **********/ .dropshadow { background: gray; float: left; margin-bottom: 10px; margin-right: 5px;} .dropshadow img { position: relative; right: 5px; top: -5px; border: 1px #333 solid; display:block; } .header { background: #ddd; font-weight: bold; } td.p { font-family: courier,monospace; width: 50%; font-size: small; } td.p pre { font-size: medium; } /********* HOMEPAGES *********/ body.hp { background: #f4f4f4; font-family: sans-serif; } .hp * { padding: 0; margin: 0; } .hp td, .hp a, .hp th { white-space:nowrap; } .hp a { text-decoration:none; } .hp a:hover { text-decoration:underline; color:purple; } .hp td { vertical-align: top; } .hp ul { list-style: none; } .hp .city td { font-size:70%; line-height: 1.43em; vertical-align: top; padding: 5px; } .hp .city h5 { background: #ddd; padding: 3px; font-size: 85%; font-weight: 300; } .hp .city h5.ctry { background: #ff9; border: 1px #ddd solid; } .hp .city ul { margin: 4px; } .hp .for { font-size:72%; } .hp .for a { background:#fff; padding: 1.0px; margin: 1.0px; } .hp .ban, .hp div.col h4 { background:#ddd; font-size:85%; text-align:center; font-weight:600; white-space: nowrap; } .hp div.col { clear: both; } .hp div.col ul { list-style: none; float: left; margin: 1px; margin-bottom: 1em; font-family: sans-serif; font-size: smaller; white-space: nowrap; } .hp div#forums ul { font-size: 72%; } .hp div#ccc ul { width: 48%; } .hp div#ppp ul { width: 100%; } .hp div#forums ul { width: 31.5%; } .hp div#hhh ul { width: 100%; } .hp ul#sss1 { width: 40%; } .hp ul#sss2 { width: 56%; } .hp div#bbb ul { width: 48%; } .hp ul#jjj1 { width: 100%; } .hp ul#ggg1 { width: 61%; } .hp ul#ggg2 { width: 34%; } .hp div.col ul li { background: #fff; padding: 1px; border-bottom: 1px #f4f4f4 solid; } .hp div.col ul li a { position: relative; width: 100%; } .hp #logo { background: #f4f4f4; font-size: 190%; font-weight: 500; font-family: serif; font-stretch: expanded; padding: 2px 0px 16px 3px; width: 100%; } .hp #leftbar { background: #ddd; text-align: center; } .hp #leftbar * { margin-left: auto; margin-right: auto; white-space: nowrap; } .hp #leftbar ul { padding: 4px; } .hp #leftbar li { background: #f4f4f4; font-size: smaller; padding: 2px; } .hp #leftlinks li { margin: 4px; } .hp .cal { font-size: smaller; margin: 0 10px; } .hp .cal th.ban { background: #eee; } .hp .cal .dys th { background:#aaa; color: white; font-weight:bold; text-align:center; } .hp .cal td { background: white; text-align: center; padding: 3px; } .hp .cal .tdy { background: #ff9; font-weight:bold; } .hp #postlks li { margin: 10px 4px; font-size: 90%; font-weight: 500; } .hp #search { margin: 10px; text-align: left; } .hp #search div { background: #f4f4f4; text-align: center; } .hp #search #query { width: 98%; } .hp #search select { width: 75%; } .hp #topban { height: 3em; white-space: nowrap; } .hp #topban div { background: #ddd; padding: 3px; } .hp #topban h2 { display: inline; font-weight: normal; font-family: serif; } .hp #alks td { background: #f4f4f4; } .hp #alks a { padding: 2px; font-size: smaller; } /**** TOCS ****/ .toc h4, .toc .sh { background: #eee; border-bottom: 2px solid #ccc; width: 90%; padding: 6px 25px; } .toc td, .toc a, .toc th, .toc .hl { white-space:nowrap; } .toc #messages { white-space: normal; text-align: right; } .toc dd, .toc dt { font-size:smaller; } .toc #ef a { font-weight: bold; } .toc .tabs, .toc #satabs { margin-top: 10px; font-size: smaller; } .toc .tabs b, .toc #satabs b { background: white; border-top: 2px #ccc solid; border-left: 2px #ccc solid; border-right: 2px #ccc solid; padding: 3px; padding-bottom: 5px; -moz-border-radius: 0.7em 0.7em 0 0; } .toc .tabs a, .toc #satabs a { border: 1px #ccc solid; padding: 4px; text-decoration: none; -moz-border-radius: 0.7em 0.7em 0 0; } .toc .tabs a:hover, .toc #satabs a:hover { background: #f7f7f7; padding: 3px; border: 2px #ccc solid; } .toc #sform { white-space: nowrap; background:#eee; border:1px solid #ccc; width: 90%; padding: 4px; } .toc #footer { width: 90%; } .toc #footer #copy { float: left; } .toc #footer #copy a { font-size: x-small; } .toc #footer .rss { float: right; text-align: right; } .toc #hideImgs { display: none; } .toc #showImgs { display: none; } .rss .l { background: orange; padding: 0px 2px; color: white; font-family: sans-serif; font-weight: bold; text-decoration: none; } .rss .y { font-size: x-small; } .toc #floater { position:absolute; overflow:hidden; visibility: hidden; z-index:999; display: none; } .toc #floater img { border: 2px solid #ccc; } .toc .row .ih { display: none; } .toc .row .i { float: left; width: 60px; height: 52px; clear: both; background-repeat: no-repeat; background-position: center center; } .toc .row .i img { border: 0; height: 50px; width: 50px; } .toc span.p { color: orange; font-size: smaller; } .toc .row .c { clear: both; } /************* POSTING PAGES *************/ #tsb { background: #ff9; font-size: small; margin-top: 1em; padding: 4px; } #tsb a { white-space: normal; font-style: italic; } #ef { float: right; } /* flag links on postings */ #flags { margin: 7px; padding: 7px; border: 2px #ccc solid; float: right; text-align: right; font-size: small; background: white; } #flags a.fl { padding-right: 8px; display: block; } #flags a.fl:visited { position: relative; } /* body blurbs*/ ul.blurbs { margin-left: 0px; padding-left: 10px; font-size: smaller; } /************ SIMPLE PAGES ************/ #fakePage { position: relative; } #sc { position: absolute; } #sc #banner { width: 9em; position: absolute; background: #ddd; padding: 4px; height: 100%; top: 0; left: 0; } #sc #banner #logo { text-align: center; margin-bottom: 8em; } #sc #banner #logo span { color: #009; font-size: 80%; font-family: verdana,sans-serif; font-weight: bold; } #sc #banner #logo a { font-size: 200%; } #sc #banner #update { font-size: xx-small; color: #444; padding: 12px; padding-bottom: 600px; } #sc #banner #prinfo { font-size: x-small; background: #ff9; padding: 4px; margin: 8px; margin-bottom: 3em; } #sc #content { margin-left: 11em; padding: 10px; } #sc #content p { clear: none; } /************ SOCIAL LINKS ************/ div#shareSocial { margin: 7px; padding: 7px; border: 2px #ccc solid; float: right; font-size: x-small; font-family: sans-serif; display: none; background: white; } div#shareSocial #sstitle { font-size: small; } div#shareSocial #ssmain { border-top: 2px #ccc solid; margin-top: 6px; } div#shareSocial #ssGetMore { padding: 2px 0 0 20px; } div#shareSocial a { color: #4c4c4c !important; text-decoration: none; line-height: 16px; margin: 3px; padding: 0 0 0 20px; background: url(/images/shareSocial.png) no-repeat top left; display: block; height: 16px; border-bottom: 1px #eee solid; } div#shareSocial a.more { display: none; } #shareSocial a#delicious { background-position: 0px -176px; } #shareSocial a#diigo { background-position: 0px -208px; } #shareSocial a#digg { background-position: 0px -192px; } #shareSocial a#email { background-position: 0px -224px; } #shareSocial a#facebook { background-position: 0px -240px; } #shareSocial a#friendfeed { background-position: 0px -304px; } #shareSocial a#mixx { background-position: 0px -464px; } #shareSocial a#myspace { background-position: 0px -496px; } #shareSocial a#stumbleupon { background-position: 0px -704px; } #shareSocial a#propellor { background-position: 0px -576px; } #shareSocial a#reddit { background-position: 0px -592px; } #shareSocial a#technorati { background-position: 0px -752px; } div#shareSocial a:hover { background-color: #eee; } /*************** POSTING PROCESS ***************/ #pp bc a {font-weight: bold; white-space: nowrap; } #pp span.imageLabel { font-size: smaller; font-family: sans-serif; } #pp #header { line-height: 1.5; } #pp input, #pp textarea { font-family: serif; } #pp span.std, #pp span.req, #pp span.err { font-weight: bold; } #pp span.req { color: green; } #pp span.err { color: red; } #pp input, #pp textarea { border: #ccc 1px solid; background: #fbfbfb } #pp input.req { border: green 1px solid; } #pp input.err, #pp textarea.err { border: red 2px solid; } #pp button { font-family: sans-serif; } #pp blockquote#thanks {font-family: sans-serif; } #pp blockquote#thanks div { background: #eee; padding: 12px; } #pp h5 { font-family: sans-serif; padding: 6px; border-bottom: 3px #aaa solid; } /* bye? */ #pp .highlight { margin: 10px; } #pp #map div { float: left; } #pp .title { white-space: nowrap; } #pp .title input { font-size: 1.3em; font-weight: bold; padding: 0 5px; } #pp .row div { float: left; padding: 0 5px; } #pp .posting { background:#f5f5f5; padding: 10px;} #pp #oiab { font-style: italic;} #pp #ed { white-space: nowrap; } #pp #ed p { float: left; clear: none; padding: 5px; } #imgtbl { min-width: 660px; } #imgtbl div { text-align: center; width: 300px; font-size: small; float: left; margin: 10px; } body.mceContentBody, body.mceContentBody td { font-size: inherit !important; font-family: inherit !important; } ------------2Q3EtUf5m7p0lpDki9qALT Content-Disposition: inline; filename=jquery.js Content-Type: application/x-javascript; name=jquery.js Content-Location: http://www.craigslist.org/js/jquery.js Content-Transfer-Encoding: Base64 KGZ1bmN0aW9uKCl7dmFyCndpbmRvdz10aGlzLHVuZGVmaW5lZCxfalF1ZXJ5PXdp bmRvdy5qUXVlcnksXyQ9d2luZG93LiQsalF1ZXJ5PXdpbmRvdy5qUXVlcnk9d2lu ZG93LiQ9ZnVuY3Rpb24oc2VsZWN0b3IsY29udGV4dCl7cmV0dXJuIG5ldyBqUXVl cnkuZm4uaW5pdChzZWxlY3Rvcixjb250ZXh0KTt9LHF1aWNrRXhwcj0vXltePF0q KDwoLnxccykrPilbXj5dKiR8XiMoW1x3LV0rKSQvLGlzU2ltcGxlPS9eLlteOiNc W1wuLF0qJC87alF1ZXJ5LmZuPWpRdWVyeS5wcm90b3R5cGU9e2luaXQ6ZnVuY3Rp b24oc2VsZWN0b3IsY29udGV4dCl7c2VsZWN0b3I9c2VsZWN0b3J8fGRvY3VtZW50 O2lmKHNlbGVjdG9yLm5vZGVUeXBlKXt0aGlzWzBdPXNlbGVjdG9yO3RoaXMubGVu Z3RoPTE7dGhpcy5jb250ZXh0PXNlbGVjdG9yO3JldHVybiB0aGlzO30KaWYodHlw ZW9mIHNlbGVjdG9yPT09InN0cmluZyIpe3ZhciBtYXRjaD1xdWlja0V4cHIuZXhl YyhzZWxlY3Rvcik7aWYobWF0Y2gmJihtYXRjaFsxXXx8IWNvbnRleHQpKXtpZiht YXRjaFsxXSkKc2VsZWN0b3I9alF1ZXJ5LmNsZWFuKFttYXRjaFsxXV0sY29udGV4 dCk7ZWxzZXt2YXIgZWxlbT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChtYXRjaFsz XSk7aWYoZWxlbSYmZWxlbS5pZCE9bWF0Y2hbM10pCnJldHVybiBqUXVlcnkoKS5m aW5kKHNlbGVjdG9yKTt2YXIgcmV0PWpRdWVyeShlbGVtfHxbXSk7cmV0LmNvbnRl eHQ9ZG9jdW1lbnQ7cmV0LnNlbGVjdG9yPXNlbGVjdG9yO3JldHVybiByZXQ7fQp9 ZWxzZQpyZXR1cm4galF1ZXJ5KGNvbnRleHQpLmZpbmQoc2VsZWN0b3IpO31lbHNl IGlmKGpRdWVyeS5pc0Z1bmN0aW9uKHNlbGVjdG9yKSkKcmV0dXJuIGpRdWVyeShk b2N1bWVudCkucmVhZHkoc2VsZWN0b3IpO2lmKHNlbGVjdG9yLnNlbGVjdG9yJiZz ZWxlY3Rvci5jb250ZXh0KXt0aGlzLnNlbGVjdG9yPXNlbGVjdG9yLnNlbGVjdG9y O3RoaXMuY29udGV4dD1zZWxlY3Rvci5jb250ZXh0O30KcmV0dXJuIHRoaXMuc2V0 QXJyYXkoalF1ZXJ5Lm1ha2VBcnJheShzZWxlY3RvcikpO30sc2VsZWN0b3I6IiIs anF1ZXJ5OiIxLjMuMSIsc2l6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmxlbmd0 aDt9LGdldDpmdW5jdGlvbihudW0pe3JldHVybiBudW09PT11bmRlZmluZWQ/alF1 ZXJ5Lm1ha2VBcnJheSh0aGlzKTp0aGlzW251bV07fSxwdXNoU3RhY2s6ZnVuY3Rp b24oZWxlbXMsbmFtZSxzZWxlY3Rvcil7dmFyIHJldD1qUXVlcnkoZWxlbXMpO3Jl dC5wcmV2T2JqZWN0PXRoaXM7cmV0LmNvbnRleHQ9dGhpcy5jb250ZXh0O2lmKG5h bWU9PT0iZmluZCIpCnJldC5zZWxlY3Rvcj10aGlzLnNlbGVjdG9yKyh0aGlzLnNl bGVjdG9yPyIgIjoiIikrc2VsZWN0b3I7ZWxzZSBpZihuYW1lKQpyZXQuc2VsZWN0 b3I9dGhpcy5zZWxlY3RvcisiLiIrbmFtZSsiKCIrc2VsZWN0b3IrIikiO3JldHVy biByZXQ7fSxzZXRBcnJheTpmdW5jdGlvbihlbGVtcyl7dGhpcy5sZW5ndGg9MDtB cnJheS5wcm90b3R5cGUucHVzaC5hcHBseSh0aGlzLGVsZW1zKTtyZXR1cm4gdGhp czt9LGVhY2g6ZnVuY3Rpb24oY2FsbGJhY2ssYXJncyl7cmV0dXJuIGpRdWVyeS5l YWNoKHRoaXMsY2FsbGJhY2ssYXJncyk7fSxpbmRleDpmdW5jdGlvbihlbGVtKXty ZXR1cm4galF1ZXJ5LmluQXJyYXkoZWxlbSYmZWxlbS5qcXVlcnk/ZWxlbVswXTpl bGVtLHRoaXMpO30sYXR0cjpmdW5jdGlvbihuYW1lLHZhbHVlLHR5cGUpe3ZhciBv cHRpb25zPW5hbWU7aWYodHlwZW9mIG5hbWU9PT0ic3RyaW5nIikKaWYodmFsdWU9 PT11bmRlZmluZWQpCnJldHVybiB0aGlzWzBdJiZqUXVlcnlbdHlwZXx8ImF0dHIi XSh0aGlzWzBdLG5hbWUpO2Vsc2V7b3B0aW9ucz17fTtvcHRpb25zW25hbWVdPXZh bHVlO30KcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKXtmb3IobmFtZSBpbiBv cHRpb25zKQpqUXVlcnkuYXR0cih0eXBlP3RoaXMuc3R5bGU6dGhpcyxuYW1lLGpR dWVyeS5wcm9wKHRoaXMsb3B0aW9uc1tuYW1lXSx0eXBlLGksbmFtZSkpO30pO30s Y3NzOmZ1bmN0aW9uKGtleSx2YWx1ZSl7aWYoKGtleT09J3dpZHRoJ3x8a2V5PT0n aGVpZ2h0JykmJnBhcnNlRmxvYXQodmFsdWUpPDApCnZhbHVlPXVuZGVmaW5lZDty ZXR1cm4gdGhpcy5hdHRyKGtleSx2YWx1ZSwiY3VyQ1NTIik7fSx0ZXh0OmZ1bmN0 aW9uKHRleHQpe2lmKHR5cGVvZiB0ZXh0IT09Im9iamVjdCImJnRleHQhPW51bGwp CnJldHVybiB0aGlzLmVtcHR5KCkuYXBwZW5kKCh0aGlzWzBdJiZ0aGlzWzBdLm93 bmVyRG9jdW1lbnR8fGRvY3VtZW50KS5jcmVhdGVUZXh0Tm9kZSh0ZXh0KSk7dmFy IHJldD0iIjtqUXVlcnkuZWFjaCh0ZXh0fHx0aGlzLGZ1bmN0aW9uKCl7alF1ZXJ5 LmVhY2godGhpcy5jaGlsZE5vZGVzLGZ1bmN0aW9uKCl7aWYodGhpcy5ub2RlVHlw ZSE9OCkKcmV0Kz10aGlzLm5vZGVUeXBlIT0xP3RoaXMubm9kZVZhbHVlOmpRdWVy eS5mbi50ZXh0KFt0aGlzXSk7fSk7fSk7cmV0dXJuIHJldDt9LHdyYXBBbGw6ZnVu Y3Rpb24oaHRtbCl7aWYodGhpc1swXSl7dmFyIHdyYXA9alF1ZXJ5KGh0bWwsdGhp c1swXS5vd25lckRvY3VtZW50KS5jbG9uZSgpO2lmKHRoaXNbMF0ucGFyZW50Tm9k ZSkKd3JhcC5pbnNlcnRCZWZvcmUodGhpc1swXSk7d3JhcC5tYXAoZnVuY3Rpb24o KXt2YXIgZWxlbT10aGlzO3doaWxlKGVsZW0uZmlyc3RDaGlsZCkKZWxlbT1lbGVt LmZpcnN0Q2hpbGQ7cmV0dXJuIGVsZW07fSkuYXBwZW5kKHRoaXMpO30KcmV0dXJu IHRoaXM7fSx3cmFwSW5uZXI6ZnVuY3Rpb24oaHRtbCl7cmV0dXJuIHRoaXMuZWFj aChmdW5jdGlvbigpe2pRdWVyeSh0aGlzKS5jb250ZW50cygpLndyYXBBbGwoaHRt bCk7fSk7fSx3cmFwOmZ1bmN0aW9uKGh0bWwpe3JldHVybiB0aGlzLmVhY2goZnVu Y3Rpb24oKXtqUXVlcnkodGhpcykud3JhcEFsbChodG1sKTt9KTt9LGFwcGVuZDpm dW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyx0cnVlLGZ1 bmN0aW9uKGVsZW0pe2lmKHRoaXMubm9kZVR5cGU9PTEpCnRoaXMuYXBwZW5kQ2hp bGQoZWxlbSk7fSk7fSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9t TWFuaXAoYXJndW1lbnRzLHRydWUsZnVuY3Rpb24oZWxlbSl7aWYodGhpcy5ub2Rl VHlwZT09MSkKdGhpcy5pbnNlcnRCZWZvcmUoZWxlbSx0aGlzLmZpcnN0Q2hpbGQp O30pO30sYmVmb3JlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJn dW1lbnRzLGZhbHNlLGZ1bmN0aW9uKGVsZW0pe3RoaXMucGFyZW50Tm9kZS5pbnNl cnRCZWZvcmUoZWxlbSx0aGlzKTt9KTt9LGFmdGVyOmZ1bmN0aW9uKCl7cmV0dXJu IHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZhbHNlLGZ1bmN0aW9uKGVsZW0pe3Ro aXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZWxlbSx0aGlzLm5leHRTaWJsaW5n KTt9KTt9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByZXZPYmplY3R8fGpR dWVyeShbXSk7fSxwdXNoOltdLnB1c2gsZmluZDpmdW5jdGlvbihzZWxlY3Rvcil7 aWYodGhpcy5sZW5ndGg9PT0xJiYhLywvLnRlc3Qoc2VsZWN0b3IpKXt2YXIgcmV0 PXRoaXMucHVzaFN0YWNrKFtdLCJmaW5kIixzZWxlY3Rvcik7cmV0Lmxlbmd0aD0w O2pRdWVyeS5maW5kKHNlbGVjdG9yLHRoaXNbMF0scmV0KTtyZXR1cm4gcmV0O31l bHNle3ZhciBlbGVtcz1qUXVlcnkubWFwKHRoaXMsZnVuY3Rpb24oZWxlbSl7cmV0 dXJuIGpRdWVyeS5maW5kKHNlbGVjdG9yLGVsZW0pO30pO3JldHVybiB0aGlzLnB1 c2hTdGFjaygvW14rPl0gW14rPl0vLnRlc3Qoc2VsZWN0b3IpP2pRdWVyeS51bmlx dWUoZWxlbXMpOmVsZW1zLCJmaW5kIixzZWxlY3Rvcik7fX0sY2xvbmU6ZnVuY3Rp b24oZXZlbnRzKXt2YXIgcmV0PXRoaXMubWFwKGZ1bmN0aW9uKCl7aWYoIWpRdWVy eS5zdXBwb3J0Lm5vQ2xvbmVFdmVudCYmIWpRdWVyeS5pc1hNTERvYyh0aGlzKSl7 dmFyIGNsb25lPXRoaXMuY2xvbmVOb2RlKHRydWUpLGNvbnRhaW5lcj1kb2N1bWVu dC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjb250YWluZXIuYXBwZW5kQ2hpbGQoY2xv bmUpO3JldHVybiBqUXVlcnkuY2xlYW4oW2NvbnRhaW5lci5pbm5lckhUTUxdKVsw XTt9ZWxzZQpyZXR1cm4gdGhpcy5jbG9uZU5vZGUodHJ1ZSk7fSk7dmFyIGNsb25l PXJldC5maW5kKCIqIikuYW5kU2VsZigpLmVhY2goZnVuY3Rpb24oKXtpZih0aGlz W2V4cGFuZG9dIT09dW5kZWZpbmVkKQp0aGlzW2V4cGFuZG9dPW51bGw7fSk7aWYo ZXZlbnRzPT09dHJ1ZSkKdGhpcy5maW5kKCIqIikuYW5kU2VsZigpLmVhY2goZnVu Y3Rpb24oaSl7aWYodGhpcy5ub2RlVHlwZT09MykKcmV0dXJuO3ZhciBldmVudHM9 alF1ZXJ5LmRhdGEodGhpcywiZXZlbnRzIik7Zm9yKHZhciB0eXBlIGluIGV2ZW50 cykKZm9yKHZhciBoYW5kbGVyIGluIGV2ZW50c1t0eXBlXSkKalF1ZXJ5LmV2ZW50 LmFkZChjbG9uZVtpXSx0eXBlLGV2ZW50c1t0eXBlXVtoYW5kbGVyXSxldmVudHNb dHlwZV1baGFuZGxlcl0uZGF0YSk7fSk7cmV0dXJuIHJldDt9LGZpbHRlcjpmdW5j dGlvbihzZWxlY3Rvcil7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGpRdWVyeS5pc0Z1 bmN0aW9uKHNlbGVjdG9yKSYmalF1ZXJ5LmdyZXAodGhpcyxmdW5jdGlvbihlbGVt LGkpe3JldHVybiBzZWxlY3Rvci5jYWxsKGVsZW0saSk7fSl8fGpRdWVyeS5tdWx0 aUZpbHRlcihzZWxlY3RvcixqUXVlcnkuZ3JlcCh0aGlzLGZ1bmN0aW9uKGVsZW0p e3JldHVybiBlbGVtLm5vZGVUeXBlPT09MTt9KSksImZpbHRlciIsc2VsZWN0b3Ip O30sY2xvc2VzdDpmdW5jdGlvbihzZWxlY3Rvcil7dmFyIHBvcz1qUXVlcnkuZXhw ci5tYXRjaC5QT1MudGVzdChzZWxlY3Rvcik/alF1ZXJ5KHNlbGVjdG9yKTpudWxs O3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBjdXI9dGhpczt3aGlsZShj dXImJmN1ci5vd25lckRvY3VtZW50KXtpZihwb3M/cG9zLmluZGV4KGN1cik+LTE6 alF1ZXJ5KGN1cikuaXMoc2VsZWN0b3IpKQpyZXR1cm4gY3VyO2N1cj1jdXIucGFy ZW50Tm9kZTt9fSk7fSxub3Q6ZnVuY3Rpb24oc2VsZWN0b3Ipe2lmKHR5cGVvZiBz ZWxlY3Rvcj09PSJzdHJpbmciKQppZihpc1NpbXBsZS50ZXN0KHNlbGVjdG9yKSkK cmV0dXJuIHRoaXMucHVzaFN0YWNrKGpRdWVyeS5tdWx0aUZpbHRlcihzZWxlY3Rv cix0aGlzLHRydWUpLCJub3QiLHNlbGVjdG9yKTtlbHNlCnNlbGVjdG9yPWpRdWVy eS5tdWx0aUZpbHRlcihzZWxlY3Rvcix0aGlzKTt2YXIgaXNBcnJheUxpa2U9c2Vs ZWN0b3IubGVuZ3RoJiZzZWxlY3RvcltzZWxlY3Rvci5sZW5ndGgtMV0hPT11bmRl ZmluZWQmJiFzZWxlY3Rvci5ub2RlVHlwZTtyZXR1cm4gdGhpcy5maWx0ZXIoZnVu Y3Rpb24oKXtyZXR1cm4gaXNBcnJheUxpa2U/alF1ZXJ5LmluQXJyYXkodGhpcyxz ZWxlY3Rvcik8MDp0aGlzIT1zZWxlY3Rvcjt9KTt9LGFkZDpmdW5jdGlvbihzZWxl Y3Rvcil7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGpRdWVyeS51bmlxdWUoalF1ZXJ5 Lm1lcmdlKHRoaXMuZ2V0KCksdHlwZW9mIHNlbGVjdG9yPT09InN0cmluZyI/alF1 ZXJ5KHNlbGVjdG9yKTpqUXVlcnkubWFrZUFycmF5KHNlbGVjdG9yKSkpKTt9LGlz OmZ1bmN0aW9uKHNlbGVjdG9yKXtyZXR1cm4hIXNlbGVjdG9yJiZqUXVlcnkubXVs dGlGaWx0ZXIoc2VsZWN0b3IsdGhpcykubGVuZ3RoPjA7fSxoYXNDbGFzczpmdW5j dGlvbihzZWxlY3Rvcil7cmV0dXJuISFzZWxlY3RvciYmdGhpcy5pcygiLiIrc2Vs ZWN0b3IpO30sdmFsOmZ1bmN0aW9uKHZhbHVlKXtpZih2YWx1ZT09PXVuZGVmaW5l ZCl7dmFyIGVsZW09dGhpc1swXTtpZihlbGVtKXtpZihqUXVlcnkubm9kZU5hbWUo ZWxlbSwnb3B0aW9uJykpCnJldHVybihlbGVtLmF0dHJpYnV0ZXMudmFsdWV8fHt9 KS5zcGVjaWZpZWQ/ZWxlbS52YWx1ZTplbGVtLnRleHQ7aWYoalF1ZXJ5Lm5vZGVO YW1lKGVsZW0sInNlbGVjdCIpKXt2YXIgaW5kZXg9ZWxlbS5zZWxlY3RlZEluZGV4 LHZhbHVlcz1bXSxvcHRpb25zPWVsZW0ub3B0aW9ucyxvbmU9ZWxlbS50eXBlPT0i c2VsZWN0LW9uZSI7aWYoaW5kZXg8MCkKcmV0dXJuIG51bGw7Zm9yKHZhciBpPW9u ZT9pbmRleDowLG1heD1vbmU/aW5kZXgrMTpvcHRpb25zLmxlbmd0aDtpPG1heDtp Kyspe3ZhciBvcHRpb249b3B0aW9uc1tpXTtpZihvcHRpb24uc2VsZWN0ZWQpe3Zh bHVlPWpRdWVyeShvcHRpb24pLnZhbCgpO2lmKG9uZSkKcmV0dXJuIHZhbHVlO3Zh bHVlcy5wdXNoKHZhbHVlKTt9fQpyZXR1cm4gdmFsdWVzO30KcmV0dXJuKGVsZW0u dmFsdWV8fCIiKS5yZXBsYWNlKC9cci9nLCIiKTt9CnJldHVybiB1bmRlZmluZWQ7 fQppZih0eXBlb2YgdmFsdWU9PT0ibnVtYmVyIikKdmFsdWUrPScnO3JldHVybiB0 aGlzLmVhY2goZnVuY3Rpb24oKXtpZih0aGlzLm5vZGVUeXBlIT0xKQpyZXR1cm47 aWYoalF1ZXJ5LmlzQXJyYXkodmFsdWUpJiYvcmFkaW98Y2hlY2tib3gvLnRlc3Qo dGhpcy50eXBlKSkKdGhpcy5jaGVja2VkPShqUXVlcnkuaW5BcnJheSh0aGlzLnZh bHVlLHZhbHVlKT49MHx8alF1ZXJ5LmluQXJyYXkodGhpcy5uYW1lLHZhbHVlKT49 MCk7ZWxzZSBpZihqUXVlcnkubm9kZU5hbWUodGhpcywic2VsZWN0Iikpe3ZhciB2 YWx1ZXM9alF1ZXJ5Lm1ha2VBcnJheSh2YWx1ZSk7alF1ZXJ5KCJvcHRpb24iLHRo aXMpLmVhY2goZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkPShqUXVlcnkuaW5BcnJh eSh0aGlzLnZhbHVlLHZhbHVlcyk+PTB8fGpRdWVyeS5pbkFycmF5KHRoaXMudGV4 dCx2YWx1ZXMpPj0wKTt9KTtpZighdmFsdWVzLmxlbmd0aCkKdGhpcy5zZWxlY3Rl ZEluZGV4PS0xO31lbHNlCnRoaXMudmFsdWU9dmFsdWU7fSk7fSxodG1sOmZ1bmN0 aW9uKHZhbHVlKXtyZXR1cm4gdmFsdWU9PT11bmRlZmluZWQ/KHRoaXNbMF0/dGhp c1swXS5pbm5lckhUTUw6bnVsbCk6dGhpcy5lbXB0eSgpLmFwcGVuZCh2YWx1ZSk7 fSxyZXBsYWNlV2l0aDpmdW5jdGlvbih2YWx1ZSl7cmV0dXJuIHRoaXMuYWZ0ZXIo dmFsdWUpLnJlbW92ZSgpO30sZXE6ZnVuY3Rpb24oaSl7cmV0dXJuIHRoaXMuc2xp Y2UoaSwraSsxKTt9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0 YWNrKEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseSh0aGlzLGFyZ3VtZW50cyks InNsaWNlIixBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLmpv aW4oIiwiKSk7fSxtYXA6ZnVuY3Rpb24oY2FsbGJhY2spe3JldHVybiB0aGlzLnB1 c2hTdGFjayhqUXVlcnkubWFwKHRoaXMsZnVuY3Rpb24oZWxlbSxpKXtyZXR1cm4g Y2FsbGJhY2suY2FsbChlbGVtLGksZWxlbSk7fSkpO30sYW5kU2VsZjpmdW5jdGlv bigpe3JldHVybiB0aGlzLmFkZCh0aGlzLnByZXZPYmplY3QpO30sZG9tTWFuaXA6 ZnVuY3Rpb24oYXJncyx0YWJsZSxjYWxsYmFjayl7aWYodGhpc1swXSl7dmFyIGZy YWdtZW50PSh0aGlzWzBdLm93bmVyRG9jdW1lbnR8fHRoaXNbMF0pLmNyZWF0ZURv Y3VtZW50RnJhZ21lbnQoKSxzY3JpcHRzPWpRdWVyeS5jbGVhbihhcmdzLCh0aGlz WzBdLm93bmVyRG9jdW1lbnR8fHRoaXNbMF0pLGZyYWdtZW50KSxmaXJzdD1mcmFn bWVudC5maXJzdENoaWxkLGV4dHJhPXRoaXMubGVuZ3RoPjE/ZnJhZ21lbnQuY2xv bmVOb2RlKHRydWUpOmZyYWdtZW50O2lmKGZpcnN0KQpmb3IodmFyIGk9MCxsPXRo aXMubGVuZ3RoO2k8bDtpKyspCmNhbGxiYWNrLmNhbGwocm9vdCh0aGlzW2ldLGZp cnN0KSxpPjA/ZXh0cmEuY2xvbmVOb2RlKHRydWUpOmZyYWdtZW50KTtpZihzY3Jp cHRzKQpqUXVlcnkuZWFjaChzY3JpcHRzLGV2YWxTY3JpcHQpO30KcmV0dXJuIHRo aXM7ZnVuY3Rpb24gcm9vdChlbGVtLGN1cil7cmV0dXJuIHRhYmxlJiZqUXVlcnku bm9kZU5hbWUoZWxlbSwidGFibGUiKSYmalF1ZXJ5Lm5vZGVOYW1lKGN1ciwidHIi KT8oZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8ZWxlbS5h cHBlbmRDaGlsZChlbGVtLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJv ZHkiKSkpOmVsZW07fX19O2pRdWVyeS5mbi5pbml0LnByb3RvdHlwZT1qUXVlcnku Zm47ZnVuY3Rpb24gZXZhbFNjcmlwdChpLGVsZW0pe2lmKGVsZW0uc3JjKQpqUXVl cnkuYWpheCh7dXJsOmVsZW0uc3JjLGFzeW5jOmZhbHNlLGRhdGFUeXBlOiJzY3Jp cHQifSk7ZWxzZQpqUXVlcnkuZ2xvYmFsRXZhbChlbGVtLnRleHR8fGVsZW0udGV4 dENvbnRlbnR8fGVsZW0uaW5uZXJIVE1MfHwiIik7aWYoZWxlbS5wYXJlbnROb2Rl KQplbGVtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbSk7fQpmdW5jdGlvbiBu b3coKXtyZXR1cm4rbmV3IERhdGU7fQpqUXVlcnkuZXh0ZW5kPWpRdWVyeS5mbi5l eHRlbmQ9ZnVuY3Rpb24oKXt2YXIgdGFyZ2V0PWFyZ3VtZW50c1swXXx8e30saT0x LGxlbmd0aD1hcmd1bWVudHMubGVuZ3RoLGRlZXA9ZmFsc2Usb3B0aW9ucztpZih0 eXBlb2YgdGFyZ2V0PT09ImJvb2xlYW4iKXtkZWVwPXRhcmdldDt0YXJnZXQ9YXJn dW1lbnRzWzFdfHx7fTtpPTI7fQppZih0eXBlb2YgdGFyZ2V0IT09Im9iamVjdCIm JiFqUXVlcnkuaXNGdW5jdGlvbih0YXJnZXQpKQp0YXJnZXQ9e307aWYobGVuZ3Ro PT1pKXt0YXJnZXQ9dGhpczstLWk7fQpmb3IoO2k8bGVuZ3RoO2krKykKaWYoKG9w dGlvbnM9YXJndW1lbnRzW2ldKSE9bnVsbCkKZm9yKHZhciBuYW1lIGluIG9wdGlv bnMpe3ZhciBzcmM9dGFyZ2V0W25hbWVdLGNvcHk9b3B0aW9uc1tuYW1lXTtpZih0 YXJnZXQ9PT1jb3B5KQpjb250aW51ZTtpZihkZWVwJiZjb3B5JiZ0eXBlb2YgY29w eT09PSJvYmplY3QiJiYhY29weS5ub2RlVHlwZSkKdGFyZ2V0W25hbWVdPWpRdWVy eS5leHRlbmQoZGVlcCxzcmN8fChjb3B5Lmxlbmd0aCE9bnVsbD9bXTp7fSksY29w eSk7ZWxzZSBpZihjb3B5IT09dW5kZWZpbmVkKQp0YXJnZXRbbmFtZV09Y29weTt9 CnJldHVybiB0YXJnZXQ7fTt2YXIJZXhjbHVkZT0vei0/aW5kZXh8Zm9udC0/d2Vp Z2h0fG9wYWNpdHl8em9vbXxsaW5lLT9oZWlnaHQvaSxkZWZhdWx0Vmlldz1kb2N1 bWVudC5kZWZhdWx0Vmlld3x8e30sdG9TdHJpbmc9T2JqZWN0LnByb3RvdHlwZS50 b1N0cmluZztqUXVlcnkuZXh0ZW5kKHtub0NvbmZsaWN0OmZ1bmN0aW9uKGRlZXAp e3dpbmRvdy4kPV8kO2lmKGRlZXApCndpbmRvdy5qUXVlcnk9X2pRdWVyeTtyZXR1 cm4galF1ZXJ5O30saXNGdW5jdGlvbjpmdW5jdGlvbihvYmope3JldHVybiB0b1N0 cmluZy5jYWxsKG9iaik9PT0iW29iamVjdCBGdW5jdGlvbl0iO30saXNBcnJheTpm dW5jdGlvbihvYmope3JldHVybiB0b1N0cmluZy5jYWxsKG9iaik9PT0iW29iamVj dCBBcnJheV0iO30saXNYTUxEb2M6ZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGVsZW0u bm9kZVR5cGU9PT05JiZlbGVtLmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSE9PSJI VE1MInx8ISFlbGVtLm93bmVyRG9jdW1lbnQmJmpRdWVyeS5pc1hNTERvYyhlbGVt Lm93bmVyRG9jdW1lbnQpO30sZ2xvYmFsRXZhbDpmdW5jdGlvbihkYXRhKXtkYXRh PWpRdWVyeS50cmltKGRhdGEpO2lmKGRhdGEpe3ZhciBoZWFkPWRvY3VtZW50Lmdl dEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGRvY3VtZW50LmRvY3VtZW50 RWxlbWVudCxzY3JpcHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7 c2NyaXB0LnR5cGU9InRleHQvamF2YXNjcmlwdCI7aWYoalF1ZXJ5LnN1cHBvcnQu c2NyaXB0RXZhbCkKc2NyaXB0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRl eHROb2RlKGRhdGEpKTtlbHNlCnNjcmlwdC50ZXh0PWRhdGE7aGVhZC5pbnNlcnRC ZWZvcmUoc2NyaXB0LGhlYWQuZmlyc3RDaGlsZCk7aGVhZC5yZW1vdmVDaGlsZChz Y3JpcHQpO319LG5vZGVOYW1lOmZ1bmN0aW9uKGVsZW0sbmFtZSl7cmV0dXJuIGVs ZW0ubm9kZU5hbWUmJmVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKT09bmFtZS50 b1VwcGVyQ2FzZSgpO30sZWFjaDpmdW5jdGlvbihvYmplY3QsY2FsbGJhY2ssYXJn cyl7dmFyIG5hbWUsaT0wLGxlbmd0aD1vYmplY3QubGVuZ3RoO2lmKGFyZ3Mpe2lm KGxlbmd0aD09PXVuZGVmaW5lZCl7Zm9yKG5hbWUgaW4gb2JqZWN0KQppZihjYWxs YmFjay5hcHBseShvYmplY3RbbmFtZV0sYXJncyk9PT1mYWxzZSkKYnJlYWs7fWVs c2UKZm9yKDtpPGxlbmd0aDspCmlmKGNhbGxiYWNrLmFwcGx5KG9iamVjdFtpKytd LGFyZ3MpPT09ZmFsc2UpCmJyZWFrO31lbHNle2lmKGxlbmd0aD09PXVuZGVmaW5l ZCl7Zm9yKG5hbWUgaW4gb2JqZWN0KQppZihjYWxsYmFjay5jYWxsKG9iamVjdFtu YW1lXSxuYW1lLG9iamVjdFtuYW1lXSk9PT1mYWxzZSkKYnJlYWs7fWVsc2UKZm9y KHZhciB2YWx1ZT1vYmplY3RbMF07aTxsZW5ndGgmJmNhbGxiYWNrLmNhbGwodmFs dWUsaSx2YWx1ZSkhPT1mYWxzZTt2YWx1ZT1vYmplY3RbKytpXSl7fX0KcmV0dXJu IG9iamVjdDt9LHByb3A6ZnVuY3Rpb24oZWxlbSx2YWx1ZSx0eXBlLGksbmFtZSl7 aWYoalF1ZXJ5LmlzRnVuY3Rpb24odmFsdWUpKQp2YWx1ZT12YWx1ZS5jYWxsKGVs ZW0saSk7cmV0dXJuIHR5cGVvZiB2YWx1ZT09PSJudW1iZXIiJiZ0eXBlPT0iY3Vy Q1NTIiYmIWV4Y2x1ZGUudGVzdChuYW1lKT92YWx1ZSsicHgiOnZhbHVlO30sY2xh c3NOYW1lOnthZGQ6ZnVuY3Rpb24oZWxlbSxjbGFzc05hbWVzKXtqUXVlcnkuZWFj aCgoY2xhc3NOYW1lc3x8IiIpLnNwbGl0KC9ccysvKSxmdW5jdGlvbihpLGNsYXNz TmFtZSl7aWYoZWxlbS5ub2RlVHlwZT09MSYmIWpRdWVyeS5jbGFzc05hbWUuaGFz KGVsZW0uY2xhc3NOYW1lLGNsYXNzTmFtZSkpCmVsZW0uY2xhc3NOYW1lKz0oZWxl bS5jbGFzc05hbWU/IiAiOiIiKStjbGFzc05hbWU7fSk7fSxyZW1vdmU6ZnVuY3Rp b24oZWxlbSxjbGFzc05hbWVzKXtpZihlbGVtLm5vZGVUeXBlPT0xKQplbGVtLmNs YXNzTmFtZT1jbGFzc05hbWVzIT09dW5kZWZpbmVkP2pRdWVyeS5ncmVwKGVsZW0u Y2xhc3NOYW1lLnNwbGl0KC9ccysvKSxmdW5jdGlvbihjbGFzc05hbWUpe3JldHVy biFqUXVlcnkuY2xhc3NOYW1lLmhhcyhjbGFzc05hbWVzLGNsYXNzTmFtZSk7fSku am9pbigiICIpOiIiO30saGFzOmZ1bmN0aW9uKGVsZW0sY2xhc3NOYW1lKXtyZXR1 cm4gZWxlbSYmalF1ZXJ5LmluQXJyYXkoY2xhc3NOYW1lLChlbGVtLmNsYXNzTmFt ZXx8ZWxlbSkudG9TdHJpbmcoKS5zcGxpdCgvXHMrLykpPi0xO319LHN3YXA6ZnVu Y3Rpb24oZWxlbSxvcHRpb25zLGNhbGxiYWNrKXt2YXIgb2xkPXt9O2Zvcih2YXIg bmFtZSBpbiBvcHRpb25zKXtvbGRbbmFtZV09ZWxlbS5zdHlsZVtuYW1lXTtlbGVt LnN0eWxlW25hbWVdPW9wdGlvbnNbbmFtZV07fQpjYWxsYmFjay5jYWxsKGVsZW0p O2Zvcih2YXIgbmFtZSBpbiBvcHRpb25zKQplbGVtLnN0eWxlW25hbWVdPW9sZFtu YW1lXTt9LGNzczpmdW5jdGlvbihlbGVtLG5hbWUsZm9yY2Upe2lmKG5hbWU9PSJ3 aWR0aCJ8fG5hbWU9PSJoZWlnaHQiKXt2YXIgdmFsLHByb3BzPXtwb3NpdGlvbjoi YWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSx3 aGljaD1uYW1lPT0id2lkdGgiP1siTGVmdCIsIlJpZ2h0Il06WyJUb3AiLCJCb3R0 b20iXTtmdW5jdGlvbiBnZXRXSCgpe3ZhbD1uYW1lPT0id2lkdGgiP2VsZW0ub2Zm c2V0V2lkdGg6ZWxlbS5vZmZzZXRIZWlnaHQ7dmFyIHBhZGRpbmc9MCxib3JkZXI9 MDtqUXVlcnkuZWFjaCh3aGljaCxmdW5jdGlvbigpe3BhZGRpbmcrPXBhcnNlRmxv YXQoalF1ZXJ5LmN1ckNTUyhlbGVtLCJwYWRkaW5nIit0aGlzLHRydWUpKXx8MDti b3JkZXIrPXBhcnNlRmxvYXQoalF1ZXJ5LmN1ckNTUyhlbGVtLCJib3JkZXIiK3Ro aXMrIldpZHRoIix0cnVlKSl8fDA7fSk7dmFsLT1NYXRoLnJvdW5kKHBhZGRpbmcr Ym9yZGVyKTt9CmlmKGpRdWVyeShlbGVtKS5pcygiOnZpc2libGUiKSkKZ2V0V0go KTtlbHNlCmpRdWVyeS5zd2FwKGVsZW0scHJvcHMsZ2V0V0gpO3JldHVybiBNYXRo Lm1heCgwLHZhbCk7fQpyZXR1cm4galF1ZXJ5LmN1ckNTUyhlbGVtLG5hbWUsZm9y Y2UpO30sY3VyQ1NTOmZ1bmN0aW9uKGVsZW0sbmFtZSxmb3JjZSl7dmFyIHJldCxz dHlsZT1lbGVtLnN0eWxlO2lmKG5hbWU9PSJvcGFjaXR5IiYmIWpRdWVyeS5zdXBw b3J0Lm9wYWNpdHkpe3JldD1qUXVlcnkuYXR0cihzdHlsZSwib3BhY2l0eSIpO3Jl dHVybiByZXQ9PSIiPyIxIjpyZXQ7fQppZihuYW1lLm1hdGNoKC9mbG9hdC9pKSkK bmFtZT1zdHlsZUZsb2F0O2lmKCFmb3JjZSYmc3R5bGUmJnN0eWxlW25hbWVdKQpy ZXQ9c3R5bGVbbmFtZV07ZWxzZSBpZihkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0 eWxlKXtpZihuYW1lLm1hdGNoKC9mbG9hdC9pKSkKbmFtZT0iZmxvYXQiO25hbWU9 bmFtZS5yZXBsYWNlKC8oW0EtWl0pL2csIi0kMSIpLnRvTG93ZXJDYXNlKCk7dmFy IGNvbXB1dGVkU3R5bGU9ZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVt LG51bGwpO2lmKGNvbXB1dGVkU3R5bGUpCnJldD1jb21wdXRlZFN0eWxlLmdldFBy b3BlcnR5VmFsdWUobmFtZSk7aWYobmFtZT09Im9wYWNpdHkiJiZyZXQ9PSIiKQpy ZXQ9IjEiO31lbHNlIGlmKGVsZW0uY3VycmVudFN0eWxlKXt2YXIgY2FtZWxDYXNl PW5hbWUucmVwbGFjZSgvXC0oXHcpL2csZnVuY3Rpb24oYWxsLGxldHRlcil7cmV0 dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpO30pO3JldD1lbGVtLmN1cnJlbnRTdHls ZVtuYW1lXXx8ZWxlbS5jdXJyZW50U3R5bGVbY2FtZWxDYXNlXTtpZighL15cZCso cHgpPyQvaS50ZXN0KHJldCkmJi9eXGQvLnRlc3QocmV0KSl7dmFyIGxlZnQ9c3R5 bGUubGVmdCxyc0xlZnQ9ZWxlbS5ydW50aW1lU3R5bGUubGVmdDtlbGVtLnJ1bnRp bWVTdHlsZS5sZWZ0PWVsZW0uY3VycmVudFN0eWxlLmxlZnQ7c3R5bGUubGVmdD1y ZXR8fDA7cmV0PXN0eWxlLnBpeGVsTGVmdCsicHgiO3N0eWxlLmxlZnQ9bGVmdDtl bGVtLnJ1bnRpbWVTdHlsZS5sZWZ0PXJzTGVmdDt9fQpyZXR1cm4gcmV0O30sY2xl YW46ZnVuY3Rpb24oZWxlbXMsY29udGV4dCxmcmFnbWVudCl7Y29udGV4dD1jb250 ZXh0fHxkb2N1bWVudDtpZih0eXBlb2YgY29udGV4dC5jcmVhdGVFbGVtZW50PT09 InVuZGVmaW5lZCIpCmNvbnRleHQ9Y29udGV4dC5vd25lckRvY3VtZW50fHxjb250 ZXh0WzBdJiZjb250ZXh0WzBdLm93bmVyRG9jdW1lbnR8fGRvY3VtZW50O2lmKCFm cmFnbWVudCYmZWxlbXMubGVuZ3RoPT09MSYmdHlwZW9mIGVsZW1zWzBdPT09InN0 cmluZyIpe3ZhciBtYXRjaD0vXjwoXHcrKVxzKlwvPz4kLy5leGVjKGVsZW1zWzBd KTtpZihtYXRjaCkKcmV0dXJuW2NvbnRleHQuY3JlYXRlRWxlbWVudChtYXRjaFsx XSldO30KdmFyIHJldD1bXSxzY3JpcHRzPVtdLGRpdj1jb250ZXh0LmNyZWF0ZUVs ZW1lbnQoImRpdiIpO2pRdWVyeS5lYWNoKGVsZW1zLGZ1bmN0aW9uKGksZWxlbSl7 aWYodHlwZW9mIGVsZW09PT0ibnVtYmVyIikKZWxlbSs9Jyc7aWYoIWVsZW0pCnJl dHVybjtpZih0eXBlb2YgZWxlbT09PSJzdHJpbmciKXtlbGVtPWVsZW0ucmVwbGFj ZSgvKDwoXHcrKVtePl0qPylcLz4vZyxmdW5jdGlvbihhbGwsZnJvbnQsdGFnKXty ZXR1cm4gdGFnLm1hdGNoKC9eKGFiYnJ8YnJ8Y29sfGltZ3xpbnB1dHxsaW5rfG1l dGF8cGFyYW18aHJ8YXJlYXxlbWJlZCkkL2kpP2FsbDpmcm9udCsiPjwvIit0YWcr Ij4iO30pO3ZhciB0YWdzPWpRdWVyeS50cmltKGVsZW0pLnRvTG93ZXJDYXNlKCk7 dmFyIHdyYXA9IXRhZ3MuaW5kZXhPZigiPG9wdCIpJiZbMSwiPHNlbGVjdCBtdWx0 aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdfHwhdGFncy5pbmRleE9mKCI8 bGVnIikmJlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXXx8dGFncy5tYXRj aCgvXjwodGhlYWR8dGJvZHl8dGZvb3R8Y29sZ3xjYXApLykmJlsxLCI8dGFibGU+ IiwiPC90YWJsZT4iXXx8IXRhZ3MuaW5kZXhPZigiPHRyIikmJlsyLCI8dGFibGU+ PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXXx8KCF0YWdzLmluZGV4T2YoIjx0 ZCIpfHwhdGFncy5pbmRleE9mKCI8dGgiKSkmJlszLCI8dGFibGU+PHRib2R5Pjx0 cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXXx8IXRhZ3MuaW5kZXhPZigiPGNv bCIpJiZbMiwiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4iLCI8L2Nv bGdyb3VwPjwvdGFibGU+Il18fCFqUXVlcnkuc3VwcG9ydC5odG1sU2VyaWFsaXpl JiZbMSwiZGl2PGRpdj4iLCI8L2Rpdj4iXXx8WzAsIiIsIiJdO2Rpdi5pbm5lckhU TUw9d3JhcFsxXStlbGVtK3dyYXBbMl07d2hpbGUod3JhcFswXS0tKQpkaXY9ZGl2 Lmxhc3RDaGlsZDtpZighalF1ZXJ5LnN1cHBvcnQudGJvZHkpe3ZhciB0Ym9keT0h dGFncy5pbmRleE9mKCI8dGFibGUiKSYmdGFncy5pbmRleE9mKCI8dGJvZHkiKTww P2Rpdi5maXJzdENoaWxkJiZkaXYuZmlyc3RDaGlsZC5jaGlsZE5vZGVzOndyYXBb MV09PSI8dGFibGU+IiYmdGFncy5pbmRleE9mKCI8dGJvZHkiKTwwP2Rpdi5jaGls ZE5vZGVzOltdO2Zvcih2YXIgaj10Ym9keS5sZW5ndGgtMTtqPj0wOy0taikKaWYo alF1ZXJ5Lm5vZGVOYW1lKHRib2R5W2pdLCJ0Ym9keSIpJiYhdGJvZHlbal0uY2hp bGROb2Rlcy5sZW5ndGgpCnRib2R5W2pdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQo dGJvZHlbal0pO30KaWYoIWpRdWVyeS5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNl JiYvXlxzLy50ZXN0KGVsZW0pKQpkaXYuaW5zZXJ0QmVmb3JlKGNvbnRleHQuY3Jl YXRlVGV4dE5vZGUoZWxlbS5tYXRjaCgvXlxzKi8pWzBdKSxkaXYuZmlyc3RDaGls ZCk7ZWxlbT1qUXVlcnkubWFrZUFycmF5KGRpdi5jaGlsZE5vZGVzKTt9CmlmKGVs ZW0ubm9kZVR5cGUpCnJldC5wdXNoKGVsZW0pO2Vsc2UKcmV0PWpRdWVyeS5tZXJn ZShyZXQsZWxlbSk7fSk7aWYoZnJhZ21lbnQpe2Zvcih2YXIgaT0wO3JldFtpXTtp Kyspe2lmKGpRdWVyeS5ub2RlTmFtZShyZXRbaV0sInNjcmlwdCIpJiYoIXJldFtp XS50eXBlfHxyZXRbaV0udHlwZS50b0xvd2VyQ2FzZSgpPT09InRleHQvamF2YXNj cmlwdCIpKXtzY3JpcHRzLnB1c2gocmV0W2ldLnBhcmVudE5vZGU/cmV0W2ldLnBh cmVudE5vZGUucmVtb3ZlQ2hpbGQocmV0W2ldKTpyZXRbaV0pO31lbHNle2lmKHJl dFtpXS5ub2RlVHlwZT09PTEpCnJldC5zcGxpY2UuYXBwbHkocmV0LFtpKzEsMF0u Y29uY2F0KGpRdWVyeS5tYWtlQXJyYXkocmV0W2ldLmdldEVsZW1lbnRzQnlUYWdO YW1lKCJzY3JpcHQiKSkpKTtmcmFnbWVudC5hcHBlbmRDaGlsZChyZXRbaV0pO319 CnJldHVybiBzY3JpcHRzO30KcmV0dXJuIHJldDt9LGF0dHI6ZnVuY3Rpb24oZWxl bSxuYW1lLHZhbHVlKXtpZighZWxlbXx8ZWxlbS5ub2RlVHlwZT09M3x8ZWxlbS5u b2RlVHlwZT09OCkKcmV0dXJuIHVuZGVmaW5lZDt2YXIgbm90eG1sPSFqUXVlcnku aXNYTUxEb2MoZWxlbSksc2V0PXZhbHVlIT09dW5kZWZpbmVkO25hbWU9bm90eG1s JiZqUXVlcnkucHJvcHNbbmFtZV18fG5hbWU7aWYoZWxlbS50YWdOYW1lKXt2YXIg c3BlY2lhbD0vaHJlZnxzcmN8c3R5bGUvLnRlc3QobmFtZSk7aWYobmFtZT09InNl bGVjdGVkIiYmZWxlbS5wYXJlbnROb2RlKQplbGVtLnBhcmVudE5vZGUuc2VsZWN0 ZWRJbmRleDtpZihuYW1lIGluIGVsZW0mJm5vdHhtbCYmIXNwZWNpYWwpe2lmKHNl dCl7aWYobmFtZT09InR5cGUiJiZqUXVlcnkubm9kZU5hbWUoZWxlbSwiaW5wdXQi KSYmZWxlbS5wYXJlbnROb2RlKQp0aHJvdyJ0eXBlIHByb3BlcnR5IGNhbid0IGJl IGNoYW5nZWQiO2VsZW1bbmFtZV09dmFsdWU7fQppZihqUXVlcnkubm9kZU5hbWUo ZWxlbSwiZm9ybSIpJiZlbGVtLmdldEF0dHJpYnV0ZU5vZGUobmFtZSkpCnJldHVy biBlbGVtLmdldEF0dHJpYnV0ZU5vZGUobmFtZSkubm9kZVZhbHVlO2lmKG5hbWU9 PSJ0YWJJbmRleCIpe3ZhciBhdHRyaWJ1dGVOb2RlPWVsZW0uZ2V0QXR0cmlidXRl Tm9kZSgidGFiSW5kZXgiKTtyZXR1cm4gYXR0cmlidXRlTm9kZSYmYXR0cmlidXRl Tm9kZS5zcGVjaWZpZWQ/YXR0cmlidXRlTm9kZS52YWx1ZTplbGVtLm5vZGVOYW1l Lm1hdGNoKC8oYnV0dG9ufGlucHV0fG9iamVjdHxzZWxlY3R8dGV4dGFyZWEpL2kp PzA6ZWxlbS5ub2RlTmFtZS5tYXRjaCgvXihhfGFyZWEpJC9pKSYmZWxlbS5ocmVm PzA6dW5kZWZpbmVkO30KcmV0dXJuIGVsZW1bbmFtZV07fQppZighalF1ZXJ5LnN1 cHBvcnQuc3R5bGUmJm5vdHhtbCYmbmFtZT09InN0eWxlIikKcmV0dXJuIGpRdWVy eS5hdHRyKGVsZW0uc3R5bGUsImNzc1RleHQiLHZhbHVlKTtpZihzZXQpCmVsZW0u c2V0QXR0cmlidXRlKG5hbWUsIiIrdmFsdWUpO3ZhciBhdHRyPSFqUXVlcnkuc3Vw cG9ydC5ocmVmTm9ybWFsaXplZCYmbm90eG1sJiZzcGVjaWFsCj9lbGVtLmdldEF0 dHJpYnV0ZShuYW1lLDIpOmVsZW0uZ2V0QXR0cmlidXRlKG5hbWUpO3JldHVybiBh dHRyPT09bnVsbD91bmRlZmluZWQ6YXR0cjt9CmlmKCFqUXVlcnkuc3VwcG9ydC5v cGFjaXR5JiZuYW1lPT0ib3BhY2l0eSIpe2lmKHNldCl7ZWxlbS56b29tPTE7ZWxl bS5maWx0ZXI9KGVsZW0uZmlsdGVyfHwiIikucmVwbGFjZSgvYWxwaGFcKFteKV0q XCkvLCIiKSsKKHBhcnNlSW50KHZhbHVlKSsnJz09Ik5hTiI/IiI6ImFscGhhKG9w YWNpdHk9Iit2YWx1ZSoxMDArIikiKTt9CnJldHVybiBlbGVtLmZpbHRlciYmZWxl bS5maWx0ZXIuaW5kZXhPZigib3BhY2l0eT0iKT49MD8ocGFyc2VGbG9hdChlbGVt LmZpbHRlci5tYXRjaCgvb3BhY2l0eT0oW14pXSopLylbMV0pLzEwMCkrJyc6IiI7 fQpuYW1lPW5hbWUucmVwbGFjZSgvLShbYS16XSkvaWcsZnVuY3Rpb24oYWxsLGxl dHRlcil7cmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpO30pO2lmKHNldCkKZWxl bVtuYW1lXT12YWx1ZTtyZXR1cm4gZWxlbVtuYW1lXTt9LHRyaW06ZnVuY3Rpb24o dGV4dCl7cmV0dXJuKHRleHR8fCIiKS5yZXBsYWNlKC9eXHMrfFxzKyQvZywiIik7 fSxtYWtlQXJyYXk6ZnVuY3Rpb24oYXJyYXkpe3ZhciByZXQ9W107aWYoYXJyYXkh PW51bGwpe3ZhciBpPWFycmF5Lmxlbmd0aDtpZihpPT1udWxsfHx0eXBlb2YgYXJy YXk9PT0ic3RyaW5nInx8alF1ZXJ5LmlzRnVuY3Rpb24oYXJyYXkpfHxhcnJheS5z ZXRJbnRlcnZhbCkKcmV0WzBdPWFycmF5O2Vsc2UKd2hpbGUoaSkKcmV0Wy0taV09 YXJyYXlbaV07fQpyZXR1cm4gcmV0O30saW5BcnJheTpmdW5jdGlvbihlbGVtLGFy cmF5KXtmb3IodmFyIGk9MCxsZW5ndGg9YXJyYXkubGVuZ3RoO2k8bGVuZ3RoO2kr KykKaWYoYXJyYXlbaV09PT1lbGVtKQpyZXR1cm4gaTtyZXR1cm4tMTt9LG1lcmdl OmZ1bmN0aW9uKGZpcnN0LHNlY29uZCl7dmFyIGk9MCxlbGVtLHBvcz1maXJzdC5s ZW5ndGg7aWYoIWpRdWVyeS5zdXBwb3J0LmdldEFsbCl7d2hpbGUoKGVsZW09c2Vj b25kW2krK10pIT1udWxsKQppZihlbGVtLm5vZGVUeXBlIT04KQpmaXJzdFtwb3Mr K109ZWxlbTt9ZWxzZQp3aGlsZSgoZWxlbT1zZWNvbmRbaSsrXSkhPW51bGwpCmZp cnN0W3BvcysrXT1lbGVtO3JldHVybiBmaXJzdDt9LHVuaXF1ZTpmdW5jdGlvbihh cnJheSl7dmFyIHJldD1bXSxkb25lPXt9O3RyeXtmb3IodmFyIGk9MCxsZW5ndGg9 YXJyYXkubGVuZ3RoO2k8bGVuZ3RoO2krKyl7dmFyIGlkPWpRdWVyeS5kYXRhKGFy cmF5W2ldKTtpZighZG9uZVtpZF0pe2RvbmVbaWRdPXRydWU7cmV0LnB1c2goYXJy YXlbaV0pO319fWNhdGNoKGUpe3JldD1hcnJheTt9CnJldHVybiByZXQ7fSxncmVw OmZ1bmN0aW9uKGVsZW1zLGNhbGxiYWNrLGludil7dmFyIHJldD1bXTtmb3IodmFy IGk9MCxsZW5ndGg9ZWxlbXMubGVuZ3RoO2k8bGVuZ3RoO2krKykKaWYoIWludiE9 IWNhbGxiYWNrKGVsZW1zW2ldLGkpKQpyZXQucHVzaChlbGVtc1tpXSk7cmV0dXJu IHJldDt9LG1hcDpmdW5jdGlvbihlbGVtcyxjYWxsYmFjayl7dmFyIHJldD1bXTtm b3IodmFyIGk9MCxsZW5ndGg9ZWxlbXMubGVuZ3RoO2k8bGVuZ3RoO2krKyl7dmFy IHZhbHVlPWNhbGxiYWNrKGVsZW1zW2ldLGkpO2lmKHZhbHVlIT1udWxsKQpyZXRb cmV0Lmxlbmd0aF09dmFsdWU7fQpyZXR1cm4gcmV0LmNvbmNhdC5hcHBseShbXSxy ZXQpO319KTt2YXIgdXNlckFnZW50PW5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dl ckNhc2UoKTtqUXVlcnkuYnJvd3Nlcj17dmVyc2lvbjoodXNlckFnZW50Lm1hdGNo KC8uKyg/OnJ2fGl0fHJhfGllKVtcLzogXShbXGQuXSspLyl8fFswLCcwJ10pWzFd LHNhZmFyaTovd2Via2l0Ly50ZXN0KHVzZXJBZ2VudCksb3BlcmE6L29wZXJhLy50 ZXN0KHVzZXJBZ2VudCksbXNpZTovbXNpZS8udGVzdCh1c2VyQWdlbnQpJiYhL29w ZXJhLy50ZXN0KHVzZXJBZ2VudCksbW96aWxsYTovbW96aWxsYS8udGVzdCh1c2Vy QWdlbnQpJiYhLyhjb21wYXRpYmxlfHdlYmtpdCkvLnRlc3QodXNlckFnZW50KX07 alF1ZXJ5LmVhY2goe3BhcmVudDpmdW5jdGlvbihlbGVtKXtyZXR1cm4gZWxlbS5w YXJlbnROb2RlO30scGFyZW50czpmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5 LmRpcihlbGVtLCJwYXJlbnROb2RlIik7fSxuZXh0OmZ1bmN0aW9uKGVsZW0pe3Jl dHVybiBqUXVlcnkubnRoKGVsZW0sMiwibmV4dFNpYmxpbmciKTt9LHByZXY6ZnVu Y3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5udGgoZWxlbSwyLCJwcmV2aW91c1Np YmxpbmciKTt9LG5leHRBbGw6ZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5k aXIoZWxlbSwibmV4dFNpYmxpbmciKTt9LHByZXZBbGw6ZnVuY3Rpb24oZWxlbSl7 cmV0dXJuIGpRdWVyeS5kaXIoZWxlbSwicHJldmlvdXNTaWJsaW5nIik7fSxzaWJs aW5nczpmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5LnNpYmxpbmcoZWxlbS5w YXJlbnROb2RlLmZpcnN0Q2hpbGQsZWxlbSk7fSxjaGlsZHJlbjpmdW5jdGlvbihl bGVtKXtyZXR1cm4galF1ZXJ5LnNpYmxpbmcoZWxlbS5maXJzdENoaWxkKTt9LGNv bnRlbnRzOmZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkubm9kZU5hbWUoZWxl bSwiaWZyYW1lIik/ZWxlbS5jb250ZW50RG9jdW1lbnR8fGVsZW0uY29udGVudFdp bmRvdy5kb2N1bWVudDpqUXVlcnkubWFrZUFycmF5KGVsZW0uY2hpbGROb2Rlcyk7 fX0sZnVuY3Rpb24obmFtZSxmbil7alF1ZXJ5LmZuW25hbWVdPWZ1bmN0aW9uKHNl bGVjdG9yKXt2YXIgcmV0PWpRdWVyeS5tYXAodGhpcyxmbik7aWYoc2VsZWN0b3Im JnR5cGVvZiBzZWxlY3Rvcj09InN0cmluZyIpCnJldD1qUXVlcnkubXVsdGlGaWx0 ZXIoc2VsZWN0b3IscmV0KTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soalF1ZXJ5LnVu aXF1ZShyZXQpLG5hbWUsc2VsZWN0b3IpO307fSk7alF1ZXJ5LmVhY2goe2FwcGVu ZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJi ZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdp dGgifSxmdW5jdGlvbihuYW1lLG9yaWdpbmFsKXtqUXVlcnkuZm5bbmFtZV09ZnVu Y3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHM7cmV0dXJuIHRoaXMuZWFjaChmdW5j dGlvbigpe2Zvcih2YXIgaT0wLGxlbmd0aD1hcmdzLmxlbmd0aDtpPGxlbmd0aDtp KyspCmpRdWVyeShhcmdzW2ldKVtvcmlnaW5hbF0odGhpcyk7fSk7fTt9KTtqUXVl cnkuZWFjaCh7cmVtb3ZlQXR0cjpmdW5jdGlvbihuYW1lKXtqUXVlcnkuYXR0cih0 aGlzLG5hbWUsIiIpO2lmKHRoaXMubm9kZVR5cGU9PTEpCnRoaXMucmVtb3ZlQXR0 cmlidXRlKG5hbWUpO30sYWRkQ2xhc3M6ZnVuY3Rpb24oY2xhc3NOYW1lcyl7alF1 ZXJ5LmNsYXNzTmFtZS5hZGQodGhpcyxjbGFzc05hbWVzKTt9LHJlbW92ZUNsYXNz OmZ1bmN0aW9uKGNsYXNzTmFtZXMpe2pRdWVyeS5jbGFzc05hbWUucmVtb3ZlKHRo aXMsY2xhc3NOYW1lcyk7fSx0b2dnbGVDbGFzczpmdW5jdGlvbihjbGFzc05hbWVz LHN0YXRlKXtpZih0eXBlb2Ygc3RhdGUhPT0iYm9vbGVhbiIpCnN0YXRlPSFqUXVl cnkuY2xhc3NOYW1lLmhhcyh0aGlzLGNsYXNzTmFtZXMpO2pRdWVyeS5jbGFzc05h bWVbc3RhdGU/ImFkZCI6InJlbW92ZSJdKHRoaXMsY2xhc3NOYW1lcyk7fSxyZW1v dmU6ZnVuY3Rpb24oc2VsZWN0b3Ipe2lmKCFzZWxlY3Rvcnx8alF1ZXJ5LmZpbHRl cihzZWxlY3RvcixbdGhpc10pLmxlbmd0aCl7alF1ZXJ5KCIqIix0aGlzKS5hZGQo W3RoaXNdKS5lYWNoKGZ1bmN0aW9uKCl7alF1ZXJ5LmV2ZW50LnJlbW92ZSh0aGlz KTtqUXVlcnkucmVtb3ZlRGF0YSh0aGlzKTt9KTtpZih0aGlzLnBhcmVudE5vZGUp CnRoaXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzKTt9fSxlbXB0eTpmdW5j dGlvbigpe2pRdWVyeSgiPioiLHRoaXMpLnJlbW92ZSgpO3doaWxlKHRoaXMuZmly c3RDaGlsZCkKdGhpcy5yZW1vdmVDaGlsZCh0aGlzLmZpcnN0Q2hpbGQpO319LGZ1 bmN0aW9uKG5hbWUsZm4pe2pRdWVyeS5mbltuYW1lXT1mdW5jdGlvbigpe3JldHVy biB0aGlzLmVhY2goZm4sYXJndW1lbnRzKTt9O30pO2Z1bmN0aW9uIG51bShlbGVt LHByb3Ape3JldHVybiBlbGVtWzBdJiZwYXJzZUludChqUXVlcnkuY3VyQ1NTKGVs ZW1bMF0scHJvcCx0cnVlKSwxMCl8fDA7fQp2YXIgZXhwYW5kbz0ialF1ZXJ5Iitu b3coKSx1dWlkPTAsd2luZG93RGF0YT17fTtqUXVlcnkuZXh0ZW5kKHtjYWNoZTp7 fSxkYXRhOmZ1bmN0aW9uKGVsZW0sbmFtZSxkYXRhKXtlbGVtPWVsZW09PXdpbmRv dz93aW5kb3dEYXRhOmVsZW07dmFyIGlkPWVsZW1bZXhwYW5kb107aWYoIWlkKQpp ZD1lbGVtW2V4cGFuZG9dPSsrdXVpZDtpZihuYW1lJiYhalF1ZXJ5LmNhY2hlW2lk XSkKalF1ZXJ5LmNhY2hlW2lkXT17fTtpZihkYXRhIT09dW5kZWZpbmVkKQpqUXVl cnkuY2FjaGVbaWRdW25hbWVdPWRhdGE7cmV0dXJuIG5hbWU/alF1ZXJ5LmNhY2hl W2lkXVtuYW1lXTppZDt9LHJlbW92ZURhdGE6ZnVuY3Rpb24oZWxlbSxuYW1lKXtl bGVtPWVsZW09PXdpbmRvdz93aW5kb3dEYXRhOmVsZW07dmFyIGlkPWVsZW1bZXhw YW5kb107aWYobmFtZSl7aWYoalF1ZXJ5LmNhY2hlW2lkXSl7ZGVsZXRlIGpRdWVy eS5jYWNoZVtpZF1bbmFtZV07bmFtZT0iIjtmb3IobmFtZSBpbiBqUXVlcnkuY2Fj aGVbaWRdKQpicmVhaztpZighbmFtZSkKalF1ZXJ5LnJlbW92ZURhdGEoZWxlbSk7 fQp9ZWxzZXt0cnl7ZGVsZXRlIGVsZW1bZXhwYW5kb107fWNhdGNoKGUpe2lmKGVs ZW0ucmVtb3ZlQXR0cmlidXRlKQplbGVtLnJlbW92ZUF0dHJpYnV0ZShleHBhbmRv KTt9CmRlbGV0ZSBqUXVlcnkuY2FjaGVbaWRdO319LHF1ZXVlOmZ1bmN0aW9uKGVs ZW0sdHlwZSxkYXRhKXtpZihlbGVtKXt0eXBlPSh0eXBlfHwiZngiKSsicXVldWUi O3ZhciBxPWpRdWVyeS5kYXRhKGVsZW0sdHlwZSk7aWYoIXF8fGpRdWVyeS5pc0Fy cmF5KGRhdGEpKQpxPWpRdWVyeS5kYXRhKGVsZW0sdHlwZSxqUXVlcnkubWFrZUFy cmF5KGRhdGEpKTtlbHNlIGlmKGRhdGEpCnEucHVzaChkYXRhKTt9CnJldHVybiBx O30sZGVxdWV1ZTpmdW5jdGlvbihlbGVtLHR5cGUpe3ZhciBxdWV1ZT1qUXVlcnku cXVldWUoZWxlbSx0eXBlKSxmbj1xdWV1ZS5zaGlmdCgpO2lmKCF0eXBlfHx0eXBl PT09ImZ4IikKZm49cXVldWVbMF07aWYoZm4hPT11bmRlZmluZWQpCmZuLmNhbGwo ZWxlbSk7fX0pO2pRdWVyeS5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oa2V5LHZh bHVlKXt2YXIgcGFydHM9a2V5LnNwbGl0KCIuIik7cGFydHNbMV09cGFydHNbMV0/ Ii4iK3BhcnRzWzFdOiIiO2lmKHZhbHVlPT09dW5kZWZpbmVkKXt2YXIgZGF0YT10 aGlzLnRyaWdnZXJIYW5kbGVyKCJnZXREYXRhIitwYXJ0c1sxXSsiISIsW3BhcnRz WzBdXSk7aWYoZGF0YT09PXVuZGVmaW5lZCYmdGhpcy5sZW5ndGgpCmRhdGE9alF1 ZXJ5LmRhdGEodGhpc1swXSxrZXkpO3JldHVybiBkYXRhPT09dW5kZWZpbmVkJiZw YXJ0c1sxXT90aGlzLmRhdGEocGFydHNbMF0pOmRhdGE7fWVsc2UKcmV0dXJuIHRo aXMudHJpZ2dlcigic2V0RGF0YSIrcGFydHNbMV0rIiEiLFtwYXJ0c1swXSx2YWx1 ZV0pLmVhY2goZnVuY3Rpb24oKXtqUXVlcnkuZGF0YSh0aGlzLGtleSx2YWx1ZSk7 fSk7fSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGtleSl7cmV0dXJuIHRoaXMuZWFjaChm dW5jdGlvbigpe2pRdWVyeS5yZW1vdmVEYXRhKHRoaXMsa2V5KTt9KTt9LHF1ZXVl OmZ1bmN0aW9uKHR5cGUsZGF0YSl7aWYodHlwZW9mIHR5cGUhPT0ic3RyaW5nIil7 ZGF0YT10eXBlO3R5cGU9ImZ4Ijt9CmlmKGRhdGE9PT11bmRlZmluZWQpCnJldHVy biBqUXVlcnkucXVldWUodGhpc1swXSx0eXBlKTtyZXR1cm4gdGhpcy5lYWNoKGZ1 bmN0aW9uKCl7dmFyIHF1ZXVlPWpRdWVyeS5xdWV1ZSh0aGlzLHR5cGUsZGF0YSk7 aWYodHlwZT09ImZ4IiYmcXVldWUubGVuZ3RoPT0xKQpxdWV1ZVswXS5jYWxsKHRo aXMpO30pO30sZGVxdWV1ZTpmdW5jdGlvbih0eXBlKXtyZXR1cm4gdGhpcy5lYWNo KGZ1bmN0aW9uKCl7alF1ZXJ5LmRlcXVldWUodGhpcyx0eXBlKTt9KTt9fSk7KGZ1 bmN0aW9uKCl7dmFyIGNodW5rZXI9LygoPzpcKCg/OlwoW14oKV0rXCl8W14oKV0r KStcKXxcWyg/OlxbW15bXF1dKlxdfFsnIl1bXiciXStbJyJdfFteW1xdJyJdKykr XF18XFwufFteID4rfiwoXFtdKykrfFs+K35dKShccyosXHMqKT8vZyxkb25lPTAs dG9TdHJpbmc9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzt2YXIgU2l6emxlPWZ1 bmN0aW9uKHNlbGVjdG9yLGNvbnRleHQscmVzdWx0cyxzZWVkKXtyZXN1bHRzPXJl c3VsdHN8fFtdO2NvbnRleHQ9Y29udGV4dHx8ZG9jdW1lbnQ7aWYoY29udGV4dC5u b2RlVHlwZSE9PTEmJmNvbnRleHQubm9kZVR5cGUhPT05KQpyZXR1cm5bXTtpZigh c2VsZWN0b3J8fHR5cGVvZiBzZWxlY3RvciE9PSJzdHJpbmciKXtyZXR1cm4gcmVz dWx0czt9CnZhciBwYXJ0cz1bXSxtLHNldCxjaGVja1NldCxjaGVjayxtb2RlLGV4 dHJhLHBydW5lPXRydWU7Y2h1bmtlci5sYXN0SW5kZXg9MDt3aGlsZSgobT1jaHVu a2VyLmV4ZWMoc2VsZWN0b3IpKSE9PW51bGwpe3BhcnRzLnB1c2gobVsxXSk7aWYo bVsyXSl7ZXh0cmE9UmVnRXhwLnJpZ2h0Q29udGV4dDticmVhazt9fQppZihwYXJ0 cy5sZW5ndGg+MSYmb3JpZ1BPUy5leGVjKHNlbGVjdG9yKSl7aWYocGFydHMubGVu Z3RoPT09MiYmRXhwci5yZWxhdGl2ZVtwYXJ0c1swXV0pe3NldD1wb3NQcm9jZXNz KHBhcnRzWzBdK3BhcnRzWzFdLGNvbnRleHQpO31lbHNle3NldD1FeHByLnJlbGF0 aXZlW3BhcnRzWzBdXT9bY29udGV4dF06U2l6emxlKHBhcnRzLnNoaWZ0KCksY29u dGV4dCk7d2hpbGUocGFydHMubGVuZ3RoKXtzZWxlY3Rvcj1wYXJ0cy5zaGlmdCgp O2lmKEV4cHIucmVsYXRpdmVbc2VsZWN0b3JdKQpzZWxlY3Rvcis9cGFydHMuc2hp ZnQoKTtzZXQ9cG9zUHJvY2VzcyhzZWxlY3RvcixzZXQpO319fWVsc2V7dmFyIHJl dD1zZWVkP3tleHByOnBhcnRzLnBvcCgpLHNldDptYWtlQXJyYXkoc2VlZCl9OlNp enpsZS5maW5kKHBhcnRzLnBvcCgpLHBhcnRzLmxlbmd0aD09PTEmJmNvbnRleHQu cGFyZW50Tm9kZT9jb250ZXh0LnBhcmVudE5vZGU6Y29udGV4dCxpc1hNTChjb250 ZXh0KSk7c2V0PVNpenpsZS5maWx0ZXIocmV0LmV4cHIscmV0LnNldCk7aWYocGFy dHMubGVuZ3RoPjApe2NoZWNrU2V0PW1ha2VBcnJheShzZXQpO31lbHNle3BydW5l PWZhbHNlO30Kd2hpbGUocGFydHMubGVuZ3RoKXt2YXIgY3VyPXBhcnRzLnBvcCgp LHBvcD1jdXI7aWYoIUV4cHIucmVsYXRpdmVbY3VyXSl7Y3VyPSIiO31lbHNle3Bv cD1wYXJ0cy5wb3AoKTt9CmlmKHBvcD09bnVsbCl7cG9wPWNvbnRleHQ7fQpFeHBy LnJlbGF0aXZlW2N1cl0oY2hlY2tTZXQscG9wLGlzWE1MKGNvbnRleHQpKTt9fQpp ZighY2hlY2tTZXQpe2NoZWNrU2V0PXNldDt9CmlmKCFjaGVja1NldCl7dGhyb3ci U3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIisoY3VyfHxz ZWxlY3Rvcik7fQppZih0b1N0cmluZy5jYWxsKGNoZWNrU2V0KT09PSJbb2JqZWN0 IEFycmF5XSIpe2lmKCFwcnVuZSl7cmVzdWx0cy5wdXNoLmFwcGx5KHJlc3VsdHMs Y2hlY2tTZXQpO31lbHNlIGlmKGNvbnRleHQubm9kZVR5cGU9PT0xKXtmb3IodmFy IGk9MDtjaGVja1NldFtpXSE9bnVsbDtpKyspe2lmKGNoZWNrU2V0W2ldJiYoY2hl Y2tTZXRbaV09PT10cnVlfHxjaGVja1NldFtpXS5ub2RlVHlwZT09PTEmJmNvbnRh aW5zKGNvbnRleHQsY2hlY2tTZXRbaV0pKSl7cmVzdWx0cy5wdXNoKHNldFtpXSk7 fX19ZWxzZXtmb3IodmFyIGk9MDtjaGVja1NldFtpXSE9bnVsbDtpKyspe2lmKGNo ZWNrU2V0W2ldJiZjaGVja1NldFtpXS5ub2RlVHlwZT09PTEpe3Jlc3VsdHMucHVz aChzZXRbaV0pO319fX1lbHNle21ha2VBcnJheShjaGVja1NldCxyZXN1bHRzKTt9 CmlmKGV4dHJhKXtTaXp6bGUoZXh0cmEsY29udGV4dCxyZXN1bHRzLHNlZWQpO30K cmV0dXJuIHJlc3VsdHM7fTtTaXp6bGUubWF0Y2hlcz1mdW5jdGlvbihleHByLHNl dCl7cmV0dXJuIFNpenpsZShleHByLG51bGwsbnVsbCxzZXQpO307U2l6emxlLmZp bmQ9ZnVuY3Rpb24oZXhwcixjb250ZXh0LGlzWE1MKXt2YXIgc2V0LG1hdGNoO2lm KCFleHByKXtyZXR1cm5bXTt9CmZvcih2YXIgaT0wLGw9RXhwci5vcmRlci5sZW5n dGg7aTxsO2krKyl7dmFyIHR5cGU9RXhwci5vcmRlcltpXSxtYXRjaDtpZigobWF0 Y2g9RXhwci5tYXRjaFt0eXBlXS5leGVjKGV4cHIpKSl7dmFyIGxlZnQ9UmVnRXhw LmxlZnRDb250ZXh0O2lmKGxlZnQuc3Vic3RyKGxlZnQubGVuZ3RoLTEpIT09Ilxc Iil7bWF0Y2hbMV09KG1hdGNoWzFdfHwiIikucmVwbGFjZSgvXFwvZywiIik7c2V0 PUV4cHIuZmluZFt0eXBlXShtYXRjaCxjb250ZXh0LGlzWE1MKTtpZihzZXQhPW51 bGwpe2V4cHI9ZXhwci5yZXBsYWNlKEV4cHIubWF0Y2hbdHlwZV0sIiIpO2JyZWFr O319fX0KaWYoIXNldCl7c2V0PWNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUo IioiKTt9CnJldHVybntzZXQ6c2V0LGV4cHI6ZXhwcn07fTtTaXp6bGUuZmlsdGVy PWZ1bmN0aW9uKGV4cHIsc2V0LGlucGxhY2Usbm90KXt2YXIgb2xkPWV4cHIscmVz dWx0PVtdLGN1ckxvb3A9c2V0LG1hdGNoLGFueUZvdW5kO3doaWxlKGV4cHImJnNl dC5sZW5ndGgpe2Zvcih2YXIgdHlwZSBpbiBFeHByLmZpbHRlcil7aWYoKG1hdGNo PUV4cHIubWF0Y2hbdHlwZV0uZXhlYyhleHByKSkhPW51bGwpe3ZhciBmaWx0ZXI9 RXhwci5maWx0ZXJbdHlwZV0sZm91bmQsaXRlbTthbnlGb3VuZD1mYWxzZTtpZihj dXJMb29wPT1yZXN1bHQpe3Jlc3VsdD1bXTt9CmlmKEV4cHIucHJlRmlsdGVyW3R5 cGVdKXttYXRjaD1FeHByLnByZUZpbHRlclt0eXBlXShtYXRjaCxjdXJMb29wLGlu cGxhY2UscmVzdWx0LG5vdCk7aWYoIW1hdGNoKXthbnlGb3VuZD1mb3VuZD10cnVl O31lbHNlIGlmKG1hdGNoPT09dHJ1ZSl7Y29udGludWU7fX0KaWYobWF0Y2gpe2Zv cih2YXIgaT0wOyhpdGVtPWN1ckxvb3BbaV0pIT1udWxsO2krKyl7aWYoaXRlbSl7 Zm91bmQ9ZmlsdGVyKGl0ZW0sbWF0Y2gsaSxjdXJMb29wKTt2YXIgcGFzcz1ub3Re ISFmb3VuZDtpZihpbnBsYWNlJiZmb3VuZCE9bnVsbCl7aWYocGFzcyl7YW55Rm91 bmQ9dHJ1ZTt9ZWxzZXtjdXJMb29wW2ldPWZhbHNlO319ZWxzZSBpZihwYXNzKXty ZXN1bHQucHVzaChpdGVtKTthbnlGb3VuZD10cnVlO319fX0KaWYoZm91bmQhPT11 bmRlZmluZWQpe2lmKCFpbnBsYWNlKXtjdXJMb29wPXJlc3VsdDt9CmV4cHI9ZXhw ci5yZXBsYWNlKEV4cHIubWF0Y2hbdHlwZV0sIiIpO2lmKCFhbnlGb3VuZCl7cmV0 dXJuW107fQpicmVhazt9fX0KZXhwcj1leHByLnJlcGxhY2UoL1xzKixccyovLCIi KTtpZihleHByPT1vbGQpe2lmKGFueUZvdW5kPT1udWxsKXt0aHJvdyJTeW50YXgg ZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2V4cHI7fWVsc2V7YnJl YWs7fX0Kb2xkPWV4cHI7fQpyZXR1cm4gY3VyTG9vcDt9O3ZhciBFeHByPVNpenps ZS5zZWxlY3RvcnM9e29yZGVyOlsiSUQiLCJOQU1FIiwiVEFHIl0sbWF0Y2g6e0lE Oi8jKCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18XFwuKSspLyxDTEFTUzovXC4oKD86 W1x3XHUwMGMwLVx1RkZGRl8tXXxcXC4pKykvLE5BTUU6L1xbbmFtZT1bJyJdKigo PzpbXHdcdTAwYzAtXHVGRkZGXy1dfFxcLikrKVsnIl0qXF0vLEFUVFI6L1xbXHMq KCg/Oltcd1x1MDBjMC1cdUZGRkZfLV18XFwuKSspXHMqKD86KFxTPz0pXHMqKFsn Il0qKSguKj8pXDN8KVxzKlxdLyxUQUc6L14oKD86W1x3XHUwMGMwLVx1RkZGRlwq Xy1dfFxcLikrKS8sQ0hJTEQ6Lzoob25seXxudGh8bGFzdHxmaXJzdCktY2hpbGQo PzpcKChldmVufG9kZHxbXGRuKy1dKilcKSk/LyxQT1M6LzoobnRofGVxfGd0fGx0 fGZpcnN0fGxhc3R8ZXZlbnxvZGQpKD86XCgoXGQqKVwpKT8oPz1bXi1dfCQpLyxQ U0VVRE86LzooKD86W1x3XHUwMGMwLVx1RkZGRl8tXXxcXC4pKykoPzpcKChbJyJd KikoKD86XChbXlwpXStcKXxbXlwyXChcKV0qKSspXDJcKSk/L30sYXR0ck1hcDp7 ImNsYXNzIjoiY2xhc3NOYW1lIiwiZm9yIjoiaHRtbEZvciJ9LGF0dHJIYW5kbGU6 e2hyZWY6ZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCJo cmVmIik7fX0scmVsYXRpdmU6eyIrIjpmdW5jdGlvbihjaGVja1NldCxwYXJ0KXtm b3IodmFyIGk9MCxsPWNoZWNrU2V0Lmxlbmd0aDtpPGw7aSsrKXt2YXIgZWxlbT1j aGVja1NldFtpXTtpZihlbGVtKXt2YXIgY3VyPWVsZW0ucHJldmlvdXNTaWJsaW5n O3doaWxlKGN1ciYmY3VyLm5vZGVUeXBlIT09MSl7Y3VyPWN1ci5wcmV2aW91c1Np Ymxpbmc7fQpjaGVja1NldFtpXT10eXBlb2YgcGFydD09PSJzdHJpbmciP2N1cnx8 ZmFsc2U6Y3VyPT09cGFydDt9fQppZih0eXBlb2YgcGFydD09PSJzdHJpbmciKXtT aXp6bGUuZmlsdGVyKHBhcnQsY2hlY2tTZXQsdHJ1ZSk7fX0sIj4iOmZ1bmN0aW9u KGNoZWNrU2V0LHBhcnQsaXNYTUwpe2lmKHR5cGVvZiBwYXJ0PT09InN0cmluZyIm JiEvXFcvLnRlc3QocGFydCkpe3BhcnQ9aXNYTUw/cGFydDpwYXJ0LnRvVXBwZXJD YXNlKCk7Zm9yKHZhciBpPTAsbD1jaGVja1NldC5sZW5ndGg7aTxsO2krKyl7dmFy IGVsZW09Y2hlY2tTZXRbaV07aWYoZWxlbSl7dmFyIHBhcmVudD1lbGVtLnBhcmVu dE5vZGU7Y2hlY2tTZXRbaV09cGFyZW50Lm5vZGVOYW1lPT09cGFydD9wYXJlbnQ6 ZmFsc2U7fX19ZWxzZXtmb3IodmFyIGk9MCxsPWNoZWNrU2V0Lmxlbmd0aDtpPGw7 aSsrKXt2YXIgZWxlbT1jaGVja1NldFtpXTtpZihlbGVtKXtjaGVja1NldFtpXT10 eXBlb2YgcGFydD09PSJzdHJpbmciP2VsZW0ucGFyZW50Tm9kZTplbGVtLnBhcmVu dE5vZGU9PT1wYXJ0O319CmlmKHR5cGVvZiBwYXJ0PT09InN0cmluZyIpe1Npenps ZS5maWx0ZXIocGFydCxjaGVja1NldCx0cnVlKTt9fX0sIiI6ZnVuY3Rpb24oY2hl Y2tTZXQscGFydCxpc1hNTCl7dmFyIGRvbmVOYW1lPSJkb25lIisoZG9uZSsrKSxj aGVja0ZuPWRpckNoZWNrO2lmKCFwYXJ0Lm1hdGNoKC9cVy8pKXt2YXIgbm9kZUNo ZWNrPXBhcnQ9aXNYTUw/cGFydDpwYXJ0LnRvVXBwZXJDYXNlKCk7Y2hlY2tGbj1k aXJOb2RlQ2hlY2s7fQpjaGVja0ZuKCJwYXJlbnROb2RlIixwYXJ0LGRvbmVOYW1l LGNoZWNrU2V0LG5vZGVDaGVjayxpc1hNTCk7fSwifiI6ZnVuY3Rpb24oY2hlY2tT ZXQscGFydCxpc1hNTCl7dmFyIGRvbmVOYW1lPSJkb25lIisoZG9uZSsrKSxjaGVj a0ZuPWRpckNoZWNrO2lmKHR5cGVvZiBwYXJ0PT09InN0cmluZyImJiFwYXJ0Lm1h dGNoKC9cVy8pKXt2YXIgbm9kZUNoZWNrPXBhcnQ9aXNYTUw/cGFydDpwYXJ0LnRv VXBwZXJDYXNlKCk7Y2hlY2tGbj1kaXJOb2RlQ2hlY2s7fQpjaGVja0ZuKCJwcmV2 aW91c1NpYmxpbmciLHBhcnQsZG9uZU5hbWUsY2hlY2tTZXQsbm9kZUNoZWNrLGlz WE1MKTt9fSxmaW5kOntJRDpmdW5jdGlvbihtYXRjaCxjb250ZXh0LGlzWE1MKXtp Zih0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCE9PSJ1bmRlZmluZWQiJiYh aXNYTUwpe3ZhciBtPWNvbnRleHQuZ2V0RWxlbWVudEJ5SWQobWF0Y2hbMV0pO3Jl dHVybiBtP1ttXTpbXTt9fSxOQU1FOmZ1bmN0aW9uKG1hdGNoLGNvbnRleHQsaXNY TUwpe2lmKHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlOYW1lIT09InVuZGVm aW5lZCImJiFpc1hNTCl7cmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUo bWF0Y2hbMV0pO319LFRBRzpmdW5jdGlvbihtYXRjaCxjb250ZXh0KXtyZXR1cm4g Y29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShtYXRjaFsxXSk7fX0scHJlRmls dGVyOntDTEFTUzpmdW5jdGlvbihtYXRjaCxjdXJMb29wLGlucGxhY2UscmVzdWx0 LG5vdCl7bWF0Y2g9IiAiK21hdGNoWzFdLnJlcGxhY2UoL1xcL2csIiIpKyIgIjt2 YXIgZWxlbTtmb3IodmFyIGk9MDsoZWxlbT1jdXJMb29wW2ldKSE9bnVsbDtpKysp e2lmKGVsZW0pe2lmKG5vdF4oIiAiK2VsZW0uY2xhc3NOYW1lKyIgIikuaW5kZXhP ZihtYXRjaCk+PTApe2lmKCFpbnBsYWNlKQpyZXN1bHQucHVzaChlbGVtKTt9ZWxz ZSBpZihpbnBsYWNlKXtjdXJMb29wW2ldPWZhbHNlO319fQpyZXR1cm4gZmFsc2U7 fSxJRDpmdW5jdGlvbihtYXRjaCl7cmV0dXJuIG1hdGNoWzFdLnJlcGxhY2UoL1xc L2csIiIpO30sVEFHOmZ1bmN0aW9uKG1hdGNoLGN1ckxvb3Ape2Zvcih2YXIgaT0w O2N1ckxvb3BbaV09PT1mYWxzZTtpKyspe30KcmV0dXJuIGN1ckxvb3BbaV0mJmlz WE1MKGN1ckxvb3BbaV0pP21hdGNoWzFdOm1hdGNoWzFdLnRvVXBwZXJDYXNlKCk7 fSxDSElMRDpmdW5jdGlvbihtYXRjaCl7aWYobWF0Y2hbMV09PSJudGgiKXt2YXIg dGVzdD0vKC0/KShcZCopbigoPzpcK3wtKT9cZCopLy5leGVjKG1hdGNoWzJdPT0i ZXZlbiImJiIybiJ8fG1hdGNoWzJdPT0ib2RkIiYmIjJuKzEifHwhL1xELy50ZXN0 KG1hdGNoWzJdKSYmIjBuKyIrbWF0Y2hbMl18fG1hdGNoWzJdKTttYXRjaFsyXT0o dGVzdFsxXSsodGVzdFsyXXx8MSkpLTA7bWF0Y2hbM109dGVzdFszXS0wO30KbWF0 Y2hbMF09ImRvbmUiKyhkb25lKyspO3JldHVybiBtYXRjaDt9LEFUVFI6ZnVuY3Rp b24obWF0Y2gpe3ZhciBuYW1lPW1hdGNoWzFdLnJlcGxhY2UoL1xcL2csIiIpO2lm KEV4cHIuYXR0ck1hcFtuYW1lXSl7bWF0Y2hbMV09RXhwci5hdHRyTWFwW25hbWVd O30KaWYobWF0Y2hbMl09PT0ifj0iKXttYXRjaFs0XT0iICIrbWF0Y2hbNF0rIiAi O30KcmV0dXJuIG1hdGNoO30sUFNFVURPOmZ1bmN0aW9uKG1hdGNoLGN1ckxvb3As aW5wbGFjZSxyZXN1bHQsbm90KXtpZihtYXRjaFsxXT09PSJub3QiKXtpZihtYXRj aFszXS5tYXRjaChjaHVua2VyKS5sZW5ndGg+MSl7bWF0Y2hbM109U2l6emxlKG1h dGNoWzNdLG51bGwsbnVsbCxjdXJMb29wKTt9ZWxzZXt2YXIgcmV0PVNpenpsZS5m aWx0ZXIobWF0Y2hbM10sY3VyTG9vcCxpbnBsYWNlLHRydWVebm90KTtpZighaW5w bGFjZSl7cmVzdWx0LnB1c2guYXBwbHkocmVzdWx0LHJldCk7fQpyZXR1cm4gZmFs c2U7fX1lbHNlIGlmKEV4cHIubWF0Y2guUE9TLnRlc3QobWF0Y2hbMF0pKXtyZXR1 cm4gdHJ1ZTt9CnJldHVybiBtYXRjaDt9LFBPUzpmdW5jdGlvbihtYXRjaCl7bWF0 Y2gudW5zaGlmdCh0cnVlKTtyZXR1cm4gbWF0Y2g7fX0sZmlsdGVyczp7ZW5hYmxl ZDpmdW5jdGlvbihlbGVtKXtyZXR1cm4gZWxlbS5kaXNhYmxlZD09PWZhbHNlJiZl bGVtLnR5cGUhPT0iaGlkZGVuIjt9LGRpc2FibGVkOmZ1bmN0aW9uKGVsZW0pe3Jl dHVybiBlbGVtLmRpc2FibGVkPT09dHJ1ZTt9LGNoZWNrZWQ6ZnVuY3Rpb24oZWxl bSl7cmV0dXJuIGVsZW0uY2hlY2tlZD09PXRydWU7fSxzZWxlY3RlZDpmdW5jdGlv bihlbGVtKXtlbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtyZXR1cm4gZWxl bS5zZWxlY3RlZD09PXRydWU7fSxwYXJlbnQ6ZnVuY3Rpb24oZWxlbSl7cmV0dXJu ISFlbGVtLmZpcnN0Q2hpbGQ7fSxlbXB0eTpmdW5jdGlvbihlbGVtKXtyZXR1cm4h ZWxlbS5maXJzdENoaWxkO30saGFzOmZ1bmN0aW9uKGVsZW0saSxtYXRjaCl7cmV0 dXJuISFTaXp6bGUobWF0Y2hbM10sZWxlbSkubGVuZ3RoO30saGVhZGVyOmZ1bmN0 aW9uKGVsZW0pe3JldHVybi9oXGQvaS50ZXN0KGVsZW0ubm9kZU5hbWUpO30sdGV4 dDpmdW5jdGlvbihlbGVtKXtyZXR1cm4idGV4dCI9PT1lbGVtLnR5cGU7fSxyYWRp bzpmdW5jdGlvbihlbGVtKXtyZXR1cm4icmFkaW8iPT09ZWxlbS50eXBlO30sY2hl Y2tib3g6ZnVuY3Rpb24oZWxlbSl7cmV0dXJuImNoZWNrYm94Ij09PWVsZW0udHlw ZTt9LGZpbGU6ZnVuY3Rpb24oZWxlbSl7cmV0dXJuImZpbGUiPT09ZWxlbS50eXBl O30scGFzc3dvcmQ6ZnVuY3Rpb24oZWxlbSl7cmV0dXJuInBhc3N3b3JkIj09PWVs ZW0udHlwZTt9LHN1Ym1pdDpmdW5jdGlvbihlbGVtKXtyZXR1cm4ic3VibWl0Ij09 PWVsZW0udHlwZTt9LGltYWdlOmZ1bmN0aW9uKGVsZW0pe3JldHVybiJpbWFnZSI9 PT1lbGVtLnR5cGU7fSxyZXNldDpmdW5jdGlvbihlbGVtKXtyZXR1cm4icmVzZXQi PT09ZWxlbS50eXBlO30sYnV0dG9uOmZ1bmN0aW9uKGVsZW0pe3JldHVybiJidXR0 b24iPT09ZWxlbS50eXBlfHxlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PT0i QlVUVE9OIjt9LGlucHV0OmZ1bmN0aW9uKGVsZW0pe3JldHVybi9pbnB1dHxzZWxl Y3R8dGV4dGFyZWF8YnV0dG9uL2kudGVzdChlbGVtLm5vZGVOYW1lKTt9fSxzZXRG aWx0ZXJzOntmaXJzdDpmdW5jdGlvbihlbGVtLGkpe3JldHVybiBpPT09MDt9LGxh c3Q6ZnVuY3Rpb24oZWxlbSxpLG1hdGNoLGFycmF5KXtyZXR1cm4gaT09PWFycmF5 Lmxlbmd0aC0xO30sZXZlbjpmdW5jdGlvbihlbGVtLGkpe3JldHVybiBpJTI9PT0w O30sb2RkOmZ1bmN0aW9uKGVsZW0saSl7cmV0dXJuIGklMj09PTE7fSxsdDpmdW5j dGlvbihlbGVtLGksbWF0Y2gpe3JldHVybiBpPG1hdGNoWzNdLTA7fSxndDpmdW5j dGlvbihlbGVtLGksbWF0Y2gpe3JldHVybiBpPm1hdGNoWzNdLTA7fSxudGg6ZnVu Y3Rpb24oZWxlbSxpLG1hdGNoKXtyZXR1cm4gbWF0Y2hbM10tMD09aTt9LGVxOmZ1 bmN0aW9uKGVsZW0saSxtYXRjaCl7cmV0dXJuIG1hdGNoWzNdLTA9PWk7fX0sZmls dGVyOntDSElMRDpmdW5jdGlvbihlbGVtLG1hdGNoKXt2YXIgdHlwZT1tYXRjaFsx XSxwYXJlbnQ9ZWxlbS5wYXJlbnROb2RlO3ZhciBkb25lTmFtZT1tYXRjaFswXTtp ZihwYXJlbnQmJighcGFyZW50W2RvbmVOYW1lXXx8IWVsZW0ubm9kZUluZGV4KSl7 dmFyIGNvdW50PTE7Zm9yKHZhciBub2RlPXBhcmVudC5maXJzdENoaWxkO25vZGU7 bm9kZT1ub2RlLm5leHRTaWJsaW5nKXtpZihub2RlLm5vZGVUeXBlPT0xKXtub2Rl Lm5vZGVJbmRleD1jb3VudCsrO319CnBhcmVudFtkb25lTmFtZV09Y291bnQtMTt9 CmlmKHR5cGU9PSJmaXJzdCIpe3JldHVybiBlbGVtLm5vZGVJbmRleD09MTt9ZWxz ZSBpZih0eXBlPT0ibGFzdCIpe3JldHVybiBlbGVtLm5vZGVJbmRleD09cGFyZW50 W2RvbmVOYW1lXTt9ZWxzZSBpZih0eXBlPT0ib25seSIpe3JldHVybiBwYXJlbnRb ZG9uZU5hbWVdPT0xO31lbHNlIGlmKHR5cGU9PSJudGgiKXt2YXIgYWRkPWZhbHNl LGZpcnN0PW1hdGNoWzJdLGxhc3Q9bWF0Y2hbM107aWYoZmlyc3Q9PTEmJmxhc3Q9 PTApe3JldHVybiB0cnVlO30KaWYoZmlyc3Q9PTApe2lmKGVsZW0ubm9kZUluZGV4 PT1sYXN0KXthZGQ9dHJ1ZTt9fWVsc2UgaWYoKGVsZW0ubm9kZUluZGV4LWxhc3Qp JWZpcnN0PT0wJiYoZWxlbS5ub2RlSW5kZXgtbGFzdCkvZmlyc3Q+PTApe2FkZD10 cnVlO30KcmV0dXJuIGFkZDt9fSxQU0VVRE86ZnVuY3Rpb24oZWxlbSxtYXRjaCxp LGFycmF5KXt2YXIgbmFtZT1tYXRjaFsxXSxmaWx0ZXI9RXhwci5maWx0ZXJzW25h bWVdO2lmKGZpbHRlcil7cmV0dXJuIGZpbHRlcihlbGVtLGksbWF0Y2gsYXJyYXkp O31lbHNlIGlmKG5hbWU9PT0iY29udGFpbnMiKXtyZXR1cm4oZWxlbS50ZXh0Q29u dGVudHx8ZWxlbS5pbm5lclRleHR8fCIiKS5pbmRleE9mKG1hdGNoWzNdKT49MDt9 ZWxzZSBpZihuYW1lPT09Im5vdCIpe3ZhciBub3Q9bWF0Y2hbM107Zm9yKHZhciBp PTAsbD1ub3QubGVuZ3RoO2k8bDtpKyspe2lmKG5vdFtpXT09PWVsZW0pe3JldHVy biBmYWxzZTt9fQpyZXR1cm4gdHJ1ZTt9fSxJRDpmdW5jdGlvbihlbGVtLG1hdGNo KXtyZXR1cm4gZWxlbS5ub2RlVHlwZT09PTEmJmVsZW0uZ2V0QXR0cmlidXRlKCJp ZCIpPT09bWF0Y2g7fSxUQUc6ZnVuY3Rpb24oZWxlbSxtYXRjaCl7cmV0dXJuKG1h dGNoPT09IioiJiZlbGVtLm5vZGVUeXBlPT09MSl8fGVsZW0ubm9kZU5hbWU9PT1t YXRjaDt9LENMQVNTOmZ1bmN0aW9uKGVsZW0sbWF0Y2gpe3JldHVybiBtYXRjaC50 ZXN0KGVsZW0uY2xhc3NOYW1lKTt9LEFUVFI6ZnVuY3Rpb24oZWxlbSxtYXRjaCl7 dmFyIHJlc3VsdD1FeHByLmF0dHJIYW5kbGVbbWF0Y2hbMV1dP0V4cHIuYXR0ckhh bmRsZVttYXRjaFsxXV0oZWxlbSk6ZWxlbVttYXRjaFsxXV18fGVsZW0uZ2V0QXR0 cmlidXRlKG1hdGNoWzFdKSx2YWx1ZT1yZXN1bHQrIiIsdHlwZT1tYXRjaFsyXSxj aGVjaz1tYXRjaFs0XTtyZXR1cm4gcmVzdWx0PT1udWxsP3R5cGU9PT0iIT0iOnR5 cGU9PT0iPSI/dmFsdWU9PT1jaGVjazp0eXBlPT09Iio9Ij92YWx1ZS5pbmRleE9m KGNoZWNrKT49MDp0eXBlPT09In49Ij8oIiAiK3ZhbHVlKyIgIikuaW5kZXhPZihj aGVjayk+PTA6IW1hdGNoWzRdP3Jlc3VsdDp0eXBlPT09IiE9Ij92YWx1ZSE9Y2hl Y2s6dHlwZT09PSJePSI/dmFsdWUuaW5kZXhPZihjaGVjayk9PT0wOnR5cGU9PT0i JD0iP3ZhbHVlLnN1YnN0cih2YWx1ZS5sZW5ndGgtY2hlY2subGVuZ3RoKT09PWNo ZWNrOnR5cGU9PT0ifD0iP3ZhbHVlPT09Y2hlY2t8fHZhbHVlLnN1YnN0cigwLGNo ZWNrLmxlbmd0aCsxKT09PWNoZWNrKyItIjpmYWxzZTt9LFBPUzpmdW5jdGlvbihl bGVtLG1hdGNoLGksYXJyYXkpe3ZhciBuYW1lPW1hdGNoWzJdLGZpbHRlcj1FeHBy LnNldEZpbHRlcnNbbmFtZV07aWYoZmlsdGVyKXtyZXR1cm4gZmlsdGVyKGVsZW0s aSxtYXRjaCxhcnJheSk7fX19fTt2YXIgb3JpZ1BPUz1FeHByLm1hdGNoLlBPUztm b3IodmFyIHR5cGUgaW4gRXhwci5tYXRjaCl7RXhwci5tYXRjaFt0eXBlXT1SZWdF eHAoRXhwci5tYXRjaFt0eXBlXS5zb3VyY2UrLyg/IVteXFtdKlxdKSg/IVteXChd KlwpKS8uc291cmNlKTt9CnZhciBtYWtlQXJyYXk9ZnVuY3Rpb24oYXJyYXkscmVz dWx0cyl7YXJyYXk9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJyYXkpO2lm KHJlc3VsdHMpe3Jlc3VsdHMucHVzaC5hcHBseShyZXN1bHRzLGFycmF5KTtyZXR1 cm4gcmVzdWx0czt9CnJldHVybiBhcnJheTt9O3RyeXtBcnJheS5wcm90b3R5cGUu c2xpY2UuY2FsbChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2Rlcyk7 fWNhdGNoKGUpe21ha2VBcnJheT1mdW5jdGlvbihhcnJheSxyZXN1bHRzKXt2YXIg cmV0PXJlc3VsdHN8fFtdO2lmKHRvU3RyaW5nLmNhbGwoYXJyYXkpPT09IltvYmpl Y3QgQXJyYXldIil7QXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkocmV0LGFycmF5 KTt9ZWxzZXtpZih0eXBlb2YgYXJyYXkubGVuZ3RoPT09Im51bWJlciIpe2Zvcih2 YXIgaT0wLGw9YXJyYXkubGVuZ3RoO2k8bDtpKyspe3JldC5wdXNoKGFycmF5W2ld KTt9fWVsc2V7Zm9yKHZhciBpPTA7YXJyYXlbaV07aSsrKXtyZXQucHVzaChhcnJh eVtpXSk7fX19CnJldHVybiByZXQ7fTt9CihmdW5jdGlvbigpe3ZhciBmb3JtPWRv Y3VtZW50LmNyZWF0ZUVsZW1lbnQoImZvcm0iKSxpZD0ic2NyaXB0IisobmV3IERh dGUpLmdldFRpbWUoKTtmb3JtLmlubmVySFRNTD0iPGlucHV0IG5hbWU9JyIraWQr IicvPiI7dmFyIHJvb3Q9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O3Jvb3QuaW5z ZXJ0QmVmb3JlKGZvcm0scm9vdC5maXJzdENoaWxkKTtpZighIWRvY3VtZW50Lmdl dEVsZW1lbnRCeUlkKGlkKSl7RXhwci5maW5kLklEPWZ1bmN0aW9uKG1hdGNoLGNv bnRleHQsaXNYTUwpe2lmKHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkIT09 InVuZGVmaW5lZCImJiFpc1hNTCl7dmFyIG09Y29udGV4dC5nZXRFbGVtZW50QnlJ ZChtYXRjaFsxXSk7cmV0dXJuIG0/bS5pZD09PW1hdGNoWzFdfHx0eXBlb2YgbS5n ZXRBdHRyaWJ1dGVOb2RlIT09InVuZGVmaW5lZCImJm0uZ2V0QXR0cmlidXRlTm9k ZSgiaWQiKS5ub2RlVmFsdWU9PT1tYXRjaFsxXT9bbV06dW5kZWZpbmVkOltdO319 O0V4cHIuZmlsdGVyLklEPWZ1bmN0aW9uKGVsZW0sbWF0Y2gpe3ZhciBub2RlPXR5 cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUhPT0idW5kZWZpbmVkIiYmZWxlbS5n ZXRBdHRyaWJ1dGVOb2RlKCJpZCIpO3JldHVybiBlbGVtLm5vZGVUeXBlPT09MSYm bm9kZSYmbm9kZS5ub2RlVmFsdWU9PT1tYXRjaDt9O30Kcm9vdC5yZW1vdmVDaGls ZChmb3JtKTt9KSgpOyhmdW5jdGlvbigpe3ZhciBkaXY9ZG9jdW1lbnQuY3JlYXRl RWxlbWVudCgiZGl2Iik7ZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUNv bW1lbnQoIiIpKTtpZihkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5n dGg+MCl7RXhwci5maW5kLlRBRz1mdW5jdGlvbihtYXRjaCxjb250ZXh0KXt2YXIg cmVzdWx0cz1jb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKG1hdGNoWzFdKTtp ZihtYXRjaFsxXT09PSIqIil7dmFyIHRtcD1bXTtmb3IodmFyIGk9MDtyZXN1bHRz W2ldO2krKyl7aWYocmVzdWx0c1tpXS5ub2RlVHlwZT09PTEpe3RtcC5wdXNoKHJl c3VsdHNbaV0pO319CnJlc3VsdHM9dG1wO30KcmV0dXJuIHJlc3VsdHM7fTt9CmRp di5pbm5lckhUTUw9IjxhIGhyZWY9JyMnPjwvYT4iO2lmKGRpdi5maXJzdENoaWxk JiZkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSE9PSIjIil7RXhw ci5hdHRySGFuZGxlLmhyZWY9ZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGVsZW0uZ2V0 QXR0cmlidXRlKCJocmVmIiwyKTt9O319KSgpO2lmKGRvY3VtZW50LnF1ZXJ5U2Vs ZWN0b3JBbGwpKGZ1bmN0aW9uKCl7dmFyIG9sZFNpenpsZT1TaXp6bGUsZGl2PWRv Y3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Rpdi5pbm5lckhUTUw9IjxwIGNs YXNzPSdURVNUJz48L3A+IjtpZihkaXYucXVlcnlTZWxlY3RvckFsbCYmZGl2LnF1 ZXJ5U2VsZWN0b3JBbGwoIi5URVNUIikubGVuZ3RoPT09MCl7cmV0dXJuO30KU2l6 emxlPWZ1bmN0aW9uKHF1ZXJ5LGNvbnRleHQsZXh0cmEsc2VlZCl7Y29udGV4dD1j b250ZXh0fHxkb2N1bWVudDtpZighc2VlZCYmY29udGV4dC5ub2RlVHlwZT09PTkm JiFpc1hNTChjb250ZXh0KSl7dHJ5e3JldHVybiBtYWtlQXJyYXkoY29udGV4dC5x dWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KSxleHRyYSk7fWNhdGNoKGUpe319CnJldHVy biBvbGRTaXp6bGUocXVlcnksY29udGV4dCxleHRyYSxzZWVkKTt9O1NpenpsZS5m aW5kPW9sZFNpenpsZS5maW5kO1NpenpsZS5maWx0ZXI9b2xkU2l6emxlLmZpbHRl cjtTaXp6bGUuc2VsZWN0b3JzPW9sZFNpenpsZS5zZWxlY3RvcnM7U2l6emxlLm1h dGNoZXM9b2xkU2l6emxlLm1hdGNoZXM7fSkoKTtpZihkb2N1bWVudC5nZXRFbGVt ZW50c0J5Q2xhc3NOYW1lJiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0RWxl bWVudHNCeUNsYXNzTmFtZSl7RXhwci5vcmRlci5zcGxpY2UoMSwwLCJDTEFTUyIp O0V4cHIuZmluZC5DTEFTUz1mdW5jdGlvbihtYXRjaCxjb250ZXh0KXtyZXR1cm4g Y29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKG1hdGNoWzFdKTt9O30KZnVu Y3Rpb24gZGlyTm9kZUNoZWNrKGRpcixjdXIsZG9uZU5hbWUsY2hlY2tTZXQsbm9k ZUNoZWNrLGlzWE1MKXtmb3IodmFyIGk9MCxsPWNoZWNrU2V0Lmxlbmd0aDtpPGw7 aSsrKXt2YXIgZWxlbT1jaGVja1NldFtpXTtpZihlbGVtKXtlbGVtPWVsZW1bZGly XTt2YXIgbWF0Y2g9ZmFsc2U7d2hpbGUoZWxlbSYmZWxlbS5ub2RlVHlwZSl7dmFy IGRvbmU9ZWxlbVtkb25lTmFtZV07aWYoZG9uZSl7bWF0Y2g9Y2hlY2tTZXRbZG9u ZV07YnJlYWs7fQppZihlbGVtLm5vZGVUeXBlPT09MSYmIWlzWE1MKQplbGVtW2Rv bmVOYW1lXT1pO2lmKGVsZW0ubm9kZU5hbWU9PT1jdXIpe21hdGNoPWVsZW07YnJl YWs7fQplbGVtPWVsZW1bZGlyXTt9CmNoZWNrU2V0W2ldPW1hdGNoO319fQpmdW5j dGlvbiBkaXJDaGVjayhkaXIsY3VyLGRvbmVOYW1lLGNoZWNrU2V0LG5vZGVDaGVj ayxpc1hNTCl7Zm9yKHZhciBpPTAsbD1jaGVja1NldC5sZW5ndGg7aTxsO2krKyl7 dmFyIGVsZW09Y2hlY2tTZXRbaV07aWYoZWxlbSl7ZWxlbT1lbGVtW2Rpcl07dmFy IG1hdGNoPWZhbHNlO3doaWxlKGVsZW0mJmVsZW0ubm9kZVR5cGUpe2lmKGVsZW1b ZG9uZU5hbWVdKXttYXRjaD1jaGVja1NldFtlbGVtW2RvbmVOYW1lXV07YnJlYWs7 fQppZihlbGVtLm5vZGVUeXBlPT09MSl7aWYoIWlzWE1MKQplbGVtW2RvbmVOYW1l XT1pO2lmKHR5cGVvZiBjdXIhPT0ic3RyaW5nIil7aWYoZWxlbT09PWN1cil7bWF0 Y2g9dHJ1ZTticmVhazt9fWVsc2UgaWYoU2l6emxlLmZpbHRlcihjdXIsW2VsZW1d KS5sZW5ndGg+MCl7bWF0Y2g9ZWxlbTticmVhazt9fQplbGVtPWVsZW1bZGlyXTt9 CmNoZWNrU2V0W2ldPW1hdGNoO319fQp2YXIgY29udGFpbnM9ZG9jdW1lbnQuY29t cGFyZURvY3VtZW50UG9zaXRpb24/ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jb21w YXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNjt9OmZ1bmN0aW9uKGEsYil7cmV0dXJu IGEhPT1iJiYoYS5jb250YWlucz9hLmNvbnRhaW5zKGIpOnRydWUpO307dmFyIGlz WE1MPWZ1bmN0aW9uKGVsZW0pe3JldHVybiBlbGVtLm5vZGVUeXBlPT09OSYmZWxl bS5kb2N1bWVudEVsZW1lbnQubm9kZU5hbWUhPT0iSFRNTCJ8fCEhZWxlbS5vd25l ckRvY3VtZW50JiZpc1hNTChlbGVtLm93bmVyRG9jdW1lbnQpO307dmFyIHBvc1By b2Nlc3M9ZnVuY3Rpb24oc2VsZWN0b3IsY29udGV4dCl7dmFyIHRtcFNldD1bXSxs YXRlcj0iIixtYXRjaCxyb290PWNvbnRleHQubm9kZVR5cGU/W2NvbnRleHRdOmNv bnRleHQ7d2hpbGUoKG1hdGNoPUV4cHIubWF0Y2guUFNFVURPLmV4ZWMoc2VsZWN0 b3IpKSl7bGF0ZXIrPW1hdGNoWzBdO3NlbGVjdG9yPXNlbGVjdG9yLnJlcGxhY2Uo RXhwci5tYXRjaC5QU0VVRE8sIiIpO30Kc2VsZWN0b3I9RXhwci5yZWxhdGl2ZVtz ZWxlY3Rvcl0/c2VsZWN0b3IrIioiOnNlbGVjdG9yO2Zvcih2YXIgaT0wLGw9cm9v dC5sZW5ndGg7aTxsO2krKyl7U2l6emxlKHNlbGVjdG9yLHJvb3RbaV0sdG1wU2V0 KTt9CnJldHVybiBTaXp6bGUuZmlsdGVyKGxhdGVyLHRtcFNldCk7fTtqUXVlcnku ZmluZD1TaXp6bGU7alF1ZXJ5LmZpbHRlcj1TaXp6bGUuZmlsdGVyO2pRdWVyeS5l eHByPVNpenpsZS5zZWxlY3RvcnM7alF1ZXJ5LmV4cHJbIjoiXT1qUXVlcnkuZXhw ci5maWx0ZXJzO1NpenpsZS5zZWxlY3RvcnMuZmlsdGVycy5oaWRkZW49ZnVuY3Rp b24oZWxlbSl7cmV0dXJuImhpZGRlbiI9PT1lbGVtLnR5cGV8fGpRdWVyeS5jc3Mo ZWxlbSwiZGlzcGxheSIpPT09Im5vbmUifHxqUXVlcnkuY3NzKGVsZW0sInZpc2li aWxpdHkiKT09PSJoaWRkZW4iO307U2l6emxlLnNlbGVjdG9ycy5maWx0ZXJzLnZp c2libGU9ZnVuY3Rpb24oZWxlbSl7cmV0dXJuImhpZGRlbiIhPT1lbGVtLnR5cGUm JmpRdWVyeS5jc3MoZWxlbSwiZGlzcGxheSIpIT09Im5vbmUiJiZqUXVlcnkuY3Nz KGVsZW0sInZpc2liaWxpdHkiKSE9PSJoaWRkZW4iO307U2l6emxlLnNlbGVjdG9y cy5maWx0ZXJzLmFuaW1hdGVkPWZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnku Z3JlcChqUXVlcnkudGltZXJzLGZ1bmN0aW9uKGZuKXtyZXR1cm4gZWxlbT09PWZu LmVsZW07fSkubGVuZ3RoO307alF1ZXJ5Lm11bHRpRmlsdGVyPWZ1bmN0aW9uKGV4 cHIsZWxlbXMsbm90KXtpZihub3Qpe2V4cHI9Ijpub3QoIitleHByKyIpIjt9CnJl dHVybiBTaXp6bGUubWF0Y2hlcyhleHByLGVsZW1zKTt9O2pRdWVyeS5kaXI9ZnVu Y3Rpb24oZWxlbSxkaXIpe3ZhciBtYXRjaGVkPVtdLGN1cj1lbGVtW2Rpcl07d2hp bGUoY3VyJiZjdXIhPWRvY3VtZW50KXtpZihjdXIubm9kZVR5cGU9PTEpCm1hdGNo ZWQucHVzaChjdXIpO2N1cj1jdXJbZGlyXTt9CnJldHVybiBtYXRjaGVkO307alF1 ZXJ5Lm50aD1mdW5jdGlvbihjdXIscmVzdWx0LGRpcixlbGVtKXtyZXN1bHQ9cmVz dWx0fHwxO3ZhciBudW09MDtmb3IoO2N1cjtjdXI9Y3VyW2Rpcl0pCmlmKGN1ci5u b2RlVHlwZT09MSYmKytudW09PXJlc3VsdCkKYnJlYWs7cmV0dXJuIGN1cjt9O2pR dWVyeS5zaWJsaW5nPWZ1bmN0aW9uKG4sZWxlbSl7dmFyIHI9W107Zm9yKDtuO249 bi5uZXh0U2libGluZyl7aWYobi5ub2RlVHlwZT09MSYmbiE9ZWxlbSkKci5wdXNo KG4pO30KcmV0dXJuIHI7fTtyZXR1cm47d2luZG93LlNpenpsZT1TaXp6bGU7fSko KTtqUXVlcnkuZXZlbnQ9e2FkZDpmdW5jdGlvbihlbGVtLHR5cGVzLGhhbmRsZXIs ZGF0YSl7aWYoZWxlbS5ub2RlVHlwZT09M3x8ZWxlbS5ub2RlVHlwZT09OCkKcmV0 dXJuO2lmKGVsZW0uc2V0SW50ZXJ2YWwmJmVsZW0hPXdpbmRvdykKZWxlbT13aW5k b3c7aWYoIWhhbmRsZXIuZ3VpZCkKaGFuZGxlci5ndWlkPXRoaXMuZ3VpZCsrO2lm KGRhdGEhPT11bmRlZmluZWQpe3ZhciBmbj1oYW5kbGVyO2hhbmRsZXI9dGhpcy5w cm94eShmbik7aGFuZGxlci5kYXRhPWRhdGE7fQp2YXIgZXZlbnRzPWpRdWVyeS5k YXRhKGVsZW0sImV2ZW50cyIpfHxqUXVlcnkuZGF0YShlbGVtLCJldmVudHMiLHt9 KSxoYW5kbGU9alF1ZXJ5LmRhdGEoZWxlbSwiaGFuZGxlIil8fGpRdWVyeS5kYXRh KGVsZW0sImhhbmRsZSIsZnVuY3Rpb24oKXtyZXR1cm4gdHlwZW9mIGpRdWVyeSE9 PSJ1bmRlZmluZWQiJiYhalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZD9qUXVlcnkuZXZl bnQuaGFuZGxlLmFwcGx5KGFyZ3VtZW50cy5jYWxsZWUuZWxlbSxhcmd1bWVudHMp OnVuZGVmaW5lZDt9KTtoYW5kbGUuZWxlbT1lbGVtO2pRdWVyeS5lYWNoKHR5cGVz LnNwbGl0KC9ccysvKSxmdW5jdGlvbihpbmRleCx0eXBlKXt2YXIgbmFtZXNwYWNl cz10eXBlLnNwbGl0KCIuIik7dHlwZT1uYW1lc3BhY2VzLnNoaWZ0KCk7aGFuZGxl ci50eXBlPW5hbWVzcGFjZXMuc2xpY2UoKS5zb3J0KCkuam9pbigiLiIpO3ZhciBo YW5kbGVycz1ldmVudHNbdHlwZV07aWYoalF1ZXJ5LmV2ZW50LnNwZWNpYWxBbGxb dHlwZV0pCmpRdWVyeS5ldmVudC5zcGVjaWFsQWxsW3R5cGVdLnNldHVwLmNhbGwo ZWxlbSxkYXRhLG5hbWVzcGFjZXMpO2lmKCFoYW5kbGVycyl7aGFuZGxlcnM9ZXZl bnRzW3R5cGVdPXt9O2lmKCFqUXVlcnkuZXZlbnQuc3BlY2lhbFt0eXBlXXx8alF1 ZXJ5LmV2ZW50LnNwZWNpYWxbdHlwZV0uc2V0dXAuY2FsbChlbGVtLGRhdGEsbmFt ZXNwYWNlcyk9PT1mYWxzZSl7aWYoZWxlbS5hZGRFdmVudExpc3RlbmVyKQplbGVt LmFkZEV2ZW50TGlzdGVuZXIodHlwZSxoYW5kbGUsZmFsc2UpO2Vsc2UgaWYoZWxl bS5hdHRhY2hFdmVudCkKZWxlbS5hdHRhY2hFdmVudCgib24iK3R5cGUsaGFuZGxl KTt9fQpoYW5kbGVyc1toYW5kbGVyLmd1aWRdPWhhbmRsZXI7alF1ZXJ5LmV2ZW50 Lmdsb2JhbFt0eXBlXT10cnVlO30pO2VsZW09bnVsbDt9LGd1aWQ6MSxnbG9iYWw6 e30scmVtb3ZlOmZ1bmN0aW9uKGVsZW0sdHlwZXMsaGFuZGxlcil7aWYoZWxlbS5u b2RlVHlwZT09M3x8ZWxlbS5ub2RlVHlwZT09OCkKcmV0dXJuO3ZhciBldmVudHM9 alF1ZXJ5LmRhdGEoZWxlbSwiZXZlbnRzIikscmV0LGluZGV4O2lmKGV2ZW50cyl7 aWYodHlwZXM9PT11bmRlZmluZWR8fCh0eXBlb2YgdHlwZXM9PT0ic3RyaW5nIiYm dHlwZXMuY2hhckF0KDApPT0iLiIpKQpmb3IodmFyIHR5cGUgaW4gZXZlbnRzKQp0 aGlzLnJlbW92ZShlbGVtLHR5cGUrKHR5cGVzfHwiIikpO2Vsc2V7aWYodHlwZXMu dHlwZSl7aGFuZGxlcj10eXBlcy5oYW5kbGVyO3R5cGVzPXR5cGVzLnR5cGU7fQpq UXVlcnkuZWFjaCh0eXBlcy5zcGxpdCgvXHMrLyksZnVuY3Rpb24oaW5kZXgsdHlw ZSl7dmFyIG5hbWVzcGFjZXM9dHlwZS5zcGxpdCgiLiIpO3R5cGU9bmFtZXNwYWNl cy5zaGlmdCgpO3ZhciBuYW1lc3BhY2U9UmVnRXhwKCIoXnxcXC4pIituYW1lc3Bh Y2VzLnNsaWNlKCkuc29ydCgpLmpvaW4oIi4qXFwuIikrIihcXC58JCkiKTtpZihl dmVudHNbdHlwZV0pe2lmKGhhbmRsZXIpCmRlbGV0ZSBldmVudHNbdHlwZV1baGFu ZGxlci5ndWlkXTtlbHNlCmZvcih2YXIgaGFuZGxlIGluIGV2ZW50c1t0eXBlXSkK aWYobmFtZXNwYWNlLnRlc3QoZXZlbnRzW3R5cGVdW2hhbmRsZV0udHlwZSkpCmRl bGV0ZSBldmVudHNbdHlwZV1baGFuZGxlXTtpZihqUXVlcnkuZXZlbnQuc3BlY2lh bEFsbFt0eXBlXSkKalF1ZXJ5LmV2ZW50LnNwZWNpYWxBbGxbdHlwZV0udGVhcmRv d24uY2FsbChlbGVtLG5hbWVzcGFjZXMpO2ZvcihyZXQgaW4gZXZlbnRzW3R5cGVd KWJyZWFrO2lmKCFyZXQpe2lmKCFqUXVlcnkuZXZlbnQuc3BlY2lhbFt0eXBlXXx8 alF1ZXJ5LmV2ZW50LnNwZWNpYWxbdHlwZV0udGVhcmRvd24uY2FsbChlbGVtLG5h bWVzcGFjZXMpPT09ZmFsc2Upe2lmKGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcikK ZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsalF1ZXJ5LmRhdGEoZWxlbSwi aGFuZGxlIiksZmFsc2UpO2Vsc2UgaWYoZWxlbS5kZXRhY2hFdmVudCkKZWxlbS5k ZXRhY2hFdmVudCgib24iK3R5cGUsalF1ZXJ5LmRhdGEoZWxlbSwiaGFuZGxlIikp O30KcmV0PW51bGw7ZGVsZXRlIGV2ZW50c1t0eXBlXTt9fX0pO30KZm9yKHJldCBp biBldmVudHMpYnJlYWs7aWYoIXJldCl7dmFyIGhhbmRsZT1qUXVlcnkuZGF0YShl bGVtLCJoYW5kbGUiKTtpZihoYW5kbGUpaGFuZGxlLmVsZW09bnVsbDtqUXVlcnku cmVtb3ZlRGF0YShlbGVtLCJldmVudHMiKTtqUXVlcnkucmVtb3ZlRGF0YShlbGVt LCJoYW5kbGUiKTt9fX0sdHJpZ2dlcjpmdW5jdGlvbihldmVudCxkYXRhLGVsZW0s YnViYmxpbmcpe3ZhciB0eXBlPWV2ZW50LnR5cGV8fGV2ZW50O2lmKCFidWJibGlu Zyl7ZXZlbnQ9dHlwZW9mIGV2ZW50PT09Im9iamVjdCI/ZXZlbnRbZXhwYW5kb10/ ZXZlbnQ6alF1ZXJ5LmV4dGVuZChqUXVlcnkuRXZlbnQodHlwZSksZXZlbnQpOmpR dWVyeS5FdmVudCh0eXBlKTtpZih0eXBlLmluZGV4T2YoIiEiKT49MCl7ZXZlbnQu dHlwZT10eXBlPXR5cGUuc2xpY2UoMCwtMSk7ZXZlbnQuZXhjbHVzaXZlPXRydWU7 fQppZighZWxlbSl7ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7aWYodGhpcy5nbG9i YWxbdHlwZV0pCmpRdWVyeS5lYWNoKGpRdWVyeS5jYWNoZSxmdW5jdGlvbigpe2lm KHRoaXMuZXZlbnRzJiZ0aGlzLmV2ZW50c1t0eXBlXSkKalF1ZXJ5LmV2ZW50LnRy aWdnZXIoZXZlbnQsZGF0YSx0aGlzLmhhbmRsZS5lbGVtKTt9KTt9CmlmKCFlbGVt fHxlbGVtLm5vZGVUeXBlPT0zfHxlbGVtLm5vZGVUeXBlPT04KQpyZXR1cm4gdW5k ZWZpbmVkO2V2ZW50LnJlc3VsdD11bmRlZmluZWQ7ZXZlbnQudGFyZ2V0PWVsZW07 ZGF0YT1qUXVlcnkubWFrZUFycmF5KGRhdGEpO2RhdGEudW5zaGlmdChldmVudCk7 fQpldmVudC5jdXJyZW50VGFyZ2V0PWVsZW07dmFyIGhhbmRsZT1qUXVlcnkuZGF0 YShlbGVtLCJoYW5kbGUiKTtpZihoYW5kbGUpCmhhbmRsZS5hcHBseShlbGVtLGRh dGEpO2lmKCghZWxlbVt0eXBlXXx8KGpRdWVyeS5ub2RlTmFtZShlbGVtLCdhJykm JnR5cGU9PSJjbGljayIpKSYmZWxlbVsib24iK3R5cGVdJiZlbGVtWyJvbiIrdHlw ZV0uYXBwbHkoZWxlbSxkYXRhKT09PWZhbHNlKQpldmVudC5yZXN1bHQ9ZmFsc2U7 aWYoIWJ1YmJsaW5nJiZlbGVtW3R5cGVdJiYhZXZlbnQuaXNEZWZhdWx0UHJldmVu dGVkKCkmJiEoalF1ZXJ5Lm5vZGVOYW1lKGVsZW0sJ2EnKSYmdHlwZT09ImNsaWNr Iikpe3RoaXMudHJpZ2dlcmVkPXRydWU7dHJ5e2VsZW1bdHlwZV0oKTt9Y2F0Y2go ZSl7fX0KdGhpcy50cmlnZ2VyZWQ9ZmFsc2U7aWYoIWV2ZW50LmlzUHJvcGFnYXRp b25TdG9wcGVkKCkpe3ZhciBwYXJlbnQ9ZWxlbS5wYXJlbnROb2RlfHxlbGVtLm93 bmVyRG9jdW1lbnQ7aWYocGFyZW50KQpqUXVlcnkuZXZlbnQudHJpZ2dlcihldmVu dCxkYXRhLHBhcmVudCx0cnVlKTt9fSxoYW5kbGU6ZnVuY3Rpb24oZXZlbnQpe3Zh ciBhbGwsaGFuZGxlcnM7ZXZlbnQ9YXJndW1lbnRzWzBdPWpRdWVyeS5ldmVudC5m aXgoZXZlbnR8fHdpbmRvdy5ldmVudCk7dmFyIG5hbWVzcGFjZXM9ZXZlbnQudHlw ZS5zcGxpdCgiLiIpO2V2ZW50LnR5cGU9bmFtZXNwYWNlcy5zaGlmdCgpO2FsbD0h bmFtZXNwYWNlcy5sZW5ndGgmJiFldmVudC5leGNsdXNpdmU7dmFyIG5hbWVzcGFj ZT1SZWdFeHAoIihefFxcLikiK25hbWVzcGFjZXMuc2xpY2UoKS5zb3J0KCkuam9p bigiLipcXC4iKSsiKFxcLnwkKSIpO2hhbmRsZXJzPShqUXVlcnkuZGF0YSh0aGlz LCJldmVudHMiKXx8e30pW2V2ZW50LnR5cGVdO2Zvcih2YXIgaiBpbiBoYW5kbGVy cyl7dmFyIGhhbmRsZXI9aGFuZGxlcnNbal07aWYoYWxsfHxuYW1lc3BhY2UudGVz dChoYW5kbGVyLnR5cGUpKXtldmVudC5oYW5kbGVyPWhhbmRsZXI7ZXZlbnQuZGF0 YT1oYW5kbGVyLmRhdGE7dmFyIHJldD1oYW5kbGVyLmFwcGx5KHRoaXMsYXJndW1l bnRzKTtpZihyZXQhPT11bmRlZmluZWQpe2V2ZW50LnJlc3VsdD1yZXQ7aWYocmV0 PT09ZmFsc2Upe2V2ZW50LnByZXZlbnREZWZhdWx0KCk7ZXZlbnQuc3RvcFByb3Bh Z2F0aW9uKCk7fX0KaWYoZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3Bw ZWQoKSkKYnJlYWs7fX19LHByb3BzOiJhbHRLZXkgYXR0ckNoYW5nZSBhdHRyTmFt ZSBidWJibGVzIGJ1dHRvbiBjYW5jZWxhYmxlIGNoYXJDb2RlIGNsaWVudFggY2xp ZW50WSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZGF0YSBkZXRhaWwgZXZlbnRQaGFz ZSBmcm9tRWxlbWVudCBoYW5kbGVyIGtleUNvZGUgbWV0YUtleSBuZXdWYWx1ZSBv cmlnaW5hbFRhcmdldCBwYWdlWCBwYWdlWSBwcmV2VmFsdWUgcmVsYXRlZE5vZGUg cmVsYXRlZFRhcmdldCBzY3JlZW5YIHNjcmVlblkgc2hpZnRLZXkgc3JjRWxlbWVu dCB0YXJnZXQgdG9FbGVtZW50IHZpZXcgd2hlZWxEZWx0YSB3aGljaCIuc3BsaXQo IiAiKSxmaXg6ZnVuY3Rpb24oZXZlbnQpe2lmKGV2ZW50W2V4cGFuZG9dKQpyZXR1 cm4gZXZlbnQ7dmFyIG9yaWdpbmFsRXZlbnQ9ZXZlbnQ7ZXZlbnQ9alF1ZXJ5LkV2 ZW50KG9yaWdpbmFsRXZlbnQpO2Zvcih2YXIgaT10aGlzLnByb3BzLmxlbmd0aCxw cm9wO2k7KXtwcm9wPXRoaXMucHJvcHNbLS1pXTtldmVudFtwcm9wXT1vcmlnaW5h bEV2ZW50W3Byb3BdO30KaWYoIWV2ZW50LnRhcmdldCkKZXZlbnQudGFyZ2V0PWV2 ZW50LnNyY0VsZW1lbnR8fGRvY3VtZW50O2lmKGV2ZW50LnRhcmdldC5ub2RlVHlw ZT09MykKZXZlbnQudGFyZ2V0PWV2ZW50LnRhcmdldC5wYXJlbnROb2RlO2lmKCFl dmVudC5yZWxhdGVkVGFyZ2V0JiZldmVudC5mcm9tRWxlbWVudCkKZXZlbnQucmVs YXRlZFRhcmdldD1ldmVudC5mcm9tRWxlbWVudD09ZXZlbnQudGFyZ2V0P2V2ZW50 LnRvRWxlbWVudDpldmVudC5mcm9tRWxlbWVudDtpZihldmVudC5wYWdlWD09bnVs bCYmZXZlbnQuY2xpZW50WCE9bnVsbCl7dmFyIGRvYz1kb2N1bWVudC5kb2N1bWVu dEVsZW1lbnQsYm9keT1kb2N1bWVudC5ib2R5O2V2ZW50LnBhZ2VYPWV2ZW50LmNs aWVudFgrKGRvYyYmZG9jLnNjcm9sbExlZnR8fGJvZHkmJmJvZHkuc2Nyb2xsTGVm dHx8MCktKGRvYy5jbGllbnRMZWZ0fHwwKTtldmVudC5wYWdlWT1ldmVudC5jbGll bnRZKyhkb2MmJmRvYy5zY3JvbGxUb3B8fGJvZHkmJmJvZHkuc2Nyb2xsVG9wfHww KS0oZG9jLmNsaWVudFRvcHx8MCk7fQppZighZXZlbnQud2hpY2gmJigoZXZlbnQu Y2hhckNvZGV8fGV2ZW50LmNoYXJDb2RlPT09MCk/ZXZlbnQuY2hhckNvZGU6ZXZl bnQua2V5Q29kZSkpCmV2ZW50LndoaWNoPWV2ZW50LmNoYXJDb2RlfHxldmVudC5r ZXlDb2RlO2lmKCFldmVudC5tZXRhS2V5JiZldmVudC5jdHJsS2V5KQpldmVudC5t ZXRhS2V5PWV2ZW50LmN0cmxLZXk7aWYoIWV2ZW50LndoaWNoJiZldmVudC5idXR0 b24pCmV2ZW50LndoaWNoPShldmVudC5idXR0b24mMT8xOihldmVudC5idXR0b24m Mj8zOihldmVudC5idXR0b24mND8yOjApKSk7cmV0dXJuIGV2ZW50O30scHJveHk6 ZnVuY3Rpb24oZm4scHJveHkpe3Byb3h5PXByb3h5fHxmdW5jdGlvbigpe3JldHVy biBmbi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7fTtwcm94eS5ndWlkPWZuLmd1aWQ9 Zm4uZ3VpZHx8cHJveHkuZ3VpZHx8dGhpcy5ndWlkKys7cmV0dXJuIHByb3h5O30s c3BlY2lhbDp7cmVhZHk6e3NldHVwOmJpbmRSZWFkeSx0ZWFyZG93bjpmdW5jdGlv bigpe319fSxzcGVjaWFsQWxsOntsaXZlOntzZXR1cDpmdW5jdGlvbihzZWxlY3Rv cixuYW1lc3BhY2VzKXtqUXVlcnkuZXZlbnQuYWRkKHRoaXMsbmFtZXNwYWNlc1sw XSxsaXZlSGFuZGxlcik7fSx0ZWFyZG93bjpmdW5jdGlvbihuYW1lc3BhY2VzKXtp ZihuYW1lc3BhY2VzLmxlbmd0aCl7dmFyIHJlbW92ZT0wLG5hbWU9UmVnRXhwKCIo XnxcXC4pIituYW1lc3BhY2VzWzBdKyIoXFwufCQpIik7alF1ZXJ5LmVhY2goKGpR dWVyeS5kYXRhKHRoaXMsImV2ZW50cyIpLmxpdmV8fHt9KSxmdW5jdGlvbigpe2lm KG5hbWUudGVzdCh0aGlzLnR5cGUpKQpyZW1vdmUrKzt9KTtpZihyZW1vdmU8MSkK alF1ZXJ5LmV2ZW50LnJlbW92ZSh0aGlzLG5hbWVzcGFjZXNbMF0sbGl2ZUhhbmRs ZXIpO319fX19O2pRdWVyeS5FdmVudD1mdW5jdGlvbihzcmMpe2lmKCF0aGlzLnBy ZXZlbnREZWZhdWx0KQpyZXR1cm4gbmV3IGpRdWVyeS5FdmVudChzcmMpO2lmKHNy YyYmc3JjLnR5cGUpe3RoaXMub3JpZ2luYWxFdmVudD1zcmM7dGhpcy50eXBlPXNy Yy50eXBlO31lbHNlCnRoaXMudHlwZT1zcmM7dGhpcy50aW1lU3RhbXA9bm93KCk7 dGhpc1tleHBhbmRvXT10cnVlO307ZnVuY3Rpb24gcmV0dXJuRmFsc2UoKXtyZXR1 cm4gZmFsc2U7fQpmdW5jdGlvbiByZXR1cm5UcnVlKCl7cmV0dXJuIHRydWU7fQpq UXVlcnkuRXZlbnQucHJvdG90eXBlPXtwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigp e3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPXJldHVyblRydWU7dmFyIGU9dGhpcy5v cmlnaW5hbEV2ZW50O2lmKCFlKQpyZXR1cm47aWYoZS5wcmV2ZW50RGVmYXVsdCkK ZS5wcmV2ZW50RGVmYXVsdCgpO2UucmV0dXJuVmFsdWU9ZmFsc2U7fSxzdG9wUHJv cGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPXJl dHVyblRydWU7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O2lmKCFlKQpyZXR1cm47 aWYoZS5zdG9wUHJvcGFnYXRpb24pCmUuc3RvcFByb3BhZ2F0aW9uKCk7ZS5jYW5j ZWxCdWJibGU9dHJ1ZTt9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlv bigpe3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9cmV0dXJuVHJ1 ZTt0aGlzLnN0b3BQcm9wYWdhdGlvbigpO30saXNEZWZhdWx0UHJldmVudGVkOnJl dHVybkZhbHNlLGlzUHJvcGFnYXRpb25TdG9wcGVkOnJldHVybkZhbHNlLGlzSW1t ZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOnJldHVybkZhbHNlfTt2YXIgd2l0aGlu RWxlbWVudD1mdW5jdGlvbihldmVudCl7dmFyIHBhcmVudD1ldmVudC5yZWxhdGVk VGFyZ2V0O3doaWxlKHBhcmVudCYmcGFyZW50IT10aGlzKQp0cnl7cGFyZW50PXBh cmVudC5wYXJlbnROb2RlO30KY2F0Y2goZSl7cGFyZW50PXRoaXM7fQppZihwYXJl bnQhPXRoaXMpe2V2ZW50LnR5cGU9ZXZlbnQuZGF0YTtqUXVlcnkuZXZlbnQuaGFu ZGxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9fTtqUXVlcnkuZWFjaCh7bW91c2Vv dmVyOidtb3VzZWVudGVyJyxtb3VzZW91dDonbW91c2VsZWF2ZSd9LGZ1bmN0aW9u KG9yaWcsZml4KXtqUXVlcnkuZXZlbnQuc3BlY2lhbFtmaXhdPXtzZXR1cDpmdW5j dGlvbigpe2pRdWVyeS5ldmVudC5hZGQodGhpcyxvcmlnLHdpdGhpbkVsZW1lbnQs Zml4KTt9LHRlYXJkb3duOmZ1bmN0aW9uKCl7alF1ZXJ5LmV2ZW50LnJlbW92ZSh0 aGlzLG9yaWcsd2l0aGluRWxlbWVudCk7fX07fSk7alF1ZXJ5LmZuLmV4dGVuZCh7 YmluZDpmdW5jdGlvbih0eXBlLGRhdGEsZm4pe3JldHVybiB0eXBlPT0idW5sb2Fk Ij90aGlzLm9uZSh0eXBlLGRhdGEsZm4pOnRoaXMuZWFjaChmdW5jdGlvbigpe2pR dWVyeS5ldmVudC5hZGQodGhpcyx0eXBlLGZufHxkYXRhLGZuJiZkYXRhKTt9KTt9 LG9uZTpmdW5jdGlvbih0eXBlLGRhdGEsZm4pe3ZhciBvbmU9alF1ZXJ5LmV2ZW50 LnByb3h5KGZufHxkYXRhLGZ1bmN0aW9uKGV2ZW50KXtqUXVlcnkodGhpcykudW5i aW5kKGV2ZW50LG9uZSk7cmV0dXJuKGZufHxkYXRhKS5hcHBseSh0aGlzLGFyZ3Vt ZW50cyk7fSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2pRdWVyeS5ldmVu dC5hZGQodGhpcyx0eXBlLG9uZSxmbiYmZGF0YSk7fSk7fSx1bmJpbmQ6ZnVuY3Rp b24odHlwZSxmbil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2pRdWVyeS5l dmVudC5yZW1vdmUodGhpcyx0eXBlLGZuKTt9KTt9LHRyaWdnZXI6ZnVuY3Rpb24o dHlwZSxkYXRhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7alF1ZXJ5LmV2 ZW50LnRyaWdnZXIodHlwZSxkYXRhLHRoaXMpO30pO30sdHJpZ2dlckhhbmRsZXI6 ZnVuY3Rpb24odHlwZSxkYXRhKXtpZih0aGlzWzBdKXt2YXIgZXZlbnQ9alF1ZXJ5 LkV2ZW50KHR5cGUpO2V2ZW50LnByZXZlbnREZWZhdWx0KCk7ZXZlbnQuc3RvcFBy b3BhZ2F0aW9uKCk7alF1ZXJ5LmV2ZW50LnRyaWdnZXIoZXZlbnQsZGF0YSx0aGlz WzBdKTtyZXR1cm4gZXZlbnQucmVzdWx0O319LHRvZ2dsZTpmdW5jdGlvbihmbil7 dmFyIGFyZ3M9YXJndW1lbnRzLGk9MTt3aGlsZShpPGFyZ3MubGVuZ3RoKQpqUXVl cnkuZXZlbnQucHJveHkoZm4sYXJnc1tpKytdKTtyZXR1cm4gdGhpcy5jbGljayhq UXVlcnkuZXZlbnQucHJveHkoZm4sZnVuY3Rpb24oZXZlbnQpe3RoaXMubGFzdFRv Z2dsZT0odGhpcy5sYXN0VG9nZ2xlfHwwKSVpO2V2ZW50LnByZXZlbnREZWZhdWx0 KCk7cmV0dXJuIGFyZ3NbdGhpcy5sYXN0VG9nZ2xlKytdLmFwcGx5KHRoaXMsYXJn dW1lbnRzKXx8ZmFsc2U7fSkpO30saG92ZXI6ZnVuY3Rpb24oZm5PdmVyLGZuT3V0 KXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGZuT3ZlcikubW91c2VsZWF2ZShmbk91 dCk7fSxyZWFkeTpmdW5jdGlvbihmbil7YmluZFJlYWR5KCk7aWYoalF1ZXJ5Lmlz UmVhZHkpCmZuLmNhbGwoZG9jdW1lbnQsalF1ZXJ5KTtlbHNlCmpRdWVyeS5yZWFk eUxpc3QucHVzaChmbik7cmV0dXJuIHRoaXM7fSxsaXZlOmZ1bmN0aW9uKHR5cGUs Zm4pe3ZhciBwcm94eT1qUXVlcnkuZXZlbnQucHJveHkoZm4pO3Byb3h5Lmd1aWQr PXRoaXMuc2VsZWN0b3IrdHlwZTtqUXVlcnkoZG9jdW1lbnQpLmJpbmQobGl2ZUNv bnZlcnQodHlwZSx0aGlzLnNlbGVjdG9yKSx0aGlzLnNlbGVjdG9yLHByb3h5KTty ZXR1cm4gdGhpczt9LGRpZTpmdW5jdGlvbih0eXBlLGZuKXtqUXVlcnkoZG9jdW1l bnQpLnVuYmluZChsaXZlQ29udmVydCh0eXBlLHRoaXMuc2VsZWN0b3IpLGZuP3tn dWlkOmZuLmd1aWQrdGhpcy5zZWxlY3Rvcit0eXBlfTpudWxsKTtyZXR1cm4gdGhp czt9fSk7ZnVuY3Rpb24gbGl2ZUhhbmRsZXIoZXZlbnQpe3ZhciBjaGVjaz1SZWdF eHAoIihefFxcLikiK2V2ZW50LnR5cGUrIihcXC58JCkiKSxzdG9wPXRydWUsZWxl bXM9W107alF1ZXJ5LmVhY2goalF1ZXJ5LmRhdGEodGhpcywiZXZlbnRzIikubGl2 ZXx8W10sZnVuY3Rpb24oaSxmbil7aWYoY2hlY2sudGVzdChmbi50eXBlKSl7dmFy IGVsZW09alF1ZXJ5KGV2ZW50LnRhcmdldCkuY2xvc2VzdChmbi5kYXRhKVswXTtp ZihlbGVtKQplbGVtcy5wdXNoKHtlbGVtOmVsZW0sZm46Zm59KTt9fSk7alF1ZXJ5 LmVhY2goZWxlbXMsZnVuY3Rpb24oKXtpZih0aGlzLmZuLmNhbGwodGhpcy5lbGVt LGV2ZW50LHRoaXMuZm4uZGF0YSk9PT1mYWxzZSkKc3RvcD1mYWxzZTt9KTtyZXR1 cm4gc3RvcDt9CmZ1bmN0aW9uIGxpdmVDb252ZXJ0KHR5cGUsc2VsZWN0b3Ipe3Jl dHVyblsibGl2ZSIsdHlwZSxzZWxlY3Rvci5yZXBsYWNlKC9cLi9nLCJgIikucmVw bGFjZSgvIC9nLCJ8IildLmpvaW4oIi4iKTt9CmpRdWVyeS5leHRlbmQoe2lzUmVh ZHk6ZmFsc2UscmVhZHlMaXN0OltdLHJlYWR5OmZ1bmN0aW9uKCl7aWYoIWpRdWVy eS5pc1JlYWR5KXtqUXVlcnkuaXNSZWFkeT10cnVlO2lmKGpRdWVyeS5yZWFkeUxp c3Qpe2pRdWVyeS5lYWNoKGpRdWVyeS5yZWFkeUxpc3QsZnVuY3Rpb24oKXt0aGlz LmNhbGwoZG9jdW1lbnQsalF1ZXJ5KTt9KTtqUXVlcnkucmVhZHlMaXN0PW51bGw7 fQpqUXVlcnkoZG9jdW1lbnQpLnRyaWdnZXJIYW5kbGVyKCJyZWFkeSIpO319fSk7 dmFyIHJlYWR5Qm91bmQ9ZmFsc2U7ZnVuY3Rpb24gYmluZFJlYWR5KCl7aWYocmVh ZHlCb3VuZClyZXR1cm47cmVhZHlCb3VuZD10cnVlO2lmKGRvY3VtZW50LmFkZEV2 ZW50TGlzdGVuZXIpe2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRl bnRMb2FkZWQiLGZ1bmN0aW9uKCl7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5l cigiRE9NQ29udGVudExvYWRlZCIsYXJndW1lbnRzLmNhbGxlZSxmYWxzZSk7alF1 ZXJ5LnJlYWR5KCk7fSxmYWxzZSk7fWVsc2UgaWYoZG9jdW1lbnQuYXR0YWNoRXZl bnQpe2RvY3VtZW50LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLGZ1 bmN0aW9uKCl7aWYoZG9jdW1lbnQucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpe2Rv Y3VtZW50LmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLGFyZ3VtZW50 cy5jYWxsZWUpO2pRdWVyeS5yZWFkeSgpO319KTtpZihkb2N1bWVudC5kb2N1bWVu dEVsZW1lbnQuZG9TY3JvbGwmJnR5cGVvZiB3aW5kb3cuZnJhbWVFbGVtZW50PT09 InVuZGVmaW5lZCIpKGZ1bmN0aW9uKCl7aWYoalF1ZXJ5LmlzUmVhZHkpcmV0dXJu O3RyeXtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwoImxlZnQiKTt9 Y2F0Y2goZXJyb3Ipe3NldFRpbWVvdXQoYXJndW1lbnRzLmNhbGxlZSwwKTtyZXR1 cm47fQpqUXVlcnkucmVhZHkoKTt9KSgpO30KalF1ZXJ5LmV2ZW50LmFkZCh3aW5k b3csImxvYWQiLGpRdWVyeS5yZWFkeSk7fQpqUXVlcnkuZWFjaCgoImJsdXIsZm9j dXMsbG9hZCxyZXNpemUsc2Nyb2xsLHVubG9hZCxjbGljayxkYmxjbGljaywiKwoi bW91c2Vkb3duLG1vdXNldXAsbW91c2Vtb3ZlLG1vdXNlb3Zlcixtb3VzZW91dCxt b3VzZWVudGVyLG1vdXNlbGVhdmUsIisKImNoYW5nZSxzZWxlY3Qsc3VibWl0LGtl eWRvd24sa2V5cHJlc3Msa2V5dXAsZXJyb3IiKS5zcGxpdCgiLCIpLGZ1bmN0aW9u KGksbmFtZSl7alF1ZXJ5LmZuW25hbWVdPWZ1bmN0aW9uKGZuKXtyZXR1cm4gZm4/ dGhpcy5iaW5kKG5hbWUsZm4pOnRoaXMudHJpZ2dlcihuYW1lKTt9O30pO2pRdWVy eSh3aW5kb3cpLmJpbmQoJ3VubG9hZCcsZnVuY3Rpb24oKXtmb3IodmFyIGlkIGlu IGpRdWVyeS5jYWNoZSkKaWYoaWQhPTEmJmpRdWVyeS5jYWNoZVtpZF0uaGFuZGxl KQpqUXVlcnkuZXZlbnQucmVtb3ZlKGpRdWVyeS5jYWNoZVtpZF0uaGFuZGxlLmVs ZW0pO30pOyhmdW5jdGlvbigpe2pRdWVyeS5zdXBwb3J0PXt9O3ZhciByb290PWRv Y3VtZW50LmRvY3VtZW50RWxlbWVudCxzY3JpcHQ9ZG9jdW1lbnQuY3JlYXRlRWxl bWVudCgic2NyaXB0IiksZGl2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIp LGlkPSJzY3JpcHQiKyhuZXcgRGF0ZSkuZ2V0VGltZSgpO2Rpdi5zdHlsZS5kaXNw bGF5PSJub25lIjtkaXYuaW5uZXJIVE1MPScgICA8bGluay8+PHRhYmxlPjwvdGFi bGU+PGEgaHJlZj0iL2EiIHN0eWxlPSJjb2xvcjpyZWQ7ZmxvYXQ6bGVmdDtvcGFj aXR5Oi41OyI+YTwvYT48c2VsZWN0PjxvcHRpb24+dGV4dDwvb3B0aW9uPjwvc2Vs ZWN0PjxvYmplY3Q+PHBhcmFtLz48L29iamVjdD4nO3ZhciBhbGw9ZGl2LmdldEVs ZW1lbnRzQnlUYWdOYW1lKCIqIiksYT1kaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUo ImEiKVswXTtpZighYWxsfHwhYWxsLmxlbmd0aHx8IWEpe3JldHVybjt9CmpRdWVy eS5zdXBwb3J0PXtsZWFkaW5nV2hpdGVzcGFjZTpkaXYuZmlyc3RDaGlsZC5ub2Rl VHlwZT09Myx0Ym9keTohZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIp Lmxlbmd0aCxvYmplY3RBbGw6ISFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIm9i amVjdCIpWzBdCi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aCxodG1s U2VyaWFsaXplOiEhZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJsaW5rIikubGVu Z3RoLHN0eWxlOi9yZWQvLnRlc3QoYS5nZXRBdHRyaWJ1dGUoInN0eWxlIikpLGhy ZWZOb3JtYWxpemVkOmEuZ2V0QXR0cmlidXRlKCJocmVmIik9PT0iL2EiLG9wYWNp dHk6YS5zdHlsZS5vcGFjaXR5PT09IjAuNSIsY3NzRmxvYXQ6ISFhLnN0eWxlLmNz c0Zsb2F0LHNjcmlwdEV2YWw6ZmFsc2Usbm9DbG9uZUV2ZW50OnRydWUsYm94TW9k ZWw6bnVsbH07c2NyaXB0LnR5cGU9InRleHQvamF2YXNjcmlwdCI7dHJ5e3Njcmlw dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgid2luZG93LiIr aWQrIj0xOyIpKTt9Y2F0Y2goZSl7fQpyb290Lmluc2VydEJlZm9yZShzY3JpcHQs cm9vdC5maXJzdENoaWxkKTtpZih3aW5kb3dbaWRdKXtqUXVlcnkuc3VwcG9ydC5z Y3JpcHRFdmFsPXRydWU7ZGVsZXRlIHdpbmRvd1tpZF07fQpyb290LnJlbW92ZUNo aWxkKHNjcmlwdCk7aWYoZGl2LmF0dGFjaEV2ZW50JiZkaXYuZmlyZUV2ZW50KXtk aXYuYXR0YWNoRXZlbnQoIm9uY2xpY2siLGZ1bmN0aW9uKCl7alF1ZXJ5LnN1cHBv cnQubm9DbG9uZUV2ZW50PWZhbHNlO2Rpdi5kZXRhY2hFdmVudCgib25jbGljayIs YXJndW1lbnRzLmNhbGxlZSk7fSk7ZGl2LmNsb25lTm9kZSh0cnVlKS5maXJlRXZl bnQoIm9uY2xpY2siKTt9CmpRdWVyeShmdW5jdGlvbigpe3ZhciBkaXY9ZG9jdW1l bnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZGl2LnN0eWxlLndpZHRoPSIxcHgiO2Rp di5zdHlsZS5wYWRkaW5nTGVmdD0iMXB4Ijtkb2N1bWVudC5ib2R5LmFwcGVuZENo aWxkKGRpdik7alF1ZXJ5LmJveE1vZGVsPWpRdWVyeS5zdXBwb3J0LmJveE1vZGVs PWRpdi5vZmZzZXRXaWR0aD09PTI7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChk aXYpO30pO30pKCk7dmFyIHN0eWxlRmxvYXQ9alF1ZXJ5LnN1cHBvcnQuY3NzRmxv YXQ/ImNzc0Zsb2F0Ijoic3R5bGVGbG9hdCI7alF1ZXJ5LnByb3BzPXsiZm9yIjoi aHRtbEZvciIsImNsYXNzIjoiY2xhc3NOYW1lIiwiZmxvYXQiOnN0eWxlRmxvYXQs Y3NzRmxvYXQ6c3R5bGVGbG9hdCxzdHlsZUZsb2F0OnN0eWxlRmxvYXQscmVhZG9u bHk6InJlYWRPbmx5IixtYXhsZW5ndGg6Im1heExlbmd0aCIsY2VsbHNwYWNpbmc6 ImNlbGxTcGFjaW5nIixyb3dzcGFuOiJyb3dTcGFuIix0YWJpbmRleDoidGFiSW5k ZXgifTtqUXVlcnkuZm4uZXh0ZW5kKHtfbG9hZDpqUXVlcnkuZm4ubG9hZCxsb2Fk OmZ1bmN0aW9uKHVybCxwYXJhbXMsY2FsbGJhY2spe2lmKHR5cGVvZiB1cmwhPT0i c3RyaW5nIikKcmV0dXJuIHRoaXMuX2xvYWQodXJsKTt2YXIgb2ZmPXVybC5pbmRl eE9mKCIgIik7aWYob2ZmPj0wKXt2YXIgc2VsZWN0b3I9dXJsLnNsaWNlKG9mZix1 cmwubGVuZ3RoKTt1cmw9dXJsLnNsaWNlKDAsb2ZmKTt9CnZhciB0eXBlPSJHRVQi O2lmKHBhcmFtcykKaWYoalF1ZXJ5LmlzRnVuY3Rpb24ocGFyYW1zKSl7Y2FsbGJh Y2s9cGFyYW1zO3BhcmFtcz1udWxsO31lbHNlIGlmKHR5cGVvZiBwYXJhbXM9PT0i b2JqZWN0Iil7cGFyYW1zPWpRdWVyeS5wYXJhbShwYXJhbXMpO3R5cGU9IlBPU1Qi O30KdmFyIHNlbGY9dGhpcztqUXVlcnkuYWpheCh7dXJsOnVybCx0eXBlOnR5cGUs ZGF0YVR5cGU6Imh0bWwiLGRhdGE6cGFyYW1zLGNvbXBsZXRlOmZ1bmN0aW9uKHJl cyxzdGF0dXMpe2lmKHN0YXR1cz09InN1Y2Nlc3MifHxzdGF0dXM9PSJub3Rtb2Rp ZmllZCIpCnNlbGYuaHRtbChzZWxlY3Rvcj9qUXVlcnkoIjxkaXYvPiIpCi5hcHBl bmQocmVzLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC88c2NyaXB0KC58XHMpKj9cL3Nj cmlwdD4vZywiIikpCi5maW5kKHNlbGVjdG9yKTpyZXMucmVzcG9uc2VUZXh0KTtp ZihjYWxsYmFjaykKc2VsZi5lYWNoKGNhbGxiYWNrLFtyZXMucmVzcG9uc2VUZXh0 LHN0YXR1cyxyZXNdKTt9fSk7cmV0dXJuIHRoaXM7fSxzZXJpYWxpemU6ZnVuY3Rp b24oKXtyZXR1cm4galF1ZXJ5LnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSk7 fSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5j dGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnRzP2pRdWVyeS5tYWtlQXJyYXkodGhp cy5lbGVtZW50cyk6dGhpczt9KQouZmlsdGVyKGZ1bmN0aW9uKCl7cmV0dXJuIHRo aXMubmFtZSYmIXRoaXMuZGlzYWJsZWQmJih0aGlzLmNoZWNrZWR8fC9zZWxlY3R8 dGV4dGFyZWEvaS50ZXN0KHRoaXMubm9kZU5hbWUpfHwvdGV4dHxoaWRkZW58cGFz c3dvcmQvaS50ZXN0KHRoaXMudHlwZSkpO30pCi5tYXAoZnVuY3Rpb24oaSxlbGVt KXt2YXIgdmFsPWpRdWVyeSh0aGlzKS52YWwoKTtyZXR1cm4gdmFsPT1udWxsP251 bGw6alF1ZXJ5LmlzQXJyYXkodmFsKT9qUXVlcnkubWFwKHZhbCxmdW5jdGlvbih2 YWwsaSl7cmV0dXJue25hbWU6ZWxlbS5uYW1lLHZhbHVlOnZhbH07fSk6e25hbWU6 ZWxlbS5uYW1lLHZhbHVlOnZhbH07fSkuZ2V0KCk7fX0pO2pRdWVyeS5lYWNoKCJh amF4U3RhcnQsYWpheFN0b3AsYWpheENvbXBsZXRlLGFqYXhFcnJvcixhamF4U3Vj Y2VzcyxhamF4U2VuZCIuc3BsaXQoIiwiKSxmdW5jdGlvbihpLG8pe2pRdWVyeS5m bltvXT1mdW5jdGlvbihmKXtyZXR1cm4gdGhpcy5iaW5kKG8sZik7fTt9KTt2YXIg anNjPW5vdygpO2pRdWVyeS5leHRlbmQoe2dldDpmdW5jdGlvbih1cmwsZGF0YSxj YWxsYmFjayx0eXBlKXtpZihqUXVlcnkuaXNGdW5jdGlvbihkYXRhKSl7Y2FsbGJh Y2s9ZGF0YTtkYXRhPW51bGw7fQpyZXR1cm4galF1ZXJ5LmFqYXgoe3R5cGU6IkdF VCIsdXJsOnVybCxkYXRhOmRhdGEsc3VjY2VzczpjYWxsYmFjayxkYXRhVHlwZTp0 eXBlfSk7fSxnZXRTY3JpcHQ6ZnVuY3Rpb24odXJsLGNhbGxiYWNrKXtyZXR1cm4g alF1ZXJ5LmdldCh1cmwsbnVsbCxjYWxsYmFjaywic2NyaXB0Iik7fSxnZXRKU09O OmZ1bmN0aW9uKHVybCxkYXRhLGNhbGxiYWNrKXtyZXR1cm4galF1ZXJ5LmdldCh1 cmwsZGF0YSxjYWxsYmFjaywianNvbiIpO30scG9zdDpmdW5jdGlvbih1cmwsZGF0 YSxjYWxsYmFjayx0eXBlKXtpZihqUXVlcnkuaXNGdW5jdGlvbihkYXRhKSl7Y2Fs bGJhY2s9ZGF0YTtkYXRhPXt9O30KcmV0dXJuIGpRdWVyeS5hamF4KHt0eXBlOiJQ T1NUIix1cmw6dXJsLGRhdGE6ZGF0YSxzdWNjZXNzOmNhbGxiYWNrLGRhdGFUeXBl OnR5cGV9KTt9LGFqYXhTZXR1cDpmdW5jdGlvbihzZXR0aW5ncyl7alF1ZXJ5LmV4 dGVuZChqUXVlcnkuYWpheFNldHRpbmdzLHNldHRpbmdzKTt9LGFqYXhTZXR0aW5n czp7dXJsOmxvY2F0aW9uLmhyZWYsZ2xvYmFsOnRydWUsdHlwZToiR0VUIixjb250 ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIixwcm9j ZXNzRGF0YTp0cnVlLGFzeW5jOnRydWUseGhyOmZ1bmN0aW9uKCl7cmV0dXJuIHdp bmRvdy5BY3RpdmVYT2JqZWN0P25ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQu WE1MSFRUUCIpOm5ldyBYTUxIdHRwUmVxdWVzdCgpO30sYWNjZXB0czp7eG1sOiJh cHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixodG1sOiJ0ZXh0L2h0bWwiLHNjcmlw dDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iixqc29u OiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiLHRleHQ6InRleHQv cGxhaW4iLF9kZWZhdWx0OiIqLyoifX0sbGFzdE1vZGlmaWVkOnt9LGFqYXg6ZnVu Y3Rpb24ocyl7cz1qUXVlcnkuZXh0ZW5kKHRydWUscyxqUXVlcnkuZXh0ZW5kKHRy dWUse30salF1ZXJ5LmFqYXhTZXR0aW5ncyxzKSk7dmFyIGpzb25wLGpzcmU9Lz1c PygmfCQpL2csc3RhdHVzLGRhdGEsdHlwZT1zLnR5cGUudG9VcHBlckNhc2UoKTtp ZihzLmRhdGEmJnMucHJvY2Vzc0RhdGEmJnR5cGVvZiBzLmRhdGEhPT0ic3RyaW5n IikKcy5kYXRhPWpRdWVyeS5wYXJhbShzLmRhdGEpO2lmKHMuZGF0YVR5cGU9PSJq c29ucCIpe2lmKHR5cGU9PSJHRVQiKXtpZighcy51cmwubWF0Y2goanNyZSkpCnMu dXJsKz0ocy51cmwubWF0Y2goL1w/Lyk/IiYiOiI/IikrKHMuanNvbnB8fCJjYWxs YmFjayIpKyI9PyI7fWVsc2UgaWYoIXMuZGF0YXx8IXMuZGF0YS5tYXRjaChqc3Jl KSkKcy5kYXRhPShzLmRhdGE/cy5kYXRhKyImIjoiIikrKHMuanNvbnB8fCJjYWxs YmFjayIpKyI9PyI7cy5kYXRhVHlwZT0ianNvbiI7fQppZihzLmRhdGFUeXBlPT0i anNvbiImJihzLmRhdGEmJnMuZGF0YS5tYXRjaChqc3JlKXx8cy51cmwubWF0Y2go anNyZSkpKXtqc29ucD0ianNvbnAiK2pzYysrO2lmKHMuZGF0YSkKcy5kYXRhPShz LmRhdGErIiIpLnJlcGxhY2UoanNyZSwiPSIranNvbnArIiQxIik7cy51cmw9cy51 cmwucmVwbGFjZShqc3JlLCI9Iitqc29ucCsiJDEiKTtzLmRhdGFUeXBlPSJzY3Jp cHQiO3dpbmRvd1tqc29ucF09ZnVuY3Rpb24odG1wKXtkYXRhPXRtcDtzdWNjZXNz KCk7Y29tcGxldGUoKTt3aW5kb3dbanNvbnBdPXVuZGVmaW5lZDt0cnl7ZGVsZXRl IHdpbmRvd1tqc29ucF07fWNhdGNoKGUpe30KaWYoaGVhZCkKaGVhZC5yZW1vdmVD aGlsZChzY3JpcHQpO307fQppZihzLmRhdGFUeXBlPT0ic2NyaXB0IiYmcy5jYWNo ZT09bnVsbCkKcy5jYWNoZT1mYWxzZTtpZihzLmNhY2hlPT09ZmFsc2UmJnR5cGU9 PSJHRVQiKXt2YXIgdHM9bm93KCk7dmFyIHJldD1zLnVybC5yZXBsYWNlKC8oXD98 JilfPS4qPygmfCQpLywiJDFfPSIrdHMrIiQyIik7cy51cmw9cmV0KygocmV0PT1z LnVybCk/KHMudXJsLm1hdGNoKC9cPy8pPyImIjoiPyIpKyJfPSIrdHM6IiIpO30K aWYocy5kYXRhJiZ0eXBlPT0iR0VUIil7cy51cmwrPShzLnVybC5tYXRjaCgvXD8v KT8iJiI6Ij8iKStzLmRhdGE7cy5kYXRhPW51bGw7fQppZihzLmdsb2JhbCYmIWpR dWVyeS5hY3RpdmUrKykKalF1ZXJ5LmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIp O3ZhciBwYXJ0cz0vXihcdys6KT9cL1wvKFteXC8/I10rKS8uZXhlYyhzLnVybCk7 aWYocy5kYXRhVHlwZT09InNjcmlwdCImJnR5cGU9PSJHRVQiJiZwYXJ0cyYmKHBh cnRzWzFdJiZwYXJ0c1sxXSE9bG9jYXRpb24ucHJvdG9jb2x8fHBhcnRzWzJdIT1s b2NhdGlvbi5ob3N0KSl7dmFyIGhlYWQ9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRh Z05hbWUoImhlYWQiKVswXTt2YXIgc2NyaXB0PWRvY3VtZW50LmNyZWF0ZUVsZW1l bnQoInNjcmlwdCIpO3NjcmlwdC5zcmM9cy51cmw7aWYocy5zY3JpcHRDaGFyc2V0 KQpzY3JpcHQuY2hhcnNldD1zLnNjcmlwdENoYXJzZXQ7aWYoIWpzb25wKXt2YXIg ZG9uZT1mYWxzZTtzY3JpcHQub25sb2FkPXNjcmlwdC5vbnJlYWR5c3RhdGVjaGFu Z2U9ZnVuY3Rpb24oKXtpZighZG9uZSYmKCF0aGlzLnJlYWR5U3RhdGV8fHRoaXMu cmVhZHlTdGF0ZT09ImxvYWRlZCJ8fHRoaXMucmVhZHlTdGF0ZT09ImNvbXBsZXRl Iikpe2RvbmU9dHJ1ZTtzdWNjZXNzKCk7Y29tcGxldGUoKTtoZWFkLnJlbW92ZUNo aWxkKHNjcmlwdCk7fX07fQpoZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7cmV0dXJu IHVuZGVmaW5lZDt9CnZhciByZXF1ZXN0RG9uZT1mYWxzZTt2YXIgeGhyPXMueGhy KCk7aWYocy51c2VybmFtZSkKeGhyLm9wZW4odHlwZSxzLnVybCxzLmFzeW5jLHMu dXNlcm5hbWUscy5wYXNzd29yZCk7ZWxzZQp4aHIub3Blbih0eXBlLHMudXJsLHMu YXN5bmMpO3RyeXtpZihzLmRhdGEpCnhoci5zZXRSZXF1ZXN0SGVhZGVyKCJDb250 ZW50LVR5cGUiLHMuY29udGVudFR5cGUpO2lmKHMuaWZNb2RpZmllZCkKeGhyLnNl dFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixqUXVlcnkubGFzdE1v ZGlmaWVkW3MudXJsXXx8IlRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgR01UIik7 eGhyLnNldFJlcXVlc3RIZWFkZXIoIlgtUmVxdWVzdGVkLVdpdGgiLCJYTUxIdHRw UmVxdWVzdCIpO3hoci5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLHMuZGF0YVR5 cGUmJnMuYWNjZXB0c1tzLmRhdGFUeXBlXT9zLmFjY2VwdHNbcy5kYXRhVHlwZV0r IiwgKi8qIjpzLmFjY2VwdHMuX2RlZmF1bHQpO31jYXRjaChlKXt9CmlmKHMuYmVm b3JlU2VuZCYmcy5iZWZvcmVTZW5kKHhocixzKT09PWZhbHNlKXtpZihzLmdsb2Jh bCYmIS0talF1ZXJ5LmFjdGl2ZSkKalF1ZXJ5LmV2ZW50LnRyaWdnZXIoImFqYXhT dG9wIik7eGhyLmFib3J0KCk7cmV0dXJuIGZhbHNlO30KaWYocy5nbG9iYWwpCmpR dWVyeS5ldmVudC50cmlnZ2VyKCJhamF4U2VuZCIsW3hocixzXSk7dmFyIG9ucmVh ZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbihpc1RpbWVvdXQpe2lmKHhoci5yZWFkeVN0 YXRlPT0wKXtpZihpdmFsKXtjbGVhckludGVydmFsKGl2YWwpO2l2YWw9bnVsbDtp ZihzLmdsb2JhbCYmIS0talF1ZXJ5LmFjdGl2ZSkKalF1ZXJ5LmV2ZW50LnRyaWdn ZXIoImFqYXhTdG9wIik7fQp9ZWxzZSBpZighcmVxdWVzdERvbmUmJnhociYmKHho ci5yZWFkeVN0YXRlPT00fHxpc1RpbWVvdXQ9PSJ0aW1lb3V0Iikpe3JlcXVlc3RE b25lPXRydWU7aWYoaXZhbCl7Y2xlYXJJbnRlcnZhbChpdmFsKTtpdmFsPW51bGw7 fQpzdGF0dXM9aXNUaW1lb3V0PT0idGltZW91dCI/InRpbWVvdXQiOiFqUXVlcnku aHR0cFN1Y2Nlc3MoeGhyKT8iZXJyb3IiOnMuaWZNb2RpZmllZCYmalF1ZXJ5Lmh0 dHBOb3RNb2RpZmllZCh4aHIscy51cmwpPyJub3Rtb2RpZmllZCI6InN1Y2Nlc3Mi O2lmKHN0YXR1cz09InN1Y2Nlc3MiKXt0cnl7ZGF0YT1qUXVlcnkuaHR0cERhdGEo eGhyLHMuZGF0YVR5cGUscyk7fWNhdGNoKGUpe3N0YXR1cz0icGFyc2VyZXJyb3Ii O319CmlmKHN0YXR1cz09InN1Y2Nlc3MiKXt2YXIgbW9kUmVzO3RyeXttb2RSZXM9 eGhyLmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIik7fWNhdGNoKGUp e30KaWYocy5pZk1vZGlmaWVkJiZtb2RSZXMpCmpRdWVyeS5sYXN0TW9kaWZpZWRb cy51cmxdPW1vZFJlcztpZighanNvbnApCnN1Y2Nlc3MoKTt9ZWxzZQpqUXVlcnku aGFuZGxlRXJyb3Iocyx4aHIsc3RhdHVzKTtjb21wbGV0ZSgpO2lmKGlzVGltZW91 dCkKeGhyLmFib3J0KCk7aWYocy5hc3luYykKeGhyPW51bGw7fX07aWYocy5hc3lu Yyl7dmFyIGl2YWw9c2V0SW50ZXJ2YWwob25yZWFkeXN0YXRlY2hhbmdlLDEzKTtp ZihzLnRpbWVvdXQ+MCkKc2V0VGltZW91dChmdW5jdGlvbigpe2lmKHhociYmIXJl cXVlc3REb25lKQpvbnJlYWR5c3RhdGVjaGFuZ2UoInRpbWVvdXQiKTt9LHMudGlt ZW91dCk7fQp0cnl7eGhyLnNlbmQocy5kYXRhKTt9Y2F0Y2goZSl7alF1ZXJ5Lmhh bmRsZUVycm9yKHMseGhyLG51bGwsZSk7fQppZighcy5hc3luYykKb25yZWFkeXN0 YXRlY2hhbmdlKCk7ZnVuY3Rpb24gc3VjY2Vzcygpe2lmKHMuc3VjY2VzcykKcy5z dWNjZXNzKGRhdGEsc3RhdHVzKTtpZihzLmdsb2JhbCkKalF1ZXJ5LmV2ZW50LnRy aWdnZXIoImFqYXhTdWNjZXNzIixbeGhyLHNdKTt9CmZ1bmN0aW9uIGNvbXBsZXRl KCl7aWYocy5jb21wbGV0ZSkKcy5jb21wbGV0ZSh4aHIsc3RhdHVzKTtpZihzLmds b2JhbCkKalF1ZXJ5LmV2ZW50LnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3hocixz XSk7aWYocy5nbG9iYWwmJiEtLWpRdWVyeS5hY3RpdmUpCmpRdWVyeS5ldmVudC50 cmlnZ2VyKCJhamF4U3RvcCIpO30KcmV0dXJuIHhocjt9LGhhbmRsZUVycm9yOmZ1 bmN0aW9uKHMseGhyLHN0YXR1cyxlKXtpZihzLmVycm9yKXMuZXJyb3IoeGhyLHN0 YXR1cyxlKTtpZihzLmdsb2JhbCkKalF1ZXJ5LmV2ZW50LnRyaWdnZXIoImFqYXhF cnJvciIsW3hocixzLGVdKTt9LGFjdGl2ZTowLGh0dHBTdWNjZXNzOmZ1bmN0aW9u KHhocil7dHJ5e3JldHVybiF4aHIuc3RhdHVzJiZsb2NhdGlvbi5wcm90b2NvbD09 ImZpbGU6Inx8KHhoci5zdGF0dXM+PTIwMCYmeGhyLnN0YXR1czwzMDApfHx4aHIu c3RhdHVzPT0zMDR8fHhoci5zdGF0dXM9PTEyMjM7fWNhdGNoKGUpe30KcmV0dXJu IGZhbHNlO30saHR0cE5vdE1vZGlmaWVkOmZ1bmN0aW9uKHhocix1cmwpe3RyeXt2 YXIgeGhyUmVzPXhoci5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIp O3JldHVybiB4aHIuc3RhdHVzPT0zMDR8fHhoclJlcz09alF1ZXJ5Lmxhc3RNb2Rp ZmllZFt1cmxdO31jYXRjaChlKXt9CnJldHVybiBmYWxzZTt9LGh0dHBEYXRhOmZ1 bmN0aW9uKHhocix0eXBlLHMpe3ZhciBjdD14aHIuZ2V0UmVzcG9uc2VIZWFkZXIo ImNvbnRlbnQtdHlwZSIpLHhtbD10eXBlPT0ieG1sInx8IXR5cGUmJmN0JiZjdC5p bmRleE9mKCJ4bWwiKT49MCxkYXRhPXhtbD94aHIucmVzcG9uc2VYTUw6eGhyLnJl c3BvbnNlVGV4dDtpZih4bWwmJmRhdGEuZG9jdW1lbnRFbGVtZW50LnRhZ05hbWU9 PSJwYXJzZXJlcnJvciIpCnRocm93InBhcnNlcmVycm9yIjtpZihzJiZzLmRhdGFG aWx0ZXIpCmRhdGE9cy5kYXRhRmlsdGVyKGRhdGEsdHlwZSk7aWYodHlwZW9mIGRh dGE9PT0ic3RyaW5nIil7aWYodHlwZT09InNjcmlwdCIpCmpRdWVyeS5nbG9iYWxF dmFsKGRhdGEpO2lmKHR5cGU9PSJqc29uIikKZGF0YT13aW5kb3dbImV2YWwiXSgi KCIrZGF0YSsiKSIpO30KcmV0dXJuIGRhdGE7fSxwYXJhbTpmdW5jdGlvbihhKXt2 YXIgcz1bXTtmdW5jdGlvbiBhZGQoa2V5LHZhbHVlKXtzW3MubGVuZ3RoXT1lbmNv ZGVVUklDb21wb25lbnQoa2V5KSsnPScrZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVl KTt9O2lmKGpRdWVyeS5pc0FycmF5KGEpfHxhLmpxdWVyeSkKalF1ZXJ5LmVhY2go YSxmdW5jdGlvbigpe2FkZCh0aGlzLm5hbWUsdGhpcy52YWx1ZSk7fSk7ZWxzZQpm b3IodmFyIGogaW4gYSkKaWYoalF1ZXJ5LmlzQXJyYXkoYVtqXSkpCmpRdWVyeS5l YWNoKGFbal0sZnVuY3Rpb24oKXthZGQoaix0aGlzKTt9KTtlbHNlCmFkZChqLGpR dWVyeS5pc0Z1bmN0aW9uKGFbal0pP2Fbal0oKTphW2pdKTtyZXR1cm4gcy5qb2lu KCImIikucmVwbGFjZSgvJTIwL2csIisiKTt9fSk7dmFyIGVsZW1kaXNwbGF5PXt9 LHRpbWVySWQsZnhBdHRycz1bWyJoZWlnaHQiLCJtYXJnaW5Ub3AiLCJtYXJnaW5C b3R0b20iLCJwYWRkaW5nVG9wIiwicGFkZGluZ0JvdHRvbSJdLFsid2lkdGgiLCJt YXJnaW5MZWZ0IiwibWFyZ2luUmlnaHQiLCJwYWRkaW5nTGVmdCIsInBhZGRpbmdS aWdodCJdLFsib3BhY2l0eSJdXTtmdW5jdGlvbiBnZW5GeCh0eXBlLG51bSl7dmFy IG9iaj17fTtqUXVlcnkuZWFjaChmeEF0dHJzLmNvbmNhdC5hcHBseShbXSxmeEF0 dHJzLnNsaWNlKDAsbnVtKSksZnVuY3Rpb24oKXtvYmpbdGhpc109dHlwZTt9KTty ZXR1cm4gb2JqO30KalF1ZXJ5LmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbihzcGVl ZCxjYWxsYmFjayl7aWYoc3BlZWQpe3JldHVybiB0aGlzLmFuaW1hdGUoZ2VuRngo InNob3ciLDMpLHNwZWVkLGNhbGxiYWNrKTt9ZWxzZXtmb3IodmFyIGk9MCxsPXRo aXMubGVuZ3RoO2k8bDtpKyspe3ZhciBvbGQ9alF1ZXJ5LmRhdGEodGhpc1tpXSwi b2xkZGlzcGxheSIpO3RoaXNbaV0uc3R5bGUuZGlzcGxheT1vbGR8fCIiO2lmKGpR dWVyeS5jc3ModGhpc1tpXSwiZGlzcGxheSIpPT09Im5vbmUiKXt2YXIgdGFnTmFt ZT10aGlzW2ldLnRhZ05hbWUsZGlzcGxheTtpZihlbGVtZGlzcGxheVt0YWdOYW1l XSl7ZGlzcGxheT1lbGVtZGlzcGxheVt0YWdOYW1lXTt9ZWxzZXt2YXIgZWxlbT1q UXVlcnkoIjwiK3RhZ05hbWUrIiAvPiIpLmFwcGVuZFRvKCJib2R5Iik7ZGlzcGxh eT1lbGVtLmNzcygiZGlzcGxheSIpO2lmKGRpc3BsYXk9PT0ibm9uZSIpCmRpc3Bs YXk9ImJsb2NrIjtlbGVtLnJlbW92ZSgpO2VsZW1kaXNwbGF5W3RhZ05hbWVdPWRp c3BsYXk7fQp0aGlzW2ldLnN0eWxlLmRpc3BsYXk9alF1ZXJ5LmRhdGEodGhpc1tp XSwib2xkZGlzcGxheSIsZGlzcGxheSk7fX0KcmV0dXJuIHRoaXM7fX0saGlkZTpm dW5jdGlvbihzcGVlZCxjYWxsYmFjayl7aWYoc3BlZWQpe3JldHVybiB0aGlzLmFu aW1hdGUoZ2VuRngoImhpZGUiLDMpLHNwZWVkLGNhbGxiYWNrKTt9ZWxzZXtmb3Io dmFyIGk9MCxsPXRoaXMubGVuZ3RoO2k8bDtpKyspe3ZhciBvbGQ9alF1ZXJ5LmRh dGEodGhpc1tpXSwib2xkZGlzcGxheSIpO2lmKCFvbGQmJm9sZCE9PSJub25lIikK alF1ZXJ5LmRhdGEodGhpc1tpXSwib2xkZGlzcGxheSIsalF1ZXJ5LmNzcyh0aGlz W2ldLCJkaXNwbGF5IikpO3RoaXNbaV0uc3R5bGUuZGlzcGxheT0ibm9uZSI7fQpy ZXR1cm4gdGhpczt9fSxfdG9nZ2xlOmpRdWVyeS5mbi50b2dnbGUsdG9nZ2xlOmZ1 bmN0aW9uKGZuLGZuMil7dmFyIGJvb2w9dHlwZW9mIGZuPT09ImJvb2xlYW4iO3Jl dHVybiBqUXVlcnkuaXNGdW5jdGlvbihmbikmJmpRdWVyeS5pc0Z1bmN0aW9uKGZu Mik/dGhpcy5fdG9nZ2xlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpmbj09bnVsbHx8 Ym9vbD90aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgc3RhdGU9Ym9vbD9mbjpqUXVl cnkodGhpcykuaXMoIjpoaWRkZW4iKTtqUXVlcnkodGhpcylbc3RhdGU/InNob3ci OiJoaWRlIl0oKTt9KTp0aGlzLmFuaW1hdGUoZ2VuRngoInRvZ2dsZSIsMyksZm4s Zm4yKTt9LGZhZGVUbzpmdW5jdGlvbihzcGVlZCx0byxjYWxsYmFjayl7cmV0dXJu IHRoaXMuYW5pbWF0ZSh7b3BhY2l0eTp0b30sc3BlZWQsY2FsbGJhY2spO30sYW5p bWF0ZTpmdW5jdGlvbihwcm9wLHNwZWVkLGVhc2luZyxjYWxsYmFjayl7dmFyIG9w dGFsbD1qUXVlcnkuc3BlZWQoc3BlZWQsZWFzaW5nLGNhbGxiYWNrKTtyZXR1cm4g dGhpc1tvcHRhbGwucXVldWU9PT1mYWxzZT8iZWFjaCI6InF1ZXVlIl0oZnVuY3Rp b24oKXt2YXIgb3B0PWpRdWVyeS5leHRlbmQoe30sb3B0YWxsKSxwLGhpZGRlbj10 aGlzLm5vZGVUeXBlPT0xJiZqUXVlcnkodGhpcykuaXMoIjpoaWRkZW4iKSxzZWxm PXRoaXM7Zm9yKHAgaW4gcHJvcCl7aWYocHJvcFtwXT09ImhpZGUiJiZoaWRkZW58 fHByb3BbcF09PSJzaG93IiYmIWhpZGRlbikKcmV0dXJuIG9wdC5jb21wbGV0ZS5j YWxsKHRoaXMpO2lmKChwPT0iaGVpZ2h0Inx8cD09IndpZHRoIikmJnRoaXMuc3R5 bGUpe29wdC5kaXNwbGF5PWpRdWVyeS5jc3ModGhpcywiZGlzcGxheSIpO29wdC5v dmVyZmxvdz10aGlzLnN0eWxlLm92ZXJmbG93O319CmlmKG9wdC5vdmVyZmxvdyE9 bnVsbCkKdGhpcy5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIjtvcHQuY3VyQW5pbT1q UXVlcnkuZXh0ZW5kKHt9LHByb3ApO2pRdWVyeS5lYWNoKHByb3AsZnVuY3Rpb24o bmFtZSx2YWwpe3ZhciBlPW5ldyBqUXVlcnkuZngoc2VsZixvcHQsbmFtZSk7aWYo L3RvZ2dsZXxzaG93fGhpZGUvLnRlc3QodmFsKSkKZVt2YWw9PSJ0b2dnbGUiP2hp ZGRlbj8ic2hvdyI6ImhpZGUiOnZhbF0ocHJvcCk7ZWxzZXt2YXIgcGFydHM9dmFs LnRvU3RyaW5nKCkubWF0Y2goL14oWystXT0pPyhbXGQrLS5dKykoLiopJC8pLHN0 YXJ0PWUuY3VyKHRydWUpfHwwO2lmKHBhcnRzKXt2YXIgZW5kPXBhcnNlRmxvYXQo cGFydHNbMl0pLHVuaXQ9cGFydHNbM118fCJweCI7aWYodW5pdCE9InB4Iil7c2Vs Zi5zdHlsZVtuYW1lXT0oZW5kfHwxKSt1bml0O3N0YXJ0PSgoZW5kfHwxKS9lLmN1 cih0cnVlKSkqc3RhcnQ7c2VsZi5zdHlsZVtuYW1lXT1zdGFydCt1bml0O30KaWYo cGFydHNbMV0pCmVuZD0oKHBhcnRzWzFdPT0iLT0iPy0xOjEpKmVuZCkrc3RhcnQ7 ZS5jdXN0b20oc3RhcnQsZW5kLHVuaXQpO31lbHNlCmUuY3VzdG9tKHN0YXJ0LHZh bCwiIik7fX0pO3JldHVybiB0cnVlO30pO30sc3RvcDpmdW5jdGlvbihjbGVhclF1 ZXVlLGdvdG9FbmQpe3ZhciB0aW1lcnM9alF1ZXJ5LnRpbWVycztpZihjbGVhclF1 ZXVlKQp0aGlzLnF1ZXVlKFtdKTt0aGlzLmVhY2goZnVuY3Rpb24oKXtmb3IodmFy IGk9dGltZXJzLmxlbmd0aC0xO2k+PTA7aS0tKQppZih0aW1lcnNbaV0uZWxlbT09 dGhpcyl7aWYoZ290b0VuZCkKdGltZXJzW2ldKHRydWUpO3RpbWVycy5zcGxpY2Uo aSwxKTt9fSk7aWYoIWdvdG9FbmQpCnRoaXMuZGVxdWV1ZSgpO3JldHVybiB0aGlz O319KTtqUXVlcnkuZWFjaCh7c2xpZGVEb3duOmdlbkZ4KCJzaG93IiwxKSxzbGlk ZVVwOmdlbkZ4KCJoaWRlIiwxKSxzbGlkZVRvZ2dsZTpnZW5GeCgidG9nZ2xlIiwx KSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRl In19LGZ1bmN0aW9uKG5hbWUscHJvcHMpe2pRdWVyeS5mbltuYW1lXT1mdW5jdGlv bihzcGVlZCxjYWxsYmFjayl7cmV0dXJuIHRoaXMuYW5pbWF0ZShwcm9wcyxzcGVl ZCxjYWxsYmFjayk7fTt9KTtqUXVlcnkuZXh0ZW5kKHtzcGVlZDpmdW5jdGlvbihz cGVlZCxlYXNpbmcsZm4pe3ZhciBvcHQ9dHlwZW9mIHNwZWVkPT09Im9iamVjdCI/ c3BlZWQ6e2NvbXBsZXRlOmZufHwhZm4mJmVhc2luZ3x8alF1ZXJ5LmlzRnVuY3Rp b24oc3BlZWQpJiZzcGVlZCxkdXJhdGlvbjpzcGVlZCxlYXNpbmc6Zm4mJmVhc2lu Z3x8ZWFzaW5nJiYhalF1ZXJ5LmlzRnVuY3Rpb24oZWFzaW5nKSYmZWFzaW5nfTtv cHQuZHVyYXRpb249alF1ZXJ5LmZ4Lm9mZj8wOnR5cGVvZiBvcHQuZHVyYXRpb249 PT0ibnVtYmVyIj9vcHQuZHVyYXRpb246alF1ZXJ5LmZ4LnNwZWVkc1tvcHQuZHVy YXRpb25dfHxqUXVlcnkuZnguc3BlZWRzLl9kZWZhdWx0O29wdC5vbGQ9b3B0LmNv bXBsZXRlO29wdC5jb21wbGV0ZT1mdW5jdGlvbigpe2lmKG9wdC5xdWV1ZSE9PWZh bHNlKQpqUXVlcnkodGhpcykuZGVxdWV1ZSgpO2lmKGpRdWVyeS5pc0Z1bmN0aW9u KG9wdC5vbGQpKQpvcHQub2xkLmNhbGwodGhpcyk7fTtyZXR1cm4gb3B0O30sZWFz aW5nOntsaW5lYXI6ZnVuY3Rpb24ocCxuLGZpcnN0TnVtLGRpZmYpe3JldHVybiBm aXJzdE51bStkaWZmKnA7fSxzd2luZzpmdW5jdGlvbihwLG4sZmlyc3ROdW0sZGlm Zil7cmV0dXJuKCgtTWF0aC5jb3MocCpNYXRoLlBJKS8yKSswLjUpKmRpZmYrZmly c3ROdW07fX0sdGltZXJzOltdLGZ4OmZ1bmN0aW9uKGVsZW0sb3B0aW9ucyxwcm9w KXt0aGlzLm9wdGlvbnM9b3B0aW9uczt0aGlzLmVsZW09ZWxlbTt0aGlzLnByb3A9 cHJvcDtpZighb3B0aW9ucy5vcmlnKQpvcHRpb25zLm9yaWc9e307fX0pO2pRdWVy eS5meC5wcm90b3R5cGU9e3VwZGF0ZTpmdW5jdGlvbigpe2lmKHRoaXMub3B0aW9u cy5zdGVwKQp0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5v dyx0aGlzKTsoalF1ZXJ5LmZ4LnN0ZXBbdGhpcy5wcm9wXXx8alF1ZXJ5LmZ4LnN0 ZXAuX2RlZmF1bHQpKHRoaXMpO2lmKCh0aGlzLnByb3A9PSJoZWlnaHQifHx0aGlz LnByb3A9PSJ3aWR0aCIpJiZ0aGlzLmVsZW0uc3R5bGUpCnRoaXMuZWxlbS5zdHls ZS5kaXNwbGF5PSJibG9jayI7fSxjdXI6ZnVuY3Rpb24oZm9yY2Upe2lmKHRoaXMu ZWxlbVt0aGlzLnByb3BdIT1udWxsJiYoIXRoaXMuZWxlbS5zdHlsZXx8dGhpcy5l bGVtLnN0eWxlW3RoaXMucHJvcF09PW51bGwpKQpyZXR1cm4gdGhpcy5lbGVtW3Ro aXMucHJvcF07dmFyIHI9cGFyc2VGbG9hdChqUXVlcnkuY3NzKHRoaXMuZWxlbSx0 aGlzLnByb3AsZm9yY2UpKTtyZXR1cm4gciYmcj4tMTAwMDA/cjpwYXJzZUZsb2F0 KGpRdWVyeS5jdXJDU1ModGhpcy5lbGVtLHRoaXMucHJvcCkpfHwwO30sY3VzdG9t OmZ1bmN0aW9uKGZyb20sdG8sdW5pdCl7dGhpcy5zdGFydFRpbWU9bm93KCk7dGhp cy5zdGFydD1mcm9tO3RoaXMuZW5kPXRvO3RoaXMudW5pdD11bml0fHx0aGlzLnVu aXR8fCJweCI7dGhpcy5ub3c9dGhpcy5zdGFydDt0aGlzLnBvcz10aGlzLnN0YXRl PTA7dmFyIHNlbGY9dGhpcztmdW5jdGlvbiB0KGdvdG9FbmQpe3JldHVybiBzZWxm LnN0ZXAoZ290b0VuZCk7fQp0LmVsZW09dGhpcy5lbGVtO2lmKHQoKSYmalF1ZXJ5 LnRpbWVycy5wdXNoKHQpPT0xKXt0aW1lcklkPXNldEludGVydmFsKGZ1bmN0aW9u KCl7dmFyIHRpbWVycz1qUXVlcnkudGltZXJzO2Zvcih2YXIgaT0wO2k8dGltZXJz Lmxlbmd0aDtpKyspCmlmKCF0aW1lcnNbaV0oKSkKdGltZXJzLnNwbGljZShpLS0s MSk7aWYoIXRpbWVycy5sZW5ndGgpe2NsZWFySW50ZXJ2YWwodGltZXJJZCk7fX0s MTMpO319LHNob3c6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnBy b3BdPWpRdWVyeS5hdHRyKHRoaXMuZWxlbS5zdHlsZSx0aGlzLnByb3ApO3RoaXMu b3B0aW9ucy5zaG93PXRydWU7dGhpcy5jdXN0b20odGhpcy5wcm9wPT0id2lkdGgi fHx0aGlzLnByb3A9PSJoZWlnaHQiPzE6MCx0aGlzLmN1cigpKTtqUXVlcnkodGhp cy5lbGVtKS5zaG93KCk7fSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLm9y aWdbdGhpcy5wcm9wXT1qUXVlcnkuYXR0cih0aGlzLmVsZW0uc3R5bGUsdGhpcy5w cm9wKTt0aGlzLm9wdGlvbnMuaGlkZT10cnVlO3RoaXMuY3VzdG9tKHRoaXMuY3Vy KCksMCk7fSxzdGVwOmZ1bmN0aW9uKGdvdG9FbmQpe3ZhciB0PW5vdygpO2lmKGdv dG9FbmR8fHQ+PXRoaXMub3B0aW9ucy5kdXJhdGlvbit0aGlzLnN0YXJ0VGltZSl7 dGhpcy5ub3c9dGhpcy5lbmQ7dGhpcy5wb3M9dGhpcy5zdGF0ZT0xO3RoaXMudXBk YXRlKCk7dGhpcy5vcHRpb25zLmN1ckFuaW1bdGhpcy5wcm9wXT10cnVlO3ZhciBk b25lPXRydWU7Zm9yKHZhciBpIGluIHRoaXMub3B0aW9ucy5jdXJBbmltKQppZih0 aGlzLm9wdGlvbnMuY3VyQW5pbVtpXSE9PXRydWUpCmRvbmU9ZmFsc2U7aWYoZG9u ZSl7aWYodGhpcy5vcHRpb25zLmRpc3BsYXkhPW51bGwpe3RoaXMuZWxlbS5zdHls ZS5vdmVyZmxvdz10aGlzLm9wdGlvbnMub3ZlcmZsb3c7dGhpcy5lbGVtLnN0eWxl LmRpc3BsYXk9dGhpcy5vcHRpb25zLmRpc3BsYXk7aWYoalF1ZXJ5LmNzcyh0aGlz LmVsZW0sImRpc3BsYXkiKT09Im5vbmUiKQp0aGlzLmVsZW0uc3R5bGUuZGlzcGxh eT0iYmxvY2siO30KaWYodGhpcy5vcHRpb25zLmhpZGUpCmpRdWVyeSh0aGlzLmVs ZW0pLmhpZGUoKTtpZih0aGlzLm9wdGlvbnMuaGlkZXx8dGhpcy5vcHRpb25zLnNo b3cpCmZvcih2YXIgcCBpbiB0aGlzLm9wdGlvbnMuY3VyQW5pbSkKalF1ZXJ5LmF0 dHIodGhpcy5lbGVtLnN0eWxlLHAsdGhpcy5vcHRpb25zLm9yaWdbcF0pO3RoaXMu b3B0aW9ucy5jb21wbGV0ZS5jYWxsKHRoaXMuZWxlbSk7fQpyZXR1cm4gZmFsc2U7 fWVsc2V7dmFyIG49dC10aGlzLnN0YXJ0VGltZTt0aGlzLnN0YXRlPW4vdGhpcy5v cHRpb25zLmR1cmF0aW9uO3RoaXMucG9zPWpRdWVyeS5lYXNpbmdbdGhpcy5vcHRp b25zLmVhc2luZ3x8KGpRdWVyeS5lYXNpbmcuc3dpbmc/InN3aW5nIjoibGluZWFy IildKHRoaXMuc3RhdGUsbiwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTt0aGlz Lm5vdz10aGlzLnN0YXJ0KygodGhpcy5lbmQtdGhpcy5zdGFydCkqdGhpcy5wb3Mp O3RoaXMudXBkYXRlKCk7fQpyZXR1cm4gdHJ1ZTt9fTtqUXVlcnkuZXh0ZW5kKGpR dWVyeS5meCx7c3BlZWRzOntzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9 LHN0ZXA6e29wYWNpdHk6ZnVuY3Rpb24oZngpe2pRdWVyeS5hdHRyKGZ4LmVsZW0u c3R5bGUsIm9wYWNpdHkiLGZ4Lm5vdyk7fSxfZGVmYXVsdDpmdW5jdGlvbihmeCl7 aWYoZnguZWxlbS5zdHlsZSYmZnguZWxlbS5zdHlsZVtmeC5wcm9wXSE9bnVsbCkK ZnguZWxlbS5zdHlsZVtmeC5wcm9wXT1meC5ub3crZngudW5pdDtlbHNlCmZ4LmVs ZW1bZngucHJvcF09Zngubm93O319fSk7aWYoZG9jdW1lbnQuZG9jdW1lbnRFbGVt ZW50WyJnZXRCb3VuZGluZ0NsaWVudFJlY3QiXSkKalF1ZXJ5LmZuLm9mZnNldD1m dW5jdGlvbigpe2lmKCF0aGlzWzBdKXJldHVybnt0b3A6MCxsZWZ0OjB9O2lmKHRo aXNbMF09PT10aGlzWzBdLm93bmVyRG9jdW1lbnQuYm9keSlyZXR1cm4galF1ZXJ5 Lm9mZnNldC5ib2R5T2Zmc2V0KHRoaXNbMF0pO3ZhciBib3g9dGhpc1swXS5nZXRC b3VuZGluZ0NsaWVudFJlY3QoKSxkb2M9dGhpc1swXS5vd25lckRvY3VtZW50LGJv ZHk9ZG9jLmJvZHksZG9jRWxlbT1kb2MuZG9jdW1lbnRFbGVtZW50LGNsaWVudFRv cD1kb2NFbGVtLmNsaWVudFRvcHx8Ym9keS5jbGllbnRUb3B8fDAsY2xpZW50TGVm dD1kb2NFbGVtLmNsaWVudExlZnR8fGJvZHkuY2xpZW50TGVmdHx8MCx0b3A9Ym94 LnRvcCsoc2VsZi5wYWdlWU9mZnNldHx8alF1ZXJ5LmJveE1vZGVsJiZkb2NFbGVt LnNjcm9sbFRvcHx8Ym9keS5zY3JvbGxUb3ApLWNsaWVudFRvcCxsZWZ0PWJveC5s ZWZ0KyhzZWxmLnBhZ2VYT2Zmc2V0fHxqUXVlcnkuYm94TW9kZWwmJmRvY0VsZW0u c2Nyb2xsTGVmdHx8Ym9keS5zY3JvbGxMZWZ0KS1jbGllbnRMZWZ0O3JldHVybnt0 b3A6dG9wLGxlZnQ6bGVmdH07fTtlbHNlCmpRdWVyeS5mbi5vZmZzZXQ9ZnVuY3Rp b24oKXtpZighdGhpc1swXSlyZXR1cm57dG9wOjAsbGVmdDowfTtpZih0aGlzWzBd PT09dGhpc1swXS5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGpRdWVyeS5vZmZz ZXQuYm9keU9mZnNldCh0aGlzWzBdKTtqUXVlcnkub2Zmc2V0LmluaXRpYWxpemVk fHxqUXVlcnkub2Zmc2V0LmluaXRpYWxpemUoKTt2YXIgZWxlbT10aGlzWzBdLG9m ZnNldFBhcmVudD1lbGVtLm9mZnNldFBhcmVudCxwcmV2T2Zmc2V0UGFyZW50PWVs ZW0sZG9jPWVsZW0ub3duZXJEb2N1bWVudCxjb21wdXRlZFN0eWxlLGRvY0VsZW09 ZG9jLmRvY3VtZW50RWxlbWVudCxib2R5PWRvYy5ib2R5LGRlZmF1bHRWaWV3PWRv Yy5kZWZhdWx0VmlldyxwcmV2Q29tcHV0ZWRTdHlsZT1kZWZhdWx0Vmlldy5nZXRD b21wdXRlZFN0eWxlKGVsZW0sbnVsbCksdG9wPWVsZW0ub2Zmc2V0VG9wLGxlZnQ9 ZWxlbS5vZmZzZXRMZWZ0O3doaWxlKChlbGVtPWVsZW0ucGFyZW50Tm9kZSkmJmVs ZW0hPT1ib2R5JiZlbGVtIT09ZG9jRWxlbSl7Y29tcHV0ZWRTdHlsZT1kZWZhdWx0 Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sbnVsbCk7dG9wLT1lbGVtLnNjcm9s bFRvcCxsZWZ0LT1lbGVtLnNjcm9sbExlZnQ7aWYoZWxlbT09PW9mZnNldFBhcmVu dCl7dG9wKz1lbGVtLm9mZnNldFRvcCxsZWZ0Kz1lbGVtLm9mZnNldExlZnQ7aWYo alF1ZXJ5Lm9mZnNldC5kb2VzTm90QWRkQm9yZGVyJiYhKGpRdWVyeS5vZmZzZXQu ZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHMmJi9edChhYmxlfGR8aCkkL2ku dGVzdChlbGVtLnRhZ05hbWUpKSkKdG9wKz1wYXJzZUludChjb21wdXRlZFN0eWxl LmJvcmRlclRvcFdpZHRoLDEwKXx8MCxsZWZ0Kz1wYXJzZUludChjb21wdXRlZFN0 eWxlLmJvcmRlckxlZnRXaWR0aCwxMCl8fDA7cHJldk9mZnNldFBhcmVudD1vZmZz ZXRQYXJlbnQsb2Zmc2V0UGFyZW50PWVsZW0ub2Zmc2V0UGFyZW50O30KaWYoalF1 ZXJ5Lm9mZnNldC5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGUm JmNvbXB1dGVkU3R5bGUub3ZlcmZsb3chPT0idmlzaWJsZSIpCnRvcCs9cGFyc2VJ bnQoY29tcHV0ZWRTdHlsZS5ib3JkZXJUb3BXaWR0aCwxMCl8fDAsbGVmdCs9cGFy c2VJbnQoY29tcHV0ZWRTdHlsZS5ib3JkZXJMZWZ0V2lkdGgsMTApfHwwO3ByZXZD b21wdXRlZFN0eWxlPWNvbXB1dGVkU3R5bGU7fQppZihwcmV2Q29tcHV0ZWRTdHls ZS5wb3NpdGlvbj09PSJyZWxhdGl2ZSJ8fHByZXZDb21wdXRlZFN0eWxlLnBvc2l0 aW9uPT09InN0YXRpYyIpCnRvcCs9Ym9keS5vZmZzZXRUb3AsbGVmdCs9Ym9keS5v ZmZzZXRMZWZ0O2lmKHByZXZDb21wdXRlZFN0eWxlLnBvc2l0aW9uPT09ImZpeGVk IikKdG9wKz1NYXRoLm1heChkb2NFbGVtLnNjcm9sbFRvcCxib2R5LnNjcm9sbFRv cCksbGVmdCs9TWF0aC5tYXgoZG9jRWxlbS5zY3JvbGxMZWZ0LGJvZHkuc2Nyb2xs TGVmdCk7cmV0dXJue3RvcDp0b3AsbGVmdDpsZWZ0fTt9O2pRdWVyeS5vZmZzZXQ9 e2luaXRpYWxpemU6ZnVuY3Rpb24oKXtpZih0aGlzLmluaXRpYWxpemVkKXJldHVy bjt2YXIgYm9keT1kb2N1bWVudC5ib2R5LGNvbnRhaW5lcj1kb2N1bWVudC5jcmVh dGVFbGVtZW50KCdkaXYnKSxpbm5lckRpdixjaGVja0Rpdix0YWJsZSx0ZCxydWxl cyxwcm9wLGJvZHlNYXJnaW5Ub3A9Ym9keS5zdHlsZS5tYXJnaW5Ub3AsaHRtbD0n PGRpdiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO21hcmdp bjowO2JvcmRlcjo1cHggc29saWQgIzAwMDtwYWRkaW5nOjA7d2lkdGg6MXB4O2hl aWdodDoxcHg7Ij48ZGl2PjwvZGl2PjwvZGl2Pjx0YWJsZSBzdHlsZT0icG9zaXRp b246YWJzb2x1dGU7dG9wOjA7bGVmdDowO21hcmdpbjowO2JvcmRlcjo1cHggc29s aWQgIzAwMDtwYWRkaW5nOjA7d2lkdGg6MXB4O2hlaWdodDoxcHg7IiBjZWxscGFk ZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiPjx0cj48dGQ+PC90ZD48L3RyPjwvdGFi bGU+JztydWxlcz17cG9zaXRpb246J2Fic29sdXRlJyx0b3A6MCxsZWZ0OjAsbWFy Z2luOjAsYm9yZGVyOjAsd2lkdGg6JzFweCcsaGVpZ2h0OicxcHgnLHZpc2liaWxp dHk6J2hpZGRlbid9O2Zvcihwcm9wIGluIHJ1bGVzKWNvbnRhaW5lci5zdHlsZVtw cm9wXT1ydWxlc1twcm9wXTtjb250YWluZXIuaW5uZXJIVE1MPWh0bWw7Ym9keS5p bnNlcnRCZWZvcmUoY29udGFpbmVyLGJvZHkuZmlyc3RDaGlsZCk7aW5uZXJEaXY9 Y29udGFpbmVyLmZpcnN0Q2hpbGQsY2hlY2tEaXY9aW5uZXJEaXYuZmlyc3RDaGls ZCx0ZD1pbm5lckRpdi5uZXh0U2libGluZy5maXJzdENoaWxkLmZpcnN0Q2hpbGQ7 dGhpcy5kb2VzTm90QWRkQm9yZGVyPShjaGVja0Rpdi5vZmZzZXRUb3AhPT01KTt0 aGlzLmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzPSh0ZC5vZmZzZXRUb3A9 PT01KTtpbm5lckRpdi5zdHlsZS5vdmVyZmxvdz0naGlkZGVuJyxpbm5lckRpdi5z dHlsZS5wb3NpdGlvbj0ncmVsYXRpdmUnO3RoaXMuc3VidHJhY3RzQm9yZGVyRm9y T3ZlcmZsb3dOb3RWaXNpYmxlPShjaGVja0Rpdi5vZmZzZXRUb3A9PT0tNSk7Ym9k eS5zdHlsZS5tYXJnaW5Ub3A9JzFweCc7dGhpcy5kb2VzTm90SW5jbHVkZU1hcmdp bkluQm9keU9mZnNldD0oYm9keS5vZmZzZXRUb3A9PT0wKTtib2R5LnN0eWxlLm1h cmdpblRvcD1ib2R5TWFyZ2luVG9wO2JvZHkucmVtb3ZlQ2hpbGQoY29udGFpbmVy KTt0aGlzLmluaXRpYWxpemVkPXRydWU7fSxib2R5T2Zmc2V0OmZ1bmN0aW9uKGJv ZHkpe2pRdWVyeS5vZmZzZXQuaW5pdGlhbGl6ZWR8fGpRdWVyeS5vZmZzZXQuaW5p dGlhbGl6ZSgpO3ZhciB0b3A9Ym9keS5vZmZzZXRUb3AsbGVmdD1ib2R5Lm9mZnNl dExlZnQ7aWYoalF1ZXJ5Lm9mZnNldC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9k eU9mZnNldCkKdG9wKz1wYXJzZUludChqUXVlcnkuY3VyQ1NTKGJvZHksJ21hcmdp blRvcCcsdHJ1ZSksMTApfHwwLGxlZnQrPXBhcnNlSW50KGpRdWVyeS5jdXJDU1Mo Ym9keSwnbWFyZ2luTGVmdCcsdHJ1ZSksMTApfHwwO3JldHVybnt0b3A6dG9wLGxl ZnQ6bGVmdH07fX07alF1ZXJ5LmZuLmV4dGVuZCh7cG9zaXRpb246ZnVuY3Rpb24o KXt2YXIgbGVmdD0wLHRvcD0wLHJlc3VsdHM7aWYodGhpc1swXSl7dmFyIG9mZnNl dFBhcmVudD10aGlzLm9mZnNldFBhcmVudCgpLG9mZnNldD10aGlzLm9mZnNldCgp LHBhcmVudE9mZnNldD0vXmJvZHl8aHRtbCQvaS50ZXN0KG9mZnNldFBhcmVudFsw XS50YWdOYW1lKT97dG9wOjAsbGVmdDowfTpvZmZzZXRQYXJlbnQub2Zmc2V0KCk7 b2Zmc2V0LnRvcC09bnVtKHRoaXMsJ21hcmdpblRvcCcpO29mZnNldC5sZWZ0LT1u dW0odGhpcywnbWFyZ2luTGVmdCcpO3BhcmVudE9mZnNldC50b3ArPW51bShvZmZz ZXRQYXJlbnQsJ2JvcmRlclRvcFdpZHRoJyk7cGFyZW50T2Zmc2V0LmxlZnQrPW51 bShvZmZzZXRQYXJlbnQsJ2JvcmRlckxlZnRXaWR0aCcpO3Jlc3VsdHM9e3RvcDpv ZmZzZXQudG9wLXBhcmVudE9mZnNldC50b3AsbGVmdDpvZmZzZXQubGVmdC1wYXJl bnRPZmZzZXQubGVmdH07fQpyZXR1cm4gcmVzdWx0czt9LG9mZnNldFBhcmVudDpm dW5jdGlvbigpe3ZhciBvZmZzZXRQYXJlbnQ9dGhpc1swXS5vZmZzZXRQYXJlbnR8 fGRvY3VtZW50LmJvZHk7d2hpbGUob2Zmc2V0UGFyZW50JiYoIS9eYm9keXxodG1s JC9pLnRlc3Qob2Zmc2V0UGFyZW50LnRhZ05hbWUpJiZqUXVlcnkuY3NzKG9mZnNl dFBhcmVudCwncG9zaXRpb24nKT09J3N0YXRpYycpKQpvZmZzZXRQYXJlbnQ9b2Zm c2V0UGFyZW50Lm9mZnNldFBhcmVudDtyZXR1cm4galF1ZXJ5KG9mZnNldFBhcmVu dCk7fX0pO2pRdWVyeS5lYWNoKFsnTGVmdCcsJ1RvcCddLGZ1bmN0aW9uKGksbmFt ZSl7dmFyIG1ldGhvZD0nc2Nyb2xsJytuYW1lO2pRdWVyeS5mblttZXRob2RdPWZ1 bmN0aW9uKHZhbCl7aWYoIXRoaXNbMF0pcmV0dXJuIG51bGw7cmV0dXJuIHZhbCE9 PXVuZGVmaW5lZD90aGlzLmVhY2goZnVuY3Rpb24oKXt0aGlzPT13aW5kb3d8fHRo aXM9PWRvY3VtZW50P3dpbmRvdy5zY3JvbGxUbyghaT92YWw6alF1ZXJ5KHdpbmRv dykuc2Nyb2xsTGVmdCgpLGk/dmFsOmpRdWVyeSh3aW5kb3cpLnNjcm9sbFRvcCgp KTp0aGlzW21ldGhvZF09dmFsO30pOnRoaXNbMF09PXdpbmRvd3x8dGhpc1swXT09 ZG9jdW1lbnQ/c2VsZltpPydwYWdlWU9mZnNldCc6J3BhZ2VYT2Zmc2V0J118fGpR dWVyeS5ib3hNb2RlbCYmZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W21ldGhvZF18 fGRvY3VtZW50LmJvZHlbbWV0aG9kXTp0aGlzWzBdW21ldGhvZF07fTt9KTtqUXVl cnkuZWFjaChbIkhlaWdodCIsIldpZHRoIl0sZnVuY3Rpb24oaSxuYW1lKXt2YXIg dGw9aT8iTGVmdCI6IlRvcCIsYnI9aT8iUmlnaHQiOiJCb3R0b20iO2pRdWVyeS5m blsiaW5uZXIiK25hbWVdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbbmFtZS50b0xv d2VyQ2FzZSgpXSgpKwpudW0odGhpcywicGFkZGluZyIrdGwpKwpudW0odGhpcywi cGFkZGluZyIrYnIpO307alF1ZXJ5LmZuWyJvdXRlciIrbmFtZV09ZnVuY3Rpb24o bWFyZ2luKXtyZXR1cm4gdGhpc1siaW5uZXIiK25hbWVdKCkrCm51bSh0aGlzLCJi b3JkZXIiK3RsKyJXaWR0aCIpKwpudW0odGhpcywiYm9yZGVyIiticisiV2lkdGgi KSsKKG1hcmdpbj9udW0odGhpcywibWFyZ2luIit0bCkrbnVtKHRoaXMsIm1hcmdp biIrYnIpOjApO307dmFyIHR5cGU9bmFtZS50b0xvd2VyQ2FzZSgpO2pRdWVyeS5m blt0eXBlXT1mdW5jdGlvbihzaXplKXtyZXR1cm4gdGhpc1swXT09d2luZG93P2Rv Y3VtZW50LmNvbXBhdE1vZGU9PSJDU1MxQ29tcGF0IiYmZG9jdW1lbnQuZG9jdW1l bnRFbGVtZW50WyJjbGllbnQiK25hbWVdfHxkb2N1bWVudC5ib2R5WyJjbGllbnQi K25hbWVdOnRoaXNbMF09PWRvY3VtZW50P01hdGgubWF4KGRvY3VtZW50LmRvY3Vt ZW50RWxlbWVudFsiY2xpZW50IituYW1lXSxkb2N1bWVudC5ib2R5WyJzY3JvbGwi K25hbWVdLGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsic2Nyb2xsIituYW1lXSxk b2N1bWVudC5ib2R5WyJvZmZzZXQiK25hbWVdLGRvY3VtZW50LmRvY3VtZW50RWxl bWVudFsib2Zmc2V0IituYW1lXSk6c2l6ZT09PXVuZGVmaW5lZD8odGhpcy5sZW5n dGg/alF1ZXJ5LmNzcyh0aGlzWzBdLHR5cGUpOm51bGwpOnRoaXMuY3NzKHR5cGUs dHlwZW9mIHNpemU9PT0ic3RyaW5nIj9zaXplOnNpemUrInB4Iik7fTt9KTt9KSgp Ow== ------------2Q3EtUf5m7p0lpDki9qALT Content-Disposition: inline; filename=postings.js Content-Type: application/x-javascript; name=postings.js Content-Location: http://www.craigslist.org/js/postings.js Content-Transfer-Encoding: Base64 ZnVuY3Rpb24gaW5pdEZsYWcocGlkKXskKCIjZmxhZ0Nob29zZXIgYS5mbCIpLmVh Y2goZnVuY3Rpb24oKXtpZigkKHRoaXMpLmNzcygncG9zaXRpb24nKT09J3JlbGF0 aXZlJyl7JCgiI2ZsYWdDaG9vc2VyIikuaGlkZSgpOyQoIiNmbGFnTXNnIikuaHRt bCgiVGhhbmtzIGZvciBmbGFnZ2luZy4iKTt9fSk7JCgiI2ZsYWdDaG9vc2VyIGEu ZmwiKS5jbGljayhmdW5jdGlvbigpeyQuZ2V0KCIvZmxhZy8/YXN5bmM9YXN5bmMm ZmxhZ0NvZGU9IiskKHRoaXMpLmF0dHIoJ2lkJykuc3Vic3RyKDQpKyImcG9zdGlu Z0lEPSIrcGlkKTskKCIjZmxhZ0Nob29zZXIiKS5zbGlkZVVwKCJmYXN0IixmdW5j dGlvbigpeyQoIiNmbGFnTXNnIikuaHRtbCgiVGhhbmtzIGZvciBmbGFnZ2luZy4i KTt9KTtyZXR1cm4gZmFsc2U7fSk7fQ== ------------2Q3EtUf5m7p0lpDki9qALT--