X-Original-To: pgsql-patches-postgresql.org@localhost.postgresql.org Received: from localhost (unknown [200.46.204.144]) by svr1.postgresql.org (Postfix) with ESMTP id EC1CA5281E for ; Mon, 27 Jun 2005 15:52:58 -0300 (ADT) Received: from svr1.postgresql.org ([200.46.204.71]) by localhost (av.hub.org [200.46.204.144]) (amavisd-new, port 10024) with ESMTP id 80294-03 for ; Mon, 27 Jun 2005 18:52:58 +0000 (GMT) Received: from mail.Mi8.com (nycgw01.mi8.com [63.240.6.41]) by svr1.postgresql.org (Postfix) with ESMTP id E769352823 for ; Mon, 27 Jun 2005 15:52:51 -0300 (ADT) Received: from 172.16.1.110 by mail.Mi8.com with ESMTP (- GW01 Welcome to Mi8 Corporation www.Mi8.com); Mon, 27 Jun 2005 14:52:39 -0400 X-Server-Uuid: F1A2E19A-84E4-48DD-8F48-B475613F58B2 Received: from MI8NYCMAIL06.Mi8.com ([172.16.1.175]) by D01SMTP01.Mi8.com with Microsoft SMTPSVC(6.0.3790.211); Mon, 27 Jun 2005 14:52:39 -0400 Received: from 67.103.45.218 ([67.103.45.218]) by MI8NYCMAIL06.Mi8.com ( [172.16.1.219]) via Exchange Front-End Server mi8owa.mi8.com ( [172.16.1.104]) with Microsoft Exchange Server HTTP-DAV ; Mon, 27 Jun 2005 14:52:35 -0500 User-Agent: Microsoft-Entourage/11.1.0.040913 Date: Mon, 27 Jun 2005 11:52:30 -0700 Subject: Re: COPY FROM performance improvements From: "Luke Lonergan" To: "Andrew Dunstan" Cc: "Alvaro Herrera" , "Bruce Momjian" , "Alon Goldshuv" , pgsql-patches@postgresql.org Message-ID: In-Reply-To: <42BFE6CF.1030101@dunslane.net> MIME-Version: 1.0 X-OriginalArrivalTime: 27 Jun 2005 18:52:39.0457 (UTC) FILETIME=[643E7110:01C57B49] X-WSS-ID: 6EDE957D3203579562-01-01 Content-Type: multipart/mixed; boundary=B_3202717953_5185116 X-Virus-Scanned: by amavisd-new at hub.org X-Archive-Number: 200506/520 X-Sequence-Number: 16252 > This message is in MIME format. Since your mail reader does not understand this format, some or all of this message may not be legible. --B_3202717953_5185116 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Andrew, > You might like to look at running pgindent (see src/tools/pgindent) over > the file before cutting a patch. Since this is usually run over each > file just before a release, the only badness should be things from > recent patches. I've attached two patches, one gained from running pgindent against the current CVS tip copy.c (:-D) and one gained by running the COPY FROM perf improvements through the same. Nifty tool! Only formatting changes in these. - Luke --B_3202717953_5185116 Content-Type: application/octet-stream; name=copy-pgindent.patch Content-Disposition: attachment; filename=copy-pgindent.patch Content-Transfer-Encoding: base64 SW5kZXg6IHNyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHkuYwo9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBm aWxlOiAvcHJvamVjdHMvY3Zzcm9vdC9wZ3NxbC9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5 LmMsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMjQ1CmRpZmYgLWMgLXIxLjI0NSBjb3B5LmMK KioqIHNyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHkuYwkyIEp1biAyMDA1IDAxOjIxOjIyIC0w MDAwCTEuMjQ1Ci0tLSBzcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5LmMJMjcgSnVuIDIwMDUg MTg6Mjc6MzYgLTAwMDAKKioqKioqKioqKioqKioqCioqKiAxLDMgKioqKgotLS0gMSw0IC0t LS0KKyAKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgKgogICAqIGNvcHkuYwoqKioqKioq KioqKioqKioKKioqIDEwMSwxMDkgKioqKgogIAogIC8qIHRoZXNlIGFyZSBqdXN0IGZvciBl cnJvciBtZXNzYWdlcywgc2VlIGNvcHlfaW5fZXJyb3JfY2FsbGJhY2sgKi8KICBzdGF0aWMg Ym9vbCBjb3B5X2JpbmFyeTsJCS8qIGlzIGl0IGEgYmluYXJ5IGNvcHk/ICovCiEgc3RhdGlj IGNvbnN0IGNoYXIgKmNvcHlfcmVsbmFtZTsJLyogdGFibGUgbmFtZSBmb3IgZXJyb3IgbWVz c2FnZXMgKi8KICBzdGF0aWMgaW50CWNvcHlfbGluZW5vOwkJLyogbGluZSBudW1iZXIgZm9y IGVycm9yIG1lc3NhZ2VzICovCiEgc3RhdGljIGNvbnN0IGNoYXIgKmNvcHlfYXR0bmFtZTsJ LyogY3VycmVudCBhdHQgZm9yIGVycm9yIG1lc3NhZ2VzICovCiAgCiAgCiAgLyoKLS0tIDEw MiwxMTAgLS0tLQogIAogIC8qIHRoZXNlIGFyZSBqdXN0IGZvciBlcnJvciBtZXNzYWdlcywg c2VlIGNvcHlfaW5fZXJyb3JfY2FsbGJhY2sgKi8KICBzdGF0aWMgYm9vbCBjb3B5X2JpbmFy eTsJCS8qIGlzIGl0IGEgYmluYXJ5IGNvcHk/ICovCiEgc3RhdGljIGNvbnN0IGNoYXIgKmNv cHlfcmVsbmFtZTsJCS8qIHRhYmxlIG5hbWUgZm9yIGVycm9yIG1lc3NhZ2VzICovCiAgc3Rh dGljIGludAljb3B5X2xpbmVubzsJCS8qIGxpbmUgbnVtYmVyIGZvciBlcnJvciBtZXNzYWdl cyAqLwohIHN0YXRpYyBjb25zdCBjaGFyICpjb3B5X2F0dG5hbWU7CQkvKiBjdXJyZW50IGF0 dCBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KICAKICAKICAvKgoqKioqKioqKioqKioqKioKKioq IDEzMCwxNTQgKioqKgogIAogIC8qIG5vbi1leHBvcnQgZnVuY3Rpb24gcHJvdG90eXBlcyAq LwogIHN0YXRpYyB2b2lkIERvQ29weVRvKFJlbGF0aW9uIHJlbCwgTGlzdCAqYXR0bnVtbGlz dCwgYm9vbCBiaW5hcnksIGJvb2wgb2lkcywKISAJCSBjaGFyICpkZWxpbSwgY2hhciAqbnVs bF9wcmludCwgYm9vbCBjc3ZfbW9kZSwgY2hhciAqcXVvdGUsCiEgCQkgY2hhciAqZXNjYXBl LCBMaXN0ICpmb3JjZV9xdW90ZV9hdHRzLCBib29sIGhlYWRlcl9saW5lLCBib29sIGZlX2Nv cHkpOwogIHN0YXRpYyB2b2lkIENvcHlUbyhSZWxhdGlvbiByZWwsIExpc3QgKmF0dG51bWxp c3QsIGJvb2wgYmluYXJ5LCBib29sIG9pZHMsCiEgIGNoYXIgKmRlbGltLCBjaGFyICpudWxs X3ByaW50LCBib29sIGNzdl9tb2RlLCBjaGFyICpxdW90ZSwgY2hhciAqZXNjYXBlLAohIAkg ICBMaXN0ICpmb3JjZV9xdW90ZV9hdHRzLCBib29sIGhlYWRlcl9saW5lKTsKICBzdGF0aWMg dm9pZCBDb3B5RnJvbShSZWxhdGlvbiByZWwsIExpc3QgKmF0dG51bWxpc3QsIGJvb2wgYmlu YXJ5LCBib29sIG9pZHMsCiEgIGNoYXIgKmRlbGltLCBjaGFyICpudWxsX3ByaW50LCBib29s IGNzdl9tb2RlLCBjaGFyICpxdW90ZSwgY2hhciAqZXNjYXBlLAohIAkJIExpc3QgKmZvcmNl X25vdG51bGxfYXR0cywgYm9vbCBoZWFkZXJfbGluZSk7CiEgc3RhdGljIGJvb2wgQ29weVJl YWRMaW5lKGNoYXIgKiBxdW90ZSwgY2hhciAqIGVzY2FwZSk7CiAgc3RhdGljIGNoYXIgKkNv cHlSZWFkQXR0cmlidXRlKGNvbnN0IGNoYXIgKmRlbGltLCBjb25zdCBjaGFyICpudWxsX3By aW50LAohIAkJCQkgIENvcHlSZWFkUmVzdWx0ICpyZXN1bHQsIGJvb2wgKmlzbnVsbCk7CiAg c3RhdGljIGNoYXIgKkNvcHlSZWFkQXR0cmlidXRlQ1NWKGNvbnN0IGNoYXIgKmRlbGltLCBj b25zdCBjaGFyICpudWxsX3ByaW50LAohIAkJCQkJIGNoYXIgKnF1b3RlLCBjaGFyICplc2Nh cGUsCiEgCQkJCQkgQ29weVJlYWRSZXN1bHQgKnJlc3VsdCwgYm9vbCAqaXNudWxsKTsKICBz dGF0aWMgRGF0dW0gQ29weVJlYWRCaW5hcnlBdHRyaWJ1dGUoaW50IGNvbHVtbl9ubywgRm1n ckluZm8gKmZsaW5mbywKISAJCQkJCQlPaWQgdHlwaW9wYXJhbSwgYm9vbCAqaXNudWxsKTsK ICBzdGF0aWMgdm9pZCBDb3B5QXR0cmlidXRlT3V0KGNoYXIgKnN0cmluZywgY2hhciAqZGVs aW0pOwogIHN0YXRpYyB2b2lkIENvcHlBdHRyaWJ1dGVPdXRDU1YoY2hhciAqc3RyaW5nLCBj aGFyICpkZWxpbSwgY2hhciAqcXVvdGUsCiEgCQkJCQljaGFyICplc2NhcGUsIGJvb2wgZm9y Y2VfcXVvdGUpOwogIHN0YXRpYyBMaXN0ICpDb3B5R2V0QXR0bnVtcyhSZWxhdGlvbiByZWws IExpc3QgKmF0dG5hbWVsaXN0KTsKICBzdGF0aWMgdm9pZCBsaW1pdF9wcmludG91dF9sZW5n dGgoU3RyaW5nSW5mbyBidWYpOwogIAotLS0gMTMxLDE1NiAtLS0tCiAgCiAgLyogbm9uLWV4 cG9ydCBmdW5jdGlvbiBwcm90b3R5cGVzICovCiAgc3RhdGljIHZvaWQgRG9Db3B5VG8oUmVs YXRpb24gcmVsLCBMaXN0ICphdHRudW1saXN0LCBib29sIGJpbmFyeSwgYm9vbCBvaWRzLAoh IAkJCQkJIGNoYXIgKmRlbGltLCBjaGFyICpudWxsX3ByaW50LCBib29sIGNzdl9tb2RlLCBj aGFyICpxdW90ZSwKISAJCQkJCSBjaGFyICplc2NhcGUsIExpc3QgKmZvcmNlX3F1b3RlX2F0 dHMsIGJvb2wgaGVhZGVyX2xpbmUsCiEgCQkJCQkgYm9vbCBmZV9jb3B5KTsKICBzdGF0aWMg dm9pZCBDb3B5VG8oUmVsYXRpb24gcmVsLCBMaXN0ICphdHRudW1saXN0LCBib29sIGJpbmFy eSwgYm9vbCBvaWRzLAohIAkJCQkgICBjaGFyICpkZWxpbSwgY2hhciAqbnVsbF9wcmludCwg Ym9vbCBjc3ZfbW9kZSwgY2hhciAqcXVvdGUsCiEgCQkJCSAgIGNoYXIgKmVzY2FwZSwgTGlz dCAqZm9yY2VfcXVvdGVfYXR0cywgYm9vbCBoZWFkZXJfbGluZSk7CiAgc3RhdGljIHZvaWQg Q29weUZyb20oUmVsYXRpb24gcmVsLCBMaXN0ICphdHRudW1saXN0LCBib29sIGJpbmFyeSwg Ym9vbCBvaWRzLAohIAkJCQkJIGNoYXIgKmRlbGltLCBjaGFyICpudWxsX3ByaW50LCBib29s IGNzdl9tb2RlLCBjaGFyICpxdW90ZSwKISAJCQkJCSBjaGFyICplc2NhcGUsIExpc3QgKmZv cmNlX25vdG51bGxfYXR0cywgYm9vbCBoZWFkZXJfbGluZSk7CiEgc3RhdGljIGJvb2wgQ29w eVJlYWRMaW5lKGNoYXIgKnF1b3RlLCBjaGFyICplc2NhcGUpOwogIHN0YXRpYyBjaGFyICpD b3B5UmVhZEF0dHJpYnV0ZShjb25zdCBjaGFyICpkZWxpbSwgY29uc3QgY2hhciAqbnVsbF9w cmludCwKISAJCQkJCQkJICAgQ29weVJlYWRSZXN1bHQgKnJlc3VsdCwgYm9vbCAqaXNudWxs KTsKICBzdGF0aWMgY2hhciAqQ29weVJlYWRBdHRyaWJ1dGVDU1YoY29uc3QgY2hhciAqZGVs aW0sIGNvbnN0IGNoYXIgKm51bGxfcHJpbnQsCiEgCQkJCQkJCQkgIGNoYXIgKnF1b3RlLCBj aGFyICplc2NhcGUsCiEgCQkJCQkJCQkgIENvcHlSZWFkUmVzdWx0ICpyZXN1bHQsIGJvb2wg KmlzbnVsbCk7CiAgc3RhdGljIERhdHVtIENvcHlSZWFkQmluYXJ5QXR0cmlidXRlKGludCBj b2x1bW5fbm8sIEZtZ3JJbmZvICpmbGluZm8sCiEgCQkJCQkJCQkJIE9pZCB0eXBpb3BhcmFt LCBib29sICppc251bGwpOwogIHN0YXRpYyB2b2lkIENvcHlBdHRyaWJ1dGVPdXQoY2hhciAq c3RyaW5nLCBjaGFyICpkZWxpbSk7CiAgc3RhdGljIHZvaWQgQ29weUF0dHJpYnV0ZU91dENT VihjaGFyICpzdHJpbmcsIGNoYXIgKmRlbGltLCBjaGFyICpxdW90ZSwKISAJCQkJCQkJCWNo YXIgKmVzY2FwZSwgYm9vbCBmb3JjZV9xdW90ZSk7CiAgc3RhdGljIExpc3QgKkNvcHlHZXRB dHRudW1zKFJlbGF0aW9uIHJlbCwgTGlzdCAqYXR0bmFtZWxpc3QpOwogIHN0YXRpYyB2b2lk IGxpbWl0X3ByaW50b3V0X2xlbmd0aChTdHJpbmdJbmZvIGJ1Zik7CiAgCioqKioqKioqKioq KioqKgoqKiogMTgxLDE4NyAqKioqCiAgewogIAlpZiAoUEdfUFJPVE9DT0xfTUFKT1IoRnJv bnRlbmRQcm90b2NvbCkgPj0gMykKICAJewohIAkJLyogbmV3IHdheSAqLwogIAkJU3RyaW5n SW5mb0RhdGEgYnVmOwogIAkJaW50MTYJCWZvcm1hdCA9IChiaW5hcnkgPyAxIDogMCk7CiAg CQlpbnQJCQlpOwotLS0gMTgzLDE5MSAtLS0tCiAgewogIAlpZiAoUEdfUFJPVE9DT0xfTUFK T1IoRnJvbnRlbmRQcm90b2NvbCkgPj0gMykKICAJewohIAkJLyoKISAJCSAqIG5ldyB3YXkK ISAJCSAqLwogIAkJU3RyaW5nSW5mb0RhdGEgYnVmOwogIAkJaW50MTYJCWZvcm1hdCA9IChi aW5hcnkgPyAxIDogMCk7CiAgCQlpbnQJCQlpOwoqKioqKioqKioqKioqKioKKioqIDE5Nywy MjEgKioqKgogIAl9CiAgCWVsc2UgaWYgKFBHX1BST1RPQ09MX01BSk9SKEZyb250ZW5kUHJv dG9jb2wpID49IDIpCiAgCXsKISAJCS8qIG9sZCB3YXkgKi8KICAJCWlmIChiaW5hcnkpCiAg CQkJZXJlcG9ydChFUlJPUiwKICAJCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1Rf U1VQUE9SVEVEKSwKISAJCQkJCSBlcnJtc2coIkNPUFkgQklOQVJZIGlzIG5vdCBzdXBwb3J0 ZWQgdG8gc3Rkb3V0IG9yIGZyb20gc3RkaW4iKSkpOwogIAkJcHFfcHV0ZW1wdHltZXNzYWdl KCdIJyk7CiEgCQkvKiBncm90dGluZXNzIG5lZWRlZCBmb3Igb2xkIENPUFkgT1VUIHByb3Rv Y29sICovCiAgCQlwcV9zdGFydGNvcHlvdXQoKTsKICAJCWNvcHlfZGVzdCA9IENPUFlfT0xE X0ZFOwogIAl9CiAgCWVsc2UKICAJewohIAkJLyogdmVyeSBvbGQgd2F5ICovCiAgCQlpZiAo YmluYXJ5KQogIAkJCWVyZXBvcnQoRVJST1IsCiAgCQkJCQkoZXJyY29kZShFUlJDT0RFX0ZF QVRVUkVfTk9UX1NVUFBPUlRFRCksCiEgCQkJCQkgZXJybXNnKCJDT1BZIEJJTkFSWSBpcyBu b3Qgc3VwcG9ydGVkIHRvIHN0ZG91dCBvciBmcm9tIHN0ZGluIikpKTsKICAJCXBxX3B1dGVt cHR5bWVzc2FnZSgnQicpOwohIAkJLyogZ3JvdHRpbmVzcyBuZWVkZWQgZm9yIG9sZCBDT1BZ IE9VVCBwcm90b2NvbCAqLwogIAkJcHFfc3RhcnRjb3B5b3V0KCk7CiAgCQljb3B5X2Rlc3Qg PSBDT1BZX09MRF9GRTsKICAJfQotLS0gMjAxLDIzNSAtLS0tCiAgCX0KICAJZWxzZSBpZiAo UEdfUFJPVE9DT0xfTUFKT1IoRnJvbnRlbmRQcm90b2NvbCkgPj0gMikKICAJewohIAkJLyoK ISAJCSAqIG9sZCB3YXkKISAJCSAqLwogIAkJaWYgKGJpbmFyeSkKICAJCQllcmVwb3J0KEVS Uk9SLAogIAkJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAoh IAkJCQkJIGVycm1zZwohIAkJCQkJICgiQ09QWSBCSU5BUlkgaXMgbm90IHN1cHBvcnRlZCB0 byBzdGRvdXQgb3IgZnJvbSBzdGRpbiIpKSk7CiAgCQlwcV9wdXRlbXB0eW1lc3NhZ2UoJ0gn KTsKISAJCS8qCiEgCQkgKiBncm90dGluZXNzIG5lZWRlZCBmb3Igb2xkIENPUFkgT1VUIHBy b3RvY29sCiEgCQkgKi8KICAJCXBxX3N0YXJ0Y29weW91dCgpOwogIAkJY29weV9kZXN0ID0g Q09QWV9PTERfRkU7CiAgCX0KICAJZWxzZQogIAl7CiEgCQkvKgohIAkJICogdmVyeSBvbGQg d2F5CiEgCQkgKi8KICAJCWlmIChiaW5hcnkpCiAgCQkJZXJlcG9ydChFUlJPUiwKICAJCQkJ CShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKISAJCQkJCSBlcnJt c2cKISAJCQkJCSAoIkNPUFkgQklOQVJZIGlzIG5vdCBzdXBwb3J0ZWQgdG8gc3Rkb3V0IG9y IGZyb20gc3RkaW4iKSkpOwogIAkJcHFfcHV0ZW1wdHltZXNzYWdlKCdCJyk7CiEgCQkvKgoh IAkJICogZ3JvdHRpbmVzcyBuZWVkZWQgZm9yIG9sZCBDT1BZIE9VVCBwcm90b2NvbAohIAkJ ICovCiAgCQlwcV9zdGFydGNvcHlvdXQoKTsKICAJCWNvcHlfZGVzdCA9IENPUFlfT0xEX0ZF OwogIAl9CioqKioqKioqKioqKioqKgoqKiogMjI2LDIzMiAqKioqCiAgewogIAlpZiAoUEdf UFJPVE9DT0xfTUFKT1IoRnJvbnRlbmRQcm90b2NvbCkgPj0gMykKICAJewohIAkJLyogbmV3 IHdheSAqLwogIAkJU3RyaW5nSW5mb0RhdGEgYnVmOwogIAkJaW50MTYJCWZvcm1hdCA9IChi aW5hcnkgPyAxIDogMCk7CiAgCQlpbnQJCQlpOwotLS0gMjQwLDI0OCAtLS0tCiAgewogIAlp ZiAoUEdfUFJPVE9DT0xfTUFKT1IoRnJvbnRlbmRQcm90b2NvbCkgPj0gMykKICAJewohIAkJ LyoKISAJCSAqIG5ldyB3YXkKISAJCSAqLwogIAkJU3RyaW5nSW5mb0RhdGEgYnVmOwogIAkJ aW50MTYJCWZvcm1hdCA9IChiaW5hcnkgPyAxIDogMCk7CiAgCQlpbnQJCQlpOwoqKioqKioq KioqKioqKioKKioqIDI0MiwyNjYgKioqKgogIAl9CiAgCWVsc2UgaWYgKFBHX1BST1RPQ09M X01BSk9SKEZyb250ZW5kUHJvdG9jb2wpID49IDIpCiAgCXsKISAJCS8qIG9sZCB3YXkgKi8K ICAJCWlmIChiaW5hcnkpCiAgCQkJZXJlcG9ydChFUlJPUiwKICAJCQkJCShlcnJjb2RlKEVS UkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKISAJCQkJCSBlcnJtc2coIkNPUFkgQklO QVJZIGlzIG5vdCBzdXBwb3J0ZWQgdG8gc3Rkb3V0IG9yIGZyb20gc3RkaW4iKSkpOwogIAkJ cHFfcHV0ZW1wdHltZXNzYWdlKCdHJyk7CiAgCQljb3B5X2Rlc3QgPSBDT1BZX09MRF9GRTsK ICAJfQogIAllbHNlCiAgCXsKISAJCS8qIHZlcnkgb2xkIHdheSAqLwogIAkJaWYgKGJpbmFy eSkKICAJCQllcmVwb3J0KEVSUk9SLAogIAkJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJF X05PVF9TVVBQT1JURUQpLAohIAkJCQkJIGVycm1zZygiQ09QWSBCSU5BUlkgaXMgbm90IHN1 cHBvcnRlZCB0byBzdGRvdXQgb3IgZnJvbSBzdGRpbiIpKSk7CiAgCQlwcV9wdXRlbXB0eW1l c3NhZ2UoJ0QnKTsKICAJCWNvcHlfZGVzdCA9IENPUFlfT0xEX0ZFOwogIAl9CiEgCS8qIFdl ICptdXN0KiBmbHVzaCBoZXJlIHRvIGVuc3VyZSBGRSBrbm93cyBpdCBjYW4gc2VuZC4gKi8K ICAJcHFfZmx1c2goKTsKICB9CiAgCi0tLSAyNTgsMjkwIC0tLS0KICAJfQogIAllbHNlIGlm IChQR19QUk9UT0NPTF9NQUpPUihGcm9udGVuZFByb3RvY29sKSA+PSAyKQogIAl7CiEgCQkv KgohIAkJICogb2xkIHdheQohIAkJICovCiAgCQlpZiAoYmluYXJ5KQogIAkJCWVyZXBvcnQo RVJST1IsCiAgCQkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCks CiEgCQkJCQkgZXJybXNnCiEgCQkJCQkgKCJDT1BZIEJJTkFSWSBpcyBub3Qgc3VwcG9ydGVk IHRvIHN0ZG91dCBvciBmcm9tIHN0ZGluIikpKTsKICAJCXBxX3B1dGVtcHR5bWVzc2FnZSgn RycpOwogIAkJY29weV9kZXN0ID0gQ09QWV9PTERfRkU7CiAgCX0KICAJZWxzZQogIAl7CiEg CQkvKgohIAkJICogdmVyeSBvbGQgd2F5CiEgCQkgKi8KICAJCWlmIChiaW5hcnkpCiAgCQkJ ZXJlcG9ydChFUlJPUiwKICAJCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQ UE9SVEVEKSwKISAJCQkJCSBlcnJtc2cKISAJCQkJCSAoIkNPUFkgQklOQVJZIGlzIG5vdCBz dXBwb3J0ZWQgdG8gc3Rkb3V0IG9yIGZyb20gc3RkaW4iKSkpOwogIAkJcHFfcHV0ZW1wdHlt ZXNzYWdlKCdEJyk7CiAgCQljb3B5X2Rlc3QgPSBDT1BZX09MRF9GRTsKICAJfQohIAkvKgoh IAkgKiBXZSAqbXVzdCogZmx1c2ggaGVyZSB0byBlbnN1cmUgRkUga25vd3MgaXQgY2FuIHNl bmQuCiEgCSAqLwogIAlwcV9mbHVzaCgpOwogIH0KICAKKioqKioqKioqKioqKioqCioqKiAy NzEsMjkwICoqKioKICAJewogIAkJaWYgKGJpbmFyeSkKICAJCXsKISAJCQkvKiBOZWVkIHRv IGZsdXNoIG91dCBmaWxlIHRyYWlsZXIgd29yZCAqLwogIAkJCUNvcHlTZW5kRW5kT2ZSb3co dHJ1ZSk7CiAgCQl9CiAgCQllbHNlCiAgCQl7CiEgCQkJLyogU2hvdWxkbid0IGhhdmUgYW55 IHVuc2VudCBkYXRhICovCiAgCQkJQXNzZXJ0KGNvcHlfbXNnYnVmLT5sZW4gPT0gMCk7CiAg CQl9CiEgCQkvKiBTZW5kIENvcHkgRG9uZSBtZXNzYWdlICovCiAgCQlwcV9wdXRlbXB0eW1l c3NhZ2UoJ2MnKTsKICAJfQogIAllbHNlCiAgCXsKISAJCS8qIFRoZSBGRS9CRSBwcm90b2Nv bCB1c2VzIFxuIGFzIG5ld2xpbmUgZm9yIGFsbCBwbGF0Zm9ybXMgKi8KICAJCUNvcHlTZW5k RGF0YSgiXFwuXG4iLCAzKTsKICAJCXBxX2VuZGNvcHlvdXQoZmFsc2UpOwogIAl9Ci0tLSAy OTUsMzIyIC0tLS0KICAJewogIAkJaWYgKGJpbmFyeSkKICAJCXsKISAJCQkvKgohIAkJCSAq IE5lZWQgdG8gZmx1c2ggb3V0IGZpbGUgdHJhaWxlciB3b3JkCiEgCQkJICovCiAgCQkJQ29w eVNlbmRFbmRPZlJvdyh0cnVlKTsKICAJCX0KICAJCWVsc2UKICAJCXsKISAJCQkvKgohIAkJ CSAqIFNob3VsZG4ndCBoYXZlIGFueSB1bnNlbnQgZGF0YSAKISAJCQkgKi8KICAJCQlBc3Nl cnQoY29weV9tc2didWYtPmxlbiA9PSAwKTsKICAJCX0KISAJCS8qCiEgCQkgKiBTZW5kIENv cHkgRG9uZSBtZXNzYWdlCiEgCQkgKi8KICAJCXBxX3B1dGVtcHR5bWVzc2FnZSgnYycpOwog IAl9CiAgCWVsc2UKICAJewohIAkJLyoKISAJCSAqIFRoZSBGRS9CRSBwcm90b2NvbCB1c2Vz IFxuIGFzIG5ld2xpbmUgZm9yIGFsbCBwbGF0Zm9ybXMKISAJCSAqLwogIAkJQ29weVNlbmRE YXRhKCJcXC5cbiIsIDMpOwogIAkJcHFfZW5kY29weW91dChmYWxzZSk7CiAgCX0KKioqKioq KioqKioqKioqCioqKiAzMTQsMzIzICoqKioKICAJCWNhc2UgQ09QWV9PTERfRkU6CiAgCQkJ aWYgKHBxX3B1dGJ5dGVzKChjaGFyICopIGRhdGFidWYsIGRhdGFzaXplKSkKICAJCQl7CiEg CQkJCS8qIG5vIGhvcGUgb2YgcmVjb3ZlcmluZyBjb25uZWN0aW9uIHN5bmMsIHNvIEZBVEFM ICovCiAgCQkJCWVyZXBvcnQoRkFUQUwsCiAgCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9DT05O RUNUSU9OX0ZBSUxVUkUpLAohIAkJCQkJICAgZXJybXNnKCJjb25uZWN0aW9uIGxvc3QgZHVy aW5nIENPUFkgdG8gc3Rkb3V0IikpKTsKICAJCQl9CiAgCQkJYnJlYWs7CiAgCQljYXNlIENP UFlfTkVXX0ZFOgotLS0gMzQ2LDM1NyAtLS0tCiAgCQljYXNlIENPUFlfT0xEX0ZFOgogIAkJ CWlmIChwcV9wdXRieXRlcygoY2hhciAqKSBkYXRhYnVmLCBkYXRhc2l6ZSkpCiAgCQkJewoh IAkJCQkvKgohIAkJCQkgKiBubyBob3BlIG9mIHJlY292ZXJpbmcgY29ubmVjdGlvbiBzeW5j LCBzbyBGQVRBTAohIAkJCQkgKi8KICAJCQkJZXJlcG9ydChGQVRBTCwKICAJCQkJCQkoZXJy Y29kZShFUlJDT0RFX0NPTk5FQ1RJT05fRkFJTFVSRSksCiEgCQkJCQkJIGVycm1zZygiY29u bmVjdGlvbiBsb3N0IGR1cmluZyBDT1BZIHRvIHN0ZG91dCIpKSk7CiAgCQkJfQogIAkJCWJy ZWFrOwogIAkJY2FzZSBDT1BZX05FV19GRToKKioqKioqKioqKioqKioqCioqKiAzNDYsMzUy ICoqKioKICAJCWNhc2UgQ09QWV9GSUxFOgogIAkJCWlmICghYmluYXJ5KQogIAkJCXsKISAJ CQkJLyogRGVmYXVsdCBsaW5lIHRlcm1pbmF0aW9uIGRlcGVuZHMgb24gcGxhdGZvcm0gKi8K ICAjaWZuZGVmIFdJTjMyCiAgCQkJCUNvcHlTZW5kQ2hhcignXG4nKTsKICAjZWxzZQotLS0g MzgwLDM4OCAtLS0tCiAgCQljYXNlIENPUFlfRklMRToKICAJCQlpZiAoIWJpbmFyeSkKICAJ CQl7CiEgCQkJCS8qCiEgCQkJCSAqIERlZmF1bHQgbGluZSB0ZXJtaW5hdGlvbiBkZXBlbmRz IG9uIHBsYXRmb3JtCiEgCQkJCSAqLwogICNpZm5kZWYgV0lOMzIKICAJCQkJQ29weVNlbmRD aGFyKCdcbicpOwogICNlbHNlCioqKioqKioqKioqKioqKgoqKiogMzU1LDM3MSAqKioqCiAg CQkJfQogIAkJCWJyZWFrOwogIAkJY2FzZSBDT1BZX09MRF9GRToKISAJCQkvKiBUaGUgRkUv QkUgcHJvdG9jb2wgdXNlcyBcbiBhcyBuZXdsaW5lIGZvciBhbGwgcGxhdGZvcm1zICovCiAg CQkJaWYgKCFiaW5hcnkpCiAgCQkJCUNvcHlTZW5kQ2hhcignXG4nKTsKICAJCQlicmVhazsK ICAJCWNhc2UgQ09QWV9ORVdfRkU6CiEgCQkJLyogVGhlIEZFL0JFIHByb3RvY29sIHVzZXMg XG4gYXMgbmV3bGluZSBmb3IgYWxsIHBsYXRmb3JtcyAqLwogIAkJCWlmICghYmluYXJ5KQog IAkJCQlDb3B5U2VuZENoYXIoJ1xuJyk7CiEgCQkJLyogRHVtcCB0aGUgYWNjdW11bGF0ZWQg cm93IGFzIG9uZSBDb3B5RGF0YSBtZXNzYWdlICovCiAgCQkJKHZvaWQpIHBxX3B1dG1lc3Nh Z2UoJ2QnLCBjb3B5X21zZ2J1Zi0+ZGF0YSwgY29weV9tc2didWYtPmxlbik7CiEgCQkJLyog UmVzZXQgY29weV9tc2didWYgdG8gZW1wdHkgKi8KICAJCQljb3B5X21zZ2J1Zi0+bGVuID0g MDsKICAJCQljb3B5X21zZ2J1Zi0+ZGF0YVswXSA9ICdcMCc7CiAgCQkJYnJlYWs7Ci0tLSAz OTEsNDE1IC0tLS0KICAJCQl9CiAgCQkJYnJlYWs7CiAgCQljYXNlIENPUFlfT0xEX0ZFOgoh IAkJCS8qCiEgCQkJICogVGhlIEZFL0JFIHByb3RvY29sIHVzZXMgXG4gYXMgbmV3bGluZSBm b3IgYWxsIHBsYXRmb3JtcwohIAkJCSAqLwogIAkJCWlmICghYmluYXJ5KQogIAkJCQlDb3B5 U2VuZENoYXIoJ1xuJyk7CiAgCQkJYnJlYWs7CiAgCQljYXNlIENPUFlfTkVXX0ZFOgohIAkJ CS8qCiEgCQkJICogVGhlIEZFL0JFIHByb3RvY29sIHVzZXMgXG4gYXMgbmV3bGluZSBmb3Ig YWxsIHBsYXRmb3JtcwohIAkJCSAqLwogIAkJCWlmICghYmluYXJ5KQogIAkJCQlDb3B5U2Vu ZENoYXIoJ1xuJyk7CiEgCQkJLyoKISAJCQkgKiBEdW1wIHRoZSBhY2N1bXVsYXRlZCByb3cg YXMgb25lIENvcHlEYXRhIG1lc3NhZ2UKISAJCQkgKi8KICAJCQkodm9pZCkgcHFfcHV0bWVz c2FnZSgnZCcsIGNvcHlfbXNnYnVmLT5kYXRhLCBjb3B5X21zZ2J1Zi0+bGVuKTsKISAJCQkv KgohIAkJCSAqIFJlc2V0IGNvcHlfbXNnYnVmIHRvIGVtcHR5CiEgCQkJICovCiAgCQkJY29w eV9tc2didWYtPmxlbiA9IDA7CiAgCQkJY29weV9tc2didWYtPmRhdGFbMF0gPSAnXDAnOwog IAkJCWJyZWFrOwoqKioqKioqKioqKioqKioKKioqIDM5Nyw0MDMgKioqKgogIAkJY2FzZSBD T1BZX09MRF9GRToKICAJCQlpZiAocHFfZ2V0Ynl0ZXMoKGNoYXIgKikgZGF0YWJ1ZiwgZGF0 YXNpemUpKQogIAkJCXsKISAJCQkJLyogT25seSBhIFwuIHRlcm1pbmF0b3IgaXMgbGVnYWwg RU9GIGluIG9sZCBwcm90b2NvbCAqLwogIAkJCQllcmVwb3J0KEVSUk9SLAogIAkJCQkJCShl cnJjb2RlKEVSUkNPREVfQ09OTkVDVElPTl9GQUlMVVJFKSwKICAJCQkJCQkgZXJybXNnKCJ1 bmV4cGVjdGVkIEVPRiBvbiBjbGllbnQgY29ubmVjdGlvbiIpKSk7Ci0tLSA0NDEsNDQ5IC0t LS0KICAJCWNhc2UgQ09QWV9PTERfRkU6CiAgCQkJaWYgKHBxX2dldGJ5dGVzKChjaGFyICop IGRhdGFidWYsIGRhdGFzaXplKSkKICAJCQl7CiEgCQkJCS8qCiEgCQkJCSAqIE9ubHkgYSBc LiB0ZXJtaW5hdG9yIGlzIGxlZ2FsIEVPRiBpbiBvbGQgcHJvdG9jb2wKISAJCQkJICovCiAg CQkJCWVyZXBvcnQoRVJST1IsCiAgCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9DT05ORUNUSU9O X0ZBSUxVUkUpLAogIAkJCQkJCSBlcnJtc2coInVuZXhwZWN0ZWQgRU9GIG9uIGNsaWVudCBj b25uZWN0aW9uIikpKTsKKioqKioqKioqKioqKioqCioqKiA0MTAsNDQxICoqKioKICAKICAJ CQkJd2hpbGUgKGNvcHlfbXNnYnVmLT5jdXJzb3IgPj0gY29weV9tc2didWYtPmxlbikKICAJ CQkJewohIAkJCQkJLyogVHJ5IHRvIHJlY2VpdmUgYW5vdGhlciBtZXNzYWdlICovCiAgCQkJ CQlpbnQJCQltdHlwZTsKICAKISAJCQlyZWFkbWVzc2FnZToKICAJCQkJCW10eXBlID0gcHFf Z2V0Ynl0ZSgpOwogIAkJCQkJaWYgKG10eXBlID09IEVPRikKICAJCQkJCQllcmVwb3J0KEVS Uk9SLAogIAkJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9DT05ORUNUSU9OX0ZBSUxVUkUpLAoh IAkJCQkJCSBlcnJtc2coInVuZXhwZWN0ZWQgRU9GIG9uIGNsaWVudCBjb25uZWN0aW9uIikp KTsKICAJCQkJCWlmIChwcV9nZXRtZXNzYWdlKGNvcHlfbXNnYnVmLCAwKSkKICAJCQkJCQll cmVwb3J0KEVSUk9SLAogIAkJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9DT05ORUNUSU9OX0ZB SUxVUkUpLAohIAkJCQkJCSBlcnJtc2coInVuZXhwZWN0ZWQgRU9GIG9uIGNsaWVudCBjb25u ZWN0aW9uIikpKTsKICAJCQkJCXN3aXRjaCAobXR5cGUpCiAgCQkJCQl7CiAgCQkJCQkJY2Fz ZSAnZCc6CQkvKiBDb3B5RGF0YSAqLwogIAkJCQkJCQlicmVhazsKICAJCQkJCQljYXNlICdj JzoJCS8qIENvcHlEb25lICovCiEgCQkJCQkJCS8qIENPUFkgSU4gY29ycmVjdGx5IHRlcm1p bmF0ZWQgYnkgZnJvbnRlbmQgKi8KICAJCQkJCQkJZmVfZW9mID0gdHJ1ZTsKICAJCQkJCQkJ cmV0dXJuOwogIAkJCQkJCWNhc2UgJ2YnOgkJLyogQ29weUZhaWwgKi8KICAJCQkJCQkJZXJl cG9ydChFUlJPUiwKICAJCQkJCQkJCQkoZXJyY29kZShFUlJDT0RFX1FVRVJZX0NBTkNFTEVE KSwKICAJCQkJCQkJCQkgZXJybXNnKCJDT1BZIGZyb20gc3RkaW4gZmFpbGVkOiAlcyIsCiEg CQkJCQkJCQkJCSBwcV9nZXRtc2dzdHJpbmcoY29weV9tc2didWYpKSkpOwogIAkJCQkJCQli cmVhazsKICAJCQkJCQljYXNlICdIJzoJCS8qIEZsdXNoICovCiAgCQkJCQkJY2FzZSAnUyc6 CQkvKiBTeW5jICovCi0tLSA0NTYsNDkzIC0tLS0KICAKICAJCQkJd2hpbGUgKGNvcHlfbXNn YnVmLT5jdXJzb3IgPj0gY29weV9tc2didWYtPmxlbikKICAJCQkJewohIAkJCQkJLyoKISAJ CQkJCSAqIFRyeSB0byByZWNlaXZlIGFub3RoZXIgbWVzc2FnZQohIAkJCQkJICovCiAgCQkJ CQlpbnQJCQltdHlwZTsKICAKISAJCQkJICByZWFkbWVzc2FnZToKICAJCQkJCW10eXBlID0g cHFfZ2V0Ynl0ZSgpOwogIAkJCQkJaWYgKG10eXBlID09IEVPRikKICAJCQkJCQllcmVwb3J0 KEVSUk9SLAogIAkJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9DT05ORUNUSU9OX0ZBSUxVUkUp LAohIAkJCQkJCQkJIGVycm1zZwohIAkJCQkJCQkJICgidW5leHBlY3RlZCBFT0Ygb24gY2xp ZW50IGNvbm5lY3Rpb24iKSkpOwogIAkJCQkJaWYgKHBxX2dldG1lc3NhZ2UoY29weV9tc2di dWYsIDApKQogIAkJCQkJCWVyZXBvcnQoRVJST1IsCiAgCQkJCQkJCQkoZXJyY29kZShFUlJD T0RFX0NPTk5FQ1RJT05fRkFJTFVSRSksCiEgCQkJCQkJCQkgZXJybXNnCiEgCQkJCQkJCQkg KCJ1bmV4cGVjdGVkIEVPRiBvbiBjbGllbnQgY29ubmVjdGlvbiIpKSk7CiAgCQkJCQlzd2l0 Y2ggKG10eXBlKQogIAkJCQkJewogIAkJCQkJCWNhc2UgJ2QnOgkJLyogQ29weURhdGEgKi8K ICAJCQkJCQkJYnJlYWs7CiAgCQkJCQkJY2FzZSAnYyc6CQkvKiBDb3B5RG9uZSAqLwohIAkJ CQkJCQkvKgohIAkJCQkJCQkgKiBDT1BZIElOIGNvcnJlY3RseSB0ZXJtaW5hdGVkIGJ5IGZy b250ZW5kCiEgCQkJCQkJCSAqLwogIAkJCQkJCQlmZV9lb2YgPSB0cnVlOwogIAkJCQkJCQly ZXR1cm47CiAgCQkJCQkJY2FzZSAnZic6CQkvKiBDb3B5RmFpbCAqLwogIAkJCQkJCQllcmVw b3J0KEVSUk9SLAogIAkJCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfUVVFUllfQ0FOQ0VMRUQp LAogIAkJCQkJCQkJCSBlcnJtc2coIkNPUFkgZnJvbSBzdGRpbiBmYWlsZWQ6ICVzIiwKISAJ CQkJCQkJCQkJCXBxX2dldG1zZ3N0cmluZyhjb3B5X21zZ2J1ZikpKSk7CiAgCQkJCQkJCWJy ZWFrOwogIAkJCQkJCWNhc2UgJ0gnOgkJLyogRmx1c2ggKi8KICAJCQkJCQljYXNlICdTJzoJ CS8qIFN5bmMgKi8KKioqKioqKioqKioqKioqCioqKiA0NTAsNDU3ICoqKioKICAJCQkJCQlk ZWZhdWx0OgogIAkJCQkJCQllcmVwb3J0KEVSUk9SLAogIAkJCQkJCQkJCShlcnJjb2RlKEVS UkNPREVfUFJPVE9DT0xfVklPTEFUSU9OKSwKISAJCQkJCQkJCQkgZXJybXNnKCJ1bmV4cGVj dGVkIG1lc3NhZ2UgdHlwZSAweCUwMlggZHVyaW5nIENPUFkgZnJvbSBzdGRpbiIsCiEgCQkJ CQkJCQkJCQltdHlwZSkpKTsKICAJCQkJCQkJYnJlYWs7CiAgCQkJCQl9CiAgCQkJCX0KLS0t IDUwMiw1MTAgLS0tLQogIAkJCQkJCWRlZmF1bHQ6CiAgCQkJCQkJCWVyZXBvcnQoRVJST1Is CiAgCQkJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9QUk9UT0NPTF9WSU9MQVRJT04pLAohIAkJ CQkJCQkJCSBlcnJtc2cKISAJCQkJCQkJCQkgKCJ1bmV4cGVjdGVkIG1lc3NhZ2UgdHlwZSAw eCUwMlggZHVyaW5nIENPUFkgZnJvbSBzdGRpbiIsCiEgCQkJCQkJCQkJICBtdHlwZSkpKTsK ICAJCQkJCQkJYnJlYWs7CiAgCQkJCQl9CiAgCQkJCX0KKioqKioqKioqKioqKioqCioqKiA0 ODAsNDg2ICoqKioKICAJCQljaCA9IHBxX2dldGJ5dGUoKTsKICAJCQlpZiAoY2ggPT0gRU9G KQogIAkJCXsKISAJCQkJLyogT25seSBhIFwuIHRlcm1pbmF0b3IgaXMgbGVnYWwgRU9GIGlu IG9sZCBwcm90b2NvbCAqLwogIAkJCQllcmVwb3J0KEVSUk9SLAogIAkJCQkJCShlcnJjb2Rl KEVSUkNPREVfQ09OTkVDVElPTl9GQUlMVVJFKSwKICAJCQkJCQkgZXJybXNnKCJ1bmV4cGVj dGVkIEVPRiBvbiBjbGllbnQgY29ubmVjdGlvbiIpKSk7Ci0tLSA1MzMsNTQxIC0tLS0KICAJ CQljaCA9IHBxX2dldGJ5dGUoKTsKICAJCQlpZiAoY2ggPT0gRU9GKQogIAkJCXsKISAJCQkJ LyoKISAJCQkJICogT25seSBhIFwuIHRlcm1pbmF0b3IgaXMgbGVnYWwgRU9GIGluIG9sZCBw cm90b2NvbAohIAkJCQkgKi8KICAJCQkJZXJlcG9ydChFUlJPUiwKICAJCQkJCQkoZXJyY29k ZShFUlJDT0RFX0NPTk5FQ1RJT05fRkFJTFVSRSksCiAgCQkJCQkJIGVycm1zZygidW5leHBl Y3RlZCBFT0Ygb24gY2xpZW50IGNvbm5lY3Rpb24iKSkpOwoqKioqKioqKioqKioqKioKKioq IDUyOSw1MzUgKioqKgogIAkJCWNoID0gcHFfcGVla2J5dGUoKTsKICAJCQlpZiAoY2ggPT0g RU9GKQogIAkJCXsKISAJCQkJLyogT25seSBhIFwuIHRlcm1pbmF0b3IgaXMgbGVnYWwgRU9G IGluIG9sZCBwcm90b2NvbCAqLwogIAkJCQllcmVwb3J0KEVSUk9SLAogIAkJCQkJCShlcnJj b2RlKEVSUkNPREVfQ09OTkVDVElPTl9GQUlMVVJFKSwKICAJCQkJCQkgZXJybXNnKCJ1bmV4 cGVjdGVkIEVPRiBvbiBjbGllbnQgY29ubmVjdGlvbiIpKSk7Ci0tLSA1ODQsNTkyIC0tLS0K ICAJCQljaCA9IHBxX3BlZWtieXRlKCk7CiAgCQkJaWYgKGNoID09IEVPRikKICAJCQl7CiEg CQkJCS8qCiEgCQkJCSAqIE9ubHkgYSBcLiB0ZXJtaW5hdG9yIGlzIGxlZ2FsIEVPRiBpbiBv bGQgcHJvdG9jb2wKISAJCQkJICovCiAgCQkJCWVyZXBvcnQoRVJST1IsCiAgCQkJCQkJKGVy cmNvZGUoRVJSQ09ERV9DT05ORUNUSU9OX0ZBSUxVUkUpLAogIAkJCQkJCSBlcnJtc2coInVu ZXhwZWN0ZWQgRU9GIG9uIGNsaWVudCBjb25uZWN0aW9uIikpKTsKKioqKioqKioqKioqKioq CioqKiA1NjUsNTc5ICoqKioKICAJCWNhc2UgQ09QWV9GSUxFOgogIAkJCWlmICghcGlja3Vw KQogIAkJCXsKISAJCQkJLyogV2UgZG9uJ3Qgd2FudCB0byBwaWNrIGl0IHVwIC0gc28gcHV0 IGl0IGJhY2sgaW4gdGhlcmUgKi8KICAJCQkJdW5nZXRjKGMsIGNvcHlfZmlsZSk7CiAgCQkJ fQohIAkJCS8qIElmIHdlIHdhbnRlZCB0byBwaWNrIGl0IHVwLCBpdCdzIGFscmVhZHkgZG9u ZSAqLwogIAkJCWJyZWFrOwogIAkJY2FzZSBDT1BZX09MRF9GRToKICAJCQlpZiAocGlja3Vw KQogIAkJCXsKISAJCQkJLyogV2Ugd2FudCB0byBwaWNrIGl0IHVwICovCiAgCQkJCSh2b2lk KSBwcV9nZXRieXRlKCk7CiAgCQkJfQogIAotLS0gNjIyLDY0MiAtLS0tCiAgCQljYXNlIENP UFlfRklMRToKICAJCQlpZiAoIXBpY2t1cCkKICAJCQl7CiEgCQkJCS8qCiEgCQkJCSAqIFdl IGRvbid0IHdhbnQgdG8gcGljayBpdCB1cCAtIHNvIHB1dCBpdCBiYWNrIGluIHRoZXJlIAoh IAkJCQkgKi8KICAJCQkJdW5nZXRjKGMsIGNvcHlfZmlsZSk7CiAgCQkJfQohIAkJCS8qCiEg CQkJICogSWYgd2Ugd2FudGVkIHRvIHBpY2sgaXQgdXAsIGl0J3MgYWxyZWFkeSBkb25lIAoh IAkJCSAqLwogIAkJCWJyZWFrOwogIAkJY2FzZSBDT1BZX09MRF9GRToKICAJCQlpZiAocGlj a3VwKQogIAkJCXsKISAJCQkJLyoKISAJCQkJICogV2Ugd2FudCB0byBwaWNrIGl0IHVwCiEg CQkJCSAqLwogIAkJCQkodm9pZCkgcHFfZ2V0Ynl0ZSgpOwogIAkJCX0KICAKKioqKioqKioq KioqKioqCioqKiA1ODUsNTk0ICoqKioKICAJCWNhc2UgQ09QWV9ORVdfRkU6CiAgCQkJaWYg KCFwaWNrdXApCiAgCQkJewohIAkJCQkvKiBXZSBkb24ndCB3YW50IHRvIHBpY2sgaXQgdXAg LSBzbyBwdXQgaXQgYmFjayBpbiB0aGVyZSAqLwogIAkJCQljb3B5X21zZ2J1Zi0+Y3Vyc29y LS07CiAgCQkJfQohIAkJCS8qIElmIHdlIHdhbnRlZCB0byBwaWNrIGl0IHVwLCBpdCdzIGFs cmVhZHkgZG9uZSAqLwogIAkJCWJyZWFrOwogIAl9CiAgfQotLS0gNjQ4LDY2MSAtLS0tCiAg CQljYXNlIENPUFlfTkVXX0ZFOgogIAkJCWlmICghcGlja3VwKQogIAkJCXsKISAJCQkJLyoK ISAJCQkJICogV2UgZG9uJ3Qgd2FudCB0byBwaWNrIGl0IHVwIC0gc28gcHV0IGl0IGJhY2sg aW4gdGhlcmUgCiEgCQkJCSAqLwogIAkJCQljb3B5X21zZ2J1Zi0+Y3Vyc29yLS07CiAgCQkJ fQohIAkJCS8qCiEgCQkJICogSWYgd2Ugd2FudGVkIHRvIHBpY2sgaXQgdXAsIGl0J3MgYWxy ZWFkeSBkb25lIAohIAkJCSAqLwogIAkJCWJyZWFrOwogIAl9CiAgfQoqKioqKioqKioqKioq KioKKioqIDY5NSw3MDEgKioqKgogIAlib29sCQliaW5hcnkgPSBmYWxzZTsKICAJYm9vbAkJ b2lkcyA9IGZhbHNlOwogIAlib29sCQljc3ZfbW9kZSA9IGZhbHNlOwohIAlib29sICAgICAg ICBoZWFkZXJfbGluZSA9IGZhbHNlOwogIAljaGFyCSAgICpkZWxpbSA9IE5VTEw7CiAgCWNo YXIJICAgKnF1b3RlID0gTlVMTDsKICAJY2hhcgkgICAqZXNjYXBlID0gTlVMTDsKLS0tIDc2 Miw3NjggLS0tLQogIAlib29sCQliaW5hcnkgPSBmYWxzZTsKICAJYm9vbAkJb2lkcyA9IGZh bHNlOwogIAlib29sCQljc3ZfbW9kZSA9IGZhbHNlOwohIAlib29sCQloZWFkZXJfbGluZSA9 IGZhbHNlOwogIAljaGFyCSAgICpkZWxpbSA9IE5VTEw7CiAgCWNoYXIJICAgKnF1b3RlID0g TlVMTDsKICAJY2hhcgkgICAqZXNjYXBlID0gTlVMTDsKKioqKioqKioqKioqKioqCioqKiA3 MDgsNzE0ICoqKioKICAJQWNsTW9kZQkJcmVxdWlyZWRfYWNjZXNzID0gKGlzX2Zyb20gPyBB Q0xfSU5TRVJUIDogQUNMX1NFTEVDVCk7CiAgCUFjbFJlc3VsdAlhY2xyZXN1bHQ7CiAgCiEg CS8qIEV4dHJhY3Qgb3B0aW9ucyBmcm9tIHRoZSBzdGF0ZW1lbnQgbm9kZSB0cmVlICovCiAg CWZvcmVhY2gob3B0aW9uLCBzdG10LT5vcHRpb25zKQogIAl7CiAgCQlEZWZFbGVtICAgICpk ZWZlbCA9IChEZWZFbGVtICopIGxmaXJzdChvcHRpb24pOwotLS0gNzc1LDc4MyAtLS0tCiAg CUFjbE1vZGUJCXJlcXVpcmVkX2FjY2VzcyA9IChpc19mcm9tID8gQUNMX0lOU0VSVCA6IEFD TF9TRUxFQ1QpOwogIAlBY2xSZXN1bHQJYWNscmVzdWx0OwogIAohIAkvKgohIAkgKiBFeHRy YWN0IG9wdGlvbnMgZnJvbSB0aGUgc3RhdGVtZW50IG5vZGUgdHJlZQohIAkgKi8KICAJZm9y ZWFjaChvcHRpb24sIHN0bXQtPm9wdGlvbnMpCiAgCXsKICAJCURlZkVsZW0gICAgKmRlZmVs ID0gKERlZkVsZW0gKikgbGZpcnN0KG9wdGlvbik7CioqKioqKioqKioqKioqKgoqKiogNzk0 LDgwMSAqKioqCiAgCQkJZm9yY2Vfbm90bnVsbCA9IChMaXN0ICopIGRlZmVsLT5hcmc7CiAg CQl9CiAgCQllbHNlCiEgCQkJZWxvZyhFUlJPUiwgIm9wdGlvbiBcIiVzXCIgbm90IHJlY29n bml6ZWQiLAohIAkJCQkgZGVmZWwtPmRlZm5hbWUpOwogIAl9CiAgCiAgCWlmIChiaW5hcnkg JiYgZGVsaW0pCi0tLSA4NjMsODY5IC0tLS0KICAJCQlmb3JjZV9ub3RudWxsID0gKExpc3Qg KikgZGVmZWwtPmFyZzsKICAJCX0KICAJCWVsc2UKISAJCQllbG9nKEVSUk9SLCAib3B0aW9u IFwiJXNcIiBub3QgcmVjb2duaXplZCIsIGRlZmVsLT5kZWZuYW1lKTsKICAJfQogIAogIAlp ZiAoYmluYXJ5ICYmIGRlbGltKQoqKioqKioqKioqKioqKioKKioqIDgxMyw4MTkgKioqKgog IAkJCQkoZXJyY29kZShFUlJDT0RFX1NZTlRBWF9FUlJPUiksCiAgCQkJCSBlcnJtc2coImNh bm5vdCBzcGVjaWZ5IE5VTEwgaW4gQklOQVJZIG1vZGUiKSkpOwogIAohIAkvKiBTZXQgZGVm YXVsdHMgKi8KICAJaWYgKCFkZWxpbSkKICAJCWRlbGltID0gY3N2X21vZGUgPyAiLCIgOiAi XHQiOwogIAotLS0gODgxLDg4OSAtLS0tCiAgCQkJCShlcnJjb2RlKEVSUkNPREVfU1lOVEFY X0VSUk9SKSwKICAJCQkJIGVycm1zZygiY2Fubm90IHNwZWNpZnkgTlVMTCBpbiBCSU5BUlkg bW9kZSIpKSk7CiAgCiEgCS8qCiEgCSAqIFNldCBkZWZhdWx0cwohIAkgKi8KICAJaWYgKCFk ZWxpbSkKICAJCWRlbGltID0gY3N2X21vZGUgPyAiLCIgOiAiXHQiOwogIAoqKioqKioqKioq KioqKioKKioqIDgyOCw4NDYgKioqKgogIAkJCWVzY2FwZSA9IHF1b3RlOwogIAl9CiAgCiEg CS8qIE9ubHkgc2luZ2xlLWNoYXJhY3RlciBkZWxpbWl0ZXIgc3RyaW5ncyBhcmUgc3VwcG9y dGVkLiAqLwogIAlpZiAoc3RybGVuKGRlbGltKSAhPSAxKQogIAkJZXJlcG9ydChFUlJPUiwK ICAJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAogIAkJCQkg ZXJybXNnKCJDT1BZIGRlbGltaXRlciBtdXN0IGJlIGEgc2luZ2xlIGNoYXJhY3RlciIpKSk7 CiAgCiEgICAJLyogQ2hlY2sgaGVhZGVyICovCiAgCWlmICghY3N2X21vZGUgJiYgaGVhZGVy X2xpbmUpCiAgCQllcmVwb3J0KEVSUk9SLAogIAkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRV UkVfTk9UX1NVUFBPUlRFRCksCiAgCQkJCSBlcnJtc2coIkNPUFkgSEVBREVSIGF2YWlsYWJs ZSBvbmx5IGluIENTViBtb2RlIikpKTsKICAKISAJLyogQ2hlY2sgcXVvdGUgKi8KICAJaWYg KCFjc3ZfbW9kZSAmJiBxdW90ZSAhPSBOVUxMKQogIAkJZXJlcG9ydChFUlJPUiwKICAJCQkJ KGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAotLS0gODk4LDkyMiAt LS0tCiAgCQkJZXNjYXBlID0gcXVvdGU7CiAgCX0KICAKISAJLyoKISAJICogT25seSBzaW5n bGUtY2hhcmFjdGVyIGRlbGltaXRlciBzdHJpbmdzIGFyZSBzdXBwb3J0ZWQuCiEgCSAqLwog IAlpZiAoc3RybGVuKGRlbGltKSAhPSAxKQogIAkJZXJlcG9ydChFUlJPUiwKICAJCQkJKGVy cmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAogIAkJCQkgZXJybXNnKCJD T1BZIGRlbGltaXRlciBtdXN0IGJlIGEgc2luZ2xlIGNoYXJhY3RlciIpKSk7CiAgCiEgCS8q CiEgCSAqIENoZWNrIGhlYWRlcgohIAkgKi8KICAJaWYgKCFjc3ZfbW9kZSAmJiBoZWFkZXJf bGluZSkKICAJCWVyZXBvcnQoRVJST1IsCiAgCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVS RV9OT1RfU1VQUE9SVEVEKSwKICAJCQkJIGVycm1zZygiQ09QWSBIRUFERVIgYXZhaWxhYmxl IG9ubHkgaW4gQ1NWIG1vZGUiKSkpOwogIAohIAkvKgohIAkgKiBDaGVjayBxdW90ZQohIAkg Ki8KICAJaWYgKCFjc3ZfbW9kZSAmJiBxdW90ZSAhPSBOVUxMKQogIAkJZXJlcG9ydChFUlJP UiwKICAJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAoqKioq KioqKioqKioqKioKKioqIDg1MSw4NTcgKioqKgogIAkJCQkoZXJyY29kZShFUlJDT0RFX0ZF QVRVUkVfTk9UX1NVUFBPUlRFRCksCiAgCQkJCSBlcnJtc2coIkNPUFkgcXVvdGUgbXVzdCBi ZSBhIHNpbmdsZSBjaGFyYWN0ZXIiKSkpOwogIAohIAkvKiBDaGVjayBlc2NhcGUgKi8KICAJ aWYgKCFjc3ZfbW9kZSAmJiBlc2NhcGUgIT0gTlVMTCkKICAJCWVyZXBvcnQoRVJST1IsCiAg CQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKLS0tIDkyNyw5 MzUgLS0tLQogIAkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCks CiAgCQkJCSBlcnJtc2coIkNPUFkgcXVvdGUgbXVzdCBiZSBhIHNpbmdsZSBjaGFyYWN0ZXIi KSkpOwogIAohIAkvKgohIAkgKiBDaGVjayBlc2NhcGUKISAJICovCiAgCWlmICghY3N2X21v ZGUgJiYgZXNjYXBlICE9IE5VTEwpCiAgCQllcmVwb3J0KEVSUk9SLAogIAkJCQkoZXJyY29k ZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCioqKioqKioqKioqKioqKgoqKiog ODYyLDg2OCAqKioqCiAgCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9S VEVEKSwKICAJCQkJIGVycm1zZygiQ09QWSBlc2NhcGUgbXVzdCBiZSBhIHNpbmdsZSBjaGFy YWN0ZXIiKSkpOwogIAohIAkvKiBDaGVjayBmb3JjZV9xdW90ZSAqLwogIAlpZiAoIWNzdl9t b2RlICYmIGZvcmNlX3F1b3RlICE9IE5JTCkKICAJCWVyZXBvcnQoRVJST1IsCiAgCQkJCShl cnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKLS0tIDk0MCw5NDggLS0t LQogIAkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCiAgCQkJ CSBlcnJtc2coIkNPUFkgZXNjYXBlIG11c3QgYmUgYSBzaW5nbGUgY2hhcmFjdGVyIikpKTsK ICAKISAJLyoKISAJICogQ2hlY2sgZm9yY2VfcXVvdGUKISAJICovCiAgCWlmICghY3N2X21v ZGUgJiYgZm9yY2VfcXVvdGUgIT0gTklMKQogIAkJZXJlcG9ydChFUlJPUiwKICAJCQkJKGVy cmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAoqKioqKioqKioqKioqKioK KioqIDg3MCw5MDkgKioqKgogIAlpZiAoZm9yY2VfcXVvdGUgIT0gTklMICYmIGlzX2Zyb20p CiAgCQllcmVwb3J0KEVSUk9SLAogIAkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9U X1NVUFBPUlRFRCksCiEgCQkJICAgZXJybXNnKCJDT1BZIGZvcmNlIHF1b3RlIG9ubHkgYXZh aWxhYmxlIHVzaW5nIENPUFkgVE8iKSkpOwogIAohIAkvKiBDaGVjayBmb3JjZV9ub3RudWxs ICovCiAgCWlmICghY3N2X21vZGUgJiYgZm9yY2Vfbm90bnVsbCAhPSBOSUwpCiAgCQllcmVw b3J0KEVSUk9SLAogIAkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRF RCksCiEgCQkJICBlcnJtc2coIkNPUFkgZm9yY2Ugbm90IG51bGwgYXZhaWxhYmxlIG9ubHkg aW4gQ1NWIG1vZGUiKSkpOwogIAlpZiAoZm9yY2Vfbm90bnVsbCAhPSBOSUwgJiYgIWlzX2Zy b20pCiAgCQllcmVwb3J0KEVSUk9SLAogIAkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVf Tk9UX1NVUFBPUlRFRCksCiEgCQkgIGVycm1zZygiQ09QWSBmb3JjZSBub3QgbnVsbCBvbmx5 IGF2YWlsYWJsZSB1c2luZyBDT1BZIEZST00iKSkpOwogIAohIAkvKiBEb24ndCBhbGxvdyB0 aGUgZGVsaW1pdGVyIHRvIGFwcGVhciBpbiB0aGUgbnVsbCBzdHJpbmcuICovCiAgCWlmIChz dHJjaHIobnVsbF9wcmludCwgZGVsaW1bMF0pICE9IE5VTEwpCiAgCQllcmVwb3J0KEVSUk9S LAogIAkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCiEgCQkJ CSBlcnJtc2coIkNPUFkgZGVsaW1pdGVyIG11c3Qgbm90IGFwcGVhciBpbiB0aGUgTlVMTCBz cGVjaWZpY2F0aW9uIikpKTsKICAKISAJLyogRG9uJ3QgYWxsb3cgdGhlIGNzdiBxdW90ZSBj aGFyIHRvIGFwcGVhciBpbiB0aGUgbnVsbCBzdHJpbmcuICovCiAgCWlmIChjc3ZfbW9kZSAm JiBzdHJjaHIobnVsbF9wcmludCwgcXVvdGVbMF0pICE9IE5VTEwpCiAgCQllcmVwb3J0KEVS Uk9SLAogIAkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCiEg CQkJCSBlcnJtc2coIkNTViBxdW90ZSBjaGFyYWN0ZXIgbXVzdCBub3QgYXBwZWFyIGluIHRo ZSBOVUxMIHNwZWNpZmljYXRpb24iKSkpOwogIAohIAkvKiBPcGVuIGFuZCBsb2NrIHRoZSBy ZWxhdGlvbiwgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIGxvY2sgdHlwZS4gKi8KISAJcmVsID0g aGVhcF9vcGVucnYocmVsYXRpb24sIChpc19mcm9tID8gUm93RXhjbHVzaXZlTG9jayA6IEFj Y2Vzc1NoYXJlTG9jaykpOwogIAohIAkvKiBjaGVjayByZWFkLW9ubHkgdHJhbnNhY3Rpb24g Ki8KISAJaWYgKFhhY3RSZWFkT25seSAmJiAhaXNfZnJvbSAmJiAhaXNUZW1wTmFtZXNwYWNl KFJlbGF0aW9uR2V0TmFtZXNwYWNlKHJlbCkpKQogIAkJZXJlcG9ydChFUlJPUiwKICAJCQkJ KGVycmNvZGUoRVJSQ09ERV9SRUFEX09OTFlfU1FMX1RSQU5TQUNUSU9OKSwKICAJCQkJIGVy cm1zZygidHJhbnNhY3Rpb24gaXMgcmVhZC1vbmx5IikpKTsKICAKISAJLyogQ2hlY2sgcGVy bWlzc2lvbnMuICovCiAgCWFjbHJlc3VsdCA9IHBnX2NsYXNzX2FjbGNoZWNrKFJlbGF0aW9u R2V0UmVsaWQocmVsKSwgR2V0VXNlcklkKCksCiAgCQkJCQkJCQkgIHJlcXVpcmVkX2FjY2Vz cyk7CiAgCWlmIChhY2xyZXN1bHQgIT0gQUNMQ0hFQ0tfT0spCi0tLSA5NTAsMTAwNiAtLS0t CiAgCWlmIChmb3JjZV9xdW90ZSAhPSBOSUwgJiYgaXNfZnJvbSkKICAJCWVyZXBvcnQoRVJS T1IsCiAgCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKISAJ CQkJIGVycm1zZygiQ09QWSBmb3JjZSBxdW90ZSBvbmx5IGF2YWlsYWJsZSB1c2luZyBDT1BZ IFRPIikpKTsKICAKISAJLyoKISAJICogQ2hlY2sgZm9yY2Vfbm90bnVsbAohIAkgKi8KICAJ aWYgKCFjc3ZfbW9kZSAmJiBmb3JjZV9ub3RudWxsICE9IE5JTCkKICAJCWVyZXBvcnQoRVJS T1IsCiAgCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKISAJ CQkJIGVycm1zZygiQ09QWSBmb3JjZSBub3QgbnVsbCBhdmFpbGFibGUgb25seSBpbiBDU1Yg bW9kZSIpKSk7CiAgCWlmIChmb3JjZV9ub3RudWxsICE9IE5JTCAmJiAhaXNfZnJvbSkKICAJ CWVyZXBvcnQoRVJST1IsCiAgCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQ UE9SVEVEKSwKISAJCQkJIGVycm1zZwohIAkJCQkgKCJDT1BZIGZvcmNlIG5vdCBudWxsIG9u bHkgYXZhaWxhYmxlIHVzaW5nIENPUFkgRlJPTSIpKSk7CiAgCiEgCS8qCiEgCSAqIERvbid0 IGFsbG93IHRoZSBkZWxpbWl0ZXIgdG8gYXBwZWFyIGluIHRoZSBudWxsIHN0cmluZy4gCiEg CSAqLwogIAlpZiAoc3RyY2hyKG51bGxfcHJpbnQsIGRlbGltWzBdKSAhPSBOVUxMKQogIAkJ ZXJlcG9ydChFUlJPUiwKICAJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQ T1JURUQpLAohIAkJCQkgZXJybXNnCiEgCQkJCSAoIkNPUFkgZGVsaW1pdGVyIG11c3Qgbm90 IGFwcGVhciBpbiB0aGUgTlVMTCBzcGVjaWZpY2F0aW9uIikpKTsKICAKISAJLyoKISAJICog RG9uJ3QgYWxsb3cgdGhlIGNzdiBxdW90ZSBjaGFyIHRvIGFwcGVhciBpbiB0aGUgbnVsbCBz dHJpbmcuIAohIAkgKi8KICAJaWYgKGNzdl9tb2RlICYmIHN0cmNocihudWxsX3ByaW50LCBx dW90ZVswXSkgIT0gTlVMTCkKICAJCWVyZXBvcnQoRVJST1IsCiAgCQkJCShlcnJjb2RlKEVS UkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKISAJCQkJIGVycm1zZwohIAkJCQkgKCJD U1YgcXVvdGUgY2hhcmFjdGVyIG11c3Qgbm90IGFwcGVhciBpbiB0aGUgTlVMTCBzcGVjaWZp Y2F0aW9uIikpKTsKICAKISAJLyoKISAJICogT3BlbiBhbmQgbG9jayB0aGUgcmVsYXRpb24s IHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBsb2NrIHR5cGUuCiEgCSAqLwohIAlyZWwgPQohIAkJ aGVhcF9vcGVucnYocmVsYXRpb24sIChpc19mcm9tID8gUm93RXhjbHVzaXZlTG9jayA6IEFj Y2Vzc1NoYXJlTG9jaykpOwogIAohIAkvKgohIAkgKiBjaGVjayByZWFkLW9ubHkgdHJhbnNh Y3Rpb24KISAJICovCiEgCWlmIChYYWN0UmVhZE9ubHkgJiYgIWlzX2Zyb20KISAJCSYmICFp c1RlbXBOYW1lc3BhY2UoUmVsYXRpb25HZXROYW1lc3BhY2UocmVsKSkpCiAgCQllcmVwb3J0 KEVSUk9SLAogIAkJCQkoZXJyY29kZShFUlJDT0RFX1JFQURfT05MWV9TUUxfVFJBTlNBQ1RJ T04pLAogIAkJCQkgZXJybXNnKCJ0cmFuc2FjdGlvbiBpcyByZWFkLW9ubHkiKSkpOwogIAoh IAkvKgohIAkgKiBDaGVjayBwZXJtaXNzaW9ucy4KISAJICovCiAgCWFjbHJlc3VsdCA9IHBn X2NsYXNzX2FjbGNoZWNrKFJlbGF0aW9uR2V0UmVsaWQocmVsKSwgR2V0VXNlcklkKCksCiAg CQkJCQkJCQkgIHJlcXVpcmVkX2FjY2Vzcyk7CiAgCWlmIChhY2xyZXN1bHQgIT0gQUNMQ0hF Q0tfT0spCioqKioqKioqKioqKioqKgoqKiogOTE0LDkzMiAqKioqCiAgCQkJCShlcnJjb2Rl KEVSUkNPREVfSU5TVUZGSUNJRU5UX1BSSVZJTEVHRSksCiAgCQkJCSBlcnJtc2coIm11c3Qg YmUgc3VwZXJ1c2VyIHRvIENPUFkgdG8gb3IgZnJvbSBhIGZpbGUiKSwKICAJCQkJIGVycmhp bnQoIkFueW9uZSBjYW4gQ09QWSB0byBzdGRvdXQgb3IgZnJvbSBzdGRpbi4gIgohIAkJCQkJ ICAgInBzcWwncyBcXGNvcHkgY29tbWFuZCBhbHNvIHdvcmtzIGZvciBhbnlvbmUuIikpKTsK ICAKISAJLyogRG9uJ3QgYWxsb3cgQ09QWSB3LyBPSURzIHRvIG9yIGZyb20gYSB0YWJsZSB3 aXRob3V0IHRoZW0gKi8KICAJaWYgKG9pZHMgJiYgIXJlbC0+cmRfcmVsLT5yZWxoYXNvaWRz KQogIAkJZXJlcG9ydChFUlJPUiwKICAJCQkJKGVycmNvZGUoRVJSQ09ERV9VTkRFRklORURf Q09MVU1OKSwKICAJCQkJIGVycm1zZygidGFibGUgXCIlc1wiIGRvZXMgbm90IGhhdmUgT0lE cyIsCiAgCQkJCQkJUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUocmVsKSkpKTsKICAKISAJLyog R2VuZXJhdGUgb3IgY29udmVydCBsaXN0IG9mIGF0dHJpYnV0ZXMgdG8gcHJvY2VzcyAqLwog IAlhdHRudW1saXN0ID0gQ29weUdldEF0dG51bXMocmVsLCBhdHRuYW1lbGlzdCk7CiAgCiEg CS8qIENoZWNrIHRoYXQgRk9SQ0UgUVVPVEUgcmVmZXJlbmNlcyB2YWxpZCBDT1BZIGNvbHVt bnMgKi8KICAJaWYgKGZvcmNlX3F1b3RlKQogIAl7CiAgCQlUdXBsZURlc2MJdHVwRGVzYyA9 IFJlbGF0aW9uR2V0RGVzY3IocmVsKTsKLS0tIDEwMTEsMTAzNSAtLS0tCiAgCQkJCShlcnJj b2RlKEVSUkNPREVfSU5TVUZGSUNJRU5UX1BSSVZJTEVHRSksCiAgCQkJCSBlcnJtc2coIm11 c3QgYmUgc3VwZXJ1c2VyIHRvIENPUFkgdG8gb3IgZnJvbSBhIGZpbGUiKSwKICAJCQkJIGVy cmhpbnQoIkFueW9uZSBjYW4gQ09QWSB0byBzdGRvdXQgb3IgZnJvbSBzdGRpbi4gIgohIAkJ CQkJCSAicHNxbCdzIFxcY29weSBjb21tYW5kIGFsc28gd29ya3MgZm9yIGFueW9uZS4iKSkp OwogIAohIAkvKgohIAkgKiBEb24ndCBhbGxvdyBDT1BZIHcvIE9JRHMgdG8gb3IgZnJvbSBh IHRhYmxlIHdpdGhvdXQgdGhlbSAKISAJICovCiAgCWlmIChvaWRzICYmICFyZWwtPnJkX3Jl bC0+cmVsaGFzb2lkcykKICAJCWVyZXBvcnQoRVJST1IsCiAgCQkJCShlcnJjb2RlKEVSUkNP REVfVU5ERUZJTkVEX0NPTFVNTiksCiAgCQkJCSBlcnJtc2coInRhYmxlIFwiJXNcIiBkb2Vz IG5vdCBoYXZlIE9JRHMiLAogIAkJCQkJCVJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKHJlbCkp KSk7CiAgCiEgCS8qCiEgCSAqIEdlbmVyYXRlIG9yIGNvbnZlcnQgbGlzdCBvZiBhdHRyaWJ1 dGVzIHRvIHByb2Nlc3MKISAJICovCiAgCWF0dG51bWxpc3QgPSBDb3B5R2V0QXR0bnVtcyhy ZWwsIGF0dG5hbWVsaXN0KTsKICAKISAJLyoKISAJICogQ2hlY2sgdGhhdCBGT1JDRSBRVU9U RSByZWZlcmVuY2VzIHZhbGlkIENPUFkgY29sdW1ucwohIAkgKi8KICAJaWYgKGZvcmNlX3F1 b3RlKQogIAl7CiAgCQlUdXBsZURlc2MJdHVwRGVzYyA9IFJlbGF0aW9uR2V0RGVzY3IocmVs KTsKKioqKioqKioqKioqKioqCioqKiA5NDIsOTUzICoqKioKICAJCQlpZiAoIWxpc3RfbWVt YmVyX2ludChhdHRudW1saXN0LCBhdHRudW0pKQogIAkJCQllcmVwb3J0KEVSUk9SLAogIAkJ CQkJCShlcnJjb2RlKEVSUkNPREVfSU5WQUxJRF9DT0xVTU5fUkVGRVJFTkNFKSwKISAJCQkJ ZXJybXNnKCJGT1JDRSBRVU9URSBjb2x1bW4gXCIlc1wiIG5vdCByZWZlcmVuY2VkIGJ5IENP UFkiLAohIAkJCQkJICAgTmFtZVN0cihhdHRyW2F0dG51bSAtIDFdLT5hdHRuYW1lKSkpKTsK ICAJCX0KICAJfQogIAohIAkvKiBDaGVjayB0aGF0IEZPUkNFIE5PVCBOVUxMIHJlZmVyZW5j ZXMgdmFsaWQgQ09QWSBjb2x1bW5zICovCiAgCWlmIChmb3JjZV9ub3RudWxsKQogIAl7CiAg CQlMaXN0Q2VsbCAgICpjdXI7Ci0tLSAxMDQ1LDEwNTkgLS0tLQogIAkJCWlmICghbGlzdF9t ZW1iZXJfaW50KGF0dG51bWxpc3QsIGF0dG51bSkpCiAgCQkJCWVyZXBvcnQoRVJST1IsCiAg CQkJCQkJKGVycmNvZGUoRVJSQ09ERV9JTlZBTElEX0NPTFVNTl9SRUZFUkVOQ0UpLAohIAkJ CQkJCSBlcnJtc2cKISAJCQkJCQkgKCJGT1JDRSBRVU9URSBjb2x1bW4gXCIlc1wiIG5vdCBy ZWZlcmVuY2VkIGJ5IENPUFkiLAohIAkJCQkJCSAgTmFtZVN0cihhdHRyW2F0dG51bSAtIDFd LT5hdHRuYW1lKSkpKTsKICAJCX0KICAJfQogIAohIAkvKgohIAkgKiBDaGVjayB0aGF0IEZP UkNFIE5PVCBOVUxMIHJlZmVyZW5jZXMgdmFsaWQgQ09QWSBjb2x1bW5zCiEgCSAqLwogIAlp ZiAoZm9yY2Vfbm90bnVsbCkKICAJewogIAkJTGlzdENlbGwgICAqY3VyOwoqKioqKioqKioq KioqKioKKioqIDk2Myw5NzQgKioqKgogIAkJCWlmICghbGlzdF9tZW1iZXJfaW50KGF0dG51 bWxpc3QsIGF0dG51bSkpCiAgCQkJCWVyZXBvcnQoRVJST1IsCiAgCQkJCQkJKGVycmNvZGUo RVJSQ09ERV9JTlZBTElEX0NPTFVNTl9SRUZFUkVOQ0UpLAohIAkJCQkJCSBlcnJtc2coIkZP UkNFIE5PVCBOVUxMIGNvbHVtbiBcIiVzXCIgbm90IHJlZmVyZW5jZWQgYnkgQ09QWSIsCiEg CQkJCQkJCQlOYW1lU3RyKGF0dHJbYXR0bnVtIC0gMV0tPmF0dG5hbWUpKSkpOwogIAkJfQog IAl9CiAgCiEgCS8qIFNldCB1cCB2YXJpYWJsZXMgdG8gYXZvaWQgcGVyLWF0dHJpYnV0ZSBv dmVyaGVhZC4gKi8KICAJaW5pdFN0cmluZ0luZm8oJmF0dHJpYnV0ZV9idWYpOwogIAlpbml0 U3RyaW5nSW5mbygmbGluZV9idWYpOwogIAlsaW5lX2J1Zl9jb252ZXJ0ZWQgPSBmYWxzZTsK LS0tIDEwNjksMTA4MyAtLS0tCiAgCQkJaWYgKCFsaXN0X21lbWJlcl9pbnQoYXR0bnVtbGlz dCwgYXR0bnVtKSkKICAJCQkJZXJlcG9ydChFUlJPUiwKICAJCQkJCQkoZXJyY29kZShFUlJD T0RFX0lOVkFMSURfQ09MVU1OX1JFRkVSRU5DRSksCiEgCQkJCQkJIGVycm1zZwohIAkJCQkJ CSAoIkZPUkNFIE5PVCBOVUxMIGNvbHVtbiBcIiVzXCIgbm90IHJlZmVyZW5jZWQgYnkgQ09Q WSIsCiEgCQkJCQkJICBOYW1lU3RyKGF0dHJbYXR0bnVtIC0gMV0tPmF0dG5hbWUpKSkpOwog IAkJfQogIAl9CiAgCiEgCS8qCiEgCSAqIFNldCB1cCB2YXJpYWJsZXMgdG8gYXZvaWQgcGVy LWF0dHJpYnV0ZSBvdmVyaGVhZC4KISAJICovCiAgCWluaXRTdHJpbmdJbmZvKCZhdHRyaWJ1 dGVfYnVmKTsKICAJaW5pdFN0cmluZ0luZm8oJmxpbmVfYnVmKTsKICAJbGluZV9idWZfY29u dmVydGVkID0gZmFsc2U7CioqKioqKioqKioqKioqKgoqKiogOTk4LDEwMDUgKioqKgogIAkJ CWVsc2UKICAJCQkJZXJlcG9ydChFUlJPUiwKICAJCQkJCQkoZXJyY29kZShFUlJDT0RFX1dS T05HX09CSkVDVF9UWVBFKSwKISAJCQkJCSAgIGVycm1zZygiY2Fubm90IGNvcHkgdG8gbm9u LXRhYmxlIHJlbGF0aW9uIFwiJXNcIiIsCiEgCQkJCQkJCSAgUmVsYXRpb25HZXRSZWxhdGlv bk5hbWUocmVsKSkpKTsKICAJCX0KICAJCWlmIChwaXBlKQogIAkJewotLS0gMTEwNywxMTE0 IC0tLS0KICAJCQllbHNlCiAgCQkJCWVyZXBvcnQoRVJST1IsCiAgCQkJCQkJKGVycmNvZGUo RVJSQ09ERV9XUk9OR19PQkpFQ1RfVFlQRSksCiEgCQkJCQkJIGVycm1zZygiY2Fubm90IGNv cHkgdG8gbm9uLXRhYmxlIHJlbGF0aW9uIFwiJXNcIiIsCiEgCQkJCQkJCQlSZWxhdGlvbkdl dFJlbGF0aW9uTmFtZShyZWwpKSkpOwogIAkJfQogIAkJaWYgKHBpcGUpCiAgCQl7CioqKioq KioqKioqKioqKgoqKiogMTAxNywxMDI0ICoqKioKICAJCQlpZiAoY29weV9maWxlID09IE5V TEwpCiAgCQkJCWVyZXBvcnQoRVJST1IsCiAgCQkJCQkJKGVycmNvZGVfZm9yX2ZpbGVfYWNj ZXNzKCksCiEgCQkJCQkgZXJybXNnKCJjb3VsZCBub3Qgb3BlbiBmaWxlIFwiJXNcIiBmb3Ig cmVhZGluZzogJW0iLAohIAkJCQkJCQlmaWxlbmFtZSkpKTsKICAKICAJCQlmc3RhdChmaWxl bm8oY29weV9maWxlKSwgJnN0KTsKICAJCQlpZiAoU19JU0RJUihzdC5zdF9tb2RlKSkKLS0t IDExMjYsMTEzMyAtLS0tCiAgCQkJaWYgKGNvcHlfZmlsZSA9PSBOVUxMKQogIAkJCQllcmVw b3J0KEVSUk9SLAogIAkJCQkJCShlcnJjb2RlX2Zvcl9maWxlX2FjY2VzcygpLAohIAkJCQkJ CSBlcnJtc2coImNvdWxkIG5vdCBvcGVuIGZpbGUgXCIlc1wiIGZvciByZWFkaW5nOiAlbSIs CiEgCQkJCQkJCQlmaWxlbmFtZSkpKTsKICAKICAJCQlmc3RhdChmaWxlbm8oY29weV9maWxl KSwgJnN0KTsKICAJCQlpZiAoU19JU0RJUihzdC5zdF9tb2RlKSkKKioqKioqKioqKioqKioq CioqKiAxMDQ5LDEwNTYgKioqKgogIAkJCWVsc2UKICAJCQkJZXJlcG9ydChFUlJPUiwKICAJ CQkJCQkoZXJyY29kZShFUlJDT0RFX1dST05HX09CSkVDVF9UWVBFKSwKISAJCQkJCSBlcnJt c2coImNhbm5vdCBjb3B5IGZyb20gbm9uLXRhYmxlIHJlbGF0aW9uIFwiJXNcIiIsCiEgCQkJ CQkJCVJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKHJlbCkpKSk7CiAgCQl9CiAgCQlpZiAocGlw ZSkKICAJCXsKLS0tIDExNTgsMTE2NSAtLS0tCiAgCQkJZWxzZQogIAkJCQllcmVwb3J0KEVS Uk9SLAogIAkJCQkJCShlcnJjb2RlKEVSUkNPREVfV1JPTkdfT0JKRUNUX1RZUEUpLAohIAkJ CQkJCSBlcnJtc2coImNhbm5vdCBjb3B5IGZyb20gbm9uLXRhYmxlIHJlbGF0aW9uIFwiJXNc IiIsCiEgCQkJCQkJCQlSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShyZWwpKSkpOwogIAkJfQog IAkJaWYgKHBpcGUpCiAgCQl7CioqKioqKioqKioqKioqKgoqKiogMTA3MSwxMDc3ICoqKioK ICAJCQlpZiAoIWlzX2Fic29sdXRlX3BhdGgoZmlsZW5hbWUpKQogIAkJCQllcmVwb3J0KEVS Uk9SLAogIAkJCQkJCShlcnJjb2RlKEVSUkNPREVfSU5WQUxJRF9OQU1FKSwKISAJCQkJICBl cnJtc2coInJlbGF0aXZlIHBhdGggbm90IGFsbG93ZWQgZm9yIENPUFkgdG8gZmlsZSIpKSk7 CiAgCiAgCQkJb3VtYXNrID0gdW1hc2soKG1vZGVfdCkgMDIyKTsKICAJCQljb3B5X2ZpbGUg PSBBbGxvY2F0ZUZpbGUoZmlsZW5hbWUsIFBHX0JJTkFSWV9XKTsKLS0tIDExODAsMTE4NyAt LS0tCiAgCQkJaWYgKCFpc19hYnNvbHV0ZV9wYXRoKGZpbGVuYW1lKSkKICAJCQkJZXJlcG9y dChFUlJPUiwKICAJCQkJCQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURfTkFNRSksCiEgCQkJ CQkJIGVycm1zZwohIAkJCQkJCSAoInJlbGF0aXZlIHBhdGggbm90IGFsbG93ZWQgZm9yIENP UFkgdG8gZmlsZSIpKSk7CiAgCiAgCQkJb3VtYXNrID0gdW1hc2soKG1vZGVfdCkgMDIyKTsK ICAJCQljb3B5X2ZpbGUgPSBBbGxvY2F0ZUZpbGUoZmlsZW5hbWUsIFBHX0JJTkFSWV9XKTsK KioqKioqKioqKioqKioqCioqKiAxMDgwLDEwODcgKioqKgogIAkJCWlmIChjb3B5X2ZpbGUg PT0gTlVMTCkKICAJCQkJZXJlcG9ydChFUlJPUiwKICAJCQkJCQkoZXJyY29kZV9mb3JfZmls ZV9hY2Nlc3MoKSwKISAJCQkJCSBlcnJtc2coImNvdWxkIG5vdCBvcGVuIGZpbGUgXCIlc1wi IGZvciB3cml0aW5nOiAlbSIsCiEgCQkJCQkJCWZpbGVuYW1lKSkpOwogIAogIAkJCWZzdGF0 KGZpbGVubyhjb3B5X2ZpbGUpLCAmc3QpOwogIAkJCWlmIChTX0lTRElSKHN0LnN0X21vZGUp KQotLS0gMTE5MCwxMTk3IC0tLS0KICAJCQlpZiAoY29weV9maWxlID09IE5VTEwpCiAgCQkJ CWVyZXBvcnQoRVJST1IsCiAgCQkJCQkJKGVycmNvZGVfZm9yX2ZpbGVfYWNjZXNzKCksCiEg CQkJCQkJIGVycm1zZygiY291bGQgbm90IG9wZW4gZmlsZSBcIiVzXCIgZm9yIHdyaXRpbmc6 ICVtIiwKISAJCQkJCQkJCWZpbGVuYW1lKSkpOwogIAogIAkJCWZzdGF0KGZpbGVubyhjb3B5 X2ZpbGUpLCAmc3QpOwogIAkJCWlmIChTX0lTRElSKHN0LnN0X21vZGUpKQoqKioqKioqKioq KioqKioKKioqIDEwOTksMTExMCAqKioqCiAgCiAgCWlmICghcGlwZSkKICAJewohIAkJLyog d2UgYXNzdW1lIG9ubHkgdGhlIHdyaXRlIGNhc2UgY291bGQgZmFpbCBoZXJlICovCiAgCQlp ZiAoRnJlZUZpbGUoY29weV9maWxlKSkKICAJCQllcmVwb3J0KEVSUk9SLAogIAkJCQkJKGVy cmNvZGVfZm9yX2ZpbGVfYWNjZXNzKCksCiEgCQkJCQkgZXJybXNnKCJjb3VsZCBub3Qgd3Jp dGUgdG8gZmlsZSBcIiVzXCI6ICVtIiwKISAJCQkJCQkJZmlsZW5hbWUpKSk7CiAgCX0KICAJ cGZyZWUoYXR0cmlidXRlX2J1Zi5kYXRhKTsKICAJcGZyZWUobGluZV9idWYuZGF0YSk7Ci0t LSAxMjA5LDEyMjEgLS0tLQogIAogIAlpZiAoIXBpcGUpCiAgCXsKISAJCS8qCiEgCQkgKiB3 ZSBhc3N1bWUgb25seSB0aGUgd3JpdGUgY2FzZSBjb3VsZCBmYWlsIGhlcmUKISAJCSAqLwog IAkJaWYgKEZyZWVGaWxlKGNvcHlfZmlsZSkpCiAgCQkJZXJlcG9ydChFUlJPUiwKICAJCQkJ CShlcnJjb2RlX2Zvcl9maWxlX2FjY2VzcygpLAohIAkJCQkJIGVycm1zZygiY291bGQgbm90 IHdyaXRlIHRvIGZpbGUgXCIlc1wiOiAlbSIsIGZpbGVuYW1lKSkpOwogIAl9CiAgCXBmcmVl KGF0dHJpYnV0ZV9idWYuZGF0YSk7CiAgCXBmcmVlKGxpbmVfYnVmLmRhdGEpOwoqKioqKioq KioqKioqKioKKioqIDExNzgsMTE4NCAqKioqCiAgCW51bV9waHlzX2F0dHJzID0gdHVwRGVz Yy0+bmF0dHM7CiAgCWF0dHJfY291bnQgPSBsaXN0X2xlbmd0aChhdHRudW1saXN0KTsKICAK ISAJLyogR2V0IGluZm8gYWJvdXQgdGhlIGNvbHVtbnMgd2UgbmVlZCB0byBwcm9jZXNzLiAq LwogIAlvdXRfZnVuY3Rpb25zID0gKEZtZ3JJbmZvICopIHBhbGxvYyhudW1fcGh5c19hdHRy cyAqIHNpemVvZihGbWdySW5mbykpOwogIAlmb3JjZV9xdW90ZSA9IChib29sICopIHBhbGxv YyhudW1fcGh5c19hdHRycyAqIHNpemVvZihib29sKSk7CiAgCWZvcmVhY2goY3VyLCBhdHRu dW1saXN0KQotLS0gMTI4OSwxMjk3IC0tLS0KICAJbnVtX3BoeXNfYXR0cnMgPSB0dXBEZXNj LT5uYXR0czsKICAJYXR0cl9jb3VudCA9IGxpc3RfbGVuZ3RoKGF0dG51bWxpc3QpOwogIAoh IAkvKgohIAkgKiBHZXQgaW5mbyBhYm91dCB0aGUgY29sdW1ucyB3ZSBuZWVkIHRvIHByb2Nl c3MuCiEgCSAqLwogIAlvdXRfZnVuY3Rpb25zID0gKEZtZ3JJbmZvICopIHBhbGxvYyhudW1f cGh5c19hdHRycyAqIHNpemVvZihGbWdySW5mbykpOwogIAlmb3JjZV9xdW90ZSA9IChib29s ICopIHBhbGxvYyhudW1fcGh5c19hdHRycyAqIHNpemVvZihib29sKSk7CiAgCWZvcmVhY2go Y3VyLCBhdHRudW1saXN0KQoqKioqKioqKioqKioqKioKKioqIDExODksMTIwMCAqKioqCiAg CiAgCQlpZiAoYmluYXJ5KQogIAkJCWdldFR5cGVCaW5hcnlPdXRwdXRJbmZvKGF0dHJbYXR0 bnVtIC0gMV0tPmF0dHR5cGlkLAohIAkJCQkJCQkJCSZvdXRfZnVuY19vaWQsCiEgCQkJCQkJ CQkJJmlzdmFybGVuYSk7CiAgCQllbHNlCiAgCQkJZ2V0VHlwZU91dHB1dEluZm8oYXR0clth dHRudW0gLSAxXS0+YXR0dHlwaWQsCiEgCQkJCQkJCSAgJm91dF9mdW5jX29pZCwKISAJCQkJ CQkJICAmaXN2YXJsZW5hKTsKICAJCWZtZ3JfaW5mbyhvdXRfZnVuY19vaWQsICZvdXRfZnVu Y3Rpb25zW2F0dG51bSAtIDFdKTsKICAKICAJCWlmIChsaXN0X21lbWJlcl9pbnQoZm9yY2Vf cXVvdGVfYXR0cywgYXR0bnVtKSkKLS0tIDEzMDIsMTMxMSAtLS0tCiAgCiAgCQlpZiAoYmlu YXJ5KQogIAkJCWdldFR5cGVCaW5hcnlPdXRwdXRJbmZvKGF0dHJbYXR0bnVtIC0gMV0tPmF0 dHR5cGlkLAohIAkJCQkJCQkJCSZvdXRfZnVuY19vaWQsICZpc3ZhcmxlbmEpOwogIAkJZWxz ZQogIAkJCWdldFR5cGVPdXRwdXRJbmZvKGF0dHJbYXR0bnVtIC0gMV0tPmF0dHR5cGlkLAoh IAkJCQkJCQkgICZvdXRfZnVuY19vaWQsICZpc3ZhcmxlbmEpOwogIAkJZm1ncl9pbmZvKG91 dF9mdW5jX29pZCwgJm91dF9mdW5jdGlvbnNbYXR0bnVtIC0gMV0pOwogIAogIAkJaWYgKGxp c3RfbWVtYmVyX2ludChmb3JjZV9xdW90ZV9hdHRzLCBhdHRudW0pKQoqKioqKioqKioqKioq KioKKioqIDEyMTcsMTIzMyAqKioqCiAgCiAgCWlmIChiaW5hcnkpCiAgCXsKISAJCS8qIEdl bmVyYXRlIGhlYWRlciBmb3IgYSBiaW5hcnkgY29weSAqLwogIAkJaW50MzIJCXRtcDsKICAK ISAJCS8qIFNpZ25hdHVyZSAqLwogIAkJQ29weVNlbmREYXRhKChjaGFyICopIEJpbmFyeVNp Z25hdHVyZSwgMTEpOwohIAkJLyogRmxhZ3MgZmllbGQgKi8KICAJCXRtcCA9IDA7CiAgCQlp ZiAob2lkcykKICAJCQl0bXAgfD0gKDEgPDwgMTYpOwogIAkJQ29weVNlbmRJbnQzMih0bXAp OwohIAkJLyogTm8gaGVhZGVyIGV4dGVuc2lvbiAqLwogIAkJdG1wID0gMDsKICAJCUNvcHlT ZW5kSW50MzIodG1wKTsKICAJfQotLS0gMTMyOCwxMzUyIC0tLS0KICAKICAJaWYgKGJpbmFy eSkKICAJewohIAkJLyoKISAJCSAqIEdlbmVyYXRlIGhlYWRlciBmb3IgYSBiaW5hcnkgY29w eQohIAkJICovCiAgCQlpbnQzMgkJdG1wOwogIAohIAkJLyoKISAJCSAqIFNpZ25hdHVyZQoh IAkJICovCiAgCQlDb3B5U2VuZERhdGEoKGNoYXIgKikgQmluYXJ5U2lnbmF0dXJlLCAxMSk7 CiEgCQkvKgohIAkJICogRmxhZ3MgZmllbGQKISAJCSAqLwogIAkJdG1wID0gMDsKICAJCWlm IChvaWRzKQogIAkJCXRtcCB8PSAoMSA8PCAxNik7CiAgCQlDb3B5U2VuZEludDMyKHRtcCk7 CiEgCQkvKgohIAkJICogTm8gaGVhZGVyIGV4dGVuc2lvbgohIAkJICovCiAgCQl0bXAgPSAw OwogIAkJQ29weVNlbmRJbnQzMih0bXApOwogIAl9CioqKioqKioqKioqKioqKgoqKiogMTI0 MiwxMjUzICoqKioKICAJCQkJcGdfc2VydmVyX3RvX2NsaWVudCgodW5zaWduZWQgY2hhciAq KSBudWxsX3ByaW50LAogIAkJCQkJCQkJCXN0cmxlbihudWxsX3ByaW50KSk7CiAgCiEgCQkv KiBpZiBhIGhlYWRlciBoYXMgYmVlbiByZXF1ZXN0ZWQgc2VuZCB0aGUgbGluZSAqLwogIAkJ aWYgKGhlYWRlcl9saW5lKQogIAkJewohIAkJCWJvb2wgaGRyX2RlbGltID0gZmFsc2U7CiEg CQkJY2hhciAqY29sbmFtZTsKISAJCQkKICAJCQlmb3JlYWNoKGN1ciwgYXR0bnVtbGlzdCkK ICAJCQl7CiAgCQkJCWludAkJCWF0dG51bSA9IGxmaXJzdF9pbnQoY3VyKTsKLS0tIDEzNjEs MTM3NCAtLS0tCiAgCQkJCXBnX3NlcnZlcl90b19jbGllbnQoKHVuc2lnbmVkIGNoYXIgKikg bnVsbF9wcmludCwKICAJCQkJCQkJCQlzdHJsZW4obnVsbF9wcmludCkpOwogIAohIAkJLyoK ISAJCSAqIGlmIGEgaGVhZGVyIGhhcyBiZWVuIHJlcXVlc3RlZCBzZW5kIHRoZSBsaW5lCiEg CQkgKi8KICAJCWlmIChoZWFkZXJfbGluZSkKICAJCXsKISAJCQlib29sCQloZHJfZGVsaW0g PSBmYWxzZTsKISAJCQljaGFyCSAgICpjb2xuYW1lOwohIAogIAkJCWZvcmVhY2goY3VyLCBh dHRudW1saXN0KQogIAkJCXsKICAJCQkJaW50CQkJYXR0bnVtID0gbGZpcnN0X2ludChjdXIp OwoqKioqKioqKioqKioqKioKKioqIDEyODAsMTMwNCAqKioqCiAgCiAgCQlpZiAoYmluYXJ5 KQogIAkJewohIAkJCS8qIEJpbmFyeSBwZXItdHVwbGUgaGVhZGVyICovCiAgCQkJQ29weVNl bmRJbnQxNihhdHRyX2NvdW50KTsKISAJCQkvKiBTZW5kIE9JRCBpZiB3YW50ZWQgLS0tIG5v dGUgYXR0cl9jb3VudCBkb2Vzbid0IGluY2x1ZGUgaXQgKi8KICAJCQlpZiAob2lkcykKICAJ CQl7CiAgCQkJCU9pZAkJCW9pZCA9IEhlYXBUdXBsZUdldE9pZCh0dXBsZSk7CiAgCiEgCQkJ CS8qIEhhY2sgLS0tIGFzc3VtZSBPaWQgaXMgc2FtZSBzaXplIGFzIGludDMyICovCiAgCQkJ CUNvcHlTZW5kSW50MzIoc2l6ZW9mKGludDMyKSk7CiAgCQkJCUNvcHlTZW5kSW50MzIob2lk KTsKICAJCQl9CiAgCQl9CiAgCQllbHNlCiAgCQl7CiEgCQkJLyogVGV4dCBmb3JtYXQgaGFz IG5vIHBlci10dXBsZSBoZWFkZXIsIGJ1dCBzZW5kIE9JRCBpZiB3YW50ZWQgKi8KICAJCQlp ZiAob2lkcykKICAJCQl7CiAgCQkJCXN0cmluZyA9IERhdHVtR2V0Q1N0cmluZyhEaXJlY3RG dW5jdGlvbkNhbGwxKG9pZG91dCwKISAJCQkJCQkJICBPYmplY3RJZEdldERhdHVtKEhlYXBU dXBsZUdldE9pZCh0dXBsZSkpKSk7CiAgCQkJCUNvcHlTZW5kU3RyaW5nKHN0cmluZyk7CiAg CQkJCW5lZWRfZGVsaW0gPSB0cnVlOwogIAkJCX0KLS0tIDE0MDEsMTQzNSAtLS0tCiAgCiAg CQlpZiAoYmluYXJ5KQogIAkJewohIAkJCS8qCiEgCQkJICogQmluYXJ5IHBlci10dXBsZSBo ZWFkZXIKISAJCQkgKi8KICAJCQlDb3B5U2VuZEludDE2KGF0dHJfY291bnQpOwohIAkJCS8q CiEgCQkJICogU2VuZCBPSUQgaWYgd2FudGVkIC0tLSBub3RlIGF0dHJfY291bnQgZG9lc24n dCBpbmNsdWRlIGl0IAohIAkJCSAqLwogIAkJCWlmIChvaWRzKQogIAkJCXsKICAJCQkJT2lk CQkJb2lkID0gSGVhcFR1cGxlR2V0T2lkKHR1cGxlKTsKICAKISAJCQkJLyoKISAJCQkJICog SGFjayAtLS0gYXNzdW1lIE9pZCBpcyBzYW1lIHNpemUgYXMgaW50MzIKISAJCQkJICovCiAg CQkJCUNvcHlTZW5kSW50MzIoc2l6ZW9mKGludDMyKSk7CiAgCQkJCUNvcHlTZW5kSW50MzIo b2lkKTsKICAJCQl9CiAgCQl9CiAgCQllbHNlCiAgCQl7CiEgCQkJLyoKISAJCQkgKiBUZXh0 IGZvcm1hdCBoYXMgbm8gcGVyLXR1cGxlIGhlYWRlciwgYnV0IHNlbmQgT0lEIGlmIHdhbnRl ZAohIAkJCSAqLwogIAkJCWlmIChvaWRzKQogIAkJCXsKICAJCQkJc3RyaW5nID0gRGF0dW1H ZXRDU3RyaW5nKERpcmVjdEZ1bmN0aW9uQ2FsbDEob2lkb3V0LAohIAkJCQkJCQkJCQkJCQkJ CSBPYmplY3RJZEdldERhdHVtCiEgCQkJCQkJCQkJCQkJCQkJIChIZWFwVHVwbGVHZXRPaWQK ISAJCQkJCQkJCQkJCQkJCQkgICh0dXBsZSkpKSk7CiAgCQkJCUNvcHlTZW5kU3RyaW5nKHN0 cmluZyk7CiAgCQkJCW5lZWRfZGVsaW0gPSB0cnVlOwogIAkJCX0KKioqKioqKioqKioqKioq CioqKiAxMzMwLDEzNDIgKioqKgogIAkJCXsKICAJCQkJaWYgKCFiaW5hcnkpCiAgCQkJCXsK ISAJCQkJCXN0cmluZyA9IERhdHVtR2V0Q1N0cmluZyhGdW5jdGlvbkNhbGwxKCZvdXRfZnVu Y3Rpb25zW2F0dG51bSAtIDFdLAohIAkJCQkJCQkJCQkJCQkJICAgdmFsdWUpKTsKICAJCQkJ CWlmIChjc3ZfbW9kZSkKICAJCQkJCXsKICAJCQkJCQlDb3B5QXR0cmlidXRlT3V0Q1NWKHN0 cmluZywgZGVsaW0sIHF1b3RlLCBlc2NhcGUsCiEgCQkJCQkJCQkJICAoc3RyY21wKHN0cmlu ZywgbnVsbF9wcmludCkgPT0gMCB8fAohIAkJCQkJCQkJCSAgIGZvcmNlX3F1b3RlW2F0dG51 bSAtIDFdKSk7CiAgCQkJCQl9CiAgCQkJCQllbHNlCiAgCQkJCQkJQ29weUF0dHJpYnV0ZU91 dChzdHJpbmcsIGRlbGltKTsKLS0tIDE0NjEsMTQ3NCAtLS0tCiAgCQkJewogIAkJCQlpZiAo IWJpbmFyeSkKICAJCQkJewohIAkJCQkJc3RyaW5nID0KISAJCQkJCQlEYXR1bUdldENTdHJp bmcoRnVuY3Rpb25DYWxsMQohIAkJCQkJCQkJCQkoJm91dF9mdW5jdGlvbnNbYXR0bnVtIC0g MV0sIHZhbHVlKSk7CiAgCQkJCQlpZiAoY3N2X21vZGUpCiAgCQkJCQl7CiAgCQkJCQkJQ29w eUF0dHJpYnV0ZU91dENTVihzdHJpbmcsIGRlbGltLCBxdW90ZSwgZXNjYXBlLAohIAkJCQkJ CQkJCQkJKHN0cmNtcChzdHJpbmcsIG51bGxfcHJpbnQpID09IDAgfHwKISAJCQkJCQkJCQkJ CSBmb3JjZV9xdW90ZVthdHRudW0gLSAxXSkpOwogIAkJCQkJfQogIAkJCQkJZWxzZQogIAkJ CQkJCUNvcHlBdHRyaWJ1dGVPdXQoc3RyaW5nLCBkZWxpbSk7CioqKioqKioqKioqKioqKgoq KiogMTM0NiwxMzU0ICoqKioKICAJCQkJewogIAkJCQkJYnl0ZWEJICAgKm91dHB1dGJ5dGVz OwogIAohIAkJCQkJb3V0cHV0Ynl0ZXMgPSBEYXR1bUdldEJ5dGVhUChGdW5jdGlvbkNhbGwx KCZvdXRfZnVuY3Rpb25zW2F0dG51bSAtIDFdLAohIAkJCQkJCQkJCQkJCQkJCSAgIHZhbHVl KSk7CiEgCQkJCQkvKiBXZSBhc3N1bWUgdGhlIHJlc3VsdCB3aWxsIG5vdCBoYXZlIGJlZW4g dG9hc3RlZCAqLwogIAkJCQkJQ29weVNlbmRJbnQzMihWQVJTSVpFKG91dHB1dGJ5dGVzKSAt IFZBUkhEUlNaKTsKICAJCQkJCUNvcHlTZW5kRGF0YShWQVJEQVRBKG91dHB1dGJ5dGVzKSwK ICAJCQkJCQkJCSBWQVJTSVpFKG91dHB1dGJ5dGVzKSAtIFZBUkhEUlNaKTsKLS0tIDE0Nzgs MTQ4OSAtLS0tCiAgCQkJCXsKICAJCQkJCWJ5dGVhCSAgICpvdXRwdXRieXRlczsKICAKISAJ CQkJCW91dHB1dGJ5dGVzID0KISAJCQkJCQlEYXR1bUdldEJ5dGVhUChGdW5jdGlvbkNhbGwx CiEgCQkJCQkJCQkJICAgKCZvdXRfZnVuY3Rpb25zW2F0dG51bSAtIDFdLCB2YWx1ZSkpOwoh IAkJCQkJLyoKISAJCQkJCSAqIFdlIGFzc3VtZSB0aGUgcmVzdWx0IHdpbGwgbm90IGhhdmUg YmVlbiB0b2FzdGVkCiEgCQkJCQkgKi8KICAJCQkJCUNvcHlTZW5kSW50MzIoVkFSU0laRShv dXRwdXRieXRlcykgLSBWQVJIRFJTWik7CiAgCQkJCQlDb3B5U2VuZERhdGEoVkFSREFUQShv dXRwdXRieXRlcyksCiAgCQkJCQkJCQkgVkFSU0laRShvdXRwdXRieXRlcykgLSBWQVJIRFJT Wik7CioqKioqKioqKioqKioqKgoqKiogMTM2NSwxMzcxICoqKioKICAKICAJaWYgKGJpbmFy eSkKICAJewohIAkJLyogR2VuZXJhdGUgdHJhaWxlciBmb3IgYSBiaW5hcnkgY29weSAqLwog IAkJQ29weVNlbmRJbnQxNigtMSk7CiAgCX0KICAKLS0tIDE1MDAsMTUwOCAtLS0tCiAgCiAg CWlmIChiaW5hcnkpCiAgCXsKISAJCS8qCiEgCQkgKiBHZW5lcmF0ZSB0cmFpbGVyIGZvciBh IGJpbmFyeSBjb3B5CiEgCQkgKi8KICAJCUNvcHlTZW5kSW50MTYoLTEpOwogIAl9CiAgCioq KioqKioqKioqKioqKgoqKiogMTM4NCwxMzkwICoqKioKICB7CiAgCWlmIChjb3B5X2JpbmFy eSkKICAJewohIAkJLyogY2FuJ3QgdXNlZnVsbHkgZGlzcGxheSB0aGUgZGF0YSAqLwogIAkJ aWYgKGNvcHlfYXR0bmFtZSkKICAJCQllcnJjb250ZXh0KCJDT1BZICVzLCBsaW5lICVkLCBj b2x1bW4gJXMiLAogIAkJCQkJICAgY29weV9yZWxuYW1lLCBjb3B5X2xpbmVubywgY29weV9h dHRuYW1lKTsKLS0tIDE1MjEsMTUyOSAtLS0tCiAgewogIAlpZiAoY29weV9iaW5hcnkpCiAg CXsKISAJCS8qCiEgCQkgKiBjYW4ndCB1c2VmdWxseSBkaXNwbGF5IHRoZSBkYXRhIAohIAkJ ICovCiAgCQlpZiAoY29weV9hdHRuYW1lKQogIAkJCWVycmNvbnRleHQoIkNPUFkgJXMsIGxp bmUgJWQsIGNvbHVtbiAlcyIsCiAgCQkJCQkgICBjb3B5X3JlbG5hbWUsIGNvcHlfbGluZW5v LCBjb3B5X2F0dG5hbWUpOwoqKioqKioqKioqKioqKioKKioqIDEzOTUsMTQwMSAqKioqCiAg CXsKICAJCWlmIChjb3B5X2F0dG5hbWUpCiAgCQl7CiEgCQkJLyogZXJyb3IgaXMgcmVsZXZh bnQgdG8gYSBwYXJ0aWN1bGFyIGNvbHVtbiAqLwogIAkJCWxpbWl0X3ByaW50b3V0X2xlbmd0 aCgmYXR0cmlidXRlX2J1Zik7CiAgCQkJZXJyY29udGV4dCgiQ09QWSAlcywgbGluZSAlZCwg Y29sdW1uICVzOiBcIiVzXCIiLAogIAkJCQkJICAgY29weV9yZWxuYW1lLCBjb3B5X2xpbmVu bywgY29weV9hdHRuYW1lLAotLS0gMTUzNCwxNTQyIC0tLS0KICAJewogIAkJaWYgKGNvcHlf YXR0bmFtZSkKICAJCXsKISAJCQkvKgohIAkJCSAqIGVycm9yIGlzIHJlbGV2YW50IHRvIGEg cGFydGljdWxhciBjb2x1bW4KISAJCQkgKi8KICAJCQlsaW1pdF9wcmludG91dF9sZW5ndGgo JmF0dHJpYnV0ZV9idWYpOwogIAkJCWVycmNvbnRleHQoIkNPUFkgJXMsIGxpbmUgJWQsIGNv bHVtbiAlczogXCIlc1wiIiwKICAJCQkJCSAgIGNvcHlfcmVsbmFtZSwgY29weV9saW5lbm8s IGNvcHlfYXR0bmFtZSwKKioqKioqKioqKioqKioqCioqKiAxNDAzLDE0MjMgKioqKgogIAkJ fQogIAkJZWxzZQogIAkJewohIAkJCS8qIGVycm9yIGlzIHJlbGV2YW50IHRvIGEgcGFydGlj dWxhciBsaW5lICovCiEgCQkJaWYgKGxpbmVfYnVmX2NvbnZlcnRlZCB8fAohIAkJCQljbGll bnRfZW5jb2RpbmcgPT0gc2VydmVyX2VuY29kaW5nKQogIAkJCXsKICAJCQkJbGltaXRfcHJp bnRvdXRfbGVuZ3RoKCZsaW5lX2J1Zik7CiAgCQkJCWVycmNvbnRleHQoIkNPUFkgJXMsIGxp bmUgJWQ6IFwiJXNcIiIsCiEgCQkJCQkJICAgY29weV9yZWxuYW1lLCBjb3B5X2xpbmVubywK ISAJCQkJCQkgICBsaW5lX2J1Zi5kYXRhKTsKICAJCQl9CiAgCQkJZWxzZQogIAkJCXsKICAJ CQkJLyoKICAJCQkJICogSGVyZSwgdGhlIGxpbmUgYnVmZmVyIGlzIHN0aWxsIGluIGEgZm9y ZWlnbiBlbmNvZGluZywKICAJCQkJICogYW5kIGluZGVlZCBpdCdzIHF1aXRlIGxpa2VseSB0 aGF0IHRoZSBlcnJvciBpcyBwcmVjaXNlbHkKISAJCQkJICogYSBmYWlsdXJlIHRvIGRvIGVu Y29kaW5nIGNvbnZlcnNpb24gKGllLCBiYWQgZGF0YSkuICBXZQogIAkJCQkgKiBkYXJlIG5v dCB0cnkgdG8gY29udmVydCBpdCwgYW5kIGF0IHByZXNlbnQgdGhlcmUncyBubyB3YXkKICAJ CQkJICogdG8gcmVndXJnaXRhdGUgaXQgd2l0aG91dCBjb252ZXJzaW9uLiAgU28gd2UgaGF2 ZSB0byBwdW50CiAgCQkJCSAqIGFuZCBqdXN0IHJlcG9ydCB0aGUgbGluZSBudW1iZXIuCi0t LSAxNTQ0LDE1NjQgLS0tLQogIAkJfQogIAkJZWxzZQogIAkJewohIAkJCS8qCiEgCQkJICog ZXJyb3IgaXMgcmVsZXZhbnQgdG8gYSBwYXJ0aWN1bGFyIGxpbmUKISAJCQkgKi8KISAJCQlp ZiAobGluZV9idWZfY29udmVydGVkIHx8IGNsaWVudF9lbmNvZGluZyA9PSBzZXJ2ZXJfZW5j b2RpbmcpCiAgCQkJewogIAkJCQlsaW1pdF9wcmludG91dF9sZW5ndGgoJmxpbmVfYnVmKTsK ICAJCQkJZXJyY29udGV4dCgiQ09QWSAlcywgbGluZSAlZDogXCIlc1wiIiwKISAJCQkJCQkg ICBjb3B5X3JlbG5hbWUsIGNvcHlfbGluZW5vLCBsaW5lX2J1Zi5kYXRhKTsKICAJCQl9CiAg CQkJZWxzZQogIAkJCXsKICAJCQkJLyoKICAJCQkJICogSGVyZSwgdGhlIGxpbmUgYnVmZmVy IGlzIHN0aWxsIGluIGEgZm9yZWlnbiBlbmNvZGluZywKICAJCQkJICogYW5kIGluZGVlZCBp dCdzIHF1aXRlIGxpa2VseSB0aGF0IHRoZSBlcnJvciBpcyBwcmVjaXNlbHkKISAJCQkJICog YSBmYWlsdXJlIHRvIGRvIGVuY29kaW5nIGNvbnZlcnNpb24gKGllLCBiYWQgZGF0YSkuCVdl CiAgCQkJCSAqIGRhcmUgbm90IHRyeSB0byBjb252ZXJ0IGl0LCBhbmQgYXQgcHJlc2VudCB0 aGVyZSdzIG5vIHdheQogIAkJCQkgKiB0byByZWd1cmdpdGF0ZSBpdCB3aXRob3V0IGNvbnZl cnNpb24uICBTbyB3ZSBoYXZlIHRvIHB1bnQKICAJCQkJICogYW5kIGp1c3QgcmVwb3J0IHRo ZSBsaW5lIG51bWJlci4KKioqKioqKioqKioqKioqCioqKiAxNDQ1LDE0NjIgKioqKgogIAog IAlpbnQJCQlsZW47CiAgCiEgCS8qIEZhc3QgcGF0aCBpZiBkZWZpbml0ZWx5IG9rYXkgKi8K ICAJaWYgKGJ1Zi0+bGVuIDw9IE1BWF9DT1BZX0RBVEFfRElTUExBWSkKICAJCXJldHVybjsK ICAKISAJLyogQXBwbHkgZW5jb2RpbmctZGVwZW5kZW50IHRydW5jYXRpb24gKi8KICAJbGVu ID0gcGdfbWJjbGlwbGVuKGJ1Zi0+ZGF0YSwgYnVmLT5sZW4sIE1BWF9DT1BZX0RBVEFfRElT UExBWSk7CiAgCWlmIChidWYtPmxlbiA8PSBsZW4pCiAgCQlyZXR1cm47CQkJCQkvKiBubyBu ZWVkIHRvIHRydW5jYXRlICovCiAgCWJ1Zi0+bGVuID0gbGVuOwogIAlidWYtPmRhdGFbbGVu XSA9ICdcMCc7CiAgCiEgCS8qIEFkZCAiLi4uIiB0byBzaG93IHdlIHRydW5jYXRlZCB0aGUg aW5wdXQgKi8KICAJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsICIuLi4iKTsKICB9CiAg Ci0tLSAxNTg2LDE2MDkgLS0tLQogIAogIAlpbnQJCQlsZW47CiAgCiEgCS8qCiEgCSAqIEZh c3QgcGF0aCBpZiBkZWZpbml0ZWx5IG9rYXkKISAJICovCiAgCWlmIChidWYtPmxlbiA8PSBN QVhfQ09QWV9EQVRBX0RJU1BMQVkpCiAgCQlyZXR1cm47CiAgCiEgCS8qCiEgCSAqIEFwcGx5 IGVuY29kaW5nLWRlcGVuZGVudCB0cnVuY2F0aW9uCiEgCSAqLwogIAlsZW4gPSBwZ19tYmNs aXBsZW4oYnVmLT5kYXRhLCBidWYtPmxlbiwgTUFYX0NPUFlfREFUQV9ESVNQTEFZKTsKICAJ aWYgKGJ1Zi0+bGVuIDw9IGxlbikKICAJCXJldHVybjsJCQkJCS8qIG5vIG5lZWQgdG8gdHJ1 bmNhdGUgKi8KICAJYnVmLT5sZW4gPSBsZW47CiAgCWJ1Zi0+ZGF0YVtsZW5dID0gJ1wwJzsK ICAKISAJLyoKISAJICogQWRkICIuLi4iIHRvIHNob3cgd2UgdHJ1bmNhdGVkIHRoZSBpbnB1 dAohIAkgKi8KICAJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsICIuLi4iKTsKICB9CiAg CioqKioqKioqKioqKioqKgoqKiogMTUxMCwxNTIxICoqKioKICAJICogY29kZSBoZXJlIHRo YXQgYmFzaWNhbGx5IGR1cGxpY2F0ZWQgZXhlY1V0aWxzLmMgLi4uKQogIAkgKi8KICAJcmVz dWx0UmVsSW5mbyA9IG1ha2VOb2RlKFJlc3VsdFJlbEluZm8pOwogIAlyZXN1bHRSZWxJbmZv LT5yaV9SYW5nZVRhYmxlSW5kZXggPSAxOwkJLyogZHVtbXkgKi8KICAJcmVzdWx0UmVsSW5m by0+cmlfUmVsYXRpb25EZXNjID0gcmVsOwogIAlyZXN1bHRSZWxJbmZvLT5yaV9UcmlnRGVz YyA9IENvcHlUcmlnZ2VyRGVzYyhyZWwtPnRyaWdkZXNjKTsKICAJaWYgKHJlc3VsdFJlbElu Zm8tPnJpX1RyaWdEZXNjKQogIAkJcmVzdWx0UmVsSW5mby0+cmlfVHJpZ0Z1bmN0aW9ucyA9 IChGbWdySW5mbyAqKQohIAkJCXBhbGxvYzAocmVzdWx0UmVsSW5mby0+cmlfVHJpZ0Rlc2Mt Pm51bXRyaWdnZXJzICogc2l6ZW9mKEZtZ3JJbmZvKSk7CiAgCXJlc3VsdFJlbEluZm8tPnJp X1RyaWdJbnN0cnVtZW50ID0gTlVMTDsKICAKICAJRXhlY09wZW5JbmRpY2VzKHJlc3VsdFJl bEluZm8pOwotLS0gMTY1NywxNjcwIC0tLS0KICAJICogY29kZSBoZXJlIHRoYXQgYmFzaWNh bGx5IGR1cGxpY2F0ZWQgZXhlY1V0aWxzLmMgLi4uKQogIAkgKi8KICAJcmVzdWx0UmVsSW5m byA9IG1ha2VOb2RlKFJlc3VsdFJlbEluZm8pOworIAogIAlyZXN1bHRSZWxJbmZvLT5yaV9S YW5nZVRhYmxlSW5kZXggPSAxOwkJLyogZHVtbXkgKi8KICAJcmVzdWx0UmVsSW5mby0+cmlf UmVsYXRpb25EZXNjID0gcmVsOwogIAlyZXN1bHRSZWxJbmZvLT5yaV9UcmlnRGVzYyA9IENv cHlUcmlnZ2VyRGVzYyhyZWwtPnRyaWdkZXNjKTsKICAJaWYgKHJlc3VsdFJlbEluZm8tPnJp X1RyaWdEZXNjKQogIAkJcmVzdWx0UmVsSW5mby0+cmlfVHJpZ0Z1bmN0aW9ucyA9IChGbWdy SW5mbyAqKQohIAkJCXBhbGxvYzAocmVzdWx0UmVsSW5mby0+cmlfVHJpZ0Rlc2MtPm51bXRy aWdnZXJzICoKISAJCQkJCXNpemVvZihGbWdySW5mbykpOwogIAlyZXN1bHRSZWxJbmZvLT5y aV9UcmlnSW5zdHJ1bWVudCA9IE5VTEw7CiAgCiAgCUV4ZWNPcGVuSW5kaWNlcyhyZXN1bHRS ZWxJbmZvKTsKKioqKioqKioqKioqKioqCioqKiAxNTI0LDE1MzAgKioqKgogIAllc3RhdGUt PmVzX251bV9yZXN1bHRfcmVsYXRpb25zID0gMTsKICAJZXN0YXRlLT5lc19yZXN1bHRfcmVs YXRpb25faW5mbyA9IHJlc3VsdFJlbEluZm87CiAgCiEgCS8qIFNldCB1cCBhIHR1cGxlIHNs b3QgdG9vICovCiAgCXNsb3QgPSBNYWtlU2luZ2xlVHVwbGVUYWJsZVNsb3QodHVwRGVzYyk7 CiAgCiAgCWVjb250ZXh0ID0gR2V0UGVyVHVwbGVFeHByQ29udGV4dChlc3RhdGUpOwotLS0g MTY3MywxNjgxIC0tLS0KICAJZXN0YXRlLT5lc19udW1fcmVzdWx0X3JlbGF0aW9ucyA9IDE7 CiAgCWVzdGF0ZS0+ZXNfcmVzdWx0X3JlbGF0aW9uX2luZm8gPSByZXN1bHRSZWxJbmZvOwog IAohIAkvKgohIAkgKiBTZXQgdXAgYSB0dXBsZSBzbG90IHRvbwohIAkgKi8KICAJc2xvdCA9 IE1ha2VTaW5nbGVUdXBsZVRhYmxlU2xvdCh0dXBEZXNjKTsKICAKICAJZWNvbnRleHQgPSBH ZXRQZXJUdXBsZUV4cHJDb250ZXh0KGVzdGF0ZSk7CioqKioqKioqKioqKioqKgoqKiogMTUz OSwxNTU3ICoqKioKICAJdHlwaW9wYXJhbXMgPSAoT2lkICopIHBhbGxvYyhudW1fcGh5c19h dHRycyAqIHNpemVvZihPaWQpKTsKICAJZGVmbWFwID0gKGludCAqKSBwYWxsb2MobnVtX3Bo eXNfYXR0cnMgKiBzaXplb2YoaW50KSk7CiAgCWRlZmV4cHJzID0gKEV4cHJTdGF0ZSAqKikg cGFsbG9jKG51bV9waHlzX2F0dHJzICogc2l6ZW9mKEV4cHJTdGF0ZSAqKSk7CiEgCWNvbnN0 cmFpbnRleHBycyA9IChFeHByU3RhdGUgKiopIHBhbGxvYzAobnVtX3BoeXNfYXR0cnMgKiBz aXplb2YoRXhwclN0YXRlICopKTsKICAJZm9yY2Vfbm90bnVsbCA9IChib29sICopIHBhbGxv YyhudW1fcGh5c19hdHRycyAqIHNpemVvZihib29sKSk7CiAgCiAgCWZvciAoYXR0bnVtID0g MTsgYXR0bnVtIDw9IG51bV9waHlzX2F0dHJzOyBhdHRudW0rKykKICAJewohIAkJLyogV2Ug ZG9uJ3QgbmVlZCBpbmZvIGZvciBkcm9wcGVkIGF0dHJpYnV0ZXMgKi8KICAJCWlmIChhdHRy W2F0dG51bSAtIDFdLT5hdHRpc2Ryb3BwZWQpCiAgCQkJY29udGludWU7CiAgCiEgCQkvKiBG ZXRjaCB0aGUgaW5wdXQgZnVuY3Rpb24gYW5kIHR5cGlvcGFyYW0gaW5mbyAqLwogIAkJaWYg KGJpbmFyeSkKICAJCQlnZXRUeXBlQmluYXJ5SW5wdXRJbmZvKGF0dHJbYXR0bnVtIC0gMV0t PmF0dHR5cGlkLAohIAkJCQkJCQkJICZpbl9mdW5jX29pZCwgJnR5cGlvcGFyYW1zW2F0dG51 bSAtIDFdKTsKICAJCWVsc2UKICAJCQlnZXRUeXBlSW5wdXRJbmZvKGF0dHJbYXR0bnVtIC0g MV0tPmF0dHR5cGlkLAogIAkJCQkJCQkgJmluX2Z1bmNfb2lkLCAmdHlwaW9wYXJhbXNbYXR0 bnVtIC0gMV0pOwotLS0gMTY5MCwxNzEzIC0tLS0KICAJdHlwaW9wYXJhbXMgPSAoT2lkICop IHBhbGxvYyhudW1fcGh5c19hdHRycyAqIHNpemVvZihPaWQpKTsKICAJZGVmbWFwID0gKGlu dCAqKSBwYWxsb2MobnVtX3BoeXNfYXR0cnMgKiBzaXplb2YoaW50KSk7CiAgCWRlZmV4cHJz ID0gKEV4cHJTdGF0ZSAqKikgcGFsbG9jKG51bV9waHlzX2F0dHJzICogc2l6ZW9mKEV4cHJT dGF0ZSAqKSk7CiEgCWNvbnN0cmFpbnRleHBycyA9CiEgCQkoRXhwclN0YXRlICoqKSBwYWxs b2MwKG51bV9waHlzX2F0dHJzICogc2l6ZW9mKEV4cHJTdGF0ZSAqKSk7CiAgCWZvcmNlX25v dG51bGwgPSAoYm9vbCAqKSBwYWxsb2MobnVtX3BoeXNfYXR0cnMgKiBzaXplb2YoYm9vbCkp OwogIAogIAlmb3IgKGF0dG51bSA9IDE7IGF0dG51bSA8PSBudW1fcGh5c19hdHRyczsgYXR0 bnVtKyspCiAgCXsKISAJCS8qCiEgCQkgKiBXZSBkb24ndCBuZWVkIGluZm8gZm9yIGRyb3Bw ZWQgYXR0cmlidXRlcyAKISAJCSAqLwogIAkJaWYgKGF0dHJbYXR0bnVtIC0gMV0tPmF0dGlz ZHJvcHBlZCkKICAJCQljb250aW51ZTsKICAKISAJCS8qCiEgCQkgKiBGZXRjaCB0aGUgaW5w dXQgZnVuY3Rpb24gYW5kIHR5cGlvcGFyYW0gaW5mbwohIAkJICovCiAgCQlpZiAoYmluYXJ5 KQogIAkJCWdldFR5cGVCaW5hcnlJbnB1dEluZm8oYXR0clthdHRudW0gLSAxXS0+YXR0dHlw aWQsCiEgCQkJCQkJCQkgICAmaW5fZnVuY19vaWQsICZ0eXBpb3BhcmFtc1thdHRudW0gLSAx XSk7CiAgCQllbHNlCiAgCQkJZ2V0VHlwZUlucHV0SW5mbyhhdHRyW2F0dG51bSAtIDFdLT5h dHR0eXBpZCwKICAJCQkJCQkJICZpbl9mdW5jX29pZCwgJnR5cGlvcGFyYW1zW2F0dG51bSAt IDFdKTsKKioqKioqKioqKioqKioqCioqKiAxNTYyLDE1NzIgKioqKgogIAkJZWxzZQogIAkJ CWZvcmNlX25vdG51bGxbYXR0bnVtIC0gMV0gPSBmYWxzZTsKICAKISAJCS8qIEdldCBkZWZh dWx0IGluZm8gaWYgbmVlZGVkICovCiAgCQlpZiAoIWxpc3RfbWVtYmVyX2ludChhdHRudW1s aXN0LCBhdHRudW0pKQogIAkJewohIAkJCS8qIGF0dHJpYnV0ZSBpcyBOT1QgdG8gYmUgY29w aWVkIGZyb20gaW5wdXQgKi8KISAJCQkvKiB1c2UgZGVmYXVsdCB2YWx1ZSBpZiBvbmUgZXhp c3RzICovCiAgCQkJTm9kZQkgICAqZGVmZXhwciA9IGJ1aWxkX2NvbHVtbl9kZWZhdWx0KHJl bCwgYXR0bnVtKTsKICAKICAJCQlpZiAoZGVmZXhwciAhPSBOVUxMKQotLS0gMTcxOCwxNzM0 IC0tLS0KICAJCWVsc2UKICAJCQlmb3JjZV9ub3RudWxsW2F0dG51bSAtIDFdID0gZmFsc2U7 CiAgCiEgCQkvKgohIAkJICogR2V0IGRlZmF1bHQgaW5mbyBpZiBuZWVkZWQKISAJCSAqLwog IAkJaWYgKCFsaXN0X21lbWJlcl9pbnQoYXR0bnVtbGlzdCwgYXR0bnVtKSkKICAJCXsKISAJ CQkvKgohIAkJCSAqIGF0dHJpYnV0ZSBpcyBOT1QgdG8gYmUgY29waWVkIGZyb20gaW5wdXQK ISAJCQkgKi8KISAJCQkvKgohIAkJCSAqIHVzZSBkZWZhdWx0IHZhbHVlIGlmIG9uZSBleGlz dHMKISAJCQkgKi8KICAJCQlOb2RlCSAgICpkZWZleHByID0gYnVpbGRfY29sdW1uX2RlZmF1 bHQocmVsLCBhdHRudW0pOwogIAogIAkJCWlmIChkZWZleHByICE9IE5VTEwpCioqKioqKioq KioqKioqKgoqKiogMTU3OCwxNTg0ICoqKioKICAJCQl9CiAgCQl9CiAgCiEgCQkvKiBJZiBp dCdzIGEgZG9tYWluIHR5cGUsIHNldCB1cCB0byBjaGVjayBkb21haW4gY29uc3RyYWludHMg Ki8KICAJCWlmIChnZXRfdHlwdHlwZShhdHRyW2F0dG51bSAtIDFdLT5hdHR0eXBpZCkgPT0g J2QnKQogIAkJewogIAkJCVBhcmFtCSAgICpwcm07Ci0tLSAxNzQwLDE3NDggLS0tLQogIAkJ CX0KICAJCX0KICAKISAJCS8qCiEgCQkgKiBJZiBpdCdzIGEgZG9tYWluIHR5cGUsIHNldCB1 cCB0byBjaGVjayBkb21haW4gY29uc3RyYWludHMgCiEgCQkgKi8KICAJCWlmIChnZXRfdHlw dHlwZShhdHRyW2F0dG51bSAtIDFdLT5hdHR0eXBpZCkgPT0gJ2QnKQogIAkJewogIAkJCVBh cmFtCSAgICpwcm07CioqKioqKioqKioqKioqKgoqKiogMTU5MywxNTk4ICoqKioKLS0tIDE3 NTcsMTc2MyAtLS0tCiAgCQkJICogYWN0dWFsIGRhdHVtIGR1cmluZyB0aGUgZGF0YSBpbnB1 dCBsb29wLgogIAkJCSAqLwogIAkJCXBybSA9IG1ha2VOb2RlKFBhcmFtKTsKKyAKICAJCQlw cm0tPnBhcmFta2luZCA9IFBBUkFNX0VYRUM7CiAgCQkJcHJtLT5wYXJhbWlkID0gMDsKICAJ CQlwcm0tPnBhcmFtdHlwZSA9IGdldEJhc2VUeXBlKGF0dHJbYXR0bnVtIC0gMV0tPmF0dHR5 cGlkKTsKKioqKioqKioqKioqKioqCioqKiAxNjA4LDE2MTQgKioqKgogIAkJfQogIAl9CiAg CiEgCS8qIFByZXBhcmUgdG8gY2F0Y2ggQUZURVIgdHJpZ2dlcnMuICovCiAgCUFmdGVyVHJp Z2dlckJlZ2luUXVlcnkoKTsKICAKICAJLyoKLS0tIDE3NzMsMTc4MSAtLS0tCiAgCQl9CiAg CX0KICAKISAJLyoKISAJICogUHJlcGFyZSB0byBjYXRjaCBBRlRFUiB0cmlnZ2Vycy4KISAJ ICovCiAgCUFmdGVyVHJpZ2dlckJlZ2luUXVlcnkoKTsKICAKICAJLyoKKioqKioqKioqKioq KioqCioqKiAxNjI0LDE2NDAgKioqKgogIAkJZmlsZV9oYXNfb2lkcyA9IG9pZHM7CS8qIG11 c3QgcmVseSBvbiB1c2VyIHRvIHRlbGwgdXMgdGhpcy4uLiAqLwogIAllbHNlCiAgCXsKISAJ CS8qIFJlYWQgYW5kIHZlcmlmeSBiaW5hcnkgaGVhZGVyICovCiAgCQljaGFyCQlyZWFkU2ln WzExXTsKICAJCWludDMyCQl0bXA7CiAgCiEgCQkvKiBTaWduYXR1cmUgKi8KICAJCUNvcHlH ZXREYXRhKHJlYWRTaWcsIDExKTsKICAJCWlmIChDb3B5R2V0RW9mKCkgfHwgbWVtY21wKHJl YWRTaWcsIEJpbmFyeVNpZ25hdHVyZSwgMTEpICE9IDApCiAgCQkJZXJlcG9ydChFUlJPUiwK ICAJCQkJCShlcnJjb2RlKEVSUkNPREVfQkFEX0NPUFlfRklMRV9GT1JNQVQpLAogIAkJCQkJ IGVycm1zZygiQ09QWSBmaWxlIHNpZ25hdHVyZSBub3QgcmVjb2duaXplZCIpKSk7CiEgCQkv KiBGbGFncyBmaWVsZCAqLwogIAkJdG1wID0gQ29weUdldEludDMyKCk7CiAgCQlpZiAoQ29w eUdldEVvZigpKQogIAkJCWVyZXBvcnQoRVJST1IsCi0tLSAxNzkxLDE4MTMgLS0tLQogIAkJ ZmlsZV9oYXNfb2lkcyA9IG9pZHM7CS8qIG11c3QgcmVseSBvbiB1c2VyIHRvIHRlbGwgdXMg dGhpcy4uLiAqLwogIAllbHNlCiAgCXsKISAJCS8qCiEgCQkgKiBSZWFkIGFuZCB2ZXJpZnkg YmluYXJ5IGhlYWRlcgohIAkJICovCiAgCQljaGFyCQlyZWFkU2lnWzExXTsKICAJCWludDMy CQl0bXA7CiAgCiEgCQkvKgohIAkJICogU2lnbmF0dXJlCiEgCQkgKi8KICAJCUNvcHlHZXRE YXRhKHJlYWRTaWcsIDExKTsKICAJCWlmIChDb3B5R2V0RW9mKCkgfHwgbWVtY21wKHJlYWRT aWcsIEJpbmFyeVNpZ25hdHVyZSwgMTEpICE9IDApCiAgCQkJZXJlcG9ydChFUlJPUiwKICAJ CQkJCShlcnJjb2RlKEVSUkNPREVfQkFEX0NPUFlfRklMRV9GT1JNQVQpLAogIAkJCQkJIGVy cm1zZygiQ09QWSBmaWxlIHNpZ25hdHVyZSBub3QgcmVjb2duaXplZCIpKSk7CiEgCQkvKgoh IAkJICogRmxhZ3MgZmllbGQKISAJCSAqLwogIAkJdG1wID0gQ29weUdldEludDMyKCk7CiAg CQlpZiAoQ29weUdldEVvZigpKQogIAkJCWVyZXBvcnQoRVJST1IsCioqKioqKioqKioqKioq KgoqKiogMTY0NSwxNjg0ICoqKioKICAJCWlmICgodG1wID4+IDE2KSAhPSAwKQogIAkJCWVy ZXBvcnQoRVJST1IsCiAgCQkJCQkoZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJTEVfRk9S TUFUKSwKISAJCQkgZXJybXNnKCJ1bnJlY29nbml6ZWQgY3JpdGljYWwgZmxhZ3MgaW4gQ09Q WSBmaWxlIGhlYWRlciIpKSk7CiEgCQkvKiBIZWFkZXIgZXh0ZW5zaW9uIGxlbmd0aCAqLwog IAkJdG1wID0gQ29weUdldEludDMyKCk7CiAgCQlpZiAoQ29weUdldEVvZigpIHx8IHRtcCA8 IDApCiAgCQkJZXJlcG9ydChFUlJPUiwKICAJCQkJCShlcnJjb2RlKEVSUkNPREVfQkFEX0NP UFlfRklMRV9GT1JNQVQpLAohIAkJCQkgICBlcnJtc2coImludmFsaWQgQ09QWSBmaWxlIGhl YWRlciAobWlzc2luZyBsZW5ndGgpIikpKTsKISAJCS8qIFNraXAgZXh0ZW5zaW9uIGhlYWRl ciwgaWYgcHJlc2VudCAqLwogIAkJd2hpbGUgKHRtcC0tID4gMCkKICAJCXsKICAJCQlDb3B5 R2V0RGF0YShyZWFkU2lnLCAxKTsKICAJCQlpZiAoQ29weUdldEVvZigpKQogIAkJCQllcmVw b3J0KEVSUk9SLAogIAkJCQkJCShlcnJjb2RlKEVSUkNPREVfQkFEX0NPUFlfRklMRV9GT1JN QVQpLAohIAkJCQkJIGVycm1zZygiaW52YWxpZCBDT1BZIGZpbGUgaGVhZGVyICh3cm9uZyBs ZW5ndGgpIikpKTsKICAJCX0KICAJfQogIAogIAlpZiAoZmlsZV9oYXNfb2lkcyAmJiBiaW5h cnkpCiAgCXsKISAJCWdldFR5cGVCaW5hcnlJbnB1dEluZm8oT0lET0lELAohIAkJCQkJCQkg ICAmaW5fZnVuY19vaWQsICZvaWRfdHlwaW9wYXJhbSk7CiAgCQlmbWdyX2luZm8oaW5fZnVu Y19vaWQsICZvaWRfaW5fZnVuY3Rpb24pOwogIAl9CiAgCiAgCXZhbHVlcyA9IChEYXR1bSAq KSBwYWxsb2MobnVtX3BoeXNfYXR0cnMgKiBzaXplb2YoRGF0dW0pKTsKICAJbnVsbHMgPSAo Y2hhciAqKSBwYWxsb2MobnVtX3BoeXNfYXR0cnMgKiBzaXplb2YoY2hhcikpOwogIAohIAkv KiBNYWtlIHJvb20gZm9yIGEgUEFSQU1fRVhFQyB2YWx1ZSBmb3IgZG9tYWluIGNvbnN0cmFp bnQgY2hlY2tzICovCiAgCWlmIChoYXNDb25zdHJhaW50cykKICAJCWVjb250ZXh0LT5lY3h0 X3BhcmFtX2V4ZWNfdmFscyA9IChQYXJhbUV4ZWNEYXRhICopCiAgCQkJcGFsbG9jMChzaXpl b2YoUGFyYW1FeGVjRGF0YSkpOwogIAohIAkvKiBJbml0aWFsaXplIHN0YXRpYyB2YXJpYWJs ZXMgKi8KICAJZmVfZW9mID0gZmFsc2U7CiAgCWVvbF90eXBlID0gRU9MX1VOS05PV047CiAg CWNvcHlfYmluYXJ5ID0gYmluYXJ5OwotLS0gMTgxOCwxODY1IC0tLS0KICAJCWlmICgodG1w ID4+IDE2KSAhPSAwKQogIAkJCWVyZXBvcnQoRVJST1IsCiAgCQkJCQkoZXJyY29kZShFUlJD T0RFX0JBRF9DT1BZX0ZJTEVfRk9STUFUKSwKISAJCQkJCSBlcnJtc2cKISAJCQkJCSAoInVu cmVjb2duaXplZCBjcml0aWNhbCBmbGFncyBpbiBDT1BZIGZpbGUgaGVhZGVyIikpKTsKISAJ CS8qCiEgCQkgKiBIZWFkZXIgZXh0ZW5zaW9uIGxlbmd0aAohIAkJICovCiAgCQl0bXAgPSBD b3B5R2V0SW50MzIoKTsKICAJCWlmIChDb3B5R2V0RW9mKCkgfHwgdG1wIDwgMCkKICAJCQll cmVwb3J0KEVSUk9SLAogIAkJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxFX0ZP Uk1BVCksCiEgCQkJCQkgZXJybXNnKCJpbnZhbGlkIENPUFkgZmlsZSBoZWFkZXIgKG1pc3Np bmcgbGVuZ3RoKSIpKSk7CiEgCQkvKgohIAkJICogU2tpcCBleHRlbnNpb24gaGVhZGVyLCBp ZiBwcmVzZW50CiEgCQkgKi8KICAJCXdoaWxlICh0bXAtLSA+IDApCiAgCQl7CiAgCQkJQ29w eUdldERhdGEocmVhZFNpZywgMSk7CiAgCQkJaWYgKENvcHlHZXRFb2YoKSkKICAJCQkJZXJl cG9ydChFUlJPUiwKICAJCQkJCQkoZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJTEVfRk9S TUFUKSwKISAJCQkJCQkgZXJybXNnKCJpbnZhbGlkIENPUFkgZmlsZSBoZWFkZXIgKHdyb25n IGxlbmd0aCkiKSkpOwogIAkJfQogIAl9CiAgCiAgCWlmIChmaWxlX2hhc19vaWRzICYmIGJp bmFyeSkKICAJewohIAkJZ2V0VHlwZUJpbmFyeUlucHV0SW5mbyhPSURPSUQsICZpbl9mdW5j X29pZCwgJm9pZF90eXBpb3BhcmFtKTsKICAJCWZtZ3JfaW5mbyhpbl9mdW5jX29pZCwgJm9p ZF9pbl9mdW5jdGlvbik7CiAgCX0KICAKICAJdmFsdWVzID0gKERhdHVtICopIHBhbGxvYyhu dW1fcGh5c19hdHRycyAqIHNpemVvZihEYXR1bSkpOwogIAludWxscyA9IChjaGFyICopIHBh bGxvYyhudW1fcGh5c19hdHRycyAqIHNpemVvZihjaGFyKSk7CiAgCiEgCS8qCiEgCSAqIE1h a2Ugcm9vbSBmb3IgYSBQQVJBTV9FWEVDIHZhbHVlIGZvciBkb21haW4gY29uc3RyYWludCBj aGVja3MKISAJICovCiAgCWlmIChoYXNDb25zdHJhaW50cykKICAJCWVjb250ZXh0LT5lY3h0 X3BhcmFtX2V4ZWNfdmFscyA9IChQYXJhbUV4ZWNEYXRhICopCiAgCQkJcGFsbG9jMChzaXpl b2YoUGFyYW1FeGVjRGF0YSkpOwogIAohIAkvKgohIAkgKiBJbml0aWFsaXplIHN0YXRpYyB2 YXJpYWJsZXMKISAJICovCiAgCWZlX2VvZiA9IGZhbHNlOwogIAllb2xfdHlwZSA9IEVPTF9V TktOT1dOOwogIAljb3B5X2JpbmFyeSA9IGJpbmFyeTsKKioqKioqKioqKioqKioqCioqKiAx Njg2LDE3MDIgKioqKgogIAljb3B5X2xpbmVubyA9IDA7CiAgCWNvcHlfYXR0bmFtZSA9IE5V TEw7CiAgCiEgCS8qIFNldCB1cCBjYWxsYmFjayB0byBpZGVudGlmeSBlcnJvciBsaW5lIG51 bWJlciAqLwogIAllcnJjb250ZXh0LmNhbGxiYWNrID0gY29weV9pbl9lcnJvcl9jYWxsYmFj azsKICAJZXJyY29udGV4dC5hcmcgPSBOVUxMOwogIAllcnJjb250ZXh0LnByZXZpb3VzID0g ZXJyb3JfY29udGV4dF9zdGFjazsKICAJZXJyb3JfY29udGV4dF9zdGFjayA9ICZlcnJjb250 ZXh0OwogIAohIAkvKiBvbiBpbnB1dCBqdXN0IHRocm93IHRoZSBoZWFkZXIgbGluZSBhd2F5 ICovCiAgCWlmIChoZWFkZXJfbGluZSkKICAJewogIAkJY29weV9saW5lbm8rKzsKISAJCWRv bmUgPSBDb3B5UmVhZExpbmUocXVvdGUsIGVzY2FwZSkgOwogIAl9CiAgCiAgCXdoaWxlICgh ZG9uZSkKLS0tIDE4NjcsMTg4NyAtLS0tCiAgCWNvcHlfbGluZW5vID0gMDsKICAJY29weV9h dHRuYW1lID0gTlVMTDsKICAKISAJLyoKISAJICogU2V0IHVwIGNhbGxiYWNrIHRvIGlkZW50 aWZ5IGVycm9yIGxpbmUgbnVtYmVyCiEgCSAqLwogIAllcnJjb250ZXh0LmNhbGxiYWNrID0g Y29weV9pbl9lcnJvcl9jYWxsYmFjazsKICAJZXJyY29udGV4dC5hcmcgPSBOVUxMOwogIAll cnJjb250ZXh0LnByZXZpb3VzID0gZXJyb3JfY29udGV4dF9zdGFjazsKICAJZXJyb3JfY29u dGV4dF9zdGFjayA9ICZlcnJjb250ZXh0OwogIAohIAkvKgohIAkgKiBvbiBpbnB1dCBqdXN0 IHRocm93IHRoZSBoZWFkZXIgbGluZSBhd2F5CiEgCSAqLwogIAlpZiAoaGVhZGVyX2xpbmUp CiAgCXsKICAJCWNvcHlfbGluZW5vKys7CiEgCQlkb25lID0gQ29weVJlYWRMaW5lKHF1b3Rl LCBlc2NhcGUpOwogIAl9CiAgCiAgCXdoaWxlICghZG9uZSkKKioqKioqKioqKioqKioqCioq KiAxNzA4LDE3MjAgKioqKgogIAogIAkJY29weV9saW5lbm8rKzsKICAKISAJCS8qIFJlc2V0 IHRoZSBwZXItdHVwbGUgZXhwcmNvbnRleHQgKi8KICAJCVJlc2V0UGVyVHVwbGVFeHByQ29u dGV4dChlc3RhdGUpOwogIAohIAkJLyogU3dpdGNoIGludG8gaXRzIG1lbW9yeSBjb250ZXh0 ICovCiAgCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8oR2V0UGVyVHVwbGVNZW1vcnlDb250ZXh0 KGVzdGF0ZSkpOwogIAohIAkJLyogSW5pdGlhbGl6ZSBhbGwgdmFsdWVzIGZvciByb3cgdG8g TlVMTCAqLwogIAkJTWVtU2V0KHZhbHVlcywgMCwgbnVtX3BoeXNfYXR0cnMgKiBzaXplb2Yo RGF0dW0pKTsKICAJCU1lbVNldChudWxscywgJ24nLCBudW1fcGh5c19hdHRycyAqIHNpemVv ZihjaGFyKSk7CiAgCi0tLSAxODkzLDE5MTEgLS0tLQogIAogIAkJY29weV9saW5lbm8rKzsK ICAKISAJCS8qCiEgCQkgKiBSZXNldCB0aGUgcGVyLXR1cGxlIGV4cHJjb250ZXh0CiEgCQkg Ki8KICAJCVJlc2V0UGVyVHVwbGVFeHByQ29udGV4dChlc3RhdGUpOwogIAohIAkJLyoKISAJ CSAqIFN3aXRjaCBpbnRvIGl0cyBtZW1vcnkgY29udGV4dAohIAkJICovCiAgCQlNZW1vcnlD b250ZXh0U3dpdGNoVG8oR2V0UGVyVHVwbGVNZW1vcnlDb250ZXh0KGVzdGF0ZSkpOwogIAoh IAkJLyoKISAJCSAqIEluaXRpYWxpemUgYWxsIHZhbHVlcyBmb3Igcm93IHRvIE5VTEwKISAJ CSAqLwogIAkJTWVtU2V0KHZhbHVlcywgMCwgbnVtX3BoeXNfYXR0cnMgKiBzaXplb2YoRGF0 dW0pKTsKICAJCU1lbVNldChudWxscywgJ24nLCBudW1fcGh5c19hdHRycyAqIHNpemVvZihj aGFyKSk7CiAgCioqKioqKioqKioqKioqKgoqKiogMTcyNCwxNzMxICoqKioKICAJCQljaGFy CSAgICpzdHJpbmc7CiAgCQkJTGlzdENlbGwgICAqY3VyOwogIAohIAkJCS8qIEFjdHVhbGx5 IHJlYWQgdGhlIGxpbmUgaW50byBtZW1vcnkgaGVyZSAqLwohIAkJCWRvbmUgPSBjc3ZfbW9k ZSA/IAogIAkJCQlDb3B5UmVhZExpbmUocXVvdGUsIGVzY2FwZSkgOiBDb3B5UmVhZExpbmUo TlVMTCwgTlVMTCk7CiAgCiAgCQkJLyoKLS0tIDE5MTUsMTkyNCAtLS0tCiAgCQkJY2hhcgkg ICAqc3RyaW5nOwogIAkJCUxpc3RDZWxsICAgKmN1cjsKICAKISAJCQkvKgohIAkJCSAqIEFj dHVhbGx5IHJlYWQgdGhlIGxpbmUgaW50byBtZW1vcnkgaGVyZQohIAkJCSAqLwohIAkJCWRv bmUgPSBjc3ZfbW9kZSA/CiAgCQkJCUNvcHlSZWFkTGluZShxdW90ZSwgZXNjYXBlKSA6IENv cHlSZWFkTGluZShOVUxMLCBOVUxMKTsKICAKICAJCQkvKgoqKioqKioqKioqKioqKioKKioq IDE3MzksMTc0NSAqKioqCiAgCiAgCQkJaWYgKGZpbGVfaGFzX29pZHMpCiAgCQkJewohIAkJ CQkvKiBjYW4ndCBiZSBpbiBDU1YgbW9kZSBoZXJlICovCiAgCQkJCXN0cmluZyA9IENvcHlS ZWFkQXR0cmlidXRlKGRlbGltLCBudWxsX3ByaW50LAogIAkJCQkJCQkJCQkgICAmcmVzdWx0 LCAmaXNudWxsKTsKICAKLS0tIDE5MzIsMTk0MCAtLS0tCiAgCiAgCQkJaWYgKGZpbGVfaGFz X29pZHMpCiAgCQkJewohIAkJCQkvKgohIAkJCQkgKiBjYW4ndCBiZSBpbiBDU1YgbW9kZSBo ZXJlIAohIAkJCQkgKi8KICAJCQkJc3RyaW5nID0gQ29weVJlYWRBdHRyaWJ1dGUoZGVsaW0s IG51bGxfcHJpbnQsCiAgCQkJCQkJCQkJCSAgICZyZXN1bHQsICZpc251bGwpOwogIAoqKioq KioqKioqKioqKioKKioqIDE3NTEsMTc1NyAqKioqCiAgCQkJCXsKICAJCQkJCWNvcHlfYXR0 bmFtZSA9ICJvaWQiOwogIAkJCQkJbG9hZGVkX29pZCA9IERhdHVtR2V0T2JqZWN0SWQoRGly ZWN0RnVuY3Rpb25DYWxsMShvaWRpbiwKISAJCQkJCQkJCQkJCSAgIENTdHJpbmdHZXREYXR1 bShzdHJpbmcpKSk7CiAgCQkJCQlpZiAobG9hZGVkX29pZCA9PSBJbnZhbGlkT2lkKQogIAkJ CQkJCWVyZXBvcnQoRVJST1IsCiAgCQkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZ X0ZJTEVfRk9STUFUKSwKLS0tIDE5NDYsMTk1MyAtLS0tCiAgCQkJCXsKICAJCQkJCWNvcHlf YXR0bmFtZSA9ICJvaWQiOwogIAkJCQkJbG9hZGVkX29pZCA9IERhdHVtR2V0T2JqZWN0SWQo RGlyZWN0RnVuY3Rpb25DYWxsMShvaWRpbiwKISAJCQkJCQkJCQkJCQkJCQkJCSAgQ1N0cmlu Z0dldERhdHVtCiEgCQkJCQkJCQkJCQkJCQkJCQkgIChzdHJpbmcpKSk7CiAgCQkJCQlpZiAo bG9hZGVkX29pZCA9PSBJbnZhbGlkT2lkKQogIAkJCQkJCWVyZXBvcnQoRVJST1IsCiAgCQkJ CQkJCQkoZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJTEVfRk9STUFUKSwKKioqKioqKioq KioqKioqCioqKiAxNzYwLDE3NjYgKioqKgogIAkJCQl9CiAgCQkJfQogIAohIAkJCS8qIExv b3AgdG8gcmVhZCB0aGUgdXNlciBhdHRyaWJ1dGVzIG9uIHRoZSBsaW5lLiAqLwogIAkJCWZv cmVhY2goY3VyLCBhdHRudW1saXN0KQogIAkJCXsKICAJCQkJaW50CQkJYXR0bnVtID0gbGZp cnN0X2ludChjdXIpOwotLS0gMTk1NiwxOTY0IC0tLS0KICAJCQkJfQogIAkJCX0KICAKISAJ CQkvKgohIAkJCSAqIExvb3AgdG8gcmVhZCB0aGUgdXNlciBhdHRyaWJ1dGVzIG9uIHRoZSBs aW5lLgohIAkJCSAqLwogIAkJCWZvcmVhY2goY3VyLCBhdHRudW1saXN0KQogIAkJCXsKICAJ CQkJaW50CQkJYXR0bnVtID0gbGZpcnN0X2ludChjdXIpOwoqKioqKioqKioqKioqKioKKioq IDE3NzksMTc4OSAqKioqCiAgCQkJCWlmIChjc3ZfbW9kZSkKICAJCQkJewogIAkJCQkJc3Ry aW5nID0gQ29weVJlYWRBdHRyaWJ1dGVDU1YoZGVsaW0sIG51bGxfcHJpbnQsIHF1b3RlLAoh IAkJCQkJCQkJCQkJICAgZXNjYXBlLCAmcmVzdWx0LCAmaXNudWxsKTsKICAJCQkJCWlmIChy ZXN1bHQgPT0gVU5URVJNSU5BVEVEX0ZJRUxEKQogIAkJCQkJCWVyZXBvcnQoRVJST1IsCiAg CQkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJTEVfRk9STUFUKSwKISAJCQkJ CQkJICAgZXJybXNnKCJ1bnRlcm1pbmF0ZWQgQ1NWIHF1b3RlZCBmaWVsZCIpKSk7CiAgCQkJ CX0KICAJCQkJZWxzZQogIAkJCQkJc3RyaW5nID0gQ29weVJlYWRBdHRyaWJ1dGUoZGVsaW0s IG51bGxfcHJpbnQsCi0tLSAxOTc3LDE5ODcgLS0tLQogIAkJCQlpZiAoY3N2X21vZGUpCiAg CQkJCXsKICAJCQkJCXN0cmluZyA9IENvcHlSZWFkQXR0cmlidXRlQ1NWKGRlbGltLCBudWxs X3ByaW50LCBxdW90ZSwKISAJCQkJCQkJCQkJCQkgIGVzY2FwZSwgJnJlc3VsdCwgJmlzbnVs bCk7CiAgCQkJCQlpZiAocmVzdWx0ID09IFVOVEVSTUlOQVRFRF9GSUVMRCkKICAJCQkJCQll cmVwb3J0KEVSUk9SLAogIAkJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxF X0ZPUk1BVCksCiEgCQkJCQkJCQkgZXJybXNnKCJ1bnRlcm1pbmF0ZWQgQ1NWIHF1b3RlZCBm aWVsZCIpKSk7CiAgCQkJCX0KICAJCQkJZWxzZQogIAkJCQkJc3RyaW5nID0gQ29weVJlYWRB dHRyaWJ1dGUoZGVsaW0sIG51bGxfcHJpbnQsCioqKioqKioqKioqKioqKgoqKiogMTc5NSwx ODA4ICoqKioKICAJCQkJCWlzbnVsbCA9IGZhbHNlOwogIAkJCQl9CiAgCiEgCQkJCS8qIHdl IHJlYWQgYW4gU1FMIE5VTEwsIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcgKi8KICAJCQkJaWYg KCFpc251bGwpCiAgCQkJCXsKICAJCQkJCWNvcHlfYXR0bmFtZSA9IE5hbWVTdHIoYXR0cltt XS0+YXR0bmFtZSk7CiAgCQkJCQl2YWx1ZXNbbV0gPSBGdW5jdGlvbkNhbGwzKCZpbl9mdW5j dGlvbnNbbV0sCiAgCQkJCQkJCQkJCQkgIENTdHJpbmdHZXREYXR1bShzdHJpbmcpLAohIAkJ CQkJCQkJCQlPYmplY3RJZEdldERhdHVtKHR5cGlvcGFyYW1zW21dKSwKISAJCQkJCQkJCQkg IEludDMyR2V0RGF0dW0oYXR0clttXS0+YXR0dHlwbW9kKSk7CiAgCQkJCQludWxsc1ttXSA9 ICcgJzsKICAJCQkJCWNvcHlfYXR0bmFtZSA9IE5VTEw7CiAgCQkJCX0KLS0tIDE5OTMsMjAw OSAtLS0tCiAgCQkJCQlpc251bGwgPSBmYWxzZTsKICAJCQkJfQogIAohIAkJCQkvKgohIAkJ CQkgKiB3ZSByZWFkIGFuIFNRTCBOVUxMLCBubyBuZWVkIHRvIGRvIGFueXRoaW5nCiEgCQkJ CSAqLwogIAkJCQlpZiAoIWlzbnVsbCkKICAJCQkJewogIAkJCQkJY29weV9hdHRuYW1lID0g TmFtZVN0cihhdHRyW21dLT5hdHRuYW1lKTsKICAJCQkJCXZhbHVlc1ttXSA9IEZ1bmN0aW9u Q2FsbDMoJmluX2Z1bmN0aW9uc1ttXSwKICAJCQkJCQkJCQkJCSAgQ1N0cmluZ0dldERhdHVt KHN0cmluZyksCiEgCQkJCQkJCQkJCQkgIE9iamVjdElkR2V0RGF0dW0odHlwaW9wYXJhbXNb bV0pLAohIAkJCQkJCQkJCQkJICBJbnQzMkdldERhdHVtKGF0dHJbbV0tPgohIAkJCQkJCQkJ CQkJCQkJCWF0dHR5cG1vZCkpOwogIAkJCQkJbnVsbHNbbV0gPSAnICc7CiAgCQkJCQljb3B5 X2F0dG5hbWUgPSBOVUxMOwogIAkJCQl9CioqKioqKioqKioqKioqKgoqKiogMTgxOCwxODI4 ICoqKioKICAJCQlpZiAocmVzdWx0ID09IE5PUk1BTF9BVFRSICYmIGxpbmVfYnVmLmxlbiAh PSAwKQogIAkJCQllcmVwb3J0KEVSUk9SLAogIAkJCQkJCShlcnJjb2RlKEVSUkNPREVfQkFE X0NPUFlfRklMRV9GT1JNQVQpLAohIAkJCQkJICAgZXJybXNnKCJleHRyYSBkYXRhIGFmdGVy IGxhc3QgZXhwZWN0ZWQgY29sdW1uIikpKTsKICAJCX0KICAJCWVsc2UKICAJCXsKISAJCQkv KiBiaW5hcnkgKi8KICAJCQlpbnQxNgkJZmxkX2NvdW50OwogIAkJCUxpc3RDZWxsICAgKmN1 cjsKICAKLS0tIDIwMTksMjAzMSAtLS0tCiAgCQkJaWYgKHJlc3VsdCA9PSBOT1JNQUxfQVRU UiAmJiBsaW5lX2J1Zi5sZW4gIT0gMCkKICAJCQkJZXJlcG9ydChFUlJPUiwKICAJCQkJCQko ZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJTEVfRk9STUFUKSwKISAJCQkJCQkgZXJybXNn KCJleHRyYSBkYXRhIGFmdGVyIGxhc3QgZXhwZWN0ZWQgY29sdW1uIikpKTsKICAJCX0KICAJ CWVsc2UKICAJCXsKISAJCQkvKgohIAkJCSAqIGJpbmFyeQohIAkJCSAqLwogIAkJCWludDE2 CQlmbGRfY291bnQ7CiAgCQkJTGlzdENlbGwgICAqY3VyOwogIAoqKioqKioqKioqKioqKioK KioqIDE4NDQsMTg1MSAqKioqCiAgCQkJCWNvcHlfYXR0bmFtZSA9ICJvaWQiOwogIAkJCQls b2FkZWRfb2lkID0KICAJCQkJCURhdHVtR2V0T2JqZWN0SWQoQ29weVJlYWRCaW5hcnlBdHRy aWJ1dGUoMCwKISAJCQkJCQkJCQkJCQkJCSZvaWRfaW5fZnVuY3Rpb24sCiEgCQkJCQkJCQkJ CQkJCQkgIG9pZF90eXBpb3BhcmFtLAogIAkJCQkJCQkJCQkJCQkJCSAmaXNudWxsKSk7CiAg CQkJCWlmIChpc251bGwgfHwgbG9hZGVkX29pZCA9PSBJbnZhbGlkT2lkKQogIAkJCQkJZXJl cG9ydChFUlJPUiwKLS0tIDIwNDcsMjA1NCAtLS0tCiAgCQkJCWNvcHlfYXR0bmFtZSA9ICJv aWQiOwogIAkJCQlsb2FkZWRfb2lkID0KICAJCQkJCURhdHVtR2V0T2JqZWN0SWQoQ29weVJl YWRCaW5hcnlBdHRyaWJ1dGUoMCwKISAJCQkJCQkJCQkJCQkJCQkgJm9pZF9pbl9mdW5jdGlv biwKISAJCQkJCQkJCQkJCQkJCQkgb2lkX3R5cGlvcGFyYW0sCiAgCQkJCQkJCQkJCQkJCQkJ ICZpc251bGwpKTsKICAJCQkJaWYgKGlzbnVsbCB8fCBsb2FkZWRfb2lkID09IEludmFsaWRP aWQpCiAgCQkJCQllcmVwb3J0KEVSUk9SLAoqKioqKioqKioqKioqKioKKioqIDE4NjQsMTg3 MSAqKioqCiAgCQkJCWkrKzsKICAJCQkJdmFsdWVzW21dID0gQ29weVJlYWRCaW5hcnlBdHRy aWJ1dGUoaSwKICAJCQkJCQkJCQkJCQkJJmluX2Z1bmN0aW9uc1ttXSwKISAJCQkJCQkJCQkJ CQkJdHlwaW9wYXJhbXNbbV0sCiEgCQkJCQkJCQkJCQkJCSZpc251bGwpOwogIAkJCQludWxs c1ttXSA9IGlzbnVsbCA/ICduJyA6ICcgJzsKICAJCQkJY29weV9hdHRuYW1lID0gTlVMTDsK ICAJCQl9Ci0tLSAyMDY3LDIwNzMgLS0tLQogIAkJCQlpKys7CiAgCQkJCXZhbHVlc1ttXSA9 IENvcHlSZWFkQmluYXJ5QXR0cmlidXRlKGksCiAgCQkJCQkJCQkJCQkJCSZpbl9mdW5jdGlv bnNbbV0sCiEgCQkJCQkJCQkJCQkJCXR5cGlvcGFyYW1zW21dLCAmaXNudWxsKTsKICAJCQkJ bnVsbHNbbV0gPSBpc251bGwgPyAnbicgOiAnICc7CiAgCQkJCWNvcHlfYXR0bmFtZSA9IE5V TEw7CiAgCQkJfQoqKioqKioqKioqKioqKioKKioqIDE4ODQsMTg5MCAqKioqCiAgCQkJCW51 bGxzW2RlZm1hcFtpXV0gPSAnICc7CiAgCQl9CiAgCiEgCQkvKiBOZXh0IGFwcGx5IGFueSBk b21haW4gY29uc3RyYWludHMgKi8KICAJCWlmIChoYXNDb25zdHJhaW50cykKICAJCXsKICAJ CQlQYXJhbUV4ZWNEYXRhICpwcm1kYXRhID0gJmVjb250ZXh0LT5lY3h0X3BhcmFtX2V4ZWNf dmFsc1swXTsKLS0tIDIwODYsMjA5NCAtLS0tCiAgCQkJCW51bGxzW2RlZm1hcFtpXV0gPSAn ICc7CiAgCQl9CiAgCiEgCQkvKgohIAkJICogTmV4dCBhcHBseSBhbnkgZG9tYWluIGNvbnN0 cmFpbnRzCiEgCQkgKi8KICAJCWlmIChoYXNDb25zdHJhaW50cykKICAJCXsKICAJCQlQYXJh bUV4ZWNEYXRhICpwcm1kYXRhID0gJmVjb250ZXh0LT5lY3h0X3BhcmFtX2V4ZWNfdmFsc1sw XTsKKioqKioqKioqKioqKioqCioqKiAxODk2LDE5MDIgKioqKgogIAkJCQlpZiAoZXhwcnN0 YXRlID09IE5VTEwpCiAgCQkJCQljb250aW51ZTsJLyogbm8gY29uc3RyYWludCBmb3IgdGhp cyBhdHRyICovCiAgCiEgCQkJCS8qIEluc2VydCBjdXJyZW50IHJvdydzIHZhbHVlIGludG8g dGhlIFBhcmFtIHZhbHVlICovCiAgCQkJCXBybWRhdGEtPnZhbHVlID0gdmFsdWVzW2ldOwog IAkJCQlwcm1kYXRhLT5pc251bGwgPSAobnVsbHNbaV0gPT0gJ24nKTsKICAKLS0tIDIxMDAs MjEwOCAtLS0tCiAgCQkJCWlmIChleHByc3RhdGUgPT0gTlVMTCkKICAJCQkJCWNvbnRpbnVl OwkvKiBubyBjb25zdHJhaW50IGZvciB0aGlzIGF0dHIgKi8KICAKISAJCQkJLyoKISAJCQkJ ICogSW5zZXJ0IGN1cnJlbnQgcm93J3MgdmFsdWUgaW50byB0aGUgUGFyYW0gdmFsdWUgCiEg CQkJCSAqLwogIAkJCQlwcm1kYXRhLT52YWx1ZSA9IHZhbHVlc1tpXTsKICAJCQkJcHJtZGF0 YS0+aXNudWxsID0gKG51bGxzW2ldID09ICduJyk7CiAgCioqKioqKioqKioqKioqKgoqKiog MTkwNSwxOTI4ICoqKioKICAJCQkJICogZXhwcmVzc2lvbiB0byByZXBsYWNlIHRoZSB2YWx1 ZSAoY29uc2lkZXIgZS5nLiBhCiAgCQkJCSAqIHRpbWVzdGFtcCBwcmVjaXNpb24gcmVzdHJp Y3Rpb24pLgogIAkJCQkgKi8KISAJCQkJdmFsdWVzW2ldID0gRXhlY0V2YWxFeHByKGV4cHJz dGF0ZSwgZWNvbnRleHQsCiEgCQkJCQkJCQkJCSAmaXNudWxsLCBOVUxMKTsKICAJCQkJbnVs bHNbaV0gPSBpc251bGwgPyAnbicgOiAnICc7CiAgCQkJfQogIAkJfQogIAohIAkJLyogQW5k IG5vdyB3ZSBjYW4gZm9ybSB0aGUgaW5wdXQgdHVwbGUuICovCiAgCQl0dXBsZSA9IGhlYXBf Zm9ybXR1cGxlKHR1cERlc2MsIHZhbHVlcywgbnVsbHMpOwogIAogIAkJaWYgKG9pZHMgJiYg ZmlsZV9oYXNfb2lkcykKICAJCQlIZWFwVHVwbGVTZXRPaWQodHVwbGUsIGxvYWRlZF9vaWQp OwogIAohIAkJLyogVHJpZ2dlcnMgYW5kIHN0dWZmIG5lZWQgdG8gYmUgaW52b2tlZCBpbiBx dWVyeSBjb250ZXh0LiAqLwogIAkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRleHQp OwogIAogIAkJc2tpcF90dXBsZSA9IGZhbHNlOwogIAohIAkJLyogQkVGT1JFIFJPVyBJTlNF UlQgVHJpZ2dlcnMgKi8KICAJCWlmIChyZXN1bHRSZWxJbmZvLT5yaV9UcmlnRGVzYyAmJgog IAkJCXJlc3VsdFJlbEluZm8tPnJpX1RyaWdEZXNjLT5uX2JlZm9yZV9yb3dbVFJJR0dFUl9F VkVOVF9JTlNFUlRdID4gMCkKICAJCXsKLS0tIDIxMTEsMjEzOSAtLS0tCiAgCQkJCSAqIGV4 cHJlc3Npb24gdG8gcmVwbGFjZSB0aGUgdmFsdWUgKGNvbnNpZGVyIGUuZy4gYQogIAkJCQkg KiB0aW1lc3RhbXAgcHJlY2lzaW9uIHJlc3RyaWN0aW9uKS4KICAJCQkJICovCiEgCQkJCXZh bHVlc1tpXSA9IEV4ZWNFdmFsRXhwcihleHByc3RhdGUsIGVjb250ZXh0LCAmaXNudWxsLCBO VUxMKTsKICAJCQkJbnVsbHNbaV0gPSBpc251bGwgPyAnbicgOiAnICc7CiAgCQkJfQogIAkJ fQogIAohIAkJLyoKISAJCSAqIEFuZCBub3cgd2UgY2FuIGZvcm0gdGhlIGlucHV0IHR1cGxl LgohIAkJICovCiAgCQl0dXBsZSA9IGhlYXBfZm9ybXR1cGxlKHR1cERlc2MsIHZhbHVlcywg bnVsbHMpOwogIAogIAkJaWYgKG9pZHMgJiYgZmlsZV9oYXNfb2lkcykKICAJCQlIZWFwVHVw bGVTZXRPaWQodHVwbGUsIGxvYWRlZF9vaWQpOwogIAohIAkJLyoKISAJCSAqIFRyaWdnZXJz IGFuZCBzdHVmZiBuZWVkIHRvIGJlIGludm9rZWQgaW4gcXVlcnkgY29udGV4dC4KISAJCSAq LwogIAkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOwogIAogIAkJc2tpcF90 dXBsZSA9IGZhbHNlOwogIAohIAkJLyoKISAJCSAqIEJFRk9SRSBST1cgSU5TRVJUIFRyaWdn ZXJzCiEgCQkgKi8KICAJCWlmIChyZXN1bHRSZWxJbmZvLT5yaV9UcmlnRGVzYyAmJgogIAkJ CXJlc3VsdFJlbEluZm8tPnJpX1RyaWdEZXNjLT5uX2JlZm9yZV9yb3dbVFJJR0dFUl9FVkVO VF9JTlNFUlRdID4gMCkKICAJCXsKKioqKioqKioqKioqKioqCioqKiAxOTQxLDE5NzMgKioq KgogIAogIAkJaWYgKCFza2lwX3R1cGxlKQogIAkJewohIAkJCS8qIFBsYWNlIHR1cGxlIGlu IHR1cGxlIHNsb3QgKi8KICAJCQlFeGVjU3RvcmVUdXBsZSh0dXBsZSwgc2xvdCwgSW52YWxp ZEJ1ZmZlciwgZmFsc2UpOwogIAohIAkJCS8qIENoZWNrIHRoZSBjb25zdHJhaW50cyBvZiB0 aGUgdHVwbGUgKi8KICAJCQlpZiAocmVsLT5yZF9hdHQtPmNvbnN0cikKICAJCQkJRXhlY0Nv bnN0cmFpbnRzKHJlc3VsdFJlbEluZm8sIHNsb3QsIGVzdGF0ZSk7CiAgCiEgCQkJLyogT0ss IHN0b3JlIHRoZSB0dXBsZSBhbmQgY3JlYXRlIGluZGV4IGVudHJpZXMgZm9yIGl0ICovCiAg CQkJc2ltcGxlX2hlYXBfaW5zZXJ0KHJlbCwgdHVwbGUpOwogIAogIAkJCWlmIChyZXN1bHRS ZWxJbmZvLT5yaV9OdW1JbmRpY2VzID4gMCkKICAJCQkJRXhlY0luc2VydEluZGV4VHVwbGVz KHNsb3QsICYodHVwbGUtPnRfc2VsZiksIGVzdGF0ZSwgZmFsc2UpOwogIAohIAkJCS8qIEFG VEVSIFJPVyBJTlNFUlQgVHJpZ2dlcnMgKi8KICAJCQlFeGVjQVJJbnNlcnRUcmlnZ2Vycyhl c3RhdGUsIHJlc3VsdFJlbEluZm8sIHR1cGxlKTsKICAJCX0KICAJfQogIAohIAkvKiBEb25l LCBjbGVhbiB1cCAqLwogIAllcnJvcl9jb250ZXh0X3N0YWNrID0gZXJyY29udGV4dC5wcmV2 aW91czsKICAKICAJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOwogIAohIAkv KiBFeGVjdXRlIEFGVEVSIFNUQVRFTUVOVCBpbnNlcnRpb24gdHJpZ2dlcnMgKi8KICAJRXhl Y0FTSW5zZXJ0VHJpZ2dlcnMoZXN0YXRlLCByZXN1bHRSZWxJbmZvKTsKICAKISAJLyogSGFu ZGxlIHF1ZXVlZCBBRlRFUiB0cmlnZ2VycyAqLwogIAlBZnRlclRyaWdnZXJFbmRRdWVyeShl c3RhdGUpOwogIAogIAlwZnJlZSh2YWx1ZXMpOwotLS0gMjE1MiwyMTk4IC0tLS0KICAKICAJ CWlmICghc2tpcF90dXBsZSkKICAJCXsKISAJCQkvKgohIAkJCSAqIFBsYWNlIHR1cGxlIGlu IHR1cGxlIHNsb3QKISAJCQkgKi8KICAJCQlFeGVjU3RvcmVUdXBsZSh0dXBsZSwgc2xvdCwg SW52YWxpZEJ1ZmZlciwgZmFsc2UpOwogIAohIAkJCS8qCiEgCQkJICogQ2hlY2sgdGhlIGNv bnN0cmFpbnRzIG9mIHRoZSB0dXBsZQohIAkJCSAqLwogIAkJCWlmIChyZWwtPnJkX2F0dC0+ Y29uc3RyKQogIAkJCQlFeGVjQ29uc3RyYWludHMocmVzdWx0UmVsSW5mbywgc2xvdCwgZXN0 YXRlKTsKICAKISAJCQkvKgohIAkJCSAqIE9LLCBzdG9yZSB0aGUgdHVwbGUgYW5kIGNyZWF0 ZSBpbmRleCBlbnRyaWVzIGZvciBpdAohIAkJCSAqLwogIAkJCXNpbXBsZV9oZWFwX2luc2Vy dChyZWwsIHR1cGxlKTsKICAKICAJCQlpZiAocmVzdWx0UmVsSW5mby0+cmlfTnVtSW5kaWNl cyA+IDApCiAgCQkJCUV4ZWNJbnNlcnRJbmRleFR1cGxlcyhzbG90LCAmKHR1cGxlLT50X3Nl bGYpLCBlc3RhdGUsIGZhbHNlKTsKICAKISAJCQkvKgohIAkJCSAqIEFGVEVSIFJPVyBJTlNF UlQgVHJpZ2dlcnMKISAJCQkgKi8KICAJCQlFeGVjQVJJbnNlcnRUcmlnZ2Vycyhlc3RhdGUs IHJlc3VsdFJlbEluZm8sIHR1cGxlKTsKICAJCX0KICAJfQogIAohIAkvKgohIAkgKiBEb25l LCBjbGVhbiB1cAohIAkgKi8KICAJZXJyb3JfY29udGV4dF9zdGFjayA9IGVycmNvbnRleHQu cHJldmlvdXM7CiAgCiAgCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjb250ZXh0KTsKICAK ISAJLyoKISAJICogRXhlY3V0ZSBBRlRFUiBTVEFURU1FTlQgaW5zZXJ0aW9uIHRyaWdnZXJz CiEgCSAqLwogIAlFeGVjQVNJbnNlcnRUcmlnZ2Vycyhlc3RhdGUsIHJlc3VsdFJlbEluZm8p OwogIAohIAkvKgohIAkgKiBIYW5kbGUgcXVldWVkIEFGVEVSIHRyaWdnZXJzCiEgCSAqLwog IAlBZnRlclRyaWdnZXJFbmRRdWVyeShlc3RhdGUpOwogIAogIAlwZnJlZSh2YWx1ZXMpOwoq KioqKioqKioqKioqKioKKioqIDE5OTYsMjAwMiAqKioqCiAgICogYnkgbmV3bGluZS4KICAg Ki8KICBzdGF0aWMgYm9vbAohIENvcHlSZWFkTGluZShjaGFyICogcXVvdGUsIGNoYXIgKiBl c2NhcGUpCiAgewogIAlib29sCQlyZXN1bHQ7CiAgCWJvb2wJCWNoYW5nZV9lbmNvZGluZyA9 IChjbGllbnRfZW5jb2RpbmcgIT0gc2VydmVyX2VuY29kaW5nKTsKLS0tIDIyMjEsMjIyNyAt LS0tCiAgICogYnkgbmV3bGluZS4KICAgKi8KICBzdGF0aWMgYm9vbAohIENvcHlSZWFkTGlu ZShjaGFyICpxdW90ZSwgY2hhciAqZXNjYXBlKQogIHsKICAJYm9vbAkJcmVzdWx0OwogIAli b29sCQljaGFuZ2VfZW5jb2RpbmcgPSAoY2xpZW50X2VuY29kaW5nICE9IHNlcnZlcl9lbmNv ZGluZyk7CioqKioqKioqKioqKioqKgoqKiogMjAwNSwyMDE5ICoqKioKICAJaW50CQkJajsK ICAJdW5zaWduZWQgY2hhciBzWzJdOwogIAljaGFyCSAgICpjdnQ7CiEgCWJvb2wgICAgICAg IGluX3F1b3RlID0gZmFsc2UsIGxhc3Rfd2FzX2VzYyA9IGZhbHNlLCBjc3ZfbW9kZSA9IGZh bHNlOwohIAljaGFyICAgICAgICBxdW90ZWMgPSAnXDAnLCBlc2NhcGVjID0gJ1wwJzsKICAK ICAJaWYgKHF1b3RlKQogIAl7CiAgCQljc3ZfbW9kZSA9IHRydWU7CiAgCQlxdW90ZWMgPSBx dW90ZVswXTsKICAJCWVzY2FwZWMgPSBlc2NhcGVbMF07CiEgCQkvKiBpZ25vcmUgc3BlY2lh bCBlc2NhcGUgcHJvY2Vzc2luZyBpZiBpdCdzIHRoZSBzYW1lIGFzIHF1b3RlYyAqLwogIAkJ aWYgKHF1b3RlYyA9PSBlc2NhcGVjKQogIAkJCWVzY2FwZWMgPSAnXDAnOwogIAl9Ci0tLSAy MjMwLDIyNDkgLS0tLQogIAlpbnQJCQlqOwogIAl1bnNpZ25lZCBjaGFyIHNbMl07CiAgCWNo YXIJICAgKmN2dDsKISAJYm9vbAkJaW5fcXVvdGUgPSBmYWxzZSwKISAJCWxhc3Rfd2FzX2Vz YyA9IGZhbHNlLAohIAkJY3N2X21vZGUgPSBmYWxzZTsKISAJY2hhcgkJcXVvdGVjID0gJ1ww JywKISAJCWVzY2FwZWMgPSAnXDAnOwogIAogIAlpZiAocXVvdGUpCiAgCXsKICAJCWNzdl9t b2RlID0gdHJ1ZTsKICAJCXF1b3RlYyA9IHF1b3RlWzBdOwogIAkJZXNjYXBlYyA9IGVzY2Fw ZVswXTsKISAJCS8qCiEgCQkgKiBpZ25vcmUgc3BlY2lhbCBlc2NhcGUgcHJvY2Vzc2luZyBp ZiBpdCdzIHRoZSBzYW1lIGFzIHF1b3RlYyAKISAJCSAqLwogIAkJaWYgKHF1b3RlYyA9PSBl c2NhcGVjKQogIAkJCWVzY2FwZWMgPSAnXDAnOwogIAl9CioqKioqKioqKioqKioqKgoqKiog MjAyMSwyMDUxICoqKioKICAKICAJc1sxXSA9IDA7CiAgCiEgCS8qIHJlc2V0IGxpbmVfYnVm IHRvIGVtcHR5ICovCiAgCWxpbmVfYnVmLmxlbiA9IDA7CiAgCWxpbmVfYnVmLmRhdGFbMF0g PSAnXDAnOwogIAlsaW5lX2J1Zi5jdXJzb3IgPSAwOwogIAohIAkvKiBtYXJrIHRoYXQgZW5j b2RpbmcgY29udmVyc2lvbiBoYXNuJ3Qgb2NjdXJyZWQgeWV0ICovCiAgCWxpbmVfYnVmX2Nv bnZlcnRlZCA9IGZhbHNlOwogIAohIAkvKiBzZXQgZGVmYXVsdCBzdGF0dXMgKi8KICAJcmVz dWx0ID0gZmFsc2U7CiAgCiAgCS8qCiAgCSAqIEluIHRoaXMgbG9vcCB3ZSBvbmx5IGNhcmUg Zm9yIGRldGVjdGluZyBuZXdsaW5lcyAoXHIgYW5kL29yIFxuKSBhbmQKISAJICogdGhlIGVu ZC1vZi1jb3B5IG1hcmtlciAoXC4pLiAgCiAgCSAqCiAgCSAqIEluIFRleHQgbW9kZSwgZm9y IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdlIGFsbG93CiAgCSAqIGJhY2tzbGFzaGVzIHRv IGVzY2FwZSBuZXdsaW5lIGNoYXJhY3RlcnMuICBCYWNrc2xhc2hlcyBvdGhlciB0aGFuCiAg CSAqIHRoZSBlbmQgbWFya2VyIGdldCBwdXQgaW50byB0aGUgbGluZV9idWYsIHNpbmNlIENv cHlSZWFkQXR0cmlidXRlCiEgCSAqIGRvZXMgaXRzIG93biBlc2NhcGUgcHJvY2Vzc2luZy4J CiAgCSAqCiAgCSAqIEluIENTViBtb2RlLCBDUiBhbmQgTkwgaW5zaWRlIHEgcXVvdGVkIGZp ZWxkIGFyZSBqdXN0IHBhcnQgb2YgdGhlCiAgCSAqIGRhdGEgdmFsdWUgYW5kIGFyZSBwdXQg aW4gbGluZV9idWYuIFdlIGtlZXAganVzdCBlbm91Z2ggc3RhdGUKICAJICogdG8ga25vdyBp ZiB3ZSBhcmUgY3VycmVudGx5IGluIGEgcXVvdGVkIGZpZWxkIG9yIG5vdC4KICAJICoKISAJ ICogVGhlc2UgZm91ciBjaGFyYWN0ZXJzLCBhbmQgb25seSB0aGVzZSBmb3VyLCBhcmUgYXNz dW1lZCB0aGUgc2FtZSBpbiAKICAJICogZnJvbnRlbmQgYW5kIGJhY2tlbmQgZW5jb2Rpbmdz LgogIAkgKgogIAkgKiBXZSBkbyBub3QgYXNzdW1lIHRoYXQgc2Vjb25kIGFuZCBsYXRlciBi eXRlcyBvZiBhIGZyb250ZW5kCi0tLSAyMjUxLDIyODcgLS0tLQogIAogIAlzWzFdID0gMDsK ICAKISAJLyoKISAJICogcmVzZXQgbGluZV9idWYgdG8gZW1wdHkKISAJICovCiAgCWxpbmVf YnVmLmxlbiA9IDA7CiAgCWxpbmVfYnVmLmRhdGFbMF0gPSAnXDAnOwogIAlsaW5lX2J1Zi5j dXJzb3IgPSAwOwogIAohIAkvKgohIAkgKiBtYXJrIHRoYXQgZW5jb2RpbmcgY29udmVyc2lv biBoYXNuJ3Qgb2NjdXJyZWQgeWV0IAohIAkgKi8KICAJbGluZV9idWZfY29udmVydGVkID0g ZmFsc2U7CiAgCiEgCS8qCiEgCSAqIHNldCBkZWZhdWx0IHN0YXR1cwohIAkgKi8KICAJcmVz dWx0ID0gZmFsc2U7CiAgCiAgCS8qCiAgCSAqIEluIHRoaXMgbG9vcCB3ZSBvbmx5IGNhcmUg Zm9yIGRldGVjdGluZyBuZXdsaW5lcyAoXHIgYW5kL29yIFxuKSBhbmQKISAJICogdGhlIGVu ZC1vZi1jb3B5IG1hcmtlciAoXC4pLgogIAkgKgogIAkgKiBJbiBUZXh0IG1vZGUsIGZvciBi YWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3ZSBhbGxvdwogIAkgKiBiYWNrc2xhc2hlcyB0byBl c2NhcGUgbmV3bGluZSBjaGFyYWN0ZXJzLiAgQmFja3NsYXNoZXMgb3RoZXIgdGhhbgogIAkg KiB0aGUgZW5kIG1hcmtlciBnZXQgcHV0IGludG8gdGhlIGxpbmVfYnVmLCBzaW5jZSBDb3B5 UmVhZEF0dHJpYnV0ZQohIAkgKiBkb2VzIGl0cyBvd24gZXNjYXBlIHByb2Nlc3NpbmcuCiAg CSAqCiAgCSAqIEluIENTViBtb2RlLCBDUiBhbmQgTkwgaW5zaWRlIHEgcXVvdGVkIGZpZWxk IGFyZSBqdXN0IHBhcnQgb2YgdGhlCiAgCSAqIGRhdGEgdmFsdWUgYW5kIGFyZSBwdXQgaW4g bGluZV9idWYuIFdlIGtlZXAganVzdCBlbm91Z2ggc3RhdGUKICAJICogdG8ga25vdyBpZiB3 ZSBhcmUgY3VycmVudGx5IGluIGEgcXVvdGVkIGZpZWxkIG9yIG5vdC4KICAJICoKISAJICog VGhlc2UgZm91ciBjaGFyYWN0ZXJzLCBhbmQgb25seSB0aGVzZSBmb3VyLCBhcmUgYXNzdW1l ZCB0aGUgc2FtZSBpbgogIAkgKiBmcm9udGVuZCBhbmQgYmFja2VuZCBlbmNvZGluZ3MuCiAg CSAqCiAgCSAqIFdlIGRvIG5vdCBhc3N1bWUgdGhhdCBzZWNvbmQgYW5kIGxhdGVyIGJ5dGVz IG9mIGEgZnJvbnRlbmQKKioqKioqKioqKioqKioqCioqKiAyMDYyLDIxMDggKioqKgogIAog IAkJaWYgKGNzdl9tb2RlKQogIAkJewohIAkJCS8qICAKICAJCQkgKiBEZWFsaW5nIHdpdGgg cXVvdGVzIGFuZCBlc2NhcGVzIGhlcmUgaXMgbWlsZGx5IHRyaWNreS4gSWYgdGhlCiAgCQkJ ICogcXVvdGUgY2hhciBpcyBhbHNvIHRoZSBlc2NhcGUgY2hhciwgdGhlcmUncyBubyBwcm9i bGVtIC0gd2UgIAogIAkJCSAqIGp1c3QgdXNlIHRoZSBjaGFyIGFzIGEgdG9nZ2xlLiBJZiB0 aGV5IGFyZSBkaWZmZXJlbnQsIHdlIG5lZWQKICAJCQkgKiB0byBlbnN1cmUgdGhhdCB3ZSBv bmx5IHRha2UgYWNjb3VudCBvZiBhbiBlc2NhcGUgaW5zaWRlIGEgcXVvdGVkCiAgCQkJICog ZmllbGQgYW5kIGltbWVkaWF0ZWx5IHByZWNlZGluZyBhIHF1b3RlIGNoYXIsIGFuZCBub3Qg dGhlCiAgCQkJICogc2Vjb25kIGluIGEgZXNjYXBlLWVzY2FwZSBzZXF1ZW5jZS4KISAJCQkg Ki8gCiAgCiAgCQkJaWYgKGluX3F1b3RlICYmIGMgPT0gZXNjYXBlYykKISAJCQkJbGFzdF93 YXNfZXNjID0gISBsYXN0X3dhc19lc2M7CiEgCQkJaWYgKGMgPT0gcXVvdGVjICYmICEgbGFz dF93YXNfZXNjKQohIAkJCQlpbl9xdW90ZSA9ICEgaW5fcXVvdGU7CiAgCQkJaWYgKGMgIT0g ZXNjYXBlYykKICAJCQkJbGFzdF93YXNfZXNjID0gZmFsc2U7CiAgCiAgCQkJLyoKISAJCQkg KiB1cGRhdGluZyB0aGUgbGluZSBjb3VudCBmb3IgZW1iZWRkZWQgQ1IgYW5kL29yIExGIGNo YXJzIGlzIAohIAkJCSAqIG5lY2Vzc2FyaWx5IGEgbGl0dGxlIGZyYWdpbGUgLSB0aGlzIHRl c3QgaXMgcHJvYmFibHkgYWJvdXQgCiAgCQkJICogdGhlIGJlc3Qgd2UgY2FuIGRvLgohIAkJ CSAqLyAKISAJCQlpZiAoaW5fcXVvdGUgJiYgYyA9PSAoZW9sX3R5cGUgPT0gRU9MX0NSID8g J1xyJyA6ICdcbicpKSAKISAJCQkJY29weV9saW5lbm8rKzsgCiAgCQl9CiAgCiAgCQlpZiAo IWluX3F1b3RlICYmIGMgPT0gJ1xyJykKICAJCXsKICAJCQlpZiAoZW9sX3R5cGUgPT0gRU9M X05MKQogIAkJCXsKISAJCQkJaWYgKCEgY3N2X21vZGUpCiAgCQkJCQllcmVwb3J0KEVSUk9S LAogIAkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJTEVfRk9STUFUKSwKICAJ CQkJCQkJIGVycm1zZygibGl0ZXJhbCBjYXJyaWFnZSByZXR1cm4gZm91bmQgaW4gZGF0YSIp LAohIAkJCQkJCQkgZXJyaGludCgiVXNlIFwiXFxyXCIgdG8gcmVwcmVzZW50IGNhcnJpYWdl IHJldHVybi4iKSkpOwogIAkJCQllbHNlCiAgCQkJCQllcmVwb3J0KEVSUk9SLAogIAkJCQkJ CQkoZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJTEVfRk9STUFUKSwKISAJCQkJCQkJIGVy cm1zZygidW5xdW90ZWQgY2FycmlhZ2UgcmV0dXJuIGZvdW5kIGluIENTViBkYXRhIiksCiEg CQkJCQkJCSBlcnJoaW50KCJVc2UgcXVvdGVkIENTViBmaWVsZCB0byByZXByZXNlbnQgY2Fy cmlhZ2UgcmV0dXJuLiIpKSk7CiAgCQkJfQohIAkJCS8qIENoZWNrIGZvciBcclxuIG9uIGZp cnN0IGxpbmUsIF9hbmRfIGhhbmRsZSBcclxuLiAqLwogIAkJCWlmIChlb2xfdHlwZSA9PSBF T0xfVU5LTk9XTiB8fCBlb2xfdHlwZSA9PSBFT0xfQ1JOTCkKICAJCQl7CiAgCQkJCWludAkJ CWMyID0gQ29weVBlZWtDaGFyKCk7Ci0tLSAyMjk4LDIzNDkgLS0tLQogIAogIAkJaWYgKGNz dl9tb2RlKQogIAkJewohIAkJCS8qCiAgCQkJICogRGVhbGluZyB3aXRoIHF1b3RlcyBhbmQg ZXNjYXBlcyBoZXJlIGlzIG1pbGRseSB0cmlja3kuIElmIHRoZQogIAkJCSAqIHF1b3RlIGNo YXIgaXMgYWxzbyB0aGUgZXNjYXBlIGNoYXIsIHRoZXJlJ3Mgbm8gcHJvYmxlbSAtIHdlICAK ICAJCQkgKiBqdXN0IHVzZSB0aGUgY2hhciBhcyBhIHRvZ2dsZS4gSWYgdGhleSBhcmUgZGlm ZmVyZW50LCB3ZSBuZWVkCiAgCQkJICogdG8gZW5zdXJlIHRoYXQgd2Ugb25seSB0YWtlIGFj Y291bnQgb2YgYW4gZXNjYXBlIGluc2lkZSBhIHF1b3RlZAogIAkJCSAqIGZpZWxkIGFuZCBp bW1lZGlhdGVseSBwcmVjZWRpbmcgYSBxdW90ZSBjaGFyLCBhbmQgbm90IHRoZQogIAkJCSAq IHNlY29uZCBpbiBhIGVzY2FwZS1lc2NhcGUgc2VxdWVuY2UuCiEgCQkJICovCiAgCiAgCQkJ aWYgKGluX3F1b3RlICYmIGMgPT0gZXNjYXBlYykKISAJCQkJbGFzdF93YXNfZXNjID0gIWxh c3Rfd2FzX2VzYzsKISAJCQlpZiAoYyA9PSBxdW90ZWMgJiYgIWxhc3Rfd2FzX2VzYykKISAJ CQkJaW5fcXVvdGUgPSAhaW5fcXVvdGU7CiAgCQkJaWYgKGMgIT0gZXNjYXBlYykKICAJCQkJ bGFzdF93YXNfZXNjID0gZmFsc2U7CiAgCiAgCQkJLyoKISAJCQkgKiB1cGRhdGluZyB0aGUg bGluZSBjb3VudCBmb3IgZW1iZWRkZWQgQ1IgYW5kL29yIExGIGNoYXJzIGlzCiEgCQkJICog bmVjZXNzYXJpbHkgYSBsaXR0bGUgZnJhZ2lsZSAtIHRoaXMgdGVzdCBpcyBwcm9iYWJseSBh Ym91dAogIAkJCSAqIHRoZSBiZXN0IHdlIGNhbiBkby4KISAJCQkgKi8KISAJCQlpZiAoaW5f cXVvdGUgJiYgYyA9PSAoZW9sX3R5cGUgPT0gRU9MX0NSID8gJ1xyJyA6ICdcbicpKQohIAkJ CQljb3B5X2xpbmVubysrOwogIAkJfQogIAogIAkJaWYgKCFpbl9xdW90ZSAmJiBjID09ICdc cicpCiAgCQl7CiAgCQkJaWYgKGVvbF90eXBlID09IEVPTF9OTCkKICAJCQl7CiEgCQkJCWlm ICghY3N2X21vZGUpCiAgCQkJCQllcmVwb3J0KEVSUk9SLAogIAkJCQkJCQkoZXJyY29kZShF UlJDT0RFX0JBRF9DT1BZX0ZJTEVfRk9STUFUKSwKICAJCQkJCQkJIGVycm1zZygibGl0ZXJh bCBjYXJyaWFnZSByZXR1cm4gZm91bmQgaW4gZGF0YSIpLAohIAkJCQkJCQkgZXJyaGludAoh IAkJCQkJCQkgKCJVc2UgXCJcXHJcIiB0byByZXByZXNlbnQgY2FycmlhZ2UgcmV0dXJuLiIp KSk7CiAgCQkJCWVsc2UKICAJCQkJCWVyZXBvcnQoRVJST1IsCiAgCQkJCQkJCShlcnJjb2Rl KEVSUkNPREVfQkFEX0NPUFlfRklMRV9GT1JNQVQpLAohIAkJCQkJCQkgZXJybXNnCiEgCQkJ CQkJCSAoInVucXVvdGVkIGNhcnJpYWdlIHJldHVybiBmb3VuZCBpbiBDU1YgZGF0YSIpLAoh IAkJCQkJCQkgZXJyaGludAohIAkJCQkJCQkgKCJVc2UgcXVvdGVkIENTViBmaWVsZCB0byBy ZXByZXNlbnQgY2FycmlhZ2UgcmV0dXJuLiIpKSk7CiAgCQkJfQohIAkJCS8qCiEgCQkJICog Q2hlY2sgZm9yIFxyXG4gb24gZmlyc3QgbGluZSwgX2FuZF8gaGFuZGxlIFxyXG4uCiEgCQkJ ICovCiAgCQkJaWYgKGVvbF90eXBlID09IEVPTF9VTktOT1dOIHx8IGVvbF90eXBlID09IEVP TF9DUk5MKQogIAkJCXsKICAJCQkJaW50CQkJYzIgPSBDb3B5UGVla0NoYXIoKTsKKioqKioq KioqKioqKioqCioqKiAyMTE0LDIxMzIgKioqKgogIAkJCQl9CiAgCQkJCWVsc2UKICAJCQkJ ewohIAkJCQkJLyogZm91bmQgXHIsIGJ1dCBubyBcbiAqLwogIAkJCQkJaWYgKGVvbF90eXBl ID09IEVPTF9DUk5MKQogIAkJCQkJewogIAkJCQkJCWlmICghY3N2X21vZGUpCiAgCQkJCQkJ CWVyZXBvcnQoRVJST1IsCiAgCQkJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09QWV9G SUxFX0ZPUk1BVCksCiEgCQkJCQkJCQkJIGVycm1zZygibGl0ZXJhbCBjYXJyaWFnZSByZXR1 cm4gZm91bmQgaW4gZGF0YSIpLAohIAkJCQkJCQkJCSBlcnJoaW50KCJVc2UgXCJcXHJcIiB0 byByZXByZXNlbnQgY2FycmlhZ2UgcmV0dXJuLiIpKSk7CiAgCQkJCQkJZWxzZQogIAkJCQkJ CQllcmVwb3J0KEVSUk9SLAogIAkJCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfQkFEX0NPUFlf RklMRV9GT1JNQVQpLAohIAkJCQkJCQkJCSBlcnJtc2coInVucXVvdGVkIGNhcnJpYWdlIHJl dHVybiBmb3VuZCBpbiBkYXRhIiksCiEgCQkJCQkJCQkJIGVycmhpbnQoIlVzZSBxdW90ZWQg Q1NWIGZpZWxkIHRvIHJlcHJlc2VudCBjYXJyaWFnZSByZXR1cm4uIikpKTsKICAKICAJCQkJ CX0KICAKLS0tIDIzNTUsMjM3OSAtLS0tCiAgCQkJCX0KICAJCQkJZWxzZQogIAkJCQl7CiEg CQkJCQkvKgohIAkJCQkJICogZm91bmQgXHIsIGJ1dCBubyBcbgohIAkJCQkJICovCiAgCQkJ CQlpZiAoZW9sX3R5cGUgPT0gRU9MX0NSTkwpCiAgCQkJCQl7CiAgCQkJCQkJaWYgKCFjc3Zf bW9kZSkKICAJCQkJCQkJZXJlcG9ydChFUlJPUiwKICAJCQkJCQkJCQkoZXJyY29kZShFUlJD T0RFX0JBRF9DT1BZX0ZJTEVfRk9STUFUKSwKISAJCQkJCQkJCQkgZXJybXNnCiEgCQkJCQkJ CQkJICgibGl0ZXJhbCBjYXJyaWFnZSByZXR1cm4gZm91bmQgaW4gZGF0YSIpLAohIAkJCQkJ CQkJCSBlcnJoaW50CiEgCQkJCQkJCQkJICgiVXNlIFwiXFxyXCIgdG8gcmVwcmVzZW50IGNh cnJpYWdlIHJldHVybi4iKSkpOwogIAkJCQkJCWVsc2UKICAJCQkJCQkJZXJlcG9ydChFUlJP UiwKICAJCQkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJTEVfRk9STUFUKSwK ISAJCQkJCQkJCQkgZXJybXNnCiEgCQkJCQkJCQkJICgidW5xdW90ZWQgY2FycmlhZ2UgcmV0 dXJuIGZvdW5kIGluIGRhdGEiKSwKISAJCQkJCQkJCQkgZXJyaGludAohIAkJCQkJCQkJCSAo IlVzZSBxdW90ZWQgQ1NWIGZpZWxkIHRvIHJlcHJlc2VudCBjYXJyaWFnZSByZXR1cm4uIikp KTsKICAKICAJCQkJCX0KICAKKioqKioqKioqKioqKioqCioqKiAyMTUzLDIxNjAgKioqKgog IAkJCQkJZXJlcG9ydChFUlJPUiwKICAJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09Q WV9GSUxFX0ZPUk1BVCksCiAgCQkJCQkJCSBlcnJtc2coInVucXVvdGVkIG5ld2xpbmUgZm91 bmQgaW4gZGF0YSIpLAohIAkJCQkJCQkgZXJyaGludCgiVXNlIHF1b3RlZCBDU1YgZmllbGQg dG8gcmVwcmVzZW50IG5ld2xpbmUuIikpKTsKISAJCQkJCQogIAkJCX0KICAJCQllb2xfdHlw ZSA9IEVPTF9OTDsKICAJCQlicmVhazsKLS0tIDI0MDAsMjQwOCAtLS0tCiAgCQkJCQllcmVw b3J0KEVSUk9SLAogIAkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJTEVfRk9S TUFUKSwKICAJCQkJCQkJIGVycm1zZygidW5xdW90ZWQgbmV3bGluZSBmb3VuZCBpbiBkYXRh IiksCiEgCQkJCQkJCSBlcnJoaW50CiEgCQkJCQkJCSAoIlVzZSBxdW90ZWQgQ1NWIGZpZWxk IHRvIHJlcHJlc2VudCBuZXdsaW5lLiIpKSk7CiEgCiAgCQkJfQogIAkJCWVvbF90eXBlID0g RU9MX05MOwogIAkJCWJyZWFrOwoqKioqKioqKioqKioqKioKKioqIDIxNjIsMjE2OSAqKioq CiAgCiAgCQlpZiAoKGxpbmVfYnVmLmxlbiA9PSAwIHx8ICFjc3ZfbW9kZSkgJiYgYyA9PSAn XFwnKQogIAkJewohIAkJCWludCBjMjsKISAJCQkKICAJCQlpZiAoY3N2X21vZGUpCiAgCQkJ CWMyID0gQ29weVBlZWtDaGFyKCk7CiAgCQkJZWxzZQotLS0gMjQxMCwyNDE3IC0tLS0KICAK ICAJCWlmICgobGluZV9idWYubGVuID09IDAgfHwgIWNzdl9tb2RlKSAmJiBjID09ICdcXCcp CiAgCQl7CiEgCQkJaW50CQkJYzI7CiEgCiAgCQkJaWYgKGNzdl9tb2RlKQogIAkJCQljMiA9 IENvcHlQZWVrQ2hhcigpOwogIAkJCWVsc2UKKioqKioqKioqKioqKioqCioqKiAyMTc5LDIx ODUgKioqKgogIAkJCWlmIChjMiA9PSAnLicpCiAgCQkJewogIAkJCQlpZiAoY3N2X21vZGUp CiEgCQkJCQlDb3B5RG9uZVBlZWsoYzIsIHRydWUpOyAvKiBhbGxvdyBrZWVwIGNhbGxpbmcg R2V0Q2hhcigpICovCiAgCiAgCQkJCWlmIChlb2xfdHlwZSA9PSBFT0xfQ1JOTCkKICAJCQkJ ewotLS0gMjQyNywyNDMzIC0tLS0KICAJCQlpZiAoYzIgPT0gJy4nKQogIAkJCXsKICAJCQkJ aWYgKGNzdl9tb2RlKQohIAkJCQkJQ29weURvbmVQZWVrKGMyLCB0cnVlKTsJCS8qIGFsbG93 IGtlZXAgY2FsbGluZyBHZXRDaGFyKCkgKi8KICAKICAJCQkJaWYgKGVvbF90eXBlID09IEVP TF9DUk5MKQogIAkJCQl7CioqKioqKioqKioqKioqKgoqKiogMjE4NywyMTkzICoqKioKICAJ CQkJCWlmIChjID09ICdcbicpCiAgCQkJCQkJZXJlcG9ydChFUlJPUiwKICAJCQkJCQkJCShl cnJjb2RlKEVSUkNPREVfQkFEX0NPUFlfRklMRV9GT1JNQVQpLAohIAkJCQkJCQkJIGVycm1z ZygiZW5kLW9mLWNvcHkgbWFya2VyIGRvZXMgbm90IG1hdGNoIHByZXZpb3VzIG5ld2xpbmUg c3R5bGUiKSkpOwogIAkJCQkJaWYgKGMgIT0gJ1xyJykKICAJCQkJCQllcmVwb3J0KEVSUk9S LAogIAkJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxFX0ZPUk1BVCksCi0t LSAyNDM1LDI0NDIgLS0tLQogIAkJCQkJaWYgKGMgPT0gJ1xuJykKICAJCQkJCQllcmVwb3J0 KEVSUk9SLAogIAkJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxFX0ZPUk1B VCksCiEgCQkJCQkJCQkgZXJybXNnCiEgCQkJCQkJCQkgKCJlbmQtb2YtY29weSBtYXJrZXIg ZG9lcyBub3QgbWF0Y2ggcHJldmlvdXMgbmV3bGluZSBzdHlsZSIpKSk7CiAgCQkJCQlpZiAo YyAhPSAnXHInKQogIAkJCQkJCWVyZXBvcnQoRVJST1IsCiAgCQkJCQkJCQkoZXJyY29kZShF UlJDT0RFX0JBRF9DT1BZX0ZJTEVfRk9STUFUKSwKKioqKioqKioqKioqKioqCioqKiAyMjAz LDIyMDkgKioqKgogIAkJCQkJKGVvbF90eXBlID09IEVPTF9DUiAmJiBjICE9ICdccicpKQog IAkJCQkJZXJlcG9ydChFUlJPUiwKICAJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09Q WV9GSUxFX0ZPUk1BVCksCiEgCQkJCQkJCSBlcnJtc2coImVuZC1vZi1jb3B5IG1hcmtlciBk b2VzIG5vdCBtYXRjaCBwcmV2aW91cyBuZXdsaW5lIHN0eWxlIikpKTsKICAKICAJCQkJLyoK ICAJCQkJICogSW4gcHJvdG9jb2wgdmVyc2lvbiAzLCB3ZSBzaG91bGQgaWdub3JlIGFueXRo aW5nIGFmdGVyCi0tLSAyNDUyLDI0NTkgLS0tLQogIAkJCQkJKGVvbF90eXBlID09IEVPTF9D UiAmJiBjICE9ICdccicpKQogIAkJCQkJZXJlcG9ydChFUlJPUiwKICAJCQkJCQkJKGVycmNv ZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxFX0ZPUk1BVCksCiEgCQkJCQkJCSBlcnJtc2cKISAJ CQkJCQkJICgiZW5kLW9mLWNvcHkgbWFya2VyIGRvZXMgbm90IG1hdGNoIHByZXZpb3VzIG5l d2xpbmUgc3R5bGUiKSkpOwogIAogIAkJCQkvKgogIAkJCQkgKiBJbiBwcm90b2NvbCB2ZXJz aW9uIDMsIHdlIHNob3VsZCBpZ25vcmUgYW55dGhpbmcgYWZ0ZXIKKioqKioqKioqKioqKioq CioqKiAyMjE4LDIyMjggKioqKgogIAkJCQlyZXN1bHQgPSB0cnVlOwkvKiByZXBvcnQgRU9G ICovCiAgCQkJCWJyZWFrOwogIAkJCX0KISAJCQkKICAJCQlpZiAoY3N2X21vZGUpCiEgCQkJ CUNvcHlEb25lUGVlayhjMiwgZmFsc2UpOyAvKiBub3QgYSBkb3QsIHNvIHB1dCBpdCBiYWNr ICovIAogIAkJCWVsc2UKISAJCQkJLyogbm90IEVPRiBtYXJrLCBzbyBlbWl0IFwgYW5kIGZv bGxvd2luZyBjaGFyIGxpdGVyYWxseSAqLwogIAkJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhck1h Y3JvKCZsaW5lX2J1ZiwgJ1xcJyk7CiAgCQl9CiAgCi0tLSAyNDY4LDI0ODAgLS0tLQogIAkJ CQlyZXN1bHQgPSB0cnVlOwkvKiByZXBvcnQgRU9GICovCiAgCQkJCWJyZWFrOwogIAkJCX0K ISAKICAJCQlpZiAoY3N2X21vZGUpCiEgCQkJCUNvcHlEb25lUGVlayhjMiwgZmFsc2UpOwkJ Lyogbm90IGEgZG90LCBzbyBwdXQgaXQgYmFjayAqLwogIAkJCWVsc2UKISAJCQkJLyoKISAJ CQkJICogbm90IEVPRiBtYXJrLCBzbyBlbWl0IFwgYW5kIGZvbGxvd2luZyBjaGFyIGxpdGVy YWxseQohIAkJCQkgKi8KICAJCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXJNYWNybygmbGluZV9i dWYsICdcXCcpOwogIAkJfQogIAoqKioqKioqKioqKioqKioKKioqIDIyNTQsMjI3NCAqKioq CiAgCQl9CiAgCX0JCQkJCQkJLyogZW5kIG9mIG91dGVyIGxvb3AgKi8KICAKISAJLyogRG9u ZSByZWFkaW5nIHRoZSBsaW5lLiAgQ29udmVydCBpdCB0byBzZXJ2ZXIgZW5jb2RpbmcuICov CiAgCWlmIChjaGFuZ2VfZW5jb2RpbmcpCiAgCXsKICAJCWN2dCA9IChjaGFyICopIHBnX2Ns aWVudF90b19zZXJ2ZXIoKHVuc2lnbmVkIGNoYXIgKikgbGluZV9idWYuZGF0YSwKICAJCQkJ CQkJCQkJICAgbGluZV9idWYubGVuKTsKICAJCWlmIChjdnQgIT0gbGluZV9idWYuZGF0YSkK ICAJCXsKISAJCQkvKiB0cmFuc2ZlciBjb252ZXJ0ZWQgZGF0YSBiYWNrIHRvIGxpbmVfYnVm ICovCiAgCQkJbGluZV9idWYubGVuID0gMDsKICAJCQlsaW5lX2J1Zi5kYXRhWzBdID0gJ1ww JzsKICAJCQlhcHBlbmRCaW5hcnlTdHJpbmdJbmZvKCZsaW5lX2J1ZiwgY3Z0LCBzdHJsZW4o Y3Z0KSk7CiAgCQl9CiAgCX0KICAKISAJLyogTm93IGl0J3Mgc2FmZSB0byB1c2UgdGhlIGJ1 ZmZlciBpbiBlcnJvciBtZXNzYWdlcyAqLwogIAlsaW5lX2J1Zl9jb252ZXJ0ZWQgPSB0cnVl OwogIAogIAlyZXR1cm4gcmVzdWx0OwotLS0gMjUwNiwyNTMyIC0tLS0KICAJCX0KICAJfQkJ CQkJCQkvKiBlbmQgb2Ygb3V0ZXIgbG9vcCAqLwogIAohIAkvKgohIAkgKiBEb25lIHJlYWRp bmcgdGhlIGxpbmUuICBDb252ZXJ0IGl0IHRvIHNlcnZlciBlbmNvZGluZy4KISAJICovCiAg CWlmIChjaGFuZ2VfZW5jb2RpbmcpCiAgCXsKICAJCWN2dCA9IChjaGFyICopIHBnX2NsaWVu dF90b19zZXJ2ZXIoKHVuc2lnbmVkIGNoYXIgKikgbGluZV9idWYuZGF0YSwKICAJCQkJCQkJ CQkJICAgbGluZV9idWYubGVuKTsKICAJCWlmIChjdnQgIT0gbGluZV9idWYuZGF0YSkKICAJ CXsKISAJCQkvKgohIAkJCSAqIHRyYW5zZmVyIGNvbnZlcnRlZCBkYXRhIGJhY2sgdG8gbGlu ZV9idWYKISAJCQkgKi8KICAJCQlsaW5lX2J1Zi5sZW4gPSAwOwogIAkJCWxpbmVfYnVmLmRh dGFbMF0gPSAnXDAnOwogIAkJCWFwcGVuZEJpbmFyeVN0cmluZ0luZm8oJmxpbmVfYnVmLCBj dnQsIHN0cmxlbihjdnQpKTsKICAJCX0KICAJfQogIAohIAkvKgohIAkgKiBOb3cgaXQncyBz YWZlIHRvIHVzZSB0aGUgYnVmZmVyIGluIGVycm9yIG1lc3NhZ2VzIAohIAkgKi8KICAJbGlu ZV9idWZfY29udmVydGVkID0gdHJ1ZTsKICAKICAJcmV0dXJuIHJlc3VsdDsKKioqKioqKioq KioqKioqCioqKiAyMjc3LDIyODQgKioqKgogIC8qCiAgICoJUmV0dXJuIGRlY2ltYWwgdmFs dWUgZm9yIGEgaGV4YWRlY2ltYWwgZGlnaXQKICAgKi8KISBzdGF0aWMKISBpbnQgR2V0RGVj aW1hbEZyb21IZXgoY2hhciBoZXgpCiAgewogIAlpZiAoaXNkaWdpdChoZXgpKQogIAkJcmV0 dXJuIGhleCAtICcwJzsKLS0tIDI1MzUsMjU0MiAtLS0tCiAgLyoKICAgKglSZXR1cm4gZGVj aW1hbCB2YWx1ZSBmb3IgYSBoZXhhZGVjaW1hbCBkaWdpdAogICAqLwohIHN0YXRpYyBpbnQK ISBHZXREZWNpbWFsRnJvbUhleChjaGFyIGhleCkKICB7CiAgCWlmIChpc2RpZ2l0KGhleCkp CiAgCQlyZXR1cm4gaGV4IC0gJzAnOwoqKioqKioqKioqKioqKioKKioqIDIzMTQsMjMyNCAq KioqCiAgCWludAkJCWVuZF9jdXJzb3I7CiAgCWludAkJCWlucHV0X2xlbjsKICAKISAJLyog cmVzZXQgYXR0cmlidXRlX2J1ZiB0byBlbXB0eSAqLwogIAlhdHRyaWJ1dGVfYnVmLmxlbiA9 IDA7CiAgCWF0dHJpYnV0ZV9idWYuZGF0YVswXSA9ICdcMCc7CiAgCiEgCS8qIHNldCBkZWZh dWx0IHN0YXR1cyAqLwogIAkqcmVzdWx0ID0gRU5EX09GX0xJTkU7CiAgCiAgCWZvciAoOzsp Ci0tLSAyNTcyLDI1ODYgLS0tLQogIAlpbnQJCQllbmRfY3Vyc29yOwogIAlpbnQJCQlpbnB1 dF9sZW47CiAgCiEgCS8qCiEgCSAqIHJlc2V0IGF0dHJpYnV0ZV9idWYgdG8gZW1wdHkKISAJ ICovCiAgCWF0dHJpYnV0ZV9idWYubGVuID0gMDsKICAJYXR0cmlidXRlX2J1Zi5kYXRhWzBd ID0gJ1wwJzsKICAKISAJLyoKISAJICogc2V0IGRlZmF1bHQgc3RhdHVzCiEgCSAqLwogIAkq cmVzdWx0ID0gRU5EX09GX0xJTkU7CiAgCiAgCWZvciAoOzspCioqKioqKioqKioqKioqKgoq KiogMjM0NywyMzUzICoqKioKICAJCQkJY2FzZSAnNSc6CiAgCQkJCWNhc2UgJzYnOgogIAkJ CQljYXNlICc3JzoKISAJCQkJCS8qIGhhbmRsZSBcMDEzICovCiAgCQkJCQl7CiAgCQkJCQkJ aW50CQkJdmFsOwogIAotLS0gMjYwOSwyNjE3IC0tLS0KICAJCQkJY2FzZSAnNSc6CiAgCQkJ CWNhc2UgJzYnOgogIAkJCQljYXNlICc3JzoKISAJCQkJCS8qCiEgCQkJCQkgKiBoYW5kbGUg XDAxMwohIAkJCQkJICovCiAgCQkJCQl7CiAgCQkJCQkJaW50CQkJdmFsOwogIAoqKioqKioq KioqKioqKioKKioqIDIzNzQsMjM4NyAqKioqCiAgCQkJCQl9CiAgCQkJCQlicmVhazsKICAJ CQkJY2FzZSAneCc6CiEgCQkJCQkvKiBIYW5kbGUgXHgzRiAqLwogIAkJCQkJaWYgKGxpbmVf YnVmLmN1cnNvciA8IGxpbmVfYnVmLmxlbikKICAJCQkJCXsKISAJCQkJCQljaGFyIGhleGNo YXIgPSBsaW5lX2J1Zi5kYXRhW2xpbmVfYnVmLmN1cnNvcl07CiAgCiAgCQkJCQkJaWYgKGlz eGRpZ2l0KGhleGNoYXIpKQogIAkJCQkJCXsKISAJCQkJCQkJaW50IHZhbCA9IEdldERlY2lt YWxGcm9tSGV4KGhleGNoYXIpOwogIAogIAkJCQkJCQlsaW5lX2J1Zi5jdXJzb3IrKzsKICAJ CQkJCQkJaWYgKGxpbmVfYnVmLmN1cnNvciA8IGxpbmVfYnVmLmxlbikKLS0tIDI2MzgsMjY1 MyAtLS0tCiAgCQkJCQl9CiAgCQkJCQlicmVhazsKICAJCQkJY2FzZSAneCc6CiEgCQkJCQkv KgohIAkJCQkJICogSGFuZGxlIFx4M0YKISAJCQkJCSAqLwogIAkJCQkJaWYgKGxpbmVfYnVm LmN1cnNvciA8IGxpbmVfYnVmLmxlbikKICAJCQkJCXsKISAJCQkJCQljaGFyCQloZXhjaGFy ID0gbGluZV9idWYuZGF0YVtsaW5lX2J1Zi5jdXJzb3JdOwogIAogIAkJCQkJCWlmIChpc3hk aWdpdChoZXhjaGFyKSkKICAJCQkJCQl7CiEgCQkJCQkJCWludAkJCXZhbCA9IEdldERlY2lt YWxGcm9tSGV4KGhleGNoYXIpOwogIAogIAkJCQkJCQlsaW5lX2J1Zi5jdXJzb3IrKzsKICAJ CQkJCQkJaWYgKGxpbmVfYnVmLmN1cnNvciA8IGxpbmVfYnVmLmxlbikKKioqKioqKioqKioq KioqCioqKiAyMzkwLDIzOTYgKioqKgogIAkJCQkJCQkJaWYgKGlzeGRpZ2l0KGhleGNoYXIp KQogIAkJCQkJCQkJewogIAkJCQkJCQkJCWxpbmVfYnVmLmN1cnNvcisrOwohIAkJCQkJCQkJ CXZhbCA9ICh2YWwgPDwgNCkgKyBHZXREZWNpbWFsRnJvbUhleChoZXhjaGFyKTsKICAJCQkJ CQkJCX0KICAJCQkJCQkJfQogIAkJCQkJCQljID0gdmFsICYgMHhmZjsKLS0tIDI2NTYsMjY2 NCAtLS0tCiAgCQkJCQkJCQlpZiAoaXN4ZGlnaXQoaGV4Y2hhcikpCiAgCQkJCQkJCQl7CiAg CQkJCQkJCQkJbGluZV9idWYuY3Vyc29yKys7CiEgCQkJCQkJCQkJdmFsID0KISAJCQkJCQkJ CQkJKHZhbCA8PCA0KSArCiEgCQkJCQkJCQkJCUdldERlY2ltYWxGcm9tSGV4KGhleGNoYXIp OwogIAkJCQkJCQkJfQogIAkJCQkJCQl9CiAgCQkJCQkJCWMgPSB2YWwgJiAweGZmOwoqKioq KioqKioqKioqKioKKioqIDI0MjUsMjQzMSAqKioqCiAgCQlhcHBlbmRTdHJpbmdJbmZvQ2hh ck1hY3JvKCZhdHRyaWJ1dGVfYnVmLCBjKTsKICAJfQogIAohIAkvKiBjaGVjayB3aGV0aGVy IHJhdyBpbnB1dCBtYXRjaGVkIG51bGwgbWFya2VyICovCiAgCWlucHV0X2xlbiA9IGVuZF9j dXJzb3IgLSBzdGFydF9jdXJzb3I7CiAgCWlmIChpbnB1dF9sZW4gPT0gc3RybGVuKG51bGxf cHJpbnQpICYmCiAgCQlzdHJuY21wKCZsaW5lX2J1Zi5kYXRhW3N0YXJ0X2N1cnNvcl0sIG51 bGxfcHJpbnQsIGlucHV0X2xlbikgPT0gMCkKLS0tIDI2OTMsMjcwMSAtLS0tCiAgCQlhcHBl bmRTdHJpbmdJbmZvQ2hhck1hY3JvKCZhdHRyaWJ1dGVfYnVmLCBjKTsKICAJfQogIAohIAkv KgohIAkgKiBjaGVjayB3aGV0aGVyIHJhdyBpbnB1dCBtYXRjaGVkIG51bGwgbWFya2VyCiEg CSAqLwogIAlpbnB1dF9sZW4gPSBlbmRfY3Vyc29yIC0gc3RhcnRfY3Vyc29yOwogIAlpZiAo aW5wdXRfbGVuID09IHN0cmxlbihudWxsX3ByaW50KSAmJgogIAkJc3RybmNtcCgmbGluZV9i dWYuZGF0YVtzdGFydF9jdXJzb3JdLCBudWxsX3ByaW50LCBpbnB1dF9sZW4pID09IDApCioq KioqKioqKioqKioqKgoqKiogMjQ3NywyNDg3ICoqKioKICAJYm9vbAkJaW5fcXVvdGUgPSBm YWxzZTsKICAJYm9vbAkJc2F3X3F1b3RlID0gZmFsc2U7CiAgCiEgCS8qIHJlc2V0IGF0dHJp YnV0ZV9idWYgdG8gZW1wdHkgKi8KICAJYXR0cmlidXRlX2J1Zi5sZW4gPSAwOwogIAlhdHRy aWJ1dGVfYnVmLmRhdGFbMF0gPSAnXDAnOwogIAohIAkvKiBzZXQgZGVmYXVsdCBzdGF0dXMg Ki8KICAJKnJlc3VsdCA9IEVORF9PRl9MSU5FOwogIAogIAlmb3IgKDs7KQotLS0gMjc0Nywy NzYxIC0tLS0KICAJYm9vbAkJaW5fcXVvdGUgPSBmYWxzZTsKICAJYm9vbAkJc2F3X3F1b3Rl ID0gZmFsc2U7CiAgCiEgCS8qCiEgCSAqIHJlc2V0IGF0dHJpYnV0ZV9idWYgdG8gZW1wdHkK ISAJICovCiAgCWF0dHJpYnV0ZV9idWYubGVuID0gMDsKICAJYXR0cmlidXRlX2J1Zi5kYXRh WzBdID0gJ1wwJzsKICAKISAJLyoKISAJICogc2V0IGRlZmF1bHQgc3RhdHVzCiEgCSAqLwog IAkqcmVzdWx0ID0gRU5EX09GX0xJTkU7CiAgCiAgCWZvciAoOzspCioqKioqKioqKioqKioq KgoqKiogMjQ5MSwyNTA0ICoqKioKICAJCQlicmVhazsKICAJCWMgPSBsaW5lX2J1Zi5kYXRh W2xpbmVfYnVmLmN1cnNvcisrXTsKICAKISAJCS8qIHVucXVvdGVkIGZpZWxkIGRlbGltaXRl ciAgKi8KICAJCWlmICghaW5fcXVvdGUgJiYgYyA9PSBkZWxpbWMpCiAgCQl7CiAgCQkJKnJl c3VsdCA9IE5PUk1BTF9BVFRSOwogIAkJCWJyZWFrOwogIAkJfQogIAohIAkJLyogc3RhcnQg b2YgcXVvdGVkIGZpZWxkIChvciBwYXJ0IG9mIGZpZWxkKSAqLwogIAkJaWYgKCFpbl9xdW90 ZSAmJiBjID09IHF1b3RlYykKICAJCXsKICAJCQlzYXdfcXVvdGUgPSB0cnVlOwotLS0gMjc2 NSwyNzgyIC0tLS0KICAJCQlicmVhazsKICAJCWMgPSBsaW5lX2J1Zi5kYXRhW2xpbmVfYnVm LmN1cnNvcisrXTsKICAKISAJCS8qCiEgCQkgKiB1bnF1b3RlZCBmaWVsZCBkZWxpbWl0ZXIK ISAJCSAqLwogIAkJaWYgKCFpbl9xdW90ZSAmJiBjID09IGRlbGltYykKICAJCXsKICAJCQkq cmVzdWx0ID0gTk9STUFMX0FUVFI7CiAgCQkJYnJlYWs7CiAgCQl9CiAgCiEgCQkvKgohIAkJ ICogc3RhcnQgb2YgcXVvdGVkIGZpZWxkIChvciBwYXJ0IG9mIGZpZWxkKQohIAkJICovCiAg CQlpZiAoIWluX3F1b3RlICYmIGMgPT0gcXVvdGVjKQogIAkJewogIAkJCXNhd19xdW90ZSA9 IHRydWU7CioqKioqKioqKioqKioqKgoqKiogMjUwNiwyNTEyICoqKioKICAJCQljb250aW51 ZTsKICAJCX0KICAKISAJCS8qIGVzY2FwZSB3aXRoaW4gYSBxdW90ZWQgZmllbGQgKi8KICAJ CWlmIChpbl9xdW90ZSAmJiBjID09IGVzY2FwZWMpCiAgCQl7CiAgCQkJLyoKLS0tIDI3ODQs Mjc5MiAtLS0tCiAgCQkJY29udGludWU7CiAgCQl9CiAgCiEgCQkvKgohIAkJICogZXNjYXBl IHdpdGhpbiBhIHF1b3RlZCBmaWVsZAohIAkJICovCiAgCQlpZiAoaW5fcXVvdGUgJiYgYyA9 PSBlc2NhcGVjKQogIAkJewogIAkJCS8qCioqKioqKioqKioqKioqKgoqKiogMjU0MiwyNTQ4 ICoqKioKICAJaWYgKGluX3F1b3RlKQogIAkJKnJlc3VsdCA9IFVOVEVSTUlOQVRFRF9GSUVM RDsKICAKISAJLyogY2hlY2sgd2hldGhlciByYXcgaW5wdXQgbWF0Y2hlZCBudWxsIG1hcmtl ciAqLwogIAlpbnB1dF9sZW4gPSBlbmRfY3Vyc29yIC0gc3RhcnRfY3Vyc29yOwogIAlpZiAo IXNhd19xdW90ZSAmJiBpbnB1dF9sZW4gPT0gc3RybGVuKG51bGxfcHJpbnQpICYmCiAgCQlz dHJuY21wKCZsaW5lX2J1Zi5kYXRhW3N0YXJ0X2N1cnNvcl0sIG51bGxfcHJpbnQsIGlucHV0 X2xlbikgPT0gMCkKLS0tIDI4MjIsMjgzMCAtLS0tCiAgCWlmIChpbl9xdW90ZSkKICAJCSpy ZXN1bHQgPSBVTlRFUk1JTkFURURfRklFTEQ7CiAgCiEgCS8qCiEgCSAqIGNoZWNrIHdoZXRo ZXIgcmF3IGlucHV0IG1hdGNoZWQgbnVsbCBtYXJrZXIKISAJICovCiAgCWlucHV0X2xlbiA9 IGVuZF9jdXJzb3IgLSBzdGFydF9jdXJzb3I7CiAgCWlmICghc2F3X3F1b3RlICYmIGlucHV0 X2xlbiA9PSBzdHJsZW4obnVsbF9wcmludCkgJiYKICAJCXN0cm5jbXAoJmxpbmVfYnVmLmRh dGFbc3RhcnRfY3Vyc29yXSwgbnVsbF9wcmludCwgaW5wdXRfbGVuKSA9PSAwKQoqKioqKioq KioqKioqKioKKioqIDI1NzgsMjU4NCAqKioqCiAgCQkJCShlcnJjb2RlKEVSUkNPREVfQkFE X0NPUFlfRklMRV9GT1JNQVQpLAogIAkJCQkgZXJybXNnKCJpbnZhbGlkIGZpZWxkIHNpemUi KSkpOwogIAohIAkvKiByZXNldCBhdHRyaWJ1dGVfYnVmIHRvIGVtcHR5LCBhbmQgbG9hZCBy YXcgZGF0YSBpbiBpdCAqLwogIAlhdHRyaWJ1dGVfYnVmLmxlbiA9IDA7CiAgCWF0dHJpYnV0 ZV9idWYuZGF0YVswXSA9ICdcMCc7CiAgCWF0dHJpYnV0ZV9idWYuY3Vyc29yID0gMDsKLS0t IDI4NjAsMjg2OCAtLS0tCiAgCQkJCShlcnJjb2RlKEVSUkNPREVfQkFEX0NPUFlfRklMRV9G T1JNQVQpLAogIAkJCQkgZXJybXNnKCJpbnZhbGlkIGZpZWxkIHNpemUiKSkpOwogIAohIAkv KgohIAkgKiByZXNldCBhdHRyaWJ1dGVfYnVmIHRvIGVtcHR5LCBhbmQgbG9hZCByYXcgZGF0 YSBpbiBpdAohIAkgKi8KICAJYXR0cmlidXRlX2J1Zi5sZW4gPSAwOwogIAlhdHRyaWJ1dGVf YnVmLmRhdGFbMF0gPSAnXDAnOwogIAlhdHRyaWJ1dGVfYnVmLmN1cnNvciA9IDA7CioqKioq KioqKioqKioqKgoqKiogMjU5NCwyNjA1ICoqKioKICAJYXR0cmlidXRlX2J1Zi5sZW4gPSBm bGRfc2l6ZTsKICAJYXR0cmlidXRlX2J1Zi5kYXRhW2ZsZF9zaXplXSA9ICdcMCc7CiAgCiEg CS8qIENhbGwgdGhlIGNvbHVtbiB0eXBlJ3MgYmluYXJ5IGlucHV0IGNvbnZlcnRlciAqLwog IAlyZXN1bHQgPSBGdW5jdGlvbkNhbGwyKGZsaW5mbywKICAJCQkJCQkgICBQb2ludGVyR2V0 RGF0dW0oJmF0dHJpYnV0ZV9idWYpLAogIAkJCQkJCSAgIE9iamVjdElkR2V0RGF0dW0odHlw aW9wYXJhbSkpOwogIAohIAkvKiBUcm91YmxlIGlmIGl0IGRpZG4ndCBlYXQgdGhlIHdob2xl IGJ1ZmZlciAqLwogIAlpZiAoYXR0cmlidXRlX2J1Zi5jdXJzb3IgIT0gYXR0cmlidXRlX2J1 Zi5sZW4pCiAgCQllcmVwb3J0KEVSUk9SLAogIAkJCQkoZXJyY29kZShFUlJDT0RFX0lOVkFM SURfQklOQVJZX1JFUFJFU0VOVEFUSU9OKSwKLS0tIDI4NzgsMjg5MyAtLS0tCiAgCWF0dHJp YnV0ZV9idWYubGVuID0gZmxkX3NpemU7CiAgCWF0dHJpYnV0ZV9idWYuZGF0YVtmbGRfc2l6 ZV0gPSAnXDAnOwogIAohIAkvKgohIAkgKiBDYWxsIHRoZSBjb2x1bW4gdHlwZSdzIGJpbmFy eSBpbnB1dCBjb252ZXJ0ZXIgCiEgCSAqLwogIAlyZXN1bHQgPSBGdW5jdGlvbkNhbGwyKGZs aW5mbywKICAJCQkJCQkgICBQb2ludGVyR2V0RGF0dW0oJmF0dHJpYnV0ZV9idWYpLAogIAkJ CQkJCSAgIE9iamVjdElkR2V0RGF0dW0odHlwaW9wYXJhbSkpOwogIAohIAkvKgohIAkgKiBU cm91YmxlIGlmIGl0IGRpZG4ndCBlYXQgdGhlIHdob2xlIGJ1ZmZlciAKISAJICovCiAgCWlm IChhdHRyaWJ1dGVfYnVmLmN1cnNvciAhPSBhdHRyaWJ1dGVfYnVmLmxlbikKICAJCWVyZXBv cnQoRVJST1IsCiAgCQkJCShlcnJjb2RlKEVSUkNPREVfSU5WQUxJRF9CSU5BUllfUkVQUkVT RU5UQVRJT04pLAoqKioqKioqKioqKioqKioKKioqIDI2NjgsMjY3NCAqKioqCiAgCQkJCSAq LwogIAkJCQlpZiAoIXNhbWVfZW5jb2RpbmcpCiAgCQkJCXsKISAJCQkJCS8qIHNlbmQgYWRk aXRpb25hbCBieXRlcyBvZiB0aGUgY2hhciwgaWYgYW55ICovCiAgCQkJCQltYmxlbiA9IHBn X2VuY29kaW5nX21ibGVuKGNsaWVudF9lbmNvZGluZywgc3RyaW5nKTsKICAJCQkJCWZvciAo aSA9IDE7IGkgPCBtYmxlbjsgaSsrKQogIAkJCQkJCUNvcHlTZW5kQ2hhcihzdHJpbmdbaV0p OwotLS0gMjk1NiwyOTY0IC0tLS0KICAJCQkJICovCiAgCQkJCWlmICghc2FtZV9lbmNvZGlu ZykKICAJCQkJewohIAkJCQkJLyoKISAJCQkJCSAqIHNlbmQgYWRkaXRpb25hbCBieXRlcyBv ZiB0aGUgY2hhciwgaWYgYW55CiEgCQkJCQkgKi8KICAJCQkJCW1ibGVuID0gcGdfZW5jb2Rp bmdfbWJsZW4oY2xpZW50X2VuY29kaW5nLCBzdHJpbmcpOwogIAkJCQkJZm9yIChpID0gMTsg aSA8IG1ibGVuOyBpKyspCiAgCQkJCQkJQ29weVNlbmRDaGFyKHN0cmluZ1tpXSk7CioqKioq KioqKioqKioqKgoqKiogMjcwOSwyNzE2ICoqKioKICAJICovCiAgCiAgCWZvciAodGVzdF9z dHJpbmcgPSBzdHJpbmc7CiEgCQkgIXVzZV9xdW90ZSAmJiAoYyA9ICp0ZXN0X3N0cmluZykg IT0gJ1wwJzsKISAJCSB0ZXN0X3N0cmluZyArPSBtYmxlbikKICAJewogIAkJaWYgKGMgPT0g ZGVsaW1jIHx8IGMgPT0gcXVvdGVjIHx8IGMgPT0gJ1xuJyB8fCBjID09ICdccicpCiAgCQkJ dXNlX3F1b3RlID0gdHJ1ZTsKLS0tIDI5OTksMzAwNSAtLS0tCiAgCSAqLwogIAogIAlmb3Ig KHRlc3Rfc3RyaW5nID0gc3RyaW5nOwohIAkJICF1c2VfcXVvdGUgJiYgKGMgPSAqdGVzdF9z dHJpbmcpICE9ICdcMCc7IHRlc3Rfc3RyaW5nICs9IG1ibGVuKQogIAl7CiAgCQlpZiAoYyA9 PSBkZWxpbWMgfHwgYyA9PSBxdW90ZWMgfHwgYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJykKICAJ CQl1c2VfcXVvdGUgPSB0cnVlOwoqKioqKioqKioqKioqKioKKioqIDI3MzIsMjczOCAqKioq CiAgCiAgCQlpZiAoIXNhbWVfZW5jb2RpbmcpCiAgCQl7CiEgCQkJLyogc2VuZCBhZGRpdGlv bmFsIGJ5dGVzIG9mIHRoZSBjaGFyLCBpZiBhbnkgKi8KICAJCQltYmxlbiA9IHBnX2VuY29k aW5nX21ibGVuKGNsaWVudF9lbmNvZGluZywgc3RyaW5nKTsKICAJCQlmb3IgKGkgPSAxOyBp IDwgbWJsZW47IGkrKykKICAJCQkJQ29weVNlbmRDaGFyKHN0cmluZ1tpXSk7Ci0tLSAzMDIx LDMwMjkgLS0tLQogIAogIAkJaWYgKCFzYW1lX2VuY29kaW5nKQogIAkJewohIAkJCS8qCiEg CQkJICogc2VuZCBhZGRpdGlvbmFsIGJ5dGVzIG9mIHRoZSBjaGFyLCBpZiBhbnkKISAJCQkg Ki8KICAJCQltYmxlbiA9IHBnX2VuY29kaW5nX21ibGVuKGNsaWVudF9lbmNvZGluZywgc3Ry aW5nKTsKICAJCQlmb3IgKGkgPSAxOyBpIDwgbWJsZW47IGkrKykKICAJCQkJQ29weVNlbmRD aGFyKHN0cmluZ1tpXSk7CioqKioqKioqKioqKioqKgoqKiogMjc1OSwyNzY1ICoqKioKICAK ICAJaWYgKGF0dG5hbWVsaXN0ID09IE5JTCkKICAJewohIAkJLyogR2VuZXJhdGUgZGVmYXVs dCBjb2x1bW4gbGlzdCAqLwogIAkJVHVwbGVEZXNjCXR1cERlc2MgPSBSZWxhdGlvbkdldERl c2NyKHJlbCk7CiAgCQlGb3JtX3BnX2F0dHJpYnV0ZSAqYXR0ciA9IHR1cERlc2MtPmF0dHJz OwogIAkJaW50CQkJYXR0cl9jb3VudCA9IHR1cERlc2MtPm5hdHRzOwotLS0gMzA1MCwzMDU4 IC0tLS0KICAKICAJaWYgKGF0dG5hbWVsaXN0ID09IE5JTCkKICAJewohIAkJLyoKISAJCSAq IEdlbmVyYXRlIGRlZmF1bHQgY29sdW1uIGxpc3QKISAJCSAqLwogIAkJVHVwbGVEZXNjCXR1 cERlc2MgPSBSZWxhdGlvbkdldERlc2NyKHJlbCk7CiAgCQlGb3JtX3BnX2F0dHJpYnV0ZSAq YXR0ciA9IHR1cERlc2MtPmF0dHJzOwogIAkJaW50CQkJYXR0cl9jb3VudCA9IHR1cERlc2Mt Pm5hdHRzOwoqKioqKioqKioqKioqKioKKioqIDI3NzQsMjc4MCAqKioqCiAgCX0KICAJZWxz ZQogIAl7CiEgCQkvKiBWYWxpZGF0ZSB0aGUgdXNlci1zdXBwbGllZCBsaXN0IGFuZCBleHRy YWN0IGF0dG51bXMgKi8KICAJCUxpc3RDZWxsICAgKmw7CiAgCiAgCQlmb3JlYWNoKGwsIGF0 dG5hbWVsaXN0KQotLS0gMzA2NywzMDc1IC0tLS0KICAJfQogIAllbHNlCiAgCXsKISAJCS8q CiEgCQkgKiBWYWxpZGF0ZSB0aGUgdXNlci1zdXBwbGllZCBsaXN0IGFuZCBleHRyYWN0IGF0 dG51bXMKISAJCSAqLwogIAkJTGlzdENlbGwgICAqbDsKICAKICAJCWZvcmVhY2gobCwgYXR0 bmFtZWxpc3QpCioqKioqKioqKioqKioqKgoqKiogMjc4MiwyNzkxICoqKioKICAJCQljaGFy CSAgICpuYW1lID0gc3RyVmFsKGxmaXJzdChsKSk7CiAgCQkJaW50CQkJYXR0bnVtOwogIAoh IAkJCS8qIExvb2t1cCBjb2x1bW4gbmFtZSwgZXJlcG9ydCBvbiBmYWlsdXJlICovCiEgCQkJ LyogTm90ZSB3ZSBkaXNhbGxvdyBzeXN0ZW0gY29sdW1ucyBoZXJlICovCiAgCQkJYXR0bnVt ID0gYXR0bmFtZUF0dE51bShyZWwsIG5hbWUsIGZhbHNlKTsKISAJCQkvKiBDaGVjayBmb3Ig ZHVwbGljYXRlcyAqLwogIAkJCWlmIChsaXN0X21lbWJlcl9pbnQoYXR0bnVtcywgYXR0bnVt KSkKICAJCQkJZXJlcG9ydChFUlJPUiwKICAJCQkJCQkoZXJyY29kZShFUlJDT0RFX0RVUExJ Q0FURV9DT0xVTU4pLAotLS0gMzA3NywzMDkyIC0tLS0KICAJCQljaGFyCSAgICpuYW1lID0g c3RyVmFsKGxmaXJzdChsKSk7CiAgCQkJaW50CQkJYXR0bnVtOwogIAohIAkJCS8qCiEgCQkJ ICogTG9va3VwIGNvbHVtbiBuYW1lLCBlcmVwb3J0IG9uIGZhaWx1cmUKISAJCQkgKi8KISAJ CQkvKgohIAkJCSAqIE5vdGUgd2UgZGlzYWxsb3cgc3lzdGVtIGNvbHVtbnMgaGVyZQohIAkJ CSAqLwogIAkJCWF0dG51bSA9IGF0dG5hbWVBdHROdW0ocmVsLCBuYW1lLCBmYWxzZSk7CiEg CQkJLyoKISAJCQkgKiBDaGVjayBmb3IgZHVwbGljYXRlcwohIAkJCSAqLwogIAkJCWlmIChs aXN0X21lbWJlcl9pbnQoYXR0bnVtcywgYXR0bnVtKSkKICAJCQkJZXJlcG9ydChFUlJPUiwK ICAJCQkJCQkoZXJyY29kZShFUlJDT0RFX0RVUExJQ0FURV9DT0xVTU4pLAo= --B_3202717953_5185116 Content-Type: application/octet-stream; name=fast_copy_V12_8.1.patch Content-Disposition: attachment; filename=fast_copy_V12_8.1.patch Content-Transfer-Encoding: base64 SW5kZXg6IHNyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHkuYwo9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBm aWxlOiAvcHJvamVjdHMvY3Zzcm9vdC9wZ3NxbC9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5 LmMsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMjQ1CmRpZmYgLWMgLXIxLjI0NSBjb3B5LmMK KioqIHNyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHkuYwkyIEp1biAyMDA1IDAxOjIxOjIyIC0w MDAwCTEuMjQ1Ci0tLSBzcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5LmMJMjcgSnVuIDIwMDUg MTg6NDU6MzkgLTAwMDAKKioqKioqKioqKioqKioqCioqKiAxLDMgKioqKgotLS0gMSw0IC0t LS0KKyAKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgKgogICAqIGNvcHkuYwoqKioqKioq KioqKioqKioKKioqIDUxLDU2ICoqKioKLS0tIDUyLDU4IC0tLS0KICAKICAjZGVmaW5lIElT T0NUQUwoYykgKCgoYykgPj0gJzAnKSAmJiAoKGMpIDw9ICc3JykpCiAgI2RlZmluZSBPQ1RW QUxVRShjKSAoKGMpIC0gJzAnKQorICNkZWZpbmUgQ09QWV9CVUZfU0laRSA2NTUzNgogIAog IC8qCiAgICogUmVwcmVzZW50cyB0aGUgZGlmZmVyZW50IHNvdXJjZS9kZXN0IGNhc2VzIHdl IG5lZWQgdG8gd29ycnkgYWJvdXQgYXQKKioqKioqKioqKioqKioqCioqKiA4NCw5MCAqKioq CiAgCUVPTF9DUk5MCiAgfSBFb2xUeXBlOwogIAotIAogIHN0YXRpYyBjb25zdCBjaGFyIEJp bmFyeVNpZ25hdHVyZVsxMV0gPSAiUEdDT1BZXG5cMzc3XHJcblwwIjsKICAKICAvKgotLS0g ODYsOTEgLS0tLQoqKioqKioqKioqKioqKioKKioqIDkyLDk3ICoqKioKLS0tIDkzLDEwMSAt LS0tCiAgICogbmV2ZXIgYmVlbiByZWVudHJhbnQuLi4KICAgKi8KICBzdGF0aWMgQ29weURl c3QgY29weV9kZXN0OworIHN0YXRpYyBpbnQJZW9sX2NoWzJdOwkJCS8qIFRoZSBieXRlIHZh bHVlcyBvZiB0aGUgMSBvciAyIGVvbCBieXRlcyAqLworIHN0YXRpYyBjaGFyIGVzY2FwZWM7 CQkJLyogZXNjYXBlIGNoYXIgZm9yIGRlbGltaXRlZCBkYXRhIGZvcm1hdC4gKi8KKyBzdGF0 aWMgYm9vbCBjbGllbnRfZW5jb2Rpbmdfb25seTsJCS8qIHRydWUgaWYgY2xpZW50IGVuY29k aW5nIGlzIGEgbm9uIHN1cHBvcnRlZCBzZXJ2ZXIgZW5jb2RpbmcgKi8KICBzdGF0aWMgRklM RSAqY29weV9maWxlOwkJCS8qIHVzZWQgaWYgY29weV9kZXN0ID09IENPUFlfRklMRSAqLwog IHN0YXRpYyBTdHJpbmdJbmZvIGNvcHlfbXNnYnVmOwkvKiB1c2VkIGlmIGNvcHlfZGVzdCA9 PSBDT1BZX05FV19GRSAqLwogIHN0YXRpYyBib29sIGZlX2VvZjsJCQkJLyogdHJ1ZSBpZiBk ZXRlY3RlZCBlbmQgb2YgY29weSBkYXRhICovCioqKioqKioqKioqKioqKgoqKiogMTAxLDE1 NiAqKioqCiAgCiAgLyogdGhlc2UgYXJlIGp1c3QgZm9yIGVycm9yIG1lc3NhZ2VzLCBzZWUg Y29weV9pbl9lcnJvcl9jYWxsYmFjayAqLwogIHN0YXRpYyBib29sIGNvcHlfYmluYXJ5OwkJ LyogaXMgaXQgYSBiaW5hcnkgY29weT8gKi8KISBzdGF0aWMgY29uc3QgY2hhciAqY29weV9y ZWxuYW1lOwkvKiB0YWJsZSBuYW1lIGZvciBlcnJvciBtZXNzYWdlcyAqLwogIHN0YXRpYyBp bnQJY29weV9saW5lbm87CQkvKiBsaW5lIG51bWJlciBmb3IgZXJyb3IgbWVzc2FnZXMgKi8K ISBzdGF0aWMgY29uc3QgY2hhciAqY29weV9hdHRuYW1lOwkvKiBjdXJyZW50IGF0dCBmb3Ig ZXJyb3IgbWVzc2FnZXMgKi8KICAKICAKICAvKgogICAqIFRoZXNlIHN0YXRpYyB2YXJpYWJs ZXMgYXJlIHVzZWQgdG8gYXZvaWQgaW5jdXJyaW5nIG92ZXJoZWFkIGZvciBlYWNoCiEgICog YXR0cmlidXRlIHByb2Nlc3NlZC4gIGF0dHJpYnV0ZV9idWYgaXMgcmV1c2VkIG9uIGVhY2gg Q29weVJlYWRBdHRyaWJ1dGUKICAgKiBjYWxsIHRvIGhvbGQgdGhlIHN0cmluZyBiZWluZyBy ZWFkIGluLiAgVW5kZXIgbm9ybWFsIHVzZSBpdCB3aWxsIHNvb24KICAgKiBncm93IHRvIGEg c3VpdGFibGUgc2l6ZSwgYW5kIHRoZW4gd2Ugd2lsbCBhdm9pZCBwYWxsb2MvcGZyZWUgb3Zl cmhlYWQKICAgKiBmb3Igc3Vic2VxdWVudCBhdHRyaWJ1dGVzLiAgTm90ZSB0aGF0IENvcHlS ZWFkQXR0cmlidXRlIHJldHVybnMgYSBwb2ludGVyCiEgICogdG8gYXR0cmlidXRlX2J1Zidz IGRhdGEgYnVmZmVyIQogICAqLwohIHN0YXRpYyBTdHJpbmdJbmZvRGF0YSBhdHRyaWJ1dGVf YnVmOwogIAogIC8qCiAgICogU2ltaWxhcmx5LCBsaW5lX2J1ZiBob2xkcyB0aGUgd2hvbGUg aW5wdXQgbGluZSBiZWluZyBwcm9jZXNzZWQgKGl0cwogICAqIGN1cnNvciBmaWVsZCBwb2lu dHMgdG8gdGhlIG5leHQgY2hhcmFjdGVyIHRvIGJlIHJlYWQgYnkgQ29weVJlYWRBdHRyaWJ1 dGUpLgogICAqIFRoZSBpbnB1dCBjeWNsZSBpcyBmaXJzdCB0byByZWFkIHRoZSB3aG9sZSBs aW5lIGludG8gbGluZV9idWYsIGNvbnZlcnQgaXQKICAgKiB0byBzZXJ2ZXIgZW5jb2Rpbmcs IGFuZCB0aGVuIGV4dHJhY3QgaW5kaXZpZHVhbCBhdHRyaWJ1dGUgZmllbGRzIGludG8KISAg KiBhdHRyaWJ1dGVfYnVmLiAgKFdlIHVzZWQgdG8gaGF2ZSBDb3B5UmVhZEF0dHJpYnV0ZSBy ZWFkIHRoZSBpbnB1dCBzb3VyY2UKICAgKiBkaXJlY3RseSwgYnV0IHRoYXQgY2F1c2VkIGEg bG90IG9mIGVuY29kaW5nIGlzc3VlcyBhbmQgdW5uZWNlc3NhcnkgbG9naWMKICAgKiBjb21w bGV4aXR5LikKICAgKi8KISBzdGF0aWMgU3RyaW5nSW5mb0RhdGEgbGluZV9idWY7CiAgc3Rh dGljIGJvb2wgbGluZV9idWZfY29udmVydGVkOwogIAogIC8qIG5vbi1leHBvcnQgZnVuY3Rp b24gcHJvdG90eXBlcyAqLwogIHN0YXRpYyB2b2lkIERvQ29weVRvKFJlbGF0aW9uIHJlbCwg TGlzdCAqYXR0bnVtbGlzdCwgYm9vbCBiaW5hcnksIGJvb2wgb2lkcywKISAJCSBjaGFyICpk ZWxpbSwgY2hhciAqbnVsbF9wcmludCwgYm9vbCBjc3ZfbW9kZSwgY2hhciAqcXVvdGUsCiEg CQkgY2hhciAqZXNjYXBlLCBMaXN0ICpmb3JjZV9xdW90ZV9hdHRzLCBib29sIGhlYWRlcl9s aW5lLCBib29sIGZlX2NvcHkpOwogIHN0YXRpYyB2b2lkIENvcHlUbyhSZWxhdGlvbiByZWws IExpc3QgKmF0dG51bWxpc3QsIGJvb2wgYmluYXJ5LCBib29sIG9pZHMsCiEgIGNoYXIgKmRl bGltLCBjaGFyICpudWxsX3ByaW50LCBib29sIGNzdl9tb2RlLCBjaGFyICpxdW90ZSwgY2hh ciAqZXNjYXBlLAohIAkgICBMaXN0ICpmb3JjZV9xdW90ZV9hdHRzLCBib29sIGhlYWRlcl9s aW5lKTsKICBzdGF0aWMgdm9pZCBDb3B5RnJvbShSZWxhdGlvbiByZWwsIExpc3QgKmF0dG51 bWxpc3QsIGJvb2wgYmluYXJ5LCBib29sIG9pZHMsCiEgIGNoYXIgKmRlbGltLCBjaGFyICpu dWxsX3ByaW50LCBib29sIGNzdl9tb2RlLCBjaGFyICpxdW90ZSwgY2hhciAqZXNjYXBlLAoh IAkJIExpc3QgKmZvcmNlX25vdG51bGxfYXR0cywgYm9vbCBoZWFkZXJfbGluZSk7CiEgc3Rh dGljIGJvb2wgQ29weVJlYWRMaW5lKGNoYXIgKiBxdW90ZSwgY2hhciAqIGVzY2FwZSk7CiAg c3RhdGljIGNoYXIgKkNvcHlSZWFkQXR0cmlidXRlKGNvbnN0IGNoYXIgKmRlbGltLCBjb25z dCBjaGFyICpudWxsX3ByaW50LAohIAkJCQkgIENvcHlSZWFkUmVzdWx0ICpyZXN1bHQsIGJv b2wgKmlzbnVsbCk7CiAgc3RhdGljIGNoYXIgKkNvcHlSZWFkQXR0cmlidXRlQ1NWKGNvbnN0 IGNoYXIgKmRlbGltLCBjb25zdCBjaGFyICpudWxsX3ByaW50LAohIAkJCQkJIGNoYXIgKnF1 b3RlLCBjaGFyICplc2NhcGUsCiEgCQkJCQkgQ29weVJlYWRSZXN1bHQgKnJlc3VsdCwgYm9v bCAqaXNudWxsKTsKICBzdGF0aWMgRGF0dW0gQ29weVJlYWRCaW5hcnlBdHRyaWJ1dGUoaW50 IGNvbHVtbl9ubywgRm1nckluZm8gKmZsaW5mbywKISAJCQkJCQlPaWQgdHlwaW9wYXJhbSwg Ym9vbCAqaXNudWxsKTsKICBzdGF0aWMgdm9pZCBDb3B5QXR0cmlidXRlT3V0KGNoYXIgKnN0 cmluZywgY2hhciAqZGVsaW0pOwogIHN0YXRpYyB2b2lkIENvcHlBdHRyaWJ1dGVPdXRDU1Yo Y2hhciAqc3RyaW5nLCBjaGFyICpkZWxpbSwgY2hhciAqcXVvdGUsCiEgCQkJCQljaGFyICpl c2NhcGUsIGJvb2wgZm9yY2VfcXVvdGUpOwogIHN0YXRpYyBMaXN0ICpDb3B5R2V0QXR0bnVt cyhSZWxhdGlvbiByZWwsIExpc3QgKmF0dG5hbWVsaXN0KTsKICBzdGF0aWMgdm9pZCBsaW1p dF9wcmludG91dF9sZW5ndGgoU3RyaW5nSW5mbyBidWYpOwogIAogIC8qIEludGVybmFsIGNv bW11bmljYXRpb25zIGZ1bmN0aW9ucyAqLwogIHN0YXRpYyB2b2lkIFNlbmRDb3B5QmVnaW4o Ym9vbCBiaW5hcnksIGludCBuYXR0cyk7Ci0tLSAxMDUsMTg5IC0tLS0KICAKICAvKiB0aGVz ZSBhcmUganVzdCBmb3IgZXJyb3IgbWVzc2FnZXMsIHNlZSBjb3B5X2luX2Vycm9yX2NhbGxi YWNrICovCiAgc3RhdGljIGJvb2wgY29weV9iaW5hcnk7CQkvKiBpcyBpdCBhIGJpbmFyeSBj b3B5PyAqLwohIHN0YXRpYyBjb25zdCBjaGFyICpjb3B5X3JlbG5hbWU7CQkvKiB0YWJsZSBu YW1lIGZvciBlcnJvciBtZXNzYWdlcyAqLwogIHN0YXRpYyBpbnQJY29weV9saW5lbm87CQkv KiBsaW5lIG51bWJlciBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KISBzdGF0aWMgY29uc3QgY2hh ciAqY29weV9hdHRuYW1lOwkJLyogY3VycmVudCBhdHQgZm9yIGVycm9yIG1lc3NhZ2VzICov CiEgCiEgLyogU3RhdGljIHZhcmlhYmxlcyBmb3IgYnVmZmVyZWQgaW5wdXQgcGFyc2luZyAq LwohIAohIC8qIGxlYXZlIHJvb20gZm9yIGV4dHJhIG51bGwgKHRvIGVuYWJsZSB1c2Ugb2Yg c3RyaW5nIGZ1bmN0aW9ucykgKi8KISBzdGF0aWMgY2hhciBpbnB1dF9idWZbQ09QWV9CVUZf U0laRSArIDFdOwohIHN0YXRpYyBjaGFyICpiZWdsb2M7CiEgc3RhdGljIGNoYXIgKmVuZGxv YzsKISBzdGF0aWMgYm9vbCBlc2NfaW5fcHJldmJ1ZjsJCS8qIGJhY2tzbGFzaCB3YXMgbGFz dCBjaGFyYWN0ZXIgb2YgdGhlIGRhdGEgaW5wdXQgYnVmZmVyICovCiEgc3RhdGljIGJvb2wg Y3JfaW5fcHJldmJ1ZjsJCS8qIENSIHdhcyBsYXN0IGNoYXJhY3RlciBvZiB0aGUgZGF0YSBp bnB1dCBidWZmZXIgKi8KISBzdGF0aWMgYm9vbCBsaW5lX2RvbmU7CQkJLyogZmluaXNoZWQg cHJvY2Vzc2luZyB0aGUgd2hvbGUgbGluZSBvciBzdG9wcGVkIGluIHRoZSBtaWRkbGUgKi8K ISBzdGF0aWMgYm9vbCBidWZfZG9uZTsJCQkvKiBmaW5pc2hlZCBwcm9jZXNzaW5nIHRoZSBj dXJyZW50IGJ1ZmZlciAqLwohIHN0YXRpYyBpbnQJYnVmZmVyX2luZGV4OwkJLyogaW5wdXQg YnVmZmVyIGluZGV4ICovCiAgCiAgCiAgLyoKICAgKiBUaGVzZSBzdGF0aWMgdmFyaWFibGVz IGFyZSB1c2VkIHRvIGF2b2lkIGluY3VycmluZyBvdmVyaGVhZCBmb3IgZWFjaAohICAqIGF0 dHJpYnV0ZSBwcm9jZXNzZWQuICBhdHRyX2J1ZiBpcyByZXVzZWQgb24gZWFjaCBDb3B5UmVh ZEF0dHJpYnV0ZQogICAqIGNhbGwgdG8gaG9sZCB0aGUgc3RyaW5nIGJlaW5nIHJlYWQgaW4u ICBVbmRlciBub3JtYWwgdXNlIGl0IHdpbGwgc29vbgogICAqIGdyb3cgdG8gYSBzdWl0YWJs ZSBzaXplLCBhbmQgdGhlbiB3ZSB3aWxsIGF2b2lkIHBhbGxvYy9wZnJlZSBvdmVyaGVhZAog ICAqIGZvciBzdWJzZXF1ZW50IGF0dHJpYnV0ZXMuICBOb3RlIHRoYXQgQ29weVJlYWRBdHRy aWJ1dGUgcmV0dXJucyBhIHBvaW50ZXIKISAgKiB0byBhdHRyX2J1ZidzIGRhdGEgYnVmZmVy IQogICAqLwohIHN0YXRpYyBTdHJpbmdJbmZvRGF0YSBhdHRyX2J1ZjsgLyogc3RpbGwgdXNl ZCBpbiBDb3B5RnJvbSgpCQkqLwogIAogIC8qCiAgICogU2ltaWxhcmx5LCBsaW5lX2J1ZiBo b2xkcyB0aGUgd2hvbGUgaW5wdXQgbGluZSBiZWluZyBwcm9jZXNzZWQgKGl0cwogICAqIGN1 cnNvciBmaWVsZCBwb2ludHMgdG8gdGhlIG5leHQgY2hhcmFjdGVyIHRvIGJlIHJlYWQgYnkg Q29weVJlYWRBdHRyaWJ1dGUpLgogICAqIFRoZSBpbnB1dCBjeWNsZSBpcyBmaXJzdCB0byBy ZWFkIHRoZSB3aG9sZSBsaW5lIGludG8gbGluZV9idWYsIGNvbnZlcnQgaXQKICAgKiB0byBz ZXJ2ZXIgZW5jb2RpbmcsIGFuZCB0aGVuIGV4dHJhY3QgaW5kaXZpZHVhbCBhdHRyaWJ1dGUg ZmllbGRzIGludG8KISAgKiBhdHRyX2J1Zi4gIChXZSB1c2VkIHRvIGhhdmUgQ29weVJlYWRB dHRyaWJ1dGUgcmVhZCB0aGUgaW5wdXQgc291cmNlCiAgICogZGlyZWN0bHksIGJ1dCB0aGF0 IGNhdXNlZCBhIGxvdCBvZiBlbmNvZGluZyBpc3N1ZXMgYW5kIHVubmVjZXNzYXJ5IGxvZ2lj CiAgICogY29tcGxleGl0eS4pCiAgICovCiEgc3RhdGljIFN0cmluZ0luZm9EYXRhIGxpbmVf YnVmOyAvKiBzdGlsbCB1c2VkIGluIENvcHlGcm9tQmluYXJ5L0NTVigpICovCiAgc3RhdGlj IGJvb2wgbGluZV9idWZfY29udmVydGVkOwogIAogIC8qIG5vbi1leHBvcnQgZnVuY3Rpb24g cHJvdG90eXBlcyAqLwogIHN0YXRpYyB2b2lkIERvQ29weVRvKFJlbGF0aW9uIHJlbCwgTGlz dCAqYXR0bnVtbGlzdCwgYm9vbCBiaW5hcnksIGJvb2wgb2lkcywKISAJCQkJCSBjaGFyICpk ZWxpbSwgY2hhciAqbnVsbF9wcmludCwgYm9vbCBjc3ZfbW9kZSwgY2hhciAqcXVvdGUsCiEg CQkJCQkgY2hhciAqZXNjYXBlLCBMaXN0ICpmb3JjZV9xdW90ZV9hdHRzLCBib29sIGhlYWRl cl9saW5lLAohIAkJCQkJIGJvb2wgZmVfY29weSk7CiAgc3RhdGljIHZvaWQgQ29weVRvKFJl bGF0aW9uIHJlbCwgTGlzdCAqYXR0bnVtbGlzdCwgYm9vbCBiaW5hcnksIGJvb2wgb2lkcywK ISAJCQkJICAgY2hhciAqZGVsaW0sIGNoYXIgKm51bGxfcHJpbnQsIGJvb2wgY3N2X21vZGUs IGNoYXIgKnF1b3RlLAohIAkJCQkgICBjaGFyICplc2NhcGUsIExpc3QgKmZvcmNlX3F1b3Rl X2F0dHMsIGJvb2wgaGVhZGVyX2xpbmUpOwogIHN0YXRpYyB2b2lkIENvcHlGcm9tKFJlbGF0 aW9uIHJlbCwgTGlzdCAqYXR0bnVtbGlzdCwgYm9vbCBiaW5hcnksIGJvb2wgb2lkcywKISAJ CQkJCSBjaGFyICpkZWxpbSwgY2hhciAqbnVsbF9wcmludCwgYm9vbCBjc3ZfbW9kZSwgY2hh ciAqcXVvdGUsCiEgCQkJCQkgY2hhciAqZXNjYXBlLCBMaXN0ICpmb3JjZV9ub3RudWxsX2F0 dHMsIGJvb2wgaGVhZGVyX2xpbmUpOwohIHN0YXRpYyBib29sIENvcHlSZWFkTGluZShjaGFy ICpxdW90ZSwgY2hhciAqZXNjYXBlKTsKICBzdGF0aWMgY2hhciAqQ29weVJlYWRBdHRyaWJ1 dGUoY29uc3QgY2hhciAqZGVsaW0sIGNvbnN0IGNoYXIgKm51bGxfcHJpbnQsCiEgCQkJCQkJ CSAgIENvcHlSZWFkUmVzdWx0ICpyZXN1bHQsIGJvb2wgKmlzbnVsbCk7CiAgc3RhdGljIGNo YXIgKkNvcHlSZWFkQXR0cmlidXRlQ1NWKGNvbnN0IGNoYXIgKmRlbGltLCBjb25zdCBjaGFy ICpudWxsX3ByaW50LAohIAkJCQkJCQkJICBjaGFyICpxdW90ZSwgY2hhciAqZXNjYXBlLAoh IAkJCQkJCQkJICBDb3B5UmVhZFJlc3VsdCAqcmVzdWx0LCBib29sICppc251bGwpOwogIHN0 YXRpYyBEYXR1bSBDb3B5UmVhZEJpbmFyeUF0dHJpYnV0ZShpbnQgY29sdW1uX25vLCBGbWdy SW5mbyAqZmxpbmZvLAohIAkJCQkJCQkJCSBPaWQgdHlwaW9wYXJhbSwgYm9vbCAqaXNudWxs KTsKICBzdGF0aWMgdm9pZCBDb3B5QXR0cmlidXRlT3V0KGNoYXIgKnN0cmluZywgY2hhciAq ZGVsaW0pOwogIHN0YXRpYyB2b2lkIENvcHlBdHRyaWJ1dGVPdXRDU1YoY2hhciAqc3RyaW5n LCBjaGFyICpkZWxpbSwgY2hhciAqcXVvdGUsCiEgCQkJCQkJCQljaGFyICplc2NhcGUsIGJv b2wgZm9yY2VfcXVvdGUpOwogIHN0YXRpYyBMaXN0ICpDb3B5R2V0QXR0bnVtcyhSZWxhdGlv biByZWwsIExpc3QgKmF0dG5hbWVsaXN0KTsKICBzdGF0aWMgdm9pZCBsaW1pdF9wcmludG91 dF9sZW5ndGgoU3RyaW5nSW5mbyBidWYpOworIHN0YXRpYyBib29sIENvcHlSZWFkTGluZUJ1 ZmZlcmVkKHNpemVfdCBieXRlc3JlYWQpOworIHN0YXRpYyB2b2lkIENvcHlGcm9tRGVsaW1p dGVkKFJlbGF0aW9uIHJlbCwgTGlzdCAqYXR0bnVtbGlzdCwgYm9vbCBiaW5hcnksCisgCQkJ CQkJCSAgYm9vbCBvaWRzLCBjaGFyICpkZWxpbSwgY2hhciAqbnVsbF9wcmludCwKKyAJCQkJ CQkJICBib29sIGNzdl9tb2RlLCBjaGFyICpxdW90ZSwgY2hhciAqZXNjYXBlLAorIAkJCQkJ CQkgIExpc3QgKmZvcmNlX25vdG51bGxfYXR0cyk7Cisgc3RhdGljIGNoYXIgKkNvcHlSZWFk QXR0cmlidXRlKGNvbnN0IGNoYXIgKmRlbGltLCBjb25zdCBjaGFyICpudWxsX3ByaW50LAor IAkJCQkJCQkgICBDb3B5UmVhZFJlc3VsdCAqcmVzdWx0LCBib29sICppc251bGwpOworIHN0 YXRpYyB2b2lkIENvcHlSZWFkQWxsQXR0cnMoY29uc3QgY2hhciAqZGVsaW0sIGNvbnN0IGNo YXIgKm51bGxfcHJpbnQsCisgCQkJCQkJCSBpbnQgbnVsbF9wcmludF9sZW4sIGNoYXIgKm51 bGxzLCBMaXN0ICphdHRudW1saXN0LAorIAkJCQkJCQkgaW50ICphdHRyX29mZnNldHMsIGlu dCBudW1fcGh5c19hdHRycywKKyAJCQkJCQkJIEZvcm1fcGdfYXR0cmlidXRlICphdHRyKTsK KyBzdGF0aWMgY2hhciAqQ29weVJlYWRPaWRBdHRyKGNvbnN0IGNoYXIgKmRlbGltLCBjb25z dCBjaGFyICpudWxsX3ByaW50LAorIAkJCQkJCQkgaW50IG51bGxfcHJpbnRfbGVuLCBDb3B5 UmVhZFJlc3VsdCAqcmVzdWx0LAorIAkJCQkJCQkgYm9vbCAqaXNudWxsKTsKKyBzdGF0aWMg Ym9vbCBEZXRlY3RMaW5lRW5kKHNpemVfdCBieXRlc3JlYWQpOworIAogIAogIC8qIEludGVy bmFsIGNvbW11bmljYXRpb25zIGZ1bmN0aW9ucyAqLwogIHN0YXRpYyB2b2lkIFNlbmRDb3B5 QmVnaW4oYm9vbCBiaW5hcnksIGludCBuYXR0cyk7CioqKioqKioqKioqKioqKgoqKiogMTYw LDE2NiAqKioqCiAgc3RhdGljIHZvaWQgQ29weVNlbmRTdHJpbmcoY29uc3QgY2hhciAqc3Ry KTsKICBzdGF0aWMgdm9pZCBDb3B5U2VuZENoYXIoY2hhciBjKTsKICBzdGF0aWMgdm9pZCBD b3B5U2VuZEVuZE9mUm93KGJvb2wgYmluYXJ5KTsKISBzdGF0aWMgdm9pZCBDb3B5R2V0RGF0 YSh2b2lkICpkYXRhYnVmLCBpbnQgZGF0YXNpemUpOwogIHN0YXRpYyBpbnQJQ29weUdldENo YXIodm9pZCk7CiAgCiAgI2RlZmluZSBDb3B5R2V0RW9mKCkgIChmZV9lb2YpCi0tLSAxOTMs MTk5IC0tLS0KICBzdGF0aWMgdm9pZCBDb3B5U2VuZFN0cmluZyhjb25zdCBjaGFyICpzdHIp OwogIHN0YXRpYyB2b2lkIENvcHlTZW5kQ2hhcihjaGFyIGMpOwogIHN0YXRpYyB2b2lkIENv cHlTZW5kRW5kT2ZSb3coYm9vbCBiaW5hcnkpOwohIHN0YXRpYyBpbnQJQ29weUdldERhdGEo dm9pZCAqZGF0YWJ1ZiwgaW50IGRhdGFzaXplKTsKICBzdGF0aWMgaW50CUNvcHlHZXRDaGFy KHZvaWQpOwogIAogICNkZWZpbmUgQ29weUdldEVvZigpICAoZmVfZW9mKQoqKioqKioqKioq KioqKioKKioqIDE3MSwxNzYgKioqKgotLS0gMjA0LDIxMyAtLS0tCiAgc3RhdGljIHZvaWQg Q29weVNlbmRJbnQxNihpbnQxNiB2YWwpOwogIHN0YXRpYyBpbnQxNiBDb3B5R2V0SW50MTYo dm9pZCk7CiAgCisgLyogbmV3IHBhcnNpbmcgdXRpbHMgKi8KKyBzdGF0aWMgY2hhciAqc3Ry Y2hybGVuKGNvbnN0IGNoYXIgKnMsIGludCBjLCBzaXplX3QgbGVuKTsKKyBzdGF0aWMgY2hh ciAqc3RyMmNocmxlbihjb25zdCBjaGFyICpzLCBpbnQgYzEsIGludCBjMiwgc2l6ZV90IGxl biwKKyAJCQkJCQljaGFyICpjX2ZvdW5kKTsKICAKICAvKgogICAqIFNlbmQgY29weSBzdGFy dC9zdG9wIG1lc3NhZ2VzIGZvciBmcm9udGVuZCBjb3BpZXMuICBUaGVzZSBoYXZlIGNoYW5n ZWQKKioqKioqKioqKioqKioqCioqKiAxODEsMTg3ICoqKioKICB7CiAgCWlmIChQR19QUk9U T0NPTF9NQUpPUihGcm9udGVuZFByb3RvY29sKSA+PSAzKQogIAl7CiEgCQkvKiBuZXcgd2F5 ICovCiAgCQlTdHJpbmdJbmZvRGF0YSBidWY7CiAgCQlpbnQxNgkJZm9ybWF0ID0gKGJpbmFy eSA/IDEgOiAwKTsKICAJCWludAkJCWk7Ci0tLSAyMTgsMjI2IC0tLS0KICB7CiAgCWlmIChQ R19QUk9UT0NPTF9NQUpPUihGcm9udGVuZFByb3RvY29sKSA+PSAzKQogIAl7CiEgCQkvKgoh IAkJICogbmV3IHdheQohIAkJICovCiAgCQlTdHJpbmdJbmZvRGF0YSBidWY7CiAgCQlpbnQx NgkJZm9ybWF0ID0gKGJpbmFyeSA/IDEgOiAwKTsKICAJCWludAkJCWk7CioqKioqKioqKioq KioqKgoqKiogMTk3LDIyMSAqKioqCiAgCX0KICAJZWxzZSBpZiAoUEdfUFJPVE9DT0xfTUFK T1IoRnJvbnRlbmRQcm90b2NvbCkgPj0gMikKICAJewohIAkJLyogb2xkIHdheSAqLwogIAkJ aWYgKGJpbmFyeSkKICAJCQllcmVwb3J0KEVSUk9SLAogIAkJCQkJKGVycmNvZGUoRVJSQ09E RV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAohIAkJCQkJIGVycm1zZygiQ09QWSBCSU5BUlkg aXMgbm90IHN1cHBvcnRlZCB0byBzdGRvdXQgb3IgZnJvbSBzdGRpbiIpKSk7CiAgCQlwcV9w dXRlbXB0eW1lc3NhZ2UoJ0gnKTsKISAJCS8qIGdyb3R0aW5lc3MgbmVlZGVkIGZvciBvbGQg Q09QWSBPVVQgcHJvdG9jb2wgKi8KICAJCXBxX3N0YXJ0Y29weW91dCgpOwogIAkJY29weV9k ZXN0ID0gQ09QWV9PTERfRkU7CiAgCX0KICAJZWxzZQogIAl7CiEgCQkvKiB2ZXJ5IG9sZCB3 YXkgKi8KICAJCWlmIChiaW5hcnkpCiAgCQkJZXJlcG9ydChFUlJPUiwKICAJCQkJCShlcnJj b2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKISAJCQkJCSBlcnJtc2coIkNP UFkgQklOQVJZIGlzIG5vdCBzdXBwb3J0ZWQgdG8gc3Rkb3V0IG9yIGZyb20gc3RkaW4iKSkp OwogIAkJcHFfcHV0ZW1wdHltZXNzYWdlKCdCJyk7CiEgCQkvKiBncm90dGluZXNzIG5lZWRl ZCBmb3Igb2xkIENPUFkgT1VUIHByb3RvY29sICovCiAgCQlwcV9zdGFydGNvcHlvdXQoKTsK ICAJCWNvcHlfZGVzdCA9IENPUFlfT0xEX0ZFOwogIAl9Ci0tLSAyMzYsMjcwIC0tLS0KICAJ fQogIAllbHNlIGlmIChQR19QUk9UT0NPTF9NQUpPUihGcm9udGVuZFByb3RvY29sKSA+PSAy KQogIAl7CiEgCQkvKgohIAkJICogb2xkIHdheQohIAkJICovCiAgCQlpZiAoYmluYXJ5KQog IAkJCWVyZXBvcnQoRVJST1IsCiAgCQkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9U X1NVUFBPUlRFRCksCiEgCQkJCQkgZXJybXNnCiEgCQkJCQkgKCJDT1BZIEJJTkFSWSBpcyBu b3Qgc3VwcG9ydGVkIHRvIHN0ZG91dCBvciBmcm9tIHN0ZGluIikpKTsKICAJCXBxX3B1dGVt cHR5bWVzc2FnZSgnSCcpOwohIAkJLyoKISAJCSAqIGdyb3R0aW5lc3MgbmVlZGVkIGZvciBv bGQgQ09QWSBPVVQgcHJvdG9jb2wKISAJCSAqLwogIAkJcHFfc3RhcnRjb3B5b3V0KCk7CiAg CQljb3B5X2Rlc3QgPSBDT1BZX09MRF9GRTsKICAJfQogIAllbHNlCiAgCXsKISAJCS8qCiEg CQkgKiB2ZXJ5IG9sZCB3YXkKISAJCSAqLwogIAkJaWYgKGJpbmFyeSkKICAJCQllcmVwb3J0 KEVSUk9SLAogIAkJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQp LAohIAkJCQkJIGVycm1zZwohIAkJCQkJICgiQ09QWSBCSU5BUlkgaXMgbm90IHN1cHBvcnRl ZCB0byBzdGRvdXQgb3IgZnJvbSBzdGRpbiIpKSk7CiAgCQlwcV9wdXRlbXB0eW1lc3NhZ2Uo J0InKTsKISAJCS8qCiEgCQkgKiBncm90dGluZXNzIG5lZWRlZCBmb3Igb2xkIENPUFkgT1VU IHByb3RvY29sCiEgCQkgKi8KICAJCXBxX3N0YXJ0Y29weW91dCgpOwogIAkJY29weV9kZXN0 ID0gQ09QWV9PTERfRkU7CiAgCX0KKioqKioqKioqKioqKioqCioqKiAyMjYsMjMyICoqKioK ICB7CiAgCWlmIChQR19QUk9UT0NPTF9NQUpPUihGcm9udGVuZFByb3RvY29sKSA+PSAzKQog IAl7CiEgCQkvKiBuZXcgd2F5ICovCiAgCQlTdHJpbmdJbmZvRGF0YSBidWY7CiAgCQlpbnQx NgkJZm9ybWF0ID0gKGJpbmFyeSA/IDEgOiAwKTsKICAJCWludAkJCWk7Ci0tLSAyNzUsMjgz IC0tLS0KICB7CiAgCWlmIChQR19QUk9UT0NPTF9NQUpPUihGcm9udGVuZFByb3RvY29sKSA+ PSAzKQogIAl7CiEgCQkvKgohIAkJICogbmV3IHdheQohIAkJICovCiAgCQlTdHJpbmdJbmZv RGF0YSBidWY7CiAgCQlpbnQxNgkJZm9ybWF0ID0gKGJpbmFyeSA/IDEgOiAwKTsKICAJCWlu dAkJCWk7CioqKioqKioqKioqKioqKgoqKiogMjQyLDI2NiAqKioqCiAgCX0KICAJZWxzZSBp ZiAoUEdfUFJPVE9DT0xfTUFKT1IoRnJvbnRlbmRQcm90b2NvbCkgPj0gMikKICAJewohIAkJ Lyogb2xkIHdheSAqLwogIAkJaWYgKGJpbmFyeSkKICAJCQllcmVwb3J0KEVSUk9SLAogIAkJ CQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAohIAkJCQkJIGVy cm1zZygiQ09QWSBCSU5BUlkgaXMgbm90IHN1cHBvcnRlZCB0byBzdGRvdXQgb3IgZnJvbSBz dGRpbiIpKSk7CiAgCQlwcV9wdXRlbXB0eW1lc3NhZ2UoJ0cnKTsKICAJCWNvcHlfZGVzdCA9 IENPUFlfT0xEX0ZFOwogIAl9CiAgCWVsc2UKICAJewohIAkJLyogdmVyeSBvbGQgd2F5ICov CiAgCQlpZiAoYmluYXJ5KQogIAkJCWVyZXBvcnQoRVJST1IsCiAgCQkJCQkoZXJyY29kZShF UlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCiEgCQkJCQkgZXJybXNnKCJDT1BZIEJJ TkFSWSBpcyBub3Qgc3VwcG9ydGVkIHRvIHN0ZG91dCBvciBmcm9tIHN0ZGluIikpKTsKICAJ CXBxX3B1dGVtcHR5bWVzc2FnZSgnRCcpOwogIAkJY29weV9kZXN0ID0gQ09QWV9PTERfRkU7 CiAgCX0KISAJLyogV2UgKm11c3QqIGZsdXNoIGhlcmUgdG8gZW5zdXJlIEZFIGtub3dzIGl0 IGNhbiBzZW5kLiAqLwogIAlwcV9mbHVzaCgpOwogIH0KICAKLS0tIDI5MywzMjUgLS0tLQog IAl9CiAgCWVsc2UgaWYgKFBHX1BST1RPQ09MX01BSk9SKEZyb250ZW5kUHJvdG9jb2wpID49 IDIpCiAgCXsKISAJCS8qCiEgCQkgKiBvbGQgd2F5CiEgCQkgKi8KICAJCWlmIChiaW5hcnkp CiAgCQkJZXJlcG9ydChFUlJPUiwKICAJCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9O T1RfU1VQUE9SVEVEKSwKISAJCQkJCSBlcnJtc2cKISAJCQkJCSAoIkNPUFkgQklOQVJZIGlz IG5vdCBzdXBwb3J0ZWQgdG8gc3Rkb3V0IG9yIGZyb20gc3RkaW4iKSkpOwogIAkJcHFfcHV0 ZW1wdHltZXNzYWdlKCdHJyk7CiAgCQljb3B5X2Rlc3QgPSBDT1BZX09MRF9GRTsKICAJfQog IAllbHNlCiAgCXsKISAJCS8qCiEgCQkgKiB2ZXJ5IG9sZCB3YXkKISAJCSAqLwogIAkJaWYg KGJpbmFyeSkKICAJCQllcmVwb3J0KEVSUk9SLAogIAkJCQkJKGVycmNvZGUoRVJSQ09ERV9G RUFUVVJFX05PVF9TVVBQT1JURUQpLAohIAkJCQkJIGVycm1zZwohIAkJCQkJICgiQ09QWSBC SU5BUlkgaXMgbm90IHN1cHBvcnRlZCB0byBzdGRvdXQgb3IgZnJvbSBzdGRpbiIpKSk7CiAg CQlwcV9wdXRlbXB0eW1lc3NhZ2UoJ0QnKTsKICAJCWNvcHlfZGVzdCA9IENPUFlfT0xEX0ZF OwogIAl9CiEgCS8qCiEgCSAqIFdlICptdXN0KiBmbHVzaCBoZXJlIHRvIGVuc3VyZSBGRSBr bm93cyBpdCBjYW4gc2VuZC4KISAJICovCiAgCXBxX2ZsdXNoKCk7CiAgfQogIAoqKioqKioq KioqKioqKioKKioqIDI3MSwyOTAgKioqKgogIAl7CiAgCQlpZiAoYmluYXJ5KQogIAkJewoh IAkJCS8qIE5lZWQgdG8gZmx1c2ggb3V0IGZpbGUgdHJhaWxlciB3b3JkICovCiAgCQkJQ29w eVNlbmRFbmRPZlJvdyh0cnVlKTsKICAJCX0KICAJCWVsc2UKICAJCXsKISAJCQkvKiBTaG91 bGRuJ3QgaGF2ZSBhbnkgdW5zZW50IGRhdGEgKi8KICAJCQlBc3NlcnQoY29weV9tc2didWYt PmxlbiA9PSAwKTsKICAJCX0KISAJCS8qIFNlbmQgQ29weSBEb25lIG1lc3NhZ2UgKi8KICAJ CXBxX3B1dGVtcHR5bWVzc2FnZSgnYycpOwogIAl9CiAgCWVsc2UKICAJewohIAkJLyogVGhl IEZFL0JFIHByb3RvY29sIHVzZXMgXG4gYXMgbmV3bGluZSBmb3IgYWxsIHBsYXRmb3JtcyAq LwogIAkJQ29weVNlbmREYXRhKCJcXC5cbiIsIDMpOwogIAkJcHFfZW5kY29weW91dChmYWxz ZSk7CiAgCX0KLS0tIDMzMCwzNTcgLS0tLQogIAl7CiAgCQlpZiAoYmluYXJ5KQogIAkJewoh IAkJCS8qCiEgCQkJICogTmVlZCB0byBmbHVzaCBvdXQgZmlsZSB0cmFpbGVyIHdvcmQKISAJ CQkgKi8KICAJCQlDb3B5U2VuZEVuZE9mUm93KHRydWUpOwogIAkJfQogIAkJZWxzZQogIAkJ ewohIAkJCS8qCiEgCQkJICogU2hvdWxkbid0IGhhdmUgYW55IHVuc2VudCBkYXRhIAohIAkJ CSAqLwogIAkJCUFzc2VydChjb3B5X21zZ2J1Zi0+bGVuID09IDApOwogIAkJfQohIAkJLyoK ISAJCSAqIFNlbmQgQ29weSBEb25lIG1lc3NhZ2UKISAJCSAqLwogIAkJcHFfcHV0ZW1wdHlt ZXNzYWdlKCdjJyk7CiAgCX0KICAJZWxzZQogIAl7CiEgCQkvKgohIAkJICogVGhlIEZFL0JF IHByb3RvY29sIHVzZXMgXG4gYXMgbmV3bGluZSBmb3IgYWxsIHBsYXRmb3JtcwohIAkJICov CiAgCQlDb3B5U2VuZERhdGEoIlxcLlxuIiwgMyk7CiAgCQlwcV9lbmRjb3B5b3V0KGZhbHNl KTsKICAJfQoqKioqKioqKioqKioqKioKKioqIDMxNCwzMjMgKioqKgogIAkJY2FzZSBDT1BZ X09MRF9GRToKICAJCQlpZiAocHFfcHV0Ynl0ZXMoKGNoYXIgKikgZGF0YWJ1ZiwgZGF0YXNp emUpKQogIAkJCXsKISAJCQkJLyogbm8gaG9wZSBvZiByZWNvdmVyaW5nIGNvbm5lY3Rpb24g c3luYywgc28gRkFUQUwgKi8KICAJCQkJZXJlcG9ydChGQVRBTCwKICAJCQkJCQkoZXJyY29k ZShFUlJDT0RFX0NPTk5FQ1RJT05fRkFJTFVSRSksCiEgCQkJCQkgICBlcnJtc2coImNvbm5l Y3Rpb24gbG9zdCBkdXJpbmcgQ09QWSB0byBzdGRvdXQiKSkpOwogIAkJCX0KICAJCQlicmVh azsKICAJCWNhc2UgQ09QWV9ORVdfRkU6Ci0tLSAzODEsMzkyIC0tLS0KICAJCWNhc2UgQ09Q WV9PTERfRkU6CiAgCQkJaWYgKHBxX3B1dGJ5dGVzKChjaGFyICopIGRhdGFidWYsIGRhdGFz aXplKSkKICAJCQl7CiEgCQkJCS8qCiEgCQkJCSAqIG5vIGhvcGUgb2YgcmVjb3ZlcmluZyBj b25uZWN0aW9uIHN5bmMsIHNvIEZBVEFMCiEgCQkJCSAqLwogIAkJCQllcmVwb3J0KEZBVEFM LAogIAkJCQkJCShlcnJjb2RlKEVSUkNPREVfQ09OTkVDVElPTl9GQUlMVVJFKSwKISAJCQkJ CQkgZXJybXNnKCJjb25uZWN0aW9uIGxvc3QgZHVyaW5nIENPUFkgdG8gc3Rkb3V0IikpKTsK ICAJCQl9CiAgCQkJYnJlYWs7CiAgCQljYXNlIENPUFlfTkVXX0ZFOgoqKioqKioqKioqKioq KioKKioqIDM0NiwzNTIgKioqKgogIAkJY2FzZSBDT1BZX0ZJTEU6CiAgCQkJaWYgKCFiaW5h cnkpCiAgCQkJewohIAkJCQkvKiBEZWZhdWx0IGxpbmUgdGVybWluYXRpb24gZGVwZW5kcyBv biBwbGF0Zm9ybSAqLwogICNpZm5kZWYgV0lOMzIKICAJCQkJQ29weVNlbmRDaGFyKCdcbicp OwogICNlbHNlCi0tLSA0MTUsNDIzIC0tLS0KICAJCWNhc2UgQ09QWV9GSUxFOgogIAkJCWlm ICghYmluYXJ5KQogIAkJCXsKISAJCQkJLyoKISAJCQkJICogRGVmYXVsdCBsaW5lIHRlcm1p bmF0aW9uIGRlcGVuZHMgb24gcGxhdGZvcm0KISAJCQkJICovCiAgI2lmbmRlZiBXSU4zMgog IAkJCQlDb3B5U2VuZENoYXIoJ1xuJyk7CiAgI2Vsc2UKKioqKioqKioqKioqKioqCioqKiAz NTUsMzcxICoqKioKICAJCQl9CiAgCQkJYnJlYWs7CiAgCQljYXNlIENPUFlfT0xEX0ZFOgoh IAkJCS8qIFRoZSBGRS9CRSBwcm90b2NvbCB1c2VzIFxuIGFzIG5ld2xpbmUgZm9yIGFsbCBw bGF0Zm9ybXMgKi8KICAJCQlpZiAoIWJpbmFyeSkKICAJCQkJQ29weVNlbmRDaGFyKCdcbicp OwogIAkJCWJyZWFrOwogIAkJY2FzZSBDT1BZX05FV19GRToKISAJCQkvKiBUaGUgRkUvQkUg cHJvdG9jb2wgdXNlcyBcbiBhcyBuZXdsaW5lIGZvciBhbGwgcGxhdGZvcm1zICovCiAgCQkJ aWYgKCFiaW5hcnkpCiAgCQkJCUNvcHlTZW5kQ2hhcignXG4nKTsKISAJCQkvKiBEdW1wIHRo ZSBhY2N1bXVsYXRlZCByb3cgYXMgb25lIENvcHlEYXRhIG1lc3NhZ2UgKi8KICAJCQkodm9p ZCkgcHFfcHV0bWVzc2FnZSgnZCcsIGNvcHlfbXNnYnVmLT5kYXRhLCBjb3B5X21zZ2J1Zi0+ bGVuKTsKISAJCQkvKiBSZXNldCBjb3B5X21zZ2J1ZiB0byBlbXB0eSAqLwogIAkJCWNvcHlf bXNnYnVmLT5sZW4gPSAwOwogIAkJCWNvcHlfbXNnYnVmLT5kYXRhWzBdID0gJ1wwJzsKICAJ CQlicmVhazsKLS0tIDQyNiw0NTAgLS0tLQogIAkJCX0KICAJCQlicmVhazsKICAJCWNhc2Ug Q09QWV9PTERfRkU6CiEgCQkJLyoKISAJCQkgKiBUaGUgRkUvQkUgcHJvdG9jb2wgdXNlcyBc biBhcyBuZXdsaW5lIGZvciBhbGwgcGxhdGZvcm1zCiEgCQkJICovCiAgCQkJaWYgKCFiaW5h cnkpCiAgCQkJCUNvcHlTZW5kQ2hhcignXG4nKTsKICAJCQlicmVhazsKICAJCWNhc2UgQ09Q WV9ORVdfRkU6CiEgCQkJLyoKISAJCQkgKiBUaGUgRkUvQkUgcHJvdG9jb2wgdXNlcyBcbiBh cyBuZXdsaW5lIGZvciBhbGwgcGxhdGZvcm1zCiEgCQkJICovCiAgCQkJaWYgKCFiaW5hcnkp CiAgCQkJCUNvcHlTZW5kQ2hhcignXG4nKTsKISAJCQkvKgohIAkJCSAqIER1bXAgdGhlIGFj Y3VtdWxhdGVkIHJvdyBhcyBvbmUgQ29weURhdGEgbWVzc2FnZQohIAkJCSAqLwogIAkJCSh2 b2lkKSBwcV9wdXRtZXNzYWdlKCdkJywgY29weV9tc2didWYtPmRhdGEsIGNvcHlfbXNnYnVm LT5sZW4pOwohIAkJCS8qCiEgCQkJICogUmVzZXQgY29weV9tc2didWYgdG8gZW1wdHkKISAJ CQkgKi8KICAJCQljb3B5X21zZ2J1Zi0+bGVuID0gMDsKICAJCQljb3B5X21zZ2J1Zi0+ZGF0 YVswXSA9ICdcMCc7CiAgCQkJYnJlYWs7CioqKioqKioqKioqKioqKgoqKiogMzgzLDQwNyAq KioqCiAgICogSXQgc2VlbXMgdW53aXNlIHRvIGFsbG93IHRoZSBDT1BZIElOIHRvIGNvbXBs ZXRlIG5vcm1hbGx5IGluIHRoYXQgY2FzZS4KICAgKgogICAqIE5COiBubyBkYXRhIGNvbnZl cnNpb24gaXMgYXBwbGllZCBieSB0aGVzZSBmdW5jdGlvbnMKICAgKi8KISBzdGF0aWMgdm9p ZAogIENvcHlHZXREYXRhKHZvaWQgKmRhdGFidWYsIGludCBkYXRhc2l6ZSkKICB7CiAgCXN3 aXRjaCAoY29weV9kZXN0KQogIAl7CiAgCQljYXNlIENPUFlfRklMRToKISAJCQlmcmVhZChk YXRhYnVmLCBkYXRhc2l6ZSwgMSwgY29weV9maWxlKTsKICAJCQlpZiAoZmVvZihjb3B5X2Zp bGUpKQogIAkJCQlmZV9lb2YgPSB0cnVlOwogIAkJCWJyZWFrOwogIAkJY2FzZSBDT1BZX09M RF9GRToKICAJCQlpZiAocHFfZ2V0Ynl0ZXMoKGNoYXIgKikgZGF0YWJ1ZiwgZGF0YXNpemUp KQogIAkJCXsKISAJCQkJLyogT25seSBhIFwuIHRlcm1pbmF0b3IgaXMgbGVnYWwgRU9GIGlu IG9sZCBwcm90b2NvbCAqLwogIAkJCQllcmVwb3J0KEVSUk9SLAogIAkJCQkJCShlcnJjb2Rl KEVSUkNPREVfQ09OTkVDVElPTl9GQUlMVVJFKSwKICAJCQkJCQkgZXJybXNnKCJ1bmV4cGVj dGVkIEVPRiBvbiBjbGllbnQgY29ubmVjdGlvbiIpKSk7CiAgCQkJfQogIAkJCWJyZWFrOwog IAkJY2FzZSBDT1BZX05FV19GRToKICAJCQl3aGlsZSAoZGF0YXNpemUgPiAwICYmICFmZV9l b2YpCi0tLSA0NjIsNDk0IC0tLS0KICAgKiBJdCBzZWVtcyB1bndpc2UgdG8gYWxsb3cgdGhl IENPUFkgSU4gdG8gY29tcGxldGUgbm9ybWFsbHkgaW4gdGhhdCBjYXNlLgogICAqCiAgICog TkI6IG5vIGRhdGEgY29udmVyc2lvbiBpcyBhcHBsaWVkIGJ5IHRoZXNlIGZ1bmN0aW9ucwor ICAqCisgICogUmV0dXJuczogdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdlcmUgc3VjY2Vz c2Z1bGx5IHJlYWQKKyAgKiBpbnRvIHRoZSBkYXRhIGJ1ZmZlci4KICAgKi8KISBzdGF0aWMg aW50CiAgQ29weUdldERhdGEodm9pZCAqZGF0YWJ1ZiwgaW50IGRhdGFzaXplKQogIHsKKyAJ c2l6ZV90CQlieXRlc3JlYWQgPSAwOworIAogIAlzd2l0Y2ggKGNvcHlfZGVzdCkKICAJewog IAkJY2FzZSBDT1BZX0ZJTEU6CiEgCQkJYnl0ZXNyZWFkID0gZnJlYWQoZGF0YWJ1ZiwgMSwg ZGF0YXNpemUsIGNvcHlfZmlsZSk7CiAgCQkJaWYgKGZlb2YoY29weV9maWxlKSkKICAJCQkJ ZmVfZW9mID0gdHJ1ZTsKICAJCQlicmVhazsKICAJCWNhc2UgQ09QWV9PTERfRkU6CiAgCQkJ aWYgKHBxX2dldGJ5dGVzKChjaGFyICopIGRhdGFidWYsIGRhdGFzaXplKSkKICAJCQl7CiEg CQkJCS8qCiEgCQkJCSAqIE9ubHkgYSBcLiB0ZXJtaW5hdG9yIGlzIGxlZ2FsIEVPRiBpbiBv bGQgcHJvdG9jb2wKISAJCQkJICovCiAgCQkJCWVyZXBvcnQoRVJST1IsCiAgCQkJCQkJKGVy cmNvZGUoRVJSQ09ERV9DT05ORUNUSU9OX0ZBSUxVUkUpLAogIAkJCQkJCSBlcnJtc2coInVu ZXhwZWN0ZWQgRU9GIG9uIGNsaWVudCBjb25uZWN0aW9uIikpKTsKICAJCQl9CisgCQkJYnl0 ZXNyZWFkICs9IGRhdGFzaXplOwkJLyogdXBkYXRlIHRoZSBjb3VudCBvZiBieXRlcyB0aGF0 IHdlcmUgcmVhZCBzbyBmYXIgKi8KICAJCQlicmVhazsKICAJCWNhc2UgQ09QWV9ORVdfRkU6 CiAgCQkJd2hpbGUgKGRhdGFzaXplID4gMCAmJiAhZmVfZW9mKQoqKioqKioqKioqKioqKioK KioqIDQxMCw0NDEgKioqKgogIAogIAkJCQl3aGlsZSAoY29weV9tc2didWYtPmN1cnNvciA+ PSBjb3B5X21zZ2J1Zi0+bGVuKQogIAkJCQl7CiEgCQkJCQkvKiBUcnkgdG8gcmVjZWl2ZSBh bm90aGVyIG1lc3NhZ2UgKi8KICAJCQkJCWludAkJCW10eXBlOwogIAohIAkJCXJlYWRtZXNz YWdlOgogIAkJCQkJbXR5cGUgPSBwcV9nZXRieXRlKCk7CiAgCQkJCQlpZiAobXR5cGUgPT0g RU9GKQogIAkJCQkJCWVyZXBvcnQoRVJST1IsCiAgCQkJCQkJCQkoZXJyY29kZShFUlJDT0RF X0NPTk5FQ1RJT05fRkFJTFVSRSksCiEgCQkJCQkJIGVycm1zZygidW5leHBlY3RlZCBFT0Yg b24gY2xpZW50IGNvbm5lY3Rpb24iKSkpOwogIAkJCQkJaWYgKHBxX2dldG1lc3NhZ2UoY29w eV9tc2didWYsIDApKQogIAkJCQkJCWVyZXBvcnQoRVJST1IsCiAgCQkJCQkJCQkoZXJyY29k ZShFUlJDT0RFX0NPTk5FQ1RJT05fRkFJTFVSRSksCiEgCQkJCQkJIGVycm1zZygidW5leHBl Y3RlZCBFT0Ygb24gY2xpZW50IGNvbm5lY3Rpb24iKSkpOwogIAkJCQkJc3dpdGNoIChtdHlw ZSkKICAJCQkJCXsKICAJCQkJCQljYXNlICdkJzoJCS8qIENvcHlEYXRhICovCiAgCQkJCQkJ CWJyZWFrOwogIAkJCQkJCWNhc2UgJ2MnOgkJLyogQ29weURvbmUgKi8KISAJCQkJCQkJLyog Q09QWSBJTiBjb3JyZWN0bHkgdGVybWluYXRlZCBieSBmcm9udGVuZCAqLwogIAkJCQkJCQlm ZV9lb2YgPSB0cnVlOwohIAkJCQkJCQlyZXR1cm47CiAgCQkJCQkJY2FzZSAnZic6CQkvKiBD b3B5RmFpbCAqLwogIAkJCQkJCQllcmVwb3J0KEVSUk9SLAogIAkJCQkJCQkJCShlcnJjb2Rl KEVSUkNPREVfUVVFUllfQ0FOQ0VMRUQpLAogIAkJCQkJCQkJCSBlcnJtc2coIkNPUFkgZnJv bSBzdGRpbiBmYWlsZWQ6ICVzIiwKISAJCQkJCQkJCQkJIHBxX2dldG1zZ3N0cmluZyhjb3B5 X21zZ2J1ZikpKSk7CiAgCQkJCQkJCWJyZWFrOwogIAkJCQkJCWNhc2UgJ0gnOgkJLyogRmx1 c2ggKi8KICAJCQkJCQljYXNlICdTJzoJCS8qIFN5bmMgKi8KLS0tIDQ5Nyw1MzQgLS0tLQog IAogIAkJCQl3aGlsZSAoY29weV9tc2didWYtPmN1cnNvciA+PSBjb3B5X21zZ2J1Zi0+bGVu KQogIAkJCQl7CiEgCQkJCQkvKgohIAkJCQkJICogVHJ5IHRvIHJlY2VpdmUgYW5vdGhlciBt ZXNzYWdlCiEgCQkJCQkgKi8KICAJCQkJCWludAkJCW10eXBlOwogIAohIAkJCQkgIHJlYWRt ZXNzYWdlOgogIAkJCQkJbXR5cGUgPSBwcV9nZXRieXRlKCk7CiAgCQkJCQlpZiAobXR5cGUg PT0gRU9GKQogIAkJCQkJCWVyZXBvcnQoRVJST1IsCiAgCQkJCQkJCQkoZXJyY29kZShFUlJD T0RFX0NPTk5FQ1RJT05fRkFJTFVSRSksCiEgCQkJCQkJCQkgZXJybXNnCiEgCQkJCQkJCQkg KCJ1bmV4cGVjdGVkIEVPRiBvbiBjbGllbnQgY29ubmVjdGlvbiIpKSk7CiAgCQkJCQlpZiAo cHFfZ2V0bWVzc2FnZShjb3B5X21zZ2J1ZiwgMCkpCiAgCQkJCQkJZXJlcG9ydChFUlJPUiwK ICAJCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfQ09OTkVDVElPTl9GQUlMVVJFKSwKISAJCQkJ CQkJCSBlcnJtc2cKISAJCQkJCQkJCSAoInVuZXhwZWN0ZWQgRU9GIG9uIGNsaWVudCBjb25u ZWN0aW9uIikpKTsKICAJCQkJCXN3aXRjaCAobXR5cGUpCiAgCQkJCQl7CiAgCQkJCQkJY2Fz ZSAnZCc6CQkvKiBDb3B5RGF0YSAqLwogIAkJCQkJCQlicmVhazsKICAJCQkJCQljYXNlICdj JzoJCS8qIENvcHlEb25lICovCiEgCQkJCQkJCS8qCiEgCQkJCQkJCSAqIENPUFkgSU4gY29y cmVjdGx5IHRlcm1pbmF0ZWQgYnkgZnJvbnRlbmQKISAJCQkJCQkJICovCiAgCQkJCQkJCWZl X2VvZiA9IHRydWU7CiEgCQkJCQkJCXJldHVybiBieXRlc3JlYWQ7CiAgCQkJCQkJY2FzZSAn Zic6CQkvKiBDb3B5RmFpbCAqLwogIAkJCQkJCQllcmVwb3J0KEVSUk9SLAogIAkJCQkJCQkJ CShlcnJjb2RlKEVSUkNPREVfUVVFUllfQ0FOQ0VMRUQpLAogIAkJCQkJCQkJCSBlcnJtc2co IkNPUFkgZnJvbSBzdGRpbiBmYWlsZWQ6ICVzIiwKISAJCQkJCQkJCQkJCXBxX2dldG1zZ3N0 cmluZyhjb3B5X21zZ2J1ZikpKSk7CiAgCQkJCQkJCWJyZWFrOwogIAkJCQkJCWNhc2UgJ0gn OgkJLyogRmx1c2ggKi8KICAJCQkJCQljYXNlICdTJzoJCS8qIFN5bmMgKi8KKioqKioqKioq KioqKioqCioqKiA0NTAsNDU3ICoqKioKICAJCQkJCQlkZWZhdWx0OgogIAkJCQkJCQllcmVw b3J0KEVSUk9SLAogIAkJCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfUFJPVE9DT0xfVklPTEFU SU9OKSwKISAJCQkJCQkJCQkgZXJybXNnKCJ1bmV4cGVjdGVkIG1lc3NhZ2UgdHlwZSAweCUw MlggZHVyaW5nIENPUFkgZnJvbSBzdGRpbiIsCiEgCQkJCQkJCQkJCQltdHlwZSkpKTsKICAJ CQkJCQkJYnJlYWs7CiAgCQkJCQl9CiAgCQkJCX0KLS0tIDU0Myw1NTEgLS0tLQogIAkJCQkJ CWRlZmF1bHQ6CiAgCQkJCQkJCWVyZXBvcnQoRVJST1IsCiAgCQkJCQkJCQkJKGVycmNvZGUo RVJSQ09ERV9QUk9UT0NPTF9WSU9MQVRJT04pLAohIAkJCQkJCQkJCSBlcnJtc2cKISAJCQkJ CQkJCQkgKCJ1bmV4cGVjdGVkIG1lc3NhZ2UgdHlwZSAweCUwMlggZHVyaW5nIENPUFkgZnJv bSBzdGRpbiIsCiEgCQkJCQkJCQkJICBtdHlwZSkpKTsKICAJCQkJCQkJYnJlYWs7CiAgCQkJ CQl9CiAgCQkJCX0KKioqKioqKioqKioqKioqCioqKiA0NjAsNDY5ICoqKioKLS0tIDU1NCw1 NjYgLS0tLQogIAkJCQkJYXZhaWwgPSBkYXRhc2l6ZTsKICAJCQkJcHFfY29weW1zZ2J5dGVz KGNvcHlfbXNnYnVmLCBkYXRhYnVmLCBhdmFpbCk7CiAgCQkJCWRhdGFidWYgPSAodm9pZCAq KSAoKGNoYXIgKikgZGF0YWJ1ZiArIGF2YWlsKTsKKyAJCQkJYnl0ZXNyZWFkICs9IGF2YWls OwkJLyogdXBkYXRlIHRoZSBjb3VudCBvZiBieXRlcyB0aGF0IHdlcmUgcmVhZCBzbyBmYXIg Ki8KICAJCQkJZGF0YXNpemUgLT0gYXZhaWw7CiAgCQkJfQogIAkJCWJyZWFrOwogIAl9Cisg CisgCXJldHVybiBieXRlc3JlYWQ7CiAgfQogIAogIHN0YXRpYyBpbnQKKioqKioqKioqKioq KioqCioqKiA0ODAsNDg2ICoqKioKICAJCQljaCA9IHBxX2dldGJ5dGUoKTsKICAJCQlpZiAo Y2ggPT0gRU9GKQogIAkJCXsKISAJCQkJLyogT25seSBhIFwuIHRlcm1pbmF0b3IgaXMgbGVn YWwgRU9GIGluIG9sZCBwcm90b2NvbCAqLwogIAkJCQllcmVwb3J0KEVSUk9SLAogIAkJCQkJ CShlcnJjb2RlKEVSUkNPREVfQ09OTkVDVElPTl9GQUlMVVJFKSwKICAJCQkJCQkgZXJybXNn KCJ1bmV4cGVjdGVkIEVPRiBvbiBjbGllbnQgY29ubmVjdGlvbiIpKSk7Ci0tLSA1NzcsNTg1 IC0tLS0KICAJCQljaCA9IHBxX2dldGJ5dGUoKTsKICAJCQlpZiAoY2ggPT0gRU9GKQogIAkJ CXsKISAJCQkJLyoKISAJCQkJICogT25seSBhIFwuIHRlcm1pbmF0b3IgaXMgbGVnYWwgRU9G IGluIG9sZCBwcm90b2NvbAohIAkJCQkgKi8KICAJCQkJZXJlcG9ydChFUlJPUiwKICAJCQkJ CQkoZXJyY29kZShFUlJDT0RFX0NPTk5FQ1RJT05fRkFJTFVSRSksCiAgCQkJCQkJIGVycm1z ZygidW5leHBlY3RlZCBFT0Ygb24gY2xpZW50IGNvbm5lY3Rpb24iKSkpOwoqKioqKioqKioq KioqKioKKioqIDUyOSw1MzUgKioqKgogIAkJCWNoID0gcHFfcGVla2J5dGUoKTsKICAJCQlp ZiAoY2ggPT0gRU9GKQogIAkJCXsKISAJCQkJLyogT25seSBhIFwuIHRlcm1pbmF0b3IgaXMg bGVnYWwgRU9GIGluIG9sZCBwcm90b2NvbCAqLwogIAkJCQllcmVwb3J0KEVSUk9SLAogIAkJ CQkJCShlcnJjb2RlKEVSUkNPREVfQ09OTkVDVElPTl9GQUlMVVJFKSwKICAJCQkJCQkgZXJy bXNnKCJ1bmV4cGVjdGVkIEVPRiBvbiBjbGllbnQgY29ubmVjdGlvbiIpKSk7Ci0tLSA2Mjgs NjM2IC0tLS0KICAJCQljaCA9IHBxX3BlZWtieXRlKCk7CiAgCQkJaWYgKGNoID09IEVPRikK ICAJCQl7CiEgCQkJCS8qCiEgCQkJCSAqIE9ubHkgYSBcLiB0ZXJtaW5hdG9yIGlzIGxlZ2Fs IEVPRiBpbiBvbGQgcHJvdG9jb2wKISAJCQkJICovCiAgCQkJCWVyZXBvcnQoRVJST1IsCiAg CQkJCQkJKGVycmNvZGUoRVJSQ09ERV9DT05ORUNUSU9OX0ZBSUxVUkUpLAogIAkJCQkJCSBl cnJtc2coInVuZXhwZWN0ZWQgRU9GIG9uIGNsaWVudCBjb25uZWN0aW9uIikpKTsKKioqKioq KioqKioqKioqCioqKiA1NjUsNTc5ICoqKioKICAJCWNhc2UgQ09QWV9GSUxFOgogIAkJCWlm ICghcGlja3VwKQogIAkJCXsKISAJCQkJLyogV2UgZG9uJ3Qgd2FudCB0byBwaWNrIGl0IHVw IC0gc28gcHV0IGl0IGJhY2sgaW4gdGhlcmUgKi8KICAJCQkJdW5nZXRjKGMsIGNvcHlfZmls ZSk7CiAgCQkJfQohIAkJCS8qIElmIHdlIHdhbnRlZCB0byBwaWNrIGl0IHVwLCBpdCdzIGFs cmVhZHkgZG9uZSAqLwogIAkJCWJyZWFrOwogIAkJY2FzZSBDT1BZX09MRF9GRToKICAJCQlp ZiAocGlja3VwKQogIAkJCXsKISAJCQkJLyogV2Ugd2FudCB0byBwaWNrIGl0IHVwICovCiAg CQkJCSh2b2lkKSBwcV9nZXRieXRlKCk7CiAgCQkJfQogIAotLS0gNjY2LDY4NiAtLS0tCiAg CQljYXNlIENPUFlfRklMRToKICAJCQlpZiAoIXBpY2t1cCkKICAJCQl7CiEgCQkJCS8qCiEg CQkJCSAqIFdlIGRvbid0IHdhbnQgdG8gcGljayBpdCB1cCAtIHNvIHB1dCBpdCBiYWNrIGlu IHRoZXJlIAohIAkJCQkgKi8KICAJCQkJdW5nZXRjKGMsIGNvcHlfZmlsZSk7CiAgCQkJfQoh IAkJCS8qCiEgCQkJICogSWYgd2Ugd2FudGVkIHRvIHBpY2sgaXQgdXAsIGl0J3MgYWxyZWFk eSBkb25lIAohIAkJCSAqLwogIAkJCWJyZWFrOwogIAkJY2FzZSBDT1BZX09MRF9GRToKICAJ CQlpZiAocGlja3VwKQogIAkJCXsKISAJCQkJLyoKISAJCQkJICogV2Ugd2FudCB0byBwaWNr IGl0IHVwCiEgCQkJCSAqLwogIAkJCQkodm9pZCkgcHFfZ2V0Ynl0ZSgpOwogIAkJCX0KICAK KioqKioqKioqKioqKioqCioqKiA1ODUsNTk0ICoqKioKICAJCWNhc2UgQ09QWV9ORVdfRkU6 CiAgCQkJaWYgKCFwaWNrdXApCiAgCQkJewohIAkJCQkvKiBXZSBkb24ndCB3YW50IHRvIHBp Y2sgaXQgdXAgLSBzbyBwdXQgaXQgYmFjayBpbiB0aGVyZSAqLwogIAkJCQljb3B5X21zZ2J1 Zi0+Y3Vyc29yLS07CiAgCQkJfQohIAkJCS8qIElmIHdlIHdhbnRlZCB0byBwaWNrIGl0IHVw LCBpdCdzIGFscmVhZHkgZG9uZSAqLwogIAkJCWJyZWFrOwogIAl9CiAgfQotLS0gNjkyLDcw NSAtLS0tCiAgCQljYXNlIENPUFlfTkVXX0ZFOgogIAkJCWlmICghcGlja3VwKQogIAkJCXsK ISAJCQkJLyoKISAJCQkJICogV2UgZG9uJ3Qgd2FudCB0byBwaWNrIGl0IHVwIC0gc28gcHV0 IGl0IGJhY2sgaW4gdGhlcmUgCiEgCQkJCSAqLwogIAkJCQljb3B5X21zZ2J1Zi0+Y3Vyc29y LS07CiAgCQkJfQohIAkJCS8qCiEgCQkJICogSWYgd2Ugd2FudGVkIHRvIHBpY2sgaXQgdXAs IGl0J3MgYWxyZWFkeSBkb25lIAohIAkJCSAqLwogIAkJCWJyZWFrOwogIAl9CiAgfQoqKioq KioqKioqKioqKioKKioqIDY5NSw3MDEgKioqKgogIAlib29sCQliaW5hcnkgPSBmYWxzZTsK ICAJYm9vbAkJb2lkcyA9IGZhbHNlOwogIAlib29sCQljc3ZfbW9kZSA9IGZhbHNlOwohIAli b29sICAgICAgICBoZWFkZXJfbGluZSA9IGZhbHNlOwogIAljaGFyCSAgICpkZWxpbSA9IE5V TEw7CiAgCWNoYXIJICAgKnF1b3RlID0gTlVMTDsKICAJY2hhcgkgICAqZXNjYXBlID0gTlVM TDsKLS0tIDgwNiw4MTIgLS0tLQogIAlib29sCQliaW5hcnkgPSBmYWxzZTsKICAJYm9vbAkJ b2lkcyA9IGZhbHNlOwogIAlib29sCQljc3ZfbW9kZSA9IGZhbHNlOwohIAlib29sCQloZWFk ZXJfbGluZSA9IGZhbHNlOwogIAljaGFyCSAgICpkZWxpbSA9IE5VTEw7CiAgCWNoYXIJICAg KnF1b3RlID0gTlVMTDsKICAJY2hhcgkgICAqZXNjYXBlID0gTlVMTDsKKioqKioqKioqKioq KioqCioqKiA3MDgsNzE0ICoqKioKICAJQWNsTW9kZQkJcmVxdWlyZWRfYWNjZXNzID0gKGlz X2Zyb20gPyBBQ0xfSU5TRVJUIDogQUNMX1NFTEVDVCk7CiAgCUFjbFJlc3VsdAlhY2xyZXN1 bHQ7CiAgCiEgCS8qIEV4dHJhY3Qgb3B0aW9ucyBmcm9tIHRoZSBzdGF0ZW1lbnQgbm9kZSB0 cmVlICovCiAgCWZvcmVhY2gob3B0aW9uLCBzdG10LT5vcHRpb25zKQogIAl7CiAgCQlEZWZF bGVtICAgICpkZWZlbCA9IChEZWZFbGVtICopIGxmaXJzdChvcHRpb24pOwotLS0gODE5LDgy NyAtLS0tCiAgCUFjbE1vZGUJCXJlcXVpcmVkX2FjY2VzcyA9IChpc19mcm9tID8gQUNMX0lO U0VSVCA6IEFDTF9TRUxFQ1QpOwogIAlBY2xSZXN1bHQJYWNscmVzdWx0OwogIAohIAkvKgoh IAkgKiBFeHRyYWN0IG9wdGlvbnMgZnJvbSB0aGUgc3RhdGVtZW50IG5vZGUgdHJlZQohIAkg Ki8KICAJZm9yZWFjaChvcHRpb24sIHN0bXQtPm9wdGlvbnMpCiAgCXsKICAJCURlZkVsZW0g ICAgKmRlZmVsID0gKERlZkVsZW0gKikgbGZpcnN0KG9wdGlvbik7CioqKioqKioqKioqKioq KgoqKiogNzk0LDgwMSAqKioqCiAgCQkJZm9yY2Vfbm90bnVsbCA9IChMaXN0ICopIGRlZmVs LT5hcmc7CiAgCQl9CiAgCQllbHNlCiEgCQkJZWxvZyhFUlJPUiwgIm9wdGlvbiBcIiVzXCIg bm90IHJlY29nbml6ZWQiLAohIAkJCQkgZGVmZWwtPmRlZm5hbWUpOwogIAl9CiAgCiAgCWlm IChiaW5hcnkgJiYgZGVsaW0pCi0tLSA5MDcsOTEzIC0tLS0KICAJCQlmb3JjZV9ub3RudWxs ID0gKExpc3QgKikgZGVmZWwtPmFyZzsKICAJCX0KICAJCWVsc2UKISAJCQllbG9nKEVSUk9S LCAib3B0aW9uIFwiJXNcIiBub3QgcmVjb2duaXplZCIsIGRlZmVsLT5kZWZuYW1lKTsKICAJ fQogIAogIAlpZiAoYmluYXJ5ICYmIGRlbGltKQoqKioqKioqKioqKioqKioKKioqIDgxMyw4 MTkgKioqKgogIAkJCQkoZXJyY29kZShFUlJDT0RFX1NZTlRBWF9FUlJPUiksCiAgCQkJCSBl cnJtc2coImNhbm5vdCBzcGVjaWZ5IE5VTEwgaW4gQklOQVJZIG1vZGUiKSkpOwogIAohIAkv KiBTZXQgZGVmYXVsdHMgKi8KICAJaWYgKCFkZWxpbSkKICAJCWRlbGltID0gY3N2X21vZGUg PyAiLCIgOiAiXHQiOwogIAotLS0gOTI1LDkzMyAtLS0tCiAgCQkJCShlcnJjb2RlKEVSUkNP REVfU1lOVEFYX0VSUk9SKSwKICAJCQkJIGVycm1zZygiY2Fubm90IHNwZWNpZnkgTlVMTCBp biBCSU5BUlkgbW9kZSIpKSk7CiAgCiEgCS8qCiEgCSAqIFNldCBkZWZhdWx0cwohIAkgKi8K ICAJaWYgKCFkZWxpbSkKICAJCWRlbGltID0gY3N2X21vZGUgPyAiLCIgOiAiXHQiOwogIAoq KioqKioqKioqKioqKioKKioqIDgyOCw4NDYgKioqKgogIAkJCWVzY2FwZSA9IHF1b3RlOwog IAl9CiAgCiEgCS8qIE9ubHkgc2luZ2xlLWNoYXJhY3RlciBkZWxpbWl0ZXIgc3RyaW5ncyBh cmUgc3VwcG9ydGVkLiAqLwogIAlpZiAoc3RybGVuKGRlbGltKSAhPSAxKQogIAkJZXJlcG9y dChFUlJPUiwKICAJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQp LAogIAkJCQkgZXJybXNnKCJDT1BZIGRlbGltaXRlciBtdXN0IGJlIGEgc2luZ2xlIGNoYXJh Y3RlciIpKSk7CiAgCiEgICAJLyogQ2hlY2sgaGVhZGVyICovCiAgCWlmICghY3N2X21vZGUg JiYgaGVhZGVyX2xpbmUpCiAgCQllcmVwb3J0KEVSUk9SLAogIAkJCQkoZXJyY29kZShFUlJD T0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCiAgCQkJCSBlcnJtc2coIkNPUFkgSEVBREVS IGF2YWlsYWJsZSBvbmx5IGluIENTViBtb2RlIikpKTsKICAKISAJLyogQ2hlY2sgcXVvdGUg Ki8KICAJaWYgKCFjc3ZfbW9kZSAmJiBxdW90ZSAhPSBOVUxMKQogIAkJZXJlcG9ydChFUlJP UiwKICAJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAotLS0g OTQyLDk2OCAtLS0tCiAgCQkJZXNjYXBlID0gcXVvdGU7CiAgCX0KICAKISAJZXNjYXBlYyA9 ICdcXCc7CQkJCS8qIHdpbGwgYmUgY29uZmlndXJhYmxlIGluIHRoZSBmdXR1cmUgKi8KISAK ISAJLyoKISAJICogT25seSBzaW5nbGUtY2hhcmFjdGVyIGRlbGltaXRlciBzdHJpbmdzIGFy ZSBzdXBwb3J0ZWQuCiEgCSAqLwogIAlpZiAoc3RybGVuKGRlbGltKSAhPSAxKQogIAkJZXJl cG9ydChFUlJPUiwKICAJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JU RUQpLAogIAkJCQkgZXJybXNnKCJDT1BZIGRlbGltaXRlciBtdXN0IGJlIGEgc2luZ2xlIGNo YXJhY3RlciIpKSk7CiAgCiEgCS8qCiEgCSAqIENoZWNrIGhlYWRlcgohIAkgKi8KICAJaWYg KCFjc3ZfbW9kZSAmJiBoZWFkZXJfbGluZSkKICAJCWVyZXBvcnQoRVJST1IsCiAgCQkJCShl cnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKICAJCQkJIGVycm1zZygi Q09QWSBIRUFERVIgYXZhaWxhYmxlIG9ubHkgaW4gQ1NWIG1vZGUiKSkpOwogIAohIAkvKgoh IAkgKiBDaGVjayBxdW90ZQohIAkgKi8KICAJaWYgKCFjc3ZfbW9kZSAmJiBxdW90ZSAhPSBO VUxMKQogIAkJZXJlcG9ydChFUlJPUiwKICAJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJF X05PVF9TVVBQT1JURUQpLAoqKioqKioqKioqKioqKioKKioqIDg1MSw4NTcgKioqKgogIAkJ CQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCiAgCQkJCSBlcnJt c2coIkNPUFkgcXVvdGUgbXVzdCBiZSBhIHNpbmdsZSBjaGFyYWN0ZXIiKSkpOwogIAohIAkv KiBDaGVjayBlc2NhcGUgKi8KICAJaWYgKCFjc3ZfbW9kZSAmJiBlc2NhcGUgIT0gTlVMTCkK ICAJCWVyZXBvcnQoRVJST1IsCiAgCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1Rf U1VQUE9SVEVEKSwKLS0tIDk3Myw5ODEgLS0tLQogIAkJCQkoZXJyY29kZShFUlJDT0RFX0ZF QVRVUkVfTk9UX1NVUFBPUlRFRCksCiAgCQkJCSBlcnJtc2coIkNPUFkgcXVvdGUgbXVzdCBi ZSBhIHNpbmdsZSBjaGFyYWN0ZXIiKSkpOwogIAohIAkvKgohIAkgKiBDaGVjayBlc2NhcGUK ISAJICovCiAgCWlmICghY3N2X21vZGUgJiYgZXNjYXBlICE9IE5VTEwpCiAgCQllcmVwb3J0 KEVSUk9SLAogIAkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCks CioqKioqKioqKioqKioqKgoqKiogODYyLDg2OCAqKioqCiAgCQkJCShlcnJjb2RlKEVSUkNP REVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKICAJCQkJIGVycm1zZygiQ09QWSBlc2NhcGUg bXVzdCBiZSBhIHNpbmdsZSBjaGFyYWN0ZXIiKSkpOwogIAohIAkvKiBDaGVjayBmb3JjZV9x dW90ZSAqLwogIAlpZiAoIWNzdl9tb2RlICYmIGZvcmNlX3F1b3RlICE9IE5JTCkKICAJCWVy ZXBvcnQoRVJST1IsCiAgCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9S VEVEKSwKLS0tIDk4Niw5OTQgLS0tLQogIAkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVf Tk9UX1NVUFBPUlRFRCksCiAgCQkJCSBlcnJtc2coIkNPUFkgZXNjYXBlIG11c3QgYmUgYSBz aW5nbGUgY2hhcmFjdGVyIikpKTsKICAKISAJLyoKISAJICogQ2hlY2sgZm9yY2VfcXVvdGUK ISAJICovCiAgCWlmICghY3N2X21vZGUgJiYgZm9yY2VfcXVvdGUgIT0gTklMKQogIAkJZXJl cG9ydChFUlJPUiwKICAJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JU RUQpLAoqKioqKioqKioqKioqKioKKioqIDg3MCw5MDkgKioqKgogIAlpZiAoZm9yY2VfcXVv dGUgIT0gTklMICYmIGlzX2Zyb20pCiAgCQllcmVwb3J0KEVSUk9SLAogIAkJCQkoZXJyY29k ZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCiEgCQkJICAgZXJybXNnKCJDT1BZ IGZvcmNlIHF1b3RlIG9ubHkgYXZhaWxhYmxlIHVzaW5nIENPUFkgVE8iKSkpOwogIAohIAkv KiBDaGVjayBmb3JjZV9ub3RudWxsICovCiAgCWlmICghY3N2X21vZGUgJiYgZm9yY2Vfbm90 bnVsbCAhPSBOSUwpCiAgCQllcmVwb3J0KEVSUk9SLAogIAkJCQkoZXJyY29kZShFUlJDT0RF X0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCiEgCQkJICBlcnJtc2coIkNPUFkgZm9yY2Ugbm90 IG51bGwgYXZhaWxhYmxlIG9ubHkgaW4gQ1NWIG1vZGUiKSkpOwogIAlpZiAoZm9yY2Vfbm90 bnVsbCAhPSBOSUwgJiYgIWlzX2Zyb20pCiAgCQllcmVwb3J0KEVSUk9SLAogIAkJCQkoZXJy Y29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCiEgCQkgIGVycm1zZygiQ09Q WSBmb3JjZSBub3QgbnVsbCBvbmx5IGF2YWlsYWJsZSB1c2luZyBDT1BZIEZST00iKSkpOwog IAohIAkvKiBEb24ndCBhbGxvdyB0aGUgZGVsaW1pdGVyIHRvIGFwcGVhciBpbiB0aGUgbnVs bCBzdHJpbmcuICovCiAgCWlmIChzdHJjaHIobnVsbF9wcmludCwgZGVsaW1bMF0pICE9IE5V TEwpCiAgCQllcmVwb3J0KEVSUk9SLAogIAkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVf Tk9UX1NVUFBPUlRFRCksCiEgCQkJCSBlcnJtc2coIkNPUFkgZGVsaW1pdGVyIG11c3Qgbm90 IGFwcGVhciBpbiB0aGUgTlVMTCBzcGVjaWZpY2F0aW9uIikpKTsKICAKISAJLyogRG9uJ3Qg YWxsb3cgdGhlIGNzdiBxdW90ZSBjaGFyIHRvIGFwcGVhciBpbiB0aGUgbnVsbCBzdHJpbmcu ICovCiAgCWlmIChjc3ZfbW9kZSAmJiBzdHJjaHIobnVsbF9wcmludCwgcXVvdGVbMF0pICE9 IE5VTEwpCiAgCQllcmVwb3J0KEVSUk9SLAogIAkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRV UkVfTk9UX1NVUFBPUlRFRCksCiEgCQkJCSBlcnJtc2coIkNTViBxdW90ZSBjaGFyYWN0ZXIg bXVzdCBub3QgYXBwZWFyIGluIHRoZSBOVUxMIHNwZWNpZmljYXRpb24iKSkpOwogIAohIAkv KiBPcGVuIGFuZCBsb2NrIHRoZSByZWxhdGlvbiwgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIGxv Y2sgdHlwZS4gKi8KISAJcmVsID0gaGVhcF9vcGVucnYocmVsYXRpb24sIChpc19mcm9tID8g Um93RXhjbHVzaXZlTG9jayA6IEFjY2Vzc1NoYXJlTG9jaykpOwogIAohIAkvKiBjaGVjayBy ZWFkLW9ubHkgdHJhbnNhY3Rpb24gKi8KISAJaWYgKFhhY3RSZWFkT25seSAmJiAhaXNfZnJv bSAmJiAhaXNUZW1wTmFtZXNwYWNlKFJlbGF0aW9uR2V0TmFtZXNwYWNlKHJlbCkpKQogIAkJ ZXJlcG9ydChFUlJPUiwKICAJCQkJKGVycmNvZGUoRVJSQ09ERV9SRUFEX09OTFlfU1FMX1RS QU5TQUNUSU9OKSwKICAJCQkJIGVycm1zZygidHJhbnNhY3Rpb24gaXMgcmVhZC1vbmx5Iikp KTsKICAKISAJLyogQ2hlY2sgcGVybWlzc2lvbnMuICovCiAgCWFjbHJlc3VsdCA9IHBnX2Ns YXNzX2FjbGNoZWNrKFJlbGF0aW9uR2V0UmVsaWQocmVsKSwgR2V0VXNlcklkKCksCiAgCQkJ CQkJCQkgIHJlcXVpcmVkX2FjY2Vzcyk7CiAgCWlmIChhY2xyZXN1bHQgIT0gQUNMQ0hFQ0tf T0spCi0tLSA5OTYsMTA1MiAtLS0tCiAgCWlmIChmb3JjZV9xdW90ZSAhPSBOSUwgJiYgaXNf ZnJvbSkKICAJCWVyZXBvcnQoRVJST1IsCiAgCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVS RV9OT1RfU1VQUE9SVEVEKSwKISAJCQkJIGVycm1zZygiQ09QWSBmb3JjZSBxdW90ZSBvbmx5 IGF2YWlsYWJsZSB1c2luZyBDT1BZIFRPIikpKTsKICAKISAJLyoKISAJICogQ2hlY2sgZm9y Y2Vfbm90bnVsbAohIAkgKi8KICAJaWYgKCFjc3ZfbW9kZSAmJiBmb3JjZV9ub3RudWxsICE9 IE5JTCkKICAJCWVyZXBvcnQoRVJST1IsCiAgCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVS RV9OT1RfU1VQUE9SVEVEKSwKISAJCQkJIGVycm1zZygiQ09QWSBmb3JjZSBub3QgbnVsbCBh dmFpbGFibGUgb25seSBpbiBDU1YgbW9kZSIpKSk7CiAgCWlmIChmb3JjZV9ub3RudWxsICE9 IE5JTCAmJiAhaXNfZnJvbSkKICAJCWVyZXBvcnQoRVJST1IsCiAgCQkJCShlcnJjb2RlKEVS UkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKISAJCQkJIGVycm1zZwohIAkJCQkgKCJD T1BZIGZvcmNlIG5vdCBudWxsIG9ubHkgYXZhaWxhYmxlIHVzaW5nIENPUFkgRlJPTSIpKSk7 CiAgCiEgCS8qCiEgCSAqIERvbid0IGFsbG93IHRoZSBkZWxpbWl0ZXIgdG8gYXBwZWFyIGlu IHRoZSBudWxsIHN0cmluZy4gCiEgCSAqLwogIAlpZiAoc3RyY2hyKG51bGxfcHJpbnQsIGRl bGltWzBdKSAhPSBOVUxMKQogIAkJZXJlcG9ydChFUlJPUiwKICAJCQkJKGVycmNvZGUoRVJS Q09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAohIAkJCQkgZXJybXNnCiEgCQkJCSAoIkNP UFkgZGVsaW1pdGVyIG11c3Qgbm90IGFwcGVhciBpbiB0aGUgTlVMTCBzcGVjaWZpY2F0aW9u IikpKTsKICAKISAJLyoKISAJICogRG9uJ3QgYWxsb3cgdGhlIGNzdiBxdW90ZSBjaGFyIHRv IGFwcGVhciBpbiB0aGUgbnVsbCBzdHJpbmcuIAohIAkgKi8KICAJaWYgKGNzdl9tb2RlICYm IHN0cmNocihudWxsX3ByaW50LCBxdW90ZVswXSkgIT0gTlVMTCkKICAJCWVyZXBvcnQoRVJS T1IsCiAgCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKISAJ CQkJIGVycm1zZwohIAkJCQkgKCJDU1YgcXVvdGUgY2hhcmFjdGVyIG11c3Qgbm90IGFwcGVh ciBpbiB0aGUgTlVMTCBzcGVjaWZpY2F0aW9uIikpKTsKICAKISAJLyoKISAJICogT3BlbiBh bmQgbG9jayB0aGUgcmVsYXRpb24sIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSBsb2NrIHR5cGUu CiEgCSAqLwohIAlyZWwgPQohIAkJaGVhcF9vcGVucnYocmVsYXRpb24sIChpc19mcm9tID8g Um93RXhjbHVzaXZlTG9jayA6IEFjY2Vzc1NoYXJlTG9jaykpOwogIAohIAkvKgohIAkgKiBj aGVjayByZWFkLW9ubHkgdHJhbnNhY3Rpb24KISAJICovCiEgCWlmIChYYWN0UmVhZE9ubHkg JiYgIWlzX2Zyb20KISAJCSYmICFpc1RlbXBOYW1lc3BhY2UoUmVsYXRpb25HZXROYW1lc3Bh Y2UocmVsKSkpCiAgCQllcmVwb3J0KEVSUk9SLAogIAkJCQkoZXJyY29kZShFUlJDT0RFX1JF QURfT05MWV9TUUxfVFJBTlNBQ1RJT04pLAogIAkJCQkgZXJybXNnKCJ0cmFuc2FjdGlvbiBp cyByZWFkLW9ubHkiKSkpOwogIAohIAkvKgohIAkgKiBDaGVjayBwZXJtaXNzaW9ucy4KISAJ ICovCiAgCWFjbHJlc3VsdCA9IHBnX2NsYXNzX2FjbGNoZWNrKFJlbGF0aW9uR2V0UmVsaWQo cmVsKSwgR2V0VXNlcklkKCksCiAgCQkJCQkJCQkgIHJlcXVpcmVkX2FjY2Vzcyk7CiAgCWlm IChhY2xyZXN1bHQgIT0gQUNMQ0hFQ0tfT0spCioqKioqKioqKioqKioqKgoqKiogOTE0LDkz MiAqKioqCiAgCQkJCShlcnJjb2RlKEVSUkNPREVfSU5TVUZGSUNJRU5UX1BSSVZJTEVHRSks CiAgCQkJCSBlcnJtc2coIm11c3QgYmUgc3VwZXJ1c2VyIHRvIENPUFkgdG8gb3IgZnJvbSBh IGZpbGUiKSwKICAJCQkJIGVycmhpbnQoIkFueW9uZSBjYW4gQ09QWSB0byBzdGRvdXQgb3Ig ZnJvbSBzdGRpbi4gIgohIAkJCQkJICAgInBzcWwncyBcXGNvcHkgY29tbWFuZCBhbHNvIHdv cmtzIGZvciBhbnlvbmUuIikpKTsKICAKISAJLyogRG9uJ3QgYWxsb3cgQ09QWSB3LyBPSURz IHRvIG9yIGZyb20gYSB0YWJsZSB3aXRob3V0IHRoZW0gKi8KICAJaWYgKG9pZHMgJiYgIXJl bC0+cmRfcmVsLT5yZWxoYXNvaWRzKQogIAkJZXJlcG9ydChFUlJPUiwKICAJCQkJKGVycmNv ZGUoRVJSQ09ERV9VTkRFRklORURfQ09MVU1OKSwKICAJCQkJIGVycm1zZygidGFibGUgXCIl c1wiIGRvZXMgbm90IGhhdmUgT0lEcyIsCiAgCQkJCQkJUmVsYXRpb25HZXRSZWxhdGlvbk5h bWUocmVsKSkpKTsKICAKISAJLyogR2VuZXJhdGUgb3IgY29udmVydCBsaXN0IG9mIGF0dHJp YnV0ZXMgdG8gcHJvY2VzcyAqLwogIAlhdHRudW1saXN0ID0gQ29weUdldEF0dG51bXMocmVs LCBhdHRuYW1lbGlzdCk7CiAgCiEgCS8qIENoZWNrIHRoYXQgRk9SQ0UgUVVPVEUgcmVmZXJl bmNlcyB2YWxpZCBDT1BZIGNvbHVtbnMgKi8KICAJaWYgKGZvcmNlX3F1b3RlKQogIAl7CiAg CQlUdXBsZURlc2MJdHVwRGVzYyA9IFJlbGF0aW9uR2V0RGVzY3IocmVsKTsKLS0tIDEwNTcs MTA4MSAtLS0tCiAgCQkJCShlcnJjb2RlKEVSUkNPREVfSU5TVUZGSUNJRU5UX1BSSVZJTEVH RSksCiAgCQkJCSBlcnJtc2coIm11c3QgYmUgc3VwZXJ1c2VyIHRvIENPUFkgdG8gb3IgZnJv bSBhIGZpbGUiKSwKICAJCQkJIGVycmhpbnQoIkFueW9uZSBjYW4gQ09QWSB0byBzdGRvdXQg b3IgZnJvbSBzdGRpbi4gIgohIAkJCQkJCSAicHNxbCdzIFxcY29weSBjb21tYW5kIGFsc28g d29ya3MgZm9yIGFueW9uZS4iKSkpOwogIAohIAkvKgohIAkgKiBEb24ndCBhbGxvdyBDT1BZ IHcvIE9JRHMgdG8gb3IgZnJvbSBhIHRhYmxlIHdpdGhvdXQgdGhlbSAKISAJICovCiAgCWlm IChvaWRzICYmICFyZWwtPnJkX3JlbC0+cmVsaGFzb2lkcykKICAJCWVyZXBvcnQoRVJST1Is CiAgCQkJCShlcnJjb2RlKEVSUkNPREVfVU5ERUZJTkVEX0NPTFVNTiksCiAgCQkJCSBlcnJt c2coInRhYmxlIFwiJXNcIiBkb2VzIG5vdCBoYXZlIE9JRHMiLAogIAkJCQkJCVJlbGF0aW9u R2V0UmVsYXRpb25OYW1lKHJlbCkpKSk7CiAgCiEgCS8qCiEgCSAqIEdlbmVyYXRlIG9yIGNv bnZlcnQgbGlzdCBvZiBhdHRyaWJ1dGVzIHRvIHByb2Nlc3MKISAJICovCiAgCWF0dG51bWxp c3QgPSBDb3B5R2V0QXR0bnVtcyhyZWwsIGF0dG5hbWVsaXN0KTsKICAKISAJLyoKISAJICog Q2hlY2sgdGhhdCBGT1JDRSBRVU9URSByZWZlcmVuY2VzIHZhbGlkIENPUFkgY29sdW1ucwoh IAkgKi8KICAJaWYgKGZvcmNlX3F1b3RlKQogIAl7CiAgCQlUdXBsZURlc2MJdHVwRGVzYyA9 IFJlbGF0aW9uR2V0RGVzY3IocmVsKTsKKioqKioqKioqKioqKioqCioqKiA5NDIsOTUzICoq KioKICAJCQlpZiAoIWxpc3RfbWVtYmVyX2ludChhdHRudW1saXN0LCBhdHRudW0pKQogIAkJ CQllcmVwb3J0KEVSUk9SLAogIAkJCQkJCShlcnJjb2RlKEVSUkNPREVfSU5WQUxJRF9DT0xV TU5fUkVGRVJFTkNFKSwKISAJCQkJZXJybXNnKCJGT1JDRSBRVU9URSBjb2x1bW4gXCIlc1wi IG5vdCByZWZlcmVuY2VkIGJ5IENPUFkiLAohIAkJCQkJICAgTmFtZVN0cihhdHRyW2F0dG51 bSAtIDFdLT5hdHRuYW1lKSkpKTsKICAJCX0KICAJfQogIAohIAkvKiBDaGVjayB0aGF0IEZP UkNFIE5PVCBOVUxMIHJlZmVyZW5jZXMgdmFsaWQgQ09QWSBjb2x1bW5zICovCiAgCWlmIChm b3JjZV9ub3RudWxsKQogIAl7CiAgCQlMaXN0Q2VsbCAgICpjdXI7Ci0tLSAxMDkxLDExMDUg LS0tLQogIAkJCWlmICghbGlzdF9tZW1iZXJfaW50KGF0dG51bWxpc3QsIGF0dG51bSkpCiAg CQkJCWVyZXBvcnQoRVJST1IsCiAgCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9JTlZBTElEX0NP TFVNTl9SRUZFUkVOQ0UpLAohIAkJCQkJCSBlcnJtc2cKISAJCQkJCQkgKCJGT1JDRSBRVU9U RSBjb2x1bW4gXCIlc1wiIG5vdCByZWZlcmVuY2VkIGJ5IENPUFkiLAohIAkJCQkJCSAgTmFt ZVN0cihhdHRyW2F0dG51bSAtIDFdLT5hdHRuYW1lKSkpKTsKICAJCX0KICAJfQogIAohIAkv KgohIAkgKiBDaGVjayB0aGF0IEZPUkNFIE5PVCBOVUxMIHJlZmVyZW5jZXMgdmFsaWQgQ09Q WSBjb2x1bW5zCiEgCSAqLwogIAlpZiAoZm9yY2Vfbm90bnVsbCkKICAJewogIAkJTGlzdENl bGwgICAqY3VyOwoqKioqKioqKioqKioqKioKKioqIDk2Myw5ODEgKioqKgogIAkJCWlmICgh bGlzdF9tZW1iZXJfaW50KGF0dG51bWxpc3QsIGF0dG51bSkpCiAgCQkJCWVyZXBvcnQoRVJS T1IsCiAgCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9JTlZBTElEX0NPTFVNTl9SRUZFUkVOQ0Up LAohIAkJCQkJCSBlcnJtc2coIkZPUkNFIE5PVCBOVUxMIGNvbHVtbiBcIiVzXCIgbm90IHJl ZmVyZW5jZWQgYnkgQ09QWSIsCiEgCQkJCQkJCQlOYW1lU3RyKGF0dHJbYXR0bnVtIC0gMV0t PmF0dG5hbWUpKSkpOwogIAkJfQogIAl9CiAgCiEgCS8qIFNldCB1cCB2YXJpYWJsZXMgdG8g YXZvaWQgcGVyLWF0dHJpYnV0ZSBvdmVyaGVhZC4gKi8KISAJaW5pdFN0cmluZ0luZm8oJmF0 dHJpYnV0ZV9idWYpOwogIAlpbml0U3RyaW5nSW5mbygmbGluZV9idWYpOwogIAlsaW5lX2J1 Zl9jb252ZXJ0ZWQgPSBmYWxzZTsKICAKICAJY2xpZW50X2VuY29kaW5nID0gcGdfZ2V0X2Ns aWVudF9lbmNvZGluZygpOwogIAlzZXJ2ZXJfZW5jb2RpbmcgPSBHZXREYXRhYmFzZUVuY29k aW5nKCk7CiAgCiAgCWNvcHlfZGVzdCA9IENPUFlfRklMRTsJCS8qIGRlZmF1bHQgKi8KICAJ Y29weV9maWxlID0gTlVMTDsKICAJY29weV9tc2didWYgPSBOVUxMOwotLS0gMTExNSwxMTU0 IC0tLS0KICAJCQlpZiAoIWxpc3RfbWVtYmVyX2ludChhdHRudW1saXN0LCBhdHRudW0pKQog IAkJCQllcmVwb3J0KEVSUk9SLAogIAkJCQkJCShlcnJjb2RlKEVSUkNPREVfSU5WQUxJRF9D T0xVTU5fUkVGRVJFTkNFKSwKISAJCQkJCQkgZXJybXNnCiEgCQkJCQkJICgiRk9SQ0UgTk9U IE5VTEwgY29sdW1uIFwiJXNcIiBub3QgcmVmZXJlbmNlZCBieSBDT1BZIiwKISAJCQkJCQkg IE5hbWVTdHIoYXR0clthdHRudW0gLSAxXS0+YXR0bmFtZSkpKSk7CiAgCQl9CiAgCX0KICAK ISAJLyoKISAJICogU2V0IHVwIHZhcmlhYmxlcyB0byBhdm9pZCBwZXItYXR0cmlidXRlIG92 ZXJoZWFkLgohIAkgKi8KISAJaW5pdFN0cmluZ0luZm8oJmF0dHJfYnVmKTsKICAJaW5pdFN0 cmluZ0luZm8oJmxpbmVfYnVmKTsKICAJbGluZV9idWZfY29udmVydGVkID0gZmFsc2U7CiAg CiAgCWNsaWVudF9lbmNvZGluZyA9IHBnX2dldF9jbGllbnRfZW5jb2RpbmcoKTsKICAJc2Vy dmVyX2VuY29kaW5nID0gR2V0RGF0YWJhc2VFbmNvZGluZygpOwogIAorIAkvKgorIAkgKiBj aGVjayBpZiB0aGUgY2xpZW50IGVuY29kaW5nIGlzIG9uZSBvZiB0aGUgNSBlbmNvZGluZ3MK KyAJICogdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBhcyBhIHNlcnZlciBlbmNvZGluZ3MuCisg CSAqLworIAlzd2l0Y2ggKGNsaWVudF9lbmNvZGluZykKKyAJeworIAkJY2FzZSBQR19TSklT OgorIAkJY2FzZSBQR19CSUc1OgorIAkJY2FzZSBQR19HQks6CisgCQljYXNlIFBHX1VIQzoK KyAJCWNhc2UgUEdfR0IxODAzMDoKKyAJCQljbGllbnRfZW5jb2Rpbmdfb25seSA9IHRydWU7 CisgCQkJYnJlYWs7CisgCQlkZWZhdWx0OgorIAkJCWNsaWVudF9lbmNvZGluZ19vbmx5ID0g ZmFsc2U7CisgCX0KKyAKKyAKICAJY29weV9kZXN0ID0gQ09QWV9GSUxFOwkJLyogZGVmYXVs dCAqLwogIAljb3B5X2ZpbGUgPSBOVUxMOwogIAljb3B5X21zZ2J1ZiA9IE5VTEw7CioqKioq KioqKioqKioqKgoqKiogOTk4LDEwMDUgKioqKgogIAkJCWVsc2UKICAJCQkJZXJlcG9ydChF UlJPUiwKICAJCQkJCQkoZXJyY29kZShFUlJDT0RFX1dST05HX09CSkVDVF9UWVBFKSwKISAJ CQkJCSAgIGVycm1zZygiY2Fubm90IGNvcHkgdG8gbm9uLXRhYmxlIHJlbGF0aW9uIFwiJXNc IiIsCiEgCQkJCQkJCSAgUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUocmVsKSkpKTsKICAJCX0K ICAJCWlmIChwaXBlKQogIAkJewotLS0gMTE3MSwxMTc4IC0tLS0KICAJCQllbHNlCiAgCQkJ CWVyZXBvcnQoRVJST1IsCiAgCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9XUk9OR19PQkpFQ1Rf VFlQRSksCiEgCQkJCQkJIGVycm1zZygiY2Fubm90IGNvcHkgdG8gbm9uLXRhYmxlIHJlbGF0 aW9uIFwiJXNcIiIsCiEgCQkJCQkJCQlSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShyZWwpKSkp OwogIAkJfQogIAkJaWYgKHBpcGUpCiAgCQl7CioqKioqKioqKioqKioqKgoqKiogMTAxNywx MDI0ICoqKioKICAJCQlpZiAoY29weV9maWxlID09IE5VTEwpCiAgCQkJCWVyZXBvcnQoRVJS T1IsCiAgCQkJCQkJKGVycmNvZGVfZm9yX2ZpbGVfYWNjZXNzKCksCiEgCQkJCQkgZXJybXNn KCJjb3VsZCBub3Qgb3BlbiBmaWxlIFwiJXNcIiBmb3IgcmVhZGluZzogJW0iLAohIAkJCQkJ CQlmaWxlbmFtZSkpKTsKICAKICAJCQlmc3RhdChmaWxlbm8oY29weV9maWxlKSwgJnN0KTsK ICAJCQlpZiAoU19JU0RJUihzdC5zdF9tb2RlKSkKLS0tIDExOTAsMTE5NyAtLS0tCiAgCQkJ aWYgKGNvcHlfZmlsZSA9PSBOVUxMKQogIAkJCQllcmVwb3J0KEVSUk9SLAogIAkJCQkJCShl cnJjb2RlX2Zvcl9maWxlX2FjY2VzcygpLAohIAkJCQkJCSBlcnJtc2coImNvdWxkIG5vdCBv cGVuIGZpbGUgXCIlc1wiIGZvciByZWFkaW5nOiAlbSIsCiEgCQkJCQkJCQlmaWxlbmFtZSkp KTsKICAKICAJCQlmc3RhdChmaWxlbm8oY29weV9maWxlKSwgJnN0KTsKICAJCQlpZiAoU19J U0RJUihzdC5zdF9tb2RlKSkKKioqKioqKioqKioqKioqCioqKiAxMDI5LDEwMzYgKioqKgog IAkJCQkJCSBlcnJtc2coIlwiJXNcIiBpcyBhIGRpcmVjdG9yeSIsIGZpbGVuYW1lKSkpOwog IAkJCX0KICAJCX0KISAJCUNvcHlGcm9tKHJlbCwgYXR0bnVtbGlzdCwgYmluYXJ5LCBvaWRz LCBkZWxpbSwgbnVsbF9wcmludCwgY3N2X21vZGUsCiEgCQkJCSBxdW90ZSwgZXNjYXBlLCBm b3JjZV9ub3RudWxsX2F0dHMsIGhlYWRlcl9saW5lKTsKICAJfQogIAllbHNlCiAgCXsJCQkJ CQkJLyogY29weSBmcm9tIGRhdGFiYXNlIHRvIGZpbGUgKi8KLS0tIDEyMDIsMTIxOCAtLS0t CiAgCQkJCQkJIGVycm1zZygiXCIlc1wiIGlzIGEgZGlyZWN0b3J5IiwgZmlsZW5hbWUpKSk7 CiAgCQkJfQogIAkJfQohIAohIAkJaWYgKGNzdl9tb2RlIHx8IGJpbmFyeSkgLyogb2xkIHBh dGggKi8KISAJCQlDb3B5RnJvbShyZWwsIGF0dG51bWxpc3QsIGJpbmFyeSwgb2lkcywgZGVs aW0sIG51bGxfcHJpbnQsCiEgCQkJCQkgY3N2X21vZGUsIHF1b3RlLCBlc2NhcGUsIGZvcmNl X25vdG51bGxfYXR0cywgaGVhZGVyX2xpbmUpOwohIAkJLyoKISAJCSAqIG5ldyBwYXRoIGZv ciBpbXByb3ZlZCBwZXJmb3JtYW5jZSAob25seSBmb3IgZGVsaW1pdGVkIGZvcm1hdCBmb3Ig bm93KQohIAkJICovCiEgCQllbHNlCiEgCQkJQ29weUZyb21EZWxpbWl0ZWQocmVsLCBhdHRu dW1saXN0LCBiaW5hcnksIG9pZHMsIGRlbGltLCBudWxsX3ByaW50LAohIAkJCQkJCQkgIGNz dl9tb2RlLCBxdW90ZSwgZXNjYXBlLCBmb3JjZV9ub3RudWxsX2F0dHMpOwohIAogIAl9CiAg CWVsc2UKICAJewkJCQkJCQkvKiBjb3B5IGZyb20gZGF0YWJhc2UgdG8gZmlsZSAqLwoqKioq KioqKioqKioqKioKKioqIDEwNDksMTA1NiAqKioqCiAgCQkJZWxzZQogIAkJCQllcmVwb3J0 KEVSUk9SLAogIAkJCQkJCShlcnJjb2RlKEVSUkNPREVfV1JPTkdfT0JKRUNUX1RZUEUpLAoh IAkJCQkJIGVycm1zZygiY2Fubm90IGNvcHkgZnJvbSBub24tdGFibGUgcmVsYXRpb24gXCIl c1wiIiwKISAJCQkJCQkJUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUocmVsKSkpKTsKICAJCX0K ICAJCWlmIChwaXBlKQogIAkJewotLS0gMTIzMSwxMjM4IC0tLS0KICAJCQllbHNlCiAgCQkJ CWVyZXBvcnQoRVJST1IsCiAgCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9XUk9OR19PQkpFQ1Rf VFlQRSksCiEgCQkJCQkJIGVycm1zZygiY2Fubm90IGNvcHkgZnJvbSBub24tdGFibGUgcmVs YXRpb24gXCIlc1wiIiwKISAJCQkJCQkJCVJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKHJlbCkp KSk7CiAgCQl9CiAgCQlpZiAocGlwZSkKICAJCXsKKioqKioqKioqKioqKioqCioqKiAxMDcx LDEwNzcgKioqKgogIAkJCWlmICghaXNfYWJzb2x1dGVfcGF0aChmaWxlbmFtZSkpCiAgCQkJ CWVyZXBvcnQoRVJST1IsCiAgCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9JTlZBTElEX05BTUUp LAohIAkJCQkgIGVycm1zZygicmVsYXRpdmUgcGF0aCBub3QgYWxsb3dlZCBmb3IgQ09QWSB0 byBmaWxlIikpKTsKICAKICAJCQlvdW1hc2sgPSB1bWFzaygobW9kZV90KSAwMjIpOwogIAkJ CWNvcHlfZmlsZSA9IEFsbG9jYXRlRmlsZShmaWxlbmFtZSwgUEdfQklOQVJZX1cpOwotLS0g MTI1MywxMjYwIC0tLS0KICAJCQlpZiAoIWlzX2Fic29sdXRlX3BhdGgoZmlsZW5hbWUpKQog IAkJCQllcmVwb3J0KEVSUk9SLAogIAkJCQkJCShlcnJjb2RlKEVSUkNPREVfSU5WQUxJRF9O QU1FKSwKISAJCQkJCQkgZXJybXNnCiEgCQkJCQkJICgicmVsYXRpdmUgcGF0aCBub3QgYWxs b3dlZCBmb3IgQ09QWSB0byBmaWxlIikpKTsKICAKICAJCQlvdW1hc2sgPSB1bWFzaygobW9k ZV90KSAwMjIpOwogIAkJCWNvcHlfZmlsZSA9IEFsbG9jYXRlRmlsZShmaWxlbmFtZSwgUEdf QklOQVJZX1cpOwoqKioqKioqKioqKioqKioKKioqIDEwODAsMTA4NyAqKioqCiAgCQkJaWYg KGNvcHlfZmlsZSA9PSBOVUxMKQogIAkJCQllcmVwb3J0KEVSUk9SLAogIAkJCQkJCShlcnJj b2RlX2Zvcl9maWxlX2FjY2VzcygpLAohIAkJCQkJIGVycm1zZygiY291bGQgbm90IG9wZW4g ZmlsZSBcIiVzXCIgZm9yIHdyaXRpbmc6ICVtIiwKISAJCQkJCQkJZmlsZW5hbWUpKSk7CiAg CiAgCQkJZnN0YXQoZmlsZW5vKGNvcHlfZmlsZSksICZzdCk7CiAgCQkJaWYgKFNfSVNESVIo c3Quc3RfbW9kZSkpCi0tLSAxMjYzLDEyNzAgLS0tLQogIAkJCWlmIChjb3B5X2ZpbGUgPT0g TlVMTCkKICAJCQkJZXJlcG9ydChFUlJPUiwKICAJCQkJCQkoZXJyY29kZV9mb3JfZmlsZV9h Y2Nlc3MoKSwKISAJCQkJCQkgZXJybXNnKCJjb3VsZCBub3Qgb3BlbiBmaWxlIFwiJXNcIiBm b3Igd3JpdGluZzogJW0iLAohIAkJCQkJCQkJZmlsZW5hbWUpKSk7CiAgCiAgCQkJZnN0YXQo ZmlsZW5vKGNvcHlfZmlsZSksICZzdCk7CiAgCQkJaWYgKFNfSVNESVIoc3Quc3RfbW9kZSkp CioqKioqKioqKioqKioqKgoqKiogMTA5OSwxMTE0ICoqKioKICAKICAJaWYgKCFwaXBlKQog IAl7CiEgCQkvKiB3ZSBhc3N1bWUgb25seSB0aGUgd3JpdGUgY2FzZSBjb3VsZCBmYWlsIGhl cmUgKi8KICAJCWlmIChGcmVlRmlsZShjb3B5X2ZpbGUpKQogIAkJCWVyZXBvcnQoRVJST1Is CiAgCQkJCQkoZXJyY29kZV9mb3JfZmlsZV9hY2Nlc3MoKSwKISAJCQkJCSBlcnJtc2coImNv dWxkIG5vdCB3cml0ZSB0byBmaWxlIFwiJXNcIjogJW0iLAohIAkJCQkJCQlmaWxlbmFtZSkp KTsKICAJfQohIAlwZnJlZShhdHRyaWJ1dGVfYnVmLmRhdGEpOwogIAlwZnJlZShsaW5lX2J1 Zi5kYXRhKTsKICAKICAJLyoKICAJICogQ2xvc2UgdGhlIHJlbGF0aW9uLglJZiByZWFkaW5n LCB3ZSBjYW4gcmVsZWFzZSB0aGUgQWNjZXNzU2hhcmVMb2NrCiAgCSAqIHdlIGdvdDsgaWYg d3JpdGluZywgd2Ugc2hvdWxkIGhvbGQgdGhlIGxvY2sgdW50aWwgZW5kIG9mCi0tLSAxMjgy LDEyOTkgLS0tLQogIAogIAlpZiAoIXBpcGUpCiAgCXsKISAJCS8qCiEgCQkgKiB3ZSBhc3N1 bWUgb25seSB0aGUgd3JpdGUgY2FzZSBjb3VsZCBmYWlsIGhlcmUKISAJCSAqLwogIAkJaWYg KEZyZWVGaWxlKGNvcHlfZmlsZSkpCiAgCQkJZXJlcG9ydChFUlJPUiwKICAJCQkJCShlcnJj b2RlX2Zvcl9maWxlX2FjY2VzcygpLAohIAkJCQkJIGVycm1zZygiY291bGQgbm90IHdyaXRl IHRvIGZpbGUgXCIlc1wiOiAlbSIsIGZpbGVuYW1lKSkpOwogIAl9CiEgCXBmcmVlKGF0dHJf YnVmLmRhdGEpOwogIAlwZnJlZShsaW5lX2J1Zi5kYXRhKTsKICAKKyAKICAJLyoKICAJICog Q2xvc2UgdGhlIHJlbGF0aW9uLglJZiByZWFkaW5nLCB3ZSBjYW4gcmVsZWFzZSB0aGUgQWNj ZXNzU2hhcmVMb2NrCiAgCSAqIHdlIGdvdDsgaWYgd3JpdGluZywgd2Ugc2hvdWxkIGhvbGQg dGhlIGxvY2sgdW50aWwgZW5kIG9mCioqKioqKioqKioqKioqKgoqKiogMTE3OCwxMTg0ICoq KioKICAJbnVtX3BoeXNfYXR0cnMgPSB0dXBEZXNjLT5uYXR0czsKICAJYXR0cl9jb3VudCA9 IGxpc3RfbGVuZ3RoKGF0dG51bWxpc3QpOwogIAohIAkvKiBHZXQgaW5mbyBhYm91dCB0aGUg Y29sdW1ucyB3ZSBuZWVkIHRvIHByb2Nlc3MuICovCiAgCW91dF9mdW5jdGlvbnMgPSAoRm1n ckluZm8gKikgcGFsbG9jKG51bV9waHlzX2F0dHJzICogc2l6ZW9mKEZtZ3JJbmZvKSk7CiAg CWZvcmNlX3F1b3RlID0gKGJvb2wgKikgcGFsbG9jKG51bV9waHlzX2F0dHJzICogc2l6ZW9m KGJvb2wpKTsKICAJZm9yZWFjaChjdXIsIGF0dG51bWxpc3QpCi0tLSAxMzYzLDEzNzEgLS0t LQogIAludW1fcGh5c19hdHRycyA9IHR1cERlc2MtPm5hdHRzOwogIAlhdHRyX2NvdW50ID0g bGlzdF9sZW5ndGgoYXR0bnVtbGlzdCk7CiAgCiEgCS8qCiEgCSAqIEdldCBpbmZvIGFib3V0 IHRoZSBjb2x1bW5zIHdlIG5lZWQgdG8gcHJvY2Vzcy4KISAJICovCiAgCW91dF9mdW5jdGlv bnMgPSAoRm1nckluZm8gKikgcGFsbG9jKG51bV9waHlzX2F0dHJzICogc2l6ZW9mKEZtZ3JJ bmZvKSk7CiAgCWZvcmNlX3F1b3RlID0gKGJvb2wgKikgcGFsbG9jKG51bV9waHlzX2F0dHJz ICogc2l6ZW9mKGJvb2wpKTsKICAJZm9yZWFjaChjdXIsIGF0dG51bWxpc3QpCioqKioqKioq KioqKioqKgoqKiogMTE4OSwxMjAwICoqKioKICAKICAJCWlmIChiaW5hcnkpCiAgCQkJZ2V0 VHlwZUJpbmFyeU91dHB1dEluZm8oYXR0clthdHRudW0gLSAxXS0+YXR0dHlwaWQsCiEgCQkJ CQkJCQkJJm91dF9mdW5jX29pZCwKISAJCQkJCQkJCQkmaXN2YXJsZW5hKTsKICAJCWVsc2UK ICAJCQlnZXRUeXBlT3V0cHV0SW5mbyhhdHRyW2F0dG51bSAtIDFdLT5hdHR0eXBpZCwKISAJ CQkJCQkJICAmb3V0X2Z1bmNfb2lkLAohIAkJCQkJCQkgICZpc3ZhcmxlbmEpOwogIAkJZm1n cl9pbmZvKG91dF9mdW5jX29pZCwgJm91dF9mdW5jdGlvbnNbYXR0bnVtIC0gMV0pOwogIAog IAkJaWYgKGxpc3RfbWVtYmVyX2ludChmb3JjZV9xdW90ZV9hdHRzLCBhdHRudW0pKQotLS0g MTM3NiwxMzg1IC0tLS0KICAKICAJCWlmIChiaW5hcnkpCiAgCQkJZ2V0VHlwZUJpbmFyeU91 dHB1dEluZm8oYXR0clthdHRudW0gLSAxXS0+YXR0dHlwaWQsCiEgCQkJCQkJCQkJJm91dF9m dW5jX29pZCwgJmlzdmFybGVuYSk7CiAgCQllbHNlCiAgCQkJZ2V0VHlwZU91dHB1dEluZm8o YXR0clthdHRudW0gLSAxXS0+YXR0dHlwaWQsCiEgCQkJCQkJCSAgJm91dF9mdW5jX29pZCwg JmlzdmFybGVuYSk7CiAgCQlmbWdyX2luZm8ob3V0X2Z1bmNfb2lkLCAmb3V0X2Z1bmN0aW9u c1thdHRudW0gLSAxXSk7CiAgCiAgCQlpZiAobGlzdF9tZW1iZXJfaW50KGZvcmNlX3F1b3Rl X2F0dHMsIGF0dG51bSkpCioqKioqKioqKioqKioqKgoqKiogMTIxNywxMjMzICoqKioKICAK ICAJaWYgKGJpbmFyeSkKICAJewohIAkJLyogR2VuZXJhdGUgaGVhZGVyIGZvciBhIGJpbmFy eSBjb3B5ICovCiAgCQlpbnQzMgkJdG1wOwogIAohIAkJLyogU2lnbmF0dXJlICovCiAgCQlD b3B5U2VuZERhdGEoKGNoYXIgKikgQmluYXJ5U2lnbmF0dXJlLCAxMSk7CiEgCQkvKiBGbGFn cyBmaWVsZCAqLwogIAkJdG1wID0gMDsKICAJCWlmIChvaWRzKQogIAkJCXRtcCB8PSAoMSA8 PCAxNik7CiAgCQlDb3B5U2VuZEludDMyKHRtcCk7CiEgCQkvKiBObyBoZWFkZXIgZXh0ZW5z aW9uICovCiAgCQl0bXAgPSAwOwogIAkJQ29weVNlbmRJbnQzMih0bXApOwogIAl9Ci0tLSAx NDAyLDE0MjYgLS0tLQogIAogIAlpZiAoYmluYXJ5KQogIAl7CiEgCQkvKgohIAkJICogR2Vu ZXJhdGUgaGVhZGVyIGZvciBhIGJpbmFyeSBjb3B5CiEgCQkgKi8KICAJCWludDMyCQl0bXA7 CiAgCiEgCQkvKgohIAkJICogU2lnbmF0dXJlCiEgCQkgKi8KICAJCUNvcHlTZW5kRGF0YSgo Y2hhciAqKSBCaW5hcnlTaWduYXR1cmUsIDExKTsKISAJCS8qCiEgCQkgKiBGbGFncyBmaWVs ZAohIAkJICovCiAgCQl0bXAgPSAwOwogIAkJaWYgKG9pZHMpCiAgCQkJdG1wIHw9ICgxIDw8 IDE2KTsKICAJCUNvcHlTZW5kSW50MzIodG1wKTsKISAJCS8qCiEgCQkgKiBObyBoZWFkZXIg ZXh0ZW5zaW9uCiEgCQkgKi8KICAJCXRtcCA9IDA7CiAgCQlDb3B5U2VuZEludDMyKHRtcCk7 CiAgCX0KKioqKioqKioqKioqKioqCioqKiAxMjQyLDEyNTMgKioqKgogIAkJCQlwZ19zZXJ2 ZXJfdG9fY2xpZW50KCh1bnNpZ25lZCBjaGFyICopIG51bGxfcHJpbnQsCiAgCQkJCQkJCQkJ c3RybGVuKG51bGxfcHJpbnQpKTsKICAKISAJCS8qIGlmIGEgaGVhZGVyIGhhcyBiZWVuIHJl cXVlc3RlZCBzZW5kIHRoZSBsaW5lICovCiAgCQlpZiAoaGVhZGVyX2xpbmUpCiAgCQl7CiEg CQkJYm9vbCBoZHJfZGVsaW0gPSBmYWxzZTsKISAJCQljaGFyICpjb2xuYW1lOwohIAkJCQog IAkJCWZvcmVhY2goY3VyLCBhdHRudW1saXN0KQogIAkJCXsKICAJCQkJaW50CQkJYXR0bnVt ID0gbGZpcnN0X2ludChjdXIpOwotLS0gMTQzNSwxNDQ4IC0tLS0KICAJCQkJcGdfc2VydmVy X3RvX2NsaWVudCgodW5zaWduZWQgY2hhciAqKSBudWxsX3ByaW50LAogIAkJCQkJCQkJCXN0 cmxlbihudWxsX3ByaW50KSk7CiAgCiEgCQkvKgohIAkJICogaWYgYSBoZWFkZXIgaGFzIGJl ZW4gcmVxdWVzdGVkIHNlbmQgdGhlIGxpbmUKISAJCSAqLwogIAkJaWYgKGhlYWRlcl9saW5l KQogIAkJewohIAkJCWJvb2wJCWhkcl9kZWxpbSA9IGZhbHNlOwohIAkJCWNoYXIJICAgKmNv bG5hbWU7CiEgCiAgCQkJZm9yZWFjaChjdXIsIGF0dG51bWxpc3QpCiAgCQkJewogIAkJCQlp bnQJCQlhdHRudW0gPSBsZmlyc3RfaW50KGN1cik7CioqKioqKioqKioqKioqKgoqKiogMTI4 MCwxMzA0ICoqKioKICAKICAJCWlmIChiaW5hcnkpCiAgCQl7CiEgCQkJLyogQmluYXJ5IHBl ci10dXBsZSBoZWFkZXIgKi8KICAJCQlDb3B5U2VuZEludDE2KGF0dHJfY291bnQpOwohIAkJ CS8qIFNlbmQgT0lEIGlmIHdhbnRlZCAtLS0gbm90ZSBhdHRyX2NvdW50IGRvZXNuJ3QgaW5j bHVkZSBpdCAqLwogIAkJCWlmIChvaWRzKQogIAkJCXsKICAJCQkJT2lkCQkJb2lkID0gSGVh cFR1cGxlR2V0T2lkKHR1cGxlKTsKICAKISAJCQkJLyogSGFjayAtLS0gYXNzdW1lIE9pZCBp cyBzYW1lIHNpemUgYXMgaW50MzIgKi8KICAJCQkJQ29weVNlbmRJbnQzMihzaXplb2YoaW50 MzIpKTsKICAJCQkJQ29weVNlbmRJbnQzMihvaWQpOwogIAkJCX0KICAJCX0KICAJCWVsc2UK ICAJCXsKISAJCQkvKiBUZXh0IGZvcm1hdCBoYXMgbm8gcGVyLXR1cGxlIGhlYWRlciwgYnV0 IHNlbmQgT0lEIGlmIHdhbnRlZCAqLwogIAkJCWlmIChvaWRzKQogIAkJCXsKICAJCQkJc3Ry aW5nID0gRGF0dW1HZXRDU3RyaW5nKERpcmVjdEZ1bmN0aW9uQ2FsbDEob2lkb3V0LAohIAkJ CQkJCQkgIE9iamVjdElkR2V0RGF0dW0oSGVhcFR1cGxlR2V0T2lkKHR1cGxlKSkpKTsKICAJ CQkJQ29weVNlbmRTdHJpbmcoc3RyaW5nKTsKICAJCQkJbmVlZF9kZWxpbSA9IHRydWU7CiAg CQkJfQotLS0gMTQ3NSwxNTA5IC0tLS0KICAKICAJCWlmIChiaW5hcnkpCiAgCQl7CiEgCQkJ LyoKISAJCQkgKiBCaW5hcnkgcGVyLXR1cGxlIGhlYWRlcgohIAkJCSAqLwogIAkJCUNvcHlT ZW5kSW50MTYoYXR0cl9jb3VudCk7CiEgCQkJLyoKISAJCQkgKiBTZW5kIE9JRCBpZiB3YW50 ZWQgLS0tIG5vdGUgYXR0cl9jb3VudCBkb2Vzbid0IGluY2x1ZGUgaXQgCiEgCQkJICovCiAg CQkJaWYgKG9pZHMpCiAgCQkJewogIAkJCQlPaWQJCQlvaWQgPSBIZWFwVHVwbGVHZXRPaWQo dHVwbGUpOwogIAohIAkJCQkvKgohIAkJCQkgKiBIYWNrIC0tLSBhc3N1bWUgT2lkIGlzIHNh bWUgc2l6ZSBhcyBpbnQzMgohIAkJCQkgKi8KICAJCQkJQ29weVNlbmRJbnQzMihzaXplb2Yo aW50MzIpKTsKICAJCQkJQ29weVNlbmRJbnQzMihvaWQpOwogIAkJCX0KICAJCX0KICAJCWVs c2UKICAJCXsKISAJCQkvKgohIAkJCSAqIFRleHQgZm9ybWF0IGhhcyBubyBwZXItdHVwbGUg aGVhZGVyLCBidXQgc2VuZCBPSUQgaWYgd2FudGVkCiEgCQkJICovCiAgCQkJaWYgKG9pZHMp CiAgCQkJewogIAkJCQlzdHJpbmcgPSBEYXR1bUdldENTdHJpbmcoRGlyZWN0RnVuY3Rpb25D YWxsMShvaWRvdXQsCiEgCQkJCQkJCQkJCQkJCQkJIE9iamVjdElkR2V0RGF0dW0KISAJCQkJ CQkJCQkJCQkJCQkgKEhlYXBUdXBsZUdldE9pZAohIAkJCQkJCQkJCQkJCQkJCSAgKHR1cGxl KSkpKTsKICAJCQkJQ29weVNlbmRTdHJpbmcoc3RyaW5nKTsKICAJCQkJbmVlZF9kZWxpbSA9 IHRydWU7CiAgCQkJfQoqKioqKioqKioqKioqKioKKioqIDEzMzAsMTM0MiAqKioqCiAgCQkJ ewogIAkJCQlpZiAoIWJpbmFyeSkKICAJCQkJewohIAkJCQkJc3RyaW5nID0gRGF0dW1HZXRD U3RyaW5nKEZ1bmN0aW9uQ2FsbDEoJm91dF9mdW5jdGlvbnNbYXR0bnVtIC0gMV0sCiEgCQkJ CQkJCQkJCQkJCQkgICB2YWx1ZSkpOwogIAkJCQkJaWYgKGNzdl9tb2RlKQogIAkJCQkJewog IAkJCQkJCUNvcHlBdHRyaWJ1dGVPdXRDU1Yoc3RyaW5nLCBkZWxpbSwgcXVvdGUsIGVzY2Fw ZSwKISAJCQkJCQkJCQkgIChzdHJjbXAoc3RyaW5nLCBudWxsX3ByaW50KSA9PSAwIHx8CiEg CQkJCQkJCQkJICAgZm9yY2VfcXVvdGVbYXR0bnVtIC0gMV0pKTsKICAJCQkJCX0KICAJCQkJ CWVsc2UKICAJCQkJCQlDb3B5QXR0cmlidXRlT3V0KHN0cmluZywgZGVsaW0pOwotLS0gMTUz NSwxNTQ4IC0tLS0KICAJCQl7CiAgCQkJCWlmICghYmluYXJ5KQogIAkJCQl7CiEgCQkJCQlz dHJpbmcgPQohIAkJCQkJCURhdHVtR2V0Q1N0cmluZyhGdW5jdGlvbkNhbGwxCiEgCQkJCQkJ CQkJCSgmb3V0X2Z1bmN0aW9uc1thdHRudW0gLSAxXSwgdmFsdWUpKTsKICAJCQkJCWlmIChj c3ZfbW9kZSkKICAJCQkJCXsKICAJCQkJCQlDb3B5QXR0cmlidXRlT3V0Q1NWKHN0cmluZywg ZGVsaW0sIHF1b3RlLCBlc2NhcGUsCiEgCQkJCQkJCQkJCQkoc3RyY21wKHN0cmluZywgbnVs bF9wcmludCkgPT0gMCB8fAohIAkJCQkJCQkJCQkJIGZvcmNlX3F1b3RlW2F0dG51bSAtIDFd KSk7CiAgCQkJCQl9CiAgCQkJCQllbHNlCiAgCQkJCQkJQ29weUF0dHJpYnV0ZU91dChzdHJp bmcsIGRlbGltKTsKKioqKioqKioqKioqKioqCioqKiAxMzQ2LDEzNTQgKioqKgogIAkJCQl7 CiAgCQkJCQlieXRlYQkgICAqb3V0cHV0Ynl0ZXM7CiAgCiEgCQkJCQlvdXRwdXRieXRlcyA9 IERhdHVtR2V0Qnl0ZWFQKEZ1bmN0aW9uQ2FsbDEoJm91dF9mdW5jdGlvbnNbYXR0bnVtIC0g MV0sCiEgCQkJCQkJCQkJCQkJCQkJICAgdmFsdWUpKTsKISAJCQkJCS8qIFdlIGFzc3VtZSB0 aGUgcmVzdWx0IHdpbGwgbm90IGhhdmUgYmVlbiB0b2FzdGVkICovCiAgCQkJCQlDb3B5U2Vu ZEludDMyKFZBUlNJWkUob3V0cHV0Ynl0ZXMpIC0gVkFSSERSU1opOwogIAkJCQkJQ29weVNl bmREYXRhKFZBUkRBVEEob3V0cHV0Ynl0ZXMpLAogIAkJCQkJCQkJIFZBUlNJWkUob3V0cHV0 Ynl0ZXMpIC0gVkFSSERSU1opOwotLS0gMTU1MiwxNTYzIC0tLS0KICAJCQkJewogIAkJCQkJ Ynl0ZWEJICAgKm91dHB1dGJ5dGVzOwogIAohIAkJCQkJb3V0cHV0Ynl0ZXMgPQohIAkJCQkJ CURhdHVtR2V0Qnl0ZWFQKEZ1bmN0aW9uQ2FsbDEKISAJCQkJCQkJCQkgICAoJm91dF9mdW5j dGlvbnNbYXR0bnVtIC0gMV0sIHZhbHVlKSk7CiEgCQkJCQkvKgohIAkJCQkJICogV2UgYXNz dW1lIHRoZSByZXN1bHQgd2lsbCBub3QgaGF2ZSBiZWVuIHRvYXN0ZWQKISAJCQkJCSAqLwog IAkJCQkJQ29weVNlbmRJbnQzMihWQVJTSVpFKG91dHB1dGJ5dGVzKSAtIFZBUkhEUlNaKTsK ICAJCQkJCUNvcHlTZW5kRGF0YShWQVJEQVRBKG91dHB1dGJ5dGVzKSwKICAJCQkJCQkJCSBW QVJTSVpFKG91dHB1dGJ5dGVzKSAtIFZBUkhEUlNaKTsKKioqKioqKioqKioqKioqCioqKiAx MzY1LDEzNzEgKioqKgogIAogIAlpZiAoYmluYXJ5KQogIAl7CiEgCQkvKiBHZW5lcmF0ZSB0 cmFpbGVyIGZvciBhIGJpbmFyeSBjb3B5ICovCiAgCQlDb3B5U2VuZEludDE2KC0xKTsKICAJ fQogIAotLS0gMTU3NCwxNTgyIC0tLS0KICAKICAJaWYgKGJpbmFyeSkKICAJewohIAkJLyoK ISAJCSAqIEdlbmVyYXRlIHRyYWlsZXIgZm9yIGEgYmluYXJ5IGNvcHkKISAJCSAqLwogIAkJ Q29weVNlbmRJbnQxNigtMSk7CiAgCX0KICAKKioqKioqKioqKioqKioqCioqKiAxMzg0LDEz OTAgKioqKgogIHsKICAJaWYgKGNvcHlfYmluYXJ5KQogIAl7CiEgCQkvKiBjYW4ndCB1c2Vm dWxseSBkaXNwbGF5IHRoZSBkYXRhICovCiAgCQlpZiAoY29weV9hdHRuYW1lKQogIAkJCWVy cmNvbnRleHQoIkNPUFkgJXMsIGxpbmUgJWQsIGNvbHVtbiAlcyIsCiAgCQkJCQkgICBjb3B5 X3JlbG5hbWUsIGNvcHlfbGluZW5vLCBjb3B5X2F0dG5hbWUpOwotLS0gMTU5NSwxNjAzIC0t LS0KICB7CiAgCWlmIChjb3B5X2JpbmFyeSkKICAJewohIAkJLyoKISAJCSAqIGNhbid0IHVz ZWZ1bGx5IGRpc3BsYXkgdGhlIGRhdGEgCiEgCQkgKi8KICAJCWlmIChjb3B5X2F0dG5hbWUp CiAgCQkJZXJyY29udGV4dCgiQ09QWSAlcywgbGluZSAlZCwgY29sdW1uICVzIiwKICAJCQkJ CSAgIGNvcHlfcmVsbmFtZSwgY29weV9saW5lbm8sIGNvcHlfYXR0bmFtZSk7CioqKioqKioq KioqKioqKgoqKiogMTM5NSwxNDIzICoqKioKICAJewogIAkJaWYgKGNvcHlfYXR0bmFtZSkK ICAJCXsKISAJCQkvKiBlcnJvciBpcyByZWxldmFudCB0byBhIHBhcnRpY3VsYXIgY29sdW1u ICovCiEgCQkJbGltaXRfcHJpbnRvdXRfbGVuZ3RoKCZhdHRyaWJ1dGVfYnVmKTsKICAJCQll cnJjb250ZXh0KCJDT1BZICVzLCBsaW5lICVkLCBjb2x1bW4gJXM6IFwiJXNcIiIsCiEgCQkJ CQkgICBjb3B5X3JlbG5hbWUsIGNvcHlfbGluZW5vLCBjb3B5X2F0dG5hbWUsCiEgCQkJCQkg ICBhdHRyaWJ1dGVfYnVmLmRhdGEpOwogIAkJfQogIAkJZWxzZQogIAkJewohIAkJCS8qIGVy cm9yIGlzIHJlbGV2YW50IHRvIGEgcGFydGljdWxhciBsaW5lICovCiEgCQkJaWYgKGxpbmVf YnVmX2NvbnZlcnRlZCB8fAohIAkJCQljbGllbnRfZW5jb2RpbmcgPT0gc2VydmVyX2VuY29k aW5nKQogIAkJCXsKICAJCQkJbGltaXRfcHJpbnRvdXRfbGVuZ3RoKCZsaW5lX2J1Zik7CiAg CQkJCWVycmNvbnRleHQoIkNPUFkgJXMsIGxpbmUgJWQ6IFwiJXNcIiIsCiEgCQkJCQkJICAg Y29weV9yZWxuYW1lLCBjb3B5X2xpbmVubywKISAJCQkJCQkgICBsaW5lX2J1Zi5kYXRhKTsK ICAJCQl9CiAgCQkJZWxzZQogIAkJCXsKICAJCQkJLyoKICAJCQkJICogSGVyZSwgdGhlIGxp bmUgYnVmZmVyIGlzIHN0aWxsIGluIGEgZm9yZWlnbiBlbmNvZGluZywKICAJCQkJICogYW5k IGluZGVlZCBpdCdzIHF1aXRlIGxpa2VseSB0aGF0IHRoZSBlcnJvciBpcyBwcmVjaXNlbHkK ISAJCQkJICogYSBmYWlsdXJlIHRvIGRvIGVuY29kaW5nIGNvbnZlcnNpb24gKGllLCBiYWQg ZGF0YSkuICBXZQogIAkJCQkgKiBkYXJlIG5vdCB0cnkgdG8gY29udmVydCBpdCwgYW5kIGF0 IHByZXNlbnQgdGhlcmUncyBubyB3YXkKICAJCQkJICogdG8gcmVndXJnaXRhdGUgaXQgd2l0 aG91dCBjb252ZXJzaW9uLiAgU28gd2UgaGF2ZSB0byBwdW50CiAgCQkJCSAqIGFuZCBqdXN0 IHJlcG9ydCB0aGUgbGluZSBudW1iZXIuCi0tLSAxNjA4LDE2NDEgLS0tLQogIAl7CiAgCQlp ZiAoY29weV9hdHRuYW1lKQogIAkJewohIAkJCS8qCiEgCQkJICogZXJyb3IgaXMgcmVsZXZh bnQgdG8gYSBwYXJ0aWN1bGFyIGNvbHVtbgohIAkJCSAqLwohIAkJCWxpbWl0X3ByaW50b3V0 X2xlbmd0aCgmYXR0cl9idWYpOwogIAkJCWVycmNvbnRleHQoIkNPUFkgJXMsIGxpbmUgJWQs IGNvbHVtbiAlczogXCIlc1wiIiwKISAJCQkJCSAgIGNvcHlfcmVsbmFtZSwgY29weV9saW5l bm8sIGNvcHlfYXR0bmFtZSwgYXR0cl9idWYuZGF0YSk7CiAgCQl9CiAgCQllbHNlCiAgCQl7 CiEgCQkJLyoKISAJCQkgKiBlcnJvciBpcyByZWxldmFudCB0byBhIHBhcnRpY3VsYXIgbGlu ZQohIAkJCSAqLwohIAkJCWlmIChsaW5lX2J1Zl9jb252ZXJ0ZWQgfHwgY2xpZW50X2VuY29k aW5nID09IHNlcnZlcl9lbmNvZGluZykKICAJCQl7CisgCQkJCS8qCisgCQkJCSAqIFN0cmlw IG9mZiB0aGUgbmV3bGluZQorIAkJCQkgKi8KKyAJCQkJKihsaW5lX2J1Zi5kYXRhICsgbGlu ZV9idWYubGVuIC0gMSkgPSAnXDAnOwogIAkJCQlsaW1pdF9wcmludG91dF9sZW5ndGgoJmxp bmVfYnVmKTsKICAJCQkJZXJyY29udGV4dCgiQ09QWSAlcywgbGluZSAlZDogXCIlc1wiIiwK ISAJCQkJCQkgICBjb3B5X3JlbG5hbWUsIGNvcHlfbGluZW5vLCBsaW5lX2J1Zi5kYXRhKTsK ICAJCQl9CiAgCQkJZWxzZQogIAkJCXsKICAJCQkJLyoKICAJCQkJICogSGVyZSwgdGhlIGxp bmUgYnVmZmVyIGlzIHN0aWxsIGluIGEgZm9yZWlnbiBlbmNvZGluZywKICAJCQkJICogYW5k IGluZGVlZCBpdCdzIHF1aXRlIGxpa2VseSB0aGF0IHRoZSBlcnJvciBpcyBwcmVjaXNlbHkK ISAJCQkJICogYSBmYWlsdXJlIHRvIGRvIGVuY29kaW5nIGNvbnZlcnNpb24gKGllLCBiYWQg ZGF0YSkuCVdlCiAgCQkJCSAqIGRhcmUgbm90IHRyeSB0byBjb252ZXJ0IGl0LCBhbmQgYXQg cHJlc2VudCB0aGVyZSdzIG5vIHdheQogIAkJCQkgKiB0byByZWd1cmdpdGF0ZSBpdCB3aXRo b3V0IGNvbnZlcnNpb24uICBTbyB3ZSBoYXZlIHRvIHB1bnQKICAJCQkJICogYW5kIGp1c3Qg cmVwb3J0IHRoZSBsaW5lIG51bWJlci4KKioqKioqKioqKioqKioqCioqKiAxNDQ1LDE0NjUg KioqKgogIAogIAlpbnQJCQlsZW47CiAgCiEgCS8qIEZhc3QgcGF0aCBpZiBkZWZpbml0ZWx5 IG9rYXkgKi8KICAJaWYgKGJ1Zi0+bGVuIDw9IE1BWF9DT1BZX0RBVEFfRElTUExBWSkKICAJ CXJldHVybjsKICAKISAJLyogQXBwbHkgZW5jb2RpbmctZGVwZW5kZW50IHRydW5jYXRpb24g Ki8KICAJbGVuID0gcGdfbWJjbGlwbGVuKGJ1Zi0+ZGF0YSwgYnVmLT5sZW4sIE1BWF9DT1BZ X0RBVEFfRElTUExBWSk7CiAgCWlmIChidWYtPmxlbiA8PSBsZW4pCiAgCQlyZXR1cm47CQkJ CQkvKiBubyBuZWVkIHRvIHRydW5jYXRlICovCiAgCWJ1Zi0+bGVuID0gbGVuOwogIAlidWYt PmRhdGFbbGVuXSA9ICdcMCc7CiAgCiEgCS8qIEFkZCAiLi4uIiB0byBzaG93IHdlIHRydW5j YXRlZCB0aGUgaW5wdXQgKi8KICAJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsICIuLi4i KTsKICB9CiAgCiAgLyoKICAgKiBDb3B5IEZST00gZmlsZSB0byByZWxhdGlvbi4KICAgKi8K LS0tIDE2NjMsMTY5MCAtLS0tCiAgCiAgCWludAkJCWxlbjsKICAKISAJLyoKISAJICogRmFz dCBwYXRoIGlmIGRlZmluaXRlbHkgb2theQohIAkgKi8KICAJaWYgKGJ1Zi0+bGVuIDw9IE1B WF9DT1BZX0RBVEFfRElTUExBWSkKICAJCXJldHVybjsKICAKISAJLyoKISAJICogQXBwbHkg ZW5jb2RpbmctZGVwZW5kZW50IHRydW5jYXRpb24KISAJICovCiAgCWxlbiA9IHBnX21iY2xp cGxlbihidWYtPmRhdGEsIGJ1Zi0+bGVuLCBNQVhfQ09QWV9EQVRBX0RJU1BMQVkpOwogIAlp ZiAoYnVmLT5sZW4gPD0gbGVuKQogIAkJcmV0dXJuOwkJCQkJLyogbm8gbmVlZCB0byB0cnVu Y2F0ZSAqLwogIAlidWYtPmxlbiA9IGxlbjsKICAJYnVmLT5kYXRhW2xlbl0gPSAnXDAnOwog IAohIAkvKgohIAkgKiBBZGQgIi4uLiIgdG8gc2hvdyB3ZSB0cnVuY2F0ZWQgdGhlIGlucHV0 CiEgCSAqLwogIAlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgIi4uLiIpOwogIH0KICAK KyAKICAvKgogICAqIENvcHkgRlJPTSBmaWxlIHRvIHJlbGF0aW9uLgogICAqLwoqKioqKioq KioqKioqKioKKioqIDE1MTAsMTUyMSAqKioqCiAgCSAqIGNvZGUgaGVyZSB0aGF0IGJhc2lj YWxseSBkdXBsaWNhdGVkIGV4ZWNVdGlscy5jIC4uLikKICAJICovCiAgCXJlc3VsdFJlbElu Zm8gPSBtYWtlTm9kZShSZXN1bHRSZWxJbmZvKTsKICAJcmVzdWx0UmVsSW5mby0+cmlfUmFu Z2VUYWJsZUluZGV4ID0gMTsJCS8qIGR1bW15ICovCiAgCXJlc3VsdFJlbEluZm8tPnJpX1Jl bGF0aW9uRGVzYyA9IHJlbDsKICAJcmVzdWx0UmVsSW5mby0+cmlfVHJpZ0Rlc2MgPSBDb3B5 VHJpZ2dlckRlc2MocmVsLT50cmlnZGVzYyk7CiAgCWlmIChyZXN1bHRSZWxJbmZvLT5yaV9U cmlnRGVzYykKICAJCXJlc3VsdFJlbEluZm8tPnJpX1RyaWdGdW5jdGlvbnMgPSAoRm1ncklu Zm8gKikKISAJCQlwYWxsb2MwKHJlc3VsdFJlbEluZm8tPnJpX1RyaWdEZXNjLT5udW10cmln Z2VycyAqIHNpemVvZihGbWdySW5mbykpOwogIAlyZXN1bHRSZWxJbmZvLT5yaV9UcmlnSW5z dHJ1bWVudCA9IE5VTEw7CiAgCiAgCUV4ZWNPcGVuSW5kaWNlcyhyZXN1bHRSZWxJbmZvKTsK LS0tIDE3MzUsMTc0OCAtLS0tCiAgCSAqIGNvZGUgaGVyZSB0aGF0IGJhc2ljYWxseSBkdXBs aWNhdGVkIGV4ZWNVdGlscy5jIC4uLikKICAJICovCiAgCXJlc3VsdFJlbEluZm8gPSBtYWtl Tm9kZShSZXN1bHRSZWxJbmZvKTsKKyAKICAJcmVzdWx0UmVsSW5mby0+cmlfUmFuZ2VUYWJs ZUluZGV4ID0gMTsJCS8qIGR1bW15ICovCiAgCXJlc3VsdFJlbEluZm8tPnJpX1JlbGF0aW9u RGVzYyA9IHJlbDsKICAJcmVzdWx0UmVsSW5mby0+cmlfVHJpZ0Rlc2MgPSBDb3B5VHJpZ2dl ckRlc2MocmVsLT50cmlnZGVzYyk7CiAgCWlmIChyZXN1bHRSZWxJbmZvLT5yaV9UcmlnRGVz YykKICAJCXJlc3VsdFJlbEluZm8tPnJpX1RyaWdGdW5jdGlvbnMgPSAoRm1nckluZm8gKikK ISAJCQlwYWxsb2MwKHJlc3VsdFJlbEluZm8tPnJpX1RyaWdEZXNjLT5udW10cmlnZ2VycyAq CiEgCQkJCQlzaXplb2YoRm1nckluZm8pKTsKICAJcmVzdWx0UmVsSW5mby0+cmlfVHJpZ0lu c3RydW1lbnQgPSBOVUxMOwogIAogIAlFeGVjT3BlbkluZGljZXMocmVzdWx0UmVsSW5mbyk7 CioqKioqKioqKioqKioqKgoqKiogMTUyNCwxNTMwICoqKioKICAJZXN0YXRlLT5lc19udW1f cmVzdWx0X3JlbGF0aW9ucyA9IDE7CiAgCWVzdGF0ZS0+ZXNfcmVzdWx0X3JlbGF0aW9uX2lu Zm8gPSByZXN1bHRSZWxJbmZvOwogIAohIAkvKiBTZXQgdXAgYSB0dXBsZSBzbG90IHRvbyAq LwogIAlzbG90ID0gTWFrZVNpbmdsZVR1cGxlVGFibGVTbG90KHR1cERlc2MpOwogIAogIAll Y29udGV4dCA9IEdldFBlclR1cGxlRXhwckNvbnRleHQoZXN0YXRlKTsKLS0tIDE3NTEsMTc1 OSAtLS0tCiAgCWVzdGF0ZS0+ZXNfbnVtX3Jlc3VsdF9yZWxhdGlvbnMgPSAxOwogIAllc3Rh dGUtPmVzX3Jlc3VsdF9yZWxhdGlvbl9pbmZvID0gcmVzdWx0UmVsSW5mbzsKICAKISAJLyoK ISAJICogU2V0IHVwIGEgdHVwbGUgc2xvdCB0b28KISAJICovCiAgCXNsb3QgPSBNYWtlU2lu Z2xlVHVwbGVUYWJsZVNsb3QodHVwRGVzYyk7CiAgCiAgCWVjb250ZXh0ID0gR2V0UGVyVHVw bGVFeHByQ29udGV4dChlc3RhdGUpOwoqKioqKioqKioqKioqKioKKioqIDE1MzksMTU1NyAq KioqCiAgCXR5cGlvcGFyYW1zID0gKE9pZCAqKSBwYWxsb2MobnVtX3BoeXNfYXR0cnMgKiBz aXplb2YoT2lkKSk7CiAgCWRlZm1hcCA9IChpbnQgKikgcGFsbG9jKG51bV9waHlzX2F0dHJz ICogc2l6ZW9mKGludCkpOwogIAlkZWZleHBycyA9IChFeHByU3RhdGUgKiopIHBhbGxvYyhu dW1fcGh5c19hdHRycyAqIHNpemVvZihFeHByU3RhdGUgKikpOwohIAljb25zdHJhaW50ZXhw cnMgPSAoRXhwclN0YXRlICoqKSBwYWxsb2MwKG51bV9waHlzX2F0dHJzICogc2l6ZW9mKEV4 cHJTdGF0ZSAqKSk7CiAgCWZvcmNlX25vdG51bGwgPSAoYm9vbCAqKSBwYWxsb2MobnVtX3Bo eXNfYXR0cnMgKiBzaXplb2YoYm9vbCkpOwogIAogIAlmb3IgKGF0dG51bSA9IDE7IGF0dG51 bSA8PSBudW1fcGh5c19hdHRyczsgYXR0bnVtKyspCiAgCXsKISAJCS8qIFdlIGRvbid0IG5l ZWQgaW5mbyBmb3IgZHJvcHBlZCBhdHRyaWJ1dGVzICovCiAgCQlpZiAoYXR0clthdHRudW0g LSAxXS0+YXR0aXNkcm9wcGVkKQogIAkJCWNvbnRpbnVlOwogIAohIAkJLyogRmV0Y2ggdGhl IGlucHV0IGZ1bmN0aW9uIGFuZCB0eXBpb3BhcmFtIGluZm8gKi8KICAJCWlmIChiaW5hcnkp CiAgCQkJZ2V0VHlwZUJpbmFyeUlucHV0SW5mbyhhdHRyW2F0dG51bSAtIDFdLT5hdHR0eXBp ZCwKISAJCQkJCQkJCSAmaW5fZnVuY19vaWQsICZ0eXBpb3BhcmFtc1thdHRudW0gLSAxXSk7 CiAgCQllbHNlCiAgCQkJZ2V0VHlwZUlucHV0SW5mbyhhdHRyW2F0dG51bSAtIDFdLT5hdHR0 eXBpZCwKICAJCQkJCQkJICZpbl9mdW5jX29pZCwgJnR5cGlvcGFyYW1zW2F0dG51bSAtIDFd KTsKLS0tIDE3NjgsMTc5MSAtLS0tCiAgCXR5cGlvcGFyYW1zID0gKE9pZCAqKSBwYWxsb2Mo bnVtX3BoeXNfYXR0cnMgKiBzaXplb2YoT2lkKSk7CiAgCWRlZm1hcCA9IChpbnQgKikgcGFs bG9jKG51bV9waHlzX2F0dHJzICogc2l6ZW9mKGludCkpOwogIAlkZWZleHBycyA9IChFeHBy U3RhdGUgKiopIHBhbGxvYyhudW1fcGh5c19hdHRycyAqIHNpemVvZihFeHByU3RhdGUgKikp OwohIAljb25zdHJhaW50ZXhwcnMgPQohIAkJKEV4cHJTdGF0ZSAqKikgcGFsbG9jMChudW1f cGh5c19hdHRycyAqIHNpemVvZihFeHByU3RhdGUgKikpOwogIAlmb3JjZV9ub3RudWxsID0g KGJvb2wgKikgcGFsbG9jKG51bV9waHlzX2F0dHJzICogc2l6ZW9mKGJvb2wpKTsKICAKICAJ Zm9yIChhdHRudW0gPSAxOyBhdHRudW0gPD0gbnVtX3BoeXNfYXR0cnM7IGF0dG51bSsrKQog IAl7CiEgCQkvKgohIAkJICogV2UgZG9uJ3QgbmVlZCBpbmZvIGZvciBkcm9wcGVkIGF0dHJp YnV0ZXMgCiEgCQkgKi8KICAJCWlmIChhdHRyW2F0dG51bSAtIDFdLT5hdHRpc2Ryb3BwZWQp CiAgCQkJY29udGludWU7CiAgCiEgCQkvKgohIAkJICogRmV0Y2ggdGhlIGlucHV0IGZ1bmN0 aW9uIGFuZCB0eXBpb3BhcmFtIGluZm8KISAJCSAqLwogIAkJaWYgKGJpbmFyeSkKICAJCQln ZXRUeXBlQmluYXJ5SW5wdXRJbmZvKGF0dHJbYXR0bnVtIC0gMV0tPmF0dHR5cGlkLAohIAkJ CQkJCQkJICAgJmluX2Z1bmNfb2lkLCAmdHlwaW9wYXJhbXNbYXR0bnVtIC0gMV0pOwogIAkJ ZWxzZQogIAkJCWdldFR5cGVJbnB1dEluZm8oYXR0clthdHRudW0gLSAxXS0+YXR0dHlwaWQs CiAgCQkJCQkJCSAmaW5fZnVuY19vaWQsICZ0eXBpb3BhcmFtc1thdHRudW0gLSAxXSk7Cioq KioqKioqKioqKioqKgoqKiogMTU2MiwxNTcyICoqKioKICAJCWVsc2UKICAJCQlmb3JjZV9u b3RudWxsW2F0dG51bSAtIDFdID0gZmFsc2U7CiAgCiEgCQkvKiBHZXQgZGVmYXVsdCBpbmZv IGlmIG5lZWRlZCAqLwogIAkJaWYgKCFsaXN0X21lbWJlcl9pbnQoYXR0bnVtbGlzdCwgYXR0 bnVtKSkKICAJCXsKISAJCQkvKiBhdHRyaWJ1dGUgaXMgTk9UIHRvIGJlIGNvcGllZCBmcm9t IGlucHV0ICovCiEgCQkJLyogdXNlIGRlZmF1bHQgdmFsdWUgaWYgb25lIGV4aXN0cyAqLwog IAkJCU5vZGUJICAgKmRlZmV4cHIgPSBidWlsZF9jb2x1bW5fZGVmYXVsdChyZWwsIGF0dG51 bSk7CiAgCiAgCQkJaWYgKGRlZmV4cHIgIT0gTlVMTCkKLS0tIDE3OTYsMTgxMiAtLS0tCiAg CQllbHNlCiAgCQkJZm9yY2Vfbm90bnVsbFthdHRudW0gLSAxXSA9IGZhbHNlOwogIAohIAkJ LyoKISAJCSAqIEdldCBkZWZhdWx0IGluZm8gaWYgbmVlZGVkCiEgCQkgKi8KICAJCWlmICgh bGlzdF9tZW1iZXJfaW50KGF0dG51bWxpc3QsIGF0dG51bSkpCiAgCQl7CiEgCQkJLyoKISAJ CQkgKiBhdHRyaWJ1dGUgaXMgTk9UIHRvIGJlIGNvcGllZCBmcm9tIGlucHV0CiEgCQkJICov CiEgCQkJLyoKISAJCQkgKiB1c2UgZGVmYXVsdCB2YWx1ZSBpZiBvbmUgZXhpc3RzCiEgCQkJ ICovCiAgCQkJTm9kZQkgICAqZGVmZXhwciA9IGJ1aWxkX2NvbHVtbl9kZWZhdWx0KHJlbCwg YXR0bnVtKTsKICAKICAJCQlpZiAoZGVmZXhwciAhPSBOVUxMKQoqKioqKioqKioqKioqKioK KioqIDE1NzgsMTU4NCAqKioqCiAgCQkJfQogIAkJfQogIAohIAkJLyogSWYgaXQncyBhIGRv bWFpbiB0eXBlLCBzZXQgdXAgdG8gY2hlY2sgZG9tYWluIGNvbnN0cmFpbnRzICovCiAgCQlp ZiAoZ2V0X3R5cHR5cGUoYXR0clthdHRudW0gLSAxXS0+YXR0dHlwaWQpID09ICdkJykKICAJ CXsKICAJCQlQYXJhbQkgICAqcHJtOwotLS0gMTgxOCwxODI2IC0tLS0KICAJCQl9CiAgCQl9 CiAgCiEgCQkvKgohIAkJICogSWYgaXQncyBhIGRvbWFpbiB0eXBlLCBzZXQgdXAgdG8gY2hl Y2sgZG9tYWluIGNvbnN0cmFpbnRzIAohIAkJICovCiAgCQlpZiAoZ2V0X3R5cHR5cGUoYXR0 clthdHRudW0gLSAxXS0+YXR0dHlwaWQpID09ICdkJykKICAJCXsKICAJCQlQYXJhbQkgICAq cHJtOwoqKioqKioqKioqKioqKioKKioqIDE1OTMsMTU5OCAqKioqCi0tLSAxODM1LDE4NDEg LS0tLQogIAkJCSAqIGFjdHVhbCBkYXR1bSBkdXJpbmcgdGhlIGRhdGEgaW5wdXQgbG9vcC4K ICAJCQkgKi8KICAJCQlwcm0gPSBtYWtlTm9kZShQYXJhbSk7CisgCiAgCQkJcHJtLT5wYXJh bWtpbmQgPSBQQVJBTV9FWEVDOwogIAkJCXBybS0+cGFyYW1pZCA9IDA7CiAgCQkJcHJtLT5w YXJhbXR5cGUgPSBnZXRCYXNlVHlwZShhdHRyW2F0dG51bSAtIDFdLT5hdHR0eXBpZCk7Cioq KioqKioqKioqKioqKgoqKiogMTYwOCwxNjE0ICoqKioKICAJCX0KICAJfQogIAohIAkvKiBQ cmVwYXJlIHRvIGNhdGNoIEFGVEVSIHRyaWdnZXJzLiAqLwogIAlBZnRlclRyaWdnZXJCZWdp blF1ZXJ5KCk7CiAgCiAgCS8qCi0tLSAxODUxLDE4NTkgLS0tLQogIAkJfQogIAl9CiAgCiEg CS8qCiEgCSAqIFByZXBhcmUgdG8gY2F0Y2ggQUZURVIgdHJpZ2dlcnMuCiEgCSAqLwogIAlB ZnRlclRyaWdnZXJCZWdpblF1ZXJ5KCk7CiAgCiAgCS8qCioqKioqKioqKioqKioqKgoqKiog MTYyNCwxNjQwICoqKioKICAJCWZpbGVfaGFzX29pZHMgPSBvaWRzOwkvKiBtdXN0IHJlbHkg b24gdXNlciB0byB0ZWxsIHVzIHRoaXMuLi4gKi8KICAJZWxzZQogIAl7CiEgCQkvKiBSZWFk IGFuZCB2ZXJpZnkgYmluYXJ5IGhlYWRlciAqLwogIAkJY2hhcgkJcmVhZFNpZ1sxMV07CiAg CQlpbnQzMgkJdG1wOwogIAohIAkJLyogU2lnbmF0dXJlICovCiAgCQlDb3B5R2V0RGF0YShy ZWFkU2lnLCAxMSk7CiAgCQlpZiAoQ29weUdldEVvZigpIHx8IG1lbWNtcChyZWFkU2lnLCBC aW5hcnlTaWduYXR1cmUsIDExKSAhPSAwKQogIAkJCWVyZXBvcnQoRVJST1IsCiAgCQkJCQko ZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJTEVfRk9STUFUKSwKICAJCQkJCSBlcnJtc2co IkNPUFkgZmlsZSBzaWduYXR1cmUgbm90IHJlY29nbml6ZWQiKSkpOwohIAkJLyogRmxhZ3Mg ZmllbGQgKi8KICAJCXRtcCA9IENvcHlHZXRJbnQzMigpOwogIAkJaWYgKENvcHlHZXRFb2Yo KSkKICAJCQllcmVwb3J0KEVSUk9SLAotLS0gMTg2OSwxODkxIC0tLS0KICAJCWZpbGVfaGFz X29pZHMgPSBvaWRzOwkvKiBtdXN0IHJlbHkgb24gdXNlciB0byB0ZWxsIHVzIHRoaXMuLi4g Ki8KICAJZWxzZQogIAl7CiEgCQkvKgohIAkJICogUmVhZCBhbmQgdmVyaWZ5IGJpbmFyeSBo ZWFkZXIKISAJCSAqLwogIAkJY2hhcgkJcmVhZFNpZ1sxMV07CiAgCQlpbnQzMgkJdG1wOwog IAohIAkJLyoKISAJCSAqIFNpZ25hdHVyZQohIAkJICovCiAgCQlDb3B5R2V0RGF0YShyZWFk U2lnLCAxMSk7CiAgCQlpZiAoQ29weUdldEVvZigpIHx8IG1lbWNtcChyZWFkU2lnLCBCaW5h cnlTaWduYXR1cmUsIDExKSAhPSAwKQogIAkJCWVyZXBvcnQoRVJST1IsCiAgCQkJCQkoZXJy Y29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJTEVfRk9STUFUKSwKICAJCQkJCSBlcnJtc2coIkNP UFkgZmlsZSBzaWduYXR1cmUgbm90IHJlY29nbml6ZWQiKSkpOwohIAkJLyoKISAJCSAqIEZs YWdzIGZpZWxkCiEgCQkgKi8KICAJCXRtcCA9IENvcHlHZXRJbnQzMigpOwogIAkJaWYgKENv cHlHZXRFb2YoKSkKICAJCQllcmVwb3J0KEVSUk9SLAoqKioqKioqKioqKioqKioKKioqIDE2 NDUsMTY4NCAqKioqCiAgCQlpZiAoKHRtcCA+PiAxNikgIT0gMCkKICAJCQllcmVwb3J0KEVS Uk9SLAogIAkJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxFX0ZPUk1BVCksCiEg CQkJIGVycm1zZygidW5yZWNvZ25pemVkIGNyaXRpY2FsIGZsYWdzIGluIENPUFkgZmlsZSBo ZWFkZXIiKSkpOwohIAkJLyogSGVhZGVyIGV4dGVuc2lvbiBsZW5ndGggKi8KICAJCXRtcCA9 IENvcHlHZXRJbnQzMigpOwogIAkJaWYgKENvcHlHZXRFb2YoKSB8fCB0bXAgPCAwKQogIAkJ CWVyZXBvcnQoRVJST1IsCiAgCQkJCQkoZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJTEVf Rk9STUFUKSwKISAJCQkJICAgZXJybXNnKCJpbnZhbGlkIENPUFkgZmlsZSBoZWFkZXIgKG1p c3NpbmcgbGVuZ3RoKSIpKSk7CiEgCQkvKiBTa2lwIGV4dGVuc2lvbiBoZWFkZXIsIGlmIHBy ZXNlbnQgKi8KICAJCXdoaWxlICh0bXAtLSA+IDApCiAgCQl7CiAgCQkJQ29weUdldERhdGEo cmVhZFNpZywgMSk7CiAgCQkJaWYgKENvcHlHZXRFb2YoKSkKICAJCQkJZXJlcG9ydChFUlJP UiwKICAJCQkJCQkoZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJTEVfRk9STUFUKSwKISAJ CQkJCSBlcnJtc2coImludmFsaWQgQ09QWSBmaWxlIGhlYWRlciAod3JvbmcgbGVuZ3RoKSIp KSk7CiAgCQl9CiAgCX0KICAKICAJaWYgKGZpbGVfaGFzX29pZHMgJiYgYmluYXJ5KQogIAl7 CiEgCQlnZXRUeXBlQmluYXJ5SW5wdXRJbmZvKE9JRE9JRCwKISAJCQkJCQkJICAgJmluX2Z1 bmNfb2lkLCAmb2lkX3R5cGlvcGFyYW0pOwogIAkJZm1ncl9pbmZvKGluX2Z1bmNfb2lkLCAm b2lkX2luX2Z1bmN0aW9uKTsKICAJfQogIAogIAl2YWx1ZXMgPSAoRGF0dW0gKikgcGFsbG9j KG51bV9waHlzX2F0dHJzICogc2l6ZW9mKERhdHVtKSk7CiAgCW51bGxzID0gKGNoYXIgKikg cGFsbG9jKG51bV9waHlzX2F0dHJzICogc2l6ZW9mKGNoYXIpKTsKICAKISAJLyogTWFrZSBy b29tIGZvciBhIFBBUkFNX0VYRUMgdmFsdWUgZm9yIGRvbWFpbiBjb25zdHJhaW50IGNoZWNr cyAqLwogIAlpZiAoaGFzQ29uc3RyYWludHMpCiAgCQllY29udGV4dC0+ZWN4dF9wYXJhbV9l eGVjX3ZhbHMgPSAoUGFyYW1FeGVjRGF0YSAqKQogIAkJCXBhbGxvYzAoc2l6ZW9mKFBhcmFt RXhlY0RhdGEpKTsKICAKISAJLyogSW5pdGlhbGl6ZSBzdGF0aWMgdmFyaWFibGVzICovCiAg CWZlX2VvZiA9IGZhbHNlOwogIAllb2xfdHlwZSA9IEVPTF9VTktOT1dOOwogIAljb3B5X2Jp bmFyeSA9IGJpbmFyeTsKLS0tIDE4OTYsMTk0MyAtLS0tCiAgCQlpZiAoKHRtcCA+PiAxNikg IT0gMCkKICAJCQllcmVwb3J0KEVSUk9SLAogIAkJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURf Q09QWV9GSUxFX0ZPUk1BVCksCiEgCQkJCQkgZXJybXNnCiEgCQkJCQkgKCJ1bnJlY29nbml6 ZWQgY3JpdGljYWwgZmxhZ3MgaW4gQ09QWSBmaWxlIGhlYWRlciIpKSk7CiEgCQkvKgohIAkJ ICogSGVhZGVyIGV4dGVuc2lvbiBsZW5ndGgKISAJCSAqLwogIAkJdG1wID0gQ29weUdldElu dDMyKCk7CiAgCQlpZiAoQ29weUdldEVvZigpIHx8IHRtcCA8IDApCiAgCQkJZXJlcG9ydChF UlJPUiwKICAJCQkJCShlcnJjb2RlKEVSUkNPREVfQkFEX0NPUFlfRklMRV9GT1JNQVQpLAoh IAkJCQkJIGVycm1zZygiaW52YWxpZCBDT1BZIGZpbGUgaGVhZGVyIChtaXNzaW5nIGxlbmd0 aCkiKSkpOwohIAkJLyoKISAJCSAqIFNraXAgZXh0ZW5zaW9uIGhlYWRlciwgaWYgcHJlc2Vu dAohIAkJICovCiAgCQl3aGlsZSAodG1wLS0gPiAwKQogIAkJewogIAkJCUNvcHlHZXREYXRh KHJlYWRTaWcsIDEpOwogIAkJCWlmIChDb3B5R2V0RW9mKCkpCiAgCQkJCWVyZXBvcnQoRVJS T1IsCiAgCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxFX0ZPUk1BVCksCiEg CQkJCQkJIGVycm1zZygiaW52YWxpZCBDT1BZIGZpbGUgaGVhZGVyICh3cm9uZyBsZW5ndGgp IikpKTsKICAJCX0KICAJfQogIAogIAlpZiAoZmlsZV9oYXNfb2lkcyAmJiBiaW5hcnkpCiAg CXsKISAJCWdldFR5cGVCaW5hcnlJbnB1dEluZm8oT0lET0lELCAmaW5fZnVuY19vaWQsICZv aWRfdHlwaW9wYXJhbSk7CiAgCQlmbWdyX2luZm8oaW5fZnVuY19vaWQsICZvaWRfaW5fZnVu Y3Rpb24pOwogIAl9CiAgCiAgCXZhbHVlcyA9IChEYXR1bSAqKSBwYWxsb2MobnVtX3BoeXNf YXR0cnMgKiBzaXplb2YoRGF0dW0pKTsKICAJbnVsbHMgPSAoY2hhciAqKSBwYWxsb2MobnVt X3BoeXNfYXR0cnMgKiBzaXplb2YoY2hhcikpOwogIAohIAkvKgohIAkgKiBNYWtlIHJvb20g Zm9yIGEgUEFSQU1fRVhFQyB2YWx1ZSBmb3IgZG9tYWluIGNvbnN0cmFpbnQgY2hlY2tzCiEg CSAqLwogIAlpZiAoaGFzQ29uc3RyYWludHMpCiAgCQllY29udGV4dC0+ZWN4dF9wYXJhbV9l eGVjX3ZhbHMgPSAoUGFyYW1FeGVjRGF0YSAqKQogIAkJCXBhbGxvYzAoc2l6ZW9mKFBhcmFt RXhlY0RhdGEpKTsKICAKISAJLyoKISAJICogSW5pdGlhbGl6ZSBzdGF0aWMgdmFyaWFibGVz CiEgCSAqLwogIAlmZV9lb2YgPSBmYWxzZTsKICAJZW9sX3R5cGUgPSBFT0xfVU5LTk9XTjsK ICAJY29weV9iaW5hcnkgPSBiaW5hcnk7CioqKioqKioqKioqKioqKgoqKiogMTY4NiwxNzAy ICoqKioKICAJY29weV9saW5lbm8gPSAwOwogIAljb3B5X2F0dG5hbWUgPSBOVUxMOwogIAoh IAkvKiBTZXQgdXAgY2FsbGJhY2sgdG8gaWRlbnRpZnkgZXJyb3IgbGluZSBudW1iZXIgKi8K ICAJZXJyY29udGV4dC5jYWxsYmFjayA9IGNvcHlfaW5fZXJyb3JfY2FsbGJhY2s7CiAgCWVy cmNvbnRleHQuYXJnID0gTlVMTDsKICAJZXJyY29udGV4dC5wcmV2aW91cyA9IGVycm9yX2Nv bnRleHRfc3RhY2s7CiAgCWVycm9yX2NvbnRleHRfc3RhY2sgPSAmZXJyY29udGV4dDsKICAK ISAJLyogb24gaW5wdXQganVzdCB0aHJvdyB0aGUgaGVhZGVyIGxpbmUgYXdheSAqLwogIAlp ZiAoaGVhZGVyX2xpbmUpCiAgCXsKICAJCWNvcHlfbGluZW5vKys7CiEgCQlkb25lID0gQ29w eVJlYWRMaW5lKHF1b3RlLCBlc2NhcGUpIDsKICAJfQogIAogIAl3aGlsZSAoIWRvbmUpCi0t LSAxOTQ1LDE5NjUgLS0tLQogIAljb3B5X2xpbmVubyA9IDA7CiAgCWNvcHlfYXR0bmFtZSA9 IE5VTEw7CiAgCiEgCS8qCiEgCSAqIFNldCB1cCBjYWxsYmFjayB0byBpZGVudGlmeSBlcnJv ciBsaW5lIG51bWJlcgohIAkgKi8KICAJZXJyY29udGV4dC5jYWxsYmFjayA9IGNvcHlfaW5f ZXJyb3JfY2FsbGJhY2s7CiAgCWVycmNvbnRleHQuYXJnID0gTlVMTDsKICAJZXJyY29udGV4 dC5wcmV2aW91cyA9IGVycm9yX2NvbnRleHRfc3RhY2s7CiAgCWVycm9yX2NvbnRleHRfc3Rh Y2sgPSAmZXJyY29udGV4dDsKICAKISAJLyoKISAJICogb24gaW5wdXQganVzdCB0aHJvdyB0 aGUgaGVhZGVyIGxpbmUgYXdheQohIAkgKi8KICAJaWYgKGhlYWRlcl9saW5lKQogIAl7CiAg CQljb3B5X2xpbmVubysrOwohIAkJZG9uZSA9IENvcHlSZWFkTGluZShxdW90ZSwgZXNjYXBl KTsKICAJfQogIAogIAl3aGlsZSAoIWRvbmUpCioqKioqKioqKioqKioqKgoqKiogMTcwOCwx NzIwICoqKioKICAKICAJCWNvcHlfbGluZW5vKys7CiAgCiEgCQkvKiBSZXNldCB0aGUgcGVy LXR1cGxlIGV4cHJjb250ZXh0ICovCiAgCQlSZXNldFBlclR1cGxlRXhwckNvbnRleHQoZXN0 YXRlKTsKICAKISAJCS8qIFN3aXRjaCBpbnRvIGl0cyBtZW1vcnkgY29udGV4dCAqLwogIAkJ TWVtb3J5Q29udGV4dFN3aXRjaFRvKEdldFBlclR1cGxlTWVtb3J5Q29udGV4dChlc3RhdGUp KTsKICAKISAJCS8qIEluaXRpYWxpemUgYWxsIHZhbHVlcyBmb3Igcm93IHRvIE5VTEwgKi8K ICAJCU1lbVNldCh2YWx1ZXMsIDAsIG51bV9waHlzX2F0dHJzICogc2l6ZW9mKERhdHVtKSk7 CiAgCQlNZW1TZXQobnVsbHMsICduJywgbnVtX3BoeXNfYXR0cnMgKiBzaXplb2YoY2hhcikp OwogIAotLS0gMTk3MSwxOTg5IC0tLS0KICAKICAJCWNvcHlfbGluZW5vKys7CiAgCiEgCQkv KgohIAkJICogUmVzZXQgdGhlIHBlci10dXBsZSBleHByY29udGV4dAohIAkJICovCiAgCQlS ZXNldFBlclR1cGxlRXhwckNvbnRleHQoZXN0YXRlKTsKICAKISAJCS8qCiEgCQkgKiBTd2l0 Y2ggaW50byBpdHMgbWVtb3J5IGNvbnRleHQKISAJCSAqLwogIAkJTWVtb3J5Q29udGV4dFN3 aXRjaFRvKEdldFBlclR1cGxlTWVtb3J5Q29udGV4dChlc3RhdGUpKTsKICAKISAJCS8qCiEg CQkgKiBJbml0aWFsaXplIGFsbCB2YWx1ZXMgZm9yIHJvdyB0byBOVUxMCiEgCQkgKi8KICAJ CU1lbVNldCh2YWx1ZXMsIDAsIG51bV9waHlzX2F0dHJzICogc2l6ZW9mKERhdHVtKSk7CiAg CQlNZW1TZXQobnVsbHMsICduJywgbnVtX3BoeXNfYXR0cnMgKiBzaXplb2YoY2hhcikpOwog IAoqKioqKioqKioqKioqKioKKioqIDE3MjQsMTczMSAqKioqCiAgCQkJY2hhcgkgICAqc3Ry aW5nOwogIAkJCUxpc3RDZWxsICAgKmN1cjsKICAKISAJCQkvKiBBY3R1YWxseSByZWFkIHRo ZSBsaW5lIGludG8gbWVtb3J5IGhlcmUgKi8KISAJCQlkb25lID0gY3N2X21vZGUgPyAKICAJ CQkJQ29weVJlYWRMaW5lKHF1b3RlLCBlc2NhcGUpIDogQ29weVJlYWRMaW5lKE5VTEwsIE5V TEwpOwogIAogIAkJCS8qCi0tLSAxOTkzLDIwMDIgLS0tLQogIAkJCWNoYXIJICAgKnN0cmlu ZzsKICAJCQlMaXN0Q2VsbCAgICpjdXI7CiAgCiEgCQkJLyoKISAJCQkgKiBBY3R1YWxseSBy ZWFkIHRoZSBsaW5lIGludG8gbWVtb3J5IGhlcmUKISAJCQkgKi8KISAJCQlkb25lID0gY3N2 X21vZGUgPwogIAkJCQlDb3B5UmVhZExpbmUocXVvdGUsIGVzY2FwZSkgOiBDb3B5UmVhZExp bmUoTlVMTCwgTlVMTCk7CiAgCiAgCQkJLyoKKioqKioqKioqKioqKioqCioqKiAxNzM5LDE3 NDUgKioqKgogIAogIAkJCWlmIChmaWxlX2hhc19vaWRzKQogIAkJCXsKISAJCQkJLyogY2Fu J3QgYmUgaW4gQ1NWIG1vZGUgaGVyZSAqLwogIAkJCQlzdHJpbmcgPSBDb3B5UmVhZEF0dHJp YnV0ZShkZWxpbSwgbnVsbF9wcmludCwKICAJCQkJCQkJCQkJICAgJnJlc3VsdCwgJmlzbnVs bCk7CiAgCi0tLSAyMDEwLDIwMTggLS0tLQogIAogIAkJCWlmIChmaWxlX2hhc19vaWRzKQog IAkJCXsKISAJCQkJLyoKISAJCQkJICogY2FuJ3QgYmUgaW4gQ1NWIG1vZGUgaGVyZSAKISAJ CQkJICovCiAgCQkJCXN0cmluZyA9IENvcHlSZWFkQXR0cmlidXRlKGRlbGltLCBudWxsX3By aW50LAogIAkJCQkJCQkJCQkgICAmcmVzdWx0LCAmaXNudWxsKTsKICAKKioqKioqKioqKioq KioqCioqKiAxNzUxLDE3NTcgKioqKgogIAkJCQl7CiAgCQkJCQljb3B5X2F0dG5hbWUgPSAi b2lkIjsKICAJCQkJCWxvYWRlZF9vaWQgPSBEYXR1bUdldE9iamVjdElkKERpcmVjdEZ1bmN0 aW9uQ2FsbDEob2lkaW4sCiEgCQkJCQkJCQkJCQkgICBDU3RyaW5nR2V0RGF0dW0oc3RyaW5n KSkpOwogIAkJCQkJaWYgKGxvYWRlZF9vaWQgPT0gSW52YWxpZE9pZCkKICAJCQkJCQllcmVw b3J0KEVSUk9SLAogIAkJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxFX0ZP Uk1BVCksCi0tLSAyMDI0LDIwMzEgLS0tLQogIAkJCQl7CiAgCQkJCQljb3B5X2F0dG5hbWUg PSAib2lkIjsKICAJCQkJCWxvYWRlZF9vaWQgPSBEYXR1bUdldE9iamVjdElkKERpcmVjdEZ1 bmN0aW9uQ2FsbDEob2lkaW4sCiEgCQkJCQkJCQkJCQkJCQkJCQkgIENTdHJpbmdHZXREYXR1 bQohIAkJCQkJCQkJCQkJCQkJCQkJICAoc3RyaW5nKSkpOwogIAkJCQkJaWYgKGxvYWRlZF9v aWQgPT0gSW52YWxpZE9pZCkKICAJCQkJCQllcmVwb3J0KEVSUk9SLAogIAkJCQkJCQkJKGVy cmNvZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxFX0ZPUk1BVCksCioqKioqKioqKioqKioqKgoq KiogMTc2MCwxNzY2ICoqKioKICAJCQkJfQogIAkJCX0KICAKISAJCQkvKiBMb29wIHRvIHJl YWQgdGhlIHVzZXIgYXR0cmlidXRlcyBvbiB0aGUgbGluZS4gKi8KICAJCQlmb3JlYWNoKGN1 ciwgYXR0bnVtbGlzdCkKICAJCQl7CiAgCQkJCWludAkJCWF0dG51bSA9IGxmaXJzdF9pbnQo Y3VyKTsKLS0tIDIwMzQsMjA0MiAtLS0tCiAgCQkJCX0KICAJCQl9CiAgCiEgCQkJLyoKISAJ CQkgKiBMb29wIHRvIHJlYWQgdGhlIHVzZXIgYXR0cmlidXRlcyBvbiB0aGUgbGluZS4KISAJ CQkgKi8KICAJCQlmb3JlYWNoKGN1ciwgYXR0bnVtbGlzdCkKICAJCQl7CiAgCQkJCWludAkJ CWF0dG51bSA9IGxmaXJzdF9pbnQoY3VyKTsKKioqKioqKioqKioqKioqCioqKiAxNzc5LDE3 ODkgKioqKgogIAkJCQlpZiAoY3N2X21vZGUpCiAgCQkJCXsKICAJCQkJCXN0cmluZyA9IENv cHlSZWFkQXR0cmlidXRlQ1NWKGRlbGltLCBudWxsX3ByaW50LCBxdW90ZSwKISAJCQkJCQkJ CQkJCSAgIGVzY2FwZSwgJnJlc3VsdCwgJmlzbnVsbCk7CiAgCQkJCQlpZiAocmVzdWx0ID09 IFVOVEVSTUlOQVRFRF9GSUVMRCkKICAJCQkJCQllcmVwb3J0KEVSUk9SLAogIAkJCQkJCQkJ KGVycmNvZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxFX0ZPUk1BVCksCiEgCQkJCQkJCSAgIGVy cm1zZygidW50ZXJtaW5hdGVkIENTViBxdW90ZWQgZmllbGQiKSkpOwogIAkJCQl9CiAgCQkJ CWVsc2UKICAJCQkJCXN0cmluZyA9IENvcHlSZWFkQXR0cmlidXRlKGRlbGltLCBudWxsX3By aW50LAotLS0gMjA1NSwyMDY1IC0tLS0KICAJCQkJaWYgKGNzdl9tb2RlKQogIAkJCQl7CiAg CQkJCQlzdHJpbmcgPSBDb3B5UmVhZEF0dHJpYnV0ZUNTVihkZWxpbSwgbnVsbF9wcmludCwg cXVvdGUsCiEgCQkJCQkJCQkJCQkJICBlc2NhcGUsICZyZXN1bHQsICZpc251bGwpOwogIAkJ CQkJaWYgKHJlc3VsdCA9PSBVTlRFUk1JTkFURURfRklFTEQpCiAgCQkJCQkJZXJlcG9ydChF UlJPUiwKICAJCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfQkFEX0NPUFlfRklMRV9GT1JNQVQp LAohIAkJCQkJCQkJIGVycm1zZygidW50ZXJtaW5hdGVkIENTViBxdW90ZWQgZmllbGQiKSkp OwogIAkJCQl9CiAgCQkJCWVsc2UKICAJCQkJCXN0cmluZyA9IENvcHlSZWFkQXR0cmlidXRl KGRlbGltLCBudWxsX3ByaW50LAoqKioqKioqKioqKioqKioKKioqIDE3OTUsMTgwOCAqKioq CiAgCQkJCQlpc251bGwgPSBmYWxzZTsKICAJCQkJfQogIAohIAkJCQkvKiB3ZSByZWFkIGFu IFNRTCBOVUxMLCBubyBuZWVkIHRvIGRvIGFueXRoaW5nICovCiAgCQkJCWlmICghaXNudWxs KQogIAkJCQl7CiAgCQkJCQljb3B5X2F0dG5hbWUgPSBOYW1lU3RyKGF0dHJbbV0tPmF0dG5h bWUpOwogIAkJCQkJdmFsdWVzW21dID0gRnVuY3Rpb25DYWxsMygmaW5fZnVuY3Rpb25zW21d LAogIAkJCQkJCQkJCQkJICBDU3RyaW5nR2V0RGF0dW0oc3RyaW5nKSwKISAJCQkJCQkJCQkJ T2JqZWN0SWRHZXREYXR1bSh0eXBpb3BhcmFtc1ttXSksCiEgCQkJCQkJCQkJICBJbnQzMkdl dERhdHVtKGF0dHJbbV0tPmF0dHR5cG1vZCkpOwogIAkJCQkJbnVsbHNbbV0gPSAnICc7CiAg CQkJCQljb3B5X2F0dG5hbWUgPSBOVUxMOwogIAkJCQl9Ci0tLSAyMDcxLDIwODcgLS0tLQog IAkJCQkJaXNudWxsID0gZmFsc2U7CiAgCQkJCX0KICAKISAJCQkJLyoKISAJCQkJICogd2Ug cmVhZCBhbiBTUUwgTlVMTCwgbm8gbmVlZCB0byBkbyBhbnl0aGluZwohIAkJCQkgKi8KICAJ CQkJaWYgKCFpc251bGwpCiAgCQkJCXsKICAJCQkJCWNvcHlfYXR0bmFtZSA9IE5hbWVTdHIo YXR0clttXS0+YXR0bmFtZSk7CiAgCQkJCQl2YWx1ZXNbbV0gPSBGdW5jdGlvbkNhbGwzKCZp bl9mdW5jdGlvbnNbbV0sCiAgCQkJCQkJCQkJCQkgIENTdHJpbmdHZXREYXR1bShzdHJpbmcp LAohIAkJCQkJCQkJCQkJICBPYmplY3RJZEdldERhdHVtKHR5cGlvcGFyYW1zW21dKSwKISAJ CQkJCQkJCQkJCSAgSW50MzJHZXREYXR1bShhdHRyW21dLT4KISAJCQkJCQkJCQkJCQkJCQlh dHR0eXBtb2QpKTsKICAJCQkJCW51bGxzW21dID0gJyAnOwogIAkJCQkJY29weV9hdHRuYW1l ID0gTlVMTDsKICAJCQkJfQoqKioqKioqKioqKioqKioKKioqIDE4MTgsMTgyOCAqKioqCiAg CQkJaWYgKHJlc3VsdCA9PSBOT1JNQUxfQVRUUiAmJiBsaW5lX2J1Zi5sZW4gIT0gMCkKICAJ CQkJZXJlcG9ydChFUlJPUiwKICAJCQkJCQkoZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJ TEVfRk9STUFUKSwKISAJCQkJCSAgIGVycm1zZygiZXh0cmEgZGF0YSBhZnRlciBsYXN0IGV4 cGVjdGVkIGNvbHVtbiIpKSk7CiAgCQl9CiAgCQllbHNlCiAgCQl7CiEgCQkJLyogYmluYXJ5 ICovCiAgCQkJaW50MTYJCWZsZF9jb3VudDsKICAJCQlMaXN0Q2VsbCAgICpjdXI7CiAgCi0t LSAyMDk3LDIxMDkgLS0tLQogIAkJCWlmIChyZXN1bHQgPT0gTk9STUFMX0FUVFIgJiYgbGlu ZV9idWYubGVuICE9IDApCiAgCQkJCWVyZXBvcnQoRVJST1IsCiAgCQkJCQkJKGVycmNvZGUo RVJSQ09ERV9CQURfQ09QWV9GSUxFX0ZPUk1BVCksCiEgCQkJCQkJIGVycm1zZygiZXh0cmEg ZGF0YSBhZnRlciBsYXN0IGV4cGVjdGVkIGNvbHVtbiIpKSk7CiAgCQl9CiAgCQllbHNlCiAg CQl7CiEgCQkJLyoKISAJCQkgKiBiaW5hcnkKISAJCQkgKi8KICAJCQlpbnQxNgkJZmxkX2Nv dW50OwogIAkJCUxpc3RDZWxsICAgKmN1cjsKICAKKioqKioqKioqKioqKioqCioqKiAxODQ0 LDE4NTEgKioqKgogIAkJCQljb3B5X2F0dG5hbWUgPSAib2lkIjsKICAJCQkJbG9hZGVkX29p ZCA9CiAgCQkJCQlEYXR1bUdldE9iamVjdElkKENvcHlSZWFkQmluYXJ5QXR0cmlidXRlKDAs CiEgCQkJCQkJCQkJCQkJCQkmb2lkX2luX2Z1bmN0aW9uLAohIAkJCQkJCQkJCQkJCQkJICBv aWRfdHlwaW9wYXJhbSwKICAJCQkJCQkJCQkJCQkJCQkgJmlzbnVsbCkpOwogIAkJCQlpZiAo aXNudWxsIHx8IGxvYWRlZF9vaWQgPT0gSW52YWxpZE9pZCkKICAJCQkJCWVyZXBvcnQoRVJS T1IsCi0tLSAyMTI1LDIxMzIgLS0tLQogIAkJCQljb3B5X2F0dG5hbWUgPSAib2lkIjsKICAJ CQkJbG9hZGVkX29pZCA9CiAgCQkJCQlEYXR1bUdldE9iamVjdElkKENvcHlSZWFkQmluYXJ5 QXR0cmlidXRlKDAsCiEgCQkJCQkJCQkJCQkJCQkJICZvaWRfaW5fZnVuY3Rpb24sCiEgCQkJ CQkJCQkJCQkJCQkJIG9pZF90eXBpb3BhcmFtLAogIAkJCQkJCQkJCQkJCQkJCSAmaXNudWxs KSk7CiAgCQkJCWlmIChpc251bGwgfHwgbG9hZGVkX29pZCA9PSBJbnZhbGlkT2lkKQogIAkJ CQkJZXJlcG9ydChFUlJPUiwKKioqKioqKioqKioqKioqCioqKiAxODY0LDE4NzEgKioqKgog IAkJCQlpKys7CiAgCQkJCXZhbHVlc1ttXSA9IENvcHlSZWFkQmluYXJ5QXR0cmlidXRlKGks CiAgCQkJCQkJCQkJCQkJCSZpbl9mdW5jdGlvbnNbbV0sCiEgCQkJCQkJCQkJCQkJCXR5cGlv cGFyYW1zW21dLAohIAkJCQkJCQkJCQkJCQkmaXNudWxsKTsKICAJCQkJbnVsbHNbbV0gPSBp c251bGwgPyAnbicgOiAnICc7CiAgCQkJCWNvcHlfYXR0bmFtZSA9IE5VTEw7CiAgCQkJfQot LS0gMjE0NSwyMTUxIC0tLS0KICAJCQkJaSsrOwogIAkJCQl2YWx1ZXNbbV0gPSBDb3B5UmVh ZEJpbmFyeUF0dHJpYnV0ZShpLAogIAkJCQkJCQkJCQkJCQkmaW5fZnVuY3Rpb25zW21dLAoh IAkJCQkJCQkJCQkJCQl0eXBpb3BhcmFtc1ttXSwgJmlzbnVsbCk7CiAgCQkJCW51bGxzW21d ID0gaXNudWxsID8gJ24nIDogJyAnOwogIAkJCQljb3B5X2F0dG5hbWUgPSBOVUxMOwogIAkJ CX0KKioqKioqKioqKioqKioqCioqKiAxODg0LDE4OTAgKioqKgogIAkJCQludWxsc1tkZWZt YXBbaV1dID0gJyAnOwogIAkJfQogIAohIAkJLyogTmV4dCBhcHBseSBhbnkgZG9tYWluIGNv bnN0cmFpbnRzICovCiAgCQlpZiAoaGFzQ29uc3RyYWludHMpCiAgCQl7CiAgCQkJUGFyYW1F eGVjRGF0YSAqcHJtZGF0YSA9ICZlY29udGV4dC0+ZWN4dF9wYXJhbV9leGVjX3ZhbHNbMF07 Ci0tLSAyMTY0LDIxNzIgLS0tLQogIAkJCQludWxsc1tkZWZtYXBbaV1dID0gJyAnOwogIAkJ fQogIAohIAkJLyoKISAJCSAqIE5leHQgYXBwbHkgYW55IGRvbWFpbiBjb25zdHJhaW50cwoh IAkJICovCiAgCQlpZiAoaGFzQ29uc3RyYWludHMpCiAgCQl7CiAgCQkJUGFyYW1FeGVjRGF0 YSAqcHJtZGF0YSA9ICZlY29udGV4dC0+ZWN4dF9wYXJhbV9leGVjX3ZhbHNbMF07CioqKioq KioqKioqKioqKgoqKiogMTg5NiwxOTAyICoqKioKICAJCQkJaWYgKGV4cHJzdGF0ZSA9PSBO VUxMKQogIAkJCQkJY29udGludWU7CS8qIG5vIGNvbnN0cmFpbnQgZm9yIHRoaXMgYXR0ciAq LwogIAohIAkJCQkvKiBJbnNlcnQgY3VycmVudCByb3cncyB2YWx1ZSBpbnRvIHRoZSBQYXJh bSB2YWx1ZSAqLwogIAkJCQlwcm1kYXRhLT52YWx1ZSA9IHZhbHVlc1tpXTsKICAJCQkJcHJt ZGF0YS0+aXNudWxsID0gKG51bGxzW2ldID09ICduJyk7CiAgCi0tLSAyMTc4LDIxODYgLS0t LQogIAkJCQlpZiAoZXhwcnN0YXRlID09IE5VTEwpCiAgCQkJCQljb250aW51ZTsJLyogbm8g Y29uc3RyYWludCBmb3IgdGhpcyBhdHRyICovCiAgCiEgCQkJCS8qCiEgCQkJCSAqIEluc2Vy dCBjdXJyZW50IHJvdydzIHZhbHVlIGludG8gdGhlIFBhcmFtIHZhbHVlIAohIAkJCQkgKi8K ICAJCQkJcHJtZGF0YS0+dmFsdWUgPSB2YWx1ZXNbaV07CiAgCQkJCXBybWRhdGEtPmlzbnVs bCA9IChudWxsc1tpXSA9PSAnbicpOwogIAoqKioqKioqKioqKioqKioKKioqIDE5MDUsMTky OCAqKioqCiAgCQkJCSAqIGV4cHJlc3Npb24gdG8gcmVwbGFjZSB0aGUgdmFsdWUgKGNvbnNp ZGVyIGUuZy4gYQogIAkJCQkgKiB0aW1lc3RhbXAgcHJlY2lzaW9uIHJlc3RyaWN0aW9uKS4K ICAJCQkJICovCiEgCQkJCXZhbHVlc1tpXSA9IEV4ZWNFdmFsRXhwcihleHByc3RhdGUsIGVj b250ZXh0LAohIAkJCQkJCQkJCQkgJmlzbnVsbCwgTlVMTCk7CiAgCQkJCW51bGxzW2ldID0g aXNudWxsID8gJ24nIDogJyAnOwogIAkJCX0KICAJCX0KICAKISAJCS8qIEFuZCBub3cgd2Ug Y2FuIGZvcm0gdGhlIGlucHV0IHR1cGxlLiAqLwogIAkJdHVwbGUgPSBoZWFwX2Zvcm10dXBs ZSh0dXBEZXNjLCB2YWx1ZXMsIG51bGxzKTsKICAKICAJCWlmIChvaWRzICYmIGZpbGVfaGFz X29pZHMpCiAgCQkJSGVhcFR1cGxlU2V0T2lkKHR1cGxlLCBsb2FkZWRfb2lkKTsKICAKISAJ CS8qIFRyaWdnZXJzIGFuZCBzdHVmZiBuZWVkIHRvIGJlIGludm9rZWQgaW4gcXVlcnkgY29u dGV4dC4gKi8KICAJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjb250ZXh0KTsKICAKICAJ CXNraXBfdHVwbGUgPSBmYWxzZTsKICAKISAJCS8qIEJFRk9SRSBST1cgSU5TRVJUIFRyaWdn ZXJzICovCiAgCQlpZiAocmVzdWx0UmVsSW5mby0+cmlfVHJpZ0Rlc2MgJiYKICAJCQlyZXN1 bHRSZWxJbmZvLT5yaV9UcmlnRGVzYy0+bl9iZWZvcmVfcm93W1RSSUdHRVJfRVZFTlRfSU5T RVJUXSA+IDApCiAgCQl7Ci0tLSAyMTg5LDIyMTcgLS0tLQogIAkJCQkgKiBleHByZXNzaW9u IHRvIHJlcGxhY2UgdGhlIHZhbHVlIChjb25zaWRlciBlLmcuIGEKICAJCQkJICogdGltZXN0 YW1wIHByZWNpc2lvbiByZXN0cmljdGlvbikuCiAgCQkJCSAqLwohIAkJCQl2YWx1ZXNbaV0g PSBFeGVjRXZhbEV4cHIoZXhwcnN0YXRlLCBlY29udGV4dCwgJmlzbnVsbCwgTlVMTCk7CiAg CQkJCW51bGxzW2ldID0gaXNudWxsID8gJ24nIDogJyAnOwogIAkJCX0KICAJCX0KICAKISAJ CS8qCiEgCQkgKiBBbmQgbm93IHdlIGNhbiBmb3JtIHRoZSBpbnB1dCB0dXBsZS4KISAJCSAq LwogIAkJdHVwbGUgPSBoZWFwX2Zvcm10dXBsZSh0dXBEZXNjLCB2YWx1ZXMsIG51bGxzKTsK ICAKICAJCWlmIChvaWRzICYmIGZpbGVfaGFzX29pZHMpCiAgCQkJSGVhcFR1cGxlU2V0T2lk KHR1cGxlLCBsb2FkZWRfb2lkKTsKICAKISAJCS8qCiEgCQkgKiBUcmlnZ2VycyBhbmQgc3R1 ZmYgbmVlZCB0byBiZSBpbnZva2VkIGluIHF1ZXJ5IGNvbnRleHQuCiEgCQkgKi8KICAJCU1l bW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjb250ZXh0KTsKICAKICAJCXNraXBfdHVwbGUgPSBm YWxzZTsKICAKISAJCS8qCiEgCQkgKiBCRUZPUkUgUk9XIElOU0VSVCBUcmlnZ2VycwohIAkJ ICovCiAgCQlpZiAocmVzdWx0UmVsSW5mby0+cmlfVHJpZ0Rlc2MgJiYKICAJCQlyZXN1bHRS ZWxJbmZvLT5yaV9UcmlnRGVzYy0+bl9iZWZvcmVfcm93W1RSSUdHRVJfRVZFTlRfSU5TRVJU XSA+IDApCiAgCQl7CioqKioqKioqKioqKioqKgoqKiogMTk0MSwxOTczICoqKioKICAKICAJ CWlmICghc2tpcF90dXBsZSkKICAJCXsKISAJCQkvKiBQbGFjZSB0dXBsZSBpbiB0dXBsZSBz bG90ICovCiAgCQkJRXhlY1N0b3JlVHVwbGUodHVwbGUsIHNsb3QsIEludmFsaWRCdWZmZXIs IGZhbHNlKTsKICAKISAJCQkvKiBDaGVjayB0aGUgY29uc3RyYWludHMgb2YgdGhlIHR1cGxl ICovCiAgCQkJaWYgKHJlbC0+cmRfYXR0LT5jb25zdHIpCiAgCQkJCUV4ZWNDb25zdHJhaW50 cyhyZXN1bHRSZWxJbmZvLCBzbG90LCBlc3RhdGUpOwogIAohIAkJCS8qIE9LLCBzdG9yZSB0 aGUgdHVwbGUgYW5kIGNyZWF0ZSBpbmRleCBlbnRyaWVzIGZvciBpdCAqLwogIAkJCXNpbXBs ZV9oZWFwX2luc2VydChyZWwsIHR1cGxlKTsKICAKICAJCQlpZiAocmVzdWx0UmVsSW5mby0+ cmlfTnVtSW5kaWNlcyA+IDApCiAgCQkJCUV4ZWNJbnNlcnRJbmRleFR1cGxlcyhzbG90LCAm KHR1cGxlLT50X3NlbGYpLCBlc3RhdGUsIGZhbHNlKTsKICAKISAJCQkvKiBBRlRFUiBST1cg SU5TRVJUIFRyaWdnZXJzICovCiAgCQkJRXhlY0FSSW5zZXJ0VHJpZ2dlcnMoZXN0YXRlLCBy ZXN1bHRSZWxJbmZvLCB0dXBsZSk7CiAgCQl9CiAgCX0KICAKISAJLyogRG9uZSwgY2xlYW4g dXAgKi8KICAJZXJyb3JfY29udGV4dF9zdGFjayA9IGVycmNvbnRleHQucHJldmlvdXM7CiAg CiAgCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjb250ZXh0KTsKICAKISAJLyogRXhlY3V0 ZSBBRlRFUiBTVEFURU1FTlQgaW5zZXJ0aW9uIHRyaWdnZXJzICovCiAgCUV4ZWNBU0luc2Vy dFRyaWdnZXJzKGVzdGF0ZSwgcmVzdWx0UmVsSW5mbyk7CiAgCiEgCS8qIEhhbmRsZSBxdWV1 ZWQgQUZURVIgdHJpZ2dlcnMgKi8KICAJQWZ0ZXJUcmlnZ2VyRW5kUXVlcnkoZXN0YXRlKTsK ICAKICAJcGZyZWUodmFsdWVzKTsKLS0tIDIyMzAsMjI3NiAtLS0tCiAgCiAgCQlpZiAoIXNr aXBfdHVwbGUpCiAgCQl7CiEgCQkJLyoKISAJCQkgKiBQbGFjZSB0dXBsZSBpbiB0dXBsZSBz bG90CiEgCQkJICovCiAgCQkJRXhlY1N0b3JlVHVwbGUodHVwbGUsIHNsb3QsIEludmFsaWRC dWZmZXIsIGZhbHNlKTsKICAKISAJCQkvKgohIAkJCSAqIENoZWNrIHRoZSBjb25zdHJhaW50 cyBvZiB0aGUgdHVwbGUKISAJCQkgKi8KICAJCQlpZiAocmVsLT5yZF9hdHQtPmNvbnN0cikK ICAJCQkJRXhlY0NvbnN0cmFpbnRzKHJlc3VsdFJlbEluZm8sIHNsb3QsIGVzdGF0ZSk7CiAg CiEgCQkJLyoKISAJCQkgKiBPSywgc3RvcmUgdGhlIHR1cGxlIGFuZCBjcmVhdGUgaW5kZXgg ZW50cmllcyBmb3IgaXQKISAJCQkgKi8KICAJCQlzaW1wbGVfaGVhcF9pbnNlcnQocmVsLCB0 dXBsZSk7CiAgCiAgCQkJaWYgKHJlc3VsdFJlbEluZm8tPnJpX051bUluZGljZXMgPiAwKQog IAkJCQlFeGVjSW5zZXJ0SW5kZXhUdXBsZXMoc2xvdCwgJih0dXBsZS0+dF9zZWxmKSwgZXN0 YXRlLCBmYWxzZSk7CiAgCiEgCQkJLyoKISAJCQkgKiBBRlRFUiBST1cgSU5TRVJUIFRyaWdn ZXJzCiEgCQkJICovCiAgCQkJRXhlY0FSSW5zZXJ0VHJpZ2dlcnMoZXN0YXRlLCByZXN1bHRS ZWxJbmZvLCB0dXBsZSk7CiAgCQl9CiAgCX0KICAKISAJLyoKISAJICogRG9uZSwgY2xlYW4g dXAKISAJICovCiAgCWVycm9yX2NvbnRleHRfc3RhY2sgPSBlcnJjb250ZXh0LnByZXZpb3Vz OwogIAogIAlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY29udGV4dCk7CiAgCiEgCS8qCiEg CSAqIEV4ZWN1dGUgQUZURVIgU1RBVEVNRU5UIGluc2VydGlvbiB0cmlnZ2VycwohIAkgKi8K ICAJRXhlY0FTSW5zZXJ0VHJpZ2dlcnMoZXN0YXRlLCByZXN1bHRSZWxJbmZvKTsKICAKISAJ LyoKISAJICogSGFuZGxlIHF1ZXVlZCBBRlRFUiB0cmlnZ2VycwohIAkgKi8KICAJQWZ0ZXJU cmlnZ2VyRW5kUXVlcnkoZXN0YXRlKTsKICAKICAJcGZyZWUodmFsdWVzKTsKKioqKioqKioq KioqKioqCioqKiAxOTg3LDIwMTkgKioqKgogIAlGcmVlRXhlY3V0b3JTdGF0ZShlc3RhdGUp OwogIH0KICAKLSAKICAvKgohICAqIFJlYWQgdGhlIG5leHQgaW5wdXQgbGluZSBhbmQgc3Rh c2ggaXQgaW4gbGluZV9idWYsIHdpdGggY29udmVyc2lvbiB0bwohICAqIHNlcnZlciBlbmNv ZGluZy4KISAgKgohICAqIFJlc3VsdCBpcyB0cnVlIGlmIHJlYWQgd2FzIHRlcm1pbmF0ZWQg YnkgRU9GLCBmYWxzZSBpZiB0ZXJtaW5hdGVkCiEgICogYnkgbmV3bGluZS4KICAgKi8KISBz dGF0aWMgYm9vbAohIENvcHlSZWFkTGluZShjaGFyICogcXVvdGUsIGNoYXIgKiBlc2NhcGUp CiAgewohIAlib29sCQlyZXN1bHQ7CiEgCWJvb2wJCWNoYW5nZV9lbmNvZGluZyA9IChjbGll bnRfZW5jb2RpbmcgIT0gc2VydmVyX2VuY29kaW5nKTsKISAJaW50CQkJYzsKISAJaW50CQkJ bWJsZW47CiEgCWludAkJCWo7CiAgCXVuc2lnbmVkIGNoYXIgc1syXTsKICAJY2hhcgkgICAq Y3Z0OwohIAlib29sICAgICAgICBpbl9xdW90ZSA9IGZhbHNlLCBsYXN0X3dhc19lc2MgPSBm YWxzZSwgY3N2X21vZGUgPSBmYWxzZTsKISAJY2hhciAgICAgICAgcXVvdGVjID0gJ1wwJywg ZXNjYXBlYyA9ICdcMCc7CiAgCiAgCWlmIChxdW90ZSkKICAJewogIAkJY3N2X21vZGUgPSB0 cnVlOwogIAkJcXVvdGVjID0gcXVvdGVbMF07CiAgCQllc2NhcGVjID0gZXNjYXBlWzBdOwoh IAkJLyogaWdub3JlIHNwZWNpYWwgZXNjYXBlIHByb2Nlc3NpbmcgaWYgaXQncyB0aGUgc2Ft ZSBhcyBxdW90ZWMgKi8KICAJCWlmIChxdW90ZWMgPT0gZXNjYXBlYykKICAJCQllc2NhcGVj ID0gJ1wwJzsKICAJfQotLS0gMjI5MCwyODUyIC0tLS0KICAJRnJlZUV4ZWN1dG9yU3RhdGUo ZXN0YXRlKTsKICB9CiAgCiAgLyoKISAgKiBDb3B5IEZST00gZmlsZSB0byByZWxhdGlvbiB3 aXRoIGZhc3RlciBwcm9jZXNzaW5nLgogICAqLwohIHN0YXRpYyB2b2lkCiEgQ29weUZyb21E ZWxpbWl0ZWQoUmVsYXRpb24gcmVsLCBMaXN0ICphdHRudW1saXN0LCBib29sIGJpbmFyeSwg Ym9vbCBvaWRzLAohIAkJCQkgIGNoYXIgKmRlbGltLCBjaGFyICpudWxsX3ByaW50LCBib29s IGNzdl9tb2RlLCBjaGFyICpxdW90ZSwKISAJCQkJICBjaGFyICplc2NhcGUsIExpc3QgKmZv cmNlX25vdG51bGxfYXR0cykKICB7CiEgCUhlYXBUdXBsZQl0dXBsZTsKISAJVHVwbGVEZXNj CXR1cERlc2M7CiEgCUZvcm1fcGdfYXR0cmlidXRlICphdHRyOwohIAlBdHRyTnVtYmVyCW51 bV9waHlzX2F0dHJzLAohIAkJCQlhdHRyX2NvdW50LAohIAkJCQludW1fZGVmYXVsdHM7CiEg CUZtZ3JJbmZvICAgKmluX2Z1bmN0aW9uczsKISAJT2lkCQkgICAqdHlwaW9wYXJhbXM7CiEg CUV4cHJTdGF0ZSAqKmNvbnN0cmFpbnRleHByczsKISAJYm9vbAkgICAqZm9yY2Vfbm90bnVs bDsKISAJYm9vbAkJaGFzQ29uc3RyYWludHMgPSBmYWxzZTsKISAJaW50CQkJYXR0bnVtOwoh IAlpbnQJCQlpOwohIAlPaWQJCQlpbl9mdW5jX29pZDsKISAJRGF0dW0JICAgKnZhbHVlczsK ISAJY2hhcgkgICAqbnVsbHM7CiEgCiEgCS8qCiEgCSAqIGFuIGFycmF5IG9mIG9mZnNldHMg aW50byBhdHRyX2J1ZiB0aGF0IHBvaW50IHRvIGJlZ2lubmluZyBvZiBhdHRyaWJ1dGVzCiEg CSAqLwohIAlpbnQJCSAgICphdHRyX29mZnNldHM7CiEgCWJvb2wJCWlzbnVsbDsKISAJaW50 CQkJbnVsbF9wcmludF9sZW47IC8qIGxlbmd0aCBvZiBudWxsIHByaW50ICovCiEgCVJlc3Vs dFJlbEluZm8gKnJlc3VsdFJlbEluZm87CiEgCUVTdGF0ZQkgICAqZXN0YXRlID0gQ3JlYXRl RXhlY3V0b3JTdGF0ZSgpOyAvKiBmb3IgRXhlY0NvbnN0cmFpbnRzKCkgKi8KISAJVHVwbGVU YWJsZVNsb3QgKnNsb3Q7CiEgCWJvb2wJCWZpbGVfaGFzX29pZHM7CiEgCWludAkJICAgKmRl Zm1hcDsKISAJRXhwclN0YXRlICoqZGVmZXhwcnM7CQkvKiBhcnJheSBvZiBkZWZhdWx0IGF0 dCBleHByZXNzaW9ucyAqLwohIAlFeHByQ29udGV4dCAqZWNvbnRleHQ7CQkvKiB1c2VkIGZv ciBFeGVjRXZhbEV4cHIgZm9yIGRlZmF1bHQgYXR0cyAqLwohIAlNZW1vcnlDb250ZXh0IG9s ZGNvbnRleHQgPSBDdXJyZW50TWVtb3J5Q29udGV4dDsKISAJRXJyb3JDb250ZXh0Q2FsbGJh Y2sgZXJyY29udGV4dDsKISAJYm9vbAkJbm9fbW9yZV9kYXRhOwohIAlDb3B5UmVhZFJlc3Vs dCByZXN1bHQ7CiEgCUxpc3RDZWxsICAgKmN1cjsKISAKISAKISAJdHVwRGVzYyA9IFJlbGF0 aW9uR2V0RGVzY3IocmVsKTsKISAJYXR0ciA9IHR1cERlc2MtPmF0dHJzOwohIAludW1fcGh5 c19hdHRycyA9IHR1cERlc2MtPm5hdHRzOwohIAlhdHRyX2NvdW50ID0gbGlzdF9sZW5ndGgo YXR0bnVtbGlzdCk7CiEgCW51bV9kZWZhdWx0cyA9IDA7CiEgCiEgCS8qCiEgCSAqIFdlIG5l ZWQgYSBSZXN1bHRSZWxJbmZvIHNvIHdlIGNhbiB1c2UgdGhlIHJlZ3VsYXIgZXhlY3V0b3In cwohIAkgKiBpbmRleC1lbnRyeS1tYWtpbmcgbWFjaGluZXJ5LiAgKFRoZXJlIHVzZWQgdG8g YmUgYSBodWdlIGFtb3VudCBvZgohIAkgKiBjb2RlIGhlcmUgdGhhdCBiYXNpY2FsbHkgZHVw bGljYXRlZCBleGVjVXRpbHMuYyAuLi4pCiEgCSAqLwohIAlyZXN1bHRSZWxJbmZvID0gbWFr ZU5vZGUoUmVzdWx0UmVsSW5mbyk7CiEgCiEgCXJlc3VsdFJlbEluZm8tPnJpX1JhbmdlVGFi bGVJbmRleCA9IDE7CQkvKiBkdW1teSAqLwohIAlyZXN1bHRSZWxJbmZvLT5yaV9SZWxhdGlv bkRlc2MgPSByZWw7CiEgCXJlc3VsdFJlbEluZm8tPnJpX1RyaWdEZXNjID0gQ29weVRyaWdn ZXJEZXNjKHJlbC0+dHJpZ2Rlc2MpOwohIAlpZiAocmVzdWx0UmVsSW5mby0+cmlfVHJpZ0Rl c2MpCiEgCQlyZXN1bHRSZWxJbmZvLT5yaV9UcmlnRnVuY3Rpb25zID0gKEZtZ3JJbmZvICop CiEgCQkJcGFsbG9jMChyZXN1bHRSZWxJbmZvLT5yaV9UcmlnRGVzYy0+bnVtdHJpZ2dlcnMg KgohIAkJCQkJc2l6ZW9mKEZtZ3JJbmZvKSk7CiEgCXJlc3VsdFJlbEluZm8tPnJpX1RyaWdJ bnN0cnVtZW50ID0gTlVMTDsKISAKISAJRXhlY09wZW5JbmRpY2VzKHJlc3VsdFJlbEluZm8p OwohIAohIAllc3RhdGUtPmVzX3Jlc3VsdF9yZWxhdGlvbnMgPSByZXN1bHRSZWxJbmZvOwoh IAllc3RhdGUtPmVzX251bV9yZXN1bHRfcmVsYXRpb25zID0gMTsKISAJZXN0YXRlLT5lc19y ZXN1bHRfcmVsYXRpb25faW5mbyA9IHJlc3VsdFJlbEluZm87CiEgCiEgCS8qCiEgCSAqIFNl dCB1cCBhIHR1cGxlIHNsb3QgdG9vCiEgCSAqLwohIAlzbG90ID0gTWFrZVNpbmdsZVR1cGxl VGFibGVTbG90KHR1cERlc2MpOwohIAohIAllY29udGV4dCA9IEdldFBlclR1cGxlRXhwckNv bnRleHQoZXN0YXRlKTsKISAKISAJLyoKISAJICogUGljayB1cCB0aGUgcmVxdWlyZWQgY2F0 YWxvZyBpbmZvcm1hdGlvbiBmb3IgZWFjaCBhdHRyaWJ1dGUgaW4gdGhlCiEgCSAqIHJlbGF0 aW9uLCBpbmNsdWRpbmcgdGhlIGlucHV0IGZ1bmN0aW9uLCB0aGUgZWxlbWVudCB0eXBlICh0 byBwYXNzCiEgCSAqIHRvIHRoZSBpbnB1dCBmdW5jdGlvbiksIGFuZCBpbmZvIGFib3V0IGRl ZmF1bHRzIGFuZCBjb25zdHJhaW50cy4KISAJICogKFdoaWNoIGlucHV0IGZ1bmN0aW9uIHdl IHVzZSBkZXBlbmRzIG9uIHRleHQvYmluYXJ5IGZvcm1hdCBjaG9pY2UuKQohIAkgKi8KISAJ aW5fZnVuY3Rpb25zID0gKEZtZ3JJbmZvICopIHBhbGxvYyhudW1fcGh5c19hdHRycyAqIHNp emVvZihGbWdySW5mbykpOwohIAl0eXBpb3BhcmFtcyA9IChPaWQgKikgcGFsbG9jKG51bV9w aHlzX2F0dHJzICogc2l6ZW9mKE9pZCkpOwohIAlkZWZtYXAgPSAoaW50ICopIHBhbGxvYyhu dW1fcGh5c19hdHRycyAqIHNpemVvZihpbnQpKTsKISAJZGVmZXhwcnMgPSAoRXhwclN0YXRl ICoqKSBwYWxsb2MobnVtX3BoeXNfYXR0cnMgKiBzaXplb2YoRXhwclN0YXRlICopKTsKISAJ Y29uc3RyYWludGV4cHJzID0KISAJCShFeHByU3RhdGUgKiopIHBhbGxvYzAobnVtX3BoeXNf YXR0cnMgKiBzaXplb2YoRXhwclN0YXRlICopKTsKISAJZm9yY2Vfbm90bnVsbCA9IChib29s ICopIHBhbGxvYyhudW1fcGh5c19hdHRycyAqIHNpemVvZihib29sKSk7CiEgCiEgCWZvciAo YXR0bnVtID0gMTsgYXR0bnVtIDw9IG51bV9waHlzX2F0dHJzOyBhdHRudW0rKykKISAJewoh IAkJLyoKISAJCSAqIFdlIGRvbid0IG5lZWQgaW5mbyBmb3IgZHJvcHBlZCBhdHRyaWJ1dGVz IAohIAkJICovCiEgCQlpZiAoYXR0clthdHRudW0gLSAxXS0+YXR0aXNkcm9wcGVkKQohIAkJ CWNvbnRpbnVlOwohIAohIAkJZ2V0VHlwZUlucHV0SW5mbyhhdHRyW2F0dG51bSAtIDFdLT5h dHR0eXBpZCwKISAJCQkJCQkgJmluX2Z1bmNfb2lkLCAmdHlwaW9wYXJhbXNbYXR0bnVtIC0g MV0pOwohIAohIAkJZm1ncl9pbmZvKGluX2Z1bmNfb2lkLCAmaW5fZnVuY3Rpb25zW2F0dG51 bSAtIDFdKTsKISAKISAJCWlmIChsaXN0X21lbWJlcl9pbnQoZm9yY2Vfbm90bnVsbF9hdHRz LCBhdHRudW0pKQohIAkJCWZvcmNlX25vdG51bGxbYXR0bnVtIC0gMV0gPSB0cnVlOwohIAkJ ZWxzZQohIAkJCWZvcmNlX25vdG51bGxbYXR0bnVtIC0gMV0gPSBmYWxzZTsKISAKISAJCS8q CiEgCQkgKiBHZXQgZGVmYXVsdCBpbmZvIGlmIG5lZWRlZAohIAkJICovCiEgCQlpZiAoIWxp c3RfbWVtYmVyX2ludChhdHRudW1saXN0LCBhdHRudW0pKQohIAkJewohIAkJCS8qCiEgCQkJ ICogYXR0cmlidXRlIGlzIE5PVCB0byBiZSBjb3BpZWQgZnJvbSBpbnB1dAohIAkJCSAqLwoh IAkJCS8qCiEgCQkJICogdXNlIGRlZmF1bHQgdmFsdWUgaWYgb25lIGV4aXN0cwohIAkJCSAq LwohIAkJCU5vZGUJICAgKmRlZmV4cHIgPSBidWlsZF9jb2x1bW5fZGVmYXVsdChyZWwsIGF0 dG51bSk7CiEgCiEgCQkJaWYgKGRlZmV4cHIgIT0gTlVMTCkKISAJCQl7CiEgCQkJCWRlZmV4 cHJzW251bV9kZWZhdWx0c10gPSBFeGVjUHJlcGFyZUV4cHIoKEV4cHIgKikgZGVmZXhwciwK ISAJCQkJCQkJCQkJCQkJCSBlc3RhdGUpOwohIAkJCQlkZWZtYXBbbnVtX2RlZmF1bHRzXSA9 IGF0dG51bSAtIDE7CiEgCQkJCW51bV9kZWZhdWx0cysrOwohIAkJCX0KISAJCX0KISAKISAJ CS8qCiEgCQkgKiBJZiBpdCdzIGEgZG9tYWluIHR5cGUsIHNldCB1cCB0byBjaGVjayBkb21h aW4gY29uc3RyYWludHMgCiEgCQkgKi8KISAJCWlmIChnZXRfdHlwdHlwZShhdHRyW2F0dG51 bSAtIDFdLT5hdHR0eXBpZCkgPT0gJ2QnKQohIAkJewohIAkJCVBhcmFtCSAgICpwcm07CiEg CQkJTm9kZQkgICAqbm9kZTsKISAKISAJCQkvKgohIAkJCSAqIEVhc2llc3Qgd2F5IHRvIGRv IHRoaXMgaXMgdG8gdXNlIHBhcnNlX2NvZXJjZS5jIHRvIHNldCB1cAohIAkJCSAqIGFuIGV4 cHJlc3Npb24gdGhhdCBjaGVja3MgdGhlIGNvbnN0cmFpbnRzLiAgKEF0IHByZXNlbnQsCiEg CQkJICogdGhlIGV4cHJlc3Npb24gbWlnaHQgY29udGFpbiBhIGxlbmd0aC1jb2VyY2lvbi1m dW5jdGlvbgohIAkJCSAqIGNhbGwgYW5kL29yIENvZXJjZVRvRG9tYWluIG5vZGVzLikgIFRo ZSBib3R0b20gb2YgdGhlCiEgCQkJICogZXhwcmVzc2lvbiBpcyBhIFBhcmFtIG5vZGUgc28g dGhhdCB3ZSBjYW4gZmlsbCBpbiB0aGUKISAJCQkgKiBhY3R1YWwgZGF0dW0gZHVyaW5nIHRo ZSBkYXRhIGlucHV0IGxvb3AuCiEgCQkJICovCiEgCQkJcHJtID0gbWFrZU5vZGUoUGFyYW0p OwohIAohIAkJCXBybS0+cGFyYW1raW5kID0gUEFSQU1fRVhFQzsKISAJCQlwcm0tPnBhcmFt aWQgPSAwOwohIAkJCXBybS0+cGFyYW10eXBlID0gZ2V0QmFzZVR5cGUoYXR0clthdHRudW0g LSAxXS0+YXR0dHlwaWQpOwohIAohIAkJCW5vZGUgPSBjb2VyY2VfdG9fZG9tYWluKChOb2Rl ICopIHBybSwKISAJCQkJCQkJCQlwcm0tPnBhcmFtdHlwZSwKISAJCQkJCQkJCQlhdHRyW2F0 dG51bSAtIDFdLT5hdHR0eXBpZCwKISAJCQkJCQkJCQlDT0VSQ0VfSU1QTElDSVRfQ0FTVCwg ZmFsc2UsIGZhbHNlKTsKISAKISAJCQljb25zdHJhaW50ZXhwcnNbYXR0bnVtIC0gMV0gPQoh IAkJCQlFeGVjUHJlcGFyZUV4cHIoKEV4cHIgKikgbm9kZSwgZXN0YXRlKTsKISAJCQloYXND b25zdHJhaW50cyA9IHRydWU7CiEgCQl9CiEgCX0KISAKISAJLyoKISAJICogUHJlcGFyZSB0 byBjYXRjaCBBRlRFUiB0cmlnZ2Vycy4KISAJICovCiEgCUFmdGVyVHJpZ2dlckJlZ2luUXVl cnkoKTsKISAKISAJLyoKISAJICogQ2hlY2sgQkVGT1JFIFNUQVRFTUVOVCBpbnNlcnRpb24g dHJpZ2dlcnMuIEl0J3MgZGViYXRlYWJsZSB3aGV0aGVyCiEgCSAqIHdlIHNob3VsZCBkbyB0 aGlzIGZvciBDT1BZLCBzaW5jZSBpdCdzIG5vdCByZWFsbHkgYW4gIklOU0VSVCIKISAJICog c3RhdGVtZW50IGFzIHN1Y2guIEhvd2V2ZXIsIGV4ZWN1dGluZyB0aGVzZSB0cmlnZ2VycyBt YWludGFpbnMKISAJICogY29uc2lzdGVuY3kgd2l0aCB0aGUgRUFDSCBST1cgdHJpZ2dlcnMg dGhhdCB3ZSBhbHJlYWR5IGZpcmUgb24KISAJICogQ09QWS4KISAJICovCiEgCUV4ZWNCU0lu c2VydFRyaWdnZXJzKGVzdGF0ZSwgcmVzdWx0UmVsSW5mbyk7CiEgCiEgCWZpbGVfaGFzX29p ZHMgPSBvaWRzOwkJLyogbXVzdCByZWx5IG9uIHVzZXIgdG8gdGVsbCB1cyB0aGlzLi4uICov CiEgCiEgCXZhbHVlcyA9IChEYXR1bSAqKSBwYWxsb2MobnVtX3BoeXNfYXR0cnMgKiBzaXpl b2YoRGF0dW0pKTsKISAJbnVsbHMgPSAoY2hhciAqKSBwYWxsb2MobnVtX3BoeXNfYXR0cnMg KiBzaXplb2YoY2hhcikpOwohIAlhdHRyX29mZnNldHMgPSAoaW50ICopIHBhbGxvYyhudW1f cGh5c19hdHRycyAqIHNpemVvZihpbnQpKTsKISAKISAJLyoKISAJICogTWFrZSByb29tIGZv ciBhIFBBUkFNX0VYRUMgdmFsdWUgZm9yIGRvbWFpbiBjb25zdHJhaW50IGNoZWNrcwohIAkg Ki8KISAJaWYgKGhhc0NvbnN0cmFpbnRzKQohIAkJZWNvbnRleHQtPmVjeHRfcGFyYW1fZXhl Y192YWxzID0gKFBhcmFtRXhlY0RhdGEgKikKISAJCQlwYWxsb2MwKHNpemVvZihQYXJhbUV4 ZWNEYXRhKSk7CiEgCiEgCS8qCiEgCSAqIEluaXRpYWxpemUgc3RhdGljIHZhcmlhYmxlcwoh IAkgKi8KISAJZmVfZW9mID0gZmFsc2U7CiEgCWVvbF90eXBlID0gRU9MX1VOS05PV047CiEg CWNvcHlfYmluYXJ5ID0gYmluYXJ5OwohIAljb3B5X3JlbG5hbWUgPSBSZWxhdGlvbkdldFJl bGF0aW9uTmFtZShyZWwpOwohIAljb3B5X2xpbmVubyA9IDA7CiEgCWNvcHlfYXR0bmFtZSA9 IE5VTEw7CiEgCWxpbmVfYnVmX2NvbnZlcnRlZCA9IGZhbHNlOwohIAohIAkvKgohIAkgKiBp dCBpcyBNVUNIIGZhc3RlciB0byBkbyB0aGlzIG9uY2UgaGVyZSB0aGFuIGluIHRoZSBhdHRy aWJ1dGUgcGFyc2UgbG9vcAohIAkgKi8KISAJbnVsbF9wcmludF9sZW4gPSBzdHJsZW4obnVs bF9wcmludCk7CiEgCiEgCS8qCiEgCSAqIFNldCB1cCBjYWxsYmFjayB0byBpZGVudGlmeSBl cnJvciBsaW5lIG51bWJlcgohIAkgKi8KISAJZXJyY29udGV4dC5jYWxsYmFjayA9IGNvcHlf aW5fZXJyb3JfY2FsbGJhY2s7CiEgCWVycmNvbnRleHQuYXJnID0gTlVMTDsKISAJZXJyY29u dGV4dC5wcmV2aW91cyA9IGVycm9yX2NvbnRleHRfc3RhY2s7CiEgCWVycm9yX2NvbnRleHRf c3RhY2sgPSAmZXJyY29udGV4dDsKISAKISAJLyoKISAJICogU2V0IHVwIGRhdGEgYnVmZmVy IHRvIGhvbGQgYSBjaHVuayBvZiBkYXRhCiEgCSAqLwohIAlNZW1TZXQoaW5wdXRfYnVmLCAn ICcsIENPUFlfQlVGX1NJWkUgKiBzaXplb2YoY2hhcikpOwohIAlpbnB1dF9idWZbQ09QWV9C VUZfU0laRV0gPSAnXDAnOwohIAohIAlub19tb3JlX2RhdGEgPSBmYWxzZTsJCS8qIG5vIG1v cmUgaW5wdXQgZGF0YSB0byByZWFkIGZyb20gZmlsZSBvciBGRSAqLwohIAlsaW5lX2RvbmUg PSB0cnVlOwohIAohIAlkbwohIAl7CiEgCQkvKgohIAkJICogcmVhZCBhIGNodW5rIG9mIGRh dGEgaW50byB0aGUgYnVmZmVyCiEgCQkgKi8KISAJCXNpemVfdAkJYnl0ZXNyZWFkID0gQ29w eUdldERhdGEoaW5wdXRfYnVmLCBDT1BZX0JVRl9TSVpFKTsKISAKISAJCWJ1Zl9kb25lID0g ZmFsc2U7CiEgCiEgCQkvKgohIAkJICogc2V0IGJ1ZmZlciBwb2ludGVycyB0byBiZWdpbm5p bmcgb2YgdGhlIGJ1ZmZlcgohIAkJICovCiEgCQliZWdsb2MgPSBpbnB1dF9idWY7CiEgCQli dWZmZXJfaW5kZXggPSAwOwohIAohIAkJLyoKISAJCSAqIGNvbnRpbnVlIGlmIHNvbWUgYnl0 ZXMgd2VyZSByZWFkIG9yIGlmIHdlIGRpZG4ndCByZWFjaCBFT0YuIGlmIHdlIGJvdGggKgoh IAkJICogKiByZWFjaGVkIEVPRiBfYW5kXyBubyBieXRlcyB3ZXJlIHJlYWQsIHF1aXQgdGhl IGxvb3Agd2UgYXJlIGRvbmUKISAJCSAqLwohIAkJaWYgKGJ5dGVzcmVhZCA+IDAgfHwgIWZl X2VvZikKISAJCXsKISAKISAJCQl3aGlsZSAoIWJ1Zl9kb25lKQohIAkJCXsKISAJCQkJYm9v bAkJc2tpcF90dXBsZTsKISAJCQkJT2lkCQkJbG9hZGVkX29pZCA9IEludmFsaWRPaWQ7CiEg CiEgCQkJCUNIRUNLX0ZPUl9JTlRFUlJVUFRTKCk7CiEgCiEgCQkJCS8qCiEgCQkJCSAqIFJl c2V0IHRoZSBwZXItdHVwbGUgZXhwcmNvbnRleHQKISAJCQkJICovCiEgCQkJCVJlc2V0UGVy VHVwbGVFeHByQ29udGV4dChlc3RhdGUpOwohIAohIAkJCQkvKgohIAkJCQkgKiBTd2l0Y2gg aW50byBpdHMgbWVtb3J5IGNvbnRleHQKISAJCQkJICovCiEgCQkJCU1lbW9yeUNvbnRleHRT d2l0Y2hUbyhHZXRQZXJUdXBsZU1lbW9yeUNvbnRleHQoZXN0YXRlKSk7CiEgCiEgCQkJCS8q CiEgCQkJCSAqIEluaXRpYWxpemUgYWxsIHZhbHVlcyBmb3Igcm93IHRvIE5VTEwKISAJCQkJ ICovCiEgCQkJCU1lbVNldCh2YWx1ZXMsIDAsIG51bV9waHlzX2F0dHJzICogc2l6ZW9mKERh dHVtKSk7CiEgCQkJCU1lbVNldChudWxscywgJ24nLCBudW1fcGh5c19hdHRycyAqIHNpemVv ZihjaGFyKSk7CiEgCQkJCS8qCiEgCQkJCSAqIHJlc2V0IGF0dHJpYnV0ZSBwb2ludGVycwoh IAkJCQkgKi8KISAJCQkJTWVtU2V0KGF0dHJfb2Zmc2V0cywgMCwgbnVtX3BoeXNfYXR0cnMg KiBzaXplb2YoaW50KSk7CiEgCiEgCQkJCXJlc3VsdCA9IE5PUk1BTF9BVFRSOwohIAohIAkJ CQkvKgohIAkJCQkgKiBBY3R1YWxseSByZWFkIHRoZSBsaW5lIGludG8gbWVtb3J5IGhlcmUK ISAJCQkJICovCiEgCQkJCWxpbmVfZG9uZSA9IENvcHlSZWFkTGluZUJ1ZmZlcmVkKGJ5dGVz cmVhZCk7CiEgCQkJCWNvcHlfbGluZW5vKys7CiEgCiEgCQkJCS8qCiEgCQkJCSAqIGlmIGRp ZG4ndCBmaW5pc2ggcHJvY2Vzc2luZyBkYXRhIGxpbmUsIHNraXAgYXR0IHBhcnNpbmcgYW5k IHJlYWQgbW9yZSBkYXRhLAohIAkJCQkgKiAqIHVubGVzcyB0aGVyZSBpcyBubyBtb3JlIGRh dGEgdG8gcmVhZC4uLiAod2hpY2ggbWVhbnMgdGhhdCB0aGUgb3JpZ2luYWwgbGFzdAohIAkJ CQkgKiAqIGRhdGEgbGluZSBpcyBtaXNzaW5nIGF0dHJzIGFuZCB3ZSB3YW50IHRvIGNhdGNo IHRoYXQgZXJyb3IpCiEgCQkJCSAqLwohIAkJCQlpZiAoIWxpbmVfZG9uZSkKISAJCQkJewoh IAkJCQkJY29weV9saW5lbm8tLTsKISAJCQkJCWlmICghZmVfZW9mIHx8IGJ1Zl9kb25lKQoh IAkJCQkJCWJyZWFrOwohIAkJCQl9CiEgCiEgCQkJCWlmIChmaWxlX2hhc19vaWRzKQohIAkJ CQl7CiEgCQkJCQljaGFyCSAgICpvaWRfc3RyaW5nOwohIAohIAkJCQkJLyoKISAJCQkJCSAq IGNhbid0IGJlIGluIENTViBtb2RlIGhlcmUgCiEgCQkJCQkgKi8KISAJCQkJCW9pZF9zdHJp bmcgPQohIAkJCQkJCUNvcHlSZWFkT2lkQXR0cihkZWxpbSwgbnVsbF9wcmludCwgbnVsbF9w cmludF9sZW4sCiEgCQkJCQkJCQkJCSZyZXN1bHQsICZpc251bGwpOwohIAohIAkJCQkJaWYg KGlzbnVsbCkKISAJCQkJCQllcmVwb3J0KEVSUk9SLAohIAkJCQkJCQkJKGVycmNvZGUoRVJS Q09ERV9CQURfQ09QWV9GSUxFX0ZPUk1BVCksCiEgCQkJCQkJCQkgZXJybXNnKCJudWxsIE9J RCBpbiBDT1BZIGRhdGEiKSkpOwohIAkJCQkJZWxzZQohIAkJCQkJewohIAkJCQkJCWNvcHlf YXR0bmFtZSA9ICJvaWQiOwohIAkJCQkJCWxvYWRlZF9vaWQgPQohIAkJCQkJCQlEYXR1bUdl dE9iamVjdElkKERpcmVjdEZ1bmN0aW9uQ2FsbDEKISAJCQkJCQkJCQkJCSAob2lkaW4sCiEg CQkJCQkJCQkJCQkgIENTdHJpbmdHZXREYXR1bShvaWRfc3RyaW5nKSkpOwohIAkJCQkJCWlm IChsb2FkZWRfb2lkID09IEludmFsaWRPaWQpCiEgCQkJCQkJCWVyZXBvcnQoRVJST1IsCiEg CQkJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxFX0ZPUk1BVCksCiEgCQkJ CQkJCQkJIGVycm1zZygiaW52YWxpZCBPSUQgaW4gQ09QWSBkYXRhIikpKTsKISAJCQkJCQlj b3B5X2F0dG5hbWUgPSBOVUxMOwohIAkJCQkJfQohIAkJCQl9CiEgCiEgCQkJCS8qCiEgCQkJ CSAqIHBhcnNlIGFsbCB0aGUgYXR0cmlidXRlIGluIHRoZSBkYXRhIGxpbmUKISAJCQkJICov CiEgCQkJCUNvcHlSZWFkQWxsQXR0cnMoZGVsaW0sIG51bGxfcHJpbnQsIG51bGxfcHJpbnRf bGVuLAohIAkJCQkJCQkJIG51bGxzLCBhdHRudW1saXN0LCBhdHRyX29mZnNldHMsCiEgCQkJ CQkJCQkgbnVtX3BoeXNfYXR0cnMsIGF0dHIpOwohIAohIAkJCQkvKgohIAkJCQkgKiBMb29w IHRvIHJlYWQgdGhlIHVzZXIgYXR0cmlidXRlcyBvbiB0aGUgbGluZS4KISAJCQkJICovCiEg CQkJCWZvcmVhY2goY3VyLCBhdHRudW1saXN0KQohIAkJCQl7CiEgCQkJCQlpbnQJCQlhdHRu dW0gPSBsZmlyc3RfaW50KGN1cik7CiEgCQkJCQlpbnQJCQltID0gYXR0bnVtIC0gMTsKISAK ISAJCQkJCWlmIChudWxsc1ttXSA9PSAnICcpCiEgCQkJCQkJaXNudWxsID0gZmFsc2U7CiEg CQkJCQllbHNlCiEgCQkJCQkJaXNudWxsID0gdHJ1ZTsKISAKISAJCQkJCS8qCiEgCQkJCQkg KiB3ZSByZWFkIGFuIFNRTCBOVUxMLCBubyBuZWVkIHRvIGRvIGFueXRoaW5nCiEgCQkJCQkg Ki8KISAJCQkJCWlmICghaXNudWxsKQohIAkJCQkJewohIAkJCQkJCWNvcHlfYXR0bmFtZSA9 IE5hbWVTdHIoYXR0clttXS0+YXR0bmFtZSk7CiEgCQkJCQkJdmFsdWVzW21dID0gRnVuY3Rp b25DYWxsMygmaW5fZnVuY3Rpb25zW21dLAohIAkJCQkJCQkJCQkJCSAgQ1N0cmluZ0dldERh dHVtKGF0dHJfYnVmLgohIAkJCQkJCQkJCQkJCQkJCQkgIGRhdGEgKwohIAkJCQkJCQkJCQkJ CQkJCQkgIGF0dHJfb2Zmc2V0cwohIAkJCQkJCQkJCQkJCQkJCQkgIFttXSksCiEgCQkJCQkJ CQkJCQkJICBPYmplY3RJZEdldERhdHVtKHR5cGlvcGFyYW1zCiEgCQkJCQkJCQkJCQkJCQkJ CSAgIFttXSksCiEgCQkJCQkJCQkJCQkJICBJbnQzMkdldERhdHVtKGF0dHJbbV0tPgohIAkJ CQkJCQkJCQkJCQkJCQlhdHR0eXBtb2QpKTsKISAJCQkJCQljb3B5X2F0dG5hbWUgPSBOVUxM OwohIAkJCQkJfQohIAkJCQl9CiEgCiEgCQkJCS8qCiEgCQkJCSAqIE5vdyBjb21wdXRlIGFu ZCBpbnNlcnQgYW55IGRlZmF1bHRzIGF2YWlsYWJsZSBmb3IgdGhlIGNvbHVtbnMKISAJCQkJ ICogbm90IHByb3ZpZGVkIGJ5IHRoZSBpbnB1dCBkYXRhLglBbnl0aGluZyBub3QgcHJvY2Vz c2VkIGhlcmUgb3IKISAJCQkJICogYWJvdmUgd2lsbCByZW1haW4gTlVMTC4KISAJCQkJICov CiEgCQkJCWZvciAoaSA9IDA7IGkgPCBudW1fZGVmYXVsdHM7IGkrKykKISAJCQkJewohIAkJ CQkJdmFsdWVzW2RlZm1hcFtpXV0gPQohIAkJCQkJCUV4ZWNFdmFsRXhwcihkZWZleHByc1tp XSwgZWNvbnRleHQsICZpc251bGwsIE5VTEwpOwohIAkJCQkJaWYgKCFpc251bGwpCiEgCQkJ CQkJbnVsbHNbZGVmbWFwW2ldXSA9ICcgJzsKISAJCQkJfQohIAohIAkJCQkvKgohIAkJCQkg KiBOZXh0IGFwcGx5IGFueSBkb21haW4gY29uc3RyYWludHMKISAJCQkJICovCiEgCQkJCWlm IChoYXNDb25zdHJhaW50cykKISAJCQkJewohIAkJCQkJUGFyYW1FeGVjRGF0YSAqcHJtZGF0 YSA9CiEgCQkJCQkJJmVjb250ZXh0LT5lY3h0X3BhcmFtX2V4ZWNfdmFsc1swXTsKISAKISAJ CQkJCWZvciAoaSA9IDA7IGkgPCBudW1fcGh5c19hdHRyczsgaSsrKQohIAkJCQkJewohIAkJ CQkJCUV4cHJTdGF0ZSAgKmV4cHJzdGF0ZSA9IGNvbnN0cmFpbnRleHByc1tpXTsKISAKISAJ CQkJCQlpZiAoZXhwcnN0YXRlID09IE5VTEwpCiEgCQkJCQkJCWNvbnRpbnVlOwkvKiBubyBj b25zdHJhaW50IGZvciB0aGlzIGF0dHIgKi8KISAKISAJCQkJCQkvKgohIAkJCQkJCSAqIElu c2VydCBjdXJyZW50IHJvdydzIHZhbHVlIGludG8gdGhlIFBhcmFtIHZhbHVlIAohIAkJCQkJ CSAqLwohIAkJCQkJCXBybWRhdGEtPnZhbHVlID0gdmFsdWVzW2ldOwohIAkJCQkJCXBybWRh dGEtPmlzbnVsbCA9IChudWxsc1tpXSA9PSAnbicpOwohIAohIAkJCQkJCS8qCiEgCQkJCQkJ ICogRXhlY3V0ZSB0aGUgY29uc3RyYWludCBleHByZXNzaW9uLiAgQWxsb3cgdGhlCiEgCQkJ CQkJICogZXhwcmVzc2lvbiB0byByZXBsYWNlIHRoZSB2YWx1ZSAoY29uc2lkZXIgZS5nLiBh CiEgCQkJCQkJICogdGltZXN0YW1wIHByZWNpc2lvbiByZXN0cmljdGlvbikuCiEgCQkJCQkJ ICovCiEgCQkJCQkJdmFsdWVzW2ldID0gRXhlY0V2YWxFeHByKGV4cHJzdGF0ZSwgZWNvbnRl eHQsCiEgCQkJCQkJCQkJCQkJICZpc251bGwsIE5VTEwpOwohIAkJCQkJCW51bGxzW2ldID0g aXNudWxsID8gJ24nIDogJyAnOwohIAkJCQkJfQohIAkJCQl9CiEgCiEgCQkJCS8qCiEgCQkJ CSAqIEFuZCBub3cgd2UgY2FuIGZvcm0gdGhlIGlucHV0IHR1cGxlLgohIAkJCQkgKi8KISAJ CQkJdHVwbGUgPSBoZWFwX2Zvcm10dXBsZSh0dXBEZXNjLCB2YWx1ZXMsIG51bGxzKTsKISAK ISAJCQkJaWYgKG9pZHMgJiYgZmlsZV9oYXNfb2lkcykKISAJCQkJCUhlYXBUdXBsZVNldE9p ZCh0dXBsZSwgbG9hZGVkX29pZCk7CiEgCiEgCQkJCS8qCiEgCQkJCSAqIFRyaWdnZXJzIGFu ZCBzdHVmZiBuZWVkIHRvIGJlIGludm9rZWQgaW4gcXVlcnkgY29udGV4dC4KISAJCQkJICov CiEgCQkJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjb250ZXh0KTsKISAKISAJCQkJc2tp cF90dXBsZSA9IGZhbHNlOwohIAohIAkJCQkvKgohIAkJCQkgKiBCRUZPUkUgUk9XIElOU0VS VCBUcmlnZ2VycwohIAkJCQkgKi8KISAJCQkJaWYgKHJlc3VsdFJlbEluZm8tPnJpX1RyaWdE ZXNjICYmCiEgCQkJCQlyZXN1bHRSZWxJbmZvLT5yaV9UcmlnRGVzYy0+CiEgCQkJCQluX2Jl Zm9yZV9yb3dbVFJJR0dFUl9FVkVOVF9JTlNFUlRdID4gMCkKISAJCQkJewohIAkJCQkJSGVh cFR1cGxlCW5ld3R1cGxlOwohIAohIAkJCQkJbmV3dHVwbGUgPQohIAkJCQkJCUV4ZWNCUklu c2VydFRyaWdnZXJzKGVzdGF0ZSwgcmVzdWx0UmVsSW5mbywgdHVwbGUpOwohIAohIAkJCQkJ aWYgKG5ld3R1cGxlID09IE5VTEwpCQkvKiAiZG8gbm90aGluZyIgKi8KISAJCQkJCQlza2lw X3R1cGxlID0gdHJ1ZTsKISAJCQkJCWVsc2UgaWYgKG5ld3R1cGxlICE9IHR1cGxlKSAvKiBt b2RpZmllZCBieSBUcmlnZ2VyKHMpICovCiEgCQkJCQl7CiEgCQkJCQkJaGVhcF9mcmVldHVw bGUodHVwbGUpOwohIAkJCQkJCXR1cGxlID0gbmV3dHVwbGU7CiEgCQkJCQl9CiEgCQkJCX0K ISAKISAJCQkJaWYgKCFza2lwX3R1cGxlKQohIAkJCQl7CiEgCQkJCQkvKgohIAkJCQkJICog UGxhY2UgdHVwbGUgaW4gdHVwbGUgc2xvdAohIAkJCQkJICovCiEgCQkJCQlFeGVjU3RvcmVU dXBsZSh0dXBsZSwgc2xvdCwgSW52YWxpZEJ1ZmZlciwgZmFsc2UpOwohIAohIAkJCQkJLyoK ISAJCQkJCSAqIENoZWNrIHRoZSBjb25zdHJhaW50cyBvZiB0aGUgdHVwbGUKISAJCQkJCSAq LwohIAkJCQkJaWYgKHJlbC0+cmRfYXR0LT5jb25zdHIpCiEgCQkJCQkJRXhlY0NvbnN0cmFp bnRzKHJlc3VsdFJlbEluZm8sIHNsb3QsIGVzdGF0ZSk7CiEgCiEgCQkJCQkvKgohIAkJCQkJ ICogT0ssIHN0b3JlIHRoZSB0dXBsZSBhbmQgY3JlYXRlIGluZGV4IGVudHJpZXMgZm9yIGl0 CiEgCQkJCQkgKi8KISAJCQkJCXNpbXBsZV9oZWFwX2luc2VydChyZWwsIHR1cGxlKTsKISAK ISAJCQkJCWlmIChyZXN1bHRSZWxJbmZvLT5yaV9OdW1JbmRpY2VzID4gMCkKISAJCQkJCQlF eGVjSW5zZXJ0SW5kZXhUdXBsZXMoc2xvdCwgJih0dXBsZS0+dF9zZWxmKSwgZXN0YXRlLAoh IAkJCQkJCQkJCQkJICBmYWxzZSk7CiEgCiEgCQkJCQkvKgohIAkJCQkJICogQUZURVIgUk9X IElOU0VSVCBUcmlnZ2VycwohIAkJCQkJICovCiEgCQkJCQlFeGVjQVJJbnNlcnRUcmlnZ2Vy cyhlc3RhdGUsIHJlc3VsdFJlbEluZm8sIHR1cGxlKTsKISAJCQkJfQohIAohIAkJCQlsaW5l X2J1Zi5sZW4gPSAwOwkJLyogd2UgY2FuIHJlc2V0IGxpbmUgYnVmZmVyIG5vdy4gKi8KISAJ CQkJbGluZV9idWYuZGF0YVswXSA9ICdcMCc7CiEgCQkJCWxpbmVfYnVmLmN1cnNvciA9IDA7 CiEgCQkJfQkJCQkJLyogZW5kIHdoaWxlKCFidWZfZG9uZSkgKi8KISAJCX0JCQkJCQkvKiBl bmQgaWYgKGJ5dGVzcmVhZCA+IDAgfHwgIWZlX2VvZikgKi8KISAJCWVsc2UKISAJCQkvKgoh IAkJCSAqIG5vIGJ5dGVzIHJlYWQsIGVuZCBvZiBkYXRhCiEgCQkJICovCiEgCQl7CiEgCQkJ bm9fbW9yZV9kYXRhID0gVFJVRTsKISAJCX0KISAJfQohIAl3aGlsZSAoIW5vX21vcmVfZGF0 YSk7CiEgCiEgCS8qCiEgCSAqIERvbmUsIGNsZWFuIHVwCiEgCSAqLwohIAllcnJvcl9jb250 ZXh0X3N0YWNrID0gZXJyY29udGV4dC5wcmV2aW91czsKISAKISAJTWVtb3J5Q29udGV4dFN3 aXRjaFRvKG9sZGNvbnRleHQpOwohIAohIAkvKgohIAkgKiBFeGVjdXRlIEFGVEVSIFNUQVRF TUVOVCBpbnNlcnRpb24gdHJpZ2dlcnMKISAJICovCiEgCUV4ZWNBU0luc2VydFRyaWdnZXJz KGVzdGF0ZSwgcmVzdWx0UmVsSW5mbyk7CiEgCiEgCS8qCiEgCSAqIEhhbmRsZSBxdWV1ZWQg QUZURVIgdHJpZ2dlcnMKISAJICovCiEgCUFmdGVyVHJpZ2dlckVuZFF1ZXJ5KGVzdGF0ZSk7 CiEgCiEgCXBmcmVlKHZhbHVlcyk7CiEgCXBmcmVlKG51bGxzKTsKISAKISAJcGZyZWUoYXR0 cl9vZmZzZXRzKTsKISAKISAJcGZyZWUoaW5fZnVuY3Rpb25zKTsKISAJcGZyZWUodHlwaW9w YXJhbXMpOwohIAlwZnJlZShkZWZtYXApOwohIAlwZnJlZShkZWZleHBycyk7CiEgCXBmcmVl KGNvbnN0cmFpbnRleHBycyk7CiEgCXBmcmVlKGZvcmNlX25vdG51bGwpOwohIAohIAlFeGVj RHJvcFNpbmdsZVR1cGxlVGFibGVTbG90KHNsb3QpOwohIAohIAlFeGVjQ2xvc2VJbmRpY2Vz KHJlc3VsdFJlbEluZm8pOwohIAohIAlGcmVlRXhlY3V0b3JTdGF0ZShlc3RhdGUpOwohIH0K ISAKISAKISAvKgohICAqIFJlYWQgdGhlIG5leHQgaW5wdXQgbGluZSBhbmQgc3Rhc2ggaXQg aW4gbGluZV9idWYsIHdpdGggY29udmVyc2lvbiB0bwohICAqIHNlcnZlciBlbmNvZGluZy4K ISAgKgohICAqIFJlc3VsdCBpcyB0cnVlIGlmIHJlYWQgd2FzIHRlcm1pbmF0ZWQgYnkgRU9G LCBmYWxzZSBpZiB0ZXJtaW5hdGVkCiEgICogYnkgbmV3bGluZS4KISAgKi8KISBzdGF0aWMg Ym9vbAohIENvcHlSZWFkTGluZShjaGFyICpxdW90ZSwgY2hhciAqZXNjYXBlKQohIHsKISAJ Ym9vbAkJcmVzdWx0OwohIAlib29sCQljaGFuZ2VfZW5jb2RpbmcgPSAoY2xpZW50X2VuY29k aW5nICE9IHNlcnZlcl9lbmNvZGluZyk7CiEgCWludAkJCWM7CiEgCWludAkJCW1ibGVuOwoh IAlpbnQJCQlqOwogIAl1bnNpZ25lZCBjaGFyIHNbMl07CiAgCWNoYXIJICAgKmN2dDsKISAJ Ym9vbAkJaW5fcXVvdGUgPSBmYWxzZSwKISAJCWxhc3Rfd2FzX2VzYyA9IGZhbHNlLAohIAkJ Y3N2X21vZGUgPSBmYWxzZTsKISAJY2hhcgkJcXVvdGVjID0gJ1wwJywKISAJCWVzY2FwZWMg PSAnXDAnOwogIAogIAlpZiAocXVvdGUpCiAgCXsKICAJCWNzdl9tb2RlID0gdHJ1ZTsKICAJ CXF1b3RlYyA9IHF1b3RlWzBdOwogIAkJZXNjYXBlYyA9IGVzY2FwZVswXTsKISAJCS8qCiEg CQkgKiBpZ25vcmUgc3BlY2lhbCBlc2NhcGUgcHJvY2Vzc2luZyBpZiBpdCdzIHRoZSBzYW1l IGFzIHF1b3RlYyAKISAJCSAqLwogIAkJaWYgKHF1b3RlYyA9PSBlc2NhcGVjKQogIAkJCWVz Y2FwZWMgPSAnXDAnOwogIAl9CioqKioqKioqKioqKioqKgoqKiogMjAyMSwyMDUxICoqKioK ICAKICAJc1sxXSA9IDA7CiAgCiEgCS8qIHJlc2V0IGxpbmVfYnVmIHRvIGVtcHR5ICovCiAg CWxpbmVfYnVmLmxlbiA9IDA7CiAgCWxpbmVfYnVmLmRhdGFbMF0gPSAnXDAnOwogIAlsaW5l X2J1Zi5jdXJzb3IgPSAwOwogIAohIAkvKiBtYXJrIHRoYXQgZW5jb2RpbmcgY29udmVyc2lv biBoYXNuJ3Qgb2NjdXJyZWQgeWV0ICovCiAgCWxpbmVfYnVmX2NvbnZlcnRlZCA9IGZhbHNl OwogIAohIAkvKiBzZXQgZGVmYXVsdCBzdGF0dXMgKi8KICAJcmVzdWx0ID0gZmFsc2U7CiAg CiAgCS8qCiAgCSAqIEluIHRoaXMgbG9vcCB3ZSBvbmx5IGNhcmUgZm9yIGRldGVjdGluZyBu ZXdsaW5lcyAoXHIgYW5kL29yIFxuKSBhbmQKISAJICogdGhlIGVuZC1vZi1jb3B5IG1hcmtl ciAoXC4pLiAgCiAgCSAqCiAgCSAqIEluIFRleHQgbW9kZSwgZm9yIGJhY2t3YXJkcyBjb21w YXRpYmlsaXR5IHdlIGFsbG93CiAgCSAqIGJhY2tzbGFzaGVzIHRvIGVzY2FwZSBuZXdsaW5l IGNoYXJhY3RlcnMuICBCYWNrc2xhc2hlcyBvdGhlciB0aGFuCiAgCSAqIHRoZSBlbmQgbWFy a2VyIGdldCBwdXQgaW50byB0aGUgbGluZV9idWYsIHNpbmNlIENvcHlSZWFkQXR0cmlidXRl CiEgCSAqIGRvZXMgaXRzIG93biBlc2NhcGUgcHJvY2Vzc2luZy4JCiAgCSAqCiAgCSAqIElu IENTViBtb2RlLCBDUiBhbmQgTkwgaW5zaWRlIHEgcXVvdGVkIGZpZWxkIGFyZSBqdXN0IHBh cnQgb2YgdGhlCiAgCSAqIGRhdGEgdmFsdWUgYW5kIGFyZSBwdXQgaW4gbGluZV9idWYuIFdl IGtlZXAganVzdCBlbm91Z2ggc3RhdGUKICAJICogdG8ga25vdyBpZiB3ZSBhcmUgY3VycmVu dGx5IGluIGEgcXVvdGVkIGZpZWxkIG9yIG5vdC4KICAJICoKISAJICogVGhlc2UgZm91ciBj aGFyYWN0ZXJzLCBhbmQgb25seSB0aGVzZSBmb3VyLCBhcmUgYXNzdW1lZCB0aGUgc2FtZSBp biAKICAJICogZnJvbnRlbmQgYW5kIGJhY2tlbmQgZW5jb2RpbmdzLgogIAkgKgogIAkgKiBX ZSBkbyBub3QgYXNzdW1lIHRoYXQgc2Vjb25kIGFuZCBsYXRlciBieXRlcyBvZiBhIGZyb250 ZW5kCi0tLSAyODU0LDI4OTAgLS0tLQogIAogIAlzWzFdID0gMDsKICAKISAJLyoKISAJICog cmVzZXQgbGluZV9idWYgdG8gZW1wdHkKISAJICovCiAgCWxpbmVfYnVmLmxlbiA9IDA7CiAg CWxpbmVfYnVmLmRhdGFbMF0gPSAnXDAnOwogIAlsaW5lX2J1Zi5jdXJzb3IgPSAwOwogIAoh IAkvKgohIAkgKiBtYXJrIHRoYXQgZW5jb2RpbmcgY29udmVyc2lvbiBoYXNuJ3Qgb2NjdXJy ZWQgeWV0IAohIAkgKi8KICAJbGluZV9idWZfY29udmVydGVkID0gZmFsc2U7CiAgCiEgCS8q CiEgCSAqIHNldCBkZWZhdWx0IHN0YXR1cwohIAkgKi8KICAJcmVzdWx0ID0gZmFsc2U7CiAg CiAgCS8qCiAgCSAqIEluIHRoaXMgbG9vcCB3ZSBvbmx5IGNhcmUgZm9yIGRldGVjdGluZyBu ZXdsaW5lcyAoXHIgYW5kL29yIFxuKSBhbmQKISAJICogdGhlIGVuZC1vZi1jb3B5IG1hcmtl ciAoXC4pLgogIAkgKgogIAkgKiBJbiBUZXh0IG1vZGUsIGZvciBiYWNrd2FyZHMgY29tcGF0 aWJpbGl0eSB3ZSBhbGxvdwogIAkgKiBiYWNrc2xhc2hlcyB0byBlc2NhcGUgbmV3bGluZSBj aGFyYWN0ZXJzLiAgQmFja3NsYXNoZXMgb3RoZXIgdGhhbgogIAkgKiB0aGUgZW5kIG1hcmtl ciBnZXQgcHV0IGludG8gdGhlIGxpbmVfYnVmLCBzaW5jZSBDb3B5UmVhZEF0dHJpYnV0ZQoh IAkgKiBkb2VzIGl0cyBvd24gZXNjYXBlIHByb2Nlc3NpbmcuCiAgCSAqCiAgCSAqIEluIENT ViBtb2RlLCBDUiBhbmQgTkwgaW5zaWRlIHEgcXVvdGVkIGZpZWxkIGFyZSBqdXN0IHBhcnQg b2YgdGhlCiAgCSAqIGRhdGEgdmFsdWUgYW5kIGFyZSBwdXQgaW4gbGluZV9idWYuIFdlIGtl ZXAganVzdCBlbm91Z2ggc3RhdGUKICAJICogdG8ga25vdyBpZiB3ZSBhcmUgY3VycmVudGx5 IGluIGEgcXVvdGVkIGZpZWxkIG9yIG5vdC4KICAJICoKISAJICogVGhlc2UgZm91ciBjaGFy YWN0ZXJzLCBhbmQgb25seSB0aGVzZSBmb3VyLCBhcmUgYXNzdW1lZCB0aGUgc2FtZSBpbgog IAkgKiBmcm9udGVuZCBhbmQgYmFja2VuZCBlbmNvZGluZ3MuCiAgCSAqCiAgCSAqIFdlIGRv IG5vdCBhc3N1bWUgdGhhdCBzZWNvbmQgYW5kIGxhdGVyIGJ5dGVzIG9mIGEgZnJvbnRlbmQK KioqKioqKioqKioqKioqCioqKiAyMDYyLDIxMDggKioqKgogIAogIAkJaWYgKGNzdl9tb2Rl KQogIAkJewohIAkJCS8qICAKICAJCQkgKiBEZWFsaW5nIHdpdGggcXVvdGVzIGFuZCBlc2Nh cGVzIGhlcmUgaXMgbWlsZGx5IHRyaWNreS4gSWYgdGhlCiAgCQkJICogcXVvdGUgY2hhciBp cyBhbHNvIHRoZSBlc2NhcGUgY2hhciwgdGhlcmUncyBubyBwcm9ibGVtIC0gd2UgIAogIAkJ CSAqIGp1c3QgdXNlIHRoZSBjaGFyIGFzIGEgdG9nZ2xlLiBJZiB0aGV5IGFyZSBkaWZmZXJl bnQsIHdlIG5lZWQKICAJCQkgKiB0byBlbnN1cmUgdGhhdCB3ZSBvbmx5IHRha2UgYWNjb3Vu dCBvZiBhbiBlc2NhcGUgaW5zaWRlIGEgcXVvdGVkCiAgCQkJICogZmllbGQgYW5kIGltbWVk aWF0ZWx5IHByZWNlZGluZyBhIHF1b3RlIGNoYXIsIGFuZCBub3QgdGhlCiAgCQkJICogc2Vj b25kIGluIGEgZXNjYXBlLWVzY2FwZSBzZXF1ZW5jZS4KISAJCQkgKi8gCiAgCiAgCQkJaWYg KGluX3F1b3RlICYmIGMgPT0gZXNjYXBlYykKISAJCQkJbGFzdF93YXNfZXNjID0gISBsYXN0 X3dhc19lc2M7CiEgCQkJaWYgKGMgPT0gcXVvdGVjICYmICEgbGFzdF93YXNfZXNjKQohIAkJ CQlpbl9xdW90ZSA9ICEgaW5fcXVvdGU7CiAgCQkJaWYgKGMgIT0gZXNjYXBlYykKICAJCQkJ bGFzdF93YXNfZXNjID0gZmFsc2U7CiAgCiAgCQkJLyoKISAJCQkgKiB1cGRhdGluZyB0aGUg bGluZSBjb3VudCBmb3IgZW1iZWRkZWQgQ1IgYW5kL29yIExGIGNoYXJzIGlzIAohIAkJCSAq IG5lY2Vzc2FyaWx5IGEgbGl0dGxlIGZyYWdpbGUgLSB0aGlzIHRlc3QgaXMgcHJvYmFibHkg YWJvdXQgCiAgCQkJICogdGhlIGJlc3Qgd2UgY2FuIGRvLgohIAkJCSAqLyAKISAJCQlpZiAo aW5fcXVvdGUgJiYgYyA9PSAoZW9sX3R5cGUgPT0gRU9MX0NSID8gJ1xyJyA6ICdcbicpKSAK ISAJCQkJY29weV9saW5lbm8rKzsgCiAgCQl9CiAgCiAgCQlpZiAoIWluX3F1b3RlICYmIGMg PT0gJ1xyJykKICAJCXsKICAJCQlpZiAoZW9sX3R5cGUgPT0gRU9MX05MKQogIAkJCXsKISAJ CQkJaWYgKCEgY3N2X21vZGUpCiAgCQkJCQllcmVwb3J0KEVSUk9SLAogIAkJCQkJCQkoZXJy Y29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJTEVfRk9STUFUKSwKICAJCQkJCQkJIGVycm1zZygi bGl0ZXJhbCBjYXJyaWFnZSByZXR1cm4gZm91bmQgaW4gZGF0YSIpLAohIAkJCQkJCQkgZXJy aGludCgiVXNlIFwiXFxyXCIgdG8gcmVwcmVzZW50IGNhcnJpYWdlIHJldHVybi4iKSkpOwog IAkJCQllbHNlCiAgCQkJCQllcmVwb3J0KEVSUk9SLAogIAkJCQkJCQkoZXJyY29kZShFUlJD T0RFX0JBRF9DT1BZX0ZJTEVfRk9STUFUKSwKISAJCQkJCQkJIGVycm1zZygidW5xdW90ZWQg Y2FycmlhZ2UgcmV0dXJuIGZvdW5kIGluIENTViBkYXRhIiksCiEgCQkJCQkJCSBlcnJoaW50 KCJVc2UgcXVvdGVkIENTViBmaWVsZCB0byByZXByZXNlbnQgY2FycmlhZ2UgcmV0dXJuLiIp KSk7CiAgCQkJfQohIAkJCS8qIENoZWNrIGZvciBcclxuIG9uIGZpcnN0IGxpbmUsIF9hbmRf IGhhbmRsZSBcclxuLiAqLwogIAkJCWlmIChlb2xfdHlwZSA9PSBFT0xfVU5LTk9XTiB8fCBl b2xfdHlwZSA9PSBFT0xfQ1JOTCkKICAJCQl7CiAgCQkJCWludAkJCWMyID0gQ29weVBlZWtD aGFyKCk7Ci0tLSAyOTAxLDI5NTIgLS0tLQogIAogIAkJaWYgKGNzdl9tb2RlKQogIAkJewoh IAkJCS8qCiAgCQkJICogRGVhbGluZyB3aXRoIHF1b3RlcyBhbmQgZXNjYXBlcyBoZXJlIGlz IG1pbGRseSB0cmlja3kuIElmIHRoZQogIAkJCSAqIHF1b3RlIGNoYXIgaXMgYWxzbyB0aGUg ZXNjYXBlIGNoYXIsIHRoZXJlJ3Mgbm8gcHJvYmxlbSAtIHdlICAKICAJCQkgKiBqdXN0IHVz ZSB0aGUgY2hhciBhcyBhIHRvZ2dsZS4gSWYgdGhleSBhcmUgZGlmZmVyZW50LCB3ZSBuZWVk CiAgCQkJICogdG8gZW5zdXJlIHRoYXQgd2Ugb25seSB0YWtlIGFjY291bnQgb2YgYW4gZXNj YXBlIGluc2lkZSBhIHF1b3RlZAogIAkJCSAqIGZpZWxkIGFuZCBpbW1lZGlhdGVseSBwcmVj ZWRpbmcgYSBxdW90ZSBjaGFyLCBhbmQgbm90IHRoZQogIAkJCSAqIHNlY29uZCBpbiBhIGVz Y2FwZS1lc2NhcGUgc2VxdWVuY2UuCiEgCQkJICovCiAgCiAgCQkJaWYgKGluX3F1b3RlICYm IGMgPT0gZXNjYXBlYykKISAJCQkJbGFzdF93YXNfZXNjID0gIWxhc3Rfd2FzX2VzYzsKISAJ CQlpZiAoYyA9PSBxdW90ZWMgJiYgIWxhc3Rfd2FzX2VzYykKISAJCQkJaW5fcXVvdGUgPSAh aW5fcXVvdGU7CiAgCQkJaWYgKGMgIT0gZXNjYXBlYykKICAJCQkJbGFzdF93YXNfZXNjID0g ZmFsc2U7CiAgCiAgCQkJLyoKISAJCQkgKiB1cGRhdGluZyB0aGUgbGluZSBjb3VudCBmb3Ig ZW1iZWRkZWQgQ1IgYW5kL29yIExGIGNoYXJzIGlzCiEgCQkJICogbmVjZXNzYXJpbHkgYSBs aXR0bGUgZnJhZ2lsZSAtIHRoaXMgdGVzdCBpcyBwcm9iYWJseSBhYm91dAogIAkJCSAqIHRo ZSBiZXN0IHdlIGNhbiBkby4KISAJCQkgKi8KISAJCQlpZiAoaW5fcXVvdGUgJiYgYyA9PSAo ZW9sX3R5cGUgPT0gRU9MX0NSID8gJ1xyJyA6ICdcbicpKQohIAkJCQljb3B5X2xpbmVubysr OwogIAkJfQogIAogIAkJaWYgKCFpbl9xdW90ZSAmJiBjID09ICdccicpCiAgCQl7CiAgCQkJ aWYgKGVvbF90eXBlID09IEVPTF9OTCkKICAJCQl7CiEgCQkJCWlmICghY3N2X21vZGUpCiAg CQkJCQllcmVwb3J0KEVSUk9SLAogIAkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZ X0ZJTEVfRk9STUFUKSwKICAJCQkJCQkJIGVycm1zZygibGl0ZXJhbCBjYXJyaWFnZSByZXR1 cm4gZm91bmQgaW4gZGF0YSIpLAohIAkJCQkJCQkgZXJyaGludAohIAkJCQkJCQkgKCJVc2Ug XCJcXHJcIiB0byByZXByZXNlbnQgY2FycmlhZ2UgcmV0dXJuLiIpKSk7CiAgCQkJCWVsc2UK ICAJCQkJCWVyZXBvcnQoRVJST1IsCiAgCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfQkFEX0NP UFlfRklMRV9GT1JNQVQpLAohIAkJCQkJCQkgZXJybXNnCiEgCQkJCQkJCSAoInVucXVvdGVk IGNhcnJpYWdlIHJldHVybiBmb3VuZCBpbiBDU1YgZGF0YSIpLAohIAkJCQkJCQkgZXJyaGlu dAohIAkJCQkJCQkgKCJVc2UgcXVvdGVkIENTViBmaWVsZCB0byByZXByZXNlbnQgY2Fycmlh Z2UgcmV0dXJuLiIpKSk7CiAgCQkJfQohIAkJCS8qCiEgCQkJICogQ2hlY2sgZm9yIFxyXG4g b24gZmlyc3QgbGluZSwgX2FuZF8gaGFuZGxlIFxyXG4uCiEgCQkJICovCiAgCQkJaWYgKGVv bF90eXBlID09IEVPTF9VTktOT1dOIHx8IGVvbF90eXBlID09IEVPTF9DUk5MKQogIAkJCXsK ICAJCQkJaW50CQkJYzIgPSBDb3B5UGVla0NoYXIoKTsKKioqKioqKioqKioqKioqCioqKiAy MTE0LDIxMzIgKioqKgogIAkJCQl9CiAgCQkJCWVsc2UKICAJCQkJewohIAkJCQkJLyogZm91 bmQgXHIsIGJ1dCBubyBcbiAqLwogIAkJCQkJaWYgKGVvbF90eXBlID09IEVPTF9DUk5MKQog IAkJCQkJewogIAkJCQkJCWlmICghY3N2X21vZGUpCiAgCQkJCQkJCWVyZXBvcnQoRVJST1Is CiAgCQkJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxFX0ZPUk1BVCksCiEg CQkJCQkJCQkJIGVycm1zZygibGl0ZXJhbCBjYXJyaWFnZSByZXR1cm4gZm91bmQgaW4gZGF0 YSIpLAohIAkJCQkJCQkJCSBlcnJoaW50KCJVc2UgXCJcXHJcIiB0byByZXByZXNlbnQgY2Fy cmlhZ2UgcmV0dXJuLiIpKSk7CiAgCQkJCQkJZWxzZQogIAkJCQkJCQllcmVwb3J0KEVSUk9S LAogIAkJCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfQkFEX0NPUFlfRklMRV9GT1JNQVQpLAoh IAkJCQkJCQkJCSBlcnJtc2coInVucXVvdGVkIGNhcnJpYWdlIHJldHVybiBmb3VuZCBpbiBk YXRhIiksCiEgCQkJCQkJCQkJIGVycmhpbnQoIlVzZSBxdW90ZWQgQ1NWIGZpZWxkIHRvIHJl cHJlc2VudCBjYXJyaWFnZSByZXR1cm4uIikpKTsKICAKICAJCQkJCX0KICAKLS0tIDI5NTgs Mjk4MiAtLS0tCiAgCQkJCX0KICAJCQkJZWxzZQogIAkJCQl7CiEgCQkJCQkvKgohIAkJCQkJ ICogZm91bmQgXHIsIGJ1dCBubyBcbgohIAkJCQkJICovCiAgCQkJCQlpZiAoZW9sX3R5cGUg PT0gRU9MX0NSTkwpCiAgCQkJCQl7CiAgCQkJCQkJaWYgKCFjc3ZfbW9kZSkKICAJCQkJCQkJ ZXJlcG9ydChFUlJPUiwKICAJCQkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJ TEVfRk9STUFUKSwKISAJCQkJCQkJCQkgZXJybXNnCiEgCQkJCQkJCQkJICgibGl0ZXJhbCBj YXJyaWFnZSByZXR1cm4gZm91bmQgaW4gZGF0YSIpLAohIAkJCQkJCQkJCSBlcnJoaW50CiEg CQkJCQkJCQkJICgiVXNlIFwiXFxyXCIgdG8gcmVwcmVzZW50IGNhcnJpYWdlIHJldHVybi4i KSkpOwogIAkJCQkJCWVsc2UKICAJCQkJCQkJZXJlcG9ydChFUlJPUiwKICAJCQkJCQkJCQko ZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJTEVfRk9STUFUKSwKISAJCQkJCQkJCQkgZXJy bXNnCiEgCQkJCQkJCQkJICgidW5xdW90ZWQgY2FycmlhZ2UgcmV0dXJuIGZvdW5kIGluIGRh dGEiKSwKISAJCQkJCQkJCQkgZXJyaGludAohIAkJCQkJCQkJCSAoIlVzZSBxdW90ZWQgQ1NW IGZpZWxkIHRvIHJlcHJlc2VudCBjYXJyaWFnZSByZXR1cm4uIikpKTsKICAKICAJCQkJCX0K ICAKKioqKioqKioqKioqKioqCioqKiAyMTUzLDIxNjAgKioqKgogIAkJCQkJZXJlcG9ydChF UlJPUiwKICAJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxFX0ZPUk1BVCks CiAgCQkJCQkJCSBlcnJtc2coInVucXVvdGVkIG5ld2xpbmUgZm91bmQgaW4gZGF0YSIpLAoh IAkJCQkJCQkgZXJyaGludCgiVXNlIHF1b3RlZCBDU1YgZmllbGQgdG8gcmVwcmVzZW50IG5l d2xpbmUuIikpKTsKISAJCQkJCQogIAkJCX0KICAJCQllb2xfdHlwZSA9IEVPTF9OTDsKICAJ CQlicmVhazsKLS0tIDMwMDMsMzAxMSAtLS0tCiAgCQkJCQllcmVwb3J0KEVSUk9SLAogIAkJ CQkJCQkoZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJTEVfRk9STUFUKSwKICAJCQkJCQkJ IGVycm1zZygidW5xdW90ZWQgbmV3bGluZSBmb3VuZCBpbiBkYXRhIiksCiEgCQkJCQkJCSBl cnJoaW50CiEgCQkJCQkJCSAoIlVzZSBxdW90ZWQgQ1NWIGZpZWxkIHRvIHJlcHJlc2VudCBu ZXdsaW5lLiIpKSk7CiEgCiAgCQkJfQogIAkJCWVvbF90eXBlID0gRU9MX05MOwogIAkJCWJy ZWFrOwoqKioqKioqKioqKioqKioKKioqIDIxNjIsMjE2OSAqKioqCiAgCiAgCQlpZiAoKGxp bmVfYnVmLmxlbiA9PSAwIHx8ICFjc3ZfbW9kZSkgJiYgYyA9PSAnXFwnKQogIAkJewohIAkJ CWludCBjMjsKISAJCQkKICAJCQlpZiAoY3N2X21vZGUpCiAgCQkJCWMyID0gQ29weVBlZWtD aGFyKCk7CiAgCQkJZWxzZQotLS0gMzAxMywzMDIwIC0tLS0KICAKICAJCWlmICgobGluZV9i dWYubGVuID09IDAgfHwgIWNzdl9tb2RlKSAmJiBjID09ICdcXCcpCiAgCQl7CiEgCQkJaW50 CQkJYzI7CiEgCiAgCQkJaWYgKGNzdl9tb2RlKQogIAkJCQljMiA9IENvcHlQZWVrQ2hhcigp OwogIAkJCWVsc2UKKioqKioqKioqKioqKioqCioqKiAyMTc5LDIxODUgKioqKgogIAkJCWlm IChjMiA9PSAnLicpCiAgCQkJewogIAkJCQlpZiAoY3N2X21vZGUpCiEgCQkJCQlDb3B5RG9u ZVBlZWsoYzIsIHRydWUpOyAvKiBhbGxvdyBrZWVwIGNhbGxpbmcgR2V0Q2hhcigpICovCiAg CiAgCQkJCWlmIChlb2xfdHlwZSA9PSBFT0xfQ1JOTCkKICAJCQkJewotLS0gMzAzMCwzMDM2 IC0tLS0KICAJCQlpZiAoYzIgPT0gJy4nKQogIAkJCXsKICAJCQkJaWYgKGNzdl9tb2RlKQoh IAkJCQkJQ29weURvbmVQZWVrKGMyLCB0cnVlKTsJCS8qIGFsbG93IGtlZXAgY2FsbGluZyBH ZXRDaGFyKCkgKi8KICAKICAJCQkJaWYgKGVvbF90eXBlID09IEVPTF9DUk5MKQogIAkJCQl7 CioqKioqKioqKioqKioqKgoqKiogMjE4NywyMTkzICoqKioKICAJCQkJCWlmIChjID09ICdc bicpCiAgCQkJCQkJZXJlcG9ydChFUlJPUiwKICAJCQkJCQkJCShlcnJjb2RlKEVSUkNPREVf QkFEX0NPUFlfRklMRV9GT1JNQVQpLAohIAkJCQkJCQkJIGVycm1zZygiZW5kLW9mLWNvcHkg bWFya2VyIGRvZXMgbm90IG1hdGNoIHByZXZpb3VzIG5ld2xpbmUgc3R5bGUiKSkpOwogIAkJ CQkJaWYgKGMgIT0gJ1xyJykKICAJCQkJCQllcmVwb3J0KEVSUk9SLAogIAkJCQkJCQkJKGVy cmNvZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxFX0ZPUk1BVCksCi0tLSAzMDM4LDMwNDUgLS0t LQogIAkJCQkJaWYgKGMgPT0gJ1xuJykKICAJCQkJCQllcmVwb3J0KEVSUk9SLAogIAkJCQkJ CQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxFX0ZPUk1BVCksCiEgCQkJCQkJCQkg ZXJybXNnCiEgCQkJCQkJCQkgKCJlbmQtb2YtY29weSBtYXJrZXIgZG9lcyBub3QgbWF0Y2gg cHJldmlvdXMgbmV3bGluZSBzdHlsZSIpKSk7CiAgCQkJCQlpZiAoYyAhPSAnXHInKQogIAkJ CQkJCWVyZXBvcnQoRVJST1IsCiAgCQkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZ X0ZJTEVfRk9STUFUKSwKKioqKioqKioqKioqKioqCioqKiAyMjAzLDIyMDkgKioqKgogIAkJ CQkJKGVvbF90eXBlID09IEVPTF9DUiAmJiBjICE9ICdccicpKQogIAkJCQkJZXJlcG9ydChF UlJPUiwKICAJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxFX0ZPUk1BVCks CiEgCQkJCQkJCSBlcnJtc2coImVuZC1vZi1jb3B5IG1hcmtlciBkb2VzIG5vdCBtYXRjaCBw cmV2aW91cyBuZXdsaW5lIHN0eWxlIikpKTsKICAKICAJCQkJLyoKICAJCQkJICogSW4gcHJv dG9jb2wgdmVyc2lvbiAzLCB3ZSBzaG91bGQgaWdub3JlIGFueXRoaW5nIGFmdGVyCi0tLSAz MDU1LDMwNjIgLS0tLQogIAkJCQkJKGVvbF90eXBlID09IEVPTF9DUiAmJiBjICE9ICdccicp KQogIAkJCQkJZXJlcG9ydChFUlJPUiwKICAJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURf Q09QWV9GSUxFX0ZPUk1BVCksCiEgCQkJCQkJCSBlcnJtc2cKISAJCQkJCQkJICgiZW5kLW9m LWNvcHkgbWFya2VyIGRvZXMgbm90IG1hdGNoIHByZXZpb3VzIG5ld2xpbmUgc3R5bGUiKSkp OwogIAogIAkJCQkvKgogIAkJCQkgKiBJbiBwcm90b2NvbCB2ZXJzaW9uIDMsIHdlIHNob3Vs ZCBpZ25vcmUgYW55dGhpbmcgYWZ0ZXIKKioqKioqKioqKioqKioqCioqKiAyMjE4LDIyMjgg KioqKgogIAkJCQlyZXN1bHQgPSB0cnVlOwkvKiByZXBvcnQgRU9GICovCiAgCQkJCWJyZWFr OwogIAkJCX0KISAJCQkKICAJCQlpZiAoY3N2X21vZGUpCiEgCQkJCUNvcHlEb25lUGVlayhj MiwgZmFsc2UpOyAvKiBub3QgYSBkb3QsIHNvIHB1dCBpdCBiYWNrICovIAogIAkJCWVsc2UK ISAJCQkJLyogbm90IEVPRiBtYXJrLCBzbyBlbWl0IFwgYW5kIGZvbGxvd2luZyBjaGFyIGxp dGVyYWxseSAqLwogIAkJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhck1hY3JvKCZsaW5lX2J1Ziwg J1xcJyk7CiAgCQl9CiAgCi0tLSAzMDcxLDMwODMgLS0tLQogIAkJCQlyZXN1bHQgPSB0cnVl OwkvKiByZXBvcnQgRU9GICovCiAgCQkJCWJyZWFrOwogIAkJCX0KISAKICAJCQlpZiAoY3N2 X21vZGUpCiEgCQkJCUNvcHlEb25lUGVlayhjMiwgZmFsc2UpOwkJLyogbm90IGEgZG90LCBz byBwdXQgaXQgYmFjayAqLwogIAkJCWVsc2UKISAJCQkJLyoKISAJCQkJICogbm90IEVPRiBt YXJrLCBzbyBlbWl0IFwgYW5kIGZvbGxvd2luZyBjaGFyIGxpdGVyYWxseQohIAkJCQkgKi8K ICAJCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXJNYWNybygmbGluZV9idWYsICdcXCcpOwogIAkJ fQogIAoqKioqKioqKioqKioqKioKKioqIDIyNTQsMjI5MCAqKioqCiAgCQl9CiAgCX0JCQkJ CQkJLyogZW5kIG9mIG91dGVyIGxvb3AgKi8KICAKISAJLyogRG9uZSByZWFkaW5nIHRoZSBs aW5lLiAgQ29udmVydCBpdCB0byBzZXJ2ZXIgZW5jb2RpbmcuICovCiEgCWlmIChjaGFuZ2Vf ZW5jb2RpbmcpCiAgCXsKISAJCWN2dCA9IChjaGFyICopIHBnX2NsaWVudF90b19zZXJ2ZXIo KHVuc2lnbmVkIGNoYXIgKikgbGluZV9idWYuZGF0YSwKISAJCQkJCQkJCQkJICAgbGluZV9i dWYubGVuKTsKISAJCWlmIChjdnQgIT0gbGluZV9idWYuZGF0YSkKISAJCXsKISAJCQkvKiB0 cmFuc2ZlciBjb252ZXJ0ZWQgZGF0YSBiYWNrIHRvIGxpbmVfYnVmICovCiEgCQkJbGluZV9i dWYubGVuID0gMDsKISAJCQlsaW5lX2J1Zi5kYXRhWzBdID0gJ1wwJzsKISAJCQlhcHBlbmRC aW5hcnlTdHJpbmdJbmZvKCZsaW5lX2J1ZiwgY3Z0LCBzdHJsZW4oY3Z0KSk7CiEgCQl9CiAg CX0KICAKISAJLyogTm93IGl0J3Mgc2FmZSB0byB1c2UgdGhlIGJ1ZmZlciBpbiBlcnJvciBt ZXNzYWdlcyAqLwohIAlsaW5lX2J1Zl9jb252ZXJ0ZWQgPSB0cnVlOwohIAohIAlyZXR1cm4g cmVzdWx0OwogIH0KICAKLSAvKgotICAqCVJldHVybiBkZWNpbWFsIHZhbHVlIGZvciBhIGhl eGFkZWNpbWFsIGRpZ2l0Ci0gICovCi0gc3RhdGljCi0gaW50IEdldERlY2ltYWxGcm9tSGV4 KGNoYXIgaGV4KQotIHsKLSAJaWYgKGlzZGlnaXQoaGV4KSkKLSAJCXJldHVybiBoZXggLSAn MCc7Ci0gCWVsc2UKLSAJCXJldHVybiB0b2xvd2VyKGhleCkgLSAnYScgKyAxMDsKLSB9CiAg CiAgLyotLS0tLS0tLS0tCiAgICogUmVhZCB0aGUgdmFsdWUgb2YgYSBzaW5nbGUgYXR0cmli dXRlLCBwZXJmb3JtaW5nIGRlLWVzY2FwaW5nIGFzIG5lZWRlZC4KLS0tIDMxMDksMzUwMiAt LS0tCiAgCQl9CiAgCX0JCQkJCQkJLyogZW5kIG9mIG91dGVyIGxvb3AgKi8KICAKISAJLyoK ISAJICogRG9uZSByZWFkaW5nIHRoZSBsaW5lLiAgQ29udmVydCBpdCB0byBzZXJ2ZXIgZW5j b2RpbmcuCiEgCSAqLwohIAlpZiAoY2hhbmdlX2VuY29kaW5nKQohIAl7CiEgCQljdnQgPSAo Y2hhciAqKSBwZ19jbGllbnRfdG9fc2VydmVyKCh1bnNpZ25lZCBjaGFyICopIGxpbmVfYnVm LmRhdGEsCiEgCQkJCQkJCQkJCSAgIGxpbmVfYnVmLmxlbik7CiEgCQlpZiAoY3Z0ICE9IGxp bmVfYnVmLmRhdGEpCiEgCQl7CiEgCQkJLyoKISAJCQkgKiB0cmFuc2ZlciBjb252ZXJ0ZWQg ZGF0YSBiYWNrIHRvIGxpbmVfYnVmCiEgCQkJICovCiEgCQkJbGluZV9idWYubGVuID0gMDsK ISAJCQlsaW5lX2J1Zi5kYXRhWzBdID0gJ1wwJzsKISAJCQlsaW5lX2J1Zi5jdXJzb3IgPSAw OwohIAkJCWFwcGVuZEJpbmFyeVN0cmluZ0luZm8oJmxpbmVfYnVmLCBjdnQsIHN0cmxlbihj dnQpKTsKISAJCX0KISAJfQohIAohIAkvKgohIAkgKiBOb3cgaXQncyBzYWZlIHRvIHVzZSB0 aGUgYnVmZmVyIGluIGVycm9yIG1lc3NhZ2VzIAohIAkgKi8KISAJbGluZV9idWZfY29udmVy dGVkID0gdHJ1ZTsKISAKISAJcmV0dXJuIHJlc3VsdDsKISB9CiEgCiEgLyoKISAgKglSZXR1 cm4gZGVjaW1hbCB2YWx1ZSBmb3IgYSBoZXhhZGVjaW1hbCBkaWdpdAohICAqLwohIHN0YXRp YyBpbnQKISBHZXREZWNpbWFsRnJvbUhleChjaGFyIGhleCkKISB7CiEgCWlmIChpc2RpZ2l0 KGhleCkpCiEgCQlyZXR1cm4gaGV4IC0gJzAnOwohIAllbHNlCiEgCQlyZXR1cm4gdG9sb3dl cihoZXgpIC0gJ2EnICsgMTA7CiEgfQohIAohIC8qCiEgICogRGV0ZWN0ZWQgdGhlIGVvbCB0 eXBlIGJ5IGxvb2tpbmcgYXQgdGhlIGZpcnN0IGRhdGEgcm93LgohICAqIFBvc3NpYmxlIGVv bCB0eXBlcyBhcmUgTkwsIENSLCBvciBDUk5MLiBJZiBlb2wgdHlwZSB3YXMKISAgKiBkZXRl Y3RlZCwgaXQgaXMgc2V0IGFuZCBhIGJvb2xlYW4gdHJ1ZSBpcyByZXR1cm5lZCB0bwohICAq IGluZGljYXRlZCBkZXRlY3Rpb24gd2FzIHN1Y2Nlc3NmdWwuIElmIHRoZSBmaXJzdCBkYXRh IHJvdwohICAqIGlzIGxvbmdlciB0aGFuIHRoZSBpbnB1dCBidWZmZXIsIHdlIHJldHVybiBm YWxzZSBhbmQgd2lsbAohICAqIHRyeSBhZ2FpbiBpbiB0aGUgbmV4dCBidWZmZXIuCiEgICov CiEgc3RhdGljIGJvb2wKISBEZXRlY3RMaW5lRW5kKHNpemVfdCBieXRlc3JlYWQpCiEgewoh IAlpbnQJCQlieXRlc19yZW1haW5pbmcgPSBDT1BZX0JVRl9TSVpFOwohIAljaGFyCQljaF9m b3VuZDsJCS8qIHRoZSBjaGFyYWN0ZXIgZm91bmQgaW4gdGhlIHNjYW4gKCdcbicgb3IgJ1xy JyBvciBlc2NhcGVjKSAqLwohIAljaGFyCSAgICpzdGFydCA9IGlucHV0X2J1ZjsKISAJY2hh cgkgICAqZW5kOwohIAohIAl3aGlsZSAodHJ1ZSkKISAJewohIAkJYnl0ZXNfcmVtYWluaW5n ID0gQ09QWV9CVUZfU0laRSAtIChpbnB1dF9idWYgLSBzdGFydCk7CiEgCiEgCQlpZiAoYnl0 ZXNfcmVtYWluaW5nIDw9IDApCiEgCQkJcmV0dXJuIGZhbHNlOwohIAohIAkJaWYgKChlbmQg PQohIAkJCSBzdHIyY2hybGVuKHN0YXJ0LCAnXG4nLCAnXHInLCBieXRlc19yZW1haW5pbmcs CiEgCQkJCQkJJmNoX2ZvdW5kKSkgPT0gTlVMTCkKISAJCXsKISAJCQlyZXR1cm4gZmFsc2U7 CiEgCQl9CiEgCQllbHNlCiEgCQl7CiEgCQkJaWYgKGNoX2ZvdW5kID09ICdcbicpCiEgCQkJ ewohIAkJCQllb2xfdHlwZSA9IEVPTF9OTDsKISAJCQkJZW9sX2NoWzBdID0gJ1xuJzsKISAJ CQkJZW9sX2NoWzFdID0gJ1wwJzsKISAKISAJCQkJcmV0dXJuIHRydWU7CiEgCQkJfQohIAkJ CWlmIChjaF9mb3VuZCA9PSAnXHInKQohIAkJCXsKISAJCQkJaWYgKCooZW5kICsgMSkgPT0g J1xuJykKISAJCQkJewohIAkJCQkJZW9sX3R5cGUgPSBFT0xfQ1JOTDsKISAJCQkJCWVvbF9j aFswXSA9ICdccic7CiEgCQkJCQllb2xfY2hbMV0gPSAnXG4nOwohIAkJCQl9CiEgCQkJCWVs c2UKISAJCQkJewohIAkJCQkJZW9sX3R5cGUgPSBFT0xfQ1I7CiEgCQkJCQllb2xfY2hbMF0g PSAnXHInOwohIAkJCQkJZW9sX2NoWzFdID0gJ1wwJzsKISAJCQkJfQohIAohIAkJCQlyZXR1 cm4gdHJ1ZTsKISAJCQl9CiEgCQl9CiEgCX0KISAKISB9CiEgCiEgCiEgLyoKISAgKiBGaW5k cyB0aGUgbmV4dCBkYXRhIGxpbmUgdGhhdCBpcyBpbiB0aGUgaW5wdXQgYnVmZmVyIGFuZCBs b2FkcyBpdCBpbnRvIGxpbmVfYnVmLgohICAqIFJldHVybnMgYW4gaW5kaWNhdGlvbiBpZiB0 aGUgbGluZSB0aGF0IHdhcyByZWFkIGlzIGNvbXBsZXRlIChpZiBhbiB1bmVzY2FwZWQgbGlu ZS1lbmQgd2FzCiEgICogZW5jb3VudGVyZWQpLiBJZiB3ZSByZWFjaGVkIHRoZSBlbmQgb2Yg YnVmZmVyIGJlZm9yZSB0aGUgd2hvbGUgbGluZSB3YXMgd3JpdHRlbiBpbnRvIHRoZQohICAq IGxpbmUgYnVmZmVyIHRoZW4gcmV0dXJucyBmYWxzZS4KISAgKi8KISBzdGF0aWMgYm9vbAoh IENvcHlSZWFkTGluZUJ1ZmZlcmVkKHNpemVfdCBieXRlc3JlYWQpCiEgewohIAlpbnQJCQls aW5lc2l6ZTsKISAJYm9vbAkJdHJhbnNjb2RlID0gKGNsaWVudF9lbmNvZGluZyAhPSBzZXJ2 ZXJfZW5jb2RpbmcpOwohIAljaGFyCSAgICpjdnQ7CiEgCWJvb2wJCWVuZF9tYXJrZXI7CiEg CiEgCS8qCiEgCSAqIG1hcmsgdGhhdCBlbmNvZGluZyBjb252ZXJzaW9uIGhhc24ndCBvY2N1 cnJlZCB5ZXQgCiEgCSAqLwohIAlsaW5lX2J1Zl9jb252ZXJ0ZWQgPSBmYWxzZTsKISAKISAJ LyoKISAJICogRGV0ZWN0IGVuZCBvZiBsaW5lIHR5cGUgaWYgbm90IGFscmVhZHkgZGV0ZWN0 ZWQuCiEgCSAqLwohIAlpZiAoZW9sX3R5cGUgPT0gRU9MX1VOS05PV04pCiEgCXsKISAJCWJv b2wJCWVvbF9kZXRlY3RlZCA9IERldGVjdExpbmVFbmQoYnl0ZXNyZWFkKTsKISAKISAJCWlm ICghZW9sX2RldGVjdGVkKQohIAkJewohIAkJCS8qCiEgCQkJICogbG9hZCBlbnRpcmUgaW5w dXQgYnVmZmVyIGludG8gbGluZSBidWYsIGFuZCBxdWl0CiEgCQkJICovCiEgCQkJYXBwZW5k QmluYXJ5U3RyaW5nSW5mbygmbGluZV9idWYsIGlucHV0X2J1ZiwgQ09QWV9CVUZfU0laRSk7 CiEgCQkJbGluZV9kb25lID0gZmFsc2U7CiEgCQkJYnVmX2RvbmUgPSB0cnVlOwohIAohIAkJ CXJldHVybiBsaW5lX2RvbmU7CiEgCQl9CiEgCX0KISAKISAJLyoKISAJICogU3BlY2lhbCBj YXNlOiBlb2wgaXMgQ1JOTCwgbGFzdCBieXRlIG9mIHByZXZpb3VzIGJ1ZmZlciB3YXMgYW4K ISAJICogdW5lc2NhcGVkIENSIGFuZCAxc3QgYnl0ZSBvZiBjdXJyZW50IGJ1ZmZlciBpcyBO TC4gV2UgY2hlY2sgZm9yCiEgCSAqIHRoYXQgaGVyZS4KISAJICovCiEgCWlmIChlb2xfdHlw ZSA9PSBFT0xfQ1JOTCkKISAJewohIAkJLyoKISAJCSAqIGlmIHdlIHN0YXJ0ZWQgc2Nhbm5p bmcgZnJvbSB0aGUgMXN0IGJ5dGUgb2YgdGhlIGJ1ZmZlcgohIAkJICovCiEgCQlpZiAoYmVn bG9jID09IGlucHV0X2J1ZikKISAJCXsKISAJCQkvKgohIAkJCSAqIGFuZCBoYWQgYSBDUiBp biBsYXN0IGJ5dGUgb2YgcHJldiBidWYKISAJCQkgKi8KISAJCQlpZiAoY3JfaW5fcHJldmJ1 ZikKISAJCQl7CiEgCQkJCS8qCiEgCQkJCSAqIGlmIHRoaXMgMXN0IGJ5dGUgaW4gYnVmZmVy IGlzIDJuZCBieXRlIG9mIGxpbmUgZW5kIHNlcXVlbmNlIChsaW5lZmVlZCkKISAJCQkJICov CiEgCQkJCWlmICgqYmVnbG9jID09IGVvbF9jaFsxXSkKISAJCQkJewohIAkJCQkJLyoKISAJ CQkJCSAqIGxvYWQgdGhhdCBvbmUgbGluZWZlZWQgYnl0ZSBhbmQgaW5kaWNhdGUgd2UgYXJl IGRvbmUgd2l0aCB0aGUgZGF0YSBsaW5lCiEgCQkJCQkgKi8KISAJCQkJCWFwcGVuZEJpbmFy eVN0cmluZ0luZm8oJmxpbmVfYnVmLCBiZWdsb2MsIDEpOwohIAkJCQkJYnVmZmVyX2luZGV4 Kys7CiEgCQkJCQliZWdsb2MrKzsKISAKISAJCQkJCWxpbmVfZG9uZSA9IHRydWU7CiEgCQkJ CQllc2NfaW5fcHJldmJ1ZiA9IGZhbHNlOwohIAkJCQkJY3JfaW5fcHJldmJ1ZiA9IGZhbHNl OwohIAohIAkJCQkJcmV0dXJuIGxpbmVfZG9uZTsKISAJCQkJfQohIAkJCX0KISAKISAJCQlj cl9pbl9wcmV2YnVmID0gZmFsc2U7CiEgCQl9CiEgCX0KISAKISAJLyoKISAJICogKHdlIG5l ZWQgYSBsb29wIHNvIHRoYXQgaWYgZW9sX2NoIGlzIGZvdW5kLCBidXQgcHJldiBjaCBpcyBi YWNrc2xhc2gsIHdlIGNhbiBzZWFyY2gKISAJICogZm9yIHRoZSBuZXh0IGVvbF9jaCkKISAJ ICovCiEgCXdoaWxlICh0cnVlKQohIAl7CiEgCQkvKgohIAkJICogcmVhY2hlZCBlbmQgb2Yg YnVmZmVyCiEgCQkgKi8KISAJCWlmICgoZW5kbG9jID0KISAJCQkgc3RyY2hybGVuKGJlZ2xv YywgZW9sX2NoWzBdLCBieXRlc3JlYWQgLSBidWZmZXJfaW5kZXgpKSA9PSBOVUxMKQohIAkJ ewohIAkJCWxpbmVzaXplID0gQ09QWV9CVUZfU0laRSAtIChiZWdsb2MgLSBpbnB1dF9idWYp OwohIAkJCWFwcGVuZEJpbmFyeVN0cmluZ0luZm8oJmxpbmVfYnVmLCBiZWdsb2MsIGxpbmVz aXplKTsKISAKISAJCQlpZiAobGluZV9idWYubGVuID4gMSkKISAJCQl7CiEgCQkJCWNoYXIJ ICAgKmxhc3RfY2ggPSBsaW5lX2J1Zi5kYXRhICsgbGluZV9idWYubGVuIC0gMTsgLyogYmVm b3JlIHRlcm1pbmF0aW5nIFwwICovCiEgCiEgCQkJCWlmICgqbGFzdF9jaCA9PSBlc2NhcGVj KQohIAkJCQl7CiEgCQkJCQllc2NfaW5fcHJldmJ1ZiA9IHRydWU7CiEgCiEgCQkJCQlpZiAo bGluZV9idWYubGVuID4gMikKISAJCQkJCXsKISAJCQkJCQlsYXN0X2NoLS07CiEgCQkJCQkJ aWYgKCpsYXN0X2NoID09IGVzY2FwZWMpCiEgCQkJCQkJCWVzY19pbl9wcmV2YnVmID0gZmFs c2U7CiEgCQkJCQl9CiEgCQkJCX0KISAJCQkJZWxzZSBpZiAoKmxhc3RfY2ggPT0gJ1xyJykK ISAJCQkJewohIAkJCQkJaWYgKGVvbF90eXBlID09IEVPTF9DUk5MKQohIAkJCQkJCWNyX2lu X3ByZXZidWYgPSB0cnVlOwohIAkJCQl9CiEgCQkJfQohIAohIAkJCWxpbmVfZG9uZSA9IGZh bHNlOwohIAkJCWJ1Zl9kb25lID0gdHJ1ZTsKISAJCQlicmVhazsKISAJCX0KISAJCWVsc2UK ISAJCQkvKgohIAkJCSAqIGZvdW5kIHRoZSAxc3QgZW9sIGNoIGluIGlucHV0X2J1Zi4KISAJ CQkgKi8KISAJCXsKISAJCQlib29sCQllb2xfZm91bmQgPSB0cnVlOwohIAkJCWJvb2wJCWVv bF9lc2NhcGVkID0gdHJ1ZTsKISAKISAJCQkvKgohIAkJCSAqIExvYWQgdGhhdCBwaWVjZSBv ZiBkYXRhIChwb3RlbnRpYWxseSBhIGRhdGEgbGluZSkgaW50byB0aGUgbGluZSBidWZmZXIs CiEgCQkJICogYW5kIHVwZGF0ZSB0aGUgcG9pbnRlcnMgZm9yIHRoZSBuZXh0IHNjYW4uCiEg CQkJICovCiEgCQkJbGluZXNpemUgPSBlbmRsb2MgLSBiZWdsb2MgKyAxOwohIAkJCWFwcGVu ZEJpbmFyeVN0cmluZ0luZm8oJmxpbmVfYnVmLCBiZWdsb2MsIGxpbmVzaXplKTsKISAJCQli dWZmZXJfaW5kZXggKz0gbGluZXNpemU7CiEgCQkJYmVnbG9jID0gZW5kbG9jICsgMTsKISAK ISAJCQlpZiAoZW9sX3R5cGUgPT0gRU9MX0NSTkwpCiEgCQkJewohIAkJCQkvKgohIAkJCQkg KiBjaGVjayBpZiB0aGVyZSBpcyBhICdcbicgYWZ0ZXIgdGhlICdccicKISAJCQkJICovCiEg CQkJCWlmICgqKGVuZGxvYyArIDEpID09ICdcbicpCiEgCQkJCXsKISAJCQkJCS8qCiEgCQkJ CQkgKiB0aGlzIGlzIGEgbGluZSBlbmQKISAJCQkJCSAqLwohIAkJCQkJYXBwZW5kQmluYXJ5 U3RyaW5nSW5mbygmbGluZV9idWYsIGJlZ2xvYywgMSk7CQkvKiBsb2FkIHRoYXQgJ1xuJyAq LwohIAkJCQkJYnVmZmVyX2luZGV4Kys7CiEgCQkJCQliZWdsb2MrKzsKISAJCQkJfQohIAkJ CQllbHNlCiEgCQkJCQkvKgohIAkJCQkJICoganVzdCBhIENSLCBub3QgYSBsaW5lIGVuZAoh IAkJCQkJICovCiEgCQkJCQllb2xfZm91bmQgPSBmYWxzZTsKISAJCQl9CiEgCiEgCQkJLyoK ISAJCQkgKiBpbiBzb21lIGNhc2VzLCB0aGlzIGVuZCBvZiBsaW5lIGNoYXIgaGFwcGVucyB0 byBiZSB0aGUKISAJCQkgKiBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLiB3ZSBuZWVk IHRvIGNhdGNoIHRoYXQuCiEgCQkJICovCiEgCQkJaWYgKGJ1ZmZlcl9pbmRleCA+PSBieXRl c3JlYWQpCiEgCQkJCWJ1Zl9kb25lID0gdHJ1ZTsKISAKISAJCQkvKgohIAkJCSAqIENoZWNr IGlmIHRoZSAxc3QgZW5kIG9mIGxpbmUgY2ggaXMgZXNjYXBlZC4KISAJCQkgKi8KISAJCQlp ZiAoZW5kbG9jICE9IGlucHV0X2J1ZikJLyogY2FuIHdlIGxvb2sgMSBjaGFyIGJhY2s/ICov CiEgCQkJewohIAkJCQlpZiAoKihlbmRsb2MgLSAxKSAhPSBlc2NhcGVjKQkvKiBwcmV2IGNo YXIgaXMgbm90IGFuIGVzY2FwZSAqLwohIAkJCQkJZW9sX2VzY2FwZWQgPSBmYWxzZTsKISAJ CQkJZWxzZQohIAkJCQkJLyoKISAJCQkJCSAqIHByZXYgY2hhciBpcyBhbiBlc2NhcGUKISAJ CQkJCSAqLwohIAkJCQl7CiEgCQkJCQlpZiAoZW5kbG9jICE9IChpbnB1dF9idWYgKyAxKSkJ CS8qIGNhbiB3ZSBsb29rIGFub3RoZXIgY2hhciBiYWNrPyAqLwohIAkJCQkJewohIAkJCQkJ CS8qCiEgCQkJCQkJICogaXQncyBhIGRvdWJsZSBlc2NhcGUgY2hhciwgc28gaXQncyBub3Qg YW4gZXNjYXBlCiEgCQkJCQkJICovCiEgCQkJCQkJaWYgKCooZW5kbG9jIC0gMikgPT0gZXNj YXBlYykKISAJCQkJCQkJZW9sX2VzY2FwZWQgPSBmYWxzZTsKISAJCQkJCQkvKgohIAkJCQkJ CSAqIGVsc2UgaXQncyBhIHNpbmdsZSBlc2NhcGUgY2hhciwgc28gRU9MIGlzIGFzY2FwZWQg CiEgCQkJCQkJICovCiEgCQkJCQl9CiEgCQkJCQllbHNlCiEgCQkJCQl7CiEgCQkJCQkJLyoK ISAJCQkJCQkgKiB3ZSBuZWVkIHRvIGNoZWNrIGluIHRoZSBsYXN0IGJ1ZmZlcgohIAkJCQkJ CSAqLwohIAkJCQkJCWlmIChlc2NfaW5fcHJldmJ1ZikJCS8qIGRvdWJsZSBlc2NhcGUgY2hh ciwgc28gbm90IGFuIGVzY2FwZSAqLwohIAkJCQkJCQllb2xfZXNjYXBlZCA9IGZhbHNlOwoh IAkJCQkJfQohIAkJCQl9CiEgCQkJfQohIAkJCWVsc2UKISAJCQkJLyoKISAJCQkJICogdGhp cyBlb2wgY2ggaXMgZmlyc3QgY2ggaW4gYnVmZmVyLCBjaGVjayBmb3IgZXNjYXBlIGluIHBy ZXYgYnVmCiEgCQkJCSAqLwohIAkJCXsKISAJCQkJaWYgKCFlc2NfaW5fcHJldmJ1ZikKISAJ CQkJCWVvbF9lc2NhcGVkID0gZmFsc2U7CiEgCQkJfQohIAohIAkJCWVzY19pbl9wcmV2YnVm ID0gZmFsc2U7CQkvKiByZXNldCB2YXJpYWJsZSAqLwohIAohIAkJCS8qCiEgCQkJICogaWYg ZW9sIHdhcyBmb3VuZCwgYW5kIGl0IGlzbid0IGVzY2FwZWQsIGxpbmUgaXMgZG9uZQohIAkJ CSAqLwohIAkJCWlmICgoZW9sX2VzY2FwZWQgPT0gZmFsc2UpICYmIGVvbF9mb3VuZCkKISAJ CQl7CiEgCQkJCWxpbmVfZG9uZSA9IHRydWU7CiEgCQkJCWJyZWFrOwohIAkJCX0KISAJCQll bHNlCiEgCQkJCS8qCiEgCQkJCSAqIHN0YXkgaW4gdGhlIGxvb3AgYW5kIHByb2Nlc3Mgc29t ZSBtb3JlIGRhdGEuCiEgCQkJCSAqLwohIAkJCQlsaW5lX2RvbmUgPSBmYWxzZTsKISAKISAJ CX0JCQkJCQkvKiBlbmQgb2YgZm91bmQgZW9sX2NoICovCiEgCX0KISAKISAJLyoKISAJICog RG9uZSByZWFkaW5nIHRoZSBsaW5lLiBDb252ZXJ0IGl0IHRvIHNlcnZlciBlbmNvZGluZy4K ISAJICovCiEgCWlmICh0cmFuc2NvZGUpCiEgCXsKISAJCWN2dCA9IChjaGFyICopIHBnX2Ns aWVudF90b19zZXJ2ZXIoKHVuc2lnbmVkIGNoYXIgKikgbGluZV9idWYuZGF0YSwKISAJCQkJ CQkJCQkJICAgbGluZV9idWYubGVuKTsKISAJCWlmIChjdnQgIT0gbGluZV9idWYuZGF0YSkK ISAJCXsKISAJCQkvKgohIAkJCSAqIHRyYW5zZmVyIGNvbnZlcnRlZCBkYXRhIGJhY2sgdG8g bGluZV9idWYKISAJCQkgKi8KISAJCQlsaW5lX2J1Zi5sZW4gPSAwOwohIAkJCWxpbmVfYnVm LmRhdGFbMF0gPSAnXDAnOwohIAkJCWxpbmVfYnVmLmN1cnNvciA9IDA7CiEgCQkJYXBwZW5k QmluYXJ5U3RyaW5nSW5mbygmbGluZV9idWYsIGN2dCwgc3RybGVuKGN2dCkpOwohIAkJfQoh IAl9CiEgCiEgCS8qCiEgCSAqIGluZGljYXRlIHRoYXQgY29udmVyc2lvbiBoYWQgb2NjdXJl ZAohIAkgKi8KISAJbGluZV9idWZfY29udmVydGVkID0gdHJ1ZTsKISAKISAJLyoKISAJICog Y2hlY2sgaWYgdGhpcyBsaW5lIGlzIGFuIGVuZCBtYXJrZXIgLS0gIlwuIgohIAkgKi8KISAJ ZW5kX21hcmtlciA9IGZhbHNlOwohIAohIAlzd2l0Y2ggKGVvbF90eXBlKQohIAl7CiEgCQlj YXNlIEVPTF9OTDoKISAJCQlpZiAoIXN0cmNtcChsaW5lX2J1Zi5kYXRhLCAiXFwuXG4iKSkK ISAJCQkJZW5kX21hcmtlciA9IHRydWU7CiEgCQkJYnJlYWs7CiEgCQljYXNlIEVPTF9DUjoK ISAJCQlpZiAoIXN0cmNtcChsaW5lX2J1Zi5kYXRhLCAiXFwuXHIiKSkKISAJCQkJZW5kX21h cmtlciA9IHRydWU7CiEgCQkJYnJlYWs7CiEgCQljYXNlIEVPTF9DUk5MOgohIAkJCWlmICgh c3RyY21wKGxpbmVfYnVmLmRhdGEsICJcXC5cclxuIikpCiEgCQkJCWVuZF9tYXJrZXIgPSB0 cnVlOwohIAkJCWJyZWFrOwohIAkJY2FzZSBFT0xfVU5LTk9XTjoKISAJCQlicmVhazsKISAJ fQohIAohIAlpZiAoZW5kX21hcmtlcikKICAJewohIAkJZmVfZW9mID0gdHJ1ZTsKISAJCS8q CiEgCQkgKiB3ZSBkb24ndCB3YW50IHRvIHByb2Nlc3MgYSBcLiBhcyBkYXRhIGxpbmUsIHdh bnQgdG8gcXVpdC4gCiEgCQkgKi8KISAJCWxpbmVfZG9uZSA9IGZhbHNlOwohIAkJYnVmX2Rv bmUgPSB0cnVlOwogIAl9CiAgCiEgCXJldHVybiBsaW5lX2RvbmU7CiAgfQogIAogIAogIC8q LS0tLS0tLS0tLQogICAqIFJlYWQgdGhlIHZhbHVlIG9mIGEgc2luZ2xlIGF0dHJpYnV0ZSwg cGVyZm9ybWluZyBkZS1lc2NhcGluZyBhcyBuZWVkZWQuCioqKioqKioqKioqKioqKgoqKiog MjMxNCwyMzI0ICoqKioKICAJaW50CQkJZW5kX2N1cnNvcjsKICAJaW50CQkJaW5wdXRfbGVu OwogIAohIAkvKiByZXNldCBhdHRyaWJ1dGVfYnVmIHRvIGVtcHR5ICovCiEgCWF0dHJpYnV0 ZV9idWYubGVuID0gMDsKISAJYXR0cmlidXRlX2J1Zi5kYXRhWzBdID0gJ1wwJzsKICAKISAJ Lyogc2V0IGRlZmF1bHQgc3RhdHVzICovCiAgCSpyZXN1bHQgPSBFTkRfT0ZfTElORTsKICAK ICAJZm9yICg7OykKLS0tIDM1MjYsMzU0MSAtLS0tCiAgCWludAkJCWVuZF9jdXJzb3I7CiAg CWludAkJCWlucHV0X2xlbjsKICAKISAJLyoKISAJICogcmVzZXQgYXR0cl9idWYgdG8gZW1w dHkKISAJICovCiEgCWF0dHJfYnVmLmxlbiA9IDA7CiEgCWF0dHJfYnVmLmRhdGFbMF0gPSAn XDAnOwohIAlhdHRyX2J1Zi5jdXJzb3IgPSAwOwogIAohIAkvKgohIAkgKiBzZXQgZGVmYXVs dCBzdGF0dXMKISAJICovCiAgCSpyZXN1bHQgPSBFTkRfT0ZfTElORTsKICAKICAJZm9yICg7 OykKKioqKioqKioqKioqKioqCioqKiAyMzQ3LDIzNTMgKioqKgogIAkJCQljYXNlICc1JzoK ICAJCQkJY2FzZSAnNic6CiAgCQkJCWNhc2UgJzcnOgohIAkJCQkJLyogaGFuZGxlIFwwMTMg Ki8KICAJCQkJCXsKICAJCQkJCQlpbnQJCQl2YWw7CiAgCi0tLSAzNTY0LDM1NzIgLS0tLQog IAkJCQljYXNlICc1JzoKICAJCQkJY2FzZSAnNic6CiAgCQkJCWNhc2UgJzcnOgohIAkJCQkJ LyoKISAJCQkJCSAqIGhhbmRsZSBcMDEzCiEgCQkJCQkgKi8KICAJCQkJCXsKICAJCQkJCQlp bnQJCQl2YWw7CiAgCioqKioqKioqKioqKioqKgoqKiogMjM3NCwyMzg3ICoqKioKICAJCQkJ CX0KICAJCQkJCWJyZWFrOwogIAkJCQljYXNlICd4JzoKISAJCQkJCS8qIEhhbmRsZSBceDNG ICovCiAgCQkJCQlpZiAobGluZV9idWYuY3Vyc29yIDwgbGluZV9idWYubGVuKQogIAkJCQkJ ewohIAkJCQkJCWNoYXIgaGV4Y2hhciA9IGxpbmVfYnVmLmRhdGFbbGluZV9idWYuY3Vyc29y XTsKICAKICAJCQkJCQlpZiAoaXN4ZGlnaXQoaGV4Y2hhcikpCiAgCQkJCQkJewohIAkJCQkJ CQlpbnQgdmFsID0gR2V0RGVjaW1hbEZyb21IZXgoaGV4Y2hhcik7CiAgCiAgCQkJCQkJCWxp bmVfYnVmLmN1cnNvcisrOwogIAkJCQkJCQlpZiAobGluZV9idWYuY3Vyc29yIDwgbGluZV9i dWYubGVuKQotLS0gMzU5MywzNjA4IC0tLS0KICAJCQkJCX0KICAJCQkJCWJyZWFrOwogIAkJ CQljYXNlICd4JzoKISAJCQkJCS8qCiEgCQkJCQkgKiBIYW5kbGUgXHgzRgohIAkJCQkJICov CiAgCQkJCQlpZiAobGluZV9idWYuY3Vyc29yIDwgbGluZV9idWYubGVuKQogIAkJCQkJewoh IAkJCQkJCWNoYXIJCWhleGNoYXIgPSBsaW5lX2J1Zi5kYXRhW2xpbmVfYnVmLmN1cnNvcl07 CiAgCiAgCQkJCQkJaWYgKGlzeGRpZ2l0KGhleGNoYXIpKQogIAkJCQkJCXsKISAJCQkJCQkJ aW50CQkJdmFsID0gR2V0RGVjaW1hbEZyb21IZXgoaGV4Y2hhcik7CiAgCiAgCQkJCQkJCWxp bmVfYnVmLmN1cnNvcisrOwogIAkJCQkJCQlpZiAobGluZV9idWYuY3Vyc29yIDwgbGluZV9i dWYubGVuKQoqKioqKioqKioqKioqKioKKioqIDIzOTAsMjM5NiAqKioqCiAgCQkJCQkJCQlp ZiAoaXN4ZGlnaXQoaGV4Y2hhcikpCiAgCQkJCQkJCQl7CiAgCQkJCQkJCQkJbGluZV9idWYu Y3Vyc29yKys7CiEgCQkJCQkJCQkJdmFsID0gKHZhbCA8PCA0KSArIEdldERlY2ltYWxGcm9t SGV4KGhleGNoYXIpOwogIAkJCQkJCQkJfQogIAkJCQkJCQl9CiAgCQkJCQkJCWMgPSB2YWwg JiAweGZmOwotLS0gMzYxMSwzNjE5IC0tLS0KICAJCQkJCQkJCWlmIChpc3hkaWdpdChoZXhj aGFyKSkKICAJCQkJCQkJCXsKICAJCQkJCQkJCQlsaW5lX2J1Zi5jdXJzb3IrKzsKISAJCQkJ CQkJCQl2YWwgPQohIAkJCQkJCQkJCQkodmFsIDw8IDQpICsKISAJCQkJCQkJCQkJR2V0RGVj aW1hbEZyb21IZXgoaGV4Y2hhcik7CiAgCQkJCQkJCQl9CiAgCQkJCQkJCX0KICAJCQkJCQkJ YyA9IHZhbCAmIDB4ZmY7CioqKioqKioqKioqKioqKgoqKiogMjQyMiwyNDMxICoqKioKICAJ CQkJCSAqLwogIAkJCX0KICAJCX0KISAJCWFwcGVuZFN0cmluZ0luZm9DaGFyTWFjcm8oJmF0 dHJpYnV0ZV9idWYsIGMpOwogIAl9CiAgCiEgCS8qIGNoZWNrIHdoZXRoZXIgcmF3IGlucHV0 IG1hdGNoZWQgbnVsbCBtYXJrZXIgKi8KICAJaW5wdXRfbGVuID0gZW5kX2N1cnNvciAtIHN0 YXJ0X2N1cnNvcjsKICAJaWYgKGlucHV0X2xlbiA9PSBzdHJsZW4obnVsbF9wcmludCkgJiYK ICAJCXN0cm5jbXAoJmxpbmVfYnVmLmRhdGFbc3RhcnRfY3Vyc29yXSwgbnVsbF9wcmludCwg aW5wdXRfbGVuKSA9PSAwKQotLS0gMzY0NSwzNjU2IC0tLS0KICAJCQkJCSAqLwogIAkJCX0K ICAJCX0KISAJCWFwcGVuZFN0cmluZ0luZm9DaGFyTWFjcm8oJmF0dHJfYnVmLCBjKTsKICAJ fQogIAohIAkvKgohIAkgKiBjaGVjayB3aGV0aGVyIHJhdyBpbnB1dCBtYXRjaGVkIG51bGwg bWFya2VyCiEgCSAqLwogIAlpbnB1dF9sZW4gPSBlbmRfY3Vyc29yIC0gc3RhcnRfY3Vyc29y OwogIAlpZiAoaW5wdXRfbGVuID09IHN0cmxlbihudWxsX3ByaW50KSAmJgogIAkJc3RybmNt cCgmbGluZV9idWYuZGF0YVtzdGFydF9jdXJzb3JdLCBudWxsX3ByaW50LCBpbnB1dF9sZW4p ID09IDApCioqKioqKioqKioqKioqKgoqKiogMjQzMywyNDM5ICoqKioKICAJZWxzZQogIAkJ KmlzbnVsbCA9IGZhbHNlOwogIAohIAlyZXR1cm4gYXR0cmlidXRlX2J1Zi5kYXRhOwogIH0K ICAKICAKLS0tIDM2NTgsNDA2NiAtLS0tCiAgCWVsc2UKICAJCSppc251bGwgPSBmYWxzZTsK ICAKISAJcmV0dXJuIGF0dHJfYnVmLmRhdGE7CiEgfQohIAohIC8qCiEgICogUmVhZCB0aGUg Zmlyc3QgYXR0cmlidXRlLiBUaGlzIGlzIG1haW5seSB1c2VkIHRvIG1haW50YWluIHN1cHBv cnQKISAgKiBmb3IgYW4gT0lEIGNvbHVtbi4gQWxsIHRoZSByZXN0IG9mIHRoZSBjb2x1bW5z IHdpbGwgYmUgcmVhZCBhdCBvbmNlIHdpdGgKISAgKiBDb3B5UmVhZEFsbEF0dHJzKCkuCiEg ICovCiEgc3RhdGljIGNoYXIgKgohIENvcHlSZWFkT2lkQXR0cihjb25zdCBjaGFyICpkZWxp bSwgY29uc3QgY2hhciAqbnVsbF9wcmludCwgaW50IG51bGxfcHJpbnRfbGVuLAohIAkJCQlD b3B5UmVhZFJlc3VsdCAqcmVzdWx0LCBib29sICppc251bGwpCiEgewohIAljaGFyCQlkZWxp bWMgPSBkZWxpbVswXTsKISAJY2hhcgkgICAqc3RhcnRfbG9jID0gbGluZV9idWYuZGF0YSAr IGxpbmVfYnVmLmN1cnNvcjsKISAJY2hhcgkgICAqZW5kX2xvYzsKISAJaW50CQkJYXR0cl9s ZW4gPSAwOwohIAlpbnQJCQlieXRlc19yZW1haW5pbmc7CiEgCiEgCS8qCiEgCSAqIHJlc2V0 IGF0dHJpYnV0ZSBidWYgdG8gZW1wdHkKISAJICovCiEgCWF0dHJfYnVmLmxlbiA9IDA7CiEg CWF0dHJfYnVmLmRhdGFbMF0gPSAnXDAnOwohIAlhdHRyX2J1Zi5jdXJzb3IgPSAwOwohIAoh IAkvKgohIAkgKiBzZXQgZGVmYXVsdCBzdGF0dXMKISAJICovCiEgCSpyZXN1bHQgPSBFTkRf T0ZfTElORTsKISAKISAJLyoKISAJICogIyBvZiBieXRlcyB0aGF0IHdlcmUgbm90IHlldCBw cm9jZXNzZWQgaW4gdGhpcyBsaW5lCiEgCSAqLwohIAlieXRlc19yZW1haW5pbmcgPSBsaW5l X2J1Zi5sZW4gLSBsaW5lX2J1Zi5jdXJzb3I7CiEgCiEgCS8qCiEgCSAqIGdvdCB0byBlbmQg b2YgbGluZQohIAkgKi8KISAJaWYgKChlbmRfbG9jID0gc3RyY2hybGVuKHN0YXJ0X2xvYywg ZGVsaW1jLCBieXRlc19yZW1haW5pbmcpKSA9PSBOVUxMKQohIAl7CiEgCQlhdHRyX2xlbiA9 IGJ5dGVzX3JlbWFpbmluZyAtIDE7IC8qIGRvbid0IGNvdW50ICdcbicgaW4gbGVuIGNhbGN1 bGF0aW9uICovCiEgCQlhcHBlbmRCaW5hcnlTdHJpbmdJbmZvKCZhdHRyX2J1Ziwgc3RhcnRf bG9jLCBhdHRyX2xlbik7CiEgCQlsaW5lX2J1Zi5jdXJzb3IgKz0gYXR0cl9sZW4gKyAyOwkJ Lyogc2tpcCAnXG4nIGFuZCAnXDAnICovCiEgCiEgCQkqcmVzdWx0ID0gRU5EX09GX0xJTkU7 CiEgCX0KISAJZWxzZQohIAkJLyoKISAJCSAqIGZvdW5kIGEgZGVsaW1pdGVyCiEgCQkgKi8K ISAJewohIAkJLyoKISAJCSAqICh3ZSBkb24ndCBjYXJlIGlmIGRlbGltIHdhcyBwcmVjZWRl ZCB3aXRoIGEgYmFja3NsYXNoLCBiZWNhdXNlIGl0J3MgYW4KISAJCSAqIGludmFsaWQgT0lE IGFueXdheSkKISAJCSAqLwohIAohIAkJYXR0cl9sZW4gPSBlbmRfbG9jIC0gc3RhcnRfbG9j OyAvKiB3ZSBkb24ndCBpbmNsdWRlIHRoZSBkZWxpbWl0ZXIgY2ggKi8KISAKISAJCWFwcGVu ZEJpbmFyeVN0cmluZ0luZm8oJmF0dHJfYnVmLCBzdGFydF9sb2MsIGF0dHJfbGVuKTsKISAJ CWxpbmVfYnVmLmN1cnNvciArPSBhdHRyX2xlbiArIDE7CiEgCiEgCQkqcmVzdWx0ID0gTk9S TUFMX0FUVFI7CiEgCX0KISAKISAKISAJLyoKISAJICogY2hlY2sgd2hldGhlciByYXcgaW5w dXQgbWF0Y2hlZCBudWxsIG1hcmtlcgohIAkgKi8KISAJaWYgKGF0dHJfbGVuID09IG51bGxf cHJpbnRfbGVuCiEgCQkmJiBzdHJuY21wKHN0YXJ0X2xvYywgbnVsbF9wcmludCwgYXR0cl9s ZW4pID09IDApCiEgCQkqaXNudWxsID0gdHJ1ZTsKISAJZWxzZQohIAkJKmlzbnVsbCA9IGZh bHNlOwohIAohIAlyZXR1cm4gYXR0cl9idWYuZGF0YTsKISB9CiEgCiEgCiEgLyoKISAgKiBS ZWFkIGFsbCBhdHRyaWJ1dGVzLiBBdHRyaWJ1dGVzIGFyZSBwYXJzZWQgZnJvbSBsaW5lX2J1 ZiBhbmQKISAgKiBpbnNlcnRlZCAoYWxsIGF0IG9uY2UpIHRvIGF0dHJfYnVmLCB3aGlsZSBz YXZpbmcgcG9pbnRlcnMgdG8KISAgKiBlYWNoIGF0dHJpYnV0ZSdzIHN0YXJ0aW5nIHBvc2l0 aW9uLgohICAqCiEgICogV2hlbiB0aGlzIHJvdXRpbmUgZmluaXNoZXMgZXhlY3V0aW9uIGJv dGggdGhlIG51bGxzIGFycmF5IGFuZAohICAqIHRoZSBhdHRyX29mZnNldHMgYXJyYXkgYXJl IHVwZGF0ZWQuIFRoZSBhdHRyX29mZnNldHMgd2lsbCBpbmNsdWRlCiEgICogdGhlIG9mZnNl dCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGF0dHJpYnV0ZSBhcnJheSBvZiB3aGljaAoh ICAqIGVhY2ggYXR0cmlidXRlIGJlZ2lucy4gSWYgYSBzcGVjaWZpYyBhdHRyaWJ1dGUgaXMg bm90IHVzZWQgZm9yIHRoaXMKISAgKiBDT1BZIGNvbW1hbmQgKG9tbWl0dGVkIGZyb20gdGhl IGNvbHVtbiBsaXN0KSwgYSB2YWx1ZSBvZiAwIHdpbGwgYmUgYXNzaWduZWQuCiEgICogRm9y IGV4YW1wbGU6IGZvciB0YWJsZSBmb28oYSxiLGMsZCxlKSBhbmQgQ09QWSBmb28oYSxiLGUp CiEgICogYXR0cl9vZmZzZXRzIG1heSBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXMgYWZ0ZXIg dGhpcyByb3V0aW5lCiEgICogcmV0dXJuczogWzAsMjAsMCwwLDU1XS4gVGhhdCBtZWFucyB0 aGF0IGNvbHVtbiAiYSIgdmFsdWUgc3RhcnRzCiEgICogYXQgYnl0ZSBvZmZzZXQgMCwgImIi IGluIDIwIGFuZCAiZSIgaW4gNTUsIGluIGF0dHJfYnVmLgohICAqCiEgICogSW4gdGhlIGF0 dHJpYnV0ZSBidWZmZXIgKGF0dHJfYnVmKSBlYWNoIGF0dHJpYnV0ZQohICAqIGlzIHRlcm1p bmF0ZWQgd2l0aCBhICdcMCcsIGFuZCB0aGVyZWZvcmUgYnkgdXNpbmcgdGhlIGF0dHJfb2Zm c2V0cwohICAqIGFycmF5IHdlIGNvdWxkIHBvaW50IHRvIGEgYmVnaW5uaW5nIG9mIGFuIGF0 dHJpYnV0ZSBhbmQgaGF2ZSBpdAohICAqIGJlaGF2ZSBhcyBhIEMgc3RyaW5nLCBtdWNoIGxp a2UgcHJldmlvdXNseSBkb25lIGluIENPUFkuCiEgICoKISAgKiBBbm90aGVyIGFzcGVjdCB0 byBpbXByb3ZpbmcgcGVyZm9ybWFuY2UgaXMgcmVkdWNpbmcgdGhlIGZyZXF1ZW5jeQohICAq IG9mIGRhdGEgbG9hZCBpbnRvIGJ1ZmZlcnMuIFRoZSBvcmlnaW5hbCBDT1BZIHJlYWQgYXR0 cmlidXRlIGNvZGUKISAgKiBsb2FkZWQgYSBjaGFyYWN0ZXIgYXQgYSB0aW1lLiBJbiBoZXJl IHdlIHRyeSB0byBsb2FkIGEgY2h1bmsgb2YgZGF0YQohICAqIGF0IGEgdGltZS4gVXN1YWxs eSBhIGNodW5rIHdpbGwgaW5jbHVkZSBhIGZ1bGwgZGF0YSByb3cKISAgKiAodW5sZXNzIHdl IGhhdmUgYW4gZXNjYXBlZCBkZWxpbSkuIFRoYXQgZWZmZWN0aXZlbHkgcmVkdWNlcyB0aGUg bnVtYmVyIG9mCiEgICogbG9hZHMgYnkgYSBmYWN0b3Igb2YgbnVtYmVyIG9mIGJ5dGVzIHBl ciByb3cuIFRoaXMgaW1wcm92ZXMgcGVyZm9ybWFuY2UKISAgKiBncmVhdGx5LCB1bmZvcnR1 bmF0ZWx5IGl0IGFkZCBtb3JlIGNvbXBsZXhpdHkgdG8gdGhlIGNvZGUuCiEgICoKISAgKiBH bG9iYWwgcGFydGljaXBhbnRzIGluIHBhcnNpbmcgbG9naWM6CiEgICoKISAgKiBsaW5lX2J1 Zi5jdXJzb3IgLS0gYW4gb2Zmc2V0IGZyb20gYmVnaW5uaW5nIG9mIHRoZSBsaW5lIGJ1ZmZl cgohICAqIHRoYXQgaW5kaWNhdGVzIHdoZXJlIHdlIGFyZSBhYm91dCB0byBiZWdpbiB0aGUg bmV4dCBzY2FuLiBOb3RlIHRoYXQKISAgKiBpZiB3ZSBoYXZlIFdJVEggT0lEUyB0aGlzIGN1 cnNvciBpcyBhbHJlYWR5IHNoaWZ0ZWQgcGFzdCB0aGUgZmlyc3QKISAgKiBPSUQgYXR0cmli dXRlLgohICAqCiEgICogYXR0cl9idWYuY3Vyc29yIC0tIGFuIG9mZnNldCBmcm9tIHRoZSBi ZWdpbm5pbmcgb2YgdGhlCiEgICogYXR0cmlidXRlIGJ1ZmZlciB0aGF0IGluZGljYXRlcyB3 aGVyZSB0aGUgY3VycmVudCBhdHRyaWJ1dGUgYmVnaW5zLgohICAqLwohIHN0YXRpYyB2b2lk CiEgQ29weVJlYWRBbGxBdHRycyhjb25zdCBjaGFyICpkZWxpbSwgY29uc3QgY2hhciAqbnVs bF9wcmludCwgaW50IG51bGxfcHJpbnRfbGVuLAohIAkJCQkgY2hhciAqbnVsbHMsIExpc3Qg KmF0dG51bWxpc3QsIGludCAqYXR0cl9vZmZzZXRzLAohIAkJCQkgaW50IG51bV9waHlzX2F0 dHJzLCBGb3JtX3BnX2F0dHJpYnV0ZSAqYXR0cikKISB7CiEgCWNoYXIJCWRlbGltYyA9IGRl bGltWzBdOwkJLyogZGVsaW1pdGVyIGNoYXJhY3RlciAqLwohIAljaGFyCSAgICpzY2FuX3N0 YXJ0OwkJLyogcG9pbnRlciB0byBsaW5lIGJ1ZmZlciB3aGVyZSBzY2FuIHNob3VsZCBzdGFy dC4gKi8KISAJY2hhcgkgICAqc2Nhbl9lbmQ7CQkvKiBwb2ludGVyIHRvIGxpbmUgYnVmZmVy IHdoZXJlIGNoYXIgd2FzIGZvdW5kICovCiEgCWNoYXIJCWNoX2ZvdW5kOwkJLyogdGhlIGNo YXJhY3RlciBmb3VuZCBpbiB0aGUgc2NhbiAoZGVsaW1jIG9yIGVzY2FwZSkgKi8KISAJaW50 CQkJYXR0cl9wcmVfbGVuOwkvKiBjdXJyZW50IGF0dHIgcmF3IGxlbiwgYmVmb3JlIHByb2Nl c3NpbmcgZXNjYXBlcyAqLwohIAlpbnQJCQlhdHRyX3Bvc3RfbGVuOwkvKiBjdXJyZW50IGF0 dHIgbGVuIGFmdGVyIGVzY2FwaW5nICovCiEgCWludAkJCW07CQkJCS8qIGF0dHJpYnV0ZSBp bmRleCBiZWluZyBwYXJzZWQgKi8KISAJaW50CQkJYnl0ZXNfcmVtYWluaW5nOwkJLyogbnVt IG9mIGJ5dGVzIHJlbWFpbmluZyB0byBiZSBzY2FubmVkIGluIGxpbmUgYnVmICovCiEgCWlu dAkJCWNodW5rX3N0YXJ0OwkvKiBvZmZzZXQgdG8gYmVnaW5uaW5nIG9mIGxpbmUgY2h1bmsg dG8gbG9hZCAqLwohIAlpbnQJCQljaHVua19sZW47CQkvKiBsZW5ndGggb2YgY2h1bmsgb2Yg ZGF0YSB0byBsb2FkIHRvIGF0dHIgYnVmICovCiEgCWludAkJCW9jdF92YWw7CQkvKiBieXRl IHZhbHVlIGZvciBvY3RhbCBlc2NhcGVzICovCiEgCWludAkJCWF0dG51bTsJCQkvKiBhdHRy aWJ1dGUgbnVtYmVyIGJlaW5nIHBhcnNlZCAqLwohIAlMaXN0Q2VsbCAgICpjdXI7CQkJLyog Y3Vyc29yIHRvIGF0dHJpYnV0ZSBsaXN0IHVzZWQgZm9yIHRoaXMgQ09QWSAqLwohIAlpbnQJ CQlhdHRyaWJ1dGU7CiEgCiEgCS8qCiEgCSAqIGluaXQgdmFyaWFibGVzIGZvciBhdHRyaWJ1 dGUgc2NhbgohIAkgKi8KISAJYXR0cl9idWYubGVuID0gMDsKISAJYXR0cl9idWYuZGF0YVsw XSA9ICdcMCc7CiEgCWF0dHJfYnVmLmN1cnNvciA9IDA7CiEgCS8qCiEgCSAqIGN1cnNvciBp cyBub3cgPiAwIGlmIHdlIGNvcHkgV0lUSCBPSURTCiEgCSAqLwohIAlzY2FuX3N0YXJ0ID0g bGluZV9idWYuZGF0YSArIGxpbmVfYnVmLmN1cnNvcjsKISAJY3VyID0gbGlzdF9oZWFkKGF0 dG51bWxpc3QpOwohIAlhdHRudW0gPSBsZmlyc3RfaW50KGN1cik7CiEgCW0gPSBhdHRudW0g LSAxOwohIAljaHVua19zdGFydCA9IGxpbmVfYnVmLmN1cnNvcjsKISAJY2h1bmtfbGVuID0g MDsKISAJYXR0cl9wcmVfbGVuID0gMDsKISAJYXR0cl9wb3N0X2xlbiA9IDA7CiEgCiEgCS8q CiEgCSAqIFNjYW4gdGhyb3VnaCB0aGUgbGluZSBidWZmZXIgdG8gcmVhZCBhbGwgYXR0cmli dXRlcyBkYXRhCiEgCSAqLwohIAl3aGlsZSAobGluZV9idWYuY3Vyc29yIDwgbGluZV9idWYu bGVuKQohIAl7CiEgCQlieXRlc19yZW1haW5pbmcgPSBsaW5lX2J1Zi5sZW4gLSBsaW5lX2J1 Zi5jdXJzb3I7CiEgCQljaF9mb3VuZCA9ICdcMCc7CiEgCiEgCQlpZiAoKHNjYW5fZW5kID0K ISAJCQkgc3RyMmNocmxlbihzY2FuX3N0YXJ0LCBkZWxpbWMsIGVzY2FwZWMsIGJ5dGVzX3Jl bWFpbmluZywKISAJCQkJCQkmY2hfZm91bmQpKSA9PSBOVUxMKQohIAkJewohIAkJCS8qCiEg CQkJICogR09UIFRPIEVORCBPRiBMSU5FIEJVRkZFUgohIAkJCSAqLwohIAohIAkJCWlmIChj dXIgPT0gTlVMTCkKISAJCQkJZXJlcG9ydChFUlJPUiwKISAJCQkJCQkoZXJyY29kZShFUlJD T0RFX0JBRF9DT1BZX0ZJTEVfRk9STUFUKSwKISAJCQkJCQkgZXJybXNnKCJleHRyYSBkYXRh IGFmdGVyIGxhc3QgZXhwZWN0ZWQgY29sdW1uIikpKTsKISAKISAJCQlhdHRudW0gPSBsZmly c3RfaW50KGN1cik7CiEgCQkJbSA9IGF0dG51bSAtIDE7CiEgCiEgCQkJLyoKISAJCQkgKiBk b24ndCBjb3VudCBlb2wgY2hhcihzKSBpbiBhdHRyIGFuZCBjaHVuayBsZW4gY2FsY3VsYXRp b24gCiEgCQkJICovCiEgCQkJaWYgKGVvbF90eXBlID09IEVPTF9DUk5MKQohIAkJCXsKISAJ CQkJYXR0cl9wcmVfbGVuICs9IGJ5dGVzX3JlbWFpbmluZyAtIDI7CiEgCQkJCWNodW5rX2xl biA9IGxpbmVfYnVmLmxlbiAtIGNodW5rX3N0YXJ0IC0gMjsKISAJCQl9CiEgCQkJZWxzZQoh IAkJCXsKISAJCQkJYXR0cl9wcmVfbGVuICs9IGJ5dGVzX3JlbWFpbmluZyAtIDE7CiEgCQkJ CWNodW5rX2xlbiA9IGxpbmVfYnVmLmxlbiAtIGNodW5rX3N0YXJ0IC0gMTsKISAJCQl9CiEg CiEgCQkJLyoKISAJCQkgKiBjaGVjayBpZiB0aGlzIGlzIGEgTlVMTCB2YWx1ZSBvciBkYXRh IHZhbHVlIChhc3N1bWVkIE5VTEwpCiEgCQkJICovCiEgCQkJaWYgKGF0dHJfcHJlX2xlbiA9 PSBudWxsX3ByaW50X2xlbgohIAkJCQkmJgohIAkJCQlzdHJuY21wKGxpbmVfYnVmLmRhdGEg KyBsaW5lX2J1Zi5sZW4gLSBhdHRyX3ByZV9sZW4gLSAxLAohIAkJCQkJCW51bGxfcHJpbnQs IGF0dHJfcHJlX2xlbikgPT0gMCkKISAJCQkJbnVsbHNbbV0gPSAnbic7CiEgCQkJZWxzZQoh IAkJCQludWxsc1ttXSA9ICcgJzsKISAKISAJCQlhdHRyX29mZnNldHNbbV0gPSBhdHRyX2J1 Zi5jdXJzb3I7CiEgCiEgCiEgCQkJLyoKISAJCQkgKiBsb2FkIHRoZSBsYXN0IGNodW5rLCB0 aGUgd2hvbGUgYnVmZmVyIGluIG1vc3QgY2FzZXMKISAJCQkgKi8KISAJCQlhcHBlbmRCaW5h cnlTdHJpbmdJbmZvKCZhdHRyX2J1ZiwgbGluZV9idWYuZGF0YSArIGNodW5rX3N0YXJ0LAoh IAkJCQkJCQkJICAgY2h1bmtfbGVuKTsKISAKISAJCQlsaW5lX2J1Zi5jdXJzb3IgKz0gYXR0 cl9wcmVfbGVuICsgMjsJCS8qIHNraXAgZW9sIGNoYXIgYW5kICdcMCcgdG8gZXhpdCBsb29w ICovCiEgCiEgCQkJaWYgKGxuZXh0KGN1cikgIT0gTlVMTCkKISAJCQl7CiEgCQkJCS8qCiEg CQkJCSAqIEZvciBhbiBlbXB0eSBkYXRhIGxpbmUsIHRoZSBwcmV2aW91cyBDT1BZIGNvZGUg d2lsbAohIAkJCQkgKiBmYWlsIGl0IGR1cmluZyB0aGUgY29udmVyc2lvbiBzdGFnZS4gV2Ug Y2FuIGZhaWwgaXQgaGVyZQohIAkJCQkgKiBhbHJlYWR5LCBidXQgdGhlbiB3ZSB3aWxsIGZh aWwgdGhlIHJlZ3Jlc3Npb24gdGVzdHMgYi9jCiEgCQkJCSAqIG9mIGEgZGlmZmVyZW50IGVy cm9yIG1lc3NhZ2UuIHRoYXQncyB3aHkgd2UgcmV0dXJuIHNvIHdlCiEgCQkJCSAqIGNhbiBn ZXQgdGhlIHNhbWUgZXJyb3IgbWVzc2FnZSB0aGF0IHJlZ3Jlc3MgZXhwZWN0cy4gYWhoLi4u CiEgCQkJCSAqIHRoaXMgY29uZGl0aW9uYWwgaXMgdW5uZWNlc3NhcnkgYW5kIHNob3VsZCBi ZSByZW1vdmVkIHNvb24uCiEgCQkJCSAqLwohIAkJCQlpZiAobGluZV9idWYubGVuID4gMSkK ISAJCQkJCWVyZXBvcnQoRVJST1IsCiEgCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfQkFEX0NP UFlfRklMRV9GT1JNQVQpLAohIAkJCQkJCQkgZXJybXNnKCJtaXNzaW5nIGRhdGEgZm9yIGNv bHVtbiBcIiVzXCIiLAohIAkJCQkJCQkJCU5hbWVTdHIoYXR0clttICsgMV0tPmF0dG5hbWUp KSkpOwohIAkJCQllbHNlCiEgCQkJCQlyZXR1cm47CiEgCQkJfQohIAkJfQohIAkJZWxzZQoh IAkJCS8qCiEgCQkJICogRk9VTkQgQSBERUxJTUlURVIgT1IgRVNDQVBFCiEgCQkJICovCiEg CQl7CiEgCQkJaWYgKGN1ciA9PSBOVUxMKQohIAkJCQllcmVwb3J0KEVSUk9SLAohIAkJCQkJ CShlcnJjb2RlKEVSUkNPREVfQkFEX0NPUFlfRklMRV9GT1JNQVQpLAohIAkJCQkJCSBlcnJt c2coImV4dHJhIGRhdGEgYWZ0ZXIgbGFzdCBleHBlY3RlZCBjb2x1bW4iKSkpOwohIAohIAkJ CWlmIChjaF9mb3VuZCA9PSBkZWxpbWMpCQkvKiBmb3VuZCBhIGRlbGltaXRlciAqLwohIAkJ CXsKISAJCQkJYXR0bnVtID0gbGZpcnN0X2ludChjdXIpOwohIAkJCQltID0gYXR0bnVtIC0g MTsKISAKISAJCQkJLyoKISAJCQkJICogKHdlIGRvbid0IGluY2x1ZGUgdGhlIGRlbGltaXRl ciBjaCBpbiBsZW5ndGgpIAohIAkJCQkgKi8KISAJCQkJYXR0cl9wcmVfbGVuICs9IHNjYW5f ZW5kIC0gc2Nhbl9zdGFydDsKISAJCQkJLyoKISAJCQkJICogKHdlIGRvbid0IGluY2x1ZGUg dGhlIGRlbGltaXRlciBjaCBpbiBsZW5ndGgpIAohIAkJCQkgKi8KISAJCQkJYXR0cl9wb3N0 X2xlbiArPSBzY2FuX2VuZCAtIHNjYW5fc3RhcnQ7CiEgCiEgCQkJCS8qCiEgCQkJCSAqIGNo ZWNrIGlmIHRoaXMgaXMgYSBudWxsIHByaW50IG9yIGRhdGEgKGFzc3VtZWQgTlVMTCkKISAJ CQkJICovCiEgCQkJCWlmIChhdHRyX3ByZV9sZW4gPT0gbnVsbF9wcmludF9sZW4KISAJCQkJ CSYmCiEgCQkJCQlzdHJuY21wKHNjYW5fZW5kIC0gYXR0cl9wcmVfbGVuLCBudWxsX3ByaW50 LCBhdHRyX3ByZV9sZW4pCiEgCQkJCQk9PSAwKQohIAkJCQkJbnVsbHNbbV0gPSAnbic7CiEg CQkJCWVsc2UKISAJCQkJCW51bGxzW21dID0gJyAnOwohIAohIAkJCQkvKgohIAkJCQkgKiBz ZXQgdGhlIHBvaW50ZXIgdG8gbmV4dCBhdHRyaWJ1dGUgcG9zaXRpb24KISAJCQkJICovCiEg CQkJCWF0dHJfb2Zmc2V0c1ttXSA9IGF0dHJfYnVmLmN1cnNvcjsKISAKISAJCQkJLyoKISAJ CQkJICogdXBkYXRlIGJ1ZmZlciBjdXJzb3JzIHRvIG91ciBjdXJyZW50IGxvY2F0aW9uLCAr MSB0byBza2lwIHRoZSBkZWxpbWMKISAJCQkJICovCiEgCQkJCWxpbmVfYnVmLmN1cnNvciA9 IHNjYW5fZW5kIC0gbGluZV9idWYuZGF0YSArIDE7CiEgCQkJCWF0dHJfYnVmLmN1cnNvciAr PSBhdHRyX3Bvc3RfbGVuICsgMTsKISAKISAJCQkJLyoKISAJCQkJICogcHJlcGFyZSBzY2Fu IGZvciBuZXh0IGF0dHIKISAJCQkJICovCiEgCQkJCXNjYW5fc3RhcnQgPSBsaW5lX2J1Zi5k YXRhICsgbGluZV9idWYuY3Vyc29yOwohIAkJCQljdXIgPSBsbmV4dChjdXIpOwohIAkJCQlh dHRyX3ByZV9sZW4gPSAwOwohIAkJCQlhdHRyX3Bvc3RfbGVuID0gMDsKISAJCQl9CiEgCQkJ ZWxzZQohIAkJCQkvKgohIAkJCQkgKiBmb3VuZCBhbiBlc2NhcGUgY2hhcmFjdGVyCiEgCQkJ CSAqLwohIAkJCXsKISAJCQkJY2hhcgkJbmV4dGMgPSAqKHNjYW5fZW5kICsgMSk7CiEgCQkJ CWNoYXIJCW5ld2M7CiEgCQkJCWludAkJCXNraXAgPSAyOwohIAohIAkJCQljaHVua19sZW4g PSAoc2Nhbl9lbmQgLSBsaW5lX2J1Zi5kYXRhKSAtIGNodW5rX3N0YXJ0ICsgMTsKISAKISAJ CQkJLyoKISAJCQkJICogbG9hZCBhIGNodW5rIG9mIGRhdGEKISAJCQkJICovCiEgCQkJCWFw cGVuZEJpbmFyeVN0cmluZ0luZm8oJmF0dHJfYnVmLCBsaW5lX2J1Zi5kYXRhICsgY2h1bmtf c3RhcnQsCiEgCQkJCQkJCQkJICAgY2h1bmtfbGVuKTsKISAKISAJCQkJc3dpdGNoIChuZXh0 YykKISAJCQkJewohIAkJCQkJY2FzZSAnMCc6CiEgCQkJCQljYXNlICcxJzoKISAJCQkJCWNh c2UgJzInOgohIAkJCQkJY2FzZSAnMyc6CiEgCQkJCQljYXNlICc0JzoKISAJCQkJCWNhc2Ug JzUnOgohIAkJCQkJY2FzZSAnNic6CiEgCQkJCQljYXNlICc3JzoKISAJCQkJCQlvY3RfdmFs ID0gT0NUVkFMVUUobmV4dGMpOwohIAkJCQkJCW5leHRjID0gKihzY2FuX2VuZCArIDIpOwoh IAkJCQkJCS8qCiEgCQkJCQkJICogKG5vIG5lZWQgZm9yIG91dCBiYWQgYWNjZXNzIGNoZWNr IHNpbmNlIGxpbmUgaWYgYnVmZmVyZWQpCiEgCQkJCQkJICovCiEgCQkJCQkJaWYgKElTT0NU QUwobmV4dGMpKQohIAkJCQkJCXsKISAJCQkJCQkJc2tpcCsrOwohIAkJCQkJCQlvY3RfdmFs ID0gKG9jdF92YWwgPDwgMykgKyBPQ1RWQUxVRShuZXh0Yyk7CiEgCQkJCQkJCW5leHRjID0g KihzY2FuX2VuZCArIDMpOwohIAkJCQkJCQlpZiAoSVNPQ1RBTChuZXh0YykpCiEgCQkJCQkJ CXsKISAJCQkJCQkJCXNraXArKzsKISAJCQkJCQkJCW9jdF92YWwgPSAob2N0X3ZhbCA8PCAz KSArIE9DVFZBTFVFKG5leHRjKTsKISAJCQkJCQkJfQohIAkJCQkJCX0KISAJCQkJCQluZXdj ID0gb2N0X3ZhbCAmIDAzNzc7CS8qIHRoZSBlc2NhcGVkIGJ5dGUgdmFsdWUgKi8KISAJCQkJ CQlicmVhazsKISAJCQkJCWNhc2UgJ2InOgohIAkJCQkJCW5ld2MgPSAnXGInOwohIAkJCQkJ CWJyZWFrOwohIAkJCQkJY2FzZSAnZic6CiEgCQkJCQkJbmV3YyA9ICdcZic7CiEgCQkJCQkJ YnJlYWs7CiEgCQkJCQljYXNlICduJzoKISAJCQkJCQluZXdjID0gJ1xuJzsKISAJCQkJCQli cmVhazsKISAJCQkJCWNhc2UgJ3InOgohIAkJCQkJCW5ld2MgPSAnXHInOwohIAkJCQkJCWJy ZWFrOwohIAkJCQkJY2FzZSAndCc6CiEgCQkJCQkJbmV3YyA9ICdcdCc7CiEgCQkJCQkJYnJl YWs7CiEgCQkJCQljYXNlICd2JzoKISAJCQkJCQluZXdjID0gJ1x2JzsKISAJCQkJCQlicmVh azsKISAJCQkJCWRlZmF1bHQ6CiEgCQkJCQkJaWYgKG5leHRjID09IGRlbGltYykKISAJCQkJ CQkJbmV3YyA9IGRlbGltYzsKISAJCQkJCQllbHNlIGlmIChuZXh0YyA9PSBlc2NhcGVjKQoh IAkJCQkJCQluZXdjID0gZXNjYXBlYzsKISAJCQkJCQllbHNlCiEgCQkJCQkJCS8qCiEgCQkJ CQkJCSAqIG5vIGVzY2FwZSBzZXF1ZW5jZSwgdGFrZSBuZXh0IGNoYXIgbGl0ZXJhbHkKISAJ CQkJCQkJICovCiEgCQkJCQkJCW5ld2MgPSBuZXh0YzsKISAJCQkJCQlicmVhazsKISAJCQkJ fQohIAohIAkJCQkvKgohIAkJCQkgKiB1cGRhdGUgdG8gY3VycmVudCBsZW5ndGgsIGFkZCBl c2NhcGUgYW5kIGVzY2FwZWQgY2hhcnMKISAJCQkJICovCiEgCQkJCWF0dHJfcHJlX2xlbiAr PSBzY2FuX2VuZCAtIHNjYW5fc3RhcnQgKyAyOwohIAkJCQkvKgohIAkJCQkgKiB1cGRhdGUg dG8gY3VycmVudCBsZW5ndGgsIGVzY2FwZWQgY2hhcgohIAkJCQkgKi8KISAJCQkJYXR0cl9w b3N0X2xlbiArPSBzY2FuX2VuZCAtIHNjYW5fc3RhcnQgKyAxOwohIAohIAkJCQkvKgohIAkJ CQkgKiBOZWVkIHRvIGdldCByaWQgb2YgdGhlIGVzY2FwZSBjaGFyYWN0ZXIuIFRoaXMgaXMg ZG9uZSBieQohIAkJCQkgKiBsb2FkaW5nIHRoZSBjaHVuayB1cCB0byBpbmNsdWRpbmcgdGhl IGVzY2FwZSBjaGFyYWN0ZXIKISAJCQkJICogaW50byB0aGUgYXR0cmlidXRlIGJ1ZmZlci4g VGhlbiBvdmVyd3JpdHRpbmcgdGhlIGJhY2tzbGFzaAohIAkJCQkgKiB3aXRoIHRoZSBlc2Nh cGVkIHNlcXVlbmNlIG9yIGNoYXIsIGFuZCBjb250aW51aW5nIHRvIHNjYW4KISAJCQkJICog ZnJvbSAqYWZ0ZXIqIHRoZSBjaGFyIHRoYW4gaXMgYWZ0ZXIgdGhlIGVzY2FwZSBpbiBsaW5l IGJ1Zi4KISAJCQkJICovCiEgCQkJCSooYXR0cl9idWYuZGF0YSArIGF0dHJfYnVmLmxlbiAt IDEpID0gbmV3YzsKISAJCQkJbGluZV9idWYuY3Vyc29yID0gc2Nhbl9lbmQgLSBsaW5lX2J1 Zi5kYXRhICsgc2tpcDsKISAJCQkJc2Nhbl9zdGFydCA9IHNjYW5fZW5kICsgc2tpcDsKISAJ CQkJY2h1bmtfc3RhcnQgPSBsaW5lX2J1Zi5jdXJzb3I7CiEgCQkJCWNodW5rX2xlbiA9IDA7 CiEgCQkJfQohIAohIAkJfQkJCQkJCS8qIGVuZCBkZWxpbWl0ZXIvYmFja3NsYXNoICovCiEg CiEgCX0JCQkJCQkJLyogZW5kIGxpbmUgYnVmZmVyIHNjYW4uICovCiEgCiEgCS8qCiEgCSAq IFJlcGxhY2UgYWxsIGRlbGltaXRlcnMgd2l0aCBOVUxMIGZvciBzdHJpbmcgdGVybWluYXRp b24uCiEgCSAqIE5PVEU6IG9ubHkgZGVsaW1pdGVycyAoTk9UIG5lY2Vzc2FyaWx5IGFsbCBk ZWxpbWMpIGFyZSByZXBsYWNlZC4KISAJICogRXhhbXBsZSAoZGVsaW1jID0gJ3wnKToKISAJ ICogLSBCZWZvcmU6ICBmICAxCXwgIGYgIFx8ICAyICB8CWYgIDMKISAJICogLSBBZnRlciA6 ICBmICAxIFwwICBmICAgfCAgMiBcMAlmICAzCiEgCSAqLwohIAlmb3IgKGF0dHJpYnV0ZSA9 IDE7IGF0dHJpYnV0ZSA8IG51bV9waHlzX2F0dHJzOyBhdHRyaWJ1dGUrKykKISAJewohIAkJ aWYgKGF0dHJfb2Zmc2V0c1thdHRyaWJ1dGVdICE9IDApCiEgCQkJKihhdHRyX2J1Zi5kYXRh ICsgYXR0cl9vZmZzZXRzW2F0dHJpYnV0ZV0gLSAxKSA9ICdcMCc7CiEgCX0KISAKICB9CiAg CiAgCioqKioqKioqKioqKioqKgoqKiogMjQ3NywyNDg3ICoqKioKICAJYm9vbAkJaW5fcXVv dGUgPSBmYWxzZTsKICAJYm9vbAkJc2F3X3F1b3RlID0gZmFsc2U7CiAgCiEgCS8qIHJlc2V0 IGF0dHJpYnV0ZV9idWYgdG8gZW1wdHkgKi8KISAJYXR0cmlidXRlX2J1Zi5sZW4gPSAwOwoh IAlhdHRyaWJ1dGVfYnVmLmRhdGFbMF0gPSAnXDAnOwogIAohIAkvKiBzZXQgZGVmYXVsdCBz dGF0dXMgKi8KICAJKnJlc3VsdCA9IEVORF9PRl9MSU5FOwogIAogIAlmb3IgKDs7KQotLS0g NDEwNCw0MTE5IC0tLS0KICAJYm9vbAkJaW5fcXVvdGUgPSBmYWxzZTsKICAJYm9vbAkJc2F3 X3F1b3RlID0gZmFsc2U7CiAgCiEgCS8qCiEgCSAqIHJlc2V0IGF0dHJfYnVmIHRvIGVtcHR5 CiEgCSAqLwohIAlhdHRyX2J1Zi5sZW4gPSAwOwohIAlhdHRyX2J1Zi5kYXRhWzBdID0gJ1ww JzsKISAJYXR0cl9idWYuY3Vyc29yID0gMDsKICAKISAJLyoKISAJICogc2V0IGRlZmF1bHQg c3RhdHVzCiEgCSAqLwogIAkqcmVzdWx0ID0gRU5EX09GX0xJTkU7CiAgCiAgCWZvciAoOzsp CioqKioqKioqKioqKioqKgoqKiogMjQ5MSwyNTA0ICoqKioKICAJCQlicmVhazsKICAJCWMg PSBsaW5lX2J1Zi5kYXRhW2xpbmVfYnVmLmN1cnNvcisrXTsKICAKISAJCS8qIHVucXVvdGVk IGZpZWxkIGRlbGltaXRlciAgKi8KICAJCWlmICghaW5fcXVvdGUgJiYgYyA9PSBkZWxpbWMp CiAgCQl7CiAgCQkJKnJlc3VsdCA9IE5PUk1BTF9BVFRSOwogIAkJCWJyZWFrOwogIAkJfQog IAohIAkJLyogc3RhcnQgb2YgcXVvdGVkIGZpZWxkIChvciBwYXJ0IG9mIGZpZWxkKSAqLwog IAkJaWYgKCFpbl9xdW90ZSAmJiBjID09IHF1b3RlYykKICAJCXsKICAJCQlzYXdfcXVvdGUg PSB0cnVlOwotLS0gNDEyMyw0MTQwIC0tLS0KICAJCQlicmVhazsKICAJCWMgPSBsaW5lX2J1 Zi5kYXRhW2xpbmVfYnVmLmN1cnNvcisrXTsKICAKISAJCS8qCiEgCQkgKiB1bnF1b3RlZCBm aWVsZCBkZWxpbWl0ZXIKISAJCSAqLwogIAkJaWYgKCFpbl9xdW90ZSAmJiBjID09IGRlbGlt YykKICAJCXsKICAJCQkqcmVzdWx0ID0gTk9STUFMX0FUVFI7CiAgCQkJYnJlYWs7CiAgCQl9 CiAgCiEgCQkvKgohIAkJICogc3RhcnQgb2YgcXVvdGVkIGZpZWxkIChvciBwYXJ0IG9mIGZp ZWxkKQohIAkJICovCiAgCQlpZiAoIWluX3F1b3RlICYmIGMgPT0gcXVvdGVjKQogIAkJewog IAkJCXNhd19xdW90ZSA9IHRydWU7CioqKioqKioqKioqKioqKgoqKiogMjUwNiwyNTEyICoq KioKICAJCQljb250aW51ZTsKICAJCX0KICAKISAJCS8qIGVzY2FwZSB3aXRoaW4gYSBxdW90 ZWQgZmllbGQgKi8KICAJCWlmIChpbl9xdW90ZSAmJiBjID09IGVzY2FwZWMpCiAgCQl7CiAg CQkJLyoKLS0tIDQxNDIsNDE1MCAtLS0tCiAgCQkJY29udGludWU7CiAgCQl9CiAgCiEgCQkv KgohIAkJICogZXNjYXBlIHdpdGhpbiBhIHF1b3RlZCBmaWVsZAohIAkJICovCiAgCQlpZiAo aW5fcXVvdGUgJiYgYyA9PSBlc2NhcGVjKQogIAkJewogIAkJCS8qCioqKioqKioqKioqKioq KgoqKiogMjUxOSwyNTI1ICoqKioKICAKICAJCQkJaWYgKG5leHRjID09IGVzY2FwZWMgfHwg bmV4dGMgPT0gcXVvdGVjKQogIAkJCQl7CiEgCQkJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhck1h Y3JvKCZhdHRyaWJ1dGVfYnVmLCBuZXh0Yyk7CiAgCQkJCQlsaW5lX2J1Zi5jdXJzb3IrKzsK ICAJCQkJCWNvbnRpbnVlOwogIAkJCQl9Ci0tLSA0MTU3LDQxNjMgLS0tLQogIAogIAkJCQlp ZiAobmV4dGMgPT0gZXNjYXBlYyB8fCBuZXh0YyA9PSBxdW90ZWMpCiAgCQkJCXsKISAJCQkJ CWFwcGVuZFN0cmluZ0luZm9DaGFyTWFjcm8oJmF0dHJfYnVmLCBuZXh0Yyk7CiAgCQkJCQls aW5lX2J1Zi5jdXJzb3IrKzsKICAJCQkJCWNvbnRpbnVlOwogIAkJCQl9CioqKioqKioqKioq KioqKgoqKiogMjUzNiwyNTQ4ICoqKioKICAJCQlpbl9xdW90ZSA9IGZhbHNlOwogIAkJCWNv bnRpbnVlOwogIAkJfQohIAkJYXBwZW5kU3RyaW5nSW5mb0NoYXJNYWNybygmYXR0cmlidXRl X2J1ZiwgYyk7CiAgCX0KICAKICAJaWYgKGluX3F1b3RlKQogIAkJKnJlc3VsdCA9IFVOVEVS TUlOQVRFRF9GSUVMRDsKICAKISAJLyogY2hlY2sgd2hldGhlciByYXcgaW5wdXQgbWF0Y2hl ZCBudWxsIG1hcmtlciAqLwogIAlpbnB1dF9sZW4gPSBlbmRfY3Vyc29yIC0gc3RhcnRfY3Vy c29yOwogIAlpZiAoIXNhd19xdW90ZSAmJiBpbnB1dF9sZW4gPT0gc3RybGVuKG51bGxfcHJp bnQpICYmCiAgCQlzdHJuY21wKCZsaW5lX2J1Zi5kYXRhW3N0YXJ0X2N1cnNvcl0sIG51bGxf cHJpbnQsIGlucHV0X2xlbikgPT0gMCkKLS0tIDQxNzQsNDE4OCAtLS0tCiAgCQkJaW5fcXVv dGUgPSBmYWxzZTsKICAJCQljb250aW51ZTsKICAJCX0KISAJCWFwcGVuZFN0cmluZ0luZm9D aGFyTWFjcm8oJmF0dHJfYnVmLCBjKTsKICAJfQogIAogIAlpZiAoaW5fcXVvdGUpCiAgCQkq cmVzdWx0ID0gVU5URVJNSU5BVEVEX0ZJRUxEOwogIAohIAkvKgohIAkgKiBjaGVjayB3aGV0 aGVyIHJhdyBpbnB1dCBtYXRjaGVkIG51bGwgbWFya2VyCiEgCSAqLwogIAlpbnB1dF9sZW4g PSBlbmRfY3Vyc29yIC0gc3RhcnRfY3Vyc29yOwogIAlpZiAoIXNhd19xdW90ZSAmJiBpbnB1 dF9sZW4gPT0gc3RybGVuKG51bGxfcHJpbnQpICYmCiAgCQlzdHJuY21wKCZsaW5lX2J1Zi5k YXRhW3N0YXJ0X2N1cnNvcl0sIG51bGxfcHJpbnQsIGlucHV0X2xlbikgPT0gMCkKKioqKioq KioqKioqKioqCioqKiAyNTUwLDI1NTYgKioqKgogIAllbHNlCiAgCQkqaXNudWxsID0gZmFs c2U7CiAgCiEgCXJldHVybiBhdHRyaWJ1dGVfYnVmLmRhdGE7CiAgfQogIAogIC8qCi0tLSA0 MTkwLDQxOTYgLS0tLQogIAllbHNlCiAgCQkqaXNudWxsID0gZmFsc2U7CiAgCiEgCXJldHVy biBhdHRyX2J1Zi5kYXRhOwogIH0KICAKICAvKgoqKioqKioqKioqKioqKioKKioqIDI1Nzgs MjYwNiAqKioqCiAgCQkJCShlcnJjb2RlKEVSUkNPREVfQkFEX0NPUFlfRklMRV9GT1JNQVQp LAogIAkJCQkgZXJybXNnKCJpbnZhbGlkIGZpZWxkIHNpemUiKSkpOwogIAohIAkvKiByZXNl dCBhdHRyaWJ1dGVfYnVmIHRvIGVtcHR5LCBhbmQgbG9hZCByYXcgZGF0YSBpbiBpdCAqLwoh IAlhdHRyaWJ1dGVfYnVmLmxlbiA9IDA7CiEgCWF0dHJpYnV0ZV9idWYuZGF0YVswXSA9ICdc MCc7CiEgCWF0dHJpYnV0ZV9idWYuY3Vyc29yID0gMDsKICAKISAJZW5sYXJnZVN0cmluZ0lu Zm8oJmF0dHJpYnV0ZV9idWYsIGZsZF9zaXplKTsKICAKISAJQ29weUdldERhdGEoYXR0cmli dXRlX2J1Zi5kYXRhLCBmbGRfc2l6ZSk7CiAgCWlmIChDb3B5R2V0RW9mKCkpCiAgCQllcmVw b3J0KEVSUk9SLAogIAkJCQkoZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJTEVfRk9STUFU KSwKICAJCQkJIGVycm1zZygidW5leHBlY3RlZCBFT0YgaW4gQ09QWSBkYXRhIikpKTsKICAK ISAJYXR0cmlidXRlX2J1Zi5sZW4gPSBmbGRfc2l6ZTsKISAJYXR0cmlidXRlX2J1Zi5kYXRh W2ZsZF9zaXplXSA9ICdcMCc7CiAgCiEgCS8qIENhbGwgdGhlIGNvbHVtbiB0eXBlJ3MgYmlu YXJ5IGlucHV0IGNvbnZlcnRlciAqLwogIAlyZXN1bHQgPSBGdW5jdGlvbkNhbGwyKGZsaW5m bywKISAJCQkJCQkgICBQb2ludGVyR2V0RGF0dW0oJmF0dHJpYnV0ZV9idWYpLAogIAkJCQkJ CSAgIE9iamVjdElkR2V0RGF0dW0odHlwaW9wYXJhbSkpOwogIAohIAkvKiBUcm91YmxlIGlm IGl0IGRpZG4ndCBlYXQgdGhlIHdob2xlIGJ1ZmZlciAqLwohIAlpZiAoYXR0cmlidXRlX2J1 Zi5jdXJzb3IgIT0gYXR0cmlidXRlX2J1Zi5sZW4pCiAgCQllcmVwb3J0KEVSUk9SLAogIAkJ CQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURfQklOQVJZX1JFUFJFU0VOVEFUSU9OKSwKICAJ CQkJIGVycm1zZygiaW5jb3JyZWN0IGJpbmFyeSBkYXRhIGZvcm1hdCIpKSk7Ci0tLSA0MjE4 LDQyNTIgLS0tLQogIAkJCQkoZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJTEVfRk9STUFU KSwKICAJCQkJIGVycm1zZygiaW52YWxpZCBmaWVsZCBzaXplIikpKTsKICAKISAJLyoKISAJ ICogcmVzZXQgYXR0cl9idWYgdG8gZW1wdHksIGFuZCBsb2FkIHJhdyBkYXRhIGluIGl0CiEg CSAqLwohIAlhdHRyX2J1Zi5sZW4gPSAwOwohIAlhdHRyX2J1Zi5kYXRhWzBdID0gJ1wwJzsK ISAJYXR0cl9idWYuY3Vyc29yID0gMDsKICAKISAJZW5sYXJnZVN0cmluZ0luZm8oJmF0dHJf YnVmLCBmbGRfc2l6ZSk7CiAgCiEgCUNvcHlHZXREYXRhKGF0dHJfYnVmLmRhdGEsIGZsZF9z aXplKTsKICAJaWYgKENvcHlHZXRFb2YoKSkKICAJCWVyZXBvcnQoRVJST1IsCiAgCQkJCShl cnJjb2RlKEVSUkNPREVfQkFEX0NPUFlfRklMRV9GT1JNQVQpLAogIAkJCQkgZXJybXNnKCJ1 bmV4cGVjdGVkIEVPRiBpbiBDT1BZIGRhdGEiKSkpOwogIAohIAlhdHRyX2J1Zi5sZW4gPSBm bGRfc2l6ZTsKISAJYXR0cl9idWYuZGF0YVtmbGRfc2l6ZV0gPSAnXDAnOwogIAohIAkvKgoh IAkgKiBDYWxsIHRoZSBjb2x1bW4gdHlwZSdzIGJpbmFyeSBpbnB1dCBjb252ZXJ0ZXIgCiEg CSAqLwogIAlyZXN1bHQgPSBGdW5jdGlvbkNhbGwyKGZsaW5mbywKISAJCQkJCQkgICBQb2lu dGVyR2V0RGF0dW0oJmF0dHJfYnVmKSwKICAJCQkJCQkgICBPYmplY3RJZEdldERhdHVtKHR5 cGlvcGFyYW0pKTsKICAKISAJLyoKISAJICogVHJvdWJsZSBpZiBpdCBkaWRuJ3QgZWF0IHRo ZSB3aG9sZSBidWZmZXIgCiEgCSAqLwohIAlpZiAoYXR0cl9idWYuY3Vyc29yICE9IGF0dHJf YnVmLmxlbikKICAJCWVyZXBvcnQoRVJST1IsCiAgCQkJCShlcnJjb2RlKEVSUkNPREVfSU5W QUxJRF9CSU5BUllfUkVQUkVTRU5UQVRJT04pLAogIAkJCQkgZXJybXNnKCJpbmNvcnJlY3Qg YmluYXJ5IGRhdGEgZm9ybWF0IikpKTsKKioqKioqKioqKioqKioqCioqKiAyNjY4LDI2NzQg KioqKgogIAkJCQkgKi8KICAJCQkJaWYgKCFzYW1lX2VuY29kaW5nKQogIAkJCQl7CiEgCQkJ CQkvKiBzZW5kIGFkZGl0aW9uYWwgYnl0ZXMgb2YgdGhlIGNoYXIsIGlmIGFueSAqLwogIAkJ CQkJbWJsZW4gPSBwZ19lbmNvZGluZ19tYmxlbihjbGllbnRfZW5jb2RpbmcsIHN0cmluZyk7 CiAgCQkJCQlmb3IgKGkgPSAxOyBpIDwgbWJsZW47IGkrKykKICAJCQkJCQlDb3B5U2VuZENo YXIoc3RyaW5nW2ldKTsKLS0tIDQzMTQsNDMyMiAtLS0tCiAgCQkJCSAqLwogIAkJCQlpZiAo IXNhbWVfZW5jb2RpbmcpCiAgCQkJCXsKISAJCQkJCS8qCiEgCQkJCQkgKiBzZW5kIGFkZGl0 aW9uYWwgYnl0ZXMgb2YgdGhlIGNoYXIsIGlmIGFueQohIAkJCQkJICovCiAgCQkJCQltYmxl biA9IHBnX2VuY29kaW5nX21ibGVuKGNsaWVudF9lbmNvZGluZywgc3RyaW5nKTsKICAJCQkJ CWZvciAoaSA9IDE7IGkgPCBtYmxlbjsgaSsrKQogIAkJCQkJCUNvcHlTZW5kQ2hhcihzdHJp bmdbaV0pOwoqKioqKioqKioqKioqKioKKioqIDI3MDksMjcxNiAqKioqCiAgCSAqLwogIAog IAlmb3IgKHRlc3Rfc3RyaW5nID0gc3RyaW5nOwohIAkJICF1c2VfcXVvdGUgJiYgKGMgPSAq dGVzdF9zdHJpbmcpICE9ICdcMCc7CiEgCQkgdGVzdF9zdHJpbmcgKz0gbWJsZW4pCiAgCXsK ICAJCWlmIChjID09IGRlbGltYyB8fCBjID09IHF1b3RlYyB8fCBjID09ICdcbicgfHwgYyA9 PSAnXHInKQogIAkJCXVzZV9xdW90ZSA9IHRydWU7Ci0tLSA0MzU3LDQzNjMgLS0tLQogIAkg Ki8KICAKICAJZm9yICh0ZXN0X3N0cmluZyA9IHN0cmluZzsKISAJCSAhdXNlX3F1b3RlICYm IChjID0gKnRlc3Rfc3RyaW5nKSAhPSAnXDAnOyB0ZXN0X3N0cmluZyArPSBtYmxlbikKICAJ ewogIAkJaWYgKGMgPT0gZGVsaW1jIHx8IGMgPT0gcXVvdGVjIHx8IGMgPT0gJ1xuJyB8fCBj ID09ICdccicpCiAgCQkJdXNlX3F1b3RlID0gdHJ1ZTsKKioqKioqKioqKioqKioqCioqKiAy NzMyLDI3MzggKioqKgogIAogIAkJaWYgKCFzYW1lX2VuY29kaW5nKQogIAkJewohIAkJCS8q IHNlbmQgYWRkaXRpb25hbCBieXRlcyBvZiB0aGUgY2hhciwgaWYgYW55ICovCiAgCQkJbWJs ZW4gPSBwZ19lbmNvZGluZ19tYmxlbihjbGllbnRfZW5jb2RpbmcsIHN0cmluZyk7CiAgCQkJ Zm9yIChpID0gMTsgaSA8IG1ibGVuOyBpKyspCiAgCQkJCUNvcHlTZW5kQ2hhcihzdHJpbmdb aV0pOwotLS0gNDM3OSw0Mzg3IC0tLS0KICAKICAJCWlmICghc2FtZV9lbmNvZGluZykKICAJ CXsKISAJCQkvKgohIAkJCSAqIHNlbmQgYWRkaXRpb25hbCBieXRlcyBvZiB0aGUgY2hhciwg aWYgYW55CiEgCQkJICovCiAgCQkJbWJsZW4gPSBwZ19lbmNvZGluZ19tYmxlbihjbGllbnRf ZW5jb2RpbmcsIHN0cmluZyk7CiAgCQkJZm9yIChpID0gMTsgaSA8IG1ibGVuOyBpKyspCiAg CQkJCUNvcHlTZW5kQ2hhcihzdHJpbmdbaV0pOwoqKioqKioqKioqKioqKioKKioqIDI3NTks Mjc2NSAqKioqCiAgCiAgCWlmIChhdHRuYW1lbGlzdCA9PSBOSUwpCiAgCXsKISAJCS8qIEdl bmVyYXRlIGRlZmF1bHQgY29sdW1uIGxpc3QgKi8KICAJCVR1cGxlRGVzYwl0dXBEZXNjID0g UmVsYXRpb25HZXREZXNjcihyZWwpOwogIAkJRm9ybV9wZ19hdHRyaWJ1dGUgKmF0dHIgPSB0 dXBEZXNjLT5hdHRyczsKICAJCWludAkJCWF0dHJfY291bnQgPSB0dXBEZXNjLT5uYXR0czsK LS0tIDQ0MDgsNDQxNiAtLS0tCiAgCiAgCWlmIChhdHRuYW1lbGlzdCA9PSBOSUwpCiAgCXsK ISAJCS8qCiEgCQkgKiBHZW5lcmF0ZSBkZWZhdWx0IGNvbHVtbiBsaXN0CiEgCQkgKi8KICAJ CVR1cGxlRGVzYwl0dXBEZXNjID0gUmVsYXRpb25HZXREZXNjcihyZWwpOwogIAkJRm9ybV9w Z19hdHRyaWJ1dGUgKmF0dHIgPSB0dXBEZXNjLT5hdHRyczsKICAJCWludAkJCWF0dHJfY291 bnQgPSB0dXBEZXNjLT5uYXR0czsKKioqKioqKioqKioqKioqCioqKiAyNzc0LDI3ODAgKioq KgogIAl9CiAgCWVsc2UKICAJewohIAkJLyogVmFsaWRhdGUgdGhlIHVzZXItc3VwcGxpZWQg bGlzdCBhbmQgZXh0cmFjdCBhdHRudW1zICovCiAgCQlMaXN0Q2VsbCAgICpsOwogIAogIAkJ Zm9yZWFjaChsLCBhdHRuYW1lbGlzdCkKLS0tIDQ0MjUsNDQzMyAtLS0tCiAgCX0KICAJZWxz ZQogIAl7CiEgCQkvKgohIAkJICogVmFsaWRhdGUgdGhlIHVzZXItc3VwcGxpZWQgbGlzdCBh bmQgZXh0cmFjdCBhdHRudW1zCiEgCQkgKi8KICAJCUxpc3RDZWxsICAgKmw7CiAgCiAgCQlm b3JlYWNoKGwsIGF0dG5hbWVsaXN0KQoqKioqKioqKioqKioqKioKKioqIDI3ODIsMjc5MSAq KioqCiAgCQkJY2hhcgkgICAqbmFtZSA9IHN0clZhbChsZmlyc3QobCkpOwogIAkJCWludAkJ CWF0dG51bTsKICAKISAJCQkvKiBMb29rdXAgY29sdW1uIG5hbWUsIGVyZXBvcnQgb24gZmFp bHVyZSAqLwohIAkJCS8qIE5vdGUgd2UgZGlzYWxsb3cgc3lzdGVtIGNvbHVtbnMgaGVyZSAq LwogIAkJCWF0dG51bSA9IGF0dG5hbWVBdHROdW0ocmVsLCBuYW1lLCBmYWxzZSk7CiEgCQkJ LyogQ2hlY2sgZm9yIGR1cGxpY2F0ZXMgKi8KICAJCQlpZiAobGlzdF9tZW1iZXJfaW50KGF0 dG51bXMsIGF0dG51bSkpCiAgCQkJCWVyZXBvcnQoRVJST1IsCiAgCQkJCQkJKGVycmNvZGUo RVJSQ09ERV9EVVBMSUNBVEVfQ09MVU1OKSwKLS0tIDQ0MzUsNDQ1MCAtLS0tCiAgCQkJY2hh cgkgICAqbmFtZSA9IHN0clZhbChsZmlyc3QobCkpOwogIAkJCWludAkJCWF0dG51bTsKICAK ISAJCQkvKgohIAkJCSAqIExvb2t1cCBjb2x1bW4gbmFtZSwgZXJlcG9ydCBvbiBmYWlsdXJl CiEgCQkJICovCiEgCQkJLyoKISAJCQkgKiBOb3RlIHdlIGRpc2FsbG93IHN5c3RlbSBjb2x1 bW5zIGhlcmUKISAJCQkgKi8KICAJCQlhdHRudW0gPSBhdHRuYW1lQXR0TnVtKHJlbCwgbmFt ZSwgZmFsc2UpOwohIAkJCS8qCiEgCQkJICogQ2hlY2sgZm9yIGR1cGxpY2F0ZXMKISAJCQkg Ki8KICAJCQlpZiAobGlzdF9tZW1iZXJfaW50KGF0dG51bXMsIGF0dG51bSkpCiAgCQkJCWVy ZXBvcnQoRVJST1IsCiAgCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9EVVBMSUNBVEVfQ09MVU1O KSwKKioqKioqKioqKioqKioqCioqKiAyNzk3LDI3OTkgKioqKgotLS0gNDQ1Niw0NTI0IC0t LS0KICAKICAJcmV0dXJuIGF0dG51bXM7CiAgfQorIAorIC8qKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKiB1dGlsaXR5IGZ1bmN0 aW9ucywgc2hvdWxkIGJlIHBsYWNlZCBlbHNld2hlcmUgaW4gc3JjCisgICoqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAKKyAvKgor ICAqIFRoZXNlIGFyZSBjdXN0b20gdmVyc2lvbnMgb2YgdGhlIHN0cmluZyBmdW5jdGlvbiBz dHJjaHIoKS4KKyAgKiBBcyBvcHBvc2VkIHRvIHRoZSBvcmlnaW5hbCBzdHJjaHIgd2hpY2gg c2VhcmNoZXMgdGhyb3VnaAorICAqIGEgc3RyaW5nIHVudGlsIHRoZSB0YXJnZXQgY2hhcmFj dGVyIGlzIGZvdW5kLCBvciBhIE5VTEwgaXMKKyAgKiBmb3VuZCwgdGhpcyB2ZXJzaW9uIHdp bGwgbm90IHJldHVybiB3aGVuIGEgTlVMTCBpcyBmb3VuZC4KKyAgKiBJbnN0ZWFkIGl0IHdp bGwgc2VhcmNoIHRocm91Z2ggYSBwcmUtZGVmaW5lZCBsZW5ndGggb2YKKyAgKiBieXRlcyBh bmQgd2lsbCByZXR1cm4gb25seSBpZiB0aGUgdGFyZ2V0IGNoYXJhY3RlcihzKSBpcyByZWFj aGVkLgorICAqCisgICogSWYgb3VyIGNsaWVudCBlbmNvZGluZyBpcyBub3QgYSBzdXBwb3J0 ZWQgc2VydmVyIGVuY29kaW5nLCB3ZQorICAqIGtub3cgdGhhdCBpdCBpcyBub3Qgc2FmZSB0 byBsb29rIGF0IGVhY2ggY2hhcmFjdGVyIGFzIHRyYWlsaW5nCisgICogYnl0ZSBpbiBhIG11 bHRpYnl0ZSBjaGFyYWN0ZXIgbWF5IGJlIGEgNy1iaXQgQVNDSUkgZXF1aXZhbGVudC4KKyAg KiBUaGVyZWZvcmUgd2UgdXNlIHBnX2VuY29kaW5nX21ibGVuIHRvIHNraXAgdG8gdGhlIGVu ZCBvZiB0aGUKKyAgKiBjaGFyYWN0ZXIuCisgICoKKyAgKiBwYXJhbWV0ZXJzOgorICAqCSBz CSAgLSBzdHJpbmcgYmVpbmcgc2VhcmNoZWQuCisgICoJIGMobikgLSBjaGFyIHdlIGFyZSBz ZWFyY2hpbmcgZm9yLgorICAqCSBsZW4gIC0gbWF4aW11bSAjIG9mIGJ5dGVzIHRvIHNlYXJj aC4KKyAgKgorICAqIHJldHVybnM6CisgICoJIHBvaW50ZXIgdG8gYyAtIGlmIGMgaXMgbG9j YXRlZCB3aXRoaW4gdGhlIHN0cmluZy4KKyAgKgkgTlVMTCAtIGlmIGMgd2FzIG5vdCBmb3Vu ZCBpbiBzcGVjaWZpZWQgbGVuZ3RoIG9mIHNlYXJjaC4gTm90ZToKKyAgKgkJCXRoaXMgRE9F U04nVCBtZWFuIHRoYXQgYSAnXDAnIHdhcyByZWFjaGVkLgorICAqLworIGNoYXIgKgorIHN0 cmNocmxlbihjb25zdCBjaGFyICpzLCBpbnQgYywgc2l6ZV90IGxlbikKKyB7CisgCWNvbnN0 IGNoYXIgKnN0YXJ0OworIAorIAlpZiAoY2xpZW50X2VuY29kaW5nX29ubHkpCisgCXsKKyAJ CWludAkJCW1ibGVuID0gcGdfZW5jb2RpbmdfbWJsZW4oY2xpZW50X2VuY29kaW5nLCBzKTsK KyAKKyAJCWZvciAoc3RhcnQgPSBzOyAqcyAhPSBjICYmIHMgPCBzdGFydCArIGxlbjsgcyAr PSBtYmxlbikKKyAJCQltYmxlbiA9IHBnX2VuY29kaW5nX21ibGVuKGNsaWVudF9lbmNvZGlu Zywgcyk7CisgCX0KKyAJZWxzZQorIAkJLyoKKyAJCSAqIHNhZmUgdG8gc2Nyb2xsIGJ5dGUg YnkgYnl0ZQorIAkJICovCisgCXsKKyAJCWZvciAoc3RhcnQgPSBzOyAqcyAhPSBjICYmIHMg PCBzdGFydCArIGxlbjsgcysrKQorIAkJCTsKKyAJfQorIAorIAlyZXR1cm4gKCgqcyA9PSBj KSA/IChjaGFyICopIHMgOiBOVUxMKTsKKyB9CisgCisgY2hhciAqCisgc3RyMmNocmxlbihj b25zdCBjaGFyICpzLCBpbnQgYzEsIGludCBjMiwgc2l6ZV90IGxlbiwgY2hhciAqY19mb3Vu ZCkKKyB7CisgCWNvbnN0IGNoYXIgKnN0YXJ0OworIAorIAkqY19mb3VuZCA9ICdcMCc7Cisg CisgCWZvciAoc3RhcnQgPSBzOyAqcyAhPSBjMSAmJiAqcyAhPSBjMiAmJiBzIDwgc3RhcnQg KyBsZW47IHMrKykKKyAJCTsKKyAKKyAJKmNfZm91bmQgPSAqczsKKyAJcmV0dXJuICgqY19m b3VuZCAhPSAnXDAnID8gKGNoYXIgKikgcyA6IE5VTEwpOworIH0K --B_3202717953_5185116--