Received: from magus.postgresql.org (magus.postgresql.org [87.238.57.229]) by mail.postgresql.org (Postfix) with ESMTP id 4A0201B25E4E for ; Thu, 15 Mar 2012 11:36:44 -0300 (ADT) Received: from 30.55.colo.spiretech.net ([69.168.55.30] helo=lists.commandprompt.com) by magus.postgresql.org with esmtp (Exim 4.72) (envelope-from ) id 1S8BnC-0005kB-QC for pgsql-hackers@postgresql.org; Thu, 15 Mar 2012 14:36:42 +0000 Received: from moon (spinlock.commandprompt.com [69.168.55.30]) by lists.commandprompt.com (Postfix) with ESMTPA id 2776AF8; Thu, 15 Mar 2012 07:37:10 -0700 (PDT) Received: from moon ([46.173.85.21] helo=moon) by assp.commandprompt.com with ESMTP (2.1.1); 15 Mar 2012 07:37:08 -0700 From: Alex Shulgin To: Daniel Farina Cc: pgsql-hackers Subject: Re: Another review of URI for libpq, v7 submission References: Date: Thu, 15 Mar 2012 16:36:20 +0200 In-Reply-To: (Daniel Farina's message of "Thu, 15 Mar 2012 01:49:50 -0700") Message-ID: <87d38eaq3f.fsf@commandprompt.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.3 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Assp-Version: 2.1.1(11364) on assp.commandprompt.com X-Assp-ID: assp.commandprompt.com m1-22230-12078 X-Assp-Envelope-From: ash@commandprompt.com X-Assp-Intended-For: pgsql-hackers@postgresql.org X-Assp-Original-Subject: Re: [HACKERS] Another review of URI for libpq, v7 submission X-Pg-Spam-Score: -1.9 (-) X-Archive-Number: 201203/992 X-Sequence-Number: 204874 --=-=-= Daniel Farina writes: > I reviewed this and so far have not found any serious problems, > although as is par for the course it contains some of the fiddly bits > involved in any string manipulations in C. I made a few edits -- none > strictly necessary for correctness -- that the original author is free > audit and/or include[0]. Thank you for the review, Daniel! Apparently, I was on drugs when I've submitted v7, as it still contains the bug for which to fix I was forced to move parts of the code back into the main parser routine... > I did put in some defensive programming choices (instead of if/else > if/elseif/else raise an error, even if the latter is allegedly > impossible) that I think are a good idea. Yes, this is a good idea, I'll incorporate them in the patch. However, this one doesn't work: https://github.com/fdr/postgres/commit/4fad90fb243d9266b1003cfbcf8397f67269fad3 Neither '@' or '/' are mandatory in the URI anywhere after "scheme://", so we can't just say it "should never happen." Running the regression test with this commit applied highlights the problem. > One thing I found puzzling was that in the latest revision the tests > appeared to be broken for me: all "@" signs were translated to "(at)". > Is that mangling applied by the archives, or something? This is definitely mangling by the lists. I can see this has happened to people before, e.g.: http://archives.postgresql.org/pgsql-hackers/2010-01/msg00938.php But that discussion didn't seem to lead to a solution for the problem. I wonder if there's any evidence as to that mangling the email addresses helps to reduce spam at all? I mean replacing "(at)" back to "@" and "(dot)" to "." is piece of cake for a spam crawler. What I see though, is that most of the message-id URLs are broken by the mangling. Also I don't think everyone should just tolerate that it messes with the attachments. Should we all suddenly use application/octet-stream or application/gzip instead of text/plain? > The test suite neatly tries to copy pg_regress's general "make > installcheck" style, but it likes to use my username as the database > rather than the standard "regression" as seen by pg_regress. It is > nice that a place to test connection strings and such is there, where > there was none before. Oh, I don't see why we can't use "regression" too. While testing this I've also noticed that there was some funny behavior when you left out the final slash after hostname, e.g.: "postgres://localhost/" vs. "postgres://localhost". It turned out in the former case we were setting dbname conninfo parameter to an empty string and in the latter one we didn't set it at all. The difference is that when we do set it, the default dbname is derived from username, but when we don't--$PGDATABASE is used. I've fixed this, so now both URIs work the same way (both do not set dbname.) It also appeared to me that with the current code, a wide range of funny-looking URIs are considered valid, e.g.: postgres://user@ postgres://@host postgres://host:/ and, taking approach to the extreme: postgres://:@: This specifies empty user, password, host and port, and looks really funny. I've added (actually revived) some checks to forbid setting empty URI parts where it doesn't make much sense. Finally, attached is v8. Hopefully I didn't mess things up too much. -- Regards, Alex --=-=-= Content-Type: application/octet-stream Content-Disposition: attachment Content-Transfer-Encoding: base64 Content-Description: libpq-uri-v8.patch KioqIGEvc3JjL2ludGVyZmFjZXMvbGlicHEvTWFrZWZpbGUKLS0tIGIvc3JjL2ludGVyZmFjZXMv bGlicHEvTWFrZWZpbGUKKioqKioqKioqKioqKioqCioqKiAxMjEsMTI2ICoqKiogaW5zdGFsbDog YWxsIGluc3RhbGxkaXJzIGluc3RhbGwtbGliCi0tLSAxMjEsMTI5IC0tLS0KICAJJChJTlNUQUxM X0RBVEEpICQoc3JjZGlyKS9wcWV4cGJ1ZmZlci5oICckKERFU1RESVIpJChpbmNsdWRlZGlyX2lu dGVybmFsKScKICAJJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9wZ19zZXJ2aWNlLmNvbmYuc2Ft cGxlICckKERFU1RESVIpJChkYXRhZGlyKS9wZ19zZXJ2aWNlLmNvbmYuc2FtcGxlJwogIAorIGNo ZWNrIGluc3RhbGxjaGVjazoKKyAJJChNQUtFKSAtQyB0ZXN0ICRACisgCiAgaW5zdGFsbGRpcnM6 IGluc3RhbGxkaXJzLWxpYgogIAkkKE1LRElSX1ApICckKERFU1RESVIpJChpbmNsdWRlZGlyKScg JyQoREVTVERJUikkKGluY2x1ZGVkaXJfaW50ZXJuYWwpJwogIAoqKioqKioqKioqKioqKioKKioq IDEzMiwxMzcgKioqKiB1bmluc3RhbGw6IHVuaW5zdGFsbC1saWIKLS0tIDEzNSwxNDEgLS0tLQog IAlybSAtZiAnJChERVNURElSKSQoZGF0YWRpcikvcGdfc2VydmljZS5jb25mLnNhbXBsZScKICAK ICBjbGVhbiBkaXN0Y2xlYW46IGNsZWFuLWxpYgorIAkkKE1BS0UpIC1DIHRlc3QgJEAKICAJcm0g LWYgJChPQkpTKSBwdGhyZWFkLmggbGlicHEucmMKICAjIE1pZ2h0IGJlIGxlZnQgb3ZlciBmcm9t IGEgV2luMzIgY2xpZW50LW9ubHkgYnVpbGQKICAJcm0gLWYgcGdfY29uZmlnX3BhdGhzLmgKKioq KioqKioqKioqKioqCioqKiAxNDIsMTQ1ICoqKiogY2xlYW4gZGlzdGNsZWFuOiBjbGVhbi1saWIK LS0tIDE0NiwxNTAgLS0tLQogIAlybSAtZiBlbmNuYW1lcy5jIHdjaGFyLmMKICAKICBtYWludGFp bmVyLWNsZWFuOiBkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbi1saWIKKyAJJChNQUtFKSAtQyB0 ZXN0ICRACiAgCXJtIC1mIGxpYnBxLWRpc3QucmMKKioqIGEvc3JjL2ludGVyZmFjZXMvbGlicHEv ZmUtY29ubmVjdC5jCi0tLSBiL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLWNvbm5lY3QuYwoqKioq KioqKioqKioqKioKKioqIDI4MiwyODcgKioqKiBzdGF0aWMgY29uc3QgUFFFbnZpcm9ubWVudE9w dGlvbiBFbnZpcm9ubWVudE9wdGlvbnNbXSA9Ci0tLSAyODIsMjkwIC0tLS0KICAJfQogIH07CiAg CisgLyogVGhlIGNvbm5lY3Rpb24gVVJJIG11c3Qgc3RhcnQgd2l0aCBlaXRoZXIgb2YgdGhlIGZv bGxvd2luZyBkZXNpZ25hdG9yczogKi8KKyBzdGF0aWMgY29uc3QgY2hhciB1cmlfZGVzaWduYXRv cltdID0gInBvc3RncmVzcWw6Ly8iOworIHN0YXRpYyBjb25zdCBjaGFyIHNob3J0X3VyaV9kZXNp Z25hdG9yW10gPSAicG9zdGdyZXM6Ly8iOwogIAogIHN0YXRpYyBib29sIGNvbm5lY3RPcHRpb25z MShQR2Nvbm4gKmNvbm4sIGNvbnN0IGNoYXIgKmNvbm5pbmZvKTsKICBzdGF0aWMgYm9vbCBjb25u ZWN0T3B0aW9uczIoUEdjb25uICpjb25uKTsKKioqKioqKioqKioqKioqCioqKiAyOTcsMzAzICoq Kiogc3RhdGljIFBRY29ubmluZm9PcHRpb24gKmNvbm5pbmZvX3BhcnNlKGNvbnN0IGNoYXIgKmNv bm5pbmZvLAogIHN0YXRpYyBQUWNvbm5pbmZvT3B0aW9uICpjb25uaW5mb19hcnJheV9wYXJzZShj b25zdCBjaGFyICpjb25zdCAqIGtleXdvcmRzLAogIAkJCQkJIGNvbnN0IGNoYXIgKmNvbnN0ICog dmFsdWVzLCBQUUV4cEJ1ZmZlciBlcnJvck1lc3NhZ2UsCiAgCQkJCQkgYm9vbCB1c2VfZGVmYXVs dHMsIGludCBleHBhbmRfZGJuYW1lKTsKISBzdGF0aWMgY2hhciAqY29ubmluZm9fZ2V0dmFsKFBR Y29ubmluZm9PcHRpb24gKmNvbm5PcHRpb25zLAogIAkJCQljb25zdCBjaGFyICprZXl3b3JkKTsK ICBzdGF0aWMgdm9pZCBkZWZhdWx0Tm90aWNlUmVjZWl2ZXIodm9pZCAqYXJnLCBjb25zdCBQR3Jl c3VsdCAqcmVzKTsKICBzdGF0aWMgdm9pZCBkZWZhdWx0Tm90aWNlUHJvY2Vzc29yKHZvaWQgKmFy ZywgY29uc3QgY2hhciAqbWVzc2FnZSk7Ci0tLSAzMDAsMzI1IC0tLS0KICBzdGF0aWMgUFFjb25u aW5mb09wdGlvbiAqY29ubmluZm9fYXJyYXlfcGFyc2UoY29uc3QgY2hhciAqY29uc3QgKiBrZXl3 b3JkcywKICAJCQkJCSBjb25zdCBjaGFyICpjb25zdCAqIHZhbHVlcywgUFFFeHBCdWZmZXIgZXJy b3JNZXNzYWdlLAogIAkJCQkJIGJvb2wgdXNlX2RlZmF1bHRzLCBpbnQgZXhwYW5kX2RibmFtZSk7 CiEgc3RhdGljIFBRY29ubmluZm9PcHRpb24gKmNvbm5pbmZvX3VyaV9wYXJzZShjb25zdCBjaGFy ICp1cmksCiEgCQkJCVBRRXhwQnVmZmVyIGVycm9yTWVzc2FnZSk7CiEgc3RhdGljIGJvb2wgY29u bmluZm9fdXJpX3BhcnNlX29wdGlvbnMoUFFjb25uaW5mb09wdGlvbiAqb3B0aW9ucywKISAJCQkJ Y29uc3QgY2hhciAqdXJpLCBjaGFyICpidWYsCiEgCQkJCVBRRXhwQnVmZmVyIGVycm9yTWVzc2Fn ZSk7CiEgc3RhdGljIGJvb2wgY29ubmluZm9fdXJpX3BhcnNlX3BhcmFtcyhjaGFyICpwYXJhbXMs CiEgCQkJCVBRY29ubmluZm9PcHRpb24gKmNvbm5PcHRpb25zLAohIAkJCQlQUUV4cEJ1ZmZlciBl cnJvck1lc3NhZ2UpOwohIHN0YXRpYyBjaGFyICpjb25uaW5mb191cmlfZGVjb2RlKGNvbnN0IGNo YXIgKnN0ciwgUFFFeHBCdWZmZXIgZXJyb3JNZXNzYWdlKTsKISBzdGF0aWMgYm9vbCBnZXRfaGV4 ZGlnaXQoY2hhciBkaWdpdCwgaW50ICp2YWx1ZSk7CiEgc3RhdGljIGNvbnN0IGNoYXIgKmNvbm5p bmZvX2dldHZhbChQUWNvbm5pbmZvT3B0aW9uICpjb25uT3B0aW9ucywKISAJCQkJY29uc3QgY2hh ciAqa2V5d29yZCk7CiEgc3RhdGljIFBRY29ubmluZm9PcHRpb24gKmNvbm5pbmZvX3N0b3JldmFs KFBRY29ubmluZm9PcHRpb24gKmNvbm5PcHRpb25zLAohIAkJCQljb25zdCBjaGFyICprZXl3b3Jk LCBjb25zdCBjaGFyICp2YWx1ZSwKISAJCQkJUFFFeHBCdWZmZXIgZXJyb3JNZXNzYWdlLCBib29s IGlnbm9yZU1pc3NpbmcpOwohIHN0YXRpYyBQUWNvbm5pbmZvT3B0aW9uICpjb25uaW5mb19zdG9y ZV91cmlfZW5jb2RlZF92YWx1ZSgKISAJCQkJUFFjb25uaW5mb09wdGlvbiAqY29ubk9wdGlvbnMs CiEgCQkJCWNvbnN0IGNoYXIgKmtleXdvcmQsIGNvbnN0IGNoYXIgKmVuY29kZWRfdmFsdWUsCiEg CQkJCVBRRXhwQnVmZmVyIGVycm9yTWVzc2FnZSwgYm9vbCBpZ25vcmVNaXNzaW5nKTsKISBzdGF0 aWMgUFFjb25uaW5mb09wdGlvbiAqY29ubmluZm9fZmluZChQUWNvbm5pbmZvT3B0aW9uICpjb25u T3B0aW9ucywKICAJCQkJY29uc3QgY2hhciAqa2V5d29yZCk7CiAgc3RhdGljIHZvaWQgZGVmYXVs dE5vdGljZVJlY2VpdmVyKHZvaWQgKmFyZywgY29uc3QgUEdyZXN1bHQgKnJlcyk7CiAgc3RhdGlj IHZvaWQgZGVmYXVsdE5vdGljZVByb2Nlc3Nvcih2b2lkICphcmcsIGNvbnN0IGNoYXIgKm1lc3Nh Z2UpOwoqKioqKioqKioqKioqKioKKioqIDU4MCw1ODYgKioqKiBQUWNvbm5lY3RTdGFydChjb25z dCBjaGFyICpjb25uaW5mbykKICBzdGF0aWMgdm9pZAogIGZpbGxQR2Nvbm4oUEdjb25uICpjb25u LCBQUWNvbm5pbmZvT3B0aW9uICpjb25uT3B0aW9ucykKICB7CiEgCWNoYXIJICAgKnRtcDsKICAK ICAJLyoKICAJICogTW92ZSBvcHRpb24gdmFsdWVzIGludG8gY29ubiBzdHJ1Y3R1cmUKLS0tIDYw Miw2MDggLS0tLQogIHN0YXRpYyB2b2lkCiAgZmlsbFBHY29ubihQR2Nvbm4gKmNvbm4sIFBRY29u bmluZm9PcHRpb24gKmNvbm5PcHRpb25zKQogIHsKISAJY29uc3QgY2hhcgkgICAqdG1wOwogIAog IAkvKgogIAkgKiBNb3ZlIG9wdGlvbiB2YWx1ZXMgaW50byBjb25uIHN0cnVjdHVyZQoqKioqKioq KioqKioqKioKKioqIDM3NDEsMzc0NyAqKioqIGxkYXBTZXJ2aWNlTG9va3VwKGNvbnN0IGNoYXIg KnB1cmwsIFBRY29ubmluZm9PcHRpb24gKm9wdGlvbnMsCiAgc3RhdGljIGludAogIHBhcnNlU2Vy dmljZUluZm8oUFFjb25uaW5mb09wdGlvbiAqb3B0aW9ucywgUFFFeHBCdWZmZXIgZXJyb3JNZXNz YWdlKQogIHsKISAJY2hhcgkgICAqc2VydmljZSA9IGNvbm5pbmZvX2dldHZhbChvcHRpb25zLCAi c2VydmljZSIpOwogIAljaGFyCQlzZXJ2aWNlRmlsZVtNQVhQR1BBVEhdOwogIAljaGFyCSAgICpl bnY7CiAgCWJvb2wJCWdyb3VwX2ZvdW5kID0gZmFsc2U7Ci0tLSAzNzYzLDM3NjkgLS0tLQogIHN0 YXRpYyBpbnQKICBwYXJzZVNlcnZpY2VJbmZvKFBRY29ubmluZm9PcHRpb24gKm9wdGlvbnMsIFBR RXhwQnVmZmVyIGVycm9yTWVzc2FnZSkKICB7CiEgCWNvbnN0IGNoYXIgKnNlcnZpY2UgPSBjb25u aW5mb19nZXR2YWwob3B0aW9ucywgInNlcnZpY2UiKTsKICAJY2hhcgkJc2VydmljZUZpbGVbTUFY UEdQQVRIXTsKICAJY2hhcgkgICAqZW52OwogIAlib29sCQlncm91cF9mb3VuZCA9IGZhbHNlOwoq KioqKioqKioqKioqKioKKioqIDQxMzEsNDE2MyAqKioqIGNvbm5pbmZvX3BhcnNlKGNvbnN0IGNo YXIgKmNvbm5pbmZvLCBQUUV4cEJ1ZmZlciBlcnJvck1lc3NhZ2UsCiAgCQl9CiAgCiAgCQkvKgoh IAkJICogTm93IHdlIGhhdmUgdGhlIG5hbWUgYW5kIHRoZSB2YWx1ZS4gU2VhcmNoIGZvciB0aGUg cGFyYW0gcmVjb3JkLgohIAkJICovCiEgCQlmb3IgKG9wdGlvbiA9IG9wdGlvbnM7IG9wdGlvbi0+ a2V5d29yZCAhPSBOVUxMOyBvcHRpb24rKykKISAJCXsKISAJCQlpZiAoc3RyY21wKG9wdGlvbi0+ a2V5d29yZCwgcG5hbWUpID09IDApCiEgCQkJCWJyZWFrOwohIAkJfQohIAkJaWYgKG9wdGlvbi0+ a2V5d29yZCA9PSBOVUxMKQohIAkJewohIAkJCXByaW50ZlBRRXhwQnVmZmVyKGVycm9yTWVzc2Fn ZSwKISAJCQkJCQkgbGlicHFfZ2V0dGV4dCgiaW52YWxpZCBjb25uZWN0aW9uIG9wdGlvbiBcIiVz XCJcbiIpLAohIAkJCQkJCQkgIHBuYW1lKTsKISAJCQlQUWNvbm5pbmZvRnJlZShvcHRpb25zKTsK ISAJCQlmcmVlKGJ1Zik7CiEgCQkJcmV0dXJuIE5VTEw7CiEgCQl9CiEgCiEgCQkvKgohIAkJICog U3RvcmUgdGhlIHZhbHVlCiAgCQkgKi8KISAJCWlmIChvcHRpb24tPnZhbCkKISAJCQlmcmVlKG9w dGlvbi0+dmFsKTsKISAJCW9wdGlvbi0+dmFsID0gc3RyZHVwKHB2YWwpOwohIAkJaWYgKCFvcHRp b24tPnZhbCkKICAJCXsKLSAJCQlwcmludGZQUUV4cEJ1ZmZlcihlcnJvck1lc3NhZ2UsCi0gCQkJ CQkJCSAgbGlicHFfZ2V0dGV4dCgib3V0IG9mIG1lbW9yeVxuIikpOwogIAkJCVBRY29ubmluZm9G cmVlKG9wdGlvbnMpOwogIAkJCWZyZWUoYnVmKTsKICAJCQlyZXR1cm4gTlVMTDsKLS0tIDQxNTMs NDE2MiAtLS0tCiAgCQl9CiAgCiAgCQkvKgohIAkJICogTm93IHRoYXQgd2UgaGF2ZSB0aGUgbmFt ZSBhbmQgdGhlIHZhbHVlLCBzdG9yZSB0aGUgcmVjb3JkLgogIAkJICovCiEgCQlpZiAoIWNvbm5p bmZvX3N0b3JldmFsKG9wdGlvbnMsIHBuYW1lLCBwdmFsLCBlcnJvck1lc3NhZ2UsIGZhbHNlKSkK ICAJCXsKICAJCQlQUWNvbm5pbmZvRnJlZShvcHRpb25zKTsKICAJCQlmcmVlKGJ1Zik7CiAgCQkJ cmV0dXJuIE5VTEw7CioqKioqKioqKioqKioqKgoqKiogNDI3OCw0Mjg1ICoqKiogY29ubmluZm9f YXJyYXlfcGFyc2UoY29uc3QgY2hhciAqY29uc3QgKiBrZXl3b3JkcywgY29uc3QgY2hhciAqY29u c3QgKiB2YWx1ZXMsCiAgCQkvKiBmaXJzdCBmaW5kICJkYm5hbWUiIGlmIGFueSAqLwogIAkJaWYg KHN0cmNtcChwbmFtZSwgImRibmFtZSIpID09IDApCiAgCQl7CiAgCQkJLyogbmV4dCBsb29rIGZv ciAiPSIgaW4gdGhlIHZhbHVlICovCiEgCQkJaWYgKHB2YWx1ZSAmJiBzdHJjaHIocHZhbHVlLCAn PScpKQogIAkJCXsKICAJCQkJLyoKICAJCQkJICogTXVzdCBiZSBhIGNvbm5pbmZvIHN0cmluZywg c28gcGFyc2UgaXQsIGJ1dCBkbyBub3QgdXNlCi0tLSA0Mjc3LDQyOTkgLS0tLQogIAkJLyogZmly c3QgZmluZCAiZGJuYW1lIiBpZiBhbnkgKi8KICAJCWlmIChzdHJjbXAocG5hbWUsICJkYm5hbWUi KSA9PSAwKQogIAkJeworIAkJCS8qCisgCQkJICogTG9vayBmb3IgVVJJIHByZWZpeC4gIFRoaXMg aGFzIHRvIGNvbWUgYmVmb3JlIHRoZSBjaGVjayBmb3IgIj0iLAorIAkJCSAqIHNpbmNlIFVSSSBt aWdodCBhcyB3ZWxsIGNvbnRhaW4gIj0iIGlmIGV4dHJhIHBhcmFtZXRlcnMgYXJlCisgCQkJICog Z2l2ZW4uCisgCQkJICovCisgCQkJaWYgKHB2YWx1ZSAmJiAoCisgCQkJCQkoc3RybmNtcChwdmFs dWUsIHVyaV9kZXNpZ25hdG9yLAorIAkJCQkJCQkgc2l6ZW9mKHVyaV9kZXNpZ25hdG9yKSAtIDEp ID09IDApIHx8CisgCQkJCQkoc3RybmNtcChwdmFsdWUsIHNob3J0X3VyaV9kZXNpZ25hdG9yLAor IAkJCQkJCQkgc2l6ZW9mKHNob3J0X3VyaV9kZXNpZ25hdG9yKSAtIDEpID09IDApKSkKKyAJCQl7 CisgCQkJCXN0cl9vcHRpb25zID0gY29ubmluZm9fdXJpX3BhcnNlKHB2YWx1ZSwgZXJyb3JNZXNz YWdlKTsKKyAJCQkJaWYgKHN0cl9vcHRpb25zID09IE5VTEwpCisgCQkJCQlyZXR1cm4gTlVMTDsK KyAJCQl9CiAgCQkJLyogbmV4dCBsb29rIGZvciAiPSIgaW4gdGhlIHZhbHVlICovCiEgCQkJZWxz ZSBpZiAocHZhbHVlICYmIHN0cmNocihwdmFsdWUsICc9JykpCiAgCQkJewogIAkJCQkvKgogIAkJ CQkgKiBNdXN0IGJlIGEgY29ubmluZm8gc3RyaW5nLCBzbyBwYXJzZSBpdCwgYnV0IGRvIG5vdCB1 c2UKKioqKioqKioqKioqKioqCioqKiA0NDU0LDQ0NjkgKioqKiBjb25uaW5mb19hcnJheV9wYXJz ZShjb25zdCBjaGFyICpjb25zdCAqIGtleXdvcmRzLCBjb25zdCBjaGFyICpjb25zdCAqIHZhbHVl cywKICAJcmV0dXJuIG9wdGlvbnM7CiAgfQogIAogIHN0YXRpYyBjaGFyICoKICBjb25uaW5mb19n ZXR2YWwoUFFjb25uaW5mb09wdGlvbiAqY29ubk9wdGlvbnMsCiAgCQkJCWNvbnN0IGNoYXIgKmtl eXdvcmQpCiAgewogIAlQUWNvbm5pbmZvT3B0aW9uICpvcHRpb247CiAgCiAgCWZvciAob3B0aW9u ID0gY29ubk9wdGlvbnM7IG9wdGlvbi0+a2V5d29yZCAhPSBOVUxMOyBvcHRpb24rKykKICAJewog IAkJaWYgKHN0cmNtcChvcHRpb24tPmtleXdvcmQsIGtleXdvcmQpID09IDApCiEgCQkJcmV0dXJu IG9wdGlvbi0+dmFsOwogIAl9CiAgCiAgCXJldHVybiBOVUxMOwotLS0gNDQ2OCw1MDQzIC0tLS0K ICAJcmV0dXJuIG9wdGlvbnM7CiAgfQogIAorIC8qCisgICogQ29ubmVjdGlvbiBVUkkgcGFyc2Vy IHJvdXRpbmUKKyAgKgorICAqIElmIHN1Y2Nlc3NmdWwsIGEgbWFsbG9jJ2QgUFFjb25uaW5mb09w dGlvbiBhcnJheSBpcyByZXR1cm5lZC4KKyAgKiBJZiBub3Qgc3VjY2Vzc2Z1bCwgTlVMTCBpcyBy ZXR1cm5lZCBhbmQgYW4gZXJyb3IgbWVzc2FnZSBpcworICAqIGxlZnQgaW4gZXJyb3JNZXNzYWdl LgorICAqCisgICogVGhpcyBpcyBvbmx5IGEgd3JhcHBlciBmb3IgY29ubmluZm9fdXJpX3BhcnNl X29wdGlvbnMsIHdoaWNoIGRvZXMgYWxsIG9mIHRoZQorICAqIGhlYXZ5IGxpZnRpbmcsIHdoaWxl IHRoaXMgZnVuY3Rpb24gaGFuZGxlcyBwcm9wZXIgKGRlLSlhbGxvY2F0aW9uIG9mIG1lbW9yeQor ICAqIGJ1ZmZlcnMuCisgICovCisgc3RhdGljIFBRY29ubmluZm9PcHRpb24gKgorIGNvbm5pbmZv X3VyaV9wYXJzZShjb25zdCBjaGFyICp1cmksIFBRRXhwQnVmZmVyIGVycm9yTWVzc2FnZSkKKyB7 CisgCVBRY29ubmluZm9PcHRpb24gKm9wdGlvbnM7CisgCWNoYXIgKmJ1ZjsKKyAKKyAJcmVzZXRQ UUV4cEJ1ZmZlcihlcnJvck1lc3NhZ2UpOworIAorIAkvKiBNYWtlIGEgd29ya2luZyBjb3B5IG9m IFBRY29ubmluZm9PcHRpb25zICovCisgCW9wdGlvbnMgPSBtYWxsb2Moc2l6ZW9mKFBRY29ubmlu Zm9PcHRpb25zKSk7CisgCWlmIChvcHRpb25zID09IE5VTEwpCisgCXsKKyAJCXByaW50ZlBRRXhw QnVmZmVyKGVycm9yTWVzc2FnZSwgbGlicHFfZ2V0dGV4dCgib3V0IG9mIG1lbW9yeVxuIikpOwor IAkJcmV0dXJuIE5VTEw7CisgCX0KKyAJbWVtY3B5KG9wdGlvbnMsIFBRY29ubmluZm9PcHRpb25z LCBzaXplb2YoUFFjb25uaW5mb09wdGlvbnMpKTsKKyAKKyAJLyogTWFrZSBhIHdyaXRhYmxlIGNv cHkgb2YgdGhlIFVSSSBidWZmZXIgKi8KKyAJYnVmID0gc3RyZHVwKHVyaSk7CisgCWlmIChidWYg PT0gTlVMTCkKKyAJeworIAkJcHJpbnRmUFFFeHBCdWZmZXIoZXJyb3JNZXNzYWdlLCBsaWJwcV9n ZXR0ZXh0KCJvdXQgb2YgbWVtb3J5XG4iKSk7CisgCQlmcmVlKG9wdGlvbnMpOworIAkJcmV0dXJu IE5VTEw7CisgCX0KKyAKKyAJaWYgKCFjb25uaW5mb191cmlfcGFyc2Vfb3B0aW9ucyhvcHRpb25z LCB1cmksIGJ1ZiwgZXJyb3JNZXNzYWdlKSkKKyAJeworIAkJZnJlZShvcHRpb25zKTsKKyAJCW9w dGlvbnMgPSBOVUxMOworIAl9CisgCisgCWZyZWUoYnVmKTsKKyAJcmV0dXJuIG9wdGlvbnM7Cisg fQorIAorIC8qCisgICogQ29ubmVjdGlvbiBVUkkgcGFyc2VyOiBhY3R1YWwgcGFyc2VyIHJvdXRp bmUKKyAgKgorICAqIElmIHN1Y2Nlc3NmdWwsIHJldHVybnMgdHJ1ZSB3aGlsZSB0aGUgb3B0aW9u cyBhcnJheSBpcyBmaWxsZWQgd2l0aCBwYXJzZWQKKyAgKiBvcHRpb25zIGZyb20gdGhlIHBhc3Nl ZCBVUkkKKyAgKiBJZiBub3Qgc3VjY2Vzc2Z1bCwgcmV0dXJucyBmYWxzZSBhbmQgZmlsbHMgZXJy b3JNZXNzYWdlIGFjY29yZGluZ2x5LgorICAqCisgICogUGFyc2VzIHRoZSBjb25uZWN0aW9uIFVS SSBzdHJpbmcgaW4gJ2J1ZicgKHdoaWxlIGRlc3RydWN0aXZlbHkgbW9kaWZ5aW5nCisgICogaXQs KSBhY2NvcmRpbmcgdG8gdGhlIFVSSSBzeW50YXggYmVsb3cuICBUaGUgJ3VyaScgcGFyYW1ldGVy IGlzIG9ubHkgdXNlZAorICAqIGZvciBlcnJvciByZXBvcnRpbmcgYW5kICdidWYnIHNob3VsZCBp bml0aWFsbHkgY29udGFpbiBhIHdyaXRhYmxlIGNvcHkgb2YKKyAgKiAndXJpJy4KKyAgKgorICAq IFRoZSBnZW5lcmFsIGZvcm0gZm9yIGNvbm5lY3Rpb24gVVJJIGlzIHRoZSBmb2xsb3dpbmc6Cisg ICoKKyAgKiAgIHBvc3RncmVzcWw6Ly91c2VyOnB3QGhvc3Q6cG9ydC9kYXRhYmFzZQorICAqCisg ICogVG8gc3BlY2lmeSBhIElQdjYgaG9zdCBhZGRyZXNzLCBlbmNsb3NlIHRoZSBhZGRyZXNzIGlu IHNxdWFyZSBicmFja2V0czoKKyAgKgorICAqICAgcG9zdGdyZXNxbDovL1s6OjFdL2RhdGFiYXNl CisgICoKKyAgKiBDb25uZWN0aW9uIHBhcmFtZXRlcnMgbWF5IGZvbGxvdyB0aGUgYmFzZSBVUkkg dXNpbmcgdGhpcyBzeW50YXg6CisgICoKKyAgKiAgIHBvc3RncmVzcWw6Ly9ob3N0L2RhdGFiYXNl P3BhcmFtMT12YWx1ZTEmcGFyYW0yPXZhbHVlMiYuLi4KKyAgKi8KKyBzdGF0aWMgYm9vbAorIGNv bm5pbmZvX3VyaV9wYXJzZV9vcHRpb25zKFBRY29ubmluZm9PcHRpb24gKm9wdGlvbnMsIGNvbnN0 IGNoYXIgKnVyaSwKKyAJCQkJCQkgICBjaGFyICpidWYsIFBRRXhwQnVmZmVyIGVycm9yTWVzc2Fn ZSkKKyB7CisgCWNoYXIgKnA7CisgCWNoYXIgKnN0YXJ0ID0gYnVmOworIAljaGFyIGxhc3RjID0g J1wwJzsKKyAJY2hhciAqdXNlciA9IE5VTEw7CisgCisgCS8qIEFzc3VtZSBVUkkgcHJlZml4IGlz IGFscmVhZHkgdmVyaWZpZWQgYnkgdGhlIGNhbGxlciAqLworIAlpZiAoc3RybmNtcCh1cmksIHVy aV9kZXNpZ25hdG9yLCBzaXplb2YodXJpX2Rlc2lnbmF0b3IpIC0gMSkgPT0gMCkKKyAJeworIAkJ c3RhcnQgKz0gc2l6ZW9mKHVyaV9kZXNpZ25hdG9yKSAtIDE7CisgCX0KKyAJZWxzZSBpZiAoc3Ry bmNtcCh1cmksIHNob3J0X3VyaV9kZXNpZ25hdG9yLAorIAkJCQkJIHNpemVvZihzaG9ydF91cmlf ZGVzaWduYXRvcikgLSAxKSA9PSAwKQorIAl7CisgCQlzdGFydCArPSBzaXplb2Yoc2hvcnRfdXJp X2Rlc2lnbmF0b3IpIC0gMTsKKyAJfQorIAllbHNlCisgCXsKKyAJCS8qIFNob3VsZCBuZXZlciBo YXBwZW4gKi8KKyAJCXByaW50ZlBRRXhwQnVmZmVyKGVycm9yTWVzc2FnZSwKKyAJCQkJCQkgIGxp YnBxX2dldHRleHQoImludmFsaWQgVVJJIFwiJXNcIiBwcm9wYWdhdGVkIHRvIGludGVybmFsIHBh cnNlciByb3V0aW5lIiksCisgCQkJCQkJICB1cmkpOworIAkJcmV0dXJuIGZhbHNlOworIAl9Cisg CXAgPSBzdGFydDsKKyAKKyAJLyogQ2hlY2sgZm9yIGxvY2FsIHVuaXggc29ja2V0IGRpciBhdCBz dGFydCBvZiBVUkkgKi8KKyAJaWYgKCpwID09ICcvJykKKyAJeworIAkJLyogTG9vayBmb3IgcG9z c2libGUgcXVlcnkgcGFyYW1ldGVycyAqLworIAkJd2hpbGUgKCpwICYmICpwICE9ICc/JykKKyAJ CQkrK3A7CisgCQlsYXN0YyA9ICpwOworIAkJKnAgPSAnXDAnOworIAorIAkJaWYgKCFjb25uaW5m b19zdG9yZV91cmlfZW5jb2RlZF92YWx1ZShvcHRpb25zLCAiaG9zdCIsIHN0YXJ0LAorIAkJCQkJ CQkJCQkJICBlcnJvck1lc3NhZ2UsIGZhbHNlKSkKKyAJCQlyZXR1cm4gZmFsc2U7CisgCX0KKyAJ ZWxzZQorIAl7CisgCQkvKiBOb3QgYSB1bml4IHNvY2tldCBkaXI6IHBhcnNlIGFzIGhvc3QgbmFt ZS9hZGRyZXNzICovCisgCQljb25zdCBjaGFyICpob3N0OworIAorIAkJLyogTG9vayBhaGVhZCBm b3IgcG9zc2libGUgdXNlciBjcmVkZW50aWFscyBkZXNpZ25hdG9yICovCisgCQl3aGlsZSAoKnAg JiYgKnAgIT0gJ0AnICYmICpwICE9ICcvJykKKyAJCQkrK3A7CisgCQlpZiAoKnAgIT0gJ0AnKQor IAkJeworIAkJCS8qCisgCQkJICogTm8gdXNlcm5hbWUvcGFzc3dvcmQgZGVzaWduYXRvciBmb3Vu ZC4KKyAJCQkgKgorIAkJCSAqIFJlc2V0IHRvIHN0YXJ0IG9mIFVSSSBhbmQgcGFyc2UgYXMgInNj aGVtZTovL25ldGxvYy8uLi4iCisgCQkJICogaW5zdGVhZC4KKyAJCQkgKi8KKyAJCQlwID0gc3Rh cnQ7CisgCQl9CisgCQllbHNlCisgCQl7CisgCQkJLyoKKyAJCQkgKiBGb3VuZCB1c2VybmFtZS9w YXNzd29yZCBkZXNpZ25hdG9yLCBzbyBVUkkgc2hvdWxkIGJlIG9mIHRoZSBmb3JtCisgCQkJICog InNjaGVtZTovL3VzZXJAbmV0bG9jIiBvciAic2NoZW1lOi8vdXNlcjpwYXNzd29yZEBuZXRsb2Mi LgorIAkJCSAqLworIAkJCXVzZXIgPSBzdGFydDsKKyAKKyAJCQlwID0gdXNlcjsKKyAJCQl3aGls ZSAoKnAgIT0gJzonICYmICpwICE9ICdAJykKKyAJCQkJKytwOworIAorIAkJCS8qIFNhdmUgbGFz dCBjaGFyIGFuZCBjdXQgb2ZmIGF0IGVuZCBvZiB1c2VyIG5hbWUgKi8KKyAJCQlsYXN0YyA9ICpw OworIAkJCSpwID0gJ1wwJzsKKyAKKyAJCQlpZiAoISp1c2VyKQorIAkJCXsKKyAJCQkJcHJpbnRm UFFFeHBCdWZmZXIoZXJyb3JNZXNzYWdlLAorIAkJCQkJCQkJICBsaWJwcV9nZXR0ZXh0KCJtaXNz aW5nIHVzZXJuYW1lIHNwZWNpZmllciBpbiBVUkk6ICVzXG4iKSwKKyAJCQkJCQkJCSAgdXJpKTsK KyAJCQkJcmV0dXJuIGZhbHNlOworIAkJCX0KKyAJCQlpZiAoIWNvbm5pbmZvX3N0b3JlX3VyaV9l bmNvZGVkX3ZhbHVlKG9wdGlvbnMsICJ1c2VyIiwgdXNlciwKKyAJCQkJCQkJCQkJCQkgIGVycm9y TWVzc2FnZSwgZmFsc2UpKQorIAkJCQlyZXR1cm4gZmFsc2U7CisgCisgCQkJaWYgKGxhc3RjID09 ICc6JykKKyAJCQl7CisgCQkJCWNvbnN0IGNoYXIgKnBhc3N3b3JkID0gcCArIDE7CisgCisgCQkJ CXdoaWxlICgqcCAhPSAnQCcpCisgCQkJCQkrK3A7CisgCQkJCSpwID0gJ1wwJzsKKyAKKyAJCQkJ aWYgKCEqcGFzc3dvcmQpCisgCQkJCXsKKyAJCQkJCXByaW50ZlBRRXhwQnVmZmVyKGVycm9yTWVz c2FnZSwKKyAJCQkJCQkJCQkgIGxpYnBxX2dldHRleHQoIm1pc3NpbmcgcGFzc3dvcmQgc3BlY2lm aWVyIGluIFVSSTogJXNcbiIpLAorIAkJCQkJCQkJCSAgdXJpKTsKKyAJCQkJCXJldHVybiBmYWxz ZTsKKyAJCQkJfQorIAkJCQlpZiAoIWNvbm5pbmZvX3N0b3JlX3VyaV9lbmNvZGVkX3ZhbHVlKG9w dGlvbnMsICJwYXNzd29yZCIsCisgCQkJCQkJCQkJCQkJCSAgcGFzc3dvcmQsCisgCQkJCQkJCQkJ CQkJCSAgZXJyb3JNZXNzYWdlLCBmYWxzZSkpCisgCQkJCQlyZXR1cm4gZmFsc2U7CisgCQkJfQor IAorIAkJCS8qIEFkdmFuY2UgcGFzdCBlbmQgb2YgcGFyc2VkIHVzZXIgbmFtZSBvciBwYXNzd29y ZCB0b2tlbiAqLworIAkJCSsrcDsKKyAJCX0KKyAKKyAJCS8qCisgCQkgKiAicCIgaGFzIGJlZW4g aW5jcmVtZW50ZWQgcGFzdCBvcHRpb25hbCBVUkkgY3JlZGVudGlhbCBpbmZvcm1hdGlvbiBhdAor IAkJICogdGhpcyBwb2ludCBhbmQgbm93IHBvaW50cyBhdCB0aGUgIm5ldGxvYyIgcGFydCBvZiB0 aGUgVVJJLgorIAkJICoKKyAJCSAqIExvb2sgZm9yIElQdjYgYWRkcmVzcyAKKyAJCSAqLworIAkJ aWYgKCpwID09ICdbJykKKyAJCXsKKyAJCQlob3N0ID0gKytwOworIAkJCXdoaWxlICgqcCAmJiAq cCAhPSAnXScpCisgCQkJCSsrcDsKKyAJCQlpZiAoISpwKQorIAkJCXsKKyAJCQkJcHJpbnRmUFFF eHBCdWZmZXIoZXJyb3JNZXNzYWdlLAorIAkJCQkJCQkJICBsaWJwcV9nZXR0ZXh0KCJlbmQgb2Yg c3RyaW5nIHJlYWNoZWQgd2hlbiBsb29raW5nIGZvciBtYXRjaGluZyAnXScgaW4gSVB2NiBob3N0 IGFkZHJlc3MgaW4gVVJJOiAlc1xuIiksCisgCQkJCQkJCQkgIHVyaSk7CisgCQkJCXJldHVybiBm YWxzZTsKKyAJCQl9CisgCQkJaWYgKHAgPT0gaG9zdCkKKyAJCQl7CisgCQkJCXByaW50ZlBRRXhw QnVmZmVyKGVycm9yTWVzc2FnZSwKKyAJCQkJCQkJCSAgbGlicHFfZ2V0dGV4dCgiSVB2NiBob3N0 IGFkZHJlc3MgbWF5IG5vdCBiZSBlbXB0eSBpbiBVUkk6ICVzXG4iKSwKKyAJCQkJCQkJCSAgdXJp KTsKKyAJCQkJcmV0dXJuIGZhbHNlOworIAkJCX0KKyAKKyAJCQkvKiBDdXQgb2ZmIHRoZSBicmFj a2V0IGFuZCBhZHZhbmNlICovCisgCQkJKihwKyspID0gJ1wwJzsKKyAKKyAJCQkvKiAKKyAJCQkg KiBUaGUgYWRkcmVzcyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgcG9ydCBzcGVjaWZpZXIgb3IgYSBz bGFzaCBvciBhCisgCQkJICogcXVlcnkuCisgCQkJICovCisgCQkJaWYgKCpwICYmICpwICE9ICc6 JyAmJiAqcCAhPSAnLycgJiYgKnAgIT0gJz8nKQorIAkJCXsKKyAJCQkJcHJpbnRmUFFFeHBCdWZm ZXIoZXJyb3JNZXNzYWdlLAorIAkJCQkJCQkJICBsaWJwcV9nZXR0ZXh0KCJ1bmV4cGVjdGVkICcl YycgYXQgcG9zaXRpb24gJXRkIGluIFVSSSAoZXhwZWN0aW5nICc6JyBvciAnLycpOiAlc1xuIiks CisgCQkJCQkJCQkgICpwLCBwIC0gYnVmICsgMSwgdXJpKTsKKyAJCQkJcmV0dXJuIGZhbHNlOwor IAkJCX0KKyAJCX0KKyAJCWVsc2UKKyAJCXsKKyAJCQkvKiBub3QgYW4gSVB2NiBhZGRyZXNzOiBE TlMtbmFtZWQgb3IgSVB2NCBuZXRsb2MgKi8KKyAJCQlob3N0ID0gcDsKKyAKKyAJCQkvKgorIAkJ CSAqIExvb2sgZm9yIHBvcnQgc3BlY2lmaWVyIChjb2xvbikgb3IgZW5kIG9mIGhvc3Qgc3BlY2lm aWVyCisgCQkJICogKHNsYXNoKSwgb3IgcXVlcnkgKHF1ZXN0aW9uIG1hcmspLgorIAkJCSAqLwor IAkJCXdoaWxlICgqcCAmJiAqcCAhPSAnOicgJiYgKnAgIT0gJy8nICYmICpwICE9ICc/JykKKyAJ CQkJKytwOworIAkJfQorIAorIAkJLyogU2F2ZSB0aGUgaG9zdG5hbWUgdGVybWluYXRvciBiZWZv cmUgd2UgbnVsbCBpdCAqLworIAkJbGFzdGMgPSAqcDsKKyAJCSpwID0gJ1wwJzsKKyAKKyAJCWlm ICh1c2VyICYmICEqaG9zdCkKKyAJCXsKKyAJCQlwcmludGZQUUV4cEJ1ZmZlcihlcnJvck1lc3Nh Z2UsCisgCQkJCQkJCSAgbGlicHFfZ2V0dGV4dCgibXVzdCBzcGVjaWZ5IGhvc3Qgd2hlbiB1c2lu ZyB1c2VybmFtZSBzcGVjaWZpZXIgaW4gVVJJOiAlc1xuIiksCisgCQkJCQkJCSAgdXJpKTsKKyAJ CQlyZXR1cm4gZmFsc2U7CisgCQl9CisgCQlpZiAoIWNvbm5pbmZvX3N0b3JlX3VyaV9lbmNvZGVk X3ZhbHVlKG9wdGlvbnMsICJob3N0IiwgaG9zdCwKKyAJCQkJCQkJCQkJCSAgZXJyb3JNZXNzYWdl LCBmYWxzZSkpCisgCQkJcmV0dXJuIGZhbHNlOworIAorIAkJaWYgKGxhc3RjID09ICc6JykKKyAJ CXsKKyAJCQljb25zdCBjaGFyICpwb3J0ID0gKytwOyAvKiBhZHZhbmNlIHBhc3QgaG9zdCB0ZXJt aW5hdG9yICovCisgCisgCQkJd2hpbGUgKCpwICYmICpwICE9ICcvJyAmJiAqcCAhPSAnPycpCisg CQkJCSsrcDsKKyAKKyAJCQlsYXN0YyA9ICpwOworIAkJCSpwID0gJ1wwJzsKKyAKKyAJCQlpZiAo ISpwb3J0KQorIAkJCXsKKyAJCQkJcHJpbnRmUFFFeHBCdWZmZXIoZXJyb3JNZXNzYWdlLAorIAkJ CQkJCQkJICBsaWJwcV9nZXR0ZXh0KCJtaXNzaW5nIHBvcnQgc3BlY2lmaWVyIGluIFVSSTogJXNc biIpLAorIAkJCQkJCQkJICB1cmkpOworIAkJCQlyZXR1cm4gZmFsc2U7CisgCQkJfQorIAkJCWlm ICghY29ubmluZm9fc3RvcmVfdXJpX2VuY29kZWRfdmFsdWUob3B0aW9ucywgInBvcnQiLCBwb3J0 LAorIAkJCQkJCQkJCQkJCSAgZXJyb3JNZXNzYWdlLCBmYWxzZSkpCisgCQkJCXJldHVybiBmYWxz ZTsKKyAJCX0KKyAJfQorIAorIAlpZiAobGFzdGMgJiYgbGFzdGMgIT0gJz8nKQorIAl7CisgCQlj b25zdCBjaGFyICpkYm5hbWUgPSArK3A7IC8qIGFkdmFuY2UgcGFzdCBob3N0IHRlcm1pbmF0b3Ig Ki8KKyAKKyAJCS8qIExvb2sgZm9yIHF1ZXJ5IHBhcmFtZXRlcnMgKi8KKyAJCXdoaWxlICgqcCAm JiAqcCAhPSAnPycpCisgCQkJKytwOworIAorIAkJbGFzdGMgPSAqcDsKKyAJCSpwID0gJ1wwJzsK KyAKKyAJCS8qCisgCQkgKiBBdm9pZCBzZXR0aW5nIGRibmFtZSB0byBhbiBlbXB0eSBzdHJpbmcs IGFzIGl0IGZvcmNlcyB0aGUgZGVmYXVsdAorIAkJICogdmFsdWUgKHVzZXJuYW1lKSBhbmQgaWdu b3JlcyAkUEdEQVRBQkFTRSwgYXMgb3Bwb3NlZCB0byBub3Qgc2V0dGluZworIAkJICogaXQgYXQg YWxsLgorIAkJICovCisgCQlpZiAoKmRibmFtZSAmJgorIAkJCSFjb25uaW5mb19zdG9yZV91cmlf ZW5jb2RlZF92YWx1ZShvcHRpb25zLCAiZGJuYW1lIiwgZGJuYW1lLAorIAkJCQkJCQkJCQkJICBl cnJvck1lc3NhZ2UsIGZhbHNlKSkKKyAJCQlyZXR1cm4gZmFsc2U7CisgCX0KKyAKKyAJaWYgKGxh c3RjKQorIAl7CisgCQkrK3A7IC8qIGFkdmFuY2UgcGFzdCB0ZXJtaW5hdG9yICovCisgCisgCQlp ZiAoIWNvbm5pbmZvX3VyaV9wYXJzZV9wYXJhbXMocCwgb3B0aW9ucywgZXJyb3JNZXNzYWdlKSkK KyAJCQlyZXR1cm4gZmFsc2U7CisgCX0KKyAKKyAJcmV0dXJuIHRydWU7CisgfQorIAorIC8qCisg ICogQ29ubmVjdGlvbiBVUkkgcGFyYW1ldGVycyBwYXJzZXIgcm91dGluZQorICAqCisgICogSWYg c3VjY2Vzc2Z1bCwgcmV0dXJucyB0cnVlIHdoaWxlIGNvbm5PcHRpb25zIGlzIGZpbGxlZCB3aXRo IHBhcnNlZAorICAqIHBhcmFtZXRlcnMuCisgICogSWYgbm90IHN1Y2Nlc3NmdWwsIHJldHVybnMg ZmFsc2UgYW5kIGZpbGxzIGVycm9yTWVzc2FnZSBhY2NvcmRpbmdseS4KKyAgKgorICAqIERlc3Ry dWN0aXZlbHkgbW9kaWZpZXMgJ3BhcmFtcycgYnVmZmVyLgorICAqLworIHN0YXRpYyBib29sCisg Y29ubmluZm9fdXJpX3BhcnNlX3BhcmFtcyhjaGFyICpwYXJhbXMsCisgCQkJCQkJICBQUWNvbm5p bmZvT3B0aW9uICpjb25uT3B0aW9ucywKKyAJCQkJCQkgIFBRRXhwQnVmZmVyIGVycm9yTWVzc2Fn ZSkKKyB7CisgCWNoYXIgKnRva2VuOworIAljaGFyICpzYXZlcDsKKyAKKyAJd2hpbGUgKCh0b2tl biA9IHN0cnRva19yKHBhcmFtcywgIiYiLCAmc2F2ZXApKSkKKyAJeworIAkJY29uc3QgY2hhciAq a2V5d29yZDsKKyAJCWNvbnN0IGNoYXIgKnZhbHVlOworIAkJY2hhciAqcCA9IHN0cmNocih0b2tl biwgJz0nKTsKKyAKKyAJCWlmIChwID09IE5VTEwpCisgCQl7CisgCQkJcHJpbnRmUFFFeHBCdWZm ZXIoZXJyb3JNZXNzYWdlLAorIAkJCQkJCQkgIGxpYnBxX2dldHRleHQoIm1pc3Npbmcga2V5L3Zh bHVlIHNlcGFyYXRvciAnPScgaW4gVVJJIHF1ZXJ5IHBhcmFtZXRlcjogJXNcbiIpLAorIAkJCQkJ CQkgIHRva2VuKTsKKyAJCQlyZXR1cm4gZmFsc2U7CisgCQl9CisgCisgCQkvKiBDdXQgb2ZmIGtl eXdvcmQgYW5kIGFkdmFuY2UgdG8gdmFsdWUgKi8KKyAJCSoocCsrKSA9ICdcMCc7CisgCisgCQlr ZXl3b3JkID0gdG9rZW47CisgCQl2YWx1ZSA9IHA7CisgCisgCQkvKiBTcGVjaWFsIGtleXdvcmQg aGFuZGxpbmcgZm9yIGltcHJvdmVkIEpEQkMgY29tcGF0aWJpbGl0eSAqLworIAkJaWYgKHN0cmNt cChrZXl3b3JkLCAic3NsIikgPT0gMCAmJgorIAkJCXN0cmNtcCh2YWx1ZSwgInRydWUiKSA9PSAw KQorIAkJeworIAkJCWtleXdvcmQgPSAic3NsbW9kZSI7CisgCQkJdmFsdWUgPSAicmVxdWlyZSI7 CisgCQl9CisgCisgCQkvKgorIAkJICogU3RvcmUgdGhlIHZhbHVlIGlmIGNvcnJlc3BvbmRpbmcg b3B0aW9uIHdhcyBmb3VuZCAtLSBpZ25vcmUKKyAJCSAqIG90aGVyd2lzZS4KKyAJCSAqCisgCQkg KiBJbiB0aGVvcnksIHRoZSBrZXl3b3JkIG1pZ2h0IGJlIGFsc28gcGVyY2VudC1lbmNvZGVkLCBi dXQgaGFyZGx5CisgCQkgKiB0aGF0J3MgZXZlciBuZWVkZWQgYnkgYW55b25lLgorIAkJICovCisg CQlpZiAoIWNvbm5pbmZvX3N0b3JlX3VyaV9lbmNvZGVkX3ZhbHVlKGNvbm5PcHRpb25zLCBrZXl3 b3JkLCB2YWx1ZSwKKyAJCQkJCQkJCQkJCSAgZXJyb3JNZXNzYWdlLCB0cnVlKSkKKyAJCXsKKyAJ CQlmcHJpbnRmKHN0ZGVyciwKKyAJCQkJCWxpYnBxX2dldHRleHQoIldBUk5JTkc6IGlnbm9yaW5n IHVucmVjb2duaXplZCBVUkkgcXVlcnkgcGFyYW1ldGVyOiAlc1xuIiksCisgCQkJCQlrZXl3b3Jk KTsKKyAJCX0KKyAKKyAJCXBhcmFtcyA9IE5VTEw7IC8qIHByb2NlZWQgdG8gdGhlIG5leHQgdG9r ZW4gd2l0aCBzdHJ0b2tfciAqLworIAl9CisgCisgCXJldHVybiB0cnVlOworIH0KKyAKKyAvKgor ICAqIENvbm5lY3Rpb24gVVJJIGRlY29kZXIgcm91dGluZQorICAqCisgICogSWYgc3VjY2Vzc2Z1 bCwgcmV0dXJucyB0aGUgbWFsbG9jJ2QgZGVjb2RlZCBzdHJpbmcuCisgICogSWYgbm90IHN1Y2Nl c3NmdWwsIHJldHVybnMgTlVMTCBhbmQgZmlsbHMgZXJyb3JNZXNzYWdlIGFjY29yZGluZ2x5Lgor ICAqCisgICogVGhlIHN0cmluZyBpcyBkZWNvZGVkIGJ5IHJlcGxhY2luZyBhbnkgcGVyY2VudC1l bmNvZGVkIHRva2VucyB3aXRoCisgICogY29ycmVzcG9uZGluZyBjaGFyYWN0ZXJzLCB3aGlsZSBw cmVzZXJ2aW5nIGFueSBub24tZW5jb2RlZCBjaGFyYWN0ZXJzLiAgQQorICAqIHBlcmNlbnQtZW5j b2RlZCB0b2tlbiBpcyBhIGNoYXJhY3RlciB0cmlwbGV0OiBhIHBlcmNlbnQgc2lnbiwgZm9sbG93 ZWQgYnkgYQorICAqIHBhaXIgb2YgaGV4YWRlY2ltYWwgZGlnaXRzICgwLTlBLUYpLCB3aGVyZSBs b3dlci0gYW5kIHVwcGVyLWNhc2UgbGV0dGVycyBhcmUKKyAgKiB0cmVhdGVkIGlkZW50aWNhbGx5 LgorICAqLwogIHN0YXRpYyBjaGFyICoKKyBjb25uaW5mb191cmlfZGVjb2RlKGNvbnN0IGNoYXIg KnN0ciwgUFFFeHBCdWZmZXIgZXJyb3JNZXNzYWdlKQorIHsKKyAJY2hhciAqYnVmID0gbWFsbG9j KHN0cmxlbihzdHIpICsgMSk7CisgCWNoYXIgKnAgPSBidWY7CisgCWNvbnN0IGNoYXIgKnEgPSBz dHI7CisgCisgCWlmIChidWYgPT0gTlVMTCkKKyAJeworIAkJcHJpbnRmUFFFeHBCdWZmZXIoZXJy b3JNZXNzYWdlLCBsaWJwcV9nZXR0ZXh0KCJvdXQgb2YgbWVtb3J5XG4iKSk7CisgCQlyZXR1cm4g TlVMTDsKKyAJfQorIAorIAlmb3IgKDs7KQorIAl7CisgCQlpZiAoKnEgIT0gJyUnKQorIAkJewor IAkJCS8qIGNvcHkgYW5kIGNoZWNrIGZvciBOVUwgdGVybWluYXRvciAqLworIAkJCWlmICghKCoo cCsrKSA9ICoocSsrKSkpCisgCQkJCWJyZWFrOworIAkJfQorIAkJZWxzZQorIAkJeworIAkJCWlu dCBoaTsKKyAJCQlpbnQgbG87CisgCisgCQkJKytxOyAvKiBza2lwIHRoZSBwZXJjZW50IHNpZ24g aXRzZWxmICovCisgCisgCQkJLyoKKyAJCQkgKiBQb3NzaWJsZSBFT0wgd2lsbCBiZSBjYXVnaHQg YnkgdGhlIGZpcnN0IGNhbGwgdG8gZ2V0X2hleGRpZ2l0KCksCisgCQkJICogc28gd2UgbmV2ZXIg ZGVyZWZlcmVuY2UgYW4gaW52YWxpZCBxIHBvaW50ZXIuCisgCQkJICovCisgCQkJaWYgKCEoZ2V0 X2hleGRpZ2l0KCpxKyssICZoaSkgJiYgZ2V0X2hleGRpZ2l0KCpxKyssICZsbykpKQorIAkJCXsK KyAJCQkJcHJpbnRmUFFFeHBCdWZmZXIoZXJyb3JNZXNzYWdlLAorIAkJCQkJCQkJICBsaWJwcV9n ZXR0ZXh0KCJpbnZhbGlkIHBlcmNlbnQtZW5jb2RlZCB0b2tlbiAoYSBwYWlyIG9mIGhleGFkZWNp bWFsIGRpZ2l0cyBleHBlY3RlZCBhZnRlciBldmVyeSAnJSUnIHN5bWJvbCwgdXNlICclJTI1JyB0 byBlbmNvZGUgcGVyY2VudCBzeW1ib2wgaXRzZWxmKTogJXNcbiIpLAorIAkJCQkJCQkJICBzdHIp OworIAkJCQlmcmVlKGJ1Zik7CisgCQkJCXJldHVybiBOVUxMOworIAkJCX0KKyAKKyAJCQkqKHAr KykgPSAoaGkgPDwgNCkgfCBsbzsKKyAJCX0KKyAJfQorIAorIAlyZXR1cm4gYnVmOworIH0KKyAK KyAvKgorICAqIENvbnZlcnQgaGV4YWRlY2ltYWwgZGlnaXQgY2hhcmFjdGVyIHRvIGl0J3MgaW50 ZWdlciB2YWx1ZS4KKyAgKgorICAqIElmIHN1Y2Nlc3NmdWwsIHJldHVybnMgdHJ1ZSBhbmQgdmFs dWUgaXMgZmlsbGVkIHdpdGggZGlnaXQncyBiYXNlIDE2IHZhbHVlLgorICAqIElmIG5vdCBzdWNj ZXNzZnVsLCByZXR1cm5zIGZhbHNlLgorICAqCisgICogTG93ZXItIGFuZCB1cHBlci1jYXNlIGxl dHRlcnMgaW4gdGhlIHJhbmdlIEEtRiBhcmUgdHJlYXRlZCBpZGVudGljYWxseS4KKyAgKi8KKyBz dGF0aWMgYm9vbAorIGdldF9oZXhkaWdpdChjaGFyIGRpZ2l0LCBpbnQgKnZhbHVlKQorIHsKKyAJ aWYgKCcwJyA8PSBkaWdpdCAmJiBkaWdpdCA8PSAnOScpCisgCXsKKyAJCSp2YWx1ZSA9IGRpZ2l0 IC0gJzAnOworIAl9CisgCWVsc2UgaWYgKCdBJyA8PSBkaWdpdCAmJiBkaWdpdCA8PSAnRicpCisg CXsKKyAJCSp2YWx1ZSA9IGRpZ2l0IC0gJ0EnICsgMTA7CisgCX0KKyAJZWxzZSBpZiAoJ2EnIDw9 IGRpZ2l0ICYmIGRpZ2l0IDw9ICdmJykKKyAJeworIAkJKnZhbHVlID0gZGlnaXQgLSAnYScgKyAx MDsKKyAJfQorIAllbHNlCisgCXsKKyAJCXJldHVybiBmYWxzZTsKKyAJfQorIAorIAlyZXR1cm4g dHJ1ZTsKKyB9CisgCisgLyoKKyAgKiBGaW5kIGFuIG9wdGlvbiB2YWx1ZSBjb3JyZXNwb25kaW5n IHRvIHRoZSBrZXl3b3JkIGluIHRoZSBjb25uT3B0aW9ucyBhcnJheS4KKyAgKgorICAqIElmIHN1 Y2Nlc3NmdWwsIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nIG9wdGlvbidz IHZhbHVlLgorICAqIElmIG5vdCBzdWNjZXNzZnVsLCByZXR1cm5zIE5VTEwuCisgICovCisgc3Rh dGljIGNvbnN0IGNoYXIgKgogIGNvbm5pbmZvX2dldHZhbChQUWNvbm5pbmZvT3B0aW9uICpjb25u T3B0aW9ucywKICAJCQkJY29uc3QgY2hhciAqa2V5d29yZCkKICB7CisgCVBRY29ubmluZm9PcHRp b24gKm9wdGlvbiA9IGNvbm5pbmZvX2ZpbmQoY29ubk9wdGlvbnMsIGtleXdvcmQpOworIAorIAly ZXR1cm4gb3B0aW9uID8gb3B0aW9uLT52YWwgOiBOVUxMOworIH0KKyAKKyAvKgorICAqIFN0b3Jl IGEgKG5ldykgdmFsdWUgZm9yIGFuIG9wdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBrZXl3b3Jk IGluCisgICogY29ubk9wdGlvbnMgYXJyYXkuCisgICoKKyAgKiBJZiBzdWNjZXNzZnVsLCByZXR1 cm5zIGEgcG9pbnRlciB0byB0aGUgY29ycmVzcG9uZGluZyBQUWNvbm5pbmZvT3B0aW9uLAorICAq IHdoaWNoIHZhbHVlIGlzIHJlcGxhY2VkIHdpdGggYSBzdHJkdXAnZCBjb3B5IG9mIHRoZSBwYXNz ZWQgdmFsdWUgc3RyaW5nLgorICAqIFRoZSBleGlzdGluZyB2YWx1ZSBmb3IgdGhlIG9wdGlvbiBp cyBmcmVlJ2QgYmVmb3JlIHJlcGxhY2luZywgaWYgYW55LgorICAqCisgICogSWYgbm90IHN1Y2Nl c3NmdWwsIHJldHVybnMgTlVMTCBhbmQgZmlsbHMgZXJyb3JNZXNzYWdlIGFjY29yZGluZ2x5Lgor ICAqLworIHN0YXRpYyBQUWNvbm5pbmZvT3B0aW9uICoKKyBjb25uaW5mb19zdG9yZXZhbChQUWNv bm5pbmZvT3B0aW9uICpjb25uT3B0aW9ucywKKyAJCQkJICBjb25zdCBjaGFyICprZXl3b3JkLCBj b25zdCBjaGFyICp2YWx1ZSwKKyAJCQkJICBQUUV4cEJ1ZmZlciBlcnJvck1lc3NhZ2UsIGJvb2wg aWdub3JlTWlzc2luZykKKyB7CisgCVBRY29ubmluZm9PcHRpb24gKm9wdGlvbiA9IGNvbm5pbmZv X2ZpbmQoY29ubk9wdGlvbnMsIGtleXdvcmQpOworIAljaGFyICp2YWx1ZV9jb3B5OworIAorIAlp ZiAob3B0aW9uID09IE5VTEwpCisgCXsKKyAJCWlmICghaWdub3JlTWlzc2luZykKKyAJCQlwcmlu dGZQUUV4cEJ1ZmZlcihlcnJvck1lc3NhZ2UsCisgCQkJCQkJCSAgbGlicHFfZ2V0dGV4dCgiaW52 YWxpZCBjb25uZWN0aW9uIG9wdGlvbiBcIiVzXCJcbiIpLAorIAkJCQkJCQkgIGtleXdvcmQpOwor IAkJcmV0dXJuIE5VTEw7CisgCX0KKyAKKyAJdmFsdWVfY29weSA9IHN0cmR1cCh2YWx1ZSk7Cisg CWlmICh2YWx1ZV9jb3B5ID09IE5VTEwpCisgCXsKKyAJCXByaW50ZlBRRXhwQnVmZmVyKGVycm9y TWVzc2FnZSwgbGlicHFfZ2V0dGV4dCgib3V0IG9mIG1lbW9yeVxuIikpOworIAkJcmV0dXJuIE5V TEw7CisgCX0KKyAKKyAJaWYgKG9wdGlvbi0+dmFsKQorIAkJZnJlZShvcHRpb24tPnZhbCk7Cisg CW9wdGlvbi0+dmFsID0gdmFsdWVfY29weTsKKyAKKyAJcmV0dXJuIG9wdGlvbjsKKyB9CisgCisg LyoKKyAgKiBTdG9yZSBhIChuZXcpIHBvc3NpYmx5IFVSSS1lbmNvZGVkIHZhbHVlIGZvciBhbiBv cHRpb24gY29ycmVzcG9uZGluZyB0byB0aGUKKyAgKiBrZXl3b3JkIGluIGNvbm5PcHRpb25zIGFy cmF5LgorICAqCisgICogSWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGNv cnJlc3BvbmRpbmcgUFFjb25uaW5mb09wdGlvbiwKKyAgKiB3aGljaCB2YWx1ZSBpcyByZXBsYWNl ZCB3aXRoIGEgVVJJLWRlY29kZWQgY29weSBvZiB0aGUgcGFzc2VkIHZhbHVlIHN0cmluZy4KKyAg KiBUaGUgZXhpc3RpbmcgdmFsdWUgZm9yIHRoZSBvcHRpb24gaXMgZnJlZSdkIGJlZm9yZSByZXBs YWNpbmcsIGlmIGFueS4KKyAgKgorICAqIElmIG5vdCBzdWNjZXNzZnVsLCByZXR1cm5zIE5VTEwg YW5kIGZpbGxzIGVycm9yTWVzc2FnZSBhY2NvcmRpbmdseS4gIElmIHRoZQorICAqIGNvcnJlc3Bv bmRpbmcgb3B0aW9uIHdhcyBub3QgZm91bmQsIGJ1dCBpZ25vcmVNaXNzaW5nIGlzIHRydWU6IGRv ZXNuJ3QgZmlsbAorICAqIGVycm9yTWVzc2FnZS4KKyAgKgorICAqIFNlZSBhbHNvIGNvbm5pbmZv X3N0b3JldmFsLgorICAqLworIHN0YXRpYyBQUWNvbm5pbmZvT3B0aW9uICoKKyBjb25uaW5mb19z dG9yZV91cmlfZW5jb2RlZF92YWx1ZShQUWNvbm5pbmZvT3B0aW9uICpjb25uT3B0aW9ucywKKyAJ CQkJCQkJCSBjb25zdCBjaGFyICprZXl3b3JkLCBjb25zdCBjaGFyICplbmNvZGVkX3ZhbHVlLAor IAkJCQkJCQkJIFBRRXhwQnVmZmVyIGVycm9yTWVzc2FnZSwgYm9vbCBpZ25vcmVNaXNzaW5nKQor IHsKKyAJUFFjb25uaW5mb09wdGlvbiAqb3B0aW9uOworIAljaGFyICpkZWNvZGVkX3ZhbHVlID0g Y29ubmluZm9fdXJpX2RlY29kZShlbmNvZGVkX3ZhbHVlLCBlcnJvck1lc3NhZ2UpOworIAorIAlp ZiAoZGVjb2RlZF92YWx1ZSA9PSBOVUxMKQorIAkJcmV0dXJuIE5VTEw7CisgCisgCW9wdGlvbiA9 IGNvbm5pbmZvX3N0b3JldmFsKGNvbm5PcHRpb25zLCBrZXl3b3JkLCBkZWNvZGVkX3ZhbHVlLAor IAkJCQkJCQkgICBlcnJvck1lc3NhZ2UsIGlnbm9yZU1pc3NpbmcpOworIAlmcmVlKGRlY29kZWRf dmFsdWUpOworIAorIAlyZXR1cm4gb3B0aW9uOworIH0KKyAKKyAvKgorICAqIEZpbmQgYSBQUWNv bm5pbmZvT3B0aW9uIG9wdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBrZXl3b3JkIGluIHRoZQor ICAqIGNvbm5PcHRpb25zIGFycmF5LgorICAqCisgICogSWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBh IHBvaW50ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgUFFjb25uaW5mb09wdGlvbgorICAqIHN0cnVj dHVyZS4KKyAgKiBJZiBub3Qgc3VjY2Vzc2Z1bCwgcmV0dXJucyBOVUxMLgorICAqLworIHN0YXRp YyBQUWNvbm5pbmZvT3B0aW9uICoKKyBjb25uaW5mb19maW5kKFBRY29ubmluZm9PcHRpb24gKmNv bm5PcHRpb25zLCBjb25zdCBjaGFyICprZXl3b3JkKQorIHsKICAJUFFjb25uaW5mb09wdGlvbiAq b3B0aW9uOwogIAogIAlmb3IgKG9wdGlvbiA9IGNvbm5PcHRpb25zOyBvcHRpb24tPmtleXdvcmQg IT0gTlVMTDsgb3B0aW9uKyspCiAgCXsKICAJCWlmIChzdHJjbXAob3B0aW9uLT5rZXl3b3JkLCBr ZXl3b3JkKSA9PSAwKQohIAkJCXJldHVybiBvcHRpb247CiAgCX0KICAKICAJcmV0dXJuIE5VTEw7 CioqKiAvZGV2L251bGwKLS0tIGIvc3JjL2ludGVyZmFjZXMvbGlicHEvdGVzdC9NYWtlZmlsZQoq KioqKioqKioqKioqKioKKioqIDAgKioqKgotLS0gMSwxMSAtLS0tCisgc3ViZGlyID0gc3JjL2lu dGVyZmFjZXMvbGlicHEvdGVzdAorIHRvcF9idWlsZGRpciA9IC4uLy4uLy4uLy4uCisgaW5jbHVk ZSAkKHRvcF9idWlsZGRpcikvc3JjL01ha2VmaWxlLmdsb2JhbAorIAorIGFsbDogaW5zdGFsbGNo ZWNrCisgCisgaW5zdGFsbGNoZWNrOgorIAlCSU5ESVI9JyQoYmluZGlyKScgU1VCRElSPSckKHN1 YmRpciknICQoU0hFTEwpIC4vcmVncmVzcy5zaAorIAorIGNsZWFuIGRpc3RjbGVhbiBtYWludGFp bmVyLWNsZWFuOgorIAlybSAtZiByZWdyZXNzLm91dCByZWdyZXNzLmRpZmYKKioqIC9kZXYvbnVs bAotLS0gYi9zcmMvaW50ZXJmYWNlcy9saWJwcS90ZXN0L1JFQURNRQoqKioqKioqKioqKioqKioK KioqIDAgKioqKgotLS0gMSwyMCAtLS0tCisgVGhpcyBpcyBhIHRlc3RzdWl0ZSBmb3IgdGVzdGlu ZyBsaWJwcSBVUkkgY29ubmVjdGlvbiBzdHJpbmcgc3ludGF4LgorIAorIFRvIHJ1biB0aGUgc3Vp dGUsIHVzZSAnbWFrZSBpbnN0YWxsY2hlY2snIGNvbW1hbmQuICBJdCB3b3JrcyBieQorIHJ1bm5p bmcgcmVncmVzcy5zaCBmcm9tIHRoaXMgZGlyZWN0b3J5IHdpdGggYXBwcm9wcmlhdGUgZW52aXJv bm1lbnQKKyBzZXQgdXAuCisgCisgVGhlIHRlc3QgaXRzZWxmIHdvcmtzIGJ5IHJ1bm5pbmcgdGhl IHBzcWwgY29tbWFuZCBpbnN0YWxsZWQgYnkgJ21ha2UKKyBpbnN0YWxsJyB3aXRoIGRpZmZlcmVu dCAtZCBvcHRpb24gYXJndW1lbnRzIGFuZCBjb2xsZWN0aW5nIHRoZSBvdXRwdXQsCisgdGhlbiBj b21wYXJpbmcgdGhhdCB0byB0aGUgZXhwZWN0ZWQgJ2NvcnJlY3QnIG91dHB1dC4KKyAKKyBUaGUg dGVzdCBzY3JpcHQgYXNzdW1lcyB0aGF0IHRoZSBzZXJ2ZXIgaXMgcnVubmluZyBvbiBsb2NhbGhv c3QgYW5kCisgYWNjZXB0aW5nIGxvY2FsIGFuZCBJUHY0LDYgY29ubmVjdGlvbnMgb24gcG9ydCAk UEdQT1JULiAgQXR0ZW1wdHMgdG8KKyBjb25uZWN0IGFyZSBtYWRlIGZyb20gdXNlciAkUEdVU0VS ICh3aGljaCBkZWZhdWx0cyB0byAkVVNFUiwpIHRvIHRoZQorIGRhdGFiYXNlIHNwZWNpZmllZCBp biAkUEdEQVRBQkFTRSAod2hpY2ggZGVmYXVsdHMgdG8gInJlZ3Jlc3Npb24iLikKKyBUaGUgZGF0 YWJhc2UgaXMgY3JlYXRlZCBieSB0aGUgc2NyaXB0IHByaW9yIHRvIHJ1bm5pbmcgdGhlIGFjdHVh bAorIHRlc3RzLgorIAorIFRoZSBjb25uZWN0aW9uIFVSSSBsaW5lcyB0byB0ZXN0IGFyZSByZWFk IGZyb20gdGhlIGZpbGUgJ3JlZ3Jlc3MuaW4nLAorIGFuZCBhcmUgZXZhbC1kIGJlZm9yZSBwYXNz aW5nIHRoZW0gdG8gcHNxbCAobGlrZSBgZXZhbCBlY2hvICRsaW5lYCwpCisgdGh1cyAke3Zhcmlh YmxlfSBzdWJzdGl0dXRpb25zIGFyZSBjYXJyaWVkIG91dC4KKioqIC9kZXYvbnVsbAotLS0gYi9z cmMvaW50ZXJmYWNlcy9saWJwcS90ZXN0L2V4cGVjdGVkLm91dAoqKioqKioqKioqKioqKioKKioq IDAgKioqKgotLS0gMSwzNyAtLS0tCisgcG9zdGdyZXNxbDovLyR7UEdVU0VSfUBsb2NhbGhvc3Q6 JHtQR1BPUlR9LyR7UEdEQVRBQkFTRX0KKyBwb3N0Z3Jlc3FsOi8vJHtQR1VTRVJ9QGxvY2FsaG9z dC8ke1BHREFUQUJBU0V9CisgcG9zdGdyZXNxbDovL2xvY2FsaG9zdDoke1BHUE9SVH0vJHtQR0RB VEFCQVNFfQorIHBvc3RncmVzcWw6Ly9sb2NhbGhvc3QvJHtQR0RBVEFCQVNFfQorIHBvc3RncmVz cWw6Ly8ke1BHVVNFUn1AbG9jYWxob3N0OiR7UEdQT1JUfS8KKyBwb3N0Z3Jlc3FsOi8vJHtQR1VT RVJ9QGxvY2FsaG9zdC8KKyBwb3N0Z3Jlc3FsOi8vbG9jYWxob3N0OiR7UEdQT1JUfS8KKyBwb3N0 Z3Jlc3FsOi8vbG9jYWxob3N0OiR7UEdQT1JUfQorIHBvc3RncmVzcWw6Ly9sb2NhbGhvc3QvJHtQ R0RBVEFCQVNFfQorIHBvc3RncmVzcWw6Ly9sb2NhbGhvc3QvCisgcG9zdGdyZXNxbDovL2xvY2Fs aG9zdAorIHBvc3RncmVzcWw6Ly8KKyBwb3N0Z3Jlc3FsOi8vJTZDb2NhbGhvc3QvCisgcG9zdGdy ZXNxbDovL2xvY2FsaG9zdC8ke1BHREFUQUJBU0V9P3VzZXI9JHtQR1VTRVJ9CisgcG9zdGdyZXNx bDovL2xvY2FsaG9zdC8ke1BHREFUQUJBU0V9P3VzZXI9JHtQR1VTRVJ9JnBvcnQ9JHtQR1BPUlR9 CisgcG9zdGdyZXNxbDovL2xvY2FsaG9zdC8ke1BHREFUQUJBU0V9P3VzZXI9JHtQR1VTRVJ9JnBv cnQ9JHtQR1BPUlR9CisgcG9zdGdyZXNxbDovL2xvY2FsaG9zdDoke1BHUE9SVH0/dXNlcj0ke1BH VVNFUn0KKyBwb3N0Z3Jlc3FsOi8vbG9jYWxob3N0P3VzZXI9JHtQR1VTRVJ9CisgcG9zdGdyZXNx bDovL2xvY2FsaG9zdD8KKyBwb3N0Z3Jlc3FsOi8vWzo6MV06JHtQR1BPUlR9LyR7UEdEQVRBQkFT RX0KKyBwb3N0Z3Jlc3FsOi8vWzo6MV0vJHtQR0RBVEFCQVNFfQorIHBvc3RncmVzcWw6Ly9bOjox XS8KKyBwb3N0Z3Jlc3FsOi8vWzo6MV0KKyBwb3N0Z3JlczovLworIHBvc3RncmVzOi8vL3RtcAor IFdBUk5JTkc6IGlnbm9yaW5nIHVucmVjb2duaXplZCBVUkkgcXVlcnkgcGFyYW1ldGVyOiB1emVy CisgcG9zdGdyZXNxbDovL2xvY2FsaG9zdD91emVyPQorIHBzcWw6IEZBVEFMOiAgZGF0YWJhc2Ug InBvc3RncmU6Ly8iIGRvZXMgbm90IGV4aXN0CisgcHNxbDogZW5kIG9mIHN0cmluZyByZWFjaGVk IHdoZW4gbG9va2luZyBmb3IgbWF0Y2hpbmcgJ10nIGluIElQdjYgaG9zdCBhZGRyZXNzIGluIFVS STogcG9zdGdyZXM6Ly9bOjoxCisgcHNxbDogSVB2NiBob3N0IGFkZHJlc3MgbWF5IG5vdCBiZSBl bXB0eSBpbiBVUkk6IHBvc3RncmVzOi8vW10KKyBwc3FsOiB1bmV4cGVjdGVkICd6JyBhdCBwb3Np dGlvbiAxNyBpbiBVUkkgKGV4cGVjdGluZyAnOicgb3IgJy8nKTogcG9zdGdyZXM6Ly9bOjoxXXoK KyBwc3FsOiBtaXNzaW5nIGtleS92YWx1ZSBzZXBhcmF0b3IgJz0nIGluIFVSSSBxdWVyeSBwYXJh bWV0ZXI6IHp6egorIHBzcWw6IGludmFsaWQgcGVyY2VudC1lbmNvZGVkIHRva2VuIChhIHBhaXIg b2YgaGV4YWRlY2ltYWwgZGlnaXRzIGV4cGVjdGVkIGFmdGVyIGV2ZXJ5ICclJyBzeW1ib2wsIHVz ZSAnJTI1JyB0byBlbmNvZGUgcGVyY2VudCBzeW1ib2wgaXRzZWxmKTogJXp6CisgcHNxbDogaW52 YWxpZCBwZXJjZW50LWVuY29kZWQgdG9rZW4gKGEgcGFpciBvZiBoZXhhZGVjaW1hbCBkaWdpdHMg ZXhwZWN0ZWQgYWZ0ZXIgZXZlcnkgJyUnIHN5bWJvbCwgdXNlICclMjUnIHRvIGVuY29kZSBwZXJj ZW50IHN5bWJvbCBpdHNlbGYpOiAlMQorIHBzcWw6IGludmFsaWQgcGVyY2VudC1lbmNvZGVkIHRv a2VuIChhIHBhaXIgb2YgaGV4YWRlY2ltYWwgZGlnaXRzIGV4cGVjdGVkIGFmdGVyIGV2ZXJ5ICcl JyBzeW1ib2wsIHVzZSAnJTI1JyB0byBlbmNvZGUgcGVyY2VudCBzeW1ib2wgaXRzZWxmKTogJQor IHBzcWw6IG1pc3NpbmcgdXNlcm5hbWUgc3BlY2lmaWVyIGluIFVSSTogcG9zdGdyZXM6Ly9AbG9j YWxob3N0CisgcHNxbDogbWlzc2luZyBwb3J0IHNwZWNpZmllciBpbiBVUkk6IHBvc3RncmVzOi8v bG9jYWxob3N0Oi8KKioqIC9kZXYvbnVsbAotLS0gYi9zcmMvaW50ZXJmYWNlcy9saWJwcS90ZXN0 L3JlZ3Jlc3MuaW4KKioqKioqKioqKioqKioqCioqKiAwICoqKioKLS0tIDEsMzYgLS0tLQorIHBv c3RncmVzcWw6Ly8ke1BHVVNFUn1AbG9jYWxob3N0OiR7UEdQT1JUfS8ke1BHREFUQUJBU0V9Cisg cG9zdGdyZXNxbDovLyR7UEdVU0VSfUBsb2NhbGhvc3QvJHtQR0RBVEFCQVNFfQorIHBvc3RncmVz cWw6Ly9sb2NhbGhvc3Q6JHtQR1BPUlR9LyR7UEdEQVRBQkFTRX0KKyBwb3N0Z3Jlc3FsOi8vbG9j YWxob3N0LyR7UEdEQVRBQkFTRX0KKyBwb3N0Z3Jlc3FsOi8vJHtQR1VTRVJ9QGxvY2FsaG9zdDok e1BHUE9SVH0vCisgcG9zdGdyZXNxbDovLyR7UEdVU0VSfUBsb2NhbGhvc3QvCisgcG9zdGdyZXNx bDovL2xvY2FsaG9zdDoke1BHUE9SVH0vCisgcG9zdGdyZXNxbDovL2xvY2FsaG9zdDoke1BHUE9S VH0KKyBwb3N0Z3Jlc3FsOi8vbG9jYWxob3N0LyR7UEdEQVRBQkFTRX0KKyBwb3N0Z3Jlc3FsOi8v bG9jYWxob3N0LworIHBvc3RncmVzcWw6Ly9sb2NhbGhvc3QKKyBwb3N0Z3Jlc3FsOi8vCisgcG9z dGdyZXNxbDovLyU2Q29jYWxob3N0LworIHBvc3RncmVzcWw6Ly9sb2NhbGhvc3QvJHtQR0RBVEFC QVNFfT91c2VyPSR7UEdVU0VSfQorIHBvc3RncmVzcWw6Ly9sb2NhbGhvc3QvJHtQR0RBVEFCQVNF fT91c2VyPSR7UEdVU0VSfSZwb3J0PSR7UEdQT1JUfQorIHBvc3RncmVzcWw6Ly9sb2NhbGhvc3Qv JHtQR0RBVEFCQVNFfT91c2VyPSR7UEdVU0VSfSZwb3J0PSR7UEdQT1JUfQorIHBvc3RncmVzcWw6 Ly9sb2NhbGhvc3Q6JHtQR1BPUlR9P3VzZXI9JHtQR1VTRVJ9CisgcG9zdGdyZXNxbDovL2xvY2Fs aG9zdD91c2VyPSR7UEdVU0VSfQorIHBvc3RncmVzcWw6Ly9sb2NhbGhvc3Q/CisgcG9zdGdyZXNx bDovL1s6OjFdOiR7UEdQT1JUfS8ke1BHREFUQUJBU0V9CisgcG9zdGdyZXNxbDovL1s6OjFdLyR7 UEdEQVRBQkFTRX0KKyBwb3N0Z3Jlc3FsOi8vWzo6MV0vCisgcG9zdGdyZXNxbDovL1s6OjFdCisg cG9zdGdyZXM6Ly8KKyBwb3N0Z3JlczovLy90bXAKKyBwb3N0Z3Jlc3FsOi8vbG9jYWxob3N0P3V6 ZXI9CisgcG9zdGdyZTovLworIHBvc3RncmVzOi8vWzo6MQorIHBvc3RncmVzOi8vW10KKyBwb3N0 Z3JlczovL1s6OjFdegorIHBvc3RncmVzcWw6Ly9sb2NhbGhvc3Q/enp6CisgcG9zdGdyZXNxbDov LyV6egorIHBvc3RncmVzcWw6Ly8lMQorIHBvc3RncmVzcWw6Ly8lCisgcG9zdGdyZXM6Ly9AbG9j YWxob3N0CisgcG9zdGdyZXM6Ly9sb2NhbGhvc3Q6LwoqKiogL2Rldi9udWxsCi0tLSBiL3NyYy9p bnRlcmZhY2VzL2xpYnBxL3Rlc3QvcmVncmVzcy5zaAoqKioqKioqKioqKioqKioKKioqIDAgKioq KgotLS0gMSwzOCAtLS0tCisgIyEvYmluL3NoCisgaWYgWyAteiAiJFBHVVNFUiIgXTsgdGhlbgor IFBHVVNFUj0kVVNFUgorIGZpCisgaWYgWyAteiAiJFBHUE9SVCIgXTsgdGhlbgorIFBHUE9SVD01 NDMyCisgZmkKKyBpZiBbIC16ICIkUEdEQVRBQkFTRSIgXTsgdGhlbgorIFBHREFUQUJBU0U9cmVn cmVzc2lvbgorIGZpCisgZXhwb3J0IFBHVVNFUiBQR1BPUlQgUEdEQVRBQkFTRQorIAorICIke0JJ TkRJUn0vY3JlYXRlZGIiICIke1BHREFUQUJBU0V9IgorIAorIGVjaG8gIlJ1bm5pbmcgbGlicHEg VVJJIHN1cHBvcnQgdGVzdC4uLiIKKyAKKyB3aGlsZSByZWFkIGxpbmUKKyBkbworICAgICAjIEZy aXN0LCBleHBhbmQgdmFyaWFibGVzIGluIHRoZSB0ZXN0IFVSSSBsaW5lLgorICAgICB1cmk9JChl dmFsIGVjaG8gIiRsaW5lIikKKyAKKyAgICAgIyBCdXQgU0VMRUNUIHRoZSBvcmlnaW5hbCBsaW5l LCBzbyB0ZXN0IHJlc3VsdCBkb2Vzbid0IGRlcGVuZCBvbgorICAgICAjIHRoZSBzdWJzdGl0dXRl ZCB2YWx1ZXMuCisgICAgICIke0JJTkRJUn0vcHNxbCIgLWQgIiR1cmkiIC1BdCAtYyAiU0VMRUNU ICckbGluZSciCisgZG9uZSA8cmVncmVzcy5pbiA+cmVncmVzcy5vdXQgMj4mMQorIAorIGlmIGRp ZmYgLWMgZXhwZWN0ZWQub3V0IHJlZ3Jlc3Mub3V0ID5yZWdyZXNzLmRpZmY7IHRoZW4KKyAgICAg ZWNobyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKKyAgICAgZWNo byAiQWxsIHRlc3RzIHBhc3NlZCIKKyAgICAgZXhpdCAwCisgZWxzZQorICAgICBlY2hvICI9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorICAgICBlY2hvICJGQUlMRUQ6 IHRoZSB0ZXN0IHJlc3VsdCBkaWZmZXJzIGZyb20gdGhlIGV4cGVjdGVkIG91dHB1dCIKKyAgICAg ZWNobworICAgICBlY2hvICJSZXZpZXcgdGhlIGRpZmZlcmVuY2UgaW4gJHtTVUJESVJ9L3JlZ3Jl c3MuZGlmZiIKKyAgICAgZWNobyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PSIKKyAgICAgZXhpdCAxCisgZmkK --=-=-=--