Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sON8t-00DrOG-Pg for pgsql-hackers@arkaria.postgresql.org; Mon, 01 Jul 2024 19:56:52 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1sON8s-003yJU-23 for pgsql-hackers@arkaria.postgresql.org; Mon, 01 Jul 2024 19:56:50 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sON8q-003yJM-Ot for pgsql-hackers@lists.postgresql.org; Mon, 01 Jul 2024 19:56:50 +0000 Received: from fhigh2-smtp.messagingengine.com ([103.168.172.153]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sON8o-0045cl-3W for pgsql-hackers@postgresql.org; Mon, 01 Jul 2024 19:56:47 +0000 Received: from compute6.internal (compute6.nyi.internal [10.202.2.47]) by mailfhigh.nyi.internal (Postfix) with ESMTP id A94E4114018A; Mon, 1 Jul 2024 15:56:44 -0400 (EDT) Received: from imap48 ([10.202.2.98]) by compute6.internal (MEProxy); Mon, 01 Jul 2024 15:56:44 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=compiler.org; h= cc:cc:content-type:content-type:date:date:from:from:in-reply-to :in-reply-to:message-id:mime-version:references:reply-to:subject :subject:to:to; s=fm2; t=1719863804; x=1719950204; bh=TE7AuJJfbo KKTdjDcDbbPlSIME1WIBmUP1ieYmHQNgw=; b=e+yS5KeDgB7fq1sJGOQUs0CQM4 3XeRk5p0lsaZGmPSQDFuLWFu6ZhXg+M/kE0uSlAons8Z9OrxGKjeoa5ieh/L1n7P XFiZOA5YUFLHLPhZARD6qjevHAqwaHl7tccJrJJd+2+ktoZtk/8Pb/EGJhlDAT2l eJmKJPu/QY2M0njb3FJWfxZ7BKIutO8MdaycircpY2qifLTTHRBMSqhY2dUkUW9e jVQjY+bTt+T5aVe20+On/xpP3MRMICFwXiueTxv7yhx+xia7zACUkJ/cl7YW9tua MgFDVAsl0kbYoQ/nQ+JGS6uLHmnwhHDk+YjyElke2Cdz1CiyxCFBKsymAG2A== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:in-reply-to :message-id:mime-version:references:reply-to:subject:subject:to :to:x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm2; t=1719863804; x=1719950204; bh=TE7AuJJfboKKTdjDcDbbPlSIME1W IBmUP1ieYmHQNgw=; b=KuDxzvL+r1EKclgVCiHukmDT+ADBUjI5DobQRN8QkbX8 3P8lqqrMXvQHT4eWDJp9d95IhDt1WV5UxDGmJ50+KTiq0BllQNU4PoSzasuRAL7U MEZdkXS9vqM5IlE5tBQkF++W43ffb+Vv/djVwiPCYQVXWkg+C2y2HHA8SCbUqT6h 7ZiTi9bAATxyft1ooHPGhRpXjV9N+oOKX1yevGEGexNjJZ9lhN3e3X2nOcpeY1RL DznYHoz41cKYa896ZRRnNwMjYTWnuZwuzogAmLRyaf2cehwKasFmn+19dSBcv8qR TPZNhfLz2ixSldZQRIEb54HgjXebbQIE/T3w7OpB8Q== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeftddrudefgddugeduucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhepofgfggfkjghffffhvfevufgtsehmtderreerredtnecuhfhrohhmpedflfho vghlucflrggtohgsshhonhdfuceojhhovghlsegtohhmphhilhgvrhdrohhrgheqnecugg ftrfgrthhtvghrnheptefgjedvffeuudejkedtgfejheefffeguefhgeetueejvddtieef fedvvdevueeunecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrh homhepjhhovghlsegtohhmphhilhgvrhdrohhrgh X-ME-Proxy: Feedback-ID: ic6394509:Fastmail Received: by mailuser.nyi.internal (Postfix, from userid 501) id 24E9C31A0065; Mon, 1 Jul 2024 15:56:44 -0400 (EDT) X-Mailer: MessagingEngine.com Webmail Interface User-Agent: Cyrus-JMAP/3.11.0-alpha0-566-g3812ddbbc-fm-20240627.001-g3812ddbb MIME-Version: 1.0 Message-Id: In-Reply-To: <81348268-b9fd-4308-bf52-056070aa7c2a@app.fastmail.com> References: <44d2ffca-d560-4919-b85a-4d07060946aa@app.fastmail.com> <87zfr1e1uj.fsf@wibble.ilmari.org> <9ff90ff9-5ac1-4529-b2f4-f93b37734b9c@app.fastmail.com> <81348268-b9fd-4308-bf52-056070aa7c2a@app.fastmail.com> Date: Mon, 01 Jul 2024 21:56:23 +0200 From: "Joel Jacobson" To: =?UTF-8?Q?Dagfinn_Ilmari_Manns=C3=A5ker?= Cc: pgsql-hackers Subject: Re: Optimize numeric multiplication for one and two base-NBASE digit multiplicands. Content-Type: multipart/mixed; boundary=fb717db6e32246acbcb9f4d435f0d433 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --fb717db6e32246acbcb9f4d435f0d433 Content-Type: text/plain On Mon, Jul 1, 2024, at 15:14, Joel Jacobson wrote: > * 0001-Optimize-mul_var-for-var2ndigits-4.patch Found a typo, fixed in new version. The int128 version is still slower though, I wonder if there is something that can be done to speed it up further. Below is a more realistic benchmark than just microbenchmarking mul_var(), not testing the int128 version, but the code for up to 2 NBASE-digits: ``` CREATE TABLE bench_mul_var (num1 numeric, num2 numeric); INSERT INTO bench_mul_var (num1, num2) SELECT random(0::numeric,1e8::numeric), random(0::numeric,1e8::numeric) FROM generate_series(1,1e8); SELECT SUM(num1*num2) FROM bench_mul_var; Time: 8331.953 ms (00:08.332) Time: 7415.241 ms (00:07.415) Time: 7298.296 ms (00:07.298) Time: 7314.754 ms (00:07.315) Time: 7289.560 ms (00:07.290) SELECT SUM(numeric_mul_patched(num1,num2)) FROM bench_mul_var; Time: 6403.426 ms (00:06.403) Time: 6401.797 ms (00:06.402) Time: 6366.136 ms (00:06.366) Time: 6376.049 ms (00:06.376) Time: 6317.282 ms (00:06.317) `` Benchmarked on a Intel Core i9-14900K machine. /Joel --fb717db6e32246acbcb9f4d435f0d433 Content-Disposition: attachment; filename*0="v2-0001-Optimize-mul_var-for-var2ndigits-4.patch" Content-Type: application/octet-stream; name="=?UTF-8?Q?v2-0001-Optimize-mul=5Fvar-for-var2ndigits-4.patch?=" Content-Transfer-Encoding: BASE64 RnJvbSBiMDc1ZTE4YzJhZTk0ZjJhZGEyMDU3MmMwNWZmMzU3MzBkMmM1OTY4IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBKb2VsIEpha29ic3NvbiA8Z2l0aHViQGNvbXBpbGVy Lm9yZz4KRGF0ZTogTW9uLCAxIEp1bCAyMDI0IDA3OjE3OjUwICswMjAwClN1YmplY3Q6IFtQ QVRDSF0gT3B0aW1pemUgbXVsX3ZhcigpIGZvciB2YXIybmRpZ2l0cyA8PSA0CgotLS0KIHNy Yy9iYWNrZW5kL3V0aWxzL2FkdC9udW1lcmljLmMgfCA0NTcgKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysKIHNyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQgfCAgIDMg Kwogc3JjL2luY2x1ZGUvdXRpbHMvbnVtZXJpYy5oICAgICB8ICAgMiArCiAzIGZpbGVzIGNo YW5nZWQsIDQ2MiBpbnNlcnRpb25zKCspCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRp bHMvYWR0L251bWVyaWMuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9udW1lcmljLmMKaW5k ZXggNTUxMGEyMDNiMC4uYjc0ZTAzZWVmYSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRp bHMvYWR0L251bWVyaWMuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvbnVtZXJpYy5j CkBAIC01NTEsNiArNTUxLDkgQEAgc3RhdGljIHZvaWQgc3ViX3Zhcihjb25zdCBOdW1lcmlj VmFyICp2YXIxLCBjb25zdCBOdW1lcmljVmFyICp2YXIyLAogc3RhdGljIHZvaWQgbXVsX3Zh cihjb25zdCBOdW1lcmljVmFyICp2YXIxLCBjb25zdCBOdW1lcmljVmFyICp2YXIyLAogCQkJ CQlOdW1lcmljVmFyICpyZXN1bHQsCiAJCQkJCWludCByc2NhbGUpOworc3RhdGljIHZvaWQg bXVsX3Zhcl9wYXRjaGVkKGNvbnN0IE51bWVyaWNWYXIgKnZhcjEsIGNvbnN0IE51bWVyaWNW YXIgKnZhcjIsCisJCQkJCU51bWVyaWNWYXIgKnJlc3VsdCwKKwkJCQkJaW50IHJzY2FsZSk7 CiBzdGF0aWMgdm9pZCBkaXZfdmFyKGNvbnN0IE51bWVyaWNWYXIgKnZhcjEsIGNvbnN0IE51 bWVyaWNWYXIgKnZhcjIsCiAJCQkJCU51bWVyaWNWYXIgKnJlc3VsdCwKIAkJCQkJaW50IHJz Y2FsZSwgYm9vbCByb3VuZCk7CkBAIC0zMTE1LDYgKzMxMTgsMTMwIEBAIG51bWVyaWNfbXVs X29wdF9lcnJvcihOdW1lcmljIG51bTEsIE51bWVyaWMgbnVtMiwgYm9vbCAqaGF2ZV9lcnJv cikKIH0KIAogCisvKgorICogbnVtZXJpY19tdWxfcGF0Y2hlZCgpIC0KKyAqCisgKiBUaGlz IGZ1bmN0aW9uIG11bHRpcGxpZXMgdHdvIG51bWVyaWMgdmFsdWVzIHVzaW5nIHRoZSBwYXRj aGVkIGFsZ29yaXRobSwKKyAqIGRlc2lnbmVkIGZvciBlZmZpY2llbnQgaGFuZGxpbmcgb2Yg bGFyZ2UgbnVtYmVycy4gSXQncyBpbnRyb2R1Y2VkIHRvIGFsbG93CisgKiBkaXJlY3QgYmVu Y2htYXJrIGNvbXBhcmlzb25zIHdpdGggdGhlIHN0YW5kYXJkIG51bWVyaWNfbXVsKCkgZnVu Y3Rpb24uCisgKi8KK0RhdHVtCitudW1lcmljX211bF9wYXRjaGVkKFBHX0ZVTkNUSU9OX0FS R1MpCit7CisJTnVtZXJpYwkJbnVtMSA9IFBHX0dFVEFSR19OVU1FUklDKDApOworCU51bWVy aWMJCW51bTIgPSBQR19HRVRBUkdfTlVNRVJJQygxKTsKKwlOdW1lcmljCQlyZXM7CisKKwly ZXMgPSBudW1lcmljX211bF9wYXRjaGVkX29wdF9lcnJvcihudW0xLCBudW0yLCBOVUxMKTsK KworCVBHX1JFVFVSTl9OVU1FUklDKHJlcyk7Cit9CisKKworLyoKKyAqIG51bWVyaWNfbXVs X3BhdGNoZWRfb3B0X2Vycm9yKCkgLQorICoKKyAqCUludGVybmFsIHZlcnNpb24gb2YgbnVt ZXJpY19tdWxfcGF0Y2hlZCgpLgorICoJSWYgIipoYXZlX2Vycm9yIiBmbGFnIGlzIHByb3Zp ZGVkLCBvbiBlcnJvciBpdCdzIHNldCB0byB0cnVlLCBOVUxMIHJldHVybmVkLgorICoJVGhp cyBpcyBoZWxwZnVsIHdoZW4gY2FsbGVyIG5lZWQgdG8gaGFuZGxlIGVycm9ycyBieSBpdHNl bGYuCisgKi8KK051bWVyaWMKK251bWVyaWNfbXVsX3BhdGNoZWRfb3B0X2Vycm9yKE51bWVy aWMgbnVtMSwgTnVtZXJpYyBudW0yLCBib29sICpoYXZlX2Vycm9yKQoreworCU51bWVyaWNW YXIJYXJnMTsKKwlOdW1lcmljVmFyCWFyZzI7CisJTnVtZXJpY1ZhcglyZXN1bHQ7CisJTnVt ZXJpYwkJcmVzOworCisJLyoKKwkgKiBIYW5kbGUgTmFOIGFuZCBpbmZpbml0aWVzCisJICov CisJaWYgKE5VTUVSSUNfSVNfU1BFQ0lBTChudW0xKSB8fCBOVU1FUklDX0lTX1NQRUNJQUwo bnVtMikpCisJeworCQlpZiAoTlVNRVJJQ19JU19OQU4obnVtMSkgfHwgTlVNRVJJQ19JU19O QU4obnVtMikpCisJCQlyZXR1cm4gbWFrZV9yZXN1bHQoJmNvbnN0X25hbik7CisJCWlmIChO VU1FUklDX0lTX1BJTkYobnVtMSkpCisJCXsKKwkJCXN3aXRjaCAobnVtZXJpY19zaWduX2lu dGVybmFsKG51bTIpKQorCQkJeworCQkJCWNhc2UgMDoKKwkJCQkJcmV0dXJuIG1ha2VfcmVz dWx0KCZjb25zdF9uYW4pOyAvKiBJbmYgKiAwICovCisJCQkJY2FzZSAxOgorCQkJCQlyZXR1 cm4gbWFrZV9yZXN1bHQoJmNvbnN0X3BpbmYpOworCQkJCWNhc2UgLTE6CisJCQkJCXJldHVy biBtYWtlX3Jlc3VsdCgmY29uc3RfbmluZik7CisJCQl9CisJCQlBc3NlcnQoZmFsc2UpOwor CQl9CisJCWlmIChOVU1FUklDX0lTX05JTkYobnVtMSkpCisJCXsKKwkJCXN3aXRjaCAobnVt ZXJpY19zaWduX2ludGVybmFsKG51bTIpKQorCQkJeworCQkJCWNhc2UgMDoKKwkJCQkJcmV0 dXJuIG1ha2VfcmVzdWx0KCZjb25zdF9uYW4pOyAvKiAtSW5mICogMCAqLworCQkJCWNhc2Ug MToKKwkJCQkJcmV0dXJuIG1ha2VfcmVzdWx0KCZjb25zdF9uaW5mKTsKKwkJCQljYXNlIC0x OgorCQkJCQlyZXR1cm4gbWFrZV9yZXN1bHQoJmNvbnN0X3BpbmYpOworCQkJfQorCQkJQXNz ZXJ0KGZhbHNlKTsKKwkJfQorCQkvKiBieSBoZXJlLCBudW0xIG11c3QgYmUgZmluaXRlLCBz byBudW0yIGlzIG5vdCAqLworCQlpZiAoTlVNRVJJQ19JU19QSU5GKG51bTIpKQorCQl7CisJ CQlzd2l0Y2ggKG51bWVyaWNfc2lnbl9pbnRlcm5hbChudW0xKSkKKwkJCXsKKwkJCQljYXNl IDA6CisJCQkJCXJldHVybiBtYWtlX3Jlc3VsdCgmY29uc3RfbmFuKTsgLyogMCAqIEluZiAq LworCQkJCWNhc2UgMToKKwkJCQkJcmV0dXJuIG1ha2VfcmVzdWx0KCZjb25zdF9waW5mKTsK KwkJCQljYXNlIC0xOgorCQkJCQlyZXR1cm4gbWFrZV9yZXN1bHQoJmNvbnN0X25pbmYpOwor CQkJfQorCQkJQXNzZXJ0KGZhbHNlKTsKKwkJfQorCQlBc3NlcnQoTlVNRVJJQ19JU19OSU5G KG51bTIpKTsKKwkJc3dpdGNoIChudW1lcmljX3NpZ25faW50ZXJuYWwobnVtMSkpCisJCXsK KwkJCWNhc2UgMDoKKwkJCQlyZXR1cm4gbWFrZV9yZXN1bHQoJmNvbnN0X25hbik7IC8qIDAg KiAtSW5mICovCisJCQljYXNlIDE6CisJCQkJcmV0dXJuIG1ha2VfcmVzdWx0KCZjb25zdF9u aW5mKTsKKwkJCWNhc2UgLTE6CisJCQkJcmV0dXJuIG1ha2VfcmVzdWx0KCZjb25zdF9waW5m KTsKKwkJfQorCQlBc3NlcnQoZmFsc2UpOworCX0KKworCS8qCisJICogVW5wYWNrIHRoZSB2 YWx1ZXMsIGxldCBtdWxfdmFyKCkgY29tcHV0ZSB0aGUgcmVzdWx0IGFuZCByZXR1cm4gaXQu CisJICogVW5saWtlIGFkZF92YXIoKSBhbmQgc3ViX3ZhcigpLCBtdWxfdmFyKCkgd2lsbCBy b3VuZCBpdHMgcmVzdWx0LiBJbiB0aGUKKwkgKiBjYXNlIG9mIG51bWVyaWNfbXVsKCksIHdo aWNoIGlzIGludm9rZWQgZm9yIHRoZSAqIG9wZXJhdG9yIG9uIG51bWVyaWNzLAorCSAqIHdl IHJlcXVlc3QgZXhhY3QgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBwcm9kdWN0IChyc2NhbGUg PSBzdW0oZHNjYWxlIG9mCisJICogYXJnMSwgZHNjYWxlIG9mIGFyZzIpKS4gIElmIHRoZSBl eGFjdCByZXN1bHQgaGFzIG1vcmUgZGlnaXRzIGFmdGVyIHRoZQorCSAqIGRlY2ltYWwgcG9p bnQgdGhhbiBjYW4gYmUgc3RvcmVkIGluIGEgbnVtZXJpYywgd2Ugcm91bmQgaXQuICBSb3Vu ZGluZworCSAqIGFmdGVyIGNvbXB1dGluZyB0aGUgZXhhY3QgcmVzdWx0IGVuc3VyZXMgdGhh dCB0aGUgZmluYWwgcmVzdWx0IGlzCisJICogY29ycmVjdGx5IHJvdW5kZWQgKHJvdW5kaW5n IGluIG11bF92YXIoKSB1c2luZyBhIHRydW5jYXRlZCBwcm9kdWN0CisJICogd291bGQgbm90 IGd1YXJhbnRlZSB0aGlzKS4KKwkgKi8KKwlpbml0X3Zhcl9mcm9tX251bShudW0xLCAmYXJn MSk7CisJaW5pdF92YXJfZnJvbV9udW0obnVtMiwgJmFyZzIpOworCisJaW5pdF92YXIoJnJl c3VsdCk7CisKKwltdWxfdmFyX3BhdGNoZWQoJmFyZzEsICZhcmcyLCAmcmVzdWx0LCBhcmcx LmRzY2FsZSArIGFyZzIuZHNjYWxlKTsKKworCWlmIChyZXN1bHQuZHNjYWxlID4gTlVNRVJJ Q19EU0NBTEVfTUFYKQorCQlyb3VuZF92YXIoJnJlc3VsdCwgTlVNRVJJQ19EU0NBTEVfTUFY KTsKKworCXJlcyA9IG1ha2VfcmVzdWx0X29wdF9lcnJvcigmcmVzdWx0LCBoYXZlX2Vycm9y KTsKKworCWZyZWVfdmFyKCZyZXN1bHQpOworCisJcmV0dXJuIHJlczsKK30KKworCiAvKgog ICogbnVtZXJpY19kaXYoKSAtCiAgKgpAQCAtODg2NCw2ICs4OTkxLDMzNiBAQCBtdWxfdmFy KGNvbnN0IE51bWVyaWNWYXIgKnZhcjEsIGNvbnN0IE51bWVyaWNWYXIgKnZhcjIsIE51bWVy aWNWYXIgKnJlc3VsdCwKIAlzdHJpcF92YXIocmVzdWx0KTsKIH0KIAorLyoKKyAqIG11bF92 YXJfcGF0Y2hlZCgpIC0KKyAqCisgKiBJbXBsZW1lbnRzIHBhdGNoZWQgbXVsdGlwbGljYXRp b24gZm9yIGxhcmdlIG51bWJlcnMsIGludHJvZHVjZWQKKyAqIGFsb25nc2lkZSB0aGUgdW5j aGFuZ2VkIG9yaWdpbmFsIG11bF92YXIoKS4gVGhpcyBmdW5jdGlvbiBpcyBwYXJ0IG9mCisg KiBhbiBvcHRpbWl6YXRpb24gZWZmb3J0LCBhbGxvd2luZyBkaXJlY3QgYmVuY2htYXJrIGNv bXBhcmlzb25zIHdpdGgKKyAqIG11bF92YXIoKS4gSXQgc2VsZWN0cyBmdWxsIG9yIGhhbGYg cGF0Y2hlZCBiYXNlZCBvbiBpbnB1dCBzaXplLgorICogVGhpcyBpcyBhIHRlbXBvcmFyeSBt ZWFzdXJlIGJlZm9yZSBjb25zaWRlcmluZyBpdHMgcmVwbGFjZW1lbnQgb2YKKyAqIG11bF92 YXIoKSBiYXNlZCBvbiBiZW5jaG1hcmsgb3V0Y29tZXMuCisgKi8KK3N0YXRpYyB2b2lkCitt dWxfdmFyX3BhdGNoZWQoY29uc3QgTnVtZXJpY1ZhciAqdmFyMSwgY29uc3QgTnVtZXJpY1Zh ciAqdmFyMiwKKwkJTnVtZXJpY1ZhciAqcmVzdWx0LCBpbnQgcnNjYWxlKQoreworCWludAkJ CXJlc19uZGlnaXRzOworCWludAkJCXJlc19zaWduOworCWludAkJCXJlc193ZWlnaHQ7CisJ aW50CQkJbWF4ZGlnaXRzOworCWludAkJICAgKmRpZzsKKwlpbnQJCQljYXJyeTsKKwlpbnQJ CQltYXhkaWc7CisJaW50CQkJbmV3ZGlnOworCWludAkJCXZhcjFuZGlnaXRzOworCWludAkJ CXZhcjJuZGlnaXRzOworCU51bWVyaWNEaWdpdCAqdmFyMWRpZ2l0czsKKwlOdW1lcmljRGln aXQgKnZhcjJkaWdpdHM7CisJTnVtZXJpY0RpZ2l0ICpyZXNfZGlnaXRzOworCWludAkJCWks CisJCQkJaTEsCisJCQkJaTI7CisKKwkvKgorCSAqIEFycmFuZ2UgZm9yIHZhcjEgdG8gYmUg dGhlIHNob3J0ZXIgb2YgdGhlIHR3byBudW1iZXJzLiAgVGhpcyBpbXByb3ZlcworCSAqIHBl cmZvcm1hbmNlIGJlY2F1c2UgdGhlIGlubmVyIG11bHRpcGxpY2F0aW9uIGxvb3AgaXMgbXVj aCBzaW1wbGVyIHRoYW4KKwkgKiB0aGUgb3V0ZXIgbG9vcCwgc28gaXQncyBiZXR0ZXIgdG8g aGF2ZSBhIHNtYWxsZXIgbnVtYmVyIG9mIGl0ZXJhdGlvbnMKKwkgKiBvZiB0aGUgb3V0ZXIg bG9vcC4gIFRoaXMgYWxzbyByZWR1Y2VzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCB0aGUK KwkgKiBhY2N1bXVsYXRvciBhcnJheSBuZWVkcyB0byBiZSBub3JtYWxpemVkLgorCSAqLwor CWlmICh2YXIxLT5uZGlnaXRzID4gdmFyMi0+bmRpZ2l0cykKKwl7CisJCWNvbnN0IE51bWVy aWNWYXIgKnRtcCA9IHZhcjE7CisKKwkJdmFyMSA9IHZhcjI7CisJCXZhcjIgPSB0bXA7CisJ fQorCisJLyogY29weSB0aGVzZSB2YWx1ZXMgaW50byBsb2NhbCB2YXJzIGZvciBzcGVlZCBp biBpbm5lciBsb29wICovCisJdmFyMW5kaWdpdHMgPSB2YXIxLT5uZGlnaXRzOworCXZhcjJu ZGlnaXRzID0gdmFyMi0+bmRpZ2l0czsKKwl2YXIxZGlnaXRzID0gdmFyMS0+ZGlnaXRzOwor CXZhcjJkaWdpdHMgPSB2YXIyLT5kaWdpdHM7CisKKwlpZiAodmFyMW5kaWdpdHMgPT0gMCB8 fCB2YXIybmRpZ2l0cyA9PSAwKQorCXsKKwkJLyogb25lIG9yIGJvdGggaW5wdXRzIGlzIHpl cm87IHNvIGlzIHJlc3VsdCAqLworCQl6ZXJvX3ZhcihyZXN1bHQpOworCQlyZXN1bHQtPmRz Y2FsZSA9IHJzY2FsZTsKKwkJcmV0dXJuOworCX0KKworCS8qIERldGVybWluZSByZXN1bHQg c2lnbiBhbmQgKG1heGltdW0gcG9zc2libGUpIHdlaWdodCAqLworCWlmICh2YXIxLT5zaWdu ID09IHZhcjItPnNpZ24pCisJCXJlc19zaWduID0gTlVNRVJJQ19QT1M7CisJZWxzZQorCQly ZXNfc2lnbiA9IE5VTUVSSUNfTkVHOworCXJlc193ZWlnaHQgPSB2YXIxLT53ZWlnaHQgKyB2 YXIyLT53ZWlnaHQgKyAyOworCisJLyoKKwkgKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBy ZXN1bHQgZGlnaXRzIHRvIGNvbXB1dGUuICBJZiB0aGUgZXhhY3QgcmVzdWx0CisJICogd291 bGQgaGF2ZSBtb3JlIHRoYW4gcnNjYWxlIGZyYWN0aW9uYWwgZGlnaXRzLCB0cnVuY2F0ZSB0 aGUgY29tcHV0YXRpb24KKwkgKiB3aXRoIE1VTF9HVUFSRF9ESUdJVFMgZ3VhcmQgZGlnaXRz LCBpLmUuLCBpZ25vcmUgaW5wdXQgZGlnaXRzIHRoYXQKKwkgKiB3b3VsZCBvbmx5IGNvbnRy aWJ1dGUgdG8gdGhlIHJpZ2h0IG9mIHRoYXQuICAoVGhpcyB3aWxsIGdpdmUgdGhlIGV4YWN0 CisJICogcm91bmRlZC10by1yc2NhbGUgYW5zd2VyIHVubGVzcyBjYXJyaWVzIG91dCBvZiB0 aGUgaWdub3JlZCBwb3NpdGlvbnMKKwkgKiB3b3VsZCBoYXZlIHByb3BhZ2F0ZWQgdGhyb3Vn aCBtb3JlIHRoYW4gTVVMX0dVQVJEX0RJR0lUUyBkaWdpdHMuKQorCSAqCisJICogTm90ZTog YW4gZXhhY3QgY29tcHV0YXRpb24gY291bGQgbm90IHByb2R1Y2UgbW9yZSB0aGFuIHZhcjFu ZGlnaXRzICsKKwkgKiB2YXIybmRpZ2l0cyBkaWdpdHMsIGJ1dCB3ZSBhbGxvY2F0ZSBvbmUg ZXh0cmEgb3V0cHV0IGRpZ2l0IGluIGNhc2UKKwkgKiByc2NhbGUtZHJpdmVuIHJvdW5kaW5n IHByb2R1Y2VzIGEgY2Fycnkgb3V0IG9mIHRoZSBoaWdoZXN0IGV4YWN0IGRpZ2l0LgorCSAq LworCXJlc19uZGlnaXRzID0gdmFyMW5kaWdpdHMgKyB2YXIybmRpZ2l0cyArIDE7CisJbWF4 ZGlnaXRzID0gcmVzX3dlaWdodCArIDEgKyAocnNjYWxlICsgREVDX0RJR0lUUyAtIDEpIC8g REVDX0RJR0lUUyArCisJCU1VTF9HVUFSRF9ESUdJVFM7CisJcmVzX25kaWdpdHMgPSBNaW4o cmVzX25kaWdpdHMsIG1heGRpZ2l0cyk7CisKKwlpZiAocmVzX25kaWdpdHMgPCAzKQorCXsK KwkJLyogQWxsIGlucHV0IGRpZ2l0cyB3aWxsIGJlIGlnbm9yZWQ7IHNvIHJlc3VsdCBpcyB6 ZXJvICovCisJCXplcm9fdmFyKHJlc3VsdCk7CisJCXJlc3VsdC0+ZHNjYWxlID0gcnNjYWxl OworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBJZiB2YXIxIGFuZCB2YXIyIGFyZSBqdXN0 IG9uZSBvciB0d28gTkJBU0UgZGlnaXRzLCB0aGVpciBwcm9kdWN0IHdpbGwKKwkgKiBmaXQg aW4gYW4gaW50NjQgY2FuIGJlIGNvbXB1dGVkIGRpcmVjdGx5LCB3aGljaCBpcyBzaWduaWZp Y2FudGx5IGZhc3Rlci4KKwkgKi8KKwlpZiAodmFyMm5kaWdpdHMgPD0gMikKKwl7CisJCWlu dDY0CQlwcm9kdWN0ID0gMDsKKwkJc3dpdGNoICh2YXIxbmRpZ2l0cykKKwkJeworCQkJY2Fz ZSAxOgorCQkJCXByb2R1Y3QgPSB2YXIxZGlnaXRzWzBdOworCQkJCWJyZWFrOworCQkJY2Fz ZSAyOgorCQkJCXByb2R1Y3QgPSB2YXIxZGlnaXRzWzBdICogTkJBU0UgKyB2YXIxZGlnaXRz WzFdOworCQkJCWJyZWFrOworCQl9CisKKwkJc3dpdGNoICh2YXIybmRpZ2l0cykKKwkJewor CQkJY2FzZSAxOgorCQkJCXByb2R1Y3QgKj0gdmFyMmRpZ2l0c1swXTsKKwkJCQlicmVhazsK KwkJCWNhc2UgMjoKKwkJCQlwcm9kdWN0ICo9IHZhcjJkaWdpdHNbMF0gKiBOQkFTRSArIHZh cjJkaWdpdHNbMV07CisJCQkJYnJlYWs7CisJCX0KKworCQlhbGxvY192YXIocmVzdWx0LCBy ZXNfbmRpZ2l0cyk7CisJCXJlc19kaWdpdHMgPSByZXN1bHQtPmRpZ2l0czsKKwkJZm9yIChp ID0gcmVzX25kaWdpdHMgLSAxOyBpID49IDA7IGktLSkKKwkJeworCQkJcmVzX2RpZ2l0c1tp XSA9IHByb2R1Y3QgJSBOQkFTRTsKKwkJCXByb2R1Y3QgLz0gTkJBU0U7CisJCX0KKwkJQXNz ZXJ0KHByb2R1Y3QgPT0gMCk7CisKKwkJLyoKKwkJICogRmluYWxseSwgcm91bmQgdGhlIHJl c3VsdCB0byB0aGUgcmVxdWVzdGVkIHByZWNpc2lvbi4KKwkJICovCisJCXJlc3VsdC0+d2Vp Z2h0ID0gcmVzX3dlaWdodDsKKwkJcmVzdWx0LT5zaWduID0gcmVzX3NpZ247CisKKwkJLyog Um91bmQgdG8gdGFyZ2V0IHJzY2FsZSAoYW5kIHNldCByZXN1bHQtPmRzY2FsZSkgKi8KKwkJ cm91bmRfdmFyKHJlc3VsdCwgcnNjYWxlKTsKKworCQkvKiBTdHJpcCBsZWFkaW5nIGFuZCB0 cmFpbGluZyB6ZXJvZXMgKi8KKwkJc3RyaXBfdmFyKHJlc3VsdCk7CisKKwkJcmV0dXJuOwor CX0KKyNpZmRlZiBIQVZFX0lOVDEyOAorCS8qCisJICogSWYgdmFyMSBhbmQgdmFyMiBhcmUg dXAgdG8gZm91ciBkaWdpdHMsIHRoZWlyIHByb2R1Y3Qgd2lsbCBmaXQgaW4KKwkgKiBhbiBp bnQxMjggY2FuIGJlIGNvbXB1dGVkIGRpcmVjdGx5LCB3aGljaCBpcyBzaWduaWZpY2FudGx5 IGZhc3Rlci4KKwkgKi8KKwlpZiAodmFyMm5kaWdpdHMgPD0gNCkKKwl7CisJCWludDEyOAkJ cHJvZHVjdCA9IDA7CisKKwkJc3dpdGNoICh2YXIxbmRpZ2l0cykKKwkJeworCQkJY2FzZSAx OgorCQkJCXByb2R1Y3QgPSB2YXIxZGlnaXRzWzBdOworCQkJCWJyZWFrOworCQkJY2FzZSAy OgorCQkJCXByb2R1Y3QgPSB2YXIxZGlnaXRzWzBdICogTkJBU0UgKyB2YXIxZGlnaXRzWzFd OworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCXByb2R1Y3QgPSAoKGludDEyOCkgdmFy MWRpZ2l0c1swXSAqIE5CQVNFICsgdmFyMWRpZ2l0c1sxXSkKKwkJCQkJCSogTkJBU0UgKyB2 YXIxZGlnaXRzWzJdOworCQkJCWJyZWFrOworCQkJY2FzZSA0OgorCQkJCXByb2R1Y3QgPSAo KChpbnQxMjgpIHZhcjFkaWdpdHNbMF0gKiBOQkFTRSArIHZhcjFkaWdpdHNbMV0pCisJCQkJ CQkqIE5CQVNFICsgdmFyMWRpZ2l0c1syXSkgKiBOQkFTRSArIHZhcjFkaWdpdHNbM107CisJ CQkJYnJlYWs7CisJCX0KKworCQlzd2l0Y2ggKHZhcjJuZGlnaXRzKQorCQl7CisJCQljYXNl IDE6CisJCQkJcHJvZHVjdCAqPSB2YXIyZGlnaXRzWzBdOworCQkJCWJyZWFrOworCQkJY2Fz ZSAyOgorCQkJCXByb2R1Y3QgKj0gdmFyMmRpZ2l0c1swXSAqIE5CQVNFICsgdmFyMmRpZ2l0 c1sxXTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQlwcm9kdWN0ICo9ICgoaW50MTI4 KSB2YXIyZGlnaXRzWzBdICogTkJBU0UgKyB2YXIyZGlnaXRzWzFdKQorCQkJCQkJKiBOQkFT RSArIHZhcjJkaWdpdHNbMl07CisJCQkJYnJlYWs7CisJCQljYXNlIDQ6CisJCQkJcHJvZHVj dCAqPSAoKChpbnQxMjgpIHZhcjJkaWdpdHNbMF0gKiBOQkFTRSArIHZhcjJkaWdpdHNbMV0p CisJCQkJCQkqIE5CQVNFICsgdmFyMmRpZ2l0c1syXSkgKiBOQkFTRSArIHZhcjJkaWdpdHNb M107CisJCQkJYnJlYWs7CisJCX0KKworCQlhbGxvY192YXIocmVzdWx0LCByZXNfbmRpZ2l0 cyk7CisJCXJlc19kaWdpdHMgPSByZXN1bHQtPmRpZ2l0czsKKwkJZm9yIChpID0gcmVzX25k aWdpdHMgLSAxOyBpID49IDA7IGktLSkKKwkJeworCQkJcmVzX2RpZ2l0c1tpXSA9IHByb2R1 Y3QgJSBOQkFTRTsKKwkJCXByb2R1Y3QgLz0gTkJBU0U7CisJCX0KKwkJQXNzZXJ0KHByb2R1 Y3QgPT0gMCk7CisKKwkJLyoKKwkJICogRmluYWxseSwgcm91bmQgdGhlIHJlc3VsdCB0byB0 aGUgcmVxdWVzdGVkIHByZWNpc2lvbi4KKwkJICovCisJCXJlc3VsdC0+d2VpZ2h0ID0gcmVz X3dlaWdodDsKKwkJcmVzdWx0LT5zaWduID0gcmVzX3NpZ247CisKKwkJLyogUm91bmQgdG8g dGFyZ2V0IHJzY2FsZSAoYW5kIHNldCByZXN1bHQtPmRzY2FsZSkgKi8KKwkJcm91bmRfdmFy KHJlc3VsdCwgcnNjYWxlKTsKKworCQkvKiBTdHJpcCBsZWFkaW5nIGFuZCB0cmFpbGluZyB6 ZXJvZXMgKi8KKwkJc3RyaXBfdmFyKHJlc3VsdCk7CisKKwkJcmV0dXJuOworCX0KKyNlbmRp ZgorCisJLyoKKwkgKiBXZSBkbyB0aGUgYXJpdGhtZXRpYyBpbiBhbiBhcnJheSAiZGlnW10i IG9mIHNpZ25lZCBpbnQncy4gIFNpbmNlCisJICogSU5UX01BWCBpcyBub3RpY2VhYmx5IGxh cmdlciB0aGFuIE5CQVNFKk5CQVNFLCB0aGlzIGdpdmVzIHVzIGhlYWRyb29tCisJICogdG8g YXZvaWQgbm9ybWFsaXppbmcgY2FycmllcyBpbW1lZGlhdGVseS4KKwkgKgorCSAqIG1heGRp ZyB0cmFja3MgdGhlIG1heGltdW0gcG9zc2libGUgdmFsdWUgb2YgYW55IGRpZ1tdIGVudHJ5 OyB3aGVuIHRoaXMKKwkgKiB0aHJlYXRlbnMgdG8gZXhjZWVkIElOVF9NQVgsIHdlIHRha2Ug dGhlIHRpbWUgdG8gcHJvcGFnYXRlIGNhcnJpZXMuCisJICogRnVydGhlcm1vcmUsIHdlIG5l ZWQgdG8gZW5zdXJlIHRoYXQgb3ZlcmZsb3cgZG9lc24ndCBvY2N1ciBkdXJpbmcgdGhlCisJ ICogY2FycnkgcHJvcGFnYXRpb24gcGFzc2VzIGVpdGhlci4gIFRoZSBjYXJyeSB2YWx1ZXMg Y291bGQgYmUgYXMgbXVjaCBhcworCSAqIElOVF9NQVgvTkJBU0UsIHNvIHJlYWxseSB3ZSBt dXN0IG5vcm1hbGl6ZSB3aGVuIGRpZ2l0cyB0aHJlYXRlbiB0bworCSAqIGV4Y2VlZCBJTlRf TUFYIC0gSU5UX01BWC9OQkFTRS4KKwkgKgorCSAqIFRvIGF2b2lkIG92ZXJmbG93IGluIG1h eGRpZyBpdHNlbGYsIGl0IGFjdHVhbGx5IHJlcHJlc2VudHMgdGhlIG1heAorCSAqIHBvc3Np YmxlIHZhbHVlIGRpdmlkZWQgYnkgTkJBU0UtMSwgaWUsIGF0IHRoZSB0b3Agb2YgdGhlIGxv b3AgaXQgaXMKKwkgKiBrbm93biB0aGF0IG5vIGRpZ1tdIGVudHJ5IGV4Y2VlZHMgbWF4ZGln ICogKE5CQVNFLTEpLgorCSAqLworCWRpZyA9IChpbnQgKikgcGFsbG9jMChyZXNfbmRpZ2l0 cyAqIHNpemVvZihpbnQpKTsKKwltYXhkaWcgPSAwOworCisJLyoKKwkgKiBUaGUgbGVhc3Qg c2lnbmlmaWNhbnQgZGlnaXRzIG9mIHZhcjEgc2hvdWxkIGJlIGlnbm9yZWQgaWYgdGhleSBk b24ndAorCSAqIGNvbnRyaWJ1dGUgZGlyZWN0bHkgdG8gdGhlIGZpcnN0IHJlc19uZGlnaXRz IGRpZ2l0cyBvZiB0aGUgcmVzdWx0IHRoYXQKKwkgKiB3ZSBhcmUgY29tcHV0aW5nLgorCSAq CisJICogRGlnaXQgaTEgb2YgdmFyMSBhbmQgZGlnaXQgaTIgb2YgdmFyMiBhcmUgbXVsdGlw bGllZCBhbmQgYWRkZWQgdG8gZGlnaXQKKwkgKiBpMStpMisyIG9mIHRoZSBhY2N1bXVsYXRv ciBhcnJheSwgc28gd2UgbmVlZCBvbmx5IGNvbnNpZGVyIGRpZ2l0cyBvZgorCSAqIHZhcjEg Zm9yIHdoaWNoIGkxIDw9IHJlc19uZGlnaXRzIC0gMy4KKwkgKi8KKwlmb3IgKGkxID0gTWlu KHZhcjFuZGlnaXRzIC0gMSwgcmVzX25kaWdpdHMgLSAzKTsgaTEgPj0gMDsgaTEtLSkKKwl7 CisJCU51bWVyaWNEaWdpdCB2YXIxZGlnaXQgPSB2YXIxZGlnaXRzW2kxXTsKKworCQlpZiAo dmFyMWRpZ2l0ID09IDApCisJCQljb250aW51ZTsKKworCQkvKiBUaW1lIHRvIG5vcm1hbGl6 ZT8gKi8KKwkJbWF4ZGlnICs9IHZhcjFkaWdpdDsKKwkJaWYgKG1heGRpZyA+IChJTlRfTUFY IC0gSU5UX01BWCAvIE5CQVNFKSAvIChOQkFTRSAtIDEpKQorCQl7CisJCQkvKiBZZXMsIGRv IGl0ICovCisJCQljYXJyeSA9IDA7CisJCQlmb3IgKGkgPSByZXNfbmRpZ2l0cyAtIDE7IGkg Pj0gMDsgaS0tKQorCQkJeworCQkJCW5ld2RpZyA9IGRpZ1tpXSArIGNhcnJ5OworCQkJCWlm IChuZXdkaWcgPj0gTkJBU0UpCisJCQkJeworCQkJCQljYXJyeSA9IG5ld2RpZyAvIE5CQVNF OworCQkJCQluZXdkaWcgLT0gY2FycnkgKiBOQkFTRTsKKwkJCQl9CisJCQkJZWxzZQorCQkJ CQljYXJyeSA9IDA7CisJCQkJZGlnW2ldID0gbmV3ZGlnOworCQkJfQorCQkJQXNzZXJ0KGNh cnJ5ID09IDApOworCQkJLyogUmVzZXQgbWF4ZGlnIHRvIGluZGljYXRlIG5ldyB3b3JzdC1j YXNlICovCisJCQltYXhkaWcgPSAxICsgdmFyMWRpZ2l0OworCQl9CisKKwkJLyoKKwkJICog QWRkIHRoZSBhcHByb3ByaWF0ZSBtdWx0aXBsZSBvZiB2YXIyIGludG8gdGhlIGFjY3VtdWxh dG9yLgorCQkgKgorCQkgKiBBcyBhYm92ZSwgZGlnaXRzIG9mIHZhcjIgY2FuIGJlIGlnbm9y ZWQgaWYgdGhleSBkb24ndCBjb250cmlidXRlLAorCQkgKiBzbyB3ZSBvbmx5IGluY2x1ZGUg ZGlnaXRzIGZvciB3aGljaCBpMStpMisyIDwgcmVzX25kaWdpdHMuCisJCSAqCisJCSAqIFRo aXMgaW5uZXIgbG9vcCBpcyB0aGUgcGVyZm9ybWFuY2UgYm90dGxlbmVjayBmb3IgbXVsdGlw bGljYXRpb24sCisJCSAqIHNvIHdlIHdhbnQgdG8ga2VlcCBpdCBzaW1wbGUgZW5vdWdoIHNv IHRoYXQgaXQgY2FuIGJlCisJCSAqIGF1dG8tdmVjdG9yaXplZC4gIEFjY29yZGluZ2x5LCBw cm9jZXNzIHRoZSBkaWdpdHMgbGVmdC10by1yaWdodAorCQkgKiBldmVuIHRob3VnaCBzY2hv b2xib29rIG11bHRpcGxpY2F0aW9uIHdvdWxkIHN1Z2dlc3QgcmlnaHQtdG8tbGVmdC4KKwkJ ICogU2luY2Ugd2UgYXJlbid0IHByb3BhZ2F0aW5nIGNhcnJpZXMgaW4gdGhpcyBsb29wLCB0 aGUgb3JkZXIgZG9lcworCQkgKiBub3QgbWF0dGVyLgorCQkgKi8KKwkJeworCQkJaW50CQkJ aTJsaW1pdCA9IE1pbih2YXIybmRpZ2l0cywgcmVzX25kaWdpdHMgLSBpMSAtIDIpOworCQkJ aW50CQkgICAqZGlnX2kxXzIgPSAmZGlnW2kxICsgMl07CisKKwkJCWZvciAoaTIgPSAwOyBp MiA8IGkybGltaXQ7IGkyKyspCisJCQkJZGlnX2kxXzJbaTJdICs9IHZhcjFkaWdpdCAqIHZh cjJkaWdpdHNbaTJdOworCQl9CisJfQorCisJLyoKKwkgKiBOb3cgd2UgZG8gYSBmaW5hbCBj YXJyeSBwcm9wYWdhdGlvbiBwYXNzIHRvIG5vcm1hbGl6ZSB0aGUgcmVzdWx0LCB3aGljaAor CSAqIHdlIGNvbWJpbmUgd2l0aCBzdG9yaW5nIHRoZSByZXN1bHQgZGlnaXRzIGludG8gdGhl IG91dHB1dC4gTm90ZSB0aGF0CisJICogdGhpcyBpcyBzdGlsbCBkb25lIGF0IGZ1bGwgcHJl Y2lzaW9uIHcvZ3VhcmQgZGlnaXRzLgorCSAqLworCWFsbG9jX3ZhcihyZXN1bHQsIHJlc19u ZGlnaXRzKTsKKwlyZXNfZGlnaXRzID0gcmVzdWx0LT5kaWdpdHM7CisJY2FycnkgPSAwOwor CWZvciAoaSA9IHJlc19uZGlnaXRzIC0gMTsgaSA+PSAwOyBpLS0pCisJeworCQluZXdkaWcg PSBkaWdbaV0gKyBjYXJyeTsKKwkJaWYgKG5ld2RpZyA+PSBOQkFTRSkKKwkJeworCQkJY2Fy cnkgPSBuZXdkaWcgLyBOQkFTRTsKKwkJCW5ld2RpZyAtPSBjYXJyeSAqIE5CQVNFOworCQl9 CisJCWVsc2UKKwkJCWNhcnJ5ID0gMDsKKwkJcmVzX2RpZ2l0c1tpXSA9IG5ld2RpZzsKKwl9 CisJQXNzZXJ0KGNhcnJ5ID09IDApOworCisJcGZyZWUoZGlnKTsKKworCS8qCisJICogRmlu YWxseSwgcm91bmQgdGhlIHJlc3VsdCB0byB0aGUgcmVxdWVzdGVkIHByZWNpc2lvbi4KKwkg Ki8KKwlyZXN1bHQtPndlaWdodCA9IHJlc193ZWlnaHQ7CisJcmVzdWx0LT5zaWduID0gcmVz X3NpZ247CisKKwkvKiBSb3VuZCB0byB0YXJnZXQgcnNjYWxlIChhbmQgc2V0IHJlc3VsdC0+ ZHNjYWxlKSAqLworCXJvdW5kX3ZhcihyZXN1bHQsIHJzY2FsZSk7CisKKwkvKiBTdHJpcCBs ZWFkaW5nIGFuZCB0cmFpbGluZyB6ZXJvZXMgKi8KKwlzdHJpcF92YXIocmVzdWx0KTsKKwor fQorCiAKIC8qCiAgKiBkaXZfdmFyKCkgLQpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvY2F0 YWxvZy9wZ19wcm9jLmRhdCBiL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQKaW5k ZXggNmE1NDc2ZDNjNC4uMTVkZGUwZjNjMyAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvY2F0 YWxvZy9wZ19wcm9jLmRhdAorKysgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0 CkBAIC00NDY1LDYgKzQ0NjUsOSBAQAogeyBvaWQgPT4gJzE3MjYnLAogICBwcm9uYW1lID0+ ICdudW1lcmljX211bCcsIHByb3JldHR5cGUgPT4gJ251bWVyaWMnLAogICBwcm9hcmd0eXBl cyA9PiAnbnVtZXJpYyBudW1lcmljJywgcHJvc3JjID0+ICdudW1lcmljX211bCcgfSwKK3sg b2lkID0+ICc2MzQ3JywKKyAgcHJvbmFtZSA9PiAnbnVtZXJpY19tdWxfcGF0Y2hlZCcsIHBy b3JldHR5cGUgPT4gJ251bWVyaWMnLAorICBwcm9hcmd0eXBlcyA9PiAnbnVtZXJpYyBudW1l cmljJywgcHJvc3JjID0+ICdudW1lcmljX211bF9wYXRjaGVkJyB9LAogeyBvaWQgPT4gJzE3 MjcnLAogICBwcm9uYW1lID0+ICdudW1lcmljX2RpdicsIHByb3JldHR5cGUgPT4gJ251bWVy aWMnLAogICBwcm9hcmd0eXBlcyA9PiAnbnVtZXJpYyBudW1lcmljJywgcHJvc3JjID0+ICdu dW1lcmljX2RpdicgfSwKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3V0aWxzL251bWVyaWMu aCBiL3NyYy9pbmNsdWRlL3V0aWxzL251bWVyaWMuaAppbmRleCA0M2M3NWM0MzZmLi45MDM2 YzlkYjUwIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS91dGlscy9udW1lcmljLmgKKysrIGIv c3JjL2luY2x1ZGUvdXRpbHMvbnVtZXJpYy5oCkBAIC05Nyw2ICs5Nyw4IEBAIGV4dGVybiBO dW1lcmljIG51bWVyaWNfc3ViX29wdF9lcnJvcihOdW1lcmljIG51bTEsIE51bWVyaWMgbnVt MiwKIAkJCQkJCQkJCSBib29sICpoYXZlX2Vycm9yKTsKIGV4dGVybiBOdW1lcmljIG51bWVy aWNfbXVsX29wdF9lcnJvcihOdW1lcmljIG51bTEsIE51bWVyaWMgbnVtMiwKIAkJCQkJCQkJ CSBib29sICpoYXZlX2Vycm9yKTsKK2V4dGVybiBOdW1lcmljIG51bWVyaWNfbXVsX3BhdGNo ZWRfb3B0X2Vycm9yKE51bWVyaWMgbnVtMSwgTnVtZXJpYyBudW0yLAorCQkJCQkJCQkJIGJv b2wgKmhhdmVfZXJyb3IpOwogZXh0ZXJuIE51bWVyaWMgbnVtZXJpY19kaXZfb3B0X2Vycm9y KE51bWVyaWMgbnVtMSwgTnVtZXJpYyBudW0yLAogCQkJCQkJCQkJIGJvb2wgKmhhdmVfZXJy b3IpOwogZXh0ZXJuIE51bWVyaWMgbnVtZXJpY19tb2Rfb3B0X2Vycm9yKE51bWVyaWMgbnVt MSwgTnVtZXJpYyBudW0yLAotLSAKMi40NS4xCgo= --fb717db6e32246acbcb9f4d435f0d433--