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 0908D52F18 for ; Tue, 2 Aug 2005 12:00:14 -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 25433-01 for ; Tue, 2 Aug 2005 15:00:02 +0000 (GMT) Received: from mail.Mi8.com (nycgw01.mi8.com [63.240.6.42]) by svr1.postgresql.org (Postfix) with ESMTP id 7F9DA52F14 for ; Tue, 2 Aug 2005 11:59:56 -0300 (ADT) Received: from 172.16.1.118 by mail.Mi8.com with ESMTP (- GW01 Welcome to Mi8 Corporation www.Mi8.com); Tue, 02 Aug 2005 10:59:42 -0400 X-Server-Uuid: F1A2E19A-84E4-48DD-8F48-B475613F58B2 Received: from MI8NYCMAIL06.Mi8.com ([172.16.1.175]) by d01smtp03.Mi8.com with Microsoft SMTPSVC(6.0.3790.1830); Tue, 2 Aug 2005 10:59:42 -0400 Received: from 141.156.39.156 ([141.156.39.156]) 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 ; Tue, 2 Aug 2005 10:59:39 -0500 User-Agent: Microsoft-Entourage/11.1.0.040913 Date: Tue, 02 Aug 2005 10:59:43 -0400 Subject: Re: COPY FROM performance improvements From: "Alon Goldshuv" To: pgsql-patches@postgresql.org Message-ID: In-Reply-To: MIME-Version: 1.0 X-OriginalArrivalTime: 02 Aug 2005 14:59:42.0607 (UTC) FILETIME=[D04361F0:01C59772] X-WSS-ID: 6EF155D427K725273-01-01 Content-Type: multipart/mixed; boundary=B_3205825185_103175599 X-Virus-Scanned: by amavisd-new at hub.org X-Spam-Status: No, hits=1.569 tagged_above=0 required=5 tests=AWL, FORGED_RCVD_HELO, RCVD_NUMERIC_HELO X-Spam-Level: * X-Archive-Number: 200508/28 X-Sequence-Number: 16975 > 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_3205825185_103175599 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit New patch attached. It includes very minor changes. These are changes that were committed to CVS 3 weeks ago (copy.c 1.247) which I missed in the previous patch. Alon. --B_3205825185_103175599 Content-Type: application/octet-stream; name=copy_parse_improvements_V16.patch Content-Disposition: attachment; filename=copy_parse_improvements_V16.patch Content-Transfer-Encoding: base64 SW5kZXg6IHNyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHkuYwo9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBm aWxlOiAvcHJvamVjdHMvY3Zzcm9vdC9wZ3NxbC9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5 LmMsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMjQ3CmRpZmYgLWMgLXIxLjI0NyBjb3B5LmMK KioqIHNyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHkuYwkxMCBKdWwgMjAwNSAyMToxMzo1OCAt MDAwMAkxLjI0NwotLS0gc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weS5jCTIgQXVnIDIwMDUg MTQ6Mzg6MzcgLTAwMDAKKioqKioqKioqKioqKioqCioqKiA1MCw1NSAqKioqCi0tLSA1MCw1 NiAtLS0tCiAgCiAgI2RlZmluZSBJU09DVEFMKGMpICgoKGMpID49ICcwJykgJiYgKChjKSA8 PSAnNycpKQogICNkZWZpbmUgT0NUVkFMVUUoYykgKChjKSAtICcwJykKKyAjZGVmaW5lIENP UFlfQlVGX1NJWkUgNjU1MzYKICAKICAvKgogICAqIFJlcHJlc2VudHMgdGhlIGRpZmZlcmVu dCBzb3VyY2UvZGVzdCBjYXNlcyB3ZSBuZWVkIHRvIHdvcnJ5IGFib3V0IGF0CioqKioqKioq KioqKioqKgoqKiogNjMsNzggKioqKgogIH0gQ29weURlc3Q7CiAgCiAgLyoKLSAgKiBTdGF0 ZSBpbmRpY2F0b3Igc2hvd2luZyB3aGF0IHN0b3BwZWQgQ29weVJlYWRBdHRyaWJ1dGUoKQot ICAqLwotIHR5cGVkZWYgZW51bSBDb3B5UmVhZFJlc3VsdAotIHsKLSAJTk9STUFMX0FUVFIs Ci0gCUVORF9PRl9MSU5FLAotIAlVTlRFUk1JTkFURURfRklFTEQKLSB9IENvcHlSZWFkUmVz dWx0OwotIAotIC8qCiAgICoJUmVwcmVzZW50cyB0aGUgZW5kLW9mLWxpbmUgdGVybWluYXRv ciB0eXBlIG9mIHRoZSBpbnB1dAogICAqLwogIHR5cGVkZWYgZW51bSBFb2xUeXBlCi0tLSA2 NCw2OSAtLS0tCioqKioqKioqKioqKioqKgoqKiogOTcsMTAyICoqKioKLS0tIDg4LDk2IC0t LS0KICBzdGF0aWMgRW9sVHlwZSBlb2xfdHlwZTsJCS8qIEVPTCB0eXBlIG9mIGlucHV0ICov CiAgc3RhdGljIGludAljbGllbnRfZW5jb2Rpbmc7CS8qIHJlbW90ZSBzaWRlJ3MgY2hhcmFj dGVyIGVuY29kaW5nICovCiAgc3RhdGljIGludAlzZXJ2ZXJfZW5jb2Rpbmc7CS8qIGxvY2Fs IGVuY29kaW5nICovCisgc3RhdGljIGNoYXIJZW9sX2NoWzJdOwkJCS8qIFRoZSBieXRlIHZh bHVlcyBvZiB0aGUgMSBvciAyIGVvbCBieXRlcyAqLworIHN0YXRpYyBib29sIGNsaWVudF9l bmNvZGluZ19vbmx5OyAvKiB0cnVlIGlmIGNsaWVudCBlbmNvZGluZyBpcyBhIG5vbgorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdXBwb3J0ZWQgc2VydmVyIGVu Y29kaW5nICovCiAgCiAgLyogdGhlc2UgYXJlIGp1c3QgZm9yIGVycm9yIG1lc3NhZ2VzLCBz ZWUgY29weV9pbl9lcnJvcl9jYWxsYmFjayAqLwogIHN0YXRpYyBib29sIGNvcHlfYmluYXJ5 OwkJLyogaXMgaXQgYSBiaW5hcnkgY29weT8gKi8KKioqKioqKioqKioqKioqCioqKiAxMDQs MTI2ICoqKioKICBzdGF0aWMgaW50CWNvcHlfbGluZW5vOwkJLyogbGluZSBudW1iZXIgZm9y IGVycm9yIG1lc3NhZ2VzICovCiAgc3RhdGljIGNvbnN0IGNoYXIgKmNvcHlfYXR0bmFtZTsJ LyogY3VycmVudCBhdHQgZm9yIGVycm9yIG1lc3NhZ2VzICovCiAgCiAgCiAgLyoKICAgKiBU aGVzZSBzdGF0aWMgdmFyaWFibGVzIGFyZSB1c2VkIHRvIGF2b2lkIGluY3VycmluZyBvdmVy aGVhZCBmb3IgZWFjaAohICAqIGF0dHJpYnV0ZSBwcm9jZXNzZWQuICBhdHRyaWJ1dGVfYnVm IGlzIHJldXNlZCBvbiBlYWNoIENvcHlSZWFkQXR0cmlidXRlCiAgICogY2FsbCB0byBob2xk IHRoZSBzdHJpbmcgYmVpbmcgcmVhZCBpbi4gIFVuZGVyIG5vcm1hbCB1c2UgaXQgd2lsbCBz b29uCiAgICogZ3JvdyB0byBhIHN1aXRhYmxlIHNpemUsIGFuZCB0aGVuIHdlIHdpbGwgYXZv aWQgcGFsbG9jL3BmcmVlIG92ZXJoZWFkCiAgICogZm9yIHN1YnNlcXVlbnQgYXR0cmlidXRl cy4gIE5vdGUgdGhhdCBDb3B5UmVhZEF0dHJpYnV0ZSByZXR1cm5zIGEgcG9pbnRlcgohICAq IHRvIGF0dHJpYnV0ZV9idWYncyBkYXRhIGJ1ZmZlciEKICAgKi8KISBzdGF0aWMgU3RyaW5n SW5mb0RhdGEgYXR0cmlidXRlX2J1ZjsKICAKICAvKgogICAqIFNpbWlsYXJseSwgbGluZV9i dWYgaG9sZHMgdGhlIHdob2xlIGlucHV0IGxpbmUgYmVpbmcgcHJvY2Vzc2VkIChpdHMKICAg KiBjdXJzb3IgZmllbGQgcG9pbnRzIHRvIHRoZSBuZXh0IGNoYXJhY3RlciB0byBiZSByZWFk IGJ5IENvcHlSZWFkQXR0cmlidXRlKS4KICAgKiBUaGUgaW5wdXQgY3ljbGUgaXMgZmlyc3Qg dG8gcmVhZCB0aGUgd2hvbGUgbGluZSBpbnRvIGxpbmVfYnVmLCBjb252ZXJ0IGl0CiAgICog dG8gc2VydmVyIGVuY29kaW5nLCBhbmQgdGhlbiBleHRyYWN0IGluZGl2aWR1YWwgYXR0cmli dXRlIGZpZWxkcyBpbnRvCiEgICogYXR0cmlidXRlX2J1Zi4gIChXZSB1c2VkIHRvIGhhdmUg Q29weVJlYWRBdHRyaWJ1dGUgcmVhZCB0aGUgaW5wdXQgc291cmNlCiAgICogZGlyZWN0bHks IGJ1dCB0aGF0IGNhdXNlZCBhIGxvdCBvZiBlbmNvZGluZyBpc3N1ZXMgYW5kIHVubmVjZXNz YXJ5IGxvZ2ljCiAgICogY29tcGxleGl0eS4pCiAgICovCi0tLSA5OCwxNDEgLS0tLQogIHN0 YXRpYyBpbnQJY29weV9saW5lbm87CQkvKiBsaW5lIG51bWJlciBmb3IgZXJyb3IgbWVzc2Fn ZXMgKi8KICBzdGF0aWMgY29uc3QgY2hhciAqY29weV9hdHRuYW1lOwkvKiBjdXJyZW50IGF0 dCBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KICAKKyAvKgorICAqIFN0YXRpYyB2YXJpYWJsZXMg Zm9yIGJ1ZmZlcmVkIGlucHV0IHBhcnNpbmcgCisgICovCisgc3RhdGljIGNoYXIgaW5wdXRf YnVmW0NPUFlfQlVGX1NJWkUgKyAxXTsgLyogZXh0cmEgYnl0ZSBmb3IgJ1wwJyAqLworIHN0 YXRpYyBpbnQJYnVmZmVyX2luZGV4OwkJLyogaW5wdXQgYnVmZmVyIGluZGV4ICovCisgc3Rh dGljIGJvb2wgZW5kX21hcmtlcjsKKyBzdGF0aWMgY2hhciAqYmVnbG9jOworIHN0YXRpYyBj aGFyICplbmRsb2M7Cisgc3RhdGljIGJvb2wgYnVmX2RvbmU7CQkJLyogZmluaXNoZWQgcHJv Y2Vzc2luZyB0aGUgY3VycmVudCBidWZmZXIgKi8KKyBzdGF0aWMgYm9vbCBsaW5lX2RvbmU7 CQkJLyogZmluaXNoZWQgcHJvY2Vzc2luZyB0aGUgd2hvbGUgbGluZSBvcgorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICogc3RvcHBlZCBpbiB0aGUgbWlkZGxlICovCisg LyogdGhlc2UgYXJlIGZvciBDU1YgZm9ybWF0ICovCisgc3RhdGljIGJvb2wJaW5fcXVvdGU7 Cisgc3RhdGljIGJvb2wgbGFzdF93YXNfZXNjOworIAorIC8qIHRoZXNlIGFyZSBmb3IgVEVY VCBmb3JtYXQgKi8KKyBzdGF0aWMgYm9vbCBlc2NfaW5fcHJldmJ1ZjsJCS8qIGVzY2FwZSB3 YXMgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAqIGlucHV0IGJ1ZmZlciAqLworIHN0YXRpYyBib29sIGNyX2luX3ByZXZi dWY7CQkvKiBDUiB3YXMgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlIGRhdGEgaW5wdXQKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJ1ZmZlciAqLworIAogIAogIC8qCiAg ICogVGhlc2Ugc3RhdGljIHZhcmlhYmxlcyBhcmUgdXNlZCB0byBhdm9pZCBpbmN1cnJpbmcg b3ZlcmhlYWQgZm9yIGVhY2gKISAgKiBhdHRyaWJ1dGUgcHJvY2Vzc2VkLiAgYXR0cl9idWYg aXMgcmV1c2VkIG9uIGVhY2ggQ29weVJlYWRBdHRyaWJ1dGUKICAgKiBjYWxsIHRvIGhvbGQg dGhlIHN0cmluZyBiZWluZyByZWFkIGluLiAgVW5kZXIgbm9ybWFsIHVzZSBpdCB3aWxsIHNv b24KICAgKiBncm93IHRvIGEgc3VpdGFibGUgc2l6ZSwgYW5kIHRoZW4gd2Ugd2lsbCBhdm9p ZCBwYWxsb2MvcGZyZWUgb3ZlcmhlYWQKICAgKiBmb3Igc3Vic2VxdWVudCBhdHRyaWJ1dGVz LiAgTm90ZSB0aGF0IENvcHlSZWFkQXR0cmlidXRlIHJldHVybnMgYSBwb2ludGVyCiEgICog dG8gYXR0cl9idWYncyBkYXRhIGJ1ZmZlciEKICAgKi8KISBzdGF0aWMgU3RyaW5nSW5mb0Rh dGEgYXR0cl9idWY7IAogIAogIC8qCiAgICogU2ltaWxhcmx5LCBsaW5lX2J1ZiBob2xkcyB0 aGUgd2hvbGUgaW5wdXQgbGluZSBiZWluZyBwcm9jZXNzZWQgKGl0cwogICAqIGN1cnNvciBm aWVsZCBwb2ludHMgdG8gdGhlIG5leHQgY2hhcmFjdGVyIHRvIGJlIHJlYWQgYnkgQ29weVJl YWRBdHRyaWJ1dGUpLgogICAqIFRoZSBpbnB1dCBjeWNsZSBpcyBmaXJzdCB0byByZWFkIHRo ZSB3aG9sZSBsaW5lIGludG8gbGluZV9idWYsIGNvbnZlcnQgaXQKICAgKiB0byBzZXJ2ZXIg ZW5jb2RpbmcsIGFuZCB0aGVuIGV4dHJhY3QgaW5kaXZpZHVhbCBhdHRyaWJ1dGUgZmllbGRz IGludG8KISAgKiBhdHRyX2J1Zi4gIChXZSB1c2VkIHRvIGhhdmUgQ29weVJlYWRBdHRyaWJ1 dGUgcmVhZCB0aGUgaW5wdXQgc291cmNlCiAgICogZGlyZWN0bHksIGJ1dCB0aGF0IGNhdXNl ZCBhIGxvdCBvZiBlbmNvZGluZyBpc3N1ZXMgYW5kIHVubmVjZXNzYXJ5IGxvZ2ljCiAgICog Y29tcGxleGl0eS4pCiAgICovCioqKioqKioqKioqKioqKgoqKiogMTM3LDE1NSAqKioqCiAg c3RhdGljIHZvaWQgQ29weUZyb20oUmVsYXRpb24gcmVsLCBMaXN0ICphdHRudW1saXN0LCBi b29sIGJpbmFyeSwgYm9vbCBvaWRzLAogICBjaGFyICpkZWxpbSwgY2hhciAqbnVsbF9wcmlu dCwgYm9vbCBjc3ZfbW9kZSwgY2hhciAqcXVvdGUsIGNoYXIgKmVzY2FwZSwKICAJCSBMaXN0 ICpmb3JjZV9ub3RudWxsX2F0dHMsIGJvb2wgaGVhZGVyX2xpbmUpOwohIHN0YXRpYyBib29s IENvcHlSZWFkTGluZShjaGFyICogcXVvdGUsIGNoYXIgKiBlc2NhcGUpOwohIHN0YXRpYyBj aGFyICpDb3B5UmVhZEF0dHJpYnV0ZShjb25zdCBjaGFyICpkZWxpbSwgY29uc3QgY2hhciAq bnVsbF9wcmludCwKISAJCQkJICBDb3B5UmVhZFJlc3VsdCAqcmVzdWx0LCBib29sICppc251 bGwpOwohIHN0YXRpYyBjaGFyICpDb3B5UmVhZEF0dHJpYnV0ZUNTVihjb25zdCBjaGFyICpk ZWxpbSwgY29uc3QgY2hhciAqbnVsbF9wcmludCwKISAJCQkJCSBjaGFyICpxdW90ZSwgY2hh ciAqZXNjYXBlLAohIAkJCQkJIENvcHlSZWFkUmVzdWx0ICpyZXN1bHQsIGJvb2wgKmlzbnVs bCk7CiAgc3RhdGljIERhdHVtIENvcHlSZWFkQmluYXJ5QXR0cmlidXRlKGludCBjb2x1bW5f bm8sIEZtZ3JJbmZvICpmbGluZm8sCiAgCQkJCQkJT2lkIHR5cGlvcGFyYW0sIGludDMyIHR5 cG1vZCwgYm9vbCAqaXNudWxsKTsKICBzdGF0aWMgdm9pZCBDb3B5QXR0cmlidXRlT3V0KGNo YXIgKnN0cmluZywgY2hhciAqZGVsaW0pOwogIHN0YXRpYyB2b2lkIENvcHlBdHRyaWJ1dGVP dXRDU1YoY2hhciAqc3RyaW5nLCBjaGFyICpkZWxpbSwgY2hhciAqcXVvdGUsCiAgCQkJCQlj aGFyICplc2NhcGUsIGJvb2wgZm9yY2VfcXVvdGUpOwogIHN0YXRpYyBMaXN0ICpDb3B5R2V0 QXR0bnVtcyhSZWxhdGlvbiByZWwsIExpc3QgKmF0dG5hbWVsaXN0KTsKICBzdGF0aWMgdm9p ZCBsaW1pdF9wcmludG91dF9sZW5ndGgoU3RyaW5nSW5mbyBidWYpOwogIAogIC8qIEludGVy bmFsIGNvbW11bmljYXRpb25zIGZ1bmN0aW9ucyAqLwogIHN0YXRpYyB2b2lkIFNlbmRDb3B5 QmVnaW4oYm9vbCBiaW5hcnksIGludCBuYXR0cyk7Ci0tLSAxNTIsMTc2IC0tLS0KICBzdGF0 aWMgdm9pZCBDb3B5RnJvbShSZWxhdGlvbiByZWwsIExpc3QgKmF0dG51bWxpc3QsIGJvb2wg YmluYXJ5LCBib29sIG9pZHMsCiAgIGNoYXIgKmRlbGltLCBjaGFyICpudWxsX3ByaW50LCBi b29sIGNzdl9tb2RlLCBjaGFyICpxdW90ZSwgY2hhciAqZXNjYXBlLAogIAkJIExpc3QgKmZv cmNlX25vdG51bGxfYXR0cywgYm9vbCBoZWFkZXJfbGluZSk7CiEgc3RhdGljIGJvb2wgQ29w eVJlYWRMaW5lVGV4dChzaXplX3QgYnl0ZXNyZWFkLCBjaGFyICplc2NhcGUpOwohIHN0YXRp YyBib29sIENvcHlSZWFkTGluZUNTVihzaXplX3QgYnl0ZXNyZWFkLCBjaGFyICpxdW90ZSwg Y2hhciAqZXNjYXBlKTsKISBzdGF0aWMgdm9pZCBDb3B5UmVhZEF0dHJpYnV0ZXNUZXh0KGNv bnN0IGNoYXIgKmRlbGltLCBjb25zdCBjaGFyICplc2NhcGUsIGNvbnN0IGNoYXIgKm51bGxf cHJpbnQsCiEgCQkJCQkJCQkgICBpbnQgbnVsbF9wcmludF9sZW4sIGNoYXIgKm51bGxzLCBM aXN0ICphdHRudW1saXN0LCAKISAJCQkJCQkJCSAgIGludCAqYXR0cl9vZmZzZXRzLCBpbnQg bnVtX3BoeXNfYXR0cnMsIEZvcm1fcGdfYXR0cmlidXRlICphdHRyKTsKISBzdGF0aWMgdm9p ZCBDb3B5UmVhZEF0dHJpYnV0ZXNDU1YoY29uc3QgY2hhciAqZGVsaW0sIGNvbnN0IGNoYXIg Km51bGxfcHJpbnQsIGNoYXIgKnF1b3RlLAohIAkJCQkJCQkJICBjaGFyICplc2NhcGUsIGlu dCBudWxsX3ByaW50X2xlbiwgY2hhciAqbnVsbHMsIExpc3QgKmF0dG51bWxpc3QsIAohIAkJ CQkJCQkJICBpbnQgKmF0dHJfb2Zmc2V0cywgaW50IG51bV9waHlzX2F0dHJzLCBGb3JtX3Bn X2F0dHJpYnV0ZSAqYXR0cik7CiAgc3RhdGljIERhdHVtIENvcHlSZWFkQmluYXJ5QXR0cmli dXRlKGludCBjb2x1bW5fbm8sIEZtZ3JJbmZvICpmbGluZm8sCiAgCQkJCQkJT2lkIHR5cGlv cGFyYW0sIGludDMyIHR5cG1vZCwgYm9vbCAqaXNudWxsKTsKKyBzdGF0aWMgY2hhciAqQ29w eVJlYWRPaWRBdHRyKGNvbnN0IGNoYXIgKmRlbGltLCBjb25zdCBjaGFyICpudWxsX3ByaW50 LCBpbnQgbnVsbF9wcmludF9sZW4sCisgCQkJCSAgICAgICAgICAgICBib29sICppc251bGwp OwogIHN0YXRpYyB2b2lkIENvcHlBdHRyaWJ1dGVPdXQoY2hhciAqc3RyaW5nLCBjaGFyICpk ZWxpbSk7CiAgc3RhdGljIHZvaWQgQ29weUF0dHJpYnV0ZU91dENTVihjaGFyICpzdHJpbmcs IGNoYXIgKmRlbGltLCBjaGFyICpxdW90ZSwKICAJCQkJCWNoYXIgKmVzY2FwZSwgYm9vbCBm b3JjZV9xdW90ZSk7CiAgc3RhdGljIExpc3QgKkNvcHlHZXRBdHRudW1zKFJlbGF0aW9uIHJl bCwgTGlzdCAqYXR0bmFtZWxpc3QpOwogIHN0YXRpYyB2b2lkIGxpbWl0X3ByaW50b3V0X2xl bmd0aChTdHJpbmdJbmZvIGJ1Zik7Cisgc3RhdGljIGJvb2wgRGV0ZWN0TGluZUVuZChzaXpl X3QgYnl0ZXNyZWFkLCBjaGFyICpxdW90ZSwgY2hhciAqZXNjYXBlKTsKKyAKICAKICAvKiBJ bnRlcm5hbCBjb21tdW5pY2F0aW9ucyBmdW5jdGlvbnMgKi8KICBzdGF0aWMgdm9pZCBTZW5k Q29weUJlZ2luKGJvb2wgYmluYXJ5LCBpbnQgbmF0dHMpOwoqKioqKioqKioqKioqKioKKioq IDE1OSwxNzUgKioqKgogIHN0YXRpYyB2b2lkIENvcHlTZW5kU3RyaW5nKGNvbnN0IGNoYXIg KnN0cik7CiAgc3RhdGljIHZvaWQgQ29weVNlbmRDaGFyKGNoYXIgYyk7CiAgc3RhdGljIHZv aWQgQ29weVNlbmRFbmRPZlJvdyhib29sIGJpbmFyeSk7CiEgc3RhdGljIHZvaWQgQ29weUdl dERhdGEodm9pZCAqZGF0YWJ1ZiwgaW50IGRhdGFzaXplKTsKISBzdGF0aWMgaW50CUNvcHlH ZXRDaGFyKHZvaWQpOwogIAogICNkZWZpbmUgQ29weUdldEVvZigpICAoZmVfZW9mKQotIHN0 YXRpYyBpbnQJQ29weVBlZWtDaGFyKHZvaWQpOwotIHN0YXRpYyB2b2lkIENvcHlEb25lUGVl ayhpbnQgYywgYm9vbCBwaWNrdXApOwogIHN0YXRpYyB2b2lkIENvcHlTZW5kSW50MzIoaW50 MzIgdmFsKTsKICBzdGF0aWMgaW50MzIgQ29weUdldEludDMyKHZvaWQpOwogIHN0YXRpYyB2 b2lkIENvcHlTZW5kSW50MTYoaW50MTYgdmFsKTsKICBzdGF0aWMgaW50MTYgQ29weUdldElu dDE2KHZvaWQpOwogIAogIAogIC8qCiAgICogU2VuZCBjb3B5IHN0YXJ0L3N0b3AgbWVzc2Fn ZXMgZm9yIGZyb250ZW5kIGNvcGllcy4gIFRoZXNlIGhhdmUgY2hhbmdlZAotLS0gMTgwLDE5 NyAtLS0tCiAgc3RhdGljIHZvaWQgQ29weVNlbmRTdHJpbmcoY29uc3QgY2hhciAqc3RyKTsK ICBzdGF0aWMgdm9pZCBDb3B5U2VuZENoYXIoY2hhciBjKTsKICBzdGF0aWMgdm9pZCBDb3B5 U2VuZEVuZE9mUm93KGJvb2wgYmluYXJ5KTsKISBzdGF0aWMgaW50CUNvcHlHZXREYXRhKHZv aWQgKmRhdGFidWYsIGludCBkYXRhc2l6ZSk7CiAgCiAgI2RlZmluZSBDb3B5R2V0RW9mKCkg IChmZV9lb2YpCiAgc3RhdGljIHZvaWQgQ29weVNlbmRJbnQzMihpbnQzMiB2YWwpOwogIHN0 YXRpYyBpbnQzMiBDb3B5R2V0SW50MzIodm9pZCk7CiAgc3RhdGljIHZvaWQgQ29weVNlbmRJ bnQxNihpbnQxNiB2YWwpOwogIHN0YXRpYyBpbnQxNiBDb3B5R2V0SW50MTYodm9pZCk7CiAg CisgLyogYnl0ZSBzY2FuaW5nIHV0aWxzICovCisgc3RhdGljIGNoYXIgKnNjYW5UZXh0TGlu ZShjb25zdCBjaGFyICpzLCBjaGFyIGMsIHNpemVfdCBsZW4pOworIHN0YXRpYyBjaGFyICpz Y2FuQ1NWTGluZShjb25zdCBjaGFyICpzLCBjaGFyIGMxLCBjaGFyIGMyLCBjaGFyIGMzLCBz aXplX3QgbGVuKTsKKyBzdGF0aWMgY2hhciAqc2NhblRleHRBdHRyKGNvbnN0IGNoYXIgKnMs IGNoYXIgYzEsIGNoYXIgYzIsIHNpemVfdCBsZW4pOwogIAogIC8qCiAgICogU2VuZCBjb3B5 IHN0YXJ0L3N0b3AgbWVzc2FnZXMgZm9yIGZyb250ZW5kIGNvcGllcy4gIFRoZXNlIGhhdmUg Y2hhbmdlZAoqKioqKioqKioqKioqKioKKioqIDM4MiwzOTUgKioqKgogICAqIEl0IHNlZW1z IHVud2lzZSB0byBhbGxvdyB0aGUgQ09QWSBJTiB0byBjb21wbGV0ZSBub3JtYWxseSBpbiB0 aGF0IGNhc2UuCiAgICoKICAgKiBOQjogbm8gZGF0YSBjb252ZXJzaW9uIGlzIGFwcGxpZWQg YnkgdGhlc2UgZnVuY3Rpb25zCiAgICovCiEgc3RhdGljIHZvaWQKICBDb3B5R2V0RGF0YSh2 b2lkICpkYXRhYnVmLCBpbnQgZGF0YXNpemUpCiAgewogIAlzd2l0Y2ggKGNvcHlfZGVzdCkK ICAJewogIAkJY2FzZSBDT1BZX0ZJTEU6CiEgCQkJZnJlYWQoZGF0YWJ1ZiwgZGF0YXNpemUs IDEsIGNvcHlfZmlsZSk7CiAgCQkJaWYgKGZlb2YoY29weV9maWxlKSkKICAJCQkJZmVfZW9m ID0gdHJ1ZTsKICAJCQlicmVhazsKLS0tIDQwNCw0MjIgLS0tLQogICAqIEl0IHNlZW1zIHVu d2lzZSB0byBhbGxvdyB0aGUgQ09QWSBJTiB0byBjb21wbGV0ZSBub3JtYWxseSBpbiB0aGF0 IGNhc2UuCiAgICoKICAgKiBOQjogbm8gZGF0YSBjb252ZXJzaW9uIGlzIGFwcGxpZWQgYnkg dGhlc2UgZnVuY3Rpb25zCisgICoKKyAgKiBSZXR1cm5zOiB0aGUgbnVtYmVyIG9mIGJ5dGVz IHRoYXQgd2VyZSBzdWNjZXNzZnVsbHkgcmVhZAorICAqIGludG8gdGhlIGRhdGEgYnVmZmVy LgogICAqLwohIHN0YXRpYyBpbnQKICBDb3B5R2V0RGF0YSh2b2lkICpkYXRhYnVmLCBpbnQg ZGF0YXNpemUpCiAgeworIAlzaXplX3QJCWJ5dGVzcmVhZCA9IDA7CisgCiAgCXN3aXRjaCAo Y29weV9kZXN0KQogIAl7CiAgCQljYXNlIENPUFlfRklMRToKISAJCQlieXRlc3JlYWQgPSBm cmVhZChkYXRhYnVmLCAxLCBkYXRhc2l6ZSwgY29weV9maWxlKTsKICAJCQlpZiAoZmVvZihj b3B5X2ZpbGUpKQogIAkJCQlmZV9lb2YgPSB0cnVlOwogIAkJCWJyZWFrOwoqKioqKioqKioq KioqKioKKioqIDQwMSw0MDYgKioqKgotLS0gNDI4LDQzNSAtLS0tCiAgCQkJCQkJKGVycmNv ZGUoRVJSQ09ERV9DT05ORUNUSU9OX0ZBSUxVUkUpLAogIAkJCQkJCSBlcnJtc2coInVuZXhw ZWN0ZWQgRU9GIG9uIGNsaWVudCBjb25uZWN0aW9uIikpKTsKICAJCQl9CisgCQkJYnl0ZXNy ZWFkICs9IGRhdGFzaXplOwkJLyogdXBkYXRlIHRoZSBjb3VudCBvZiBieXRlcyB0aGF0IHdl cmUKKyAJCQkJCQkJCQkJICogcmVhZCBzbyBmYXIgKi8KICAJCQlicmVhazsKICAJCWNhc2Ug Q09QWV9ORVdfRkU6CiAgCQkJd2hpbGUgKGRhdGFzaXplID4gMCAmJiAhZmVfZW9mKQoqKioq KioqKioqKioqKioKKioqIDQyOSw0MzUgKioqKgogIAkJCQkJCWNhc2UgJ2MnOgkJLyogQ29w eURvbmUgKi8KICAJCQkJCQkJLyogQ09QWSBJTiBjb3JyZWN0bHkgdGVybWluYXRlZCBieSBm cm9udGVuZCAqLwogIAkJCQkJCQlmZV9lb2YgPSB0cnVlOwohIAkJCQkJCQlyZXR1cm47CiAg CQkJCQkJY2FzZSAnZic6CQkvKiBDb3B5RmFpbCAqLwogIAkJCQkJCQllcmVwb3J0KEVSUk9S LAogIAkJCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfUVVFUllfQ0FOQ0VMRUQpLAotLS0gNDU4 LDQ2NCAtLS0tCiAgCQkJCQkJY2FzZSAnYyc6CQkvKiBDb3B5RG9uZSAqLwogIAkJCQkJCQkv KiBDT1BZIElOIGNvcnJlY3RseSB0ZXJtaW5hdGVkIGJ5IGZyb250ZW5kICovCiAgCQkJCQkJ CWZlX2VvZiA9IHRydWU7CiEgCQkJCQkJCXJldHVybiBieXRlc3JlYWQ7CiAgCQkJCQkJY2Fz ZSAnZic6CQkvKiBDb3B5RmFpbCAqLwogIAkJCQkJCQllcmVwb3J0KEVSUk9SLAogIAkJCQkJ CQkJCShlcnJjb2RlKEVSUkNPREVfUVVFUllfQ0FOQ0VMRUQpLAoqKioqKioqKioqKioqKioK KioqIDQ1OSw1OTggKioqKgogIAkJCQkJYXZhaWwgPSBkYXRhc2l6ZTsKICAJCQkJcHFfY29w eW1zZ2J5dGVzKGNvcHlfbXNnYnVmLCBkYXRhYnVmLCBhdmFpbCk7CiAgCQkJCWRhdGFidWYg PSAodm9pZCAqKSAoKGNoYXIgKikgZGF0YWJ1ZiArIGF2YWlsKTsKICAJCQkJZGF0YXNpemUg LT0gYXZhaWw7CiAgCQkJfQogIAkJCWJyZWFrOwogIAl9Ci0gfQotIAotIHN0YXRpYyBpbnQK LSBDb3B5R2V0Q2hhcih2b2lkKQotIHsKLSAJaW50CQkJY2g7Ci0gCi0gCXN3aXRjaCAoY29w eV9kZXN0KQotIAl7Ci0gCQljYXNlIENPUFlfRklMRToKLSAJCQljaCA9IGdldGMoY29weV9m aWxlKTsKLSAJCQlicmVhazsKLSAJCWNhc2UgQ09QWV9PTERfRkU6Ci0gCQkJY2ggPSBwcV9n ZXRieXRlKCk7Ci0gCQkJaWYgKGNoID09IEVPRikKLSAJCQl7Ci0gCQkJCS8qIE9ubHkgYSBc LiB0ZXJtaW5hdG9yIGlzIGxlZ2FsIEVPRiBpbiBvbGQgcHJvdG9jb2wgKi8KLSAJCQkJZXJl cG9ydChFUlJPUiwKLSAJCQkJCQkoZXJyY29kZShFUlJDT0RFX0NPTk5FQ1RJT05fRkFJTFVS RSksCi0gCQkJCQkJIGVycm1zZygidW5leHBlY3RlZCBFT0Ygb24gY2xpZW50IGNvbm5lY3Rp b24iKSkpOwotIAkJCX0KLSAJCQlicmVhazsKLSAJCWNhc2UgQ09QWV9ORVdfRkU6Ci0gCQkJ ewotIAkJCQl1bnNpZ25lZCBjaGFyIGNjOwotIAotIAkJCQlDb3B5R2V0RGF0YSgmY2MsIDEp OwotIAkJCQlpZiAoZmVfZW9mKQotIAkJCQkJY2ggPSBFT0Y7Ci0gCQkJCWVsc2UKLSAJCQkJ CWNoID0gY2M7Ci0gCQkJCWJyZWFrOwotIAkJCX0KLSAJCWRlZmF1bHQ6Ci0gCQkJY2ggPSBF T0Y7Ci0gCQkJYnJlYWs7Ci0gCX0KLSAJaWYgKGNoID09IEVPRikKLSAJCWZlX2VvZiA9IHRy dWU7Ci0gCXJldHVybiBjaDsKLSB9Ci0gCi0gLyoKLSAgKiBDb3B5UGVla0NoYXIgcmVhZHMg YSBieXRlIGluICJwZWVrYWJsZSIgbW9kZS4KLSAgKgotICAqIGFmdGVyIGVhY2ggY2FsbCB0 byBDb3B5UGVla0NoYXIsIGEgY2FsbCB0byBDb3B5RG9uZVBlZWsgX211c3RfCi0gICogZm9s bG93LCB1bmxlc3MgRU9GIHdhcyByZXR1cm5lZC4KLSAgKgotICAqIENvcHlEb25lUGVlayB3 aWxsIGVpdGhlciB0YWtlIHRoZSBwZWVrZWQgY2hhciBvZmYgdGhlIHN0cmVhbQotICAqIChp ZiBwaWNrdXAgaXMgdHJ1ZSkgb3IgbGVhdmUgaXQgb24gdGhlIHN0cmVhbSAoaWYgcGlja3Vw IGlzIGZhbHNlKS4KLSAgKi8KLSBzdGF0aWMgaW50Ci0gQ29weVBlZWtDaGFyKHZvaWQpCi0g ewotIAlpbnQJCQljaDsKLSAKLSAJc3dpdGNoIChjb3B5X2Rlc3QpCi0gCXsKLSAJCWNhc2Ug Q09QWV9GSUxFOgotIAkJCWNoID0gZ2V0Yyhjb3B5X2ZpbGUpOwotIAkJCWJyZWFrOwotIAkJ Y2FzZSBDT1BZX09MRF9GRToKLSAJCQljaCA9IHBxX3BlZWtieXRlKCk7Ci0gCQkJaWYgKGNo ID09IEVPRikKLSAJCQl7Ci0gCQkJCS8qIE9ubHkgYSBcLiB0ZXJtaW5hdG9yIGlzIGxlZ2Fs IEVPRiBpbiBvbGQgcHJvdG9jb2wgKi8KLSAJCQkJZXJlcG9ydChFUlJPUiwKLSAJCQkJCQko ZXJyY29kZShFUlJDT0RFX0NPTk5FQ1RJT05fRkFJTFVSRSksCi0gCQkJCQkJIGVycm1zZygi dW5leHBlY3RlZCBFT0Ygb24gY2xpZW50IGNvbm5lY3Rpb24iKSkpOwotIAkJCX0KLSAJCQli cmVhazsKLSAJCWNhc2UgQ09QWV9ORVdfRkU6Ci0gCQkJewotIAkJCQl1bnNpZ25lZCBjaGFy IGNjOwotIAotIAkJCQlDb3B5R2V0RGF0YSgmY2MsIDEpOwotIAkJCQlpZiAoZmVfZW9mKQot IAkJCQkJY2ggPSBFT0Y7Ci0gCQkJCWVsc2UKLSAJCQkJCWNoID0gY2M7Ci0gCQkJCWJyZWFr OwotIAkJCX0KLSAJCWRlZmF1bHQ6Ci0gCQkJY2ggPSBFT0Y7Ci0gCQkJYnJlYWs7Ci0gCX0K LSAJaWYgKGNoID09IEVPRikKLSAJCWZlX2VvZiA9IHRydWU7Ci0gCXJldHVybiBjaDsKLSB9 Ci0gCi0gc3RhdGljIHZvaWQKLSBDb3B5RG9uZVBlZWsoaW50IGMsIGJvb2wgcGlja3VwKQot IHsKLSAJaWYgKGZlX2VvZikKLSAJCXJldHVybjsJCQkJCS8qIGNhbid0IHVuZ2V0IGFuIEVP RiAqLwotIAlzd2l0Y2ggKGNvcHlfZGVzdCkKLSAJewotIAkJY2FzZSBDT1BZX0ZJTEU6Ci0g CQkJaWYgKCFwaWNrdXApCi0gCQkJewotIAkJCQkvKiBXZSBkb24ndCB3YW50IHRvIHBpY2sg aXQgdXAgLSBzbyBwdXQgaXQgYmFjayBpbiB0aGVyZSAqLwotIAkJCQl1bmdldGMoYywgY29w eV9maWxlKTsKLSAJCQl9Ci0gCQkJLyogSWYgd2Ugd2FudGVkIHRvIHBpY2sgaXQgdXAsIGl0 J3MgYWxyZWFkeSBkb25lICovCi0gCQkJYnJlYWs7Ci0gCQljYXNlIENPUFlfT0xEX0ZFOgot IAkJCWlmIChwaWNrdXApCi0gCQkJewotIAkJCQkvKiBXZSB3YW50IHRvIHBpY2sgaXQgdXAg Ki8KLSAJCQkJKHZvaWQpIHBxX2dldGJ5dGUoKTsKLSAJCQl9CiAgCiEgCQkJLyoKISAJCQkg KiBJZiB3ZSBkaWRuJ3Qgd2FudCB0byBwaWNrIGl0IHVwLCBqdXN0IGxlYXZlIGl0IHdoZXJl IGl0CiEgCQkJICogc2l0cwohIAkJCSAqLwohIAkJCWJyZWFrOwohIAkJY2FzZSBDT1BZX05F V19GRToKISAJCQlpZiAoIXBpY2t1cCkKISAJCQl7CiEgCQkJCS8qIFdlIGRvbid0IHdhbnQg dG8gcGljayBpdCB1cCAtIHNvIHB1dCBpdCBiYWNrIGluIHRoZXJlICovCiEgCQkJCWNvcHlf bXNnYnVmLT5jdXJzb3ItLTsKISAJCQl9CiEgCQkJLyogSWYgd2Ugd2FudGVkIHRvIHBpY2sg aXQgdXAsIGl0J3MgYWxyZWFkeSBkb25lICovCiEgCQkJYnJlYWs7CiEgCX0KICB9CiAgCi0g CiAgLyoKICAgKiBUaGVzZSBmdW5jdGlvbnMgZG8gYXBwbHkgc29tZSBkYXRhIGNvbnZlcnNp b24KICAgKi8KLS0tIDQ4OCw1MDMgLS0tLQogIAkJCQkJYXZhaWwgPSBkYXRhc2l6ZTsKICAJ CQkJcHFfY29weW1zZ2J5dGVzKGNvcHlfbXNnYnVmLCBkYXRhYnVmLCBhdmFpbCk7CiAgCQkJ CWRhdGFidWYgPSAodm9pZCAqKSAoKGNoYXIgKikgZGF0YWJ1ZiArIGF2YWlsKTsKKyAJCQkJ Ynl0ZXNyZWFkICs9IGF2YWlsOwkJLyogdXBkYXRlIHRoZSBjb3VudCBvZiBieXRlcyB0aGF0 IHdlcmUKKyAJCQkJCQkJCQkJICogcmVhZCBzbyBmYXIgKi8KICAJCQkJZGF0YXNpemUgLT0g YXZhaWw7CiAgCQkJfQogIAkJCWJyZWFrOwogIAl9CiAgCiEgCXJldHVybiBieXRlc3JlYWQ7 CiAgfQogIAogIC8qCiAgICogVGhlc2UgZnVuY3Rpb25zIGRvIGFwcGx5IHNvbWUgZGF0YSBj b252ZXJzaW9uCiAgICovCioqKioqKioqKioqKioqKgoqKiogOTY4LDk4MCAqKioqCiAgCX0K ICAKICAJLyogU2V0IHVwIHZhcmlhYmxlcyB0byBhdm9pZCBwZXItYXR0cmlidXRlIG92ZXJo ZWFkLiAqLwohIAlpbml0U3RyaW5nSW5mbygmYXR0cmlidXRlX2J1Zik7CiAgCWluaXRTdHJp bmdJbmZvKCZsaW5lX2J1Zik7CiAgCWxpbmVfYnVmX2NvbnZlcnRlZCA9IGZhbHNlOwogIAog IAljbGllbnRfZW5jb2RpbmcgPSBwZ19nZXRfY2xpZW50X2VuY29kaW5nKCk7CiAgCXNlcnZl cl9lbmNvZGluZyA9IEdldERhdGFiYXNlRW5jb2RpbmcoKTsKICAKICAJY29weV9kZXN0ID0g Q09QWV9GSUxFOwkJLyogZGVmYXVsdCAqLwogIAljb3B5X2ZpbGUgPSBOVUxMOwogIAljb3B5 X21zZ2J1ZiA9IE5VTEw7Ci0tLSA4NzMsOTA1IC0tLS0KICAJfQogIAogIAkvKiBTZXQgdXAg dmFyaWFibGVzIHRvIGF2b2lkIHBlci1hdHRyaWJ1dGUgb3ZlcmhlYWQuICovCiEgCWluaXRT dHJpbmdJbmZvKCZhdHRyX2J1Zik7CiAgCWluaXRTdHJpbmdJbmZvKCZsaW5lX2J1Zik7CiAg CWxpbmVfYnVmX2NvbnZlcnRlZCA9IGZhbHNlOwogIAogIAljbGllbnRfZW5jb2RpbmcgPSBw Z19nZXRfY2xpZW50X2VuY29kaW5nKCk7CiAgCXNlcnZlcl9lbmNvZGluZyA9IEdldERhdGFi YXNlRW5jb2RpbmcoKTsKICAKKyAJLyoKKyAJICogY2hlY2sgaWYgdGhlIGNsaWVudCBlbmNv ZGluZyBpcyBvbmUgb2YgdGhlIDUgZW5jb2RpbmdzCisgCSAqIHRoYXQgYXJlIG5vdCBzdXBw b3J0ZWQgYXMgYSBzZXJ2ZXIgZW5jb2RpbmdzLgorIAkgKi8KKyAJc3dpdGNoIChjbGllbnRf ZW5jb2RpbmcpCisgCXsKKyAJCWNhc2UgUEdfU0pJUzoKKyAJCWNhc2UgUEdfQklHNToKKyAJ CWNhc2UgUEdfR0JLOgorIAkJY2FzZSBQR19VSEM6CisgCQljYXNlIFBHX0dCMTgwMzA6Cisg CQkJY2xpZW50X2VuY29kaW5nX29ubHkgPSB0cnVlOworIAkJCWJyZWFrOworIAkJZGVmYXVs dDoKKyAJCQljbGllbnRfZW5jb2Rpbmdfb25seSA9IGZhbHNlOworIAl9CisgCisgCWlmKCFj c3ZfbW9kZSkKKyAJICAgIGVzY2FwZSA9ICJcXCI7CQkvKiBkZWZhdWx0IGZvciB0ZXh0IGZv cm1hdCAqLworIAogIAljb3B5X2Rlc3QgPSBDT1BZX0ZJTEU7CQkvKiBkZWZhdWx0ICovCiAg CWNvcHlfZmlsZSA9IE5VTEw7CiAgCWNvcHlfbXNnYnVmID0gTlVMTDsKKioqKioqKioqKioq KioqCioqKiAxMTA1LDExMTMgKioqKgogIAkJCQkJIGVycm1zZygiY291bGQgbm90IHdyaXRl IHRvIGZpbGUgXCIlc1wiOiAlbSIsCiAgCQkJCQkJCWZpbGVuYW1lKSkpOwogIAl9CiEgCXBm cmVlKGF0dHJpYnV0ZV9idWYuZGF0YSk7CiAgCXBmcmVlKGxpbmVfYnVmLmRhdGEpOwogIAog IAkvKgogIAkgKiBDbG9zZSB0aGUgcmVsYXRpb24uCUlmIHJlYWRpbmcsIHdlIGNhbiByZWxl YXNlIHRoZSBBY2Nlc3NTaGFyZUxvY2sKICAJICogd2UgZ290OyBpZiB3cml0aW5nLCB3ZSBz aG91bGQgaG9sZCB0aGUgbG9jayB1bnRpbCBlbmQgb2YKLS0tIDEwMzAsMTAzOSAtLS0tCiAg CQkJCQkgZXJybXNnKCJjb3VsZCBub3Qgd3JpdGUgdG8gZmlsZSBcIiVzXCI6ICVtIiwKICAJ CQkJCQkJZmlsZW5hbWUpKSk7CiAgCX0KISAJcGZyZWUoYXR0cl9idWYuZGF0YSk7CiAgCXBm cmVlKGxpbmVfYnVmLmRhdGEpOwogIAorIAogIAkvKgogIAkgKiBDbG9zZSB0aGUgcmVsYXRp b24uCUlmIHJlYWRpbmcsIHdlIGNhbiByZWxlYXNlIHRoZSBBY2Nlc3NTaGFyZUxvY2sKICAJ ICogd2UgZ290OyBpZiB3cml0aW5nLCB3ZSBzaG91bGQgaG9sZCB0aGUgbG9jayB1bnRpbCBl bmQgb2YKKioqKioqKioqKioqKioqCioqKiAxMzQ1LDEzNTEgKioqKgogIAkJCQl7CiAgCQkJ CQlieXRlYQkgICAqb3V0cHV0Ynl0ZXM7CiAgCiEgCQkJCQlvdXRwdXRieXRlcyA9IERhdHVt R2V0Qnl0ZWFQKEZ1bmN0aW9uQ2FsbDEoJm91dF9mdW5jdGlvbnNbYXR0bnVtIC0gMV0sCiAg CQkJCQkJCQkJCQkJCQkJICAgdmFsdWUpKTsKICAJCQkJCS8qIFdlIGFzc3VtZSB0aGUgcmVz dWx0IHdpbGwgbm90IGhhdmUgYmVlbiB0b2FzdGVkICovCiAgCQkJCQlDb3B5U2VuZEludDMy KFZBUlNJWkUob3V0cHV0Ynl0ZXMpIC0gVkFSSERSU1opOwotLS0gMTI3MSwxMjc4IC0tLS0K ICAJCQkJewogIAkJCQkJYnl0ZWEJICAgKm91dHB1dGJ5dGVzOwogIAohIAkJCQkJb3V0cHV0 Ynl0ZXMgPQohIAkJCQkJCURhdHVtR2V0Qnl0ZWFQKEZ1bmN0aW9uQ2FsbDEoJm91dF9mdW5j dGlvbnNbYXR0bnVtIC0gMV0sCiAgCQkJCQkJCQkJCQkJCQkJICAgdmFsdWUpKTsKICAJCQkJ CS8qIFdlIGFzc3VtZSB0aGUgcmVzdWx0IHdpbGwgbm90IGhhdmUgYmVlbiB0b2FzdGVkICov CiAgCQkJCQlDb3B5U2VuZEludDMyKFZBUlNJWkUob3V0cHV0Ynl0ZXMpIC0gVkFSSERSU1op OwoqKioqKioqKioqKioqKioKKioqIDEzOTUsMTQwNCAqKioqCiAgCQlpZiAoY29weV9hdHRu YW1lKQogIAkJewogIAkJCS8qIGVycm9yIGlzIHJlbGV2YW50IHRvIGEgcGFydGljdWxhciBj b2x1bW4gKi8KISAJCQlsaW1pdF9wcmludG91dF9sZW5ndGgoJmF0dHJpYnV0ZV9idWYpOwog IAkJCWVycmNvbnRleHQoIkNPUFkgJXMsIGxpbmUgJWQsIGNvbHVtbiAlczogXCIlc1wiIiwK ICAJCQkJCSAgIGNvcHlfcmVsbmFtZSwgY29weV9saW5lbm8sIGNvcHlfYXR0bmFtZSwKISAJ CQkJCSAgIGF0dHJpYnV0ZV9idWYuZGF0YSk7CiAgCQl9CiAgCQllbHNlCiAgCQl7Ci0tLSAx MzIyLDEzMzEgLS0tLQogIAkJaWYgKGNvcHlfYXR0bmFtZSkKICAJCXsKICAJCQkvKiBlcnJv ciBpcyByZWxldmFudCB0byBhIHBhcnRpY3VsYXIgY29sdW1uICovCiEgCQkJbGltaXRfcHJp bnRvdXRfbGVuZ3RoKCZhdHRyX2J1Zik7CiAgCQkJZXJyY29udGV4dCgiQ09QWSAlcywgbGlu ZSAlZCwgY29sdW1uICVzOiBcIiVzXCIiLAogIAkJCQkJICAgY29weV9yZWxuYW1lLCBjb3B5 X2xpbmVubywgY29weV9hdHRuYW1lLAohIAkJCQkJICAgYXR0cl9idWYuZGF0YSk7CiAgCQl9 CiAgCQllbHNlCiAgCQl7CioqKioqKioqKioqKioqKgoqKiogMTQwNiwxNDExICoqKioKLS0t IDEzMzMsMTM0MCAtLS0tCiAgCQkJaWYgKGxpbmVfYnVmX2NvbnZlcnRlZCB8fAogIAkJCQlj bGllbnRfZW5jb2RpbmcgPT0gc2VydmVyX2VuY29kaW5nKQogIAkJCXsKKyAJCQkJLyogU3Ry aXAgb2ZmIHRoZSBuZXdsaW5lICovCisgCQkJCSoobGluZV9idWYuZGF0YSArIGxpbmVfYnVm LmxlbiAtIDEpID0gJ1wwJzsKICAJCQkJbGltaXRfcHJpbnRvdXRfbGVuZ3RoKCZsaW5lX2J1 Zik7CiAgCQkJCWVycmNvbnRleHQoIkNPUFkgJXMsIGxpbmUgJWQ6IFwiJXNcIiIsCiAgCQkJ CQkJICAgY29weV9yZWxuYW1lLCBjb3B5X2xpbmVubywKKioqKioqKioqKioqKioqCioqKiAx NDg1LDE0OTEgKioqKgogIAlPaWQJCQlpbl9mdW5jX29pZDsKICAJRGF0dW0JICAgKnZhbHVl czsKICAJY2hhcgkgICAqbnVsbHM7Ci0gCWJvb2wJCWRvbmUgPSBmYWxzZTsKICAJYm9vbAkJ aXNudWxsOwogIAlSZXN1bHRSZWxJbmZvICpyZXN1bHRSZWxJbmZvOwogIAlFU3RhdGUJICAg KmVzdGF0ZSA9IENyZWF0ZUV4ZWN1dG9yU3RhdGUoKTsgLyogZm9yIEV4ZWNDb25zdHJhaW50 cygpICovCi0tLSAxNDE0LDE0MTkgLS0tLQoqKioqKioqKioqKioqKioKKioqIDE0OTYsMTUw MSAqKioqCi0tLSAxNDI0LDE0MzQgLS0tLQogIAlFeHByQ29udGV4dCAqZWNvbnRleHQ7CQkv KiB1c2VkIGZvciBFeGVjRXZhbEV4cHIgZm9yIGRlZmF1bHQgYXR0cyAqLwogIAlNZW1vcnlD b250ZXh0IG9sZGNvbnRleHQgPSBDdXJyZW50TWVtb3J5Q29udGV4dDsKICAJRXJyb3JDb250 ZXh0Q2FsbGJhY2sgZXJyY29udGV4dDsKKyAgICAgaW50CQkgICAqYXR0cl9vZmZzZXRzOwor IAlpbnQJCQludWxsX3ByaW50X2xlbjsgLyogbGVuZ3RoIG9mIG51bGwgcHJpbnQgKi8KKyAJ Ym9vbAkJbm9fbW9yZV9kYXRhOworIAlMaXN0Q2VsbCAgICpjdXI7CisgCiAgCiAgCXR1cERl c2MgPSBSZWxhdGlvbkdldERlc2NyKHJlbCk7CiAgCWF0dHIgPSB0dXBEZXNjLT5hdHRyczsK KioqKioqKioqKioqKioqCioqKiAxNjA3LDE2MTMgKioqKgogIAkJfQogIAl9CiAgCiEgCS8q IFByZXBhcmUgdG8gY2F0Y2ggQUZURVIgdHJpZ2dlcnMuICovCiAgCUFmdGVyVHJpZ2dlckJl Z2luUXVlcnkoKTsKICAKICAJLyoKLS0tIDE1NDAsMTU0OCAtLS0tCiAgCQl9CiAgCX0KICAK ISAJLyoKISAJICogUHJlcGFyZSB0byBjYXRjaCBBRlRFUiB0cmlnZ2Vycy4KISAJICovCiAg CUFmdGVyVHJpZ2dlckJlZ2luUXVlcnkoKTsKICAKICAJLyoKKioqKioqKioqKioqKioqCioq KiAxNjcxLDE2NzYgKioqKgotLS0gMTYwNiwxNjEyIC0tLS0KICAKICAJdmFsdWVzID0gKERh dHVtICopIHBhbGxvYyhudW1fcGh5c19hdHRycyAqIHNpemVvZihEYXR1bSkpOwogIAludWxs cyA9IChjaGFyICopIHBhbGxvYyhudW1fcGh5c19hdHRycyAqIHNpemVvZihjaGFyKSk7Cisg CWF0dHJfb2Zmc2V0cyA9IChpbnQgKikgcGFsbG9jKG51bV9waHlzX2F0dHJzICogc2l6ZW9m KGludCkpOwogIAogIAkvKiBNYWtlIHJvb20gZm9yIGEgUEFSQU1fRVhFQyB2YWx1ZSBmb3Ig ZG9tYWluIGNvbnN0cmFpbnQgY2hlY2tzICovCiAgCWlmIChoYXNDb25zdHJhaW50cykKKioq KioqKioqKioqKioqCioqKiAxNjkxLDE3MTIgKioqKgogIAllcnJjb250ZXh0LnByZXZpb3Vz ID0gZXJyb3JfY29udGV4dF9zdGFjazsKICAJZXJyb3JfY29udGV4dF9zdGFjayA9ICZlcnJj b250ZXh0OwogIAohIAkvKiBvbiBpbnB1dCBqdXN0IHRocm93IHRoZSBoZWFkZXIgbGluZSBh d2F5ICovCiEgCWlmIChoZWFkZXJfbGluZSkKICAJewohIAkJY29weV9saW5lbm8rKzsKISAJ CWRvbmUgPSBDb3B5UmVhZExpbmUocXVvdGUsIGVzY2FwZSkgOwogIAl9CiAgCiEgCXdoaWxl ICghZG9uZSkKICAJewogIAkJYm9vbAkJc2tpcF90dXBsZTsKICAJCU9pZAkJCWxvYWRlZF9v aWQgPSBJbnZhbGlkT2lkOwogIAogIAkJQ0hFQ0tfRk9SX0lOVEVSUlVQVFMoKTsKICAKLSAJ CWNvcHlfbGluZW5vKys7Ci0gCiAgCQkvKiBSZXNldCB0aGUgcGVyLXR1cGxlIGV4cHJjb250 ZXh0ICovCiAgCQlSZXNldFBlclR1cGxlRXhwckNvbnRleHQoZXN0YXRlKTsKICAKLS0tIDE2 MjcsMTY4MSAtLS0tCiAgCWVycmNvbnRleHQucHJldmlvdXMgPSBlcnJvcl9jb250ZXh0X3N0 YWNrOwogIAllcnJvcl9jb250ZXh0X3N0YWNrID0gJmVycmNvbnRleHQ7CiAgCiEgCS8qCiEg CSAqIGluaXRpYWxpemUgYnVmZmVyZWQgc2NhbiB2YXJpYWJsZXMuCiEgCSAqLwohIAlpZihj c3ZfbW9kZSkKISAJewohIAkgICAgaW5fcXVvdGUgPSBmYWxzZTsKISAJCWxhc3Rfd2FzX2Vz YyA9IGZhbHNlOwohIAl9CiEgCiEgCW51bGxfcHJpbnRfbGVuID0gc3RybGVuKG51bGxfcHJp bnQpOwohIAkKISAJLyogU2V0IHVwIGRhdGEgYnVmZmVyIHRvIGhvbGQgYSBjaHVuayBvZiBk YXRhICovCiEgCU1lbVNldChpbnB1dF9idWYsICcgJywgQ09QWV9CVUZfU0laRSAqIHNpemVv ZihjaGFyKSk7CiEgCWlucHV0X2J1ZltDT1BZX0JVRl9TSVpFXSA9ICdcMCc7CiEgCiEgCW5v X21vcmVfZGF0YSA9IGZhbHNlOwkJLyogbm8gbW9yZSBpbnB1dCBkYXRhIHRvIHJlYWQgZnJv bSBmaWxlIG9yIEZFICovCiEgCWxpbmVfZG9uZSA9IHRydWU7CiEgCWJ1Zl9kb25lID0gZmFs c2U7CiEgCiEgCWRvCiAgCXsKISAJCXNpemVfdAkgICBieXRlc3JlYWQgPSAwOwohIAkJCiEg CQkvKiByZWFkIGEgY2h1bmsgb2YgZGF0YSBpbnRvIHRoZSBidWZmZXIgKi8KISAJCWlmICgh YmluYXJ5KQohIAkJewohIAkJICAgYnl0ZXNyZWFkID0gQ29weUdldERhdGEoaW5wdXRfYnVm LCBDT1BZX0JVRl9TSVpFKTsKISAJCSAgIGJ1Zl9kb25lID0gZmFsc2U7CiEgCiEgCQkgICAv KiBzZXQgYnVmZmVyIHBvaW50ZXJzIHRvIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyICovCiEg CQkgICBiZWdsb2MgPSBpbnB1dF9idWY7CiEgCQkgICBidWZmZXJfaW5kZXggPSAwOwogIAl9 CiAgCiEgCQkvKgohIAkJICogY29udGludWUgaWYgc29tZSBieXRlcyB3ZXJlIHJlYWQgb3Ig aWYgd2UgZGlkbid0IHJlYWNoIEVPRi4gaWYgd2UKISAJCSAqIGJvdGggcmVhY2hlZCBFT0Yg X2FuZF8gbm8gYnl0ZXMgd2VyZSByZWFkLCBxdWl0IHRoZSBsb29wIHdlIGFyZQohIAkJICog ZG9uZQohIAkJICovCiEgCQlpZiAoYnl0ZXNyZWFkID4gMCB8fCAhZmVfZW9mIHx8IGJpbmFy eSkKISAJCXsKISAKISAJCQl3aGlsZSAoIWJ1Zl9kb25lKQogIAl7CiAgCQlib29sCQlza2lw X3R1cGxlOwogIAkJT2lkCQkJbG9hZGVkX29pZCA9IEludmFsaWRPaWQ7CiAgCiAgCQlDSEVD S19GT1JfSU5URVJSVVBUUygpOwogIAogIAkJLyogUmVzZXQgdGhlIHBlci10dXBsZSBleHBy Y29udGV4dCAqLwogIAkJUmVzZXRQZXJUdXBsZUV4cHJDb250ZXh0KGVzdGF0ZSk7CiAgCioq KioqKioqKioqKioqKgoqKiogMTcxNiwxNzQ2ICoqKioKICAJCS8qIEluaXRpYWxpemUgYWxs IHZhbHVlcyBmb3Igcm93IHRvIE5VTEwgKi8KICAJCU1lbVNldCh2YWx1ZXMsIDAsIG51bV9w aHlzX2F0dHJzICogc2l6ZW9mKERhdHVtKSk7CiAgCQlNZW1TZXQobnVsbHMsICduJywgbnVt X3BoeXNfYXR0cnMgKiBzaXplb2YoY2hhcikpOwogIAogIAkJaWYgKCFiaW5hcnkpCiAgCQl7 Ci0gCQkJQ29weVJlYWRSZXN1bHQgcmVzdWx0ID0gTk9STUFMX0FUVFI7Ci0gCQkJY2hhcgkg ICAqc3RyaW5nOwotIAkJCUxpc3RDZWxsICAgKmN1cjsKICAKICAJCQkvKiBBY3R1YWxseSBy ZWFkIHRoZSBsaW5lIGludG8gbWVtb3J5IGhlcmUgKi8KISAJCQlkb25lID0gY3N2X21vZGUg PyAKISAJCQkJQ29weVJlYWRMaW5lKHF1b3RlLCBlc2NhcGUpIDogQ29weVJlYWRMaW5lKE5V TEwsIE5VTEwpOwogIAogIAkJCS8qCiEgCQkJICogRU9GIGF0IHN0YXJ0IG9mIGxpbmUgbWVh bnMgd2UncmUgZG9uZS4gIElmIHdlIHNlZSBFT0YgYWZ0ZXIKISAJCQkgKiBzb21lIGNoYXJh Y3RlcnMsIHdlIGFjdCBhcyB0aG91Z2ggaXQgd2FzIG5ld2xpbmUgZm9sbG93ZWQKISAJCQkg KiBieSBFT0YsIGllLCBwcm9jZXNzIHRoZSBsaW5lIGFuZCB0aGVuIGV4aXQgbG9vcCBvbiBu ZXh0CiEgCQkJICogaXRlcmF0aW9uLgogIAkJCSAqLwohIAkJCWlmIChkb25lICYmIGxpbmVf YnVmLmxlbiA9PSAwKQogIAkJCQlicmVhazsKICAKICAJCQlpZiAoZmlsZV9oYXNfb2lkcykK ICAJCQl7CiAgCQkJCS8qIGNhbid0IGJlIGluIENTViBtb2RlIGhlcmUgKi8KISAJCQkJc3Ry aW5nID0gQ29weVJlYWRBdHRyaWJ1dGUoZGVsaW0sIG51bGxfcHJpbnQsCiEgCQkJCQkJCQkJ CSAgICZyZXN1bHQsICZpc251bGwpOwogIAogIAkJCQlpZiAoaXNudWxsKQogIAkJCQkJZXJl cG9ydChFUlJPUiwKLS0tIDE2ODUsMTcyOSAtLS0tCiAgCQkvKiBJbml0aWFsaXplIGFsbCB2 YWx1ZXMgZm9yIHJvdyB0byBOVUxMICovCiAgCQlNZW1TZXQodmFsdWVzLCAwLCBudW1fcGh5 c19hdHRycyAqIHNpemVvZihEYXR1bSkpOwogIAkJTWVtU2V0KG51bGxzLCAnbicsIG51bV9w aHlzX2F0dHJzICogc2l6ZW9mKGNoYXIpKTsKKyAJCQkJLyogcmVzZXQgYXR0cmlidXRlIHBv aW50ZXJzICovCisgCQkJCU1lbVNldChhdHRyX29mZnNldHMsIDAsIG51bV9waHlzX2F0dHJz ICogc2l6ZW9mKGludCkpOwogIAogIAkJaWYgKCFiaW5hcnkpCiAgCQl7CiAgCiAgCQkJLyog QWN0dWFsbHkgcmVhZCB0aGUgbGluZSBpbnRvIG1lbW9yeSBoZXJlICovCiEgCQkJCQlsaW5l X2RvbmUgPSBjc3ZfbW9kZSA/CiEgCQkJCQkJCQlDb3B5UmVhZExpbmVDU1YoYnl0ZXNyZWFk LCBxdW90ZSwgZXNjYXBlKSA6IAohIAkJCQkJCQkJQ29weVJlYWRMaW5lVGV4dChieXRlc3Jl YWQsIGVzY2FwZSk7CiAgCiAgCQkJLyoKISAJCQkJCSAqIGlmIGZpbmlzaGVkIHByb2Nlc3Np bmcgZGF0YSBsaW5lIC0gaW5jcmVtZW50IGxpbmUgY291bnQuCiEgCQkJCQkgKiBPdGhlcndp c2UsIGlmIGVvZiBpcyBub3QgeWV0IHJlYWNoZWQsIHdlIHNraXAgYXR0IHBhcnNpbmcgCiEg CQkJCQkgKiBhbmQgcmVhZCBtb3JlIGRhdGEuIEJ1dCBpZiBlb2YgX3dhc18gcmVhY2hlZCBp dCBtZWFucyAKISAJCQkJCSAqIHRoYXQgdGhlIG9yaWdpbmFsIGxhc3QgZGF0YSBsaW5lIGlz IGRlZmVjdGl2ZSBhbmQgCiEgCQkJCQkgKiB3ZSB3YW50IHRvIGNhdGNoIHRoYXQgZXJyb3Ig bGF0ZXIgb24uCiAgCQkJICovCiEgCQkJCQlpZiAobGluZV9kb25lKQohIAkJCQkJCWNvcHlf bGluZW5vKys7CiEgCQkJCQllbHNlIGlmICghZmVfZW9mIHx8IGVuZF9tYXJrZXIgKQogIAkJ CQlicmVhazsKICAKKyAJCQkJCWlmIChoZWFkZXJfbGluZSkKKyAJCQkJCXsKKyAJCQkJCQls aW5lX2J1Zi5sZW4gPSAwOwkJLyogd2UgY2FuIHJlc2V0IGxpbmUgYnVmZmVyIG5vdy4gKi8K KyAJCQkJCQlsaW5lX2J1Zi5kYXRhWzBdID0gJ1wwJzsKKyAJCQkJCQlsaW5lX2J1Zi5jdXJz b3IgPSAwOworIAkJCQkJCWhlYWRlcl9saW5lID0gZmFsc2U7CisgCQkJCQkJY29udGludWU7 CisgCQkJCQl9CisgCQkJCQkKICAJCQlpZiAoZmlsZV9oYXNfb2lkcykKICAJCQl7CisgCQkJ CQkJY2hhcgkgICAqb2lkX3N0cmluZzsKKyAKICAJCQkJLyogY2FuJ3QgYmUgaW4gQ1NWIG1v ZGUgaGVyZSAqLwohIAkJCQkJCW9pZF9zdHJpbmcgPSBDb3B5UmVhZE9pZEF0dHIoZGVsaW0s IG51bGxfcHJpbnQsIG51bGxfcHJpbnRfbGVuLAohIAkJCQkJCQkJCQkJCQkgJmlzbnVsbCk7 CiAgCiAgCQkJCWlmIChpc251bGwpCiAgCQkJCQllcmVwb3J0KEVSUk9SLAoqKioqKioqKioq KioqKioKKioqIDE3NTAsMTc1NiAqKioqCiAgCQkJCXsKICAJCQkJCWNvcHlfYXR0bmFtZSA9 ICJvaWQiOwogIAkJCQkJbG9hZGVkX29pZCA9IERhdHVtR2V0T2JqZWN0SWQoRGlyZWN0RnVu Y3Rpb25DYWxsMShvaWRpbiwKISAJCQkJCQkJCQkJCSAgIENTdHJpbmdHZXREYXR1bShzdHJp bmcpKSk7CiAgCQkJCQlpZiAobG9hZGVkX29pZCA9PSBJbnZhbGlkT2lkKQogIAkJCQkJCWVy ZXBvcnQoRVJST1IsCiAgCQkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJTEVf Rk9STUFUKSwKLS0tIDE3MzMsMTczOSAtLS0tCiAgCQkJCXsKICAJCQkJCWNvcHlfYXR0bmFt ZSA9ICJvaWQiOwogIAkJCQkJbG9hZGVkX29pZCA9IERhdHVtR2V0T2JqZWN0SWQoRGlyZWN0 RnVuY3Rpb25DYWxsMShvaWRpbiwKISAJCQkJCQkJCQkJCQkgICBDU3RyaW5nR2V0RGF0dW0o b2lkX3N0cmluZykpKTsKICAJCQkJCWlmIChsb2FkZWRfb2lkID09IEludmFsaWRPaWQpCiAg CQkJCQkJZXJlcG9ydChFUlJPUiwKICAJCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfQkFEX0NP UFlfRklMRV9GT1JNQVQpLAoqKioqKioqKioqKioqKioKKioqIDE3NTksMTc5MiAqKioqCiAg CQkJCX0KICAJCQl9CiAgCiEgCQkJLyogTG9vcCB0byByZWFkIHRoZSB1c2VyIGF0dHJpYnV0 ZXMgb24gdGhlIGxpbmUuICovCiAgCQkJZm9yZWFjaChjdXIsIGF0dG51bWxpc3QpCiAgCQkJ ewogIAkJCQlpbnQJCQlhdHRudW0gPSBsZmlyc3RfaW50KGN1cik7CiAgCQkJCWludAkJCW0g PSBhdHRudW0gLSAxOwogIAohIAkJCQkvKgohIAkJCQkgKiBJZiBwcmlvciBhdHRyIG9uIHRo aXMgbGluZSB3YXMgZW5kZWQgYnkgbmV3bGluZSwKISAJCQkJICogY29tcGxhaW4uCiEgCQkJ CSAqLwohIAkJCQlpZiAocmVzdWx0ICE9IE5PUk1BTF9BVFRSKQohIAkJCQkJZXJlcG9ydChF UlJPUiwKISAJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxFX0ZPUk1BVCks CiEgCQkJCQkJCSBlcnJtc2coIm1pc3NpbmcgZGF0YSBmb3IgY29sdW1uIFwiJXNcIiIsCiEg CQkJCQkJCQkJTmFtZVN0cihhdHRyW21dLT5hdHRuYW1lKSkpKTsKICAKISAJCQkJaWYgKGNz dl9tb2RlKQohIAkJCQl7CiEgCQkJCQlzdHJpbmcgPSBDb3B5UmVhZEF0dHJpYnV0ZUNTVihk ZWxpbSwgbnVsbF9wcmludCwgcXVvdGUsCiEgCQkJCQkJCQkJCQkgICBlc2NhcGUsICZyZXN1 bHQsICZpc251bGwpOwohIAkJCQkJaWYgKHJlc3VsdCA9PSBVTlRFUk1JTkFURURfRklFTEQp CiEgCQkJCQkJZXJlcG9ydChFUlJPUiwKISAJCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfQkFE X0NPUFlfRklMRV9GT1JNQVQpLAohIAkJCQkJCQkgICBlcnJtc2coInVudGVybWluYXRlZCBD U1YgcXVvdGVkIGZpZWxkIikpKTsKISAJCQkJfQogIAkJCQllbHNlCiEgCQkJCQlzdHJpbmcg PSBDb3B5UmVhZEF0dHJpYnV0ZShkZWxpbSwgbnVsbF9wcmludCwKISAJCQkJCQkJCQkJCSAg ICZyZXN1bHQsICZpc251bGwpOwogIAogIAkJCQlpZiAoY3N2X21vZGUgJiYgaXNudWxsICYm IGZvcmNlX25vdG51bGxbbV0pCiAgCQkJCXsKLS0tIDE3NDIsMTc3MCAtLS0tCiAgCQkJCX0K ICAJCQl9CiAgCiEgCQkJCQkvKiBwYXJzZSBhbGwgdGhlIGF0dHJpYnV0ZSBpbiB0aGUgZGF0 YSBsaW5lICovCiEgCQkJCQlpZihjc3ZfbW9kZSkKISAJCQkJCQlDb3B5UmVhZEF0dHJpYnV0 ZXNDU1YoZGVsaW0sIG51bGxfcHJpbnQsIHF1b3RlLCBlc2NhcGUsIG51bGxfcHJpbnRfbGVu LCAKISAJCQkJCQkJCQkJCW51bGxzLCBhdHRudW1saXN0LCBhdHRyX29mZnNldHMsIG51bV9w aHlzX2F0dHJzLCBhdHRyKTsKISAJCQkJCWVsc2UKISAJCQkJCQlDb3B5UmVhZEF0dHJpYnV0 ZXNUZXh0KGRlbGltLCBlc2NhcGUsIG51bGxfcHJpbnQsIG51bGxfcHJpbnRfbGVuLAohIAkJ CQkJCQkJCQkJIG51bGxzLCBhdHRudW1saXN0LCBhdHRyX29mZnNldHMsIG51bV9waHlzX2F0 dHJzLCBhdHRyKTsKISAKISAJCQkJCS8qCiEgCQkJCQkgKiBMb29wIHRvIHJlYWQgdGhlIHVz ZXIgYXR0cmlidXRlcyBvbiB0aGUgbGluZS4KISAJCQkJCSAqLwogIAkJCWZvcmVhY2goY3Vy LCBhdHRudW1saXN0KQogIAkJCXsKICAJCQkJaW50CQkJYXR0bnVtID0gbGZpcnN0X2ludChj dXIpOwogIAkJCQlpbnQJCQltID0gYXR0bnVtIC0gMTsKKyAJCQkJCQljaGFyICAgICAgICpz dHJpbmc7CiAgCiEgCQkJCQkJc3RyaW5nID0gYXR0cl9idWYuZGF0YSArIGF0dHJfb2Zmc2V0 c1ttXTsKICAKISAJCQkJCQlpZiAobnVsbHNbbV0gPT0gJyAnKQohIAkJCQkJCQlpc251bGwg PSBmYWxzZTsKICAJCQkJZWxzZQohIAkJCQkJCQlpc251bGwgPSB0cnVlOwogIAogIAkJCQlp ZiAoY3N2X21vZGUgJiYgaXNudWxsICYmIGZvcmNlX25vdG51bGxbbV0pCiAgCQkJCXsKKioq KioqKioqKioqKioqCioqKiAxODA2LDE4MjMgKioqKgogIAkJCQkJY29weV9hdHRuYW1lID0g TlVMTDsKICAJCQkJfQogIAkJCX0KLSAKLSAJCQkvKgotIAkJCSAqIENvbXBsYWluIGlmIHRo ZXJlIGFyZSBtb3JlIGZpZWxkcyBvbiB0aGUgaW5wdXQgbGluZS4KLSAJCQkgKgotIAkJCSAq IFNwZWNpYWwgY2FzZTogaWYgd2UncmUgcmVhZGluZyBhIHplcm8tY29sdW1uIHRhYmxlLCB3 ZSB3b24ndAotIAkJCSAqIHlldCBoYXZlIGNhbGxlZCBDb3B5UmVhZEF0dHJpYnV0ZSgpIGF0 IGFsbDsgc28gbm8gZXJyb3IgaWYKLSAJCQkgKiBsaW5lIGlzIGVtcHR5LgotIAkJCSAqLwot IAkJCWlmIChyZXN1bHQgPT0gTk9STUFMX0FUVFIgJiYgbGluZV9idWYubGVuICE9IDApCi0g CQkJCWVyZXBvcnQoRVJST1IsCi0gCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09QWV9G SUxFX0ZPUk1BVCksCi0gCQkJCQkgICBlcnJtc2coImV4dHJhIGRhdGEgYWZ0ZXIgbGFzdCBl eHBlY3RlZCBjb2x1bW4iKSkpOwogIAkJfQogIAkJZWxzZQogIAkJewotLS0gMTc4NCwxNzg5 IC0tLS0KKioqKioqKioqKioqKioqCioqKiAxODI4LDE4MzQgKioqKgogIAkJCWZsZF9jb3Vu dCA9IENvcHlHZXRJbnQxNigpOwogIAkJCWlmIChDb3B5R2V0RW9mKCkgfHwgZmxkX2NvdW50 ID09IC0xKQogIAkJCXsKISAJCQkJZG9uZSA9IHRydWU7CiAgCQkJCWJyZWFrOwogIAkJCX0K ICAKLS0tIDE3OTQsMTgwMSAtLS0tCiAgCQkJZmxkX2NvdW50ID0gQ29weUdldEludDE2KCk7 CiAgCQkJaWYgKENvcHlHZXRFb2YoKSB8fCBmbGRfY291bnQgPT0gLTEpCiAgCQkJewohIAkJ CQkJCWJ1Zl9kb25lID0gdHJ1ZTsKISAJCQkJCQlub19tb3JlX2RhdGEgPSB0cnVlOwogIAkJ CQlicmVhazsKICAJCQl9CiAgCioqKioqKioqKioqKioqKgoqKiogMTg4NSwxODkxICoqKioK ICAJCQkJbnVsbHNbZGVmbWFwW2ldXSA9ICcgJzsKICAJCX0KICAKISAJCS8qIE5leHQgYXBw bHkgYW55IGRvbWFpbiBjb25zdHJhaW50cyAqLwogIAkJaWYgKGhhc0NvbnN0cmFpbnRzKQog IAkJewogIAkJCVBhcmFtRXhlY0RhdGEgKnBybWRhdGEgPSAmZWNvbnRleHQtPmVjeHRfcGFy YW1fZXhlY192YWxzWzBdOwotLS0gMTg1MiwxODYwIC0tLS0KICAJCQkJbnVsbHNbZGVmbWFw W2ldXSA9ICcgJzsKICAJCX0KICAKISAJCQkJLyoKISAJCQkJICogTmV4dCBhcHBseSBhbnkg ZG9tYWluIGNvbnN0cmFpbnRzCiEgCQkJCSAqLwogIAkJaWYgKGhhc0NvbnN0cmFpbnRzKQog IAkJewogIAkJCVBhcmFtRXhlY0RhdGEgKnBybWRhdGEgPSAmZWNvbnRleHQtPmVjeHRfcGFy YW1fZXhlY192YWxzWzBdOwoqKioqKioqKioqKioqKioKKioqIDE5MTIsMTkyNCAqKioqCiAg CQkJfQogIAkJfQogIAohIAkJLyogQW5kIG5vdyB3ZSBjYW4gZm9ybSB0aGUgaW5wdXQgdHVw bGUuICovCiAgCQl0dXBsZSA9IGhlYXBfZm9ybXR1cGxlKHR1cERlc2MsIHZhbHVlcywgbnVs bHMpOwogIAogIAkJaWYgKG9pZHMgJiYgZmlsZV9oYXNfb2lkcykKICAJCQlIZWFwVHVwbGVT ZXRPaWQodHVwbGUsIGxvYWRlZF9vaWQpOwogIAohIAkJLyogVHJpZ2dlcnMgYW5kIHN0dWZm IG5lZWQgdG8gYmUgaW52b2tlZCBpbiBxdWVyeSBjb250ZXh0LiAqLwogIAkJTWVtb3J5Q29u dGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOwogIAogIAkJc2tpcF90dXBsZSA9IGZhbHNlOwot LS0gMTg4MSwxODk3IC0tLS0KICAJCQl9CiAgCQl9CiAgCiEgCQkJCS8qCiEgCQkJCSAqIEFu ZCBub3cgd2UgY2FuIGZvcm0gdGhlIGlucHV0IHR1cGxlLgohIAkJCQkgKi8KICAJCXR1cGxl ID0gaGVhcF9mb3JtdHVwbGUodHVwRGVzYywgdmFsdWVzLCBudWxscyk7CiAgCiAgCQlpZiAo b2lkcyAmJiBmaWxlX2hhc19vaWRzKQogIAkJCUhlYXBUdXBsZVNldE9pZCh0dXBsZSwgbG9h ZGVkX29pZCk7CiAgCiEgCQkJCS8qCiEgCQkJCSAqIFRyaWdnZXJzIGFuZCBzdHVmZiBuZWVk IHRvIGJlIGludm9rZWQgaW4gcXVlcnkgY29udGV4dC4KISAJCQkJICovCiAgCQlNZW1vcnlD b250ZXh0U3dpdGNoVG8ob2xkY29udGV4dCk7CiAgCiAgCQlza2lwX3R1cGxlID0gZmFsc2U7 CioqKioqKioqKioqKioqKgoqKiogMTk0NSwxOTU1ICoqKioKICAJCQkvKiBQbGFjZSB0dXBs ZSBpbiB0dXBsZSBzbG90ICovCiAgCQkJRXhlY1N0b3JlVHVwbGUodHVwbGUsIHNsb3QsIElu dmFsaWRCdWZmZXIsIGZhbHNlKTsKICAKISAJCQkvKiBDaGVjayB0aGUgY29uc3RyYWludHMg b2YgdGhlIHR1cGxlICovCiAgCQkJaWYgKHJlbC0+cmRfYXR0LT5jb25zdHIpCiAgCQkJCUV4 ZWNDb25zdHJhaW50cyhyZXN1bHRSZWxJbmZvLCBzbG90LCBlc3RhdGUpOwogIAohIAkJCS8q IE9LLCBzdG9yZSB0aGUgdHVwbGUgYW5kIGNyZWF0ZSBpbmRleCBlbnRyaWVzIGZvciBpdCAq LwogIAkJCXNpbXBsZV9oZWFwX2luc2VydChyZWwsIHR1cGxlKTsKICAKICAJCQlpZiAocmVz dWx0UmVsSW5mby0+cmlfTnVtSW5kaWNlcyA+IDApCi0tLSAxOTE4LDE5MzIgLS0tLQogIAkJ CS8qIFBsYWNlIHR1cGxlIGluIHR1cGxlIHNsb3QgKi8KICAJCQlFeGVjU3RvcmVUdXBsZSh0 dXBsZSwgc2xvdCwgSW52YWxpZEJ1ZmZlciwgZmFsc2UpOwogIAohIAkJCQkJLyoKISAJCQkJ CSAqIENoZWNrIHRoZSBjb25zdHJhaW50cyBvZiB0aGUgdHVwbGUKISAJCQkJCSAqLwogIAkJ CWlmIChyZWwtPnJkX2F0dC0+Y29uc3RyKQogIAkJCQlFeGVjQ29uc3RyYWludHMocmVzdWx0 UmVsSW5mbywgc2xvdCwgZXN0YXRlKTsKICAKISAJCQkJCS8qCiEgCQkJCQkgKiBPSywgc3Rv cmUgdGhlIHR1cGxlIGFuZCBjcmVhdGUgaW5kZXggZW50cmllcyBmb3IgaXQKISAJCQkJCSAq LwogIAkJCXNpbXBsZV9oZWFwX2luc2VydChyZWwsIHR1cGxlKTsKICAKICAJCQlpZiAocmVz dWx0UmVsSW5mby0+cmlfTnVtSW5kaWNlcyA+IDApCioqKioqKioqKioqKioqKgoqKiogMTk1 OCwxOTc2ICoqKioKICAJCQkvKiBBRlRFUiBST1cgSU5TRVJUIFRyaWdnZXJzICovCiAgCQkJ RXhlY0FSSW5zZXJ0VHJpZ2dlcnMoZXN0YXRlLCByZXN1bHRSZWxJbmZvLCB0dXBsZSk7CiAg CQl9CiAgCX0KICAKISAJLyogRG9uZSwgY2xlYW4gdXAgKi8KICAJZXJyb3JfY29udGV4dF9z dGFjayA9IGVycmNvbnRleHQucHJldmlvdXM7CiAgCiAgCU1lbW9yeUNvbnRleHRTd2l0Y2hU byhvbGRjb250ZXh0KTsKICAKISAJLyogRXhlY3V0ZSBBRlRFUiBTVEFURU1FTlQgaW5zZXJ0 aW9uIHRyaWdnZXJzICovCiAgCUV4ZWNBU0luc2VydFRyaWdnZXJzKGVzdGF0ZSwgcmVzdWx0 UmVsSW5mbyk7CiAgCiEgCS8qIEhhbmRsZSBxdWV1ZWQgQUZURVIgdHJpZ2dlcnMgKi8KICAJ QWZ0ZXJUcmlnZ2VyRW5kUXVlcnkoZXN0YXRlKTsKICAKICAJcGZyZWUodmFsdWVzKTsKICAJ cGZyZWUobnVsbHMpOwogIAotLS0gMTkzNSwxOTcyIC0tLS0KICAJCQkvKiBBRlRFUiBST1cg SU5TRVJUIFRyaWdnZXJzICovCiAgCQkJRXhlY0FSSW5zZXJ0VHJpZ2dlcnMoZXN0YXRlLCBy ZXN1bHRSZWxJbmZvLCB0dXBsZSk7CiAgCQl9CisgCisgCQkJCWxpbmVfYnVmLmxlbiA9IDA7 CQkvKiB3ZSBjYW4gcmVzZXQgbGluZSBidWZmZXIgbm93LiAqLworIAkJCQlsaW5lX2J1Zi5k YXRhWzBdID0gJ1wwJzsKKyAJCQkJbGluZV9idWYuY3Vyc29yID0gMDsKKyAJCQl9CQkJCQkv KiBlbmQgd2hpbGUoIWJ1Zl9kb25lKSAqLworIAkJfQkJCQkJCS8qIGVuZCBpZiAoYnl0ZXNy ZWFkID4gMCB8fCAhZmVfZW9mKSAqLworIAkJZWxzZQorIAkJCS8qIG5vIGJ5dGVzIHJlYWQs IGVuZCBvZiBkYXRhICovCisgCQl7CisgCQkJbm9fbW9yZV9kYXRhID0gdHJ1ZTsKICAJfQor IAl9IHdoaWxlICghbm9fbW9yZV9kYXRhKTsKICAKISAJLyoKISAJICogRG9uZSwgY2xlYW4g dXAKISAJICovCiAgCWVycm9yX2NvbnRleHRfc3RhY2sgPSBlcnJjb250ZXh0LnByZXZpb3Vz OwogIAogIAlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY29udGV4dCk7CiAgCiEgCS8qIAkg CiEgICAgICAqIEV4ZWN1dGUgQUZURVIgU1RBVEVNRU5UIGluc2VydGlvbiB0cmlnZ2Vycwoh IAkgKi8KICAJRXhlY0FTSW5zZXJ0VHJpZ2dlcnMoZXN0YXRlLCByZXN1bHRSZWxJbmZvKTsK ICAKISAJLyoKISAJICogSGFuZGxlIHF1ZXVlZCBBRlRFUiB0cmlnZ2VycwohIAkgKi8KICAJ QWZ0ZXJUcmlnZ2VyRW5kUXVlcnkoZXN0YXRlKTsKICAKKyAJcGZyZWUoYXR0cl9vZmZzZXRz KTsKKyAKICAJcGZyZWUodmFsdWVzKTsKICAJcGZyZWUobnVsbHMpOwogIAoqKioqKioqKioq KioqKioKKioqIDE5OTAsMjI2MiAqKioqCiAgCiAgCiAgLyoKISAgKiBSZWFkIHRoZSBuZXh0 IGlucHV0IGxpbmUgYW5kIHN0YXNoIGl0IGluIGxpbmVfYnVmLCB3aXRoIGNvbnZlcnNpb24g dG8KISAgKiBzZXJ2ZXIgZW5jb2RpbmcuCiEgICoKISAgKiBSZXN1bHQgaXMgdHJ1ZSBpZiBy ZWFkIHdhcyB0ZXJtaW5hdGVkIGJ5IEVPRiwgZmFsc2UgaWYgdGVybWluYXRlZAohICAqIGJ5 IG5ld2xpbmUuCiAgICovCiAgc3RhdGljIGJvb2wKISBDb3B5UmVhZExpbmUoY2hhciAqIHF1 b3RlLCBjaGFyICogZXNjYXBlKQogIHsKISAJYm9vbAkJcmVzdWx0OwohIAlib29sCQljaGFu Z2VfZW5jb2RpbmcgPSAoY2xpZW50X2VuY29kaW5nICE9IHNlcnZlcl9lbmNvZGluZyk7CiEg CWludAkJCWM7CiEgCWludAkJCW1ibGVuOwohIAlpbnQJCQlqOwohIAl1bnNpZ25lZCBjaGFy IHNbMl07CiAgCWNoYXIJICAgKmN2dDsKISAJYm9vbCAgICAgICAgaW5fcXVvdGUgPSBmYWxz ZSwgbGFzdF93YXNfZXNjID0gZmFsc2UsIGNzdl9tb2RlID0gZmFsc2U7CiEgCWNoYXIgICAg ICAgIHF1b3RlYyA9ICdcMCcsIGVzY2FwZWMgPSAnXDAnOwohIAohIAlpZiAocXVvdGUpCiEg CXsKISAJCWNzdl9tb2RlID0gdHJ1ZTsKISAJCXF1b3RlYyA9IHF1b3RlWzBdOwohIAkJZXNj YXBlYyA9IGVzY2FwZVswXTsKISAJCS8qIGlnbm9yZSBzcGVjaWFsIGVzY2FwZSBwcm9jZXNz aW5nIGlmIGl0J3MgdGhlIHNhbWUgYXMgcXVvdGVjICovCiEgCQlpZiAocXVvdGVjID09IGVz Y2FwZWMpCiEgCQkJZXNjYXBlYyA9ICdcMCc7CiEgCX0KISAKISAKISAJc1sxXSA9IDA7CiEg CiEgCS8qIHJlc2V0IGxpbmVfYnVmIHRvIGVtcHR5ICovCiEgCWxpbmVfYnVmLmxlbiA9IDA7 CiEgCWxpbmVfYnVmLmRhdGFbMF0gPSAnXDAnOwohIAlsaW5lX2J1Zi5jdXJzb3IgPSAwOwog IAogIAkvKiBtYXJrIHRoYXQgZW5jb2RpbmcgY29udmVyc2lvbiBoYXNuJ3Qgb2NjdXJyZWQg eWV0ICovCiAgCWxpbmVfYnVmX2NvbnZlcnRlZCA9IGZhbHNlOwogIAohIAkvKiBzZXQgZGVm YXVsdCBzdGF0dXMgKi8KISAJcmVzdWx0ID0gZmFsc2U7CiAgCiAgCS8qCiEgCSAqIEluIHRo aXMgbG9vcCB3ZSBvbmx5IGNhcmUgZm9yIGRldGVjdGluZyBuZXdsaW5lcyAoXHIgYW5kL29y IFxuKSBhbmQKISAJICogdGhlIGVuZC1vZi1jb3B5IG1hcmtlciAoXC4pLiAgCiEgCSAqCiEg CSAqIEluIFRleHQgbW9kZSwgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdlIGFsbG93 CiEgCSAqIGJhY2tzbGFzaGVzIHRvIGVzY2FwZSBuZXdsaW5lIGNoYXJhY3RlcnMuICBCYWNr c2xhc2hlcyBvdGhlciB0aGFuCiEgCSAqIHRoZSBlbmQgbWFya2VyIGdldCBwdXQgaW50byB0 aGUgbGluZV9idWYsIHNpbmNlIENvcHlSZWFkQXR0cmlidXRlCiEgCSAqIGRvZXMgaXRzIG93 biBlc2NhcGUgcHJvY2Vzc2luZy4JCiEgCSAqCiEgCSAqIEluIENTViBtb2RlLCBDUiBhbmQg TkwgaW5zaWRlIHEgcXVvdGVkIGZpZWxkIGFyZSBqdXN0IHBhcnQgb2YgdGhlCiEgCSAqIGRh dGEgdmFsdWUgYW5kIGFyZSBwdXQgaW4gbGluZV9idWYuIFdlIGtlZXAganVzdCBlbm91Z2gg c3RhdGUKISAJICogdG8ga25vdyBpZiB3ZSBhcmUgY3VycmVudGx5IGluIGEgcXVvdGVkIGZp ZWxkIG9yIG5vdC4KISAJICoKISAJICogVGhlc2UgZm91ciBjaGFyYWN0ZXJzLCBhbmQgb25s eSB0aGVzZSBmb3VyLCBhcmUgYXNzdW1lZCB0aGUgc2FtZSBpbiAKISAJICogZnJvbnRlbmQg YW5kIGJhY2tlbmQgZW5jb2RpbmdzLgohIAkgKgohIAkgKiBXZSBkbyBub3QgYXNzdW1lIHRo YXQgc2Vjb25kIGFuZCBsYXRlciBieXRlcyBvZiBhIGZyb250ZW5kCiEgCSAqIG11bHRpYnl0 ZSBjaGFyYWN0ZXIgY291bGRuJ3QgbG9vayBsaWtlIEFTQ0lJIGNoYXJhY3RlcnMuCiAgCSAq LwohIAlmb3IgKDs7KQogIAl7CiEgCQljID0gQ29weUdldENoYXIoKTsKISAJCWlmIChjID09 IEVPRikKICAJCXsKISAJCQlyZXN1bHQgPSB0cnVlOwohIAkJCWJyZWFrOwogIAkJfQogIAoh IAkJaWYgKGNzdl9tb2RlKQogIAkJewogIAkJCS8qICAKISAJCQkgKiBEZWFsaW5nIHdpdGgg cXVvdGVzIGFuZCBlc2NhcGVzIGhlcmUgaXMgbWlsZGx5IHRyaWNreS4gSWYgdGhlCiEgCQkJ ICogcXVvdGUgY2hhciBpcyBhbHNvIHRoZSBlc2NhcGUgY2hhciwgdGhlcmUncyBubyBwcm9i bGVtIC0gd2UgIAohIAkJCSAqIGp1c3QgdXNlIHRoZSBjaGFyIGFzIGEgdG9nZ2xlLiBJZiB0 aGV5IGFyZSBkaWZmZXJlbnQsIHdlIG5lZWQKISAJCQkgKiB0byBlbnN1cmUgdGhhdCB3ZSBv bmx5IHRha2UgYWNjb3VudCBvZiBhbiBlc2NhcGUgaW5zaWRlIGEgcXVvdGVkCiEgCQkJICog ZmllbGQgYW5kIGltbWVkaWF0ZWx5IHByZWNlZGluZyBhIHF1b3RlIGNoYXIsIGFuZCBub3Qg dGhlCiEgCQkJICogc2Vjb25kIGluIGEgZXNjYXBlLWVzY2FwZSBzZXF1ZW5jZS4KICAJCQkg Ki8gCiAgCiEgCQkJaWYgKGluX3F1b3RlICYmIGMgPT0gZXNjYXBlYykKISAJCQkJbGFzdF93 YXNfZXNjID0gISBsYXN0X3dhc19lc2M7CiEgCQkJaWYgKGMgPT0gcXVvdGVjICYmICEgbGFz dF93YXNfZXNjKQohIAkJCQlpbl9xdW90ZSA9ICEgaW5fcXVvdGU7CiEgCQkJaWYgKGMgIT0g ZXNjYXBlYykKISAJCQkJbGFzdF93YXNfZXNjID0gZmFsc2U7CiAgCiAgCQkJLyoKISAJCQkg KiB1cGRhdGluZyB0aGUgbGluZSBjb3VudCBmb3IgZW1iZWRkZWQgQ1IgYW5kL29yIExGIGNo YXJzIGlzIAohIAkJCSAqIG5lY2Vzc2FyaWx5IGEgbGl0dGxlIGZyYWdpbGUgLSB0aGlzIHRl c3QgaXMgcHJvYmFibHkgYWJvdXQgCiEgCQkJICogdGhlIGJlc3Qgd2UgY2FuIGRvLgogIAkJ CSAqLyAKISAJCQlpZiAoaW5fcXVvdGUgJiYgYyA9PSAoZW9sX3R5cGUgPT0gRU9MX0NSID8g J1xyJyA6ICdcbicpKSAKISAJCQkJY29weV9saW5lbm8rKzsgCiEgCQl9CiAgCiEgCQlpZiAo IWluX3F1b3RlICYmIGMgPT0gJ1xyJykKICAJCXsKISAJCQlpZiAoZW9sX3R5cGUgPT0gRU9M X05MKQogIAkJCXsKISAJCQkJaWYgKCEgY3N2X21vZGUpCiEgCQkJCQllcmVwb3J0KEVSUk9S LAohIAkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJTEVfRk9STUFUKSwKISAJ CQkJCQkJIGVycm1zZygibGl0ZXJhbCBjYXJyaWFnZSByZXR1cm4gZm91bmQgaW4gZGF0YSIp LAohIAkJCQkJCQkgZXJyaGludCgiVXNlIFwiXFxyXCIgdG8gcmVwcmVzZW50IGNhcnJpYWdl IHJldHVybi4iKSkpOwohIAkJCQllbHNlCiEgCQkJCQllcmVwb3J0KEVSUk9SLAohIAkJCQkJ CQkoZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJTEVfRk9STUFUKSwKISAJCQkJCQkJIGVy cm1zZygidW5xdW90ZWQgY2FycmlhZ2UgcmV0dXJuIGZvdW5kIGluIENTViBkYXRhIiksCiEg CQkJCQkJCSBlcnJoaW50KCJVc2UgcXVvdGVkIENTViBmaWVsZCB0byByZXByZXNlbnQgY2Fy cmlhZ2UgcmV0dXJuLiIpKSk7CiAgCQkJfQohIAkJCS8qIENoZWNrIGZvciBcclxuIG9uIGZp cnN0IGxpbmUsIF9hbmRfIGhhbmRsZSBcclxuLiAqLwohIAkJCWlmIChlb2xfdHlwZSA9PSBF T0xfVU5LTk9XTiB8fCBlb2xfdHlwZSA9PSBFT0xfQ1JOTCkKICAJCQl7CiEgCQkJCWludAkJ CWMyID0gQ29weVBlZWtDaGFyKCk7CiAgCiEgCQkJCWlmIChjMiA9PSAnXG4nKQohIAkJCQl7 CiEgCQkJCQlDb3B5RG9uZVBlZWsoYzIsIHRydWUpOwkJLyogZWF0IG5ld2xpbmUgKi8KISAJ CQkJCWVvbF90eXBlID0gRU9MX0NSTkw7CiAgCQkJCX0KICAJCQkJZWxzZQogIAkJCQl7CiEg CQkJCQkvKiBmb3VuZCBcciwgYnV0IG5vIFxuICovCiAgCQkJCQlpZiAoZW9sX3R5cGUgPT0g RU9MX0NSTkwpCiAgCQkJCQl7CiEgCQkJCQkJaWYgKCFjc3ZfbW9kZSkKISAJCQkJCQkJZXJl cG9ydChFUlJPUiwKISAJCQkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJTEVf Rk9STUFUKSwKISAJCQkJCQkJCQkgZXJybXNnKCJsaXRlcmFsIGNhcnJpYWdlIHJldHVybiBm b3VuZCBpbiBkYXRhIiksCiEgCQkJCQkJCQkJIGVycmhpbnQoIlVzZSBcIlxcclwiIHRvIHJl cHJlc2VudCBjYXJyaWFnZSByZXR1cm4uIikpKTsKICAJCQkJCQllbHNlCiEgCQkJCQkJCWVy ZXBvcnQoRVJST1IsCiEgCQkJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxF X0ZPUk1BVCksCiEgCQkJCQkJCQkJIGVycm1zZygidW5xdW90ZWQgY2FycmlhZ2UgcmV0dXJu IGZvdW5kIGluIGRhdGEiKSwKISAJCQkJCQkJCQkgZXJyaGludCgiVXNlIHF1b3RlZCBDU1Yg ZmllbGQgdG8gcmVwcmVzZW50IGNhcnJpYWdlIHJldHVybi4iKSkpOwohIAogIAkJCQkJfQog IAogIAkJCQkJLyoKISAJCQkJCSAqIGlmIHdlIGdvdCBoZXJlLCBpdCBpcyB0aGUgZmlyc3Qg bGluZSBhbmQgd2UgZGlkbid0CiEgCQkJCQkgKiBnZXQgXG4sIHNvIHB1dCBpdCBiYWNrCiAg CQkJCQkgKi8KISAJCQkJCUNvcHlEb25lUGVlayhjMiwgZmFsc2UpOwohIAkJCQkJZW9sX3R5 cGUgPSBFT0xfQ1I7CiAgCQkJCX0KICAJCQl9Ci0gCQkJYnJlYWs7CiAgCQl9CiEgCQlpZiAo IWluX3F1b3RlICYmIGMgPT0gJ1xuJykKICAJCXsKISAJCQlpZiAoZW9sX3R5cGUgPT0gRU9M X0NSIHx8IGVvbF90eXBlID09IEVPTF9DUk5MKQohIAkJCXsKISAJCQkJaWYgKCFjc3ZfbW9k ZSkKISAJCQkJCWVyZXBvcnQoRVJST1IsCiEgCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfQkFE X0NPUFlfRklMRV9GT1JNQVQpLAohIAkJCQkJCQkgZXJybXNnKCJsaXRlcmFsIG5ld2xpbmUg Zm91bmQgaW4gZGF0YSIpLAohIAkJCQkJCQkgZXJyaGludCgiVXNlIFwiXFxuXCIgdG8gcmVw cmVzZW50IG5ld2xpbmUuIikpKTsKISAJCQkJZWxzZQohIAkJCQkJZXJlcG9ydChFUlJPUiwK ISAJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxFX0ZPUk1BVCksCiEgCQkJ CQkJCSBlcnJtc2coInVucXVvdGVkIG5ld2xpbmUgZm91bmQgaW4gZGF0YSIpLAohIAkJCQkJ CQkgZXJyaGludCgiVXNlIHF1b3RlZCBDU1YgZmllbGQgdG8gcmVwcmVzZW50IG5ld2xpbmUu IikpKTsKISAJCQkJCQogIAkJCX0KLSAJCQllb2xfdHlwZSA9IEVPTF9OTDsKLSAJCQlicmVh azsKLSAJCX0KICAKISAJCWlmICgobGluZV9idWYubGVuID09IDAgfHwgIWNzdl9tb2RlKSAm JiBjID09ICdcXCcpCiEgCQl7CiEgCQkJaW50IGMyOwohIAkJCQohIAkJCWlmIChjc3ZfbW9k ZSkKISAJCQkJYzIgPSBDb3B5UGVla0NoYXIoKTsKISAJCQllbHNlCiEgCQkJCWMyID0gYyA9 IENvcHlHZXRDaGFyKCk7CiAgCiEgCQkJaWYgKGMyID09IEVPRikKICAJCQl7CiEgCQkJCXJl c3VsdCA9IHRydWU7CiEgCQkJCWlmIChjc3ZfbW9kZSkKISAJCQkJCUNvcHlEb25lUGVlayhj MiwgdHJ1ZSk7CiAgCQkJCWJyZWFrOwogIAkJCX0KISAJCQlpZiAoYzIgPT0gJy4nKQohIAkJ CXsKISAJCQkJaWYgKGNzdl9tb2RlKQohIAkJCQkJQ29weURvbmVQZWVrKGMyLCB0cnVlKTsg LyogYWxsb3cga2VlcCBjYWxsaW5nIEdldENoYXIoKSAqLwogIAohIAkJCQlpZiAoZW9sX3R5 cGUgPT0gRU9MX0NSTkwpCiEgCQkJCXsKISAJCQkJCWMgPSBDb3B5R2V0Q2hhcigpOwohIAkJ CQkJaWYgKGMgPT0gJ1xuJykKISAJCQkJCQllcmVwb3J0KEVSUk9SLAohIAkJCQkJCQkJKGVy cmNvZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxFX0ZPUk1BVCksCiEgCQkJCQkJCQkgZXJybXNn KCJlbmQtb2YtY29weSBtYXJrZXIgZG9lcyBub3QgbWF0Y2ggcHJldmlvdXMgbmV3bGluZSBz dHlsZSIpKSk7CiEgCQkJCQlpZiAoYyAhPSAnXHInKQohIAkJCQkJCWVyZXBvcnQoRVJST1Is CiEgCQkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJTEVfRk9STUFUKSwKISAJ CQkJCQkJCSBlcnJtc2coImVuZC1vZi1jb3B5IG1hcmtlciBjb3JydXB0IikpKTsKICAJCQkJ fQotIAkJCQljID0gQ29weUdldENoYXIoKTsKLSAJCQkJaWYgKGMgIT0gJ1xyJyAmJiBjICE9 ICdcbicpCi0gCQkJCQllcmVwb3J0KEVSUk9SLAotIAkJCQkJCQkoZXJyY29kZShFUlJDT0RF X0JBRF9DT1BZX0ZJTEVfRk9STUFUKSwKLSAJCQkJCQkJIGVycm1zZygiZW5kLW9mLWNvcHkg bWFya2VyIGNvcnJ1cHQiKSkpOwotIAkJCQlpZiAoKGVvbF90eXBlID09IEVPTF9OTCAmJiBj ICE9ICdcbicpIHx8Ci0gCQkJCQkoZW9sX3R5cGUgPT0gRU9MX0NSTkwgJiYgYyAhPSAnXG4n KSB8fAotIAkJCQkJKGVvbF90eXBlID09IEVPTF9DUiAmJiBjICE9ICdccicpKQotIAkJCQkJ ZXJlcG9ydChFUlJPUiwKLSAJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxF X0ZPUk1BVCksCi0gCQkJCQkJCSBlcnJtc2coImVuZC1vZi1jb3B5IG1hcmtlciBkb2VzIG5v dCBtYXRjaCBwcmV2aW91cyBuZXdsaW5lIHN0eWxlIikpKTsKICAKICAJCQkJLyoKISAJCQkJ ICogSW4gcHJvdG9jb2wgdmVyc2lvbiAzLCB3ZSBzaG91bGQgaWdub3JlIGFueXRoaW5nIGFm dGVyCiEgCQkJCSAqIFwuIHVwIHRvIHRoZSBwcm90b2NvbCBlbmQgb2YgY29weSBkYXRhLgko WFhYIG1heWJlCiEgCQkJCSAqIGJldHRlciBub3QgdG8gdHJlYXQgXC4gYXMgc3BlY2lhbD8p CiAgCQkJCSAqLwohIAkJCQlpZiAoY29weV9kZXN0ID09IENPUFlfTkVXX0ZFKQogIAkJCQl7 CiEgCQkJCQl3aGlsZSAoYyAhPSBFT0YpCiEgCQkJCQkJYyA9IENvcHlHZXRDaGFyKCk7CiAg CQkJCX0KISAJCQkJcmVzdWx0ID0gdHJ1ZTsJLyogcmVwb3J0IEVPRiAqLwogIAkJCQlicmVh azsKICAJCQl9CiAgCQkJCiEgCQkJaWYgKGNzdl9tb2RlKQohIAkJCQlDb3B5RG9uZVBlZWso YzIsIGZhbHNlKTsgLyogbm90IGEgZG90LCBzbyBwdXQgaXQgYmFjayAqLyAKICAJCQllbHNl CiEgCQkJCS8qIG5vdCBFT0YgbWFyaywgc28gZW1pdCBcIGFuZCBmb2xsb3dpbmcgY2hhciBs aXRlcmFsbHkgKi8KISAJCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXJNYWNybygmbGluZV9idWYs ICdcXCcpOwogIAkJfQogIAohIAkJYXBwZW5kU3RyaW5nSW5mb0NoYXJNYWNybygmbGluZV9i dWYsIGMpOwogIAogIAkJLyoKISAJCSAqIFdoZW4gY2xpZW50IGVuY29kaW5nICE9IHNlcnZl ciwgbXVzdCBiZSBjYXJlZnVsIHRvIHJlYWQgdGhlCiEgCQkgKiBleHRyYSBieXRlcyBvZiBh IG11bHRpYnl0ZSBjaGFyYWN0ZXIgZXhhY3RseSwgc2luY2UgdGhlCiEgCQkgKiBlbmNvZGlu ZyBtaWdodCBub3QgZW5zdXJlIHRoZXkgZG9uJ3QgbG9vayBsaWtlIEFTQ0lJLiAgV2hlbiB0 aGUKISAJCSAqIGVuY29kaW5ncyBhcmUgdGhlIHNhbWUsIHdlIG5lZWQgbm90IGRvIHRoaXMs IHNpbmNlIG5vIHNlcnZlcgohIAkJICogZW5jb2Rpbmcgd2UgdXNlIGhhcyBBU0NJSS1saWtl IGZvbGxvd2luZyBieXRlcy4KICAJCSAqLwohIAkJaWYgKGNoYW5nZV9lbmNvZGluZykKISAJ CXsKISAJCQlzWzBdID0gYzsKISAJCQltYmxlbiA9IHBnX2VuY29kaW5nX21ibGVuKGNsaWVu dF9lbmNvZGluZywgcyk7CiEgCQkJZm9yIChqID0gMTsgaiA8IG1ibGVuOyBqKyspCiEgCQkJ ewohIAkJCQljID0gQ29weUdldENoYXIoKTsKISAJCQkJaWYgKGMgPT0gRU9GKQogIAkJCQl7 CiEgCQkJCQlyZXN1bHQgPSB0cnVlOwogIAkJCQkJYnJlYWs7CiAgCQkJCX0KLSAJCQkJYXBw ZW5kU3RyaW5nSW5mb0NoYXJNYWNybygmbGluZV9idWYsIGMpOwogIAkJCX0KISAJCQlpZiAo cmVzdWx0KQohIAkJCQlicmVhazsJCQkvKiBvdXQgb2Ygb3V0ZXIgbG9vcCAqLwogIAkJfQot IAl9CQkJCQkJCS8qIGVuZCBvZiBvdXRlciBsb29wICovCiAgCiEgCS8qIERvbmUgcmVhZGlu ZyB0aGUgbGluZS4gIENvbnZlcnQgaXQgdG8gc2VydmVyIGVuY29kaW5nLiAqLwohIAlpZiAo Y2hhbmdlX2VuY29kaW5nKQogIAl7CiAgCQljdnQgPSAoY2hhciAqKSBwZ19jbGllbnRfdG9f c2VydmVyKCh1bnNpZ25lZCBjaGFyICopIGxpbmVfYnVmLmRhdGEsCiAgCQkJCQkJCQkJCSAg IGxpbmVfYnVmLmxlbik7Ci0tLSAxOTg2LDI0MjQgLS0tLQogIAogIAogIC8qCiEgICogRmlu ZHMgdGhlIG5leHQgVEVYVCBsaW5lIHRoYXQgaXMgaW4gdGhlIGlucHV0IGJ1ZmZlciBhbmQg bG9hZHMgCiEgICogaXQgaW50byBsaW5lX2J1Zi4gUmV0dXJucyBhbiBpbmRpY2F0aW9uIGlm IHRoZSBsaW5lIHRoYXQgd2FzIHJlYWQgCiEgICogaXMgY29tcGxldGUgKGlmIGFuIHVuZXNj YXBlZCBsaW5lLWVuZCB3YXMgZW5jb3VudGVyZWQpLiBJZiB3ZSAKISAgKiByZWFjaGVkIHRo ZSBlbmQgb2YgYnVmZmVyIGJlZm9yZSB0aGUgd2hvbGUgbGluZSB3YXMgd3JpdHRlbiBpbnRv IHRoZQohICAqIGxpbmUgYnVmZmVyIHRoZW4gcmV0dXJucyBmYWxzZS4KICAgKi8KICBzdGF0 aWMgYm9vbAohIENvcHlSZWFkTGluZVRleHQoc2l6ZV90IGJ5dGVzcmVhZCwgY2hhciAqZXNj YXBlKQogIHsKISAJaW50CQkJbGluZXNpemU7CiEgCWJvb2wJCXRyYW5zY29kZSA9IChjbGll bnRfZW5jb2RpbmcgIT0gc2VydmVyX2VuY29kaW5nKTsKICAJY2hhcgkgICAqY3Z0OwohIAlj aGFyICAgICAgICBlc2NhcGVjID0gJ1wwJzsKICAKICAJLyogbWFyayB0aGF0IGVuY29kaW5n IGNvbnZlcnNpb24gaGFzbid0IG9jY3VycmVkIHlldCAqLwogIAlsaW5lX2J1Zl9jb252ZXJ0 ZWQgPSBmYWxzZTsKICAKISAJLyoKISAJICogc2V0IHRoZSBlc2NhcGUgY2hhciBmb3IgdGV4 dCBmb3JtYXQgKCdcXCcgYnkgZGVmYXVsdCkuCiEgCSAqLwohIAllc2NhcGVjID0gZXNjYXBl WzBdOwogIAogIAkvKgohIAkgKiBEZXRlY3QgZW5kIG9mIGxpbmUgdHlwZSBpZiBub3QgYWxy ZWFkeSBkZXRlY3RlZC4KICAJICovCiEgCWlmIChlb2xfdHlwZSA9PSBFT0xfVU5LTk9XTikK ICAJewohIAkJYm9vbAkJZW9sX2RldGVjdGVkID0gRGV0ZWN0TGluZUVuZChieXRlc3JlYWQs IE5VTEwsIGVzY2FwZSk7CiEgCiEgCQlpZiAoIWVvbF9kZXRlY3RlZCkKICAJCXsKISAJCQkv KiBsb2FkIGVudGlyZSBpbnB1dCBidWZmZXIgaW50byBsaW5lIGJ1ZiwgYW5kIHF1aXQgKi8K ISAJCQlhcHBlbmRCaW5hcnlTdHJpbmdJbmZvKCZsaW5lX2J1ZiwgaW5wdXRfYnVmLCBDT1BZ X0JVRl9TSVpFKTsKISAJCQlidWZfZG9uZSA9IHRydWU7CiEgCQkJcmV0dXJuIGZhbHNlOwoh IAkJfQogIAkJfQogIAohIAkvKgohIAkgKiBTcGVjaWFsIGNhc2U6IGVvbCBpcyBDUk5MLCBs YXN0IGJ5dGUgb2YgcHJldmlvdXMgYnVmZmVyIHdhcyBhbgohIAkgKiB1bmVzY2FwZWQgQ1Ig YW5kIDFzdCBieXRlIG9mIGN1cnJlbnQgYnVmZmVyIGlzIE5MLiBXZSBjaGVjayBmb3IKISAJ ICogdGhhdCBoZXJlLgohIAkgKi8KISAJaWYgKGVvbF90eXBlID09IEVPTF9DUk5MKQohIAl7 CiEgCQkvKiBpZiB3ZSBzdGFydGVkIHNjYW5uaW5nIGZyb20gdGhlIDFzdCBieXRlIG9mIHRo ZSBidWZmZXIgKi8KISAJCWlmIChiZWdsb2MgPT0gaW5wdXRfYnVmKQohIAkJewohIAkJCS8q IGFuZCBoYWQgYSBDUiBpbiBsYXN0IGJ5dGUgb2YgcHJldiBidWYgKi8KISAJCQlpZiAoY3Jf aW5fcHJldmJ1ZikKISAJCQl7CiEgCQkJCS8qCiEgCQkJCSAqIGlmIHRoaXMgMXN0IGJ5dGUg aW4gYnVmZmVyIGlzIDJuZCBieXRlIG9mIGxpbmUgZW5kIHNlcXVlbmNlCiEgCQkJCSAqIChs aW5lZmVlZCkKISAJCQkJICovCiEgCQkJCWlmICgqYmVnbG9jID09IGVvbF9jaFsxXSkKICAJ CXsKICAJCQkvKiAgCiEgCQkJCQkgKiBsb2FkIHRoYXQgb25lIGxpbmVmZWVkIGJ5dGUgYW5k IGluZGljYXRlIHdlIGFyZSBkb25lCiEgCQkJCQkgKiB3aXRoIHRoZSBkYXRhIGxpbmUKICAJ CQkgKi8gCisgCQkJCQlhcHBlbmRCaW5hcnlTdHJpbmdJbmZvKCZsaW5lX2J1ZiwgYmVnbG9j LCAxKTsKKyAJCQkJCWJ1ZmZlcl9pbmRleCsrOworIAkJCQkJYmVnbG9jKys7CisgCQkJCQll c2NfaW5fcHJldmJ1ZiA9IGZhbHNlOworIAkJCQkJY3JfaW5fcHJldmJ1ZiA9IGZhbHNlOwor IAkJCQkJcmV0dXJuIHRydWU7CisgCQkJCX0KKyAJCQl9CiAgCiEgCQkJY3JfaW5fcHJldmJ1 ZiA9IGZhbHNlOwohIAkJfQohIAl9CiAgCiAgCQkJLyoKISAJICogKHdlIG5lZWQgYSBsb29w IHNvIHRoYXQgaWYgZW9sX2NoIGlzIGZvdW5kLCBidXQgcHJldiBjaCBpcyBiYWNrc2xhc2gs CiEgCSAqIHdlIGNhbiBzZWFyY2ggZm9yIHRoZSBuZXh0IGVvbF9jaCkKICAJCQkgKi8gCiEg CXdoaWxlICh0cnVlKQohIAl7CiEgCQkvKiByZWFjaGVkIGVuZCBvZiBidWZmZXIgKi8KISAJ CWlmICgoZW5kbG9jID0gc2NhblRleHRMaW5lKGJlZ2xvYywgZW9sX2NoWzBdLCBieXRlc3Jl YWQgLSBidWZmZXJfaW5kZXgpKSA9PSBOVUxMKQohIAkJewohIAkJCWxpbmVzaXplID0gQ09Q WV9CVUZfU0laRSAtIChiZWdsb2MgLSBpbnB1dF9idWYpOwohIAkJCWFwcGVuZEJpbmFyeVN0 cmluZ0luZm8oJmxpbmVfYnVmLCBiZWdsb2MsIGxpbmVzaXplKTsKICAKISAJCQlpZiAobGlu ZV9idWYubGVuID4gMSkKICAJCXsKISAJCQkJY2hhcgkgICAqbGFzdF9jaCA9IGxpbmVfYnVm LmRhdGEgKyBsaW5lX2J1Zi5sZW4gLSAxOyAvKiBiZWZvcmUgdGVybWluYXRpbmcgXDAgKi8K ISAKISAJCQkJaWYgKCpsYXN0X2NoID09IGVzY2FwZWMpCiAgCQkJewohIAkJCQkJZXNjX2lu X3ByZXZidWYgPSB0cnVlOwohIAohIAkJCQkJaWYgKGxpbmVfYnVmLmxlbiA+IDIpCiEgCQkJ CQl7CiEgCQkJCQkJbGFzdF9jaC0tOwohIAkJCQkJCWlmICgqbGFzdF9jaCA9PSBlc2NhcGVj KQohIAkJCQkJCQllc2NfaW5fcHJldmJ1ZiA9IGZhbHNlOwogIAkJCX0KISAJCQkJfQohIAkJ CQllbHNlIGlmICgqbGFzdF9jaCA9PSAnXHInKQogIAkJCXsKISAJCQkJCWlmIChlb2xfdHlw ZSA9PSBFT0xfQ1JOTCkKISAJCQkJCQljcl9pbl9wcmV2YnVmID0gdHJ1ZTsKISAJCQkJfQoh IAkJCX0KICAKISAJCQlsaW5lX2RvbmUgPSBmYWxzZTsKISAJCQlidWZfZG9uZSA9IHRydWU7 CiEgCQkJYnJlYWs7CiAgCQkJCX0KICAJCQkJZWxzZQorIAkJCS8qIGZvdW5kIHRoZSAxc3Qg ZW9sIGNoIGluIGlucHV0X2J1Zi4gKi8KICAJCQkJewohIAkJCWJvb2wJCWVvbF9mb3VuZCA9 IHRydWU7CiEgCQkJYm9vbAkJZW9sX2VzY2FwZWQgPSB0cnVlOwohIAohIAkJCS8qCiEgCQkJ ICogTG9hZCB0aGF0IHBpZWNlIG9mIGRhdGEgKHBvdGVudGlhbGx5IGEgZGF0YSBsaW5lKSBp bnRvIHRoZSBsaW5lIGJ1ZmZlciwKISAJCQkgKiBhbmQgdXBkYXRlIHRoZSBwb2ludGVycyBm b3IgdGhlIG5leHQgc2Nhbi4KISAJCQkgKi8KISAJCQlsaW5lc2l6ZSA9IGVuZGxvYyAtIGJl Z2xvYyArIDE7CiEgCQkJYXBwZW5kQmluYXJ5U3RyaW5nSW5mbygmbGluZV9idWYsIGJlZ2xv YywgbGluZXNpemUpOwohIAkJCWJ1ZmZlcl9pbmRleCArPSBsaW5lc2l6ZTsKISAJCQliZWds b2MgPSBlbmRsb2MgKyAxOwohIAogIAkJCQkJaWYgKGVvbF90eXBlID09IEVPTF9DUk5MKQog IAkJCQkJewohIAkJCQkvKiBjaGVjayBpZiB0aGVyZSBpcyBhICdcbicgYWZ0ZXIgdGhlICdc cicgKi8KISAJCQkJaWYgKCooZW5kbG9jICsgMSkgPT0gJ1xuJykKISAJCQkJewohIAkJCQkJ LyogdGhpcyBpcyBhIGxpbmUgZW5kICovCiEgCQkJCQlhcHBlbmRCaW5hcnlTdHJpbmdJbmZv KCZsaW5lX2J1ZiwgYmVnbG9jLCAxKTsJCS8qIGxvYWQgdGhhdCAnXG4nICovCiEgCQkJCQli dWZmZXJfaW5kZXgrKzsKISAJCQkJCWJlZ2xvYysrOwohIAkJCQl9CiAgCQkJCQkJZWxzZQoh IAkJCQkJLyoganVzdCBhIENSLCBub3QgYSBsaW5lIGVuZCAqLwohIAkJCQkJZW9sX2ZvdW5k ID0gZmFsc2U7CiAgCQkJCQl9CiAgCiAgCQkJCQkvKgohIAkJCSAqIGluIHNvbWUgY2FzZXMs IHRoaXMgZW5kIG9mIGxpbmUgY2hhciBoYXBwZW5zIHRvIGJlIHRoZQohIAkJCSAqIGxhc3Qg Y2hhcmFjdGVyIGluIHRoZSBidWZmZXIuIHdlIG5lZWQgdG8gY2F0Y2ggdGhhdC4KICAJCQkJ CSAqLwohIAkJCWlmIChidWZmZXJfaW5kZXggPj0gYnl0ZXNyZWFkKQohIAkJCQlidWZfZG9u ZSA9IHRydWU7CiEgCiEgCQkJLyoKISAJCQkgKiBDaGVjayBpZiB0aGUgMXN0IGVuZCBvZiBs aW5lIGNoIGlzIGVzY2FwZWQuCiEgCQkJICovCiEgCQkJaWYgKGVuZGxvYyAhPSBpbnB1dF9i dWYpCS8qIGNhbiB3ZSBsb29rIDEgY2hhciBiYWNrPyAqLwohIAkJCXsKISAJCQkJaWYgKCoo ZW5kbG9jIC0gMSkgIT0gZXNjYXBlYykJLyogcHJldiBjaGFyIGlzIG5vdCBhbiBlc2NhcGUg Ki8KISAJCQkJCWVvbF9lc2NhcGVkID0gZmFsc2U7CiEgCQkJCWVsc2UKISAJCQkJCS8qIHBy ZXYgY2hhciBpcyBhbiBlc2NhcGUgKi8KISAJCQkJewohIAkJCQkJaWYgKGVuZGxvYyAhPSAo aW5wdXRfYnVmICsgMSkpCQkvKiBjYW4gd2UgbG9vayBhbm90aGVyCiEgCQkJCQkJCQkJCQkJ CQkgKiBjaGFyIGJhY2s/ICovCiEgCQkJCQl7CiEgCQkJCQkJLyogaXQncyBhIGRvdWJsZSBl c2NhcGUgY2hhciwgc28gaXQncyBub3QgYW4gZXNjYXBlICovCiEgCQkJCQkJaWYgKCooZW5k bG9jIC0gMikgPT0gZXNjYXBlYykKISAJCQkJCQkJZW9sX2VzY2FwZWQgPSBmYWxzZTsKISAJ CQkJCQkvKiBlbHNlIGl0J3MgYSBzaW5nbGUgZXNjYXBlIGNoYXIsIHNvIEVPTCBpcyBhc2Nh cGVkICovCiEgCQkJCQl9CiEgCQkJCQllbHNlCiEgCQkJCQl7CiEgCQkJCQkJLyogd2UgbmVl ZCB0byBjaGVjayBpbiB0aGUgbGFzdCBidWZmZXIgKi8KISAJCQkJCQlpZiAoZXNjX2luX3By ZXZidWYpCQkKISAJCQkJCQkJZW9sX2VzY2FwZWQgPSBmYWxzZTsKICAJCQkJfQogIAkJCX0K ICAJCX0KISAJCQllbHNlCiEgCQkJCS8qCiEgCQkJCSAqIHRoaXMgZW9sIGNoIGlzIGZpcnN0 IGNoIGluIGJ1ZmZlciwgY2hlY2sgZm9yIGVzY2FwZSBpbiBwcmV2IGJ1ZgohIAkJCQkgKi8K ICAJCXsKISAJCQkJaWYgKCFlc2NfaW5fcHJldmJ1ZikKISAJCQkJCWVvbF9lc2NhcGVkID0g ZmFsc2U7CiAgCQkJfQogIAohIAkJCWVzY19pbl9wcmV2YnVmID0gZmFsc2U7CQkvKiByZXNl dCB2YXJpYWJsZSAqLwogIAohIAkJCS8qCiEgCQkJICogaWYgZW9sIHdhcyBmb3VuZCwgYW5k IGl0IGlzbid0IGVzY2FwZWQsIGxpbmUgaXMgZG9uZQohIAkJCSAqLwohIAkJCWlmICgoZW9s X2VzY2FwZWQgPT0gZmFsc2UpICYmIGVvbF9mb3VuZCkKICAJCQl7CiEgCQkJCWxpbmVfZG9u ZSA9IHRydWU7CiAgCQkJCWJyZWFrOwogIAkJCX0KISAJCQkJZWxzZQohIAkJCQkvKiBzdGF5 IGluIHRoZSBsb29wIGFuZCBwcm9jZXNzIHNvbWUgbW9yZSBkYXRhLiAqLwohIAkJCQlsaW5l X2RvbmUgPSBmYWxzZTsKISAJCQkJCQohIAkJfQkJCQkJCS8qIGVuZCBvZiBmb3VuZCBlb2xf Y2ggKi8KISAJCX0KICAKISAJLyoKISAJICogRG9uZSByZWFkaW5nIHRoZSBsaW5lLiBDb252 ZXJ0IGl0IHRvIHNlcnZlciBlbmNvZGluZy4KISAJICovCiEgCWlmICh0cmFuc2NvZGUpCiEg CXsKISAJCWN2dCA9IChjaGFyICopIHBnX2NsaWVudF90b19zZXJ2ZXIoKHVuc2lnbmVkIGNo YXIgKikgbGluZV9idWYuZGF0YSwKISAJCQkJCQkJCQkJICAgbGluZV9idWYubGVuKTsKISAJ CWlmIChjdnQgIT0gbGluZV9idWYuZGF0YSkKISAJCXsKISAJCQkvKiB0cmFuc2ZlciBjb252 ZXJ0ZWQgZGF0YSBiYWNrIHRvIGxpbmVfYnVmICovCiEgCQkJbGluZV9idWYubGVuID0gMDsK ISAJCQlsaW5lX2J1Zi5kYXRhWzBdID0gJ1wwJzsKISAJCQlsaW5lX2J1Zi5jdXJzb3IgPSAw OwohIAkJCWFwcGVuZEJpbmFyeVN0cmluZ0luZm8oJmxpbmVfYnVmLCBjdnQsIHN0cmxlbihj dnQpKTsKISAJCX0KISAJfQohIAkJCQohIAkvKiBpbmRpY2F0ZSB0aGF0IGNvbnZlcnNpb24g aGFkIG9jY3VyZWQgKi8KISAJbGluZV9idWZfY29udmVydGVkID0gdHJ1ZTsKISAKISAJLyoK ISAJICogY2hlY2sgaWYgdGhpcyBsaW5lIGlzIGFuIGVuZCBtYXJrZXIgLS0gIlwuIgohIAkg Ki8KISAJZW5kX21hcmtlciA9IGZhbHNlOwohIAohIAlzd2l0Y2ggKGVvbF90eXBlKQohIAkJ CXsKISAJCWNhc2UgRU9MX05MOgohIAkJCWlmICghc3RyY21wKGxpbmVfYnVmLmRhdGEsICJc XC5cbiIpKQohIAkJCQllbmRfbWFya2VyID0gdHJ1ZTsKISAJCQlicmVhazsKISAJCWNhc2Ug RU9MX0NSOgohIAkJCWlmICghc3RyY21wKGxpbmVfYnVmLmRhdGEsICJcXC5cciIpKQohIAkJ CQllbmRfbWFya2VyID0gdHJ1ZTsKISAJCQlicmVhazsKISAJCWNhc2UgRU9MX0NSTkw6CiEg CQkJaWYgKCFzdHJjbXAobGluZV9idWYuZGF0YSwgIlxcLlxyXG4iKSkKISAJCQkJZW5kX21h cmtlciA9IHRydWU7CiEgCQkJYnJlYWs7CiEgCQljYXNlIEVPTF9VTktOT1dOOgohIAkJCQli cmVhazsKISAJCQl9CiEgCiEgCWlmIChlbmRfbWFya2VyKQohIAkJCXsKISAJCWZlX2VvZiA9 IHRydWU7CiEgCQkvKiB3ZSBkb24ndCB3YW50IHRvIHByb2Nlc3MgYSBcLiBhcyBkYXRhIGxp bmUsIHdhbnQgdG8gcXVpdC4gKi8KISAJCWxpbmVfZG9uZSA9IGZhbHNlOwohIAkJYnVmX2Rv bmUgPSB0cnVlOwohIAl9CiEgCiEgCXJldHVybiBsaW5lX2RvbmU7CiEgfQohIAohIC8qCiEg ICogRmluZHMgdGhlIG5leHQgQ1NWIGxpbmUgdGhhdCBpcyBpbiB0aGUgaW5wdXQgYnVmZmVy IGFuZCBsb2FkcyAKISAgKiBpdCBpbnRvIGxpbmVfYnVmLiBSZXR1cm5zIGFuIGluZGljYXRp b24gaWYgdGhlIGxpbmUgdGhhdCB3YXMgcmVhZCAKISAgKiBpcyBjb21wbGV0ZSAoaWYgYW4g dW5lc2NhcGVkIGxpbmUtZW5kIHdhcyBlbmNvdW50ZXJlZCkuIElmIHdlIAohICAqIHJlYWNo ZWQgdGhlIGVuZCBvZiBidWZmZXIgYmVmb3JlIHRoZSB3aG9sZSBsaW5lIHdhcyB3cml0dGVu IGludG8gdGhlCiEgICogbGluZSBidWZmZXIgdGhlbiByZXR1cm5zIGZhbHNlLgohICAqLwoh IHN0YXRpYyBib29sCiEgQ29weVJlYWRMaW5lQ1NWKHNpemVfdCBieXRlc3JlYWQsIGNoYXIg KnF1b3RlLCBjaGFyICplc2NhcGUpCiEgewohIAlpbnQJCQlsaW5lc2l6ZTsKISAJY2hhcgkg ICAqY3Z0OwohIAljaGFyICAgICAgICBxdW90ZWMgPSAnXDAnLAohICAgICAgICAgICAgICAg ICBlc2NhcGVjID0gJ1wwJzsKISAJYm9vbAkJdHJhbnNjb2RlID0gKGNsaWVudF9lbmNvZGlu ZyAhPSBzZXJ2ZXJfZW5jb2RpbmcpOwohIAkKISAJLyogbWFyayB0aGF0IGVuY29kaW5nIGNv bnZlcnNpb24gaGFzbid0IG9jY3VycmVkIHlldCAqLwohIAlsaW5lX2J1Zl9jb252ZXJ0ZWQg PSBmYWxzZTsKISAJCiEgCWVzY2FwZWMgPSBlc2NhcGVbMF07CiEgCXF1b3RlYyA9IHF1b3Rl WzBdOwohIAkKISAgICAgLyogaWdub3JlIHNwZWNpYWwgZXNjYXBlIHByb2Nlc3NpbmcgaWYg aXQncyB0aGUgc2FtZSBhcyBxdW90ZWMgKi8KISAJaWYgKHF1b3RlYyA9PSBlc2NhcGVjKQoh IAkJZXNjYXBlYyA9ICdcMCc7CiEgCiEgCS8qCiEgCSAqIERldGVjdCBlbmQgb2YgbGluZSB0 eXBlIGlmIG5vdCBhbHJlYWR5IGRldGVjdGVkLgohIAkgKi8KISAJaWYgKGVvbF90eXBlID09 IEVPTF9VTktOT1dOKQohIAl7CiEgCQlib29sCQllb2xfZGV0ZWN0ZWQgPSBEZXRlY3RMaW5l RW5kKGJ5dGVzcmVhZCwgcXVvdGUsIGVzY2FwZSk7CiEgCQkKISAJCWlmICghZW9sX2RldGVj dGVkKQohIAkJewohIAkJCS8qIGxvYWQgZW50aXJlIGlucHV0IGJ1ZmZlciBpbnRvIGxpbmUg YnVmLCBhbmQgcXVpdCAqLwohIAkJCWFwcGVuZEJpbmFyeVN0cmluZ0luZm8oJmxpbmVfYnVm LCBpbnB1dF9idWYsIENPUFlfQlVGX1NJWkUpOwohIAkJCWxpbmVfZG9uZSA9IGZhbHNlOwoh IAkJCWJ1Zl9kb25lID0gdHJ1ZTsKISAJCQkKISAJCQlyZXR1cm4gbGluZV9kb25lOwohIAkJ fQohIAl9CiEgCQohIAkvKgohIAkgKiBTcGVjaWFsIGNhc2U6IGVvbCBpcyBDUk5MLCBsYXN0 IGJ5dGUgb2YgcHJldmlvdXMgYnVmZmVyIHdhcyBhbgohIAkgKiB1bmVzY2FwZWQgQ1IgYW5k IDFzdCBieXRlIG9mIGN1cnJlbnQgYnVmZmVyIGlzIE5MLiBXZSBjaGVjayBmb3IKISAJICog dGhhdCBoZXJlLgohIAkgKi8KISAJCQkJaWYgKGVvbF90eXBlID09IEVPTF9DUk5MKQohIAkJ CQl7CiEgCQkvKiBpZiB3ZSBzdGFydGVkIHNjYW5uaW5nIGZyb20gdGhlIDFzdCBieXRlIG9m IHRoZSBidWZmZXIgKi8KISAJCWlmIChiZWdsb2MgPT0gaW5wdXRfYnVmKQohIAkJewohIAkJ CS8qIGFuZCBoYWQgYSBDUiBpbiBsYXN0IGJ5dGUgb2YgcHJldiBidWYgKi8KISAJCQlpZiAo Y3JfaW5fcHJldmJ1ZikKISAJCQl7CiEgCQkJCS8qCiEgCQkJCSAqIGlmIHRoaXMgMXN0IGJ5 dGUgaW4gYnVmZmVyIGlzIDJuZCBieXRlIG9mIGxpbmUgZW5kIHNlcXVlbmNlCiEgCQkJCSAq IChsaW5lZmVlZCkKISAJCQkJICovCiEgCQkJCWlmICgqYmVnbG9jID09IGVvbF9jaFsxXSkK ISAJCQkJewohIAkJCQkJLyoKISAJCQkJCSAqIGxvYWQgdGhhdCBvbmUgbGluZWZlZWQgYnl0 ZSBhbmQgaW5kaWNhdGUgd2UgYXJlIGRvbmUKISAJCQkJCSAqIHdpdGggdGhlIGRhdGEgbGlu ZQohIAkJCQkJICovCiEgCQkJCQlhcHBlbmRCaW5hcnlTdHJpbmdJbmZvKCZsaW5lX2J1Ziwg YmVnbG9jLCAxKTsKISAJCQkJCWJ1ZmZlcl9pbmRleCsrOwohIAkJCQkJYmVnbG9jKys7CiEg CQkJCQkKISAJCQkJCWxpbmVfZG9uZSA9IHRydWU7CiEgCQkJCQllc2NfaW5fcHJldmJ1ZiA9 IGZhbHNlOwohIAkJCQkJY3JfaW5fcHJldmJ1ZiA9IGZhbHNlOwohIAkJCQkJCiEgCQkJCQly ZXR1cm4gbGluZV9kb25lOwohIAkJCQl9CiEgCQkJfQohIAkJCQohIAkJCWNyX2luX3ByZXZi dWYgPSBmYWxzZTsKISAJCX0KICAJCQkJfQogIAogIAkJCQkvKgohIAkgKiAod2UgbmVlZCBh IGxvb3Agc28gdGhhdCBpZiBlb2xfY2ggaXMgZm91bmQsIGJ1dCB3ZSBhcmUgaW4gcXVvdGVz LAohIAkgKiB3ZSBjYW4gc2VhcmNoIGZvciB0aGUgbmV4dCBlb2xfY2gpCiAgCQkJCSAqLwoh IAl3aGlsZSAodHJ1ZSkKISAJewohIAkJLyogcmVhY2hlZCBlbmQgb2YgYnVmZmVyICovCiEg CQlpZiAoKGVuZGxvYyA9IHNjYW5DU1ZMaW5lKGJlZ2xvYywgZW9sX2NoWzBdLCBlc2NhcGVj LCBxdW90ZWMsIGJ5dGVzcmVhZCAtIGJ1ZmZlcl9pbmRleCkpID09IE5VTEwpCiEgCQkJCXsK ISAJCQlsaW5lc2l6ZSA9IENPUFlfQlVGX1NJWkUgLSAoYmVnbG9jIC0gaW5wdXRfYnVmKTsK ISAJCQlhcHBlbmRCaW5hcnlTdHJpbmdJbmZvKCZsaW5lX2J1ZiwgYmVnbG9jLCBsaW5lc2l6 ZSk7CiEgCQkJCiEgCQkJaWYgKGxhc3Rfd2FzX2VzYykKISAJCQkJZXNjX2luX3ByZXZidWYg PSB0cnVlOwohIAkJCQohIAkJCWlmIChsaW5lX2J1Zi5sZW4gPiAxKQohIAkJCXsKISAJCQkJ Y2hhcgkgICAqbGFzdF9jaCA9IGxpbmVfYnVmLmRhdGEgKyBsaW5lX2J1Zi5sZW4gLSAxOyAv KiBiZWZvcmUgdGVybWluYXRpbmcgXDAgKi8KISAJCQkJCiEgCQkJCWlmICgqbGFzdF9jaCA9 PSAnXHInKQogIAkJCQl7CiEgCQkJCQlpZiAoZW9sX3R5cGUgPT0gRU9MX0NSTkwpCiEgCQkJ CQkJY3JfaW5fcHJldmJ1ZiA9IHRydWU7CiAgCQkJCX0KISAJCQl9CiEgCQkJCiEgCQkJbGlu ZV9kb25lID0gZmFsc2U7CiEgCQkJYnVmX2RvbmUgPSB0cnVlOwogIAkJCQlicmVhazsKICAJ CQl9CisgCQllbHNlCisgCQkJLyogZm91bmQgMXN0IGVvbCBjaGFyIGluIGlucHV0X2J1Zi4g Ki8KKyAJCXsKKyAJCQlib29sCQllb2xfZm91bmQgPSB0cnVlOwogIAkJCQohIAkJCS8qCiEg CQkJICogTG9hZCB0aGF0IHBpZWNlIG9mIGRhdGEgKHBvdGVudGlhbGx5IGEgZGF0YSBsaW5l KSBpbnRvIHRoZSBsaW5lIGJ1ZmZlciwKISAJCQkgKiBhbmQgdXBkYXRlIHRoZSBwb2ludGVy cyBmb3IgdGhlIG5leHQgc2Nhbi4KISAJCQkgKi8KISAJCQlsaW5lc2l6ZSA9IGVuZGxvYyAt IGJlZ2xvYyArIDE7CiEgCQkJYXBwZW5kQmluYXJ5U3RyaW5nSW5mbygmbGluZV9idWYsIGJl Z2xvYywgbGluZXNpemUpOwohIAkJCWJ1ZmZlcl9pbmRleCArPSBsaW5lc2l6ZTsKISAJCQli ZWdsb2MgPSBlbmRsb2MgKyAxOwohIAkJCQohIAkJCS8qIGVuZCBvZiBsaW5lIG9ubHkgaWYg bm90IGluIHF1b3RlcyAqLwohIAkJCWlmKGluX3F1b3RlKQohIAkJCXsKISAJCQkJbGluZV9k b25lID0gZmFsc2U7CiEgCQkJCS8qIGJ1ZiBkb25lLCBidXQgc3RpbGwgaW4gcXVvdGUgKi8K ISAJCQkJaWYgKGJ1ZmZlcl9pbmRleCA+PSBieXRlc3JlYWQpCiEgCQkJCXsKISAJCQkJCWJ1 Zl9kb25lID0gdHJ1ZTsKISAJCQkJCWJyZWFrOwohIAkJCQl9CiEgCQkJfQohIAkJCWVsc2UK ISAJCQl7CiEgCQkJCS8qIGlmIGRvcyBlb2wsIGNoZWNrIGZvciAnXG4nIGFmdGVyIHRoZSAn XHInICovCiEgCQkJCWlmIChlb2xfdHlwZSA9PSBFT0xfQ1JOTCkKISAJCQkJewohIAkJCQkJ aWYgKCooZW5kbG9jICsgMSkgPT0gJ1xuJykKISAJCQkJCXsKISAJCQkJCQkvKiB0aGlzIGlz IGEgbGluZSBlbmQgKi8KISAJCQkJCQlhcHBlbmRCaW5hcnlTdHJpbmdJbmZvKCZsaW5lX2J1 ZiwgYmVnbG9jLCAxKTsJCS8qIGxvYWQgdGhhdCAnXG4nICovCiEgCQkJCQkJYnVmZmVyX2lu ZGV4Kys7CiEgCQkJCQkJYmVnbG9jKys7CiEgCQkJCQl9CiAgCQkJZWxzZQohIAkJCQkJCS8q IGp1c3QgYSBDUiwgbm90IGEgbGluZSBlbmQgKi8KISAJCQkJCQllb2xfZm91bmQgPSBmYWxz ZTsKICAJCX0KICAKISAJCQkJLyoKISAJCQkJICogaW4gc29tZSBjYXNlcywgdGhpcyBlbmQg b2YgbGluZSBjaGFyIGhhcHBlbnMgdG8gYmUgdGhlCiEgCQkJCSAqIGxhc3QgY2hhcmFjdGVy IGluIHRoZSBidWZmZXIuIHdlIG5lZWQgdG8gY2F0Y2ggdGhhdC4KISAJCQkJICovCiEgCQkJ CWlmIChidWZmZXJfaW5kZXggPj0gYnl0ZXNyZWFkKQohIAkJCQkJYnVmX2RvbmUgPSB0cnVl OwogIAogIAkJLyoKISAJCQkJICogaWYgZW9sIHdhcyBmb3VuZCBsaW5lIGlzIGRvbmUKICAJ CSAqLwohIAkJCQlpZiAoZW9sX2ZvdW5kKQogIAkJCQl7CiEgCQkJCQlsaW5lX2RvbmUgPSB0 cnVlOwogIAkJCQkJYnJlYWs7CiAgCQkJCX0KICAJCQl9CiEgCQl9CQkJCQkJLyogZW5kIG9m IGZvdW5kIGVvbF9jaCAqLwogIAkJfQogIAohIAkvKgohIAkgKiBEb25lIHJlYWRpbmcgdGhl IGxpbmUuIENvbnZlcnQgaXQgdG8gc2VydmVyIGVuY29kaW5nLgohIAkgKi8KISAJaWYgKHRy YW5zY29kZSkKICAJewogIAkJY3Z0ID0gKGNoYXIgKikgcGdfY2xpZW50X3RvX3NlcnZlcigo dW5zaWduZWQgY2hhciAqKSBsaW5lX2J1Zi5kYXRhLAogIAkJCQkJCQkJCQkgICBsaW5lX2J1 Zi5sZW4pOwoqKioqKioqKioqKioqKioKKioqIDIyNjUsMjI4NSAqKioqCiAgCQkJLyogdHJh bnNmZXIgY29udmVydGVkIGRhdGEgYmFjayB0byBsaW5lX2J1ZiAqLwogIAkJCWxpbmVfYnVm LmxlbiA9IDA7CiAgCQkJbGluZV9idWYuZGF0YVswXSA9ICdcMCc7CiAgCQkJYXBwZW5kQmlu YXJ5U3RyaW5nSW5mbygmbGluZV9idWYsIGN2dCwgc3RybGVuKGN2dCkpOwogIAkJfQogIAl9 CiAgCiEgCS8qIE5vdyBpdCdzIHNhZmUgdG8gdXNlIHRoZSBidWZmZXIgaW4gZXJyb3IgbWVz c2FnZXMgKi8KICAJbGluZV9idWZfY29udmVydGVkID0gdHJ1ZTsKICAKISAJcmV0dXJuIHJl c3VsdDsKICB9CiAgCiAgLyoKICAgKglSZXR1cm4gZGVjaW1hbCB2YWx1ZSBmb3IgYSBoZXhh ZGVjaW1hbCBkaWdpdAogICAqLwogIHN0YXRpYwohIGludCBHZXREZWNpbWFsRnJvbUhleChj aGFyIGhleCkKICB7CiAgCWlmIChpc2RpZ2l0KGhleCkpCiAgCQlyZXR1cm4gaGV4IC0gJzAn OwotLS0gMjQyNywyNDgwIC0tLS0KICAJCQkvKiB0cmFuc2ZlciBjb252ZXJ0ZWQgZGF0YSBi YWNrIHRvIGxpbmVfYnVmICovCiAgCQkJbGluZV9idWYubGVuID0gMDsKICAJCQlsaW5lX2J1 Zi5kYXRhWzBdID0gJ1wwJzsKKyAJCQlsaW5lX2J1Zi5jdXJzb3IgPSAwOwogIAkJCWFwcGVu ZEJpbmFyeVN0cmluZ0luZm8oJmxpbmVfYnVmLCBjdnQsIHN0cmxlbihjdnQpKTsKICAJCX0K ICAJfQogIAohIAkvKiBpbmRpY2F0ZSB0aGF0IGNvbnZlcnNpb24gaGFkIG9jY3VyZWQgKi8K ICAJbGluZV9idWZfY29udmVydGVkID0gdHJ1ZTsKICAKISAJLyoKISAJICogY2hlY2sgaWYg dGhpcyBsaW5lIGlzIGFuIGVuZCBtYXJrZXIgLS0gIlwuIgohIAkgKi8KISAJZW5kX21hcmtl ciA9IGZhbHNlOwohIAohIAlzd2l0Y2ggKGVvbF90eXBlKQohIAl7CiEgCQljYXNlIEVPTF9O TDoKISAJCQlpZiAoIXN0cmNtcChsaW5lX2J1Zi5kYXRhLCAiXFwuXG4iKSkKISAJCQkJZW5k X21hcmtlciA9IHRydWU7CiEgCQkJYnJlYWs7CiEgCQljYXNlIEVPTF9DUjoKISAJCQlpZiAo IXN0cmNtcChsaW5lX2J1Zi5kYXRhLCAiXFwuXHIiKSkKISAJCQkJZW5kX21hcmtlciA9IHRy dWU7CiEgCQkJYnJlYWs7CiEgCQljYXNlIEVPTF9DUk5MOgohIAkJCWlmICghc3RyY21wKGxp bmVfYnVmLmRhdGEsICJcXC5cclxuIikpCiEgCQkJCWVuZF9tYXJrZXIgPSB0cnVlOwohIAkJ CWJyZWFrOwohIAkJY2FzZSBFT0xfVU5LTk9XTjoKISAJCQlicmVhazsKISAJfQohIAohIAlp ZiAoZW5kX21hcmtlcikKISAJewohIAkJZmVfZW9mID0gdHJ1ZTsKISAJCS8qIHdlIGRvbid0 IHdhbnQgdG8gcHJvY2VzcyBhIFwuIGFzIGRhdGEgbGluZSwgd2FudCB0byBxdWl0LiAqLwoh IAkJbGluZV9kb25lID0gZmFsc2U7CiEgCQlidWZfZG9uZSA9IHRydWU7CiEgCX0KISAKISAJ cmV0dXJuIGxpbmVfZG9uZTsKICB9CiAgCiAgLyoKICAgKglSZXR1cm4gZGVjaW1hbCB2YWx1 ZSBmb3IgYSBoZXhhZGVjaW1hbCBkaWdpdAogICAqLwogIHN0YXRpYwohIGludAohIEdldERl Y2ltYWxGcm9tSGV4KGNoYXIgaGV4KQogIHsKICAJaWYgKGlzZGlnaXQoaGV4KSkKICAJCXJl dHVybiBoZXggLSAnMCc7CioqKioqKioqKioqKioqKgoqKiogMjI4NywyMzQ0ICoqKioKICAJ CXJldHVybiB0b2xvd2VyKGhleCkgLSAnYScgKyAxMDsKICB9CiAgCiEgLyotLS0tLS0tLS0t CiEgICogUmVhZCB0aGUgdmFsdWUgb2YgYSBzaW5nbGUgYXR0cmlidXRlLCBwZXJmb3JtaW5n IGRlLWVzY2FwaW5nIGFzIG5lZWRlZC4KISAgKgohICAqIGRlbGltIGlzIHRoZSBjb2x1bW4g ZGVsaW1pdGVyIHN0cmluZyAobXVzdCBiZSBqdXN0IG9uZSBieXRlIGZvciBub3cpLgohICAq IG51bGxfcHJpbnQgaXMgdGhlIG51bGwgbWFya2VyIHN0cmluZy4gIE5vdGUgdGhhdCB0aGlz IGlzIGNvbXBhcmVkIHRvCiEgICogdGhlIHByZS1kZS1lc2NhcGVkIGlucHV0IHN0cmluZy4K ISAgKgohICAqICpyZXN1bHQgaXMgc2V0IHRvIGluZGljYXRlIHdoYXQgdGVybWluYXRlZCB0 aGUgcmVhZDoKISAgKgkJTk9STUFMX0FUVFI6CWNvbHVtbiBkZWxpbWl0ZXIKISAgKgkJRU5E X09GX0xJTkU6CWVuZCBvZiBsaW5lCiEgICogSW4gZWl0aGVyIGNhc2UsIHRoZSBzdHJpbmcg cmVhZCB1cCB0byB0aGUgdGVybWluYXRvciBpcyByZXR1cm5lZC4KISAgKgohICAqICppc251 bGwgaXMgc2V0IHRydWUgb3IgZmFsc2UgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGlucHV0 IG1hdGNoZWQKISAgKiB0aGUgbnVsbCBtYXJrZXIuICBOb3RlIHRoYXQgdGhlIGNhbGxlciBj YW5ub3QgY2hlY2sgdGhpcyBzaW5jZSB0aGUKISAgKiByZXR1cm5lZCBzdHJpbmcgd2lsbCBi ZSB0aGUgcG9zdC1kZS1lc2NhcGluZyBlcXVpdmFsZW50LCB3aGljaCBtYXkKISAgKiBsb29r IHRoZSBzYW1lIGFzIHNvbWUgdmFsaWQgZGF0YSBzdHJpbmcuCiEgICotLS0tLS0tLS0tCiAg ICovCiEgc3RhdGljIGNoYXIgKgohIENvcHlSZWFkQXR0cmlidXRlKGNvbnN0IGNoYXIgKmRl bGltLCBjb25zdCBjaGFyICpudWxsX3ByaW50LAohIAkJCQkgIENvcHlSZWFkUmVzdWx0ICpy ZXN1bHQsIGJvb2wgKmlzbnVsbCkKICB7CiAgCWNoYXIJCWM7CiEgCWNoYXIJCWRlbGltYyA9 IGRlbGltWzBdOwohIAlpbnQJCQlzdGFydF9jdXJzb3IgPSBsaW5lX2J1Zi5jdXJzb3I7CiEg CWludAkJCWVuZF9jdXJzb3I7CiEgCWludAkJCWlucHV0X2xlbjsKICAKISAJLyogcmVzZXQg YXR0cmlidXRlX2J1ZiB0byBlbXB0eSAqLwohIAlhdHRyaWJ1dGVfYnVmLmxlbiA9IDA7CiEg CWF0dHJpYnV0ZV9idWYuZGF0YVswXSA9ICdcMCc7CiAgCiEgCS8qIHNldCBkZWZhdWx0IHN0 YXR1cyAqLwohIAkqcmVzdWx0ID0gRU5EX09GX0xJTkU7CiAgCiEgCWZvciAoOzspCiAgCXsK ISAJCWVuZF9jdXJzb3IgPSBsaW5lX2J1Zi5jdXJzb3I7CiEgCQlpZiAobGluZV9idWYuY3Vy c29yID49IGxpbmVfYnVmLmxlbikKISAJCQlicmVhazsKISAJCWMgPSBsaW5lX2J1Zi5kYXRh W2xpbmVfYnVmLmN1cnNvcisrXTsKISAJCWlmIChjID09IGRlbGltYykKICAJCXsKISAJCQkq cmVzdWx0ID0gTk9STUFMX0FUVFI7CiEgCQkJYnJlYWs7CiAgCQl9CiEgCQlpZiAoYyA9PSAn XFwnKQogIAkJewohIAkJCWlmIChsaW5lX2J1Zi5jdXJzb3IgPj0gbGluZV9idWYubGVuKQoh IAkJCQlicmVhazsKISAJCQljID0gbGluZV9idWYuZGF0YVtsaW5lX2J1Zi5jdXJzb3IrK107 CiEgCQkJc3dpdGNoIChjKQogIAkJCXsKICAJCQkJY2FzZSAnMCc6CiAgCQkJCWNhc2UgJzEn OgotLS0gMjQ4MiwyNzcxIC0tLS0KICAJCXJldHVybiB0b2xvd2VyKGhleCkgLSAnYScgKyAx MDsKICB9CiAgCiEgLyoKISAgKiBEZXRlY3RlZCB0aGUgZW9sIHR5cGUgYnkgbG9va2luZyBh dCB0aGUgZmlyc3QgZGF0YSByb3cuCiEgICogUG9zc2libGUgZW9sIHR5cGVzIGFyZSBOTCwg Q1IsIG9yIENSTkwuIElmIGVvbCB0eXBlIHdhcwohICAqIGRldGVjdGVkLCBpdCBpcyBzZXQg YW5kIGEgYm9vbGVhbiB0cnVlIGlzIHJldHVybmVkIHRvCiEgICogaW5kaWNhdGVkIGRldGVj dGlvbiB3YXMgc3VjY2Vzc2Z1bC4gSWYgdGhlIGZpcnN0IGRhdGEgcm93CiEgICogaXMgbG9u Z2VyIHRoYW4gdGhlIGlucHV0IGJ1ZmZlciwgd2UgcmV0dXJuIGZhbHNlIGFuZCB3aWxsCiEg ICogdHJ5IGFnYWluIGluIHRoZSBuZXh0IGJ1ZmZlci4KICAgKi8KISBzdGF0aWMgYm9vbAoh IERldGVjdExpbmVFbmQoc2l6ZV90IGJ5dGVzcmVhZCwgY2hhciAqcXVvdGUsIGNoYXIgKmVz Y2FwZSkKICB7CisgCWludCAgICAgICAgIGluZGV4ID0gMDsKICAJY2hhcgkJYzsKISAJY2hh cgkJcXVvdGVjID0gJ1wwJywKISAJCWVzY2FwZWMgPSAnXDAnOwohIAlib29sICAgICAgICBj c3YgPSBmYWxzZTsKICAKISAJaWYgKHF1b3RlKSAvKiBDU1YgZm9ybWF0ICovCiEgCXsKISAJ CWNzdiA9IHRydWU7CiEgCQlxdW90ZWMgPSBxdW90ZVswXTsKISAJCWVzY2FwZWMgPSBlc2Nh cGVbMF07CiEgCQkvKiBpZ25vcmUgc3BlY2lhbCBlc2NhcGUgcHJvY2Vzc2luZyBpZiBpdCdz IHRoZSBzYW1lIGFzIHF1b3RlYyAqLwohIAkJaWYgKHF1b3RlYyA9PSBlc2NhcGVjKQohIAkJ CWVzY2FwZWMgPSAnXDAnOwohIAl9CiAgCiEgCXdoaWxlIChpbmRleCA8IENPUFlfQlVGX1NJ WkUpCiEgCXsKISAJCWMgPSBpbnB1dF9idWZbaW5kZXhdOwogIAohIAkJaWYoY3N2KQogIAl7 CiEgCQkJaWYgKGluX3F1b3RlICYmIGMgPT0gZXNjYXBlYykKISAJCQkJbGFzdF93YXNfZXNj ID0gIWxhc3Rfd2FzX2VzYzsKISAJCQlpZiAoYyA9PSBxdW90ZWMgJiYgIWxhc3Rfd2FzX2Vz YykKISAJCQkJaW5fcXVvdGUgPSAhaW5fcXVvdGU7CiEgCQkJaWYgKGMgIT0gZXNjYXBlYykK ISAJCQkJbGFzdF93YXNfZXNjID0gZmFsc2U7CiEgCQl9CiEgCQkKISAJCWlmIChjID09ICdc bicpCiAgCQl7CiEgCQkJaWYoIWNzdiB8fCAoY3N2ICYmICFpbl9xdW90ZSkpCiEgCQkJewoh IAkJCQllb2xfdHlwZSA9IEVPTF9OTDsKISAJCQkJZW9sX2NoWzBdID0gJ1xuJzsKISAJCQkJ ZW9sX2NoWzFdID0gJ1wwJzsKISAJCQkJCiEgCQkJCWluX3F1b3RlID0gZmFsc2U7CiEgCQkJ CWxhc3Rfd2FzX2VzYyA9IGZhbHNlOwohIAkJCQlyZXR1cm4gdHJ1ZTsKISAJCQl9CiAgCQl9 CiEgCQlpZiAoYyA9PSAnXHInKQogIAkJewohIAkJCWlmKCFjc3YgfHwgKGNzdiAmJiAhaW5f cXVvdGUpKQohICAgICAgICAgICAgIHsKISAJCQkJaWYgKGlucHV0X2J1ZltpbmRleCArIDFd ID09ICdcbicpIC8qIGFsd2F5cyBzYWZlICovCiEgCQkJCQl7CiEgCQkJCQllb2xfdHlwZSA9 IEVPTF9DUk5MOwohIAkJCQkJZW9sX2NoWzBdID0gJ1xyJzsKISAJCQkJCWVvbF9jaFsxXSA9 ICdcbic7CiEgCQkJCQl9CiEgCQkJCQllbHNlCiEgCQkJCQl7CiEgCQkJCQkJZW9sX3R5cGUg PSBFT0xfQ1I7CiEgCQkJCQkJZW9sX2NoWzBdID0gJ1xyJzsKISAJCQkJCQllb2xfY2hbMV0g PSAnXDAnOwohIAkJCQkJfQohIAkJCQkJCiEgCQkJCQlpbl9xdW90ZSA9IGZhbHNlOwohIAkJ CQkJbGFzdF93YXNfZXNjID0gZmFsc2U7CiEgCQkJCQlyZXR1cm4gdHJ1ZTsKISAJCQl9CiEg CQl9CiEgCiEgCQlpbmRleCsrOwohIAl9CiEgCiEgcmV0dXJuIGZhbHNlOwohIH0KISAKISAv KgohICAqIFJlYWQgYWxsIFRFWFQgYXR0cmlidXRlcy4gQXR0cmlidXRlcyBhcmUgcGFyc2Vk IGZyb20gbGluZV9idWYgYW5kCiEgICogaW5zZXJ0ZWQgKGFsbCBhdCBvbmNlKSB0byBhdHRy X2J1Ziwgd2hpbGUgc2F2aW5nIHBvaW50ZXJzIHRvCiEgICogZWFjaCBhdHRyaWJ1dGUncyBz dGFydGluZyBwb3NpdGlvbi4KISAgKgohICAqIFdoZW4gdGhpcyByb3V0aW5lIGZpbmlzaGVz IGV4ZWN1dGlvbiBib3RoIHRoZSBudWxscyBhcnJheSBhbmQKISAgKiB0aGUgYXR0cl9vZmZz ZXRzIGFycmF5IGFyZSB1cGRhdGVkLiBUaGUgYXR0cl9vZmZzZXRzIHdpbGwgaW5jbHVkZQoh ICAqIHRoZSBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhdHRyaWJ1dGUgYXJy YXkgb2Ygd2hpY2gKISAgKiBlYWNoIGF0dHJpYnV0ZSBiZWdpbnMuIElmIGEgc3BlY2lmaWMg YXR0cmlidXRlIGlzIG5vdCB1c2VkIGZvciB0aGlzCiEgICogQ09QWSBjb21tYW5kIChvbW1p dHRlZCBmcm9tIHRoZSBjb2x1bW4gbGlzdCksIGEgdmFsdWUgb2YgMCB3aWxsIGJlIGFzc2ln bmVkLgohICAqIEZvciBleGFtcGxlOiBmb3IgdGFibGUgZm9vKGEsYixjLGQsZSkgYW5kIENP UFkgZm9vKGEsYixlKQohICAqIGF0dHJfb2Zmc2V0cyBtYXkgbG9vayBzb21ldGhpbmcgbGlr ZSB0aGlzIGFmdGVyIHRoaXMgcm91dGluZQohICAqIHJldHVybnM6IFswLDIwLDAsMCw1NV0u IFRoYXQgbWVhbnMgdGhhdCBjb2x1bW4gImEiIHZhbHVlIHN0YXJ0cwohICAqIGF0IGJ5dGUg b2Zmc2V0IDAsICJiIiBpbiAyMCBhbmQgImUiIGluIDU1LCBpbiBhdHRyX2J1Zi4KISAgKgoh ICAqIEluIHRoZSBhdHRyaWJ1dGUgYnVmZmVyIChhdHRyX2J1ZikgZWFjaCBhdHRyaWJ1dGUK ISAgKiBpcyB0ZXJtaW5hdGVkIHdpdGggYSAnXDAnLCBhbmQgdGhlcmVmb3JlIGJ5IHVzaW5n IHRoZSBhdHRyX29mZnNldHMKISAgKiBhcnJheSB3ZSBjb3VsZCBwb2ludCB0byBhIGJlZ2lu bmluZyBvZiBhbiBhdHRyaWJ1dGUgYW5kIGhhdmUgaXQKISAgKiBiZWhhdmUgYXMgYSBDIHN0 cmluZywgbXVjaCBsaWtlIHByZXZpb3VzbHkgZG9uZSBpbiBDT1BZLgohICAqCiEgICogQW5v dGhlciBhc3BlY3QgdG8gaW1wcm92aW5nIHBlcmZvcm1hbmNlIGlzIHJlZHVjaW5nIHRoZSBm cmVxdWVuY3kKISAgKiBvZiBkYXRhIGxvYWQgaW50byBidWZmZXJzLiBUaGUgb3JpZ2luYWwg Q09QWSByZWFkIGF0dHJpYnV0ZSBjb2RlCiEgICogbG9hZGVkIGEgY2hhcmFjdGVyIGF0IGEg dGltZS4gSW4gaGVyZSB3ZSB0cnkgdG8gbG9hZCBhIGNodW5rIG9mIGRhdGEKISAgKiBhdCBh IHRpbWUuIFVzdWFsbHkgYSBjaHVuayB3aWxsIGluY2x1ZGUgYSBmdWxsIGRhdGEgcm93CiEg ICogKHVubGVzcyB3ZSBoYXZlIGFuIGVzY2FwZWQgZGVsaW0pLiBUaGF0IGVmZmVjdGl2ZWx5 IHJlZHVjZXMgdGhlIG51bWJlciBvZgohICAqIGxvYWRzIGJ5IGEgZmFjdG9yIG9mIG51bWJl ciBvZiBieXRlcyBwZXIgcm93LiBUaGlzIGltcHJvdmVzIHBlcmZvcm1hbmNlCiEgICogZ3Jl YXRseSwgdW5mb3J0dW5hdGVseSBpdCBhZGQgbW9yZSBjb21wbGV4aXR5IHRvIHRoZSBjb2Rl LgohICAqCiEgICogR2xvYmFsIHBhcnRpY2lwYW50cyBpbiBwYXJzaW5nIGxvZ2ljOgohICAq CiEgICogbGluZV9idWYuY3Vyc29yIC0tIGFuIG9mZnNldCBmcm9tIGJlZ2lubmluZyBvZiB0 aGUgbGluZSBidWZmZXIKISAgKiB0aGF0IGluZGljYXRlcyB3aGVyZSB3ZSBhcmUgYWJvdXQg dG8gYmVnaW4gdGhlIG5leHQgc2Nhbi4gTm90ZSB0aGF0CiEgICogaWYgd2UgaGF2ZSBXSVRI IE9JRFMgdGhpcyBjdXJzb3IgaXMgYWxyZWFkeSBzaGlmdGVkIHBhc3QgdGhlIGZpcnN0CiEg ICogT0lEIGF0dHJpYnV0ZS4KISAgKgohICAqIGF0dHJfYnVmLmN1cnNvciAtLSBhbiBvZmZz ZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZQohICAqIGF0dHJpYnV0ZSBidWZmZXIgdGhh dCBpbmRpY2F0ZXMgd2hlcmUgdGhlIGN1cnJlbnQgYXR0cmlidXRlIGJlZ2lucy4KISAgKi8K ISBzdGF0aWMgdm9pZCAKISBDb3B5UmVhZEF0dHJpYnV0ZXNUZXh0KGNvbnN0IGNoYXIgKmRl bGltLCBjb25zdCBjaGFyICplc2NhcGUsIGNvbnN0IGNoYXIgKm51bGxfcHJpbnQsCiEgCQkJ CQkgICBpbnQgbnVsbF9wcmludF9sZW4sIGNoYXIgKm51bGxzLCBMaXN0ICphdHRudW1saXN0 LCAKISAJCQkJCSAgIGludCAqYXR0cl9vZmZzZXRzLCBpbnQgbnVtX3BoeXNfYXR0cnMsIEZv cm1fcGdfYXR0cmlidXRlICphdHRyKQohIHsKISAJY2hhcgkJZGVsaW1jID0gZGVsaW1bMF07 CQkvKiBkZWxpbWl0ZXIgY2hhcmFjdGVyICovCiEgCWNoYXIgICAgICAgIGVzY2FwZWMgPSBl c2NhcGVbMF07ICAgIC8qIGVzY2FwZSBjaGFyYWN0ZXIgICAgKi8KISAJY2hhcgkgICAqc2Nh bl9zdGFydDsJCS8qIHBvaW50ZXIgdG8gbGluZSBidWZmZXIgZm9yIHNjYW4gc3RhcnQuICov CiEgCWNoYXIJICAgKnNjYW5fZW5kOwkJLyogcG9pbnRlciB0byBsaW5lIGJ1ZmZlciB3aGVy ZSBjaGFyIHdhcyBmb3VuZCAqLwohIAlpbnQJCQlhdHRyX3ByZV9sZW47CS8qIGF0dHIgcmF3 IGxlbiwgYmVmb3JlIHByb2Nlc3NpbmcgZXNjYXBlcyAqLwohIAlpbnQJCQlhdHRyX3Bvc3Rf bGVuOwkvKiBjdXJyZW50IGF0dHIgbGVuIGFmdGVyIGVzY2FwaW5nICovCiEgCWludAkJCW07 CQkJCS8qIGF0dHJpYnV0ZSBpbmRleCBiZWluZyBwYXJzZWQgKi8KISAJaW50CQkJYnl0ZXNf cmVtYWluaW5nOy8qIG51bSBieXRlcyByZW1haW5pbmcgdG8gYmUgc2Nhbm5lZCBpbiBsaW5l IGJ1ZiAqLwohIAlpbnQJCQljaHVua19zdGFydDsJLyogb2Zmc2V0IHRvIGJlZ2lubmluZyBv ZiBsaW5lIGNodW5rIHRvIGxvYWQgKi8KISAJaW50CQkJY2h1bmtfbGVuOwkJLyogbGVuZ3Ro IG9mIGNodW5rIG9mIGRhdGEgdG8gbG9hZCB0byBhdHRyIGJ1ZiAqLwohIAlpbnQJCQlvY3Rf dmFsOwkJLyogYnl0ZSB2YWx1ZSBmb3Igb2N0YWwgZXNjYXBlcyAqLwohIAlpbnQgICAgICAg ICBoZXhfdmFsOyAgICAgICAgLyogYnl0ZSB2YWx1ZSBmb3IgaGV4YWRlY2ltYWwgZXNjYXBl cyAqLwohIAljaGFyICAgICAgICBoZXhjaGFyOyAgICAgICAgLyogY2hhciB0aGF0IGFwcGVh cnMgYWZ0ZXIgXHggZm9yIGhleCB2YWx1ZXMgKi8KISAJaW50CQkJYXR0bnVtOwkJCS8qIGF0 dHJpYnV0ZSBudW1iZXIgYmVpbmcgcGFyc2VkICovCiEgCUxpc3RDZWxsICAgKmN1cjsJCQkv KiBjdXJzb3IgdG8gYXR0cmlidXRlIGxpc3QgdXNlZCBmb3IgdGhpcyBDT1BZICovCiEgCWlu dAkJCWF0dHJpYnV0ZTsKISAJCQohIAkJLyoKISAJCSAqIGluaXQgdmFyaWFibGVzIGZvciBh dHRyaWJ1dGUgc2NhbgohIAkJICovCiEgCQlhdHRyX2J1Zi5sZW4gPSAwOwohIAkJYXR0cl9i dWYuZGF0YVswXSA9ICdcMCc7CiEgCQlhdHRyX2J1Zi5jdXJzb3IgPSAwOwohIAkJLyogY3Vy c29yIGlzIG5vdyA+IDAgaWYgd2UgY29weSBXSVRIIE9JRFMgKi8KISAJCXNjYW5fc3RhcnQg PSBsaW5lX2J1Zi5kYXRhICsgbGluZV9idWYuY3Vyc29yOwohIAkJY3VyID0gbGlzdF9oZWFk KGF0dG51bWxpc3QpOwohIAkJYXR0bnVtID0gbGZpcnN0X2ludChjdXIpOwohIAkJbSA9IGF0 dG51bSAtIDE7CiEgCQljaHVua19zdGFydCA9IGxpbmVfYnVmLmN1cnNvcjsKISAJCWNodW5r X2xlbiA9IDA7CiEgCQlhdHRyX3ByZV9sZW4gPSAwOwohIAkJYXR0cl9wb3N0X2xlbiA9IDA7 CiEgCQkKISAJCS8qCiEgCQkgKiBTY2FuIHRocm91Z2ggdGhlIGxpbmUgYnVmZmVyIHRvIHJl YWQgYWxsIGF0dHJpYnV0ZXMgZGF0YQohIAkJICovCiEgCQl3aGlsZSAobGluZV9idWYuY3Vy c29yIDwgbGluZV9idWYubGVuKQohIAkJewohIAkJCWJ5dGVzX3JlbWFpbmluZyA9IGxpbmVf YnVmLmxlbiAtIGxpbmVfYnVmLmN1cnNvcjsKISAJCQkKISAJCQlpZiAoKHNjYW5fZW5kID0g c2NhblRleHRBdHRyKHNjYW5fc3RhcnQsIGRlbGltYywgZXNjYXBlYywgYnl0ZXNfcmVtYWlu aW5nKSkKISAJCQkJPT0gTlVMTCkKISAJCQl7CiEgCQkJCS8qIEdPVCBUTyBFTkQgT0YgTElO RSBCVUZGRVIgKi8KISAJCQkJCiEgCQkJCWlmIChjdXIgPT0gTlVMTCkKISAJCQkJCWVyZXBv cnQoRVJST1IsCiEgCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfQkFEX0NPUFlfRklMRV9GT1JN QVQpLAohIAkJCQkJCQkgZXJybXNnKCJleHRyYSBkYXRhIGFmdGVyIGxhc3QgZXhwZWN0ZWQg Y29sdW1uIikpKTsKISAJCQkJCiEgCQkJCWF0dG51bSA9IGxmaXJzdF9pbnQoY3VyKTsKISAJ CQkJbSA9IGF0dG51bSAtIDE7CiEgCQkJCQohIAkJCQkvKiBkb24ndCBjb3VudCBlb2wgY2hh cihzKSBpbiBhdHRyIGFuZCBjaHVuayBsZW4gY2FsY3VsYXRpb24gKi8KISAJCQkJaWYgKGVv bF90eXBlID09IEVPTF9DUk5MKQohIAkJCQl7CiEgCQkJCQlhdHRyX3ByZV9sZW4gKz0gYnl0 ZXNfcmVtYWluaW5nIC0gMjsKISAJCQkJCWNodW5rX2xlbiA9IGxpbmVfYnVmLmxlbiAtIGNo dW5rX3N0YXJ0IC0gMjsKISAJCQkJfQohIAkJCQllbHNlCiEgCQkJCXsKISAJCQkJCWF0dHJf cHJlX2xlbiArPSBieXRlc19yZW1haW5pbmcgLSAxOwohIAkJCQkJY2h1bmtfbGVuID0gbGlu ZV9idWYubGVuIC0gY2h1bmtfc3RhcnQgLSAxOwohIAkJCQl9CiEgCQkJCQohIAkJCQkvKiBj aGVjayBpZiB0aGlzIGlzIGEgTlVMTCB2YWx1ZSBvciBkYXRhIHZhbHVlIChhc3N1bWVkIE5V TEwpICovCiEgCQkJCWlmIChhdHRyX3ByZV9sZW4gPT0gbnVsbF9wcmludF9sZW4KISAJCQkJ CSYmCiEgCQkJCQlzdHJuY21wKGxpbmVfYnVmLmRhdGEgKyBsaW5lX2J1Zi5sZW4gLSBhdHRy X3ByZV9sZW4gLSAxLCBudWxsX3ByaW50LCBhdHRyX3ByZV9sZW4pCiEgCQkJCQk9PSAwKQoh IAkJCQkJbnVsbHNbbV0gPSAnbic7CiEgCQkJCWVsc2UKISAJCQkJCW51bGxzW21dID0gJyAn OwohIAkJCQkKISAJCQkJYXR0cl9vZmZzZXRzW21dID0gYXR0cl9idWYuY3Vyc29yOwohIAkJ CQkKISAJCQkJCiEgCQkJCS8qIGxvYWQgdGhlIGxhc3QgY2h1bmssIHRoZSB3aG9sZSBidWZm ZXIgaW4gbW9zdCBjYXNlcyAqLwohIAkJCQlhcHBlbmRCaW5hcnlTdHJpbmdJbmZvKCZhdHRy X2J1ZiwgbGluZV9idWYuZGF0YSArIGNodW5rX3N0YXJ0LCBjaHVua19sZW4pOwohIAkJCQkK ISAJCQkJbGluZV9idWYuY3Vyc29yICs9IGF0dHJfcHJlX2xlbiArIDI7CQkvKiBza2lwIGVv bCBjaGFyIGFuZAohIAkJCQkJKiAnXDAnIHRvIGV4aXQgbG9vcCAqLwohIAkJCQkKISAJCQkJ aWYgKGxuZXh0KGN1cikgIT0gTlVMTCkKISAJCQkJewohIAkJCQkJLyoKISAJCQkJCSAqIEZv ciBhbiBlbXB0eSBkYXRhIGxpbmUsIHRoZSBwcmV2aW91cyBDT1BZIGNvZGUgd2lsbAohIAkJ CQkJICogZmFpbCBpdCBkdXJpbmcgdGhlIGNvbnZlcnNpb24gc3RhZ2UuIFdlIGNhbiBmYWls IGl0IGhlcmUKISAJCQkJCSAqIGFscmVhZHksIGJ1dCB0aGVuIHdlIHdpbGwgZmFpbCB0aGUg cmVncmVzc2lvbiB0ZXN0cyBiL2MKISAJCQkJCSAqIG9mIGEgZGlmZmVyZW50IGVycm9yIG1l c3NhZ2UuIHRoYXQncyB3aHkgd2UgcmV0dXJuIHNvIHdlCiEgCQkJCQkgKiBjYW4gZ2V0IHRo ZSBzYW1lIGVycm9yIG1lc3NhZ2UgdGhhdCByZWdyZXNzIGV4cGVjdHMuIGFoaC4uLgohIAkJ CQkJICogdGhpcyBjb25kaXRpb25hbCBpcyB1bm5lY2Vzc2FyeSBhbmQgc2hvdWxkIGJlIHJl bW92ZWQgc29vbi4KISAJCQkJCSAqLwohIAkJCQkJaWYgKGxpbmVfYnVmLmxlbiA+IDEpCiEg CQkJCQkJZXJlcG9ydChFUlJPUiwKISAJCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfQkFEX0NP UFlfRklMRV9GT1JNQVQpLAohIAkJCQkJCQkJIGVycm1zZygibWlzc2luZyBkYXRhIGZvciBj b2x1bW4gXCIlc1wiIiwKISAJCQkJCQkJCQkJTmFtZVN0cihhdHRyW20gKyAxXS0+YXR0bmFt ZSkpKSk7CiEgCQkJCQllbHNlCiEgCQkJCQkJcmV0dXJuOwohIAkJCQl9CiEgCQkJfQohIAkJ CWVsc2UKISAJCQkJLyogRk9VTkQgQSBERUxJTUlURVIgT1IgRVNDQVBFICovCiEgCQkJewoh IAkJCQlpZiAoY3VyID09IE5VTEwpCiEgCQkJCQllcmVwb3J0KEVSUk9SLAohIAkJCQkJCQko ZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZX0ZJTEVfRk9STUFUKSwKISAJCQkJCQkJIGVycm1z ZygiZXh0cmEgZGF0YSBhZnRlciBsYXN0IGV4cGVjdGVkIGNvbHVtbiIpKSk7CiEgCQkJCQoh IAkJCQlpZiAoKnNjYW5fZW5kID09IGRlbGltYykJCS8qIGZvdW5kIGEgZGVsaW1pdGVyICov CiEgCQkJCXsKISAJCQkJCWF0dG51bSA9IGxmaXJzdF9pbnQoY3VyKTsKISAJCQkJCW0gPSBh dHRudW0gLSAxOwohIAkJCQkJCiEgCQkJCQkvKiAod2UgZG9uJ3QgaW5jbHVkZSB0aGUgZGVs aW1pdGVyIGNoIGluIGxlbmd0aCkgKi8KISAJCQkJCWF0dHJfcHJlX2xlbiArPSBzY2FuX2Vu ZCAtIHNjYW5fc3RhcnQ7CiEgCQkJCQkvKiAod2UgZG9uJ3QgaW5jbHVkZSB0aGUgZGVsaW1p dGVyIGNoIGluIGxlbmd0aCkgKi8KISAJCQkJCWF0dHJfcG9zdF9sZW4gKz0gc2Nhbl9lbmQg LSBzY2FuX3N0YXJ0OwohIAkJCQkJCiEgCQkJCQkvKiBjaGVjayBpZiB0aGlzIGlzIGEgbnVs bCBwcmludCBvciBkYXRhIChhc3N1bWVkIE5VTEwpICovCiEgCQkJCQlpZiAoYXR0cl9wcmVf bGVuID09IG51bGxfcHJpbnRfbGVuCiEgCQkJCQkJJiYKISAJCQkJCQlzdHJuY21wKHNjYW5f ZW5kIC0gYXR0cl9wcmVfbGVuLCBudWxsX3ByaW50LCBhdHRyX3ByZV9sZW4pCiEgCQkJCQkJ PT0gMCkKISAJCQkJCQludWxsc1ttXSA9ICduJzsKISAJCQkJCWVsc2UKISAJCQkJCQludWxs c1ttXSA9ICcgJzsKISAJCQkJCQohIAkJCQkJLyogc2V0IHRoZSBwb2ludGVyIHRvIG5leHQg YXR0cmlidXRlIHBvc2l0aW9uICovCiEgCQkJCQlhdHRyX29mZnNldHNbbV0gPSBhdHRyX2J1 Zi5jdXJzb3I7CiEgCQkJCQkKISAJCQkJCS8qCiEgCQkJCQkgKiB1cGRhdGUgYnVmZmVyIGN1 cnNvcnMgdG8gb3VyIGN1cnJlbnQgbG9jYXRpb24sICsxIHRvIHNraXAKISAJCQkJCSAqIHRo ZSBkZWxpbWMKISAJCQkJCSAqLwohIAkJCQkJbGluZV9idWYuY3Vyc29yID0gc2Nhbl9lbmQg LSBsaW5lX2J1Zi5kYXRhICsgMTsKISAJCQkJCWF0dHJfYnVmLmN1cnNvciArPSBhdHRyX3Bv c3RfbGVuICsgMTsKISAJCQkJCQohIAkJCQkJLyogcHJlcGFyZSBzY2FuIGZvciBuZXh0IGF0 dHIgKi8KISAJCQkJCXNjYW5fc3RhcnQgPSBsaW5lX2J1Zi5kYXRhICsgbGluZV9idWYuY3Vy c29yOwohIAkJCQkJY3VyID0gbG5leHQoY3VyKTsKISAJCQkJCWF0dHJfcHJlX2xlbiA9IDA7 CiEgCQkJCQlhdHRyX3Bvc3RfbGVuID0gMDsKISAJCQkJfQohIAkJCQllbHNlCiEgCQkJCQkv KiBmb3VuZCBhbiBlc2NhcGUgY2hhcmFjdGVyICovCiEgCQkJCXsKISAJCQkJCWNoYXIJCW5l eHRjID0gKihzY2FuX2VuZCArIDEpOwohIAkJCQkJY2hhcgkJbmV3YzsKISAJCQkJCWludAkJ CXNraXAgPSAyOwohIAkJCQkJCiEgCQkJCQljaHVua19sZW4gPSAoc2Nhbl9lbmQgLSBsaW5l X2J1Zi5kYXRhKSAtIGNodW5rX3N0YXJ0ICsgMTsKISAJCQkJCQohIAkJCQkJLyogbG9hZCBh IGNodW5rIG9mIGRhdGEgKi8KISAJCQkJCWFwcGVuZEJpbmFyeVN0cmluZ0luZm8oJmF0dHJf YnVmLCBsaW5lX2J1Zi5kYXRhICsgY2h1bmtfc3RhcnQsIGNodW5rX2xlbik7CiEgCQkJCQkK ISAJCQkJCXN3aXRjaCAobmV4dGMpCiAgCQkJewogIAkJCQljYXNlICcwJzoKICAJCQkJY2Fz ZSAnMSc6CioqKioqKioqKioqKioqKgoqKiogMjM0OCwyNDQ1ICoqKioKICAJCQkJY2FzZSAn NSc6CiAgCQkJCWNhc2UgJzYnOgogIAkJCQljYXNlICc3JzoKISAJCQkJCS8qIGhhbmRsZSBc MDEzICovCiEgCQkJCQl7CiEgCQkJCQkJaW50CQkJdmFsOwogIAohIAkJCQkJCXZhbCA9IE9D VFZBTFVFKGMpOwohIAkJCQkJCWlmIChsaW5lX2J1Zi5jdXJzb3IgPCBsaW5lX2J1Zi5sZW4p CiEgCQkJCQkJewohIAkJCQkJCQljID0gbGluZV9idWYuZGF0YVtsaW5lX2J1Zi5jdXJzb3Jd OwohIAkJCQkJCQlpZiAoSVNPQ1RBTChjKSkKISAJCQkJCQkJewohIAkJCQkJCQkJbGluZV9i dWYuY3Vyc29yKys7CiEgCQkJCQkJCQl2YWwgPSAodmFsIDw8IDMpICsgT0NUVkFMVUUoYyk7 CiEgCQkJCQkJCQlpZiAobGluZV9idWYuY3Vyc29yIDwgbGluZV9idWYubGVuKQogIAkJCQkJ CQkJewohIAkJCQkJCQkJCWMgPSBsaW5lX2J1Zi5kYXRhW2xpbmVfYnVmLmN1cnNvcl07CiEg CQkJCQkJCQkJaWYgKElTT0NUQUwoYykpCiAgCQkJCQkJCQkJewohIAkJCQkJCQkJCQlsaW5l X2J1Zi5jdXJzb3IrKzsKISAJCQkJCQkJCQkJdmFsID0gKHZhbCA8PCAzKSArIE9DVFZBTFVF KGMpOwogIAkJCQkJCQkJCX0KICAJCQkJCQkJCX0KISAJCQkJCQkJfQohIAkJCQkJCX0KISAJ CQkJCQljID0gdmFsICYgMDM3NzsKISAJCQkJCX0KICAJCQkJCWJyZWFrOwogIAkJCQljYXNl ICd4JzoKICAJCQkJCS8qIEhhbmRsZSBceDNGICovCiEgCQkJCQlpZiAobGluZV9idWYuY3Vy c29yIDwgbGluZV9idWYubGVuKQohIAkJCQkJewohIAkJCQkJCWNoYXIgaGV4Y2hhciA9IGxp bmVfYnVmLmRhdGFbbGluZV9idWYuY3Vyc29yXTsKICAKICAJCQkJCQlpZiAoaXN4ZGlnaXQo aGV4Y2hhcikpCiAgCQkJCQkJewohIAkJCQkJCQlpbnQgdmFsID0gR2V0RGVjaW1hbEZyb21I ZXgoaGV4Y2hhcik7CiAgCiEgCQkJCQkJCWxpbmVfYnVmLmN1cnNvcisrOwohIAkJCQkJCQlp ZiAobGluZV9idWYuY3Vyc29yIDwgbGluZV9idWYubGVuKQohIAkJCQkJCQl7CiEgCQkJCQkJ CQloZXhjaGFyID0gbGluZV9idWYuZGF0YVtsaW5lX2J1Zi5jdXJzb3JdOwogIAkJCQkJCQkJ aWYgKGlzeGRpZ2l0KGhleGNoYXIpKQogIAkJCQkJCQkJewohIAkJCQkJCQkJCWxpbmVfYnVm LmN1cnNvcisrOwohIAkJCQkJCQkJCXZhbCA9ICh2YWwgPDwgNCkgKyBHZXREZWNpbWFsRnJv bUhleChoZXhjaGFyKTsKISAJCQkJCQkJCX0KISAJCQkJCQkJfQohIAkJCQkJCQljID0gdmFs ICYgMHhmZjsKICAJCQkJCQl9CiAgCQkJCQl9CiAgCQkJCQlicmVhazsKICAJCQkJY2FzZSAn Yic6CiEgCQkJCQljID0gJ1xiJzsKICAJCQkJCWJyZWFrOwogIAkJCQljYXNlICdmJzoKISAJ CQkJCWMgPSAnXGYnOwogIAkJCQkJYnJlYWs7CiAgCQkJCWNhc2UgJ24nOgohIAkJCQkJYyA9 ICdcbic7CiAgCQkJCQlicmVhazsKICAJCQkJY2FzZSAncic6CiEgCQkJCQljID0gJ1xyJzsK ICAJCQkJCWJyZWFrOwogIAkJCQljYXNlICd0JzoKISAJCQkJCWMgPSAnXHQnOwogIAkJCQkJ YnJlYWs7CiAgCQkJCWNhc2UgJ3YnOgohIAkJCQkJYyA9ICdcdic7CiAgCQkJCQlicmVhazsK ICAKICAJCQkJCS8qCiEgCQkJCQkgKiBpbiBhbGwgb3RoZXIgY2FzZXMsIHRha2UgdGhlIGNo YXIgYWZ0ZXIgJ1wnCiEgCQkJCQkgKiBsaXRlcmFsbHkKICAJCQkJCSAqLwogIAkJCX0KISAJ CX0KISAJCWFwcGVuZFN0cmluZ0luZm9DaGFyTWFjcm8oJmF0dHJpYnV0ZV9idWYsIGMpOwog IAl9CiAgCiEgCS8qIGNoZWNrIHdoZXRoZXIgcmF3IGlucHV0IG1hdGNoZWQgbnVsbCBtYXJr ZXIgKi8KISAJaW5wdXRfbGVuID0gZW5kX2N1cnNvciAtIHN0YXJ0X2N1cnNvcjsKISAJaWYg KGlucHV0X2xlbiA9PSBzdHJsZW4obnVsbF9wcmludCkgJiYKISAJCXN0cm5jbXAoJmxpbmVf YnVmLmRhdGFbc3RhcnRfY3Vyc29yXSwgbnVsbF9wcmludCwgaW5wdXRfbGVuKSA9PSAwKQog IAkJKmlzbnVsbCA9IHRydWU7CiEgCWVsc2UKISAJCSppc251bGwgPSBmYWxzZTsKICAKISAJ cmV0dXJuIGF0dHJpYnV0ZV9idWYuZGF0YTsKISB9CiAgCiAgCiAgLyoKISAgKiBSZWFkIHRo ZSB2YWx1ZSBvZiBhIHNpbmdsZSBhdHRyaWJ1dGUgaW4gQ1NWIG1vZGUsCiAgICogcGVyZm9y bWluZyBkZS1lc2NhcGluZyBhcyBuZWVkZWQuIEVzY2FwaW5nIGRvZXMgbm90IGZvbGxvdyB0 aGUgbm9ybWFsCiAgICogUG9zdGdyZVNRTCB0ZXh0IG1vZGUsIGJ1dCBpbnN0ZWFkICJzdGFu ZGFyZCIgKGkuZS4gY29tbW9uKSBDU1YgdXNhZ2UuCiAgICoKLS0tIDI3NzUsMjk0OCAtLS0t CiAgCQkJCWNhc2UgJzUnOgogIAkJCQljYXNlICc2JzoKICAJCQkJY2FzZSAnNyc6CiEgCQkJ CQkJCW9jdF92YWwgPSBPQ1RWQUxVRShuZXh0Yyk7CiEgCQkJCQkJCW5leHRjID0gKihzY2Fu X2VuZCArIDIpOwogIAohIAkJCQkJCQkvKgohIAkJCQkJCQkgKiAobm8gbmVlZCBmb3Igb3V0 IGJhZCBhY2Nlc3MgY2hlY2sgc2luY2UgbGluZSBpZgohIAkJCQkJCQkJKiBidWZmZXJlZCkK ISAJCQkJCQkJICovCiEgCQkJCQkJCWlmIChJU09DVEFMKG5leHRjKSkKICAJCQkJCQkJCXsK ISAJCQkJCQkJCXNraXArKzsKISAJCQkJCQkJCW9jdF92YWwgPSAob2N0X3ZhbCA8PCAzKSAr IE9DVFZBTFVFKG5leHRjKTsKISAJCQkJCQkJCW5leHRjID0gKihzY2FuX2VuZCArIDMpOwoh IAkJCQkJCQkJaWYgKElTT0NUQUwobmV4dGMpKQogIAkJCQkJCQkJCXsKISAJCQkJCQkJCQlz a2lwKys7CiEgCQkJCQkJCQkJb2N0X3ZhbCA9IChvY3RfdmFsIDw8IDMpICsgT0NUVkFMVUUo bmV4dGMpOwogIAkJCQkJCQkJCX0KICAJCQkJCQkJCX0KISAJCQkJCQkJCW5ld2MgPSBvY3Rf dmFsICYgMDM3NzsJLyogdGhlIGVzY2FwZWQgYnl0ZSB2YWx1ZSAqLwogIAkJCQkJYnJlYWs7 CiAgCQkJCWNhc2UgJ3gnOgogIAkJCQkJLyogSGFuZGxlIFx4M0YgKi8KISAJCQkJCQkJaGV4 Y2hhciA9ICooc2Nhbl9lbmQgKyAyKTsKICAKICAJCQkJCQlpZiAoaXN4ZGlnaXQoaGV4Y2hh cikpCiAgCQkJCQkJewohIAkJCQkJCQkJc2tpcCsrOwohIAkJCQkJCQkJaGV4X3ZhbCA9IEdl dERlY2ltYWxGcm9tSGV4KGhleGNoYXIpOwogIAohIAkJCQkJCQkJaGV4Y2hhciA9ICooc2Nh bl9lbmQgKyAzKTsKICAJCQkJCQkJCWlmIChpc3hkaWdpdChoZXhjaGFyKSkKICAJCQkJCQkJ CXsKISAJCQkJCQkJCQlza2lwKys7CiEgCQkJCQkJCQkJaGV4X3ZhbCA9IChoZXhfdmFsIDw8 IDQpICsgR2V0RGVjaW1hbEZyb21IZXgoaGV4Y2hhcik7CiAgCQkJCQkJfQorIAkJCQkJCQkJ bmV3YyA9IGhleF92YWwgJiAweGZmOwogIAkJCQkJfQorIAkJCQkJCQkJZWxzZSAvKiAiXHgi IHdpdGggbm8gaGV4IHZhbHVlICovCisgCQkJCQkJCQkJbmV3YyA9IG5leHRjOwogIAkJCQkJ YnJlYWs7CiAgCQkJCWNhc2UgJ2InOgohIAkJCQkJCQluZXdjID0gJ1xiJzsKICAJCQkJCWJy ZWFrOwogIAkJCQljYXNlICdmJzoKISAJCQkJCQkJbmV3YyA9ICdcZic7CiAgCQkJCQlicmVh azsKICAJCQkJY2FzZSAnbic6CiEgCQkJCQkJCW5ld2MgPSAnXG4nOwogIAkJCQkJYnJlYWs7 CiAgCQkJCWNhc2UgJ3InOgohIAkJCQkJCQluZXdjID0gJ1xyJzsKICAJCQkJCWJyZWFrOwog IAkJCQljYXNlICd0JzoKISAJCQkJCQkJbmV3YyA9ICdcdCc7CiAgCQkJCQlicmVhazsKICAJ CQkJY2FzZSAndic6CiEgCQkJCQkJCW5ld2MgPSAnXHYnOwohIAkJCQkJCQlicmVhazsKISAJ CQkJCQlkZWZhdWx0OgohIAkJCQkJCQlpZiAobmV4dGMgPT0gZGVsaW1jKQohIAkJCQkJCQkJ bmV3YyA9IGRlbGltYzsKISAJCQkJCQkJZWxzZSBpZiAobmV4dGMgPT0gZXNjYXBlYykKISAJ CQkJCQkJCW5ld2MgPSBlc2NhcGVjOwohIAkJCQkJCQllbHNlCiEgCQkJCQkJCQkvKiBubyBl c2NhcGUgc2VxdWVuY2UsIHRha2UgbmV4dCBjaGFyIGxpdGVyYWx5ICovCiEgCQkJCQkJCQlu ZXdjID0gbmV4dGM7CiAgCQkJCQlicmVhazsKKyAJCQkJCX0KKyAJCQkJCQorIAkJCQkJLyog dXBkYXRlIHRvIGN1cnJlbnQgbGVuZ3RoLCBhZGQgZXNjYXBlIGFuZCBlc2NhcGVkIGNoYXJz ICAqLworIAkJCQkJYXR0cl9wcmVfbGVuICs9IHNjYW5fZW5kIC0gc2Nhbl9zdGFydCArIDI7 CisgCQkJCQkvKiB1cGRhdGUgdG8gY3VycmVudCBsZW5ndGgsIGVzY2FwZWQgY2hhciAqLwor IAkJCQkJYXR0cl9wb3N0X2xlbiArPSBzY2FuX2VuZCAtIHNjYW5fc3RhcnQgKyAxOwogIAog IAkJCQkJLyoKISAJCQkJCSAqIE5lZWQgdG8gZ2V0IHJpZCBvZiB0aGUgZXNjYXBlIGNoYXJh Y3Rlci4gVGhpcyBpcyBkb25lIGJ5CiEgCQkJCQkgKiBsb2FkaW5nIHRoZSBjaHVuayB1cCB0 byBpbmNsdWRpbmcgdGhlIGVzY2FwZSBjaGFyYWN0ZXIKISAJCQkJCSAqIGludG8gdGhlIGF0 dHJpYnV0ZSBidWZmZXIuIFRoZW4gb3ZlcndyaXR0aW5nIHRoZSBiYWNrc2xhc2gKISAJCQkJ CSAqIHdpdGggdGhlIGVzY2FwZWQgc2VxdWVuY2Ugb3IgY2hhciwgYW5kIGNvbnRpbnVpbmcg dG8gc2NhbgohIAkJCQkJICogZnJvbSAqYWZ0ZXIqIHRoZSBjaGFyIHRoYW4gaXMgYWZ0ZXIg dGhlIGVzY2FwZSBpbiBsaW5lIGJ1Zi4KICAJCQkJCSAqLworIAkJCQkJKihhdHRyX2J1Zi5k YXRhICsgYXR0cl9idWYubGVuIC0gMSkgPSBuZXdjOworIAkJCQkJbGluZV9idWYuY3Vyc29y ID0gc2Nhbl9lbmQgLSBsaW5lX2J1Zi5kYXRhICsgc2tpcDsKKyAJCQkJCXNjYW5fc3RhcnQg PSBzY2FuX2VuZCArIHNraXA7CisgCQkJCQljaHVua19zdGFydCA9IGxpbmVfYnVmLmN1cnNv cjsKKyAJCQkJCWNodW5rX2xlbiA9IDA7CiAgCQkJfQohIAkJCQkKISAJCQl9CQkJCQkJLyog ZW5kIGRlbGltaXRlci9iYWNrc2xhc2ggKi8KISAKISAJCX0JCQkJCQkJLyogZW5kIGxpbmUg YnVmZmVyIHNjYW4uICovCiEgCiEgCS8qCiEgCSAqIFJlcGxhY2UgYWxsIGRlbGltaXRlcnMg d2l0aCBOVUxMIGZvciBzdHJpbmcgdGVybWluYXRpb24uCiEgCSAqIE5PVEU6IG9ubHkgZGVs aW1pdGVycyAoTk9UIG5lY2Vzc2FyaWx5IGFsbCBkZWxpbWMpIGFyZSByZXBsYWNlZC4KISAJ ICogRXhhbXBsZSAoZGVsaW1jID0gJ3wnKToKISAJICogLSBCZWZvcmU6ICBmICAxCXwgIGYg IFx8ICAyICB8CWYgIDMKISAJICogLSBBZnRlciA6ICBmICAxIFwwICBmICAgfCAgMiBcMAlm ICAzCiEgCSAqLwohIAlmb3IgKGF0dHJpYnV0ZSA9IDE7IGF0dHJpYnV0ZSA8IG51bV9waHlz X2F0dHJzOyBhdHRyaWJ1dGUrKykKISAJewohIAkJaWYgKGF0dHJfb2Zmc2V0c1thdHRyaWJ1 dGVdICE9IDApCiEgCQkJKihhdHRyX2J1Zi5kYXRhICsgYXR0cl9vZmZzZXRzW2F0dHJpYnV0 ZV0gLSAxKSA9ICdcMCc7CiAgCX0KICAKISB9CiEgCiEgCiEgLyoKISAgKiBSZWFkIGEgYmlu YXJ5IGF0dHJpYnV0ZQohICAqLwohIHN0YXRpYyBEYXR1bQohIENvcHlSZWFkQmluYXJ5QXR0 cmlidXRlKGludCBjb2x1bW5fbm8sIEZtZ3JJbmZvICpmbGluZm8sIAohIAkJCQkJCU9pZCB0 eXBpb3BhcmFtLCBpbnQzMiB0eXBtb2QsCiEgCQkJCQkJYm9vbCAqaXNudWxsKQohIHsKISAJ aW50MzIJCWZsZF9zaXplOwohIAlEYXR1bQkJcmVzdWx0OwohIAkKISAJZmxkX3NpemUgPSBD b3B5R2V0SW50MzIoKTsKISAJaWYgKENvcHlHZXRFb2YoKSkKISAJCWVyZXBvcnQoRVJST1Is CiEgCQkJCShlcnJjb2RlKEVSUkNPREVfQkFEX0NPUFlfRklMRV9GT1JNQVQpLAohIAkJCQkg ZXJybXNnKCJ1bmV4cGVjdGVkIEVPRiBpbiBDT1BZIGRhdGEiKSkpOwohIAlpZiAoZmxkX3Np emUgPT0gLTEpCiEgCXsKICAJCSppc251bGwgPSB0cnVlOwohIAkJcmV0dXJuIChEYXR1bSkg MDsKISAJfQohIAlpZiAoZmxkX3NpemUgPCAwKQohIAkJZXJlcG9ydChFUlJPUiwKISAJCQkJ KGVycmNvZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxFX0ZPUk1BVCksCiEgCQkJCSBlcnJtc2co ImludmFsaWQgZmllbGQgc2l6ZSIpKSk7CiAgCiEgCS8qIHJlc2V0IGF0dHJfYnVmIHRvIGVt cHR5LCBhbmQgbG9hZCByYXcgZGF0YSBpbiBpdCAqLwohIAlhdHRyX2J1Zi5sZW4gPSAwOwoh IAlhdHRyX2J1Zi5kYXRhWzBdID0gJ1wwJzsKISAJYXR0cl9idWYuY3Vyc29yID0gMDsKISAJ CiEgCWVubGFyZ2VTdHJpbmdJbmZvKCZhdHRyX2J1ZiwgZmxkX3NpemUpOwohIAkKISAJQ29w eUdldERhdGEoYXR0cl9idWYuZGF0YSwgZmxkX3NpemUpOwohIAlpZiAoQ29weUdldEVvZigp KQohIAkJZXJlcG9ydChFUlJPUiwKISAJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09QWV9G SUxFX0ZPUk1BVCksCiEgCQkJCSBlcnJtc2coInVuZXhwZWN0ZWQgRU9GIGluIENPUFkgZGF0 YSIpKSk7CiAgCisgCWF0dHJfYnVmLmxlbiA9IGZsZF9zaXplOworIAlhdHRyX2J1Zi5kYXRh W2ZsZF9zaXplXSA9ICdcMCc7CisgCQorIAkvKiBDYWxsIHRoZSBjb2x1bW4gdHlwZSdzIGJp bmFyeSBpbnB1dCBjb252ZXJ0ZXIgKi8KKyAJcmVzdWx0ID0gRnVuY3Rpb25DYWxsMyhmbGlu Zm8sCisgCQkJCQkJICAgUG9pbnRlckdldERhdHVtKCZhdHRyX2J1ZiksCisgCQkJCQkJICAg T2JqZWN0SWRHZXREYXR1bSh0eXBpb3BhcmFtKSwKKyAJCQkJCQkgICBJbnQzMkdldERhdHVt KHR5cG1vZCkpOworIAkKKyAJLyogVHJvdWJsZSBpZiBpdCBkaWRuJ3QgZWF0IHRoZSB3aG9s ZSBidWZmZXIgKi8KKyAJaWYgKGF0dHJfYnVmLmN1cnNvciAhPSBhdHRyX2J1Zi5sZW4pCisg CQllcmVwb3J0KEVSUk9SLAorIAkJCQkoZXJyY29kZShFUlJDT0RFX0lOVkFMSURfQklOQVJZ X1JFUFJFU0VOVEFUSU9OKSwKKyAJCQkJIGVycm1zZygiaW5jb3JyZWN0IGJpbmFyeSBkYXRh IGZvcm1hdCIpKSk7CisgCQorIAkqaXNudWxsID0gZmFsc2U7CisgCXJldHVybiByZXN1bHQ7 CisgfQogIAogIC8qCiEgICogUmVhZCBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlIGRhdGEg bGluZSBpbiBDU1YgbW9kZSwKICAgKiBwZXJmb3JtaW5nIGRlLWVzY2FwaW5nIGFzIG5lZWRl ZC4gRXNjYXBpbmcgZG9lcyBub3QgZm9sbG93IHRoZSBub3JtYWwKICAgKiBQb3N0Z3JlU1FM IHRleHQgbW9kZSwgYnV0IGluc3RlYWQgInN0YW5kYXJkIiAoaS5lLiBjb21tb24pIENTViB1 c2FnZS4KICAgKgoqKioqKioqKioqKioqKioKKioqIDI0NDgsMjQ3MiAqKioqCiAgICoKICAg KiBudWxsX3ByaW50IGlzIHRoZSBudWxsIG1hcmtlciBzdHJpbmcuICBOb3RlIHRoYXQgdGhp cyBpcyBjb21wYXJlZCB0bwogICAqIHRoZSBwcmUtZGUtZXNjYXBlZCBpbnB1dCBzdHJpbmcg KHRodXMgaWYgaXQgaXMgcXVvdGVkIGl0IGlzIG5vdCBhIE5VTEwpLgotICAqCi0gICogKnJl c3VsdCBpcyBzZXQgdG8gaW5kaWNhdGUgd2hhdCB0ZXJtaW5hdGVkIHRoZSByZWFkOgotICAq CQlOT1JNQUxfQVRUUjoJY29sdW1uIGRlbGltaXRlcgotICAqCQlFTkRfT0ZfTElORToJZW5k IG9mIGxpbmUKLSAgKgkJVU5URVJNSU5BVEVEX0ZJRUxEIG5vIHF1b3RlIGRldGVjdGVkIGF0 IGVuZCBvZiBhIHF1b3RlZCBmaWVsZAotICAqCi0gICogSW4gYW55IGNhc2UsIHRoZSBzdHJp bmcgcmVhZCB1cCB0byB0aGUgdGVybWluYXRvciAob3IgZW5kIG9mIGZpbGUpCi0gICogaXMg cmV0dXJuZWQuCi0gICoKLSAgKiAqaXNudWxsIGlzIHNldCB0cnVlIG9yIGZhbHNlIGRlcGVu ZGluZyBvbiB3aGV0aGVyIHRoZSBpbnB1dCBtYXRjaGVkCi0gICogdGhlIG51bGwgbWFya2Vy LiAgTm90ZSB0aGF0IHRoZSBjYWxsZXIgY2Fubm90IGNoZWNrIHRoaXMgc2luY2UgdGhlCi0g ICogcmV0dXJuZWQgc3RyaW5nIHdpbGwgYmUgdGhlIHBvc3QtZGUtZXNjYXBpbmcgZXF1aXZh bGVudCwgd2hpY2ggbWF5Ci0gICogbG9vayB0aGUgc2FtZSBhcyBzb21lIHZhbGlkIGRhdGEg c3RyaW5nLgogICAqLS0tLS0tLS0tLQogICAqLwohIAohIHN0YXRpYyBjaGFyICoKISBDb3B5 UmVhZEF0dHJpYnV0ZUNTVihjb25zdCBjaGFyICpkZWxpbSwgY29uc3QgY2hhciAqbnVsbF9w cmludCwgY2hhciAqcXVvdGUsCiEgCQkJCQkgY2hhciAqZXNjYXBlLCBDb3B5UmVhZFJlc3Vs dCAqcmVzdWx0LCBib29sICppc251bGwpCiAgewogIAljaGFyCQlkZWxpbWMgPSBkZWxpbVsw XTsKICAJY2hhcgkJcXVvdGVjID0gcXVvdGVbMF07Ci0tLSAyOTUxLDI5NjIgLS0tLQogICAq CiAgICogbnVsbF9wcmludCBpcyB0aGUgbnVsbCBtYXJrZXIgc3RyaW5nLiAgTm90ZSB0aGF0 IHRoaXMgaXMgY29tcGFyZWQgdG8KICAgKiB0aGUgcHJlLWRlLWVzY2FwZWQgaW5wdXQgc3Ry aW5nICh0aHVzIGlmIGl0IGlzIHF1b3RlZCBpdCBpcyBub3QgYSBOVUxMKS4KICAgKi0tLS0t LS0tLS0KICAgKi8KISBzdGF0aWMgdm9pZAohIENvcHlSZWFkQXR0cmlidXRlc0NTVihjb25z dCBjaGFyICpkZWxpbSwgY29uc3QgY2hhciAqbnVsbF9wcmludCwgY2hhciAqcXVvdGUsCiEg CQkJCQkgIGNoYXIgKmVzY2FwZSwgaW50IG51bGxfcHJpbnRfbGVuLCBjaGFyICpudWxscywg TGlzdCAqYXR0bnVtbGlzdCwgCiEgCQkJCQkgIGludCAqYXR0cl9vZmZzZXRzLCBpbnQgbnVt X3BoeXNfYXR0cnMsIEZvcm1fcGdfYXR0cmlidXRlICphdHRyKQogIHsKICAJY2hhcgkJZGVs aW1jID0gZGVsaW1bMF07CiAgCWNoYXIJCXF1b3RlYyA9IHF1b3RlWzBdOwoqKioqKioqKioq KioqKioKKioqIDI0NzcsMjUwMiAqKioqCiAgCWludAkJCWlucHV0X2xlbjsKICAJYm9vbAkJ aW5fcXVvdGUgPSBmYWxzZTsKICAJYm9vbAkJc2F3X3F1b3RlID0gZmFsc2U7CiAgCiEgCS8q IHJlc2V0IGF0dHJpYnV0ZV9idWYgdG8gZW1wdHkgKi8KISAJYXR0cmlidXRlX2J1Zi5sZW4g PSAwOwohIAlhdHRyaWJ1dGVfYnVmLmRhdGFbMF0gPSAnXDAnOwogIAotIAkvKiBzZXQgZGVm YXVsdCBzdGF0dXMgKi8KLSAJKnJlc3VsdCA9IEVORF9PRl9MSU5FOwogIAogIAlmb3IgKDs7 KQogIAl7CiAgCQllbmRfY3Vyc29yID0gbGluZV9idWYuY3Vyc29yOwogIAkJaWYgKGxpbmVf YnVmLmN1cnNvciA+PSBsaW5lX2J1Zi5sZW4pCiAgCQkJYnJlYWs7CiAgCQljID0gbGluZV9i dWYuZGF0YVtsaW5lX2J1Zi5jdXJzb3IrK107CiAgCiAgCQkvKiB1bnF1b3RlZCBmaWVsZCBk ZWxpbWl0ZXIgICovCiAgCQlpZiAoIWluX3F1b3RlICYmIGMgPT0gZGVsaW1jKQogIAkJewoh IAkJCSpyZXN1bHQgPSBOT1JNQUxfQVRUUjsKISAJCQlicmVhazsKICAJCX0KICAKICAJCS8q IHN0YXJ0IG9mIHF1b3RlZCBmaWVsZCAob3IgcGFydCBvZiBmaWVsZCkgKi8KLS0tIDI5Njcs MzA0NyAtLS0tCiAgCWludAkJCWlucHV0X2xlbjsKICAJYm9vbAkJaW5fcXVvdGUgPSBmYWxz ZTsKICAJYm9vbAkJc2F3X3F1b3RlID0gZmFsc2U7CisgCWludAkJCWF0dG51bTsJCQkvKiBh dHRyaWJ1dGUgbnVtYmVyIGJlaW5nIHBhcnNlZCAqLworIAlpbnQJCQltOwkJCQkvKiBhdHRy aWJ1dGUgaW5kZXggYmVpbmcgcGFyc2VkICovCisgCUxpc3RDZWxsICAgKmN1cjsJCQkvKiBj dXJzb3IgdG8gYXR0cmlidXRlIGxpc3QgdXNlZCBmb3IgdGhpcyBDT1BZICovCiAgCiEgCS8q CiEgCSAqIGluaXQgdmFyaWFibGVzIGZvciBhdHRyaWJ1dGUgc2NhbgohIAkgKi8KISAJYXR0 cl9idWYubGVuID0gMDsKISAJYXR0cl9idWYuZGF0YVswXSA9ICdcMCc7CiEgCWF0dHJfYnVm LmN1cnNvciA9IDA7CiEgCQohIAljdXIgPSBsaXN0X2hlYWQoYXR0bnVtbGlzdCk7CiEgCWF0 dG51bSA9IGxmaXJzdF9pbnQoY3VyKTsKISAJbSA9IGF0dG51bSAtIDE7CiEgCWlucHV0X2xl biA9IDA7CiAgCiAgCiAgCWZvciAoOzspCiAgCXsKICAJCWVuZF9jdXJzb3IgPSBsaW5lX2J1 Zi5jdXJzb3I7CisgCQkKKyAJCS8qIGZpbmlzaGVkIHByb2Nlc3NpbmcgYXR0cmlidXRlcyBp biBsaW5lICovCiAgCQlpZiAobGluZV9idWYuY3Vyc29yID49IGxpbmVfYnVmLmxlbikKKyAJ CXsKKyAJCQkvKiBjaGVjayB3aGV0aGVyIHJhdyBpbnB1dCBtYXRjaGVkIG51bGwgbWFya2Vy ICovCisgCQkJaW5wdXRfbGVuID0gZW5kX2N1cnNvciAtIHN0YXJ0X2N1cnNvcjsKKyAJCQlp ZiAoIXNhd19xdW90ZSAmJiBpbnB1dF9sZW4gPT0gbnVsbF9wcmludF9sZW4gJiYKKyAJCQkJ c3RybmNtcCgmbGluZV9idWYuZGF0YVtzdGFydF9jdXJzb3JdLCBudWxsX3ByaW50LCBpbnB1 dF9sZW4pID09IDApCisgCQkJCW51bGxzW21dID0gJ24nOworIAkJCWVsc2UKKyAJCQkJbnVs bHNbbV0gPSAnICc7CisgCQkJCisgCQkJaWYgKGluX3F1b3RlKQorIAkJCQllcmVwb3J0KEVS Uk9SLAorIAkJCQkJCShlcnJjb2RlKEVSUkNPREVfQkFEX0NPUFlfRklMRV9GT1JNQVQpLAor IAkJCQkJCSBlcnJtc2coInVudGVybWluYXRlZCBDU1YgcXVvdGVkIGZpZWxkIikpKTsKKyAJ CQkKKyAJCQlpZiAobG5leHQoY3VyKSAhPSBOVUxMKQorIAkJCQllcmVwb3J0KEVSUk9SLAor IAkJCQkJCShlcnJjb2RlKEVSUkNPREVfQkFEX0NPUFlfRklMRV9GT1JNQVQpLAorIAkJCQkJ CSBlcnJtc2coIm1pc3NpbmcgZGF0YSBmb3IgY29sdW1uIFwiJXNcIiIsCisgCQkJCQkJCQlO YW1lU3RyKGF0dHJbbSArIDFdLT5hdHRuYW1lKSkpKTsKICAJCQlicmVhazsKKyAJCX0KKyAJ CQogIAkJYyA9IGxpbmVfYnVmLmRhdGFbbGluZV9idWYuY3Vyc29yKytdOwogIAogIAkJLyog dW5xdW90ZWQgZmllbGQgZGVsaW1pdGVyICAqLwogIAkJaWYgKCFpbl9xdW90ZSAmJiBjID09 IGRlbGltYykKICAJCXsKISAJCQkvKiBjaGVjayB3aGV0aGVyIHJhdyBpbnB1dCBtYXRjaGVk IG51bGwgbWFya2VyICovCiEgCQkJaW5wdXRfbGVuID0gZW5kX2N1cnNvciAtIHN0YXJ0X2N1 cnNvcjsKISAJCQlpZiAoIXNhd19xdW90ZSAmJiBpbnB1dF9sZW4gPT0gbnVsbF9wcmludF9s ZW4gJiYKISAJCQkJc3RybmNtcCgmbGluZV9idWYuZGF0YVtzdGFydF9jdXJzb3JdLCBudWxs X3ByaW50LCBpbnB1dF9sZW4pID09IDApCiEgCQkJCW51bGxzW21dID0gJ24nOwohIAkJCWVs c2UKISAJCQkJbnVsbHNbbV0gPSAnICc7CiEgICAgICAgICAgICAgCiEgCQkJLyogdGVybWlu YXRlIGF0dHIgc3RyaW5nIHdpdGggJ1wwJyAqLwohIAkJCWFwcGVuZFN0cmluZ0luZm9DaGFy TWFjcm8oJmF0dHJfYnVmLCAnXDAnKTsKISAJCQlhdHRyX2J1Zi5jdXJzb3IrKzsKISAJCQkK ISAJCQkvKiBzZXR1cCBuZXh0IGF0dHJpYnV0ZSBzY2FuICovCiEgCQkJY3VyID0gbG5leHQo Y3VyKTsKISAJCQkKISAJCQlpZiAoY3VyID09IE5VTEwpCiEgCQkJCWVyZXBvcnQoRVJST1Is CiEgCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxFX0ZPUk1BVCksCiEgCQkJ CQkJIGVycm1zZygiZXh0cmEgZGF0YSBhZnRlciBsYXN0IGV4cGVjdGVkIGNvbHVtbiIpKSk7 CiEgCQkJCiEgCQkJYXR0bnVtID0gbGZpcnN0X2ludChjdXIpOwohIAkJCW0gPSBhdHRudW0g LSAxOwohIAkJCWF0dHJfb2Zmc2V0c1ttXSA9IGF0dHJfYnVmLmN1cnNvcjsKISAJCQlzdGFy dF9jdXJzb3IgPSBsaW5lX2J1Zi5jdXJzb3I7CiEgCQkJY29udGludWU7CiAgCQl9CiAgCiAg CQkvKiBzdGFydCBvZiBxdW90ZWQgZmllbGQgKG9yIHBhcnQgb2YgZmllbGQpICovCioqKioq KioqKioqKioqKgoqKiogMjUyMCwyNTI3ICoqKioKICAKICAJCQkJaWYgKG5leHRjID09IGVz Y2FwZWMgfHwgbmV4dGMgPT0gcXVvdGVjKQogIAkJCQl7CiEgCQkJCQlhcHBlbmRTdHJpbmdJ bmZvQ2hhck1hY3JvKCZhdHRyaWJ1dGVfYnVmLCBuZXh0Yyk7CiAgCQkJCQlsaW5lX2J1Zi5j dXJzb3IrKzsKICAJCQkJCWNvbnRpbnVlOwogIAkJCQl9CiAgCQkJfQotLS0gMzA2NSwzMDcz IC0tLS0KICAKICAJCQkJaWYgKG5leHRjID09IGVzY2FwZWMgfHwgbmV4dGMgPT0gcXVvdGVj KQogIAkJCQl7CiEgCQkJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhck1hY3JvKCZhdHRyX2J1Ziwg bmV4dGMpOwogIAkJCQkJbGluZV9idWYuY3Vyc29yKys7CisgCQkJCQlhdHRyX2J1Zi5jdXJz b3IrKzsKICAJCQkJCWNvbnRpbnVlOwogIAkJCQl9CiAgCQkJfQoqKioqKioqKioqKioqKioK KioqIDI1MzcsMjYxNiAqKioqCiAgCQkJaW5fcXVvdGUgPSBmYWxzZTsKICAJCQljb250aW51 ZTsKICAJCX0KISAJCWFwcGVuZFN0cmluZ0luZm9DaGFyTWFjcm8oJmF0dHJpYnV0ZV9idWYs IGMpOwogIAl9CiAgCi0gCWlmIChpbl9xdW90ZSkKLSAJCSpyZXN1bHQgPSBVTlRFUk1JTkFU RURfRklFTEQ7Ci0gCi0gCS8qIGNoZWNrIHdoZXRoZXIgcmF3IGlucHV0IG1hdGNoZWQgbnVs bCBtYXJrZXIgKi8KLSAJaW5wdXRfbGVuID0gZW5kX2N1cnNvciAtIHN0YXJ0X2N1cnNvcjsK LSAJaWYgKCFzYXdfcXVvdGUgJiYgaW5wdXRfbGVuID09IHN0cmxlbihudWxsX3ByaW50KSAm JgotIAkJc3RybmNtcCgmbGluZV9idWYuZGF0YVtzdGFydF9jdXJzb3JdLCBudWxsX3ByaW50 LCBpbnB1dF9sZW4pID09IDApCi0gCQkqaXNudWxsID0gdHJ1ZTsKLSAJZWxzZQotIAkJKmlz bnVsbCA9IGZhbHNlOwotIAotIAlyZXR1cm4gYXR0cmlidXRlX2J1Zi5kYXRhOwogIH0KICAK ICAvKgohICAqIFJlYWQgYSBiaW5hcnkgYXR0cmlidXRlCiAgICovCiEgc3RhdGljIERhdHVt CiEgQ29weVJlYWRCaW5hcnlBdHRyaWJ1dGUoaW50IGNvbHVtbl9ubywgRm1nckluZm8gKmZs aW5mbywKISAJCQkJCQlPaWQgdHlwaW9wYXJhbSwgaW50MzIgdHlwbW9kLAogIAkJCQkJCWJv b2wgKmlzbnVsbCkKICB7CiEgCWludDMyCQlmbGRfc2l6ZTsKISAJRGF0dW0JCXJlc3VsdDsK ISAKISAJZmxkX3NpemUgPSBDb3B5R2V0SW50MzIoKTsKISAJaWYgKENvcHlHZXRFb2YoKSkK ISAJCWVyZXBvcnQoRVJST1IsCiEgCQkJCShlcnJjb2RlKEVSUkNPREVfQkFEX0NPUFlfRklM RV9GT1JNQVQpLAohIAkJCQkgZXJybXNnKCJ1bmV4cGVjdGVkIEVPRiBpbiBDT1BZIGRhdGEi KSkpOwohIAlpZiAoZmxkX3NpemUgPT0gLTEpCiEgCXsKISAJCSppc251bGwgPSB0cnVlOwoh IAkJcmV0dXJuIChEYXR1bSkgMDsKICAJfQohIAlpZiAoZmxkX3NpemUgPCAwKQohIAkJZXJl cG9ydChFUlJPUiwKISAJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxFX0ZPUk1B VCksCiEgCQkJCSBlcnJtc2coImludmFsaWQgZmllbGQgc2l6ZSIpKSk7CiAgCiEgCS8qIHJl c2V0IGF0dHJpYnV0ZV9idWYgdG8gZW1wdHksIGFuZCBsb2FkIHJhdyBkYXRhIGluIGl0ICov CiEgCWF0dHJpYnV0ZV9idWYubGVuID0gMDsKISAJYXR0cmlidXRlX2J1Zi5kYXRhWzBdID0g J1wwJzsKISAJYXR0cmlidXRlX2J1Zi5jdXJzb3IgPSAwOwogIAohIAllbmxhcmdlU3RyaW5n SW5mbygmYXR0cmlidXRlX2J1ZiwgZmxkX3NpemUpOwogIAotIAlDb3B5R2V0RGF0YShhdHRy aWJ1dGVfYnVmLmRhdGEsIGZsZF9zaXplKTsKLSAJaWYgKENvcHlHZXRFb2YoKSkKLSAJCWVy ZXBvcnQoRVJST1IsCi0gCQkJCShlcnJjb2RlKEVSUkNPREVfQkFEX0NPUFlfRklMRV9GT1JN QVQpLAotIAkJCQkgZXJybXNnKCJ1bmV4cGVjdGVkIEVPRiBpbiBDT1BZIGRhdGEiKSkpOwog IAohIAlhdHRyaWJ1dGVfYnVmLmxlbiA9IGZsZF9zaXplOwohIAlhdHRyaWJ1dGVfYnVmLmRh dGFbZmxkX3NpemVdID0gJ1wwJzsKICAKISAJLyogQ2FsbCB0aGUgY29sdW1uIHR5cGUncyBi aW5hcnkgaW5wdXQgY29udmVydGVyICovCiEgCXJlc3VsdCA9IEZ1bmN0aW9uQ2FsbDMoZmxp bmZvLAohIAkJCQkJCSAgIFBvaW50ZXJHZXREYXR1bSgmYXR0cmlidXRlX2J1ZiksCiEgCQkJ CQkJICAgT2JqZWN0SWRHZXREYXR1bSh0eXBpb3BhcmFtKSwKISAJCQkJCQkgICBJbnQzMkdl dERhdHVtKHR5cG1vZCkpOwogIAotIAkvKiBUcm91YmxlIGlmIGl0IGRpZG4ndCBlYXQgdGhl IHdob2xlIGJ1ZmZlciAqLwotIAlpZiAoYXR0cmlidXRlX2J1Zi5jdXJzb3IgIT0gYXR0cmli dXRlX2J1Zi5sZW4pCi0gCQllcmVwb3J0KEVSUk9SLAotIAkJCQkoZXJyY29kZShFUlJDT0RF X0lOVkFMSURfQklOQVJZX1JFUFJFU0VOVEFUSU9OKSwKLSAJCQkJIGVycm1zZygiaW5jb3Jy ZWN0IGJpbmFyeSBkYXRhIGZvcm1hdCIpKSk7CiAgCi0gCSppc251bGwgPSBmYWxzZTsKLSAJ cmV0dXJuIHJlc3VsdDsKLSB9CiAgCiAgLyoKICAgKiBTZW5kIHRleHQgcmVwcmVzZW50YXRp b24gb2Ygb25lIGF0dHJpYnV0ZSwgd2l0aCBjb252ZXJzaW9uIGFuZCBlc2NhcGluZwotLS0g MzA4MywzMTQ5IC0tLS0KICAJCQlpbl9xdW90ZSA9IGZhbHNlOwogIAkJCWNvbnRpbnVlOwog IAkJfQohIAkJYXBwZW5kU3RyaW5nSW5mb0NoYXJNYWNybygmYXR0cl9idWYsIGMpOwohIAkJ YXR0cl9idWYuY3Vyc29yKys7CiAgCX0KICAKICB9CiAgCiAgLyoKISAgKiBSZWFkIHRoZSBm aXJzdCBhdHRyaWJ1dGUuIFRoaXMgaXMgbWFpbmx5IHVzZWQgdG8gbWFpbnRhaW4gc3VwcG9y dAohICAqIGZvciBhbiBPSUQgY29sdW1uLiBBbGwgdGhlIHJlc3Qgb2YgdGhlIGNvbHVtbnMg d2lsbCBiZSByZWFkIGF0IG9uY2Ugd2l0aAohICAqIENvcHlSZWFkQXR0cmlidXRlc1RleHQu CiAgICovCiEgc3RhdGljIGNoYXIgKgohIENvcHlSZWFkT2lkQXR0cihjb25zdCBjaGFyICpk ZWxpbSwgY29uc3QgY2hhciAqbnVsbF9wcmludCwgaW50IG51bGxfcHJpbnRfbGVuLAogIAkJ CQkJCWJvb2wgKmlzbnVsbCkKICB7CiEgCWNoYXIJCWRlbGltYyA9IGRlbGltWzBdOwohIAlj aGFyCSAgICpzdGFydF9sb2MgPSBsaW5lX2J1Zi5kYXRhICsgbGluZV9idWYuY3Vyc29yOwoh IAljaGFyCSAgICplbmRfbG9jOwohIAlpbnQJCQlhdHRyX2xlbiA9IDA7CiEgCWludAkJCWJ5 dGVzX3JlbWFpbmluZzsKISAKISAJLyogcmVzZXQgYXR0cmlidXRlIGJ1ZiB0byBlbXB0eSAq LwohIAlhdHRyX2J1Zi5sZW4gPSAwOwohIAlhdHRyX2J1Zi5kYXRhWzBdID0gJ1wwJzsKISAJ YXR0cl9idWYuY3Vyc29yID0gMDsKISAKISAJLyogIyBvZiBieXRlcyB0aGF0IHdlcmUgbm90 IHlldCBwcm9jZXNzZWQgaW4gdGhpcyBsaW5lICovCiEgCWJ5dGVzX3JlbWFpbmluZyA9IGxp bmVfYnVmLmxlbiAtIGxpbmVfYnVmLmN1cnNvcjsKISAKISAJLyogZ290IHRvIGVuZCBvZiBs aW5lICovCiEgCWlmICgoZW5kX2xvYyA9IHNjYW5UZXh0TGluZShzdGFydF9sb2MsIGRlbGlt YywgYnl0ZXNfcmVtYWluaW5nKSkgPT0gTlVMTCkKISAJewohIAkJYXR0cl9sZW4gPSBieXRl c19yZW1haW5pbmcgLSAxOyAvKiBkb24ndCBjb3VudCAnXG4nIGluIGxlbiBjYWxjdWxhdGlv biAqLwohIAkJYXBwZW5kQmluYXJ5U3RyaW5nSW5mbygmYXR0cl9idWYsIHN0YXJ0X2xvYywg YXR0cl9sZW4pOwohIAkJbGluZV9idWYuY3Vyc29yICs9IGF0dHJfbGVuICsgMjsJCS8qIHNr aXAgJ1xuJyBhbmQgJ1wwJyAqLwogIAl9CiEgCWVsc2UKISAJCS8qIGZvdW5kIGEgZGVsaW1p dGVyICovCiEgCXsKISAJCS8qCiEgCQkgKiAod2UgZG9uJ3QgY2FyZSBpZiBkZWxpbSB3YXMg cHJlY2VkZWQgd2l0aCBhIGJhY2tzbGFzaCwgYmVjYXVzZSBpdCdzCiEgCQkgKiBhbiBpbnZh bGlkIE9JRCBhbnl3YXkpCiEgCQkgKi8KICAKISAJCWF0dHJfbGVuID0gZW5kX2xvYyAtIHN0 YXJ0X2xvYzsgLyogd2UgZG9uJ3QgaW5jbHVkZSB0aGUgZGVsaW1pdGVyIGNoICovCiAgCiEg CQlhcHBlbmRCaW5hcnlTdHJpbmdJbmZvKCZhdHRyX2J1Ziwgc3RhcnRfbG9jLCBhdHRyX2xl bik7CiEgCQlsaW5lX2J1Zi5jdXJzb3IgKz0gYXR0cl9sZW4gKyAxOwohIAl9CiAgCiAgCiEg CS8qIGNoZWNrIHdoZXRoZXIgcmF3IGlucHV0IG1hdGNoZWQgbnVsbCBtYXJrZXIgKi8KISAJ aWYgKGF0dHJfbGVuID09IG51bGxfcHJpbnRfbGVuICYmIHN0cm5jbXAoc3RhcnRfbG9jLCBu dWxsX3ByaW50LCBhdHRyX2xlbikgPT0gMCkKISAJCSppc251bGwgPSB0cnVlOwohIAllbHNl CiEgCQkqaXNudWxsID0gZmFsc2U7CiAgCiEgCXJldHVybiBhdHRyX2J1Zi5kYXRhOwohIH0K ICAKICAKICAKICAvKgogICAqIFNlbmQgdGV4dCByZXByZXNlbnRhdGlvbiBvZiBvbmUgYXR0 cmlidXRlLCB3aXRoIGNvbnZlcnNpb24gYW5kIGVzY2FwaW5nCioqKioqKioqKioqKioqKgoq KiogMjgwMCwyODAyICoqKioKLS0tIDMzMzMsMzQzNiAtLS0tCiAgCiAgCXJldHVybiBhdHRu dW1zOwogIH0KKyAKKyAvKgorICAqIFRoZSBmb2xsb3dpbmcgYXJlIGN1c3RvbSB2ZXJzaW9u cyBvZiB0aGUgc3RyaW5nIGZ1bmN0aW9uIHN0cmNocigpLgorICAqIEFzIG9wcG9zZWQgdG8g dGhlIG9yaWdpbmFsIHN0cmNociB3aGljaCBzZWFyY2hlcyB0aHJvdWdoCisgICogYSBzdHJp bmcgdW50aWwgdGhlIHRhcmdldCBjaGFyYWN0ZXIgaXMgZm91bmQsIG9yIGEgTlVMTCBpcwor ICAqIGZvdW5kLCB0aGlzIHZlcnNpb24gd2lsbCBub3QgcmV0dXJuIHdoZW4gYSBOVUxMIGlz IGZvdW5kLgorICAqIEluc3RlYWQgaXQgd2lsbCBzZWFyY2ggdGhyb3VnaCBhIHByZS1kZWZp bmVkIGxlbmd0aCBvZgorICAqIGJ5dGVzIGFuZCB3aWxsIHJldHVybiBvbmx5IGlmIHRoZSB0 YXJnZXQgY2hhcmFjdGVyKHMpIGlzIHJlYWNoZWQuCisgICoKKyAgKiBJZiBvdXIgY2xpZW50 IGVuY29kaW5nIGlzIG5vdCBhIHN1cHBvcnRlZCBzZXJ2ZXIgZW5jb2RpbmcsIHdlCisgICog a25vdyB0aGF0IGl0IGlzIG5vdCBzYWZlIHRvIGxvb2sgYXQgZWFjaCBjaGFyYWN0ZXIgYXMg dHJhaWxpbmcKKyAgKiBieXRlIGluIGEgbXVsdGlieXRlIGNoYXJhY3RlciBtYXkgYmUgYSA3 LWJpdCBBU0NJSSBlcXVpdmFsZW50LgorICAqIFRoZXJlZm9yZSB3ZSB1c2UgcGdfZW5jb2Rp bmdfbWJsZW4gdG8gc2tpcCB0byB0aGUgZW5kIG9mIHRoZQorICAqIGNoYXJhY3Rlci4KKyAg KgorICAqIHJldHVybnM6CisgICoJIHBvaW50ZXIgdG8gYyAtIGlmIGMgaXMgbG9jYXRlZCB3 aXRoaW4gdGhlIHN0cmluZy4KKyAgKgkgTlVMTCAtIGlmIGMgd2FzIG5vdCBmb3VuZCBpbiBz cGVjaWZpZWQgbGVuZ3RoIG9mIHNlYXJjaC4gTm90ZToKKyAgKgkJCXRoaXMgRE9FU04nVCBt ZWFuIHRoYXQgYSAnXDAnIHdhcyByZWFjaGVkLgorICAqLworIGNoYXIgKgorIHNjYW5UZXh0 TGluZShjb25zdCBjaGFyICpzLCBjaGFyIGVvbCwgc2l6ZV90IGxlbikKKyB7CisgCWNvbnN0 IGNoYXIgKnN0YXJ0OworIAorIAlpZiAoY2xpZW50X2VuY29kaW5nX29ubHkgJiYgIWxpbmVf YnVmX2NvbnZlcnRlZCkKKyAJeworIAkJaW50CQkJbWJsZW4gPSBwZ19lbmNvZGluZ19tYmxl bihjbGllbnRfZW5jb2RpbmcsICh1bnNpZ25lZCBjaGFyKilzKTsKKyAKKyAJCWZvciAoc3Rh cnQgPSBzOyAqcyAhPSBlb2wgJiYgcyA8IHN0YXJ0ICsgbGVuOyBzICs9IG1ibGVuKQorIAkJ CW1ibGVuID0gcGdfZW5jb2RpbmdfbWJsZW4oY2xpZW50X2VuY29kaW5nLCAodW5zaWduZWQg Y2hhciopcyk7CisgCQkKKyAJCXJldHVybiAoKCpzID09IGVvbCkgPyAoY2hhciAqKSBzIDog TlVMTCk7CisgCX0KKyAJZWxzZQorIAkJcmV0dXJuIG1lbWNocihzLGVvbCxsZW4pOworIH0K KyAKKyAKKyBjaGFyICoKKyBzY2FuQ1NWTGluZShjb25zdCBjaGFyICpzLCBjaGFyIGVvbCwg Y2hhciBlc2NhcGVjLCBjaGFyIHF1b3RlYywgc2l6ZV90IGxlbikKKyB7CisgCWNvbnN0IGNo YXIgKnN0YXJ0OworIAkKKyAJaWYgKGNsaWVudF9lbmNvZGluZ19vbmx5ICYmICFsaW5lX2J1 Zl9jb252ZXJ0ZWQpCisgCXsKKyAJCWludAkJCW1ibGVuID0gcGdfZW5jb2RpbmdfbWJsZW4o Y2xpZW50X2VuY29kaW5nLCAodW5zaWduZWQgY2hhciopcyk7CisgCQkKKyAJCWZvciAoc3Rh cnQgPSBzOyAqcyAhPSBlb2wgJiYgIHMgPCBzdGFydCArIGxlbjsgcyArPSBtYmxlbikKKyAJ CXsKKyAJCQlpZiAoaW5fcXVvdGUgJiYgKnMgPT0gZXNjYXBlYykKKyAJCQkJbGFzdF93YXNf ZXNjID0gIWxhc3Rfd2FzX2VzYzsKKyAJCQlpZiAoKnMgPT0gcXVvdGVjICYmICFsYXN0X3dh c19lc2MpCisgCQkJCWluX3F1b3RlID0gIWluX3F1b3RlOworIAkJCWlmICgqcyAhPSBlc2Nh cGVjKQorIAkJCQlsYXN0X3dhc19lc2MgPSBmYWxzZTsKKyAJCQkJCQorIAkJCW1ibGVuID0g cGdfZW5jb2RpbmdfbWJsZW4oY2xpZW50X2VuY29kaW5nLCAodW5zaWduZWQgY2hhciopcyk7 CisgICAgICAgICB9CisgCX0KKyAJZWxzZQorIAkJLyogc2FmZSB0byBzY3JvbGwgYnl0ZSBi eSBieXRlICovCisgCXsKKyAJCWZvciAoc3RhcnQgPSBzOyAqcyAhPSBlb2wgICYmIHMgPCBz dGFydCArIGxlbjsgcysrKQorIAkJeworIAkJCWlmIChpbl9xdW90ZSAmJiAqcyA9PSBlc2Nh cGVjKQorIAkJCQlsYXN0X3dhc19lc2MgPSAhbGFzdF93YXNfZXNjOworIAkJCWlmICgqcyA9 PSBxdW90ZWMgJiYgIWxhc3Rfd2FzX2VzYykKKyAJCQkJaW5fcXVvdGUgPSAhaW5fcXVvdGU7 CisgCQkJaWYgKCpzICE9IGVzY2FwZWMpCisgCQkJCWxhc3Rfd2FzX2VzYyA9IGZhbHNlOwor IAkJfQorIAkJCQorIAl9CisgCQorIAlpZigqcyAhPSBlc2NhcGVjKSAvKiBmb3VuZCBlb2xf Y2ggKi8KKyAJCWxhc3Rfd2FzX2VzYyA9IGZhbHNlOworIAkKKyAJcmV0dXJuICgoKnMgPT0g ZW9sKSA/IChjaGFyICopIHMgOiBOVUxMKTsKKyB9CisgCisgLyoKKyAgKiBTY2FuIGZvciAx IG9mIDIgY2hhcmFjdGVycyBuZWNlc3NhcnkgZm9yIGF0dHJpYnV0ZSBwYXJzaW5nLiBObyBu ZWVkCisgICogZm9yIGNoZWNraW5nIGZvciBtdWx0aS1ieXRlIGNoYXJhY3RlcnMgc2luY2Ug Y29udmVyc2lvbiBhbHJlYWR5IAorICAqIGhhcHBlbmVkLgorICAqLworIGNoYXIgKgorIHNj YW5UZXh0QXR0cihjb25zdCBjaGFyICpzLCBjaGFyIGMxLCBjaGFyIGMyLCBzaXplX3QgbGVu KQorIHsKKyAJY29uc3QgY2hhciAqc3RhcnQ7CisgCQorIAlmb3IgKHN0YXJ0ID0gczsgKnMg IT0gYzEgJiYgKnMgIT0gYzIgJiYgcyA8IHN0YXJ0ICsgbGVuOyBzKyspCisgCQk7CisgCQor IAlyZXR1cm4gKCpzICE9ICdcMCcgPyAoY2hhciAqKSBzIDogTlVMTCk7CisgfQorIAorIAor IAorIAorIAo= --B_3205825185_103175599--