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.96) (envelope-from ) id 1w3cFX-001Ob1-07 for pgsql-hackers@arkaria.postgresql.org; Fri, 20 Mar 2026 15:58:59 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w3cFV-006vwr-1c for pgsql-hackers@arkaria.postgresql.org; Fri, 20 Mar 2026 15:58:57 +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.96) (envelope-from ) id 1w3cFU-006vwj-2h for pgsql-hackers@lists.postgresql.org; Fri, 20 Mar 2026 15:58:57 +0000 Received: from forward501d.mail.yandex.net ([178.154.239.209]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.98.2) (envelope-from ) id 1w3cFP-00000000BqI-1MxD for pgsql-hackers@lists.postgresql.org; Fri, 20 Mar 2026 15:58:56 +0000 Received: from mail-nwsmtp-smtp-production-main-81.klg.yp-c.yandex.net (mail-nwsmtp-smtp-production-main-81.klg.yp-c.yandex.net [IPv6:2a02:6b8:c42:3d48:0:640:52d7:0]) by forward501d.mail.yandex.net (Yandex) with ESMTPS id 8ED21815C8; Fri, 20 Mar 2026 18:58:47 +0300 (MSK) Received: by mail-nwsmtp-smtp-production-main-81.klg.yp-c.yandex.net (smtp/Yandex) with ESMTPSA id hwRQDo3GVGk0-GrmBqQCZ; Fri, 20 Mar 2026 18:58:46 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tantorlabs.com; s=mail; t=1774022327; bh=mj/iYmjjTFwEAQ5sayonMqFnxlLCmFRpZFrN6rectmU=; h=In-Reply-To:Cc:Date:References:To:Subject:Message-ID:From; b=aZucCV5/NkeqMVdUvxHUMDiQyTlSZcwiDc97O+tjXIOshkkAuuOis20qR0CrC/xHx au07eeL6x904vYagEJEGnSjysYS3IFZVoK0fvJDYFw7RcHvyohWx3he2aH9mgpSOPa 0ANDYWyfNqem8Ai4gw9uIfnWTnnWGKBJrjEq4fVM= Authentication-Results: mail-nwsmtp-smtp-production-main-81.klg.yp-c.yandex.net; dkim=pass header.i=@tantorlabs.com Content-Type: multipart/mixed; boundary="------------JTZhw03S6KMzOpCR4jTRhExO" Message-ID: <98f8b6e5-22ec-46ca-9d58-197c4259b65d@tantorlabs.com> Date: Fri, 20 Mar 2026 18:58:43 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Hash-based MCV matching for large IN-lists To: Zsolt Parragi Cc: David Geier , Chengpeng Yan , Tatsuya Kawata , "pgsql-hackers@lists.postgresql.org" References: <7db341e0-fbc6-4ec5-922c-11fdafe7be12@tantorlabs.com> <988e3168-6096-488a-bb42-787e1e8c21a4@tantorlabs.com> <21FF6A0B-886F-4132-B6A6-0F4E934B4CEE@Outlook.com> <8ee9d903-bb13-434c-8145-b3769bf2b3cb@tantorlabs.com> <9e3054ae-1c5d-46dd-9b6a-7fb67764b076@tantorlabs.com> <9067a807-f130-4631-8df4-076c6d7e43b6@tantorlabs.com> <03aa576f-13bb-4ed1-bee4-0ee69ad8813c@tantorlabs.com> <8375f8b5-1f21-401e-bbc3-a749302b76c7@tantorlabs.com> Content-Language: en-US From: Ilia Evdokimov In-Reply-To: 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. --------------JTZhw03S6KMzOpCR4jTRhExO Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 3/11/26 11:01, Zsolt Parragi wrote: > + /* > + * For ALL semantics, if the array contains NULL, assume > + * operator is strict. The ScalarArrayOpExpr cannot > + * evaluate to TRUE, so return zero. > + */ > > > > + nonconst_sel = var_eq_non_const(&vardata, operator, > + clause->inputcollid, > + other_op, var_on_left, > + isInequality); > > + if (isInequality) > + individual_s = 1.0 - individual_s - nullfrac; > > Isn't this the double negation issue again, which was once > mentioned/fixed earlier? Right. I fixed it by using 'invert' for non-constant case. If there is a more elegant way to structure this, suggestions are very welcome. > + int count; /* number of occurrences of current value in */ > > That's a truncated comment Fixed. After the commit c95cd29 I have rebased this patch. During the rebase, I also add the NUL-handling path. In particular, I added an Assert(useOr) in the relevant branch to document and enforce the expected execution flow. Additionally after theĀ 374a639 I prepared a set of regression-style tests to verify that the selectivity estimates remain unchanged before and after applying the patch. However, these tests rely on stable row estimates from EXPLAIN, which are not guaranteed to be consistent across platforms. For that reason, they are not suitable for inclusion in the upstream test suite. I will keep these tests locally to validate correctness before and after the patch. -- Best regards, Ilia Evdokimov, Tantor Labs LLC, https://tantorlabs.com/ --------------JTZhw03S6KMzOpCR4jTRhExO Content-Type: text/x-patch; charset=UTF-8; name="v9-0001-Use-hash-based-MCV-matching-for-ScalarArrayOpExpr.patch" Content-Disposition: attachment; filename*0="v9-0001-Use-hash-based-MCV-matching-for-ScalarArrayOpExpr.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSA1ZDkzZjk0NWEwMjJkMzhiM2RkMzljOTQwYmE2MjBhMzY0MGJiMjM2IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBFdmRva2ltb3YgSWxpYSA8aWx5YS5ldmRva2ltb3ZA dGFudG9ybGFicy5jb20+CkRhdGU6IEZyaSwgMjAgTWFyIDIwMjYgMTg6MTg6MjQgKzAzMDAK U3ViamVjdDogW1BBVENIIHY5XSBVc2UgaGFzaC1iYXNlZCBNQ1YgbWF0Y2hpbmcgZm9yIFNj YWxhckFycmF5T3BFeHByCiBzZWxlY3Rpdml0eQoKV2hlbiBlc3RpbWF0aW5nIHNlbGVjdGl2 aXR5IGZvciBTY2FsYXJBcnJheU9wRXhwciAoSU4gLyBBTlkgLyBBTEwpIHdpdGgKYXZhaWxh YmxlIE1DViBzdGF0aXN0aWNzLCB0aGUgcGxhbm5lciBjdXJyZW50bHkgbWF0Y2hlcyBJTi1s aXN0IGVsZW1lbnRzCmFnYWluc3QgdGhlIE1DViBhcnJheSB1c2luZyBuZXN0ZWQgbG9vcHMu IEZvciBsYXJnZSBJTi1saXN0cyBhbmQvb3IgbGFyZ2UKTUNWIGxpc3RzIHRoaXMgbGVhZHMg dG8gTyhOKk0pIHBsYW5uaW5nLXRpbWUgYmVoYXZpb3IuCgpUaGlzIHBhdGNoIGFkZHMgYSBo YXNoLWJhc2VkIG1hdGNoaW5nIHN0cmF0ZWd5LCBzaW1pbGFyIHRvIHRoZSBvbmUgdXNlZApp biBqb2luIHNlbGVjdGl2aXR5IGVzdGltYXRpb24uIFdoZW4gTUNWIHN0YXRpc3RpY3MgYXJl IGF2YWlsYWJsZSBhbmQgdGhlCm9wZXJhdG9yIHN1cHBvcnRzIGhhc2hpbmcsIHRoZSBzbWFs bGVyIG9mIHRoZSB0d28gaW5wdXRzIChNQ1YgbGlzdCBvcgpJTi1saXN0IGNvbnN0YW50IGVs ZW1lbnRzKSBpcyBjaG9zZW4gYXMgdGhlIGhhc2ggdGFibGUgYnVpbGQgc2lkZSwgYW5kCnRo ZSBvdGhlciBzaWRlIGlzIHNjYW5uZWQgb25jZSwgcmVkdWNpbmcgY29tcGxleGl0eSB0byBP KE4rTSkuCgpUaGUgaGFzaC1iYXNlZCBwYXRoIGlzIHJlc3RyaWN0ZWQgdG8gZXF1YWxpdHkg YW5kIGluZXF1YWxpdHkgb3BlcmF0b3JzCnRoYXQgdXNlIGVxc2VsKCkvbmVxc2VsKCksIGFu ZCBpcyBhcHBsaWVkIG9ubHkgd2hlbiBzdWl0YWJsZSBoYXNoCmZ1bmN0aW9ucyBhbmQgTUNW IHN0YXRpc3RpY3MgYXJlIGF2YWlsYWJsZS4KLS0tCiBzcmMvYmFja2VuZC91dGlscy9hZHQv c2VsZnVuY3MuYyB8IDUyMCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKystCiAxIGZp bGUgY2hhbmdlZCwgNTE1IGluc2VydGlvbnMoKyksIDUgZGVsZXRpb25zKC0pCgpkaWZmIC0t Z2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMgYi9zcmMvYmFja2VuZC91 dGlscy9hZHQvc2VsZnVuY3MuYwppbmRleCA4NmI1NWM5YmI4Yi4uMWQ4MTIxNjI5ODAgMTAw NjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9zZWxmdW5jcy5jCisrKyBiL3NyYy9i YWNrZW5kL3V0aWxzL2FkdC9zZWxmdW5jcy5jCkBAIC0xNDYsMjMgKzE0NiwyNyBAQAogLyoK ICAqIEluIHByb2R1Y3Rpb24gYnVpbGRzLCBzd2l0Y2ggdG8gaGFzaC1iYXNlZCBNQ1YgbWF0 Y2hpbmcgd2hlbiB0aGUgbGlzdHMgYXJlCiAgKiBsYXJnZSBlbm91Z2ggdG8gYW1vcnRpemUg aGFzaCBzZXR1cCBjb3N0LiAgKFRoaXMgdGhyZXNob2xkIGlzIGNvbXBhcmVkIHRvCi0gKiB0 aGUgc3VtIG9mIHRoZSBsZW5ndGhzIG9mIHRoZSB0d28gTUNWIGxpc3RzLiAgVGhpcyBpcyBz aW1wbGlzdGljIGJ1dCBzZWVtcworICogdGhlIHN1bSBvZiB0aGUgbGVuZ3RocyBvZiB0aGUg dHdvIGxpc3RzLiAgVGhpcyBpcyBzaW1wbGlzdGljIGJ1dCBzZWVtcwogICogdG8gd29yayB3 ZWxsIGVub3VnaC4pICBJbiBkZWJ1ZyBidWlsZHMsIHdlIHVzZSBhIHNtYWxsZXIgdGhyZXNo b2xkIHNvIHRoYXQKICAqIHRoZSByZWdyZXNzaW9uIHRlc3RzIGNvdmVyIGJvdGggcGF0aHMg d2VsbC4KICAqLwogI2lmbmRlZiBVU0VfQVNTRVJUX0NIRUNLSU5HCi0jZGVmaW5lIEVRSk9J TlNFTF9NQ1ZfSEFTSF9USFJFU0hPTEQgMjAwCisjZGVmaW5lIE1DVl9IQVNIX1RIUkVTSE9M RCAyMDAKICNlbHNlCi0jZGVmaW5lIEVRSk9JTlNFTF9NQ1ZfSEFTSF9USFJFU0hPTEQgMjAK KyNkZWZpbmUgTUNWX0hBU0hfVEhSRVNIT0xEIDIwCiAjZW5kaWYKIAotLyogRW50cmllcyBp biB0aGUgc2ltcGxlaGFzaCBoYXNoIHRhYmxlIHVzZWQgYnkgZXFqb2luc2VsX2ZpbmRfbWF0 Y2hlcyAqLworLyoKKyAqIEVudHJpZXMgaW4gdGhlIHNpbXBsZWhhc2ggaGFzaCB0YWJsZSB1 c2VkIGJ5CisgKiBlcWpvaW5zZWxfZmluZF9tYXRjaGVzIGFuZCBzY2FsYXJhcnJheV9tY3Zf aGFzaF9tYXRjaAorICovCiB0eXBlZGVmIHN0cnVjdCBNQ1ZIYXNoRW50cnkKIHsKIAlEYXR1 bQkJdmFsdWU7CQkJLyogdGhlIHZhbHVlIHJlcHJlc2VudGVkIGJ5IHRoaXMgZW50cnkgKi8K IAlpbnQJCQlpbmRleDsJCQkvKiBpdHMgaW5kZXggaW4gdGhlIHJlbGV2YW50IEF0dFN0YXRz U2xvdCAqLwogCXVpbnQzMgkJaGFzaDsJCQkvKiBoYXNoIGNvZGUgZm9yIHRoZSBEYXR1bSAq LwogCWNoYXIJCXN0YXR1czsJCQkvKiBzdGF0dXMgY29kZSB1c2VkIGJ5IHNpbXBsZWhhc2gu aCAqLworCWludAkJCWNvdW50OwkJCS8qIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiBjdXJy ZW50IHZhbHVlICovCiB9IE1DVkhhc2hFbnRyeTsKIAogLyogcHJpdmF0ZV9kYXRhIGZvciB0 aGUgc2ltcGxlaGFzaCBoYXNoIHRhYmxlICovCkBAIC0xODQsNiArMTg4LDE2IEBAIGdldF9y ZWxhdGlvbl9zdGF0c19ob29rX3R5cGUgZ2V0X3JlbGF0aW9uX3N0YXRzX2hvb2sgPSBOVUxM OwogZ2V0X2luZGV4X3N0YXRzX2hvb2tfdHlwZSBnZXRfaW5kZXhfc3RhdHNfaG9vayA9IE5V TEw7CiAKIHN0YXRpYyBkb3VibGUgZXFzZWxfaW50ZXJuYWwoUEdfRlVOQ1RJT05fQVJHUywg Ym9vbCBuZWdhdGUpOworc3RhdGljIGRvdWJsZSBzY2FsYXJhcnJheV9tY3ZfaGFzaF9tYXRj aChWYXJpYWJsZVN0YXREYXRhICp2YXJkYXRhLCBPaWQgb3BlcmF0b3IsCisJCQkJCQkJCQkJ IE9pZCBjb2xsYXRpb24sIFNlbGVjdGl2aXR5IG5vbmNvbnN0X3NlbCwKKwkJCQkJCQkJCQkg RGF0dW0gKmVsZW1fdmFsdWVzLCBib29sICplbGVtX251bGxzLAorCQkJCQkJCQkJCSBpbnQg bnVtX2VsZW1zLCBib29sICplbGVtX2NvbnN0LAorCQkJCQkJCQkJCSBPaWQgbm9taW5hbF9l bGVtZW50X3R5cGUsIGJvb2wgdXNlT3IsCisJCQkJCQkJCQkJIGJvb2wgaXNFcXVhbGl0eSwg Ym9vbCBpc0luZXF1YWxpdHkpOworc3RhdGljIHZvaWQgYWNjdW1fc2NhbGFyYXJyYXlfcHJv Yihkb3VibGUgczEsIGludCBjb3VudCwgYm9vbCB1c2VPciwKKwkJCQkJCQkJICAgYm9vbCBp c0VxdWFsaXR5LCBib29sIGlzSW5lcXVhbGl0eSwKKwkJCQkJCQkJICAgZG91YmxlIG51bGxm cmFjLCAgYm9vbCBpbnZlcnQsCisJCQkJCQkJCSAgIGRvdWJsZSAqc2VsZWMsIGRvdWJsZSAq czFkaXNqb2ludCk7CiBzdGF0aWMgZG91YmxlIGVxam9pbnNlbF9pbm5lcihGbWdySW5mbyAq ZXFwcm9jLCBPaWQgY29sbGF0aW9uLAogCQkJCQkJCSAgT2lkIGhhc2hMZWZ0LCBPaWQgaGFz aFJpZ2h0LAogCQkJCQkJCSAgVmFyaWFibGVTdGF0RGF0YSAqdmFyZGF0YTEsIFZhcmlhYmxl U3RhdERhdGEgKnZhcmRhdGEyLApAQCAtMTg5Myw2ICsxOTA3LDM3IEBAIHN0cmlwX2FycmF5 X2NvZXJjaW9uKE5vZGUgKm5vZGUpCiAJcmV0dXJuIG5vZGU7CiB9CiAKKy8qCisgKiBBY2N1 bXVsYXRlIHRoZSBzZWxlY3Rpdml0eSBjb250cmlidXRpb24gb2YgYSBzaW5nbGUgYXJyYXkg ZWxlbWVudAorICogaW50byB0aGUgcnVubmluZyBTY2FsYXJBcnJheU9wRXhwciBzZWxlY3Rp dml0eSBlc3RpbWF0ZS4KKyAqLworc3RhdGljIHZvaWQKK2FjY3VtX3NjYWxhcmFycmF5X3By b2IoZG91YmxlIHMxLCBpbnQgY291bnQsIGJvb2wgdXNlT3IsIGJvb2wgaXNFcXVhbGl0eSwK KwkJCQkJICAgYm9vbCBpc0luZXF1YWxpdHksIGRvdWJsZSBudWxsZnJhYywgYm9vbCBpbnZl cnQsCisJCQkJCSAgIGRvdWJsZSAqc2VsZWMsIGRvdWJsZSAqczFkaXNqb2ludCkKK3sKKwlp ZiAoY291bnQgPD0gMCkKKwkJcmV0dXJuOworCisJaWYgKGludmVydCAmJiBpc0luZXF1YWxp dHkpCisJCXMxID0gMS4wIC0gczEgLSBudWxsZnJhYzsKKworCUNMQU1QX1BST0JBQklMSVRZ KHMxKTsKKworCWlmICh1c2VPcikKKwl7CisJCSpzZWxlYyA9IDEuMCAtICgxLjAgLSAqc2Vs ZWMpICogcG93KDEuMCAtIHMxLCBjb3VudCk7CisJCWlmIChpc0VxdWFsaXR5KQorCQkJKnMx ZGlzam9pbnQgKz0gczEgKiBjb3VudDsKKwl9CisJZWxzZQorCXsKKwkJKnNlbGVjID0gKCpz ZWxlYykgKiBwb3coczEsIGNvdW50KTsKKwkJaWYgKGlzSW5lcXVhbGl0eSkKKwkJCSpzMWRp c2pvaW50ICs9IGNvdW50ICogKHMxIC0gMS4wKTsKKwl9Cit9CisKIC8qCiAgKgkJc2NhbGFy YXJyYXlzZWwJCS0gU2VsZWN0aXZpdHkgb2YgU2NhbGFyQXJyYXlPcEV4cHIgTm9kZS4KICAq LwpAQCAtMjAzNCw2ICsyMDc5LDM2IEBAIHNjYWxhcmFycmF5c2VsKFBsYW5uZXJJbmZvICpy b290LAogCQkJCQkJICBlbG1sZW4sIGVsbWJ5dmFsLCBlbG1hbGlnbiwKIAkJCQkJCSAgJmVs ZW1fdmFsdWVzLCAmZWxlbV9udWxscywgJm51bV9lbGVtcyk7CiAKKwkJLyogVHJ5IHRvIGF2 b2lkIE8oTl4yKSBzZWxlY3Rpdml0eSBjYWxjdWxhdGlvbiBmb3IgU2NhbGFyQXJyYXlPcEV4 cHIgKi8KKwkJaWYgKChpc0VxdWFsaXR5IHx8IGlzSW5lcXVhbGl0eSkgJiYgIWlzX2pvaW5f Y2xhdXNlKQorCQl7CisJCQlWYXJpYWJsZVN0YXREYXRhIHZhcmRhdGE7CisJCQlOb2RlCSAg ICpvdGhlcl9vcCA9IE5VTEw7CisJCQlib29sCQl2YXJfb25fbGVmdDsKKwkJCWJvb2wJICAg KmVsZW1fY29uc3QgPSBOVUxMOworCisJCQkvKgorCQkJICogSWYgdGhlIGNsYXVzZSBpcyBv ZiB0aGUgZm9ybSAidmFyIE9QIHNvbWV0aGluZyIgb3IgInNvbWV0aGluZworCQkJICogT1Ag dmFyIiwgZXh0cmFjdCBzdGF0aXN0aWNzIGZvciB0aGUgdmFyaWFibGUuIE90aGVyd2lzZSwg ZmFsbAorCQkJICogYmFjayB0byBhIGRlZmF1bHQgcGVyLWVsZW1lbnQgZXN0aW1hdGUuCisJ CQkgKi8KKwkJCWlmIChnZXRfcmVzdHJpY3Rpb25fdmFyaWFibGUocm9vdCwgY2xhdXNlLT5h cmdzLCB2YXJSZWxpZCwKKwkJCQkJCQkJCQkgJnZhcmRhdGEsICZvdGhlcl9vcCwgJnZhcl9v bl9sZWZ0KSkKKwkJCXsKKwkJCQlzMSA9IHNjYWxhcmFycmF5X21jdl9oYXNoX21hdGNoKCZ2 YXJkYXRhLCBvcGVyYXRvciwKKwkJCQkJCQkJCQkJCWNsYXVzZS0+aW5wdXRjb2xsaWQsIC0x LjAsCisJCQkJCQkJCQkJCQllbGVtX3ZhbHVlcywgZWxlbV9udWxscywKKwkJCQkJCQkJCQkJ CW51bV9lbGVtcywgZWxlbV9jb25zdCwKKwkJCQkJCQkJCQkJCW5vbWluYWxfZWxlbWVudF90 eXBlLCB1c2VPciwKKwkJCQkJCQkJCQkJCWlzRXF1YWxpdHksIGlzSW5lcXVhbGl0eSk7CisK KwkJCQlSZWxlYXNlVmFyaWFibGVTdGF0cyh2YXJkYXRhKTsKKworCQkJCWlmIChzMSA+PSAw LjApCisJCQkJCXJldHVybiBzMTsKKwkJCX0KKwkJfQorCiAJCS8qCiAJCSAqIEZvciBnZW5l cmljIG9wZXJhdG9ycywgd2UgYXNzdW1lIHRoZSBwcm9iYWJpbGl0eSBvZiBzdWNjZXNzIGlz CiAJCSAqIGluZGVwZW5kZW50IGZvciBlYWNoIGFycmF5IGVsZW1lbnQuICBCdXQgZm9yICI9 IEFOWSIgb3IgIjw+IEFMTCIsCkBAIC0yMTA5LDYgKzIxODQsMTAwIEBAIHNjYWxhcmFycmF5 c2VsKFBsYW5uZXJJbmZvICpyb290LAogCQlnZXRfdHlwbGVuYnl2YWwoYXJyYXlleHByLT5l bGVtZW50X3R5cGVpZCwKIAkJCQkJCSZlbG1sZW4sICZlbG1ieXZhbCk7CiAKKwkJLyogVHJ5 IHRvIGF2b2lkIE8oTl4yKSBzZWxlY3Rpdml0eSBjYWxjdWxhdGlvbiBmb3IgU2NhbGFyQXJy YXlPcEV4cHIgKi8KKwkJaWYgKChpc0VxdWFsaXR5IHx8IGlzSW5lcXVhbGl0eSkgJiYgIWlz X2pvaW5fY2xhdXNlKQorCQl7CisJCQlWYXJpYWJsZVN0YXREYXRhIHZhcmRhdGE7CisJCQlO b2RlCSAgICpvdGhlcl9vcCA9IE5VTEw7CisJCQlib29sCQl2YXJfb25fbGVmdDsKKwkJCWlu dAkJCW51bV9lbGVtcyA9IGxpc3RfbGVuZ3RoKGFycmF5ZXhwci0+ZWxlbWVudHMpOworCisJ CQkvKgorCQkJICogSWYgZXhwcmVzc2lvbiBpcyBub3QgdmFyaWFibGUgPSBzb21ldGhpbmcg b3Igc29tZXRoaW5nID0KKwkJCSAqIHZhcmlhYmxlLCB0aGVuIGZhbGwgYmFjayB0byBkZWZh dWx0IGNvZGUgcGF0aCB0byBjb21wdXRlCisJCQkgKiBkZWZhdWx0IHNlbGVjdGl2aXR5Lgor CQkJICovCisJCQlpZiAoZ2V0X3Jlc3RyaWN0aW9uX3ZhcmlhYmxlKHJvb3QsIGNsYXVzZS0+ YXJncywgdmFyUmVsaWQsCisJCQkJCQkJCQkJICZ2YXJkYXRhLCAmb3RoZXJfb3AsICZ2YXJf b25fbGVmdCkpCisJCQl7CisJCQkJU2VsZWN0aXZpdHkgbm9uY29uc3Rfc2VsOworCQkJCURh dHVtCSAgICplbGVtX3ZhbHVlczsKKwkJCQlib29sCSAgICplbGVtX251bGxzOworCQkJCWJv b2wJICAgKmVsZW1fY29uc3Q7CisJCQkJTGlzdENlbGwgICAqbGM7CisKKwkJCQkvKgorCQkJ CSAqIEJ1aWxkIGFycmF5cyBkZXNjcmliaW5nIEFSUkFZW10gZWxlbWVudHM6IC0gZWxlbV92 YWx1ZXM6CisJCQkJICogRGF0dW0gdmFsdWUgZm9yIENvbnN0IGVsZW1lbnRzIC0gZWxlbV9u dWxsczogd2hldGhlcgorCQkJCSAqIGVsZW1lbnQgaXMgTlVMTCAtIGVsZW1fY29uc3Q6IHdo ZXRoZXIgZWxlbWVudCBpcyBhIENvbnN0CisJCQkJICogbm9kZQorCQkJCSAqLworCQkJCWVs ZW1fdmFsdWVzID0gcGFsbG9jX2FycmF5KERhdHVtLCBudW1fZWxlbXMpOworCQkJCWVsZW1f bnVsbHMgPSBwYWxsb2MwX2FycmF5KGJvb2wsIG51bV9lbGVtcyk7CisJCQkJZWxlbV9jb25z dCA9IHBhbGxvYzBfYXJyYXkoYm9vbCwgbnVtX2VsZW1zKTsKKworCQkJCWZvcmVhY2gobGMs IGFycmF5ZXhwci0+ZWxlbWVudHMpCisJCQkJeworCQkJCQlOb2RlCSAgICplbGVtX3ZhbHVl ID0gKE5vZGUgKikgbGZpcnN0KGxjKTsKKwkJCQkJaW50CQkJaSA9IGZvcmVhY2hfY3VycmVu dF9pbmRleChsYyk7CisKKwkJCQkJaWYgKElzQShlbGVtX3ZhbHVlLCBDb25zdCkpCisJCQkJ CXsKKwkJCQkJCWVsZW1fdmFsdWVzW2ldID0gKChDb25zdCAqKSBlbGVtX3ZhbHVlKS0+Y29u c3R2YWx1ZTsKKwkJCQkJCWVsZW1fbnVsbHNbaV0gPSAoKENvbnN0ICopIGVsZW1fdmFsdWUp LT5jb25zdGlzbnVsbDsKKwkJCQkJCWVsZW1fY29uc3RbaV0gPSB0cnVlOworCQkJCQl9CisJ CQkJCWVsc2UKKwkJCQkJeworCQkJCQkJZWxlbV9udWxsc1tpXSA9IGZhbHNlOworCQkJCQkJ ZWxlbV9jb25zdFtpXSA9IGZhbHNlOworCQkJCQl9CisKKwkJCQkJLyoKKwkJCQkJICogV2hl biB0aGUgYXJyYXkgY29udGFpbnMgYSBOVUxMIGNvbnN0YW50LCBzYW1lIGFzIHZhcl9lcV9j b25zdCwKKwkJCQkJICogd2UgYXNzdW1lIHRoZSBvcGVyYXRvciBpcyBzdHJpY3QgYW5kIG5v dGhpbmcgd2lsbCBtYXRjaCwgdGh1cworCQkJCQkgKiByZXR1cm4gMC4wLgorCQkJCQkgKi8K KwkJCQkJaWYgKCF1c2VPciAmJiBlbGVtX251bGxzW2ldKQorCQkJCQl7CisJCQkJCQlwZnJl ZShlbGVtX3ZhbHVlcyk7CisJCQkJCQlwZnJlZShlbGVtX251bGxzKTsKKwkJCQkJCXBmcmVl KGVsZW1fY29uc3QpOworCisJCQkJCQlSZWxlYXNlVmFyaWFibGVTdGF0cyh2YXJkYXRhKTsK KworCQkJCQkJcmV0dXJuIChTZWxlY3Rpdml0eSkgMC4wOworCQkJCQl9CisJCQkJfQorCisJ CQkJLyoKKwkJCQkgKiBDb21wdXRlIHBlci1lbGVtZW50IHNlbGVjdGl2aXR5IHZpYSBlcXNl bCgpL25lcXNlbAorCQkJCSAqIHNlbWFudGljcy4KKwkJCQkgKi8KKwkJCQlub25jb25zdF9z ZWwgPSB2YXJfZXFfbm9uX2NvbnN0KCZ2YXJkYXRhLCBvcGVyYXRvciwKKwkJCQkJCQkJCQkJ CWNsYXVzZS0+aW5wdXRjb2xsaWQsCisJCQkJCQkJCQkJCQlvdGhlcl9vcCwgdmFyX29uX2xl ZnQsCisJCQkJCQkJCQkJCQlpc0luZXF1YWxpdHkpOworCisJCQkJczEgPSBzY2FsYXJhcnJh eV9tY3ZfaGFzaF9tYXRjaCgmdmFyZGF0YSwgb3BlcmF0b3IsCisJCQkJCQkJCQkJCQljbGF1 c2UtPmlucHV0Y29sbGlkLAorCQkJCQkJCQkJCQkJbm9uY29uc3Rfc2VsLCBlbGVtX3ZhbHVl cywKKwkJCQkJCQkJCQkJCWVsZW1fbnVsbHMsIG51bV9lbGVtcywKKwkJCQkJCQkJCQkJCWVs ZW1fY29uc3QsCisJCQkJCQkJCQkJCQlub21pbmFsX2VsZW1lbnRfdHlwZSwgdXNlT3IsCisJ CQkJCQkJCQkJCQlpc0VxdWFsaXR5LCBpc0luZXF1YWxpdHkpOworCisJCQkJcGZyZWUoZWxl bV92YWx1ZXMpOworCQkJCXBmcmVlKGVsZW1fbnVsbHMpOworCQkJCXBmcmVlKGVsZW1fY29u c3QpOworCisJCQkJUmVsZWFzZVZhcmlhYmxlU3RhdHModmFyZGF0YSk7CisKKwkJCQlpZiAo czEgPj0gMC4wKQorCQkJCQlyZXR1cm4gczE7CisJCQl9CisJCX0KKwogCQkvKgogCQkgKiBX ZSB1c2UgdGhlIGFzc3VtcHRpb24gb2YgZGlzam9pbnQgcHJvYmFiaWxpdGllcyBoZXJlIHRv bywgYWx0aG91Z2gKIAkJICogdGhlIG9kZHMgb2YgZXF1YWwgYXJyYXkgZWxlbWVudHMgYXJl IHJhdGhlciBoaWdoZXIgaWYgdGhlIGVsZW1lbnRzCkBAIC0yMjI3LDYgKzIzOTYsMzQ3IEBA IHNjYWxhcmFycmF5c2VsKFBsYW5uZXJJbmZvICpyb290LAogCXJldHVybiBzMTsKIH0KIAor LyoKKyAqIEVzdGltYXRlIHNlbGVjdGl2aXR5IG9mIGEgU2NhbGFyQXJyYXlPcEV4cHIgKEFO WS9BTEwpIHVzaW5nIE1DViBzdGF0aXN0aWNzCisgKiB3aXRoIGhhc2gtYmFzZWQgbWF0Y2hp bmcuCisgKgorICogVGhpcyBmdW5jdGlvbiBmb2xsb3dzIHRoZSBzYW1lIHByb2JhYmlsaXR5 IG1vZGVsIGFzIHRoZSBnZW5lcmljCisgKiBTY2FsYXJBcnJheU9wRXhwciBzZWxlY3Rpdml0 eSBjb2RlIChpbmRlcGVuZGVudCBvciBkaXNqb2ludCBwcm9iYWJpbGl0aWVzCisgKiBmb3Ig T1IvQU5EIGNvbWJpbmF0aW9ucyksIGJ1dCBhdHRlbXB0cyB0byBzcGVlZCB1cCBtYXRjaGlu ZyBiZXR3ZWVuCisgKiBJTi1saXN0IGVsZW1lbnRzIGFuZCB0aGUgY29sdW1uJ3MgbW9zdC1j b21tb24tdmFsdWVzIChNQ1YpIHN0YXRpc3RpY3MgYnkKKyAqIHVzaW5nIGhhc2hpbmcgaW5z dGVhZCBvZiBuZXN0ZWQgbG9vcHMuCisgKgorICogTUNWIHN0YXRpc3RpY3MgYXJlIHVzZWQg b25seSB0byBvYnRhaW4gcGVyLXZhbHVlIHNlbGVjdGl2aXRpZXMgZm9yCisgKiBjb25zdGFu dHMgdGhhdCBtYXRjaCBNQ1YgZW50cmllcy4gIEFsbCBwcm9iYWJpbGl0aWVzIGFyZSBjb21i aW5lZCB1c2luZworICogdGhlIHN0YW5kYXJkIEFOWS9BTEwgZm9ybXVsYXMsIGV4YWN0bHkg YXMgaW4gdGhlIGdlbmVyaWMgZXN0aW1hdG9yLgorICoKKyAqIFRoZSBmdW5jdGlvbiBtYXkg cmV0dXJuIC0xLjAgdG8gaW5kaWNhdGUgdGhhdCBoYXNoLWJhc2VkIE1DViBlc3RpbWF0aW9u CisgKiBpcyBub3QgYXBwbGljYWJsZSAoZm9yIGV4YW1wbGUsIG1pc3Npbmcgc3RhdGlzdGlj cywgdW5zdXBwb3J0ZWQgb3BlcmF0b3IsCisgKiBvciB1bmF2YWlsYWJsZSBoYXNoIGZ1bmN0 aW9ucyksIGluIHdoaWNoIGNhc2UgdGhlIGNhbGxlciBzaG91bGQgZmFsbCBiYWNrCisgKiB0 byB0aGUgZ2VuZXJpYyBTY2FsYXJBcnJheU9wRXhwciBzZWxlY3Rpdml0eSBlc3RpbWF0aW9u LgorICoKKyAqIElucHV0czoKKyAqCXZhcmRhdGE6IHN0YXRpc3RpY3MgYW5kIG1ldGFkYXRh IGZvciB0aGUgdmFyaWFibGUgYmVpbmcgZXN0aW1hdGVkCisgKglvcGVyYXRvcjogZXF1YWxp dHkgb3IgaW5lcXVhbGl0eSBvcGVyYXRvciB0byBhcHBseQorICoJY29sbGF0aW9uOiBPSUQg b2YgY29sbGF0aW9uIHRvIHVzZQorICogIG5vbmNvbnN0X3NlbDogc2VsZWN0aXZpdHkgb2Yg bm9uLWNvbnN0IGVsZW1lbnQKKyAqCWVsZW1fdmFsdWVzOiBhcnJheSBvZiBJTi1saXN0IGVs ZW1lbnQgdmFsdWVzCisgKgllbGVtX251bGxzOiBhcnJheSBpbmRpY2F0aW5nIHdoaWNoIElO LWxpc3QgZWxlbWVudHMgYXJlIE5VTEwKKyAqCWVsZW1fY29uc3Q6IGFycmF5IGluZGljYXRp bmcgd2hpY2ggSU4tbGlzdCBlbGVtZW50cyBhcmUgQ29uc3Qgbm9kZXMuCisgKiAgICAgICAg ICAgICAgYXJyYXkgaXMgTlVMTCBpZiBhbGwgZWxlbW5ldHMgYXJlIGNvbnN0LgorICoJbnVt X2VsZW1zOiBudW1iZXIgb2YgSU4tbGlzdCBlbGVtZW50cworICoJbm9taW5hbF9lbGVtZW50 X3R5cGU6IHR5cGUgb2YgSU4tbGlzdCBlbGVtZW50cworICoJdXNlT3I6IHRydWUgaWYgZWxl bWVudHMgYXJlIGNvbWJpbmVkIHVzaW5nIE9SIHNlbWFudGljcywgZmFsc2UgZm9yIEFORAor ICoJaXNFcXVhbGl0eTogdHJ1ZSBpZiB0aGUgb3BlcmF0b3IgYmVoYXZlcyBsaWtlIGVxdWFs aXR5CisgKglpc0luZXF1YWxpdHk6IHRydWUgaWYgdGhlIG9wZXJhdG9yIGJlaGF2ZXMgbGlr ZSBpbmVxdWFsaXR5CisgKgorICogUmVzdWx0OgorICoJU2VsZWN0aXZpdHkgZXN0aW1hdGUg aW4gdGhlIHJhbmdlIFswLjAsIDEuMF0sIG9yIC0xLjAgaWYgbm8gZXN0aW1hdGUKKyAqCWNv dWxkIGJlIHByb2R1Y2VkIGJ5IHRoaXMgZnVuY3Rpb24uCisgKgorICogTm90ZToKKyAqCVRo aXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHRoZSBvcGVyYXRvcuKAmXMgc2VsZWN0aXZpdHkg YmVoYXZpb3IgbWF0Y2hlcworICoJZXFzZWwoKS9uZXFzZWwgc2VtYW50aWNzLiAgSXQgbXVz dCBub3QgYmUgdXNlZCBmb3Igb3BlcmF0b3JzIHdpdGggY3VzdG9tCisgKglvciBub24tc3Rh bmRhcmQgc2VsZWN0aXZpdHkgYmVoYXZpb3IuCisgKi8KK3N0YXRpYyBkb3VibGUKK3NjYWxh cmFycmF5X21jdl9oYXNoX21hdGNoKFZhcmlhYmxlU3RhdERhdGEgKnZhcmRhdGEsIE9pZCBv cGVyYXRvciwKKwkJCQkJCSAgIE9pZCBjb2xsYXRpb24sIFNlbGVjdGl2aXR5IG5vbmNvbnN0 X3NlbCwKKwkJCQkJCSAgIERhdHVtICplbGVtX3ZhbHVlcywgYm9vbCAqZWxlbV9udWxscywg aW50IG51bV9lbGVtcywKKwkJCQkJCSAgIGJvb2wgKmVsZW1fY29uc3QsIE9pZCBub21pbmFs X2VsZW1lbnRfdHlwZSwKKwkJCQkJCSAgIGJvb2wgdXNlT3IsIGJvb2wgaXNFcXVhbGl0eSwg Ym9vbCBpc0luZXF1YWxpdHkpCit7CisJRm9ybV9wZ19zdGF0aXN0aWMgc3RhdHM7CisJQXR0 U3RhdHNTbG90IHNzbG90OworCUZtZ3JJbmZvCWVxcHJvYzsKKwlkb3VibGUJCXNlbGVjID0g LTEuMCwKKwkJCQlzMWRpc2pvaW50LAorCQkJCW51bGxmcmFjID0gMC4wOworCU9pZAkJCWhh c2hMZWZ0ID0gSW52YWxpZE9pZCwKKwkJCQloYXNoUmlnaHQgPSBJbnZhbGlkT2lkLAorCQkJ CW9wZnVuY29pZDsKKwlib29sCQloYXZlX21jdnMgPSBmYWxzZTsKKworCS8qCisJICogSWYg dGhlIHZhcmlhYmxlIGlzIGtub3duIHRvIGJlIHVuaXF1ZSwgTUNWIHN0YXRpc3RpY3MgZG8g bm90IHJlcHJlc2VudAorCSAqIGEgbWVhbmluZ2Z1bCBmcmVxdWVuY3kgZGlzdHJpYnV0aW9u LCBzbyBza2lwIE1DVi1iYXNlZCBlc3RpbWF0aW9uLgorCSAqLworCWlmICh2YXJkYXRhLT5p c3VuaXF1ZSAmJiB2YXJkYXRhLT5yZWwgJiYgdmFyZGF0YS0+cmVsLT50dXBsZXMgPj0gMS4w KQorCQlyZXR1cm4gLTEuMDsKKworCS8qCisJICogRm9yIGluZXF1YWxpdHkgKDw+LCBBTEwp LCB3ZSBjb21wdXRlIHByb2JhYmlsaXRpZXMgdXNpbmcgdGhlIG5lZ2F0ZWQKKwkgKiBlcXVh bGl0eSBvcGVyYXRvciBhbmQgbGF0ZXIgdHJhbnNmb3JtIHRoZW0gYXMKKwkgKgorCSAqIHAo eCA8PiBjKSA9IDEgLSBwKHggPSBjKSAtIG51bGxmcmFjCisJICovCisJaWYgKGlzSW5lcXVh bGl0eSkKKwl7CisJCW9wZXJhdG9yID0gZ2V0X25lZ2F0b3Iob3BlcmF0b3IpOworCQlpZiAo IU9pZElzVmFsaWQob3BlcmF0b3IpKQorCQkJcmV0dXJuIC0xLjA7CisJfQorCisJb3BmdW5j b2lkID0gZ2V0X29wY29kZShvcGVyYXRvcik7CisJbWVtc2V0KCZzc2xvdCwgMCwgc2l6ZW9m KHNzbG90KSk7CisKKwlpZiAoSGVhcFR1cGxlSXNWYWxpZCh2YXJkYXRhLT5zdGF0c1R1cGxl KSkKKwl7CisJCWlmIChzdGF0aXN0aWNfcHJvY19zZWN1cml0eV9jaGVjayh2YXJkYXRhLCBv cGZ1bmNvaWQpKQorCQkJaGF2ZV9tY3ZzID0gZ2V0X2F0dHN0YXRzc2xvdCgmc3Nsb3QsIHZh cmRhdGEtPnN0YXRzVHVwbGUsCisJCQkJCQkJCQkJIFNUQVRJU1RJQ19LSU5EX01DViwgSW52 YWxpZE9pZCwKKwkJCQkJCQkJCQkgQVRUU1RBVFNTTE9UX1ZBTFVFUyB8IEFUVFNUQVRTU0xP VF9OVU1CRVJTKTsKKwl9CisKKwlpZiAoaGF2ZV9tY3ZzKQorCXsKKwkJLyoKKwkJICogSWYg dGhlIE1DViBsaXN0IGFuZCBJTi1saXN0IGFyZSBsYXJnZSBlbm91Z2gsIGFuZCB0aGUgb3Bl cmF0b3IKKwkJICogc3VwcG9ydHMgaGFzaGluZywgYXR0ZW1wdCB0byB1c2UgaGFzaCBmdW5j dGlvbnMgc28gdGhhdCBNQ1bigJNJTgorCQkgKiBtYXRjaGluZyBjYW4gYmUgZG9uZSBpbiBP KE4rTSkgaW5zdGVhZCBvZiBPKE7Dl00pLgorCQkgKi8KKwkJaWYgKHNzbG90Lm52YWx1ZXMg KyBudW1fZWxlbXMgPj0gTUNWX0hBU0hfVEhSRVNIT0xEKQorCQl7CisJCQlmbWdyX2luZm8o b3BmdW5jb2lkLCAmZXFwcm9jKTsKKwkJCSh2b2lkKSBnZXRfb3BfaGFzaF9mdW5jdGlvbnMo b3BlcmF0b3IsICZoYXNoTGVmdCwgJmhhc2hSaWdodCk7CisJCX0KKwl9CisKKwlpZiAoaGF2 ZV9tY3ZzICYmIE9pZElzVmFsaWQoaGFzaExlZnQpICYmIE9pZElzVmFsaWQoaGFzaFJpZ2h0 KSkKKwl7CisJCS8qIFVzZSBhIGhhc2ggdGFibGUgdG8gc3BlZWQgdXAgdGhlIG1hdGNoaW5n ICovCisJCUxPQ0FMX0ZDSU5GTyhmY2luZm8sIDIpOworCQlMT0NBTF9GQ0lORk8oaGFzaF9m Y2luZm8sIDEpOworCQlNQ1ZIYXNoVGFibGVfaGFzaCAqaGFzaFRhYmxlOworCQlGbWdySW5m bwloYXNoX3Byb2M7CisJCU1DVkhhc2hDb250ZXh0IGhhc2hDb250ZXh0OworCQlkb3VibGUJ CXN1bWFsbGNvbW1vbiA9IDAuMCwKKwkJCQkJbm9ubWN2X3NlbGVjID0gMC4wOworCQlib29s CQlpc2RlZmF1bHQ7CisJCWJvb2wJCWhhc2hfbWN2OworCQlkb3VibGUJCW90aGVyZGlzdGlu Y3Q7CisJCURhdHVtCSAgICphcnJheUhhc2g7CisJCURhdHVtCSAgICphcnJheVByb2JlOwor CQlpbnQJCQludmFsdWVzSGFzaDsKKwkJaW50CQkJbnZhbHVlc1Byb2JlOworCQlpbnQJCQlu b25tY3ZfY250ID0gbnVtX2VsZW1zOworCQlpbnQJCQlub25jb25zdF9jbnQgPSAwOworCisJ CS8qIEdyYWIgdGhlIG51bGxmcmFjIGZvciB1c2UgYmVsb3cuICovCisJCXN0YXRzID0gKEZv cm1fcGdfc3RhdGlzdGljKSBHRVRTVFJVQ1QodmFyZGF0YS0+c3RhdHNUdXBsZSk7CisJCW51 bGxmcmFjID0gc3RhdHMtPnN0YW51bGxmcmFjOworCisJCXNlbGVjID0gczFkaXNqb2ludCA9 ICh1c2VPciA/IDAuMCA6IDEuMCk7CisKKwkJSW5pdEZ1bmN0aW9uQ2FsbEluZm9EYXRhKCpm Y2luZm8sICZlcXByb2MsIDIsIGNvbGxhdGlvbiwKKwkJCQkJCQkJIE5VTEwsIE5VTEwpOwor CQlmY2luZm8tPmFyZ3NbMF0uaXNudWxsID0gZmFsc2U7CisJCWZjaW5mby0+YXJnc1sxXS5p c251bGwgPSBmYWxzZTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8IHNzbG90Lm52YWx1ZXM7 IGkrKykKKwkJCXN1bWFsbGNvbW1vbiArPSBzc2xvdC5udW1iZXJzW2ldOworCisJCS8qCisJ CSAqIENvbXB1dGUgdGhlIHRvdGFsIHByb2JhYmlsaXR5IG1hc3Mgb2YgYWxsIG5vbi1NQ1Yg dmFsdWVzLiBUaGlzIGlzCisJCSAqIHRoZSBwYXJ0IG9mIHRoZSBjb2x1bW4gZGlzdHJpYnV0 aW9uIG5vdCBjb3ZlcmVkIGJ5IE1DVnMuCisJCSAqLworCQlub25tY3Zfc2VsZWMgPSAxLjAg LSBzdW1hbGxjb21tb24gLSBudWxsZnJhYzsKKwkJQ0xBTVBfUFJPQkFCSUxJVFkobm9ubWN2 X3NlbGVjKTsKKworCQkvKgorCQkgKiBBcHByb3hpbWF0ZSB0aGUgcGVyLXZhbHVlIHByb2Jh YmlsaXR5IG9mIGEgbm9uLU1DViBjb25zdGFudCBieQorCQkgKiBkaXZpZGluZyB0aGUgcmVt YWluaW5nIHByb2JhYmlsaXR5IG1hc3MgYnkgdGhlIG51bWJlciBvZiBvdGhlcgorCQkgKiBk aXN0aW5jdCB2YWx1ZXMuCisJCSAqLworCQlvdGhlcmRpc3RpbmN0ID0gZ2V0X3ZhcmlhYmxl X251bWRpc3RpbmN0KHZhcmRhdGEsICZpc2RlZmF1bHQpIC0gc3Nsb3Qubm51bWJlcnM7CisJ CWlmIChvdGhlcmRpc3RpbmN0ID4gMSkKKwkJCW5vbm1jdl9zZWxlYyAvPSBvdGhlcmRpc3Rp bmN0OworCisJCWlmIChzc2xvdC5ubnVtYmVycyA+IDAgJiYgbm9ubWN2X3NlbGVjID4gc3Ns b3QubnVtYmVyc1tzc2xvdC5ubnVtYmVycyAtIDFdKQorCQkJbm9ubWN2X3NlbGVjID0gc3Ns b3QubnVtYmVyc1tzc2xvdC5ubnVtYmVycyAtIDFdOworCisJCS8qIE1ha2Ugc3VyZSB3ZSBi dWlsZCB0aGUgaGFzaCB0YWJsZSBvbiB0aGUgc21hbGxlciBhcnJheS4gKi8KKwkJaWYgKHNz bG90Lm52YWx1ZXMgPD0gbnVtX2VsZW1zKQorCQl7CisJCQloYXNoX21jdiA9IHRydWU7CisJ CQludmFsdWVzSGFzaCA9IHNzbG90Lm52YWx1ZXM7CisJCQludmFsdWVzUHJvYmUgPSBudW1f ZWxlbXM7CisJCQlhcnJheUhhc2ggPSBzc2xvdC52YWx1ZXM7CisJCQlhcnJheVByb2JlID0g ZWxlbV92YWx1ZXM7CisJCX0KKwkJZWxzZQorCQl7CisJCQloYXNoX21jdiA9IGZhbHNlOwor CQkJbnZhbHVlc0hhc2ggPSBudW1fZWxlbXM7CisJCQludmFsdWVzUHJvYmUgPSBzc2xvdC5u dmFsdWVzOworCQkJYXJyYXlIYXNoID0gZWxlbV92YWx1ZXM7CisJCQlhcnJheVByb2JlID0g c3Nsb3QudmFsdWVzOworCQl9CisKKwkJZm1ncl9pbmZvKGhhc2hfbWN2ID8gaGFzaExlZnQg OiBoYXNoUmlnaHQsICZoYXNoX3Byb2MpOworCQlJbml0RnVuY3Rpb25DYWxsSW5mb0RhdGEo Kmhhc2hfZmNpbmZvLCAmaGFzaF9wcm9jLCAxLCBjb2xsYXRpb24sCisJCQkJCQkJCSBOVUxM LCBOVUxMKTsKKwkJaGFzaF9mY2luZm8tPmFyZ3NbMF0uaXNudWxsID0gZmFsc2U7CisKKwkJ aGFzaENvbnRleHQuZXF1YWxfZmNpbmZvID0gZmNpbmZvOworCQloYXNoQ29udGV4dC5oYXNo X2ZjaW5mbyA9IGhhc2hfZmNpbmZvOworCQloYXNoQ29udGV4dC5vcF9pc19yZXZlcnNlZCA9 IGhhc2hfbWN2OworCQloYXNoQ29udGV4dC5pbnNlcnRfbW9kZSA9IHRydWU7CisKKwkJZ2V0 X3R5cGxlbmJ5dmFsKGhhc2hfbWN2ID8gc3Nsb3QudmFsdWV0eXBlIDogbm9taW5hbF9lbGVt ZW50X3R5cGUsCisJCQkJCQkmaGFzaENvbnRleHQuaGFzaF90eXBsZW4sCisJCQkJCQkmaGFz aENvbnRleHQuaGFzaF90eXBieXZhbCk7CisKKwkJaGFzaFRhYmxlID0gTUNWSGFzaFRhYmxl X2NyZWF0ZShDdXJyZW50TWVtb3J5Q29udGV4dCwKKwkJCQkJCQkJCQludmFsdWVzSGFzaCwK KwkJCQkJCQkJCQkmaGFzaENvbnRleHQpOworCisJCS8qIEJ1aWxkIGEgaGFzaCB0YWJsZSBv dmVyIHRoZSBzbWFsbGVyIGlucHV0IHNpZGUuICovCisJCWZvciAoaW50IGkgPSAwOyBpIDwg bnZhbHVlc0hhc2g7IGkrKykKKwkJeworCQkJYm9vbAkJZm91bmQgPSBmYWxzZTsKKwkJCU1D Vkhhc2hFbnRyeSAqZW50cnk7CisKKwkJCS8qCisJCQkgKiBXaGVuIGhhc2hpbmcgSU4tbGlz dCB2YWx1ZXMgKGhhc2hfbWN2ID09IGZhbHNlKSwgd2Ugb25seSBpbnNlcnQKKwkJCSAqIGNv bnN0YW50LCBub24tTlVMTCBlbGVtZW50cy4gIE5VTEwgYW5kIG5vbi1Db25zdCBlbGVtZW50 cyBhcmUKKwkJCSAqIGNvdW50ZWQgc2VwYXJhdGVseSwgYmVjYXVzZSB0aGV5IGNhbm5vdCBw YXJ0aWNpcGF0ZSBpbiBNQ1YKKwkJCSAqIG1hdGNoaW5nIGFuZCBtdXN0IGJlIGhhbmRsZWQg bGF0ZXIgdXNpbmcgZ2VuZXJpYyBzZWxlY3Rpdml0eQorCQkJICogZXN0aW1hdGlvbi4KKwkJ CSAqLworCQkJaWYgKCFoYXNoX21jdikKKwkJCXsKKwkJCQlpZiAoZWxlbV9udWxsc1tpXSkK KwkJCQl7CisJCQkJCUFzc2VydCh1c2VPcik7CisJCQkJCW5vbm1jdl9jbnQtLTsKKwkJCQkJ Y29udGludWU7CisJCQkJfQorCisJCQkJaWYgKGVsZW1fY29uc3QgIT0gTlVMTCAmJiAhZWxl bV9jb25zdFtpXSkKKwkJCQl7CisJCQkJCW5vbm1jdl9jbnQtLTsKKwkJCQkJbm9uY29uc3Rf Y250Kys7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKworCQkJZW50cnkgPSBNQ1ZI YXNoVGFibGVfaW5zZXJ0KGhhc2hUYWJsZSwgYXJyYXlIYXNoW2ldLCAmZm91bmQpOworCisJ CQkvKgorCQkJICogZW50cnktPmNvdW50IHRyYWNrcyBob3cgbWFueSB0aW1lcyB0aGUgc2Ft ZSB2YWx1ZSBhcHBlYXJzLCBzbworCQkJICogdGhhdCBkdXBsaWNhdGUgSU4tbGlzdCBlbGVt ZW50cyBjYW4gYmUgZm9sZGVkIGludG8gdGhlCisJCQkgKiBwcm9iYWJpbGl0eSBjYWxjdWxh dGlvbi4KKwkJCSAqLworCQkJaWYgKGxpa2VseSghZm91bmQpKQorCQkJeworCQkJCWVudHJ5 LT5pbmRleCA9IGk7CisJCQkJZW50cnktPmNvdW50ID0gMTsKKwkJCX0KKwkJCWVsc2UKKwkJ CQllbnRyeS0+Y291bnQrKzsKKwkJfQorCisJCWhhc2hDb250ZXh0Lmluc2VydF9tb2RlID0g ZmFsc2U7CisJCWlmIChoYXNoTGVmdCAhPSBoYXNoUmlnaHQpCisJCXsKKwkJCWZtZ3JfaW5m byhoYXNoX21jdiA/IGhhc2hSaWdodCA6IGhhc2hMZWZ0LCAmaGFzaF9wcm9jKTsKKwkJCS8q IFJlc2V0dGluZyBoYXNoX2ZjaW5mbyBpcyBwcm9iYWJseSB1bm5lY2Vzc2FyeSwgYnV0IGJl IHNhZmUgKi8KKwkJCUluaXRGdW5jdGlvbkNhbGxJbmZvRGF0YSgqaGFzaF9mY2luZm8sICZo YXNoX3Byb2MsIDEsIGNvbGxhdGlvbiwKKwkJCQkJCQkJCSBOVUxMLCBOVUxMKTsKKwkJCWhh c2hfZmNpbmZvLT5hcmdzWzBdLmlzbnVsbCA9IGZhbHNlOworCQl9CisKKwkJZm9yIChpbnQg aSA9IDA7IGkgPCBudmFsdWVzUHJvYmU7IGkrKykKKwkJeworCQkJTUNWSGFzaEVudHJ5ICpl bnRyeTsKKwkJCVNlbGVjdGl2aXR5IHMxOworCQkJaW50CQkJbnZhbHVlc21jdjsKKworCQkJ LyoKKwkJCSAqIFdoZW4gcHJvYmluZyB3aXRoIElOLWxpc3QgZWxlbWVudHMsIGlnbm9yZSBO VUxMcyBhbmQgbm9uLUNvbnN0CisJCQkgKiBleHByZXNzaW9uczogdGhleSBjYW5ub3QgYmUg bWF0Y2hlZCBhZ2FpbnN0IE1DVnMgYW5kIHdpbGwgYmUKKwkJCSAqIGFjY291bnRlZCBmb3Ig bGF0ZXIgYnkgZ2VuZXJpYyBlc3RpbWF0aW9uLgorCQkJICovCisJCQlpZiAoaGFzaF9tY3Yp CisJCQl7CisJCQkJaWYgKGVsZW1fbnVsbHNbaV0pCisJCQkJeworCQkJCQlBc3NlcnQodXNl T3IpOworCQkJCQlub25tY3ZfY250LS07CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJ CWlmIChlbGVtX2NvbnN0ICE9IE5VTEwgJiYgIWVsZW1fY29uc3RbaV0pCisJCQkJeworCQkJ CQlub25tY3ZfY250LS07CisJCQkJCW5vbmNvbnN0X2NudCsrOworCQkJCQljb250aW51ZTsK KwkJCQl9CisJCQl9CisKKwkJCWVudHJ5ID0gTUNWSGFzaFRhYmxlX2xvb2t1cChoYXNoVGFi bGUsIGFycmF5UHJvYmVbaV0pOworCisJCQkvKgorCQkJICogSWYgZm91bmQsIG9idGFpbiBp dHMgTUNWIGZyZXF1ZW5jeSBhbmQgcmVtZW1iZXIgaG93IG1hbnkgdmFsdWVzCisJCQkgKiBv biB0aGUgaGFzaGVkIHNpZGUgbWFwIHRvIHRoaXMgZW50cnkuCisJCQkgKi8KKwkJCWlmIChl bnRyeSAhPSBOVUxMKQorCQkJeworCQkJCXMxID0gaGFzaF9tY3YgPyBzc2xvdC5udW1iZXJz W2VudHJ5LT5pbmRleF0KKwkJCQkJOiBzc2xvdC5udW1iZXJzW2ldOworCisJCQkJbnZhbHVl c21jdiA9IGVudHJ5LT5jb3VudDsKKworCQkJCWFjY3VtX3NjYWxhcmFycmF5X3Byb2IoczEs IG52YWx1ZXNtY3YsIHVzZU9yLCBpc0VxdWFsaXR5LAorCQkJCQkJCQkJICAgaXNJbmVxdWFs aXR5LCBudWxsZnJhYywgdHJ1ZSwgJnNlbGVjLAorCQkJCQkJCQkJICAgJnMxZGlzam9pbnQp OworCisJCQkJLyogTWF0Y2hlZCB2YWx1ZXMgYXJlIG5vIGxvbmdlciBjb25zaWRlcmVkIG5v bi1NQ1YgKi8KKwkJCQlub25tY3ZfY250IC09IG52YWx1ZXNtY3Y7CisJCQl9CisJCX0KKwor CQkvKgorCQkgKiBBY2NvdW50IGZvciBjb25zdGFudCBJTi1saXN0IHZhbHVlcyB0aGF0IGRp ZCBub3QgbWF0Y2ggYW55IE1DVi4KKwkJICoKKwkJICogRWFjaCBzdWNoIHZhbHVlIGlzIGFz c3VtZWQgdG8gaGF2ZSBwcm9iYWJpbGl0eSA9IG5vbm1jdl9zZWxlYywKKwkJICogZGVyaXZl ZCBmcm9tIHRoZSByZW1haW5pbmcgKG5vbi1NQ1YpIHByb2JhYmlsaXR5IG1hc3MuCisJCSAq LworCQlhY2N1bV9zY2FsYXJhcnJheV9wcm9iKG5vbm1jdl9zZWxlYywgbm9ubWN2X2NudCwg dXNlT3IsIGlzRXF1YWxpdHksCisJCQkJCQkJICAgaXNJbmVxdWFsaXR5LCBudWxsZnJhYywg dHJ1ZSwKKwkJCQkJCQkgICAmc2VsZWMsICZzMWRpc2pvaW50KTsKKworCQkvKgorCQkgKiBB Y2NvdW50IGZvciBub24tQ29uc3QgSU4tbGlzdCBlbGVtZW50cy4KKwkJICoKKwkJICogVGhl c2UgdmFsdWVzIGNhbm5vdCBiZSBtYXRjaGVkIGFnYWluc3QgTUNWcywgc28gd2UgcmVseSBv biB0aGUKKwkJICogb3BlcmF0b3IncyBnZW5lcmljIHNlbGVjdGl2aXR5IGVzdGltYXRvciBm b3IgZWFjaCBvZiB0aGVtLgorCQkgKi8KKwkJYWNjdW1fc2NhbGFyYXJyYXlfcHJvYihub25j b25zdF9zZWwsIG5vbmNvbnN0X2NudCwgdXNlT3IsIGlzRXF1YWxpdHksCisJCQkJCQkJICAg aXNJbmVxdWFsaXR5LCBudWxsZnJhYywgZmFsc2UsCisJCQkJCQkJICAgJnNlbGVjLCAmczFk aXNqb2ludCk7CisKKwkJLyoKKwkJICogRm9yID0gQU5ZIG9yIDw+IEFMTCwgaWYgdGhlIElO LWxpc3QgZWxlbWVudHMgYXJlIGFzc3VtZWQgZGlzdGluY3QsCisJCSAqIHRoZSBldmVudHMg YXJlIGRpc2pvaW50IGFuZCB0aGUgdG90YWwgcHJvYmFiaWxpdHkgaXMgdGhlIHN1bSBvZgor CQkgKiBpbmRpdmlkdWFsIHByb2JhYmlsaXRpZXMuICBVc2UgdGhhdCBlc3RpbWF0ZSBpZiBp dCBsaWVzIGluIFswLDFdLgorCQkgKi8KKwkJaWYgKCh1c2VPciA/IGlzRXF1YWxpdHkgOiBp c0luZXF1YWxpdHkpICYmCisJCQlzMWRpc2pvaW50ID49IDAuMCAmJiBzMWRpc2pvaW50IDw9 IDEuMCkKKwkJCXNlbGVjID0gczFkaXNqb2ludDsKKworCQlDTEFNUF9QUk9CQUJJTElUWShz ZWxlYyk7CisKKwkJTUNWSGFzaFRhYmxlX2Rlc3Ryb3koaGFzaFRhYmxlKTsKKwl9CisKKwlp ZiAoaGF2ZV9tY3ZzKQorCQlmcmVlX2F0dHN0YXRzc2xvdCgmc3Nsb3QpOworCisJcmV0dXJu IHNlbGVjOworfQorCiAvKgogICogRXN0aW1hdGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRo ZSBhcnJheSB5aWVsZGVkIGJ5IGFuIGV4cHJlc3Npb24uCiAgKgpAQCAtMjQ2Myw3ICsyOTcz LDcgQEAgZXFqb2luc2VsKFBHX0ZVTkNUSU9OX0FSR1MpCiAJCSAqIElmIHRoZSBNQ1YgbGlz dHMgYXJlIGxvbmcgZW5vdWdoIHRvIGp1c3RpZnkgaGFzaGluZywgdHJ5IHRvIGxvb2sgdXAK IAkJICogaGFzaCBmdW5jdGlvbnMgZm9yIHRoZSBqb2luIG9wZXJhdG9yLgogCQkgKi8KLQkJ aWYgKChzc2xvdDEubnZhbHVlcyArIHNzbG90Mi5udmFsdWVzKSA+PSBFUUpPSU5TRUxfTUNW X0hBU0hfVEhSRVNIT0xEKQorCQlpZiAoKHNzbG90MS5udmFsdWVzICsgc3Nsb3QyLm52YWx1 ZXMpID49IE1DVl9IQVNIX1RIUkVTSE9MRCkKIAkJCSh2b2lkKSBnZXRfb3BfaGFzaF9mdW5j dGlvbnMob3BlcmF0b3IsICZoYXNoTGVmdCwgJmhhc2hSaWdodCk7CiAJfQogCWVsc2UKLS0g CjIuMzQuMQoK --------------JTZhw03S6KMzOpCR4jTRhExO Content-Type: text/x-patch; charset=UTF-8; name="hash_based_any_tests.patch" Content-Disposition: attachment; filename="hash_based_any_tests.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvcGxhbm5lcl9lc3Qub3V0 IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9wbGFubmVyX2VzdC5vdXQKaW5kZXggYjYy YTQ3NTUyZmEuLjNlZjcyMDkwOGY1IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4 cGVjdGVkL3BsYW5uZXJfZXN0Lm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVk L3BsYW5uZXJfZXN0Lm91dApAQCAtMjEwLDQgKzIxMCwyMTMgQEAgZmFsc2UsIHRydWUsIGZh bHNlLCB0cnVlKTsKICAgICAgLT4gIFJlc3VsdCAgKGNvc3Q9Ti4uTiByb3dzPTEgd2lkdGg9 TikKICg0IHJvd3MpCiAKKy0tIEVuc3VyZSBzdGFibGUgYW5kIHJpY2ggTUNWIHN0YXRpc3Rp Y3MKK1NFVCBkZWZhdWx0X3N0YXRpc3RpY3NfdGFyZ2V0ID0gMTAwMDsKK0NSRUFURSBUQUJM RSB0X21jdiAoYSBpbnQpOworLS0gQnVpbGQgfjEwMCBNQ1YgdmFsdWVzIHdpdGggdW5pZm9y bSBkaXN0cmlidXRpb24KK0lOU0VSVCBJTlRPIHRfbWN2CitTRUxFQ1QgKGkgJSAxMDApCitG Uk9NIGdlbmVyYXRlX3NlcmllcygxLCAyMDAwMCkgcyhpKTsKK0FOQUxZWkUgdF9tY3Y7Cist LSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0KKy0tIENBU0UgMTogTGFyZ2UgQU5ZIGxpc3QgKE1DViA8IEFOWSkg4oaSIGhhc2gg b24gTUNWCistLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0KKy0tIDEuIFNpbmdsZSBlbGVtZW50CitTRUxFQ1QgZXhwbGFpbl9t YXNrX2Nvc3RzKCQkCitTRUxFQ1QgKiBGUk9NIHRfbWN2IFdIRVJFIGEgPSBBTlkgKEFSUkFZ KFNFTEVDVCAxKSk7JCQsCitmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOworICAgICAgICAg ICAgICAgIGV4cGxhaW5fbWFza19jb3N0cyAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24g dF9tY3YgIChjb3N0PU4uLk4gcm93cz0xOTEyIHdpZHRoPU4pCisgICBGaWx0ZXI6IChhID0g QU5ZICgoSW5pdFBsYW4gYXJyYXlfMSkuY29sMSkpCisgICBJbml0UGxhbiBhcnJheV8xCisg ICAgIC0+ICBSZXN1bHQgIChjb3N0PU4uLk4gcm93cz0xIHdpZHRoPU4pCisoNCByb3dzKQor CistLSAyLiBNdWx0aXBsZSBlbGVtZW50cyAoYWxsIGluIE1DVikKK1NFTEVDVCBleHBsYWlu X21hc2tfY29zdHMoJCQKK1NFTEVDVCAqIEZST00gdF9tY3YgV0hFUkUgYSA9IEFOWSAoQVJS QVkoU0VMRUNUIGkgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwzKSBzKGkpKSk7JCQsCitmYWxz ZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhw bGFpbl9tYXNrX2Nvc3RzICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyBTZXEgU2NhbiBvbiB0X21jdiAgKGNvc3Q9Ti4uTiByb3dzPTE5MTIgd2lk dGg9TikKKyAgIEZpbHRlcjogKGEgPSBBTlkgKChJbml0UGxhbiBhcnJheV8xKS5jb2wxKSkK KyAgIEluaXRQbGFuIGFycmF5XzEKKyAgICAgLT4gIEZ1bmN0aW9uIFNjYW4gb24gZ2VuZXJh dGVfc2VyaWVzIHMgIChjb3N0PU4uLk4gcm93cz0zIHdpZHRoPU4pCisoNCByb3dzKQorCist LSAzLiBJbmNsdWRlcyBub24tTUNWIHZhbHVlcworU0VMRUNUIGV4cGxhaW5fbWFza19jb3N0 cygkJAorU0VMRUNUICogRlJPTSB0X21jdiBXSEVSRSBhID0gQU5ZIChBUlJBWVsxLCAyLCAx MDAwXSk7JCQsCitmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOworICAgICAgICAgICAgICAg ZXhwbGFpbl9tYXNrX2Nvc3RzICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9uIHRfbWN2ICAo Y29zdD1OLi5OIHJvd3M9NDAwIHdpZHRoPU4pCisgICBGaWx0ZXI6IChhID0gQU5ZICgnezEs MiwxMDAwfSc6OmludGVnZXJbXSkpCisoMiByb3dzKQorCistLSA0LiBEdXBsaWNhdGVzCitT RUxFQ1QgZXhwbGFpbl9tYXNrX2Nvc3RzKCQkCitTRUxFQ1QgKiBGUk9NIHRfbWN2IFdIRVJF IGEgPSBBTlkgKEFSUkFZKFNFTEVDVCAoaSAlIDMpICsgMSBGUk9NIGdlbmVyYXRlX3Nlcmll cygxLDMwKSBzKGkpKSk7JCQsCitmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOworICAgICAg ICAgICAgICAgICAgICAgICAgICAgZXhwbGFpbl9tYXNrX2Nvc3RzICAgICAgICAgICAgICAg ICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9uIHRfbWN2 ICAoY29zdD1OLi5OIHJvd3M9MTkxMiB3aWR0aD1OKQorICAgRmlsdGVyOiAoYSA9IEFOWSAo KEluaXRQbGFuIGFycmF5XzEpLmNvbDEpKQorICAgSW5pdFBsYW4gYXJyYXlfMQorICAgICAt PiAgRnVuY3Rpb24gU2NhbiBvbiBnZW5lcmF0ZV9zZXJpZXMgcyAgKGNvc3Q9Ti4uTiByb3dz PTMwIHdpZHRoPU4pCisoNCByb3dzKQorCistLSA9PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tIENBU0UgMjogU21hbGwgQU5Z IGxpc3QgKEFOWSA8IE1DVikg4oaSIGhhc2ggb24gQU5ZCistLSA9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tIDEuIFNpbmds ZSBlbGVtZW50CitTRUxFQ1QgZXhwbGFpbl9tYXNrX2Nvc3RzKCQkCitTRUxFQ1QgKiBGUk9N IHRfbWN2IFdIRVJFIGEgPSBBTlkgKEFSUkFZWzEwXSk7JCQsCitmYWxzZSwgdHJ1ZSwgZmFs c2UsIHRydWUpOworICAgICAgICAgICAgICAgZXhwbGFpbl9tYXNrX2Nvc3RzICAgICAgICAg ICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorIFNlcSBTY2FuIG9uIHRfbWN2ICAoY29zdD1OLi5OIHJvd3M9MjAwIHdpZHRoPU4p CisgICBGaWx0ZXI6IChhID0gQU5ZICgnezEwfSc6OmludGVnZXJbXSkpCisoMiByb3dzKQor CistLSAyLiBNdWx0aXBsZSBlbGVtZW50cyAoYWxsIGluIE1DVikKK1NFTEVDVCBleHBsYWlu X21hc2tfY29zdHMoJCQKK1NFTEVDVCAqIEZST00gdF9tY3YgV0hFUkUgYSA9IEFOWSAoQVJS QVlbMTAsMjAsMzBdKTskJCwKK2ZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAg ICAgICAgICBleHBsYWluX21hc2tfY29zdHMgICAgICAgICAgICAgICAgCistLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24g dF9tY3YgIChjb3N0PU4uLk4gcm93cz02MDAgd2lkdGg9TikKKyAgIEZpbHRlcjogKGEgPSBB TlkgKCd7MTAsMjAsMzB9Jzo6aW50ZWdlcltdKSkKKygyIHJvd3MpCisKKy0tIDMuIEluY2x1 ZGVzIG5vbi1NQ1YgdmFsdWVzCitTRUxFQ1QgZXhwbGFpbl9tYXNrX2Nvc3RzKCQkCitTRUxF Q1QgKiBGUk9NIHRfbWN2IFdIRVJFIGEgPSBBTlkgKEFSUkFZWzEwLDIwLDEwMDAwXSk7JCQs CitmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOworICAgICAgICAgICAgICAgIGV4cGxhaW5f bWFza19jb3N0cyAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24gdF9tY3YgIChjb3N0PU4u Lk4gcm93cz00MDAgd2lkdGg9TikKKyAgIEZpbHRlcjogKGEgPSBBTlkgKCd7MTAsMjAsMTAw MDB9Jzo6aW50ZWdlcltdKSkKKygyIHJvd3MpCisKKy0tIDQuIER1cGxpY2F0ZXMKK1NFTEVD VCBleHBsYWluX21hc2tfY29zdHMoJCQKK1NFTEVDVCAqIEZST00gdF9tY3YgV0hFUkUgYSA9 IEFOWSAoQVJSQVlbMTAsMTAsMTAsMjAsMjBdKTskJCwKK2ZhbHNlLCB0cnVlLCBmYWxzZSwg dHJ1ZSk7CisgICAgICAgICAgICAgICAgIGV4cGxhaW5fbWFza19jb3N0cyAgICAgICAgICAg ICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyBTZXEgU2NhbiBvbiB0X21jdiAgKGNvc3Q9Ti4uTiByb3dzPTEwMDAgd2lk dGg9TikKKyAgIEZpbHRlcjogKGEgPSBBTlkgKCd7MTAsMTAsMTAsMjAsMjB9Jzo6aW50ZWdl cltdKSkKKygyIHJvd3MpCisKKy0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0gQ0FTRSAzOiBHdWFyYW50ZWVkIGxhcmdl IGNhc2Ug4oaSIHN0cmVzcyBoYXNoIHBhdGgKKy0tID09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorU0VMRUNUIGV4cGxhaW5fbWFz a19jb3N0cygkJAorU0VMRUNUICogRlJPTSB0X21jdiBXSEVSRSBhID0gQU5ZIChBUlJBWShT RUxFQ1QgaSAlIDEwMCBGUk9NIGdlbmVyYXRlX3NlcmllcygxLDUwMCkgcyhpKSkpOyQkLAor ZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICBleHBsYWluX21hc2tfY29zdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9uIHRfbWN2ICAoY29zdD1OLi5OIHJvd3M9 MTkxMiB3aWR0aD1OKQorICAgRmlsdGVyOiAoYSA9IEFOWSAoKEluaXRQbGFuIGFycmF5XzEp LmNvbDEpKQorICAgSW5pdFBsYW4gYXJyYXlfMQorICAgICAtPiAgRnVuY3Rpb24gU2NhbiBv biBnZW5lcmF0ZV9zZXJpZXMgcyAgKGNvc3Q9Ti4uTiByb3dzPTUwMCB3aWR0aD1OKQorKDQg cm93cykKKworLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09CistLSBDQVNFIDQ6IGluZXF1YWxpdHkgKDw+IEFMTCkKKy0tID09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQorU0VMRUNUIGV4cGxhaW5fbWFza19jb3N0cygkJAorU0VMRUNUICogRlJPTSB0X21jdiBX SEVSRSBhIDw+IEFMTCAoQVJSQVlbMSwyLDNdKTskJCwKK2ZhbHNlLCB0cnVlLCBmYWxzZSwg dHJ1ZSk7CisgICAgICAgICAgICAgICAgZXhwbGFpbl9tYXNrX2Nvc3RzICAgICAgICAgICAg ICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorIFNlcSBTY2FuIG9uIHRfbWN2ICAoY29zdD1OLi5OIHJvd3M9MTk0MDAgd2lkdGg9 TikKKyAgIEZpbHRlcjogKGEgPD4gQUxMICgnezEsMiwzfSc6OmludGVnZXJbXSkpCisoMiBy b3dzKQorCistLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0KKy0tIENBU0UgNTogbWl4IGNvbnN0ICsgbm9uLWNvbnN0CistLSA9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0KK1NFTEVDVCBleHBsYWluX21hc2tfY29zdHMoJCQKK1NFTEVDVCAqIEZST00gdF9tY3Yg V0hFUkUgYSA9IEFOWSAoQVJSQVlbMSwyXSB8fCBBUlJBWShTRUxFQ1QgaSBGUk9NIGdlbmVy YXRlX3NlcmllcygzLDUpIHMoaSkpKTskJCwKK2ZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7 CisgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBsYWluX21hc2tfY29zdHMgICAgICAg ICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9u IHRfbWN2ICAoY29zdD1OLi5OIHJvd3M9MTkxMiB3aWR0aD1OKQorICAgRmlsdGVyOiAoYSA9 IEFOWSAoKCd7MSwyfSc6OmludGVnZXJbXSB8fCAoSW5pdFBsYW4gYXJyYXlfMSkuY29sMSkp KQorICAgSW5pdFBsYW4gYXJyYXlfMQorICAgICAtPiAgRnVuY3Rpb24gU2NhbiBvbiBnZW5l cmF0ZV9zZXJpZXMgcyAgKGNvc3Q9Ti4uTiByb3dzPTMgd2lkdGg9TikKKyg0IHJvd3MpCisK Ky0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQorLS0gQ0FTRSA2OiBOVUxMIGhhbmRsaW5nCistLSA9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tIEFOWSB3aXRo IE5VTEwKK1NFTEVDVCBleHBsYWluX21hc2tfY29zdHMoJCQKK1NFTEVDVCAqIEZST00gdF9t Y3YgV0hFUkUgYSA9IEFOWSAoQVJSQVlbTlVMTCwxXSk7JCQsCitmYWxzZSwgdHJ1ZSwgZmFs c2UsIHRydWUpOworICAgICAgICAgICAgICAgZXhwbGFpbl9tYXNrX2Nvc3RzICAgICAgICAg ICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorIFNlcSBTY2FuIG9uIHRfbWN2ICAoY29zdD1OLi5OIHJvd3M9MjAwIHdpZHRoPU4p CisgICBGaWx0ZXI6IChhID0gQU5ZICgne05VTEwsMX0nOjppbnRlZ2VyW10pKQorKDIgcm93 cykKKworLS0gQUxMIHdpdGggTlVMTCAoc2hvdWxkIGJlIDAgc2VsZWN0aXZpdHkpCitTRUxF Q1QgZXhwbGFpbl9tYXNrX2Nvc3RzKCQkCitTRUxFQ1QgKiBGUk9NIHRfbWN2IFdIRVJFIGEg PSBBTEwgKEFSUkFZWzEsTlVMTF0pOyQkLAorZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlKTsK KyAgICAgICAgICAgICAgZXhwbGFpbl9tYXNrX2Nvc3RzICAgICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2Fu IG9uIHRfbWN2ICAoY29zdD1OLi5OIHJvd3M9MSB3aWR0aD1OKQorICAgRmlsdGVyOiAoYSA9 IEFMTCAoJ3sxLE5VTEx9Jzo6aW50ZWdlcltdKSkKKygyIHJvd3MpCisKKy0tID09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0g Q0FTRSA3OiBDb21iaW5lZCBhbGwgb2YgdGhlbQorLS0gPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitTRUxFQ1QgZXhwbGFpbl9t YXNrX2Nvc3RzKCQkCitTRUxFQ1QgKiBGUk9NIHRfbWN2IFdIRVJFIGEgPSBBTlkgKEFSUkFZ WzEsIDIsIDMsIDEwMDAsIDIwMDAsIE5VTEwsIDEsIDEsIDIsIChTRUxFQ1QgNCksIChTRUxF Q1QgNSksIChTRUxFQ1QgMTAwMDApLCAoU0VMRUNUIDQpLCAoU0VMRUNUIDQpXSB8fCBBUlJB WSggU0VMRUNUIGkgJSAxMjAgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwgNTAwKSBzKGkpKSk7 JCQsCitmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwbGFpbl9tYXNrX2Nvc3RzICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNl cSBTY2FuIG9uIHRfbWN2ICAoY29zdD1OLi5OIHJvd3M9MTkxMiB3aWR0aD1OKQorICAgRmls dGVyOiAoYSA9IEFOWSAoKEFSUkFZWzEsIDIsIDMsIDEwMDAsIDIwMDAsIE5VTEw6OmludGVn ZXIsIDEsIDEsIDIsIChJbml0UGxhbiBleHByXzEpLmNvbDEsIChJbml0UGxhbiBleHByXzIp LmNvbDEsIChJbml0UGxhbiBleHByXzMpLmNvbDEsIChJbml0UGxhbiBleHByXzQpLmNvbDEs IChJbml0UGxhbiBleHByXzUpLmNvbDFdIHx8IChJbml0UGxhbiBhcnJheV8xKS5jb2wxKSkp CisgICBJbml0UGxhbiBleHByXzEKKyAgICAgLT4gIFJlc3VsdCAgKGNvc3Q9Ti4uTiByb3dz PTEgd2lkdGg9TikKKyAgIEluaXRQbGFuIGV4cHJfMgorICAgICAtPiAgUmVzdWx0ICAoY29z dD1OLi5OIHJvd3M9MSB3aWR0aD1OKQorICAgSW5pdFBsYW4gZXhwcl8zCisgICAgIC0+ICBS ZXN1bHQgIChjb3N0PU4uLk4gcm93cz0xIHdpZHRoPU4pCisgICBJbml0UGxhbiBleHByXzQK KyAgICAgLT4gIFJlc3VsdCAgKGNvc3Q9Ti4uTiByb3dzPTEgd2lkdGg9TikKKyAgIEluaXRQ bGFuIGV4cHJfNQorICAgICAtPiAgUmVzdWx0ICAoY29zdD1OLi5OIHJvd3M9MSB3aWR0aD1O KQorICAgSW5pdFBsYW4gYXJyYXlfMQorICAgICAtPiAgRnVuY3Rpb24gU2NhbiBvbiBnZW5l cmF0ZV9zZXJpZXMgcyAgKGNvc3Q9Ti4uTiByb3dzPTUwMCB3aWR0aD1OKQorKDE0IHJvd3Mp CisKK1NFTEVDVCBleHBsYWluX21hc2tfY29zdHMoJCQKK1NFTEVDVCAqIEZST00gdF9tY3Yg V0hFUkUgYSA8PiBBTEwgKEFSUkFZWzEsIDIsIDMsIDEwMDAsIDIwMDAsIE5VTEwsIDEsIDEs IDIsIChTRUxFQ1QgNCksIChTRUxFQ1QgNSksIChTRUxFQ1QgMTAwMDApLCAoU0VMRUNUIDQp LCAoU0VMRUNUIDQpXSB8fCBBUlJBWSggU0VMRUNUIGkgJSAxMjAgRlJPTSBnZW5lcmF0ZV9z ZXJpZXMoMSwgNTAwKSBzKGkpKSk7JCQsCitmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOwor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGxh aW5fbWFza19jb3N0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24gdF9tY3YgIChjb3N0PU4uLk4gcm93 cz0xODA4OCB3aWR0aD1OKQorICAgRmlsdGVyOiAoYSA8PiBBTEwgKChBUlJBWVsxLCAyLCAz LCAxMDAwLCAyMDAwLCBOVUxMOjppbnRlZ2VyLCAxLCAxLCAyLCAoSW5pdFBsYW4gZXhwcl8x KS5jb2wxLCAoSW5pdFBsYW4gZXhwcl8yKS5jb2wxLCAoSW5pdFBsYW4gZXhwcl8zKS5jb2wx LCAoSW5pdFBsYW4gZXhwcl80KS5jb2wxLCAoSW5pdFBsYW4gZXhwcl81KS5jb2wxXSB8fCAo SW5pdFBsYW4gYXJyYXlfMSkuY29sMSkpKQorICAgSW5pdFBsYW4gZXhwcl8xCisgICAgIC0+ ICBSZXN1bHQgIChjb3N0PU4uLk4gcm93cz0xIHdpZHRoPU4pCisgICBJbml0UGxhbiBleHBy XzIKKyAgICAgLT4gIFJlc3VsdCAgKGNvc3Q9Ti4uTiByb3dzPTEgd2lkdGg9TikKKyAgIElu aXRQbGFuIGV4cHJfMworICAgICAtPiAgUmVzdWx0ICAoY29zdD1OLi5OIHJvd3M9MSB3aWR0 aD1OKQorICAgSW5pdFBsYW4gZXhwcl80CisgICAgIC0+ICBSZXN1bHQgIChjb3N0PU4uLk4g cm93cz0xIHdpZHRoPU4pCisgICBJbml0UGxhbiBleHByXzUKKyAgICAgLT4gIFJlc3VsdCAg KGNvc3Q9Ti4uTiByb3dzPTEgd2lkdGg9TikKKyAgIEluaXRQbGFuIGFycmF5XzEKKyAgICAg LT4gIEZ1bmN0aW9uIFNjYW4gb24gZ2VuZXJhdGVfc2VyaWVzIHMgIChjb3N0PU4uLk4gcm93 cz01MDAgd2lkdGg9TikKKygxNCByb3dzKQorCitEUk9QIFRBQkxFIHRfbWN2OwogRFJPUCBG VU5DVElPTiBleHBsYWluX21hc2tfY29zdHModGV4dCwgYm9vbCwgYm9vbCwgYm9vbCwgYm9v bCk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9wbGFubmVyX2VzdC5zcWwg Yi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9wbGFubmVyX2VzdC5zcWwKaW5kZXggNTMyMTBkNWJh YWQuLmJhOGY4YmQ4ZmI2IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9wbGFu bmVyX2VzdC5zcWwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvcGxhbm5lcl9lc3Quc3Fs CkBAIC0xNDcsNCArMTQ3LDExNiBAQCBTRUxFQ1QgZXhwbGFpbl9tYXNrX2Nvc3RzKCQkCiBT RUxFQ1QgKiBGUk9NIHRlbmsxIFdIRVJFIHVuaXF1ZTEgPD4gQUxMIChBUlJBWVsxLCAyLCA5 OCwgKFNFTEVDVCA5OSksIE5VTExdKTskJCwKIGZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7 CiAKKy0tIEVuc3VyZSBzdGFibGUgYW5kIHJpY2ggTUNWIHN0YXRpc3RpY3MKK1NFVCBkZWZh dWx0X3N0YXRpc3RpY3NfdGFyZ2V0ID0gMTAwMDsKKworQ1JFQVRFIFRBQkxFIHRfbWN2IChh IGludCk7CisKKy0tIEJ1aWxkIH4xMDAgTUNWIHZhbHVlcyB3aXRoIHVuaWZvcm0gZGlzdHJp YnV0aW9uCitJTlNFUlQgSU5UTyB0X21jdgorU0VMRUNUIChpICUgMTAwKQorRlJPTSBnZW5l cmF0ZV9zZXJpZXMoMSwgMjAwMDApIHMoaSk7CisKK0FOQUxZWkUgdF9tY3Y7CisKKy0tID09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQorLS0gQ0FTRSAxOiBMYXJnZSBBTlkgbGlzdCAoTUNWIDwgQU5ZKSDihpIgaGFzaCBvbiBN Q1YKKy0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PQorCistLSAxLiBTaW5nbGUgZWxlbWVudAorU0VMRUNUIGV4cGxhaW5fbWFz a19jb3N0cygkJAorU0VMRUNUICogRlJPTSB0X21jdiBXSEVSRSBhID0gQU5ZIChBUlJBWShT RUxFQ1QgMSkpOyQkLAorZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlKTsKKworLS0gMi4gTXVs dGlwbGUgZWxlbWVudHMgKGFsbCBpbiBNQ1YpCitTRUxFQ1QgZXhwbGFpbl9tYXNrX2Nvc3Rz KCQkCitTRUxFQ1QgKiBGUk9NIHRfbWN2IFdIRVJFIGEgPSBBTlkgKEFSUkFZKFNFTEVDVCBp IEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsMykgcyhpKSkpOyQkLAorZmFsc2UsIHRydWUsIGZh bHNlLCB0cnVlKTsKKworLS0gMy4gSW5jbHVkZXMgbm9uLU1DViB2YWx1ZXMKK1NFTEVDVCBl eHBsYWluX21hc2tfY29zdHMoJCQKK1NFTEVDVCAqIEZST00gdF9tY3YgV0hFUkUgYSA9IEFO WSAoQVJSQVlbMSwgMiwgMTAwMF0pOyQkLAorZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlKTsK KworLS0gNC4gRHVwbGljYXRlcworU0VMRUNUIGV4cGxhaW5fbWFza19jb3N0cygkJAorU0VM RUNUICogRlJPTSB0X21jdiBXSEVSRSBhID0gQU5ZIChBUlJBWShTRUxFQ1QgKGkgJSAzKSAr IDEgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwzMCkgcyhpKSkpOyQkLAorZmFsc2UsIHRydWUs IGZhbHNlLCB0cnVlKTsKKworLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09CistLSBDQVNFIDI6IFNtYWxsIEFOWSBsaXN0IChB TlkgPCBNQ1YpIOKGkiBoYXNoIG9uIEFOWQorLS0gPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy0tIDEuIFNpbmdsZSBlbGVt ZW50CitTRUxFQ1QgZXhwbGFpbl9tYXNrX2Nvc3RzKCQkCitTRUxFQ1QgKiBGUk9NIHRfbWN2 IFdIRVJFIGEgPSBBTlkgKEFSUkFZWzEwXSk7JCQsCitmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRy dWUpOworCistLSAyLiBNdWx0aXBsZSBlbGVtZW50cyAoYWxsIGluIE1DVikKK1NFTEVDVCBl eHBsYWluX21hc2tfY29zdHMoJCQKK1NFTEVDVCAqIEZST00gdF9tY3YgV0hFUkUgYSA9IEFO WSAoQVJSQVlbMTAsMjAsMzBdKTskJCwKK2ZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisK Ky0tIDMuIEluY2x1ZGVzIG5vbi1NQ1YgdmFsdWVzCitTRUxFQ1QgZXhwbGFpbl9tYXNrX2Nv c3RzKCQkCitTRUxFQ1QgKiBGUk9NIHRfbWN2IFdIRVJFIGEgPSBBTlkgKEFSUkFZWzEwLDIw LDEwMDAwXSk7JCQsCitmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOworCistLSA0LiBEdXBs aWNhdGVzCitTRUxFQ1QgZXhwbGFpbl9tYXNrX2Nvc3RzKCQkCitTRUxFQ1QgKiBGUk9NIHRf bWN2IFdIRVJFIGEgPSBBTlkgKEFSUkFZWzEwLDEwLDEwLDIwLDIwXSk7JCQsCitmYWxzZSwg dHJ1ZSwgZmFsc2UsIHRydWUpOworCistLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tIENBU0UgMzogR3VhcmFudGVlZCBs YXJnZSBjYXNlIOKGkiBzdHJlc3MgaGFzaCBwYXRoCistLSA9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1NFTEVDVCBleHBsYWlu X21hc2tfY29zdHMoJCQKK1NFTEVDVCAqIEZST00gdF9tY3YgV0hFUkUgYSA9IEFOWSAoQVJS QVkoU0VMRUNUIGkgJSAxMDAgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSw1MDApIHMoaSkpKTsk JCwKK2ZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisKKy0tID09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0gQ0FTRSA0OiBp bmVxdWFsaXR5ICg8PiBBTEwpCistLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworU0VMRUNUIGV4cGxhaW5fbWFza19jb3N0 cygkJAorU0VMRUNUICogRlJPTSB0X21jdiBXSEVSRSBhIDw+IEFMTCAoQVJSQVlbMSwyLDNd KTskJCwKK2ZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisKKy0tID09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0gQ0FTRSA1 OiBtaXggY29uc3QgKyBub24tY29uc3QKKy0tID09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitTRUxFQ1QgZXhwbGFpbl9tYXNr X2Nvc3RzKCQkCitTRUxFQ1QgKiBGUk9NIHRfbWN2IFdIRVJFIGEgPSBBTlkgKEFSUkFZWzEs Ml0gfHwgQVJSQVkoU0VMRUNUIGkgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMyw1KSBzKGkpKSk7 JCQsCitmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOworCistLSA9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tIENBU0UgNjog TlVMTCBoYW5kbGluZworLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09CisKKy0tIEFOWSB3aXRoIE5VTEwKK1NFTEVDVCBleHBs YWluX21hc2tfY29zdHMoJCQKK1NFTEVDVCAqIEZST00gdF9tY3YgV0hFUkUgYSA9IEFOWSAo QVJSQVlbTlVMTCwxXSk7JCQsCitmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOworCistLSBB TEwgd2l0aCBOVUxMIChzaG91bGQgYmUgMCBzZWxlY3Rpdml0eSkKK1NFTEVDVCBleHBsYWlu X21hc2tfY29zdHMoJCQKK1NFTEVDVCAqIEZST00gdF9tY3YgV0hFUkUgYSA9IEFMTCAoQVJS QVlbMSxOVUxMXSk7JCQsCitmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOworCistLSA9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K Ky0tIENBU0UgNzogQ29tYmluZWQgYWxsIG9mIHRoZW0KKy0tID09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitTRUxFQ1QgZXhw bGFpbl9tYXNrX2Nvc3RzKCQkCitTRUxFQ1QgKiBGUk9NIHRfbWN2IFdIRVJFIGEgPSBBTlkg KEFSUkFZWzEsIDIsIDMsIDEwMDAsIDIwMDAsIE5VTEwsIDEsIDEsIDIsIChTRUxFQ1QgNCks IChTRUxFQ1QgNSksIChTRUxFQ1QgMTAwMDApLCAoU0VMRUNUIDQpLCAoU0VMRUNUIDQpXSB8 fCBBUlJBWSggU0VMRUNUIGkgJSAxMjAgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwgNTAwKSBz KGkpKSk7JCQsCitmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOworCitTRUxFQ1QgZXhwbGFp bl9tYXNrX2Nvc3RzKCQkCitTRUxFQ1QgKiBGUk9NIHRfbWN2IFdIRVJFIGEgPD4gQUxMIChB UlJBWVsxLCAyLCAzLCAxMDAwLCAyMDAwLCBOVUxMLCAxLCAxLCAyLCAoU0VMRUNUIDQpLCAo U0VMRUNUIDUpLCAoU0VMRUNUIDEwMDAwKSwgKFNFTEVDVCA0KSwgKFNFTEVDVCA0KV0gfHwg QVJSQVkoIFNFTEVDVCBpICUgMTIwIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDUwMCkgcyhp KSkpOyQkLAorZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlKTsKKworRFJPUCBUQUJMRSB0X21j djsKKworCiBEUk9QIEZVTkNUSU9OIGV4cGxhaW5fbWFza19jb3N0cyh0ZXh0LCBib29sLCBi b29sLCBib29sLCBib29sKTsK --------------JTZhw03S6KMzOpCR4jTRhExO--