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 1tcbn7-001Ko8-5Y for pgsql-hackers@arkaria.postgresql.org; Tue, 28 Jan 2025 02:57:29 +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 1tcbn6-00G5E8-6D for pgsql-hackers@arkaria.postgresql.org; Tue, 28 Jan 2025 02:57:28 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tcbn5-00G5E0-Ou for pgsql-hackers@lists.postgresql.org; Tue, 28 Jan 2025 02:57:27 +0000 Received: from forward102b.mail.yandex.net ([178.154.239.149]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1tcbn2-001t1i-1d for pgsql-hackers@postgresql.org; Tue, 28 Jan 2025 02:57:27 +0000 Received: from mail-nwsmtp-smtp-production-main-60.sas.yp-c.yandex.net (mail-nwsmtp-smtp-production-main-60.sas.yp-c.yandex.net [IPv6:2a02:6b8:c23:2a23:0:640:a77e:0]) by forward102b.mail.yandex.net (Yandex) with ESMTPS id 2DFBE60A1B; Tue, 28 Jan 2025 05:57:23 +0300 (MSK) Received: by mail-nwsmtp-smtp-production-main-60.sas.yp-c.yandex.net (smtp/Yandex) with ESMTPSA id vuS0kB1OrmI0-T1AyWCcQ; Tue, 28 Jan 2025 05:57:22 +0300 X-Yandex-Fwd: 1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tantorlabs.com; s=mail; t=1738033042; bh=elbyV7DmbvV/kqTF6hFndN1OaiST+Hwx9lK5cuZODFA=; h=In-Reply-To:Cc:Date:References:To:Subject:Message-ID:From; b=BH/m4XAlUD4G/S2XRnvBlk8YBqlKO37AROOf86wtxaP6OgZcHyUQtQrLWB0d3osOV qNlYXMozcZTv229LHOdH8OxqB/vcOjYoGlNzu+SAAMdp63wm/onV7e7UrQe62RJNoh bjiX4pJHo9p4kfC5UOenE6z+1GQcggcwI/DA8a0E= Authentication-Results: mail-nwsmtp-smtp-production-main-60.sas.yp-c.yandex.net; dkim=pass header.i=@tantorlabs.com Content-Type: multipart/mixed; boundary="------------i7SA5BG3UFKXm7sBZsV0iOYd" Message-ID: <0c7770bd-9750-4200-a472-bdb262583c2f@tantorlabs.com> Date: Tue, 28 Jan 2025 05:56:57 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Sample rate added to pg_stat_statements To: Sami Imseih Cc: Andrey Borodin , Alena Rybakina , Alexander Korotkov , Michael Paquier , Greg Sabino Mullane , pgsql-hackers References: <52e5e3aa-066a-4daf-8d65-77c34a2f0d98@tantorlabs.com> <6482A576-4465-4E46-A42C-F1767E8DDE30@yandex-team.ru> <20994d10-ab44-4c6b-91bc-c4675cd2e58e@tantorlabs.com> <9D8A5BC8-A3A5-4DA9-9382-F30D343247D1@yandex-team.ru> <6cf6270b-e8fa-4d99-b74a-17e781cdf309@tantorlabs.com> <3a27c830-b81f-4560-9774-a87d9b922fbd@tantorlabs.com> <7AD765EF-14DE-4B3E-8282-E82A9B44DBAA@yandex-team.ru> 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. --------------i7SA5BG3UFKXm7sBZsV0iOYd Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 28.01.2025 02:00, Sami Imseih wrote: > Hi, > > I have a few comments about the patch. > > 1/ > tests are missing for pg_stat_statements.track=all and with a sample > rate < 1 applied. > Can we add tests for this case? I think I’ve come up with a good idea for implementing this. We can create a new file, sampling.sql, for regression tests, where we move written tests in select.out and check test with setting "pg_stat_statements.track = 'all'" and "pg_stat_statements.sample_rate = 0.5". Additionally, we can create two files in the 'expected' directory: sampling.out and sampling_1.out where we can verify either all nested statements are tracked or none of them. > > 2/ > > This declaration: > > +static bool current_query_sampled = false; > > should be moved near the declaration of nesting_level, > the other local variable. +1 > > > 3/ > I do not really like the calls to update_current_query_sampled() > the way there are, and I think the pgss_enabled should encapsulate > the new sample rate check as well. > > My thoughts are: > > 1/ change the name of the function from update_current_query_sampled > to current_query_sampled > > Also, the static bool should be called is_query_sampled or something like that. > > The function should also allow you to skip the sample rate check, such as if > called from pgss_post_parse_analyze. > > We can also remove the IsParallelWorker() check in this case, since that > is done in pgss_enabled. > > something like this is what I am thinking: > > static bool > current_query_sampled(bool skip) > { > if (skip) > return true; > > if (nesting_level == 0) > { > is_query_sampled = pgss_sample_rate != 0.0 && > (pgss_sample_rate == 1.0 || > > pg_prng_double(&pg_global_prng_state) <= pgss_sample_rate); > } > > return is_query_sampled; > } > > #define pgss_enabled(level, skip_sampling_check) \ > (!IsParallelWorker() && \ > (pgss_track == PGSS_TRACK_ALL || \ > (pgss_track == PGSS_TRACK_TOP && (level) == 0)) && \ > current_query_sampled(skip_sampling_check)) > > What do you think? I agree with all of these changes; they make the code more readable. Adding comments to the current_query_sampled() function will make it even clearer. > > 4/ Now we have pg_stat_statements.track = "off" which is effectively > the same thing as pg_stat_statements.sample_rate = "0". Does this need > to be called out in docs? +1, because we have the same thing in log_statement_sample_rate. All the changes mentioned above are included in the v13 patch. Since the patch status is 'Ready for Committer,' I believe it is now better for upstream inclusion, with improved details in tests and documentation. Do you have any further suggestions? -- Best regards, Ilia Evdokimov, Tantor Labs LLC. --------------i7SA5BG3UFKXm7sBZsV0iOYd Content-Type: text/x-patch; charset=UTF-8; name="v13-0001-Allow-setting-sample-rate-for-pg_stat_statements.patch" Content-Disposition: attachment; filename*0="v13-0001-Allow-setting-sample-rate-for-pg_stat_statements.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSAxNDk2ODhmZTNiY2NjZTI1ZjhkMDFkZmU4YzAxNDQ0NTU1ZGNlMDNjIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBJbGlhIEV2ZG9raW1vdiA8aWx5YS5ldmRva2ltb3ZA dGFudG9ybGFicy5jb20+CkRhdGU6IFR1ZSwgMjggSmFuIDIwMjUgMDU6MzE6MjAgKzAzMDAK U3ViamVjdDogW1BBVENIXSBBbGxvdyBzZXR0aW5nIHNhbXBsZSByYXRlIGZvciBwZ19zdGF0 X3N0YXRlbWVudHMKCk5ldyBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBwZ19zdGF0X3N0YXRl bWVudHMuc2FtcGxlX3JhdGUgbWFrZXMgaXQKcG9zc2libGUgdG8gdHJhY2sganVzdCBhIGZy YWN0aW9uIG9mIHRoZSBxdWVyaWVzIG1lZXRpbmcgdGhlIGNvbmZpZ3VyZWQKdGhyZXNob2xk LCB0byByZWR1Y2UgdGhlIGFtb3VudCBvZiB0cmFja2luZy4KLS0tCiBjb250cmliL3BnX3N0 YXRfc3RhdGVtZW50cy9NYWtlZmlsZSAgICAgICAgICAgfCAgMiArLQogLi4uL3BnX3N0YXRf c3RhdGVtZW50cy9leHBlY3RlZC9zYW1wbGluZy5vdXQgIHwgOTkgKysrKysrKysrKysrKysr KysrKwogLi4uL2V4cGVjdGVkL3NhbXBsaW5nXzEub3V0ICAgICAgICAgICAgICAgICAgIHwg OTcgKysrKysrKysrKysrKysrKysrCiAuLi4vcGdfc3RhdF9zdGF0ZW1lbnRzL3BnX3N0YXRf c3RhdGVtZW50cy5jICAgfCA1OSArKysrKysrKystLQogY29udHJpYi9wZ19zdGF0X3N0YXRl bWVudHMvc3FsL3NhbXBsaW5nLnNxbCAgIHwgMzQgKysrKysrKwogZG9jL3NyYy9zZ21sL3Bn c3RhdHN0YXRlbWVudHMuc2dtbCAgICAgICAgICAgIHwgMTkgKysrKwogNiBmaWxlcyBjaGFu Z2VkLCAzMDIgaW5zZXJ0aW9ucygrKSwgOCBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEw MDY0NCBjb250cmliL3BnX3N0YXRfc3RhdGVtZW50cy9leHBlY3RlZC9zYW1wbGluZy5vdXQK IGNyZWF0ZSBtb2RlIDEwMDY0NCBjb250cmliL3BnX3N0YXRfc3RhdGVtZW50cy9leHBlY3Rl ZC9zYW1wbGluZ18xLm91dAogY3JlYXRlIG1vZGUgMTAwNjQ0IGNvbnRyaWIvcGdfc3RhdF9z dGF0ZW1lbnRzL3NxbC9zYW1wbGluZy5zcWwKCmRpZmYgLS1naXQgYS9jb250cmliL3BnX3N0 YXRfc3RhdGVtZW50cy9NYWtlZmlsZSBiL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL01h a2VmaWxlCmluZGV4IDI0MWMwMjU4N2IuLmI3MGJkZmFmMmQgMTAwNjQ0Ci0tLSBhL2NvbnRy aWIvcGdfc3RhdF9zdGF0ZW1lbnRzL01ha2VmaWxlCisrKyBiL2NvbnRyaWIvcGdfc3RhdF9z dGF0ZW1lbnRzL01ha2VmaWxlCkBAIC0yMCw3ICsyMCw3IEBAIExERkxBR1NfU0wgKz0gJChm aWx0ZXIgLWxtLCAkKExJQlMpKQogUkVHUkVTU19PUFRTID0gLS10ZW1wLWNvbmZpZyAkKHRv cF9zcmNkaXIpL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3BnX3N0YXRfc3RhdGVtZW50 cy5jb25mCiBSRUdSRVNTID0gc2VsZWN0IGRtbCBjdXJzb3JzIHV0aWxpdHkgbGV2ZWxfdHJh Y2tpbmcgcGxhbm5pbmcgXAogCXVzZXJfYWN0aXZpdHkgd2FsIGVudHJ5X3RpbWVzdGFtcCBw cml2aWxlZ2VzIGV4dGVuZGVkIFwKLQlwYXJhbGxlbCBjbGVhbnVwIG9sZGV4dHZlcnNpb25z CisJcGFyYWxsZWwgc2FtcGxpbmcgY2xlYW51cCBvbGRleHR2ZXJzaW9ucwogIyBEaXNhYmxl ZCBiZWNhdXNlIHRoZXNlIHRlc3RzIHJlcXVpcmUgInNoYXJlZF9wcmVsb2FkX2xpYnJhcmll cz1wZ19zdGF0X3N0YXRlbWVudHMiLAogIyB3aGljaCB0eXBpY2FsIGluc3RhbGxjaGVjayB1 c2VycyBkbyBub3QgaGF2ZSAoZS5nLiBidWlsZGZhcm0gY2xpZW50cykuCiBOT19JTlNUQUxM Q0hFQ0sgPSAxCmRpZmYgLS1naXQgYS9jb250cmliL3BnX3N0YXRfc3RhdGVtZW50cy9leHBl Y3RlZC9zYW1wbGluZy5vdXQgYi9jb250cmliL3BnX3N0YXRfc3RhdGVtZW50cy9leHBlY3Rl ZC9zYW1wbGluZy5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMC4u NmU3M2EwYTMxOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1l bnRzL2V4cGVjdGVkL3NhbXBsaW5nLm91dApAQCAtMCwwICsxLDk5IEBACistLQorLS0gc2Ft cGxlIHN0YXRlbWVudHMKKy0tCitTRVQgcGdfc3RhdF9zdGF0ZW1lbnRzLnNhbXBsZV9yYXRl ID0gMC4wOworU0VMRUNUIHBnX3N0YXRfc3RhdGVtZW50c19yZXNldCgpIElTIE5PVCBOVUxM IEFTIHQ7CisgdCAKKy0tLQorIHQKKygxIHJvdykKKworU0VMRUNUIDEgQVMgImludCI7Cisg aW50IAorLS0tLS0KKyAgIDEKKygxIHJvdykKKworU0VMRUNUIHF1ZXJ5LCBjYWxscyBGUk9N IHBnX3N0YXRfc3RhdGVtZW50cyBPUkRFUiBCWSBxdWVyeSBDT0xMQVRFICJDIjsKKyBxdWVy eSB8IGNhbGxzIAorLS0tLS0tLSstLS0tLS0tCisoMCByb3dzKQorCitTRVQgcGdfc3RhdF9z dGF0ZW1lbnRzLnNhbXBsZV9yYXRlID0gMS4wOworU0VMRUNUIDEgQVMgImludCI7CisgaW50 IAorLS0tLS0KKyAgIDEKKygxIHJvdykKKworU0VMRUNUIHF1ZXJ5LCBjYWxscyBGUk9NIHBn X3N0YXRfc3RhdGVtZW50cyBPUkRFUiBCWSBxdWVyeSBDT0xMQVRFICJDIjsKKyAgICAgICBx dWVyeSAgICAgICAgfCBjYWxscyAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0KKyBT RUxFQ1QgJDEgQVMgImludCIgfCAgICAgMQorKDEgcm93KQorCistLSBzYW1wbGVfcmF0ZSBp cyAoMCwgMSkgYW5kIHRyYWNrID0gImFsbCIKK1NFVCBwZ19zdGF0X3N0YXRlbWVudHMudHJh Y2sgPSAiYWxsIjsKK1NFTEVDVCBwZ19zdGF0X3N0YXRlbWVudHNfcmVzZXQoKSBJUyBOT1Qg TlVMTCBBUyB0OworIHQgCistLS0KKyB0CisoMSByb3cpCisKK1NFVCBwZ19zdGF0X3N0YXRl bWVudHMuc2FtcGxlX3JhdGUgPSAwLjU7CistLSBlaXRoZXIgYWxsIG5lc3RlZCBzdGF0ZW1l bnRzIHdpbGwgYmUgdHJhY2tlZCAoc2FtcGxlLm91dCkgb3Igbm9uZSB3aWxsIChzYW1wbGVf MS5vdXQpLgorRVhQTEFJTiAoQ09TVFMgT0ZGKSBTRUxFQ1QgMTsKKyBRVUVSWSBQTEFOIAor LS0tLS0tLS0tLS0tCisgUmVzdWx0CisoMSByb3cpCisKK1NFTEVDVCB0b3BsZXZlbCwgY2Fs bHMsIHF1ZXJ5IEZST00gcGdfc3RhdF9zdGF0ZW1lbnRzCisgICAgT1JERVIgQlkgcXVlcnkg Q09MTEFURSAiQyIsIHRvcGxldmVsOworIHRvcGxldmVsIHwgY2FsbHMgfCAgICAgICAgICAg ICAgICAgICAgICAgcXVlcnkgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0r LS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgdCAgICAgICAgfCAgICAgMSB8IEVYUExBSU4gKENPU1RTIE9GRikgU0VMRUNU ICQxCisgZiAgICAgICAgfCAgICAgMSB8IFNFTEVDVCAkMQorIHQgICAgICAgIHwgICAgIDEg fCBTRUxFQ1QgcGdfc3RhdF9zdGF0ZW1lbnRzX3Jlc2V0KCkgSVMgTk9UIE5VTEwgQVMgdAor IHQgICAgICAgIHwgICAgIDEgfCBTRVQgcGdfc3RhdF9zdGF0ZW1lbnRzLnNhbXBsZV9yYXRl ID0gJDEKKyg0IHJvd3MpCisKK1NFVCBwZ19zdGF0X3N0YXRlbWVudHMudHJhY2sgPSAidG9w IjsKK1NFVCBwZ19zdGF0X3N0YXRlbWVudHMuc2FtcGxlX3JhdGUgPSAwLjA7CitTRUxFQ1Qg cGdfc3RhdF9zdGF0ZW1lbnRzX3Jlc2V0KCkgSVMgTk9UIE5VTEwgQVMgdDsKKyB0IAorLS0t CisgdAorKDEgcm93KQorCitTRUxFQ1QgMSBccGFyc2Ugc3RtdAorXGJpbmRfbmFtZWQgc3Rt dCBcZworID9jb2x1bW4/IAorLS0tLS0tLS0tLQorICAgICAgICAxCisoMSByb3cpCisKK1NF TEVDVCBxdWVyeSwgY2FsbHMgRlJPTSBwZ19zdGF0X3N0YXRlbWVudHMgT1JERVIgQlkgcXVl cnkgQ09MTEFURSAiQyI7CisgcXVlcnkgfCBjYWxscyAKKy0tLS0tLS0rLS0tLS0tLQorKDAg cm93cykKKworU0VUIHBnX3N0YXRfc3RhdGVtZW50cy5zYW1wbGVfcmF0ZSA9IDEuMDsKK1xi aW5kX25hbWVkIHN0bXQgXGcKKyA/Y29sdW1uPyAKKy0tLS0tLS0tLS0KKyAgICAgICAgMQor KDEgcm93KQorCitTRUxFQ1QgcXVlcnksIGNhbGxzIEZST00gcGdfc3RhdF9zdGF0ZW1lbnRz IE9SREVSIEJZIHF1ZXJ5IENPTExBVEUgIkMiOworICAgcXVlcnkgICB8IGNhbGxzIAorLS0t LS0tLS0tLS0rLS0tLS0tLQorIFNFTEVDVCAkMSB8ICAgICAxCisoMSByb3cpCisKK1NFTEVD VCBwZ19zdGF0X3N0YXRlbWVudHNfcmVzZXQoKSBJUyBOT1QgTlVMTCBBUyB0OworIHQgCist LS0KKyB0CisoMSByb3cpCisKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1l bnRzL2V4cGVjdGVkL3NhbXBsaW5nXzEub3V0IGIvY29udHJpYi9wZ19zdGF0X3N0YXRlbWVu dHMvZXhwZWN0ZWQvc2FtcGxpbmdfMS5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAwMC4uM2EzOTAyMjZmYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRyaWIvcGdf c3RhdF9zdGF0ZW1lbnRzL2V4cGVjdGVkL3NhbXBsaW5nXzEub3V0CkBAIC0wLDAgKzEsOTcg QEAKKy0tCistLSBzYW1wbGUgc3RhdGVtZW50cworLS0KK1NFVCBwZ19zdGF0X3N0YXRlbWVu dHMuc2FtcGxlX3JhdGUgPSAwLjA7CitTRUxFQ1QgcGdfc3RhdF9zdGF0ZW1lbnRzX3Jlc2V0 KCkgSVMgTk9UIE5VTEwgQVMgdDsKKyB0IAorLS0tCisgdAorKDEgcm93KQorCitTRUxFQ1Qg MSBBUyAiaW50IjsKKyBpbnQgCistLS0tLQorICAgMQorKDEgcm93KQorCitTRUxFQ1QgcXVl cnksIGNhbGxzIEZST00gcGdfc3RhdF9zdGF0ZW1lbnRzIE9SREVSIEJZIHF1ZXJ5IENPTExB VEUgIkMiOworIHF1ZXJ5IHwgY2FsbHMgCistLS0tLS0tKy0tLS0tLS0KKygwIHJvd3MpCisK K1NFVCBwZ19zdGF0X3N0YXRlbWVudHMuc2FtcGxlX3JhdGUgPSAxLjA7CitTRUxFQ1QgMSBB UyAiaW50IjsKKyBpbnQgCistLS0tLQorICAgMQorKDEgcm93KQorCitTRUxFQ1QgcXVlcnks IGNhbGxzIEZST00gcGdfc3RhdF9zdGF0ZW1lbnRzIE9SREVSIEJZIHF1ZXJ5IENPTExBVEUg IkMiOworICAgICAgIHF1ZXJ5ICAgICAgICB8IGNhbGxzIAorLS0tLS0tLS0tLS0tLS0tLS0t LS0rLS0tLS0tLQorIFNFTEVDVCAkMSBBUyAiaW50IiB8ICAgICAxCisoMSByb3cpCisKKy0t IHNhbXBsZV9yYXRlIGlzICgwLCAxKSBhbmQgdHJhY2sgPSAiYWxsIgorU0VUIHBnX3N0YXRf c3RhdGVtZW50cy50cmFjayA9ICJhbGwiOworU0VMRUNUIHBnX3N0YXRfc3RhdGVtZW50c19y ZXNldCgpIElTIE5PVCBOVUxMIEFTIHQ7CisgdCAKKy0tLQorIHQKKygxIHJvdykKKworU0VU IHBnX3N0YXRfc3RhdGVtZW50cy5zYW1wbGVfcmF0ZSA9IDAuNTsKKy0tIGVpdGhlciBhbGwg bmVzdGVkIHN0YXRlbWVudHMgd2lsbCBiZSB0cmFja2VkIChzYW1wbGUub3V0KSBvciBub25l IHdpbGwgKHNhbXBsZV8xLm91dCkuCitFWFBMQUlOIChDT1NUUyBPRkYpIFNFTEVDVCAxOwor IFFVRVJZIFBMQU4gCistLS0tLS0tLS0tLS0KKyBSZXN1bHQKKygxIHJvdykKKworU0VMRUNU IHRvcGxldmVsLCBjYWxscywgcXVlcnkgRlJPTSBwZ19zdGF0X3N0YXRlbWVudHMKKyAgICBP UkRFUiBCWSBxdWVyeSBDT0xMQVRFICJDIiwgdG9wbGV2ZWw7CisgdG9wbGV2ZWwgfCBjYWxs cyB8ICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSAgICAgICAgICAgICAgICAgICAgICAg IAorLS0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB0ICAgICAgICB8ICAgICAxIHwgU0VMRUNUIHBnX3N0 YXRfc3RhdGVtZW50c19yZXNldCgpIElTIE5PVCBOVUxMIEFTIHQKKyB0ICAgICAgICB8ICAg ICAxIHwgU0VUIHBnX3N0YXRfc3RhdGVtZW50cy5zYW1wbGVfcmF0ZSA9ICQxCisoMiByb3dz KQorCitTRVQgcGdfc3RhdF9zdGF0ZW1lbnRzLnRyYWNrID0gInRvcCI7CitTRVQgcGdfc3Rh dF9zdGF0ZW1lbnRzLnNhbXBsZV9yYXRlID0gMC4wOworU0VMRUNUIHBnX3N0YXRfc3RhdGVt ZW50c19yZXNldCgpIElTIE5PVCBOVUxMIEFTIHQ7CisgdCAKKy0tLQorIHQKKygxIHJvdykK KworU0VMRUNUIDEgXHBhcnNlIHN0bXQKK1xiaW5kX25hbWVkIHN0bXQgXGcKKyA/Y29sdW1u PyAKKy0tLS0tLS0tLS0KKyAgICAgICAgMQorKDEgcm93KQorCitTRUxFQ1QgcXVlcnksIGNh bGxzIEZST00gcGdfc3RhdF9zdGF0ZW1lbnRzIE9SREVSIEJZIHF1ZXJ5IENPTExBVEUgIkMi OworIHF1ZXJ5IHwgY2FsbHMgCistLS0tLS0tKy0tLS0tLS0KKygwIHJvd3MpCisKK1NFVCBw Z19zdGF0X3N0YXRlbWVudHMuc2FtcGxlX3JhdGUgPSAxLjA7CitcYmluZF9uYW1lZCBzdG10 IFxnCisgP2NvbHVtbj8gCistLS0tLS0tLS0tCisgICAgICAgIDEKKygxIHJvdykKKworU0VM RUNUIHF1ZXJ5LCBjYWxscyBGUk9NIHBnX3N0YXRfc3RhdGVtZW50cyBPUkRFUiBCWSBxdWVy eSBDT0xMQVRFICJDIjsKKyAgIHF1ZXJ5ICAgfCBjYWxscyAKKy0tLS0tLS0tLS0tKy0tLS0t LS0KKyBTRUxFQ1QgJDEgfCAgICAgMQorKDEgcm93KQorCitTRUxFQ1QgcGdfc3RhdF9zdGF0 ZW1lbnRzX3Jlc2V0KCkgSVMgTk9UIE5VTEwgQVMgdDsKKyB0IAorLS0tCisgdAorKDEgcm93 KQorCmRpZmYgLS1naXQgYS9jb250cmliL3BnX3N0YXRfc3RhdGVtZW50cy9wZ19zdGF0X3N0 YXRlbWVudHMuYyBiL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3BnX3N0YXRfc3RhdGVt ZW50cy5jCmluZGV4IGJlYmY4MTM0ZWIuLmFmZDA1Mzc3MTMgMTAwNjQ0Ci0tLSBhL2NvbnRy aWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3BnX3N0YXRfc3RhdGVtZW50cy5jCisrKyBiL2NvbnRy aWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3BnX3N0YXRfc3RhdGVtZW50cy5jCkBAIC01MCw2ICs1 MCw3IEBACiAjaW5jbHVkZSAiYWNjZXNzL3BhcmFsbGVsLmgiCiAjaW5jbHVkZSAiY2F0YWxv Zy9wZ19hdXRoaWQuaCIKICNpbmNsdWRlICJjb21tb24vaW50LmgiCisjaW5jbHVkZSAiY29t bW9uL3BnX3BybmcuaCIKICNpbmNsdWRlICJleGVjdXRvci9pbnN0cnVtZW50LmgiCiAjaW5j bHVkZSAiZnVuY2FwaS5oIgogI2luY2x1ZGUgImppdC9qaXQuaCIKQEAgLTI1Niw2ICsyNTcs OSBAQCB0eXBlZGVmIHN0cnVjdCBwZ3NzU2hhcmVkU3RhdGUKIC8qIEN1cnJlbnQgbmVzdGlu ZyBkZXB0aCBvZiBwbGFubmVyL0V4ZWN1dG9yUnVuL1Byb2Nlc3NVdGlsaXR5IGNhbGxzICov CiBzdGF0aWMgaW50CW5lc3RpbmdfbGV2ZWwgPSAwOwogCisvKiBJcyB0aGUgY3VycmVudCB0 b3AtbGV2ZWwgcXVlcnkgdG8gYmUgc2FtcGxlZD8gKi8KK3N0YXRpYyBib29sIGlzX3F1ZXJ5 X3NhbXBsZWQgPSBmYWxzZTsKKwogLyogU2F2ZWQgaG9vayB2YWx1ZXMgKi8KIHN0YXRpYyBz aG1lbV9yZXF1ZXN0X2hvb2tfdHlwZSBwcmV2X3NobWVtX3JlcXVlc3RfaG9vayA9IE5VTEw7 CiBzdGF0aWMgc2htZW1fc3RhcnR1cF9ob29rX3R5cGUgcHJldl9zaG1lbV9zdGFydHVwX2hv b2sgPSBOVUxMOwpAQCAtMjk0LDEyICsyOTgsMTQgQEAgc3RhdGljIGJvb2wgcGdzc190cmFj a191dGlsaXR5ID0gdHJ1ZTsJLyogd2hldGhlciB0byB0cmFjayB1dGlsaXR5IGNvbW1hbmRz ICovCiBzdGF0aWMgYm9vbCBwZ3NzX3RyYWNrX3BsYW5uaW5nID0gZmFsc2U7CS8qIHdoZXRo ZXIgdG8gdHJhY2sgcGxhbm5pbmcKIAkJCQkJCQkJCQkJICogZHVyYXRpb24gKi8KIHN0YXRp YyBib29sIHBnc3Nfc2F2ZSA9IHRydWU7CS8qIHdoZXRoZXIgdG8gc2F2ZSBzdGF0cyBhY3Jv c3Mgc2h1dGRvd24gKi8KK3N0YXRpYyBkb3VibGUgcGdzc19zYW1wbGVfcmF0ZSA9IDEuMDsg LyogZnJhY3Rpb24gb2Ygc3RhdGVtZW50cyB0byB0cmFjayAqLwogCiAKLSNkZWZpbmUgcGdz c19lbmFibGVkKGxldmVsKSBcCisjZGVmaW5lIHBnc3NfZW5hYmxlZChsZXZlbCwgc2tpcF9z YW1wbGluZ19jaGVjaykgXAogCSghSXNQYXJhbGxlbFdvcmtlcigpICYmIFwKIAkocGdzc190 cmFjayA9PSBQR1NTX1RSQUNLX0FMTCB8fCBcCi0JKHBnc3NfdHJhY2sgPT0gUEdTU19UUkFD S19UT1AgJiYgKGxldmVsKSA9PSAwKSkpCisJKHBnc3NfdHJhY2sgPT0gUEdTU19UUkFDS19U T1AgJiYgKGxldmVsKSA9PSAwKSkgJiYgXAorCWN1cnJlbnRfcXVlcnlfc2FtcGxlZChza2lw X3NhbXBsaW5nX2NoZWNrKSkKIAogI2RlZmluZSByZWNvcmRfZ2NfcXRleHRzKCkgXAogCWRv IHsgXApAQCAtMzczLDYgKzM3OSw3IEBAIHN0YXRpYyBjaGFyICpnZW5lcmF0ZV9ub3JtYWxp emVkX3F1ZXJ5KEp1bWJsZVN0YXRlICpqc3RhdGUsIGNvbnN0IGNoYXIgKnF1ZXJ5LAogc3Rh dGljIHZvaWQgZmlsbF9pbl9jb25zdGFudF9sZW5ndGhzKEp1bWJsZVN0YXRlICpqc3RhdGUs IGNvbnN0IGNoYXIgKnF1ZXJ5LAogCQkJCQkJCQkJIGludCBxdWVyeV9sb2MpOwogc3RhdGlj IGludAljb21wX2xvY2F0aW9uKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpOworc3Rh dGljIGJvb2wJY3VycmVudF9xdWVyeV9zYW1wbGVkKGJvb2wgc2tpcCk7CiAKIAogLyoKQEAg LTQxNCw2ICs0MjEsMTkgQEAgX1BHX2luaXQodm9pZCkKIAkJCQkJCQlOVUxMLAogCQkJCQkJ CU5VTEwpOwogCisJRGVmaW5lQ3VzdG9tUmVhbFZhcmlhYmxlKCJwZ19zdGF0X3N0YXRlbWVu dHMuc2FtcGxlX3JhdGUiLAorCQkJCQkJCSAiRnJhY3Rpb24gb2YgcXVlcmllcyB0byB0cmFj ay4iLAorCQkJCQkJCSBOVUxMLAorCQkJCQkJCSAmcGdzc19zYW1wbGVfcmF0ZSwKKwkJCQkJ CQkgMS4wLAorCQkJCQkJCSAwLjAsCisJCQkJCQkJIDEuMCwKKwkJCQkJCQkgUEdDX1NVU0VU LAorCQkJCQkJCSAwLAorCQkJCQkJCSBOVUxMLAorCQkJCQkJCSBOVUxMLAorCQkJCQkJCSBO VUxMKTsKKwogCURlZmluZUN1c3RvbUVudW1WYXJpYWJsZSgicGdfc3RhdF9zdGF0ZW1lbnRz LnRyYWNrIiwKIAkJCQkJCQkgIlNlbGVjdHMgd2hpY2ggc3RhdGVtZW50cyBhcmUgdHJhY2tl ZCBieSBwZ19zdGF0X3N0YXRlbWVudHMuIiwKIAkJCQkJCQkgTlVMTCwKQEAgLTgzNiw3ICs4 NTYsNyBAQCBwZ3NzX3Bvc3RfcGFyc2VfYW5hbHl6ZShQYXJzZVN0YXRlICpwc3RhdGUsIFF1 ZXJ5ICpxdWVyeSwgSnVtYmxlU3RhdGUgKmpzdGF0ZSkKIAkJcHJldl9wb3N0X3BhcnNlX2Fu YWx5emVfaG9vayhwc3RhdGUsIHF1ZXJ5LCBqc3RhdGUpOwogCiAJLyogU2FmZXR5IGNoZWNr Li4uICovCi0JaWYgKCFwZ3NzIHx8ICFwZ3NzX2hhc2ggfHwgIXBnc3NfZW5hYmxlZChuZXN0 aW5nX2xldmVsKSkKKwlpZiAoIXBnc3MgfHwgIXBnc3NfaGFzaCB8fCAhcGdzc19lbmFibGVk KG5lc3RpbmdfbGV2ZWwsIHRydWUpKQogCQlyZXR1cm47CiAKIAkvKgpAQCAtODk0LDcgKzkx NCw3IEBAIHBnc3NfcGxhbm5lcihRdWVyeSAqcGFyc2UsCiAJICogcGdzc19zdG9yZSBuZWVk cyBpdC4gIFdlIGFsc28gaWdub3JlIHF1ZXJ5IHdpdGhvdXQgcXVlcnlpZCwgYXMgaXQgd291 bGQKIAkgKiBiZSB0cmVhdGVkIGFzIGEgdXRpbGl0eSBzdGF0ZW1lbnQsIHdoaWNoIG1heSBu b3QgYmUgdGhlIGNhc2UuCiAJICovCi0JaWYgKHBnc3NfZW5hYmxlZChuZXN0aW5nX2xldmVs KQorCWlmIChwZ3NzX2VuYWJsZWQobmVzdGluZ19sZXZlbCwgZmFsc2UpCiAJCSYmIHBnc3Nf dHJhY2tfcGxhbm5pbmcgJiYgcXVlcnlfc3RyaW5nCiAJCSYmIHBhcnNlLT5xdWVyeUlkICE9 IFVJTlQ2NENPTlNUKDApKQogCXsKQEAgLTk5OSw3ICsxMDE5LDggQEAgcGdzc19FeGVjdXRv clN0YXJ0KFF1ZXJ5RGVzYyAqcXVlcnlEZXNjLCBpbnQgZWZsYWdzKQogCSAqIGNvdW50aW5n IG9mIG9wdGltaXphYmxlIHN0YXRlbWVudHMgdGhhdCBhcmUgZGlyZWN0bHkgY29udGFpbmVk IGluCiAJICogdXRpbGl0eSBzdGF0ZW1lbnRzLgogCSAqLwotCWlmIChwZ3NzX2VuYWJsZWQo bmVzdGluZ19sZXZlbCkgJiYgcXVlcnlEZXNjLT5wbGFubmVkc3RtdC0+cXVlcnlJZCAhPSBV SU5UNjRDT05TVCgwKSkKKwlpZiAocGdzc19lbmFibGVkKG5lc3RpbmdfbGV2ZWwsIGZhbHNl KSAmJgorCQlxdWVyeURlc2MtPnBsYW5uZWRzdG10LT5xdWVyeUlkICE9IFVJTlQ2NENPTlNU KDApKQogCXsKIAkJLyoKIAkJICogU2V0IHVwIHRvIHRyYWNrIHRvdGFsIGVsYXBzZWQgdGlt ZSBpbiBFeGVjdXRvclJ1bi4gIE1ha2Ugc3VyZSB0aGUKQEAgLTEwNjgsNyArMTA4OSw3IEBA IHBnc3NfRXhlY3V0b3JFbmQoUXVlcnlEZXNjICpxdWVyeURlc2MpCiAJdWludDY0CQlxdWVy eUlkID0gcXVlcnlEZXNjLT5wbGFubmVkc3RtdC0+cXVlcnlJZDsKIAogCWlmIChxdWVyeUlk ICE9IFVJTlQ2NENPTlNUKDApICYmIHF1ZXJ5RGVzYy0+dG90YWx0aW1lICYmCi0JCXBnc3Nf ZW5hYmxlZChuZXN0aW5nX2xldmVsKSkKKwkJcGdzc19lbmFibGVkKG5lc3RpbmdfbGV2ZWws IGZhbHNlKSkKIAl7CiAJCS8qCiAJCSAqIE1ha2Ugc3VyZSBzdGF0cyBhY2N1bXVsYXRpb24g aXMgZG9uZS4gIChOb3RlOiBpdCdzIG9rYXkgaWYgc2V2ZXJhbApAQCAtMTExMSw3ICsxMTMy LDcgQEAgcGdzc19Qcm9jZXNzVXRpbGl0eShQbGFubmVkU3RtdCAqcHN0bXQsIGNvbnN0IGNo YXIgKnF1ZXJ5U3RyaW5nLAogCXVpbnQ2NAkJc2F2ZWRfcXVlcnlJZCA9IHBzdG10LT5xdWVy eUlkOwogCWludAkJCXNhdmVkX3N0bXRfbG9jYXRpb24gPSBwc3RtdC0+c3RtdF9sb2NhdGlv bjsKIAlpbnQJCQlzYXZlZF9zdG10X2xlbiA9IHBzdG10LT5zdG10X2xlbjsKLQlib29sCQll bmFibGVkID0gcGdzc190cmFja191dGlsaXR5ICYmIHBnc3NfZW5hYmxlZChuZXN0aW5nX2xl dmVsKTsKKwlib29sCQllbmFibGVkID0gcGdzc190cmFja191dGlsaXR5ICYmIHBnc3NfZW5h YmxlZChuZXN0aW5nX2xldmVsLCBmYWxzZSk7CiAKIAkvKgogCSAqIEZvcmNlIHV0aWxpdHkg c3RhdGVtZW50cyB0byBnZXQgcXVlcnlJZCB6ZXJvLiAgV2UgZG8gdGhpcyBldmVuIGluIGNh c2VzCkBAIC0zMDExLDMgKzMwMzIsMjcgQEAgY29tcF9sb2NhdGlvbihjb25zdCB2b2lkICph LCBjb25zdCB2b2lkICpiKQogCiAJcmV0dXJuIHBnX2NtcF9zMzIobCwgcik7CiB9CisKKy8q CisgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgY3VycmVudCBxdWVyeSBzaG91bGQgYmUgc2Ft cGxlZC4KKyAqCisgKiBJbiBzb21lIGNhc2VzLCBzYW1wbGluZyBtYXkgbmVlZCB0byBiZSBz a2lwcGVkIGVudGlyZWx5LCBzdWNoIGFzIGR1cmluZworICogcXVlcnkgcGFyc2luZyBmb3Ig bm9ybWFsaXphdGlvbi4KKyAqCisgKiBBdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggdG9wLWxl dmVsIHN0YXRlbWVudCwgZGVjaWRlIHdoZXRoZXIgd2UnbGwKKyAqIHNhbXBsZSB0aGlzIHN0 YXRlbWVudC4gSWYgbmVzdGVkLXN0YXRlbWVudCB0cmFja2luZyBpcyBlbmFibGVkLAorICog ZWl0aGVyIGFsbCBuZXN0ZWQgc3RhdGVtZW50cyB3aWxsIGJlIHRyYWNrZWQgb3Igbm9uZSB3 aWxsLgorICovCitzdGF0aWMgYm9vbAorY3VycmVudF9xdWVyeV9zYW1wbGVkKGJvb2wgc2tp cCkKK3sKKwlpZiAoc2tpcCkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAobmVzdGluZ19sZXZl bCA9PSAwKQorCQlpc19xdWVyeV9zYW1wbGVkID0gcGdzc19zYW1wbGVfcmF0ZSAhPSAwLjAg JiYKKwkJCShwZ3NzX3NhbXBsZV9yYXRlID09IDEuMCB8fAorCQkJcGdfcHJuZ19kb3VibGUo JnBnX2dsb2JhbF9wcm5nX3N0YXRlKSA8PSBwZ3NzX3NhbXBsZV9yYXRlKTsKKworCXJldHVy biBpc19xdWVyeV9zYW1wbGVkOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlm ZiAtLWdpdCBhL2NvbnRyaWIvcGdfc3RhdF9zdGF0ZW1lbnRzL3NxbC9zYW1wbGluZy5zcWwg Yi9jb250cmliL3BnX3N0YXRfc3RhdGVtZW50cy9zcWwvc2FtcGxpbmcuc3FsCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAuLjRkYWJlMTU0MGMKLS0tIC9kZXYvbnVs bAorKysgYi9jb250cmliL3BnX3N0YXRfc3RhdGVtZW50cy9zcWwvc2FtcGxpbmcuc3FsCkBA IC0wLDAgKzEsMzQgQEAKKy0tCistLSBzYW1wbGUgc3RhdGVtZW50cworLS0KKworU0VUIHBn X3N0YXRfc3RhdGVtZW50cy5zYW1wbGVfcmF0ZSA9IDAuMDsKK1NFTEVDVCBwZ19zdGF0X3N0 YXRlbWVudHNfcmVzZXQoKSBJUyBOT1QgTlVMTCBBUyB0OworU0VMRUNUIDEgQVMgImludCI7 CitTRUxFQ1QgcXVlcnksIGNhbGxzIEZST00gcGdfc3RhdF9zdGF0ZW1lbnRzIE9SREVSIEJZ IHF1ZXJ5IENPTExBVEUgIkMiOworU0VUIHBnX3N0YXRfc3RhdGVtZW50cy5zYW1wbGVfcmF0 ZSA9IDEuMDsKK1NFTEVDVCAxIEFTICJpbnQiOworU0VMRUNUIHF1ZXJ5LCBjYWxscyBGUk9N IHBnX3N0YXRfc3RhdGVtZW50cyBPUkRFUiBCWSBxdWVyeSBDT0xMQVRFICJDIjsKKworCist LSBzYW1wbGVfcmF0ZSBpcyAoMCwgMSkgYW5kIHRyYWNrID0gImFsbCIKK1NFVCBwZ19zdGF0 X3N0YXRlbWVudHMudHJhY2sgPSAiYWxsIjsKK1NFTEVDVCBwZ19zdGF0X3N0YXRlbWVudHNf cmVzZXQoKSBJUyBOT1QgTlVMTCBBUyB0OworU0VUIHBnX3N0YXRfc3RhdGVtZW50cy5zYW1w bGVfcmF0ZSA9IDAuNTsKKworLS0gZWl0aGVyIGFsbCBuZXN0ZWQgc3RhdGVtZW50cyB3aWxs IGJlIHRyYWNrZWQgKHNhbXBsZS5vdXQpIG9yIG5vbmUgd2lsbCAoc2FtcGxlXzEub3V0KS4K K0VYUExBSU4gKENPU1RTIE9GRikgU0VMRUNUIDE7CitTRUxFQ1QgdG9wbGV2ZWwsIGNhbGxz LCBxdWVyeSBGUk9NIHBnX3N0YXRfc3RhdGVtZW50cworICAgIE9SREVSIEJZIHF1ZXJ5IENP TExBVEUgIkMiLCB0b3BsZXZlbDsKK1NFVCBwZ19zdGF0X3N0YXRlbWVudHMudHJhY2sgPSAi dG9wIjsKKworCitTRVQgcGdfc3RhdF9zdGF0ZW1lbnRzLnNhbXBsZV9yYXRlID0gMC4wOwor U0VMRUNUIHBnX3N0YXRfc3RhdGVtZW50c19yZXNldCgpIElTIE5PVCBOVUxMIEFTIHQ7CitT RUxFQ1QgMSBccGFyc2Ugc3RtdAorXGJpbmRfbmFtZWQgc3RtdCBcZworU0VMRUNUIHF1ZXJ5 LCBjYWxscyBGUk9NIHBnX3N0YXRfc3RhdGVtZW50cyBPUkRFUiBCWSBxdWVyeSBDT0xMQVRF ICJDIjsKK1NFVCBwZ19zdGF0X3N0YXRlbWVudHMuc2FtcGxlX3JhdGUgPSAxLjA7CitcYmlu ZF9uYW1lZCBzdG10IFxnCitTRUxFQ1QgcXVlcnksIGNhbGxzIEZST00gcGdfc3RhdF9zdGF0 ZW1lbnRzIE9SREVSIEJZIHF1ZXJ5IENPTExBVEUgIkMiOworU0VMRUNUIHBnX3N0YXRfc3Rh dGVtZW50c19yZXNldCgpIElTIE5PVCBOVUxMIEFTIHQ7ClwgTm8gbmV3bGluZSBhdCBlbmQg b2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL3Bnc3RhdHN0YXRlbWVudHMuc2dt bCBiL2RvYy9zcmMvc2dtbC9wZ3N0YXRzdGF0ZW1lbnRzLnNnbWwKaW5kZXggNTAxYjQ2OGU5 YS4uY2QzZmRhZWZmZSAxMDA2NDQKLS0tIGEvZG9jL3NyYy9zZ21sL3Bnc3RhdHN0YXRlbWVu dHMuc2dtbAorKysgYi9kb2Mvc3JjL3NnbWwvcGdzdGF0c3RhdGVtZW50cy5zZ21sCkBAIC05 MzYsNiArOTM2LDI1IEBACiAgICAgPC9saXN0aXRlbT4KICAgIDwvdmFybGlzdGVudHJ5Pgog CisgICA8dmFybGlzdGVudHJ5PgorICAgIDx0ZXJtPgorICAgICA8dmFybmFtZT5wZ19zdGF0 X3N0YXRlbWVudHMuc2FtcGxlX3JhdGU8L3Zhcm5hbWU+ICg8dHlwZT5yZWFsPC90eXBlPikK KyAgICAgPGluZGV4dGVybT4KKyAgICAgIDxwcmltYXJ5Pjx2YXJuYW1lPnBnX3N0YXRfc3Rh dGVtZW50cy5zYW1wbGVfcmF0ZTwvdmFybmFtZT4gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXI8 L3ByaW1hcnk+CisgICAgIDwvaW5kZXh0ZXJtPgorICAgIDwvdGVybT4KKworICAgIDxsaXN0 aXRlbT4KKyAgICAgPHBhcmE+CisgICAgICA8dmFybmFtZT5wZ19zdGF0X3N0YXRlbWVudHMu c2FtcGxlX3JhdGU8L3Zhcm5hbWU+IGNhdXNlcyBwZ19zdGF0X3N0YXRlbWVudHMgdG8gb25s eQorICAgICAgdHJhY2sgYSBmcmFjdGlvbiBvZiB0aGUgc3RhdGVtZW50cyBpbiBlYWNoIHNl c3Npb24uIFRoZSBkZWZhdWx0IGlzIDxsaXRlcmFsPjE8L2xpdGVyYWw+LAorICAgICAgbWVh bmluZyB0cmFjayBhbGwgdGhlIHF1ZXJpZXMuIFNldHRpbmcgdGhpcyB0byA8bGl0ZXJhbD4w PC9saXRlcmFsPiBkaXNhYmxlcyBzYW1wbGVkIHN0YXRlbWVudHMKKyAgICAgIHRyYWNraW5n LCB0aGUgc2FtZSBhcyBzZXR0aW5nIDx2YXJuYW1lPnBnX3N0YXRfc3RhdGVtZW50cy50cmFj azwvdmFybmFtZT4gdG8gPGxpdGVyYWw+bm9uZTwvbGl0ZXJhbD4uCisgICAgICBJbiBjYXNl IG9mIG5lc3RlZCBzdGF0ZW1lbnRzLCBlaXRoZXIgYWxsIHdpbGwgYmUgdHJhY2tlZCBvciBu b25lLiBPbmx5IHN1cGVydXNlcnMgY2FuIGNoYW5nZSB0aGlzIHNldHRpbmcuCisgICAgIDwv cGFyYT4KKyAgICA8L2xpc3RpdGVtPgorICAgPC92YXJsaXN0ZW50cnk+CisKICAgIDx2YXJs aXN0ZW50cnk+CiAgICAgPHRlcm0+CiAgICAgIDx2YXJuYW1lPnBnX3N0YXRfc3RhdGVtZW50 cy5zYXZlPC92YXJuYW1lPiAoPHR5cGU+Ym9vbGVhbjwvdHlwZT4pCi0tIAoyLjM0LjEKCg== --------------i7SA5BG3UFKXm7sBZsV0iOYd--