Re: problems with try-ark
Will Partain <[email protected]> Sat, 24 Jan 2004 13:34:50 +0000
| Newsgroups | gmane.comp.sysutils.ark.devel |
|---|---|
| Message-ID | <[email protected]> |
--=-=-= Edward Moy provided a truly excellent problem report on Thursday, the details of which we'll get to shortly... The general issue we're dealing with here is that there's just *no telling* what combination of Python and XML support a (try-)ARK'ing site will have. Traditionally, the core ARK people have used a reasonably modern Python with a recent-ish PyXML "module" added on. (Why? Because in the early days, nothing else really worked.) Latterly, we have claimed to support a plain old Python out of the box -- because it includes a not-too-bad "minidom" XML thing, and ARK has v modest XMLing needs. But whether a plain old minidom'ing Python will really work depends on whether it's got an expat parser wired into it. Somewhat bizarrely, if you build Python and it doesn't find an expat library, it will (*SILENTLY*) build you a minidom thing anyway -- and it will be totally useless to man or beast. The code for 'read' in ARK/arkbase/ark/xmlfile.py *tries* to account for these various possibilities, and to provide the rest of ARK with an interface blissfully untroubled by the vagaries of Python implementations. Sadly, if it fails, your first encounter with the ARK code base will be a scary one :-( The Moy Report reflects bit rot in the xmlfile.py code for the minidom-with-a-decent-expat case. I attach a copy with my initial fixes in it. (I'll run with this a while before checking it in.) OK, a few specific things... > ... Looks like it is because comments are being handled > differently in Python 2.3.x: As I say, I think it's a minidom vs PyXML thing, not a version thing. > Panic: sigh: element <#comment> is bogus > > so I changed the line in _process_subfields() to: > > elif hname == 'comment' or hname == '#comment': That confuses an <!-- XML comment --> with an <comment>ARK comment</comment>, not that it matters a lot. > Seems that some of the <code> sections in sidai/package/ALL.xml use > CDATA, and _process_code() is unhappy: I tried to handle this by munging things in one place (a little local routine, is_textly). Anyway, you can see what I did; and I'll keep running it, and check it in soon. Thanks again for a very fine report. Will --=-=-= Content-Type: application/octet-stream Content-Disposition: attachment; filename=xmlfile.py Content-Transfer-Encoding: base64 Content-Description: hacked ARK/arkbase/ark/xmlfile.py IyEgL3Vzci9iaW4vZW52IHB5dGhvbgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyAKIyBD b3B5cmlnaHQgKEMpIDIwMDEsMjAwMiBXaWxsIFBhcnRhaW4KIyAKIyBUaGlzIHByb2dyYW0g aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlm eQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0 aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFu eSBsYXRlciB2ZXJzaW9uLgojIAojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0 aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJS QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRB QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQoj IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgCiMgWW91 IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGlj IExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0 aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2Ft YnJpZGdlLCBNQSAwMjEzOSwgVVNBLgojIAojIE5hbWUgICA6IHhtbGZpbGUucHkKIyBBdXRo b3IgOiBXaWxsIFBhcnRhaW4gPHBhcnRhaW5AZGNzLmdsYS5hYy51az4KIyAKIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjCl9fdmVyc2lvbl9fID0gIiRSZXZpc2lvbjogMS4zMyAkIlsxMTot Ml0KX19kb2NfXyA9ICIiIgphcmsueG1sZmlsZSBtb2R1bGUsIHZlcnNpb24gJXMKCkFSSyBY TUwgZmlsZXM6IHJlYWRpbmcsIHBhcnNpbmcKIiIiICUgKF9fdmVyc2lvbl9fKQoKaW1wb3J0 IGNQaWNrbGUsb3Msc3RhdCxzdHJpbmcsc3lzLHRpbWUKaW1wb3J0IGFyay5lcnJvcgppbXBv cnQgYXJrLnRlYW0KaW1wb3J0IGFyay51dGlscwoKIyA9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBTaW5nbGV0b24g cGF0dGVybiAoc2VlCiMgaHR0cDovL3Rvci5kaHMub3JnL356ZXBoeXJmYWxjb24vc25pcHBl dHMvc291cmNlLzMxNS5weSkKCmRlZiBBcmtYbWxGaWxlTWdyKCk6CiAgICBpZiBfQXJrWG1s RmlsZU1nci5pbnN0YW5jZSA9PSBOb25lOgoJX0Fya1htbEZpbGVNZ3IuaW5zdGFuY2UgPSBf QXJrWG1sRmlsZU1ncigpCiAgICByZXR1cm4gX0Fya1htbEZpbGVNZ3IuaW5zdGFuY2UKCmNs YXNzIF9BcmtYbWxGaWxlTWdyOgogICAgIiIiCiAgICBNYW5hZ2VzIGFsbCB0aGUgWE1MIGZp bGVzIChmb3IgYWxsIHRlYW1zKSBhdCBvbmUgc2l0ZS4KICAgICIiIgogICAgaW5zdGFuY2Ug PSBOb25lICMgdG8gZG8gdGhlIHNpbmdsZXRvbiB0aGluZy4uLgoKICAgIF94bWxmX2NhY2hl ICAgICAgID0ge30KICAgIF94bWxmX2NhY2hlX3RpbWVzID0ge30KCiAgICAjIGRlZiBfX2lu aXRfXyhzZWxmKTogcGFzcwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGRlZiBsb29rdXAoc2VsZix0ZWFt LGVudHR5cGUsZW50bmFtZSk6CiAgICAgICAgIiIiUmV0dXJuIHRoZSBjb250ZW50cyBvZiB0 aGUgc3BlY2lmaWVkIFhNTCBmaWxlIiIiCiAgICAgICAga2V5ID0gKHRlYW0sZW50dHlwZSxl bnRuYW1lKQoKICAgICAgICBjdXJyX3RpbWUgPSBpbnQodGltZS50aW1lKCkpCiAgICAgICAg dHJ5OgogICAgICAgICAgICBjYWNoZV90aW1lID0gc2VsZi5feG1sZl9jYWNoZV90aW1lc1tr ZXldCiAgICAgICAgICAgIGlmIGN1cnJfdGltZSA8PSBjYWNoZV90aW1lICsgNjAwOiAjIFRv RG86IHBhcmFtZXRlcml6ZSB0aGUgNjAwPwogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYu X3htbGZfY2FjaGVba2V5XSAjICp0aGF0KiB3YXMgZWFzeS4uLgogICAgICAgICAgICBlbGlm IGFyay5jb250cm9sLkFya0NvbnRyb2woKS5kZWJ1ZyhhcmsuY29udHJvbC5DQUNISU5HKToK ICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ2ZpbGUgY2FjaGUgZXhwaXJlZCBm b3IgJXNcbicgJShga2V5YCkpCiAgICAgICAgZXhjZXB0IEtleUVycm9yOiBwYXNzCgogICAg ICAgICMgYWgsIGJldHRlciBzdGFydCBzbHVycGluZy4uLgogICAgICAgICNwcmludCAneG1s ZiBsb29rdXA6JywgdGVhbSwgZW50dHlwZSwgZW50bmFtZTsKCiAgICAgICAgeG1sZiA9IEFy a1htbEZpbGUodGVhbSxlbnR0eXBlLGVudG5hbWUpCiAgICAgICAgc3R1ZmYgPSB4bWxmLnJl YWQoKQoKICAgICAgICBzZWxmLl94bWxmX2NhY2hlW2tleV0gICAgICAgPSBzdHVmZiAjIGZv ciBwb3N0ZXJpdHkuLi4KICAgICAgICBzZWxmLl94bWxmX2NhY2hlX3RpbWVzW2tleV0gPSBj dXJyX3RpbWUKICAgICAgICByZXR1cm4gc3R1ZmYKCiMgPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmNsYXNzIEFya1ht bEZpbGU6CiAgICAiIiIKICAgIEFuIEFSSyB4bWwgZmlsZQogICAgIiIiCiAgICAjIC0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CiAgICBkZWYgX19pbml0X18oc2VsZix0ZWFtX2lkLGVudHR5cGUsZW50bmFtZSk6CiAgICAg ICAgYXNzZXJ0KGVudG5hbWUgIT0gJycpCiAgICAgICAgc2VsZi5fdGVhbV9pZCA9IHRlYW1f aWQKICAgICAgICBzZWxmLl90eXBlICAgID0gZW50dHlwZQogICAgICAgIHNlbGYuX25hbWUg ICAgPSBlbnRuYW1lCiAgICAgICAgI3ByaW50ICdBcmtYbWxGaWxlOicsdGVhbV9pZCxlbnR0 eXBlLGVudG5hbWUKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBkZWYgcmVhZChzZWxmLGV4cGxpY2l0X2Zp bGVuYW1lPU5vbmUpOgogICAgICAgICIiIgoJPz8/PwogICAgICAgICIiIgogICAgICAgIGlm IGV4cGxpY2l0X2ZpbGVuYW1lOgogICAgICAgICAgICBmaWxlbmFtZSA9IGV4cGxpY2l0X2Zp bGVuYW1lCiAgICAgICAgZWxpZiBzZWxmLl90eXBlID09ICd0ZWFtJzoKICAgICAgICAgICAg ZmlsZW5hbWUgPSAnJXMvdGVhbS54bWwnICUgKGFyay50ZWFtLkFDVElOR19URUFNKCkucmVw b3NpdG9yeShzZWxmLl90ZWFtX2lkKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBmaWxl bmFtZSA9ICclcy8lcy8lcy54bWwnICUgKGFyay50ZWFtLkFDVElOR19URUFNKCkucmVwb3Np dG9yeShzZWxmLl90ZWFtX2lkKSwgc2VsZi5fdHlwZSwgc2VsZi5fbmFtZSkKCiAgICAgICAg aWYgbm90IG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKICAgICAgICAgICAgcmFpc2UgYXJr LmVycm9yLk5vU3VjaFRoaW5nLCAnJXMgJXMnICUgKHNlbGYuX3R5cGUsIGZpbGVuYW1lKQoK ICAgICAgICAjIGhlcmUsIHdlIGxvb2sgZm9yIGEgLnhtbGEgImNvbXBpbGVkIiBlcXVpdjoK ICAgICAgICBmaWxlbmFtZV9hID0gZmlsZW5hbWUgKyAnYScKCiAgICAgICAgaWYgb3MucGF0 aC5leGlzdHMoZmlsZW5hbWVfYSk6CiAgICAgICAgICAgIHRpbWVzdGFtcCAgID0gb3Muc3Rh dChmaWxlbmFtZSlbc3RhdC5TVF9NVElNRV0KICAgICAgICAgICAgdGltZXN0YW1wX2EgPSBv cy5zdGF0KGZpbGVuYW1lX2EpW3N0YXQuU1RfTVRJTUVdCiAgICAgICAgICAgIGlmIHRpbWVz dGFtcF9hID09IHRpbWVzdGFtcDogIyBob29yYXksIGdvdCBvbmUhCgkJdHJ5OgogICAgICAg ICAgICAgICAgICAgIChpc19wcm90b3R5cGUsIHhtbF92ZXJzaW9uLCBmaWVsZHMpID0gXAog ICAgICAgICAgICAgICAgICAgICAgICBjUGlja2xlLmxvYWQob3BlbihmaWxlbmFtZV9hLCdy YicpKQoJCSAgICAjcHJpbnQgJ3BpY2tsZWQ6Jyxgc3R1ZmZgCgkJICAgIGlmIGFyay5jb250 cm9sLkFya0NvbnRyb2woKS5kZWJ1ZyhhcmsuY29udHJvbC5QQVJTSU5HKToKCQkJc3lzLnN0 ZGVyci53cml0ZSgncmVhZCBjb21waWxlZDogJXNcbicgJSBmaWxlbmFtZSkKCQkgICAgcmV0 dXJuIChpc19wcm90b3R5cGUsIHhtbF92ZXJzaW9uLCBmaWVsZHMpCgkJZXhjZXB0OgoJCSAg ICAjIFNraXAgaXQgaWYgd2UgY2FuJ3QgbG9hZCB0aGUgYmluYXJ5IHZlcnNpb24KCQkgICAg aWYgYXJrLmNvbnRyb2wuQXJrQ29udHJvbCgpLmRlYnVnKGFyay5jb250cm9sLlBBUlNJTkcp OgoJCQlzeXMuc3RkZXJyLndyaXRlKCdpZ25vcmluZyAoY29ycnVwdD8pIGNvbXBpbGVkOiAl c1xuJwoJCQkJCSAlIGZpbGVuYW1lKQoJCSAgICBwYXNzCgogICAgICAgICMgT2ggd2VsbCwg bm8gY29tcGlsZWQgZXF1aXY6IGRvIGl0IHRoZSBoYXJkIHdheS4KCSMgV2UgcmVjb3JkIHRo ZSBjb21waWxlZCBzdHVmZiBiZWZvcmUgd2UgcmV0dXJuIChiZWxvdykuCgogICAgICAgIGlm IGFyay5jb250cm9sLkFya0NvbnRyb2woKS5kZWJ1ZyhhcmsuY29udHJvbC5QQVJTSU5HKToK ICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgncGFyc2luZzogJXMnICUgZmlsZW5hbWUp CgogICAgICAgICMgT0ssIHRoaXMgaXMgdGhlIGJlc3Qgd2F5IHRvIGZpZ3VyZSBvdXQgaG93 IHRvIHBhcnNlIFhNTCBmaWxlcwogICAgICAgICMgc2luY2UgdGhlIHhtbC52ZXJzaW9uX2lu Zm8gdmFyaWFibGUgaXMgbm90IGEgcmVsaWFibGUgaW5kaWNhdG9yLgoJdHJ5OgoJICAgICMg VHJ5IGZvciBhIFB5WE1MIGltcGxlbWVudGF0aW9uIGZpcnN0LCBzdGFydGluZyB3aXRoCgkg ICAgIyB0aGUgbmV3LXN0eWxlIFB5WE1MIGZpcnN0ICg+PSAwLjUuNik6CgkgICAgaW1wb3J0 IHhtbC5kb20uZXh0LnJlYWRlci5TYXgKCSAgICBkb2MgPSB4bWwuZG9tLmV4dC5yZWFkZXIu U2F4LkZyb21YbWxTdHJlYW0ob3BlbihmaWxlbmFtZSkpCgkgICAgaWYgYXJrLmNvbnRyb2wu QXJrQ29udHJvbCgpLmRlYnVnKGFyay5jb250cm9sLlBBUlNJTkcpOgoJCXN5cy5zdGRlcnIu d3JpdGUoJyAobmV3IFB5WE1MKVxuJykKICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAg ICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICMgTm8gbHVjayB0aGVyZSwgc28gdHJ5 IHRoZSBvbGQtc3R5bGUgUHlYTUwgKHByb2JhYmx5CiAgICAgICAgICAgICAgICAjIDAuNS41 LjEpOgogICAgICAgICAgICAgICAgaW1wb3J0IHhtbC5kb20uY29yZQogICAgICAgICAgICAg ICAgaW1wb3J0IHhtbC5kb20udXRpbHMKICAgICAgICAgICAgICAgIGRvYyAgPSB4bWwuZG9t LnV0aWxzLkZpbGVSZWFkZXIoKS5yZWFkRmlsZShmaWxlbmFtZSkKCQlpZiBhcmsuY29udHJv bC5BcmtDb250cm9sKCkuZGVidWcoYXJrLmNvbnRyb2wuUEFSU0lORyk6CgkJICAgIHN5cy5z dGRlcnIud3JpdGUoJyAob2xkIFB5WE1MKVxuJykKCSAgICBleGNlcHQgSW1wb3J0RXJyb3I6 CgkJIyBMYXN0IGRpdGNoLCBkbyB3ZSBoYXZlIGEgbW9kZXJuIFB5dGhvbiAoPj0gMi4wKSB3 aXRoCiAgICAgICAgICAgICAgICAjIGEgbWluaWRvbSBpbXBsZW1lbnRhdGlvbjoKCQlpbXBv cnQgeG1sLmRvbS5taW5pZG9tCgkJZG9jID0geG1sLmRvbS5taW5pZG9tLnBhcnNlKCBvcGVu KGZpbGVuYW1lKSApCgkJaWYgYXJrLmNvbnRyb2wuQXJrQ29udHJvbCgpLmRlYnVnKGFyay5j b250cm9sLlBBUlNJTkcpOgoJCSAgICBzeXMuc3RkZXJyLndyaXRlKCcgKG1pbmlkb20pXG4n KQoKCXJvb3RfZWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQKCXRyeToKCSAgICByb290X2Vs ZW0ubm9ybWFsaXplKCkKICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAg ICAgICMgQmFoISBjcmFwcHkgUHl0aG9uIDIuMCBtaW5pZG9tLiBVc2Ugb3VyIG93biBub3Jt YWxpc2VyOgogICAgICAgICAgICBhcmsudXRpbHMubm9ybWFsaXplRE9NKCByb290X2VsZW0g KQoKICAgICAgICAjIFdlIGhhZCBiZXR0ZXIgaGF2ZSBqdXN0IHJlYWQgdGhlIHJpZ2h0IGtp bmQgb2YgdGhpbmc6CiAgICAgICAgaWYgcm9vdF9lbGVtLm5vZGVOYW1lICE9IHNlbGYuX3R5 cGU6CiAgICAgICAgICAgIHJhaXNlIGFyay5lcnJvci5HZW5lcmFsUGFuaWMsImRvYyB0eXBl ICVzIGFuZCBkb2MgJXMgZG9uJ3QgbWF0Y2giJShzZWxmLl90eXBlLHJvb3RfZWxlbS5ub2Rl TmFtZSkKICAgICAgICAjIFRoZSByb290IGVsZW1lbnQgbXVzdCBoYXZlIG9uZSBhdHRyaWJ1 dGUgLS0gIm5hbWUiIC0tCiAgICAgICAgIyBhbmQgaXQgbXVzdCBtYXRjaCB0aGUgbmFtZSBn aXZlbjoKICAgICAgICAocm9vdF9uYW1lLHJvb3RfeG1sX3ZlcnNpb24saXNfcHJvdG90eXBl KSA9IHR3b19vcl90aHJlZV9hdHRyaWJ1dGVzKHJvb3RfZWxlbSwnbmFtZScsJ3htbC12ZXJz aW9uJywncHJvdG90eXBlJykKICAgICAgICB4bWxfdmVyc2lvbiA9IGludChyb290X3htbF92 ZXJzaW9uKQogICAgICAgIGlmIHJvb3RfbmFtZSAhPSBzZWxmLl9uYW1lOgogICAgICAgICAg ICByYWlzZSBhcmsuZXJyb3IuRmlsZW5hbWVNaXNtYXRjaCwiZG9jIG5hbWU9XCIlc1wiIGRv ZXMgbm90IG1hdGNoIGZpbGVuYW1lIGAlcyciICUgKHJvb3RfbmFtZSxzZWxmLl9uYW1lKQog ICAgICAgIGlmIGlzX3Byb3RvdHlwZSAhPSBOb25lOgogICAgICAgICAgICAjIG11c3QgYmUg eWVzIG9yIG5vCiAgICAgICAgICAgIGlmIGlzX3Byb3RvdHlwZSA9PSAneWVzJzoKICAgICAg ICAgICAgICAgIHBhc3MKICAgICAgICAgICAgZWxpZiBpc19wcm90b3R5cGUgPT0gJ25vJzoK ICAgICAgICAgICAgICAgIGlzX3Byb3RvdHlwZSA9IE5vbmUKICAgICAgICAgICAgZWxzZToK ICAgICAgICAgICAgICAgIHJhaXNlIGFyay5lcnJvci5HZW5lcmFsUGFuaWMsImRvYyBwcm90 b3R5cGU9XCIlc1wiIGlzIG5vdCB5ZXMgb3Igbm8iICUgKGlzX3Byb3RvdHlwZSkKCiAgICAg ICAgIyBub3cgd2UgZGVhbCB3aXRoIGFsbCB0aGUgY2hpbGQgbm9kZXM6CiAgICAgICAgZmll bGRzID0ge30KCWZvciBjaGlsZCBpbiBub250cml2aWFsKHJvb3RfZWxlbS5jaGlsZE5vZGVz KToKICAgICAgICAgICAgbm90VGV4dE5vZGUoY2hpbGQpCgogICAgICAgICAgICBpZiBjaGls ZC5ub2RlTmFtZSA9PSAncHJvdG90eXBlcyc6CiAgICAgICAgICAgICAgICBmbmFtZSA9ICdw cm90b3R5cGVzJwogICAgICAgICAgICAgICAgZnZhbCAgPSBfcmVhZF9wcm90b3R5cGVzKCBz ZWxmLl90eXBlLCBjaGlsZCwgZmlsZW5hbWUgKQoKICAgICAgICAgICAgZWxpZiBjaGlsZC5u b2RlTmFtZSA9PSAncHJvdG90eXBlJzogIyBhdm9pZCBzb21lIHR5cG9zLi4uCiAgICAgICAg ICAgICAgICByYWlzZSBhcmsuZXJyb3IuR2VuZXJhbFBhbmljLCJjYW4ndCBoYXZlIGZpZWxk IG5hbWVkIDxwcm90b3R5cGU+ICh0eXBvPykiCgogICAgICAgICAgICBlbHNlOgogICAgICAg ICAgICAgICAgKGZuYW1lLCBmdmFsKSA9IF9yZWFkX2Nvb2tlZF9yZXNvdXJjZSggY2hpbGQs IGZpbGVuYW1lICkKCgkgICAgI3ByaW50ICdmaWVsZCBgJXNcJzogJXMnICUgKGZuYW1lLCBm dmFsKQogICAgICAgICAgICBpZiBub3QgZmllbGRzLmhhc19rZXkoZm5hbWUpOiBmaWVsZHNb Zm5hbWVdID0gW10KICAgICAgICAgICAgZmllbGRzW2ZuYW1lXS5hcHBlbmQoZnZhbCkKCiAg ICAgICAgdG9fcmV0dXJuID0gKGlzX3Byb3RvdHlwZSwgeG1sX3ZlcnNpb24sIGZpZWxkcykK ICAgICAgICAjcHJpbnQgJ2ZpZWxkczonLGZpZWxkcwoKICAgICAgICAjIHBpY2tsZSB3aGF0 IHdlJ3ZlIGdvdCwgZm9yIG5leHQgdGltZToKICAgICAgICAjIChpdCdzIE9LIHRvIGZhaWwp Cgl0cnk6CgkgICAgY1BpY2tsZS5kdW1wKHRvX3JldHVybixvcGVuKGZpbGVuYW1lX2EsJ3di JyksMSkKCSAgICB0aW1lc3RhbXAgPSBvcy5zdGF0KGZpbGVuYW1lKVtzdGF0LlNUX01USU1F XQoJICAgIG9zLnV0aW1lKGZpbGVuYW1lX2EsKHRpbWVzdGFtcCx0aW1lc3RhbXApKQoJZXhj ZXB0OgoJICAgIHBhc3MKCiAgICAgICAgcmV0dXJuIHRvX3JldHVybgoKICAgICMgLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4K ICAgICMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmNsYXNzIEFya1htbEZpbGVG aWVsZDoKICAgICIiIgogICAgQSByZXNvdXJjZSBmaWVsZCBmcm9tIGFuIFhNTCBmaWxlLgog ICAgIiIiCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCiAgICBkZWYgX19pbml0X18oc2VsZix2YWwsdHlwZT1Ob25l LGZpbGVuYW1lPSc/Pz8nKToKICAgICAgICAiIiIKCSIiIgogICAgICAgIHNlbGYuZmlsZW5h bWUgICAgPSBmaWxlbmFtZQogICAgICAgIHNlbGYuY29uc3RyYWludHMgPSBbXQogICAgICAg IHNlbGYuY29tbWVudCAgICAgPSBOb25lCiAgICAgICAgc2VsZi5wYXJhbXMgICAgICA9IFtd CgogICAgICAgICMgaWYgdHlwZS92YWwgYXJlIHNldCwgaXQncyBzbyB3ZSBjYW4gcXVpY2ts eSBnZXQKCSMgYSBzaW1wbGUgdmFsdWUgaW4gaGVyZSwgd2l0aG91dCBmdXJ0aGVyIGZ1c3Mu CiAgICAgICAgc2VsZi52YWx0eXBlID0gdHlwZQogICAgICAgIGlmIHR5cGUgIT0gTm9uZToK ICAgICAgICAgICAgc2VsZi52YWx1ZSAgICA9IHZhbAogICAgICAgICAgICBzZWxmLnZhbHBy b3BzID0ge30KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBkZWYgX19yZXByX18oc2VsZik6CiAgICAgICAg aWYgc2VsZi52YWx0eXBlICE9IE5vbmU6CiAgICAgICAgICAgIHJldHVybignJXM6OiVzICMg JXMsICVzJyAlIChzZWxmLnZhbHR5cGUsIHNlbGYudmFsdWUsIHNlbGYudmFscHJvcHMsIHNl bGYuZmlsZW5hbWUpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJldHVybiAncGFydGlh bCB4bWwgZmllbGQnCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQpkZWYgbm9udHJpdmlhbChub2Rlcyk6CiAgICBy ZXR1cm4gZmlsdGVyKGxhbWJkYSBuOiBub3QgX2lzRW1wdHlUZXh0Tm9kZShuKSxub2RlcykK CiMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4KZGVmIG5vdFRleHROb2RlKG5vZGUpOgojICAgIHRyeTogIyBweXRob24gMgog ICAgaWYgbm9kZS5ub2RlVHlwZSBub3QgaW4gW25vZGUuVEVYVF9OT0RFLCBub2RlLkNEQVRB X1NFQ1RJT05fTk9ERV06CiAgICAgICAgcmV0dXJuCiMgICAgZXhjZXB0IEF0dHJpYnV0ZUVy cm9yOgojICAgICAgICBpbXBvcnQgeG1sLmRvbS5jb3JlCiMgICAgICAgIGlmIG5vZGUubm9k ZVR5cGUgIT0geG1sLmRvbS5jb3JlLlRFWFRfTk9ERTogcmV0dXJuCiAgICByYWlzZSBhcmsu ZXJyb3IuR2VuZXJhbFBhbmljLCJ0ZXh0IGNvbnRlbnQgd2hlcmUgbm90IGFsbG93ZWQ6ICVz IiAlIG5vZGUubm9kZVZhbHVlCgojIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCmRlZiBfaXNFbXB0eVRleHROb2RlKG5vZGUp OgogICAgIiIiCiAgICBJZiBpdCBpcyBhbiBlbXB0eSB0ZXh0IG5vZGUsIHJldHVybiAxCiAg ICBPSyBpZiBpdCdzIG5vdCBhIHRleHQgbm9kZSAocmV0dXJuIDApCiAgICBUaHJvdyBhbiBl eGNlcHRpb24gaWYgaXQgaXMgYSBub24tZW1wdHkgdGV4dCBub2RlLgogICAgIiIiCiMgICAg IHRyeTogIyBweXRob24gMgojICAgICAgICAgaWYgbm9kZS5ub2RlVHlwZSAhPSBub2RlLlRF WFRfTk9ERTogcmV0dXJuIDAKIyAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgojICAgICAg ICAgaW1wb3J0IHhtbC5kb20uY29yZQojICAgICAgICAgaWYgbm9kZS5ub2RlVHlwZSAhPSB4 bWwuZG9tLmNvcmUuVEVYVF9OT0RFOiByZXR1cm4gMAoKICAgIGlmIG5vZGUubm9kZVR5cGUg bm90IGluIFtub2RlLlRFWFRfTk9ERSwgbm9kZS5DREFUQV9TRUNUSU9OX05PREVdOgogICAg ICAgIHJldHVybiAwCgogICAgaWYgc3RyaW5nLnN0cmlwKG5vZGUubm9kZVZhbHVlKSA9PSAn JzogcmV0dXJuIDEKICAgIHJldHVybiAwCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGVmIF9yZWFkX3Byb3Rv dHlwZXMod2hhdCxwcyx4bWxmaWxlKToKICAgIHplcm9fYXR0cmlidXRlcyhwcykKCiAgICBw cm90b3MgPSBbXQogICAgZm9yIGNoaWxkIGluIG5vbnRyaXZpYWwocHMuY2hpbGROb2Rlcyk6 CiAgICAgICAgbm90VGV4dE5vZGUoY2hpbGQpCiAgICAgICAgaWYgY2hpbGQubm9kZU5hbWUg IT0gJ3Byb3RvdHlwZSc6CiAgICAgICAgICAgIHJhaXNlIGFyay5lcnJvci5HZW5lcmFsUGFu aWMsImVsZW1lbnQgPCVzPiBjYW5ub3QgYXBwZWFyIGluIDxwcm90b3R5cGVzPiIgJSAoY2hp bGQubm9kZU5hbWUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJvdG9zLmFwcGVuZChf cmVhZF9wcm90b3R5cGUod2hhdCxjaGlsZCkpCgogICAgI3ByaW50ICdwcm90b3M6JyxgcHJv dG9zYAoKICAgIHJldHVybiBBcmtYbWxGaWxlRmllbGQocHJvdG9zLHR5cGU9J0Fya1Byb3Rv dHlwZXMnLGZpbGVuYW1lPXhtbGZpbGUpCgojIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCmRlZiBfcmVhZF9wcm90b3R5cGUo d2hhdCxwKToKICAgICMgPHRlYW0+IG9ubHkgaGFzIHRlYW0uLi47IG90aGVycyBib3RoCiAg ICBpZiB3aGF0ID09ICd0ZWFtJzoKICAgICAgICBwX3RlYW0gPSBvbmVfYXR0cmlidXRlKHAs J3RlYW0nKQogICAgICAgIHBfbmFtZSA9ICcnCiAgICBlbHNlOgogICAgICAgIChwX3RlYW0s cF9uYW1lKSA9IHR3b19hdHRyaWJ1dGVzKHAsJ3RlYW0nLCduYW1lJykKCiAgICBmb3IgY2hp bGQgaW4gbm9udHJpdmlhbChwLmNoaWxkTm9kZXMpOgogICAgICAgIG5vdFRleHROb2RlKGNo aWxkKQogICAgICAgIHJhaXNlIGFyay5lcnJvci5HZW5lcmFsUGFuaWMsImVsZW1lbnQgPCVz PiBjYW5ub3QgYXBwZWFyIGluIDxwcm90b3R5cGU+IiAlIChjaGlsZC5ub2RlTmFtZSkKCiAg ICByZXR1cm4gKHBfdGVhbSwgcF9uYW1lKQoKIyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgpkZWYgX3JlYWRfY29va2VkX3Jl c291cmNlKHJlcyx4bWxmaWxlKToKICAgIHplcm9fYXR0cmlidXRlcyhyZXMpCgogICAgY2hp bGRyZW4gPSBub250cml2aWFsKHJlcy5jaGlsZE5vZGVzKQogICAgIyBjaGVjayBmb3IgdGhl IGNvbW1vbiBjYXNlIG9mIGEgc3RyaW5nIGZpcnN0OgojICAgICB0cnk6ICMgcHl0aG9uIDIK IyAgICAgICAgIGlmIGxlbihjaGlsZHJlbikgPT0gMSBhbmQgY2hpbGRyZW5bMF0ubm9kZVR5 cGUgPT0gcmVzLlRFWFRfTk9ERToKIyAgICAgICAgICAgICByZXR1cm4ocmVzLm5vZGVOYW1l LCBBcmtYbWxGaWxlRmllbGQoc3RyaW5nLnN0cmlwKHVudW5pY29kZShjaGlsZHJlblswXS5u b2RlVmFsdWUpKSx0eXBlPSdzdHJpbmcnLGZpbGVuYW1lPXhtbGZpbGUpKQojICAgICBleGNl cHQgQXR0cmlidXRlRXJyb3I6CiMgICAgICAgICBpbXBvcnQgeG1sLmRvbS5jb3JlCiMgICAg ICAgICBpZiBsZW4oY2hpbGRyZW4pID09IDEgYW5kIGNoaWxkcmVuWzBdLm5vZGVUeXBlID09 IHhtbC5kb20uY29yZS5URVhUX05PREU6CiMgICAgICAgICAgICAgcmV0dXJuKHJlcy5ub2Rl TmFtZSwgQXJrWG1sRmlsZUZpZWxkKHN0cmluZy5zdHJpcChjaGlsZHJlblswXS5ub2RlVmFs dWUpLHR5cGU9J3N0cmluZycsZmlsZW5hbWU9eG1sZmlsZSkpCgogICAgIyBmaXJzdCB0aGUg ZW1wdHkgc3RyaW5nL3ZhbHVlIGNhc2U6CiAgICBpZiBsZW4oY2hpbGRyZW4pID09IDA6CiAg ICAgICAgcmV0dXJuKHJlcy5ub2RlTmFtZSwgQXJrWG1sRmlsZUZpZWxkKCcnLHR5cGU9J3N0 cmluZycsZmlsZW5hbWU9eG1sZmlsZSkpCgogICAgZWxpZiBsZW4oY2hpbGRyZW4pID09IDE6 CiAgICAgICAgKGlzX29uZSx2YWwpID0gaXNfdGV4dGx5KGNoaWxkcmVuWzBdKQogICAgICAg IGlmIGlzX29uZToKICAgICAgICAgICAgcmV0dXJuKHJlcy5ub2RlTmFtZSxBcmtYbWxGaWxl RmllbGQodmFsLHR5cGU9J3N0cmluZycsZmlsZW5hbWU9eG1sZmlsZSkpCgogICAgIyBPSywg ZG8gaXQgdGhlIGhhcmQgd2F5OgogICAgcmV0dXJuKHJlcy5ub2RlTmFtZSwgX3Byb2Nlc3Nf c3ViZmllbGRzKGNoaWxkcmVuLEFya1htbEZpbGVGaWVsZChOb25lLGZpbGVuYW1lPXhtbGZp bGUpKSkKCiMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4KZGVmIGlzX3RleHRseShub2RlKToKICAgICIiIlJldHVybiAoMSx2 YWx1ZSkgb3IgKDAsIGFueXRoaW5nKSIiIgogICAgaWYgbm9kZS5ub2RlVHlwZSBub3QgaW4g W25vZGUuVEVYVF9OT0RFLG5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFXToKICAgICAgICByZXR1 cm4oMCwnPz8/JykKICAgIHJldHVybigxLCBzdHJpbmcuc3RyaXAodW51bmljb2RlKG5vZGUu bm9kZVZhbHVlKSkpCgojIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uCmRlZiBfcHJvY2Vzc19zdWJmaWVsZHMobm9kZXMsYWNj X3Jlc3VsdCk6CiAgICAjIGEgcmVjdXJzaXZlIHRoaW5nCiAgICBpZiBsZW4obm9kZXMpID09 IDA6IHJldHVybiBhY2NfcmVzdWx0CgogICAgaGVhZCAgPSBub2Rlc1swXQogICAgdGFpbCAg PSBub2Rlc1sxOl0KCiAgICBobmFtZSA9IGhlYWQubm9kZU5hbWUKCiAgICBpZiBobmFtZSA9 PSAnY29uc3RyYWludCc6CiAgICAgICAgYWNjX3Jlc3VsdC5jb25zdHJhaW50cy5hcHBlbmQo X3Byb2Nlc3NfY29uc3RyYWludChoZWFkKSkKCiAgICBlbGlmIGhuYW1lID09ICdjb21tZW50 JzogIyB0aGlzIGlzIGFuICpBUksqIDxjb21tZW50PiBlbGVtZW50CiAgICAgICAgaWYgYWNj X3Jlc3VsdC5jb21tZW50ICE9IE5vbmU6CiAgICAgICAgICAgIHJhaXNlIGFyay5lcnJvci5H ZW5lcmFsUGFuaWMsJ3R3byA8Y29tbWVudD5zIGZvciBmaWVsZD8nCiAgICAgICAgYWNjX3Jl c3VsdC5jb21tZW50ID0gX3Byb2Nlc3NfY29tbWVudChoZWFkKQogICAgZWxpZiBobmFtZSA9 PSAnI2NvbW1lbnQnOiAjIHRoaXMgaXMgYW4gWE1MIGNvbW1lbnQgPCEtLSAuLi4gLT4KICAg ICAgICBwYXNzCiAgICBlbGlmIGhuYW1lID09ICdwYXJhbSc6CiAgICAgICAgYWNjX3Jlc3Vs dC5wYXJhbXMuYXBwZW5kKF9wcm9jZXNzX3BhcmFtKGhlYWQpKQogICAgZWxpZiBobmFtZSBp biBbJ3N0cmluZycsJ2xpc3QnLCd0YWJsZScsJ2NvZGUnLCdkb2MnXToKICAgICAgICBpZiBh Y2NfcmVzdWx0LnZhbHR5cGUgIT0gTm9uZToKICAgICAgICAgICAgcmFpc2UgYXJrLmVycm9y LkJhZElucHV0LCd0d28gdmFsdWVzIGluIHRoZSBzYW1lIGZpZWxkJwogICAgICAgIGFjY19y ZXN1bHQudmFsdHlwZSwgYWNjX3Jlc3VsdC52YWx1ZSwgYWNjX3Jlc3VsdC52YWxwcm9wcyA9 IF9wcm9jZXNzX3Jlc3VsdChoZWFkKQogICAgICAgICNwcmludCAncmVzdWx0OicsIGFjY19y ZXN1bHQudmFsdHlwZSwgYWNjX3Jlc3VsdC52YWx1ZSwgYWNjX3Jlc3VsdC52YWxwcm9wcyAK ICAgIGVsc2U6CiAgICAgICAgcmFpc2UgYXJrLmVycm9yLkdlbmVyYWxQYW5pYywiZWxlbWVu dCA8JXM+IGlzIGJvZ3VzIiAlIChobmFtZSkKCiAgICByZXR1cm4gX3Byb2Nlc3Nfc3ViZmll bGRzKHRhaWwsYWNjX3Jlc3VsdCkKCiMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KZGVmIF9wcm9jZXNzX2NvbW1lbnQobm9k ZSk6CiAgICB6ZXJvX2F0dHJpYnV0ZXMobm9kZSkKCiAgICBjaGlsZHJlbiA9IG5vbnRyaXZp YWwobm9kZS5jaGlsZE5vZGVzKQogICAgaWYgbGVuKGNoaWxkcmVuKSAhPSAxOgogICAgICAg IHJhaXNlIGFyay5lcnJvci5HZW5lcmFsUGFuaWMsIjxjb21tZW50PiBtdXN0IGhhdmUgZXhh Y3RseSBvbmUgY2hpbGQgbm9kZSIKCiMgICAgIHRyeTogIyBweXRob24gMgojICAgICAgICAg aWYgY2hpbGRyZW5bMF0ubm9kZVR5cGUgPT0gbm9kZS5URVhUX05PREU6CiMgICAgICAgICAg ICAgdmFsICAgPSBzdHJpbmcuc3RyaXAodW51bmljb2RlKGNoaWxkcmVuWzBdLm5vZGVWYWx1 ZSkpCiMgICAgICAgICBlbHNlOgojICAgICAgICAgICAgIHJhaXNlIGFyay5lcnJvci5HZW5l cmFsUGFuaWMsIjxjb21tZW50PiBtdXN0IG9ubHkgaGF2ZSB0ZXh0IGluIGl0IgojICAgICBl eGNlcHQgQXR0cmlidXRlRXJyb3I6CiMgICAgICAgICBpbXBvcnQgeG1sLmRvbS5jb3JlCiMg ICAgICAgICBpZiBjaGlsZHJlblswXS5ub2RlVHlwZSA9PSB4bWwuZG9tLmNvcmUuVEVYVF9O T0RFOgojICAgICAgICAgICAgIHZhbCAgID0gc3RyaW5nLnN0cmlwKGNoaWxkcmVuWzBdLm5v ZGVWYWx1ZSkKIyAgICAgICAgIGVsc2U6CiMgICAgICAgICAgICAgcmFpc2UgYXJrLmVycm9y LkdlbmVyYWxQYW5pYywiPGNvbW1lbnQ+IG11c3Qgb25seSBoYXZlIHRleHQgaW4gaXQiCgog ICAgKGlzX29uZSx2YWwpID0gaXNfdGV4dGx5KGNoaWxkcmVuWzBdKQoKICAgIGlmIGlzX29u ZToKICAgICAgICByZXR1cm4gdmFsCiAgICBlbHNlOgogICAgICAgIHJhaXNlIGFyay5lcnJv ci5HZW5lcmFsUGFuaWMsIjxjb21tZW50PiBtdXN0IG9ubHkgaGF2ZSB0ZXh0IGluIGl0IgoK IyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLgpkZWYgX3Byb2Nlc3NfcGFyYW0obm9kZSk6CiAgICAobmFtZSxkZWZhdWx0ZWQp ID0gb25lX29yX3R3b19hdHRyaWJ1dGVzKG5vZGUsJ25hbWUnLCdkZWZhdWx0JykKICAgIG5h bWUgPSB1bnVuaWNvZGUobmFtZSkKCiAgICBjaGlsZHJlbiA9IG5vbnRyaXZpYWwobm9kZS5j aGlsZE5vZGVzKQoKICAgIGlmIGxlbihjaGlsZHJlbikgPT0gMDogIyBpcyBpdCBhIHBhcmFt IHdpdGggbm8gZGVmYXVsdCB2YWx1ZSwgb3IgYW4gZW1wdHktc3RyaW5nIHZhbHVlPwogICAg ICAgIGlmIGRlZmF1bHRlZCA9PSAnbm8nOgogICAgICAgICAgICByZXR1cm4gKG5hbWUsIE5v bmUpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmV0dXJuIChuYW1lLCAnJykKCiAgICBp ZiBsZW4oY2hpbGRyZW4pICE9IDE6CiAgICAgICAgcmFpc2UgYXJrLmVycm9yLkdlbmVyYWxQ YW5pYywiPHBhcmFtPiB3aXRoIG1vcmUgdGhhbiBvbmUgc3ViLWVsZW1lbnQ/Pz8iCgojICAg ICB0cnk6ICMgcHl0aG9uIDIKIyAgICAgICAgIGlmIGNoaWxkcmVuWzBdLm5vZGVUeXBlID09 IG5vZGUuVEVYVF9OT0RFOgojICAgICAgICAgICAgIHJldHVybiAobmFtZSwgc3RyaW5nLnN0 cmlwKHVudW5pY29kZShjaGlsZHJlblswXS5ub2RlVmFsdWUpKSkKIyAgICAgICAgIGVsc2U6 CiMgICAgICAgICAgICAgcmV0dXJuIChuYW1lLCBfcHJvY2Vzc19yZXN1bHQoY2hpbGRyZW5b MF0sZnVsbD0wKSkKIyAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgojICAgICAgICAgaW1w b3J0IHhtbC5kb20uY29yZQojICAgICAgICAgaWYgY2hpbGRyZW5bMF0ubm9kZVR5cGUgPT0g eG1sLmRvbS5jb3JlLlRFWFRfTk9ERToKIyAgICAgICAgICAgICByZXR1cm4gKG5hbWUsIHN0 cmluZy5zdHJpcChjaGlsZHJlblswXS5ub2RlVmFsdWUpKQojICAgICAgICAgZWxzZToKIyAg ICAgICAgICAgICByZXR1cm4gKG5hbWUsIF9wcm9jZXNzX3Jlc3VsdChjaGlsZHJlblswXSxm dWxsPTApKQoKICAgIChpc19vbmUsdmFsKSA9IGlzX3RleHRseShjaGlsZHJlblswXSkKCiAg ICBpZiBpc19vbmU6CiAgICAgICAgcmV0dXJuIChuYW1lLCB2YWwpCiAgICBlbHNlOgogICAg ICAgIHJldHVybiAobmFtZSwgX3Byb2Nlc3NfcmVzdWx0KGNoaWxkcmVuWzBdLGZ1bGw9MCkp CgojIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uCmRlZiBfcHJvY2Vzc19jb25zdHJhaW50KG5vZGUpOgogICAgemVyb19hdHRy aWJ1dGVzKG5vZGUpCgogICAgY2hpbGRyZW4gPSBub250cml2aWFsKG5vZGUuY2hpbGROb2Rl cykKCiAgICBpZiBsZW4oY2hpbGRyZW4pICE9IDE6CiAgICAgICAgcmFpc2UgYXJrLmVycm9y LkdlbmVyYWxQYW5pYywiPGNvbnN0cmFpbnQ+IHdpdGggbW9yZSB0aGFuIG9uZSBzdWItZWxl bWVudD8/PyIKCiAgICBjaGlsZCA9IGNoaWxkcmVuWzBdCiAgICBub3RUZXh0Tm9kZShjaGls ZCkKICAgICMgcHJpbnQgJ2xpc3Qgc3ViOicsIGNoaWxkLm5vZGVOYW1lCiAgICBjbmFtZSA9 IGNoaWxkLm5vZGVOYW1lCiAgICBpZiBjbmFtZSA9PSAnZGVwZW5kZW5jeSc6CiAgICAgICAg cmV0dXJuIF9wcm9jZXNzX2RlcGVuZGVuY3koY2hpbGQpCiAgICBlbGlmIGNuYW1lID09ICdo b3N0LXNwZWMnOgogICAgICAgIHJldHVybiBfcHJvY2Vzc19ob3N0X3NwZWMoY2hpbGQpCiAg ICBlbGlmIGNuYW1lID09ICdnZW5lcmFsJzoKICAgICAgICByZXR1cm4gX3Byb2Nlc3NfZ2Vu ZXJhbF9jb25zdHJhaW50KGNoaWxkKQogICAgZWxzZToKICAgICAgICByYWlzZSBhcmsuZXJy b3IuR2VuZXJhbFBhbmljLCI8Y29uc3RyYWludD4gaGFzIGJvZ3VzIGVsZW1lbnQgPCVzPiIg JSAoY25hbWUpCgoKIyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLgpfREVQRU5ERU5DWV9BVFRSUyA9IHsgIyB3aXRoIGRlZmF1 bHRzCiAgICduYW1lJzogTm9uZQogLCAndHlwZSc6ICdyZWd1bGFyJwogLCAndmVyc2lvbi1z cGVjJzogJyonCiAsICdvbi1tZXRob2QnOiAncmV2ZWFsJwogLCAnbWF5LWZhaWwnOiAnbm8n CiAsICd3aGF0JyA6ICdwYWNrYWdlJwogLCAndmFsdWUnOiBOb25lCiB9CgpkZWYgX3Byb2Nl c3NfZGVwZW5kZW5jeShub2RlKToKICAgIGRlcHByb3BzID0gbXVsdGlwbGVfYXR0cmlidXRl cyhub2RlLF9ERVBFTkRFTkNZX0FUVFJTKQoKICAgIGNoaWxkcmVuID0gbm9udHJpdmlhbChu b2RlLmNoaWxkTm9kZXMpCiAgICBpZiBsZW4oY2hpbGRyZW4pICE9IDA6CiAgICAgICAgcmFp c2UgYXJrLmVycm9yLkdlbmVyYWxQYW5pYywiPGRlcGVuZGVuY3k+IGNhbm5vdCBoYXZlIGEg Y2hpbGQgbm9kZSIKCiAgICByZXR1cm4gKCdkZXBlbmRlbmN5JywgZGVwcHJvcHMpCgojIC4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uCmRlZiBfcHJvY2Vzc19ob3N0X3NwZWMobm9kZSk6CiAgICB6ZXJvX2F0dHJpYnV0ZXMo bm9kZSkKCiAgICBjaGlsZHJlbiA9IG5vbnRyaXZpYWwobm9kZS5jaGlsZE5vZGVzKQogICAg aWYgbGVuKGNoaWxkcmVuKSAhPSAxOgogICAgICAgIHJhaXNlIGFyay5lcnJvci5HZW5lcmFs UGFuaWMsIjxob3N0LXNwZWM+IG11c3QgaGF2ZSBleGFjdGx5IG9uZSBjaGlsZCBub2RlIgoK IyAgICAgdHJ5OiAjIHB5dGhvbiAyCiMgICAgICAgICBpZiBjaGlsZHJlblswXS5ub2RlVHlw ZSA9PSBub2RlLlRFWFRfTk9ERToKIyAgICAgICAgICAgICB2YWwgICA9IHN0cmluZy5zdHJp cCh1bnVuaWNvZGUoY2hpbGRyZW5bMF0ubm9kZVZhbHVlKSkKIyAgICAgICAgIGVsc2U6CiMg ICAgICAgICAgICAgcmFpc2UgYXJrLmVycm9yLkdlbmVyYWxQYW5pYywiPGhvc3Qtc3BlYz4g bXVzdCBvbmx5IGhhdmUgdGV4dCBpbiBpdCIKIyAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9y OgojICAgICAgICAgaW1wb3J0IHhtbC5kb20uY29yZQojICAgICAgICAgaWYgY2hpbGRyZW5b MF0ubm9kZVR5cGUgPT0geG1sLmRvbS5jb3JlLlRFWFRfTk9ERToKIyAgICAgICAgICAgICB2 YWwgICA9IHN0cmluZy5zdHJpcChjaGlsZHJlblswXS5ub2RlVmFsdWUpCiMgICAgICAgICBl bHNlOgojICAgICAgICAgICAgIHJhaXNlIGFyay5lcnJvci5HZW5lcmFsUGFuaWMsIjxob3N0 LXNwZWM+IG11c3Qgb25seSBoYXZlIHRleHQgaW4gaXQiCgogICAgKGlzX29uZSx2YWwpID0g aXNfdGV4dGx5KGNoaWxkcmVuWzBdKQoKICAgIGlmIG5vdCBpc19vbmU6CiAgICAgICAgcmFp c2UgYXJrLmVycm9yLkdlbmVyYWxQYW5pYywiPGhvc3Qtc3BlYz4gbXVzdCBvbmx5IGhhdmUg dGV4dCBpbiBpdCIKCiAgICByZXR1cm4gKCdob3N0LXNwZWMnLCB2YWwpCgojIC4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCmRl ZiBfcHJvY2Vzc19nZW5lcmFsX2NvbnN0cmFpbnQobm9kZSk6CiAgICB6ZXJvX2F0dHJpYnV0 ZXMobm9kZSkKCiAgICBjaGlsZHJlbiA9IG5vbnRyaXZpYWwobm9kZS5jaGlsZE5vZGVzKQog ICAgaWYgbGVuKGNoaWxkcmVuKSAhPSAxOgogICAgICAgIHJhaXNlIGFyay5lcnJvci5HZW5l cmFsUGFuaWMsIjxnZW5lcmFsPiBjb25zdHJhaW50IG11c3QgaGF2ZSBleGFjdGx5IG9uZSBj aGlsZCBub2RlIgoKICAgICMgd2hhdCdzIGluc2lkZSBjYW4gYmUgZXhhY3RseSB0aGUgc2Ft ZSBhcyBhIDxwYXJhbT4sIGhvd2V2ZXIKICAgICMgd2VpcmQgdGhhdCBtaWdodCBiZS4uLgoK ICAgIChpc19vbmUsdmFsKSA9IGlzX3RleHRseShjaGlsZHJlblswXSkKCiAgICBpZiBub3Qg aXNfb25lOgogICAgICAgIHJhaXNlIGFyay5lcnJvci5HZW5lcmFsUGFuaWMsIjxnZW5lcmFs PiBjb25zdHJhaW50IGlzIG5vdCBwbGFpbiB0ZXh0IgoKICAgIGlmIHZhbFswXSAhPSAnISc6 CiAgICAgICAgcmFpc2UgYXJrLmVycm9yLkdlbmVyYWxQYW5pYywiPGdlbmVyYWw+IGNvbnN0 cmFpbnQgbXVzdCBiZWdpbiB3aXRoICEiCgogICAgcmV0dXJuICgnZ2VuZXJhbCcsIHZhbCkK CiMgICAgIHRyeTogIyBweXRob24gMgojICAgICAgICAgaWYgY2hpbGRyZW5bMF0ubm9kZVR5 cGUgPT0gbm9kZS5URVhUX05PREU6CiMgICAgICAgICAgICAgdmFsID0gc3RyaW5nLnN0cmlw KHVudW5pY29kZShjaGlsZHJlblswXS5ub2RlVmFsdWUpKQojICAgICAgICAgICAgIGlmIHZh bFswXSAhPSAnISc6CiMgICAgICAgICAgICAgICAgIHJhaXNlIGFyay5lcnJvci5HZW5lcmFs UGFuaWMsIjxnZW5lcmFsPiBjb25zdHJhaW50IG11c3QgYmVnaW4gd2l0aCAhIgojICAgICAg ICAgICAgIHJldHVybiAoJ2dlbmVyYWwnLCB2YWwpCiMgICAgICAgICBlbHNlOgojICAgICAg ICAgICAgIHJhaXNlIGFyay5lcnJvci5HZW5lcmFsUGFuaWMsIjxnZW5lcmFsPiBjb25zdHJh aW50IGlzIG5vdCBwbGFpbiB0ZXh0IgojICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiMg ICAgICAgICBpbXBvcnQgeG1sLmRvbS5jb3JlCiMgICAgICAgICBpZiBjaGlsZHJlblswXS5u b2RlVHlwZSA9PSB4bWwuZG9tLmNvcmUuVEVYVF9OT0RFOgojICAgICAgICAgICAgIHZhbCA9 IHN0cmluZy5zdHJpcChjaGlsZHJlblswXS5ub2RlVmFsdWUpCiMgICAgICAgICAgICAgaWYg dmFsWzBdICE9ICchJzoKIyAgICAgICAgICAgICAgICAgcmFpc2UgYXJrLmVycm9yLkdlbmVy YWxQYW5pYywiPGdlbmVyYWw+IGNvbnN0cmFpbnQgbXVzdCBiZWdpbiB3aXRoICEiCiMgICAg ICAgICAgICAgcmV0dXJuICgnZ2VuZXJhbCcsIHZhbCkKIyAgICAgICAgIGVsc2U6CiMgICAg ICAgICAgICAgcmFpc2UgYXJrLmVycm9yLkdlbmVyYWxQYW5pYywiPGdlbmVyYWw+IGNvbnN0 cmFpbnQgaXMgbm90IHBsYWluIHRleHQgWzJdIgoKIyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgpkZWYgX3Byb2Nlc3NfcmVz dWx0KG5vZGUsZnVsbD0xKToKICAgIHR5cGUgPSBub2RlLm5vZGVOYW1lCiAgICBpZiB0eXBl ID09ICdsaXN0JzoKICAgICAgICAodmFsLCB2YWxwcm9wcykgPSBfcHJvY2Vzc19saXN0KG5v ZGUpCiAgICBlbGlmIHR5cGUgPT0gJ3RhYmxlJzoKICAgICAgICAodmFsLCB2YWxwcm9wcykg PSBfcHJvY2Vzc190YWJsZShub2RlKQogICAgZWxpZiB0eXBlID09ICdjb2RlJzoKICAgICAg ICAodmFsLCB2YWxwcm9wcykgPSBfcHJvY2Vzc19jb2RlKG5vZGUpCiAgICBlbGlmIHR5cGUg PT0gJ2RvYyc6CiAgICAgICAgKHZhbCwgdmFscHJvcHMpID0gX3Byb2Nlc3NfZG9jKG5vZGUp CiAgICBlbGlmIHR5cGUgPT0gJ3N0cmluZyc6CiAgICAgICAgIyBkbyBpdCBpbmxpbmU6CiAg ICAgICAgdmFscHJvcHMgPSB7fQogICAgICAgIGNoaWxkcmVuICAgPSBub250cml2aWFsKG5v ZGUuY2hpbGROb2RlcykKCiAgICAgICAgaWYgbGVuKGNoaWxkcmVuKSA9PSAxOgogICAgICAg ICAgICAoaXNfb25lLHZhbCkgPSBpc190ZXh0bHkoY2hpbGRyZW5bMF0pCiAgICAgICAgICAg IGlmIG5vdCBpc19vbmU6CiAgICAgICAgICAgICAgICByYWlzZSBhcmsuZXJyb3IuR2VuZXJh bFBhbmljLCJ3ZWlyZCA8c3RyaW5nPiBlbGVtZW50Pz8/ICVzIiAlIGBjaGlsZHJlbmAKICAg ICAgICBlbGlmIGxlbihjaGlsZHJlbikgPT0gMDoKICAgICAgICAgICAgdmFsID0gJycKICAg ICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBhcmsuZXJyb3IuR2VuZXJhbFBhbmljLCJ3 ZWlyZCA8c3RyaW5nPiBlbGVtZW50IGxlbmd0aD8/PyAlcyIgJSBgY2hpbGRyZW5gCgojICAg ICAgICAgdHJ5OiAjIHB5dGhvbiAyCiMgICAgICAgICAgICAgaWYgbGVuKGNoaWxkcmVuKSA9 PSAxIGFuZCBjaGlsZHJlblswXS5ub2RlVHlwZSA9PSBub2RlLlRFWFRfTk9ERToKIyAgICAg ICAgICAgICAgICAgdmFsID0gc3RyaW5nLnN0cmlwKHVudW5pY29kZShjaGlsZHJlblswXS5u b2RlVmFsdWUpKQojICAgICAgICAgICAgIGVsaWYgbGVuKGNoaWxkcmVuKSA9PSAwOgojICAg ICAgICAgICAgICAgICB2YWwgPSAnJwojICAgICAgICAgICAgIGVsc2U6CiMgICAgICAgICAg ICAgICAgIHJhaXNlIGFyay5lcnJvci5HZW5lcmFsUGFuaWMsIndlaXJkIDxzdHJpbmc+IGVs ZW1lbnQ/Pz8gJXMiICUgYGNoaWxkcmVuYAojICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVy cm9yOgojICAgICAgICAgICAgIGltcG9ydCB4bWwuZG9tLmNvcmUKIyAgICAgICAgICAgICBp ZiBsZW4oY2hpbGRyZW4pID09IDEgYW5kIGNoaWxkcmVuWzBdLm5vZGVUeXBlID09IHhtbC5k b20uY29yZS5URVhUX05PREU6CiMgICAgICAgICAgICAgICAgIHZhbCA9IHN0cmluZy5zdHJp cChjaGlsZHJlblswXS5ub2RlVmFsdWUpCiMgICAgICAgICAgICAgZWxpZiBsZW4oY2hpbGRy ZW4pID09IDA6CiMgICAgICAgICAgICAgICAgIHZhbCA9ICcnCiMgICAgICAgICAgICAgZWxz ZToKIyAgICAgICAgICAgICAgICAgcmFpc2UgYXJrLmVycm9yLkdlbmVyYWxQYW5pYywid2Vp cmQgPHN0cmluZz4gZWxlbWVudD8/PyAlcyIgJSBgY2hpbGRyZW5gCgogICAgaWYgZnVsbCA9 PSAwOiByZXR1cm4gdmFsICMgdGhhdCdzIGFsbCB3ZSB3YW50CgogICAgI2lmIHR5cGUgPT0g J2NvZGUnOiBwcmludCAncmV0dXJuaW5nJyx2YWwsdmFscHJvcHMKICAgIHJldHVybiAodHlw ZSwgdmFsLCB2YWxwcm9wcykKCiMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KX0NPREVfQVRUUlMgPSB7ICMgd2l0aCBkZWZh dWx0cywgd2hpY2ggYXJlICoqTk9UKiogdXNlZAogICAnZGFuZ2Vyb3VzJzonbm8nCiAsICdp bnRlcmFjdGl2ZSc6J25vJwogLCAnbGFuZyc6J3NoJwogLCAnb25jZS1wZXInOiAnaG9zdCcK ICwgJ3ByZXRlbmRhYmxlJzonbm8nCiAsICdwcml2aWxlZ2VzJzonLicKICwgJ3Byb3h5LWhv c3RzJzogJy4nCiAsICdyZWNvcmRhYmxlJzoneWVzJwogLCAncmVkb2FibGUnOidubycKIH0K CmRlZiBfcHJvY2Vzc19jb2RlKG5vZGUpOgogICAgdmFscHJvcHMgPSBtdWx0aXBsZV9hdHRy aWJ1dGVzKG5vZGUsX0NPREVfQVRUUlMpCgogICAgY2hpbGRyZW4gPSBub250cml2aWFsKG5v ZGUuY2hpbGROb2RlcykKICAgIGlmIGxlbihjaGlsZHJlbikgPT0gMDoKICAgICAgICAjcHJp bnQgJ3Byb2Nlc3NfY29kZTonLGAoJycsdmFscHJvcHMpYAogICAgICAgIHJldHVybignJyx2 YWxwcm9wcykKICAgIGVsaWYgbGVuKGNoaWxkcmVuKSA9PSAxOgogICAgICAgIChpc19vbmUs dmFsKSA9IGlzX3RleHRseShjaGlsZHJlblswXSkKICAgICAgICBpZiBpc19vbmU6CiAgICAg ICAgICAgIHJldHVybih2YWwsdmFscHJvcHMpCgojICAgICB0cnk6ICMgcHl0aG9uIDIKIyAg ICAgICAgIGlmIGxlbihjaGlsZHJlbikgPT0gMSBhbmQgY2hpbGRyZW5bMF0ubm9kZVR5cGUg PT0gbm9kZS5URVhUX05PREU6CiMgICAgICAgICAgICAgcyA9IHN0cmluZy5zdHJpcCh1bnVu aWNvZGUoY2hpbGRyZW5bMF0ubm9kZVZhbHVlKSkKIyAgICAgICAgICAgICByZXR1cm4ocyx2 YWxwcm9wcykKIyAJZWxpZiBsZW4oY2hpbGRyZW4pID09IDA6CiMgCSAgICAjcHJpbnQgJ3By b2Nlc3NfY29kZTonLGAoJycsdmFscHJvcHMpYAojICAgICAgICAgICAgIHJldHVybignJyx2 YWxwcm9wcykKIyAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgojICAgICAgICAgaW1wb3J0 IHhtbC5kb20uY29yZQojICAgICAgICAgaWYgbGVuKGNoaWxkcmVuKSA9PSAxIGFuZCBjaGls ZHJlblswXS5ub2RlVHlwZSA9PSB4bWwuZG9tLmNvcmUuVEVYVF9OT0RFOgojICAgICAgICAg ICAgIHJldHVybihzdHJpbmcuc3RyaXAoY2hpbGRyZW5bMF0ubm9kZVZhbHVlKSx2YWxwcm9w cykKIyAJZWxpZiBsZW4oY2hpbGRyZW4pID09IDA6CiMgICAgICAgICAgICAgcmV0dXJuKCcn LHZhbHByb3BzKQoKICAgIGZvciBjaGlsZCBpbiBjaGlsZHJlbjoKICAgICAgICByYWlzZSAn ZHVmZiBjb2RlOicsY2hpbGQubm9kZU5hbWUsIGNoaWxkLm5vZGVUeXBlCgogICAgcmFpc2Ug YXJrLmVycm9yLkdlbmVyYWxQYW5pYywiY29kZSBlbGVtZW50IDwlcz4gaXMgYm9ndXMiICUg KG5vZGUubm9kZU5hbWUpCgojIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCl9ET0NfQVRUUlMgPSB7ICMgd2l0aCBkZWZhdWx0 cywgd2hpY2ggYXJlICoqTk9UKiogdXNlZAogICAnZm9ybWF0JzondHh0JwogfQoKZGVmIF9w cm9jZXNzX2RvYyhub2RlKToKICAgIHZhbHByb3BzID0gbXVsdGlwbGVfYXR0cmlidXRlcyhu b2RlLF9ET0NfQVRUUlMpCgogICAgY2hpbGRyZW4gPSBub250cml2aWFsKG5vZGUuY2hpbGRO b2RlcykKICAgIGlmIGxlbihjaGlsZHJlbikgPT0gMDoKICAgICAgICByZXR1cm4oJycsdmFs cHJvcHMpCiAgICBlbGlmIGxlbihjaGlsZHJlbikgPT0gMToKICAgICAgICAoaXNfb25lLHZh bCkgPSBpc190ZXh0bHkoY2hpbGRyZW5bMF0pCiAgICAgICAgaWYgaXNfb25lOgogICAgICAg ICAgICByZXR1cm4odmFsLHZhbHByb3BzKQoKIyAgICAgdHJ5OiAjIHB5dGhvbiAyCiMgICAg ICAgICBpZiBsZW4oY2hpbGRyZW4pID09IDEgYW5kIGNoaWxkcmVuWzBdLm5vZGVUeXBlID09 IG5vZGUuVEVYVF9OT0RFOgojICAgICAgICAgICAgIHMgPSBzdHJpbmcuc3RyaXAodW51bmlj b2RlKGNoaWxkcmVuWzBdLm5vZGVWYWx1ZSkpCiMgICAgICAgICAgICAgI3ByaW50ICdzPScs YHNgCiMgICAgICAgICAgICAgcmV0dXJuKHMsdmFscHJvcHMpCiMgCWVsaWYgbGVuKGNoaWxk cmVuKSA9PSAwOgojICAgICAgICAgICAgIHJldHVybignJyx2YWxwcm9wcykKIyAgICAgZXhj ZXB0IEF0dHJpYnV0ZUVycm9yOgojICAgICAgICAgaW1wb3J0IHhtbC5kb20uY29yZQojICAg ICAgICAgaWYgbGVuKGNoaWxkcmVuKSA9PSAxIGFuZCBjaGlsZHJlblswXS5ub2RlVHlwZSA9 PSB4bWwuZG9tLmNvcmUuVEVYVF9OT0RFOgojICAgICAgICAgICAgIHJldHVybihzdHJpbmcu c3RyaXAoY2hpbGRyZW5bMF0ubm9kZVZhbHVlKSx2YWxwcm9wcykKIyAJZWxpZiBsZW4oY2hp bGRyZW4pID09IDA6CiMgICAgICAgICAgICAgcmV0dXJuKCcnLHZhbHByb3BzKQoKICAgIGZv ciBjaGlsZCBpbiBjaGlsZHJlbjoKICAgICAgICByYWlzZSAnZHVmZiBkb2M6JyxjaGlsZC5u b2RlTmFtZSwgY2hpbGQubm9kZVR5cGUKCiAgICByYWlzZSBhcmsuZXJyb3IuR2VuZXJhbFBh bmljLCJkb2MgZWxlbWVudCA8JXM+IGlzIGJvZ3VzIiAlIChub2RlLm5vZGVOYW1lKQoKIyAu Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLgpkZWYgX3Byb2Nlc3NfbGlzdChub2RlKToKICAgIHplcm9fYXR0cmlidXRlcyhub2Rl KQoKICAgIGNoaWxkcmVuID0gbm9udHJpdmlhbChub2RlLmNoaWxkTm9kZXMpCgogICAgdmFs cHJvcHMgPSB7fQogICAgbGlzdCA9IFtdCiAgICBmb3IgY2hpbGQgaW4gY2hpbGRyZW46CiAg ICAgICAgbm90VGV4dE5vZGUoY2hpbGQpCiAgICAgICAgIyBwcmludCAnbGlzdCBzdWI6Jywg Y2hpbGQubm9kZU5hbWUKICAgICAgICBjbmFtZSA9IGNoaWxkLm5vZGVOYW1lCiAgICAgICAg aWYgY25hbWUgIT0gJ2l0ZW0nOgogICAgICAgICAgICByYWlzZSBhcmsuZXJyb3IuR2VuZXJh bFBhbmljLCI8bGlzdD4gaGFzIGJvZ3VzIGVsZW1lbnQgPCVzPiIgJSAoY25hbWUpCiAgICAg ICAgbGlzdC5hcHBlbmQoX3Byb2Nlc3NfaXRlbShjaGlsZCkpCgogICAgcmV0dXJuIChsaXN0 LCB2YWxwcm9wcykKCiMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4KZGVmIF9wcm9jZXNzX2l0ZW0obm9kZSk6CiAgICB6ZXJv X2F0dHJpYnV0ZXMobm9kZSkKICAgIGNoaWxkcmVuID0gbm9udHJpdmlhbChub2RlLmNoaWxk Tm9kZXMpCiAgICBpZiBsZW4oY2hpbGRyZW4pICE9IDE6CiAgICAgICAgcmFpc2UgYXJrLmVy cm9yLkdlbmVyYWxQYW5pYywibGlzdCBpdGVtIG11c3QgaGF2ZSBleGFjdGx5IG9uZSBjaGls ZCBub2RlIgoKICAgIChpc19vbmUsdmFsKSA9IGlzX3RleHRseShjaGlsZHJlblswXSkKICAg IGlmIG5vdCBpc19vbmU6CiAgICAgICAgdmFsID0gX3Byb2Nlc3NfcmVzdWx0KGNoaWxkcmVu WzBdLGZ1bGw9MCkKCiMgICAgIHRyeTogIyBweXRob24gMgojICAgICAgICAgaWYgY2hpbGRy ZW5bMF0ubm9kZVR5cGUgPT0gbm9kZS5URVhUX05PREU6CiMgICAgICAgICAgICAgdmFsICAg PSBzdHJpbmcuc3RyaXAodW51bmljb2RlKGNoaWxkcmVuWzBdLm5vZGVWYWx1ZSkpCiMgICAg ICAgICAgICAgIyBzdHVmZiA9ICgnc3RyaW5nJywgdmFsLCB7fSkKIyAgICAgICAgIGVsc2U6 CiMgICAgICAgICAgICAgdmFsID0gX3Byb2Nlc3NfcmVzdWx0KGNoaWxkcmVuWzBdLGZ1bGw9 MCkKIyAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgojICAgICAgICAgaW1wb3J0IHhtbC5k b20uY29yZQojICAgICAgICAgaWYgY2hpbGRyZW5bMF0ubm9kZVR5cGUgPT0geG1sLmRvbS5j b3JlLlRFWFRfTk9ERToKIyAgICAgICAgICAgICB2YWwgICA9IHN0cmluZy5zdHJpcChjaGls ZHJlblswXS5ub2RlVmFsdWUpCiMgICAgICAgICAgICAgIyBzdHVmZiA9ICgnc3RyaW5nJywg dmFsLCB7fSkKIyAgICAgICAgIGVsc2U6CiMgICAgICAgICAgICAgdmFsID0gX3Byb2Nlc3Nf cmVzdWx0KGNoaWxkcmVuWzBdLGZ1bGw9MCkKCiAgICByZXR1cm4gdmFsCgojIC4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCmRl ZiBfcHJvY2Vzc190YWJsZShub2RlKToKICAgIHplcm9fYXR0cmlidXRlcyhub2RlKQoKICAg IGNoaWxkcmVuID0gbm9udHJpdmlhbChub2RlLmNoaWxkTm9kZXMpCgogICAgdmFscHJvcHMg PSB7fQogICAgdGFibGUgPSB7fQogICAgZm9yIGNoaWxkIGluIGNoaWxkcmVuOgogICAgICAg IG5vdFRleHROb2RlKGNoaWxkKQogICAgICAgICMgcHJpbnQgJ2xpc3Qgc3ViOicsIGNoaWxk Lm5vZGVOYW1lCiAgICAgICAgY25hbWUgPSBjaGlsZC5ub2RlTmFtZQogICAgICAgIGlmIGNu YW1lICE9ICdlbnRyeSc6CiAgICAgICAgICAgIHJhaXNlIGFyay5lcnJvci5HZW5lcmFsUGFu aWMsIjx0YWJsZT4gaGFzIGJvZ3VzIGVsZW1lbnQgPCVzPiIgJSAoY25hbWUpCiAgICAgICAg KGtleSx2YWwpID0gX3Byb2Nlc3NfZW50cnkoY2hpbGQpCiAgICAgICAgaWYgdGFibGUuaGFz X2tleShrZXkpOgogICAgICAgICAgICByYWlzZSBhcmsuZXJyb3IuR2VuZXJhbFBhbmljLCI8 dGFibGU+IGhhcyBkdXBsaWNhdGUgZW50cnkgbmFtZWQ6ICVzIiAlIChrZXkpCiAgICAgICAg dGFibGVba2V5XSA9IHZhbAoKICAgIHJldHVybiAodGFibGUsIHZhbHByb3BzKQoKIyAuLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u LgpkZWYgX3Byb2Nlc3NfZW50cnkobm9kZSk6CiAgICBrZXkgPSBvbmVfYXR0cmlidXRlKG5v ZGUsICduYW1lJykKICAgIGNoaWxkcmVuID0gbm9udHJpdmlhbChub2RlLmNoaWxkTm9kZXMp CgogICAgaWYgbGVuKGNoaWxkcmVuKSA9PSAwOgogICAgICAgIHJldHVybihrZXksICcnKSAj IGhvcGUgdGhhdCdzIE9LLi4uCgogICAgZWxpZiBsZW4oY2hpbGRyZW4pICE9IDE6CiAgICAg ICAgcHJpbnQgJ2VudHJ5OicsIGtleQogICAgICAgIGZvciBjIGluIGNoaWxkcmVuOgogICAg ICAgICAgICBwcmludCAncm9ndWUgbm9kZTonLGMubm9kZVR5cGUjLGBjLm5vZGVWYWx1ZWAK ICAgICAgICByYWlzZSBhcmsuZXJyb3IuR2VuZXJhbFBhbmljLCJ0YWJsZSBlbnRyeSBtdXN0 IGhhdmUgZXhhY3RseSBvbmUgY2hpbGQgbm9kZSIKCiAgICAoaXNfb25lLHZhbCkgPSBpc190 ZXh0bHkoY2hpbGRyZW5bMF0pCiAgICBpZiBub3QgaXNfb25lOgogICAgICAgIHZhbCA9IF9w cm9jZXNzX3Jlc3VsdChjaGlsZHJlblswXSxmdWxsPTApCgojICAgICB0cnk6ICMgcHl0aG9u IDIKIyAgICAgICAgIGlmIGNoaWxkcmVuWzBdLm5vZGVUeXBlID09IG5vZGUuVEVYVF9OT0RF OgojICAgICAgICAgICAgIHZhbCAgID0gc3RyaW5nLnN0cmlwKHVudW5pY29kZShjaGlsZHJl blswXS5ub2RlVmFsdWUpKQojICAgICAgICAgICAgICMgc3R1ZmYgPSAoJ3N0cmluZycsIHZh bCwge30pCiMgICAgICAgICBlbHNlOgojICAgICAgICAgICAgIHZhbCA9IF9wcm9jZXNzX3Jl c3VsdChjaGlsZHJlblswXSxmdWxsPTApCiMgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoK IyAgICAgICAgIGltcG9ydCB4bWwuZG9tLmNvcmUKIyAgICAgICAgIGlmIGNoaWxkcmVuWzBd Lm5vZGVUeXBlID09IHhtbC5kb20uY29yZS5URVhUX05PREU6CiMgICAgICAgICAgICAgdmFs ICAgPSBzdHJpbmcuc3RyaXAoY2hpbGRyZW5bMF0ubm9kZVZhbHVlKQojICAgICAgICAgICAg ICMgc3R1ZmYgPSAoJ3N0cmluZycsIHZhbCwge30pCiMgICAgICAgICBlbHNlOgojICAgICAg ICAgICAgIHZhbCA9IF9wcm9jZXNzX3Jlc3VsdChjaGlsZHJlblswXSxmdWxsPTApCiAgICBy ZXR1cm4gKGtleSwgdmFsKQoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0Kbm9fY29kZWNzID0gMCAjIHRoaXMgaXMg MS41LnggY29tcGF0aWJpbGl0eSBzdHVmZgp0cnk6CiAgICBpbXBvcnQgY29kZWNzCiAgICBs YXRpbjFfZW5jb2RlID0gY29kZWNzLmxvb2t1cCgnaXNvLTg4NTktMScpIFswXQpleGNlcHQg SW1wb3J0RXJyb3I6CiAgICBub19jb2RlY3MgPSAxCgpkZWYgdW51bmljb2RlKHVzKToKICAg IGlmIG5vX2NvZGVjczogcmV0dXJuIHVzICMgbm90aGluZyB3ZSBjYW4gZG8KCiAgICBzLCBj b25zdW1lZCA9IGxhdGluMV9lbmNvZGUoIHVzICkKICAgIGFzc2VydCBjb25zdW1lZCA9PSBs ZW4oIHVzICkKICAgIHJldHVybiBzCgojIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCmRlZiB6ZXJvX2F0dHJpYnV0ZXMobm9k ZSk6CiAgICBhdHRycyA9IG5vZGUuYXR0cmlidXRlcwogICAgaWYgYXR0cnMgPT0gTm9uZSBv ciBsZW4oYXR0cnMpID09IDA6CiAgICAgICAgcmV0dXJuCiAgICByYWlzZSBhcmsuZXJyb3Iu R2VuZXJhbFBhbmljLCJlbGVtZW50IDwlcz4gY2Fubm90IGhhdmUgYXR0cmlidXRlcyIgJSAo bm9kZS5ub2RlTmFtZSkKCiMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KZGVmIG9uZV9hdHRyaWJ1dGUobm9kZSxhdHRyX25h bWUpOgogICAgIiIiTm9kZSA8bm9kZT4gbXVzdCBoYXZlIGV4YWN0bHkgb25lIGF0dHJpYnV0 ZSwgbmFtZWQgPGF0dHJfbmFtZT4KICAgIFJldHVybiBpdHMgdmFsdWUuCiAgICAiIiIKICAg IGF0dHJzID0gbm9kZS5hdHRyaWJ1dGVzCiAgICBpZiAgYXR0cnMgPT0gTm9uZSBvciBsZW4o YXR0cnMpID09IDA6CiAgICAgICAgcmFpc2UgYXJrLmVycm9yLkdlbmVyYWxQYW5pYywiPCVz PjogZXhwZWN0ZWQgZXhhY3RseSBvbmUgYXR0cmlidXRlLCBpLmUuIGAlcycgLS0gZ290IG5v bmUiICUgKG5vZGUubm9kZU5hbWUsIGF0dHJfbmFtZSkKICAgIGF0dHJfbmFtZXMgPSBhdHRy cy5rZXlzKCkKICAgIGlmIGxlbihhdHRycykgPT0gMSBhbmQgYXR0cl9uYW1lIGluIGF0dHJf bmFtZXM6CiAgICAgICAgcmV0dXJuKHN0cmluZy5zdHJpcChhdHRyc1thdHRyX25hbWVdLnZh bHVlKSkKICAgIGVsc2U6CiAgICAgICAgcmFpc2UgYXJrLmVycm9yLkdlbmVyYWxQYW5pYywi PCVzPjogZXhwZWN0ZWQgZXhhY3RseSBvbmUgYXR0cmlidXRlLCBpLmUuIGAlcyciICUgKG5v ZGUubm9kZU5hbWUsIGF0dHJfbmFtZSkKCiMgLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KZGVmIHplcm9fb3Jfb25lX2F0dHJp YnV0ZXMobm9kZSxhdHRyX25hbWUpOgogICAgYXR0cnMgPSBub2RlLmF0dHJpYnV0ZXMKICAg IGlmIGF0dHJzID09IE5vbmUgb3IgbGVuKGF0dHJzKSA9PSAwOiByZXR1cm4gTm9uZQogICAg YXR0cl9uYW1lcyA9IGF0dHJzLmtleXMoKQogICAgaWYgbGVuKGF0dHJzKSA9PSAxIGFuZCBh dHRyX25hbWUgaW4gYXR0cl9uYW1lczoKICAgICAgICByZXR1cm4oc3RyaW5nLnN0cmlwKGF0 dHJzW2F0dHJfbmFtZV0udmFsdWUpKQogICAgZWxzZToKICAgICAgICByYWlzZSBhcmsuZXJy b3IuR2VuZXJhbFBhbmljLCI8JXM+OiBleHBlY3RlZCB6ZXJvIG9yIG9uZSBhdHRyaWJ1dGVz LCBpLmUuIGAlcyciICUgKG5vZGUubm9kZU5hbWUsIGF0dHJfbmFtZSkKCiMgLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KZGVm IG9uZV9vcl90d29fYXR0cmlidXRlcyhub2RlLGF0dHJfbmFtZTEsYXR0cl9uYW1lMik6CiAg ICAiIiJOb2RlIDxub2RlPiBtdXN0IGhhdmUgb25lIGF0dHJpYnV0ZSwgbmFtZWQgPGF0dHJf bmFtZTE+LAogICAgYW5kICptYXkqIGhhdmUgYW5vdGhlciBhdHRyLCA8YXR0cl9uYW1lMz4K ICAgIFJldHVybiB0aGUgdmFsdWVzLgogICAgIiIiCiAgICBhdHRycyA9IG5vZGUuYXR0cmli dXRlcwogICAgaWYgYXR0cnMgPT0gTm9uZSBvciBsZW4oYXR0cnMpID09IDA6CiAgICAgICAg cmFpc2UgYXJrLmVycm9yLkdlbmVyYWxQYW5pYywiPCVzPjogZXhwZWN0ZWQgb25lIG9yIHR3 byBhdHRyaWJ1dGVzLCBpLmUuIGAlcycgYW5kIG1heWJlIGAlcycgLS0tIGdvdCBub25lIiAl IChub2RlLm5vZGVOYW1lLCBhdHRyX25hbWUxLGF0dHJfbmFtZTIpCgogICAgYXR0cl9uYW1l cyA9IGF0dHJzLmtleXMoKQogICAgaWYgICBsZW4oYXR0cnMpID09IDEgYW5kIGF0dHJfbmFt ZTEgaW4gYXR0cl9uYW1lczoKICAgICAgICByZXR1cm4gKHN0cmluZy5zdHJpcChhdHRyc1th dHRyX25hbWUxXS52YWx1ZSksIE5vbmUpCiAgICBlbGlmIGxlbihhdHRycykgPT0gMiBhbmQg YXR0cl9uYW1lMSBpbiBhdHRyX25hbWVzIGFuZCBhdHRyX25hbWUyIGluIGF0dHJfbmFtZXM6 CiAgICAgICAgcmV0dXJuIChzdHJpbmcuc3RyaXAoYXR0cnNbYXR0cl9uYW1lMV0udmFsdWUp LCBzdHJpbmcuc3RyaXAoYXR0cnNbYXR0cl9uYW1lMl0udmFsdWUpKQogICAgZWxzZToKICAg ICAgICByYWlzZSBhcmsuZXJyb3IuR2VuZXJhbFBhbmljLCI8JXM+OiBleHBlY3RlZCBvbmUg b3IgdHdvIGF0dHJpYnV0ZXMsIGkuZS4gYCVzJyBhbmQgbWF5YmUgYCVzJyIgJSAobm9kZS5u b2RlTmFtZSwgYXR0cl9uYW1lMSxhdHRyX25hbWUyKQoKIyAuLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgpkZWYgdHdvX29yX3Ro cmVlX2F0dHJpYnV0ZXMobm9kZSxhdHRyX25hbWUxLGF0dHJfbmFtZTIsYXR0cl9uYW1lMyk6 CiAgICAiIiJOb2RlIDxub2RlPiBtdXN0IGhhdmUgdHdvIGF0dHJpYnV0ZXMsIG5hbWVkIDxh dHRyX25hbWUxPgogICAgYW5kIDxhdHRyX25hbWUyPiwgYW5kICptYXkqIGhhdmUgYW5vdGhl ciBhdHRyLCA8YXR0cl9uYW1lMz4KICAgIFJldHVybiB0aGUgdmFsdWVzLgogICAgIiIiCiAg ICBhdHRycyA9IG5vZGUuYXR0cmlidXRlcwogICAgaWYgYXR0cnMgPT0gTm9uZSBvciBsZW4o YXR0cnMpID09IDA6CiAgICAgICAgcmFpc2UgYXJrLmVycm9yLkdlbmVyYWxQYW5pYywiPCVz PjogZXhwZWN0ZWQgdHdvIG9yIHRocmVlIGF0dHJpYnV0ZXMsIGkuZS4gYCVzJywgJyVzJyBh bmQgbWF5YmUgYCVzJyAtLS0gZ290IG5vbmUiICUgKG5vZGUubm9kZU5hbWUsIGF0dHJfbmFt ZTEsYXR0cl9uYW1lMixhdHRyX25hbWUzKQoKICAgIGF0dHJfbmFtZXMgPSBhdHRycy5rZXlz KCkKICAgIGlmICAgbGVuKGF0dHJzKSA9PSAyIGFuZCBhdHRyX25hbWUxIGluIGF0dHJfbmFt ZXMgYW5kIGF0dHJfbmFtZTIgaW4gYXR0cl9uYW1lczoKICAgICAgICByZXR1cm4gKHN0cmlu Zy5zdHJpcChhdHRyc1thdHRyX25hbWUxXS52YWx1ZSksIHN0cmluZy5zdHJpcChhdHRyc1th dHRyX25hbWUyXS52YWx1ZSksIE5vbmUpCiAgICBlbGlmIGxlbihhdHRycykgPT0gMyBhbmQg YXR0cl9uYW1lMSBpbiBhdHRyX25hbWVzIGFuZCBhdHRyX25hbWUyIGluIGF0dHJfbmFtZXMg YW5kIGF0dHJfbmFtZTMgaW4gYXR0cl9uYW1lczoKICAgICAgICByZXR1cm4gKHN0cmluZy5z dHJpcChhdHRyc1thdHRyX25hbWUxXS52YWx1ZSksIHN0cmluZy5zdHJpcChhdHRyc1thdHRy X25hbWUyXS52YWx1ZSksIHN0cmluZy5zdHJpcChhdHRyc1thdHRyX25hbWUzXS52YWx1ZSkp CiAgICBlbHNlOgogICAgICAgIHJhaXNlIGFyay5lcnJvci5HZW5lcmFsUGFuaWMsIjwlcz46 IGV4cGVjdGVkIHR3byBvciB0aHJlZSBhdHRyaWJ1dGVzLCBpLmUuIGAlcycsIGAlcycgYW5k IG1heWJlIGAlcyciICUgKG5vZGUubm9kZU5hbWUsIGF0dHJfbmFtZTEsYXR0cl9uYW1lMixh dHRyX25hbWUzKQoKIyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uLi4uLgpkZWYgdHdvX2F0dHJpYnV0ZXMobm9kZSxhdHRyX25hbWUx LGF0dHJfbmFtZTIpOgogICAgYXR0cnMgPSBub2RlLmF0dHJpYnV0ZXMKICAgIGlmIGF0dHJz ID09IE5vbmUgb3IgbGVuKGF0dHJzKSA9PSAwOgogICAgICAgIHJhaXNlIGFyay5lcnJvci5H ZW5lcmFsUGFuaWMsIjwlcz46IGV4cGVjdGVkIHR3byBhdHRyaWJ1dGVzLCBpLmUuIGAlcycg YW5kIGAlcycgLS0tIGdvdCBub25lIiAlIChub2RlLm5vZGVOYW1lLCBhdHRyX25hbWUxLGF0 dHJfbmFtZTIpCgogICAgYXR0cl9uYW1lcyA9IGF0dHJzLmtleXMoKQogICAgaWYgbGVuKGF0 dHJzKSA9PSAyIGFuZCBhdHRyX25hbWUxIGluIGF0dHJfbmFtZXMgYW5kIGF0dHJfbmFtZTIg aW4gYXR0cl9uYW1lczoKICAgICAgICByZXR1cm4oKHN0cmluZy5zdHJpcChhdHRyc1thdHRy X25hbWUxXS52YWx1ZSksIHN0cmluZy5zdHJpcChhdHRyc1thdHRyX25hbWUyXS52YWx1ZSkp KQogICAgZWxzZToKICAgICAgICByYWlzZSBhcmsuZXJyb3IuR2VuZXJhbFBhbmljLCI8JXM+ IGRvZXMgbm90IGhhdmUgZXhhY3RseSB0d28gYXR0cmlidXRlcywgaS5lLiBgJXMnIGFuZCBg JXMnIiAlIChub2RlLm5vZGVOYW1lLCBhdHRyX25hbWUxLCBhdHRyX25hbWUyKQoKIyAuLi4u Li4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u LgpkZWYgbXVsdGlwbGVfYXR0cmlidXRlcyhub2RlLHRhYmxlKToKICAgIGF0dHJzID0gbm9k ZS5hdHRyaWJ1dGVzCiAgICBpZiBhdHRycyA9PSBOb25lOiBhdHRycyA9IHt9CiAgICB2YWxw cm9wcyA9IHt9CiAgICBmb3IgYW4gaW4gYXR0cnMua2V5cygpOgogICAgICAgIGlmIG5vdCB0 YWJsZS5oYXNfa2V5KGFuKToKICAgICAgICAgICAgcmFpc2UgYXJrLmVycm9yLkdlbmVyYWxQ YW5pYywiPCVzPiBoYXMgYm9ndXMgYXR0cmlidXRlIGAlcyciICUgKG5vZGUubm9kZU5hbWUs IGFuKQogICAgICAgIGlmIHZhbHByb3BzLmhhc19rZXkoYW4pOgogICAgICAgICAgICByYWlz ZSBhcmsuZXJyb3IuR2VuZXJhbFBhbmljLCI8JXM+IGhhcyBhdHRyaWJ1dGUgYCVzJyBtb3Jl IHRoYW4gb25jZSIgJSAobm9kZS5ub2RlTmFtZSwgYW4pCiAgICAgICAgdmFscHJvcHNbYW5d ID0gc3RyaW5nLnN0cmlwKGF0dHJzW2FuXS52YWx1ZSkKCiAgICAjIGZpbGwgaW4gYW55IHJl bWFpbmluZyBkZWZhdWx0cwojIE5vOiBkb24ndAojICAgIGZvciBhbiBpbiB0YWJsZS5rZXlz KCk6CiMgICAgICAgIGlmIG5vdCB2YWxwcm9wcy5oYXNfa2V5KGFuKTogdmFscHJvcHNbYW5d ID0gdGFibGVbYW5dCgogICAgcmV0dXJuIHZhbHByb3BzCgojID09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKaWYgX19u YW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIHN5cy5zdGRlcnIud3JpdGUoJ2Fyay54bWxmaWxl Pz8/XG4nKQoKIyB0aGUgZW5kCg== --=-=-=-- ------------------------------------------------------- The SF.Net email is sponsored by EclipseCon 2004 Premiere Conference on Open Tools Development and Integration See the breadth of Eclipse activity. February 3-5 in Anaheim, CA. http://www.eclipsecon.org/osdn