Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1mwlGB-0006ou-6c for pgsql-hackers@arkaria.postgresql.org; Mon, 13 Dec 2021 13:20:55 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1mwlG9-0006ge-G0 for pgsql-hackers@arkaria.postgresql.org; Mon, 13 Dec 2021 13:20:53 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1mwlG8-0006gV-5R for pgsql-hackers@lists.postgresql.org; Mon, 13 Dec 2021 13:20:53 +0000 Received: from mail-ed1-x52b.google.com ([2a00:1450:4864:20::52b]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1mwlG1-0003xi-Td for pgsql-hackers@postgresql.org; Mon, 13 Dec 2021 13:20:50 +0000 Received: by mail-ed1-x52b.google.com with SMTP id x10so34613753edd.5 for ; Mon, 13 Dec 2021 05:20:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb.com; s=google; h=message-id:date:mime-version:user-agent:subject:content-language:to :cc:references:from:in-reply-to; bh=664aCEy1sGb8wVes0TvCM5+X3jiesh3xHieu+LJFu54=; b=RTL9G+CZ4ppny37gTzD0aVwR8eNVaUoG2VW85WMzHOtpDRPJx04vMMLobXoKx+fQej qOygdI8Q6MDuU9U7HwtuWHusJ/4mc2Bpa5cQm1yGoDLo9wIFmwH/IxHNMUAZXIZ18neK qKomwzHGFRyrQIN71pgHYLuLs125TdZ9nkvebiAYzT1Kiq4T52lVq9FIclI2UItXEd38 M1PQDKLdqmis7Fi+6wIOjZ3M3jzAVNCMnjJjLCGfVrpApE3c5vbUEugBJ5vntG4/W5pE fTJRqJQ45AoIw4y3kf6hZOuV+AIMr2A7M0plECkHnn2WFHB7/5l1e1yy6J3ujNmScW1M rEgg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:subject :content-language:to:cc:references:from:in-reply-to; bh=664aCEy1sGb8wVes0TvCM5+X3jiesh3xHieu+LJFu54=; b=TcFlD4kUZz1fYMYP/sd6FpyRy6yaKHiy8IAKzbpvvBXxshEvva2TL3CsqFhjHLjElZ ALEyeEII6l2D31TL594tteAHgNJYYz4p4OwPt5mSKIWpQBR9w2qINVdwT0w38MVnHnSU OOe+hPwFW6GSMaYTiCzUxaA3BiN8kmuEnQFe3dRiPJHYbZI9Ztsx/IjsE2jK261CZV5Z MiQoENGCYeTu08aAalvC0FnTmV8fDF9fh5T9NCsRlXxCRvyvSgtq6Yr+HL0s62kSK933 nLm03/cr4wZijLsCsh+kcH6xipOKrGMjQoQVczxUYNZYduGRg4aLkrhsnnQtUHMS4Sza OJvA== X-Gm-Message-State: AOAM531OuWKKvTGlg7n6KCYaFWRxxnS42UvL2KQAifz5ZR2lBPMLz9PM 2caajPUcc68AsAqABhs9rELuVPGoJJAsz4X247AJyfgvoa3Za/9qKtvXjm5eATwBUtoD3Vzuppw 2fUW60qM3ITrsdZFp8mKQUpevzlVKUEaaE9aurJUMitOlKcvJ42Mh33tYUBXOS5CGgGMDquT3kx UN4XVySOdqBHtub3/qX4tdaTkfG8AWDHO4kki4 X-Google-Smtp-Source: ABdhPJyxbCMSbS+ACPm162E58zDjAfwyFXBgUcDIl8FYirhqC3eoJ0e00bJde2HnqwvOsjCWnfWWoQ== X-Received: by 2002:a17:907:7f0f:: with SMTP id qf15mr45265933ejc.560.1639401644346; Mon, 13 Dec 2021 05:20:44 -0800 (PST) Received: from [10.137.0.18] (ip-86-49-251-241.net.upcbroadband.cz. [86.49.251.241]) by smtp.gmail.com with ESMTPSA id hc10sm5779397ejc.99.2021.12.13.05.20.43 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 13 Dec 2021 05:20:43 -0800 (PST) Content-Type: multipart/mixed; boundary="------------LLSlOiBoMfYtp5sRWpMhWlGh" Message-ID: <0213d237-efd5-8e7e-fa29-3f36e6e26023@enterprisedb.com> Date: Mon, 13 Dec 2021 14:20:40 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.2.0 Subject: Re: using extended statistics to improve join estimates Content-Language: en-US To: Justin Pryzby Cc: pgsql-hackers@postgresql.org References: <2ed75657-e084-9539-c6de-597e5675014c@enterprisedb.com> <20211122012315.GH17618@telsasoft.com> From: Tomas Vondra In-Reply-To: <20211122012315.GH17618@telsasoft.com> X-CLOUD-SEC-AV-Info: enterprisedb,google_mail,monitor X-CLOUD-SEC-AV-Sent: true X-Gm-Spam: 0 X-Gm-Phishy: 0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------LLSlOiBoMfYtp5sRWpMhWlGh Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 11/22/21 02:23, Justin Pryzby wrote: > Your regression tests include two errors, which appear to be accidental, and > fixing the error shows that this case is being estimated poorly. > > +-- try combining with single-column (and single-expression) statistics > +DROP STATISTICS join_test_2; > +ERROR: statistics object "join_test_2" does not exist > ... > +ERROR: statistics object "join_stats_2" already exists > D'oh, what a silly mistake ... You're right fixing the DROP STATISTICS results in worse estimate, but that's actually expected for a fairly simple reason. The join condition has expressions on both sides, and dropping the statistics means we don't have any MCV for the join_test_2 side. So the optimizer ends up not using the regular estimates, as if there were no extended stats. A couple lines later the script creates an extended statistics on that expression alone, which fixes this. An expression index would do the trick too. Attached is a patch fixing the test and also the issue reported by Zhihong Yu some time ago. regards -- Tomas Vondra EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company --------------LLSlOiBoMfYtp5sRWpMhWlGh Content-Type: text/x-patch; charset=UTF-8; name="0001-Estimate-joins-using-extended-statistics-20211213.patch" Content-Disposition: attachment; filename*0="0001-Estimate-joins-using-extended-statistics-20211213.patch" Content-Transfer-Encoding: base64 RnJvbSA2MTZmN2YzZmFhODE4ZWE4OWM0YzFjZWNiOWFhNTBkZDllNGZlOGU3IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBUb21hcyBWb25kcmEgPHRvbWFzLnZvbmRyYUBwb3N0 Z3Jlc3FsLm9yZz4KRGF0ZTogTW9uLCAxMyBEZWMgMjAyMSAxNDowNToxNyArMDEwMApTdWJq ZWN0OiBbUEFUQ0hdIEVzdGltYXRlIGpvaW5zIHVzaW5nIGV4dGVuZGVkIHN0YXRpc3RpY3MK ClVzZSBleHRlbmRlZCBzdGF0aXN0aWNzIChNQ1YpIHRvIGltcHJvdmUgam9pbiBlc3RpbWF0 ZXMuIEluIGdlbmVyYWwgdGhpcwppcyBzaW1pbGFyIHRvIGhvdyB3ZSB1c2UgcmVndWxhciBz dGF0aXN0aWNzIC0gd2Ugc2VhcmNoIGZvciBleHRlbmRlZApzdGF0aXN0aWNzICh3aXRoIE1D VikgY292ZXJpbmcgYWxsIGpvaW4gY2xhdXNlcywgYW5kIGlmIHdlIGZpbmQgc3VjaCBNQ1YK b24gYm90aCBzaWRlcyBvZiB0aGUgam9pbiwgd2UgY29tYmluZSB0aG9zZSB0d28gTUNWcy4K CkV4dGVuZGVkIHN0YXRpc3RpY3MgYWxsb3cgYSBjb3VwbGUgYWRkaXRpb25hbCBpbXByb3Zl bWVudHMgLSBlLmcuIGlmCnRoZXJlIGFyZSBiYXNlcmVsIGNvbmRpdGlvbnMsIHdlIGNhbiB1 c2UgdGhlbSB0byByZXN0cmljdCB0aGUgcGFydCBvZgp0aGUgTUNWcyBjb21iaW5lZC4gVGhp cyBtZWFucyB3ZSdyZSBidWlsZGluZyBjb25kaXRpb25hbCBwcm9iYWJpbGl0eQpkaXN0cmli dXRpb24gYW5kIGNhbGN1bGF0aW5nIGNvbmRpdGlvbmFsIHByb2JhYmlsaXR5CgogICAgUChq b2luIGNsYXVzZXMgfCBiYXNlcmVsIGNvbmRpdGlvbnMpCgppbnN0ZWFkIG9mIGp1c3QgUChq b2luIGNsYXVzZXMpLgoKVGhlIHBhdGNoIGFsc28gYWxsb3dzIGNvbWJpbmluZyByZWd1bGFy IGFuZCBleHRlbmRlZCBNQ1YgLSB3ZSBkb24ndCBuZWVkCmV4dGVuZGVkIE1DVnMgb24gYm90 aCBzaWRlcy4gVGhpcyBoZWxwcyB3aGVuIG9uZSBvZiB0aGUgdGFibGVzIGRvZXMgbm90Cmhh dmUgZXh0ZW5kZWQgc3RhdGlzdGljcyAoZS5nLiBiZWNhdXNlIHRoZXJlIGFyZSBubyBjb3Jy ZWxhdGlvbnMpLgotLS0KIHNyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2NsYXVzZXNlbC5j ICAgICAgICB8ICA2MyArLQogc3JjL2JhY2tlbmQvc3RhdGlzdGljcy9leHRlbmRlZF9zdGF0 cy5jICAgICAgIHwgODA1ICsrKysrKysrKysrKysrKysrKwogc3JjL2JhY2tlbmQvc3RhdGlz dGljcy9tY3YuYyAgICAgICAgICAgICAgICAgIHwgNzU0ICsrKysrKysrKysrKysrKysKIC4u Li9zdGF0aXN0aWNzL2V4dGVuZGVkX3N0YXRzX2ludGVybmFsLmggICAgICB8ICAyMCArCiBz cmMvaW5jbHVkZS9zdGF0aXN0aWNzL3N0YXRpc3RpY3MuaCAgICAgICAgICAgfCAgMTIgKwog c3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zdGF0c19leHQub3V0ICAgICAgIHwgMTY3ICsr KysKIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3N0YXRzX2V4dC5zcWwgICAgICAgICAgICB8ICA2 NiArKwogNyBmaWxlcyBjaGFuZ2VkLCAxODg2IGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24o LSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9jbGF1c2VzZWwu YyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2NsYXVzZXNlbC5jCmluZGV4IGQyNjNl Y2YwODIuLjcwOWU5MjQ0NmIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXplci9w YXRoL2NsYXVzZXNlbC5jCisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2NsYXVz ZXNlbC5jCkBAIC01MCw2ICs1MCw5IEBAIHN0YXRpYyBTZWxlY3Rpdml0eSBjbGF1c2VsaXN0 X3NlbGVjdGl2aXR5X29yKFBsYW5uZXJJbmZvICpyb290LAogCQkJCQkJCQkJCQkgSm9pblR5 cGUgam9pbnR5cGUsCiAJCQkJCQkJCQkJCSBTcGVjaWFsSm9pbkluZm8gKnNqaW5mbywKIAkJ CQkJCQkJCQkJIGJvb2wgdXNlX2V4dGVuZGVkX3N0YXRzKTsKK3N0YXRpYyBpbmxpbmUgYm9v bCB0cmVhdF9hc19qb2luX2NsYXVzZShQbGFubmVySW5mbyAqcm9vdCwKKwkJCQkJCQkJCQlO b2RlICpjbGF1c2UsIFJlc3RyaWN0SW5mbyAqcmluZm8sCisJCQkJCQkJCQkJaW50IHZhclJl bGlkLCBTcGVjaWFsSm9pbkluZm8gKnNqaW5mbyk7CiAKIC8qKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqCiAgKgkJUk9VVElORVMgVE8gQ09NUFVURSBTRUxFQ1RJVklUSUVTCkBAIC0xMjksMTIg KzEzMiw1MyBAQCBjbGF1c2VsaXN0X3NlbGVjdGl2aXR5X2V4dChQbGFubmVySW5mbyAqcm9v dCwKIAlSYW5nZVF1ZXJ5Q2xhdXNlICpycWxpc3QgPSBOVUxMOwogCUxpc3RDZWxsICAgKmw7 CiAJaW50CQkJbGlzdGlkeDsKKwlib29sCQlzaW5nbGVfY2xhdXNlX29wdGltaXphdGlvbiA9 IHRydWU7CisKKwkvKgorCSAqIFRoZSBvcHRpbWl6YXRpb24gb2Ygc2tpcHBpbmcgdG8gY2xh dXNlX3NlbGVjdGl2aXR5X2V4dCBmb3Igc2luZ2xlCisJICogY2xhdXNlcyBtZWFucyB3ZSBj YW4ndCBpbXByb3ZlIGpvaW4gZXN0aW1hdGVzIHdpdGggYSBzaW5nbGUgam9pbgorCSAqIGNs YXVzZSBidXQgYWRkaXRpb25hbCBiYXNlcmVsIHJlc3RyaWN0aW9ucy4gU28gd2UgZGlzYWJs ZSBpdCB3aGVuCisJICogZXN0aW1hdGluZyBqb2lucy4KKwkgKgorCSAqIFhYWCBOb3Qgc3Vy ZSBpZiB0aGlzIGlzIHRoZSByaWdodCB3YXkgdG8gZG8gaXQsIGJ1dCBtb3JlIGVsYWJvcmF0 ZQorCSAqIGNoZWNrcyB3b3VsZCBtb3N0bHkgbmVnYXRlIHRoZSB3aG9sZSBwb2ludCBvZiB0 aGUgb3B0aW1pemF0aW9uLgorCSAqIFRoZSAoVmFyIG9wIFZhcikgcGF0Y2ggaGFzIHRoZSBz YW1lIGlzc3VlLgorCSAqCisJICogWFhYIEFuIGFsdGVybmF0aXZlIG1pZ2h0IGJlIG1ha2lu ZyBjbGF1c2Vfc2VsZWN0aXZpdHlfZXh0IHNtYXJ0ZXIKKwkgKiBhbmQgbWFrZSBpdCB1c2Ug dGhlIGpvaW4gZXh0ZW5kZWQgc3RhdHMgdGhlcmUuIEJ1dCB0aGF0IHNlZW1zIGtpbmRhCisJ ICogYWdhaW5zdCB0aGUgd2hvbGUgcG9pbnQgb2YgdGhlIG9wdGltaXphdGlvbiAoc2tpcHBp bmcgZXhwZW5zaXZlCisJICogc3R1ZmYpIGFuZCBpdCdzIG1ha2luZyBvdGhlciBwYXJ0cyBt b3JlIGNvbXBsZXguCisJICoKKwkgKiBYWFggTWF5YmUgdGhpcyBzaG91bGQgY2hlY2sgaWYg dGhlcmUgYXJlIGF0IGxlYXN0IHNvbWUgcmVzdHJpY3Rpb25zCisJICogb24gc29tZSBiYXNl IHJlbGF0aW9ucywgd2hpY2ggc2VlbXMgaW1wb3J0YW50LiBCdXQgdGhlbiBhZ2FpbiwgdGhh dAorCSAqIHNlZW1zIHRvIGdvIGFnYWluc3QgdGhlIGlkZWEgb2YgdGhpcyBjaGVjayB0byBi ZSBjaGVhcC4gTW9yZW92ZXIsIGl0CisJICogd29uJ3Qgd29yayBmb3IgT1IgY2xhdXNlcywg d2hpY2ggbWF5IGhhdmUgbXVsdGlwbGUgcGFydHMgYnV0IHdlIHN0aWxsCisJICogc2VlIHRo ZW0gYXMgYSBzaW5nbGUgQm9vbEV4cHIgY2xhdXNlIChpdCBkb2Vzbid0IHdvcmsgbGF0ZXIs IHRob3VnaCkuCisJICovCisJaWYgKGxpc3RfbGVuZ3RoKGNsYXVzZXMpID09IDEpCisJewor CQlOb2RlICpjbGF1c2UgPSBsaW5pdGlhbChjbGF1c2VzKTsKKwkJUmVzdHJpY3RJbmZvICpy aW5mbyA9IE5VTEw7CisKKwkJaWYgKElzQShjbGF1c2UsIFJlc3RyaWN0SW5mbykpCisJCXsK KwkJCXJpbmZvID0gKFJlc3RyaWN0SW5mbyAqKSBjbGF1c2U7CisJCQljbGF1c2UgPSAoTm9k ZSAqKSByaW5mby0+Y2xhdXNlOworCQl9CisKKwkJc2luZ2xlX2NsYXVzZV9vcHRpbWl6YXRp b24KKwkJCT0gIXRyZWF0X2FzX2pvaW5fY2xhdXNlKHJvb3QsIGNsYXVzZSwgcmluZm8sIHZh clJlbGlkLCBzamluZm8pOworCX0KIAogCS8qCiAJICogSWYgdGhlcmUncyBleGFjdGx5IG9u ZSBjbGF1c2UsIGp1c3QgZ28gZGlyZWN0bHkgdG8KIAkgKiBjbGF1c2Vfc2VsZWN0aXZpdHlf ZXh0KCkuIE5vbmUgb2Ygd2hhdCB3ZSBtaWdodCBkbyBiZWxvdyBpcyByZWxldmFudC4KKwkg KgorCSAqIFhYWCBUaGlzIG1lYW5zIHdlIHdvbid0IHRyeSB1c2luZyBleHRlbmRlZCBzdGF0 cyBvbiBPUi1jbGF1c2VzICh3aGljaAorCSAqIGFyZSBhIHNpbmdsZSBCb29sRXhwciBjbGF1 c2UgYXQgdGhpcyBwb2ludCksIGFsdGhvdWdoIHdlJ2xsIGRvIHRoYXQKKwkgKiBsYXRlciAo b25jZSB3ZSBsb29rIGF0IHRoZSBhcmd1bWVudHMpLgogCSAqLwotCWlmIChsaXN0X2xlbmd0 aChjbGF1c2VzKSA9PSAxKQorCWlmICgobGlzdF9sZW5ndGgoY2xhdXNlcykgPT0gMSkgJiYg c2luZ2xlX2NsYXVzZV9vcHRpbWl6YXRpb24pCiAJCXJldHVybiBjbGF1c2Vfc2VsZWN0aXZp dHlfZXh0KHJvb3QsIChOb2RlICopIGxpbml0aWFsKGNsYXVzZXMpLAogCQkJCQkJCQkJICB2 YXJSZWxpZCwgam9pbnR5cGUsIHNqaW5mbywKIAkJCQkJCQkJCSAgdXNlX2V4dGVuZGVkX3N0 YXRzKTsKQEAgLTE1Nyw2ICsyMDEsMjMgQEAgY2xhdXNlbGlzdF9zZWxlY3Rpdml0eV9leHQo UGxhbm5lckluZm8gKnJvb3QsCiAJCQkJCQkJCQkJCSZlc3RpbWF0ZWRjbGF1c2VzLCBmYWxz ZSk7CiAJfQogCisJLyoKKwkgKiBUcnkgYXBwbHlpbmcgZXh0ZW5kZWQgc3RhdGlzdGljcyB0 byBqb2lucy4gVGhlcmUncyBub3QgbXVjaCB3ZSBjYW4KKwkgKiBkbyB0byBkZXRlY3Qgd2hl biB0aGlzIG1ha2VzIHNlbnNlLCBidXQgd2UgY2FuIGNoZWNrIHRoYXQgdGhlcmUgYXJlCisJ ICogam9pbiBjbGF1c2VzLCBhbmQgdGhhdCBhdCBsZWFzdCBzb21lIG9mIHRoZSByZWxzIGhh dmUgc3RhdHMuCisJICoKKwkgKiBYWFggSXNuJ3QgdGhpcyBtdXR1YWx5IGV4Y2x1c2l2ZSB3 aXRoIHRoZSBwcmVjZWRpbmcgYmxvY2sgd2hpY2gKKwkgKiBjYWxjdWxhdGVzIGVzdGltYXRl cyBmb3IgYSBzaW5nbGUgcmVsYXRpb24/CisJICovCisJaWYgKHVzZV9leHRlbmRlZF9zdGF0 cyAmJgorCQlzdGF0ZXh0X3RyeV9qb2luX2VzdGltYXRlcyhyb290LCBjbGF1c2VzLCB2YXJS ZWxpZCwgam9pbnR5cGUsIHNqaW5mbywKKwkJCQkJCSBlc3RpbWF0ZWRjbGF1c2VzKSkKKwl7 CisJCXMxICo9IHN0YXRleHRfY2xhdXNlbGlzdF9qb2luX3NlbGVjdGl2aXR5KHJvb3QsIGNs YXVzZXMsIHZhclJlbGlkLAorCQkJCQkJCQkJCQkJICBqb2ludHlwZSwgc2ppbmZvLAorCQkJ CQkJCQkJCQkJICAmZXN0aW1hdGVkY2xhdXNlcyk7CisJfQorCiAJLyoKIAkgKiBBcHBseSBu b3JtYWwgc2VsZWN0aXZpdHkgZXN0aW1hdGVzIGZvciByZW1haW5pbmcgY2xhdXNlcy4gV2Un bGwgYmUKIAkgKiBjYXJlZnVsIHRvIHNraXAgYW55IGNsYXVzZXMgd2hpY2ggd2VyZSBhbHJl YWR5IGVzdGltYXRlZCBhYm92ZS4KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0YXRpc3Rp Y3MvZXh0ZW5kZWRfc3RhdHMuYyBiL3NyYy9iYWNrZW5kL3N0YXRpc3RpY3MvZXh0ZW5kZWRf c3RhdHMuYwppbmRleCA2OWNhNTIwOTRmLi5jZTZhNjJkOTQ0IDEwMDY0NAotLS0gYS9zcmMv YmFja2VuZC9zdGF0aXN0aWNzL2V4dGVuZGVkX3N0YXRzLmMKKysrIGIvc3JjL2JhY2tlbmQv c3RhdGlzdGljcy9leHRlbmRlZF9zdGF0cy5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVk ZSAibm9kZXMvbm9kZUZ1bmNzLmgiCiAjaW5jbHVkZSAib3B0aW1pemVyL2NsYXVzZXMuaCIK ICNpbmNsdWRlICJvcHRpbWl6ZXIvb3B0aW1pemVyLmgiCisjaW5jbHVkZSAib3B0aW1pemVy L3BhdGhub2RlLmgiCiAjaW5jbHVkZSAicGdzdGF0LmgiCiAjaW5jbHVkZSAicG9zdG1hc3Rl ci9hdXRvdmFjdXVtLmgiCiAjaW5jbHVkZSAic3RhdGlzdGljcy9leHRlbmRlZF9zdGF0c19p bnRlcm5hbC5oIgpAQCAtMTAxLDYgKzEwMiw4IEBAIHN0YXRpYyBTdGF0c0J1aWxkRGF0YSAq bWFrZV9idWlsZF9kYXRhKFJlbGF0aW9uIG9uZXJlbCwgU3RhdEV4dEVudHJ5ICpzdGF0LAog CQkJCQkJCQkJICAgaW50IG51bXJvd3MsIEhlYXBUdXBsZSAqcm93cywKIAkJCQkJCQkJCSAg IFZhY0F0dHJTdGF0cyAqKnN0YXRzLCBpbnQgc3RhdHRhcmdldCk7CiAKK3N0YXRpYyBib29s IHN0YXRfY292ZXJzX2V4cHJlc3Npb25zKFN0YXRpc3RpY0V4dEluZm8gKnN0YXQsIExpc3Qg KmV4cHJzLAorCQkJCQkJCQkJQml0bWFwc2V0ICoqZXhwcl9pZHhzKTsKIAogLyoKICAqIENv bXB1dGUgcmVxdWVzdGVkIGV4dGVuZGVkIHN0YXRzLCB1c2luZyB0aGUgcm93cyBzYW1wbGVk IGZvciB0aGUgcGxhaW4KQEAgLTI2MDgsMyArMjYxMSw4MDUgQEAgbWFrZV9idWlsZF9kYXRh KFJlbGF0aW9uIHJlbCwgU3RhdEV4dEVudHJ5ICpzdGF0LCBpbnQgbnVtcm93cywgSGVhcFR1 cGxlICpyb3dzLAogCiAJcmV0dXJuIHJlc3VsdDsKIH0KKworLyoKKyAqIHN0YXRleHRfZmlu ZF9tYXRjaGluZ19tY3YKKyAqCQlTZWFyY2ggZm9yIGEgTUNWIGNvdmVyaW5nIGFsbCB0aGUg YXR0cmlidXRlcyBhbmQgZXhwcmVzc2lvbnMuCisgKgorICogV2UgcGljayB0aGUgc3RhdGlz dGljcyB0byB1c2UgZm9yIGpvaW4gZXN0aW1hdGlvbi4gVGhlIHN0YXRpc3RpY3MgaGFzIHRv CisgKiBiZSBhbiBNQ1YsIGFuZCB3ZSByZXF1aXJlIGl0IHRvIG1hdGNoIGFsbCB0aGUgam9p biBjb25kaXRpb25zLCBiZWNhdXNlIGl0CisgKiBtYWtlcyB0aGUgZXN0aW1hdGlvbiBzaW1w bGVyLgorICoKKyAqIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBjYW5kaWRhdGUgc3RhdGlzdGlj cyAobWF0Y2hpbmcgYWxsIGpvaW4gY2xhdXNlcyksCisgKiB3ZSBwaWNrIHRoZSBzbWFsbGVz dCBvbmUsIGFuZCB3ZSBhbHNvIGNvbnNpZGVyIGFkZGl0aW9uYWwgY29uZGl0aW9ucyBvbgor ICogdGhlIGJhc2UgcmVsYXRpb25zIHRvIHJlc3RyaWN0IHRoZSBNQ1YgaXRlbXMgdXNlZCBm b3IgZXN0aW1hdGlvbiAodXNpbmcKKyAqIGNvbmRpdGlvbmFsIHByb2JhYmlsaXR5KS4KKyAq CisgKiBYWFggVGhlIHJlcXVpcmVtZW50IHRoYXQgYWxsIHRoZSBhdHRyaWJ1dGVzIG5lZWQg dG8gYmUgY292ZXJlZCBtaWdodCBiZQorICogdG9vIHN0cm9uZy4gV2UgY291bGQgcmVsYXgg dGhpcyBhbmQgYW5kIHJlcXVpcmUgZmV3ZXIgbWF0Y2hlcyAoYXQgbGVhc3QgdHdvLAorICog aWYgY291bnRpbmcgdGhlIGFkZGl0aW9uYWwgY29uZGl0aW9ucyksIGFuZCB3ZSBtaWdodCBl dmVuIGFwcGx5IG11bHRpcGxlCisgKiBzdGF0aXN0aWNzIGV0Yy4gQnV0IHRoYXQgd291bGQg cmVxdWlyZSBtYXRjaGluZyBzdGF0aXN0aWNzIG9uIGJvdGggc2lkZXMgb2YKKyAqIHRoZSBq b2luLCB3aGlsZSBub3cgd2Ugc2ltcGx5IGtub3cgdGhlIHN0YXRpc3RpY3MgbWF0Y2guIFdl IGRvbid0IHJlYWxseQorICogZXhwZWN0IG1hbnkgY2FuZGlkYXRlIE1DVnMsIHNvIHRoaXMg c2ltcGxlIGFwcHJvYWNoIHNlZW1zIHN1ZmZpY2llbnQuIEFuZAorICogdGhlIGpvaW5zIHVz dWFsbHkgdXNlIG9ubHkgb25lIG9yIHR3byBjb2x1bW5zLCBzbyB0aGVyZSdzIG5vdCBtdWNo IHJvb20KKyAqIGZvciBhcHBseWluZyBtdWx0aXBsZSBzdGF0aXN0aWNzIGFueXdheS4KKyAq LworU3RhdGlzdGljRXh0SW5mbyAqCitzdGF0ZXh0X2ZpbmRfbWF0Y2hpbmdfbWN2KFBsYW5u ZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCisJCQkJCQkgIEJpdG1hcHNldCAqYXR0 bnVtcywgTGlzdCAqZXhwcnMpCit7CisJTGlzdENlbGwgICAqbDsKKwlTdGF0aXN0aWNFeHRJ bmZvICptY3YgPSBOVUxMOworCUxpc3QgKnN0YXRzID0gcmVsLT5zdGF0bGlzdDsKKworCWZv cmVhY2gobCwgc3RhdHMpCisJeworCQlTdGF0aXN0aWNFeHRJbmZvICpzdGF0ID0gKFN0YXRp c3RpY0V4dEluZm8gKikgbGZpcnN0KGwpOworCQlMaXN0ICpjb25kaXRpb25zMSA9IE5JTCwK KwkJCSAqY29uZGl0aW9uczIgPSBOSUw7CisKKwkJLyogV2Ugb25seSBjYXJlIGFib3V0IE1D ViBzdGF0aXN0aWNzIGhlcmUuICovCisJCWlmIChzdGF0LT5raW5kICE9IFNUQVRTX0VYVF9N Q1YpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBJZ25vcmUgTUNWcyBub3QgY292ZXJp bmcgYWxsIHRoZSBhdHRyaWJ1dGVzL2V4cHJlc3Npb25zLgorCQkgKgorCQkgKiBYWFggTWF5 YmUgd2Ugc2hvdWxkbid0IGJlIHNvIHN0cmljdCBhbmQgY29uc2lkZXIgb25seSBwYXJ0aWFs CisJCSAqIG1hdGNoZXMgZm9yIGpvaW4gY2xhdXNlcyB0b28/CisJCSAqLworCQlpZiAoIWJt c19pc19zdWJzZXQoYXR0bnVtcywgc3RhdC0+a2V5cykgfHwKKwkJCSFzdGF0X2NvdmVyc19l eHByZXNzaW9ucyhzdGF0LCBleHBycywgTlVMTCkpCisJCQljb250aW51ZTsKKworCQkvKiBJ ZiB0aGVyZSdzIG5vIG1hdGNoaW5nIE1DViB5ZXQsIGtlZXAgdGhpcyBvbmUuICovCisJCWlm ICghbWN2KQorCQl7CisJCQltY3YgPSBzdGF0OworCQkJY29udGludWU7CisJCX0KKworCQkv KgorCQkgKiBPSywgd2UgaGF2ZSB0d28gY2FuZGlkYXRlIHN0YXRpc3RpY3MgYW5kIHdlIG5l ZWQgdG8gZGVjaWRlIHdoaWNoIG9uZQorCQkgKiB0byBrZWVwLiBXZSdsbCB1c2UgdHdvIHNp bXBsZSBoZXVyaXN0aWNzOgorCQkgKgorCQkgKiAoYSkgV2UgcHJlZmVyIHNtYWxsZXIgc3Rh dGlzdGljcyAoZmV3ZXIgY29sdW1ucyksIG9uIHRoZSBhc3N1bXB0aW9uCisJCSAqIHRoYXQg aXQgcmVwcmVzZW50cyBhIGxhcmdlciBmcmFjdGlvbiBvZiB0aGUgZGF0YSAoZHVlIHRvIGhh dmluZyBmZXdlcgorCQkgKiBjb21iaW5hdGlvbnMgd2l0aCBoaWdoZXIgY291bnRzKS4KKwkJ ICoKKwkJICogKGIpIElmIHRoZSBzdGF0aXN0aWNzIGNvdmVycyBzb21lIGFkZGl0aW9uYWwg Y29uZGl0aW9ucyBmb3IgdGhlIHJlbHMsCisJCSAqIHRoYXQgbWF5IGhlbHAgd2l0aCBjb25z aWRlcmluZyBhZGRpdGlvbmFsIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHRoZQorCQkgKiB0YWJs ZXMuCisJCSAqCisJCSAqIE9mIGNvdXJzZSwgdGhvc2UgdHdvIGhldXJpc3RpY3QgYXJlIHNv bWV3aGF0IGNvbnRyYWRpY3RvcnkgLSBzbWFsbGVyCisJCSAqIHN0YXRzIGFyZSBsZXNzIGxp a2VseSB0byBjb3ZlciBhcyBtYW55IGNvbmRpdGlvbnMgYXMgYSBsYXJnZXIgb25lLiBXZQor CQkgKiBjb25zaWRlciB0aGUgYWRkaXRpb25hbCBjb25kaXRpb25zIGZpcnN0IC0gaWYgc29t ZW9uZSBjcmVhdGVkIHN1Y2gKKwkJICogc3RhdGlzdGljcywgdGhlcmUgcHJvYmFibHkgaXMg YSBkZXBlbmRlbmN5IHdvcnRoIGNvbnNpZGVyaW5nLgorCQkgKgorCQkgKiBXaGVuIGluc3Bl Y3RpbmcgdGhlIHJlc3RyaWN0aW9ucywgd2UgbmVlZCB0byBiZSBjYXJlZnVsIC0gd2UgZG9u J3QKKwkJICoga25vdyB3aGljaCBvZiB0aGVtIGFyZSBjb21wYXRpYmxlIHdpdGggZXh0ZW5k ZWQgc3RhdHMsIHNvIHdlIGhhdmUgdG8KKwkJICogcnVuIHRoZW0gdGhyb3VnaCBzdGF0ZXh0 X2lzX2NvbXBhdGlibGVfY2xhdXNlIGZpcnN0IGFuZCB0aGVuIG1hdGNoCisJCSAqIHRoZW0u dG8gdGhlIHN0YXRpc3RpY3MuCisJCSAqCisJCSAqIFhYWCBNYXliZSB3ZSBzaG91bGRuJ3Qg cGljayBzdGF0aXN0aWNzIHRoYXQgY292ZXJzIGp1c3QgYSBzaW5nbGUgam9pbgorCQkgKiBj bGF1c2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgY29uZGl0aW9ucy4gSW4gc3VjaCBjYXNl IHdlIGNvdWxkIGp1c3QKKwkJICogYXMgd2VsbCBwaWNrIHJlZ3VsYXIgc3RhdGlzdGljcyBm b3IgdGhlIGNvbHVtbi9leHByZXNzaW9uLCBidXQgaXQncworCQkgKiBub3QgY2xlYXIgaWYg dGhhdCBhY3R1YWxseSBleGlzdHMgKHNvIHdlIG1pZ2h0IHJlamVjdCB0aGUgc3RhdHMgaGVy ZQorCQkgKiBhbmQgdGhlbiBmYWlsIHRvIGZpbmQgc29tZXRoaW5nIHNpbXBsZXIvYmV0dGVy KS4KKwkJICovCisJCWNvbmRpdGlvbnMxID0gc3RhdGV4dF9kZXRlcm1pbmVfam9pbl9yZXN0 cmljdGlvbnMocm9vdCwgcmVsLCBzdGF0KTsKKwkJY29uZGl0aW9uczIgPSBzdGF0ZXh0X2Rl dGVybWluZV9qb2luX3Jlc3RyaWN0aW9ucyhyb290LCByZWwsIG1jdik7CisKKwkJLyogaWYg dGhlIG5ldyBzdGF0aXN0aWNzIGNvdmVycyBtb3JlIGNvbmRpdGlvbnMsIHVzZSBpdCAqLwor CQlpZiAobGlzdF9sZW5ndGgoY29uZGl0aW9uczEpID4gbGlzdF9sZW5ndGgoY29uZGl0aW9u czIpKQorCQl7CisJCQltY3YgPSBzdGF0OworCQkJY29udGludWU7CisJCX0KKworCQkvKiBU aGUgc3RhdGlzdGljcyBzZWVtIGFib3V0IGVxdWFsLCBzbyBqdXN0IHVzZSB0aGUgc21hbGxl ciBvbmUuICovCisJCWlmIChibXNfbnVtX21lbWJlcnMobWN2LT5rZXlzKSArIGxpc3RfbGVu Z3RoKG1jdi0+ZXhwcnMpID4KKwkJCWJtc19udW1fbWVtYmVycyhzdGF0LT5rZXlzKSArIGxp c3RfbGVuZ3RoKHN0YXQtPmV4cHJzKSkKKwkJeworCQkJbWN2ID0gc3RhdDsKKwkJfQorCX0K KworCXJldHVybiBtY3Y7Cit9CisKKy8qCisgKiBzdGF0ZXh0X2RldGVybWluZV9qb2luX3Jl c3RyaWN0aW9ucworICoJCUdldCByZXN0cmljdGlvbnMgb24gYmFzZSByZWxhdGlvbiwgY292 ZXJlZCBieSB0aGUgc3RhdGlzdGljcy4KKyAqCisgKiBSZXR1cm5zIGEgbGlzdCBvZiBiYXNl cmVsIHJlc3RyaWN0aW5mb3MsIGNvbXBhdGlibGUgd2l0aCBleHRlbmRlZCBzdGF0aXN0aWNz CisgKiBhbmQgY292ZXJlZCBieSB0aGUgZXh0ZW5kZWQgc3RhdGlzdGljcy4KKyAqCisgKiBX aGVuIHVzaW5nIGV4dGVuZGVkIHN0YXRpc3RpY3MgdG8gZXN0aW1hdGUgam9pbnMsIHdlIGNh biB1c2UgY29uZGl0aW9ucworICogZnJvbSBiYXNlIHJlbGF0aW9ucyB0byBjYWxjdWxhdGUg Y29uZGl0aW9uYWwgcHJvYmFiaWxpdHkKKyAqCisgKiAgICBQKGpvaW4gY2xhdXNlcyB8IGJh c2VyZWwgcmVzdHJpY3Rpb25zKQorICoKKyAqIHdoaWNoIHNob3VsZCBiZSBhIGJldHRlciBl c3RpbWF0ZSB0aGFuIGp1c3QgUChqb2luIGNsYXVzZXMpLiBXZSB3YW50IHRvIHBpY2sKKyAq IHRoZSBzdGF0aXN0aWNzIGNvdmVyaW5nIHRoZSBtb3N0IHN1Y2ggY29uZGl0aW9ucy4KKyAq LworTGlzdCAqCitzdGF0ZXh0X2RldGVybWluZV9qb2luX3Jlc3RyaWN0aW9ucyhQbGFubmVy SW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAorCQkJCQkJCQkJU3RhdGlzdGljRXh0SW5m byAqaW5mbykKK3sKKwlMaXN0Q2VsbCAgICpsYzsKKwlMaXN0CSAgICpjb25kaXRpb25zID0g TklMOworCisJLyogZXh0cmFjdCBjb25kaXRpb25zIHRoYXQgbWF5IGJlIGFwcGxpZWQgdG8g dGhlIE1DViBsaXN0ICovCisJZm9yZWFjaCAobGMsIHJlbC0+YmFzZXJlc3RyaWN0aW5mbykK Kwl7CisJCVJlc3RyaWN0SW5mbyAqcmluZm8gPSAoUmVzdHJpY3RJbmZvICopIGxmaXJzdChs Yyk7CisJCUJpdG1hcHNldCAqaW5kZXhlcyA9IE5VTEw7CisJCUJpdG1hcHNldCAqYXR0bnVt cyA9IE5VTEw7CisJCUxpc3QgKmV4cHJzID0gTklMOworCisJCS8qIGNsYXVzZSBoYXMgdG8g YmUgc3VwcG9ydGVkIGJ5IE1DViBpbiBnZW5lcmFsICovCisJCWlmICghc3RhdGV4dF9pc19j b21wYXRpYmxlX2NsYXVzZShyb290LCAoTm9kZSAqKSByaW5mbywgcmVsLT5yZWxpZCwKKwkJ CQkJCQkJCQkgICZhdHRudW1zLCAmZXhwcnMpKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJ ICogY2xhdXNlIGlzIGNvbXBhdGlibGUgaW4gZ2VuZXJhbCwgYnV0IGlzIGl0IGFjdHVhbGx5 IGNvdmVyZWQKKwkJICogYnkgdGhpcyBwYXJ0aXVsYXIgc3RhdGlzdGljcyBvYmplY3Q/CisJ CSAqLworCQlpZiAoIWJtc19pc19zdWJzZXQoYXR0bnVtcywgaW5mby0+a2V5cykgfHwKKwkJ CSFzdGF0X2NvdmVyc19leHByZXNzaW9ucyhpbmZvLCBleHBycywgJmluZGV4ZXMpKQorCQkJ Y29udGludWU7CisKKwkJY29uZGl0aW9ucyA9IGxhcHBlbmQoY29uZGl0aW9ucywgcmluZm8t PmNsYXVzZSk7CisJfQorCisJcmV0dXJuIGNvbmRpdGlvbnM7Cit9CisKKy8qCisgKiBzdGF0 ZXh0X2lzX3N1cHBvcnRlZF9qb2luX2NsYXVzZQorICoJCUNoZWNrIGlmIGEgam9pbiBjbGF1 c2UgbWF5IGJlIGVzdGltYXRlZCB1c2luZyBleHRlbmRlZCBzdGF0cy4KKyAqCisgKiBEZXRl cm1pbmVzIGlmIHRoaXMgaXMgYSBqb2luIGNsYXVzZSBvZiB0aGUgZm9ybSAoRXhwciBvcCBF eHByKSB3aGljaCBtYXkgYmUKKyAqIGVzdGltYXRlZCB1c2luZyBleHRlbmRlZCBzdGF0aXN0 aWNzLiBFYWNoIHNpZGUgbXVzdCByZWZlcmVuY2UganVzdCBhIHNpbmdsZQorICogcmVsYXRp b24gZm9yIG5vdy4KKyAqCisgKiBTaW1pbGFyIHRvIHRyZWF0X2FzX2pvaW5fY2xhdXNlLCBi dXQgd2UgcGxhY2UgYWRkaXRpb25hbCByZXN0cmljdGlvbnMKKyAqIG9uIHRoZSBjb25kaXRp b25zLgorICovCitzdGF0aWMgYm9vbAorc3RhdGV4dF9pc19zdXBwb3J0ZWRfam9pbl9jbGF1 c2UoUGxhbm5lckluZm8gKnJvb3QsIE5vZGUgKmNsYXVzZSwKKwkJCQkJCQkJIGludCB2YXJS ZWxpZCwgU3BlY2lhbEpvaW5JbmZvICpzamluZm8pCit7CisJT2lkCW9wcnNlbDsKKwlSZXN0 cmljdEluZm8gICAqcmluZm87CisJT3BFeHByCQkgICAqb3BjbGF1c2U7CisJTGlzdENlbGwJ ICAgKmxjOworCisJLyoKKwkgKiBldmFsdWF0aW9uIGFzIGEgcmVzdHJpY3Rpb24gY2xhdXNl LCBlaXRoZXIgYXQgc2NhbiBub2RlIG9yIGZvcmNlZAorCSAqCisJICogWFhYIFNlZSB0cmVh dF9hc19qb2luX2NsYXVzZS4KKwkgKi8KKwlpZiAoKHZhclJlbGlkICE9IDApIHx8IChzamlu Zm8gPT0gTlVMTCkpCisJCXJldHVybiBmYWxzZTsKKworCS8qIFhYWCBDYW4gd2UgcmVseSBv biBhbHdheXMgZ2V0dGluZyBSZXN0cmljdEluZm8gaGVyZT8gKi8KKwlpZiAoIUlzQShjbGF1 c2UsIFJlc3RyaWN0SW5mbykpCisJCXJldHVybiBmYWxzZTsKKworCS8qIHN0cmlwIHRoZSBS ZXN0cmljdEluZm8gKi8KKwlyaW5mbyA9IChSZXN0cmljdEluZm8gKikgY2xhdXNlOworCWNs YXVzZSA9IChOb2RlICopIHJpbmZvLT5jbGF1c2U7CisKKwkvKiBpcyBpdCByZWZlcmVuY2lu ZyBtdWx0aXBsZSByZWxhdGlvbnM/ICovCisJaWYgKGJtc19tZW1iZXJzaGlwKHJpbmZvLT5j bGF1c2VfcmVsaWRzKSAhPSBCTVNfTVVMVElQTEUpCisJCXJldHVybiBmYWxzZTsKKworCS8q IHdlIG9ubHkgc3VwcG9ydCBzaW1wbGUgb3BlcmF0b3IgY2xhdXNlcyBmb3Igbm93ICovCisJ aWYgKCFpc19vcGNsYXVzZShjbGF1c2UpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlvcGNsYXVz ZSA9IChPcEV4cHIgKikgY2xhdXNlOworCisJLyogZm9yIG5vdyB3ZSBvbmx5IHN1cHBvcnQg ZXN0aW1hdGluZyBlcXVpam9pbnMgKi8KKwlvcHJzZWwgPSBnZXRfb3Byam9pbihvcGNsYXVz ZS0+b3Bubyk7CisKKwkvKiBoYXMgdG8gYmUgYW4gZXF1YWxpdHkgY29uZGl0aW9uICovCisJ aWYgKG9wcnNlbCAhPSBGX0VRSk9JTlNFTCkKKwkJcmV0dXJuIGZhbHNlOworCisJLyoKKwkg KiBNYWtlIHN1cmUgd2UncmUgbm90IG1peGluZyB2YXJzIGZyb20gbXVsdGlwbGUgcmVsYXRp b25zIG9uIHRoZSBzYW1lCisJICogc2lkZSwgbGlrZQorCSAqCisJICogICAodDEuYSArIHQy LmEpID0gKHQxLmIgKyB0Mi5iKQorCSAqCisJICogd2hpY2ggaXMgc3RpbGwgdGVjaG5pY2Fs bHkgYW4gb3BjbGF1c2UsIGJ1dCB3ZSBjYW4ndCBtYXRjaCBpdCB0bworCSAqIGV4dGVuZGVk IHN0YXRpc3RpY3MgaW4gYSBzaW1wbGUgd2F5LgorCSAqCisJICogWFhYIFRoaXMgYWxzbyBt ZWFucyB3ZSByZXF1aXJlIHJpbmZvLT5jbGF1c2VfcmVsaWRzIHRvIGhhdmUgMiByZWxzLgor CSAqCisJICogWFhYIEFsc28gY2hlY2sgaXQncyBub3QgZXhwcmVzc2lvbiBvbiBzeXN0ZW0g YXR0cmlidXRlcywgd2hpY2ggd2UKKwkgKiBkb24ndCBhbGxvdyBpbiBleHRlbmRlZCBzdGF0 aXN0aWNzLgorCSAqCisJICogWFhYIEFsdGhvdWdoIG1heWJlIHdlIGNvdWxkIGFsbG93IGNh c2VzIHRoYXQgY29tYmluZSBleHByZXNzaW9ucworCSAqIGZyb20gYm90aCByZWxhdGlvbnMg b24gZWl0aGVyIHNpZGU/IExpa2UgKHQxLmEgKyB0Mi5iID0gdDEuYyAtIHQyLmQpCisJICog b3Igc29tZXRoaW5nIGxpa2UgdGhhdC4gV2UgY291bGQgZG8gImNhcnRlc2lhbiBwcm9kdWN0 IiBvZiB0aGUgTUNWCisJICogc3RhdHMgYW5kIHJlc3RyaWN0IGl0IHVzaW5nIHRoaXMgY29u ZGl0aW9uLgorCSAqLworCWZvcmVhY2ggKGxjLCBvcGNsYXVzZS0+YXJncykKKwl7CisJCUJp dG1hcHNldCAqdmFybm9zID0gTlVMTDsKKwkJTm9kZSAqZXhwciA9IChOb2RlICopIGxmaXJz dChsYyk7CisKKwkJdmFybm9zID0gcHVsbF92YXJub3Mocm9vdCwgZXhwcik7CisKKwkJLyoK KwkJICogTm8gYXJndW1lbnQgc2hvdWxkIHJlZmVyZW5jZSBtb3JlIHRoYW4ganVzdCBvbmUg cmVsYXRpb24uCisJCSAqCisJCSAqIFRoaXMgZWZmZWN0aXZlbHkgbWVhbnMgZWFjaCBzaWRl IHJlZmVyZW5jZXMganVzdCB0d28gcmVsYXRpb25zLgorCQkgKiBJZiB0aGVyZSdzIG5vIHJl bGF0aW9uIG9uIG9uZSBzaWRlLCBpdCdzIGEgQ29uc3QsIGFuZCB0aGUgb3RoZXIKKwkJICog c2lkZSBoYXMgdG8gYmUgZWl0aGVyIENvbnN0IG9yIEV4cHIgd2l0aCBhIHNpbmdsZSByZWwu IEluIHdoaWNoCisJCSAqIGNhc2UgaXQgY2FuJ3QgYmUgYSBqb2luIGNsYXVzZS4KKwkJICov CisJCWlmIChibXNfbnVtX21lbWJlcnModmFybm9zKSA+IDEpCisJCQlyZXR1cm4gZmFsc2U7 CisKKwkJLyoKKwkJICogWFhYIE1heWJlIGNoZWNrIHRoYXQgYm90aCByZWxhdGlvbnMgaGF2 ZSBleHRlbmRlZCBzdGF0aXN0aWNzCisJCSAqIChubyBwb2ludCBpbiBjb25zaWRlcmluZyB0 aGUgY2xhdXNlIGFzIHVzZWZ1bCB3aXRob3V0IGl0KS4gQnV0CisJCSAqIHdlJ2xsIGRvIHRo YXQgY2hlY2sgbGF0ZXIgYW55d2F5LCBzbyBrZWVwIHRoaXMgY2hlYXAuCisJCSAqLworCX0K KworCXJldHVybiB0cnVlOworfQorCisvKgorICogc3RhdGV4dF90cnlfam9pbl9lc3RpbWF0 ZXMKKyAqCQlDaGVja3MgaWYgaXQncyB3b3J0aCBjb25zaWRlcmluZyBleHRlbmRlZCBzdGF0 cyBvbiBqb2luIGVzdGltYXRlcy4KKyAqCisgKiBUaGlzIGlzIHN1cHBvc2VkIHRvIGJlIGEg cXVpY2svY2hlYXAgY2hlY2sgdG8gZGVjaWRlIHdoZXRoZXIgdG8gZXhwZW5kCisgKiBtb3Jl IGVmZm9ydCBvbiBhcHBseWluZyBleHRlbmRlZCBzdGF0aXN0aWNzIHRvIGpvaW4gY2xhdXNl cy4KKyAqLworYm9vbAorc3RhdGV4dF90cnlfam9pbl9lc3RpbWF0ZXMoUGxhbm5lckluZm8g KnJvb3QsIExpc3QgKmNsYXVzZXMsIGludCB2YXJSZWxpZCwKKwkJCQkJCSAgIEpvaW5UeXBl IGpvaW50eXBlLCBTcGVjaWFsSm9pbkluZm8gKnNqaW5mbywKKwkJCQkJCSAgIEJpdG1hcHNl dCAqZXN0aW1hdGVkY2xhdXNlcykKK3sKKwlpbnQJCQlsaXN0aWR4OworCWludAkJCWs7CisJ TGlzdENlbGwgICAqbGM7CisJQml0bWFwc2V0ICAqcmVsaWRzID0gTlVMTDsKKworCS8qCisJ ICogWFhYIE5vdCBoYXZpbmcgdGhlc2UgdmFsdWVzIG1lYW5zIHRyZWF0X2FzX2pvaW5fY2xh dXNlIHJldHVybnMgZmFsc2UsCisJICogc28gd2UncmUgbm90IHN1cHBvc2VkIHRvIGhhbmRs ZSBqb2luIGNsYXVzZXMgaGVyZS4gU28ganVzdCBiYWlsIG91dC4KKwkgKi8KKwlpZiAoKHZh clJlbGlkICE9IDApIHx8IChzamluZm8gPT0gTlVMTCkpCisJCXJldHVybiBmYWxzZTsKKwor CS8qCisJICogQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSB1bmVzdGltYXRlZCBqb2luIGNsYXVz ZXMsIGNvbGxlY3QgcmVsaWRzLgorCSAqCisJICogWFhYIEN1cnJlbnRseSB0aGlzIG9ubHkg YWxsb3dzIHNpbXBsZSBPcEV4cHIgZXF1YWxpdHkgY2xhdXNlcyB3aXRoIGVhY2gKKwkgKiBh cmd1bWVudCByZWZlcmluZyB0byBzaW5nbGUgcmVsYXRpb24sIEFORC1lZCB0b2dldGhlci4g TWF5YmUgd2UgY291bGQKKwkgKiByZWxheCB0aGlzIGluIHRoZSBmdXR1cmUsIGUuZy4gdG8g YWxsb3cgbW9yZSBjb21wbGV4IChkZWVwZXIpIGV4cHJlc3Npb25zCisJICogYW5kIHRvIGFs bG93IE9SLWVkIGpvaW4gY2xhdXNlcyB0b28uIEFuZCBtYXliZSBzdXBwb3J0aW5nIGluZXF1 YWxpdGllcy4KKwkgKgorCSAqIEhhbmRsaW5nIG1vcmUgY29tcGxleCBleHByZXNzaW9ucyBz ZWVtcyBzaW1wbGUgLSB3ZSBhbHJlYWR5IGRvIHRoYXQgZm9yCisJICogYmFzZXJlbCBlc3Rp bWF0ZXMgYnkgYnVpbGRpbmcgdGhlIG1hdGNoIGJpdG1hcCByZWN1cnNpdmVseSwgYW5kIHdl IGNvdWxkCisJICogZG8gc29tZXRoaW5nIHNpbWlsYXIgZm9yIGNvbWJpbmF0aW9ucyBvZiBN Q1YgaXRlbXMgKGEgYml0IGxpa2UgYnVpbGRpbmcKKwkgKiBhIHNpbmdsZSBiaXQgaW4gdGhl IG1hdGNoIGJpdG1hcCkuIFRoZSBjaGFsbGVuZ2UgaXMgd2hhdCB0byBkbyBhYm91dCB0aGUK KwkgKiBwYXJ0IG5vdCByZXByZXNlbnRlZCBieSBNQ1YsIHdoaWNoIGlzIG5vdyBiYXNlZCBv biBuZGlzdGluY3QgZXN0aW1hdGVzLgorCSAqLworCWxpc3RpZHggPSAtMTsKKwlmb3JlYWNo IChsYywgY2xhdXNlcykKKwl7CisJCU5vZGUgKmNsYXVzZSA9IChOb2RlICopIGxmaXJzdChs Yyk7CisJCVJlc3RyaWN0SW5mbyAqcmluZm87CisKKwkJLyogbmVlZHMgdG8gaGFwcGVuIGJl Zm9yZSBza2lwcGluZyBhbnkgY2xhdXNlcyAqLworCQlsaXN0aWR4Kys7CisKKwkJLyogU2tp cCBjbGF1c2VzIHRoYXQgd2VyZSBhbHJlYWR5IGVzdGltYXRlZC4gKi8KKwkJaWYgKGJtc19p c19tZW1iZXIobGlzdGlkeCwgZXN0aW1hdGVkY2xhdXNlcykpCisJCQljb250aW51ZTsKKwor CQkvKgorCQkgKiBTa2lwIGNsYXVzZXMgdGhhdCBhcmUgbm90IGpvaW4gY2xhdXNlcyBvciB0 aGF0IHdlIGRvbid0IGtub3cKKwkJICogaG93IHRvIGhhbmRsZSBlc3RpbWF0ZSB1c2luZyBl eHRlbmRlZCBzdGF0aXN0aWNzLgorCQkgKi8KKwkJaWYgKCFzdGF0ZXh0X2lzX3N1cHBvcnRl ZF9qb2luX2NsYXVzZShyb290LCBjbGF1c2UsIHZhclJlbGlkLCBzamluZm8pKQorCQkJY29u dGludWU7CisKKwkJLyoKKwkJICogWFhYIFdlJ3JlIGd1YXJhbnRlZWQgdG8gaGF2ZSBSZXN0 cmljdEluZm8gdGhhbmtzIHRvIHRoZSBjaGVja3MKKwkJICogaW4gc3RhdGV4dF9pc19zdXBw b3J0ZWRfam9pbl9jbGF1c2UuCisJCSAqLworCQlyaW5mbyA9IChSZXN0cmljdEluZm8gKikg Y2xhdXNlOworCisJCS8qIENvbGxlY3QgcmVsaWRzIGZyb20gYWxsIHVzYWJsZSBjbGF1c2Vz LiAqLworCQlyZWxpZHMgPSBibXNfdW5pb24ocmVsaWRzLCByaW5mby0+Y2xhdXNlX3JlbGlk cyk7CisJfQorCisJLyogbm8gam9pbiBjbGF1c2VzIGZvdW5kLCBkb24ndCB0cnkgYXBwbHlp bmcgZXh0ZW5kZWQgc3RhdHMgKi8KKwlpZiAoYm1zX251bV9tZW1iZXJzKHJlbGlkcykgPT0g MCkKKwkJcmV0dXJuIGZhbHNlOworCisJLyoKKwkgKiBXZSBleHBlY3QgZWl0aGVyIDAgb3Ig Pj0gMiByZWxpZHMsIGEgY2FzZSB3aXRoIDEgcmVsaWQgaW4gam9pbiBjbGF1c2VzCisJICog c2hvdWxkIGJlIGltcG9zc2libGUuIEFuZCB3ZSBqdXN0IHJ1bGVkIG91dCAwLCBzbyB0aGVy ZSBhcmUgYXQgbGVhc3QgMi4KKwkgKi8KKwlBc3NlcnQoYm1zX251bV9tZW1iZXJzKHJlbGlk cykgPj0gMik7CisKKwkvKgorCSAqIENoZWNrIHRoYXQgYXQgbGVhc3Qgc29tZSBvZiB0aGUg cmVscyByZWZlcmVuY2VkIGJ5IHRoZSBjbGF1c2VzIGhhdmUKKwkgKiBleHRlbmRlZCBzdGF0 cy4KKwkgKgorCSAqIFhYWCBNYXliZSB3ZSBzaG91bGQgY2hlY2sgaG93IG1hbnkgcmVscyBo YXZlIHN0YXRzLCBhbmQgY3Jvc3MtY2hlY2sgaG93CisJICogY29tcGF0aWJsZSB0aGV5IGFy ZSAoZS5nLiB0aGF0IGJvdGggaGF2ZSBNQ1ZzLCBldGMuKS4gV2UgbWlnaHQgYWxzbworCSAq IGNyb3NzLWNoZWNrIHRoZSBleGFjdCBqb2luZWQgcGFpcnMgb2YgcmVscywgYnV0IGl0J3Mg aXMgc3VwcG9zZWQgdG8gYmUKKwkgKiBhIGNoZWFwIGNoZWNrLCBzbyBtYXliZSBiZXR0ZXIg bGVhdmUgdGhhdCBmb3IgbGF0ZXIuCisJICoKKwkgKiBYWFggV2UgY291bGQgYWxzbyBjaGVj ayB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgaW4gZWFjaCByZWwgdG8gY29uc2lkZXIKKwkg KiBleHRlbmRlZCBzdGF0cy4gSWYgdGhlcmUncyBqdXN0IGEgc2luZ2xlIGF0dHJpYnV0ZSwg aXQncyBwb2ludGxlc3MgdG8gdXNlCisJICogZXh0ZW5kZWQgc3RhdGlzdGljcy4gT1RPSCB3 ZSBjYW4gYWxzbyBjb25zaWRlciByZXN0cmljdGlvbiBjbGF1c2VzIGZyb20KKwkgKiBiYXNl cmVzdHJpY3RpbmZvIGFuZCB1c2UgdGhlbSB0byBjYWxjdWxhdGUgY29uZGl0aW9uYWwgcHJv YmFiaWxpdGllcy4KKwkgKi8KKwlrID0gLTE7CisJd2hpbGUgKChrID0gYm1zX25leHRfbWVt YmVyKHJlbGlkcywgaykpID49IDApCisJeworCQlSZWxPcHRJbmZvICpyZWwgPSBmaW5kX2Jh c2VfcmVsKHJvb3QsIGspOworCQlpZiAocmVsLT5zdGF0bGlzdCkKKwkJCXJldHVybiB0cnVl OworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworLyoKKyAqIEluZm9ybWF0aW9uIGFib3V0 IHR3byBqb2luZWQgcmVsYXRpb25zLCBhbG9uZyB3aXRoIHRoZSBqb2luIGNsYXVzZXMgYmV0 d2Vlbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgSm9pblBhaXJJbmZvCit7CisJQml0bWFwc2V0 ICAqcmVsczsKKwlMaXN0CSAgICpjbGF1c2VzOworfSBKb2luUGFpckluZm87CisKKy8qCisg KiBzdGF0ZXh0X2J1aWxkX2pvaW5fcGFpcnMKKyAqCQlFeHRyYWN0IHBhaXJzIG9mIGpvaW5l ZCByZWxzIHdpdGggam9pbiBjbGF1c2VzIGZvciBlYWNoIHBhaXIuCisgKgorICogV2Fsa3Mg dGhlIHJlbWFpbmluZyAobm90IHlldCBlc3RpbWF0ZWQpIGNsYXVzZXMsIGFuZCBzcGxpdHMg dGhlbSBpbnRvCisgKiBsaXN0cyBmb3IgZWFjaCBwYWlyIG9mIGpvaW5lZCByZWxhdGlvbnMu IFJldHVybnMgTlVMTCBpZiB0aGVyZSBhcmUgbm8KKyAqIHN1aXRhYmxlIGpvaW4gcGFpcnMg dGhhdCBtaWdodCBiZSBlc3RpbWF0ZWQgdXNpbmcgZXh0ZW5kZWQgc3RhdHMuCisgKgorICog WFhYIEl0J3MgcG9zc2libGUgdGhlcmUgYXJlIGpvaW4gY2xhdXNlcywgYnV0IHRoZSBjbGF1 c2VzIGFyZSBub3QKKyAqIHN1cHBvcnRlZCBieSB0aGUgZXh0ZW5kZWQgc3RhdHMgbWFjaGlu ZXJ5ICh3ZSBvbmx5IHN1cHBvcnQgb3BjbGF1c2VzCisgKiB3aXRoIEZfRVFKT0lOU0VMIHNl bGVjdGl2aXR5IGZ1bmN0aW9uIGF0IHRoZSBtb21lbnQpLgorICovCitzdGF0aWMgSm9pblBh aXJJbmZvICoKK3N0YXRleHRfYnVpbGRfam9pbl9wYWlycyhQbGFubmVySW5mbyAqcm9vdCwg TGlzdCAqY2xhdXNlcywgaW50IHZhclJlbGlkLAorCQkJCQkJIEpvaW5UeXBlIGpvaW50eXBl LCBTcGVjaWFsSm9pbkluZm8gKnNqaW5mbywKKwkJCQkJCSBCaXRtYXBzZXQgKmVzdGltYXRl ZGNsYXVzZXMsIGludCAqbnBhaXJzKQoreworCWludAkJCQljbnQ7CisJaW50CQkJCWxpc3Rp ZHg7CisJSm9pblBhaXJJbmZvICAgKmluZm87CisJTGlzdENlbGwJICAgKmxjOworCisJLyoK KwkgKiBBc3N1bWUgZWFjaCBjbGF1c2UgaXMgZm9yIGEgZGlmZmVyZW50IHBhaXIgb2YgcmVs YXRpb25zIChzb21lIG9mIHRoZW0KKwkgKiBtaWdodCBiZSBhbHJlYWR5IGVzdGltYXRlZCwg YnV0IG1laCAtIHRoZXJlIHNob3VsZG4ndCBiZSB0b28gbWFueSBvZgorCSAqIHRoZW0gYW5k IGl0J3MgY2hlYXBlciB0aGFuIHJlcGFsbG9jLgorCSAqLworCWluZm8gPSAoSm9pblBhaXJJ bmZvICopIHBhbGxvYzAoc2l6ZW9mKEpvaW5QYWlySW5mbykgKiBsaXN0X2xlbmd0aChjbGF1 c2VzKSk7CisJY250ID0gMDsKKworCWxpc3RpZHggPSAtMTsKKwlmb3JlYWNoKGxjLCBjbGF1 c2VzKQorCXsKKwkJaW50CQkJCWk7CisJCWJvb2wJCQlmb3VuZDsKKwkJTm9kZQkJICAgKmNs YXVzZSA9IChOb2RlICopIGxmaXJzdChsYyk7CisJCVJlc3RyaWN0SW5mbyAgICpyaW5mbzsK KworCQlsaXN0aWR4Kys7CisKKwkJLyogc2tpcCBhbHJlYWR5IGVzdGltYXRlZCBjbGF1c2Vz ICovCisJCWlmIChibXNfaXNfbWVtYmVyKGxpc3RpZHgsIGVzdGltYXRlZGNsYXVzZXMpKQor CQkJY29udGludWU7CisKKwkJLyoKKwkJICogTWFrZSBzdXJlIHRoZSBjbGF1c2UgaXMgYSBq b2luIGNsYXVzZSBvZiBhIHN1cHBvcnRlZCBzaGFwZSAoYXQKKwkJICogdGhlIG1vbWVudCB3 ZSBzdXBwb3J0IGp1c3QgKEV4cHIgb3AgRXhwcikgY2xhdXNlcyB3aXRoIGVhY2gKKwkJICog c2lkZSByZWZlcmVuY2luZyBqdXN0IGEgc2luZ2xlIHJlbGF0aW9uLgorCQkgKi8KKwkJaWYg KCFzdGF0ZXh0X2lzX3N1cHBvcnRlZF9qb2luX2NsYXVzZShyb290LCBjbGF1c2UsIHZhclJl bGlkLCBzamluZm8pKQorCQkJY29udGludWU7CisKKwkJLyogc3RhdGV4dF9pc19zdXBwb3J0 ZWRfam9pbl9jbGF1c2UgZ3VhcmFudGVlcyBSZXN0cmljdEluZm8gKi8KKwkJcmluZm8gPSAo UmVzdHJpY3RJbmZvICopIGNsYXVzZTsKKwkJY2xhdXNlID0gKE5vZGUgKikgcmluZm8tPmNs YXVzZTsKKworCQkvKiBzZWFyY2ggZm9yIGEgbWF0Y2hpbmcgam9pbiBwYWlyICovCisJCWZv dW5kID0gZmFsc2U7CisJCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykKKwkJeworCQkJaWYg KGJtc19pc19zdWJzZXQocmluZm8tPmNsYXVzZV9yZWxpZHMsIGluZm9baV0ucmVscykpCisJ CQl7CisJCQkJaW5mb1tpXS5jbGF1c2VzID0gbGFwcGVuZChpbmZvW2ldLmNsYXVzZXMsIGNs YXVzZSk7CisJCQkJZm91bmQgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJ aWYgKCFmb3VuZCkKKwkJeworCQkJaW5mb1tjbnRdLnJlbHMgPSByaW5mby0+Y2xhdXNlX3Jl bGlkczsKKwkJCWluZm9bY250XS5jbGF1c2VzID0gbGFwcGVuZChpbmZvW2NudF0uY2xhdXNl cywgY2xhdXNlKTsKKwkJCWNudCsrOworCQl9CisJfQorCisJaWYgKGNudCA9PSAwKQorCQly ZXR1cm4gTlVMTDsKKworCSpucGFpcnMgPSBjbnQ7CisJcmV0dXJuIGluZm87Cit9CisKKy8q CisgKiBleHRyYWN0X3JlbGF0aW9uX2luZm8KKyAqCQlFeHRyYWN0IGluZm9ybWF0aW9uIGFi b3V0IGEgcmVsYXRpb24gaW4gYSBqb2luIHBhaXIuCisgKgorICogVGhlIHJlbGF0aW9uIGlz IGlkZW50aWZpZWQgYnkgaW5kZXggKGdlbmVyYWxseSAwIG9yIDEpLCBhbmQgcGlja3MgZXh0 ZW5kZWQKKyAqIHN0YXRpc3RpY3MgY292ZXJpbmcgdGhlIGpvaW4gY2xhdXNlcyBhbmQgYmFz ZXJlbCByZXN0cmljdGlvbnMuCisgKgorICogWFhYIENhbiB3ZSBoYXZlIGNhc2VzIHdpdGgg aW5kZXhlcyBhYm92ZSAxPyBQcm9iYWJseSBmb3IgY2xhdXNlcyBtaXhpbmcKKyAqIHZhcnMg ZnJvbSAzIHJlbGF0aW9ucywgYnV0IHN0YXRleHRfaXNfc3VwcG9ydGVkX2pvaW5fY2xhdXNl IHJlamVjdHMgdGhvc2UuCisgKi8KK3N0YXRpYyBSZWxPcHRJbmZvICoKK2V4dHJhY3RfcmVs YXRpb25faW5mbyhQbGFubmVySW5mbyAqcm9vdCwgSm9pblBhaXJJbmZvICppbmZvLCBpbnQg aW5kZXgsCisJCQkJCSAgU3RhdGlzdGljRXh0SW5mbyAqKnN0YXQpCit7CisJaW50CQkJazsK KwlpbnQJCQlyZWxpZDsKKwlSZWxPcHRJbmZvICpyZWw7CisJTGlzdENlbGwgICAqbGM7CisJ TGlzdAkgICAqZXhwcnMgPSBOSUw7CisKKwlCaXRtYXBzZXQgICphdHRudW1zID0gTlVMTDsK KworCUFzc2VydCgoaW5kZXggPj0gMCkgJiYgKGluZGV4IDw9IDEpKTsKKworCWsgPSAtMTsK Kwl3aGlsZSAoaW5kZXggPj0gMCkKKwl7CisJCWsgPSBibXNfbmV4dF9tZW1iZXIoaW5mby0+ cmVscywgayk7CisJCWlmIChrIDwgMCkKKwkJCWVsb2coRVJST1IsICJmYWlsZWQgdG8gZXh0 cmFjdCByZWxpZCIpOworCisJCXJlbGlkID0gazsKKwkJaW5kZXgtLTsKKwl9CisKKwlyZWwg PSBmaW5kX2Jhc2VfcmVsKHJvb3QsIHJlbGlkKTsKKworCS8qCisJICogV2FsayB0aGUgY2xh dXNlcyBmb3IgdGhpcyBqb2luIHBhaXIsIGFuZCBleHRyYWN0IGV4cHJlc3Npb25zIGFib3V0 CisJICogdGhlIHJlbGF0aW9uIGlkZW50aWZpZWQgYnkgaW5kZXggLyByZWxpZC4gRm9yIHNp bXBsZSBWYXJzIHdlIGV4dHJhY3QKKwkgKiB0aGUgYXR0bnVtLiBPdGhlcndpc2Ugd2Uga2Vl cCB0aGUgd2hvbGUgZXhwcmVzc2lvbi4KKwkgKi8KKwlmb3JlYWNoIChsYywgaW5mby0+Y2xh dXNlcykKKwl7CisJCUxpc3RDZWxsICpsYzI7CisJCU5vZGUgKmNsYXVzZSA9IChOb2RlICop IGxmaXJzdChsYyk7CisJCU9wRXhwciAqb3BjbGF1c2UgPSAoT3BFeHByICopIGNsYXVzZTsK KworCQkvKiBvbmx5IG9wY2xhdXNlcyBzdXBwb3J0ZWQgZm9yIG5vdyAqLworCQlBc3NlcnQo aXNfb3BjbGF1c2UoY2xhdXNlKSk7CisKKwkJZm9yZWFjaCAobGMyLCBvcGNsYXVzZS0+YXJn cykKKwkJeworCQkJTm9kZSAqYXJnID0gKE5vZGUgKikgbGZpcnN0KGxjMik7CisJCQlCaXRt YXBzZXQgKnZhcm5vcyA9IE5VTEw7CisKKwkJCS8qIHBsYWluIFZhciByZWZlcmVuY2VzIChi b29sZWFuIFZhcnMgb3IgcmVjdXJzaXZlIGNoZWNrcykgKi8KKwkJCWlmIChJc0EoYXJnLCBW YXIpKQorCQkJeworCQkJCVZhcgkJICAgKnZhciA9IChWYXIgKikgYXJnOworCisJCQkJLyog SWdub3JlIHZhcnMgZnJvbSBvdGhlciByZWxhdGlvbnMuICovCisJCQkJaWYgKHZhci0+dmFy bm8gIT0gcmVsaWQpCisJCQkJCWNvbnRpbnVlOworCisJCQkJLyogd2UgYWxzbyBiZXR0ZXIg ZW5zdXJlIHRoZSBWYXIgaXMgZnJvbSB0aGUgY3VycmVudCBsZXZlbCAqLworCQkJCWlmICh2 YXItPnZhcmxldmVsc3VwID4gMCkKKwkJCQkJY29udGludWU7CisKKwkJCQkvKiBBbHNvIHNr aXAgc3lzdGVtIGF0dHJpYnV0ZXMgKHdlIGRvbid0IGFsbG93IHN0YXRzIG9uIHRob3NlKS4g Ki8KKwkJCQlpZiAoIUF0dHJOdW1iZXJJc0ZvclVzZXJEZWZpbmVkQXR0cih2YXItPnZhcmF0 dG5vKSkKKwkJCQkJZWxvZyhFUlJPUiwgInVuZXhwZWN0ZWQgc3lzdGVtIGF0dHJpYnV0ZSIp OworCisJCQkJYXR0bnVtcyA9IGJtc19hZGRfbWVtYmVyKGF0dG51bXMsIHZhci0+dmFyYXR0 bm8pOworCisJCQkJLyogRG9uZSwgcHJvY2VzcyB0aGUgbmV4dCBhcmd1bWVudC4gKi8KKwkJ CQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIE9LLCBpdCdzIGEgbW9yZSBjb21w bGV4IGV4cHJlc3Npb24sIHNvIGNoZWNrIGlmIGl0IG1hdGNoZXMKKwkJCSAqIHRoZSByZWxp ZCBhbmQgbWF5YmUga2VlcCBpdCBhcyBhIHdob2xlLiBJdCBzaG91bGQgYmUKKwkJCSAqIGNv bXBhdGlibGUgYmVjYXVzZSB3ZSBhbHJlYWR5IGNoZWNrZWQgaXQgd2hlbiBidWlsZGluZyB0 aGUKKwkJCSAqIGpvaW4gcGFpcnMuCisJCQkgKi8KKwkJCXZhcm5vcyA9IHB1bGxfdmFybm9z KHJvb3QsIGFyZyk7CisKKwkJCWlmIChyZWxpZCA9PSBibXNfc2luZ2xldG9uX21lbWJlcih2 YXJub3MpKQorCQkJCWV4cHJzID0gbGFwcGVuZChleHBycywgYXJnKTsKKwkJfQorCX0KKwor CSpzdGF0ID0gc3RhdGV4dF9maW5kX21hdGNoaW5nX21jdihyb290LCByZWwsIGF0dG51bXMs IGV4cHJzKTsKKworCXJldHVybiByZWw7Cit9CisKKy8qCisgKiBnZXRfZXhwcmVzc2lvbl9m b3JfcmVsCisgKgkJRXh0cmFjdCBleHByZXNzaW9uIGZvciBhIGdpdmVuIHJlbGF0aW9uIGZy b20gdGhlIGpvaW4gY2xhdXNlLgorICoKKyAqIEdpdmVuIGEgam9pbiBjbGF1c2Ugc3VwcG9y dGVkIGJ5IHRoZSBleHRlbmRlZCBzdGF0aXN0aWNzIChjdXJyZW50bHkgdGhhdAorICogbWVh bnMganVzdCBPcEV4cHIgY2xhdXNlcyB3aXRoIGVhY2ggYXJndW1lbnQgcmVmZXJlbmNpbmcg c2luZ2xlIHJlbCksCisgKiByZXR1cm4gZWl0aGVyIHRoZSBsZWZ0IG9yIHJpZ2h0IGFyZ3Vt ZW50IGV4cHJlc3Npb24gZm9yIHRoZSByZWwuCisgKgorICogWFhYIFRoaXMgc2hvdWxkIHBy b2JhYmx5IHJldHVybiBhIGZsYWcgaWRlbnRpZnlpbmcgd2hldGhlciBpdCdzIHRoZQorICog bGVmdCBvciByaWdodCBhcmd1bWVudC4KKyAqLworc3RhdGljIE5vZGUgKgorZ2V0X2V4cHJl c3Npb25fZm9yX3JlbChQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLCBOb2Rl ICpjbGF1c2UpCit7CisJT3BFeHByICpvcGV4cHI7CisJTm9kZSAgICpleHByOworCisJLyoK KwkgKiBTdHJpcCB0aGUgUmVzdHJpY3RJbmZvIG5vZGUsIGdldCB0aGUgYWN0dWFsIGNsYXVz ZS4KKwkgKgorCSAqIFhYWCBOb3Qgc3VyZSBpZiB3ZSBuZWVkIHRvIGNhcmUgYWJvdXQgcmVt b3Zpbmcgb3RoZXIgbm9kZSB0eXBlcworCSAqIHRvbyAoZS5nLiBSZWxhYmVsVHlwZSBldGMu KS4gc3RhdGV4dF9pc19zdXBwb3J0ZWRfam9pbl9jbGF1c2UKKwkgKiBtYXRjaGVzIHRoaXMs IGJ1dCBtYXliZSB3ZSBuZWVkIHRvIHJlbGF4IGl0PworCSAqLworCWlmIChJc0EoY2xhdXNl LCBSZXN0cmljdEluZm8pKQorCQljbGF1c2UgPSAoTm9kZSAqKSAoKFJlc3RyaWN0SW5mbyAq KSBjbGF1c2UpLT5jbGF1c2U7CisKKwlvcGV4cHIgPSAoT3BFeHByICopIGNsYXVzZTsKKwor CS8qIE1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBleHBlY3RlZCBub2RlIHR5cGUuICovCisJQXNz ZXJ0KGlzX29wY2xhdXNlKGNsYXVzZSkpOworCUFzc2VydChsaXN0X2xlbmd0aChvcGV4cHIt PmFyZ3MpID09IDIpOworCisJLyogRklYTUUgc3RyaXAgcmVsYWJlbCBldGMuIHRoZSB3YXkg ZXhhbWluZV9vcGNsYXVzZV9hcmdzIGRvZXMgKi8KKwlleHByID0gbGluaXRpYWwob3BleHBy LT5hcmdzKTsKKwlpZiAoYm1zX3NpbmdsZXRvbl9tZW1iZXIocHVsbF92YXJub3Mocm9vdCwg ZXhwcikpID09IHJlbC0+cmVsaWQpCisJCXJldHVybiBleHByOworCisJZXhwciA9IGxzZWNv bmQob3BleHByLT5hcmdzKTsKKwlpZiAoYm1zX3NpbmdsZXRvbl9tZW1iZXIocHVsbF92YXJu b3Mocm9vdCwgZXhwcikpID09IHJlbC0+cmVsaWQpCisJCXJldHVybiBleHByOworCisJcmV0 dXJuIE5VTEw7Cit9CisKKy8qCisgKiBzdGF0ZXh0X2NsYXVzZWxpc3Rfam9pbl9zZWxlY3Rp dml0eQorICoJCVVzZSBleHRlbmRlZCBzdGF0cyB0byBlc3RpbWF0ZSBqb2luIGNsYXVzZXMu CisgKgorICogWFhYIEluIHByaW5jaXBsZSwgd2Ugc2hvdWxkIG5vdCByZXN0cmljdCB0aGlz IHRvIGNhc2VzIHdpdGggbXVsdGlwbGUKKyAqIGpvaW4gY2xhdXNlcyAtIHdlIHNob3VsZCBj b25zaWRlciBkZXBlbmRlbmNpZXMgd2l0aCBjb25kaXRpb25zIGF0IHRoZQorICogYmFzZSBy ZWxhdGlvbnMsIGkuZS4gY2FsY3VsYXRlIFAoam9pbiBjbGF1c2UgfCBiYXNlIHJlc3RyaWN0 aW9ucykuCisgKiBCdXQgY3VycmVudGx5IHRoYXQgZG9lcyBub3QgaGFwcGVuLCBiZWNhdXNl IGNsYXVzZWxpc3Rfc2VsZWN0aXZpdHlfZXh0CisgKiB0cmVhdHMgYSBzaW5nbGUgY2xhdXNl IGFzIGEgc3BlY2lhbCBjYXNlIChhbmQgd2UgZG9uJ3QgYXBwbHkgZXh0ZW5kZWQKKyAqIHN0 YXRpc3RpY3MgaW4gdGhhdCBjYXNlIHlldCkuCisgKi8KK1NlbGVjdGl2aXR5CitzdGF0ZXh0 X2NsYXVzZWxpc3Rfam9pbl9zZWxlY3Rpdml0eShQbGFubmVySW5mbyAqcm9vdCwgTGlzdCAq Y2xhdXNlcywgaW50IHZhclJlbGlkLAorCQkJCQkJCQkJSm9pblR5cGUgam9pbnR5cGUsIFNw ZWNpYWxKb2luSW5mbyAqc2ppbmZvLAorCQkJCQkJCQkJQml0bWFwc2V0ICoqZXN0aW1hdGVk Y2xhdXNlcykKK3sKKwlpbnQJCQlpOworCWludAkJCWxpc3RpZHg7CisJU2VsZWN0aXZpdHkJ cyA9IDEuMDsKKworCUpvaW5QYWlySW5mbyAqaW5mbzsKKwlpbnQJCQkJbmluZm87CisKKwlp ZiAoIWNsYXVzZXMpCisJCXJldHVybiAxLjA7CisKKwkvKiBleHRyYWN0IHBhaXJzIG9mIGpv aW5lZCByZWxhdGlvbnMgZnJvbSB0aGUgbGlzdCBvZiBjbGF1c2VzICovCisJaW5mbyA9IHN0 YXRleHRfYnVpbGRfam9pbl9wYWlycyhyb290LCBjbGF1c2VzLCB2YXJSZWxpZCwgam9pbnR5 cGUsIHNqaW5mbywKKwkJCQkJCQkJCSplc3RpbWF0ZWRjbGF1c2VzLCAmbmluZm8pOworCisJ Lyogbm8gdXNlZnVsIGpvaW4gcGFpcnMgKi8KKwlpZiAoIWluZm8pCisJCXJldHVybiAxLjA7 CisKKwkvKgorCSAqIFByb2Nlc3MgdGhlIGpvaW4gcGFpcnMsIHRyeSB0byBmaW5kIGEgbWF0 Y2hpbmcgTUNWIG9uIGVhY2ggc2lkZS4KKwkgKgorCSAqIFhYWCBUaGUgYmFzaWMgcHJpbmNp cGxlIGlzIHF1aXRlIHNpbWlsYXIgdG8gZXFqb2luc2VsX2lubmVyLCBpLmUuCisJICogd2Ug dHJ5IHRvIGZpbmQgYSBNQ1Ygb24gYm90aCBzaWRlcyBvZiB0aGUgam9pbiwgYW5kIHVzZSBp dCB0byBnZXQKKwkgKiBiZXR0ZXIgam9pbiBlc3RpbWF0ZS4gSXQncyBhIGJpdCBtb3JlIGNv bXBsaWNhdGVkLCBiZWNhdXNlIHRoZXJlCisJICogbWlnaHQgYmUgbXVsdGlwbGUgTUNWIGxp c3RzLCB3ZSBhbHNvIG5lZWQgbmRpc3RpbmN0IGVzdGltYXRlLCBhbmQKKwkgKiB0aGVyZSBt YXkgYmUgaW50ZXJlc3RpbmcgYmFzZXJlc3RyaWN0aW9ucyB0b28uCisJICoKKwkgKiBYWFgg QXQgdGhlIG1vbWVudCB3ZSBvbmx5IGhhbmRsZSB0aGUgY2FzZSB3aXRoIG1hdGNoaW5nIE1D VnMgb24KKwkgKiBib3RoIHNpZGVzLCBidXQgaXQnZCBiZSBnb29kIHRvIGFsc28gaGFuZGxl IGNhc2Ugd2l0aCBqdXN0IG5kaXN0aW5jdAorCSAqIHN0YXRpc3RpY3MgaW1wcm92aW5nIG5k aXN0aW5jdCBlc3RpbWF0ZXMuCisJICoKKwkgKiBYWFggV2UgbWlnaHQgYWxzbyBoYW5kbGUg Y2FzZXMgd2l0aCBhIHJlZ3VsYXIgTUNWIG9uIG9uZSBzaWRlIGFuZAorCSAqIGFuIGV4dGVu ZGVkIE1DViBvbiB0aGUgb3RoZXIgc2lkZS4KKwkgKgorCSAqIFhYWCBQZXJoYXBzIGl0J2Qg YmUgZ29vZCB0byBhbHNvIGhhbmRsZSBjYXNlIHdpdGggb25lIHNpZGUgb25seQorCSAqIGhh dmluZyAicmVndWxhciIgc3RhdGlzdGljcyAoZS5nLiBNQ1YpLCBlc3BlY2lhbGx5IGluIGNh c2VzIHdpdGgKKwkgKiBubyBjb25kaXRpb25zIG9uIHRoYXQgc2lkZSBvZiB0aGUgam9pbiAo d2hlcmUgd2UgY2FuJ3QgdXNlIHRoZQorCSAqIGV4dGVuZGVkIE1DViB0byBjYWxjdWxhdGUg Y29uZGl0aW9uYWwgcHJvYmFiaWxpdHkpLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBuaW5m bzsgaSsrKQorCXsKKwkJTGlzdENlbGwgKmxjOworCisJCVJlbE9wdEluZm8gKnJlbDE7CisJ CVJlbE9wdEluZm8gKnJlbDI7CisKKwkJU3RhdGlzdGljRXh0SW5mbyAqc3RhdDE7CisJCVN0 YXRpc3RpY0V4dEluZm8gKnN0YXQyOworCisJCS8qIGV4dHJhY3QgaW5mbyBhYm91dCB0aGUg Zmlyc3QgcmVsYXRpb24gKi8KKwkJcmVsMSA9IGV4dHJhY3RfcmVsYXRpb25faW5mbyhyb290 LCAmaW5mb1tpXSwgMCwgJnN0YXQxKTsKKworCQkvKiBleHRyYWN0IGluZm8gYWJvdXQgdGhl IHNlY29uZCByZWxhdGlvbiAqLworCQlyZWwyID0gZXh0cmFjdF9yZWxhdGlvbl9pbmZvKHJv b3QsICZpbmZvW2ldLCAxLCAmc3RhdDIpOworCisJCS8qCisJCSAqIFdlIGNhbiBoYW5kbGUg dGhyZWUgYmFzaWMgY2FzZXM6CisJCSAqCisJCSAqIGEpIEV4dGVuZGVkIHN0YXRzICh3aXRo IE1DVikgb24gYm90aCBzaWRlcyBpcyBhbiBpZGVhbCBjYXNlLCBhbmQgd2UKKwkJICogY2Fu IHNpbXBseSBjb21iaW5lIHRoZSB0d28gTUNWcywgcG9zc2libHkgd2l0aCBhZGRpdGlvbmFs IGNvbmRpdGlvbnMKKwkJICogZnJvbSB0aGUgcmVsYXRpb25zLgorCQkgKgorCQkgKiBiKSBF eHRlbmRlZCBzdGF0cyBvbiBvbmUgc2lkZSwgcmVndWxhciBNQ1Ygb24gdGhlIG90aGVyIHNp ZGUgKHRoaXMKKwkJICogbWVhbnMgdGhlcmUncyBqdXN0IG9uZSBqb2luIGNsYXVzZSAvIGV4 cHJlc3Npb24pLiBJdCBhbHNvIG1lYW5zIHRoZQorCQkgKiBleHRlbmRlZCBzdGF0cyBsaWtl bHkgY292ZXJzIGF0IGxlYXN0IG9uZSBleHRyYSBjb25kaXRpb24sIG90aGVyd2lzZQorCQkg KiB3ZSBjb3VsZCBqdXN0IHVzZSByZWd1bGFyIHN0YXRpc3RpY3MuIFdlIGNhbiBjb21iaW5l IHRoZSBzdGF0cyBqdXN0CisJCSAqIHNpbWlsYXJseSB0byAoYSkuCisJCSAqCisJCSAqIGMp IE5vIGV4dGVuZGVkIHN0YXRzIHdpdGggTUNWLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgam9p biBjbGF1c2VzLAorCQkgKiB3ZSBjYW4gdHJ5IHVzaW5nIG5kaXN0aW5jdCBjb2VmZmljaWVu dHMgYW5kIGRvIHdoYXQgZXNqb2luc2VsIGRvZXMuCisJCSAqCisJCSAqIElmIG5vbmUgb2Yg dGhlc2UgYXBwbGllcywgd2UgZmFsbGJhY2sgdG8gdGhlIHJlZ3VsYXIgc2VsZWN0aXZpdHkK KwkJICogZXN0aW1hdGlvbiBpbiBlcWpvaW5zZWwuCisJCSAqLworCQlpZiAoc3RhdDEgJiYg c3RhdDIpCisJCXsKKwkJCXMgKj0gbWN2X2NvbWJpbmVfZXh0ZW5kZWQocm9vdCwgcmVsMSwg cmVsMiwgc3RhdDEsIHN0YXQyLCBpbmZvW2ldLmNsYXVzZXMpOworCQl9CisJCWVsc2UgaWYg KHN0YXQxICYmIChsaXN0X2xlbmd0aChpbmZvW2ldLmNsYXVzZXMpID09IDEpKQorCQl7CisJ CQkvKiB0cnkgZmluZGluZyBNQ1Ygb24gdGhlIG90aGVyIHJlbGF0aW9uICovCisJCQlWYXJp YWJsZVN0YXREYXRhCXZhcmRhdGE7CisJCQlBdHRTdGF0c1Nsb3QJCXNzbG90OworCQkJRm9y bV9wZ19zdGF0aXN0aWMJc3RhdHMgPSBOVUxMOworCQkJYm9vbAkJCQloYXZlX21jdnMgPSBm YWxzZTsKKwkJCU5vZGUJCQkgICAqY2xhdXNlID0gbGluaXRpYWwoaW5mb1tpXS5jbGF1c2Vz KTsKKwkJCU5vZGUJCQkgICAqZXhwciA9IGdldF9leHByZXNzaW9uX2Zvcl9yZWwocm9vdCwg cmVsMiwgY2xhdXNlKTsKKwkJCWRvdWJsZQkJCQluZDsKKwkJCWJvb2wJCQkJaXNkZWZhdWx0 OworCisJCQlleGFtaW5lX3ZhcmlhYmxlKHJvb3QsIGV4cHIsIDAsICZ2YXJkYXRhKTsKKwor CQkJbmQgPSBnZXRfdmFyaWFibGVfbnVtZGlzdGluY3QoJnZhcmRhdGEsICZpc2RlZmF1bHQp OworCisJCQltZW1zZXQoJnNzbG90LCAwLCBzaXplb2Yoc3Nsb3QpKTsKKworCQkJaWYgKEhl YXBUdXBsZUlzVmFsaWQodmFyZGF0YS5zdGF0c1R1cGxlKSkKKwkJCXsKKwkJCQkvKiBub3Rl IHdlIGFsbG93IHVzZSBvZiBudWxsZnJhYyByZWdhcmRsZXNzIG9mIHNlY3VyaXR5IGNoZWNr ICovCisJCQkJc3RhdHMgPSAoRm9ybV9wZ19zdGF0aXN0aWMpIEdFVFNUUlVDVCh2YXJkYXRh LnN0YXRzVHVwbGUpOworCQkJCS8qIEZJWE1FIHNob3VsZCB0aGlzIGNhbGwgc3RhdGlzdGlj X3Byb2Nfc2VjdXJpdHlfY2hlY2sgbGlrZSBlcWpvaW5zZWw/ICovCisJCQkJaGF2ZV9tY3Zz ID0gZ2V0X2F0dHN0YXRzc2xvdCgmc3Nsb3QsIHZhcmRhdGEuc3RhdHNUdXBsZSwKKwkJCQkJ CQkJCQkJIFNUQVRJU1RJQ19LSU5EX01DViwgSW52YWxpZE9pZCwKKwkJCQkJCQkJCQkJIEFU VFNUQVRTU0xPVF9WQUxVRVMgfCBBVFRTVEFUU1NMT1RfTlVNQkVSUyk7CisJCQl9CisKKwkJ CWlmIChoYXZlX21jdnMpCisJCQkJcyAqPSBtY3ZfY29tYmluZV9zaW1wbGUocm9vdCwgcmVs MSwgc3RhdDEsICZzc2xvdCwKKwkJCQkJCQkJCQlzdGF0cy0+c3RhbnVsbGZyYWMsIG5kLCBp c2RlZmF1bHQsIGNsYXVzZSk7CisKKwkJCWZyZWVfYXR0c3RhdHNzbG90KCZzc2xvdCk7CisK KwkJCVJlbGVhc2VWYXJpYWJsZVN0YXRzKHZhcmRhdGEpOworCisJCQkvKiBubyBzdGF0cywg ZG9uJ3QgbWFyayB0aGUgY2xhdXNlcyBhcyBlc3RpbWF0ZWQgKi8KKwkJCWlmICghaGF2ZV9t Y3ZzKQorCQkJCWNvbnRpbnVlOworCQl9CisJCWVsc2UgaWYgKHN0YXQyICYmIChsaXN0X2xl bmd0aChpbmZvW2ldLmNsYXVzZXMpID09IDEpKQorCQl7CisJCQkvKiB0cnkgZmluZGluZyBN Q1Ygb24gdGhlIG90aGVyIHJlbGF0aW9uICovCisJCQlWYXJpYWJsZVN0YXREYXRhCXZhcmRh dGE7CisJCQlBdHRTdGF0c1Nsb3QJCXNzbG90OworCQkJRm9ybV9wZ19zdGF0aXN0aWMJc3Rh dHMgPSBOVUxMOworCQkJYm9vbAkJCQloYXZlX21jdnMgPSBmYWxzZTsKKwkJCU5vZGUJCQkg ICAqY2xhdXNlID0gKE5vZGUgKikgbGluaXRpYWwoaW5mb1tpXS5jbGF1c2VzKTsKKwkJCU5v ZGUJCQkgICAqZXhwciA9IGdldF9leHByZXNzaW9uX2Zvcl9yZWwocm9vdCwgcmVsMSwgY2xh dXNlKTsKKwkJCWRvdWJsZQkJCQluZDsKKwkJCWJvb2wJCQkJaXNkZWZhdWx0OworCisJCQll eGFtaW5lX3ZhcmlhYmxlKHJvb3QsIGV4cHIsIDAsICZ2YXJkYXRhKTsKKworCQkJbmQgPSBn ZXRfdmFyaWFibGVfbnVtZGlzdGluY3QoJnZhcmRhdGEsICZpc2RlZmF1bHQpOworCisJCQlt ZW1zZXQoJnNzbG90LCAwLCBzaXplb2Yoc3Nsb3QpKTsKKworCQkJaWYgKEhlYXBUdXBsZUlz VmFsaWQodmFyZGF0YS5zdGF0c1R1cGxlKSkKKwkJCXsKKwkJCQkvKiBub3RlIHdlIGFsbG93 IHVzZSBvZiBudWxsZnJhYyByZWdhcmRsZXNzIG9mIHNlY3VyaXR5IGNoZWNrICovCisJCQkJ c3RhdHMgPSAoRm9ybV9wZ19zdGF0aXN0aWMpIEdFVFNUUlVDVCh2YXJkYXRhLnN0YXRzVHVw bGUpOworCQkJCS8qIEZJWE1FIHNob3VsZCB0aGlzIGNhbGwgc3RhdGlzdGljX3Byb2Nfc2Vj dXJpdHlfY2hlY2sgbGlrZSBlcWpvaW5zZWw/ICovCisJCQkJaGF2ZV9tY3ZzID0gZ2V0X2F0 dHN0YXRzc2xvdCgmc3Nsb3QsIHZhcmRhdGEuc3RhdHNUdXBsZSwKKwkJCQkJCQkJCQkJIFNU QVRJU1RJQ19LSU5EX01DViwgSW52YWxpZE9pZCwKKwkJCQkJCQkJCQkJIEFUVFNUQVRTU0xP VF9WQUxVRVMgfCBBVFRTVEFUU1NMT1RfTlVNQkVSUyk7CisJCQl9CisKKwkJCWlmIChoYXZl X21jdnMpCisJCQkJcyAqPSBtY3ZfY29tYmluZV9zaW1wbGUocm9vdCwgcmVsMiwgc3RhdDIs ICZzc2xvdCwKKwkJCQkJCQkJCQlzdGF0cy0+c3RhbnVsbGZyYWMsIG5kLCBpc2RlZmF1bHQs IGNsYXVzZSk7CisKKwkJCWZyZWVfYXR0c3RhdHNzbG90KCZzc2xvdCk7CisKKwkJCVJlbGVh c2VWYXJpYWJsZVN0YXRzKHZhcmRhdGEpOworCisJCQkvKiBubyBzdGF0cywgZG9uJ3QgbWFy ayB0aGUgY2xhdXNlcyBhcyBlc3RpbWF0ZWQgKi8KKwkJCWlmICghaGF2ZV9tY3ZzKQorCQkJ CWNvbnRpbnVlOworCQl9CisJCWVsc2UKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIE5v dyBtYXJrIGFsbCB0aGUgY2xhdXNlcyBmb3IgdGhpcyBqb2luIHBhaXIgYXMgZXN0aW1hdGVk LgorCQkgKgorCQkgKiBYWFggTWF5YmUgdHJhY2sgdGhlIGluZGV4ZXMgaW4gSm9pblBhaXJJ bmZvLCBzbyB0aGF0IHdlIGNhbgorCQkgKiBzaW1wbHkgdW5pb24gdGhlIHR3byBiaXRtYXBz LCB3aXRob3V0IHRoZSBleHRyYSBtYXRjaGluZy4KKwkJICovCisJCWZvcmVhY2ggKGxjLCBp bmZvLT5jbGF1c2VzKQorCQl7CisJCQlOb2RlICpjbGF1c2UgPSAoTm9kZSAqKSBsZmlyc3Qo bGMpOworCQkJTGlzdENlbGwgKmxjMjsKKworCQkJbGlzdGlkeCA9IC0xOworCQkJZm9yZWFj aCAobGMyLCBjbGF1c2VzKQorCQkJeworCQkJCU5vZGUgKmNsYXVzZTIgPSAoTm9kZSAqKSBs Zmlyc3QobGMyKTsKKwkJCQlsaXN0aWR4Kys7CisKKwkJCQlBc3NlcnQoSXNBKGNsYXVzZTIs IFJlc3RyaWN0SW5mbykpOworCisJCQkJY2xhdXNlMiA9IChOb2RlICopICgoUmVzdHJpY3RJ bmZvICopIGNsYXVzZTIpLT5jbGF1c2U7CisKKwkJCQlpZiAoZXF1YWwoY2xhdXNlLCBjbGF1 c2UyKSkKKwkJCQl7CisJCQkJCSplc3RpbWF0ZWRjbGF1c2VzID0gYm1zX2FkZF9tZW1iZXIo KmVzdGltYXRlZGNsYXVzZXMsIGxpc3RpZHgpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9 CisJCX0KKwl9CisKKwlyZXR1cm4gczsKK30KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0 YXRpc3RpY3MvbWN2LmMgYi9zcmMvYmFja2VuZC9zdGF0aXN0aWNzL21jdi5jCmluZGV4IGIz NTBmYzVmN2IuLmIwZTg3N2M5MmUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0YXRpc3Rp Y3MvbWN2LmMKKysrIGIvc3JjL2JhY2tlbmQvc3RhdGlzdGljcy9tY3YuYwpAQCAtMjQsNiAr MjQsNyBAQAogI2luY2x1ZGUgImZ1bmNhcGkuaCIKICNpbmNsdWRlICJub2Rlcy9ub2RlRnVu Y3MuaCIKICNpbmNsdWRlICJvcHRpbWl6ZXIvY2xhdXNlcy5oIgorI2luY2x1ZGUgIm9wdGlt aXplci9vcHRpbWl6ZXIuaCIKICNpbmNsdWRlICJzdGF0aXN0aWNzL2V4dGVuZGVkX3N0YXRz X2ludGVybmFsLmgiCiAjaW5jbHVkZSAic3RhdGlzdGljcy9zdGF0aXN0aWNzLmgiCiAjaW5j bHVkZSAidXRpbHMvYXJyYXkuaCIKQEAgLTIxNTYsMyArMjE1Nyw3NTYgQEAgbWN2X2NsYXVz ZV9zZWxlY3Rpdml0eV9vcihQbGFubmVySW5mbyAqcm9vdCwgU3RhdGlzdGljRXh0SW5mbyAq c3RhdCwKIAogCXJldHVybiBzOwogfQorCisvKgorICogc3RhdGV4dF9jb21wYXJlX21jdnMK KyAqCQlDYWxjdWx0ZSBqb2luIHNlbGVjdGl2aXR5IHVzaW5nIGV4dGVuZGVkIHN0YXRpc3Rp Y3MsIHNpbWlsYXJseSB0bworICoJCWVxam9pbnNlbF9pbm5lci4KKyAqCisgKiBDb25zaWRl cnMgcmVzdHJpY3Rpb25zIG9uIGJhc2UgcmVsYXRpb25zIHRvbywgZXNzZW50aWFsbHkgY29t cHV0aW5nIGEKKyAqIGNvbmRpdGlvbmFsIHByb2JhYmlsaXR5CisgKgorICoJUChqb2luIGNs YXVzZXMgfCBiYXNlcmVzdHJpY3RpbmZvcyBvbiBlaXRoZXIgc2lkZSkKKyAqCisgKiBDb21w YXJlZCB0byBlcWpvaW5zZWxfaW5uZXIgdGhlcmUncyBhIGNvdXBsZSBwcm9ibGVtcy4gV2l0 aCBwZXItY29sdW1uIE1DVgorICogbGlzdHMgaXQncyBvYnZpb3VzIHRoYXQgdGhlIG51bWJl ciBvZiBkaXN0aW5jdCB2YWx1ZXMgbm90IGNvdmVyZWQgYnkgdGhlIE1DVgorICogaXMgKG5k aXN0aW5jdCAtIHNpemUoTUNWKSkuIFdpdGggbXVsdGktY29sdW1uIE1DVnMgaXQncyBub3Qg dGhhdCBzaW1wbGUsCisgKiBwYXJ0aWN1bGFybHkgd2hlbiB0aGUgY29uZGl0aW9ucyBhcmUg b24gYSBzdWJzZXQgb2YgdGhlIE1DViBhdHRyaWJ1dGVzIGFuZC9vcgorICogTlVMTHMgYXJl IGludm9sdmVkLiBFLmcuIHdpdGggTUNWIChhLGIsYykgYW5kIGNvbmRpdGlvbnMgb24gKGEs YiksIGl0J3Mgbm90CisgKiBjbGVhciBpZiB0aGUgbnVtYmVyIG9mIChhLGIpIGNvbWJpbmF0 aW9ucyBub3QgY292ZXJlZCBieSB0aGUgTUNWIGlzCisgKgorICogKG5kaXN0aW5jdChhLGIp IC0gbmRpc3RpbmN0X21jdihhLGIpKQorICoKKyAqIHdoZXJlIG5kaXN0aW5jdF9tY3YoYSxi KSBpcyB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0IChhLGIpIGNvbWJpbmF0aW9ucworICogaW5j bHVkZWQgaW4gdGhlIE1DViBsaXN0LiBUaGVzZSBjb21iaW5hdGlvbnMgbWF5IGJlIHByZXNl bnQgaW4gdGhlIHJlc3QKKyAqIG9mIHRoZSBkYXRhIChvdXRzaWRlIE1DViksIGp1c3Qgd2l0 aCBzb21lIGV4dHJhIHZhbHVlcyBpbiAiYyIuIFNvIGluCisgKiBwcmluY2lwbGUgdGhlcmUg bWF5IGJlIGJldHdlZW4KKyAqCisgKiAobmRpc3RpbmN0KGEsYikgLSBuZGlzdGluY3RfbWN2 KGEsYikpIGFuZCBuZGlzdGluY3QoYSxiKQorICoKKyAqIGRpc3RpbmN0IHZhbHVlcyBpbiB0 aGUgcGFydCBvZiB0aGUgZGF0YSBub3QgY292ZXJlZCBieSB0aGUgTUNWLiBTbyB3ZSBuZWVk CisgKiB0byBwaWNrIHNvbWV0aGluZyBpbiBiZXR3ZWVuLCB0aGVyZSdzIG5vIHdheSB0byBj YWxjdWxhdGUgdGhpcyBhY2N1cmF0ZWx5LgorICovCitTZWxlY3Rpdml0eQorbWN2X2NvbWJp bmVfZXh0ZW5kZWQoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbDEsIFJlbE9w dEluZm8gKnJlbDIsCisJCQkJCSBTdGF0aXN0aWNFeHRJbmZvICpzdGF0MSwgU3RhdGlzdGlj RXh0SW5mbyAqc3RhdDIsCisJCQkJCSBMaXN0ICpjbGF1c2VzKQoreworCUxpc3RDZWxsICAg KmxjOworCisJTUNWTGlzdCAgICAqbWN2MSwKKwkJCSAgICptY3YyOworCWludAkJCWlkeCwK KwkJCQlpLAorCQkJCWo7CisJU2VsZWN0aXZpdHkgcyA9IDA7CisKKwkvKiBtYXRjaCBiaXRt YXBzIGFuZCBzZWxlY3Rpdml0eSBmb3IgYmFzZXJlbCBjb25kaXRpb25zIChpZiBhbnkpICov CisJTGlzdCAgICpleHByczEgPSBOSUwsCisJCSAgICpleHByczIgPSBOSUw7CisJTGlzdCAg ICpjb25kaXRpb25zMSA9IE5JTCwKKwkJICAgKmNvbmRpdGlvbnMyID0gTklMOworCWJvb2wg ICAqY21hdGNoZXMxID0gTlVMTCwKKwkJICAgKmNtYXRjaGVzMiA9IE5VTEw7CisKKwlkb3Vi bGUJY3NlbDEgPSAxLjAsCisJCQljc2VsMiA9IDEuMDsKKworCWJvb2wgICAqbWF0Y2hlczEg PSBOVUxMLAorCQkgICAqbWF0Y2hlczIgPSBOVUxMOworCisJLyogZXN0aW1hdGVzIGZvciB0 aGUgdHdvIHJlbGF0aW9ucyAqLworCWRvdWJsZQltYXRjaGZyZXExLAorCQkJdW5tYXRjaGZy ZXExLAorCQkJb3RoZXJmcmVxMSwKKwkJCW1jdmZyZXExLAorCQkJbmQxLAorCQkJdG90YWxz ZWwxOworCisJZG91YmxlIAltYXRjaGZyZXEyLAorCQkJdW5tYXRjaGZyZXEyLAorCQkJb3Ro ZXJmcmVxMiwKKwkJCW1jdmZyZXEyLAorCQkJbmQyLAorCQkJdG90YWxzZWwyOworCisJLyog aW5mbyBhYm91dCBjbGF1c2VzIGFuZCBob3cgdGhleSBtYXRjaCB0byBNQ1Ygc3RhdHMgKi8K KwlGbWdySW5mbyAgICpvcHByb2NzOworCWludAkJICAgKmluZGV4ZXMxLAorCQkJICAgKmlu ZGV4ZXMyOworCWJvb2wJICAgKnJldmVyc2U7CisKKwkvKiB3ZSBwaWNrZWQgdGhlIHN0YXRz IHNvIHRoYXQgdGhleSBoYXZlIE1DViBlbmFibGVkICovCisJQXNzZXJ0KChzdGF0MS0+a2lu ZCA9IFNUQVRTX0VYVF9NQ1YpICYmIChzdGF0Mi0+a2luZCA9IFNUQVRTX0VYVF9NQ1YpKTsK KworCW1jdjEgPSBzdGF0ZXh0X21jdl9sb2FkKHN0YXQxLT5zdGF0T2lkKTsKKwltY3YyID0g c3RhdGV4dF9tY3ZfbG9hZChzdGF0Mi0+c3RhdE9pZCk7CisKKwkvKiBzaG91bGQgb25seSBn ZXQgaGVyZSB3aXRoIE1DViBvbiBib3RoIHNpZGVzICovCisJQXNzZXJ0KG1jdjEgJiYgbWN2 Mik7CisKKwkvKiBEZXRlcm1pbmUgd2hpY2ggYmFzZXJlbCBjbGF1c2VzIHRvIHVzZSBmb3Ig Y29uZGl0aW9uYWwgcHJvYmFiaWxpdHkuICovCisJY29uZGl0aW9uczEgPSBzdGF0ZXh0X2Rl dGVybWluZV9qb2luX3Jlc3RyaWN0aW9ucyhyb290LCByZWwxLCBzdGF0MSk7CisJY29uZGl0 aW9uczIgPSBzdGF0ZXh0X2RldGVybWluZV9qb2luX3Jlc3RyaWN0aW9ucyhyb290LCByZWwy LCBzdGF0Mik7CisKKwkvKgorCSAqIENhbGN1bGF0ZSBtYXRjaCBiaXRtYXBzIGZvciByZXN0 cmljdGlvbnMgb24gZWl0aGVyIHNpZGUgb2YgdGhlIGpvaW4KKwkgKiAodGhlcmUgbWF5IGJl IG5vbmUsIGluIHdoaWNoIGNhc2UgdGhpcyB3aWxsIGJlIE5VTEwpLgorCSAqLworCWlmIChj b25kaXRpb25zMSkKKwl7CisJCWNtYXRjaGVzMSA9IG1jdl9nZXRfbWF0Y2hfYml0bWFwKHJv b3QsIGNvbmRpdGlvbnMxLAorCQkJCQkJCQkJCSBzdGF0MS0+a2V5cywgc3RhdDEtPmV4cHJz LAorCQkJCQkJCQkJCSBtY3YxLCBmYWxzZSk7CisJCWNzZWwxID0gY2xhdXNlbGlzdF9zZWxl Y3Rpdml0eShyb290LCBjb25kaXRpb25zMSwgcmVsMS0+cmVsaWQsIDAsIE5VTEwpOworCX0K KworCWlmIChjb25kaXRpb25zMikKKwl7CisJCWNtYXRjaGVzMiA9IG1jdl9nZXRfbWF0Y2hf Yml0bWFwKHJvb3QsIGNvbmRpdGlvbnMyLAorCQkJCQkJCQkJCSBzdGF0Mi0+a2V5cywgc3Rh dDItPmV4cHJzLAorCQkJCQkJCQkJCSBtY3YyLCBmYWxzZSk7CisJCWNzZWwyID0gY2xhdXNl bGlzdF9zZWxlY3Rpdml0eShyb290LCBjb25kaXRpb25zMiwgcmVsMi0+cmVsaWQsIDAsIE5V TEwpOworCX0KKworCS8qCisJICogTWF0Y2ggYml0bWFwcyBmb3IgbWF0Y2hlcyBiZXR3ZWVu IE1DViBlbGVtZW50cy4gQnkgZGVmYXVsdCB0aGVyZQorCSAqIGFyZSBubyBtYXRjaGVzLCBz byB3ZSBzZXQgYWxsIGl0ZW1zIHRvIDAuCisJICovCisJbWF0Y2hlczEgPSAoYm9vbCAqKSBw YWxsb2MwKHNpemVvZihib29sKSAqIG1jdjEtPm5pdGVtcyk7CisJbWF0Y2hlczIgPSAoYm9v bCAqKSBwYWxsb2MwKHNpemVvZihib29sKSAqIG1jdjItPm5pdGVtcyk7CisKKwkvKgorCSAq IEluaXRpYWxpemUgaW5mb3JtYXRpb24gYWJvdXQgY2xhdXNlcyBhbmQgaG93IHRoZXkgbWF0 Y2ggdG8gdGhlIE1DVgorCSAqIHN0YXRzIHdlIHBpY2tlZC4gV2UgZG8gdGhpcyBvbmx5IG9u Y2UgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIGxpc3RzLAorCSAqIHNvIHRoYXQgd2UgZG9uJ3Qg aGF2ZSB0byBkbyB0aGF0IGZvciBlYWNoIE1DViBpdGVtIG9yIHNvLgorCSAqLworCW9wcHJv Y3MgPSAoRm1nckluZm8gKikgcGFsbG9jKHNpemVvZihGbWdySW5mbykgKiBsaXN0X2xlbmd0 aChjbGF1c2VzKSk7CisJaW5kZXhlczEgPSAoaW50ICopIHBhbGxvYyhzaXplb2YoaW50KSAq IGxpc3RfbGVuZ3RoKGNsYXVzZXMpKTsKKwlpbmRleGVzMiA9IChpbnQgKikgcGFsbG9jKHNp emVvZihpbnQpICogbGlzdF9sZW5ndGgoY2xhdXNlcykpOworCXJldmVyc2UgPSAoYm9vbCAq KSBwYWxsb2Moc2l6ZW9mKGJvb2wpICogbGlzdF9sZW5ndGgoY2xhdXNlcykpOworCisJaWR4 ID0gMDsKKwlmb3JlYWNoIChsYywgY2xhdXNlcykKKwl7CisJCU5vZGUJICAgKmNsYXVzZSA9 IChOb2RlICopIGxmaXJzdChsYyk7CisJCU9wRXhwcgkgICAqb3BleHByOworCQlOb2RlCSAg ICpleHByMSwKKwkJCQkgICAqZXhwcjI7CisJCUJpdG1hcHNldCAgKnJlbGlkczEsCisJCQkJ ICAgKnJlbGlkczI7CisKKwkJLyoKKwkJICogU3RyaXAgdGhlIFJlc3RyaWN0SW5mbyBub2Rl LCBnZXQgdGhlIGFjdHVhbCBjbGF1c2UuCisJCSAqCisJCSAqIFhYWCBOb3Qgc3VyZSBpZiB3 ZSBuZWVkIHRvIGNhcmUgYWJvdXQgcmVtb3Zpbmcgb3RoZXIgbm9kZSB0eXBlcworCQkgKiB0 b28gKGUuZy4gUmVsYWJlbFR5cGUgZXRjLikuIHN0YXRleHRfaXNfc3VwcG9ydGVkX2pvaW5f Y2xhdXNlCisJCSAqIG1hdGNoZXMgdGhpcywgYnV0IG1heWJlIHdlIG5lZWQgdG8gcmVsYXgg aXQ/CisJCSAqLworCQlpZiAoSXNBKGNsYXVzZSwgUmVzdHJpY3RJbmZvKSkKKwkJCWNsYXVz ZSA9IChOb2RlICopICgoUmVzdHJpY3RJbmZvICopIGNsYXVzZSktPmNsYXVzZTsKKworCQlv cGV4cHIgPSAoT3BFeHByICopIGNsYXVzZTsKKworCQkvKiBNYWtlIHN1cmUgd2UgaGF2ZSB0 aGUgZXhwZWN0ZWQgbm9kZSB0eXBlLiAqLworCQlBc3NlcnQoaXNfb3BjbGF1c2UoY2xhdXNl KSk7CisJCUFzc2VydChsaXN0X2xlbmd0aChvcGV4cHItPmFyZ3MpID09IDIpOworCisJCWZt Z3JfaW5mbyhnZXRfb3Bjb2RlKG9wZXhwci0+b3BubyksICZvcHByb2NzW2lkeF0pOworCisJ CS8qIEZJWE1FIHN0cmlwIHJlbGFiZWwgZXRjLiB0aGUgd2F5IGV4YW1pbmVfb3BjbGF1c2Vf YXJncyBkb2VzICovCisJCWV4cHIxID0gbGluaXRpYWwob3BleHByLT5hcmdzKTsKKwkJZXhw cjIgPSBsc2Vjb25kKG9wZXhwci0+YXJncyk7CisKKwkJLyogZGV0ZXJtaW5lIG9yZGVyIG9m IGNsYXVzZXMgKHJlbDEgb3AgcmVsMikgb3IgKHJlbDIgb3AgcmVsMSkgKi8KKwkJcmVsaWRz MSA9IHB1bGxfdmFybm9zKHJvb3QsIGV4cHIxKTsKKwkJcmVsaWRzMiA9IHB1bGxfdmFybm9z KHJvb3QsIGV4cHIyKTsKKworCQlpZiAoKGJtc19zaW5nbGV0b25fbWVtYmVyKHJlbGlkczEp ID09IHJlbDEtPnJlbGlkKSAmJgorCQkJKGJtc19zaW5nbGV0b25fbWVtYmVyKHJlbGlkczIp ID09IHJlbDItPnJlbGlkKSkKKwkJeworCQkJT2lkCQljb2xsaWQ7CisKKwkJCWluZGV4ZXMx W2lkeF0gPSBtY3ZfbWF0Y2hfZXhwcmVzc2lvbihleHByMSwKKwkJCQkJCQkJCQkJCSBzdGF0 MS0+a2V5cywgc3RhdDEtPmV4cHJzLAorCQkJCQkJCQkJCQkJICZjb2xsaWQpOworCQkJaW5k ZXhlczJbaWR4XSA9IG1jdl9tYXRjaF9leHByZXNzaW9uKGV4cHIyLAorCQkJCQkJCQkJCQkJ IHN0YXQyLT5rZXlzLCBzdGF0Mi0+ZXhwcnMsCisJCQkJCQkJCQkJCQkgJmNvbGxpZCk7CisJ CQlyZXZlcnNlW2lkeF0gPSBmYWxzZTsKKworCQkJZXhwcnMxID0gbGFwcGVuZChleHByczEs IGV4cHIxKTsKKwkJCWV4cHJzMiA9IGxhcHBlbmQoZXhwcnMyLCBleHByMik7CisJCX0KKwkJ ZWxzZSBpZiAoKGJtc19zaW5nbGV0b25fbWVtYmVyKHJlbGlkczIpID09IHJlbDEtPnJlbGlk KSAmJgorCQkJCSAoYm1zX3NpbmdsZXRvbl9tZW1iZXIocmVsaWRzMSkgPT0gcmVsMi0+cmVs aWQpKQorCQl7CisJCQlPaWQJCWNvbGxpZDsKKworCQkJaW5kZXhlczFbaWR4XSA9IG1jdl9t YXRjaF9leHByZXNzaW9uKGV4cHIyLAorCQkJCQkJCQkJCQkJIHN0YXQyLT5rZXlzLCBzdGF0 Mi0+ZXhwcnMsCisJCQkJCQkJCQkJCQkgJmNvbGxpZCk7CisJCQlpbmRleGVzMltpZHhdID0g bWN2X21hdGNoX2V4cHJlc3Npb24oZXhwcjEsCisJCQkJCQkJCQkJCQkgc3RhdDEtPmtleXMs IHN0YXQxLT5leHBycywKKwkJCQkJCQkJCQkJCSAmY29sbGlkKTsKKwkJCXJldmVyc2VbaWR4 XSA9IHRydWU7CisKKwkJCWV4cHJzMSA9IGxhcHBlbmQoZXhwcnMxLCBleHByMik7CisJCQll eHByczIgPSBsYXBwZW5kKGV4cHJzMiwgZXhwcjEpOworCQl9CisJCWVsc2UKKwkJCS8qIHNo b3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJCUFzc2VydChmYWxzZSk7CisKKwkJQXNzZXJ0KChp bmRleGVzMVtpZHhdID49IDApICYmCisJCQkgICAoaW5kZXhlczFbaWR4XSA8IGJtc19udW1f bWVtYmVycyhzdGF0MS0+a2V5cykgKyBsaXN0X2xlbmd0aChzdGF0MS0+ZXhwcnMpKSk7CisK KwkJQXNzZXJ0KChpbmRleGVzMltpZHhdID49IDApICYmCisJCQkgICAoaW5kZXhlczJbaWR4 XSA8IGJtc19udW1fbWVtYmVycyhzdGF0Mi0+a2V5cykgKyBsaXN0X2xlbmd0aChzdGF0Mi0+ ZXhwcnMpKSk7CisKKwkJaWR4Kys7CisJfQorCisJLyoKKwkgKiBNYXRjaCBpdGVtcyBiZXR3 ZWVuIHRoZSB0d28gTUNWIGxpc3RzLgorCSAqCisJICogV2UgZG9uJ3Qga25vdyBpZiB0aGUg am9pbiBjb25kaXRpb25zIG1hdGNoIGFsbCBhdHRyaWJ1dGVzIGluIHRoZSBNQ1YsIHRoZQor CSAqIG92ZXJsYXAgbWF5IGJlIGp1c3Qgb24gYSBzdWJzZXQgIG9mIGF0dHJpYnV0ZXMsIGUu Zy4gKGEsYixjKSB2cy4gKGIsYyxkKS4KKwkgKiBTbyB0aGVyZSBtYXkgYmUgbXVsdGlwbGUg bWF0Y2hlcyBvbiBlaXRoZXIgc2lkZS4gU28gd2UgY2FuJ3Qgb3B0aW1pemUgYnkKKwkgKiBh Ym9ydGluZyB0aGUgaW5uZXIgbG9vcCBhZnRlciB0aGUgZmlyc3QgbWF0Y2gsIGV0Yy4KKwkg KgorCSAqIFhYWCBXZSBjYW4gc2tpcCB0aGUgaXRlbXMgZWxpbWluYXRlZCBieSB0aGUgYmFz ZSByZXN0cmljdGlvbnMsIG9mIGNvdXJzZS4KKwkgKgorCSAqIFhYWCBXZSBtaWdodCBvcHRp bWl6ZSB0aGlzIGluIHR3byB3YXlzLiBXZSBtaWdodCBzb3J0IHRoZSBNQ1YgaXRlbXMgb24K KwkgKiBib3RoIHNpZGVzIHVzaW5nIHRoZSAiam9pbiIgYXR0cmlidXRlcywgYW5kIHRoZW4g cGVyZm9ybSBzb210aGluZyBsaWtlCisJICogbWVyZ2Ugam9pbi4gT3Igd2UgbWlnaHQgY2Fs Y3VsYXRlIGhhc2ggZnJvbSB0aGUgam9pbiBjb2x1bW5zLCBhbmQgdGhlbgorCSAqIGNvbXBh cmUgdGhpcyAodG8gZWxpbWluYXRlIG1vc3QgZXhwZW5zaXZlIGVxdWFsaXR5IGZ1bmN0aW9u cykuCisJICovCisJZm9yIChpID0gMDsgaSA8IG1jdjEtPm5pdGVtczsgaSsrKQorCXsKKwkJ Ym9vbAloYXNfbnVsbHM7CisKKwkJLyogc2tpcCBpdGVtcyBlbGltaW5hdGVkIGJ5IHJlc3Ry aWN0aW9ucyBvbiByZWwxICovCisJCWlmIChjbWF0Y2hlczEgJiYgIWNtYXRjaGVzMVtpXSkK KwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIENoZWNrIGlmIGFueSB2YWx1ZSBpbiB0aGUg Zmlyc3QgTUNWIGl0ZW0gaXMgTlVMTCwgYmVjYXVzZSBpdCdsbCBiZQorCQkgKiBtaXNtYXRj aCBhbnl3YXkuCisJCSAqCisJCSAqIFhYWCBUaGlzIG1pZ2h0IG5vdCB3b3JrIGZvciBzb21l IGpvaW4gY2xhdXNlcywgZS5nLiBJUyBOT1QgRElTVElOQ1QKKwkJICogRlJPTSwgYnV0IHRo b3NlIGFyZSBjdXJyZW50bHkgbm90IGNvbnNpZGVyZWQgY29tcGF0aWJsZSAod2Ugb25seQor CQkgKiBhbGxvdyBPcEV4cHIgYXQgdGhlIG1vbWVudCkuCisJCSAqLworCQloYXNfbnVsbHMg PSBmYWxzZTsKKwkJZm9yIChqID0gMDsgaiA8IGxpc3RfbGVuZ3RoKGNsYXVzZXMpOyBqKysp CisJCQloYXNfbnVsbHMgfD0gbWN2MS0+aXRlbXNbaV0uaXNudWxsW2luZGV4ZXMxW2pdXTsK KworCQlpZiAoaGFzX251bGxzKQorCQkJY29udGludWU7CisKKwkJLyogZmluZCBtYXRjaGVz IGluIHRoZSBzZWNvbmQgTUNWIGxpc3QgKi8KKwkJZm9yIChqID0gMDsgaiA8IG1jdjItPm5p dGVtczsgaisrKQorCQl7CisJCQlpbnQJCQlpZHg7CisJCQlib29sCQlpdGVtc19tYXRjaCA9 IHRydWU7CisKKwkJCS8qIHNraXAgaXRlbXMgZWxpbWluYXRlZCBieSByZXN0cmljdGlvbnMg b24gcmVsMiAqLworCQkJaWYgKGNtYXRjaGVzMiAmJiAhY21hdGNoZXMyW2pdKQorCQkJCWNv bnRpbnVlOworCisJCQkvKgorCQkJICogWFhYIFdlIGNhbid0IHNraXAgYmFzZWQgb24gZXhp c3RpbmcgbWF0Y2hlczIgdmFsdWUsIGJlY2F1c2UgdGhlcmUKKwkJCSAqIG1heSBiZSBkdXBs aWNhdGVzIGluIHRoZSBmaXJzdCBNQ1YuCisJCQkgKi8KKworCQkJLyoKKwkJCSAqIEV2YWx1 YXRlIGlmIGFsbCB0aGUgam9pbiBjbGF1c2VzIG1hdGNoIGJldHdlZW4gdGhlIHR3byBNQ1Yg aXRlbXMuCisJCQkgKgorCQkJICogWFhYIFdlIG1pZ2h0IG9wdGltaXplIHRoZSBvcmRlciBv ZiBldmFsdWF0aW9uLCB1c2luZyB0aGUgY29zdHMgb2YKKwkJCSAqIG9wZXJhdG9yIGZ1bmN0 aW9ucyBmb3IgaW5kaXZpZHVhbCBjb2x1bW5zLiBJdCBkb2VzIGRlcGVuZCBvbiB0aGUKKwkJ CSAqIG51bWJlciBvZiBkaXN0aW5jdCB2YWx1ZXMsIGV0Yy4KKwkJCSAqLworCQkJaWR4ID0g MDsKKwkJCWZvcmVhY2ggKGxjLCBjbGF1c2VzKQorCQkJeworCQkJCWJvb2wJbWF0Y2g7CisJ CQkJaW50CQlpbmRleDEgPSBpbmRleGVzMVtpZHhdLAorCQkJCQkJaW5kZXgyID0gaW5kZXhl czJbaWR4XTsKKwkJCQlEYXR1bQl2YWx1ZTEsCisJCQkJCQl2YWx1ZTI7CisJCQkJYm9vbAly ZXZlcnNlX2FyZ3MgPSByZXZlcnNlW2lkeF07CisKKwkJCQkvKiBJZiBlaXRoZXIgdmFsdWUg aXMgbnVsbCwgaXQncyBhIG1pc21hdGNoICovCisJCQkJaWYgKG1jdjItPml0ZW1zW2pdLmlz bnVsbFtpbmRleDJdKQorCQkJCQltYXRjaCA9IGZhbHNlOworCQkJCWVsc2UKKwkJCQl7CisJ CQkJCXZhbHVlMSA9IG1jdjEtPml0ZW1zW2ldLnZhbHVlc1tpbmRleDFdOworCQkJCQl2YWx1 ZTIgPSBtY3YyLT5pdGVtc1tqXS52YWx1ZXNbaW5kZXgyXTsKKworCQkJCQkvKgorCQkJCQkg KiBDYXJlZnVsIGFib3V0IG9yZGVyIG9mIHBhcmFtZXRlcnMuIEZvciBzYW1lLXR5cGUgZXF1 YWxpdHkKKwkJCQkJICogdGhhdCBzaG91bGQgbm90IG1hdHRlciwgYnV0IGVhc3kgZW5vdWdo LgorCQkJCQkgKgorCQkJCQkgKiBGSVhNRSBVc2UgYXBwcm9wcmlhdGUgY29sbGF0aW9uLgor CQkJCQkgKi8KKwkJCQkJaWYgKHJldmVyc2VfYXJncykKKwkJCQkJCW1hdGNoID0gRGF0dW1H ZXRCb29sKEZ1bmN0aW9uQ2FsbDJDb2xsKCZvcHByb2NzW2lkeF0sCisJCQkJCQkJCQkJCQkJ CQkgICBJbnZhbGlkT2lkLAorCQkJCQkJCQkJCQkJCQkJICAgdmFsdWUyLCB2YWx1ZTEpKTsK KwkJCQkJZWxzZQorCQkJCQkJbWF0Y2ggPSBEYXR1bUdldEJvb2woRnVuY3Rpb25DYWxsMkNv bGwoJm9wcHJvY3NbaWR4XSwKKwkJCQkJCQkJCQkJCQkJCSAgIEludmFsaWRPaWQsCisJCQkJ CQkJCQkJCQkJCQkgICB2YWx1ZTEsIHZhbHVlMikpOworCQkJCX0KKworCQkJCWl0ZW1zX21h dGNoICY9IG1hdGNoOworCisJCQkJaWYgKCFpdGVtc19tYXRjaCkKKwkJCQkJYnJlYWs7CisK KwkJCQlpZHgrKzsKKwkJCX0KKworCQkJaWYgKGl0ZW1zX21hdGNoKQorCQkJeworCQkJCS8q IFhYWCBEbyB3ZSBuZWVkIHRvIGRvIHNvbWV0aGluZyBhYm91dCBiYXNlIGZyZXF1ZW5jeT8g Ki8KKwkJCQltYXRjaGVzMVtpXSA9IG1hdGNoZXMyW2pdID0gdHJ1ZTsKKwkJCQlzICs9IG1j djEtPml0ZW1zW2ldLmZyZXF1ZW5jeSAqIG1jdjItPml0ZW1zW2pdLmZyZXF1ZW5jeTsKKwkJ CX0KKwkJfQorCX0KKworCW1hdGNoZnJlcTEgPSB1bm1hdGNoZnJlcTEgPSBtY3ZmcmVxMSA9 IDAuMDsKKwlmb3IgKGkgPSAwOyBpIDwgbWN2MS0+bml0ZW1zOyBpKyspCisJeworCQltY3Zm cmVxMSArPSBtY3YxLT5pdGVtc1tpXS5mcmVxdWVuY3k7CisKKwkJLyogaWdub3JlIE1DViBp dGVtcyBlbGltaW5hdGVkIGJ5IGJhc2VyZWwgY29uZGl0aW9ucyAqLworCQlpZiAoY21hdGNo ZXMxICYmICFjbWF0Y2hlczFbaV0pCisJCQljb250aW51ZTsKKworCQlpZiAobWF0Y2hlczFb aV0pCisJCQltYXRjaGZyZXExICs9IG1jdjEtPml0ZW1zW2ldLmZyZXF1ZW5jeTsKKwkJZWxz ZQorCQkJdW5tYXRjaGZyZXExICs9IG1jdjEtPml0ZW1zW2ldLmZyZXF1ZW5jeTsKKwl9CisK KwkvKiBub3QgcmVwcmVzZW50ZWQgYnkgdGhlIE1DViAqLworCW90aGVyZnJlcTEgPSAxLjAg LSBtY3ZmcmVxMTsKKworCW1hdGNoZnJlcTIgPSB1bm1hdGNoZnJlcTIgPSBtY3ZmcmVxMiA9 IDAuMDsKKwlmb3IgKGkgPSAwOyBpIDwgbWN2Mi0+bml0ZW1zOyBpKyspCisJeworCQltY3Zm cmVxMiArPSBtY3YyLT5pdGVtc1tpXS5mcmVxdWVuY3k7CisKKwkJLyogaWdub3JlIE1DViBp dGVtcyBlbGltaW5hdGVkIGJ5IGJhc2VyZWwgY29uZGl0aW9ucyAqLworCQlpZiAoY21hdGNo ZXMyICYmICFjbWF0Y2hlczJbaV0pCisJCQljb250aW51ZTsKKworCQlpZiAobWF0Y2hlczJb aV0pCisJCQltYXRjaGZyZXEyICs9IG1jdjItPml0ZW1zW2ldLmZyZXF1ZW5jeTsKKwkJZWxz ZQorCQkJdW5tYXRjaGZyZXEyICs9IG1jdjItPml0ZW1zW2ldLmZyZXF1ZW5jeTsKKwl9CisK KwkvKiBub3QgcmVwcmVzZW50ZWQgYnkgdGhlIE1DViAqLworCW90aGVyZnJlcTIgPSAxLjAg LSBtY3ZmcmVxMjsKKworCS8qCisJICogQ29ycmVjdGlvbiBmb3IgTUNWIHBhcnRzIGVsaW1p bmF0ZWQgYnkgdGhlIGNvbmRpdGlvbnMuCisJICoKKwkgKiBXZSBuZWVkIHRvIGJlIGNhcmVm dWwgYWJvdXQgY2FzZXMgd2hlcmUgY29uZGl0aW9ucyBlbGltaW5hdGVkIGFsbAorCSAqIHRo ZSBNQ1YgaXRlbXMuIFdlIG11c3Qgbm90IGRpdmlkZSBieSAwLjAsIGJlY2F1c2UgdGhhdCB3 b3VsZCBlaXRoZXIKKwkgKiBwcm9kdWNlIGJvZ3VzIHZhbHVlIG9yIHRyaWdnZXIgZGl2aXNp b24gYnkgemVyby4gSW5zdGVhZCB3ZSBzaW1wbHkKKwkgKiBzZXQgdGhlIHNlbGVjdGl2aXR5 IHRvIDAuMCwgYmVjYXVzZSB0aGVyZSBjYW4ndCBiZSBhbnkgbWF0Y2hlcy4KKwkgKi8KKwlp ZiAoKG1hdGNoZnJlcTEgKyB1bm1hdGNoZnJlcTEpID4gMCkKKwkJcyA9IHMgKiBtY3ZmcmVx MSAvIChtYXRjaGZyZXExICsgdW5tYXRjaGZyZXExKTsKKwllbHNlCisJCXMgPSAwLjA7CisK KwlpZiAoKG1hdGNoZnJlcTIgKyB1bm1hdGNoZnJlcTIpID4gMCkKKwkJcyA9IHMgKiBtY3Zm cmVxMiAvIChtYXRjaGZyZXEyICsgdW5tYXRjaGZyZXEyKTsKKwllbHNlCisJCXMgPSAwLjA7 CisKKwkvKiBjYWxjdWxhdGUgbmRpc3RpbmN0IGZvciB0aGUgZXhwcmVzc2lvbiBpbiBqb2lu IGNsYXVzZXMgZm9yIGVhY2ggcmVsICovCisJbmQxID0gZXN0aW1hdGVfbnVtX2dyb3Vwcyhy b290LCBleHByczEsIHJlbDEtPnJvd3MsIE5VTEwsIE5VTEwpOworCW5kMiA9IGVzdGltYXRl X251bV9ncm91cHMocm9vdCwgZXhwcnMyLCByZWwyLT5yb3dzLCBOVUxMLCBOVUxMKTsKKwor CS8qCisJICogQ29uc2lkZXIgdGhlIHBhcnQgb2YgdGhlIGRhdGEgbm90IHJlcHJlc2VudGVk IGJ5IHRoZSBNQ1YgbGlzdHMuCisJICoKKwkgKiBYWFggdGhpcyBpcyBhIGJpdCBib2d1cywg YmVjYXVzZSB3ZSBkb24ndCBrbm93IHdoYXQgZnJhY3Rpb24gb2YKKwkgKiBkaXN0aW5jdCBj b21iaW5hdGlvbnMgaXMgY292ZXJlZCBieSB0aGUgTUNWIGxpc3QgKHdlJ3JlIG9ubHkKKwkg KiBkZWFsaW5nIHdpdGggc29tZSBvZiB0aGUgY29sdW1ucyksIHNvIHdlIGNhbid0IHVzZSB0 aGUgc2FtZQorCSAqIGZvcm11bGFyIGFzIGVxam9pbnNlbF9pbm5lciBleGFjdGx5LiBXZSBq dXN0IHVzZSB0aGUgZXN0aW1hdGVzCisJICogZm9yIHRoZSB3aG9sZSB0YWJsZSAtIHRoaXMg aXMgbGlrZWx5IGFuIG92ZXJlc3RpbWF0ZSwgYmVjYXVzZQorCSAqIChhKSBpdGVtcyBtYXkg cmVwZWF0IGluIHRoZSBNQ1YgbGlzdCwgaWYgaXQgaGFzIG1vcmUgY29sdW1ucywKKwkgKiBh bmQgKGIpIHNvbWUgb2YgdGhlIGNvbWJpbmF0aW9ucyBtYXkgYmUgcHJlc2VudCBpbiBub24t TUNWIGRhdGEuCisJICoKKwkgKiBNb3Jlb3Zlciwgd2UgbmVlZCB0byBsb29rIGF0IHRoZSBj b25kaXRpb25zLiBGb3Igbm93IHdlIHNpbXBseQorCSAqIGFzc3VtZSB0aGUgY29uZGl0aW9u cyBhZmZlY3QgdGhlIGRpc3RpbmN0IGdyb3VwcywgYW5kIHVzZSB0aGF0LgorCSAqCisJICog WFhYIFdlIG1pZ2h0IGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0IGdyb3VwcyBp biB0aGUgTUNWLAorCSAqIGFuZCB0aGVuIHVzZSBzb21ldGhpbmcgYmV0d2VlbiAobmQxIC0g ZGlzdGluY3QoTUNWKSkgYW5kIChuZDEpLAorCSAqIHdoaWNoIGFyZSB0aGUgcG9zc2libGUg ZXh0cmVtZSB2YWx1ZXMsIGFzc3VtaW5nIHRoZSBlc3RpbWF0ZXMKKwkgKiBhcmUgYWNjdXJh dGUuIE1heWJlIG1lYW4gb3IgZ2VvbWV0cmljIG1lYW4gd291bGQgd29yaz8KKwkgKgorCSAq IFhYWCBOb3Qgc3VyZSBtdWx0aXBseWluZyBuZGlzdGluY3Qgd2l0aCBwcm9iYWJpbGl0aWVz IGlzIGdvb2QuCisJICogTWF5YmUgd2Ugc2hvdWxkIGRvIHNvbWV0aGluZyBtb3JlIGxpa2Ug ZXN0aW1hdGVfbnVtX2dyb3Vwcz8KKwkgKi8KKwluZDEgKj0gY3NlbDE7CisJbmQyICo9IGNz ZWwyOworCisJdG90YWxzZWwxID0gczsKKwl0b3RhbHNlbDEgKz0gdW5tYXRjaGZyZXExICog b3RoZXJmcmVxMiAvIG5kMjsKKwl0b3RhbHNlbDEgKz0gb3RoZXJmcmVxMSAqIChvdGhlcmZy ZXEyICsgdW5tYXRjaGZyZXEyKSAvIG5kMjsKKworLy8JaWYgKG5kMiA+IG1jdmItPm5pdGVt cykKKy8vCQl0b3RhbHNlbDEgKz0gdW5tYXRjaGZyZXExICogb3RoZXJmcmVxMiAvIChuZDIg LSBtY3ZiLT5uaXRlbXMpOworLy8JaWYgKG5kMiA+IG5tYXRjaGVzKQorLy8JCXRvdGFsc2Vs MSArPSBvdGhlcmZyZXExICogKG90aGVyZnJlcTIgKyB1bm1hdGNoZnJlcTIpIC8KKy8vCQkJ KG5kMiAtIG5tYXRjaGVzKTsKKworCXRvdGFsc2VsMiA9IHM7CisJdG90YWxzZWwyICs9IHVu bWF0Y2hmcmVxMiAqIG90aGVyZnJlcTEgLyBuZDE7CisJdG90YWxzZWwyICs9IG90aGVyZnJl cTIgKiAob3RoZXJmcmVxMSArIHVubWF0Y2hmcmVxMSkgLyBuZDE7CisKKy8vCWlmIChuZDEg PiBtY3ZhLT5uaXRlbXMpCisvLwkJdG90YWxzZWwyICs9IHVubWF0Y2hmcmVxMiAqIG90aGVy ZnJlcTEgLyAobmQxIC0gbWN2YS0+bml0ZW1zKTsKKy8vCWlmIChuZDEgPiBubWF0Y2hlcykK Ky8vCQl0b3RhbHNlbDIgKz0gb3RoZXJmcmVxMiAqIChvdGhlcmZyZXExICsgdW5tYXRjaGZy ZXExKSAvCisvLwkJCShuZDEgLSBubWF0Y2hlcyk7CisKKwlzID0gTWluKHRvdGFsc2VsMSwg dG90YWxzZWwyKTsKKworCXJldHVybiBzOworfQorCisKKy8qCisgKiBzdGF0ZXh0X2NvbXBh cmVfc2ltcGxlCisgKgkJQ2FsY3VsdGUgam9pbiBzZWxlY3Rpdml0eSB1c2luZyBhIGNvbWJp bmF0aW9uIG9mIGV4dGVuZGVkIHN0YXRpc3RpY3MKKyAqIE1DViBvbiBvbmUgc2lkZSwgYW5k IHNpbXBsZSBwZXItY29sdW1uIE1DViBvbiB0aGUgb3RoZXIuCisgKgorICogTW9zdCBvZiB0 aGUgbWN2X2NvbWJpbmVfZXh0ZW5kZWQgY29tbWVudCBhcHBsaWVzIGhlcmUgdG9vLCBidXQg d2UgY2FuIG1ha2UKKyAqIHNvbWUgc2ltcGxpZmljYXRpb25zIGJlY2F1c2Ugd2Uga25vdyB0 aGUgc2Vjb25kIChwZXItY29sdW1uKSBNQ1YgaXMgc2ltcGxlciwKKyAqIGNvbnRhaW5zIG5v IE5VTEwgb3IgZHVwbGljYXRlIHZhbHVlcywgZXRjLgorICovCitTZWxlY3Rpdml0eQorbWN2 X2NvbWJpbmVfc2ltcGxlKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsIFN0 YXRpc3RpY0V4dEluZm8gKnN0YXQsCisJCQkJICAgQXR0U3RhdHNTbG90ICpzc2xvdCwgZG91 YmxlIHN0YW51bGxmcmFjLCBkb3VibGUgbmQsCisJCQkJICAgYm9vbCBpc2RlZmF1bHQsIE5v ZGUgKmNsYXVzZSkKK3sKKwlNQ1ZMaXN0ICAgICptY3Y7CisJaW50CQkJaSwKKwkJCQlqOwor CVNlbGVjdGl2aXR5IHMgPSAwOworCisJLyogbWF0Y2ggYml0bWFwcyBhbmQgc2VsZWN0aXZp dHkgZm9yIGJhc2VyZWwgY29uZGl0aW9ucyAoaWYgYW55KSAqLworCUxpc3QgICAqY29uZGl0 aW9ucyA9IE5JTDsKKwlib29sICAgKmNtYXRjaGVzID0gTlVMTDsKKworCWRvdWJsZQljc2Vs ID0gMS4wOworCisJYm9vbCAgICptYXRjaGVzMSA9IE5VTEwsCisJCSAgICptYXRjaGVzMiA9 IE5VTEw7CisKKwkvKiBlc3RpbWF0ZXMgZm9yIHRoZSB0d28gc2lkZXMgKi8KKwlkb3VibGUJ bWF0Y2hmcmVxMSwKKwkJCXVubWF0Y2hmcmVxMSwKKwkJCW90aGVyZnJlcTEsCisJCQltY3Zm cmVxMSwKKwkJCW5kMSwKKwkJCXRvdGFsc2VsMTsKKworCWRvdWJsZSAJbWF0Y2hmcmVxMiwK KwkJCXVubWF0Y2hmcmVxMiwKKwkJCW90aGVyZnJlcTIsCisJCQltY3ZmcmVxMiwKKwkJCW5k MiwKKwkJCXRvdGFsc2VsMjsKKworCUxpc3QgICAqZXhwcnMxID0gTklMLAorCQkgICAqZXhw cnMyID0gTklMOworCisJLyogaW5mbyBhYm91dCBjbGF1c2VzIGFuZCBob3cgdGhleSBtYXRj aCB0byBNQ1Ygc3RhdHMgKi8KKwlGbWdySW5mbwlvcHByb2M7CisJaW50CQkJaW5kZXg7CisJ Ym9vbAkJcmV2ZXJzZTsKKworCS8qIHdlIHBpY2tlZCB0aGUgc3RhdHMgc28gdGhhdCB0aGV5 IGhhdmUgTUNWIGVuYWJsZWQgKi8KKwlBc3NlcnQoc3RhdC0+a2luZCA9IFNUQVRTX0VYVF9N Q1YpOworCisJbWN2ID0gc3RhdGV4dF9tY3ZfbG9hZChzdGF0LT5zdGF0T2lkKTsKKworCS8q IHNob3VsZCBvbmx5IGdldCBoZXJlIHdpdGggTUNWIG9uIGJvdGggc2lkZXMgKi8KKwlBc3Nl cnQobWN2KTsKKworCS8qIERldGVybWluZSB3aGljaCBiYXNlcmVsIGNsYXVzZXMgdG8gdXNl IGZvciBjb25kaXRpb25hbCBwcm9iYWJpbGl0eS4gKi8KKwljb25kaXRpb25zID0gc3RhdGV4 dF9kZXRlcm1pbmVfam9pbl9yZXN0cmljdGlvbnMocm9vdCwgcmVsLCBzdGF0KTsKKworCS8q CisJICogQ2FsY3VsYXRlIG1hdGNoIGJpdG1hcHMgZm9yIHJlc3RyaWN0aW9ucyBvbiBlaXRo ZXIgc2lkZSBvZiB0aGUgam9pbgorCSAqICh0aGVyZSBtYXkgYmUgbm9uZSwgaW4gd2hpY2gg Y2FzZSB0aGlzIHdpbGwgYmUgTlVMTCkuCisJICovCisJaWYgKGNvbmRpdGlvbnMpCisJewor CQljbWF0Y2hlcyA9IG1jdl9nZXRfbWF0Y2hfYml0bWFwKHJvb3QsIGNvbmRpdGlvbnMsCisJ CQkJCQkJCQkJIHN0YXQtPmtleXMsIHN0YXQtPmV4cHJzLAorCQkJCQkJCQkJCSBtY3YsIGZh bHNlKTsKKwkJY3NlbCA9IGNsYXVzZWxpc3Rfc2VsZWN0aXZpdHkocm9vdCwgY29uZGl0aW9u cywgcmVsLT5yZWxpZCwgMCwgTlVMTCk7CisJfQorCisJLyoKKwkgKiBNYXRjaCBiaXRtYXBz IGZvciBtYXRjaGVzIGJldHdlZW4gTUNWIGVsZW1lbnRzLiBCeSBkZWZhdWx0IHRoZXJlCisJ ICogYXJlIG5vIG1hdGNoZXMsIHNvIHdlIHNldCBhbGwgaXRlbXMgdG8gMC4KKwkgKi8KKwlt YXRjaGVzMSA9IChib29sICopIHBhbGxvYzAoc2l6ZW9mKGJvb2wpICogbWN2LT5uaXRlbXMp OworCisJLyogTWF0Y2hlcyBmb3IgdGhlIHNpZGUgd2l0aCBqdXN0IHJlZ3VsYXIgc2luZ2xl LWNvbHVtbiBNQ1YuICovCisJbWF0Y2hlczIgPSAoYm9vbCAqKSBwYWxsb2MwKHNpemVvZihi b29sKSAqIHNzbG90LT5udmFsdWVzKTsKKworCS8qCisJICogSW5pdGlhbGl6ZSBpbmZvcm1h dGlvbiBhYm91dCB0aGUgY2xhdXNlIGFuZCBob3cgaXQgbWF0Y2hlcyB0byB0aGUKKwkgKiBl eHRlbmRlZCBzdGF0cyB3ZSBwaWNrZWQuIFdlIGRvIHRoaXMgb25seSBvbmNlIGJlZm9yZSBw cm9jZXNzaW5nCisJICogdGhlIGxpc3RzLCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gZG8g dGhhdCBmb3IgZWFjaCBpdGVtIG9yIHNvLgorCSAqLworCXsKKwkJT3BFeHByCSAgICpvcGV4 cHI7CisJCU5vZGUJICAgKmV4cHIxLAorCQkJCSAgICpleHByMjsKKwkJQml0bWFwc2V0ICAq cmVsaWRzMSwKKwkJCQkgICAqcmVsaWRzMjsKKworCQkvKgorCQkgKiBTdHJpcCB0aGUgUmVz dHJpY3RJbmZvIG5vZGUsIGdldCB0aGUgYWN0dWFsIGNsYXVzZS4KKwkJICoKKwkJICogWFhY IE5vdCBzdXJlIGlmIHdlIG5lZWQgdG8gY2FyZSBhYm91dCByZW1vdmluZyBvdGhlciBub2Rl IHR5cGVzCisJCSAqIHRvbyAoZS5nLiBSZWxhYmVsVHlwZSBldGMuKS4gc3RhdGV4dF9pc19z dXBwb3J0ZWRfam9pbl9jbGF1c2UKKwkJICogbWF0Y2hlcyB0aGlzLCBidXQgbWF5YmUgd2Ug bmVlZCB0byByZWxheCBpdD8KKwkJICovCisJCWlmIChJc0EoY2xhdXNlLCBSZXN0cmljdElu Zm8pKQorCQkJY2xhdXNlID0gKE5vZGUgKikgKChSZXN0cmljdEluZm8gKikgY2xhdXNlKS0+ Y2xhdXNlOworCisJCW9wZXhwciA9IChPcEV4cHIgKikgY2xhdXNlOworCisJCS8qIE1ha2Ug c3VyZSB3ZSBoYXZlIHRoZSBleHBlY3RlZCBub2RlIHR5cGUuICovCisJCUFzc2VydChpc19v cGNsYXVzZShjbGF1c2UpKTsKKwkJQXNzZXJ0KGxpc3RfbGVuZ3RoKG9wZXhwci0+YXJncykg PT0gMik7CisKKwkJZm1ncl9pbmZvKGdldF9vcGNvZGUob3BleHByLT5vcG5vKSwgJm9wcHJv Yyk7CisKKwkJLyogRklYTUUgc3RyaXAgcmVsYWJlbCBldGMuIHRoZSB3YXkgZXhhbWluZV9v cGNsYXVzZV9hcmdzIGRvZXMgKi8KKwkJZXhwcjEgPSBsaW5pdGlhbChvcGV4cHItPmFyZ3Mp OworCQlleHByMiA9IGxzZWNvbmQob3BleHByLT5hcmdzKTsKKworCQkvKiBkZXRlcm1pbmUg b3JkZXIgb2YgY2xhdXNlcyAocmVsMSBvcCByZWwyKSBvciAocmVsMiBvcCByZWwxKSAqLwor CQlyZWxpZHMxID0gcHVsbF92YXJub3Mocm9vdCwgZXhwcjEpOworCQlyZWxpZHMyID0gcHVs bF92YXJub3Mocm9vdCwgZXhwcjIpOworCisJCWlmIChibXNfc2luZ2xldG9uX21lbWJlcihy ZWxpZHMxKSA9PSByZWwtPnJlbGlkKQorCQl7CisJCQlPaWQJCWNvbGxpZDsKKworCQkJaW5k ZXggPSBtY3ZfbWF0Y2hfZXhwcmVzc2lvbihleHByMSwgc3RhdC0+a2V5cywgc3RhdC0+ZXhw cnMsCisJCQkJCQkJCQkJICZjb2xsaWQpOworCQkJcmV2ZXJzZSA9IGZhbHNlOworCisJCQll eHByczEgPSBsYXBwZW5kKGV4cHJzMSwgZXhwcjEpOworCQkJZXhwcnMyID0gbGFwcGVuZChl eHByczIsIGV4cHIyKTsKKwkJfQorCQllbHNlIGlmIChibXNfc2luZ2xldG9uX21lbWJlcihy ZWxpZHMyKSA9PSByZWwtPnJlbGlkKQorCQl7CisJCQlPaWQJCWNvbGxpZDsKKworCQkJaW5k ZXggPSBtY3ZfbWF0Y2hfZXhwcmVzc2lvbihleHByMiwgc3RhdC0+a2V5cywgc3RhdC0+ZXhw cnMsCisJCQkJCQkJCQkJICZjb2xsaWQpOworCQkJcmV2ZXJzZSA9IHRydWU7CisKKwkJCWV4 cHJzMSA9IGxhcHBlbmQoZXhwcnMxLCBleHByMik7CisJCQlleHByczIgPSBsYXBwZW5kKGV4 cHJzMiwgZXhwcjEpOworCQl9CisJCWVsc2UKKwkJCS8qIHNob3VsZCBuZXZlciBoYXBwZW4g Ki8KKwkJCUFzc2VydChmYWxzZSk7CisKKwkJQXNzZXJ0KChpbmRleCA+PSAwKSAmJgorCQkJ ICAgKGluZGV4IDwgYm1zX251bV9tZW1iZXJzKHN0YXQtPmtleXMpICsgbGlzdF9sZW5ndGgo c3RhdC0+ZXhwcnMpKSk7CisJfQorCisJLyoKKwkgKiBNYXRjaCBpdGVtcyBiZXR3ZWVuIHRo ZSB0d28gTUNWIGxpc3RzLgorCSAqCisJICogV2UgZG9uJ3Qga25vdyBpZiB0aGUgam9pbiBj b25kaXRpb25zIG1hdGNoIGFsbCBhdHRyaWJ1dGVzIGluIHRoZSBNQ1YsIHRoZQorCSAqIG92 ZXJsYXAgbWF5IGJlIGp1c3Qgb24gYSBzdWJzZXQgIG9mIGF0dHJpYnV0ZXMsIGUuZy4gKGEs YixjKSB2cy4gKGIsYyxkKS4KKwkgKiBTbyB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgbWF0Y2hl cyBvbiBlaXRoZXIgc2lkZS4gU28gd2UgY2FuJ3Qgb3B0aW1pemUgYnkKKwkgKiBhYm9ydGlu ZyB0aGUgaW5uZXIgbG9vcCBhZnRlciB0aGUgZmlyc3QgbWF0Y2gsIGV0Yy4KKwkgKgorCSAq IFhYWCBXZSBjYW4gc2tpcCB0aGUgaXRlbXMgZWxpbWluYXRlZCBieSB0aGUgYmFzZSByZXN0 cmljdGlvbnMsIG9mIGNvdXJzZS4KKwkgKgorCSAqIFhYWCBXZSBtaWdodCBvcHRpbWl6ZSB0 aGlzIGluIHR3byB3YXlzLiBXZSBtaWdodCBzb3J0IHRoZSBNQ1YgaXRlbXMgb24KKwkgKiBi b3RoIHNpZGVzIHVzaW5nIHRoZSAiam9pbiIgYXR0cmlidXRlcywgYW5kIHRoZW4gcGVyZm9y bSBzb210aGluZyBsaWtlCisJICogbWVyZ2Ugam9pbi4gT3Igd2UgbWlnaHQgY2FsY3VsYXRl IGhhc2ggZnJvbSB0aGUgam9pbiBjb2x1bW5zLCBhbmQgdGhlbgorCSAqIGNvbXBhcmUgdGhp cyAodG8gZWxpbWluYXRlIG1vc3QgZXhwZW5zaXZlIGVxdWFsaXR5IGZ1bmN0aW9ucykuCisJ ICovCisJZm9yIChpID0gMDsgaSA8IG1jdi0+bml0ZW1zOyBpKyspCisJeworCQkvKiBza2lw IGl0ZW1zIGVsaW1pbmF0ZWQgYnkgcmVzdHJpY3Rpb25zIG9uIHJlbDEgKi8KKwkJaWYgKGNt YXRjaGVzICYmICFjbWF0Y2hlc1tpXSkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIFdl IGNhbiBjaGVjayBtY3YxLT5pdGVtc1tpXS5pc251bGxbaW5kZXgxXSBoZXJlLCBiZWNhdXNl IGl0J2xsIGJlIGEKKwkJICogbWlzbWF0Y2ggYW55d2F5ICh0aGUgc2ltcGxlIE1DViBkb2Vz IG5vdCBjb250YWluIE5VTExzKS4KKwkJICovCisJCWlmIChtY3YtPml0ZW1zW2ldLmlzbnVs bFtpbmRleF0pCisJCQljb250aW51ZTsKKworCQkvKiBmaW5kIG1hdGNoZXMgaW4gdGhlIHNl Y29uZCBNQ1YgbGlzdCAqLworCQlmb3IgKGogPSAwOyBqIDwgc3Nsb3QtPm52YWx1ZXM7IGor KykKKwkJeworCQkJYm9vbAltYXRjaDsKKwkJCURhdHVtCXZhbHVlMSA9IG1jdi0+aXRlbXNb aV0udmFsdWVzW2luZGV4XTsKKwkJCURhdHVtCXZhbHVlMiA9IHNzbG90LT52YWx1ZXNbal07 CisKKwkJCS8qCisJCQkgKiBFdmFsdWF0ZSB0aGUgam9pbiBjbGF1c2UgYmV0d2VlbiB0aGUg dHdvIE1DViBsaXN0cy4gV2UgZG9uJ3QKKwkJCSAqIG5lZWQgdG8gZGVhbCB3aXRoIE5VTEwg dmFsdWVzIGhlcmUgLSB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQgZm9yCisJCQkgKiBOVUxMIGlu IHRoZSBleHRlbmRlZCBzdGF0aXN0aWNzIGVhcmxpZXIsIGFuZCB0aGUgc2ltcGxlIE1DVgor CQkJICogZG9lcyBub3QgY29udGFpbiBOVUxMIHZhbHVlcy4KKwkJCSoKKwkJCSAqIENhcmVm dWwgYWJvdXQgb3JkZXIgb2YgcGFyYW1ldGVycy4gRm9yIHNhbWUtdHlwZSBlcXVhbGl0eQor CQkJICogdGhhdCBzaG91bGQgbm90IG1hdHRlciwgYnV0IGVhc3kgZW5vdWdoLgorCQkJICoK KwkJCSAqIEZJWE1FIFVzZSBhcHByb3ByaWF0ZSBjb2xsYXRpb24uCisJCQkgKi8KKwkJCWlm IChyZXZlcnNlKQorCQkJCW1hdGNoID0gRGF0dW1HZXRCb29sKEZ1bmN0aW9uQ2FsbDJDb2xs KCZvcHByb2MsCisJCQkJCQkJCQkJCQkJICAgSW52YWxpZE9pZCwKKwkJCQkJCQkJCQkJCQkg ICB2YWx1ZTIsIHZhbHVlMSkpOworCQkJZWxzZQorCQkJCW1hdGNoID0gRGF0dW1HZXRCb29s KEZ1bmN0aW9uQ2FsbDJDb2xsKCZvcHByb2MsCisJCQkJCQkJCQkJCQkJICAgSW52YWxpZE9p ZCwKKwkJCQkJCQkJCQkJCQkgICB2YWx1ZTEsIHZhbHVlMikpOworCisJCQlpZiAobWF0Y2gp CisJCQl7CisJCQkJLyogWFhYIERvIHdlIG5lZWQgdG8gZG8gc29tZXRoaW5nIGFib3V0IGJh c2UgZnJlcXVlbmN5PyAqLworCQkJCW1hdGNoZXMxW2ldID0gbWF0Y2hlczJbal0gPSB0cnVl OworCQkJCXMgKz0gbWN2LT5pdGVtc1tpXS5mcmVxdWVuY3kgKiBzc2xvdC0+bnVtYmVyc1tq XTsKKworCQkJCS8qCisJCQkJICogV2Uga25vdyB0aGVyZSBjYW4gYmUganVzdCBhIHNpbmds ZSBtYXRjaCBpbiB0aGUgcmVndWxhcgorCQkJCSAqIE1DViBsaXN0LCBzbyB3ZSBjYW4gYWJv cnQgdGhlIGlubmVyIGxvb3AuCisJCQkJICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9 CisKKwltYXRjaGZyZXExID0gdW5tYXRjaGZyZXExID0gbWN2ZnJlcTEgPSAwLjA7CisJZm9y IChpID0gMDsgaSA8IG1jdi0+bml0ZW1zOyBpKyspCisJeworCQltY3ZmcmVxMSArPSBtY3Yt Pml0ZW1zW2ldLmZyZXF1ZW5jeTsKKworCQkvKiBpZ25vcmUgTUNWIGl0ZW1zIGVsaW1pbmF0 ZWQgYnkgYmFzZXJlbCBjb25kaXRpb25zICovCisJCWlmIChjbWF0Y2hlcyAmJiAhY21hdGNo ZXNbaV0pCisJCQljb250aW51ZTsKKworCQlpZiAobWF0Y2hlczFbaV0pCisJCQltYXRjaGZy ZXExICs9IG1jdi0+aXRlbXNbaV0uZnJlcXVlbmN5OworCQllbHNlCisJCQl1bm1hdGNoZnJl cTEgKz0gbWN2LT5pdGVtc1tpXS5mcmVxdWVuY3k7CisJfQorCisJLyogbm90IHJlcHJlc2Vu dGVkIGJ5IHRoZSBNQ1YgKi8KKwlvdGhlcmZyZXExID0gMS4wIC0gbWN2ZnJlcTE7CisKKwlt YXRjaGZyZXEyID0gdW5tYXRjaGZyZXEyID0gbWN2ZnJlcTIgPSAwLjA7CisJZm9yIChpID0g MDsgaSA8IHNzbG90LT5udmFsdWVzOyBpKyspCisJeworCQltY3ZmcmVxMiArPSBzc2xvdC0+ bnVtYmVyc1tpXTsKKworCQlpZiAobWF0Y2hlczJbaV0pCisJCQltYXRjaGZyZXEyICs9IHNz bG90LT5udW1iZXJzW2ldOworCQllbHNlCisJCQl1bm1hdGNoZnJlcTIgKz0gc3Nsb3QtPm51 bWJlcnNbaV07CisJfQorCisJLyogbm90IHJlcHJlc2VudGVkIGJ5IHRoZSBNQ1YgKi8KKwlv dGhlcmZyZXEyID0gMS4wIC0gbWN2ZnJlcTI7CisKKwkvKgorCSAqIENvcnJlY3Rpb24gZm9y IE1DViBwYXJ0cyBlbGltaW5hdGVkIGJ5IHRoZSBjb25kaXRpb25zLgorCSAqCisJICogV2Ug bmVlZCB0byBiZSBjYXJlZnVsIGFib3V0IGNhc2VzIHdoZXJlIGNvbmRpdGlvbnMgZWxpbWlu YXRlZCBhbGwKKwkgKiB0aGUgTUNWIGl0ZW1zLiBXZSBtdXN0IG5vdCBkaXZpZGUgYnkgMC4w LCBiZWNhdXNlIHRoYXQgd291bGQgZWl0aGVyCisJICogcHJvZHVjZSBib2d1cyB2YWx1ZSBv ciB0cmlnZ2VyIGRpdmlzaW9uIGJ5IHplcm8uIEluc3RlYWQgd2Ugc2ltcGx5CisJICogc2V0 IHRoZSBzZWxlY3Rpdml0eSB0byAwLjAsIGJlY2F1c2UgdGhlcmUgY2FuJ3QgYmUgYW55IG1h dGNoZXMuCisJICovCisJaWYgKChtYXRjaGZyZXExICsgdW5tYXRjaGZyZXExKSA+IDApCisJ CXMgPSBzICogbWN2ZnJlcTEgLyAobWF0Y2hmcmVxMSArIHVubWF0Y2hmcmVxMSk7CisJZWxz ZQorCQlzID0gMC4wOworCisJaWYgKChtYXRjaGZyZXEyICsgdW5tYXRjaGZyZXEyKSA+IDAp CisJCXMgPSBzICogbWN2ZnJlcTIgLyAobWF0Y2hmcmVxMiArIHVubWF0Y2hmcmVxMik7CisJ ZWxzZQorCQlzID0gMC4wOworCisJLyogY2FsY3VsYXRlIG5kaXN0aW5jdCBmb3IgdGhlIGV4 cHJlc3Npb24gaW4gam9pbiBjbGF1c2VzIGZvciBlYWNoIHJlbCAqLworCW5kMSA9IGVzdGlt YXRlX251bV9ncm91cHMocm9vdCwgZXhwcnMxLCByZWwtPnJvd3MsIE5VTEwsIE5VTEwpOwor CW5kMiA9IG5kOworCisJLyoKKwkgKiBDb25zaWRlciB0aGUgcGFydCBvZiB0aGUgZGF0YSBu b3QgcmVwcmVzZW50ZWQgYnkgdGhlIE1DViBsaXN0cy4KKwkgKgorCSAqIFhYWCB0aGlzIGlz IGEgYml0IGJvZ3VzLCBiZWNhdXNlIHdlIGRvbid0IGtub3cgd2hhdCBmcmFjdGlvbiBvZgor CSAqIGRpc3RpbmN0IGNvbWJpbmF0aW9ucyBpcyBjb3ZlcmVkIGJ5IHRoZSBNQ1YgbGlzdCAo d2UncmUgb25seQorCSAqIGRlYWxpbmcgd2l0aCBzb21lIG9mIHRoZSBjb2x1bW5zKSwgc28g d2UgY2FuJ3QgdXNlIHRoZSBzYW1lCisJICogZm9ybXVsYXIgYXMgZXFqb2luc2VsX2lubmVy IGV4YWN0bHkuIFdlIGp1c3QgdXNlIHRoZSBlc3RpbWF0ZXMKKwkgKiBmb3IgdGhlIHdob2xl IHRhYmxlIC0gdGhpcyBpcyBsaWtlbHkgYW4gb3ZlcmVzdGltYXRlLCBiZWNhdXNlCisJICog KGEpIGl0ZW1zIG1heSByZXBlYXQgaW4gdGhlIE1DViBsaXN0LCBpZiBpdCBoYXMgbW9yZSBj b2x1bW5zLAorCSAqIGFuZCAoYikgc29tZSBvZiB0aGUgY29tYmluYXRpb25zIG1heSBiZSBw cmVzZW50IGluIG5vbi1NQ1YgZGF0YS4KKwkgKgorCSAqIE1vcmVvdmVyLCB3ZSBuZWVkIHRv IGxvb2sgYXQgdGhlIGNvbmRpdGlvbnMuIEZvciBub3cgd2Ugc2ltcGx5CisJICogYXNzdW1l IHRoZSBjb25kaXRpb25zIGFmZmVjdCB0aGUgZGlzdGluY3QgZ3JvdXBzLCBhbmQgdXNlIHRo YXQuCisJICoKKwkgKiBYWFggV2UgbWlnaHQgY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgZGlz dGluY3QgZ3JvdXBzIGluIHRoZSBNQ1YsCisJICogYW5kIHRoZW4gdXNlIHNvbWV0aGluZyBi ZXR3ZWVuIChuZDEgLSBkaXN0aW5jdChNQ1YpKSBhbmQgKG5kMSksCisJICogd2hpY2ggYXJl IHRoZSBwb3NzaWJsZSBleHRyZW1lIHZhbHVlcywgYXNzdW1pbmcgdGhlIGVzdGltYXRlcwor CSAqIGFyZSBhY2N1cmF0ZS4gTWF5YmUgbWVhbiBvciBnZW9tZXRyaWMgbWVhbiB3b3VsZCB3 b3JrPworCSAqCisJICogWFhYIE5vdCBzdXJlIG11bHRpcGx5aW5nIG5kaXN0aW5jdCB3aXRo IHByb2JhYmlsaXRpZXMgaXMgZ29vZC4KKwkgKiBNYXliZSB3ZSBzaG91bGQgZG8gc29tZXRo aW5nIG1vcmUgbGlrZSBlc3RpbWF0ZV9udW1fZ3JvdXBzPworCSAqLworCW5kMSAqPSBjc2Vs OworCisJdG90YWxzZWwxID0gczsKKwl0b3RhbHNlbDEgKz0gdW5tYXRjaGZyZXExICogb3Ro ZXJmcmVxMiAvIG5kMjsKKwl0b3RhbHNlbDEgKz0gb3RoZXJmcmVxMSAqIChvdGhlcmZyZXEy ICsgdW5tYXRjaGZyZXEyKSAvIG5kMjsKKworLy8JaWYgKG5kMiA+IG1jdmItPm5pdGVtcykK Ky8vCQl0b3RhbHNlbDEgKz0gdW5tYXRjaGZyZXExICogb3RoZXJmcmVxMiAvIChuZDIgLSBt Y3ZiLT5uaXRlbXMpOworLy8JaWYgKG5kMiA+IG5tYXRjaGVzKQorLy8JCXRvdGFsc2VsMSAr PSBvdGhlcmZyZXExICogKG90aGVyZnJlcTIgKyB1bm1hdGNoZnJlcTIpIC8KKy8vCQkJKG5k MiAtIG5tYXRjaGVzKTsKKworCXRvdGFsc2VsMiA9IHM7CisJdG90YWxzZWwyICs9IHVubWF0 Y2hmcmVxMiAqIG90aGVyZnJlcTEgLyBuZDE7CisJdG90YWxzZWwyICs9IG90aGVyZnJlcTIg KiAob3RoZXJmcmVxMSArIHVubWF0Y2hmcmVxMSkgLyBuZDE7CisKKy8vCWlmIChuZDEgPiBt Y3ZhLT5uaXRlbXMpCisvLwkJdG90YWxzZWwyICs9IHVubWF0Y2hmcmVxMiAqIG90aGVyZnJl cTEgLyAobmQxIC0gbWN2YS0+bml0ZW1zKTsKKy8vCWlmIChuZDEgPiBubWF0Y2hlcykKKy8v CQl0b3RhbHNlbDIgKz0gb3RoZXJmcmVxMiAqIChvdGhlcmZyZXExICsgdW5tYXRjaGZyZXEx KSAvCisvLwkJCShuZDEgLSBubWF0Y2hlcyk7CisKKwlzID0gTWluKHRvdGFsc2VsMSwgdG90 YWxzZWwyKTsKKworCXJldHVybiBzOworfQpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvc3Rh dGlzdGljcy9leHRlbmRlZF9zdGF0c19pbnRlcm5hbC5oIGIvc3JjL2luY2x1ZGUvc3RhdGlz dGljcy9leHRlbmRlZF9zdGF0c19pbnRlcm5hbC5oCmluZGV4IDU1Y2Q5MjUyYTUuLjFlNTFj NTRmZWYgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3N0YXRpc3RpY3MvZXh0ZW5kZWRfc3Rh dHNfaW50ZXJuYWwuaAorKysgYi9zcmMvaW5jbHVkZS9zdGF0aXN0aWNzL2V4dGVuZGVkX3N0 YXRzX2ludGVybmFsLmgKQEAgLTE1LDYgKzE1LDcgQEAKICNkZWZpbmUgRVhURU5ERURfU1RB VFNfSU5URVJOQUxfSAogCiAjaW5jbHVkZSAic3RhdGlzdGljcy9zdGF0aXN0aWNzLmgiCisj aW5jbHVkZSAidXRpbHMvbHN5c2NhY2hlLmgiCiAjaW5jbHVkZSAidXRpbHMvc29ydHN1cHBv cnQuaCIKIAogdHlwZWRlZiBzdHJ1Y3QKQEAgLTEyNyw0ICsxMjgsMjMgQEAgZXh0ZXJuIFNl bGVjdGl2aXR5IG1jdl9jbGF1c2Vfc2VsZWN0aXZpdHlfb3IoUGxhbm5lckluZm8gKnJvb3Qs CiAJCQkJCQkJCQkJCSBTZWxlY3Rpdml0eSAqb3ZlcmxhcF9iYXNlc2VsLAogCQkJCQkJCQkJ CQkgU2VsZWN0aXZpdHkgKnRvdGFsc2VsKTsKIAorZXh0ZXJuIFNlbGVjdGl2aXR5IG1jdl9j b21iaW5lX3NpbXBsZShQbGFubmVySW5mbyAqcm9vdCwKKwkJCQkJCQkJCSAgUmVsT3B0SW5m byAqcmVsLAorCQkJCQkJCQkJICBTdGF0aXN0aWNFeHRJbmZvICpzdGF0LAorCQkJCQkJCQkJ ICBBdHRTdGF0c1Nsb3QgKnNzbG90LAorCQkJCQkJCQkJICBkb3VibGUgc3RhbnVsbGZyYWMs CisJCQkJCQkJCQkgIGRvdWJsZSBuZCwgYm9vbCBpc2RlZmF1bHQsCisJCQkJCQkJCQkgIE5v ZGUgKmNsYXVzZSk7CisKK2V4dGVybiBTZWxlY3Rpdml0eSBtY3ZfY29tYmluZV9leHRlbmRl ZChQbGFubmVySW5mbyAqcm9vdCwKKwkJCQkJCQkJCQlSZWxPcHRJbmZvICpyZWwxLAorCQkJ CQkJCQkJCVJlbE9wdEluZm8gKnJlbDIsCisJCQkJCQkJCQkJU3RhdGlzdGljRXh0SW5mbyAq c3RhdDEsCisJCQkJCQkJCQkJU3RhdGlzdGljRXh0SW5mbyAqc3RhdDIsCisJCQkJCQkJCQkJ TGlzdCAqY2xhdXNlcyk7CisKK2V4dGVybiBMaXN0ICpzdGF0ZXh0X2RldGVybWluZV9qb2lu X3Jlc3RyaWN0aW9ucyhQbGFubmVySW5mbyAqcm9vdCwKKwkJCQkJCQkJCQkJCSBSZWxPcHRJ bmZvICpyZWwsCisJCQkJCQkJCQkJCQkgU3RhdGlzdGljRXh0SW5mbyAqaW5mbyk7CisKICNl bmRpZgkJCQkJCQkvKiBFWFRFTkRFRF9TVEFUU19JTlRFUk5BTF9IICovCmRpZmYgLS1naXQg YS9zcmMvaW5jbHVkZS9zdGF0aXN0aWNzL3N0YXRpc3RpY3MuaCBiL3NyYy9pbmNsdWRlL3N0 YXRpc3RpY3Mvc3RhdGlzdGljcy5oCmluZGV4IDMyNmNmMjZmZWEuLjRiZjI3MjQwZjYgMTAw NjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3N0YXRpc3RpY3Mvc3RhdGlzdGljcy5oCisrKyBiL3Ny Yy9pbmNsdWRlL3N0YXRpc3RpY3Mvc3RhdGlzdGljcy5oCkBAIC0xMjYsNCArMTI2LDE2IEBA IGV4dGVybiBTdGF0aXN0aWNFeHRJbmZvICpjaG9vc2VfYmVzdF9zdGF0aXN0aWNzKExpc3Qg KnN0YXRzLCBjaGFyIHJlcXVpcmVka2luZCwKIAkJCQkJCQkJCQkJCWludCBuY2xhdXNlcyk7 CiBleHRlcm4gSGVhcFR1cGxlIHN0YXRleHRfZXhwcmVzc2lvbnNfbG9hZChPaWQgc3R4b2lk LCBpbnQgaWR4KTsKIAorZXh0ZXJuIFN0YXRpc3RpY0V4dEluZm8gKnN0YXRleHRfZmluZF9t YXRjaGluZ19tY3YoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKKwkJCQkJ CQkJCQkgICBCaXRtYXBzZXQgKmF0dG51bXMsIExpc3QgKmV4cHJzKTsKKworZXh0ZXJuIGJv b2wgc3RhdGV4dF90cnlfam9pbl9lc3RpbWF0ZXMoUGxhbm5lckluZm8gKnJvb3QsIExpc3Qg KmNsYXVzZXMsIGludCB2YXJSZWxpZCwKKwkJCQkJCQkJCSAgIEpvaW5UeXBlIGpvaW50eXBl LCBTcGVjaWFsSm9pbkluZm8gKnNqaW5mbywKKwkJCQkJCQkJCSAgIEJpdG1hcHNldCAqZXN0 aW1hdGVkY2xhdXNlcyk7CisKK2V4dGVybiBTZWxlY3Rpdml0eSBzdGF0ZXh0X2NsYXVzZWxp c3Rfam9pbl9zZWxlY3Rpdml0eShQbGFubmVySW5mbyAqcm9vdCwgTGlzdCAqY2xhdXNlcywK KwkJCQkJCQkJCQkJCQkgICBpbnQgdmFyUmVsaWQsCisJCQkJCQkJCQkJCQkJICAgSm9pblR5 cGUgam9pbnR5cGUsIFNwZWNpYWxKb2luSW5mbyAqc2ppbmZvLAorCQkJCQkJCQkJCQkJCSAg IEJpdG1hcHNldCAqKmVzdGltYXRlZGNsYXVzZXMpOworCiAjZW5kaWYJCQkJCQkJLyogU1RB VElTVElDU19IICovCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N0 YXRzX2V4dC5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N0YXRzX2V4dC5vdXQK aW5kZXggYzYwYmE0NWFiYS4uODg0NmQ1NWMyMyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVn cmVzcy9leHBlY3RlZC9zdGF0c19leHQub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhw ZWN0ZWQvc3RhdHNfZXh0Lm91dApAQCAtMjk3NCw2ICsyOTc0LDE3MyBAQCBTRUxFQ1QgYzAg RlJPTSBPTkxZIGV4cHJfc3RhdHNfaW5jb21wYXRpYmxlX3Rlc3QgV0hFUkUKICgwIHJvd3Mp CiAKIERST1AgVEFCTEUgZXhwcl9zdGF0c19pbmNvbXBhdGlibGVfdGVzdDsKKy0tIFRlc3Qg am9pbiBlc3RpbWF0ZXMuCitDUkVBVEUgVEFCTEUgam9pbl90ZXN0XzEgKGEgaW50LCBiIGlu dCwgYyBpbnQpOworQ1JFQVRFIFRBQkxFIGpvaW5fdGVzdF8yIChhIGludCwgYiBpbnQsIGMg aW50KTsKK0lOU0VSVCBJTlRPIGpvaW5fdGVzdF8xIFNFTEVDVCBtb2QoaSwxMCksIG1vZChp LDEwKSwgbW9kKGksMTApIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsMTAwMCkgcyhpKTsKK0lO U0VSVCBJTlRPIGpvaW5fdGVzdF8yIFNFTEVDVCBtb2QoaSwxMCksIG1vZChpLDEwKSwgbW9k KGksMTApIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsMTAwMCkgcyhpKTsKK0FOQUxZWkUgam9p bl90ZXN0XzE7CitBTkFMWVpFIGpvaW5fdGVzdF8yOworU0VMRUNUICogRlJPTSBjaGVja19l c3RpbWF0ZWRfcm93cygnc2VsZWN0ICogZnJvbSBqb2luX3Rlc3RfMSBqMSBqb2luIGpvaW5f dGVzdF8yIGoyIG9uICgoajEuYSArIDEgPSBqMi5hICsgMSkgYW5kIChqMS5iID0gajIuYikp Jyk7CisgZXN0aW1hdGVkIHwgYWN0dWFsIAorLS0tLS0tLS0tLS0rLS0tLS0tLS0KKyAgICAg ICA1MDAgfCAxMDAwMDAKKygxIHJvdykKKworU0VMRUNUICogRlJPTSBjaGVja19lc3RpbWF0 ZWRfcm93cygnc2VsZWN0ICogZnJvbSBqb2luX3Rlc3RfMSBqMSBqb2luIGpvaW5fdGVzdF8y IGoyIG9uICgoajEuYSArIDEgPSBqMi5hICsgMSkgYW5kIChqMS5iID0gajIuYikpIHdoZXJl IGoxLmMgPCA1Jyk7CisgZXN0aW1hdGVkIHwgYWN0dWFsIAorLS0tLS0tLS0tLS0rLS0tLS0t LS0KKyAgICAgICAyNTAgfCAgNTAwMDAKKygxIHJvdykKKworU0VMRUNUICogRlJPTSBjaGVj a19lc3RpbWF0ZWRfcm93cygnc2VsZWN0ICogZnJvbSBqb2luX3Rlc3RfMSBqMSBqb2luIGpv aW5fdGVzdF8yIGoyIG9uICgoajEuYSArIDEgPSBqMi5hICsgMSkgYW5kIChqMS5iID0gajIu YikpIHdoZXJlIGoxLmMgPCAwJyk7CisgZXN0aW1hdGVkIHwgYWN0dWFsIAorLS0tLS0tLS0t LS0rLS0tLS0tLS0KKyAgICAgICAgIDEgfCAgICAgIDAKKygxIHJvdykKKworU0VMRUNUICog RlJPTSBjaGVja19lc3RpbWF0ZWRfcm93cygnc2VsZWN0ICogZnJvbSBqb2luX3Rlc3RfMSBq MSBqb2luIGpvaW5fdGVzdF8yIGoyIG9uICgoajEuYSArIDEgPSBqMi5hICsgMSkgYW5kIChq MS5iID0gajIuYikpIHdoZXJlIGoxLmMgPCA1IGFuZCBqMi5jIDwgMycpOworIGVzdGltYXRl ZCB8IGFjdHVhbCAKKy0tLS0tLS0tLS0tKy0tLS0tLS0tCisgICAgICAgIDc1IHwgIDMwMDAw CisoMSByb3cpCisKK1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1hdGVkX3Jvd3MoJ3NlbGVj dCAqIGZyb20gam9pbl90ZXN0XzEgajEgam9pbiBqb2luX3Rlc3RfMiBqMiBvbiAoKGoxLmEg KyAxID0gajIuYSArIDEpIGFuZCAoajEuYiA9IGoyLmIpKSB3aGVyZSBqMS5jIDwgNSBhbmQg ajIuYyA+IDUnKTsKKyBlc3RpbWF0ZWQgfCBhY3R1YWwgCistLS0tLS0tLS0tLSstLS0tLS0t LQorICAgICAgIDEwMCB8ICAgICAgMAorKDEgcm93KQorCistLSBjYW4ndCBiZSBpbXByb3Zl ZCBkdWUgdG8gdGhlIG9wdGltaXphdGlvbiBpbiBjbGF1c2VsaXN0X3NlbGVjdGl2aXR5X2V4 dCwKKy0tIHdoaWNoIHNraXBzIGNhc2VzIHdpdGggYSBzaW5nbGUgKGpvaW4pIGNsYXVzZQor U0VMRUNUICogRlJPTSBjaGVja19lc3RpbWF0ZWRfcm93cygnc2VsZWN0ICogZnJvbSBqb2lu X3Rlc3RfMSBqMSBqb2luIGpvaW5fdGVzdF8yIGoyIG9uICgoajEuYSArIDEgPSBqMi5hICsg MSkpIHdoZXJlIGoxLmMgPCA1Jyk7CisgZXN0aW1hdGVkIHwgYWN0dWFsIAorLS0tLS0tLS0t LS0rLS0tLS0tLS0KKyAgICAgIDI1MDAgfCAgNTAwMDAKKygxIHJvdykKKworU0VMRUNUICog RlJPTSBjaGVja19lc3RpbWF0ZWRfcm93cygnc2VsZWN0ICogZnJvbSBqb2luX3Rlc3RfMSBq MSBqb2luIGpvaW5fdGVzdF8yIGoyIG9uICgoajEuYSArIDEgPSBqMi5hICsgMSkpIHdoZXJl IGoxLmMgPCA1IGFuZCBqMi5jIDwgNScpOworIGVzdGltYXRlZCB8IGFjdHVhbCAKKy0tLS0t LS0tLS0tKy0tLS0tLS0tCisgICAgICAxMjUwIHwgIDUwMDAwCisoMSByb3cpCisKK1NFTEVD VCAqIEZST00gY2hlY2tfZXN0aW1hdGVkX3Jvd3MoJ3NlbGVjdCAqIGZyb20gam9pbl90ZXN0 XzEgajEgam9pbiBqb2luX3Rlc3RfMiBqMiBvbiAoKGoxLmEgKyAxID0gajIuYSArIDEpKSB3 aGVyZSBqMS5jIDwgNSBhbmQgajIuYyA+IDUnKTsKKyBlc3RpbWF0ZWQgfCBhY3R1YWwgCist LS0tLS0tLS0tLSstLS0tLS0tLQorICAgICAgMTAwMCB8ICAgICAgMAorKDEgcm93KQorCitT RUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dzKCdzZWxlY3QgKiBmcm9tIGpvaW5f dGVzdF8xIGoxIGpvaW4gam9pbl90ZXN0XzIgajIgb24gKGoxLmEgKyAxID0gajIuYSkgd2hl cmUgajEuYyA8IDUnKTsKKyBlc3RpbWF0ZWQgfCBhY3R1YWwgCistLS0tLS0tLS0tLSstLS0t LS0tLQorICAgICAgMjUwMCB8ICA1MDAwMAorKDEgcm93KQorCitTRUxFQ1QgKiBGUk9NIGNo ZWNrX2VzdGltYXRlZF9yb3dzKCdzZWxlY3QgKiBmcm9tIGpvaW5fdGVzdF8xIGoxIGpvaW4g am9pbl90ZXN0XzIgajIgb24gKGoxLmEgKyAxID0gajIuYSArIDEpIHdoZXJlIGoxLmMgPCA1 Jyk7CisgZXN0aW1hdGVkIHwgYWN0dWFsIAorLS0tLS0tLS0tLS0rLS0tLS0tLS0KKyAgICAg IDI1MDAgfCAgNTAwMDAKKygxIHJvdykKKworLS0gY3JlYXRlIGV4dGVuZGVkIHN0YXRpc3Rp Y3Mgb24gdGhlIGpvaW4vd2hlcmUgY29sdW1ucworQ1JFQVRFIFNUQVRJU1RJQ1Mgam9pbl9z dGF0c18xIE9OIGEsIGIsIGMsIChhKzEpLCAoYisxKSBGUk9NIGpvaW5fdGVzdF8xOworQ1JF QVRFIFNUQVRJU1RJQ1Mgam9pbl9zdGF0c18yIE9OIGEsIGIsIGMsIChhKzEpLCAoYisxKSBG Uk9NIGpvaW5fdGVzdF8yOworQU5BTFlaRSBqb2luX3Rlc3RfMTsKK0FOQUxZWkUgam9pbl90 ZXN0XzI7CitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dzKCdzZWxlY3QgKiBm cm9tIGpvaW5fdGVzdF8xIGoxIGpvaW4gam9pbl90ZXN0XzIgajIgb24gKChqMS5hICsgMSA9 IGoyLmEgKyAxKSBhbmQgKGoxLmIgPSBqMi5iKSknKTsKKyBlc3RpbWF0ZWQgfCBhY3R1YWwg CistLS0tLS0tLS0tLSstLS0tLS0tLQorICAgIDEwMDAwMCB8IDEwMDAwMAorKDEgcm93KQor CitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dzKCdzZWxlY3QgKiBmcm9tIGpv aW5fdGVzdF8xIGoxIGpvaW4gam9pbl90ZXN0XzIgajIgb24gKChqMS5hICsgMSA9IGoyLmEg KyAxKSBhbmQgKGoxLmIgPSBqMi5iKSkgd2hlcmUgajEuYyA8IDUnKTsKKyBlc3RpbWF0ZWQg fCBhY3R1YWwgCistLS0tLS0tLS0tLSstLS0tLS0tLQorICAgICA1MDAwMCB8ICA1MDAwMAor KDEgcm93KQorCitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dzKCdzZWxlY3Qg KiBmcm9tIGpvaW5fdGVzdF8xIGoxIGpvaW4gam9pbl90ZXN0XzIgajIgb24gKChqMS5hICsg MSA9IGoyLmEgKyAxKSBhbmQgKGoxLmIgPSBqMi5iKSkgd2hlcmUgajEuYyA8IDAnKTsKKyBl c3RpbWF0ZWQgfCBhY3R1YWwgCistLS0tLS0tLS0tLSstLS0tLS0tLQorICAgICAgICAgMSB8 ICAgICAgMAorKDEgcm93KQorCitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dz KCdzZWxlY3QgKiBmcm9tIGpvaW5fdGVzdF8xIGoxIGpvaW4gam9pbl90ZXN0XzIgajIgb24g KChqMS5hICsgMSA9IGoyLmEgKyAxKSBhbmQgKGoxLmIgPSBqMi5iKSkgd2hlcmUgajEuYyA8 IDUgYW5kIGoyLmMgPCAzJyk7CisgZXN0aW1hdGVkIHwgYWN0dWFsIAorLS0tLS0tLS0tLS0r LS0tLS0tLS0KKyAgICAgMzAwMDAgfCAgMzAwMDAKKygxIHJvdykKKworU0VMRUNUICogRlJP TSBjaGVja19lc3RpbWF0ZWRfcm93cygnc2VsZWN0ICogZnJvbSBqb2luX3Rlc3RfMSBqMSBq b2luIGpvaW5fdGVzdF8yIGoyIG9uICgoajEuYSArIDEgPSBqMi5hICsgMSkgYW5kIChqMS5i ID0gajIuYikpIHdoZXJlIGoxLmMgPCA1IGFuZCBqMi5jID4gNScpOworIGVzdGltYXRlZCB8 IGFjdHVhbCAKKy0tLS0tLS0tLS0tKy0tLS0tLS0tCisgICAgICAgICAxIHwgICAgICAwCiso MSByb3cpCisKKy0tIGNhbid0IGJlIGltcHJvdmVkIGR1ZSB0byB0aGUgb3B0aW1pemF0aW9u IGluIGNsYXVzZWxpc3Rfc2VsZWN0aXZpdHlfZXh0LAorLS0gd2hpY2ggc2tpcHMgY2FzZXMg d2l0aCBhIHNpbmdsZSAoam9pbikgY2xhdXNlCitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGlt YXRlZF9yb3dzKCdzZWxlY3QgKiBmcm9tIGpvaW5fdGVzdF8xIGoxIGpvaW4gam9pbl90ZXN0 XzIgajIgb24gKChqMS5hICsgMSA9IGoyLmEgKyAxKSkgd2hlcmUgajEuYyA8IDUnKTsKKyBl c3RpbWF0ZWQgfCBhY3R1YWwgCistLS0tLS0tLS0tLSstLS0tLS0tLQorICAgICA1MDAwMCB8 ICA1MDAwMAorKDEgcm93KQorCitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dz KCdzZWxlY3QgKiBmcm9tIGpvaW5fdGVzdF8xIGoxIGpvaW4gam9pbl90ZXN0XzIgajIgb24g KChqMS5hICsgMSA9IGoyLmEgKyAxKSkgd2hlcmUgajEuYyA8IDUgYW5kIGoyLmMgPCA1Jyk7 CisgZXN0aW1hdGVkIHwgYWN0dWFsIAorLS0tLS0tLS0tLS0rLS0tLS0tLS0KKyAgICAgNTAw MDAgfCAgNTAwMDAKKygxIHJvdykKKworU0VMRUNUICogRlJPTSBjaGVja19lc3RpbWF0ZWRf cm93cygnc2VsZWN0ICogZnJvbSBqb2luX3Rlc3RfMSBqMSBqb2luIGpvaW5fdGVzdF8yIGoy IG9uICgoajEuYSArIDEgPSBqMi5hICsgMSkpIHdoZXJlIGoxLmMgPCA1IGFuZCBqMi5jID4g NScpOworIGVzdGltYXRlZCB8IGFjdHVhbCAKKy0tLS0tLS0tLS0tKy0tLS0tLS0tCisgICAg ICAgICAxIHwgICAgICAwCisoMSByb3cpCisKK1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1h dGVkX3Jvd3MoJ3NlbGVjdCAqIGZyb20gam9pbl90ZXN0XzEgajEgam9pbiBqb2luX3Rlc3Rf MiBqMiBvbiAoajEuYSArIDEgPSBqMi5hKSB3aGVyZSBqMS5jIDwgNScpOworIGVzdGltYXRl ZCB8IGFjdHVhbCAKKy0tLS0tLS0tLS0tKy0tLS0tLS0tCisgICAgIDUwMDAwIHwgIDUwMDAw CisoMSByb3cpCisKK1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1hdGVkX3Jvd3MoJ3NlbGVj dCAqIGZyb20gam9pbl90ZXN0XzEgajEgam9pbiBqb2luX3Rlc3RfMiBqMiBvbiAoajEuYSAr IDEgPSBqMi5hICsgMSkgd2hlcmUgajEuYyA8IDUnKTsKKyBlc3RpbWF0ZWQgfCBhY3R1YWwg CistLS0tLS0tLS0tLSstLS0tLS0tLQorICAgICA1MDAwMCB8ICA1MDAwMAorKDEgcm93KQor CistLSB0cnkgY29tYmluaW5nIHdpdGggc2luZ2xlLWNvbHVtbiAoYW5kIHNpbmdsZS1leHBy ZXNzaW9uKSBzdGF0aXN0aWNzCitEUk9QIFNUQVRJU1RJQ1Mgam9pbl9zdGF0c18yOworU0VM RUNUICogRlJPTSBjaGVja19lc3RpbWF0ZWRfcm93cygnc2VsZWN0ICogZnJvbSBqb2luX3Rl c3RfMSBqMSBqb2luIGpvaW5fdGVzdF8yIGoyIG9uIChqMS5hICsgMSA9IGoyLmEpIHdoZXJl IGoxLmMgPCA1Jyk7CisgZXN0aW1hdGVkIHwgYWN0dWFsIAorLS0tLS0tLS0tLS0rLS0tLS0t LS0KKyAgICAgNTAwMDAgfCAgNTAwMDAKKygxIHJvdykKKworLS0gbm8gTUNWIG9uIGpvaW5f dGVzdF8yIChvbiB0aGUgKGErMSkgZXhwcmVzc2lvbikKK1NFTEVDVCAqIEZST00gY2hlY2tf ZXN0aW1hdGVkX3Jvd3MoJ3NlbGVjdCAqIGZyb20gam9pbl90ZXN0XzEgajEgam9pbiBqb2lu X3Rlc3RfMiBqMiBvbiAoajEuYSArIDEgPSBqMi5hICsgMSkgd2hlcmUgajEuYyA8IDUnKTsK KyBlc3RpbWF0ZWQgfCBhY3R1YWwgCistLS0tLS0tLS0tLSstLS0tLS0tLQorICAgICAgMjUw MCB8ICA1MDAwMAorKDEgcm93KQorCitDUkVBVEUgU1RBVElTVElDUyBqb2luX3N0YXRzXzIg T04gKGErMSkgRlJPTSBqb2luX3Rlc3RfMjsKK0FOQUxZWkUgam9pbl90ZXN0XzI7CitTRUxF Q1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dzKCdzZWxlY3QgKiBmcm9tIGpvaW5fdGVz dF8xIGoxIGpvaW4gam9pbl90ZXN0XzIgajIgb24gKGoxLmEgKyAxID0gajIuYSkgd2hlcmUg ajEuYyA8IDUnKTsKKyBlc3RpbWF0ZWQgfCBhY3R1YWwgCistLS0tLS0tLS0tLSstLS0tLS0t LQorICAgICA1MDAwMCB8ICA1MDAwMAorKDEgcm93KQorCitTRUxFQ1QgKiBGUk9NIGNoZWNr X2VzdGltYXRlZF9yb3dzKCdzZWxlY3QgKiBmcm9tIGpvaW5fdGVzdF8xIGoxIGpvaW4gam9p bl90ZXN0XzIgajIgb24gKGoxLmEgKyAxID0gajIuYSArIDEpIHdoZXJlIGoxLmMgPCA1Jyk7 CisgZXN0aW1hdGVkIHwgYWN0dWFsIAorLS0tLS0tLS0tLS0rLS0tLS0tLS0KKyAgICAgNTAw MDAgfCAgNTAwMDAKKygxIHJvdykKKworRFJPUCBUQUJMRSBqb2luX3Rlc3RfMTsKK0RST1Ag VEFCTEUgam9pbl90ZXN0XzI7CiAtLSBQZXJtaXNzaW9uIHRlc3RzLiBVc2VycyBzaG91bGQg bm90IGJlIGFibGUgdG8gc2VlIHNwZWNpZmljIGRhdGEgdmFsdWVzIGluCiAtLSB0aGUgZXh0 ZW5kZWQgc3RhdGlzdGljcywgaWYgdGhleSBsYWNrIHBlcm1pc3Npb24gdG8gc2VlIHRob3Nl IHZhbHVlcyBpbgogLS0gdGhlIHVuZGVybHlpbmcgdGFibGUuCmRpZmYgLS1naXQgYS9zcmMv dGVzdC9yZWdyZXNzL3NxbC9zdGF0c19leHQuc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwv c3RhdHNfZXh0LnNxbAppbmRleCA2ZmIzNzk2MmE3Li43MWU1OWI1Mjc5IDEwMDY0NAotLS0g YS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9zdGF0c19leHQuc3FsCisrKyBiL3NyYy90ZXN0L3Jl Z3Jlc3Mvc3FsL3N0YXRzX2V4dC5zcWwKQEAgLTE1MDAsNiArMTUwMCw3MiBAQCBTRUxFQ1Qg YzAgRlJPTSBPTkxZIGV4cHJfc3RhdHNfaW5jb21wYXRpYmxlX3Rlc3QgV0hFUkUKIAogRFJP UCBUQUJMRSBleHByX3N0YXRzX2luY29tcGF0aWJsZV90ZXN0OwogCisKKy0tIFRlc3Qgam9p biBlc3RpbWF0ZXMuCitDUkVBVEUgVEFCTEUgam9pbl90ZXN0XzEgKGEgaW50LCBiIGludCwg YyBpbnQpOworQ1JFQVRFIFRBQkxFIGpvaW5fdGVzdF8yIChhIGludCwgYiBpbnQsIGMgaW50 KTsKKworSU5TRVJUIElOVE8gam9pbl90ZXN0XzEgU0VMRUNUIG1vZChpLDEwKSwgbW9kKGks MTApLCBtb2QoaSwxMCkgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwxMDAwKSBzKGkpOworSU5T RVJUIElOVE8gam9pbl90ZXN0XzIgU0VMRUNUIG1vZChpLDEwKSwgbW9kKGksMTApLCBtb2Qo aSwxMCkgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwxMDAwKSBzKGkpOworCitBTkFMWVpFIGpv aW5fdGVzdF8xOworQU5BTFlaRSBqb2luX3Rlc3RfMjsKKworU0VMRUNUICogRlJPTSBjaGVj a19lc3RpbWF0ZWRfcm93cygnc2VsZWN0ICogZnJvbSBqb2luX3Rlc3RfMSBqMSBqb2luIGpv aW5fdGVzdF8yIGoyIG9uICgoajEuYSArIDEgPSBqMi5hICsgMSkgYW5kIChqMS5iID0gajIu YikpJyk7CitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dzKCdzZWxlY3QgKiBm cm9tIGpvaW5fdGVzdF8xIGoxIGpvaW4gam9pbl90ZXN0XzIgajIgb24gKChqMS5hICsgMSA9 IGoyLmEgKyAxKSBhbmQgKGoxLmIgPSBqMi5iKSkgd2hlcmUgajEuYyA8IDUnKTsKK1NFTEVD VCAqIEZST00gY2hlY2tfZXN0aW1hdGVkX3Jvd3MoJ3NlbGVjdCAqIGZyb20gam9pbl90ZXN0 XzEgajEgam9pbiBqb2luX3Rlc3RfMiBqMiBvbiAoKGoxLmEgKyAxID0gajIuYSArIDEpIGFu ZCAoajEuYiA9IGoyLmIpKSB3aGVyZSBqMS5jIDwgMCcpOworU0VMRUNUICogRlJPTSBjaGVj a19lc3RpbWF0ZWRfcm93cygnc2VsZWN0ICogZnJvbSBqb2luX3Rlc3RfMSBqMSBqb2luIGpv aW5fdGVzdF8yIGoyIG9uICgoajEuYSArIDEgPSBqMi5hICsgMSkgYW5kIChqMS5iID0gajIu YikpIHdoZXJlIGoxLmMgPCA1IGFuZCBqMi5jIDwgMycpOworU0VMRUNUICogRlJPTSBjaGVj a19lc3RpbWF0ZWRfcm93cygnc2VsZWN0ICogZnJvbSBqb2luX3Rlc3RfMSBqMSBqb2luIGpv aW5fdGVzdF8yIGoyIG9uICgoajEuYSArIDEgPSBqMi5hICsgMSkgYW5kIChqMS5iID0gajIu YikpIHdoZXJlIGoxLmMgPCA1IGFuZCBqMi5jID4gNScpOworCistLSBjYW4ndCBiZSBpbXBy b3ZlZCBkdWUgdG8gdGhlIG9wdGltaXphdGlvbiBpbiBjbGF1c2VsaXN0X3NlbGVjdGl2aXR5 X2V4dCwKKy0tIHdoaWNoIHNraXBzIGNhc2VzIHdpdGggYSBzaW5nbGUgKGpvaW4pIGNsYXVz ZQorU0VMRUNUICogRlJPTSBjaGVja19lc3RpbWF0ZWRfcm93cygnc2VsZWN0ICogZnJvbSBq b2luX3Rlc3RfMSBqMSBqb2luIGpvaW5fdGVzdF8yIGoyIG9uICgoajEuYSArIDEgPSBqMi5h ICsgMSkpIHdoZXJlIGoxLmMgPCA1Jyk7CitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRl ZF9yb3dzKCdzZWxlY3QgKiBmcm9tIGpvaW5fdGVzdF8xIGoxIGpvaW4gam9pbl90ZXN0XzIg ajIgb24gKChqMS5hICsgMSA9IGoyLmEgKyAxKSkgd2hlcmUgajEuYyA8IDUgYW5kIGoyLmMg PCA1Jyk7CitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dzKCdzZWxlY3QgKiBm cm9tIGpvaW5fdGVzdF8xIGoxIGpvaW4gam9pbl90ZXN0XzIgajIgb24gKChqMS5hICsgMSA9 IGoyLmEgKyAxKSkgd2hlcmUgajEuYyA8IDUgYW5kIGoyLmMgPiA1Jyk7CisKK1NFTEVDVCAq IEZST00gY2hlY2tfZXN0aW1hdGVkX3Jvd3MoJ3NlbGVjdCAqIGZyb20gam9pbl90ZXN0XzEg ajEgam9pbiBqb2luX3Rlc3RfMiBqMiBvbiAoajEuYSArIDEgPSBqMi5hKSB3aGVyZSBqMS5j IDwgNScpOworU0VMRUNUICogRlJPTSBjaGVja19lc3RpbWF0ZWRfcm93cygnc2VsZWN0ICog ZnJvbSBqb2luX3Rlc3RfMSBqMSBqb2luIGpvaW5fdGVzdF8yIGoyIG9uIChqMS5hICsgMSA9 IGoyLmEgKyAxKSB3aGVyZSBqMS5jIDwgNScpOworCistLSBjcmVhdGUgZXh0ZW5kZWQgc3Rh dGlzdGljcyBvbiB0aGUgam9pbi93aGVyZSBjb2x1bW5zCitDUkVBVEUgU1RBVElTVElDUyBq b2luX3N0YXRzXzEgT04gYSwgYiwgYywgKGErMSksIChiKzEpIEZST00gam9pbl90ZXN0XzE7 CitDUkVBVEUgU1RBVElTVElDUyBqb2luX3N0YXRzXzIgT04gYSwgYiwgYywgKGErMSksIChi KzEpIEZST00gam9pbl90ZXN0XzI7CisKK0FOQUxZWkUgam9pbl90ZXN0XzE7CitBTkFMWVpF IGpvaW5fdGVzdF8yOworCitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dzKCdz ZWxlY3QgKiBmcm9tIGpvaW5fdGVzdF8xIGoxIGpvaW4gam9pbl90ZXN0XzIgajIgb24gKChq MS5hICsgMSA9IGoyLmEgKyAxKSBhbmQgKGoxLmIgPSBqMi5iKSknKTsKK1NFTEVDVCAqIEZS T00gY2hlY2tfZXN0aW1hdGVkX3Jvd3MoJ3NlbGVjdCAqIGZyb20gam9pbl90ZXN0XzEgajEg am9pbiBqb2luX3Rlc3RfMiBqMiBvbiAoKGoxLmEgKyAxID0gajIuYSArIDEpIGFuZCAoajEu YiA9IGoyLmIpKSB3aGVyZSBqMS5jIDwgNScpOworU0VMRUNUICogRlJPTSBjaGVja19lc3Rp bWF0ZWRfcm93cygnc2VsZWN0ICogZnJvbSBqb2luX3Rlc3RfMSBqMSBqb2luIGpvaW5fdGVz dF8yIGoyIG9uICgoajEuYSArIDEgPSBqMi5hICsgMSkgYW5kIChqMS5iID0gajIuYikpIHdo ZXJlIGoxLmMgPCAwJyk7CitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dzKCdz ZWxlY3QgKiBmcm9tIGpvaW5fdGVzdF8xIGoxIGpvaW4gam9pbl90ZXN0XzIgajIgb24gKChq MS5hICsgMSA9IGoyLmEgKyAxKSBhbmQgKGoxLmIgPSBqMi5iKSkgd2hlcmUgajEuYyA8IDUg YW5kIGoyLmMgPCAzJyk7CitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dzKCdz ZWxlY3QgKiBmcm9tIGpvaW5fdGVzdF8xIGoxIGpvaW4gam9pbl90ZXN0XzIgajIgb24gKChq MS5hICsgMSA9IGoyLmEgKyAxKSBhbmQgKGoxLmIgPSBqMi5iKSkgd2hlcmUgajEuYyA8IDUg YW5kIGoyLmMgPiA1Jyk7CisKKy0tIGNhbid0IGJlIGltcHJvdmVkIGR1ZSB0byB0aGUgb3B0 aW1pemF0aW9uIGluIGNsYXVzZWxpc3Rfc2VsZWN0aXZpdHlfZXh0LAorLS0gd2hpY2ggc2tp cHMgY2FzZXMgd2l0aCBhIHNpbmdsZSAoam9pbikgY2xhdXNlCitTRUxFQ1QgKiBGUk9NIGNo ZWNrX2VzdGltYXRlZF9yb3dzKCdzZWxlY3QgKiBmcm9tIGpvaW5fdGVzdF8xIGoxIGpvaW4g am9pbl90ZXN0XzIgajIgb24gKChqMS5hICsgMSA9IGoyLmEgKyAxKSkgd2hlcmUgajEuYyA8 IDUnKTsKK1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1hdGVkX3Jvd3MoJ3NlbGVjdCAqIGZy b20gam9pbl90ZXN0XzEgajEgam9pbiBqb2luX3Rlc3RfMiBqMiBvbiAoKGoxLmEgKyAxID0g ajIuYSArIDEpKSB3aGVyZSBqMS5jIDwgNSBhbmQgajIuYyA8IDUnKTsKK1NFTEVDVCAqIEZS T00gY2hlY2tfZXN0aW1hdGVkX3Jvd3MoJ3NlbGVjdCAqIGZyb20gam9pbl90ZXN0XzEgajEg am9pbiBqb2luX3Rlc3RfMiBqMiBvbiAoKGoxLmEgKyAxID0gajIuYSArIDEpKSB3aGVyZSBq MS5jIDwgNSBhbmQgajIuYyA+IDUnKTsKKworU0VMRUNUICogRlJPTSBjaGVja19lc3RpbWF0 ZWRfcm93cygnc2VsZWN0ICogZnJvbSBqb2luX3Rlc3RfMSBqMSBqb2luIGpvaW5fdGVzdF8y IGoyIG9uIChqMS5hICsgMSA9IGoyLmEpIHdoZXJlIGoxLmMgPCA1Jyk7CitTRUxFQ1QgKiBG Uk9NIGNoZWNrX2VzdGltYXRlZF9yb3dzKCdzZWxlY3QgKiBmcm9tIGpvaW5fdGVzdF8xIGox IGpvaW4gam9pbl90ZXN0XzIgajIgb24gKGoxLmEgKyAxID0gajIuYSArIDEpIHdoZXJlIGox LmMgPCA1Jyk7CisKKy0tIHRyeSBjb21iaW5pbmcgd2l0aCBzaW5nbGUtY29sdW1uIChhbmQg c2luZ2xlLWV4cHJlc3Npb24pIHN0YXRpc3RpY3MKK0RST1AgU1RBVElTVElDUyBqb2luX3N0 YXRzXzI7CisKK1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1hdGVkX3Jvd3MoJ3NlbGVjdCAq IGZyb20gam9pbl90ZXN0XzEgajEgam9pbiBqb2luX3Rlc3RfMiBqMiBvbiAoajEuYSArIDEg PSBqMi5hKSB3aGVyZSBqMS5jIDwgNScpOworCistLSBubyBNQ1Ygb24gam9pbl90ZXN0XzIg KG9uIHRoZSAoYSsxKSBleHByZXNzaW9uKQorU0VMRUNUICogRlJPTSBjaGVja19lc3RpbWF0 ZWRfcm93cygnc2VsZWN0ICogZnJvbSBqb2luX3Rlc3RfMSBqMSBqb2luIGpvaW5fdGVzdF8y IGoyIG9uIChqMS5hICsgMSA9IGoyLmEgKyAxKSB3aGVyZSBqMS5jIDwgNScpOworCitDUkVB VEUgU1RBVElTVElDUyBqb2luX3N0YXRzXzIgT04gKGErMSkgRlJPTSBqb2luX3Rlc3RfMjsK K0FOQUxZWkUgam9pbl90ZXN0XzI7CisKK1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1hdGVk X3Jvd3MoJ3NlbGVjdCAqIGZyb20gam9pbl90ZXN0XzEgajEgam9pbiBqb2luX3Rlc3RfMiBq MiBvbiAoajEuYSArIDEgPSBqMi5hKSB3aGVyZSBqMS5jIDwgNScpOworU0VMRUNUICogRlJP TSBjaGVja19lc3RpbWF0ZWRfcm93cygnc2VsZWN0ICogZnJvbSBqb2luX3Rlc3RfMSBqMSBq b2luIGpvaW5fdGVzdF8yIGoyIG9uIChqMS5hICsgMSA9IGoyLmEgKyAxKSB3aGVyZSBqMS5j IDwgNScpOworCisKK0RST1AgVEFCTEUgam9pbl90ZXN0XzE7CitEUk9QIFRBQkxFIGpvaW5f dGVzdF8yOworCiAtLSBQZXJtaXNzaW9uIHRlc3RzLiBVc2VycyBzaG91bGQgbm90IGJlIGFi bGUgdG8gc2VlIHNwZWNpZmljIGRhdGEgdmFsdWVzIGluCiAtLSB0aGUgZXh0ZW5kZWQgc3Rh dGlzdGljcywgaWYgdGhleSBsYWNrIHBlcm1pc3Npb24gdG8gc2VlIHRob3NlIHZhbHVlcyBp bgogLS0gdGhlIHVuZGVybHlpbmcgdGFibGUuCi0tIAoyLjMxLjEKCg== --------------LLSlOiBoMfYtp5sRWpMhWlGh--